src/Service/LeaveService.php line 11125

Open in your IDE?
  1. <?php
  2. namespace App\Service;
  3. use App\Entity\LeaveEntitlement;
  4. use App\Entity\LeaveMCRecord;
  5. use App\Entity\LeaveRequest;
  6. use App\Entity\LeaveType;
  7. use App\Entity\Office;
  8. use App\Entity\OfficeLeave;
  9. use App\Repository\LeaveEntitlementRepository;
  10. use App\Repository\LeaveRequestRepository;
  11. use Doctrine\ORM\EntityManagerInterface;
  12. use Symfony\Contracts\Translation\TranslatorInterface;
  13. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  14. use App\Service\LogService;
  15. use App\Service\MailgunService;
  16. use Symfony\Component\Intl\Intl;
  17. use Symfony\Component\Intl\Countries;
  18. use Symfony\Component\Serializer\SerializerInterface;
  19. use Symfony\Component\Serializer\Normalizer\AbstractNormalizer;
  20. use Symfony\Component\Serializer\Encoder\JsonEncoder;
  21. use Symfony\Component\Serializer\Normalizer\AbstractObjectNormalizer;
  22. class LeaveService
  23. {
  24.   private $entityManager;
  25.   private $log;
  26.   private $params;
  27.   private $mailgunService;
  28.   private $translator;
  29.   private $serializer;
  30.   private $leaveEntitlementRepository;
  31.   private $leaveRequestRepository;
  32.   private $bankHolidayService;
  33.   private $icsService;
  34.   public function __construct(EntityManagerInterface $entityManagerLogService $logParameterBagInterface $paramsMailgunService $mailgunServiceTranslatorInterface $translator,SerializerInterface $serializerLeaveEntitlementRepository $leaveEntitlementRepositoryLeaveRequestRepository $leaveRequestRepositoryBankHolidayService $bankHolidayServiceICSService $icsService)
  35.   { 
  36.     $this->entityManager $entityManager;
  37.     $this->log $log;
  38.     $this->params $params;
  39.     $this->mailgunService $mailgunService;
  40.     $this->translator $translator;
  41.     $this->serializer $serializer;
  42.     $this->leaveEntitlementRepository $leaveEntitlementRepository;
  43.     $this->leaveRequestRepository $leaveRequestRepository;
  44.     $this->bankHolidayService $bankHolidayService;
  45.     $this->icsService $icsService;
  46.   }
  47.   private function _date_attar_use($attr,$year,$joindate,$ext=0){
  48.     $jd=new \DateTime($joindate);
  49.     $jdext=new \DateTime($joindate);
  50.     $jdp=new \DateTime($joindate);
  51.     $jdp->modify('+1 day');
  52.     $jdm=new \DateTime($joindate);
  53.     $jdm->modify('-1 day');
  54.     $jpx=$jdp->format('m-d');
  55.     $jmx=$jdm->format('m-d');
  56.     $attr=str_replace('next-',($year+1).'-',$attr);
  57.     $attr=str_replace('year-',$year.'-',$attr);
  58.     $attr=str_replace('joindate+year+1',$year.'-'.$jpx,$attr);
  59.     $attr=str_replace('joindate+next+1',($year+1).'-'.$jpx,$attr);
  60.     $attr=str_replace('joindate+year+-1',$year.'-'.$jmx,$attr);
  61.     $attr=str_replace('joindate+next+-1',($year+1).'-'.$jmx,$attr);
  62.     $attr=str_replace('joindate+year',$year.'-'.$jd->format('m-d'),$attr);
  63.     $attr=str_replace('joindate+fix',$year.'-'.$jd->format('m-d'),$attr);
  64.     $attr=str_replace('joindate+next',($year+1).'-'.$jd->format('m-d'),$attr);
  65.     
  66.     if($ext 0){
  67.       $jdext->modify('+'.$ext.' months');
  68.       if($year <= intval($jdext->format('Y'))){$attr=$jdext->format('Y-m-d');}
  69.     }
  70.     return $attr;
  71.   }
  72.   /*private function _attribute_set($dataAttributes, $mode, $year, $expire, \App\Entity\User $user)
  73.   {
  74.     $attr = array();
  75.     switch ($mode) {
  76.       case 'period':
  77.         $dataAttributes += [
  78.           "expires" => $expire,
  79.           "given" => $year . "-01-01",
  80.           "year" => $year
  81.         ];
  82.         $jn = $user->getPersonalInfo()->getJobJoinDate();
  83.         if ($jn == null) {
  84.           $jn = new \DateTime(date('Y-m-d'));
  85.         }else{
  86.           $jn=new \DateTime($user->getPersonalInfo()->getJobJoinDate()->format('Y-m-d'));
  87.         }
  88.         $jn->modify('+3 months');
  89.         $dtx = new \DateTime($year . "-01-01");
  90.         if ($dtx < $jn) {
  91.           $dtx = $jn;
  92.         }
  93.         $dataAttributes["expires"] = $expire->format('Y-m-d');
  94.         $dataAttributes["given"] = $dtx->format('Y-m-d');
  95.         break;
  96.       case 'anniversary':
  97.         $join = $user->getPersonalInfo()->getJobJoinDate() ? new \DateTime($user->getPersonalInfo()->getJobJoinDate()->format('Y-m-d')) : new \DateTime();
  98.         $y = $join->format('Y');
  99.         $join = $join->format('m-d');
  100.         $given = new \DateTime($year . '-' . $join);
  101.         $given->modify('+1 day');
  102.         $given=$given->format('Y-m-d');
  103.         $exp = ($year + 1) . '-' . $join;
  104.         $days = 0;
  105.         $ynow = ($year - $y);
  106.         if ($ynow >= $dataAttributes['incrementalStart']) {
  107.           $days = ($ynow * $dataAttributes['incrementalValue']);
  108.         }
  109.         if ($join != null) {
  110.           $dataAttributes += [
  111.             "expires" => $exp,
  112.             "given" => $given,
  113.             "year" => $year,
  114.             "days" => $days
  115.           ];
  116.           $dataAttributes["expires"] = $exp;
  117.           $dataAttributes["given"] = $given;
  118.           $dataAttributes["days"] = $days;
  119.         } else {
  120.           $dataAttributes += [
  121.             "expires" => $year . '-' . date('m-d'),
  122.             "given" => $year . '-' . date('m-d'),
  123.             "year" => $year,
  124.             "days" => 0
  125.           ];
  126.           $dataAttributes["expires"] = $year . '-' . date('m-d');
  127.           $dataAttributes["given"] = $year . '-' . date('m-d');
  128.           $dataAttributes["days"] = $days;
  129.         }
  130.         break;
  131.       default:
  132.         break;
  133.     }
  134.     return $dataAttributes;
  135.   }*/
  136.   public function _attribute_set($dataAttributes$year$maxday,\App\Entity\User $user)
  137.   {
  138.     $attr = array();
  139.     $jbdate=$user->getPersonalInfo()->getJobJoinDate();
  140.     if(is_null($jbdate)){return false;}
  141.     $dataAttributes['year']=$year;
  142.     if(isset($dataAttributes['expiredate'])){
  143.       $de=$dataAttributes['expiredate'];
  144.       $dataAttributes['expires']=$this->_date_attar_use($de,$year,$jbdate->format('Y-m-d'));
  145.     }
  146.     if(isset($dataAttributes['givendate'])){
  147.       $de=$dataAttributes['givendate'];
  148.       $ext=isset($dataAttributes['extenddate'])?$dataAttributes['extenddate']:0;
  149.       $dataAttributes['given']=$this->_date_attar_use($de,$year,$jbdate->format('Y-m-d'),$ext);
  150.     }
  151.     $uendate=$year.'-12-31';
  152.     if(isset($dataAttributes['expires'])){
  153.       $uendate=$dataAttributes['expires'];
  154.     }
  155.     $config=isset($dataAttributes['config'])?$dataAttributes['config']:[];
  156.     $usepro=isset($dataAttributes['useprorate'])?$dataAttributes['useprorate']:false;
  157.     $dataAttributes['days']=$this->_prorate($jbdate->format('Y-m-d'),$uendate,$maxday,$config,$usepro);
  158.     if(isset($dataAttributes['isIncremental'])){
  159.       if($dataAttributes['isIncremental']){
  160.         $dataAttributes['days']=(($year-intval($jbdate->format('Y')))-$dataAttributes['incrementalStart'])*$dataAttributes['incrementalValue'];
  161.         
  162.       }
  163.     }
  164.     if(isset($dataAttributes['given']) && isset($dataAttributes['expires'])){
  165.       if($dataAttributes['given'] > $dataAttributes['expires']){
  166.         //$dataAttributes['days']=0;
  167.       }
  168.     }  
  169.     return $dataAttributes;
  170.   }
  171.   /*private function _add_leave_data($user, $year, $expire, $type, $parent = array(null, 0), $edit = false)
  172.   {
  173.     $leaveEntitlement = $this->entityManager->getRepository(LeaveEntitlement::class)->findBy(array('user' => $user, 'year' => ($year), 'leaveType' => $type, 'parent' => $parent));
  174.     $add = true;
  175.     if (empty($leaveEntitlement)) {
  176.       $dataAttributes = $type->getAttributes();
  177.       $noadd=false;
  178.       if(isset($dataAttributes['noadd'])){
  179.         if($dataAttributes['noadd']){$noadd=true;}
  180.       }
  181.       if(!$noadd){
  182.         $leaveEntitlement = new LeaveEntitlement();
  183.         $leaveEntitlement->setUser($user);
  184.         $leaveEntitlement->setYear($year);
  185.         $leaveEntitlement->setLeaveType($type);
  186.         $leaveEntitlement->setLeaveApproved(null);
  187.         if($user->inProbation()){
  188.           $leaveEntitlement->setLeaveEntitlements(0);
  189.           $leaveEntitlement->setLeaveLeft(0);
  190.           if($type->getLeaveName()=='sick'){
  191.             $leaveEntitlement->setLeaveEntitlements($type->getDays());
  192.             $leaveEntitlement->setLeaveLeft($type->getDays());
  193.           }
  194.         }else{  
  195.           $leaveEntitlement->setLeaveEntitlements($type->getDays());
  196.           $leaveEntitlement->setLeaveLeft($type->getDays());
  197.         }  
  198.         $leaveEntitlement->setIsActive(true);
  199.         
  200.         if ($dataAttributes != null) {
  201.           if (isset($dataAttributes['mode'])) {
  202.             $m = $dataAttributes['mode'];
  203.           } else {
  204.             $m = 'fix';
  205.           }
  206.           $dataAttributes = $this->_attribute_set($dataAttributes, $m, $year, $expire, $user);
  207.           if(isset($dataAttributes['disallowUser'])){
  208.             unset($dataAttributes['disallowUser']);
  209.           }
  210.           if (isset($dataAttributes['days'])) {
  211.             $leaveEntitlement->setLeaveEntitlements($dataAttributes['days']);
  212.             $leaveEntitlement->setLeaveLeft($dataAttributes['days']);
  213.           }
  214.         }
  215.         if (!is_array($parent)) {
  216.           $leaveEntitlement->setParent($parent);
  217.         }
  218.         $leaveEntitlement->setAttributes($dataAttributes);
  219.         $leaveEntitlement->setCreatedBy($user);
  220.         if (isset($dataAttributes['gender'])) {
  221.           if ($dataAttributes['gender'] != $user->getPersonalInfo()->getGender()) {
  222.             $add = false;
  223.           }
  224.         }
  225.         if ($add) {
  226.           if($type->getLeaveName()=='sick'){
  227.             $leaveEntitlement->setLeaveEntitlements($type->getDays());
  228.             $leaveEntitlement->setLeaveLeft($type->getDays());
  229.           }
  230.           $country = $user->getOffice()->getCountry();
  231.           if($country=='VN'){
  232.             if($type->getLeaveName()=='annual'){
  233.               $dtx = $user->getPersonalInfo()->getJobJoinDate();
  234.               $dty=$dtx->format('Y');
  235.               //if(($year-$dtx) < 2){
  236.                 if(($year-$dty)==0){
  237.                   $leaveEntitlement->setLeaveEntitlements(5);
  238.                   $leaveEntitlement->setLeaveLeft(5);
  239.                   $gv=new \DateTime($dtx->format('Y-m-d'));
  240.                   $exp=new \DateTime($dtx->format('Y-m-d'));
  241.                   $exp->modify('+1 year');
  242.                   $exp->modify('-1 day');
  243.                   $dataAttributes['given']=$gv->format('Y-m-d');
  244.                   $dataAttributes['expires']=$exp->format('Y-m-d');
  245.                   $leaveEntitlement->setAttributes($dataAttributes);
  246.                 }else{
  247.                   $leaveEntitlement->setLeaveEntitlements($type->getDays());
  248.                   $leaveEntitlement->setLeaveLeft($type->getDays());
  249.                   $gv=new \DateTime($year.'-'.$dtx->format('m-d'));
  250.                   $exp=new \DateTime(($year+1).'-'.$dtx->format('m-d'));
  251.                   $exp->modify('-1 day');
  252.                   $dataAttributes['given']=$gv->format('Y-m-d');
  253.                   $dataAttributes['expires']=$exp->format('Y-m-d');
  254.                   $leaveEntitlement->setAttributes($dataAttributes);
  255.                 }  
  256.                 //}else if(($year-$dtx)==0){
  257.                 //  $nm=new \DateTime($dtx->format('Y-m-d'));
  258.                 //  $nm=$nm->format('m');
  259.                 //  $nm=(12-$nm)+1;
  260.                 //  $ct=floor($nm/$type->getDays());
  261.                 //  $leaveEntitlement->setLeaveEntitlements($ct);
  262.                 //  $leaveEntitlement->setLeaveLeft($ct);
  263.                 //  $gv=new \DateTime($dtx->format('Y-m-d'));
  264.                 //  $gv->modify('+1 year');
  265.                 //  $exp=new \DateTime(($year+2).'-03-31');
  266.                 //  $dataAttributes['given']=$gv->format('Y-m-d');
  267.                 //  $dataAttributes['expires']=$exp->format('Y-m-d');
  268.                 //}
  269.               //}
  270.             }
  271.           }
  272.           $this->entityManager->persist($leaveEntitlement);
  273.           $this->entityManager->flush();
  274.         }
  275.       }
  276.     } else {
  277.       if ($edit) {
  278.         foreach ($leaveEntitlement as $le) {
  279.           $ent = $le->getLeaveEntitlements();
  280.           $left = $le->getLeaveLeft();
  281.           $dataAttributes = $le->getAttributes();
  282.           if ($dataAttributes != null) {
  283.             if (isset($dataAttributes['mode'])) {
  284.               $m = $dataAttributes['mode'];
  285.             } else {
  286.               $m = 'fix';
  287.             }
  288.             $dataAttributes = $this->_attribute_set($dataAttributes, $m, $year, $expire, $user);
  289.             if(isset($dataAttributes['disallowUser'])){
  290.               unset($dataAttributes['disallowUser']);
  291.             }
  292.             //if (isset($dataAttributes['days'])) {
  293.             //  $ext = $dataAttributes['days'] - $ent;
  294.             //  $left = $left + $ext;
  295.             //  $le->setLeaveEntitlements($dataAttributes['days']);
  296.             //  $le->setLeaveLeft($left);
  297.             //}
  298.           }
  299.           if (!is_array($parent)) {
  300.             $le->setParent($parent);
  301.           }
  302.           $country = $user->getOffice()->getCountry();
  303.           if($country=='VN'){
  304.             if($type->getLeaveName()=='annual'){
  305.               $dtx = $user->getPersonalInfo()->getJobJoinDate();
  306.               $dty=$dtx->format('Y');
  307.               //if(($year-$dtx) < 2){
  308.                 if(($year-$dty)==0){
  309.                   $lfd=$le->getLeaveLeft();
  310.                   $glt=$le->getLeaveEntitlements();
  311.                   $lday=5;
  312.                   $lfd=$lfd-($glt-$lday);
  313.                   $le->getLeaveLeft($lfd);
  314.                   $le->setLeaveEntitlements($lday);
  315.                   $gv=new \DateTime($dtx->format('Y-m-d'));
  316.                   $exp=new \DateTime($dtx->format('Y-m-d'));
  317.                   $exp->modify('+1 year');
  318.                   $exp->modify('-1 day');
  319.                   $dataAttributes['given']=$gv->format('Y-m-d');
  320.                   $dataAttributes['expires']=$exp->format('Y-m-d');
  321.                   $le->setAttributes($dataAttributes);
  322.                 }else{
  323.                   $lfd=$le->getLeaveLeft();
  324.                   $glt=$le->getLeaveEntitlements();
  325.                   $lday=$type->getDays();
  326.                   $lfd=$lfd-($glt-$lday);
  327.                   $le->getLeaveLeft($lfd);
  328.                   $le->setLeaveEntitlements($lday);
  329.                   $gv=new \DateTime(($year).'-'.$dtx->format('m-d'));
  330.                   $exp=new \DateTime(($year+1).'-'.$dtx->format('m-d'));
  331.                   $exp->modify('-1 day');
  332.                   $dataAttributes['given']=$gv->format('Y-m-d');
  333.                   $dataAttributes['expires']=$exp->format('Y-m-d');
  334.                   $le->setAttributes($dataAttributes);
  335.                 }  
  336.                   //else if(($year-$dtx)==0){
  337.                   //$nm=new \DateTime($dtx->format('Y-m-d'));
  338.                   //$nm=$nm->format('m');
  339.                   //$nm=(12-$nm)+1;
  340.                   //$ct=floor($nm/$type->getDays());
  341.                   //$leaveEntitlement->setLeaveEntitlements($ct);
  342.                   //$leaveEntitlement->setLeaveLeft($ct);
  343.                   //$gv=new \DateTime($dtx->format('Y-m-d'));
  344.                   //$gv->modify('+1 year');
  345.                   //$exp=new \DateTime(($year+2).'-03-31');
  346.                   //$dataAttributes['given']=$gv->format('Y-m-d');
  347.                   //$dataAttributes['expires']=$exp->format('Y-m-d');
  348.                 //}
  349.               //}
  350.             }
  351.           }
  352.           $this->entityManager->persist($le);
  353.           $this->entityManager->flush();
  354.         }
  355.         $add = true;
  356.       }
  357.     }
  358.     if ($add) {
  359.       return $leaveEntitlement;
  360.     } else {
  361.       return false;
  362.     }
  363.   }*/
  364.   private function _add_leave_data($user$year$expire$type$parent = array(null0), $oldent=null)
  365.   {
  366.     if($oldent==null){
  367.       $oldent=new leaveEntitlement();
  368.     }
  369.     return $oldent;
  370.   }
  371.   public function saveUserLeave(\App\Entity\User $user,$year '')
  372.   {
  373.     $office $user->getOffice();
  374.     if($year==''){
  375.       $year date("Y");
  376.     }
  377.     if ($office != null) {
  378.       $leaveType $this->entityManager->getRepository(LeaveType::class)->findBy(array('office' => $office'parent' => array(null0)));
  379.       for ($i = -1$i 1$i++) {
  380.         $expire $this->_expire($year $i);
  381.         foreach ($leaveType as $l) {
  382.           $leave $this->_add_leave_data($user, ($year $i), $expire$l, array(null0), true);
  383.           if(!is_bool($leave)){
  384.             if(is_array($leave)){
  385.               foreach($leave as $lll){
  386.                 $childType $this->entityManager->getRepository(LeaveType::class)->findBy(array('office' => $office'parent' => array($l->getId())));
  387.                 if (count($childType) > 0) {
  388.                   foreach ($childType as $c) {
  389.                     $cleave $this->_add_leave_data($user, ($year $i), $expire$c,$lll->getId() , true);
  390.                   }
  391.                 }
  392.               }  
  393.             }else{
  394.               $childType $this->entityManager->getRepository(LeaveType::class)->findBy(array('office' => $office'parent' => array($l->getId())));
  395.               if (count($childType) > 0) {
  396.                 foreach ($childType as $c) {
  397.                   $cleave $this->_add_leave_data($user, ($year $i), $expire$c,$leave->getId() , true);
  398.                 }
  399.               }              
  400.             }
  401.             
  402.           }
  403.         }
  404.         /*foreach ($leaveType as $l) {
  405.           $childType = $this->entityManager->getRepository(LeaveType::class)->findBy(array('office' => $office, 'parent' => array($l->getId())));
  406.               if (count($childType) > 0) {
  407.                 foreach ($childType as $c) {
  408.                   $cleave = $this->_add_leave_data($user, ($year + $i), $expire, $c,$l->getId() , true);
  409.                 }
  410.               }
  411.         }*/ 
  412.       }
  413.     }
  414.   }
  415.   public function setAnnualSickLeave($office)
  416.   {
  417.     // get office leave data
  418.     $officeLeave $office->getOfficeLeave();
  419.     $office $officeLeave->getOffice();
  420.     // check leave type data
  421.     $leaveTypeAnnual $this->entityManager->getRepository(LeaveType::class)->findOneBy(array('leaveName' => 'annual''office' => $office));
  422.     $leaveTypeSick $this->entityManager->getRepository(LeaveType::class)->findOneBy(array('leaveName' => 'sick''office' => $office));
  423.     // create data leave type
  424.     if (is_null($leaveTypeAnnual) && is_null($leaveTypeSick)) {
  425.       $leaveTypeAnnual = new LeaveType();
  426.       $leaveTypeAnnual->setLeaveName('annual');
  427.       $leaveTypeAnnual->setOffice($office);
  428.       $leaveTypeAnnual->setIsActive(true);
  429.       $leaveTypeAnnual->setIsMandatory(true);
  430.       $dataAttributes = [
  431.         "mode" => "period",
  432.         "label" => 'Annual',
  433.         "isIncremental" => $officeLeave->getIsIncremental(),
  434.         "incrementalStart" => $officeLeave->getIncrementalStart(),
  435.         "incrementalValue" => $officeLeave->getIncrementalValue(),
  436.       ];
  437.       $leaveTypeAnnual->setDays($officeLeave->getAnnualDays());
  438.       $leaveTypeAnnual->setAttributes($dataAttributes);
  439.       $leaveTypeAnnual->setCreatedAt(new \DateTime());
  440.       $this->entityManager->persist($leaveTypeAnnual);
  441.       $this->entityManager->flush();
  442.       $leaveTypeAnniversary = new LeaveType();
  443.       $leaveTypeAnniversary->setLeaveName('anniversary');
  444.       $leaveTypeAnniversary->setOffice($office);
  445.       $leaveTypeAnniversary->setIsActive(true);
  446.       $leaveTypeAnniversary->setIsMandatory(true);
  447.       $dataAttributes = [
  448.         "mode" => "anniversary",
  449.         "label" => 'Bonus',
  450.         "isIncremental" => true,
  451.         "incrementalStart" => 1,
  452.         "incrementalValue" => 1,
  453.         "hide" => true
  454.       ];
  455.       $leaveTypeAnniversary->setDays(1);
  456.       $leaveTypeAnniversary->setAttributes($dataAttributes);
  457.       $leaveTypeAnniversary->setCreatedAt(new \DateTime());
  458.       $leaveTypeAnniversary->setParent($leaveTypeAnnual->getID());
  459.       $this->entityManager->persist($leaveTypeAnniversary);
  460.       $this->entityManager->flush();
  461.       $leaveTypeSick = new LeaveType();
  462.       $leaveTypeSick->setLeaveName('sick');
  463.       $leaveTypeSick->setOffice($office);
  464.       $leaveTypeSick->setIsActive(true);
  465.       $leaveTypeSick->setIsMandatory(true);
  466.       $leaveTypeSick->setDays($officeLeave->getSickDays());
  467.       $dataAttributes = [
  468.         "mode" => "fix",
  469.         "label" => 'Sick',
  470.         "deductedafter" => 1,
  471.         "keepyear" => true,
  472.         "hide" => true,
  473.       ];
  474.       $leaveTypeSick->setAttributes($dataAttributes);
  475.       $leaveTypeSick->setCreatedAt(new \DateTime());
  476.       $this->entityManager->persist($leaveTypeSick);
  477.       $this->entityManager->flush();
  478.     }
  479.     
  480.     // create entitlement where data zero
  481.     $usersOffice $office->getAllUser();
  482.     $year date("Y");
  483.     for ($i = -1$i 1$i++) {
  484.       foreach ($usersOffice as $user) {
  485.         $expire $this->_expire($year $i);
  486.         $leaveType $this->entityManager->getRepository(LeaveType::class)->findBy(array('office' => $office'parent' => array(null0)));
  487.         foreach ($leaveType as $l) {
  488.           $leave $this->_add_leave_data($user, ($year $i), $expire$l);
  489.           if ($leave !== false) {
  490.             if (is_array($leave)) {
  491.               foreach ($leave as $lv) {
  492.                 $parent $lv->getId();
  493.                 $childType $this->entityManager->getRepository(LeaveType::class)->findBy(array('office' => $office'parent' => array($l->getId())));
  494.                 if (count($childType) > 0) {
  495.                   foreach ($childType as $c) {
  496.                     $cleave $this->_add_leave_data($user, ($year $i), $expire$c$parent);
  497.                   }
  498.                 }
  499.               }
  500.             } else {
  501.               $parent $leave->getId();
  502.               $childType $this->entityManager->getRepository(LeaveType::class)->findBy(array('office' => $office'parent' => array($l->getId())));
  503.               if (count($childType) > 0) {
  504.                 foreach ($childType as $c) {
  505.                   $cleave $this->_add_leave_data($user, ($year $i), $expire$c$parent);
  506.                 }
  507.               }
  508.             }
  509.           }
  510.         }
  511.       }
  512.     }
  513.   }
  514.   public function getQuotaLeave($user)
  515.   {
  516.     $year date("Y");
  517.     $leaves $this->entityManager->getRepository(LeaveEntitlement::class)->findBy(['user' => $user'year' => $year]);
  518.     $quota 0;
  519.     foreach ($leaves as $leave) {
  520.       if ($leave->getAttributes()['label'] == 'Annual') {
  521.         $quota += $leave->getLeaveEntitlements();
  522.       }
  523.       if ($leave->getAttributes()['label'] == 'Bonus') {
  524.         $quota += $leave->getLeaveEntitlements();
  525.       }
  526.     }
  527.     return $quota;
  528.   }
  529.   public function getQuotaLeaveLeft($user)
  530.   {
  531.     $year date("Y");
  532.     $leaves $this->entityManager->getRepository(LeaveEntitlement::class)->findBy(['user' => $user'year' => $year]);
  533.     $quota 0;
  534.     foreach ($leaves as $leave) {
  535.       if ($leave->getAttributes()['label'] == 'Annual') {
  536.         $quota += $leave->getLeaveLeft();
  537.       }
  538.       if ($leave->getAttributes()['label'] == 'Bonus') {
  539.         $quota += $leave->getLeaveLeft();
  540.       }
  541.     }
  542.     return $quota;
  543.   }
  544.   public function getTotalLeaveLeft($user$leaveType)
  545.   {
  546.     $year date("Y");
  547.     $leaves $this->entityManager->getRepository(LeaveEntitlement::class)->findOneBy(['user' => $user'year' => $year'leaveType' => $leaveType]);
  548.     $quota 0;
  549.     $quota $leaves->getLeaveLeft();
  550.     return $quota;
  551.   }
  552.   public function checkEntitlements($user)
  553.   {
  554.     $userId $user->getId();
  555.     $leaveEntitlement $this->entityManager->getRepository(LeaveEntitlement::class)->findByUser($userId);
  556.     if (!empty($leaveEntitlement)) {
  557.       return true;
  558.     } else {
  559.       return false;
  560.     }
  561.   }
  562.   private function _expire($year)
  563.   {
  564.     $expire = new \DateTime(date("Y-m-d 00:00:00"strtotime(($year 1) . "-03-31")));
  565.     return $expire;
  566.   }
  567.   public function defineLeaveEntitlements($user)
  568.   {
  569.     $useroffice $user->getOffice();
  570.     if ($useroffice != null) {
  571.       $officeLeave $user->getOffice()->getOfficeLeave();
  572.       $year date("Y");
  573.       if ($officeLeave != null) {
  574.         for ($i 0$i 2$i++) {
  575.           $leaveRow $this->entityManager->getRepository(LeaveEntitlement::class)->findOneBy(array('user' => $user'year' => ($year $i)));
  576.           if ($leaveRow == null) {
  577.             $leaveRow = new LeaveEntitlement();
  578.             $leaveRow->setUser($user);
  579.             $leaveRow->setLeaveEntitlements($officeLeave->getAnnualDays());
  580.             $leaveRow->setIsIncremental($officeLeave->getIsIncremental());
  581.             $leaveRow->setIncrementalStart($officeLeave->getIncrementalStart());
  582.             $leaveRow->setIncrementalValue($officeLeave->getIncrementalValue());
  583.             $leaveRow->setAnnualDays($officeLeave->getAnnualDays());
  584.             $leaveRow->setsickEntitlements($officeLeave->getSickDays());
  585.             $leaveRow->setExpiredAt($this->_expire($year $i 1));
  586.             $leaveRow->setYear($year $i);
  587.             $leaveRow->setLeaveLeft($officeLeave->getAnnualDays());
  588.             $leaveRow->setSickLeft($officeLeave->getSickDays());
  589.             $leaveRow->setCreatedBy($user);
  590.             $leaveRow->setCreatedAt(new \DateTime());
  591.             $this->entityManager->persist($leaveRow);
  592.             $this->entityManager->flush();
  593.           }
  594.         }
  595.       }
  596.     }
  597.   }
  598.   public function getCountries()
  599.   {
  600.     $country Countries::getNames();
  601.     $country_choices array_flip($country);
  602.     $countries $this->entityManager->getRepository(Office::class)->findCountries();
  603.     // $countries = array_unique($countries);
  604.     $countries array_map("unserialize"array_unique(array_map("serialize"$countries)));
  605.     $countries array_column($countries'country');
  606.     $data = [];
  607.     foreach ($country_choices as $country => $covalue) {
  608.       foreach ($countries as $choice => $cvalue) {
  609.         if ($cvalue == $covalue) {
  610.           $data += [$country => $covalue];
  611.         }
  612.       }
  613.     }
  614.     return $data;
  615.   }
  616.   public function getLeaveLeft($user$leaveType)
  617.   {
  618.     // $office = $user->getOffice();
  619.     // $leaveTypeRow = $this->entityManager->getRepository(LeaveType::class)->findOneBy(array('leaveName'=>$leaveType, 'office'=>$office));
  620.     $leaveEntitlement $this->entityManager->getRepository(LeaveEntitlement::class)->findOneBy(array('user' => $user'leaveType' => $leaveType));
  621.     if (!empty($leaveEntitlement)) {
  622.       $leaveLeft $leaveEntitlement->getLeaveLeft();
  623.     } else {
  624.       $leaveLeft 0;
  625.     }
  626.     return $leaveLeft;
  627.     // $leaveEntitlement = $this->entityManager->getRepository(LeaveEntitlement::class)->findByUser($userId);
  628.     // if (!empty($leaveEntitlement)){
  629.     //   $leaveLeft = $leaveEntitlement[0]->getLeaveLeft();
  630.     // }
  631.     // else {
  632.     //   $leaveLeft = 0;
  633.     // }
  634.     // return $leaveLeft;
  635.   }
  636.   public function updateRequestApproved($user$leaveType)
  637.   {
  638.     $userId $user->getId();
  639.     // $office = $user->getOffice();
  640.     $result['status'] = 'OK';
  641.     // get leave approved
  642.     $leaveUsed $this->entityManager->getRepository(LeaveRequest::class)->findLeaveApproved($userId);
  643.     if (!empty($leaveUsed)) {
  644.       $leaveApproved $leaveUsed[0]['LeaveApprovedDays'];
  645.     } else {
  646.       $leaveApproved '0';
  647.     }
  648.     // update leave approved to entitlement
  649.     // $leaveEntitlement = $this->entityManager->getRepository(LeaveEntitlement::class)->findByUser($userId);
  650.     // $leaveTypeRow = $this->entityManager->getRepository(LeaveType::class)->findOneBy(array('leaveName'=>$leaveType, 'office'=>$office));
  651.     $leaveEntitlement $this->entityManager->getRepository(LeaveEntitlement::class)->findOneBy(array('user' => $user'leaveType' => $leaveType));
  652.     if (!empty($leaveEntitlement)) {
  653.       $leaveEntitlement->setLeaveApproved($leaveApproved);
  654.       $leaveLeft $leaveEntitlement->getLeaveEntitlements() - $leaveApproved;
  655.       $leaveEntitlement->setLeaveLeft($leaveLeft);
  656.       $this->entityManager->flush();
  657.     } else {
  658.       $result['status'] = 'ERROR';
  659.       $result['message'] = 'Entitlement Empty. Please create holiday entitlement first!';
  660.     }
  661.     return $result;
  662.   }
  663.   public function getMcLeft($userId)
  664.   {
  665.     $leaveEntitlement $this->entityManager->getRepository(LeaveEntitlement::class)->findByUser($userId);
  666.     if (!empty($leaveEntitlement)) {
  667.       $mcLeft $leaveEntitlement[0]->getSickLeft();
  668.     } else {
  669.       $mcLeft 0;
  670.     }
  671.     return $mcLeft;
  672.   }
  673.   public function updateMcJustified($user)
  674.   {
  675.     $userId $user->getId();
  676.     $office $user->getOffice();
  677.     $year date("Y");
  678.     $mcTaken $this->entityManager->getRepository(LeaveMCRecord::class)->findMcTaken($userId);
  679.     if (!empty($mcTaken)) {
  680.       $mcJustified $mcTaken[0]['mcTakenDays'];
  681.     } else {
  682.       $mcJustified 0;
  683.     }
  684.     $leaveType $this->entityManager->getRepository(LeaveType::class)->findOneBy(array('leaveName' => 'sick''office' => $office));
  685.     $leaveSickEntitlement $this->entityManager->getRepository(LeaveEntitlement::class)->findOneBy(array('user' => $user'year' => $year'leaveType' => $leaveType));
  686.     if (!empty($leaveSickEntitlement)) {
  687.       $leaveSickEntitlement->setLeaveApproved($mcJustified);
  688.       $leaveLeft $leaveSickEntitlement->getLeaveEntitlements() - $mcJustified;
  689.       $leaveSickEntitlement->setLeaveLeft($leaveLeft);
  690.       $this->entityManager->flush();
  691.     }
  692.   }
  693.   public function importXLS($inputFileName$option = array())
  694.   {
  695.     /* usage 
  696.         file: exp test.xlsx
  697.         option:
  698.         array(
  699.           "entity"=>"entityname"
  700.           "filter"=>"date"
  701.         );
  702.         filter to check if have the same data, yes=>will be update, no=>add new data
  703.     */
  704.     $default = array(
  705.       /*'column'=>array(
  706.             'description'=>'LeaveBankHoliday.description',
  707.             'date'=>'LeaveBankHoliday.date',
  708.             'location'=>'LeaveBankHoliday.location',
  709.         ),*/
  710.       'auto' => true,
  711.       'entity' => '',
  712.       'filter' => 'date'
  713.     );
  714.     $options $default;
  715.     foreach ($option as $k => $v) {
  716.       $options[$k] = $v;
  717.     }
  718.     $allowedMime = [
  719.       'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
  720.       'application/octet-stream'
  721.     ];
  722.     if ($inputFileName != null) {
  723.       if (strtolower($inputFileName->getClientOriginalExtension()) == 'xlsx' && in_array($inputFileName->getMimeType(), $allowedMime)) {
  724.         $em $this->entityManager;
  725.         $reader \PhpOffice\PhpSpreadsheet\IOFactory::createReader('Xlsx');
  726.         $reader->setReadDataOnly(true);
  727.         $spreadsheet $reader->load($inputFileName);
  728.         $worksheet $spreadsheet->getActiveSheet();
  729.         $highestRow $worksheet->getHighestRow();
  730.         $highestColumn $worksheet->getHighestColumn();
  731.         $highestColumnIndex \PhpOffice\PhpSpreadsheet\Cell\Coordinate::columnIndexFromString($highestColumn);
  732.         if (($options['auto']) && ($options['entity'] != '')) {
  733.           $class '\\App\\Entity\\' $options['entity'];
  734.           $options['column'] = array();
  735.           $collist $em->getClassMetadata($class)->fieldMappings;
  736.           for ($col 1$col <= $highestColumnIndex$col++) {
  737.             $value $worksheet->getCellByColumnAndRow($col1)->getValue();
  738.             if (isset($collist[$value])) {
  739.               $options['column'][strtolower($value)] = $options['entity'] . '.' $value;
  740.             }
  741.           }
  742.         }
  743.         $entity = array();
  744.         foreach ($options['column'] as $o) {
  745.           $o explode('.'$o);
  746.           if (!isset($entity[$o[0]])) {
  747.             $class '\\App\\Entity\\' $o[0];
  748.             $entity[$o[0]] = array();
  749.             $entity[$o[0]]['entity'] = $em->getRepository($class);
  750.             $entity[$o[0]]['column'] = $em->getClassMetadata($class)->fieldMappings;
  751.             //$entity[$o[0]]=$em->getRepository(\App\Entity\LeaveBankHoliday::class);
  752.           }
  753.         }
  754.         $value $worksheet->getCellByColumnAndRow(22)->getValue();
  755.         //$isdate=\PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($value);
  756.         //$value=$worksheet->getCellByColumnAndRow(2,2)->getDataType();
  757.         $result = array();
  758.         //search cols
  759.         $collist = array();
  760.         if (($highestRow 0) && ($highestColumnIndex 0)) {
  761.           for ($col 1$col <= $highestColumnIndex$col++) {
  762.             $value $worksheet->getCellByColumnAndRow($col1)->getValue();
  763.             $value trim($value);
  764.             $value strtolower($value);
  765.             if (isset($options['column'][$value])) {
  766.               $o $options['column'][$value];
  767.               $o explode('.'$o);
  768.               $collist[$value] = array();
  769.               $collist[$value]['number'] = $col;
  770.               $collist[$value]['entity'] = $o[0];
  771.               $collist[$value]['column'] = $o[1];
  772.               $collist[$value]['type'] = $entity[$o[0]]['column'][$value]['type'];
  773.               $collist[$value]['field'] = 'set' strtoupper(substr($o[1], 01)) . substr($o[1], 1strlen($o[1]) - 1);
  774.               $collist[$value]['fieldget'] = 'get' strtoupper(substr($o[1], 01)) . substr($o[1], 1strlen($o[1]) - 1);
  775.             }
  776.           }
  777.         }
  778.         if (isset($options['filter'])) {
  779.           if (is_array($options['filter'])) {
  780.           } else {
  781.             if (isset($collist[strtolower($options['filter'])])) {
  782.               $entity[$collist[strtolower($options['filter'])]['entity']]['filter'] = array();
  783.               $entity[$collist[strtolower($options['filter'])]['entity']]['filter'][$options['filter']] = null;
  784.             }
  785.           }
  786.         }
  787.         //$xcol=$em->getClassMetadata('\App\Entity\LeaveBankHoliday')->fieldMappings;
  788.         for ($row 1$row <= $highestRow$row++) {
  789.           if ($row 1) {
  790.             $class '';
  791.             $input = array();
  792.             foreach ($entity as $k => $v) {
  793.               if (isset($v['filter'])) {
  794.                 $filter $v['filter'];
  795.                 foreach ($filter as $kf => $vf) {
  796.                   $cellv $worksheet->getCellByColumnAndRow($collist[$kf]['number'], $row)->getValue();
  797.                   if ($collist[$kf]['type'] != 'date') {
  798.                     $filter[$kf] = $cellv;
  799.                   } else {
  800.                     $dt \PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($cellv);
  801.                     $filter[$kf] = $dt;
  802.                   }
  803.                 }
  804.                 $input[$k] = $v['entity']->findBy($filternull1);
  805.                 if ($input[$k] == null) {
  806.                   $class '\\App\\Entity\\' $k;
  807.                   $input[$k] = new $class();
  808.                 } else {
  809.                   $input[$k] = $input[$k][0];
  810.                 }
  811.               } else {
  812.                 $class '\\App\\Entity\\' $k;
  813.                 $input[$k] = new $class();
  814.               }
  815.               //
  816.             }
  817.             //$input=new $class();
  818.             $num count($result);
  819.             $result[$num] = array();
  820.             foreach ($collist as $colname => $col) {
  821.               $value $worksheet->getCellByColumnAndRow($col['number'], $row)->getValue();
  822.               if ($col["type"] != 'date') {
  823.                 if ($value != null) {
  824.                   $input[$col['entity']]->{$col["field"]}($value);
  825.                   $result[$num][$col['column']] = $value;
  826.                 } else {
  827.                   $input[$col['entity']]->{$col["field"]}([]);
  828.                   $result[$num][$col['column']] = $value;
  829.                 }
  830.               } else {
  831.                 if ($value != null) {
  832.                   $dt \PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($value);
  833.                   $input[$col['entity']]->{$col["field"]}($dt);
  834.                   $result[$num][$col['column']] = $dt->format('Y-m-d');
  835.                   $result[$num][$col['column'] . '_formatdate'] = $dt->format('d F Y');
  836.                 } else {
  837.                   $dt = new \DateTime('0000-00-00');
  838.                   $input[$col['entity']]->{$col["field"]}($dt);
  839.                   $result[$num][$col['column']] = $dt->format('Y-m-d');
  840.                   $result[$num][$col['column'] . '_formatdate'] = $dt->format('d F Y');
  841.                 }
  842.               }
  843.             }
  844.             foreach ($input as $inp) {
  845.               $ok true;
  846.               if ($inp->getDate() == null) {
  847.                 $ok false;
  848.               }
  849.               if ($inp->getDescription() == null) {
  850.                 $ok false;
  851.               }
  852.               if ($inp->getDescription() != null) {
  853.                 if (trim($inp->getDescription()) == '') {
  854.                   $ok false;
  855.                 }
  856.               }
  857.               if ($inp->getDate() != null) {
  858.                 if ($inp->getDate()->format('Y-m-d') == '0000-00-00') {
  859.                   $ok false;
  860.                 }
  861.               }
  862.               if ($ok) {
  863.                 $em->persist($inp);
  864.                 $em->flush();
  865.                 $result[$num]['id'] = $inp->getId();
  866.               }
  867.             }
  868.           }
  869.         }
  870.         /*for($row=1; $row <= $highestRow ; $row++){
  871.           if($row > 1){
  872.              foreach($collist as $colname=>$col){
  873.                 $value=$worksheet->getCellByColumnAndRow($col['number'],$row)->getValue();
  874.                 $entity[$col['entity']]->$col['filed']($value);
  875.              }
  876.           }
  877.           foreach($entity as $e){
  878.             $em->persist($e);
  879.             $em->flush();
  880.           }
  881.         }*/
  882.         /*$tr=new \App\Entity\LeaveBankHoliday();
  883.         $tr->setDescription('ID');
  884.         $tr->setDate(new \DateTime('2022-10-10'));
  885.         $tr->setLocation('ID');
  886.         $em->persist($tr);
  887.         $em->flush();*/
  888.         return $result;
  889.       }
  890.     }
  891.   }
  892.   private function _entitlementByUser(\App\Entity\User $users null$year)
  893.   {
  894.     $result = array();
  895.     $userlist = array();
  896.     if ($users == null) {
  897.       $users $entitlement $this->entityManager->getRepository(\App\Entity\User::class)->findAllActive();
  898.     }
  899.     if (!is_array($users)) {
  900.       $users = array($users);
  901.     }
  902.     $leavelist = array();
  903.     $leaveentitlement $this->entityManager->getRepository(\App\Entity\LeaveEntitlement::class)->findBy(array('year' => array($year 1$year)));
  904.     foreach ($leaveentitlement as $l) {
  905.       $uid $l->getUser()->getId();
  906.       $yr $l->getYear();
  907.       $type $l->getLeaveType();
  908.       if ($type != null) {
  909.         $type $l->getLeaveType()->getId();
  910.         if (!isset($leavelist['u' $uid])) {
  911.           $leavelist['u' $uid] = array();
  912.         }
  913.         if (!isset($leavelist['u' $uid]['y' $yr])) {
  914.           $leavelist['u' $uid]['y' $yr] = array();
  915.         }
  916.         $leavelist['u' $uid]['y' $yr]['t' $type] = $l;
  917.       }
  918.     }
  919.     $reader \PhpOffice\PhpSpreadsheet\IOFactory::createReader('Xlsx');
  920.     $reader->setReadDataOnly(true);
  921.     $spreadsheet $reader->load('../templates/report/entitlement.xlsx');
  922.     $worksheet $spreadsheet->getActiveSheet();
  923.     $highrow $worksheet->getHighestRow();
  924.     $highcol $worksheet->getHighestColumn();
  925.     $highestColumnIndex \PhpOffice\PhpSpreadsheet\Cell\Coordinate::columnIndexFromString($highcol);
  926.     $values = array();
  927.     $highcols 0;
  928.     $highrows $highrow;
  929.     for ($y $highrow$y >= 1$y--) {
  930.       $v $worksheet->getCellByColumnAndRow(1$y)->getValue();
  931.       if (($v != '') && ($v != null)) {
  932.         $highrows $y;
  933.         break;
  934.       }
  935.     }
  936.     $highrow $highrows;
  937.     for ($c 1$c <= $highestColumnIndex$c++) {
  938.       $v $worksheet->getCellByColumnAndRow($c$highrow)->getValue();
  939.       if ($v != '') {
  940.         $values[$c] = $v;
  941.         $highcols $c;
  942.       }
  943.     }
  944.     $row $highrow;
  945.     $now = new \DateTime();
  946.     $now->setTime(0000);
  947.     foreach ($leavelist as $k0 => $l0) {
  948.       $rcount $row;
  949.       $rfirst $row;
  950.       foreach ($l0['y' $year] as $k1 => $l1) {
  951.         $attr $l1->getAttributes();
  952.         $adder 1;
  953.         for ($c 1$c <= $highcols$c++) {
  954.           $cl \PhpOffice\PhpSpreadsheet\Cell\Coordinate::stringFromColumnIndex($c);
  955.           $worksheet->getStyle($cl $row)->getAlignment()->setVertical(\PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_TOP);
  956.           $m str_replace('-mergemain'''$values[$c]);
  957.           $m str_replace('-merge'''$m);
  958.           switch ($m) {
  959.             case '[location]':
  960.               $val $l1->getUser()->getOffice()->getCountry();
  961.               $worksheet->getCellByColumnAndRow($c$row)->setValue($val);
  962.               break;
  963.             case '[name]':
  964.               $val $l1->getUser()->getPersonalInfo()->getFullName();
  965.               $worksheet->getCellByColumnAndRow($c$row)->setValue($val);
  966.               break;
  967.             case '[joindate]':
  968.               $val $l1->getUser()->getPersonalInfo()->getJobJoinDate();
  969.               if ($val != null) {
  970.                 $dt \PhpOffice\PhpSpreadsheet\Shared\Date::dateTimeToExcel($val);
  971.                 $worksheet->getCellByColumnAndRow($c$row)->setValue($dt);
  972.                 $worksheet->getStyle($cl $row)
  973.                   ->getNumberFormat()
  974.                   ->setFormatCode('dd mmm yyyy');
  975.               } else {
  976.                 $worksheet->getCellByColumnAndRow($c$row)->setValue('');
  977.               }
  978.               break;
  979.             case '[leavetype]':
  980.               $pl 0;
  981.               if ($l1->getParent() == null) {
  982.                 $yr1 $year 1;
  983.                 if (isset($leavelist[$k0]['y' $yr1])) {
  984.                   $ol $leavelist[$k0]['y' $yr1];
  985.                   if (isset($ol[$k1])) {
  986.                     $oattr $ol[$k1]->getAttributes();
  987.                     if (isset($oattr['exipres'])) {
  988.                       if (is_array($oattr['expires'])) {
  989.                         $exp = new DateTime($oattr['expires']['date']);
  990.                       } else {
  991.                         $exp = new DateTime($oattr['expires']);
  992.                       }
  993.                       $given = new Datetime($attr['given']);
  994.                       if (($now >= $given) && ($exp >= $now)) {
  995.                         $pl 1;
  996.                         $adder 2;
  997.                         $worksheet->getCellByColumnAndRow($c$row)->setValue('Carry Leave');
  998.                       }
  999.                     }
  1000.                   }
  1001.                 }
  1002.               }
  1003.               $ty $l1->getLeaveType()->getLeaveName();
  1004.               $val = isset($attr['label']) ? $attr['label'] : $ty;
  1005.               $worksheet->getCellByColumnAndRow($c$row $pl)->setValue($val);
  1006.               break;
  1007.             case '[left]':
  1008.               $pl 0;
  1009.               $yr1 $year 1;
  1010.               if (isset($leavelist[$k0]['y' $yr1])) {
  1011.                 if ($l1->getParent() == null) {
  1012.                   $ol $leavelist[$k0]['y' $yr1];
  1013.                   if (isset($ol[$k1])) {
  1014.                     $oattr $ol[$k1]->getAttributes();
  1015.                     if (isset($oattr['exipres'])) {
  1016.                       if (is_array($oattr['expires'])) {
  1017.                         $exp = new DateTime($oattr['expires']['date']);
  1018.                       } else {
  1019.                         $exp = new DateTime($oattr['expires']);
  1020.                       }
  1021.                       $given = new Datetime($attr['given']);
  1022.                       if (($now >= $given) && ($exp >= $now)) {
  1023.                         $pl 1;
  1024.                         $adder 2;
  1025.                         $worksheet->getCellByColumnAndRow($c$row)->setValue($ol[$k1]->getLeaveLeft());
  1026.                       }
  1027.                     }
  1028.                   }
  1029.                 } else {
  1030.                   if (isset($attr['exipres'])) {
  1031.                     if (is_array($attr['expires'])) {
  1032.                       $exp = new DateTime($attr['expires']['date']);
  1033.                     } else {
  1034.                       $exp = new DateTime($attr['expires']);
  1035.                     }
  1036.                     $given = new Datetime($attr['given']);
  1037.                     if (($now >= $given) && ($now <= $exp)) {
  1038.                       $val $l1->getLeaveLeft();
  1039.                     } else {
  1040.                       $val $ol[$k1]->getLeaveLeft();
  1041.                     }
  1042.                   }
  1043.                 }
  1044.               } else {
  1045.                 if (isset($attr['exipres'])) {
  1046.                   if (is_array($attr['expires'])) {
  1047.                     $exp = new DateTime($attr['expires']['date']);
  1048.                   } else {
  1049.                     $exp = new DateTime($attr['expires']);
  1050.                   }
  1051.                   $given = new Datetime($attr['given']);
  1052.                   if (($now >= $given) && ($now <= $exp)) {
  1053.                     $val $l1->getLeaveLeft();
  1054.                   } else {
  1055.                     $val 0;
  1056.                   }
  1057.                 } else {
  1058.                   $val $l1->getLeaveLeft();
  1059.                 }
  1060.               }
  1061.               $worksheet->getCellByColumnAndRow($c$row $pl)->setValue($val);
  1062.               break;
  1063.             case '[given]':
  1064.               $pl 0;
  1065.               $yr1 $year 1;
  1066.               if (isset($leavelist[$k0]['y' $yr1])) {
  1067.                 if ($l1->getParent() == null) {
  1068.                   $ol $leavelist[$k0]['y' $yr1];
  1069.                   if (isset($ol[$k1])) {
  1070.                     $oattr $ol[$k1]->getAttributes();
  1071.                     if (isset($oattr['exipres'])) {
  1072.                       if (is_array($oattr['expires'])) {
  1073.                         $exp = new DateTime($oattr['expires']['date']);
  1074.                       } else {
  1075.                         $exp = new DateTime($oattr['expires']);
  1076.                       }
  1077.                       $given = new Datetime($attr['given']);
  1078.                       if (($now >= $given) && ($exp >= $now)) {
  1079.                         $pl 1;
  1080.                         $adder 2;
  1081.                         $worksheet->getCellByColumnAndRow($c$row)->setValue($ol[$k1]->getLeaveEntitlements());
  1082.                       }
  1083.                     }
  1084.                   }
  1085.                 } else {
  1086.                   if (isset($attr['exipres'])) {
  1087.                     if (is_array($attr['expires'])) {
  1088.                       $exp = new DateTime($attr['expires']['date']);
  1089.                     } else {
  1090.                       $exp = new DateTime($attr['expires']);
  1091.                     }
  1092.                     $given = new Datetime($attr['given']);
  1093.                     if (($now >= $given) && ($now <= $exp)) {
  1094.                       $val $l1->getLeaveEntitlements()();
  1095.                     } else {
  1096.                       $val $ol[$k1]->getLeaveEntitlements()();
  1097.                     }
  1098.                   }
  1099.                 }
  1100.               } else {
  1101.                 if (isset($attr['exipres'])) {
  1102.                   if (is_array($attr['expires'])) {
  1103.                     $exp = new DateTime($attr['expires']['date']);
  1104.                   } else {
  1105.                     $exp = new DateTime($attr['expires']);
  1106.                   }
  1107.                   $given = new Datetime($attr['given']);
  1108.                   if (($now >= $given) && ($now <= $exp)) {
  1109.                     $val $l1->getLeaveEntitlements();
  1110.                   } else {
  1111.                     $val 0;
  1112.                   }
  1113.                 } else {
  1114.                   $val $l1->getLeaveEntitlements();
  1115.                 }
  1116.               }
  1117.               $val $l1->getLeaveEntitlements();
  1118.               $worksheet->getCellByColumnAndRow($c$row $pl)->setValue($val);
  1119.               break;
  1120.             default:
  1121.               break;
  1122.           }
  1123.         }
  1124.         $row += $adder;
  1125.         $rcount += $adder;
  1126.       }
  1127.       $rcount $rcount 1;
  1128.       if ($rcount > ($rfirst 1)) {
  1129.         for ($c 1$c $highcols$c++) {
  1130.           if (strpos($values[$c], '-merge') !== false) {
  1131.             $cl \PhpOffice\PhpSpreadsheet\Cell\Coordinate::stringFromColumnIndex($c);
  1132.             $worksheet->mergeCells($cl $rfirst ':' $cl $rcount);
  1133.           }
  1134.         }
  1135.       }
  1136.     }
  1137.     for ($r 1$r $highrow$r++) {
  1138.       for ($c 1$c <= $highcols$c++) {
  1139.         $v $worksheet->getCellByColumnAndRow($c$r)->getValue();
  1140.         if (($v != '') && ($v != null)) {
  1141.           switch ($v) {
  1142.             case '[year]':
  1143.               $worksheet->getCellByColumnAndRow($c$r)->setValue($year);
  1144.               break;
  1145.             default:
  1146.               break;
  1147.           }
  1148.         }
  1149.       }
  1150.     }
  1151.     $writer = new \PhpOffice\PhpSpreadsheet\Writer\Xlsx($spreadsheet);
  1152.     ob_start();
  1153.     $writer->save('php://output');
  1154.     //return $result;
  1155.     return ob_get_clean();
  1156.   }
  1157.   public function entitlementReport($option = array())
  1158.   {
  1159.     $dafault = array(
  1160.       'year' => date('Y')
  1161.     );
  1162.     $result $this->_entitlementByUser(null'2022');
  1163.     return $result;
  1164.   }
  1165.   private function _leaveRequestByUser(\App\Entity\User $users null$startdate$enddate)
  1166.   {
  1167.     if ($users == null) {
  1168.       $users $entitlement $this->entityManager->getRepository(\App\Entity\User::class)->findAllActive();
  1169.     }
  1170.     if (!is_array($users)) {
  1171.       $users = array($users);
  1172.     }
  1173.     $yr1 = new \DateTime($startdate);
  1174.     $yr1 $yr1->format('Y');
  1175.     $yr1 $yr1 1;
  1176.     $yr2 = new \DateTime($enddate);
  1177.     $yr2 $yr2->format('Y');
  1178.     $yrs = array();
  1179.     for ($y $yr1$y <= $yr2$y++) {
  1180.       $yrs[count($yrs)] = $y;
  1181.     }
  1182.     $entlist = array();
  1183.     $entbyid = array();
  1184.     $entleft = array();
  1185.     $leaveentitlement $this->entityManager->getRepository(\App\Entity\LeaveEntitlement::class)->findBy(array('year' => $yrs));
  1186.     foreach ($leaveentitlement as $l) {
  1187.       $uid $l->getUser()->getId();
  1188.       $yrx $l->getYear();
  1189.       $type $l->getLeaveType();
  1190.       if ($type != null) {
  1191.         $type $l->getLeaveType()->getId();
  1192.         if (!isset($entlist['u' $uid])) {
  1193.           $entlist['u' $uid] = array();
  1194.         }
  1195.         if (!isset($entlist['u' $uid]['y' $yrx])) {
  1196.           $entlist['u' $uid]['y' $yrx] = array();
  1197.         }
  1198.         $entlist['u' $uid]['y' $yrx]['t' $type] = $l;
  1199.         if (!isset($entleft['u' $uid])) {
  1200.           $entleft['u' $uid] = array();
  1201.         }
  1202.         if (!isset($entleft['u' $uid]['y' $yrx])) {
  1203.           $entleflt['u' $uid]['y' $yrx] = array();
  1204.         }
  1205.         $entleft['u' $uid]['y' $yrx]['t' $type] = array();
  1206.         $entleft['u' $uid]['y' $yrx]['t' $type]['given'] = $l->getLeaveEntitlements();
  1207.         $entleft['u' $uid]['y' $yrx]['t' $type]['left'] = $l->getLeaveEntitlements();
  1208.         $entleft['u' $uid]['y' $yrx]['t' $type]['rleft'] = $l->getLeaveLeft();
  1209.         $entleft['u' $uid]['y' $yrx]['t' $type]['rgiven'] = $l->getLeaveLeft();
  1210.         $entleft['u' $uid]['y' $yrx]['t' $type]['igiven'] = $l->getLeaveLeft();
  1211.       }
  1212.       $entbyid['c' $l->getId()] = $l;
  1213.     }
  1214.     $sldate = new \DateTime($startdate);
  1215.     $slyear $sldate->format('Y');
  1216.     $eldate = new \DateTime($enddate);
  1217.     $elyear $eldate->format('Y');
  1218.     $leaverequest $this->entityManager->getRepository(\App\Entity\LeaveRequest::class);
  1219.     $lqresult $this->entityManager->getRepository(\App\Entity\LeaveRequest::class)->createQueryBuilder('a')
  1220.       ->select('a')
  1221.       ->where('a.startDate >= :from')
  1222.       ->andWhere('a.startDate <= :to')
  1223.       ->setParameter('from', new \DateTime($slyear '-01-01'))
  1224.       ->setParameter('to',  new \DateTime($elyear '-12-31'))
  1225.       ->orderBy('a.startDate')
  1226.       ->getQuery()
  1227.       ->getResult();
  1228.     $leavelist = array();
  1229.     foreach ($lqresult as $ll) {
  1230.       $uid $ll->getUser()->getId();
  1231.       if (!isset($leavelist['u' $uid])) {
  1232.         $leavelist['u' $uid] = array();
  1233.       }
  1234.       $leavelist['u' $uid][count($leavelist['u' $uid])] = $ll;
  1235.     }
  1236.     $reader \PhpOffice\PhpSpreadsheet\IOFactory::createReader('Xlsx');
  1237.     $reader->setReadDataOnly(true);
  1238.     $spreadsheet $reader->load('../templates/report/leave.xlsx');
  1239.     $worksheet $spreadsheet->getActiveSheet();
  1240.     $highrow $worksheet->getHighestRow();
  1241.     $highcol $worksheet->getHighestColumn();
  1242.     $highestColumnIndex \PhpOffice\PhpSpreadsheet\Cell\Coordinate::columnIndexFromString($highcol);
  1243.     $values = array();
  1244.     $highcols 0;
  1245.     $highrows $highrow;
  1246.     for ($y $highrow$y >= 1$y--) {
  1247.       $v $worksheet->getCellByColumnAndRow(1$y)->getValue();
  1248.       if (($v != '') && ($v != null)) {
  1249.         $highrows $y;
  1250.         break;
  1251.       }
  1252.     }
  1253.     $highrow $highrows;
  1254.     for ($c 1$c <= $highestColumnIndex$c++) {
  1255.       $v $worksheet->getCellByColumnAndRow($c$highrow)->getValue();
  1256.       if ($v != '') {
  1257.         $values[$c] = $v;
  1258.         $highcols $c;
  1259.       }
  1260.       $worksheet->getCellByColumnAndRow($c$highrow)->setValue('');
  1261.     }
  1262.     $row $highrow;
  1263.     $now = new \DateTime();
  1264.     $now->setTime(0000);
  1265.     //left calculation
  1266.     $dataleft = array();
  1267.     foreach ($lqresult as $l) {
  1268.       $lid $l->getId();
  1269.       $uid $l->getUser()->getId();
  1270.       $ty $l->getLeaveType()->getId();
  1271.       $dataleft['l' $lid] = array();
  1272.       $allo $l->getAlocation();
  1273.       if ($allo == null) {
  1274.         $allo = array();
  1275.       }
  1276.       $sl $l->getStartDate();
  1277.       $sy $sl->format('Y');
  1278.       foreach ($allo as $k => $a) {
  1279.         switch ($k) {
  1280.           case 'data':
  1281.             break;
  1282.           case 'dumper':
  1283.             break;  
  1284.           case 'error':
  1285.             break;
  1286.           case 'type':
  1287.             break;  
  1288.           case 'child':
  1289.             break;
  1290.           case 'unpaid':
  1291.             break;
  1292.           default:
  1293.             $yy str_replace('y'''$k);
  1294.             if (isset($endleft['u' $uid]['y' . ($yy 1)])) {
  1295.               $endleft['u' $uid]['y' . ($yy 1)]['t' $ty]['rgiven'] += $a;
  1296.               $endleft['u' $uid]['y' . ($yy 1)]['t' $ty]['igiven'] += $a;
  1297.             }
  1298.             break;
  1299.         }
  1300.       }
  1301.     }
  1302.     foreach ($leavelist as $k => $l) {
  1303.       $rcount $row;
  1304.       $rfirst $row;
  1305.       foreach ($l as $l1) {
  1306.         $alocation $l1->getAlocation();
  1307.         $okshow false;
  1308.         if (($l1->getStartDate() >= $sldate) && ($l1->getEndDate() <= $eldate)) {
  1309.           $okshow true;
  1310.         }
  1311.         if ($alocation == null) {
  1312.           $alocation = array();
  1313.         }
  1314.         $addrow = array();
  1315.         if ($l1->getLeaveType()->getLeaveName() != 'sick') {
  1316.           if (!is_null($l1->getIsApproved())) {
  1317.             if (($l1->getIsApproved() == false) || ($l1->getIsApproved() == 0)) {
  1318.               $okshow false;
  1319.             }
  1320.           }
  1321.         }
  1322.         for ($c 1$c <= $highcols$c++) {
  1323.           $cl \PhpOffice\PhpSpreadsheet\Cell\Coordinate::stringFromColumnIndex($c);
  1324.           $worksheet->getStyle($cl $row)->getAlignment()->setVertical(\PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_TOP);
  1325.           $m str_replace('-mergemain'''$values[$c]);
  1326.           $m str_replace('-merge'''$m);
  1327.           switch ($m) {
  1328.             case '[location]':
  1329.               if ($okshow) {
  1330.                 $val $l1->getUser()->getOffice()->getCountry();
  1331.                 $worksheet->getCellByColumnAndRow($c$row)->setValue($val);
  1332.               }
  1333.               break;
  1334.             case '[name]':
  1335.               if ($okshow) {
  1336.                 $val $l1->getUser()->getPersonalInfo()->getFullName();
  1337.                 $worksheet->getCellByColumnAndRow($c$row)->setValue($val);
  1338.               }
  1339.               break;
  1340.             case '[startdate]':
  1341.               $val $l1->getStartDate();
  1342.               if ($okshow) {
  1343.                 if ($val != null) {
  1344.                   $dt \PhpOffice\PhpSpreadsheet\Shared\Date::dateTimeToExcel($val);
  1345.                   $worksheet->getCellByColumnAndRow($c$row)->setValue($dt);
  1346.                   $worksheet->getStyle($cl $row)
  1347.                     ->getNumberFormat()
  1348.                     ->setFormatCode('dd mmm yyyy');
  1349.                 } else {
  1350.                   $worksheet->getCellByColumnAndRow($c$row)->setValue('');
  1351.                 }
  1352.               }
  1353.               break;
  1354.             case '[enddate]':
  1355.               $val $l1->getEndDate();
  1356.               if ($okshow) {
  1357.                 if ($val != null) {
  1358.                   $dt \PhpOffice\PhpSpreadsheet\Shared\Date::dateTimeToExcel($val);
  1359.                   $worksheet->getCellByColumnAndRow($c$row)->setValue($dt);
  1360.                   $worksheet->getStyle($cl $row)
  1361.                     ->getNumberFormat()
  1362.                     ->setFormatCode('dd mmm yyyy');
  1363.                 } else {
  1364.                   $worksheet->getCellByColumnAndRow($c$row)->setValue('');
  1365.                 }
  1366.               }
  1367.               break;
  1368.             case '[days]':
  1369.               $val $l1->getLeaveType()->getId();
  1370.               $sdate $l1->getStartDate()->format('Y');
  1371.               if (isset($alocation['child'])) {
  1372.                 if (isset($alocation['child']['y' $sdate])) {
  1373.                   if (count($alocation['child']['y' $sdate]) > 0) {
  1374.                     foreach ($alocation['child']['y' $sdate] as $ckey => $chd) {
  1375.                       if (!isset($addrow[$c])) {
  1376.                         $addrow[$c] = 0;
  1377.                       }
  1378.                       if ($okshow) {
  1379.                         $worksheet->getCellByColumnAndRow($c$row $addrow[$c])->setValue($chd);
  1380.                       }
  1381.                       $addrow[$c]++;
  1382.                     }
  1383.                   }
  1384.                 }
  1385.               }
  1386.               if (isset($alocation['y' . ($sdate 1)])) {
  1387.                 if (isset($entlist[$k])) {
  1388.                   if (isset($entlist[$k]['y' . ($sdate 1)])) {
  1389.                     if (isset($entlist[$k]['y' . ($sdate 1)]['t' $val])) {
  1390.                       if (!isset($addrow[$c])) {
  1391.                         $addrow[$c] = 0;
  1392.                       }
  1393.                       if ($okshow) {
  1394.                         $worksheet->getCellByColumnAndRow($c$row $addrow[$c])->setValue($alocation['y' . ($sdate 1)]);
  1395.                       }
  1396.                       $addrow[$c]++;
  1397.                     }
  1398.                   }
  1399.                 }
  1400.               }
  1401.               $unpaid false;
  1402.               if (isset($alocation['unpaid'])) {
  1403.                 if (isset($alocation['unpaid']['y' $sdate])) {
  1404.                   $unpaid true;
  1405.                 }
  1406.               }
  1407.               if (isset($alocation['y' $sdate]) || $unpaid) {
  1408.                 if (isset($entlist[$k])) {
  1409.                   if (isset($entlist[$k]['y' $sdate])) {
  1410.                     if (isset($entlist[$k]['y' $sdate]['t' $val])) {
  1411.                       if (!isset($addrow[$c])) {
  1412.                         $addrow[$c] = 0;
  1413.                       }
  1414.                       if ($okshow) {
  1415.                         $vl = isset($alocation['y' $sdate]) ? $alocation['y' $sdate] : 0;
  1416.                         if ($unpaid) {
  1417.                           $vl += $alocation['unpaid']['y' $sdate]['value'];
  1418.                         }
  1419.                         $worksheet->getCellByColumnAndRow($c$row $addrow[$c])->setValue($vl);
  1420.                       }
  1421.                       $addrow[$c]++;
  1422.                     }
  1423.                   }
  1424.                 }
  1425.               }
  1426.               break;
  1427.             case '[leavetype]':
  1428.               $lbl '';
  1429.               $val $l1->getLeaveType()->getId();
  1430.               $nm $l1->getLeaveType()->getLeaveName();
  1431.               $sdate $l1->getStartDate()->format('Y');
  1432.               if (isset($alocation['child'])) {
  1433.                 if (isset($alocation['child']['y' $sdate])) {
  1434.                   if (count($alocation['child']['y' $sdate]) > 0) {
  1435.                     foreach ($alocation['child']['y' $sdate] as $ckey => $chd) {
  1436.                       $chid $entbyid[$ckey]->getLeaveType()->getId();
  1437.                       $chnm $entbyid[$ckey]->getLeaveType()->getLeaveName();
  1438.                       $chattr $entbyid[$ckey]->getAttributes();
  1439.                       $chlbl = isset($chattr['label']) ? $chattr['label'] : $chnm;
  1440.                       if (!isset($addrow[$c])) {
  1441.                         $addrow[$c] = 0;
  1442.                       }
  1443.                       if ($okshow) {
  1444.                         $worksheet->getCellByColumnAndRow($c$row $addrow[$c])->setValue($chlbl);
  1445.                       }
  1446.                       $addrow[$c]++;
  1447.                     }
  1448.                   }
  1449.                 }
  1450.               }
  1451.               if (isset($alocation['y' . ($sdate 1)])) {
  1452.                 if (isset($entlist[$k])) {
  1453.                   if (isset($entlist[$k]['y' . ($sdate 1)])) {
  1454.                     if (isset($entlist[$k]['y' . ($sdate 1)]['t' $val])) {
  1455.                       $lbl 'Carry Offer';
  1456.                       if (!isset($addrow[$c])) {
  1457.                         $addrow[$c] = 0;
  1458.                       }
  1459.                       if ($okshow) {
  1460.                         $worksheet->getCellByColumnAndRow($c$row $addrow[$c])->setValue($lbl);
  1461.                       }
  1462.                       $addrow[$c]++;
  1463.                     }
  1464.                   }
  1465.                 }
  1466.               }
  1467.               $unpaid false;
  1468.               if (isset($alocation['unpaid'])) {
  1469.                 if (isset($alocation['unpaid']['y' $sdate])) {
  1470.                   $unpaid true;
  1471.                 }
  1472.               }
  1473.               if (isset($alocation['y' $sdate]) || $unpaid) {
  1474.                 if (isset($entlist[$k])) {
  1475.                   if (isset($entlist[$k]['y' $sdate])) {
  1476.                     if (isset($entlist[$k]['y' $sdate]['t' $val])) {
  1477.                       $lbl $entlist[$k]['y' $sdate]['t' $val]->getAttributes();
  1478.                       $lbl = isset($lbl['label']) ? $lbl['label'] : $nm;
  1479.                       if (!isset($addrow[$c])) {
  1480.                         $addrow[$c] = 0;
  1481.                       }
  1482.                       if ($okshow) {
  1483.                         $worksheet->getCellByColumnAndRow($c$row $addrow[$c])->setValue($lbl);
  1484.                       }
  1485.                       $addrow[$c]++;
  1486.                     }
  1487.                   }
  1488.                 }
  1489.               }
  1490.               break;
  1491.             case '[given]':
  1492.               $val $l1->getLeaveType()->getId();
  1493.               $sdate $l1->getStartDate()->format('Y');
  1494.               if (isset($alocation['child'])) {
  1495.                 if (isset($alocation['child']['y' $sdate])) {
  1496.                   if (count($alocation['child']['y' $sdate]) > 0) {
  1497.                     foreach ($alocation['child']['y' $sdate] as $ckey => $chd) {
  1498.                       $chlbl $entbyid[$ckey]->getLeaveEntitlements();
  1499.                       if (!isset($addrow[$c])) {
  1500.                         $addrow[$c] = 0;
  1501.                       }
  1502.                       if ($okshow) {
  1503.                         $worksheet->getCellByColumnAndRow($c$row $addrow[$c])->setValue($chlbl);
  1504.                       }
  1505.                       $addrow[$c]++;
  1506.                     }
  1507.                   }
  1508.                 }
  1509.               }
  1510.               if (isset($alocation['y' . ($sdate 1)])) {
  1511.                 if (isset($entlist[$k])) {
  1512.                   if (isset($entlist[$k]['y' . ($sdate 1)])) {
  1513.                     if (isset($entlist[$k]['y' . ($sdate 1)]['t' $val])) {
  1514.                       $lbl $entleft[$k]['y' . ($sdate 1)]['t' $val]['rgiven'];
  1515.                       if (!isset($addrow[$c])) {
  1516.                         $addrow[$c] = 0;
  1517.                       }
  1518.                       if ($okshow) {
  1519.                         $worksheet->getCellByColumnAndRow($c$row $addrow[$c])->setValue($lbl);
  1520.                       }
  1521.                       $addrow[$c]++;
  1522.                     }
  1523.                   }
  1524.                 }
  1525.               }
  1526.               $unpaid false;
  1527.               if (isset($alocation['unpaid'])) {
  1528.                 if (isset($alocation['unpaid']['y' $sdate])) {
  1529.                   $unpaid true;
  1530.                 }
  1531.               }
  1532.               if (isset($alocation['y' $sdate]) || $unpaid) {
  1533.                 if (isset($entlist[$k])) {
  1534.                   if (isset($entlist[$k]['y' $sdate])) {
  1535.                     if (isset($entlist[$k]['y' $sdate]['t' $val])) {
  1536.                       $lbl $entlist[$k]['y' $sdate]['t' $val]->getLeaveEntitlements();
  1537.                       if (!isset($addrow[$c])) {
  1538.                         $addrow[$c] = 0;
  1539.                       }
  1540.                       if ($okshow) {
  1541.                         $worksheet->getCellByColumnAndRow($c$row $addrow[$c])->setValue($lbl);
  1542.                       }
  1543.                       $addrow[$c]++;
  1544.                     }
  1545.                   }
  1546.                 }
  1547.               }
  1548.               break;
  1549.             case '[left]':
  1550.               $val $l1->getLeaveType()->getId();
  1551.               $sdate $l1->getStartDate()->format('Y');
  1552.               if (isset($alocation['child'])) {
  1553.                 if (isset($alocation['child']['y' $sdate])) {
  1554.                   if (count($alocation['child']['y' $sdate]) > 0) {
  1555.                     foreach ($alocation['child']['y' $sdate] as $ckey => $chd) {
  1556.                       $cty $entbyid[$ckey]->getLeaveType()->getId();
  1557.                       if (isset($entleft[$k]['y' $sdate])) {
  1558.                         if (isset($entleft[$k]['y' $sdate]['t' $cty])) {
  1559.                           $entleft[$k]['y' $sdate]['t' $cty]['left'] -= $chd;
  1560.                           $chlbl $entleft[$k]['y' $sdate]['t' $cty]['left'];
  1561.                           if (!isset($addrow[$c])) {
  1562.                             $addrow[$c] = 0;
  1563.                           }
  1564.                           if ($okshow) {
  1565.                             if ($lbl 0) {
  1566.                               $lbl 0;
  1567.                             }
  1568.                             $worksheet->getCellByColumnAndRow($c$row $addrow[$c])->setValue($chlbl);
  1569.                           }
  1570.                           $addrow[$c]++;
  1571.                         }
  1572.                       }
  1573.                     }
  1574.                   }
  1575.                 }
  1576.               }
  1577.               if (isset($alocation['y' . ($sdate 1)])) {
  1578.                 if (isset($entlist[$k])) {
  1579.                   if (isset($entlist[$k]['y' . ($sdate 1)])) {
  1580.                     if (isset($entlist[$k]['y' . ($sdate 1)]['t' $val])) {
  1581.                       if (isset($entleft[$k]['y' . ($sdate 1)])) {
  1582.                         if (isset($entleft[$k]['y' . ($sdate 1)]['t' $val])) {
  1583.                           $entleft[$k]['y' . ($sdate 1)]['t' $val]['igiven'] -= $alocation['y' . ($sdate 1)];
  1584.                           $lbl $entleft[$k]['y' . ($sdate 1)]['t' $val]['igiven'];
  1585.                           if (!isset($addrow[$c])) {
  1586.                             $addrow[$c] = 0;
  1587.                           }
  1588.                           if ($okshow) {
  1589.                             if ($lbl 0) {
  1590.                               $lbl 0;
  1591.                             }
  1592.                             $worksheet->getCellByColumnAndRow($c$row $addrow[$c])->setValue($lbl);
  1593.                           }
  1594.                           $addrow[$c]++;
  1595.                         }
  1596.                       }
  1597.                     }
  1598.                   }
  1599.                 }
  1600.               }
  1601.               $unpaid false;
  1602.               if (isset($alocation['unpaid'])) {
  1603.                 if (isset($alocation['unpaid']['y' $sdate])) {
  1604.                   $unpaid true;
  1605.                 }
  1606.               }
  1607.               if (isset($alocation['y' $sdate]) || $unpaid) {
  1608.                 if (isset($entlist[$k])) {
  1609.                   if (isset($entlist[$k]['y' $sdate])) {
  1610.                     if (isset($entlist[$k]['y' $sdate]['t' $val])) {
  1611.                       if (isset($entleft[$k]['y' $sdate]['t' $val])) {
  1612.                         $vl = isset($alocation['y' $sdate]) ? $alocation['y' $sdate] : 0;
  1613.                         $entleft[$k]['y' $sdate]['t' $val]['left'] -= $vl;
  1614.                         $lbl $entleft[$k]['y' $sdate]['t' $val]['left'];
  1615.                         if (!isset($addrow[$c])) {
  1616.                           $addrow[$c] = 0;
  1617.                         }
  1618.                         if ($okshow) {
  1619.                           if ($lbl 0) {
  1620.                             $lbl 0;
  1621.                           }
  1622.                           $worksheet->getCellByColumnAndRow($c$row $addrow[$c])->setValue($lbl);
  1623.                         }
  1624.                         $addrow[$c]++;
  1625.                       }
  1626.                     }
  1627.                   }
  1628.                 }
  1629.               }
  1630.               break;
  1631.             case '[unpaid]':
  1632.               if (isset($alocation['unpaid'])) {
  1633.                 if (isset($alocation['unpaid']['y' $sdate])) {
  1634.                   if ($okshow) {
  1635.                     $worksheet->getCellByColumnAndRow($c$row)->setValue($alocation['unpaid']['y' $sdate]['value']);
  1636.                   }
  1637.                 }
  1638.               }
  1639.               $attrlv $l1->getLeaveType()->getAttributes();
  1640.               $sdate $l1->getStartDate()->format('Y');
  1641.               if ($attrlv != null) {
  1642.                 if (isset($attrlv['deductedafter'])) {
  1643.                   if ($okshow) {
  1644.                     $dy $l1->getDays();
  1645.                     $dyok false;
  1646.                     $dy $dy $attrlv['deductedafter'];
  1647.                     if ($entleft[$k]['y' $sdate]['t' $l1->getLeaveType()->getId()]['left'] < 0) {
  1648.                       $dy $l1->getDays();
  1649.                     }
  1650.                     if (!is_null($l1->getIsApproved())) {
  1651.                       if (($l1->getIsApproved() == true) || ($l1->getIsApproved() == 1)) {
  1652.                         $dy 0;
  1653.                       }
  1654.                     }
  1655.                     if ($dy 0) {
  1656.                       $worksheet->getCellByColumnAndRow($c$row)->setValue($dy);
  1657.                     }
  1658.                   }
  1659.                 }
  1660.               }
  1661.               break;
  1662.             default:
  1663.               break;
  1664.           }
  1665.         }
  1666.         if ($okshow) {
  1667.           if (count($addrow) > 0) {
  1668.             $mx max($addrow);
  1669.             for ($c 1$c <= $highcols$c++) {
  1670.               if (strpos($values[$c], '-merge') !== false) {
  1671.                 $rr = ($row $mx) - 1;
  1672.                 $cl \PhpOffice\PhpSpreadsheet\Cell\Coordinate::stringFromColumnIndex($c);
  1673.                 $worksheet->mergeCells($cl $row ':' $cl $rr);
  1674.               }
  1675.             }
  1676.             $row += $mx;
  1677.           } else {
  1678.             $row++;
  1679.           }
  1680.         }
  1681.       }
  1682.     }
  1683.     for ($r 1$r $highrow$r++) {
  1684.       for ($c 1$c <= $highcols$c++) {
  1685.         $v $worksheet->getCellByColumnAndRow($c$r)->getValue();
  1686.         if (($v != '') && ($v != null)) {
  1687.           switch ($v) {
  1688.             case '[periode]':
  1689.               $txt $sldate->format('d F Y') . ' - ' $eldate->format('d F Y');
  1690.               $worksheet->getCellByColumnAndRow($c$r)->setValue($txt);
  1691.               break;
  1692.             default:
  1693.               break;
  1694.           }
  1695.         }
  1696.       }
  1697.     }
  1698.     $writer = new \PhpOffice\PhpSpreadsheet\Writer\Xlsx($spreadsheet);
  1699.     ob_start();
  1700.     $writer->save('php://output');
  1701.     //return $result;
  1702.     return ob_get_clean();
  1703.   }
  1704.   public function leaveReport($option)
  1705.   {
  1706.     $option base64_decode($option);
  1707.     $option json_decode($option);
  1708.     $default = array(
  1709.       'start' => date('Y') . '-01-01',
  1710.       'end' => date('Y') . '-12-31',
  1711.       'user' => null
  1712.     );
  1713.     $opt $default;
  1714.     foreach ($option as $k => $v) {
  1715.       $opt[$k] = $v;
  1716.     }
  1717.     $result $this->_leaveRequestByUser($opt['user'], $opt['start'], $opt['end']);
  1718.     return $result;
  1719.   }
  1720.   public function upcomingReport($option){
  1721.     $option base64_decode($option);
  1722.     $option json_decode($option);
  1723.     /*$option = base64_decode($option);
  1724.     $option = json_decode($option);*/
  1725.     $default = array(
  1726.       'start' => date('Y') . '-01-01',
  1727.       'end' => date('Y') . '-12-31',
  1728.       'user' => null
  1729.     );
  1730.     $opt $default;
  1731.     foreach ($option as $k => $v) {
  1732.       $opt[$k] = $v;
  1733.     }
  1734.     $sldate=new \DateTime($opt['start']);
  1735.     $eldate=new \DateTime($opt['end']);
  1736.     
  1737.     $data=array();
  1738.     $leaverequest $this->entityManager->getRepository(\App\Entity\LeaveRequest::class)->findLeaveByDate(array(
  1739.       array(
  1740.       'start'=>$sldate,
  1741.       'end'=>$eldate
  1742.       )
  1743.     ));
  1744.     
  1745.     if(!is_null($leaverequest)){
  1746.       foreach($leaverequest as $r){
  1747.         $obj=array();
  1748.         $startdate=$r->getStartDate();
  1749.         $enddate=$r->getEndDate();
  1750.         $obj['sort']=$startdate->format('Ymd');
  1751.         $obj['startdate']= \PhpOffice\PhpSpreadsheet\Shared\Date::dateTimeToExcel($startdate);
  1752.         $obj['enddate']= \PhpOffice\PhpSpreadsheet\Shared\Date::dateTimeToExcel($enddate);
  1753.         $obj['days']=$r->getDays();
  1754.         $obj['name']=$r->getUser()->getPersonalInfo()->getFullName();
  1755.         $leavetype=$r->getLeaveType();
  1756.         $attr=$leavetype->getAttributes();
  1757.         $lvtype='';
  1758.         if(isset($attr['label'])){$lvtype=$attr['label'];}else{$lvtype=$leavetype->getLeaveName();}
  1759.         $obj['leavetype']=$lvtype;
  1760.         $obj['location']=$r->getUser()->getOffice()->getCountry();
  1761.         array_push($data,$obj);
  1762.       }
  1763.     }
  1764.     $holiday $this->entityManager->getRepository(\App\Entity\LeaveBankHoliday::class)->findLeaveByDate(array(
  1765.       array(
  1766.       'start'=>$sldate,
  1767.       'end'=>$eldate
  1768.       )
  1769.     ));
  1770.     
  1771.     if(!is_null($holiday)){
  1772.       foreach($holiday as $r){
  1773.         $obj=array();
  1774.         $startdate=$r->getdate();
  1775.         $enddate=$r->getEndDate();
  1776.         if(is_null($enddate)){
  1777.           $enddate=$r->getdate();
  1778.         }
  1779.         $obj['sort']=$startdate->format('Ymd');
  1780.         $obj['startdate']= \PhpOffice\PhpSpreadsheet\Shared\Date::dateTimeToExcel($startdate);
  1781.         $obj['enddate']= \PhpOffice\PhpSpreadsheet\Shared\Date::dateTimeToExcel($enddate);
  1782.         $df=date_diff($enddate,$startdate);
  1783.         $obj['days']=abs($df->d);
  1784.         $obj['name']=$r->getDescription();
  1785.         $lvtype='PH';
  1786.         $obj['leavetype']=$lvtype;
  1787.         $obj['location']=$r->getLocation();
  1788.         array_push($data,$obj);
  1789.       }
  1790.     }
  1791.     
  1792.     usort($data,function($a,$b){
  1793.       if($a['sort']==$b['sort']){return  0;}
  1794.       return ($a['sort']<$b['sort'])?-1:1;
  1795.     });
  1796.     //converter
  1797.     $reader \PhpOffice\PhpSpreadsheet\IOFactory::createReader('Xlsx');
  1798.     $reader->setReadDataOnly(true);
  1799.     $spreadsheet $reader->load('../templates/report/upcoming.xlsx');
  1800.     $worksheet $spreadsheet->getActiveSheet();
  1801.     $highrow $worksheet->getHighestRow();
  1802.     $highcol $worksheet->getHighestColumn();
  1803.     $highestColumnIndex \PhpOffice\PhpSpreadsheet\Cell\Coordinate::columnIndexFromString($highcol);
  1804.     $values = array();
  1805.     $highcols 0;
  1806.     $highrows $highrow;
  1807.     for ($y $highrow$y >= 1$y--) {
  1808.       $v $worksheet->getCellByColumnAndRow(1$y)->getValue();
  1809.       if (($v != '') && ($v != null)) {
  1810.         $highrows $y;
  1811.         break;
  1812.       }
  1813.     }
  1814.     $highrow $highrows;
  1815.     for ($c 1$c <= $highestColumnIndex$c++) {
  1816.       $v $worksheet->getCellByColumnAndRow($c$highrow)->getValue();
  1817.       if ($v != '') {
  1818.         $values[$c] = $v;
  1819.         $highcols $c;
  1820.       }
  1821.       $worksheet->getCellByColumnAndRow($c$highrow)->setValue('');
  1822.     }
  1823.     
  1824.     $row $highrow;
  1825.     for ($r 1$r $highrow$r++) {
  1826.       for ($c 1$c <= $highcols$c++) {
  1827.         $v $worksheet->getCellByColumnAndRow($c$r)->getValue();
  1828.         if (($v != '') && ($v != null)) {
  1829.           switch ($v) {
  1830.             case '[periode]':
  1831.               $txt $sldate->format('d F Y') . ' - ' $eldate->format('d F Y');
  1832.               $worksheet->getCellByColumnAndRow($c$r)->setValue($txt);
  1833.               break;
  1834.             default:
  1835.               break;
  1836.           }
  1837.         }
  1838.       }
  1839.     }
  1840.     foreach($data as $d){
  1841.       for ($c 1$c <= $highcols$c++) {
  1842.         $v=str_replace(array('[',']'),'',$values[$c]);
  1843.         if(isset($d[$v])){
  1844.           $cl \PhpOffice\PhpSpreadsheet\Cell\Coordinate::stringFromColumnIndex($c);
  1845.           
  1846.           $worksheet->getCellByColumnAndRow($c$row)->setValue($d[$v]);
  1847.           if(($c==1) || ($c==2)){
  1848.             $worksheet->getStyle($cl $row)
  1849.             ->getNumberFormat()
  1850.             ->setFormatCode('dd mmm yyyy');
  1851.           }
  1852.         }
  1853.       }
  1854.       $row++;  
  1855.     }
  1856.     $writer = new \PhpOffice\PhpSpreadsheet\Writer\Xlsx($spreadsheet);
  1857.     ob_start();
  1858.     $writer->save('php://output');
  1859.     //return $result;
  1860.     return ob_get_clean();
  1861.   }
  1862.   public function exportBankHoliday()
  1863.   {
  1864.     $spreadsheet = new \PhpOffice\PhpSpreadsheet\Spreadsheet();
  1865.     $sheet $spreadsheet->getActiveSheet();
  1866.     $sheet->setCellValue('A1''description');
  1867.     $sheet->setCellValue('B1''date');
  1868.     $sheet->setCellValue('C1''end date');
  1869.     $sheet->setCellValue('D1''location');
  1870.     
  1871.     $em $this->entityManager;
  1872.     $leavebank $em->getRepository(\App\Entity\LeaveBankHoliday::class)->findAll();
  1873.     $row 2;
  1874.     foreach ($leavebank as $l) {
  1875.       $dt $l->getDate();
  1876.       $dtend='';
  1877.       if(!is_null($l->getEndDate())){
  1878.         $dtend $l->getEndDate();
  1879.       }
  1880.       $dt \PhpOffice\PhpSpreadsheet\Shared\Date::dateTimeToExcel($dt);
  1881.       $sheet->setCellValue('A' $row$l->getDescription());
  1882.       $sheet->setCellValue('B' $row$dt);
  1883.       $sheet->getStyle('B' $row)
  1884.         ->getNumberFormat()
  1885.         ->setFormatCode('dd mmm yyyy');
  1886.         if($dtend !=''){
  1887.           $dtend \PhpOffice\PhpSpreadsheet\Shared\Date::dateTimeToExcel($dtend);
  1888.           $sheet->setCellValue('C' $row$dtend);
  1889.           $sheet->getStyle('C' $row)
  1890.             ->getNumberFormat()
  1891.             ->setFormatCode('dd mmm yyyy');
  1892.         }  
  1893.       $sheet->setCellValue('D' $row$l->getLocation());
  1894.       $row++;
  1895.     }
  1896.     $writer = new \PhpOffice\PhpSpreadsheet\Writer\Xlsx($spreadsheet);
  1897.     ob_start();
  1898.     $writer->save('php://output');
  1899.     ob_end_clean();
  1900.     return ob_get_clean();
  1901.     //$writer->save('../var/log/test.xlsx');
  1902.     //$writer->save('hello world.xlsx');
  1903.   }
  1904.   function _leave_use($date,$leaveAttr,$probation,$start){
  1905.     $use=null;
  1906.     $given=null;
  1907.     $expire=null;
  1908.     $probation=new \DateTime($probation);
  1909.     $year=$leaveAttr['year'];
  1910.     $nowx=new \DateTime(date('Y-m-d'));
  1911.     if(isset($leaveAttr)){
  1912.       if(isset($leaveAttr['active'])){
  1913.         if(isset($leaveAttr['attr']['expires'])){
  1914.           if(is_array($leaveAttr['attr']['expires'])){
  1915.             $expire=new \DateTime($leaveAttr['attr']['expires']['date']);
  1916.           }else{
  1917.             $expire=new \DateTime($leaveAttr['attr']['expires']);
  1918.           }
  1919.         }
  1920.         /*if(isset($leaveAttr['attr']['carryDate'])){
  1921.           $carrydate=new \DateTime($leaveAttr['attr']['carryDate']);
  1922.           if(($date < $carrydate) && ($leaveAttr['expires'] >= $carrydate)){
  1923.             $expire=$carrydate->modify('-1 day');
  1924.             $expire=new \DateTime($expire->format('Y-m-d'));
  1925.           }
  1926.         }*/
  1927.         if($expire==null){$expire=new \DateTime($year.'-12-31');}
  1928.         if(isset($leaveAttr['attr']['given'])){
  1929.           if(is_array($leaveAttr['attr']['given'])){
  1930.             $given=new \DateTime($leaveAttr['attr']['given']['date']);
  1931.           }else{
  1932.             $given=new \DateTime($leaveAttr['attr']['given']);
  1933.           }
  1934.         }
  1935.         if($given==null){$given=new \DateTime($year.'-01-01');}
  1936.         
  1937.         //if($given < $probation){$given=new \DateTime($probation->format('Y-m-d'));}
  1938.         if(($probation $nowx) && ($given $probation)){
  1939.           $given=new \DateTime($probation->format('Y-m-d'));
  1940.         }
  1941.         if(isset($leaveAttr['totalcarry'])){
  1942.           if($leaveAttr['totalcarry'] >= $leaveAttr['left']){
  1943.             if((!is_null($leaveAttr['carrygiven'])) && (!is_null($leaveAttr['carryexpire']))){
  1944.               $dt=new \DateTime($date->format('Y-m-d')); 
  1945.               $gv=new \DateTime($leaveAttr['carrygiven']);
  1946.               if($dt $gv){
  1947.                 $expire= new \DateTime($leaveAttr['carryexpire']);
  1948.               }
  1949.             }  
  1950.           }
  1951.         }
  1952.         if(($given <= $date) && ($expire >= $date) &&($date >= $start)){
  1953.           $use=$leaveAttr;
  1954.           $use['expire']=$expire;
  1955.           $use['given']=$given;
  1956.         }
  1957.       }
  1958.     }
  1959.     return $use;
  1960.   }
  1961.   public function isOnProbation($user,$country,$isprobation=false){
  1962.       $probation=null;
  1963.       if ($user->getPersonalInfo()->getJobStatus() == 'form.job_status.permanent'){
  1964.         $probation=new \DateTime();
  1965.         date_modify($probation,'-1 day');
  1966.         return $probation;
  1967.       }  
  1968.       if($isprobation==true){
  1969.           $probation=new \DateTime();
  1970.           date_modify($probation,'-1 day');
  1971.       }else{
  1972.         //if(!is_null($user->getPersonalInfo()->getJobPermanentDate())){
  1973.         //  $probation = new \DateTime($user->getPersonalInfo()->getJobPermanentDate()->format('Y-m-d'));
  1974.         //}
  1975.         
  1976.         if(($country=='SG') || ($country=='HK')){
  1977.           if ($user->getPersonalInfo()->getJobStatus() != 'form.job_status.permanent'){
  1978.             if($user->getPersonalInfo()->getJobStatus() != 'form.job_status.probation'){
  1979.               if($user->getPersonalInfo()->getJobJoinDate()!=null){
  1980.                 $probation = new \DateTime($user->getPersonalInfo()->getJobJoinDate()->format('Y-m-d'));
  1981.                 $probation->modify('+3 months');
  1982.               }
  1983.             }else{
  1984.                 $probation = new \DateTime(date('Y-m-d'));
  1985.                 $probation->modify('+12 months');
  1986.             } 
  1987.           }else{
  1988.             //if ($probation == null) {
  1989.                 $probation = new \DateTime($user->getPersonalInfo()->getJobJoinDate()->format('Y-m-d'));
  1990.             //}
  1991.           }
  1992.         }else{
  1993.           if ($probation == null) {
  1994.             if ($user->getPersonalInfo()->getJobStatus() != 'form.job_status.permanent') {
  1995.               if($user->getPersonalInfo()->getJobStatus() != 'form.job_status.probation'){
  1996.                 if($user->getPersonalInfo()->getJobJoinDate()!=null){
  1997.                   $probation = new \DateTime($user->getPersonalInfo()->getJobJoinDate()->format('Y-m-d'));
  1998.                   $probation->modify('+12 months');
  1999.                 }
  2000.               }else{
  2001.                 $probation = new \DateTime(date('Y-m-d'));
  2002.                 $probation->modify('+12 months');
  2003.               }   
  2004.             }else{
  2005.               $probation = new \DateTime($user->getPersonalInfo()->getJobJoinDate()->format('Y-m-d'));
  2006.             }
  2007.           }
  2008.         }
  2009.         if($country=='VN'){
  2010.         //if(($leavetype->getLeaveName()=='sick') || ($country=='VN')){
  2011.           $probation = new \DateTime($user->getPersonalInfo()->getJobJoinDate()->format('Y-m-d'));
  2012.           $probation='test';
  2013.         }
  2014.       }  
  2015.       return $probation;
  2016.   }
  2017.   public function calculate(\App\Entity\User $user\App\Entity\LeaveType $leavetype\DateTime $startdate\DateTime $enddate$back null$option = array()){
  2018.     $oldcarry=9999;
  2019.     $default = array(
  2020.       'now' => date('Y-m-d'), 
  2021.       'am' => false
  2022.       'pm' => false,
  2023.       'keepunpaid'=>true,
  2024.     );
  2025.     $opt $default;
  2026.     if (count($option) > 0) {
  2027.       foreach ($option as $k => $v) {
  2028.         $opt[$k] = $v;
  2029.       }
  2030.     }
  2031.     if ($back == null) {
  2032.       $back = array();
  2033.     }
  2034.     $curyear=new \DateTime($opt['now']);
  2035.     $curyear=$curyear->format('Y');
  2036.     $testresult = array();
  2037.     $em $this->entityManager;
  2038.     $offday = array(06);
  2039.     $leavelist = array();
  2040.     $leavelist['child'] = array();
  2041.     $leavelist['unpaid'] = array();
  2042.     $leavelist['data'] = array();
  2043.     $minyear 999999;
  2044.     $maxyear 0;
  2045.     $daterange $startdate->diff($enddate);
  2046.     $daterange $daterange->format('%a');
  2047.     $daterange $daterange 1;
  2048.     $date = new \DateTime($startdate->format('Y-m-d'));
  2049.     $yr $date->format('Y');
  2050.     if ($minyear >= $yr) { $minyear $yr; }
  2051.     if ($maxyear <= $yr) { $maxyear $yr; }
  2052.     if ($daterange 1) {
  2053.       for ($i 1$i $daterange$i++) {
  2054.         $date $date->modify('+1 day');
  2055.         $yr $date->format('Y');
  2056.         if ($minyear >= $yr) {
  2057.           $minyear $yr;
  2058.         }
  2059.         if ($maxyear <= $yr) {
  2060.           $maxyear $yr;
  2061.         }
  2062.       }
  2063.     }
  2064.     $unpaiddate=array();
  2065.     //check year from startdate and enddate get data from leave enteltainent
  2066.     $yearlist = array();
  2067.     $minyear $minyear 1;
  2068.     $maxyear $maxyear 1;
  2069.     for ($y $minyear$y <= $maxyear$y++) { $yearlist[count($yearlist)] = $y;}
  2070.     $leaveent $em->getRepository(LeaveEntitlement::class)->findBy(array('user' => $user'leaveType' => $leavetype'year' => $yearlist));
  2071.     $leaveAttr = array();
  2072.     $leavechd = array();
  2073.     $leavectype=array();
  2074.     $parents=array();
  2075.     $unpaid = array();
  2076.     $forceholi=array();
  2077.     //add leave data to array();
  2078.     foreach ($leaveent as $l) {
  2079.         $cattr=$l->getAttributes();
  2080.         if(!isset($leavectype['c'.$l->getId()])){$leavectype['c'.$l->getId()]=$l->getLeaveType()->getLeaveName();}
  2081.         //if($l->getUser()->getOffice()->getId()==$l->getLeaveType()->getOffice()->getId()){
  2082.           $prid $l->getId();
  2083.           $parents[count($parents)]=$prid;
  2084.           $leaveAttr['y' $l->getYear()] = array();
  2085.           $leaveAttr['y' $l->getYear()]['id']=$prid;
  2086.           $leaveAttr['y' $l->getYear()]['year']=$l->getYear();
  2087.           $leaveAttr['y' $l->getYear()]['attr'] = $l->getAttributes();
  2088.           $leaveAttr['y' $l->getYear()]['total'] = $l->getLeaveEntitlements();
  2089.           $leaveAttr['y' $l->getYear()]['left'] = $l->getLeaveLeft();
  2090.           $leaveAttr['y' $l->getYear()]['active'] = $l->getIsActive();
  2091.           $leaveAttr['y' $l->getYear()]['mode']=$l->getLeaveType()->getLeaveName();
  2092.           //get the rest attribute from office leave type
  2093.           $typ $l->getLeaveType()->getAttributes();
  2094.           foreach ($typ as $tk => $tv) {
  2095.             if (!isset($leaveAttr['y' $l->getYear()]['attr'][$tk])) {
  2096.               $leaveAttr['y' $l->getYear()]['attr'][$tk] = $tv;
  2097.             }
  2098.           }
  2099.           if (!isset($leaveAttr['y' $l->getYear()]['attr']['carryData'])) {
  2100.             $leaveAttr['y' $l->getYear()]['attr']['carryData'] = [];
  2101.           }
  2102.           if(isset($cattr['forcedate'])){$forceholi=array_merge($forceholi,$cattr['forcedate']);}
  2103.           //add child data to leave like bonus / adjustment / carry
  2104.         //}  
  2105.     }
  2106.     $leavechild $em->getRepository(LeaveEntitlement::class)->findBy(array('user' => $user'year' => $yearlist'parent' => $parents));
  2107.     foreach ($leavechild as $c) {
  2108.       $ctname=$c->getLeaveType()->getLeaveName();
  2109.       $ctid=$c->getId();
  2110.       $ctyear=$c->getYear();
  2111.       $cattr=$c->getAttributes();
  2112.       if(!isset($leavectype['c'$c->getId()])){$leavectype['c'.$c->getId()]=$ctname;}
  2113.       if(!isset($leavechd['y' .  $ctyear])){
  2114.         $leavechd['y' .  $ctyear] = array();
  2115.       }
  2116.       $leavechd['y' $ctyear]['c' $ctid] = array();
  2117.       $leavechd['y' $ctyear]['c' $ctid]['id']=$c->getId();
  2118.       $leavechd['y' $ctyear]['c' $ctid]['year']=$c->getYear();
  2119.       $leavechd['y' $ctyear]['c' $ctid]['child']=true;
  2120.       $leavechd['y' $ctyear]['c' $ctid]['attr'] = $c->getAttributes();
  2121.       $leavechd['y' $ctyear]['c' $ctid]['total'] = $c->getLeaveEntitlements();
  2122.       $leavechd['y' $ctyear]['c' $ctid]['left'] = $c->getLeaveLeft();
  2123.       $leavechd['y' .  $ctyear]['c' $ctid]['active'] = $c->getIsActive();
  2124.       if(isset($cattr['followParent'])){
  2125.         if($cattr['followParent']){
  2126.           if(!isset($leaveAttr['y'.$ctyear]['carry'])){
  2127.             $leaveAttr['y'.$ctyear]['carry']=array();
  2128.           }
  2129.           if(!isset($leaveAttr['y'.$ctyear]['totalcarry'])){$leaveAttr['y'.$ctyear]['totalcarry']=0;}
  2130.           if(!isset($leaveAttr['y'.$ctyear]['carryexpire'])){$leaveAttr['y'.$ctyear]['carryexpire']=isset($cattr['expires'])?$cattr['expires']:null;}
  2131.           if(!isset($leaveAttr['y'.$ctyear]['carrygiven'])){$leaveAttr['y'.$ctyear]['carrygiven']=isset($cattr['given'])?$cattr['given']:null;}
  2132.           if(!isset($leaveAttr['y'.$ctyear]['usecarrydate'])){$leaveAttr['y'.$ctyear]['usecarrydate']=false;}
  2133.           $leaveAttr['y'.$ctyear]['totalcarry']+=$c->getLeaveEntitlements();
  2134.           $jcarry=count($leaveAttr['y'.$ctyear]['carry']);
  2135.           $leaveAttr['y'.$ctyear]['carry'][$jcarry]=$ctyear.','.$ctid;
  2136.           
  2137.           $leavechd['y' .  $ctyear]['c' $ctid]['annual']=$ctyear;
  2138.         } 
  2139.       }                     
  2140.       //get the rest attribute from office leave type
  2141.       $typ $c->getLeaveType()->getAttributes();
  2142.       foreach ($typ as $tk => $tv) {
  2143.         if (!isset($leaveAttr['y' $c->getYear()]['c'.$c->getId()]['attr'][$tk])) {
  2144.           $leavechd['y' $c->getYear()]['c'.$c->getId()]['attr'][$tk] = $tv;
  2145.         }
  2146.       }
  2147.       if(isset($cattr['forcedate'])){$forceholi=array_merge($forceholi,$cattr['forcedate']);}
  2148.     }
  2149.     
  2150.     
  2151.     foreach ($back as $k => $v) {
  2152.       //calculate back main leave
  2153.       if(substr($k,0,1)=='y'){
  2154.         $yb str_replace('y'''$k);
  2155.         if (isset($leaveAttr['y' $yb])) {
  2156.           // $leaveAttr['y' . $l->getYear()]['left'] = $leaveAttr['y' . $l->getYear()]['left'] + $v;
  2157.           $leaveAttr['y' $yb]['left'] = $leaveAttr['y' $yb]['left'] + $v;
  2158.         }
  2159.       }
  2160.       //calculate back child Leave
  2161.       if($k=='child'){
  2162.         foreach($v as $kk => $kv){
  2163.             foreach($kv as $kkk => $kkv){
  2164.                 $leavechd[$kk][$kkk]['left']+=$kkv;
  2165.             }
  2166.         }
  2167.       }
  2168.       if($k=='unpaid'){
  2169.         if($opt['keepunpaid']){
  2170.           $unpaid=$back[$k];
  2171.           if(count($back[$k]) > 0){
  2172.             foreach($back[$k] as $uv){
  2173.               if(isset($uv['date'])){
  2174.                 foreach($uv['date'] as $udt){
  2175.                   $unpaiddate[count($unpaiddate)]=$udt['date'];
  2176.                 }
  2177.               }
  2178.             }
  2179.           }
  2180.         }else{
  2181.           $back[$k]=array();
  2182.         }  
  2183.       }  
  2184.     }
  2185.     $country $leavetype->getOffice()->getCountry();
  2186.     $holidayrp $em->getRepository(\App\Entity\LeaveBankHoliday::class)->findBy(array('location' => $country));
  2187.     $holiday = array();
  2188.     foreach ($holidayrp as $h) {
  2189.       $dt $h->getDate()->format('Y-m-d');
  2190.       $dte $h->getEndDate();
  2191.       if(!is_null($dte)){
  2192.         $dte=new \DateTime($h->getEndDate()->format('Y-m-d'));
  2193.         $dtex=new \DateTime($h->getDate()->format('Y-m-d'));
  2194.         while($dtex <= $dte){
  2195.           $holiday[count($holiday)] = $dtex->format('Y-m-d');
  2196.           $dtex->modify('+1 day');
  2197.         }
  2198.       }else{
  2199.         $holiday[count($holiday)] = $dt;
  2200.       } 
  2201.     }
  2202.     $date = new \DateTime($startdate->format('Y-m-d'));
  2203.     $testresult[count($testresult)] = $date;
  2204.     $now = new \DateTime($opt['now']);
  2205.     if($user->getPersonalInfo()->getJobStatus() == 'form.job_status.permanent'){
  2206.       $now = new \DateTime();
  2207.     }
  2208.     if ($now $startdate) { $now $startdate; }
  2209.     
  2210.     
  2211.     $child = array();
  2212.     $datedata = array();
  2213.     $probation=$this->isOnProbation($user,$country,false);
  2214.     for ($d 0$d $daterange$d++) {
  2215.       $dd=$date->format('Y-m-d');
  2216.       $isunpaiddate=in_array($dd,$unpaiddate);
  2217.       //skip is unpaid
  2218.       if((!$isunpaiddate) || (!$opt['keepunpaid'])){
  2219.       
  2220.         $keep 0;
  2221.         $cutam 0;
  2222.         $cutpm 0;
  2223.         if ($d == 0) {
  2224.           if ($opt['am']) {
  2225.             $cutam 0.5;
  2226.           }
  2227.         }
  2228.         if ($d == ($daterange 1)) {
  2229.           if ($opt['pm']) {
  2230.             $cutpm 0.5;
  2231.           }
  2232.         }
  2233.         if ($d == ($daterange 1)) {
  2234.           if (($daterange <= 1) && ($opt['am'])) {
  2235.             $cutpm 0;
  2236.           }
  2237.         }
  2238.         $w $date->format('w');
  2239.         $h $date->format('Y-m-d');
  2240.         $dtact $date->format('Y-m-d');
  2241.         if (!isset($datedata[$h])) {
  2242.           $datedata[$dtact] = 0;
  2243.         }
  2244.         $ok true;
  2245.         $isunpaid false;
  2246.         if (in_array($w$offday) && (!in_array($h,$forceholi))) {
  2247.           $ok false;
  2248.         }
  2249.         if (in_array($h$holiday) && (!in_array($h,$forceholi))) {
  2250.           $ok false;
  2251.         }
  2252.         $unpaidleave false;
  2253.         
  2254.         if (isset($leaveAttr['y' $yr])) {
  2255.           if (isset($leaveAttr['y' $yr]['attr']['unpaid'])) {
  2256.             $unpaidleave $leaveAttr['y' $yr]['attr']['unpaid'];
  2257.             if (is_null($unpaidleave)) {
  2258.               $unpaidleave false;
  2259.             }
  2260.             if ($unpaidleave == 0) {
  2261.               $unpaidleave false;
  2262.             }
  2263.             if ($unpaidleave == 1) {
  2264.               $unpaidleave true;
  2265.             }
  2266.           }
  2267.         }
  2268.         if($ok){
  2269.           $yrd $date->format('Y');
  2270.             if($unpaidleave){
  2271.               if (isset($leaveAttr['y' $curyear])) {
  2272.                 if ($ok) {
  2273.                   if (!isset($unpaid['y' $curyear])) {
  2274.                     $unpaid['y' $curyear] = array();
  2275.                     $unpaid['y' $curyear]['date'] = array();
  2276.                     $unpaid['y' $curyear]['value'] = 0;
  2277.                   }
  2278.                   $dcnt count($unpaid['y' $curyear]['date']);
  2279.                   $unpaid['y' $curyear]['date'][$dcnt] = array();
  2280.                   $unpaid['y' $curyear]['date'][$dcnt]['date'] = $date->format('Y-m-d');
  2281.                   $unpaid['y' $curyear]['date'][$dcnt]['value'] = 1;
  2282.                   $unpaid['y' $curyear]['date'][$dcnt]['value'] -= $cutam;
  2283.                   $unpaid['y' $curyear]['date'][$dcnt]['value'] -= $cutpm;
  2284.                   $unpaid['y' $curyear]['value']++;
  2285.                   $unpaid['y' $curyear]['value'] -= $cutam;
  2286.                   $unpaid['y' $curyear]['value'] -= $cutpm;
  2287.                   $cutam 0;
  2288.                   $cutpm 0;
  2289.                 }
  2290.               }            
  2291.             }else{  
  2292.               if(isset($leaveAttr['y'.$yrd])){
  2293.                 $xprob=$probation->format('Y-m-d');
  2294.                 if(isset($leaveAttr['y'.$yrd]['attr']['probation'])){
  2295.                   if($leaveAttr['y'.$yrd]['attr']['probation']==true){
  2296.                     $xprob=new \DateTime();
  2297.                     date_modify($xprob,'-1 day');
  2298.                     $xprob=$xprob->format('Y-m-d');
  2299.                   }
  2300.                 }
  2301.                 $cmp=$leaveAttr['y'.$yrd]['left'];
  2302.                 if(isset($leaveAttr['y'.$yrd]['carry'])){
  2303.                   $cmp=$leaveAttr['y'.$yrd]['left'];
  2304.                   foreach($leaveAttr['y'.$yrd]['carry'] as $lucr){
  2305.                     $scr=explode(',',$lucr);
  2306.                     $tcr=isset($leavechd['y'.$scr[0]]['c'.$scr[1]]['total'])?$leavechd['y'.$scr[0]]['c'.$scr[1]]['total']:0;
  2307.                     $tcl=isset($leavechd['y'.$scr[0]]['c'.$scr[1]]['left'])?$leavechd['y'.$scr[0]]['c'.$scr[1]]['left']:0;
  2308.                     $cmp=$cmp-($tcr $tcl);
  2309.                   }
  2310.                 }
  2311.                 if($cmp 0){
  2312.                   $thisyear=$this->_leave_use($date,$leaveAttr['y'.$yrd],$xprob,$now);
  2313.                 }else{
  2314.                   $thisyear=array();
  2315.                 }
  2316.               }else{
  2317.                 $thisyear=array();
  2318.               } 
  2319.               if(isset($leaveAttr['y'.($yrd-1)])){
  2320.                 $xprob=$probation->format('Y-m-d');
  2321.                 if(isset($leaveAttr['y'.($yrd-1)]['attr']['probation'])){
  2322.                   if($leaveAttr['y'.($yrd-1)]['attr']['probation']==true){
  2323.                     $xprob=new \DateTime();
  2324.                     date_modify($xprob,'-1 day');
  2325.                     $xprob=$xprob->format('Y-m-d');
  2326.                   }
  2327.                 }
  2328.                 $cmp=$leaveAttr['y'.($yrd-1)]['left'];
  2329.                 if(isset($leaveAttr['y'.($yrd-1)]['carry'])){
  2330.                   $cmp=$leaveAttr['y'.($yrd-1)]['left'];
  2331.                   foreach($leaveAttr['y'.($yrd-1)]['carry'] as $lucr){
  2332.                     $scr=explode(',',$lucr);
  2333.                     $tcr=isset($leavechd['y'.$scr[0]]['c'.$scr[1]]['total'])?$leavechd['y'.$scr[0]]['c'.$scr[1]]['total']:0;
  2334.                     $tcl=isset($leavechd['y'.$scr[0]]['c'.$scr[1]]['left'])?$leavechd['y'.$scr[0]]['c'.$scr[1]]['left']:0;
  2335.                     $cmp=$cmp-($tcr $tcl);
  2336.                   }
  2337.                 }
  2338.                 if($cmp 0){
  2339.                   $lastyear=$this->_leave_use($date,$leaveAttr['y'.($yrd-1)],$xprob,$now);
  2340.                 }else{
  2341.                   $lastyear=array();
  2342.                 }
  2343.               }else{
  2344.                 $lastyear=array();
  2345.               } 
  2346.               /*if(isset($leaveAttr['y'.($yrd-1)])){
  2347.                 $carryover=$this->_leave_use($date,$leaveAttr['y'.($yrd-1)],$probation->format('Y-m-d'),$now);
  2348.               }else{
  2349.                 $carryover=array();
  2350.               }*/
  2351.               $childover=array();
  2352.               if(isset($leavechd['y' $yrd])){
  2353.                 foreach($leavechd['y'.$yrd] as $leavek=>$leavev){
  2354.                   $xprob=$probation->format('Y-m-d');
  2355.                 
  2356.                   if(isset($leavechd['y'.$yrd][$leavek]['attr']['probation'])){
  2357.                     if($leavechd['y'.$yrd][$leavek]['attr']['probation']==true){
  2358.                       $xprob=new \DateTime();
  2359.                       date_modify($xprob,'-1 day');
  2360.                       $xprob=$xprob->format('Y-m-d');
  2361.                     }
  2362.                   }
  2363.                   $cmp=9999;
  2364.                   if(isset($leavev['annual'])){
  2365.                     if(isset($leaveAttr['y'.$leavev['annual']])){
  2366.                        if(isset($leaveAttr['y'.$leavev['annual']]['carry'])){
  2367.                            $cmp=$leaveAttr['y'.$leavev['annual']]['left'];
  2368.                            foreach($leaveAttr['y'.$leavev['annual']]['carry'] as $lucr){
  2369.                             $scr=explode(',',$lucr);
  2370.                             $tcr=isset($leavechd['y'.$scr[0]]['c'.$scr[1]]['total'])?$leavechd['y'.$scr[0]]['c'.$scr[1]]['total']:0;
  2371.                             $tcl=isset($leavechd['y'.$scr[0]]['c'.$scr[1]]['left'])?$leavechd['y'.$scr[0]]['c'.$scr[1]]['left']:0;
  2372.                             $cmp=$cmp-($tcr $tcl);
  2373.                            }
  2374.                        }
  2375.                     }
  2376.                   }
  2377.                   
  2378.                   if($cmp 0){
  2379.                     $lval=$this->_leave_use($date,$leavev,$xprob,$now);
  2380.                   }else{
  2381.                     $lval=array();
  2382.                   }  
  2383.                   if(isset($lval['total'])){$childover[count($childover)]=$lval;}
  2384.                 }
  2385.               }
  2386.               if(isset($leavechd['y' . ($yrd-1)])){
  2387.                 foreach($leavechd['y'.($yrd-1)] as $leavek=>$leavev){
  2388.                   $xprob=$probation->format('Y-m-d');
  2389.                   $cmp=9999;
  2390.                   if(isset($leavev['annual'])){
  2391.                     
  2392.                     if(isset($leaveAttr['y'.$leavev['annual']])){
  2393.                        if(isset($leaveAttr['y'.$leavev['annual']]['carry'])){
  2394.                            $cmp=$leaveAttr['y'.$leavev['annual']]['left'];
  2395.                            foreach($leaveAttr['y'.$leavev['annual']]['carry'] as $lucr){
  2396.                               $scr=explode(',',$lucr);
  2397.                               $tcr=isset($leavechd['y'.$scr[0]]['c'.$scr[1]]['total'])?$leavechd['y'.$scr[0]]['c'.$scr[1]]['total']:0;
  2398.                               $tcl=isset($leavechd['y'.$scr[0]]['c'.$scr[1]]['left'])?$leavechd['y'.$scr[0]]['c'.$scr[1]]['left']:0;
  2399.                               $cmp=$cmp-($tcr $tcl);
  2400.                            }
  2401.                        }
  2402.                     }
  2403.                   }
  2404.                   if($cmp 0){
  2405.                     $lval=$this->_leave_use($date,$leavev,$xprob,$now);
  2406.                   }else{
  2407.                     $lval=array();
  2408.                   }
  2409.                   
  2410.                   if(isset($lval['total'])){$childover[count($childover)]=$lval;}
  2411.                 }
  2412.               }  
  2413.               $leaveuse=array();
  2414.               
  2415.               /*if(isset($carryover['total'])){
  2416.                 if($carryover['left'] > 0){
  2417.                   $lvcount=count($leaveuse);
  2418.                   $leaveuse[$lvcount]=$carryover;
  2419.                   $leaveuse[$lvcount]['modetype']='carry';
  2420.                 }
  2421.               }*/  
  2422.               
  2423.               
  2424.               
  2425.               if(isset($thisyear['total'])){
  2426.                 if($thisyear['left'] > 0){
  2427.                   $lvcount=count($leaveuse);
  2428.                   $leaveuse[$lvcount]=$thisyear;
  2429.                   $leaveuse[$lvcount]['modetype']='annual';
  2430.                 }
  2431.               }
  2432.               if(isset($lastyear['total'])){
  2433.                 if($lastyear['left'] > 0){
  2434.                   $lvcount=count($leaveuse);
  2435.                   $leaveuse[$lvcount]=$lastyear;
  2436.                   $leaveuse[$lvcount]['modetype']='annual';
  2437.                 }
  2438.               }
  2439.               
  2440.               if(count($childover) > 0){              
  2441.                 foreach($childover as $ch){         
  2442.                   if($ch['left'] > 0){
  2443.                     $leaveuse[count($leaveuse)]=$ch;
  2444.                   }
  2445.                 }
  2446.               }
  2447.               $upx=0;
  2448.               if(count($leaveuse) > 0){
  2449.                 
  2450.                 usort($leaveuse,function($a,$b){
  2451.                   if(isset($a['expire']) && isset($b['expire'])){
  2452.                     $ax=$a['expire']->format('Ymd');
  2453.                     $bx=$b['expire']->format('Ymd');
  2454.                     return $ax <=> $bx;
  2455.                   }
  2456.                   return 0;
  2457.                 });
  2458.                 $keep=1-(float) $cutam;
  2459.                 $keep=$keep-(float) $cutpm;
  2460.                 $lastlv=null;
  2461.                 foreach($leaveuse as $lu){
  2462.                   /*if(isset($lu['annual'])){
  2463.                     if($lu['left'] > 0){
  2464.                       $lu['left']=$leaveAttr['y'.$lu['annual']]['left']-($lu['total'] - $lu['left']);
  2465.                     }
  2466.                   }
  2467.                   if(isset($lu['carry'])){
  2468.                     foreach($lu['carry'] as $lucr){
  2469.                       $scr=explode(',',$lucr);
  2470.                       $tcr=$leavechd['y'.$scr[0]]['c'.$scr[1]]['total'];
  2471.                       $tcl=$leavechd['y'.$scr[0]]['c'.$scr[1]]['left'];
  2472.                       $lu['left']=$lu['left']-($tcr - $tcl);
  2473.                     }  
  2474.                   }*/
  2475.                   
  2476.                   if($lu['left'] > 0){
  2477.                     $lvbound=null;
  2478.                     if(isset($lu['carry'])){$lvbound=$lu;}
  2479.                     if(isset($lu['annual'])){$lvbound=$leaveAttr['y'.$lu['annual']];}
  2480.                     if(!is_null($lvbound)){
  2481.                       $cmp=$lvbound['left'];
  2482.                       foreach($lvbound['carry'] as $lucr){
  2483.                         $scr=explode(',',$lucr);
  2484.                         $tcr=isset($leavechd['y'.$scr[0]]['c'.$scr[1]]['total'])?$leavechd['y'.$scr[0]]['c'.$scr[1]]['total']:0;
  2485.                         $tcl=isset($leavechd['y'.$scr[0]]['c'.$scr[1]]['left'])?$leavechd['y'.$scr[0]]['c'.$scr[1]]['left']:0;
  2486.                         $cmp=$cmp-($tcr $tcl);
  2487.                      }
  2488.                      $lu['left']=$cmp;
  2489.                      //if($keep > $cmp){$keep=$cmp;}
  2490.                     }
  2491.                     if(($keep 0) && ($lu['left'] > 0)){
  2492.                       $dkeep=1-(float) $cutam;
  2493.                       $dkeep=$dkeep-(float)$cutpm;
  2494.                       $keepleft=1-(float) $cutam;
  2495.                       $keepleft=$keepleft-(float) $cutpm;
  2496.                       
  2497.                       if($lu['left'] >= $keepleft){
  2498.                         $keep=$keep-$keepleft;
  2499.                         if($keep 0){$dkeep=$keepleft+$keep;}
  2500.                       }else{
  2501.                         $dkeep=$dkeep-$lu['left'];
  2502.                         $keep=$keep-$lu['left'];
  2503.                       }
  2504.                       
  2505.                         if(isset($lu['child'])){
  2506.                           if(!isset($child['y'.$lu['year']])){
  2507.                             $child['y'.$lu['year']]=array();
  2508.                           }
  2509.                           if(!isset($child['y'.$lu['year']]['c'.$lu['id']])){$child['y'.$lu['year']]['c'.$lu['id']]=0;}
  2510.                           $child['y'.$lu['year']]['c'.$lu['id']]+=(float) $dkeep;
  2511.                           $leavechd['y'.$lu['year']]['c'.$lu['id']]['left']-=(float) $dkeep;
  2512.                           if(!isset($leavelist['data']['y'.$lu['year']])){$leavelist['data']['y'.$lu['year']]=array();}
  2513.                           if(!isset($leavelist['data']['y'.$lu['year']]['child'])){
  2514.                             $leavelist['data']['y'.$lu['year']]['child']=array();
  2515.                           }
  2516.                           if(!isset($leavelist['data']['y'.$lu['year']]['child']['c'.$lu['id']])){
  2517.                             $leavelist['data']['y'.$lu['year']]['child']['c'.$lu['id']]=array();
  2518.                           }
  2519.                           if(!isset($leavelist['data']['y'.$lu['year']]['c'.$lu['id']]['d'.$date->format('Ymd')])){
  2520.                             $leavelist['data']['y'.$lu['year']]['child']['c'.$lu['id']]['d'.$date->format('Ymd')]=1;
  2521.                           }
  2522.                         }else{
  2523.                           if(!isset($leavelist['y'.$lu['year']])){$leavelist['y'.$lu['year']]=0;};
  2524.                           $leavelist['y'.$lu['year']]+=(float) $dkeep;
  2525.                           $leaveAttr['y'.$lu['year']]['left']-=(float) $dkeep;
  2526.                           if(!isset($leavelist['data'])){$leavelist['data']=array();}
  2527.                           if(!isset($leavelist['data']['y'.$lu['year']])){
  2528.                             $leavelist['data']['y'.$lu['year']]=array();
  2529.                           }
  2530.                           if(!isset($leavelist['data']['y'.$lu['year']]['d'.$date->format('Ymd')])){
  2531.                             $leavelist['data']['y'.$lu['year']]['d'.$date->format('Ymd')]=$dkeep;
  2532.                           }
  2533.                         }
  2534.                         $lu['left']=-$dkeep;
  2535.                         $lastlv=$lu;
  2536.                         
  2537.                     }  
  2538.                   }
  2539.                   $cutpm=0;
  2540.                   $cutam=0;
  2541.                 }
  2542.                 //if($d==($daterange-1)){
  2543.                   //$keep-=$cutam;
  2544.                   //$keep-=$cutpm;
  2545.                 //}
  2546.                 if($keep 0){
  2547.                   //if($d==($daterange-1)){
  2548.                     $upx=$keep;
  2549.                   //}  
  2550.                 }else{
  2551.                   if($d==($daterange-1)){
  2552.                     if(!is_null($lastlv)){
  2553.                       if(isset($lastlv['child'])){
  2554.                         if(!isset($child['y'.$lastlv['year']])){
  2555.                           $child['y'.$lastlv['year']]=array();
  2556.                         }
  2557.                         if(!isset($child['y'.$lastlv['year']]['c'.$lastlv['id']])){
  2558.                           $child['y'.$lastlv['year']]['c'.$lastlv['id']]=0;
  2559.                         }
  2560.                         
  2561.                         $child['y'.$lastlv['year']]['c'.$lastlv['id']]-=(float) $cutam;
  2562.                         $child['y'.$lastlv['year']]['c'.$lastlv['id']]-=(float) $cutpm;
  2563.                         $leavechd['y'.$lastlv['year']]['c'.$lastlv['id']]['left']+=(float) $cutam;
  2564.                         $leavechd['y'.$lastlv['year']]['c'.$lastlv['id']]['left']+=(float) $cutpm;
  2565.                         if(!isset($leavelist['data']['y'.$lastlv['year']])){$leavelist['data']['y'.$lastlv['year']]=array();}
  2566.                         if(!isset($leavelist['data']['y'.$lastlv['year']]['child'])){
  2567.                           $leavelist['data']['y'.$lastlv['year']]['child']=array();
  2568.                         }
  2569.                         if(!isset($leavelist['data']['y'.$lastlv['year']]['child']['c'.$lastlv['id']])){
  2570.                           $leavelist['data']['y'.$lastlv['year']]['child']['c'.$lastlv['id']]=array();
  2571.                         }
  2572.                         if(!isset($leavelist['data']['y'.$lastlv['year']]['child']['c'.$lastlv['id']]['d'.$date->format('Ymd')])){
  2573.                           $leavelist['data']['y'.$lastlv['year']]['child']['c'.$lastlv['id']]['d'.$date->format('Ymd')]=1;
  2574.                         }
  2575.                         $leavelist['data']['y'.$lastlv['year']]['child']['c'.$lastlv['id']]['d'.$date->format('Ymd')]-=(float) $cutam;
  2576.                         $leavelist['data']['y'.$lastlv['year']]['child']['c'.$lastlv['id']]['d'.$date->format('Ymd')]-=(float) $cutpm;
  2577.                       }else{
  2578.                         if(!isset($leavelist['y'.$lastlv['year']])){$leavelist['y'.$lastlv['year']]=0;}
  2579.                         $leavelist['y'.$lastlv['year']]-=(float) $cutpm;
  2580.                         $leavelist['y'.$lastlv['year']]-=(float) $cutam;
  2581.                         $leaveAttr['y'.$lastlv['year']]['left']+=(float) $cutam;
  2582.                         $leaveAttr['y'.$lastlv['year']]['left']+=(float) $cutpm;
  2583.                         if(!isset($leavelist['data'])){$leavelist['data']=array();}
  2584.                         if(!isset($leavelist['data']['y'.$lu['year']])){
  2585.                           $leavelist['data']['y'.$lu['year']]=array();
  2586.                         }
  2587.                         if(!isset($leavelist['data']['y'.$lastlv['year']]['d'.$date->format('Ymd')])){
  2588.                           $leavelist['data']['y'.$lastlv['year']]['d'.$date->format('Ymd')]=1;
  2589.                         }
  2590.                         $leavelist['data']['y'.$lastlv['year']]['d'.$date->format('Ymd')]-=(float) $cutam;
  2591.                         $leavelist['data']['y'.$lastlv['year']]['d'.$date->format('Ymd')]-=(float) $cutpm;
  2592.                       }
  2593.                     }    
  2594.                   }
  2595.                 }
  2596.               }else{
  2597.                 $upx=1;
  2598.                 //if($d==($daterange-1)){
  2599.                   $upx-=(float) $cutam;
  2600.                   $upx-=(float) $cutpm;
  2601.                 //}  
  2602.               }
  2603.               if($upx 0){
  2604.                 if (!isset($unpaid['y' $curyear])) {
  2605.                   $unpaid['y' $curyear] = array();
  2606.                   $unpaid['y' $curyear]['date'] = array();
  2607.                   $unpaid['y' $curyear]['value'] = 0;
  2608.                 }
  2609.                 if(isset($unpaid['y' $curyear]['date'])){
  2610.                   $dcnt count($unpaid['y' $curyear]['date']);
  2611.                   $unpaid['y' $curyear]['date'][$dcnt] = array();
  2612.                   $unpaid['y' $curyear]['date'][$dcnt]['date'] = $date->format('Y-m-d');
  2613.                   $unpaid['y' $curyear]['date'][$dcnt]['value'] = $upx;
  2614.                   $unpaid['y' $curyear]['value']+=(float) $upx;
  2615.                 }   
  2616.                   $cutam 0;
  2617.                   $cutpm 0;
  2618.                   $pro=new \DateTime($probation->format('Y-m-d'));
  2619.                   if(($leavetype->getLeaveName()=='sick') && ($date >= $pro)){
  2620.                     if(!isset($leavelist['y'.$yrd])){$leavelist['y'.$yrd]=0;}
  2621.                     $leavelist['y'.$yrd]+=(float) $upx;
  2622.                   }
  2623.               }
  2624.             }  
  2625.         }
  2626.       }
  2627.       $date $date->modify('+1 day');
  2628.     }
  2629.     $leavelist['child'] = $child;
  2630.     $leavelist['unpaid'] = $unpaid;
  2631.     $leavelist['type']=$leavectype;
  2632.     $dumper=array();
  2633.     foreach($leaveAttr as $ld){
  2634.       $dumper['l'.$ld['id']]=$ld['left'];
  2635.     }
  2636.     foreach($leavechd as $ld){
  2637.       foreach($ld as $kd => $vd){
  2638.         $dumper['l'.$vd['id']]=$vd['left'];
  2639.       }
  2640.     }
  2641.     $leavelist['dumper']=$dumper;
  2642.     if (isset($leave['error'])) {
  2643.       return false;
  2644.     }
  2645.     return $leavelist;
  2646.   }
  2647.   public function removeAllocation($id,$keepunpaid=true){
  2648.     $em $this->entityManager;
  2649.     $rq=$em->getRepository(\App\Entity\leaveRequest::class)->findById($id);
  2650.     
  2651.     if(!is_null($rq)){
  2652.       foreach($rq as $r){
  2653.         $isApproved=$r->getIsApproved();
  2654.         if(($isApproved===false) || ($isApproved===0)){
  2655.           continue;
  2656.         }
  2657.         $start=$r->getStartDate();
  2658.         $end=$r->getEndDate();
  2659.         $leavetype=$r->getLeaveType()->getId();
  2660.         $ys=intval($start->format('Y'))-1;
  2661.         $ye=intval($end->format('Y'))+1;
  2662.         $years=array();
  2663.         for($i=$ys;$i<=$ye;$i++){
  2664.           $years[count($years)]=$i;
  2665.         }
  2666.         $user=$r->getUser();
  2667.         $en=$em->getRepository(\App\Entity\LeaveEntitlement::class)->findBy(array('user'=>$user,'year'=>$years));
  2668.         $enlist=array();
  2669.         $enlistbyid=array();
  2670.         if(!is_null($en)){
  2671.           foreach($en as $e){
  2672.             $y=$e->getYear();
  2673.             $t=$e->getleaveType()->getId();
  2674.             if(!isset($enlist['y'.$y])){$enlist['y'.$y]=array();}
  2675.             $enlist['y'.$y]['t'.$t]=$e;
  2676.             $enlistbyid['c'.$e->getId()]=$e;
  2677.           }
  2678.         }
  2679.         
  2680.         $allo=$r->getAlocation();
  2681.         
  2682.         foreach($allo as $k=>$a){
  2683.           switch($k){
  2684.             case 'unpaid':
  2685.                   if(!$keepunpaid){
  2686.                     unset($allo[$k]);
  2687.                   }else{
  2688.                     if(count($allo[$k]) < 1){
  2689.                       unset($allo[$k]);
  2690.                     }
  2691.                   }
  2692.                   
  2693.                 break;
  2694.             case 'child':
  2695.                 if(count($allo[$k]) > 0){
  2696.                   //year
  2697.                   foreach($a as $k1=>$v1){
  2698.                     //child
  2699.                     foreach($v1 as $k2=>$v2){
  2700.                       if(isset($enlistbyid[$k2])){
  2701.                         $el=$enlistbyid[$k2];
  2702.                         $oleft=$el->getLeaveLeft();
  2703.                         $left=$oleft+$v2;
  2704.                         $total=$el->getLeaveEntitlements();
  2705.                         if($left $total){$left=$total;}
  2706.                         $el->setLeaveLeft($left);
  2707.                         $log=$el->getLog();
  2708.                         $dtnow=new \DateTime();
  2709.                         if(is_null($log)){$log=array();}
  2710.                         $logdata[count($log)]=array(
  2711.                           'date'=>$dtnow->format('Y-m-d H:i:s'),
  2712.                           'left'=>$oleft.'=>'.$left,
  2713.                           'message'=>'change left',
  2714.                           'runby'=>'removeAllocation'
  2715.                         );
  2716.                         $el->setUpdatedAt($dtnow);
  2717.                         $el->setLog($logdata);
  2718.                         $em->persist($el);
  2719.                         $em->flush();
  2720.                         unset($allo[$k][$k1][$k2]);
  2721.                       }
  2722.                     }
  2723.                     if(count($allo[$k][$k1]) < 1){
  2724.                       unset($allo[$k][$k1]);
  2725.                     } 
  2726.                   }
  2727.                 }
  2728.                 if(count($allo[$k]) < 1){
  2729.                   unset($allo[$k]);
  2730.                 }  
  2731.                 break;    
  2732.             default:
  2733.               if(substr($k,0,1)=='y'){
  2734.                 $yr=intval(str_replace('y','',$k));
  2735.                 if(isset($enlist['y'.$yr]['t'.$leavetype])){
  2736.                   $el=$enlist['y'.$yr]['t'.$leavetype];
  2737.                   $oleft=$el->getLeaveLeft();
  2738.                   $left=$oleft+$a;
  2739.                   $total=$el->getLeaveEntitlements();
  2740.                   if($left $total){$left=$total;}
  2741.                   $el->setLeaveLeft($left);
  2742.                   $log=$el->getLog();
  2743.                   if(is_null($log)){$log=array();}
  2744.                   $dtnow=new \DateTime();
  2745.                   $logdata[count($log)]=array(
  2746.                     'date'=>$dtnow->format('Y-m-d H:i:s'),
  2747.                     'left'=>$oleft.'=>'.$left,
  2748.                     'message'=>'change left',
  2749.                     'runby'=>'removeAllocation'
  2750.                   );
  2751.                   $el->setUpdatedAt($dtnow);
  2752.                   $el->setLog($logdata);
  2753.                   $em->persist($el);
  2754.                   $em->flush();
  2755.                 }
  2756.               }
  2757.               unset($allo[$k]);
  2758.           }
  2759.         }
  2760.         if(is_null($allo)){$allo=array();}
  2761.         $r->setAlocation($allo);
  2762.         $log=$r->getLog();
  2763.         $dtnow=new \DateTime();
  2764.         $logdata[count($log)]=array(
  2765.           'date'=>$dtnow->format('Y-m-d H:i:s'),
  2766.           'allocation'=>$allo,
  2767.           'message'=>'change Allocation',
  2768.           'runby'=>'removeAllocation'
  2769.         );
  2770.         $r->setUpdatedAt($dtnow);
  2771.         $r->setLog($logdata);
  2772.         $em->persist($r);
  2773.         $em->flush();
  2774.       }
  2775.     };
  2776.   }
  2777.   public function recalculate($option)
  2778.   {
  2779.     $default = array(
  2780.       'user' => null,
  2781.       'type' => null,
  2782.       'office' => null,
  2783.       'days' => null
  2784.     );
  2785.     $opt $default;
  2786.     foreach ($option as $k => $v) {
  2787.       $opt[$k] = $v;
  2788.     }
  2789.     $lent $this->entityManager->getRepository(\App\Entity\LeaveEntitlement::class)->findAll();
  2790.     foreach ($lent as $l) {
  2791.       $ok true;
  2792.       if (!is_null($opt['user'])) {
  2793.         if ($l->getUser()->getId() != $opt['user']) {
  2794.           $ok false;
  2795.         }
  2796.       }
  2797.       if (!is_null($opt['office'])) {
  2798.         if ($l->getUser()->getOffice()->getId != $opt['office']) {
  2799.           $ok false;
  2800.         }
  2801.       }
  2802.       if (!is_null($opt['type'])) {
  2803.         if ($l->getLeaveType()->getId() != $opt['$type']) {
  2804.           $ok false;
  2805.         }
  2806.       }
  2807.       if ($ok) {
  2808.         $left $l->getLeaveEntitlements();
  2809.         if (!is_null($opt['days'])) {
  2810.           $left $days;
  2811.           $l->setLeaveEntitlements($left);
  2812.         }
  2813.         $l->setLeaveLeft($left);
  2814.         $this->entityManager->persist($l);
  2815.         $this->entityManager->flush();
  2816.       }
  2817.     }
  2818.     $lrq $this->entityManager->getRepository(\App\Entity\LeaveRequest::class)->findAll();
  2819.     foreach ($lrq as $l) {
  2820.       $ok true;
  2821.       if (!is_null($opt['user'])) {
  2822.         if ($l->getUser()->getId() != $opt['user']) {
  2823.           $ok false;
  2824.         }
  2825.       }
  2826.       if (!is_null($opt['office'])) {
  2827.         if ($l->getUser()->getOffice()->getId != $opt['office']) {
  2828.           $ok false;
  2829.         }
  2830.       }
  2831.       if (!is_null($opt['type'])) {
  2832.         if ($l->getLeaveType()->getId() != $opt['$type']) {
  2833.           $ok false;
  2834.         }
  2835.       }
  2836.       if ($ok) {
  2837.         $l->setAlocation(array());
  2838.         $this->entityManager->persist($l);
  2839.         $this->entityManager->flush();
  2840.       }
  2841.     }
  2842.     $lrq $this->entityManager->getRepository(\App\Entity\LeaveRequest::class)->findAll();
  2843.     foreach ($lrq as $l) {
  2844.       $ok true;
  2845.       if (!is_null($opt['user'])) {
  2846.         if ($l->getUser()->getId() != $opt['user']) {
  2847.           $ok false;
  2848.         }
  2849.       }
  2850.       if (!is_null($opt['office'])) {
  2851.         if ($l->getUser()->getOffice()->getId != $opt['office']) {
  2852.           $ok false;
  2853.         }
  2854.       }
  2855.       if (!is_null($opt['type'])) {
  2856.         if ($l->getLeaveType()->getId() != $opt['$type']) {
  2857.           $ok false;
  2858.         }
  2859.       }
  2860.       if ($ok) {
  2861.         $user $l->getUser();
  2862.         $lt $l->getLeaveType();
  2863.         $sd $l->getStartDate();
  2864.         $ed $l->getEndDate();
  2865.         $am $l->getIsHalfStart();
  2866.         $pm $l->getIsHalfEnd();
  2867.         $dt $l->getUpdatedAt();
  2868.         if ($dt == null) {
  2869.           $dt $l->getCreatedAt();
  2870.         }
  2871.         if ($dt == null) {
  2872.           $dt = new \DateTime();
  2873.         }
  2874.         $dt $dt->format('Y-m-d');
  2875.         $opt = array();
  2876.         $opt['am'] = $am;
  2877.         $opt['pm'] = $pm;
  2878.         $opt['now'] = $dt;
  2879.         $isok true;
  2880.         if ($lt->getLeaveName() !== 'sick') {
  2881.           if (is_null($l->getIsApproved())) {
  2882.           } else {
  2883.             if (($l->getIsApproved() == false) || ($l->getIsApproved() == 0)) {
  2884.               $isok false;
  2885.             }
  2886.           }
  2887.         }
  2888.         if ($isok) {
  2889.           $allo $this->leaveService->calculate($user$lt$sd$ednull$opt);
  2890.           $l->setAlocation($allo);
  2891.           $this->entityManager->persist($l);
  2892.           $this->entityManager->flush();
  2893.           $this->leaveService->updateEntitlementFromLeave($user$lt$allo);
  2894.         }
  2895.       }
  2896.     }
  2897.   }
  2898.   function updateEntitlementFromLeave(\App\Entity\User $user\App\Entity\LeaveType $leavetype$alocation$oldalocation null)
  2899.   {
  2900.     if ($oldalocation == null) {
  2901.       $oldalocation = array();
  2902.     }
  2903.     $em $this->entityManager;
  2904.     $haserror false;
  2905.     if ($alocation == false) {
  2906.       return false;
  2907.     }
  2908.     foreach ($alocation as $y => $a) {
  2909.       switch ($y) {
  2910.         case 'data':
  2911.           break;
  2912.         case 'error':
  2913.           break;
  2914.         case 'type':
  2915.           break;
  2916.         case 'dumper':
  2917.           break;  
  2918.         case 'child':
  2919.           foreach ($a as $cy => $c) {
  2920.             $yr str_replace('y'''$cy);
  2921.             foreach ($c as $ck => $cc) {
  2922.               $cid str_replace('c'''$ck);
  2923.               $leaveentitlement $em->getRepository(LeaveEntitlement::class)->findBy(array('user' => $user'id' => $cid'year' => $yr));
  2924.               if ($leaveentitlement != null) {
  2925.                 $c count($leaveentitlement);
  2926.                 for ($j 0$j $c$j++) {
  2927.                   $left $leaveentitlement[$j]->getLeaveLeft();
  2928.                   $l 0;
  2929.                   if (isset($oldalocation['y' $yr][$ck])) {
  2930.                     $l $oldalocation['y' $yr][$ck];
  2931.                   }
  2932.                   $left = ($left $cc) + $l;
  2933.                   $leaveentitlement[$j]->setLeaveLeft($left);
  2934.                   $em->persist($leaveentitlement[$j]);
  2935.                   $em->flush();
  2936.                 }
  2937.               }
  2938.             }
  2939.           }
  2940.           break;
  2941.         case 'unpaid':
  2942.           break;
  2943.         default:
  2944.           $yr str_replace('y'''$y);
  2945.           $leaveentitlement $em->getRepository(LeaveEntitlement::class)->findBy(array('user' => $user'leaveType' => $leavetype'year' => $yr));
  2946.           if ($leaveentitlement != null) {
  2947.             $c count($leaveentitlement);
  2948.             for ($j 0$j $c$j++) {
  2949.               $left $leaveentitlement[$j]->getLeaveLeft();
  2950.               $atl $leaveentitlement[$j]->getAttributes();
  2951.               $att $leaveentitlement[$j]->getLeaveType()->getAttributes();
  2952.               $isunpaid false;
  2953.               if (isset($atl['unpaid'])) {
  2954.                 if (($atl['unpaid'] == 1) || ($atl['unpaid'] == true)) {
  2955.                   $isunpaid true;
  2956.                 }
  2957.               } elseif (isset($att['unpaid'])) {
  2958.                 if (($att['unpaid'] == 1) || ($att['unpaid'] == true)) {
  2959.                   $isunpaid true;
  2960.                 }
  2961.               }
  2962.               if (($isunpaid) && ($left 0)) {
  2963.                 $left 0;
  2964.               }
  2965.               $l 0;
  2966.               if (isset($oldalocation['y' $yr])) {
  2967.                 $l $oldalocation['y' $yr];
  2968.               }
  2969.               $left = ($left $a) + $l;
  2970.               /*if(($leaveentitlement[$j]->getLeaveType()->getLeaveName()=='annual') && ($leaveentitlement[$j]->getUser()->getId()==51) && ($leaveentitlement[$j]->getYear()=='2022')){
  2971.                 dd($left.' a='.$a.' l='.$l);
  2972.               }*/
  2973.               $leaveentitlement[$j]->setLeaveLeft($left);
  2974.               
  2975.               $em->persist($leaveentitlement[$j]);
  2976.               $em->flush();
  2977.             }
  2978.           }
  2979.           break;
  2980.       }
  2981.     }
  2982.     return true;
  2983.   }
  2984.   public function requestLeaveEmail($request$editedUser$template='request.html.twig')
  2985.   {
  2986.     $loggedIn $request true false;
  2987.     $emailGroup $this->params->get('systemEmailGroup');
  2988.     // $reminderLog = $editedUser->getReminder();
  2989.     $user $editedUser->getPersonalInfo()->getFirstName();
  2990.     $leaveType $request->getLeaveType();
  2991.     $dataleaveType ucwords($leaveType->getLeaveName());
  2992.     $startDateData $request->getStartDate();
  2993.     $startDate $startDateData->format('d F Y');
  2994.     $isHalfStart $request->getIsHalfStart();
  2995.     $isHalfStart $isHalfStart 'PM' 'AM';
  2996.     $endDateData $request->getEndDate();
  2997.     $endDate $endDateData->format('d F Y');
  2998.     $isHalfEnd $request->getIsHalfEnd();
  2999.     $isHalfEnd $isHalfEnd 'AM' 'PM';
  3000.     
  3001.     $leaveRequest $request;
  3002.     $emailParameter=[
  3003.       'recipient' => $editedUser,
  3004.       'group' => 'user',
  3005.       'user' => $editedUser,
  3006.       'leaveRequest' => $leaveRequest
  3007.     ];
  3008.     $attr=$request->getAttributes();
  3009.     $takeoverEmail=array();
  3010.     if(isset($attr['task'])){
  3011.       $emailParameter['task']=array();
  3012.       $emailParameter['task']['task']=str_replace("\n",'<br>',$attr['task']['task']);
  3013.       $takeover=$this->entityManager->getRepository(\App\Entity\User::class)->findBy(array('id'=>$attr['task']['takeover']));
  3014.       $takeoverName='';
  3015.       if(is_array($takeover)){
  3016.         foreach ($takeover as $t){
  3017.           $takeoverName.=$t->getPersonalInfo()->getFullName().' ,';
  3018.           $takeoverEmail[count($takeoverEmail)]=$t->getEmail();
  3019.         }
  3020.         $takeoverName=trim($takeoverName,',');
  3021.         $takeoverName=trim($takeoverName);
  3022.       }
  3023.       $emailParameter['task']['takeover']=$takeoverName;
  3024.     }
  3025.     // $leaveRequest = $this->entityManager->getRepository(LeaveRequest::class)->findOneBy(['user'=>$editedUser, 'leaveType'=>$leaveType, 'startDate' => $startDateData, 'endDate' => $endDateData ]);
  3026.     
  3027.     $subject "email.leave.request.";
  3028.     $emailTemplate 'email/user-notification/leave/'.$template;
  3029.     $this->mailgunService->sendEmail(
  3030.       $this->translator->trans($subject 'user', [
  3031.         '%leaveType%' => $dataleaveType,
  3032.         '%startDate%' => $startDate,
  3033.         '%endDate%' => $endDate,
  3034.         '%isHalfStart%' => $isHalfStart,
  3035.         '%isHalfEnd%' => $isHalfEnd,
  3036.       ]),
  3037.       [$editedUser->getEmail()],
  3038.       $emailTemplate,
  3039.       $emailParameter,
  3040.       $loggedIn
  3041.     );
  3042.     foreach ($editedUser->getAllManager() as $manager) {
  3043.       $emailParameter['group']='manager';
  3044.       $emailParameter['recipient']=$manager;
  3045.       $emailParameter['user']=$editedUser;
  3046.       $emailParameter['leaveRequest']=$leaveRequest;
  3047.       $this->mailgunService->sendEmail(
  3048.         $this->translator->trans($subject 'manager', [
  3049.           '%user%' => $user,
  3050.           '%leaveType%' => $dataleaveType,
  3051.           '%startDate%' => $startDate,
  3052.           '%endDate%' => $endDate,
  3053.           '%isHalfStart%' => $isHalfStart,
  3054.           '%isHalfEnd%' => $isHalfEnd,
  3055.         ]),
  3056.         [$manager->getEmail()],
  3057.         $emailTemplate,
  3058.         $emailParameter,
  3059.         $loggedIn
  3060.       );
  3061.     }
  3062.     foreach ($emailGroup as $groupName => $groupEmail) {
  3063.       if ($groupName == 'hr') {
  3064.         $emailParameter['group']=$groupName;
  3065.         $emailParameter['recipient']=strtoupper($groupName) . ' Team';
  3066.         $emailParameter['user']=$editedUser;
  3067.         $emailParameter['leaveRequest']=$leaveRequest;
  3068.         $this->mailgunService->sendEmail(
  3069.           $this->translator->trans($subject $groupName, [
  3070.             '%user%' => $user,
  3071.             '%leaveType%' => $dataleaveType,
  3072.             '%startDate%' => $startDate,
  3073.             '%endDate%' => $endDate,
  3074.             '%isHalfStart%' => $isHalfStart,
  3075.             '%isHalfEnd%' => $isHalfEnd,
  3076.           ]),
  3077.           [$groupEmail],
  3078.           $emailTemplate,
  3079.           $emailParameter,
  3080.           $loggedIn
  3081.         );
  3082.       }
  3083.     };
  3084.     if(count($takeoverEmail) > 0){
  3085.       $emailParameter['group']='takeover';
  3086.       $emailParameter['recipient']='Team Member';
  3087.       $emailParameter['user']=$editedUser;
  3088.       $emailParameter['leaveRequest']=$leaveRequest;
  3089.       $this->mailgunService->sendEmail(
  3090.         $this->translator->trans($subject 'user', [
  3091.           '%user%' => $user,
  3092.           '%leaveType%' => $dataleaveType,
  3093.           '%startDate%' => $startDate,
  3094.           '%endDate%' => $endDate,
  3095.           '%isHalfStart%' => $isHalfStart,
  3096.           '%isHalfEnd%' => $isHalfEnd,
  3097.         ]),
  3098.         $takeoverEmail,
  3099.         $emailTemplate,
  3100.         $emailParameter,
  3101.         $loggedIn
  3102.       );
  3103.     }
  3104.   }
  3105.   public function requestedAdminLeaveEmail($request$editedUser$admin$isToday false)
  3106.   {
  3107.     $loggedIn $request true false;
  3108.     $emailGroup $this->params->get('systemEmailGroup');
  3109.     // $reminderLog = $editedUser->getReminder();
  3110.     $user $editedUser->getPersonalInfo()->getFirstName();
  3111.     $leaveType $request->getLeaveType();
  3112.     $dataleaveType ucwords($leaveType->getLeaveName());
  3113.     $startDateData $request->getStartDate();
  3114.     $startDate $startDateData->format('d F Y');
  3115.     $isHalfStart $request->getIsHalfStart();
  3116.     $isHalfStartTime $isHalfStart '130000' '090000';
  3117.     $isHalfStart $isHalfStart 'PM' 'AM';
  3118.     $endDateData $request->getEndDate();
  3119.     $endDate $endDateData->format('d F Y');
  3120.     $isHalfEnd $request->getIsHalfEnd();
  3121.     $isHalfEndTime $isHalfEnd '140000' '180000';
  3122.     $isHalfEnd $isHalfEnd 'AM' 'PM';
  3123.     // $leaveRequest = $this->entityManager->getRepository(LeaveRequest::class)->findOneBy(['user'=>$editedUser, 'leaveType'=>$leaveType, 'startDate' => $startDateData, 'endDate' => $endDateData ]);
  3124.     $leaveRequest $request;
  3125.     $subject "email.leave.requested.";
  3126.     $emailTemplate 'email/user-notification/leave/requested-admin.html.twig';
  3127.     $attendee = [
  3128.         [
  3129.             'name' => $request->getUser()->getPersonalInfo()->getFullName(),
  3130.             'email' => $request->getUser()->getEmail(),
  3131.             'role' => 'REQ-PARTICIPANT'
  3132.         ],
  3133.     ];
  3134.     $startDateTime $request->getStartDate()->format('Ymd') . ($isHalfStart != 'AM' 'T' $isHalfStartTime '');
  3135.     $endDateTime $request->getEndDate()->format('Ymd') . ($isHalfEnd != 'PM' || $isHalfStart != 'AM' 'T' $isHalfEndTime '');
  3136.     if($request->getStartDate()->format('Ymd') != $request->getEndDate()->format('Ymd')){
  3137.       if($isHalfEnd != 'PM' || $isHalfStart != 'AM'){
  3138.         $endDateTime $request->getEndDate()->format('Ymd') . 'T' $isHalfEndTime;
  3139.       }else{
  3140.         $endDateTime strval($request->getEndDate()->format('Ymd') + 1);
  3141.       }
  3142.     }
  3143.     // $startDateTime = $request->getStartDate()->format('Ymd') . 'T' . $isHalfStartTime;
  3144.     // $endDateTime = $request->getEndDate()->format('Ymd') . 'T' . $isHalfEndTime;
  3145.     $ICSTitle 'On ' $leaveType->getAttributes()['label'] . ' Leave';
  3146.     $desc $editedUser->getPersonalInfo()->getFirstName().' on '$leaveType->getAttributes()['label'] .' leave for '.$request->getDays().' day(s).\nFor urgent matters, please contact '.$editedUser->getManager()->getPersonalInfo()->getFirstName();
  3147.     
  3148.     $icsData =  $this->icsService->generateEventFile([
  3149.       'uid' => $request->getId() . $request->getUser()->getId() . ':' $request->getUser()->getEmail(),
  3150.       'title' => $ICSTitle ': ' $request->getUser()->getPersonalInfo()->getFullName(),
  3151.       'description' => $desc,
  3152.       'startDateTime' => $startDateTime,
  3153.       'endDateTime' =>  $endDateTime,
  3154.       'location' =>  $request->getUser()->getOffice()->getFullName(),
  3155.       'organizer' => [
  3156.           'name' => $this->params->get('systemEmailName'),
  3157.           'email' => $_SERVER['APP_ENV'] == 'prod' $this->params->get('systemEmailAddr') : 'devops@mediatropy.com'
  3158.       ],
  3159.       // 'organizer' => [
  3160.       //     'name' => $request->getUser()->getPersonalInfo()->getFullName(),
  3161.       //     'email' => $request->getUser()->getEmail()
  3162.       // ],
  3163.       'attendee' => $attendee,
  3164.       'reschedule' => 0,
  3165.       'reminderTime' => '-15M',
  3166.       'reminderDescription' => 'Reminder: '.$desc,
  3167.       'fileName' => 'Leave-' $request->getId()
  3168.     ], true);
  3169.     if ($leaveType->getAttributes()['label'] == 'Sick'){
  3170.       $startDate $startDateData->format('d F');
  3171.       $subject "email.leave.requested_sick.";
  3172.       $emailTemplate 'email/user-notification/leave/requested-admin-sick.html.twig';
  3173.       // condition today or not
  3174.       if($isToday){
  3175.         $startDate $startDateData->format('d F');
  3176.         $subject "email.leave.requested_sick_today.";
  3177.         $emailTemplate 'email/user-notification/leave/requested-admin-sick-today.html.twig';
  3178.       }
  3179.       $this->mailgunService->sendEmailWithAttachment([
  3180.           'subject' =>  $this->translator->trans($subject 'user', [
  3181.             '%leaveType%' => $dataleaveType,
  3182.             '%startDate%' => $startDate,
  3183.             // '%endDate%' => $endDate,
  3184.             // '%isHalfStart%' => $isHalfStart,
  3185.             // '%isHalfEnd%' => $isHalfEnd,
  3186.           ]),
  3187.           'to' => $editedUser->getEmail(),
  3188.           'template' => $emailTemplate,
  3189.           'params' => [
  3190.               'admin' => $admin,
  3191.               'recipient' => $editedUser,
  3192.               'group' => 'user',
  3193.               'user' => $editedUser,
  3194.               'leaveRequest' => $leaveRequest
  3195.           ],
  3196.           'ical' => $icsData
  3197.         ], $loggedIn
  3198.       );
  3199.       foreach ($editedUser->getAllManager() as $manager) {
  3200.         $this->mailgunService->sendEmail(
  3201.           $this->translator->trans($subject 'manager', [
  3202.             '%user%' => $user,
  3203.             '%leaveType%' => $dataleaveType,
  3204.             '%startDate%' => $startDate,
  3205.             /*
  3206.             '%endDate%' => $endDate,
  3207.             '%isHalfStart%' => $isHalfStart,
  3208.             '%isHalfEnd%' => $isHalfEnd,
  3209.             */
  3210.           ]),
  3211.           [$manager->getEmail()],
  3212.           $emailTemplate,
  3213.           [
  3214.             'admin' => $admin,
  3215.             'recipient' => $manager,
  3216.             'group' => 'manager',
  3217.             'user' => $editedUser,
  3218.             'leaveRequest' => $leaveRequest
  3219.           ],
  3220.           $loggedIn
  3221.         );
  3222.       }
  3223.     } else{
  3224.       $this->mailgunService->sendEmail(
  3225.         $this->translator->trans($subject 'admin', [
  3226.           '%user%' => $user,
  3227.           '%leaveType%' => $dataleaveType,
  3228.           '%startDate%' => $startDate,
  3229.           '%endDate%' => $endDate,
  3230.           '%isHalfStart%' => $isHalfStart,
  3231.           '%isHalfEnd%' => $isHalfEnd,
  3232.         ]),
  3233.         [$admin->getEmail()],
  3234.         $emailTemplate,
  3235.         [
  3236.           'admin' => $admin,
  3237.           'recipient' => $admin,
  3238.           'group' => 'admin',
  3239.           'user' => $editedUser,
  3240.           'leaveRequest' => $leaveRequest
  3241.         ],
  3242.         $loggedIn
  3243.       );
  3244.       $this->mailgunService->sendEmail(
  3245.         $this->translator->trans($subject 'user', [
  3246.           '%leaveType%' => $dataleaveType,
  3247.           '%startDate%' => $startDate,
  3248.           '%endDate%' => $endDate,
  3249.           '%isHalfStart%' => $isHalfStart,
  3250.           '%isHalfEnd%' => $isHalfEnd,
  3251.         ]),
  3252.         [$editedUser->getEmail()],
  3253.         $emailTemplate,
  3254.         [
  3255.           'admin' => $admin,
  3256.           'recipient' => $editedUser,
  3257.           'group' => 'user',
  3258.           'user' => $editedUser,
  3259.           'leaveRequest' => $leaveRequest
  3260.         ],
  3261.         $loggedIn
  3262.       );
  3263.       foreach ($editedUser->getAllManager() as $manager) {
  3264.         $this->mailgunService->sendEmail(
  3265.           $this->translator->trans($subject 'manager', [
  3266.             '%user%' => $user,
  3267.             '%leaveType%' => $dataleaveType,
  3268.             '%startDate%' => $startDate,
  3269.             '%endDate%' => $endDate,
  3270.             '%isHalfStart%' => $isHalfStart,
  3271.             '%isHalfEnd%' => $isHalfEnd,
  3272.           ]),
  3273.           [$manager->getEmail()],
  3274.           $emailTemplate,
  3275.           [
  3276.             'admin' => $admin,
  3277.             'recipient' => $manager,
  3278.             'group' => 'manager',
  3279.             'user' => $editedUser,
  3280.             'leaveRequest' => $leaveRequest
  3281.           ],
  3282.           $loggedIn
  3283.         );
  3284.       }
  3285.       foreach ($emailGroup as $groupName => $groupEmail) {
  3286.         if ($groupName == 'hr') {
  3287.           $this->mailgunService->sendEmail(
  3288.             $this->translator->trans($subject $groupName, [
  3289.               '%user%' => $user,
  3290.               '%leaveType%' => $dataleaveType,
  3291.               '%startDate%' => $startDate,
  3292.               '%endDate%' => $endDate,
  3293.               '%isHalfStart%' => $isHalfStart,
  3294.               '%isHalfEnd%' => $isHalfEnd,
  3295.             ]),
  3296.             [$groupEmail],
  3297.             $emailTemplate,
  3298.             [
  3299.               'admin' => $admin,
  3300.               'recipient' => strtoupper($groupName) . ' Team',
  3301.               'user' => $editedUser,
  3302.               'group' => $groupName,
  3303.               'leaveRequest' => $leaveRequest
  3304.             ],
  3305.             $loggedIn
  3306.           );
  3307.         }
  3308.       };
  3309.     }
  3310.   }
  3311.   public function updateRequestLeaveEmail($request$editedUser$admin '')
  3312.   {
  3313.     $loggedIn $request true false;
  3314.     $emailGroup $this->params->get('systemEmailGroup');
  3315.     $emailOps $this->params->get('systemEmailOps');
  3316.     // $reminderLog = $editedUser->getReminder();
  3317.     $user $editedUser->getPersonalInfo()->getFirstName();
  3318.     $leaveType $request->getLeaveType();
  3319.     $dataleaveType ucwords($leaveType->getLeaveName());
  3320.     $startDateData $request->getStartDate();
  3321.     $startDate $startDateData->format('d F Y');
  3322.     $isHalfStart $request->getIsHalfStart();
  3323.     $isHalfStartTime $isHalfStart '130000' '090000';
  3324.     $isHalfStart $isHalfStart 'PM' 'AM';
  3325.     $endDateData $request->getEndDate();
  3326.     $endDate $endDateData->format('d F Y');
  3327.     $isHalfEnd $request->getIsHalfEnd();
  3328.     $isHalfEndTime $isHalfEnd '140000' '180000';
  3329.     $isHalfEnd $isHalfEnd 'AM' 'PM';
  3330.     $today = new \DateTime();
  3331.     $todayDateData $today->format('Ymd');
  3332.     $status $request->getIsApproved() ? 'Approved' 'Rejected';
  3333.     // $leaveRequest = $this->entityManager->getRepository(LeaveRequest::class)->findOneBy(['user'=>$editedUser, 'leaveType'=>$leaveType, 'startDate' => $startDateData, 'endDate' => $endDateData ]);
  3334.     $leaveRequest $request;
  3335.     $subject "email.leave.update.";
  3336.     $emailTemplate 'email/user-notification/leave/status-update.html.twig';
  3337.     $attendee = [
  3338.       [
  3339.           'name' => $request->getUser()->getPersonalInfo()->getFullName(),
  3340.           'email' => $request->getUser()->getEmail(),
  3341.           'role' => 'REQ-PARTICIPANT'
  3342.       ],
  3343.   ];
  3344.   $startDateTime $request->getStartDate()->format('Ymd') . ($isHalfStart != 'AM' 'T' $isHalfStartTime '');
  3345.   $endDateTime $request->getEndDate()->format('Ymd') . ($isHalfEnd != 'PM' || $isHalfStart != 'AM' 'T' $isHalfEndTime '');
  3346.   if($request->getStartDate()->format('Ymd') != $request->getEndDate()->format('Ymd')){
  3347.     if($isHalfEnd != 'PM' || $isHalfStart != 'AM'){
  3348.       $endDateTime $request->getEndDate()->format('Ymd') . 'T' $isHalfEndTime;
  3349.     }else{
  3350.       $endDateTime strval($request->getEndDate()->format('Ymd') + 1);
  3351.     }
  3352.   }
  3353.   // $startDateTime = $request->getStartDate()->format('Ymd') . 'T' . $isHalfStartTime;
  3354.   // $endDateTime = $request->getEndDate()->format('Ymd') . 'T' . $isHalfEndTime;
  3355.   $ICSTitle 'On ' $leaveType->getAttributes()['label'] . ' Leave';
  3356.   $desc $editedUser->getPersonalInfo()->getFirstName().' on '$leaveType->getAttributes()['label'] .' leave for '.$request->getDays().' day(s).\nFor urgent matters, please contact '.$editedUser->getManager()->getPersonalInfo()->getFirstName();
  3357.   
  3358.     $icsData =  $this->icsService->generateEventFile([
  3359.       'uid' => $request->getId() . $request->getUser()->getId() . ':' $request->getUser()->getEmail(),
  3360.       'title' => $ICSTitle ': ' $request->getUser()->getPersonalInfo()->getFullName(),
  3361.       'description' => $desc,
  3362.       'startDateTime' => $startDateTime,
  3363.       'endDateTime' =>  $endDateTime,
  3364.       'location' =>  $request->getUser()->getOffice()->getFullName(),
  3365.       'organizer' => [
  3366.           'name' => $this->params->get('systemEmailName'),
  3367.           'email' => $_SERVER['APP_ENV'] == 'prod' $this->params->get('systemEmailAddr') : 'devops@mediatropy.com'
  3368.       ],
  3369.       // 'organizer' => [
  3370.       //     'name' => $request->getUser()->getPersonalInfo()->getFullName(),
  3371.       //     'email' => $request->getUser()->getEmail()
  3372.       // ],
  3373.       'attendee' => $attendee,
  3374.       'reschedule' => 0,
  3375.       'reminderTime' => '-15M',
  3376.       'reminderDescription' => 'Reminder: '.$desc,
  3377.       'fileName' => 'Leave-' $request->getId()
  3378.     ], true);
  3379.     if($leaveType->getAttributes()['label']=='Sick'){
  3380.       $startDate $startDateData->format('d F');
  3381.       $subject "email.leave.update_sick.";
  3382.       $emailTemplate 'email/user-notification/leave/status-update-sick.html.twig';
  3383.       if($status == 'Rejected'){
  3384.         $this->mailgunService->sendEmail(
  3385.           $this->translator->trans($subject 'user', [
  3386.             '%leaveType%' => $dataleaveType,
  3387.             '%startDate%' => $startDate,
  3388.             // '%endDate%' => $endDate,
  3389.             // '%isHalfStart%' => $isHalfStart,
  3390.             // '%isHalfEnd%' => $isHalfEnd,
  3391.           ]),
  3392.           [$editedUser->getEmail()],
  3393.           $emailTemplate,
  3394.           [
  3395.             'admin' => $admin,
  3396.             'recipient' => $editedUser,
  3397.             'group' => 'user',
  3398.             'user' => $editedUser,
  3399.             'leaveRequest' => $leaveRequest
  3400.           ],
  3401.           $loggedIn
  3402.         );
  3403.       }elseif($status == 'Approved'){
  3404.           $this->mailgunService->sendEmailWithAttachment([
  3405.             'subject' =>  $this->translator->trans($subject 'user', [
  3406.               '%leaveType%' => $dataleaveType,
  3407.               '%startDate%' => $startDate,
  3408.               // '%endDate%' => $endDate,
  3409.               // '%isHalfStart%' => $isHalfStart,
  3410.               // '%isHalfEnd%' => $isHalfEnd,
  3411.             ]),
  3412.             'to' => $editedUser->getEmail(),
  3413.             'template' => $emailTemplate,
  3414.             'params' => [
  3415.                 'admin' => $admin,
  3416.                 'recipient' => $editedUser,
  3417.                 'group' => 'user',
  3418.                 'user' => $editedUser,
  3419.                 'leaveRequest' => $leaveRequest
  3420.             ],
  3421.             'ical' => $icsData
  3422.           ], $loggedIn
  3423.         );
  3424.       }
  3425.       foreach ($editedUser->getAllManager() as $manager) {
  3426.         $this->mailgunService->sendEmail(
  3427.           $this->translator->trans($subject 'manager', [
  3428.             '%user%' => $user,
  3429.             '%leaveType%' => $dataleaveType,
  3430.             '%startDate%' => $startDate,
  3431.             /*
  3432.             '%endDate%' => $endDate,
  3433.             '%isHalfStart%' => $isHalfStart,
  3434.             '%isHalfEnd%' => $isHalfEnd,
  3435.             */
  3436.           ]),
  3437.           [$manager->getEmail()],
  3438.           $emailTemplate,
  3439.           [
  3440.             'admin' => $admin,
  3441.             'recipient' => $manager,
  3442.             'group' => 'manager',
  3443.             'user' => $editedUser,
  3444.             'leaveRequest' => $leaveRequest
  3445.           ],
  3446.           $loggedIn
  3447.         );
  3448.       }
  3449.       if($startDateData->format("Ymd") >= $todayDateData || $endDateData->format("Ymd") >= $todayDateData){
  3450.         $this->mailgunService->sendEmail(
  3451.           $this->translator->trans($subject 'ops', [
  3452.             '%user%' => $user,
  3453.             '%leaveType%' => $dataleaveType,
  3454.             '%startDate%' => $startDate,
  3455.           ]),
  3456.           [$emailOps],
  3457.           $emailTemplate,
  3458.           [
  3459.             'admin' => $admin,
  3460.             'recipient' => 'Team',
  3461.             'group' => 'ops',
  3462.             'user' => $editedUser,
  3463.             'leaveRequest' => $leaveRequest
  3464.           ],
  3465.           $loggedIn
  3466.         );
  3467.       }
  3468.     }else{
  3469.       if($status == 'Rejected'){
  3470.         $this->mailgunService->sendEmail(
  3471.           $this->translator->trans($subject 'user', [
  3472.             '%leaveType%' => $dataleaveType,
  3473.             '%startDate%' => $startDate,
  3474.             '%endDate%' => $endDate,
  3475.             '%isHalfStart%' => $isHalfStart,
  3476.             '%isHalfEnd%' => $isHalfEnd,
  3477.           ]),
  3478.           [$editedUser->getEmail()],
  3479.           $emailTemplate,
  3480.           [
  3481.             'recipient' => $editedUser,
  3482.             'group' => 'user',
  3483.             'user' => $editedUser,
  3484.             'leaveRequest' => $leaveRequest
  3485.           ],
  3486.           $loggedIn
  3487.         );
  3488.       }elseif($status == 'Approved'){
  3489.         $this->mailgunService->sendEmailWithAttachment([
  3490.             'subject' =>  $this->translator->trans($subject 'user', [
  3491.               '%leaveType%' => $dataleaveType,
  3492.               '%startDate%' => $startDate,
  3493.               '%endDate%' => $endDate,
  3494.               '%isHalfStart%' => $isHalfStart,
  3495.               '%isHalfEnd%' => $isHalfEnd,
  3496.             ]),
  3497.             'to' => $editedUser->getEmail(),
  3498.             'template' => $emailTemplate,
  3499.             'params' => [
  3500.                 'recipient' => $editedUser,
  3501.                 'group' => 'user',
  3502.                 'user' => $editedUser,
  3503.                 'leaveRequest' => $leaveRequest
  3504.             ],
  3505.             'ical' => $icsData
  3506.           ], $loggedIn
  3507.         );
  3508.       }
  3509.       foreach ($editedUser->getAllManager() as $manager) {
  3510.         $this->mailgunService->sendEmail(
  3511.           $this->translator->trans($subject 'manager', [
  3512.             '%user%' => $user,
  3513.             '%leaveType%' => $dataleaveType,
  3514.             '%startDate%' => $startDate,
  3515.             '%endDate%' => $endDate,
  3516.             '%isHalfStart%' => $isHalfStart,
  3517.             '%isHalfEnd%' => $isHalfEnd,
  3518.           ]),
  3519.           [$manager->getEmail()],
  3520.           $emailTemplate,
  3521.           [
  3522.             'recipient' => $manager,
  3523.             'group' => 'manager',
  3524.             'user' => $editedUser,
  3525.             'leaveRequest' => $leaveRequest
  3526.           ],
  3527.           $loggedIn
  3528.         );
  3529.       }
  3530.       foreach ($emailGroup as $groupName => $groupEmail) {
  3531.         if ($groupName == 'hr') {
  3532.           $this->mailgunService->sendEmail(
  3533.             $this->translator->trans($subject $groupName, [
  3534.               '%user%' => $user,
  3535.               '%leaveType%' => $dataleaveType,
  3536.               '%startDate%' => $startDate,
  3537.               '%endDate%' => $endDate,
  3538.               '%isHalfStart%' => $isHalfStart,
  3539.               '%isHalfEnd%' => $isHalfEnd,
  3540.             ]),
  3541.             [$groupEmail],
  3542.             $emailTemplate,
  3543.             [
  3544.               'recipient' => strtoupper($groupName) . ' Team',
  3545.               'user' => $editedUser,
  3546.               'group' => $groupName,
  3547.               'leaveRequest' => $leaveRequest
  3548.             ],
  3549.             $loggedIn
  3550.           );
  3551.         }
  3552.       }
  3553.     }
  3554.   }
  3555.   public function deleteRequestLeaveEmail($request$editedUser)
  3556.   {
  3557.     $loggedIn $request true false;
  3558.     $emailGroup $this->params->get('systemEmailGroup');
  3559.     $emailOps $this->params->get('systemEmailOps');
  3560.     // $reminderLog = $editedUser->getReminder();
  3561.     $user $editedUser->getPersonalInfo()->getFirstName();
  3562.     $leaveType $request->getLeaveType();
  3563.     $dataleaveType ucwords($leaveType->getLeaveName());
  3564.     $startDateData $request->getStartDate();
  3565.     $startDate $startDateData->format('d F Y');
  3566.     $isHalfStart $request->getIsHalfStart();
  3567.     $isHalfStartTime $isHalfStart '130000' '090000';
  3568.     $isHalfStart $isHalfStart 'PM' 'AM';
  3569.     $endDateData $request->getEndDate();
  3570.     $endDate $endDateData->format('d F Y');
  3571.     $isHalfEnd $request->getIsHalfEnd();
  3572.     $isHalfEndTime $isHalfEnd '140000' '180000';
  3573.     $isHalfEnd $isHalfEnd 'AM' 'PM';
  3574.     $today = new \DateTime();
  3575.     $todayDateData $today->format('Ymd');
  3576.     $status $request->getIsApproved() ? 'Approved' 'Rejected';
  3577.     // $leaveRequest = $this->entityManager->getRepository(LeaveRequest::class)->findOneBy(['user'=>$editedUser, 'leaveType'=>$leaveType, 'startDate' => $startDateData, 'endDate' => $endDateData ]);
  3578.     $leaveRequest $request;
  3579.     $subject "email.leave.delete.";
  3580.     $emailTemplate 'email/user-notification/leave/request-deleted.html.twig';
  3581.     $attendee = [
  3582.       [
  3583.           'name' => $request->getUser()->getPersonalInfo()->getFullName(),
  3584.           'email' => $request->getUser()->getEmail(),
  3585.           'role' => 'REQ-PARTICIPANT'
  3586.       ],
  3587.   ];
  3588.   $startDateTime $request->getStartDate()->format('Ymd') . ($isHalfStart != 'AM' 'T' $isHalfStartTime '');
  3589.   $endDateTime $request->getEndDate()->format('Ymd') . ($isHalfEnd != 'PM' || $isHalfStart != 'AM' 'T' $isHalfEndTime '');
  3590.   if($request->getStartDate()->format('Ymd') != $request->getEndDate()->format('Ymd')){
  3591.     if($isHalfEnd != 'PM' || $isHalfStart != 'AM'){
  3592.       $endDateTime $request->getEndDate()->format('Ymd') . 'T' $isHalfEndTime;
  3593.     }else{
  3594.       $endDateTime strval($request->getEndDate()->format('Ymd') + 1);
  3595.     }
  3596.   }
  3597.   // $startDateTime = $request->getStartDate()->format('Ymd') . 'T' . $isHalfStartTime;
  3598.   // $endDateTime = $request->getEndDate()->format('Ymd') . 'T' . $isHalfEndTime;
  3599.   $ICSTitle 'On ' $leaveType->getAttributes()['label'] . ' Leave';
  3600.   $desc $editedUser->getPersonalInfo()->getFirstName().' on '$leaveType->getAttributes()['label'] .' leave for '.$request->getDays().' day(s).\nFor urgent matters, please contact '.$editedUser->getManager()->getPersonalInfo()->getFirstName();
  3601.   
  3602.     $icsData =  $this->icsService->generateEventFile([
  3603.       'uid' => $request->getId() . $request->getUser()->getId() . ':' $request->getUser()->getEmail(),
  3604.       'title' => $ICSTitle ': ' $request->getUser()->getPersonalInfo()->getFullName(),
  3605.       'description' => $desc,
  3606.       'startDateTime' => $startDateTime,
  3607.       'endDateTime' =>  $endDateTime,
  3608.       'location' =>  $request->getUser()->getOffice()->getFullName(),
  3609.       'organizer' => [
  3610.           'name' => $this->params->get('systemEmailName'),
  3611.           'email' => $_SERVER['APP_ENV'] == 'prod' $this->params->get('systemEmailAddr') : 'devops@mediatropy.com'
  3612.       ],
  3613.       // 'organizer' => [
  3614.       //     'name' => $request->getUser()->getPersonalInfo()->getFullName(),
  3615.       //     'email' => $request->getUser()->getEmail()
  3616.       // ],
  3617.       'attendee' => $attendee,
  3618.       'reschedule' => 0,
  3619.       'reminderTime' => '-15M',
  3620.       'reminderDescription' => 'Reminder: '.$desc,
  3621.       'fileName' => 'Leave-' $request->getId()
  3622.     ], true'CANCEL');
  3623.     if($status == 'Rejected'){
  3624.       // $this->mailgunService->sendEmail(
  3625.       //   $this->translator->trans($subject . 'user', [
  3626.       //     '%leaveType%' => $dataleaveType,
  3627.       //     '%startDate%' => $startDate,
  3628.       //     '%endDate%' => $endDate,
  3629.       //     '%isHalfStart%' => $isHalfStart,
  3630.       //     '%isHalfEnd%' => $isHalfEnd,
  3631.       //   ]),
  3632.       //   [$editedUser->getEmail()],
  3633.       //   $emailTemplate,
  3634.       //   [
  3635.       //     'recipient' => $editedUser,
  3636.       //     'group' => 'user',
  3637.       //     'user' => $editedUser,
  3638.       //     'leaveRequest' => $leaveRequest
  3639.       //   ],
  3640.       //   $loggedIn
  3641.       // );
  3642.     }elseif($status == 'Approved'){
  3643.       $this->mailgunService->sendEmailWithAttachment([
  3644.           'subject' =>  $this->translator->trans($subject 'user', [
  3645.             '%leaveType%' => $dataleaveType,
  3646.             '%startDate%' => $startDate,
  3647.             '%endDate%' => $endDate,
  3648.             '%isHalfStart%' => $isHalfStart,
  3649.             '%isHalfEnd%' => $isHalfEnd,
  3650.           ]),
  3651.           'to' => $editedUser->getEmail(),
  3652.           'template' => $emailTemplate,
  3653.           'params' => [
  3654.               'recipient' => $editedUser,
  3655.               'group' => 'user',
  3656.               'user' => $editedUser,
  3657.               'leaveRequest' => $leaveRequest
  3658.           ],
  3659.           'ical' => $icsData
  3660.         ], $loggedIn
  3661.       );
  3662.     }
  3663.     foreach ($editedUser->getAllManager() as $manager) {
  3664.       $this->mailgunService->sendEmail(
  3665.         $this->translator->trans($subject 'manager', [
  3666.           '%user%' => $user,
  3667.           '%leaveType%' => $dataleaveType,
  3668.           '%startDate%' => $startDate,
  3669.           '%endDate%' => $endDate,
  3670.           '%isHalfStart%' => $isHalfStart,
  3671.           '%isHalfEnd%' => $isHalfEnd,
  3672.         ]),
  3673.         [$manager->getEmail()],
  3674.         $emailTemplate,
  3675.         [
  3676.           'recipient' => $manager,
  3677.           'group' => 'manager',
  3678.           'user' => $editedUser,
  3679.           'leaveRequest' => $leaveRequest
  3680.         ],
  3681.         $loggedIn
  3682.       );
  3683.     }
  3684.     foreach ($emailGroup as $groupName => $groupEmail) {
  3685.       if ($groupName == 'hr') {
  3686.         $this->mailgunService->sendEmail(
  3687.           $this->translator->trans($subject $groupName, [
  3688.             '%user%' => $user,
  3689.             '%leaveType%' => $dataleaveType,
  3690.             '%startDate%' => $startDate,
  3691.             '%endDate%' => $endDate,
  3692.             '%isHalfStart%' => $isHalfStart,
  3693.             '%isHalfEnd%' => $isHalfEnd,
  3694.           ]),
  3695.           [$groupEmail],
  3696.           $emailTemplate,
  3697.           [
  3698.             'recipient' => strtoupper($groupName) . ' Team',
  3699.             'user' => $editedUser,
  3700.             'group' => $groupName,
  3701.             'leaveRequest' => $leaveRequest
  3702.           ],
  3703.           $loggedIn
  3704.         );
  3705.       }
  3706.     }
  3707.   }
  3708.   public function reminderRequestLeaveEmail($leaveData$editedUser)
  3709.   {
  3710.     $loggedIn false;
  3711.     $emailGroup $this->params->get('systemEmailGroup');
  3712.     // $reminderLog = $editedUser->getReminder();
  3713.     $user $editedUser->getPersonalInfo()->getFirstName();
  3714.     $leaveType $leaveData->getLeaveType();
  3715.     $dataleaveType ucwords($leaveType->getLeaveName());
  3716.     $startDate $leaveData->getStartDate()->format('d F Y');
  3717.     $endDate $leaveData->getEndDate()->format('d F Y');
  3718.     $isHalfStart $leaveData->getIsHalfStart();
  3719.     $isHalfStart $isHalfStart 'PM' 'AM';
  3720.     $isHalfEnd $leaveData->getIsHalfEnd();
  3721.     $isHalfEnd $isHalfEnd 'AM' 'PM';
  3722.     //$leaveRequest = $this->entityManager->getRepository(LeaveRequest::class)->findOneBy(['user'=>$editedUser, 'leaveType'=>$leaveType]);
  3723.     $subject "email.leave.reminder.";
  3724.     $emailTemplate 'email/user-notification/leave/request-reminder.html.twig';
  3725.     $this->mailgunService->sendEmail(
  3726.       $this->translator->trans($subject 'user', [
  3727.         '%leaveType%' => $dataleaveType,
  3728.         '%startDate%' => $startDate,
  3729.         '%endDate%' => $endDate,
  3730.         '%isHalfStart%' => $isHalfStart,
  3731.         '%isHalfEnd%' => $isHalfEnd,
  3732.       ]),
  3733.       [$editedUser->getEmail()],
  3734.       $emailTemplate,
  3735.       [
  3736.         'recipient' => $editedUser,
  3737.         'group' => 'user',
  3738.         'user' => $editedUser,
  3739.         'leaveRequest' => $leaveData
  3740.       ],
  3741.       $loggedIn
  3742.     );
  3743.     foreach ($editedUser->getAllManager() as $manager) {
  3744.       $this->mailgunService->sendEmail(
  3745.         $this->translator->trans($subject 'manager', [
  3746.           '%user%' => $user,
  3747.           '%leaveType%' => $dataleaveType,
  3748.           '%startDate%' => $startDate,
  3749.           '%endDate%' => $endDate,
  3750.           '%isHalfStart%' => $isHalfStart,
  3751.           '%isHalfEnd%' => $isHalfEnd,
  3752.         ]),
  3753.         [$manager->getEmail()],
  3754.         $emailTemplate,
  3755.         [
  3756.           'recipient' => $manager,
  3757.           'group' => 'manager',
  3758.           'user' => $editedUser,
  3759.           'leaveRequest' => $leaveData
  3760.         ],
  3761.         $loggedIn
  3762.       );
  3763.     }
  3764.     foreach ($emailGroup as $groupName => $groupEmail) {
  3765.       if ($groupName == 'hr') {
  3766.         $this->mailgunService->sendEmail(
  3767.           $this->translator->trans($subject $groupName, [
  3768.             '%user%' => $user,
  3769.             '%leaveType%' => $dataleaveType,
  3770.             '%startDate%' => $startDate,
  3771.             '%endDate%' => $endDate,
  3772.             '%isHalfStart%' => $isHalfStart,
  3773.             '%isHalfEnd%' => $isHalfEnd,
  3774.           ]),
  3775.           [$groupEmail],
  3776.           $emailTemplate,
  3777.           [
  3778.             'recipient' => strtoupper($groupName) . ' Team',
  3779.             'user' => $editedUser,
  3780.             'group' => $groupName,
  3781.             'leaveRequest' => $leaveData
  3782.           ],
  3783.           $loggedIn
  3784.         );
  3785.       }
  3786.     };
  3787.   }
  3788.   public function dailyLeaveEmail($leaveData)
  3789.   {
  3790.     $loggedIn false;
  3791.     $emailOps $this->params->get('systemEmailOps');
  3792.     $today date("d F");
  3793.     // $reminderLog = $editedUser->getReminder();
  3794.     $subject $this->translator->trans('email.leave.ops.daily', ['%today%' => $today]);
  3795.     $emailTemplate 'email/user-notification/leave/daily-reminder.html.twig';
  3796.     $this->mailgunService->sendEmail(
  3797.       $subject,
  3798.       [$emailOps],
  3799.       $emailTemplate,
  3800.       [
  3801.         'leaveRequests' => $leaveData,
  3802.         'loop' => 'daily'
  3803.       ],
  3804.       $loggedIn
  3805.     );
  3806.   }
  3807.   public function weeklyLeaveEmail($leaveData)
  3808.   {
  3809.     $loggedIn false;
  3810.     $emailOps $this->params->get('systemEmailOps');
  3811.     // $reminderLog = $editedUser->getReminder();
  3812.     $subject $this->translator->trans('email.leave.ops.weekly');
  3813.     $emailTemplate 'email/user-notification/leave/weekly-reminder.html.twig';
  3814.     $this->mailgunService->sendEmail(
  3815.       $subject,
  3816.       [$emailOps],
  3817.       $emailTemplate,
  3818.       [
  3819.         'leaveRequests' => $leaveData,
  3820.         'loop' => 'weekly'
  3821.       ],
  3822.       $loggedIn
  3823.     );
  3824.   }
  3825.   public function leavePermanent(\App\Entity\User $user$force false$cron false,$forceexc='',$permanent=false,$option=array())
  3826.   {
  3827.     $jobstatus $user->getPersonalInfo()->getJobStatus();
  3828.     $execute false;
  3829.     if (!$cron) {
  3830.       if ($jobstatus == 'form.job_status.permanent') {
  3831.         if(!$permanent){$execute true;}
  3832.       }
  3833.     }
  3834.     $country $user->getOffice()->getCountry();
  3835.     $lpresult=array();
  3836.     if ($cron) {
  3837.       $dtx $user->getPersonalInfo()->getJobJoinDate();
  3838.       if ($dtx != null) {
  3839.         $now = new \DateTime(date('Y-m-d'));
  3840.         $now->modify('-3 months');
  3841.         if (($now == $dtx) && ($jobstatus != 'form.job_status.permanent')) {
  3842.           $execute true;
  3843.         }
  3844.       }
  3845.     }
  3846.     if($forceexc=='run'){$execute=true;}
  3847.     
  3848.     if ($execute) {
  3849.                             
  3850.       $em $this->entityManager;
  3851.       $yr date('Y');
  3852.       $leaveent $em->getRepository(\App\Entity\LeaveEntitlement::class)->findBy(array('user' => $user'year' => $yr));
  3853.       $dt=null;
  3854.       if(!is_null($user->getPersonalInfo()->getJobPermanentDate())){
  3855.         $dt =  new \DateTime($user->getPersonalInfo()->getJobPermanentDate()->format('Y-m-d'));
  3856.       }
  3857.       $dt1 = new \DateTime($user->getPersonalInfo()->getJobJoinDate()->format('Y-m-d'));
  3858.       $ls = new \DateTime($yr '-12-31');
  3859.       $office $user->getOffice();
  3860.       $leavetype $em->getRepository(\App\Entity\LeaveType::class)->findBy(array('office' => $office));
  3861.       $lvty = array();
  3862.       $oldenan=null;
  3863.       foreach ($leavetype as $l) {
  3864.         $lvty['t' $l->getId()] = $l;
  3865.         if($l->getLeaveName()=='annual'){
  3866.           $oldenan $em->getRepository(\App\Entity\LeaveEntitlement::class)->findBy(array('user' => $user'year' => ($yr-1),'leaveType'=>$l->getId(),'leaveEntitlements'=>0));
  3867.         }
  3868.       }
  3869.       
  3870.       ob_start();
  3871.       foreach($lvty as $k=>$v){
  3872.       // print_r($k);
  3873.       }
  3874.       $txt=ob_get_clean();
  3875.       $lpresult['execute2']=$txt;
  3876.       
  3877.       if ($leaveent != null) {
  3878.         foreach ($leaveent as $l) {
  3879.           $attr $l->getAttributes();
  3880.           $attrx $l->getAttributes();
  3881.           $attrp $l->getLeaveType()->getAttributes();
  3882.           foreach ($attrp as $k => $v) {
  3883.             if (!isset($attr[$k])) {
  3884.               $attr[$k] = $v;
  3885.             }
  3886.           }
  3887.           $leaveyear 12;
  3888.           if (isset($lvty['t' $l->getLeaveType()->getId()])) {
  3889.             $leaveyear $lvty['t' $l->getLeaveType()->getId()]->getDays();
  3890.             
  3891.           }
  3892.           $lvcount=array('annual');
  3893.           if ((in_array($l->getLeaveType()->getLeaveName(),$lvcount)) && ($l->getUser()->getId() == $user->getId())) {
  3894.             if(isset($attr['prorate'])){
  3895.             //if(!isset($attr['startleave'])){$attr['startleave']='';}
  3896.               if ($force) {
  3897.                 unset($attr['prorate']);
  3898.               }
  3899.               if(is_null($l->getUpdatedAt())){unset($attr['prorate']);}
  3900.               
  3901.               if($l->getLeaveEntitlements()==0){unset($attr['prorate']);}
  3902.             }
  3903.             
  3904.             if (!isset($attr['prorate'])) {
  3905.               
  3906.               $dt = new \DateTime($user->getPersonalInfo()->getJobJoinDate()->format('Y-m-d'));
  3907.               $lpresult['user']=$user->getPersonalInfo()->getFirstName();
  3908.               $lpresult['execute1']='execute1';
  3909.               
  3910.               if (!is_null($dt)) {
  3911.                 $lpresult['datejoin']=$dt->format('Y-m-d');
  3912.                 $df $user->getPersonalInfo()->getJobJoinDate()->format('d');
  3913.                 $mm $ls->diff($user->getPersonalInfo()->getJobJoinDate());
  3914.                 $mm = ($mm->format('%y') * 12) + $mm->format('%m');
  3915.                 $lpresult['totalmonthreal']=$mm;
  3916.                 
  3917.                 if ($mm 12) {
  3918.                   $mx $mm 1;
  3919.                   if ($df 1) {
  3920.                     $mx $mx 1;
  3921.                   }
  3922.                   $lpresult['totalmonth']=$mx;
  3923.                   $cal floor(($leaveyear 12) * $mx);
  3924.                   
  3925.                   $attrx['prorate'] = true;
  3926.                   $pr=$l->getParent();
  3927.                   if(is_null($pr) || ($pr==0)){
  3928.                     if(isset($attrx['given'])){
  3929.                       $gvx=$attrx['given'];
  3930.                       if(!is_array($attrx['given'])){$gvx=new \DateTime($attrx['given']);}
  3931.                       $gv=new \DateTime(date('Y-m-d'));
  3932.                       if($gv $gvx){$attrx['given']=$gv->format('Y-m-d');}
  3933.                     }
  3934.                   }
  3935.                   if($l->getLeaveType()->getLeaveName()=='annual'){
  3936.                     $attrx=$this->_calculate_givendate($l->getYear(),$country,$attrx,$user->getPersonalInfo()->getJobJoinDate(),$user->getPersonalInfo()->getJobPermanentDate(),$jobstatus);
  3937.                   }
  3938.                   $l->setAttributes($attrx);
  3939.                   $ollf $l->getLeaveEntitlements();
  3940.                   if($l->getLeaveType()->getLeaveName()=='annual'){
  3941.                     $lpresult['leavetype']=$l->getLeaveType()->getLeaveName();
  3942.                   $lpresult['calulate']=$cal;
  3943.                   }
  3944.                   $l->setLeaveEntitlements($cal);
  3945.                   $lf = ($cal $ollf) + $l->getLeaveLeft();
  3946.                   $l->setLeaveLeft($lf);
  3947.                   $em->persist($l);
  3948.                   $em->flush();
  3949.                 }else{
  3950.                   if($l->getLeaveType()->getLeaveName()=='annual'){
  3951.                     if($l->getLeaveEntitlements()==0){
  3952.                       $l->setLeaveEntitlements($l->getLeaveType()->getDays());
  3953.                       $l->setLeaveLeft($l->getLeaveType()->getDays());
  3954.                       $em->persist($l);
  3955.                       $em->flush();
  3956.                     }
  3957.                   }  
  3958.                 }
  3959.                 if(is_array($oldenan)){
  3960.                   $ls2=new \DateTime((date('Y')-1).'-12-31');
  3961.                   $mm $ls2->diff($user->getPersonalInfo()->getJobJoinDate());
  3962.                   $mm = ($mm->format('%y') * 12) + $mm->format('%m');
  3963.                   if(($mm 12) && ($mm >= 0)){
  3964.                     if($l->getLeaveType()->getLeaveName()=='annual'){
  3965.                       if(is_array($oldenan)){
  3966.                         foreach($oldenan as $lan){
  3967.                           if($lan->getLeaveEntitlements()==0){
  3968.                             $mx $mm 1;
  3969.                             if ($df 1) {
  3970.                               $mx $mx 1;
  3971.                             }
  3972.                             $cal floor(($leaveyear 12) * $mx);
  3973.                             $lan->setLeaveEntitlements($cal);
  3974.                             $lan->setLeaveLeft($cal);
  3975.                             $em->persist($lan);
  3976.                             $em->flush();
  3977.                           }
  3978.                         }
  3979.                       }
  3980.                     }  
  3981.                   }
  3982.                 }  
  3983.               }
  3984.               //return true;
  3985.             } else {
  3986.               if($l->getLeaveType()->getLeaveName()=='annual'){
  3987.                 $attrx=$this->_calculate_givendate($l->getYear(),$country,$attrx,$user->getPersonalInfo()->getJobJoinDate(),$user->getPersonalInfo()->getJobPermanentDate(),$jobstatus);
  3988.                 $l->setAttributes($attrx);
  3989.                 $em->persist($l);
  3990.                 $em->flush();  
  3991.               }  
  3992.                
  3993.               //return false;
  3994.             }
  3995.           }else{
  3996.             $pr=$l->getParent();
  3997.             if(is_null($pr) || ($pr==0)){
  3998.               $mm $ls->diff($user->getPersonalInfo()->getJobJoinDate());
  3999.               $mm = ($mm->format('%y') * 12) + $mm->format('%m');
  4000.               $cal=$leaveyear;
  4001.               if($mm 12){
  4002.                 $ollf $l->getLeaveEntitlements();
  4003.                 if($ollf ==0){
  4004.                   $l->setLeaveEntitlements($cal);
  4005.                   $lf = ($cal $ollf) + $l->getLeaveLeft();
  4006.                   $l->setLeaveLeft($lf);
  4007.                   $em->persist($l);
  4008.                   $em->flush();
  4009.                 }  
  4010.               }
  4011.             }  
  4012.           }
  4013.           if($l->getLeaveType()->getLeaveName()=='annual'){
  4014.             $attrx=$this->_calculate_givendate($l->getYear(),$country,$attrx,$user->getPersonalInfo()->getJobJoinDate(),$user->getPersonalInfo()->getJobPermanentDate(),$jobstatus);
  4015.             $l->setAttributes($attrx);
  4016.             $em->persist($l);
  4017.             $em->flush();
  4018.           }  
  4019.         }
  4020.       }
  4021.      
  4022.     
  4023.       if(!is_null($user)){
  4024.         $lpresult['userr']=$user->getPersonalInfo()->getFirstName();
  4025.       }
  4026.       $rsback=$this->resetAll(array('user'=>$user,'logname'=>'log.leave.reset.permanent'));
  4027.       foreach($rsback as $kr=>$r){
  4028.         $lpresult['b'.$kr]=$r;
  4029.       }
  4030.     }
  4031.     //Vietnam
  4032.     /*$hf=fopen('../var/log/test.log','w');
  4033.     ob_start();
  4034.     print_r('country');
  4035.     print_r($country);
  4036.     print_r("\n");
  4037.     $txt=ob_get_clean();
  4038.     fwrite($hf,$txt);
  4039.     fclose($hf);*/
  4040.     if($country=='VN'){
  4041.       $em $this->entityManager;
  4042.       $dtx $user->getPersonalInfo()->getJobJoinDate();
  4043.       if($dtx!=null){
  4044.         $dty = new \DateTime($dtx->format('Y-m-d'));
  4045.         $dty=$dty->format('Y');
  4046.         $ynow date('Y');
  4047.         if(($ynow-$dty) <= 2){
  4048.           $leavetype $em->getRepository(\App\Entity\LeaveType::class)->findBy(array('office' => $user->getOffice()));
  4049.           $lannual null;
  4050.           $lvtype=array();
  4051.           foreach ($leavetype as $l) {
  4052.             array_push($lvtype,$l);
  4053.             if($l->getLeaveName()=='annual'){
  4054.               $lannual=$l;
  4055.             }
  4056.           }
  4057.           if(!is_null($lannual)){
  4058.             $leaveent $em->getRepository(\App\Entity\LeaveEntitlement::class)->findBy(array('user' => $user'year' => $ynow,'leaveType'=>$lannual));
  4059.             if(!is_null($leaveent)){
  4060.                 foreach($leaveent as $l){
  4061.                   // first year set to 5
  4062.                   if(($ynow-$dty)==0){
  4063.                     $lf=$l->getLeaveLeft();
  4064.                     $tl=$l->getLeaveEntitlements();
  4065.                     $lf=$lf-($tl-5);
  4066.                     $l->setLeaveLeft($lf);
  4067.                     $l->setLeaveEntitlements(5);
  4068.                     $attr=$l->getAttributes();
  4069.                     if(!is_array($attr)){
  4070.                       $attr=$lannual->getAttributes();
  4071.                     }
  4072.                     $gv=new \DateTime($dtx->format('Y-m-d'));
  4073.                     $exp=new \DateTime($dtx->format('Y-m-d'));
  4074.                     $exp->modify('+1 year');
  4075.                     $exp->modify('-1 day');
  4076.                     $attr['given']=$gv->format('Y-m-d');
  4077.                     $attr['expires']=$exp->format('Y-m-d');
  4078.                     $l->setAttributes($attr);
  4079.                     $em->persist($l);
  4080.                     $em->flush();
  4081.                   }else{
  4082.                     $lf=$l->getLeaveLeft();
  4083.                     $tl=$l->getLeaveEntitlements();
  4084.                     $lf=$lf-($tl-$lannual->getDays());
  4085.                     $l->setLeaveLeft($lf);
  4086.                     $l->setLeaveEntitlements($lannual->getDays());
  4087.                     $attr=$l->getAttributes();
  4088.                     if(!is_array($attr)){
  4089.                       $attr=$lannual->getAttributes();
  4090.                     }
  4091.                     $gv=new \DateTime($ynow.'-'.$dtx->format('m-d'));
  4092.                     $exp=new \DateTime(($ynow+1).'-'.$dtx->format('m-d'));
  4093.                     $exp->modify('-1 day');
  4094.                     $attr['given']=$gv->format('Y-m-d');
  4095.                     $attr['expires']=$exp->format('Y-m-d');
  4096.                     $l->setAttributes($attr);
  4097.                     $em->persist($l);
  4098.                     $em->flush();
  4099.                   }
  4100.                     /*else if(($ynow-$dtx)==1){
  4101.                     //second year pro rate
  4102.                     $nm=new \DateTime($dtx->format('Y-m-d'));
  4103.                     $nm=$nm->format('m');
  4104.                     $nm=(12-$nm)+1;
  4105.                     $lf=$l->getLeft();
  4106.                     $tl=$l->getLeaveEntitlement();
  4107.                     $ct=floor($nm/$lannual->getDays());
  4108.                     $lf=$lf-($tl-$ct);
  4109.                     $l->setLeft($lf);
  4110.                     $l->getLeaveEntitlement($ct);
  4111.                     $attr=$l->getAttributes();
  4112.                     if(!is_array($attr)){
  4113.                       $attr=$lannual->getAttributes();
  4114.                     }
  4115.                     $gv=new \DateTime($dtx->format('Y-m-d'));
  4116.                     $gv->modify('+1 year');
  4117.                     $exp=new \DateTime(($year+2).'-03-31');
  4118.                     $attr['given']=$gv->format('Y-m-d');
  4119.                     $attr['expires']=$exp->format('Y-m-d');
  4120.                     $l->setAttributes($attr);
  4121.                     $em->persist($l);
  4122.                     $em->flush();
  4123.                   }*/
  4124.                 }
  4125.             }else{
  4126.               foreach($leavetype as $l){
  4127.                 $leave=$this->_add_leave_data($u,$opt['year'],$exp,$l);
  4128.                 if($leave!==false){
  4129.                     if(is_array($leave)){
  4130.                       foreach($leave as $lv){
  4131.                         $parent=$lv->getId();
  4132.                         $childType=$this->entityManager->getRepository(LeaveType::class)->findBy(array('office'=>$u->getOffice(),'parent'=>array($l->getId())));
  4133.                         if(count($childType) > 0){
  4134.                           foreach($childType as $c){
  4135.                             if(!isset($lent['u'.$uuid])){
  4136.                               $cleave=$this->_add_leave_data($u,$opt['year'],$exp,$c,$parent);
  4137.                             }else{
  4138.                               if(!isset($lent['u'.$uuid]['y'.$opt['year']])){
  4139.                                 $cleave=$this->_add_leave_data($u,$opt['year'],$exp,$c,$parent);
  4140.                               }else{
  4141.                                 if(!isset($lent['u'.$uuid]['y'.$opt['year']]['t'.$c->getId()])){
  4142.                                   $cleave=$this->_add_leave_data($u,$opt['year'],$exp,$c,$parent);
  4143.                                 }  
  4144.                               }
  4145.                             } 
  4146.                             
  4147.                           }
  4148.                         } 
  4149.                       }
  4150.                     }else{
  4151.                       $parent=$leave->getId();
  4152.                       $childType=$this->entityManager->getRepository(LeaveType::class)->findBy(array('office'=>$u->getOffice(),'parent'=>array($l->getId())));
  4153.                       if(count($childType) > 0){
  4154.                         foreach($childType as $c){
  4155.                           if(!isset($lent['u'.$uuid])){
  4156.                             $cleave=$this->_add_leave_data($u,$opt['year'],$exp,$c,$parent);
  4157.                           }else{
  4158.                             if(!isset($lent['u'.$uuid]['y'.$opt['year']])){
  4159.                               $cleave=$this->_add_leave_data($u,$opt['year'],$exp,$c,$parent);
  4160.                             }else{
  4161.                               if(!isset($lent['u'.$uuid]['y'.$opt['year']]['t'.$c->getId()])){
  4162.                                 $cleave=$this->_add_leave_data($u,$opt['year'],$exp,$c,$parent);
  4163.                               }  
  4164.                             }
  4165.                           }  
  4166.                           
  4167.                         }
  4168.                       }
  4169.                     }
  4170.                 } 
  4171.               }
  4172.             }
  4173.           }else{
  4174.             
  4175.           }
  4176.         }
  4177.       }
  4178.     }
  4179.     return $lpresult;
  4180.   }
  4181.   function _getRequestLeave($arg){
  4182.     $opt=array(
  4183.       'year'=>date('Y'),
  4184.       'type'=>array()
  4185.     );
  4186.     foreach($arg as $k=>$v){$opt[$k]=$v;}
  4187.     $opt['year']=$opt['year']*1;
  4188.     $em $this->entityManager;
  4189.     $rq=$em->createQueryBuilder()
  4190.       ->select('r')
  4191.       ->from(\App\Entity\LeaveRequest::class,'r')
  4192.       ->where('(r.endDate >= :last) and (r.startDate <= :now) and (r.leaveType in (:ltype))')
  4193.       ->setParameter('last',new \DateTime(($opt['year']-1).'-01-01'))
  4194.       ->setParameter('now',new \DateTime($opt['year'].'-12-31'))
  4195.       ->setParameter('ltype',$opt['type'])
  4196.       ->getQuery()->getResult();
  4197.     return $rq;
  4198.   }
  4199.   function _takenRequest($arg){
  4200.     $opt=array(
  4201.       'year'=>date('Y'),
  4202.       'type'=>array(),
  4203.       'leave'=>array(),
  4204.     );
  4205.     foreach($arg as $k=>$v){$opt[$k]=$v;}
  4206.     $rq=$this->_getRequestLeave($opt);
  4207.     $sp=array();
  4208.     $defaultexp=date('Ymd');
  4209.     if($opt['year'] < date('Y')){$defaultexp=$opt['year'].'1231';}
  4210.     $rleave=array();
  4211.     foreach($opt['leave'] as $l){
  4212.       $u=$l->getUser()->getId();
  4213.       $lt=$l->getLeaveType()->getId();
  4214.       if(!isset($rleave['u'.$u])){$rleave['u'.$u]=array();}
  4215.       if(!isset($rleave['u'.$u]['l'.$lt])){$rleave['u'.$u]['l'.$lt]=array();}
  4216.       $rleave['u'.$u]['l'.$lt]['y'.$l->getYear()]=$l->getId();
  4217.     }
  4218.    
  4219.     foreach($rq as $r){
  4220.       $uu=$r->getUser();
  4221.       $u=$uu->getId();
  4222.       $tt=$r->getLeaveType();
  4223.       $allo=$r->getAlocation();
  4224.       $st=$r->getStartDate()->format('Y-m-d');
  4225.       $st=strtotime($st);
  4226.       $ed=$r->getEndDate()->format('Y-m-d');
  4227.       $ed=strtotime($ed);
  4228.       $yst=date('Y',$st); $yed=date('Y',$ed);
  4229.       if(!isset($sp['u'.$u])){$sp['u'.$u]=array();}
  4230.       if(isset($allo['data'])){
  4231.       }else{
  4232.         foreach($allo as $k=>$a){
  4233.           switch ($k){
  4234.             case 'error':
  4235.               break;
  4236.             case 'unpaid':
  4237.                break;
  4238.             case 'type':
  4239.               break;   
  4240.             case 'dumper':
  4241.               break;
  4242.             case 'data':
  4243.               break;
  4244.             case 'child':
  4245.                 break;     
  4246.             default:
  4247.               $yr=$yst;
  4248.               $x=substr($k,0,1);
  4249.               if($x!='y'){break;}
  4250.               $yr=str_replace('y','',$k);
  4251.               if(isset($rleave['u'.$u]['l'.$tt->getId()]['y'.$yr])){
  4252.                 $attr=$opt['leave']['l'.$rleave['u'.$u]['l'.$tt->getId()]['y'.$yr]]->getAttributes();
  4253.                 if(!isset($sp['u'.$u]['l'.$tt->getId()])){
  4254.                   $sp['u'.$u]['l'.$tt->getId()]=array();
  4255.                 }
  4256.                 if(!isset($sp['u'.$u]['l'.$tt->getId()]['y'.$yr])){
  4257.                   $sp['u'.$u]['l'.$tt->getId()]['y'.$yr]=array();
  4258.                   $sp['u'.$u]['l'.$tt->getId()]['y'.$yr]['carry']=0;
  4259.                   $sp['u'.$u]['l'.$tt->getId()]['y'.$yr]['taken']=0;
  4260.                 }
  4261.                 if(isset($attr['carryDate'])){
  4262.                   
  4263.                   $cd=strtotime($attr['carryDate']);
  4264.                   $cd=date('Ymd',$cd);
  4265.                   
  4266.                   //carryover
  4267.                   if(date('Ymd',$ed) >= $cd){
  4268.                     //full carryover
  4269.                     if(date('Ymd',$yst) >= $cd){
  4270.                       
  4271.                       $sp['u'.$u]['l'.$tt->getId()]['y'.$yr]['carry']+=$a;
  4272.                     }else{
  4273.                       //half
  4274.                       $day=abs(floor(($ed-$st)/(24*60*60)))+1;
  4275.                       $dy=$st;
  4276.                       for($i=0;$i<$day;$i++){
  4277.                         $tg=date('Ymd',$dy);
  4278.                         if($tg >= $cd){
  4279.                           $sp['u'.$u]['l'.$tt->getId()]['y'.$yr]['carry']+=$a;
  4280.                         }else{
  4281.                           $sp['u'.$u]['l'.$tt->getId()]['y'.$yr]['taken']+=$a;
  4282.                         }
  4283.                         $dy=strtotime('+1 day',$dy);
  4284.                       }
  4285.                     }
  4286.                   }else{
  4287.                     $sp['u'.$u]['l'.$tt->getId()]['y'.$yr]['taken']+=$a;
  4288.                   }
  4289.                 }else{
  4290.                   $sp['u'.$u]['l'.$tt->getId()]['y'.$yr]['taken']+=$a;
  4291.                 }
  4292.               }  
  4293.           }
  4294.         }
  4295.       }
  4296.     }
  4297.     return $sp;
  4298.   }
  4299.   public function leaveEntitlement($option=array()){
  4300.     $default=array(
  4301.       'user'=>null,
  4302.       'office'=>'',
  4303.       'manager'=>'',
  4304.       'leaveType'=>'',
  4305.       'page'=>1,
  4306.       'limit'=>20,
  4307.       'keyword'=>'',
  4308.       'order'=>'',
  4309.       'orderBy'=>'',
  4310.       'year'=>date('Y'),
  4311.       'byoffice'=>false
  4312.     );
  4313.     $opt=$default;
  4314.     $em $this->entityManager;
  4315.     foreach($option as $k=>$v){$opt[$k]=$v;}
  4316.     if(($opt['year']=='') || is_null($opt['year'])){$opt['year']=date('Y');}
  4317.     $oldsearch=array('year'=>array($opt['year']-2,$opt['year']-1));
  4318.     if(!is_null($opt['user'])){$oldsearch['user']=$opt['user'];}
  4319.     $ynow1=date('Y');
  4320.     $dataentid=array();
  4321.     $leaves=array();
  4322.     $entsearch=array(
  4323.       'year'=>array($opt['year']-1,$opt['year'])
  4324.     );
  4325.     if(!is_null($opt['user'])){$entsearch['user']=$opt['user'];}
  4326.     $leaveEntitlement=$em->getRepository(LeaveEntitlement::class)->findBy($entsearch);
  4327.     $ynow1=date('Y');
  4328.     $adjustments=array();
  4329.     $adjdata=array();
  4330.     $final=array();
  4331.     //arange leave
  4332.     $adjlast=date('Ymd');
  4333.     if($opt['year']!=$ynow1){$adjlast=$opt['year'].'1231';}
  4334.     $adjstart=($opt['year']-1).'0101';
  4335.     $lvlist=array();
  4336.     $rleave=array();
  4337.     foreach($leaveEntitlement as $l){
  4338.       $tt=$l->getLeaveType();
  4339.       $uu=$l->getUser();
  4340.       $u=$uu->getId();
  4341.       $t=$tt->getId();
  4342.       $y=$l->getYear();
  4343.       $attr=$l->getAttributes();
  4344.       $dataentid['l'.$l->getId()]=$l;
  4345.       if(!isset($rleave['u'.$u])){$rleave['u'.$u]=array();}
  4346.       if(!isset($rleave['u'.$u]['l'.$t])){$rleave['u'.$u]['l'.$t]=array();}
  4347.       $rleave['u'.$u]['l'.$t]['y'.$l->getYear()]=$l;
  4348.       
  4349.       if($uu->getIsActive()){
  4350.         if(!isset($adjustments['u'.$u])){
  4351.           $adjustments['u'.$u]=array();
  4352.           $adjustments['u'.$u]['total']=0;
  4353.           $adjustments['u'.$u]['taken']=0;
  4354.           $adjustments['u'.$u]['left']=0;
  4355.         }
  4356.         if($tt->getLeaveName()=='adjustment'){
  4357.           if(isset($attr['expires'])){
  4358.             $d=new \DateTime($attr['expires']);
  4359.             $g=new \DateTime($attr['given']);
  4360.             $adjok=false;
  4361.             if(($adjlast <= $d->format('Ymd')) && ($adjlast >= $g->format('Ymd'))){$adjok=true;}
  4362.             if(($d->format('Ymd') <= $adjlast) && ($g->format('Ymd') >= $adjstart)){$adjok=true;}
  4363.             if($adjok){
  4364.               if(!isset($adjustments['u'.$u])){
  4365.                 $adjustments['u'.$u]=array();
  4366.                 $adjustments['u'.$u]['total']=0;
  4367.                 $adjustments['u'.$u]['left']=0;
  4368.               };
  4369.               $adjustments['u'.$u]['total']+=$l->getLeaveEntitlements();
  4370.               $adjustments['u'.$u]['left']+=$l->getLeaveLeft();
  4371.               /*if(!isset($adjdata['u'.$u])){$adjdata['u'.$u]=array();}
  4372.               $adjdata['u'.$u]['l'.$l->getId()]=clone $l;*/
  4373.               $adjdata['l'.$l->getId()]=array();
  4374.               $adjdata['l'.$l->getId()]['expire']=new \DateTime($attr['expires']);
  4375.               $adjdata['l'.$l->getId()]['given']=new \DateTime($attr['given']);
  4376.               $adjdata['l'.$l->getId()]['total']=$l->getLeaveEntitlements();
  4377.             }
  4378.             
  4379.           }
  4380.           
  4381.         }else{  
  4382.           $ok=true;
  4383.           if(($attr['mode']=='fix') && ($y!=$opt['year'])){$ok=false;}
  4384.           if($ok){
  4385.             if(!isset($leaves['u'.$u])){$leaves['u'.$u]=array();}
  4386.             if(!isset($leaves['u'.$u]['y'.$y])){$leaves['u'.$u]['y'.$y]=array();}
  4387.             $leaves['u'.$u]['y'.$y]['t'.$t]=clone $l;
  4388.           }  
  4389.         }
  4390.       }
  4391.       if(($tt->getLeaveName()=='annual') && (!in_array($tt->getId(),$lvlist))){
  4392.         array_push($lvlist,$tt->getId());
  4393.       }  
  4394.     }
  4395.     //find request for now and last year for carry over
  4396.     $rqlist=array();
  4397.     $carrydate=array();
  4398.     $useradj=array();
  4399.   
  4400.     $sprq=$this->_takenRequest(array(
  4401.       'year'=>$opt['year'],
  4402.       'type'=>$lvlist,
  4403.       'leave'=>$dataentid
  4404.     ));
  4405.     $defaultstart=($opt['year']-2).'0901';
  4406.     $defaultexp=($opt['year']+1).'1231';
  4407.     foreach($leaveEntitlement as $u=>$l){
  4408.       $lu=$l->getUser();
  4409.       $luid=$lu->getId();
  4410.       $lt=$l->getLeaveType();
  4411.       $ltid=$lt->getId();
  4412.       $lyr=$l->getYear();
  4413.       $attr=$l->getAttributes();
  4414.       if ($lu->getIsActive()){
  4415.         $noadd=isset($attr['noadd'])?$attr['noadd']:false;
  4416.       if(!$noadd){
  4417.         if(isset($attr['expires'])){
  4418.           if(is_array($attr['expires'])){$attr['expires']=$attr['expires']['date'];}
  4419.           $attr['expires']=date('Ymd',strtotime($attr['expires']));
  4420.         }else{
  4421.           $attr['expires']=$l->getYear().'1231';
  4422.         }
  4423.         if(isset($attr['given'])){
  4424.           if(is_array($attr['given'])){$attr['given']=$attr['given']['date'];}
  4425.           $attr['given']=date('Ymd',strtotime($attr['given']));
  4426.         }else{
  4427.           $attr['given']=$l->getYear().'0101';
  4428.         }
  4429.         if(isset($attr['carryDate'])){
  4430.           $crdt=new \DateTime($attr['carryDate']);
  4431.           $crdt->modify('-1 day');
  4432.           $crdt=$crdt->format('Y-m-d');
  4433.         }
  4434.         if(($attr['given'] >= $defaultstart) && ($attr['expires'] <= $defaultexp)){
  4435.           if($lyr!=$opt['year']){
  4436.             if(isset($sprq['u'.$luid])){
  4437.               if(isset($sprq['u'.$luid]['l'.$ltid])){
  4438.                 if(isset($sprq['u'.$luid]['l'.$ltid]['y'.$lyr])){
  4439.                   if(isset($rleave['u'.$luid])){
  4440.                     if(isset($rleave['u'.$luid]['l'.$ltid])){
  4441.                       if(isset($rleave['u'.$luid]['l'.$ltid]['y'.$lyr])){
  4442.                         $carry = clone $rleave['u'.$luid]['l'.$ltid]['y'.$lyr];
  4443.                         $cattr=$carry->getAttributes();
  4444.                         $cattr['label']='Carry Over '.$lyr;
  4445.                         $carry->setAttributes($cattr);
  4446.                         $ctotal=$l->getLeaveEntitlements();
  4447.                         $ctotal=$ctotal-$sprq['u'.$luid]['l'.$ltid]['y'.$lyr]['taken'];
  4448.                         $carry->setLeaveEntitlements($ctotal);
  4449.                         array_push($final,array('data'=>$carry,'sort'=>$carry->getUser()->getPersonalInfo()->getFullName()));
  4450.                       }
  4451.                         /*$cattr=$carry->getAttributes();
  4452.                         $cattr['label']='Carry Over';
  4453.                         $carry->setAttributes($cattr);
  4454.                         $ctotal=$l->getLeaveEntitlement();
  4455.                         $ctotal=$ctotal-$sprq['u'.$luid]['l'.$ltid]['taken'];
  4456.                         $carry->setLeaveEntitlement($ctotal);*/
  4457.                         //array_push($final,array('data'=>$carry,'sort'=>$carry->getUser()->getPersonalInfo()->getFullName()));
  4458.                     }  
  4459.                   }
  4460.                 }  
  4461.               }
  4462.             }
  4463.           }
  4464.             if(isset($attr['carryDate'])){
  4465.               $attr['expires']=$crdt;
  4466.               $l->setAttributes($attr);
  4467.               $attr['expires']=date('Ymd',strtotime($attr['expires']));
  4468.             }
  4469.             if($attr['expires'] >= ($opt['year'].'1231')){
  4470.               array_push($final,array('data'=>$l,'sort'=>$lu->getPersonalInfo()->getFullName()));
  4471.             }  
  4472.         }
  4473.       }  
  4474.       }
  4475.     }
  4476.  
  4477.     //end find last casrry
  4478.     
  4479.     $now = new \DateTime(date('Y-m-d'));
  4480.     if($opt['year'] < $now->format('Y')){
  4481.       $now = new \DateTime($opt['year'].'-12-31');
  4482.     }
  4483.     if(($opt['keyword']!='') || ($opt['office']!='') || ($opt['manager']!='')){
  4484.       $ff=array_merge($final,array());
  4485.       $final=array();
  4486.       
  4487.       foreach($ff as $f){
  4488.         $okf=0;
  4489.         $okt=0;
  4490.         $nmu=$f['data']->getUser();
  4491.         $nm=$nmu->getPersonalInfo()->getFullName();
  4492.         if($opt['keyword']!=''){
  4493.           $okt++;
  4494.           $nm=strtolower($nm);
  4495.           $opt['keyword']=strtolower($opt['keyword']);
  4496.           if(strpos($nm,$opt['keyword'])!==false){
  4497.             $okf++;
  4498.           }  
  4499.         }  
  4500.         if($opt['office']!=''){
  4501.           $okt++;
  4502.           $nmo=$nmu->getOffice()->getId();
  4503.           $nooffice='';
  4504.           if(is_object($opt['office'])){$nooffice=$opt['office']->getId();}else{$nooffice=$opt['office'];}
  4505.           if($nmo==$nooffice){$okf++;}
  4506.         }
  4507.         if($opt['manager']!=''){
  4508.           $okt++;
  4509.           $nmo=$nmu->getAllManager();
  4510.           foreach($nmo as $m){
  4511.             if($m->getId()==$opt['manager']){$okf++;}
  4512.           }  
  4513.         }
  4514.         if($okf==$okt){
  4515.           array_push($final,$f);
  4516.         }
  4517.       }
  4518.     }
  4519.     usort($final,function($a,$b){
  4520.         if($a['sort'] > $b['sort']){return 1;}
  4521.         return 0;
  4522.     });
  4523.     $c=count($final);
  4524.     return array(
  4525.       'data'=> array_slice($final,($opt['page']-1)*$opt['limit'],$opt['limit']),
  4526.       'adjustment'=>$adjustments,
  4527.       'total'=>$c
  4528.     );
  4529.   }
  4530.   private function _lefts($options){
  4531.     $default=array(
  4532.       'user'=>null,
  4533.       'start'=>date('Y').'-01-01',
  4534.       'end'=>date('Y').'-12-31'
  4535.     );
  4536.     $opt=$default;
  4537.     foreach($options as $k=>$v){$opt[$k]=$v;}
  4538.     $em $this->entityManager;
  4539.     $yr=new \DateTime($opt['start']);
  4540.     $yr=$yr->format('Y');
  4541.     $yr=$yr-1;
  4542.     $years=array();
  4543.     $yre=new \DateTime($opt['end']);
  4544.     $yre=$yre->format('Y');
  4545.     for($i=$yr;$i<=$yre;$i++){
  4546.       $years[count($years)]=$i;
  4547.     }
  4548.     $oldsearch=array('year' => $years);
  4549.     if(!is_null($opt['user'])){ $oldsearch['user']=$opt['user']; }
  4550.     $leavesold $em->getRepository(\App\Entity\LeaveEntitlement::class)->findBy($oldsearch);
  4551.     
  4552.     $lefts = array();
  4553.     $entbyid = array();
  4554.     $now=new \DateTime(date('Y-m-d'));
  4555.     $leavea=array();
  4556.     foreach ($leavesold as $l) {
  4557.       if(!isset($leavea['u'.$l->getUser()->getId()])){
  4558.         $leavea['u'.$l->getUser()->getId()]=array(); 
  4559.       }
  4560.       if(!isset($leavea['u'.$l->getUser()->getId()]['y'.$l->getYear()])){
  4561.         $leavea['u'.$l->getUser()->getId()]['y'.$l->getYear()]=array(); 
  4562.       }
  4563.       $leavea['u'.$l->getUser()->getId()]['y'.$l->getYear()]['t'.$l->getLeaveType()->getId()]=$l
  4564.     } 
  4565.     foreach ($leavesold as $l) {
  4566.         $uid $l->getUser()->getId();
  4567.         $pr $l->getParent();
  4568.         if (($pr == null) || ($pr == 0)) {
  4569.           if (!isset($lefts['u' $uid])) {
  4570.               $lefts['u' $uid] = array();
  4571.           }
  4572.           if (!isset($lefts['u' $uid]['y' $l->getYear()])) {
  4573.               $lefts['u' $uid]['y' $l->getYear()] = array();
  4574.           }
  4575.           $attr=$l->getAttributes();
  4576.           if(isset($attr['given']) && isset($attr['expires'])){
  4577.             if(is_array($attr['given'])){
  4578.               $gv=new \DateTime($attr['given']['date']);
  4579.             }else{
  4580.               $gv=new \DateTime($attr['given']);
  4581.             }
  4582.             if(is_array($attr['expires'])){
  4583.               $exp=new \DateTime($attr['expires']['date']);
  4584.             }else{
  4585.               $exp=new \DateTime($attr['expires']);
  4586.             }
  4587.             if(($exp >= $now) && ($gv <= $now)){
  4588.               if(!isset($lefts['u' $uid]['y' $l->getYear()]['t' $l->getLeaveType()->getId()])){
  4589.                 $lefts['u' $uid]['y' $l->getYear()]['t' $l->getLeaveType()->getId()]=0;
  4590.               }
  4591.               $lf $l->getLeaveLeft();
  4592.               $lefts['u' $uid]['y' $l->getYear()]['t' $l->getLeaveType()->getId()] += ($lf*1);
  4593.             }
  4594.           }else{
  4595.             if(!isset($lefts['u' $uid]['y' $l->getYear()]['t' $l->getLeaveType()->getId()])){
  4596.               $lefts['u' $uid]['y' $l->getYear()]['t' $l->getLeaveType()->getId()]=0;
  4597.             }
  4598.             $lf $l->getLeaveLeft();
  4599.             $lefts['u' $uid]['y' $l->getYear()]['t' $l->getLeaveType()->getId()] += ($lf*1);
  4600.           }
  4601.           
  4602.           if(isset($leavea['u'.$uid])){
  4603.             if(isset($leavea['u'.$uid]['y'.($l->getYear()-1)])){
  4604.               if(isset($leavea['u'.$uid]['y'.($l->getYear()-1)]['t'.$l->getLeaveType()->getId()])){
  4605.                 $l2=$leavea['u'.$uid]['y'.($l->getYear()-1)]['t'.$l->getLeaveType()->getId()];
  4606.                 $attr2=$l2->getAttributes();
  4607.                 if(isset($attr2['given']) && isset($attr2['expires'])){
  4608.                   if(is_array($attr2['given'])){
  4609.                     $gv=new \DateTime($attr2['given']['date']);
  4610.                   }else{
  4611.                     $gv=new \DateTime($attr2['given']);
  4612.                   }
  4613.                   if(is_array($attr2['expires'])){
  4614.                     $exp=new \DateTime($attr2['expires']['date']);
  4615.                   }else{
  4616.                     $exp=new \DateTime($attr2['expires']);
  4617.                   }
  4618.                   if(($exp >= $now) && ($gv <= $now)){
  4619.                     $lf $l2->getLeaveLeft();
  4620.                     if(!isset($lefts['u' $uid]['y' $l->getYear()]['t' $l->getLeaveType()->getId()])){
  4621.                       $lefts['u' $uid]['y' $l->getYear()]['t' $l->getLeaveType()->getId()]=0;
  4622.                     }
  4623.                     $lefts['u' $uid]['y' $l->getYear()]['t' $l->getLeaveType()->getId()] += ($lf*1);
  4624.                   }
  4625.                 }  
  4626.               }
  4627.             }
  4628.           }
  4629.         }  
  4630.         $entbyid['c'.$l->getId()] = $l;
  4631.     }
  4632.     foreach ($leavesold as $l) {
  4633.         $pr $l->getParent();
  4634.         if (($pr != null) && ($pr != 0)) {
  4635.           if(isset($entbyid['c'.$pr])){
  4636.             $ll $entbyid['c'.$pr];
  4637.             $uid $ll->getUser()->getId();
  4638.             $lf $l->getLeaveLeft();
  4639.             if(isset($lefts['u' $uid]['y' $ll->getYear()]['t' $ll->getLeaveType()->getId()])){
  4640.               $attr=$l->getAttributes();
  4641.               if(isset($attr['given']) && isset($attr['expires'])){
  4642.                 if(is_array($attr['given'])){
  4643.                   $gv=new \DateTime($attr['given']['date']);
  4644.                 }else{
  4645.                   $gv=new \DateTime($attr['given']);
  4646.                 }
  4647.                 if(is_array($attr['expires'])){
  4648.                   $exp=new \DateTime($attr['expires']['date']);
  4649.                 }else{
  4650.                   $exp=new \DateTime($attr['expires']);
  4651.                 } 
  4652.                 if(($exp >= $now) && ($gv <= $now)){
  4653.                   if(!isset($lefts['u' $uid]['y' $ll->getYear()]['t' $ll->getLeaveType()->getId()])){
  4654.                     $lefts['u' $uid]['y' $ll->getYear()]['t' $ll->getLeaveType()->getId()]=0;
  4655.                   }
  4656.                   $lefts['u' $uid]['y' $ll->getYear()]['t' $ll->getLeaveType()->getId()] += ($lf*1);
  4657.                 }  
  4658.               }else{
  4659.                 if(!isset($lefts['u' $uid]['y' $ll->getYear()]['t' $ll->getLeaveType()->getId()])){
  4660.                   $lefts['u' $uid]['y' $ll->getYear()]['t' $ll->getLeaveType()->getId()]=0;
  4661.                 }
  4662.                 $lefts['u' $uid]['y' $ll->getYear()]['t' $ll->getLeaveType()->getId()] += ($lf*1);
  4663.                 
  4664.               }  
  4665.             }
  4666.             if(isset($leavea['u'.$uid])){
  4667.               if(isset($leavea['u'.$uid]['y'.($ll->getYear()-1)])){
  4668.                 if(isset($leavea['u'.$uid]['y'.($ll->getYear()-1)]['t'.$l->getLeaveType()->getId()])){
  4669.                   $l2=$leavea['u'.$uid]['y'.($l->getYear()-1)]['t'.$l->getLeaveType()->getId()];
  4670.                   $attr2=$l2->getAttributes();
  4671.                   if(isset($attr2['given']) && isset($attr2['expires'])){
  4672.                     if(is_array($attr2['given'])){
  4673.                       $gv=new \DateTime($attr2['given']['date']);
  4674.                     }else{
  4675.                       $gv=new \DateTime($attr2['given']);
  4676.                     }
  4677.                     if(is_array($attr2['expires'])){
  4678.                       $exp=new \DateTime($attr2['expires']['date']);
  4679.                     }else{
  4680.                       $exp=new \DateTime($attr2['expires']);
  4681.                     }
  4682.                     if(($exp >= $now) && ($gv <= $now)){
  4683.                       $lf $l2->getLeaveLeft();
  4684.                       if(!isset($lefts['u' $uid]['y' $ll->getYear()]['t' $ll->getLeaveType()->getId()])){
  4685.                         $lefts['u' $uid]['y' $ll->getYear()]['t' $ll->getLeaveType()->getId()]=0;
  4686.                       }
  4687.                       $lefts['u' $uid]['y' $ll->getYear()]['t' $ll->getLeaveType()->getId()] += ($lf*1);
  4688.                     }
  4689.                   }  
  4690.                 }
  4691.               }
  4692.             }
  4693.           }  
  4694.         }
  4695.     }
  4696.     return $lefts;
  4697.   }
  4698.   private function _countDays($start,$end$country,$am=false,$pm=false){
  4699.     $em $this->entityManager;
  4700.     $startdate=new \DateTime($start);
  4701.     $enddate=new \DateTime($end);
  4702.     $offday = array(06);
  4703.     $holidayrp $em->getRepository(\App\Entity\LeaveBankHoliday::class)->findBy(array('location' => $country));
  4704.     $holiday = array();
  4705.     foreach ($holidayrp as $h) {
  4706.       if(!is_null($h->getEndDate())){
  4707.         $dte = new \DateTime($h->getEndDate()->format('Y-m-d'));
  4708.         $dtex=new \DateTime($h->getDate()->format('Y-m-d'));
  4709.         while($dtex <= $dte){
  4710.           $holiday[count($holiday)] = $dtex->format('Y-m-d');
  4711.           $dtex->modify('+1 day');
  4712.         }
  4713.       }else{
  4714.         $dtex=new \DateTime($h->getDate()->format('Y-m-d'));
  4715.         $holiday[count($holiday)] = $dtex->format('Y-m-d');
  4716.       } 
  4717.     }
  4718.     $daterange $startdate->diff($enddate);
  4719.     $daterange $daterange->format('%a');
  4720.     $daterange $daterange 1;
  4721.     $days=0;
  4722.     $date=new \DateTime($start);
  4723.     for ($d 0$d $daterange$d++) {
  4724.       $ok=true;
  4725.       $w $date->format('w');
  4726.       $h $date->format('Y-m-d');
  4727.       if (in_array($w$offday)) {$ok false;}
  4728.       if (in_array($h$holiday)) {$ok false;}
  4729.       if($ok){
  4730.         $cutam 0;
  4731.         $cutpm 0;
  4732.         if (($d == 0) && ($am)){$cutam 0.5;}
  4733.         if ($d == ($daterange 1) && ($pm)) {$cutpm 0.5;}
  4734.         $days++;
  4735.         $days=$days-$cutam;
  4736.         $days=$days-$cutpm;
  4737.       }
  4738.       $date->modify('+1 day');  
  4739.     }
  4740.     if($days 1){$days=0.5;}
  4741.     return $days;
  4742.   }
  4743.   public function leaveRequest($option=array()){
  4744.     $default=array(
  4745.       'user'=>null,
  4746.       'office'=>'',
  4747.       'leaveType'=>'',
  4748.       'leaveStatus'=>'',
  4749.       'page'=>1,
  4750.       'limit'=>20,
  4751.       'keyword'=>'',
  4752.       'order'=>'',
  4753.       'orderBy'=>'',
  4754.       'start'=>date('Y').'-01-01',
  4755.       'end'=>date('Y').'-12-31',
  4756.       'manager'=>''
  4757.     );
  4758.     $opt=$default;
  4759.     $em $this->entityManager;
  4760.     //$opt['user']=$em->getRepository(\App\Entity\User::class)->find(51);
  4761.     foreach($option as $k=>$v){$opt[$k]=$v;}
  4762.     if(($opt['start']=='') || is_null($opt['start'])){$opt['start']=date('Y').'-01-01';}
  4763.     if(($opt['end']=='') || is_null($opt['end'])){$opt['end']=date('Y').'-12-31';}
  4764.     
  4765.     $leaveRequest $em->getRepository(LeaveRequest::class)->findByPage($opt['page'], $opt['limit'], $opt['keyword'], $opt['order'], $opt['orderBy'], $opt['manager'], $opt['leaveStatus'],$opt['leaveType'],$opt['office'],$opt['start'],$opt['end'],$opt['user']);
  4766.     $leaveRequestTotal $em->getRepository(LeaveRequest::class)->countByPage($opt['keyword'], $opt['manager'], $opt['leaveStatus'],$opt['leaveType'],$opt['office'],$opt['start'],$opt['end'],$opt['user']);
  4767.     $yr=new \DateTime($opt['start']);
  4768.     $yr=$yr->format('Y');
  4769.     $yr=$yr-1;
  4770.     $years=array();
  4771.     $yre=new \DateTime($opt['end']);
  4772.     $yre=$yre->format('Y');
  4773.     for($i=$yr;$i<=$yre;$i++){
  4774.       $years[count($years)]=$i;
  4775.     }
  4776.     $oldsearch=array('year' => $years);
  4777.     if(!is_null($opt['user'])){ $oldsearch['user']=$opt['user']; }
  4778.     $leavesold $em->getRepository(LeaveEntitlement::class)->findBy($oldsearch);
  4779.     
  4780.     $lefts = array();
  4781.     $entbyid = array();
  4782.     $now=new \DateTime(date('Y-m-d'));
  4783.     $leavea=array();
  4784.     foreach ($leavesold as $l) {
  4785.       if(!isset($leavea['u'.$l->getUser()->getId()])){
  4786.         $leavea['u'.$l->getUser()->getId()]=array(); 
  4787.       }
  4788.       if(!isset($leavea['u'.$l->getUser()->getId()]['y'.$l->getYear()])){
  4789.         $leavea['u'.$l->getUser()->getId()]['y'.$l->getYear()]=array(); 
  4790.       }
  4791.       $leavea['u'.$l->getUser()->getId()]['y'.$l->getYear()]['t'.$l->getLeaveType()->getId()]=$l
  4792.     }  
  4793.     foreach ($leavesold as $l) {
  4794.         $uid $l->getUser()->getId();
  4795.         $pr $l->getParent();
  4796.         if (($pr == null) || ($pr == 0)) {
  4797.           if (!isset($lefts['u' $uid])) {
  4798.               $lefts['u' $uid] = array();
  4799.           }
  4800.           if (!isset($lefts['u' $uid]['y' $l->getYear()])) {
  4801.               $lefts['u' $uid]['y' $l->getYear()] = array();
  4802.           }
  4803.           $attr=$l->getAttributes();
  4804.           if(isset($attr['given']) && isset($attr['expires'])){
  4805.             if(is_array($attr['given'])){
  4806.               $gv=new \DateTime($attr['given']['date']);
  4807.             }else{
  4808.               $gv=new \DateTime($attr['given']);
  4809.             }
  4810.             if(is_array($attr['expires'])){
  4811.               $exp=new \DateTime($attr['expires']['date']);
  4812.             }else{
  4813.               $exp=new \DateTime($attr['expires']);
  4814.             }
  4815.             if(($exp >= $now) && ($gv <= $now)){
  4816.               if(!isset($lefts['u' $uid]['y' $l->getYear()]['t' $l->getLeaveType()->getId()])){
  4817.                 $lefts['u' $uid]['y' $l->getYear()]['t' $l->getLeaveType()->getId()]=0;
  4818.               }
  4819.               $lf $l->getLeaveLeft();
  4820.               $lefts['u' $uid]['y' $l->getYear()]['t' $l->getLeaveType()->getId()] += ($lf*1);
  4821.             }
  4822.           }else{
  4823.             if(!isset($lefts['u' $uid]['y' $l->getYear()]['t' $l->getLeaveType()->getId()])){
  4824.               $lefts['u' $uid]['y' $l->getYear()]['t' $l->getLeaveType()->getId()]=0;
  4825.             }
  4826.             $lf $l->getLeaveLeft();
  4827.             $lefts['u' $uid]['y' $l->getYear()]['t' $l->getLeaveType()->getId()] += ($lf*1);
  4828.           }
  4829.           
  4830.           if(isset($leavea['u'.$uid])){
  4831.             if(isset($leavea['u'.$uid]['y'.($l->getYear()-1)])){
  4832.               if(isset($leavea['u'.$uid]['y'.($l->getYear()-1)]['t'.$l->getLeaveType()->getId()])){
  4833.                 $l2=$leavea['u'.$uid]['y'.($l->getYear()-1)]['t'.$l->getLeaveType()->getId()];
  4834.                 $attr2=$l2->getAttributes();
  4835.                 if(isset($attr2['given']) && isset($attr2['expires'])){
  4836.                   if(is_array($attr2['given'])){
  4837.                     $gv=new \DateTime($attr2['given']['date']);
  4838.                   }else{
  4839.                     $gv=new \DateTime($attr2['given']);
  4840.                   }
  4841.                   if(is_array($attr2['expires'])){
  4842.                     $exp=new \DateTime($attr2['expires']['date']);
  4843.                   }else{
  4844.                     $exp=new \DateTime($attr2['expires']);
  4845.                   }
  4846.                   if(($exp >= $now) && ($gv <= $now)){
  4847.                     $lf $l2->getLeaveLeft();
  4848.                     if(!isset($lefts['u' $uid]['y' $l->getYear()]['t' $l->getLeaveType()->getId()])){
  4849.                       $lefts['u' $uid]['y' $l->getYear()]['t' $l->getLeaveType()->getId()]=0;
  4850.                     }
  4851.                     $lefts['u' $uid]['y' $l->getYear()]['t' $l->getLeaveType()->getId()] += ($lf*1);
  4852.                   }
  4853.                 }  
  4854.               }
  4855.             }
  4856.           }
  4857.           
  4858.         }  
  4859.         $entbyid['c'.$l->getId()] = $l;
  4860.     }
  4861.    
  4862.     foreach ($leavesold as $l) {
  4863.         $pr $l->getParent();
  4864.         if (($pr != null) && ($pr != 0)) {
  4865.           if(isset($entbyid['c'.$pr])){
  4866.             $ll $entbyid['c'.$pr];
  4867.             $uid $ll->getUser()->getId();
  4868.             $lf $l->getLeaveLeft();
  4869.             if(isset($lefts['u' $uid]['y' $ll->getYear()]['t' $ll->getLeaveType()->getId()])){
  4870.               $attr=$l->getAttributes();
  4871.               if(isset($attr['given']) && isset($attr['expires'])){
  4872.                 if(is_array($attr['given'])){
  4873.                   $gv=new \DateTime($attr['given']['date']);
  4874.                 }else{
  4875.                   $gv=new \DateTime($attr['given']);
  4876.                 }
  4877.                 if(is_array($attr['expires'])){
  4878.                   $exp=new \DateTime($attr['expires']['date']);
  4879.                 }else{
  4880.                   $exp=new \DateTime($attr['expires']);
  4881.                 } 
  4882.                 if(($exp >= $now) && ($gv <= $now)){
  4883.                   if(!isset($lefts['u' $uid]['y' $ll->getYear()]['t' $ll->getLeaveType()->getId()])){
  4884.                     $lefts['u' $uid]['y' $ll->getYear()]['t' $ll->getLeaveType()->getId()]=0;
  4885.                   }
  4886.                   $lefts['u' $uid]['y' $ll->getYear()]['t' $ll->getLeaveType()->getId()] += ($lf*1);
  4887.                 }  
  4888.               }else{
  4889.                 if(!isset($lefts['u' $uid]['y' $ll->getYear()]['t' $ll->getLeaveType()->getId()])){
  4890.                   $lefts['u' $uid]['y' $ll->getYear()]['t' $ll->getLeaveType()->getId()]=0;
  4891.                 }
  4892.                 $lefts['u' $uid]['y' $ll->getYear()]['t' $ll->getLeaveType()->getId()] += ($lf*1);
  4893.                 
  4894.               }  
  4895.             }
  4896.             if(isset($leavea['u'.$uid])){
  4897.               if(isset($leavea['u'.$uid]['y'.($ll->getYear()-1)])){
  4898.                 if(isset($leavea['u'.$uid]['y'.($ll->getYear()-1)]['t'.$l->getLeaveType()->getId()])){
  4899.                   $l2=$leavea['u'.$uid]['y'.($l->getYear()-1)]['t'.$l->getLeaveType()->getId()];
  4900.                   $attr2=$l2->getAttributes();
  4901.                   if(isset($attr2['given']) && isset($attr2['expires'])){
  4902.                     if(is_array($attr2['given'])){
  4903.                       $gv=new \DateTime($attr2['given']['date']);
  4904.                     }else{
  4905.                       $gv=new \DateTime($attr2['given']);
  4906.                     }
  4907.                     if(is_array($attr2['expires'])){
  4908.                       $exp=new \DateTime($attr2['expires']['date']);
  4909.                     }else{
  4910.                       $exp=new \DateTime($attr2['expires']);
  4911.                     }
  4912.                     if(($exp >= $now) && ($gv <= $now)){
  4913.                       $lf $l2->getLeaveLeft();
  4914.                       if(!isset($lefts['u' $uid]['y' $ll->getYear()]['t' $ll->getLeaveType()->getId()])){
  4915.                         $lefts['u' $uid]['y' $ll->getYear()]['t' $ll->getLeaveType()->getId()]=0;
  4916.                       }
  4917.                       $lefts['u' $uid]['y' $ll->getYear()]['t' $ll->getLeaveType()->getId()] += ($lf*1);
  4918.                     }
  4919.                   }  
  4920.                 }
  4921.               }
  4922.             }
  4923.           }
  4924.         }
  4925.     }
  4926.     
  4927.     
  4928.     
  4929.     $leaves=array();
  4930.     $em $this->entityManager;
  4931.     foreach($leaveRequest as $l){
  4932.       $uid=$l->getUser()->getId();
  4933.       $ty=$l->getLeaveType()->getId();
  4934.       $yrx=$l->getStartDate();
  4935.       $yrx=$yrx->format('Y');
  4936.       if($l->getDays()==0){
  4937.         if(!is_null($l->getIsApproved())){
  4938.           if($l->getIsApproved()==false){
  4939.             $days=$this->_countDays($l->getStartDate()->format('Y-m-d'),$l->getEndDate()->format('Y-m-d'),$l->getUser()->getOffice()->getCountry(),$l->getIsHalfStart(),$l->getIsHalfEnd());
  4940.             $l->setDays($days);
  4941.             $em->persist($l);
  4942.             $em->flush();
  4943.           }
  4944.         }
  4945.       }  
  4946.       $c=count($leaves);
  4947.       $cl=clone $l;
  4948.       $leaves[$c]=$cl;
  4949.       if(isset($lefts['u'.$uid]['y'.$yrx]['t'.$ty])){
  4950.         $dy=$lefts['u'.$uid]['y'.$yrx]['t'.$ty];
  4951.       }else{
  4952.         $dy=0;
  4953.       }
  4954.       
  4955.       $leaves[$c]->setDaysLeft($dy);
  4956.       
  4957.     }
  4958.     /*if(!is_null($opt['user'])){
  4959.       $email=$opt['user']->getEmail();
  4960.       //joan.ilari@mediatropy.com
  4961.       
  4962.       if($email == 'very.sukawirawan@mediatropy.com'){
  4963.           $hf=fopen('../var/log/test.log','a');
  4964.           ob_start();
  4965.           print_r($leaveRequestTotal."\n");
  4966.           foreach($leaves as $l){
  4967.             print_r($email.':'.$l->getLeaveType()->getLeaveName().':');
  4968.             print_r($l->getStartDate()->format('Y-m-d'));
  4969.             print_r("\n");
  4970.           }
  4971.           $txt=ob_get_clean();
  4972.           fwrite($hf,$txt);
  4973.           fclose($hf);
  4974.       }
  4975.     }*/
  4976.     if(count($leaves) > $leaveRequestTotal){$leaveRequestTotal=count($leaves);}
  4977.     return(array(
  4978.       'data'=>$leaves,
  4979.       'total'=>$leaveRequestTotal
  4980.     ));
  4981.   }
  4982.   /*public function _prorate($joindate,$endyear,$max,$country=''){
  4983.     $endyear=new \DateTime($endyear);
  4984.     $joindate=new \DateTime($joindate);
  4985.     if($country==='VN'){
  4986.       $ey= $endyear->format('Y').'-'.$joindate->format('m-d');
  4987.       $endyear=new \DateTime($ey);
  4988.     }
  4989.     $diff=$endyear->diff($joindate);
  4990.     $month=($diff->y * 12)+$diff->m;
  4991.     $date=intval($joindate->format('d'));
  4992.     if($date==1){$month+=1;}
  4993.     $prorate=round(($month/12)*$max);
  4994.     if(($country==='VN') && ($month < 12)){$prorate=5;}
  4995.     if($prorate > $max){$prorate=$max;}
  4996.   
  4997.     return $prorate;
  4998.   }*/
  4999.     /* Save Enteltainment Part */
  5000.     public function _prorate($joindate,$endyear,$max,$config=array(),$isprorate=true){
  5001.       $endyear=new \DateTime($endyear);
  5002.       $joindate=new \DateTime($joindate);
  5003.       $diff=$endyear->diff($joindate);
  5004.       $month=($diff->12)+$diff->m;
  5005.       $date=intval($joindate->format('d'));
  5006.       if($date==1){$month+=1;}
  5007.       $prorate=round(($month/12)*$max);
  5008.       /*  
  5009.        * use config from atrribute for country role exp config
  5010.         "config":[{
  5011.           "start": 1,
  5012.           "end": 3,
  5013.           "days": "default",
  5014.           
  5015.         },
  5016.         {
  5017.           "start": 3
  5018.           "end": 9999,
  5019.           "days": 15,
  5020.           
  5021.         }]
  5022.         from 1year to 3year got default base on set days, 3year onward get 15 days
  5023.        */
  5024.   
  5025.       if(count($config) > 0){
  5026.         foreach($config as $c){
  5027.           $c['start']=$c['start']*12;
  5028.           $c['end']=$c['end']*12;
  5029.           if($c['days']=='default'){$c['days']=$max;}
  5030.           if(($month >= $c['start']) && ($month <= $c['end'])){
  5031.             $max=$c['days'];
  5032.             if(!$isprorate){$prorate=$c['days'];}
  5033.           }
  5034.         }
  5035.       } 
  5036.       if(($prorate $max) || (!$isprorate)){$prorate=$max;}
  5037.     
  5038.       return $prorate;
  5039.     }
  5040.   
  5041.     public function GenerateDefaultType($office){
  5042.       //load leave configuration from json file
  5043.       $fp=file_get_contents($this->params->get('kernel.project_dir').'/leave.json','r');
  5044.       $leaveconfig=array();
  5045.       if($fp!==false){
  5046.         $leaveconfig=json_decode($fp,true);
  5047.       }
  5048.       $list=array();
  5049.       foreach($leaveconfig as $k=>$v){
  5050.         $v['name']=$k;
  5051.         $this->SaveType(array(
  5052.             'office'=>$office,
  5053.             'leave'=>$v,
  5054.             'changedays'=>false
  5055.         ));
  5056.       }
  5057.     }
  5058.     public function SaveType($option=array()){
  5059.       $default=array(
  5060.         'office'=>null,
  5061.         'leave'=>null,
  5062.         'changedays'=>true
  5063.       );
  5064.      
  5065.       $opt=$default;
  5066.       /*$handle=fopen($this->params->get('kernel.project_dir').'/var/log/testx.log','w');
  5067.       ob_start();
  5068.       
  5069.       $txt=ob_get_clean();
  5070.       fwrite($handle,$txt);
  5071.       fclose($handle);*/
  5072.       foreach($option as $k=>$v){$opt[$k]=$v;}
  5073.       if(is_null($opt['office'])){return;}
  5074.       if(is_null($opt['leave'])){
  5075.         $this->GenerateDefaultType($opt['office']);
  5076.       }
  5077.       if(is_null($opt['office']) && (is_null($opt['leave']))){
  5078.         return;
  5079.       }
  5080.       if(!isset($opt['leave']['name'])){return;}
  5081.       $em $this->entityManager;
  5082.       
  5083.       $arg=array(
  5084.         'office'=>$opt['office'],
  5085.       );
  5086.       $leavetype=null;
  5087.       $list=array();
  5088.       $officetype=$em->getRepository(\App\Entity\LeaveType::class)->findBy($arg);
  5089.       if(!is_null($officetype)){
  5090.           foreach($officetype as $l){
  5091.             $list[$l->getLeaveName()]=$l;
  5092.           }
  5093.       }
  5094.       $leavetype=isset($list[$opt['leave']['name']])?$list[$opt['leave']['name']]:null;
  5095.       if(is_null($leavetype)){
  5096.         $leavetype=new \App\Entity\LeaveType();
  5097.         $leavetype->setIsMandatory(isset($opt['leave']['IsMandatory'])?$opt['leave']['IsMandatory']:true);
  5098.         $leavetype->setIsActive(isset($opt['leave']['IsActive'])?$opt['leave']['IsActive']:true);
  5099.         $leavetype->setLeaveName($opt['leave']['name']);
  5100.         $leavetype->setOffice($opt['office']);
  5101.         $attr=array(
  5102.           'mode'=>'fix',
  5103.           'hide'=>false,
  5104.           'label'=>isset($opt['leave']['Label'])?$opt['leave']['Label']:$opt['leave']['name']
  5105.         );
  5106.         if(isset($opt['leave']['Attributes'])){
  5107.           foreach($opt['leave']['Attributes'] as $kl => $vl){
  5108.             if(!isset($attr[$kl])){$attr[$kl]=$vl;}
  5109.           }
  5110.         }
  5111.         $leavetype->setAttributes($attr);
  5112.         $leavetype->setDays(isset($opt['leave']['Days'])?$opt['leave']['Days']:0);
  5113.         if(isset($opt['leave']['Parent'])){
  5114.           if(isset($list[$opt['leave']['Parent']])){
  5115.             $leavetype->setParent($list[$opt['leave']['Parent']]->getId());
  5116.           }
  5117.         }
  5118.       }else{
  5119.         
  5120.         $attr=$leavetype->getAttributes();
  5121.         if(isset($opt['leave']['Attributes'])){;
  5122.           foreach($opt['leave']['Attributes'] as $kl => $vl){
  5123.             if(!isset($attr[$kl])){
  5124.               $attr[$kl]=$vl;
  5125.             }
  5126.           }
  5127.         }
  5128.         $leavetype->setAttributes($attr);
  5129.         $days=$leavetype->getDays();
  5130.         $newtdays=$days;
  5131.         if($opt['changedays']){
  5132.           $newtdays=isset($opt['leave']['Days'])?$opt['leave']['Days']:$days;
  5133.         }
  5134.         $leavetype->setDays($newtdays);
  5135.         if(isset($opt['leave']['Parent'])){
  5136.           if(isset($list[$opt['leave']['Parent']])){
  5137.             $leavetype->setParent($list[$opt['leave']['Parent']]->getId());
  5138.           }
  5139.         }
  5140.         $leavetype->setIsMandatory(isset($opt['leave']['IsMandatory'])?$opt['leave']['IsMandatory']:true);
  5141.         $leavetype->setIsActive(isset($opt['leave']['IsActive'])?$opt['leave']['IsActive']:true);
  5142.       }
  5143.       $em->persist($leavetype);
  5144.       $em->flush();
  5145.       /*if(!is_null($opt['office'])){
  5146.         $this->saveLeaveEntitlement2(array('office'=>$opt['office']));
  5147.       }*/
  5148.     }
  5149.   
  5150.     public function saveLeaveEntitlement2($option=array()){
  5151.       $default=array(
  5152.         'office'=>null,
  5153.         'user'=>null,
  5154.         'id'=>null,
  5155.         'year'=>date('Y'),
  5156.         'days'=>-1,
  5157.         'createby'=>null,
  5158.         'type'=>null,
  5159.         'nochange'=>false,
  5160.         'sameparent'=>false,
  5161.         'manual'=>false
  5162.       );
  5163.       $opt=$default;
  5164.       foreach($option as $k=>$v){$opt[$k]=$v;}
  5165.       if($opt['year']==''){$opt['year']=date('Y');}
  5166.       $em $this->entityManager;
  5167.       $entleave=null;
  5168.       if($opt['id']){
  5169.         $entleave=$em->getRepository(\App\Entity\LeaveEntitlement::class)->findBy(array('id'=>$opt['id']));
  5170.         if(is_null($entleave)){return;}
  5171.         
  5172.         foreach($entleave as $e){
  5173.           if($opt['days'] < 0){
  5174.             $opt['days']=$e->getDays();
  5175.           }  
  5176.           $opt['user']=$e->getUser();
  5177.           $opt['type']=$e->getLeaveType()->getLeaveName();
  5178.           $opt['year']=$e->getYear();
  5179.         }
  5180.       }
  5181.   
  5182.       if(!is_null($opt['user'])){$opt['office']=$opt['user']->getOffice();}
  5183.       if(is_null($opt['office'])){
  5184.         $levetypes=$em->getRepository(\App\Entity\LeaveType::class)->findAll();
  5185.       }else{
  5186.         $levetypes=$em->getRepository(\App\Entity\LeaveType::class)->findBy(array('office'=>$opt['office']));
  5187.       }
  5188.       //arange type by office and leave name
  5189.       $typelist=array();
  5190.       $typelistbyid=array();
  5191.       foreach($levetypes as $l){
  5192.         $oid=$l->getOffice()->getId();
  5193.         if(!isset($typelist['o'.$oid])){$typelist['o'.$oid]=array();}
  5194.         $typelist['o'.$oid][$l->getLeaveName()]=$l;
  5195.         $typelistbyid['t'.$l->getId()]=$l;
  5196.       }
  5197.   
  5198.       
  5199.       if(is_null($entleave)){
  5200.         if(is_null($opt['user'])){
  5201.           $uarg=array(
  5202.             'isActive'=>true,
  5203.           );
  5204.           //load user by spesic office
  5205.           if(!is_null($opt['office'])){$uarg['office']=$opt['office'];}
  5206.           $opt['user']=$em->getRepository(\App\Entity\User::class)->findBy($uarg);
  5207.         }
  5208.         $userlist=array();
  5209.         if(!is_array($opt['user'])){$opt['user']=array($opt['user']);}
  5210.         foreach($opt['user'] as $u){
  5211.          $userlist[count($userlist)]=$u->getId();
  5212.         }
  5213.         $entleave=$em->getRepository(\App\Entity\LeaveEntitlement::class)->findBy(array('year'=>$opt['year'],'user'=>$userlist));
  5214.       }  
  5215.   
  5216.         $entlist=array();
  5217.         if(!is_null($entleave)){
  5218.           //arrange enteltainment by user year and type
  5219.           foreach($entleave as $l){
  5220.             $uid=$l->getUser()->getId();
  5221.             $oid=$l->getUser()->getOffice()->getId();
  5222.             $y=$l->getYear();
  5223.             $tid=$l->getLeaveType()->getId();
  5224.             $oty=$tid;
  5225.             if(!is_null($opt['type'])){
  5226.               $oty=$typelist['o'.$oid][$opt['type']]->getId();
  5227.             }
  5228.             
  5229.             //if($oty==$tid){
  5230.               if(!isset($entlist['u'.$uid])){$entlist['u'.$uid]=array();}
  5231.               if(!isset($entlist['u'.$uid]['y'.$y])){$entlist['u'.$uid]['y'.$y]=array();}
  5232.               $entlist['u'.$uid]['y'.$y]['t'.$tid]=$l;
  5233.             //}  
  5234.           }
  5235.         }
  5236.   
  5237.         if(!is_array($opt['user'])){$opt['user']=array($opt['user']);}
  5238.   
  5239.         foreach($opt['user'] as $u){
  5240.           $uid=$u->getId();
  5241.           $uoffice=$u->getOffice();
  5242.           if(!is_null($uoffice)){
  5243.             $oid=$uoffice->getId();
  5244.             if(isset($typelist['o'.$oid])){
  5245.               if(is_array($typelist['o'.$oid])){
  5246.                 foreach($typelist['o'.$oid] as $ko=>$vo){
  5247.                   $oty=$ko;
  5248.                   if(!is_null($opt['type'])){$oty=$opt['type'];}
  5249.                   //do as requested type
  5250.                   $runit=true;
  5251.                   $xvoattr=$vo->getAttributes();
  5252.                   if($ko!=$oty){$runit=false;}
  5253.                   if(isset($xvoattr['noadd'])){
  5254.                     if($xvoattr['noadd'] && is_null($opt['type'])){$runit=false;}
  5255.                   }
  5256.                   
  5257.                   if($runit){
  5258.                     $tid=$vo->getId();
  5259.                     $newleave=false;
  5260.                     $hasparent=false;
  5261.                     $parentdays=0;
  5262.                     if(isset($entlist['u'.$uid]['y'.$opt['year']]['t'.$tid])){
  5263.                       $leaveuse=$entlist['u'.$uid]['y'.$opt['year']]['t'.$tid];
  5264.                     }else{
  5265.                       $newleave=true;
  5266.                       $leaveuse=new \App\Entity\LeaveEntitlement();
  5267.                       $leaveuse->setUser($u);
  5268.                       $leaveuse->setYear($opt['year']);
  5269.                       $leaveuse->setLeaveType($vo);
  5270.                       $leaveuse->setCreatedAt(new \DateTime());
  5271.                       $leaveuse->setCreatedBy($opt['createby']);
  5272.                       $leaveuse->setIsActive(true);
  5273.                       $parent=$vo->getParent();
  5274.                       //child leave
  5275.                       if(!is_null($parent) && ($parent!=0)){
  5276.                         $hasparent=true;
  5277.                         if(isset($entlist['u'.$uid]['y'.$opt['year']]['t'.$parent])){
  5278.                           $leaveuse->setParent($entlist['u'.$uid]['y'.$opt['year']]['t'.$parent]->getId());
  5279.                           $parentdays=$entlist['u'.$uid]['y'.$opt['year']]['t'.$parent]->getLeaveEntitlements();
  5280.                         }else{
  5281.                           //ad leave parent if not exist
  5282.                           $leaveparent=new \App\Entity\LeaveEntitlement();
  5283.                           $leaveparent->setUser($u);
  5284.                           $leaveparent->setYear($opt['year']);
  5285.                           $leaveparent->setLeaveType($typelistbyid['t'.$parent]);
  5286.                           //_attribute_set($dataAttributes, $year, $maxday,\App\Entity\User $user);
  5287.                           $voattr=$typelistbyid['t'.$parent]->getAttributes();
  5288.                           $pdays=$typelistbyid['t'.$parent]->getDays();
  5289.                           $parentdays=$pdays;
  5290.                           $attr=$this->_attribute_set($voattr,$opt['year'],$pdays,$u);
  5291.                           if($attr!==false){
  5292.                             $parentdays=$attr['days'];
  5293.                             $leaveparent->setLeaveEntitlements($attr['days']);
  5294.                             $leaveparent->setLeaveLeft($attr['days']);
  5295.                             $leaveparent->setAttributes($attr);
  5296.                             $leaveparent->setCreatedAt(new \DateTime());
  5297.                             $leaveparent->setCreatedBy($opt['createby']);
  5298.                             $leaveparent->setIsActive(true);
  5299.                             $em->persist($leaveparent);
  5300.                             $em->flush();
  5301.                             $entlist['u'.$uid]['y'.$opt['year']]['t'.$parent]=$leaveparent;
  5302.                             $leaveuse->setParent($entlist['u'.$uid]['y'.$opt['year']]['t'.$parent]->getId());
  5303.                           }  
  5304.                         }
  5305.                       }
  5306.                     }
  5307.   
  5308.                     $days=($opt['days'] < 0)?$vo->getDays():$opt['days'];
  5309.                     $attr=$this->_attribute_set($xvoattr,$opt['year'],$days,$u);
  5310.                     if(($opt['days'] > 0) && ($opt['manual']==true)){
  5311.                       $attr['days']=$opt['days'];
  5312.                     }
  5313.                     if(isset($xvoattr['followParent'])){
  5314.                       if(($xvoattr['followParent']===true) && ($hasparent) && ($opt['sameparent']===true)){
  5315.                         $attr['days']=$parentdays;
  5316.                       }
  5317.                     }
  5318.                     
  5319.                     if($attr!==false){
  5320.                       
  5321.                       $hasmanual=false;
  5322.                       if(isset($attr['manual'])){ $hasmanual=true;}
  5323.                       if($opt['manual']===true){$attr['manual']=true;}
  5324.                       $leaveuse->setAttributes($attr);
  5325.                       $odays=$leaveuse->getLeaveEntitlements();
  5326.                       $left=$leaveuse->getLeaveLeft();
  5327.                       $changeit=false;
  5328.                       if($opt['nochange']===false){$changeit=true;}
  5329.                       if($hasmanual===true){$changeit=false;}
  5330.                       
  5331.                       if($changeit || $newleave){
  5332.                         
  5333.                         if($opt['manual']===true){
  5334.                           $left=$left-($odays-$days);
  5335.                           $leaveuse->setLeaveEntitlements($days);
  5336.                         }else{
  5337.                           $left=$left-($odays-$attr['days']);
  5338.                           $leaveuse->setLeaveEntitlements($attr['days']);
  5339.                         }
  5340.                         $leaveuse->setLeaveLeft($left);
  5341.                         
  5342.                       }else{
  5343.                         
  5344.                         if($opt['manual']===true){
  5345.                           $left=$left-($odays-$days);
  5346.                           $leaveuse->setLeaveLeft($left);
  5347.                           $leaveuse->setLeaveEntitlements($days);
  5348.                         }
  5349.                       }
  5350.                       $em->persist($leaveuse);
  5351.                       $em->flush();
  5352.                       if(!isset($entlist['u'.$uid])){$entlist['u'.$uid]=array();}
  5353.                       if(!isset($entlist['u'.$uid]['y'.$opt['year']])){$entlist['u'.$uid]['y'.$opt['year']]=array();}
  5354.                       $entlist['u'.$uid]['y'.$opt['year']]['t'.$vo->getId()]=$leaveuse;
  5355.                     }  
  5356.                   }  
  5357.                 }
  5358.               } 
  5359.             }  
  5360.           }  
  5361.           
  5362.         }
  5363.       
  5364.         return $entleave;
  5365.     }
  5366.   
  5367.     function getRequest($option=array()){
  5368.       $yr=date('Y');
  5369.       $default=array(
  5370.         'from'=>$yr '-01-01',
  5371.         'to'=>($yr+1) . '-12-31',
  5372.         'user'=>null,
  5373.         'leavetype'=>null,
  5374.         'entitlement'=>null
  5375.       );
  5376.       $opt=$default;
  5377.       foreach($option as $k=>$v){$opt[$k]=$v;}
  5378.       if(!is_null($opt['entitlement'])){
  5379.         $attr=$opt['entitlement']->getAttributes();
  5380.         $opt['user']=$opt['entitlement']->getUser();
  5381.         $opt['leavetype']=$opt['entitlement']->getLeaveType();
  5382.         $yr=$opt['entitlement']->getYear();
  5383.         if(isset($attr['given'])){
  5384.           $opt['from'] = new \DateTime($attr['given']);
  5385.           $opt['from'] = $opt['from']->format('Y-m-d');
  5386.         }else{
  5387.           $opt['from']=$yr '-01-01';
  5388.         }
  5389.         if(isset($attr['expires'])){
  5390.           $opt['to'] = new \DateTime($attr['expires']);
  5391.           $opt['to']->modify('+3 months');
  5392.           $opt['to'] = $opt['to']->format('Y-m-d');
  5393.         }else{
  5394.           $opt['to']=($yr+1) . '-12-31';
  5395.         }
  5396.       }
  5397.       $mcs $this->entityManager->getRepository(\App\Entity\LeaveRequest::class)->createQueryBuilder('a')
  5398.           ->select('a')
  5399.           ->where('a.startDate >= :from')
  5400.           ->andWhere('a.startDate <= :to')
  5401.           ->setParameter('from', new \DateTime($opt['from']))
  5402.           ->setParameter('to', new \DateTime($opt['to']));
  5403.   
  5404.           if(!is_null($opt['user'])){
  5405.             $mcs->andWhere('a.user = :user')->setParameter('user',$opt['user']);
  5406.           }
  5407.           if(!is_null($opt['leavetype'])){
  5408.             $pr=$opt['leavetype']->getParent();
  5409.             if(($pr==0) || (is_null($pr))){$pr=$opt['leavetype']->getId();}
  5410.             $mcs->andWhere('a.leaveType = :leave')->setParameter('leave',  $pr);
  5411.           }
  5412.           //->andWhere('a.user = :user')
  5413.           //->andWhere('a.leaveType = :leave')
  5414.           //->andWhere('a.id = 1496')
  5415.           
  5416.           //->setParameter('user',  $user)
  5417.           //->setParameter('leave',  4)
  5418.           //->orderBy('a.startDate')
  5419.           
  5420.         
  5421.       return $mcs->getQuery()->getResult();
  5422.     }
  5423.   public function createLeaveEntitlement($option=array()){
  5424.     
  5425.     
  5426.     $default=array(
  5427.       "user"=>null,
  5428.       "office"=>null,
  5429.       "year"=>date('Y'),
  5430.     );
  5431.     $opt=$default;
  5432.     foreach($option as $k=>$v){$opt[$k]=$v;}
  5433.     if($opt['year']==''){$opt['year']=date('Y');}
  5434.     
  5435.     $uid=null;
  5436.     $ofid=null;
  5437.     $em $this->entityManager;
  5438.     if(!is_null($opt['user'])){
  5439.       $opt['office']=$opt['user']->getOffice();
  5440.       $uid=$opt['user']->getId();
  5441.     }
  5442.     $usr=null;
  5443.     if(!is_null($opt['office'])){
  5444.       $ofid=$opt['office']->getId();
  5445.     };
  5446.     if(!is_null($uid)){
  5447.       $usr=$em->getRepository(\App\Entity\User::class)->findBy(array('id'=>$uid));
  5448.     }else{
  5449.       if(!is_null($ofid)){
  5450.         $usr=$em->getRepository(\App\Entity\User::class)->findBy(array('office'=>$opt['office']));
  5451.       }else{  
  5452.         $usr=$em->getRepository(\App\Entity\User::class)->findAll();
  5453.       }  
  5454.     }
  5455.     
  5456.     $lvtype=null;
  5457.     if(!is_null($ofid)){
  5458.       $lvtype=$em->getRepository(\App\Entity\LeaveType::class)->findBy(array('office'=>$opt['office'],'parent'=>array(null,0)));
  5459.     }else{
  5460.       $lvtype=$em->getRepository(\App\Entity\LeaveType::class)->findBy(array('parent'=>array(null,0)));
  5461.     }
  5462.     $sc=array('year'=>$opt['year']);
  5463.     if(!is_null($opt['user'])){
  5464.       $sc['user']=$opt['user'];
  5465.     }
  5466.     $ent=$em->getRepository(\App\Entity\LeaveEntitlement::class)->findBy($sc);
  5467.     $lent=array();
  5468.     if(!is_null($ent)){
  5469.       foreach($ent as $l){
  5470.           $luid=$l->getUser()->getId();
  5471.           $lyr=$l->getYear();
  5472.           $ty=$l->getLeaveType()->getId();
  5473.           
  5474.           if(!isset($lent['u'.$luid])){$lent['u'.$luid]=array();}
  5475.           if(!isset($lent['u'.$luid]['y'.$lyr])){$lent['u'.$luid]['y'.$lyr]=array();}
  5476.           $lent['u'.$luid]['y'.$lyr]['t'.$ty]=$l;
  5477.       }
  5478.     }
  5479.     $exp=($opt['year']+1).'-03-31';
  5480.     $exp=new \DateTime($exp);
  5481.     
  5482.     
  5483.     if(!is_null($usr) && !is_null($lvtype)){
  5484.       foreach($usr as $u){
  5485.         $uuid=$u->getId();
  5486.         if(!is_null($u->getOffice())){
  5487.           $oid=$u->getOffice()->getId();
  5488.           foreach($lvtype as $l){
  5489.             $lvid=$l->getId();
  5490.             $loid=$l->getOffice()->getId();
  5491.             $ok=false;
  5492.             $okoffice=($oid==$loid);
  5493.             $leaveon=null;
  5494.             if($okoffice){
  5495.               if(!isset($lent['u'.$uuid])){
  5496.                 $ok=true;
  5497.               }else{
  5498.                 if(!isset($lent['u'.$uuid]['y'.$opt['year']])){
  5499.                   $ok=true;
  5500.                 }else{
  5501.                   if(!isset($lent['u'.$uuid]['y'.$opt['year']]['t'.$lvid])){
  5502.                     $ok=true;
  5503.                   }else{
  5504.                     $leaveon=$lent['u'.$uuid]['y'.$opt['year']]['t'.$lvid];
  5505.                   }
  5506.                 }
  5507.               }
  5508.             }
  5509.             
  5510.             
  5511.             
  5512.             //ok = new leave
  5513.             if($ok){
  5514.               $leave=$this->_add_leave_data($u,$opt['year'],$exp,$l);
  5515.               if($leave!==false){
  5516.                   if(is_array($leave)){
  5517.                     foreach($leave as $lv){
  5518.                       $parent=$lv->getId();
  5519.                       $childType=$this->entityManager->getRepository(LeaveType::class)->findBy(array('office'=>$u->getOffice(),'parent'=>array($l->getId())));
  5520.                       if(count($childType) > 0){
  5521.                         foreach($childType as $c){
  5522.                           if(!isset($lent['u'.$uuid])){
  5523.                             $cleave=$this->_add_leave_data($u,$opt['year'],$exp,$c,$parent);
  5524.                           }else{
  5525.                             if(!isset($lent['u'.$uuid]['y'.$opt['year']])){
  5526.                               $cleave=$this->_add_leave_data($u,$opt['year'],$exp,$c,$parent);
  5527.                             }else{
  5528.                               if(!isset($lent['u'.$uuid]['y'.$opt['year']]['t'.$c->getId()])){
  5529.                                 $cleave=$this->_add_leave_data($u,$opt['year'],$exp,$c,$parent);
  5530.                               }  
  5531.                             }
  5532.                           } 
  5533.                           
  5534.                         }
  5535.                       } 
  5536.                     }
  5537.                   }else{
  5538.                     $parent=$leave->getId();
  5539.                     $childType=$this->entityManager->getRepository(LeaveType::class)->findBy(array('office'=>$u->getOffice(),'parent'=>array($l->getId())));
  5540.                     if(count($childType) > 0){
  5541.                       foreach($childType as $c){
  5542.                         if(!isset($lent['u'.$uuid])){
  5543.                           $cleave=$this->_add_leave_data($u,$opt['year'],$exp,$c,$parent);
  5544.                         }else{
  5545.                           if(!isset($lent['u'.$uuid]['y'.$opt['year']])){
  5546.                             $cleave=$this->_add_leave_data($u,$opt['year'],$exp,$c,$parent);
  5547.                           }else{
  5548.                             if(!isset($lent['u'.$uuid]['y'.$opt['year']]['t'.$c->getId()])){
  5549.                               $cleave=$this->_add_leave_data($u,$opt['year'],$exp,$c,$parent);
  5550.                             }  
  5551.                           }
  5552.                         }  
  5553.                         
  5554.                       }
  5555.                     }
  5556.                   }
  5557.               }  
  5558.             }else{
  5559.               //edit mode
  5560.               if(!is_null($leaveon)){
  5561.                   $newdays=$l->getDays();
  5562.                   $leftx=$leaveon->getLeaveLeft();
  5563.                   $daysx=$leaveon->getLeaveEntitlements();
  5564.                   $country=$leaveon->getUser()->getOffice()->getCountry();
  5565.                   if($country=='VN'){
  5566.                     if($leaveon->getLeaveType()->getLeaveName()=='annual'){
  5567.                       $dtjoin=$leaveon->getUser()->getPersonalInfo()->getJobJoinDate();
  5568.                       $dtjyear=$dtjoin->format('Y');
  5569.                       $dtyear=$leaveon->getYear();
  5570.                       $attr=$leaveon->getAttributes();
  5571.                       if(($dtyear-$dtjyear) == 0){
  5572.                         $gv=new \DateTime($dtjoin->format('Y-m-d'));
  5573.                         $exp=new \DateTime($dtjoin->format('Y-m-d'));
  5574.                         $exp->modify('+1 year');
  5575.                         $exp->modify('-1 days');
  5576.                         $attr['given']=$gv->format('Y-m-d');
  5577.                         $attr['expires']=$exp->format('Y-m-d');
  5578.                         $leaveon->setAttributes($attr);
  5579.                         $newdays=5;
  5580.                       }else{
  5581.                         $gv=new \DateTime($dtyear.'-'.$dtjoin->format('m-d'));
  5582.                         $exp=new \DateTime(($dtyear+1).'-'.$dtjoin->format('m-d'));
  5583.                         $exp->modify('-1 days');
  5584.                         $attr['given']=$gv->format('Y-m-d');
  5585.                         $attr['expires']=$exp->format('Y-m-d');
  5586.                         $leaveon->setAttributes($attr);
  5587.                       }
  5588.                       
  5589.                       /*else if((($dtyear-$dtjyear) == 1)){
  5590.                         $gv=new \DateTime($dtjoin->format('Y-m-d'));
  5591.                         $gv->modify('+1 year');
  5592.                         $gvyear=$gv->format('Y');
  5593.                         $exp=new \DateTime(($gvyear+1).'-03-31');
  5594.                         $attr['given']=$gv->format('Y-m-d');
  5595.                         $attr['expires']=$exp->format('Y-m-d');
  5596.                         $leaveon->setAttributes($attr);
  5597.                         $nm=$dtjoin->format('m');
  5598.                         $nm=(12-$nm)+1;
  5599.                         $newdays=($nm/12)*$l->getDays();
  5600.                       }*/
  5601.                     }
  5602.                     
  5603.                   } 
  5604.                   
  5605.                   if($l->getLeaveName()==='annual'){
  5606.                       $ujoindate=$u->getPersonalInfo()->getJobJoinDate();
  5607.                       $tujoindate=$ujoindate->format('Y-m-d');
  5608.                       $uendate=$opt['year'].'-12-31';
  5609.                       $maxday=$l->getDays();
  5610.                       $prorate=$this->_prorate($tujoindate,$uendate,$maxday,$country);
  5611.                       
  5612.                   }else{
  5613.                     $prorate=$newdays;
  5614.                   }
  5615.                     
  5616.                   $leftx=$leftx+($prorate $daysx);
  5617.                   $leaveon->setLeaveEntitlements($prorate);
  5618.                   $leaveon->setLeaveLeft($leftx);
  5619.                   
  5620.                   $em->persist($leaveon);
  5621.                   $em->flush();
  5622.                   //if($leaveon->getUser()->getId()=='166'){
  5623.                   //  dd('left:'.$leftx);
  5624.                   //}
  5625.               }
  5626.             }
  5627.           }
  5628.         }
  5629.         $rsback=$this->resetAll(array('user'=>$u,'logname'=>'log.leave.create'));
  5630.       }
  5631.     }  
  5632.   }
  5633.   public function saveLeaveEntitlement($office,$option=array()){
  5634.     $bonus=null;
  5635.     $annual=null;
  5636.     $sick=null;
  5637.     $leavetype=$office->getLeaveTypes();
  5638.     $em $this->entityManager;
  5639.     if($leavetype!=null){
  5640.       foreach($leavetype as $l){
  5641.         foreach($option as $k=>$v){
  5642.           if($l->getLeaveName()==$k){
  5643.             $l->setDays($v);
  5644.             $em->persist($l);
  5645.             $em->flush();
  5646.           }
  5647.         }
  5648.         if($l->getLeaveName()=='sick'){$sick=$l;}
  5649.         if($l->getLeaveName()=='annual'){$annual=$l;}
  5650.         if($l->getLeaveName()=='anniversary'){$bonus=$l;}
  5651.       }
  5652.     }
  5653.     if(is_null($sick)){
  5654.       if(isset($option['sick'])){
  5655.         $sick = new LeaveType();
  5656.         $sick->setLeaveName('sick');
  5657.         $sick->setOffice($office);
  5658.         $sick->setIsActive(true);
  5659.         $sick->setIsMandatory(true);
  5660.         $sick->setDays($option['sick']);
  5661.         $dataAttributes = [
  5662.           "mode"=>"fix",
  5663.           "label"=>'Sick',
  5664.           "deductedafter"=>2,
  5665.           "keepyear"=>true,
  5666.           "hide"=>true,
  5667.         ];
  5668.         $sick->setAttributes($dataAttributes);
  5669.         $sick->setCreatedAt(new \DateTime());
  5670.         $em->persist($sick);
  5671.         $em->flush();
  5672.       }     
  5673.     }
  5674.     if(is_null($annual)){
  5675.       if(isset($option['annual'])){
  5676.         $annual = new LeaveType();
  5677.         $annual->setLeaveName('annual');
  5678.         $annual->setOffice($office);
  5679.         $annual->setIsActive(true);
  5680.         $annual->setIsMandatory(true);
  5681.         $dataAttributes = [
  5682.           "mode"=>"period",
  5683.           "label"=>'Annual',
  5684.           "isIncremental" => false,
  5685.           "incrementalStart" => 12,
  5686.           "incrementalValue" => 1,
  5687.         ];
  5688.         $annual->setDays($option['annual']);
  5689.         $annual->setAttributes($dataAttributes);
  5690.         $annual->setCreatedAt(new \DateTime());
  5691.         $em->persist($annual);
  5692.         $em->flush();
  5693.       }        
  5694.     }
  5695.     
  5696.     if((is_null($bonus)) && (!is_null($annual))){
  5697.       $bonus = new LeaveType();
  5698.       $bonus->setLeaveName('anniversary');
  5699.       $bonus->setOffice($office);
  5700.       $bonus->setIsActive(true);
  5701.       $bonus->setIsMandatory(true);
  5702.       $dataAttributes = [
  5703.         "mode"=>"anniversary",
  5704.         "label"=>'Bonus',
  5705.         "isIncremental" => true,
  5706.         "incrementalStart" => 1,
  5707.         "incrementalValue" => 1,
  5708.         "hide"=>true
  5709.       ];
  5710.       $bonus->setDays(1);
  5711.       $bonus->setAttributes($dataAttributes);
  5712.       $bonus->setCreatedAt(new \DateTime());
  5713.       $bonus->setParent($annual->getID());
  5714.       $em->persist($bonus);
  5715.       $em->flush();
  5716.     }
  5717.     $this->createLeaveEntitlement(array(
  5718.       'office'=>$office
  5719.     ));
  5720.   }
  5721.   public function leaveProRateCron($force false)
  5722.   {
  5723.     $em $this->entityManager;
  5724.     $users $em->getRepository(\App\Entity\User::class)->findAllActive();
  5725.     $total 0;
  5726.     foreach ($users as $user) {
  5727.       try {
  5728.         $office $user->getOffice();
  5729.         $country '';
  5730.         if (!is_null($office)) {
  5731.           $country $office->getCountry();
  5732.         }
  5733.         if (($country == 'SG') || ($country == 'HK')) {
  5734.           $this->leavePermanent($user$forcetrue);
  5735.           $total++;
  5736.         }
  5737.         
  5738.       } catch (Exception $e) {
  5739.         continue;
  5740.       }
  5741.     }
  5742.     return $total;   
  5743.   }
  5744.   public function deleteRequest(\App\Entity\LeaveRequest $leaveRequest){
  5745.     $em $this->entityManager;
  5746.       $userData=$leaveRequest->getUser();
  5747.       $leaveType=$leaveRequest->getLeaveType();
  5748.       $back $leaveRequest->getAlocation();
  5749.       if ($back == null) {
  5750.           $back = array();
  5751.       }
  5752.       $alocation = array();
  5753.       if (isset($back['child'])) {
  5754.           foreach ($back['child'] as $kb => $bchild) {
  5755.               $yr str_replace('y'''$kb);
  5756.               foreach ($bchild as $kb1 => $vb1) {
  5757.                   $cid str_replace('c'''$kb1);
  5758.                   $chde $this->getDoctrine()->getRepository(LeaveEntitlement::class)->findBy(array('user' => $userData'id' => $cid'year' => $yr));
  5759.                   if (is_array($chde)) {
  5760.                       for ($bb 0$bb count($chde); $bb++) {
  5761.                           $lf $chde[$bb]->getLeaveLeft();
  5762.                           $lf $lf $vb1;
  5763.                           $chde[$bb]->setLeaveLeft($lf);
  5764.                           $this->getDoctrine()->getManager()->persist($chde[$bb]);
  5765.                           $this->getDoctrine()->getManager()->flush();
  5766.                       }
  5767.                   }
  5768.               }
  5769.           }
  5770.       }
  5771.       foreach ($back as $k => $b) {
  5772.           switch ($k) {
  5773.               case 'data':
  5774.                   break;
  5775.               case 'dumper':
  5776.                 break;   
  5777.               case 'error':
  5778.                   break;
  5779.               case 'type':
  5780.                   break;    
  5781.               case 'child':
  5782.                   break;
  5783.               default:
  5784.                   $yr str_replace('y'''$k);
  5785.                   $alocation['y' $yr] = 0;
  5786.                   break;
  5787.           }
  5788.       }
  5789.       $em->remove($leaveRequest);
  5790.       $em->flush();
  5791.       $this->updateEntitlementFromLeave($userData$leaveType$alocation$back);
  5792.   }
  5793.   public function saveRequest($option=array()){
  5794.     $default=array(
  5795.       'id'=>null,
  5796.       'user'=>null,
  5797.       'leaveType'=>null,
  5798.       'startDate'=>null,
  5799.       'endDate'=>null,
  5800.       'isApproved'=>null,
  5801.       'am'=>false,
  5802.       'pm'=>false,
  5803.       'days'=>0,
  5804.       'attributes'=>array(),
  5805.       'comment'=>'',
  5806.       'saveupdate'=>true,
  5807.       'updateby'=>null,
  5808.       'reviewBy'=>null,
  5809.     );
  5810.     $opt=$default;
  5811.     $opt['log']=array();
  5812.     $currentopt=array();
  5813.     if(isset($option['startDate'])){
  5814.       $currentopt['startDate']=$option['startDate']->format('Y-m-d');
  5815.     }
  5816.     if(isset($option['endDate'])){
  5817.       $currentopt['endDate']=$option['endDate']->format('Y-m-d');
  5818.     }
  5819.     if(isset($option['days'])){
  5820.       $currentopt['days']=$option['days'];
  5821.     }
  5822.     $em $this->entityManager;
  5823.     $leaveRequest=null;
  5824.     $olddata null;
  5825.     $olddatalog null;
  5826.     $isupdate=false;
  5827.     $entbyid=array();
  5828.     $ent=array();
  5829.     $entbyyear=array();
  5830.     $leaveent=$em->getRepository(LeaveEntitlement::class)->findAll();
  5831.     foreach($leaveent as $l){
  5832.       $uid=$l->getUser()->getId();
  5833.       $yr=$l->getYear();
  5834.       $ty=$l->getLeaveType()->getId();
  5835.       $entbyid['c'.$l->getId()]=$l;
  5836.       if(!isset($entbyyear['u'.$uid])){$entbyyear['u'.$uid]=array();}
  5837.       if(!isset($entbyyear['u'.$uid]['y'.$yr])){$entbyyear['u'.$uid]['y'.$yr]=array();}
  5838.       if(!isset($entbyyear['u'.$uid]['y'.$yr]['t'.$ty])){
  5839.         $entbyyear['u'.$uid]['y'.$yr]['t'.$ty]=array();
  5840.         $entbyyear['u'.$uid]['y'.$yr]['t'.$ty]['left'] =$l->getLeaveLeft();
  5841.         $entbyyear['u'.$uid]['y'.$yr]['t'.$ty]['ent']=$l;
  5842.       }
  5843.     }
  5844.     if(isset($option['id'])){
  5845.       $leaveRequest $em->getRepository(LeaveRequest::class)->find($option['id']);
  5846.       if(!is_null($leaveRequest)){ 
  5847.         $olddata = clone $leaveRequest;$isupdate=true;
  5848.         $olddatalog=clone $olddata;
  5849.       }
  5850.     }
  5851.     if(!is_null($olddata)){
  5852.       $opt['isApproved'] = $olddata->getIsApproved();
  5853.       $opt['am'] = $olddata->getIsHalfStart();
  5854.       $opt['pm'] = $olddata->getIsHalfEnd();
  5855.       $opt['comment'] = $olddata->getComment();
  5856.       $opt['attributes'] = $olddata->getAttributes();
  5857.       $opt['startDate'] = $olddata->getStartDate();
  5858.       $opt['endDate'] = $olddata->getEndDate();
  5859.       $opt['leaveType']=$olddata->getLeaveType();
  5860.       $opt['user']=$olddata->getUser();
  5861.       $opt['reviewBy']=$olddata->getReviewedBy();
  5862.       $opt['log']=$olddata->getLog();
  5863.     }
  5864.     $idmc=array();
  5865.     $idmclist=array();
  5866.     $attridmc=array();
  5867.     $logidmc=array();
  5868.     $idmcdellist=array();
  5869.     $ismc=false;
  5870.     $ismccheck=true;
  5871.     $mcdate=array();
  5872.     $updatedate=null;
  5873.     $updateby=null;
  5874.     $mchalf=array();
  5875.     $oldmchalf=array();
  5876.     if(!is_null($opt['leaveType'])){$option['leaveType']=$opt['leaveType'];}
  5877.     if(!is_null($opt['user'])){$option['user']=$opt['user'];}
  5878.     if(isset($option['leaveType'])){
  5879.       if($option['leaveType']->getLeaveName()=='sick'){
  5880.         $ismc=true;
  5881.         if(isset($option['id']) && !is_null($olddata)){
  5882.           $mcdate['startDate']= new \DateTime($opt['startDate']->format('Y-m-d'));
  5883.           $mcdate['endDate']= new \DateTime($opt['endDate']->format('Y-m-d'));
  5884.         }
  5885.         if(isset($option['startDate']) && !is_null($option['startDate'])){$mcdate['startDate']=new \DateTime($option['startDate']->format('Y-m-d'));}
  5886.         if(isset($option['endDate']) && !is_null($option['endDate'])){$mcdate['endDate']=new \DateTime($option['endDate']->format('Y-m-d'));}
  5887.         /*if(isset($mcdate['startDate']) && isset($mcdate['endDate']) && !is_null($opt['startDate']) && !is_null($opt['endDate'])){
  5888.           if(($mcdate['startDate']==$opt['startDate']) && ($mcdate['endDate'] == $opt['endDate'])){
  5889.             $ismccheck=false;
  5890.           }
  5891.         }*/
  5892.       }
  5893.     }  
  5894.     $mcallocation=array();
  5895.     $historymc=array();
  5896.     $tmphismc=array();
  5897.     if($ismc){
  5898.       if(!is_null($option['user'])){
  5899.         $ucountry=$option['user']->getOffice()->getCountry();
  5900.       }
  5901.       $holidays=array();
  5902.       $holidaydt=$em->getRepository(\App\Entity\LeaveBankHoliday::class)->findAll();
  5903.       foreach($holidaydt as $hl){
  5904.         $loc=$hl->getLocation();
  5905.         if(!isset($holidays[$loc])){$holidays[$loc]=array();}
  5906.         $shl=new \DateTime($hl->getDate()->format('Y-m-d'));
  5907.         if(is_null($hl->getEndDate())){
  5908.           $ehl=new \DateTime($hl->getDate()->format('Y-m-d'));
  5909.         }else{
  5910.           $ehl=new \DateTime($hl->getEndDate()->format('Y-m-d'));
  5911.         }  
  5912.        
  5913.         $inval=date_diff($ehl,$shl);
  5914.         $inval=abs($inval->d)+1;
  5915.         for($hv=0;$hv<$inval;$hv++){
  5916.           $holidays[$loc][count($holidays[$loc])]=$shl->format('Y-m-d');
  5917.           $shl->modify('+1 day');
  5918.         }
  5919.       }
  5920.       $offdays=array(0,6);
  5921.       $offdaysdt=array(6,7);
  5922.       if(isset($mcdate['startDate']) && isset($mcdate['endDate'])){
  5923.         if($ismccheck){
  5924.           $stdatemc = new \DateTime($mcdate['startDate']->format('Y-m-d'));
  5925.             $stdatemc->modify('-30 days');
  5926.             $endatemc = new \DateTime($mcdate['endDate']->format('Y-m-d'));
  5927.             $endatemc->modify('+30 days');
  5928.             $getsick=$em->getRepository(LeaveRequest::class)->createQueryBuilder('a')
  5929.             ->select('a')
  5930.             ->where('a.user = :user')
  5931.             ->andWhere('a.leaveType in (:leavetype)')
  5932.             ->andWhere('a.startDate >= :from')
  5933.             ->andWhere('a.startDate <= :to')
  5934.             ->setParameter('from',$stdatemc)
  5935.             ->setParameter('to',  $endatemc)
  5936.             ->setParameter('leavetype',  $option['leaveType'])
  5937.             ->setParameter('user',  $option['user'])
  5938.             ->orderBy('a.startDate')
  5939.             ->getQuery()
  5940.             ->getResult();
  5941.           if(!is_null($getsick)){
  5942.             $rqidx=-1;
  5943.             if(!is_null($leaveRequest)){$rqidx=$leaveRequest->getId();}
  5944.             foreach($getsick as $gs){
  5945.               $attrmc=$gs->getAttributes();
  5946.               $startmc=$gs->getStartDate();
  5947.               $endmc=$gs->getEndDate();
  5948.               $tidmc=-1;
  5949.               if($gs->getId()!=$rqidx){
  5950.                 $lessstart=new \DateTime($mcdate['startDate']->format('Y-m-d'));
  5951.                 $lessstart->modify('-1 day');
  5952.                 $lsok=false;
  5953.                 if(in_array($lessstart->format('N'),$offdaysdt)){$lsok=true;}
  5954.                 if(isset($holidays[$ucountry])){
  5955.                   if(in_array($lessstart->format('Y-m-d'),$holidays[$ucountry])){
  5956.                     $lsok=true;
  5957.                   }
  5958.                 }
  5959.                 while($lsok){
  5960.                   $lsok=false;
  5961.                   $lessstart->modify('-1 day');
  5962.                   if(in_array($lessstart->format('N'),$offdaysdt)){$lsok=true;}
  5963.                   if(isset($holidays[$ucountry])){
  5964.                     if(in_array($lessstart->format('Y-m-d'),$holidays[$ucountry])){
  5965.                       $lsok=true;
  5966.                     }
  5967.                   }
  5968.                 }
  5969.                 $lessend=new \DateTime($mcdate['endDate']->format('Y-m-d'));
  5970.                 $lessend->modify('+1 day');
  5971.                 $lsok=false;
  5972.                 if(in_array($lessend->format('N'),$offdaysdt)){$lsok=true;}
  5973.                 if(isset($holidays[$ucountry])){
  5974.                   if(in_array($lessend->format('Y-m-d'),$holidays[$ucountry])){
  5975.                     $lsok=true;
  5976.                   }
  5977.                 }
  5978.                 while($lsok){
  5979.                   $lsok=false;
  5980.                   $lessend->modify('+1 day');
  5981.                   if(in_array($lessend->format('N'),$offdaysdt)){$lsok=true;}
  5982.                   if(isset($holidays[$ucountry])){
  5983.                     if(in_array($lessend->format('Y-m-d'),$holidays[$ucountry])){
  5984.                       $lsok=true;
  5985.                     }
  5986.                   }
  5987.                 }  
  5988.                 if(($lessstart >= $startmc) && ($lessend <= $endmc)){$tidmc=$gs->getId();}
  5989.                 if(($lessstart <= $startmc) && ($lessend >= $startmc)){$tidmc=$gs->getId();}
  5990.                 if(($lessstart <= $endmc) && ($lessend >= $endmc)){$tidmc=$gs->getId();}
  5991.                 /*print_r("lessstart:".$lessstart->format('Y-m-d'));
  5992.                 print_r("\n");
  5993.                 print_r("lessstart:".$lessstart->format('N'));*/
  5994.                 /*$hf=fopen('../var/log/test.log','a');
  5995.                 ob_start();
  5996.                 //print_r($testresult);
  5997.                 print_r($gs->getId().':');
  5998.                 print_r($lessstart->format('Y-m-d').'=>'.$startmc->format('Y-m-d').':');
  5999.                 print_r($lessend->format('Y-m-d').'=>'.$endmc->format('Y-m-d').':');
  6000.                 print_r("\n");
  6001.                 $txt=ob_get_clean();
  6002.                 fwrite($hf,$txt);
  6003.                 fclose($hf);*/
  6004.               }else{
  6005.                 $tidmc=$gs->getId();
  6006.                 if(isset($currentopt['startDate']) && isset($currentopt['endDate'])){
  6007.                   $endmc=new \DateTime($currentopt['endDate']);
  6008.                   $startmc=new \DateTime($currentopt['startDate']);
  6009.                 }
  6010.                 
  6011.               }  
  6012.               if($tidmc > -1){
  6013.                 if($mcdate['endDate'] < $endmc){$mcdate['endDate']=$endmc;}
  6014.                 if($mcdate['startDate'] > $startmc){$mcdate['startDate']=$startmc;}
  6015.                 $idmclist[count($idmc)]=$gs;
  6016.                 $idmc[count($idmc)]=$tidmc;
  6017.               }
  6018.             }
  6019.             foreach($idmclist as $ml){
  6020.               $sdtmc=new \DateTime($ml->getStartDate()->format('Y-m-d'));
  6021.               $edtmc=new \DateTime($ml->getEndDate()->format('Y-m-d'));
  6022.               $intmc=date_diff($sdtmc,$edtmc);
  6023.               $intmc=abs($intmc->d)+1;
  6024.               $attrmc=$ml->getAttributes();
  6025.               if(isset($attrmc['historymc'])){
  6026.                 foreach($attrmc['historymc'] as $kh=>$h){
  6027.                     $historymc[$kh]=$h;
  6028.                 }
  6029.               }
  6030.               for($d=0;$d<$intmc;$d++){
  6031.                   $dvx=1;
  6032.                   $dv=new \DateTime($sdtmc->format('Y-m-d'));
  6033.                   $okadd=true;
  6034.                   if(in_array(date('w',strtotime($dv->format('Y-m-d'))),$offdays)){$okadd=false;}
  6035.                   if(isset($ucountry)){
  6036.                     if(isset($holidays[$ucountry])){
  6037.                       if(in_array($dv->format('Y-m-d'),$holidays[$ucountry])){$okadd=false;}
  6038.                     }
  6039.                   }
  6040.                   
  6041.                   if($okadd){
  6042.                     if(!isset($mcallocation['d'.$dv->format('Y-m-d')])){
  6043.                       $mcallocation['d'.$dv->format('Y-m-d')]=array();
  6044.                       $mcallocation['d'.$dv->format('Y-m-d')]=0;
  6045.                     }
  6046.                     
  6047.                     if($d==0){
  6048.                       if(!is_null($ml->getIsHalfStart())){
  6049.                         if(($ml->getIsHalfStart()==true) || ($ml->getIsHalfStart()==1)){$dvx=0.5;}
  6050.                       }
  6051.                     }
  6052.                     if($d==($intmc-1)){
  6053.                       if(!is_null($ml->getIsHalfEnd())){
  6054.                         if(($ml->getIsHalfEnd()==true) || ($ml->getIsHalfEnd()==1)){$dvx=0.5;}
  6055.                       }
  6056.                     }
  6057.                     
  6058.                     if(isset($attrmc['mc'])){
  6059.                       if(isset($attrmc['mc']['d'.$dv->format('Y-m-d')])){
  6060.                         $dvx=$attrmc['mc']['d'.$dv->format('Y-m-d')]; 
  6061.                         $mcallocation['d'.$dv->format('Y-m-d')]=$dvx;
  6062.                       }else{
  6063.                         $mcallocation['d'.$dv->format('Y-m-d')]=$dvx;
  6064.                       }
  6065.                     }else{
  6066.                       $mcallocation['d'.$dv->format('Y-m-d')]=$dvx;
  6067.                     }
  6068.                     if(isset($attrmc['mcp'])){
  6069.                       if(isset($attrmc['mcp']['d'.$dv->format('Y-m-d')])){
  6070.                         $oldmchalf['d'.$dv->format('Y-m-d')]=$attrmc['mcp']['d'.$dv->format('Y-m-d')];
  6071.                         $mchalf['d'.$dv->format('Y-m-d')]=$attrmc['mcp']['d'.$dv->format('Y-m-d')];
  6072.                       }
  6073.                     }
  6074.                     //if($dvx >=  $mcallocation['d'.$dv->format('Y-m-d')]){$mcallocation['d'.$dv->format('Y-m-d')]=$dvx;}
  6075.                   }
  6076.                 $sdtmc->modify('+1 day');
  6077.               }
  6078.             }
  6079.           }
  6080.         }
  6081.         /*$hf=fopen('../var/log/test.log','w');
  6082.         ob_start();
  6083.         print_r("");
  6084.         $txt=ob_get_clean();
  6085.         fwrite($hf,$txt);
  6086.         fclose($hf);*/        
  6087.         $sdtmc=new \DateTime($mcdate['startDate']->format('Y-m-d'));
  6088.         $edtmc=new \DateTime($mcdate['endDate']->format('Y-m-d'));
  6089.         $intmc=date_diff($sdtmc,$edtmc);
  6090.         $intmc=abs($intmc->d)+1;
  6091.         
  6092.         /*$hf=fopen('../var/log/test.log','w');
  6093.         ob_start();
  6094.         print_r("");
  6095.         $txt=ob_get_clean();
  6096.         fwrite($hf,$txt);
  6097.         fclose($hf);*/
  6098.         $createdatdate2=null;
  6099.         for($d=0;$d<$intmc;$d++){
  6100.             $dvx=1;
  6101.             $dv=new \DateTime($sdtmc->format('Y-m-d'));
  6102.             $dv=$dv->format('Y-m-d');
  6103.             $okadd=true;
  6104.             if(in_array(date('w',strtotime($dv)),$offdays)){$okadd=false;}
  6105.             if(isset($ucountry)){
  6106.               if(isset($holidays[$ucountry])){
  6107.                 if(in_array($dv,$holidays[$ucountry])){$okadd=false;}
  6108.               }
  6109.             }
  6110.             if(!isset($mcallocation['d'.$dv]) && ($okadd)){
  6111.               $mcallocation['d'.$dv]=0;
  6112.               if(isset($currentopt['startDate']) && isset($currentopt['endDate'])){
  6113.                 if($dv==$currentopt['startDate']){
  6114.                   if(!is_null($opt['am'])){
  6115.                     if(($opt['am']==true) || ($opt['am']==1)){$dvx=0.5;}
  6116.                   }
  6117.                   if(!is_null($option['am'])){
  6118.                     if(($option['am']==true) || ($option['am']==1)){$dvx=0.5;}
  6119.                   }
  6120.                 }
  6121.                 if($dv==$currentopt['endDate']){
  6122.                   if(!is_null($opt['pm'])){
  6123.                     if(($opt['pm']==true) || ($opt['pm']==1)){$dvx=0.5;}
  6124.                   }
  6125.                   if(!is_null($option['pm'])){
  6126.                     if(($option['pm']==true) || ($option['pm']==1)){$dvx=0.5;}
  6127.                   }                 
  6128.                 }  
  6129.               }
  6130.               if($dvx >=  $mcallocation['d'.$dv]){$mcallocation['d'.$dv]=$dvx;}
  6131.             }
  6132.           $sdtmc->modify('+1 day');
  6133.         }
  6134.       }
  6135.       if(isset($currentopt['startDate']) && isset($currentopt['endDate'])){
  6136.         $sdtmc=new \DateTime($currentopt['startDate']);
  6137.         $edtmc=new \DateTime($currentopt['endDate']);
  6138.         $intmc=date_diff($sdtmc,$edtmc);
  6139.         $intmc=abs($intmc->d)+1;
  6140.         $tday=0;
  6141.         for($d=0;$d<$intmc;$d++){
  6142.             $dvx=1;
  6143.             $dv=new \DateTime($sdtmc->format('Y-m-d'));
  6144.             $dv=$dv->format('Y-m-d');
  6145.             $okadd=true;
  6146.             if(in_array(date('w',strtotime($dv)),$offdays)){$okadd=false;}
  6147.             if(isset($ucountry)){
  6148.               if(isset($holidays[$ucountry])){
  6149.                 if(in_array($dv,$holidays[$ucountry])){$okadd=false;}
  6150.               }
  6151.             }
  6152.             
  6153.             if($okadd){
  6154.               $mchalf['d'.$dv]=array();
  6155.               $mchalf['d'.$dv]['am']=false;
  6156.               $mchalf['d'.$dv]['pm']=false;
  6157.               if(isset($oldmchalf['d'.$dv])){
  6158.                 $mchalf['d'.$dv]=$oldmchalf['d'.$dv];
  6159.               }
  6160.               if($d==0){
  6161.                 $amtrue=false;
  6162.                 if(!is_null($opt['am'])){
  6163.                   if(($opt['am']==true) || ($opt['am']==1)){$dvx=0.5;$amtrue=true;}
  6164.                 }
  6165.                 if(!is_null($option['am'])){
  6166.                   if(($option['am']==true) || ($option['am']==1)){$dvx=0.5;$amtrue=true;}
  6167.                   if(($option['am']==false) || ($option['am']==0)){$dvx=1;$amtrue=false;}
  6168.                 }
  6169.                 if(isset($oldmchalf['d'.$dv])){
  6170.                   if($oldmchalf['d'.$dv]['am']!=$amtrue){
  6171.                     $mcallocation['d'.$dv]=$dvx;
  6172.                   }
  6173.                 }else{
  6174.                   $mcallocation['d'.$dv]=$dvx;
  6175.                 }
  6176.                 if(!isset($mcallocation['d'.$dv])){$mcallocation['d'.$dv]=$dvx;} 
  6177.                 $mchalf['d'.$dv]['am']=$amtrue
  6178.               }
  6179.               
  6180.              
  6181.               if($d==($intmc-1)){
  6182.                 $pmtrue=false;
  6183.                 if(!is_null($opt['pm'])){
  6184.                   if(($opt['pm']==true) || ($opt['pm']==1)){$dvx=0.5;$pmtrue=true;}
  6185.                 }
  6186.                 if(!is_null($option['pm'])){
  6187.                   $pmok=true;
  6188.                   if($d==0){
  6189.                     if(!is_null($option['am'])){
  6190.                       if(($option['am']==true) || ($option['am']==1)){$pmok=false;$pmtrue=false;}
  6191.                     }
  6192.                   }
  6193.                   if($pmok){
  6194.                     if(($option['pm']==true) || ($option['pm']==1)){$dvx=0.5;$pmtrue=true;}
  6195.                     if(($option['pm']==false) || ($option['pm']==0)){$dvx=1;$pmtrue=false;}
  6196.                   }
  6197.                   if(isset($oldmchalf['d'.$dv])){
  6198.                     if($oldmchalf['d'.$dv]['pm']!=$pmtrue){
  6199.                       $mcallocation['d'.$dv]=$dvx;
  6200.                     }
  6201.                   }else{
  6202.                     $mcallocation['d'.$dv]=$dvx;
  6203.                   }
  6204.                   if(!isset($mcallocation['d'.$dv])){$mcallocation['d'.$dv]=$dvx;} 
  6205.                   $mchalf['d'.$dv]['pm']=$pmtrue;
  6206.                 }
  6207.                 /*$hf=fopen('../var/log/test.log','w');
  6208.                 ob_start();
  6209.                 if(!is_null($option['pm'])){
  6210.                   print_r($option['pm']);
  6211.                   print_r("\n");
  6212.                 }
  6213.                 print_r($dvx);
  6214.                 print_r("\n");
  6215.                 $txt=ob_get_clean();
  6216.                 fwrite($hf,$txt);
  6217.                 fclose($hf);*/
  6218.               }
  6219.               //if(isset($mcallocation['d'.$dv])){$dvx=$mcallocation['d'.$dv];}
  6220.               $tday+=$dvx;
  6221.             }
  6222.           $sdtmc->modify('+1 day');
  6223.         }
  6224.         $tmphismc=array();
  6225.         $tmphismc['startDate']=$currentopt['startDate'];
  6226.         $tmphismc['endDate']=$currentopt['endDate'];
  6227.         $tmphismc['am']=$option['am'];
  6228.         $tmphismc['pm']=$option['pm'];
  6229.         if(is_null($leaveRequest)){
  6230.           $tmphismc['createDate']=date('Y-m-d');
  6231.         }else{
  6232.           $tmphismc['createDate']=$leaveRequest->getCreatedAt()->format('Y-m-d');
  6233.           $tmphismc['am']=$leaveRequest->getIsHalfStart();
  6234.           $tmphismc['pm']=$leaveRequest->getIsHalfEnd();
  6235.         }
  6236.         if(!is_null($option['am'])){$tmphismc['am']=$option['am'];}
  6237.         if(!is_null($option['pm'])){$tmphismc['pm']=$option['pm'];}
  6238.         $tmphismc['day']=$tday;
  6239.       }
  6240.       
  6241.     } 
  6242.   
  6243.     $removeidmc=array();
  6244.     $oldApproved null;
  6245.     $oam false;
  6246.     $opm false;
  6247.    
  6248.     foreach($option as $k=>$v){
  6249.       if($k=='attributes'){
  6250.         foreach($v as $kv=>$vv){
  6251.           $opt['attributes'][$kv]=$vv;
  6252.         }
  6253.       }else{  
  6254.         $isold=false;
  6255.         if(!is_null($olddata)){
  6256.          if($k=='leaveType'){$isold=true;} 
  6257.         }
  6258.         if(!$isold){$opt[$k]=$v;}
  6259.       }
  6260.     }
  6261.     if(is_null($opt['user'])){$opt['user']=$this->getUser();}
  6262.     if(is_null($opt['updateby'])){$opt['updateby']=$opt['user'];}
  6263.     $isApproved null;
  6264.     $isap=1;
  6265.     if(!is_null($opt['isApproved'])){ 
  6266.       $isApproved=$opt['isApproved'];
  6267.       if(($isApproved==false) || ($isApproved==0)){$isap=0;}
  6268.     };
  6269.     $typ='';
  6270.     if(!is_null($opt['leaveType'])){
  6271.       $typ=$opt['leaveType']->getLeaveName();
  6272.       //if($opt['leaveType']->getLeaveName()=='sick'){$isap=1;}
  6273.     }
  6274.     $removedmc=array();
  6275.     $removedgmc=array();
  6276.     if($ismc){
  6277.       $uidmc=$opt['user']->getId();
  6278.       if(!isset($alocation)){$alocation=array();}
  6279.       $idrqx=-1;
  6280.       $lvtypeid=$opt['leaveType']->getId();
  6281.       if(!is_null($leaveRequest)){$idrqx=$leaveRequest->getId();}
  6282.       $removeentmc=array();
  6283.       foreach($idmclist as $idm){
  6284.         $alc=$idm->getAlocation();
  6285.         if($alc==null){$alc==array();}
  6286.         foreach($alc as $kc=>$vc){
  6287.           if(substr($kc,0,1)=='y'){
  6288.             $yc=substr($kc,1,4);
  6289.             if(!isset($removeentmc['x'.$idm->getUser()->getId().'x'.$yc.'x'.$idm->getLeaveType()->getId()])){
  6290.               $removeentmc['x'.$idm->getUser()->getId().'x'.$yc.'x'.$idm->getLeaveType()->getId()]=0;
  6291.             }
  6292.             $removeentmc['x'.$idm->getUser()->getId().'x'.$yc.'x'.$idm->getLeaveType()->getId()]+=$vc;
  6293.           }
  6294.         }
  6295.         if(is_null($createdatdate2)){
  6296.           $createdatdate2=new \DateTime($idm->getCreatedAt()->format('Y-m-d'));
  6297.           if(!$idm->getCreatedBy() instanceof \App\Entity\User){
  6298.             $xiuser=$em->getRepository(\App\Entity\User::class)->find($idm->getCreatedBy());
  6299.             if(!is_null($xiuser)){
  6300.               $updateby=$xiuser->getId();
  6301.             }
  6302.           }else{
  6303.             $updateby=$idm->getCreatedBy()->getId();
  6304.           }  
  6305.           /*$hf=fopen('../var/log/test.log','w');
  6306.             ob_start();
  6307.               //print_r($testresult);
  6308.             print_r($updateby);
  6309.             print_r("\n");
  6310.             $txt=ob_get_clean();
  6311.             fwrite($hf,$txt);
  6312.             fclose($hf);*/
  6313.           //$createdatdate2=new \DateTime('createDate');
  6314.         }
  6315.         $idmcd=new \DateTime($idm->getCreatedAt()->format('Y-m-d'));
  6316.         if(!$idm->getCreatedBy() instanceof \App\Entity\User){
  6317.           $xiuser=$em->getRepository(\App\Entity\User::class)->find($idm->getCreatedBy());
  6318.           if(!is_null($xiuser)){
  6319.             $updatebyt=$xiuser->getId();
  6320.           }
  6321.         }else{
  6322.           $updatebyt=$idm->getCreatedBy()->getId();
  6323.         }  
  6324.         if($idmcd $createdatdate2){
  6325.           $createdatdate2=new \DateTime($idmcd->format('Y-m-d'));
  6326.           $updateby$updatebyt;
  6327.         }
  6328.         $attridm=$idm->getAttributes();
  6329.         if(isset($attridm['historymc'])){
  6330.           foreach($attridm['historymc'] as $aidmc){
  6331.             if(isset($aidmc['createDate'])){
  6332.               $idmcd=new \DateTime($aidmc['createDate']);
  6333.               if($idmcd $createdatdate2){
  6334.                 $createdatdate2=new \DateTime($idmcd->format('Y-m-d'));
  6335.                 $updateby=$aidmc['createBy'];
  6336.               }
  6337.             }
  6338.           }
  6339.         }
  6340.         if($idm->getId()!=$idrqx){
  6341.           $removedmc[count($removedmc)]=$idm->getId();
  6342.           $rmattr=$idm->getAttributes();
  6343.           if(isset($rmattr['file'])){
  6344.             if(!isset($opt['attributes']['file'])){
  6345.               $opt['attributes']['file']=$rmattr['file'];
  6346.             }
  6347.           }
  6348.           if(isset($rmattr['gcalid'])){
  6349.             $removedgmc[count($removedgmc)]=$rmattr['gcalid'];
  6350.           }
  6351.           $this->deleteRequest($idm);
  6352.         }
  6353.         
  6354.       }
  6355.       $tdays=0;
  6356.       foreach($removeentmc as $kre=>$re){
  6357.         $krc=explode('x',$kre);
  6358.         if(isset($entbyyear['u'.$krc[1]])){
  6359.           if(isset($entbyyear['u'.$krc[1]]['y'.$krc[2]])){
  6360.             if(isset($entbyyear['u'.$krc[1]]['y'.$krc[2]]['t'.$krc[3]])){
  6361.               $entbyyear['u'.$krc[1]]['y'.$krc[2]]['t'.$krc[3]]['left']+=$re;
  6362.             }
  6363.           }  
  6364.         }
  6365.       }
  6366.       foreach($mcallocation as $kh=>$hh){
  6367.         $dth=str_replace('d','',$kh);
  6368.         $sdx=new \DateTime($dth);
  6369.         if(($sdx $mcdate['startDate']) || ($sdx $mcdate['endDate'])){
  6370.           unset($mcallocation[$kh]);
  6371.         }
  6372.       }
  6373.       $updateentmc=array();
  6374.       foreach($mcallocation as $kh=>$hh){
  6375.         $dth=str_replace('d','',$kh);
  6376.         $tmh=strtotime($dth);
  6377.         $yh=date('Y',$tmh);
  6378.         if($yh 2001){
  6379.           if(isset($entbyyear['u'.$uidmc])){
  6380.             if(isset($entbyyear['u'.$uidmc]['y'.$yh])){
  6381.               if(isset($entbyyear['u'.$uidmc]['y'.$yh]['t'.$lvtypeid])){
  6382.                 $mclt=$entbyyear['u'.$uidmc]['y'.$yh]['t'.$lvtypeid]['left'];
  6383.                 $mcl=$mclt-$hh;
  6384.                 
  6385.                 if($mcl 0){
  6386.                     if($mcl > -$hh){
  6387.                       if(!isset($alocation['y'.$yh])){$alocation['y'.$yh]=0;}
  6388.                       $alocation['y'.$yh]+=$mclt;
  6389.                       if(!isset($alocation['unpaid'])){$alocation['unpaid']=array();}
  6390.                       if(!isset($alocation['unpaid']['y'.$yh])){$alocation['unpaid']['y'.$yh]=array();}
  6391.                       if(!isset($alocation['unpaid']['y'.$yh]['value'])){$alocation['unpaid']['y'.$yh]['date']=array();}
  6392.                       if(!isset($alocation['unpaid']['y'.$yh]['value'])){$alocation['unpaid']['y'.$yh]['value']=0;}
  6393.                       $ucdate=count($alocation['unpaid']['y'.$yh]['date']);
  6394.                       $alocation['unpaid']['y'.$yh]['date'][$ucdate]=array();
  6395.                       $alocation['unpaid']['y'.$yh]['date'][$ucdate]['date']=date('Y-m-d',$tmh);
  6396.                       $alocation['unpaid']['y'.$yh]['date'][$ucdate]['value']=$hh;
  6397.                       $alocation['unpaid']['y'.$yh]['value']+=($hh-$mclt);
  6398.                     }else{
  6399.                       if(!isset($alocation['unpaid'])){$alocation['unpaid']=array();}
  6400.                       if(!isset($alocation['unpaid']['y'.$yh])){$alocation['unpaid']['y'.$yh]=array();}
  6401.                       if(!isset($alocation['unpaid']['y'.$yh]['value'])){$alocation['unpaid']['y'.$yh]['date']=array();}
  6402.                       if(!isset($alocation['unpaid']['y'.$yh]['value'])){$alocation['unpaid']['y'.$yh]['value']=0;}
  6403.                       $ucdate=count($alocation['unpaid']['y'.$yh]['date']);
  6404.                       $alocation['unpaid']['y'.$yh]['date'][$ucdate]=array();
  6405.                       $alocation['unpaid']['y'.$yh]['date'][$ucdate]['date']=date('Y-m-d',$tmh);
  6406.                       $alocation['unpaid']['y'.$yh]['date'][$ucdate]['value']=$hh;
  6407.                       $alocation['unpaid']['y'.$yh]['value']+=$hh;
  6408.                     }
  6409.                     $entbyyear['u'.$uidmc]['y'.$yh]['t'.$lvtypeid]['left']=0;
  6410.                     $updateentmc['x'.$uidmc.'x'.$yh.'x'.$lvtypeid]=0;
  6411.                 }else{
  6412.                   if(!isset($alocation['y'.$yh])){$alocation['y'.$yh]=0;}
  6413.                   $alocation['y'.$yh]+=$hh;
  6414.                   $entbyyear['u'.$uidmc]['y'.$yh]['t'.$lvtypeid]['left']-=$hh;
  6415.                   $updateentmc['x'.$uidmc.'x'.$yh.'x'.$lvtypeid]=$entbyyear['u'.$uidmc]['y'.$yh]['t'.$lvtypeid]['left'];
  6416.                 }
  6417.               }else{
  6418.                 if(!isset($alocation['unpaid'])){$alocation['unpaid']=array();}
  6419.                 if(!isset($alocation['unpaid']['y'.$yh])){$alocation['unpaid']['y'.$yh]=array();}
  6420.                 if(!isset($alocation['unpaid']['y'.$yh]['value'])){$alocation['unpaid']['y'.$yh]['date']=array();}
  6421.                 if(!isset($alocation['unpaid']['y'.$yh]['value'])){$alocation['unpaid']['y'.$yh]['value']=0;}
  6422.                 $ucdate=count($alocation['unpaid']['y'.$yh]['date']);
  6423.                 $alocation['unpaid']['y'.$yh]['date'][$ucdate]=array();
  6424.                 $alocation['unpaid']['y'.$yh]['date'][$ucdate]['date']=date('Y-m-d',$tmh);
  6425.                 $alocation['unpaid']['y'.$yh]['date'][$ucdate]['value']=$hh;
  6426.                 $alocation['unpaid']['y'.$yh]['value']+=$hh;
  6427.               }
  6428.             }else{
  6429.               if(!isset($alocation['unpaid'])){$alocation['unpaid']=array();}
  6430.               if(!isset($alocation['unpaid']['y'.$yh])){$alocation['unpaid']['y'.$yh]=array();}
  6431.               if(!isset($alocation['unpaid']['y'.$yh]['value'])){$alocation['unpaid']['y'.$yh]['date']=array();}
  6432.               if(!isset($alocation['unpaid']['y'.$yh]['value'])){$alocation['unpaid']['y'.$yh]['value']=0;}
  6433.               $ucdate=count($alocation['unpaid']['y'.$yh]['date']);
  6434.               $alocation['unpaid']['y'.$yh]['date'][$ucdate]=array();
  6435.               $alocation['unpaid']['y'.$yh]['date'][$ucdate]['date']=date('Y-m-d',$tmh);
  6436.               $alocation['unpaid']['y'.$yh]['date'][$ucdate]['value']=$hh;
  6437.               $alocation['unpaid']['y'.$yh]['value']+=$hh;
  6438.             }
  6439.           }else{
  6440.             if(!isset($alocation['unpaid'])){$alocation['unpaid']=array();}
  6441.             if(!isset($alocation['unpaid']['y'.$yh])){$alocation['unpaid']['y'.$yh]=array();}
  6442.             if(!isset($alocation['unpaid']['y'.$yh]['value'])){$alocation['unpaid']['y'.$yh]['date']=array();}
  6443.             if(!isset($alocation['unpaid']['y'.$yh]['value'])){$alocation['unpaid']['y'.$yh]['value']=0;}
  6444.             $ucdate=count($alocation['unpaid']['y'.$yh]['date']);
  6445.             $alocation['unpaid']['y'.$yh]['date'][$ucdate]=array();
  6446.             $alocation['unpaid']['y'.$yh]['date'][$ucdate]['date']=date('Y-m-d',$tmh);
  6447.             $alocation['unpaid']['y'.$yh]['date'][$ucdate]['value']=$hh;
  6448.             $alocation['unpaid']['y'.$yh]['value']+=$hh;
  6449.           }  
  6450.         }else{
  6451.           if(!isset($alocation['y'.$yh])){$alocation['y'.$yh]=0;}
  6452.           $alocation['y'.$yh]+=$hh;
  6453.         }
  6454.         $tdays+=$hh;
  6455.         /*$hf=fopen('../var/log/test.log','a');
  6456.         ob_start();
  6457.         //print_r($testresult);
  6458.         print_r($option['id'].'->'.$tdays);
  6459.         print_r("\n");
  6460.         $txt=ob_get_clean();
  6461.         fwrite($hf,$txt);
  6462.         fclose($hf);*/
  6463.       }
  6464.       
  6465.       
  6466.         if(!is_null($opt['updateby'])){
  6467.           $tmphismc['createBy']=$opt['updateby']->getId();
  6468.         }else if(!is_null($opt['user'])){
  6469.           $tmphismc['createBy']=$opt['user']->getId();
  6470.         }
  6471.       
  6472.       $opt['attributes']['historymc']=$historymc;
  6473.       $opt['attributes']['mc']=$mcallocation;
  6474.       $opt['attributes']['mcp']=$mchalf;
  6475.       if(is_null($leaveRequest)){ 
  6476.         $leaveRequest = new LeaveRequest();
  6477.       } 
  6478.       $manualapp=false;
  6479.       if(isset($opt['attributes']['autoapproved'])){
  6480.         if(isset($option['isApproved'])){
  6481.           if($option['isApproved']){
  6482.             $manualapp=true;
  6483.           }
  6484.         }
  6485.       }else{
  6486.         if(!isset($opt['attributes']['manualapproved'])){
  6487.           if(!is_null($opt['isApproved'])){
  6488.             $manualapp=true;
  6489.           }
  6490.         }
  6491.       }
  6492.       
  6493.       if($manualapp){
  6494.         $opt['attributes']['manualapproved']=true;
  6495.         unset($opt['attributes']['autoapproved']);
  6496.       }else{
  6497.         $opt['attributes']['autoapproved']=true;
  6498.         if(isset($opt['attributes']['file'])){
  6499.           if($opt['attributes']['file']!=''){
  6500.             if(is_null($opt['isApproved'])){$isApproved=true;}
  6501.           }
  6502.         }else{
  6503.           if($tdays <= 1){
  6504.                   
  6505.             $isApproved=true;
  6506.             if(!is_null($leaveRequest)){
  6507.               $createdat=$leaveRequest->getCreatedAt();
  6508.         
  6509.               /*if($leaveRequest->getEndDate() < $leaveRequest->getCreatedAt()){
  6510.                 $hf=fopen('../var/log/test.log','a');
  6511.                     ob_start();
  6512.                     //print_r($testresult);
  6513.                     print_r($leaveRequest->getEndDate());
  6514.                     print_r("\n");
  6515.                     print_r($leaveRequest->getCreatedAt());
  6516.                     print_r("\n");
  6517.                     print_r("\n");
  6518.                     $txt=ob_get_clean();
  6519.                     fwrite($hf,$txt);
  6520.                     fclose($hf); 
  6521.                 $isApproved=false;
  6522.               }*/
  6523.             }
  6524.           }else{
  6525.             $isApproved=false;
  6526.           } 
  6527.           
  6528.         }
  6529.       }
  6530.      
  6531.       $leaveRequest->setUser($opt['user']);
  6532.       $leaveRequest->setStartDate($mcdate['startDate']);
  6533.       $leaveRequest->setEndDate($mcdate['endDate']);
  6534.       $leaveRequest->setIsHalfStart($opt['am']);
  6535.       $leaveRequest->setIsHalfEnd($opt['pm']);
  6536.       $leaveRequest->setIsApproved($isApproved);
  6537.       $leaveRequest->setLeaveType($opt['leaveType']);
  6538.       $leaveRequest->setDays($tdays);
  6539.       $leaveRequest->setAttributes($opt['attributes']);
  6540.       $leaveRequest->setComment($opt['comment']);
  6541.       if(!is_null($isApproved)){
  6542.         $leaveRequest->setReviewedBy($opt['reviewBy']);
  6543.       }
  6544.       $leaveRequest->setAlocation($alocation);
  6545.       if(isset($opt['log'])){
  6546.         if(!is_array($opt['log'])){$opt['log']=array();}
  6547.         if(isset($opt['log']) && count($opt['log']) > 0){
  6548.           $leaveRequest->setLog($opt['log']);
  6549.         }
  6550.       }
  6551.       $updatedate=null;
  6552.       if(is_null($olddata)){
  6553.         $updatedate=null;
  6554.         if(!is_null($createdatdate2)){
  6555.           $leaveRequest->setCreatedAt($createdatdate2);
  6556.           if(!is_null($updateby)){
  6557.             $leaveRequest->setCreatedBy($updateby);
  6558.           }else{
  6559.             if(is_null($opt['updateby'])){$opt['updateby']=$opt['user'];} 
  6560.             $leaveRequest->setCreatedBy($opt['updateby']->getId());
  6561.           }
  6562.           if($opt['saveupdate']==true){
  6563.             $leaveRequest->setUpdatedAt(new \DateTime());
  6564.             if(is_null($opt['updateby'])){$opt['updateby']=$opt['user'];}
  6565.             $leaveRequest->setUpdatedBy($opt['updateby']);
  6566.             $updatedate=new \DateTime();
  6567.           }
  6568.         }else{
  6569.           $leaveRequest->setCreatedAt(new \DateTime());
  6570.           if(is_null($opt['updateby'])){$opt['updateby']=$opt['user'];}
  6571.           $leaveRequest->setCreatedBy($opt['updateby']->getId());
  6572.         }  
  6573.       }else{
  6574.         if($opt['saveupdate']==true){
  6575.           $leaveRequest->setUpdatedAt(new \DateTime());
  6576.           if(is_null($opt['updateby'])){$opt['updateby']=$opt['user'];}
  6577.           $leaveRequest->setUpdatedBy($opt['updateby']);
  6578.           $updatedate=new \DateTime();
  6579.         }
  6580.       }
  6581.       
  6582.       try {
  6583.         $em->persist($leaveRequest);
  6584.         $em->flush();
  6585.       } catch (Exception $e) {
  6586.         //throw $th;
  6587.       }
  6588.        
  6589.       
  6590.       $rqidx=$leaveRequest->getId();
  6591.       if(!isset($tmphismc['startDate'])){
  6592.         $stdt=new \DateTime($leaveRequest->getStartDate()->format('Y-m-d'));
  6593.         $endt=new \DateTime($leaveRequest->getEndDate()->format('Y-m-d'));
  6594.         $tmphismc['startDate']=$stdt->format('Y-m-d');
  6595.         $tmphismc['endDate']=$endt->format('Y-m-d');
  6596.         $tmphismc['am']=$leaveRequest->getIsHalfStart();
  6597.         $tmphismc['pm']=$leaveRequest->getIsHalfEnd();
  6598.         $tmphismc['day']=$leaveRequest->getDays();
  6599.         $tmphismc['createDate']=$leaveRequest->getCreatedAt()->format('Y-m-d');
  6600.       }  
  6601.       $opt['attributes']['historymc']['d'.$rqidx]=$tmphismc;
  6602.       
  6603.       $leaveRequest->setAttributes($opt['attributes']);
  6604.       $em->persist($leaveRequest);
  6605.       $em->flush(); 
  6606.       if(isset($opt['attributes']['historymc']) && isset($updatedate) && !is_null($updatedate)){
  6607.         foreach($opt['attributes']['historymc'] as $dt){
  6608.           if(isset($dt['createDate'])){
  6609.             $cd=new \DateTime($dt['createDate']);
  6610.             if($cd $updatedate){$updatedate=$cd;}
  6611.           }
  6612.         }
  6613.       }
  6614.       foreach($updateentmc as $kre=>$re){
  6615.         $krc=explode('x',$kre);
  6616.         $leaveentr=$em->getRepository(\App\Entity\LeaveEntitlement::class)->findBy(array('user'=>$krc[1],'year'=>$krc[2],'leaveType'=>$krc[3]));
  6617.         if(!is_null($leaveentr)){
  6618.           foreach($leaveentr as $xl){
  6619.             $xl->setLeaveLeft($re);
  6620.             $em->persist($xl);
  6621.             $em->flush();
  6622.           }
  6623.         }
  6624.       }
  6625.     }else{
  6626.       if(is_null($leaveRequest)){ 
  6627.         $leaveRequest = new LeaveRequest();
  6628.       }  
  6629.         $back $leaveRequest->getAlocation();
  6630.         if(is_null($back)){$back=array();}
  6631.         $alocation = array();
  6632.         if(isset($back['child'])){
  6633.           foreach ($back['child'] as $kb => $bchild) {
  6634.             $yr str_replace('y'''$kb);
  6635.             foreach ($bchild as $kb1 => $vb1) {
  6636.                 $cid str_replace('c'''$kb1);
  6637.                 //$chde = $this->getDoctrine()->getRepository(LeaveEntitlement::class)->findBy(array('user' => $userData, 'id' => $cid, 'year' => $yr));
  6638.                 if (isset($entbyid['c'.$cid])) {
  6639.                     //for ($bb = 0; $bb < count($chde); $bb++) {
  6640.                         $lf $entbyid['c'.$cid]->getLeaveLeft();
  6641.                         $lf $lf $vb1;
  6642.                         $entbyid['c'.$cid]->setLeaveLeft($lf);
  6643.                         $em->persist($entbyid['c'.$cid]);
  6644.                         $em->flush();
  6645.                     //}
  6646.                 }
  6647.             }
  6648.           }
  6649.         }
  6650.         if ($isap == 0) {
  6651.           foreach ($back as $k => $v) {
  6652.             $yr str_replace('y'''$k);
  6653.             switch ($k) {
  6654.                 case 'data':
  6655.                   break; 
  6656.                 case 'error':
  6657.                     break;
  6658.                 case 'type':
  6659.                     break; 
  6660.                 case 'dumper':
  6661.                       break;      
  6662.                 case 'child':
  6663.                     break;
  6664.                 case 'unpaid':
  6665.                     break;
  6666.                 default:
  6667.                     $yr str_replace('y'''$k);
  6668.                     $alocation['y' $yr] = 0;
  6669.                     break;
  6670.             }
  6671.           }
  6672.         } else {
  6673.           $alocation $this->calculate($opt['user'], $opt['leaveType'], $opt['startDate'], $opt['endDate'], $back, array('am' => $opt['am'], 'pm' => $opt['pm']));
  6674.           foreach ($back as $k => $v) {
  6675.               $yr str_replace('y'''$k);
  6676.               switch ($k) {
  6677.                   case 'data':
  6678.                     break;
  6679.                   case 'error':
  6680.                       break;
  6681.                   case 'child':
  6682.                       break;
  6683.                   case 'dumper':
  6684.                       break;    
  6685.                   case 'type':
  6686.                       break;    
  6687.                   case 'unpaid':
  6688.                       break;
  6689.                   default:
  6690.                       if (!isset($alocation['y' $yr])) {
  6691.                           $alocation['y' $yr] = 0;
  6692.                       }
  6693.                       break;
  6694.               }
  6695.           }
  6696.           if ($alocation != false) {
  6697.             $dy 0;
  6698.             $okd false;
  6699.             $upn=false;
  6700.             foreach ($alocation as $ka => $a) {
  6701.                 switch ($ka) {
  6702.                     case 'data':
  6703.                       break;
  6704.                       case 'dumper':
  6705.                         break;  
  6706.                     case 'error':
  6707.                         break;
  6708.                     case 'type':
  6709.                         break;
  6710.                     case 'dumper':
  6711.                           break;    
  6712.                     case 'child':
  6713.                         foreach($a as $aa){
  6714.                           foreach($aa as $aaa){
  6715.                             $dy += $aaa;
  6716.                           }  
  6717.                         }
  6718.                         $okd true
  6719.                         break;
  6720.                     case 'unpaid':
  6721.                         if($typ!='sick'){
  6722.                           foreach($a as $aa){
  6723.                             $dy += $aa['value'];
  6724.                           }
  6725.                           $okd true;
  6726.                         }
  6727.                         break; 
  6728.                     case 'type':
  6729.                       break; 
  6730.                     case 'dumper':
  6731.                       break;       
  6732.                     default:
  6733.                         $dy += $a;
  6734.                         $okd true;
  6735.                         break;
  6736.                 }
  6737.             }
  6738.             if($dy==0){
  6739.               foreach ($alocation as $ka => $a) {
  6740.                 switch ($ka) {
  6741.                     case 'data':
  6742.                       break;
  6743.                       case 'dumper':
  6744.                         break;  
  6745.                     case 'error':
  6746.                         break;
  6747.                     case 'type':
  6748.                         break;    
  6749.                     case 'child':
  6750.                         break; 
  6751.                     case 'dumper':
  6752.                       break;    
  6753.                     case 'unpaid':
  6754.                           foreach($a as $aa){
  6755.                             $dy += $aa['value'];
  6756.                           }
  6757.                           $okd true;
  6758.                         break;    
  6759.                     default:
  6760.                         break;
  6761.                 }
  6762.             }          
  6763.             }
  6764.             if ($okd) {
  6765.                 $opt['days'] = $dy;
  6766.             }    
  6767.           }
  6768.         }
  6769.         if($opt['days']==0){
  6770.           if(!is_null($olddata)){
  6771.             $opt['days']=$olddata->getDays();
  6772.           }  
  6773.         }
  6774.         $leaveRequest->setUser($opt['user']);
  6775.         $leaveRequest->setStartDate($opt['startDate']);
  6776.         $leaveRequest->setEndDate($opt['endDate']);
  6777.         $leaveRequest->setIsHalfStart($opt['am']);
  6778.         $leaveRequest->setIsHalfEnd($opt['pm']);
  6779.         $leaveRequest->setIsApproved($isApproved);
  6780.         $leaveRequest->setLeaveType($opt['leaveType']);
  6781.         $leaveRequest->setDays($opt['days']);
  6782.         $leaveRequest->setAttributes($opt['attributes']);
  6783.         $leaveRequest->setComment($opt['comment']);
  6784.         if(!is_null($isApproved)){
  6785.           $leaveRequest->setReviewedBy($opt['reviewBy']);
  6786.         }
  6787.         $leaveRequest->setAlocation($alocation);
  6788.         if(isset($opt['log']) && count($opt['log']) > 0){
  6789.           $leaveRequest->setLog($opt['log']);
  6790.         }
  6791.     
  6792.         if(is_null($olddata)){
  6793.           $leaveRequest->setCreatedAt(new \DateTime());
  6794.           $leaveRequest->setCreatedBy($opt['updateby']->getId());
  6795.         }else{
  6796.           if($opt['saveupdate']==true){
  6797.             $leaveRequest->setUpdatedAt(new \DateTime());
  6798.             $leaveRequest->setUpdatedBy($opt['updateby']);
  6799.           }
  6800.         }
  6801.     
  6802.         $em->persist($leaveRequest);
  6803.         $em->flush();
  6804.         $userupd=$leaveRequest->getUser()->getId();
  6805.         if(isset($opt['updateby'])){
  6806.           if(!is_null($opt['updateby'])){
  6807.             if(is_null($olddata)){
  6808.               $userupd=$opt['updateby']->getId();
  6809.             }else{  
  6810.               $userupd=$opt['updateby'];
  6811.             }  
  6812.           }
  6813.         }
  6814.         if(isset($option['setlog'])){
  6815.           $this->log->save($leaveRequest->getUser(), [
  6816.             'owner' => $leaveRequest->getUser(),
  6817.             'message' => $option['setlog'],
  6818.             'old_data' => $olddatalog,
  6819.             'new_data' => $leaveRequest
  6820.         ]);
  6821.         }
  6822.         $this->updateEntitlementFromLeave($opt['user'], $opt['leaveType'], $alocation$back);        
  6823.     }    
  6824.     /*if(!isset($opt['attributes']['history'])){
  6825.       $opt['attributes']['history']=array();
  6826.     }
  6827.     if(count($removeidmc) > 0){
  6828.       
  6829.       foreach($removeidmc as $rm){
  6830.         if(is_array($attridmc[$rm['no']])){
  6831.           foreach($attridmc[$rm['no']] as $k=>$v){
  6832.             if(isset($opt['attributes'][$k])){
  6833.               if($k=='gcalid'){
  6834.               }else if($k=='history'){
  6835.                 foreach($v as $history){
  6836.                   $opt['attributes']['history'][count($opt['attributes']['history'])]=$history;
  6837.                 }
  6838.               }else{    
  6839.                 $opt['attributes'][$k].=','.$v;
  6840.               }
  6841.             }
  6842.           }
  6843.         }
  6844.         if(is_array($logidmc[$rm['no']])){
  6845.           foreach($logidmc as $v){
  6846.             $opt['log'][count($opt['log'])]=$v;
  6847.           }
  6848.         }
  6849.       }
  6850.       foreach($opt['attributes'] as $k=>$v){
  6851.         if(!is_array($opt['attributes'][$k])){
  6852.           $opt['attributes'][$k]=trim($v,',');
  6853.         }
  6854.       }
  6855.     }
  6856.     $today=new \DateTime();
  6857.     $historyc=count($opt['attributes']['history']);
  6858.     $opt['attributes']['history'][$historyc]=array();
  6859.     $opt['attributes']['history'][$historyc]['date']=$today->format('Y-m-d H:i:s');
  6860.     $opt['attributes']['history'][$historyc]['day']=$opt['days'];
  6861.     $opt['attributes']['history'][$historyc]['startDate']=$opt['startDate']->format('Y-m-d');
  6862.     $opt['attributes']['history'][$historyc]['endDate']=$opt['endDate']->format('Y-m-d');
  6863.     $opt['attributes']['history'][$historyc]['remove']=array();
  6864.     if(count($removeidmc) > 0){
  6865.       foreach($removeidmc as $rm){
  6866.         $opt['attributes']['history'][$historyc]['remove'][count($opt['attributes']['history'][$historyc]['remove'])]=$idmcdellist[$rm['no']];
  6867.       }
  6868.     }
  6869.     $opt['attributes']['history'][$historyc]['current']=$currentopt;
  6870.     
  6871.     $rqid=array();
  6872.     $rgcalid=array();
  6873.     if(count($removeidmc) > 0){
  6874.       
  6875.       foreach($removeidmc as $rm){
  6876.         $rqid[count($rqid)]=$rm['id'];
  6877.       }
  6878.       $removeRequest = $em->getRepository(LeaveRequest::class)->findBy(array('id'=>$rqid));
  6879.       foreach($removeRequest as $r){
  6880.         $rattr=$r->getAttributes();
  6881.         if(isset($rattr['gcalid'])){
  6882.           $rgcalid[count($rgcalid)]=$rattr['gcalid'];
  6883.         }
  6884.         $this->deleteRequest($r);
  6885.       }  
  6886.     } */
  6887.     $leaves=clone $leaveRequest;
  6888.     $lefts=$this->_lefts(array(
  6889.       'user'=>$opt['user'],
  6890.       'start'=>$opt['startDate']->format('Y-m-d'),
  6891.       'end'=>$opt['endDate']->format('Y-m-d')
  6892.     ));
  6893.     if(isset($lefts['u'.$opt['user']->getId()]['y'.$opt['startDate']->format('Y')]['t'.$opt['leaveType']->getId()])){
  6894.       $leaves->setDaysLeft($lefts['u'.$opt['user']->getId()]['y'.$opt['startDate']->format('Y')]['t'.$opt['leaveType']->getId()]);
  6895.     }else{
  6896.       $leaves->setDaysLeft(0);
  6897.     }
  6898.     /*'remove'=>$rqid,
  6899.       'rgcalid'=>$rgcalid*/
  6900.       /*$txt=ob_get_clean();
  6901.       fwrite($hftest,$txt);
  6902.       fclose($hftest);*/
  6903.     return array(
  6904.       'data'=>$leaves,
  6905.       'olddata'=>$olddata,
  6906.       'isupdate'=>$isupdate,
  6907.       'remove'=>$removedmc,
  6908.       'rgcalid'=>$removedgmc,
  6909.       'updatedate'=>$updatedate
  6910.     );
  6911.   }
  6912.   public function saveRequest2($option=array()){
  6913.     $default=array(
  6914.       'id'=>null,
  6915.       'user'=>null,
  6916.       'leaveType'=>null,
  6917.       'startDate'=>null,
  6918.       'endDate'=>null,
  6919.       'isApproved'=>null,
  6920.       'am'=>false,
  6921.       'pm'=>false,
  6922.       'days'=>0,
  6923.       'attributes'=>array(),
  6924.       'comment'=>'',
  6925.       'saveupdate'=>true,
  6926.       'updateby'=>null,
  6927.       'reviewBy'=>null,
  6928.     );
  6929.     $opt=$default;
  6930.     $opt['log']=array();
  6931.     $currentopt=array();
  6932.     if(isset($option['startDate'])){
  6933.       $currentopt['startDate']=$option['startDate']->format('Y-m-d');
  6934.     }
  6935.     if(isset($option['endDate'])){
  6936.       $currentopt['endDate']=$option['endDate']->format('Y-m-d');
  6937.     }
  6938.     if(isset($option['days'])){
  6939.       $currentopt['days']=$option['days'];
  6940.     }
  6941.     $em $this->entityManager;
  6942.     $leaveRequest=null;
  6943.     $olddata null;
  6944.     $olddatalog null;
  6945.     $isupdate=false;
  6946.     $entbyid=array();
  6947.     $ent=array();
  6948.     $entbyyear=array();
  6949.     $leaveent=$em->getRepository(LeaveEntitlement::class)->findAll();
  6950.     foreach($leaveent as $l){
  6951.       $uid=$l->getUser()->getId();
  6952.       $yr=$l->getYear();
  6953.       $ty=$l->getLeaveType()->getId();
  6954.       $entbyid['c'.$l->getId()]=$l;
  6955.       if(!isset($entbyyear['u'.$uid])){$entbyyear['u'.$uid]=array();}
  6956.       if(!isset($entbyyear['u'.$uid]['y'.$yr])){$entbyyear['u'.$uid]['y'.$yr]=array();}
  6957.       if(!isset($entbyyear['u'.$uid]['y'.$yr]['t'.$ty])){
  6958.         $entbyyear['u'.$uid]['y'.$yr]['t'.$ty]=array();
  6959.         $entbyyear['u'.$uid]['y'.$yr]['t'.$ty]['left'] =$l->getLeaveLeft();
  6960.         $entbyyear['u'.$uid]['y'.$yr]['t'.$ty]['ent']=$l;
  6961.       }
  6962.     }
  6963.     /*print_r("");
  6964.     print_r("\n");*/
  6965.     if(isset($option['id'])){
  6966.       $leaveRequest $em->getRepository(LeaveRequest::class)->find($option['id']);
  6967.       if(!is_null($leaveRequest)){ 
  6968.         $olddata = clone $leaveRequest;$isupdate=true;
  6969.         $olddatalog=clone $olddata;
  6970.       }
  6971.     }
  6972.     if(!is_null($olddata)){
  6973.       $opt['isApproved'] = $olddata->getIsApproved();
  6974.       $opt['am'] = $olddata->getIsHalfStart();
  6975.       $opt['pm'] = $olddata->getIsHalfEnd();
  6976.       $opt['comment'] = $olddata->getComment();
  6977.       $opt['attributes'] = $olddata->getAttributes();
  6978.       $opt['startDate'] = $olddata->getStartDate();
  6979.       $opt['endDate'] = $olddata->getEndDate();
  6980.       $opt['leaveType']=$olddata->getLeaveType();
  6981.       $opt['user']=$olddata->getUser();
  6982.       $opt['reviewBy']=$olddata->getReviewedBy();
  6983.       $opt['log']=$olddata->getLog();
  6984.     }
  6985.     $idmc=array();
  6986.     $idmclist=array();
  6987.     $attridmc=array();
  6988.     $logidmc=array();
  6989.     $idmcdellist=array();
  6990.     $ismc=false;
  6991.     $ismccheck=true;
  6992.     $mcdate=array();
  6993.     $updatedate=null;
  6994.     $updateby=null;
  6995.     $mchalf=array();
  6996.     $oldmchalf=array();
  6997.     if(!is_null($opt['leaveType'])){$option['leaveType']=$opt['leaveType'];}
  6998.     if(!is_null($opt['user'])){$option['user']=$opt['user'];}
  6999.     if(isset($option['leaveType'])){
  7000.       if($option['leaveType']->getLeaveName()=='sick'){
  7001.         $ismc=true;
  7002.         if(isset($option['id']) && !is_null($olddata)){
  7003.           $mcdate['startDate']= new \DateTime($opt['startDate']->format('Y-m-d'));
  7004.           $mcdate['endDate']= new \DateTime($opt['endDate']->format('Y-m-d'));
  7005.         }
  7006.         if(isset($option['startDate']) && !is_null($option['startDate'])){$mcdate['startDate']=new \DateTime($option['startDate']->format('Y-m-d'));}
  7007.         if(isset($option['endDate']) && !is_null($option['endDate'])){$mcdate['endDate']=new \DateTime($option['endDate']->format('Y-m-d'));}
  7008.       }
  7009.     }  
  7010.     $mcallocation=array();
  7011.     $historymc=array();
  7012.     $tmphismc=array();
  7013.     if($ismc){
  7014.       if(!is_null($option['leaveType'])){
  7015.         $ucountry=$option['leaveType']->getOffice()->getCountry();
  7016.       }elseif(!is_null($option['user'])){
  7017.         $ucountry=$option['user']->getOffice()->getCountry();
  7018.       }
  7019.       $holidays=array();
  7020.       $holidaydt=$em->getRepository(\App\Entity\LeaveBankHoliday::class)->findAll();
  7021.       foreach($holidaydt as $hl){
  7022.         $loc=$hl->getLocation();
  7023.         if(!isset($holidays[$loc])){$holidays[$loc]=array();}
  7024.         $shl=new \DateTime($hl->getDate()->format('Y-m-d'));
  7025.         if(is_null($hl->getEndDate())){
  7026.           $ehl=new \DateTime($hl->getDate()->format('Y-m-d'));
  7027.         }else{
  7028.           $ehl=new \DateTime($hl->getEndDate()->format('Y-m-d'));
  7029.         }  
  7030.        
  7031.         $inval=date_diff($ehl,$shl);
  7032.         $inval=abs($inval->d)+1;
  7033.         for($hv=0;$hv<$inval;$hv++){
  7034.           $holidays[$loc][count($holidays[$loc])]=$shl->format('Y-m-d');
  7035.           $shl->modify('+1 day');
  7036.         }
  7037.       }
  7038.       $offdays=array(0,6);
  7039.       $offdaysdt=array(6,7);
  7040.       if(isset($mcdate['startDate']) && isset($mcdate['endDate'])){
  7041.         if($ismccheck){
  7042.           $stdatemc = new \DateTime($mcdate['startDate']->format('Y-m-d'));
  7043.             $stdatemc->modify('-30 days');
  7044.             $endatemc = new \DateTime($mcdate['endDate']->format('Y-m-d'));
  7045.             $endatemc->modify('+30 days');
  7046.             $getsick=$em->getRepository(LeaveRequest::class)->createQueryBuilder('a')
  7047.             ->select('a')
  7048.             ->where('a.user = :user')
  7049.             ->andWhere('a.leaveType in (:leavetype)')
  7050.             ->andWhere('a.startDate >= :from')
  7051.             ->andWhere('a.startDate <= :to')
  7052.             ->setParameter('from',$stdatemc)
  7053.             ->setParameter('to',  $endatemc)
  7054.             ->setParameter('leavetype',  $option['leaveType'])
  7055.             ->setParameter('user',  $option['user'])
  7056.             ->orderBy('a.startDate')
  7057.             ->getQuery()
  7058.             ->getResult();
  7059.           if(!is_null($getsick)){
  7060.             $rqidx=-1;
  7061.             if(!is_null($leaveRequest)){$rqidx=$leaveRequest->getId();}
  7062.             foreach($getsick as $gs){
  7063.               $attrmc=$gs->getAttributes();
  7064.               $startmc=$gs->getStartDate();
  7065.               $endmc=$gs->getEndDate();
  7066.               $tidmc=-1;
  7067.               if($gs->getId()!=$rqidx){
  7068.                 $lessstart=new \DateTime($mcdate['startDate']->format('Y-m-d'));
  7069.                 $lessstart->modify('-1 day');
  7070.                 $lsok=false;
  7071.                 if(in_array($lessstart->format('N'),$offdaysdt)){$lsok=true;}
  7072.                 if(isset($holidays[$ucountry])){
  7073.                   if(in_array($lessstart->format('Y-m-d'),$holidays[$ucountry])){
  7074.                     $lsok=true;
  7075.                   }
  7076.                 }
  7077.                 while($lsok){
  7078.                   $lsok=false;
  7079.                   $lessstart->modify('-1 day');
  7080.                   if(in_array($lessstart->format('N'),$offdaysdt)){$lsok=true;}
  7081.                   if(isset($holidays[$ucountry])){
  7082.                     if(in_array($lessstart->format('Y-m-d'),$holidays[$ucountry])){
  7083.                       $lsok=true;
  7084.                     }
  7085.                   }
  7086.                 }
  7087.                 $lessend=new \DateTime($mcdate['endDate']->format('Y-m-d'));
  7088.                 $lessend->modify('+1 day');
  7089.                 $lsok=false;
  7090.                 if(in_array($lessend->format('N'),$offdaysdt)){$lsok=true;}
  7091.                 if(isset($holidays[$ucountry])){
  7092.                   if(in_array($lessend->format('Y-m-d'),$holidays[$ucountry])){
  7093.                     $lsok=true;
  7094.                   }
  7095.                 }
  7096.                 while($lsok){
  7097.                   $lsok=false;
  7098.                   $lessend->modify('+1 day');
  7099.                   if(in_array($lessend->format('N'),$offdaysdt)){$lsok=true;}
  7100.                   if(isset($holidays[$ucountry])){
  7101.                     if(in_array($lessend->format('Y-m-d'),$holidays[$ucountry])){
  7102.                       $lsok=true;
  7103.                     }
  7104.                   }
  7105.                 }  
  7106.                 if(($lessstart >= $startmc) && ($lessend <= $endmc)){$tidmc=$gs->getId();}
  7107.                 if(($lessstart <= $startmc) && ($lessend >= $startmc)){$tidmc=$gs->getId();}
  7108.                 if(($lessstart <= $endmc) && ($lessend >= $endmc)){$tidmc=$gs->getId();}
  7109.                 
  7110.                 
  7111.               }else{
  7112.                 $tidmc=$gs->getId();
  7113.                 if(isset($currentopt['startDate']) && isset($currentopt['endDate'])){
  7114.                   $endmc=new \DateTime($currentopt['endDate']);
  7115.                   $startmc=new \DateTime($currentopt['startDate']);
  7116.                 }
  7117.                 
  7118.               }  
  7119.               if($tidmc > -1){
  7120.                 if($mcdate['endDate'] < $endmc){$mcdate['endDate']=$endmc;}
  7121.                 if($mcdate['startDate'] > $startmc){$mcdate['startDate']=$startmc;}
  7122.                 $idmclist[count($idmc)]=$gs;
  7123.                 $idmc[count($idmc)]=$tidmc;
  7124.               }
  7125.             }
  7126.             foreach($idmclist as $ml){
  7127.               $sdtmc=new \DateTime($ml->getStartDate()->format('Y-m-d'));
  7128.               $edtmc=new \DateTime($ml->getEndDate()->format('Y-m-d'));
  7129.               $intmc=date_diff($sdtmc,$edtmc);
  7130.               $intmc=abs($intmc->d)+1;
  7131.               $attrmc=$ml->getAttributes();
  7132.               if(isset($attrmc['historymc'])){
  7133.                 foreach($attrmc['historymc'] as $kh=>$h){
  7134.                     $historymc[$kh]=$h;
  7135.                 }
  7136.               }
  7137.               for($d=0;$d<$intmc;$d++){
  7138.                   $dvx=1;
  7139.                   $dv=new \DateTime($sdtmc->format('Y-m-d'));
  7140.                   $okadd=true;
  7141.                   if(in_array(date('w',strtotime($dv->format('Y-m-d'))),$offdays)){$okadd=false;}
  7142.                   if(isset($ucountry)){
  7143.                     if(isset($holidays[$ucountry])){
  7144.                       if(in_array($dv->format('Y-m-d'),$holidays[$ucountry])){$okadd=false;}
  7145.                     }
  7146.                   }
  7147.                   
  7148.                   if($okadd){
  7149.                     if(!isset($mcallocation['d'.$dv->format('Y-m-d')])){
  7150.                       $mcallocation['d'.$dv->format('Y-m-d')]=array();
  7151.                       $mcallocation['d'.$dv->format('Y-m-d')]=0;
  7152.                     }
  7153.                     
  7154.                     if($d==0){
  7155.                       if(!is_null($ml->getIsHalfStart())){
  7156.                         if(($ml->getIsHalfStart()==true) || ($ml->getIsHalfStart()==1)){$dvx=0.5;}
  7157.                       }
  7158.                     }
  7159.                     if($d==($intmc-1)){
  7160.                       if(!is_null($ml->getIsHalfEnd())){
  7161.                         if(($ml->getIsHalfEnd()==true) || ($ml->getIsHalfEnd()==1)){$dvx=0.5;}
  7162.                       }
  7163.                     }
  7164.                     
  7165.                     if(isset($attrmc['mc'])){
  7166.                       if(isset($attrmc['mc']['d'.$dv->format('Y-m-d')])){
  7167.                         $dvx=$attrmc['mc']['d'.$dv->format('Y-m-d')]; 
  7168.                         $mcallocation['d'.$dv->format('Y-m-d')]=$dvx;
  7169.                       }else{
  7170.                         $mcallocation['d'.$dv->format('Y-m-d')]=$dvx;
  7171.                       }
  7172.                     }else{
  7173.                       $mcallocation['d'.$dv->format('Y-m-d')]=$dvx;
  7174.                     }
  7175.                     if(isset($attrmc['mcp'])){
  7176.                       if(isset($attrmc['mcp']['d'.$dv->format('Y-m-d')])){
  7177.                         $oldmchalf['d'.$dv->format('Y-m-d')]=$attrmc['mcp']['d'.$dv->format('Y-m-d')];
  7178.                         $mchalf['d'.$dv->format('Y-m-d')]=$attrmc['mcp']['d'.$dv->format('Y-m-d')];
  7179.                       }
  7180.                     }
  7181.                     //if($dvx >=  $mcallocation['d'.$dv->format('Y-m-d')]){$mcallocation['d'.$dv->format('Y-m-d')]=$dvx;}
  7182.                   }
  7183.                 $sdtmc->modify('+1 day');
  7184.               }
  7185.             }
  7186.           }
  7187.         }
  7188.      
  7189.         $sdtmc=new \DateTime($mcdate['startDate']->format('Y-m-d'));
  7190.         $edtmc=new \DateTime($mcdate['endDate']->format('Y-m-d'));
  7191.         $intmc=date_diff($sdtmc,$edtmc);
  7192.         $intmc=abs($intmc->d)+1;
  7193.         
  7194.         $createdatdate2=null;
  7195.         for($d=0;$d<$intmc;$d++){
  7196.             $dvx=1;
  7197.             $dv=new \DateTime($sdtmc->format('Y-m-d'));
  7198.             $dv=$dv->format('Y-m-d');
  7199.             $okadd=true;
  7200.             if(in_array(date('w',strtotime($dv)),$offdays)){$okadd=false;}
  7201.             if(isset($ucountry)){
  7202.               if(isset($holidays[$ucountry])){
  7203.                 if(in_array($dv,$holidays[$ucountry])){$okadd=false;}
  7204.               }
  7205.             }
  7206.             if(!isset($mcallocation['d'.$dv]) && ($okadd)){
  7207.               $mcallocation['d'.$dv]=0;
  7208.               if(isset($currentopt['startDate']) && isset($currentopt['endDate'])){
  7209.                 if($dv==$currentopt['startDate']){
  7210.                   if(!is_null($opt['am'])){
  7211.                     if(($opt['am']==true) || ($opt['am']==1)){$dvx=0.5;}
  7212.                   }
  7213.                   if(!is_null($option['am'])){
  7214.                     if(($option['am']==true) || ($option['am']==1)){$dvx=0.5;}
  7215.                   }
  7216.                 }
  7217.                 if($dv==$currentopt['endDate']){
  7218.                   if(!is_null($opt['pm'])){
  7219.                     if(($opt['pm']==true) || ($opt['pm']==1)){$dvx=0.5;}
  7220.                   }
  7221.                   if(!is_null($option['pm'])){
  7222.                     if(($option['pm']==true) || ($option['pm']==1)){$dvx=0.5;}
  7223.                   }                 
  7224.                 }  
  7225.               }
  7226.               if($dvx >=  $mcallocation['d'.$dv]){$mcallocation['d'.$dv]=$dvx;}
  7227.             }
  7228.           $sdtmc->modify('+1 day');
  7229.         }
  7230.       }
  7231.       if(isset($currentopt['startDate']) && isset($currentopt['endDate'])){
  7232.         $sdtmc=new \DateTime($currentopt['startDate']);
  7233.         $edtmc=new \DateTime($currentopt['endDate']);
  7234.         $intmc=date_diff($sdtmc,$edtmc);
  7235.         $intmc=abs($intmc->d)+1;
  7236.         $tday=0;
  7237.         for($d=0;$d<$intmc;$d++){
  7238.             $dvx=1;
  7239.             $dv=new \DateTime($sdtmc->format('Y-m-d'));
  7240.             $dv=$dv->format('Y-m-d');
  7241.             $okadd=true;
  7242.             if(in_array(date('w',strtotime($dv)),$offdays)){$okadd=false;}
  7243.             if(isset($ucountry)){
  7244.               if(isset($holidays[$ucountry])){
  7245.                 if(in_array($dv,$holidays[$ucountry])){$okadd=false;}
  7246.               }
  7247.             }
  7248.             
  7249.             if($okadd){
  7250.               $mchalf['d'.$dv]=array();
  7251.               $mchalf['d'.$dv]['am']=false;
  7252.               $mchalf['d'.$dv]['pm']=false;
  7253.               if(isset($oldmchalf['d'.$dv])){
  7254.                 $mchalf['d'.$dv]=$oldmchalf['d'.$dv];
  7255.               }
  7256.               if($d==0){
  7257.                 $amtrue=false;
  7258.                 if(!is_null($opt['am'])){
  7259.                   if(($opt['am']==true) || ($opt['am']==1)){$dvx=0.5;$amtrue=true;}
  7260.                 }
  7261.                 if(!is_null($option['am'])){
  7262.                   if(($option['am']==true) || ($option['am']==1)){$dvx=0.5;$amtrue=true;}
  7263.                   if(($option['am']==false) || ($option['am']==0)){$dvx=1;$amtrue=false;}
  7264.                 }
  7265.                 if(isset($oldmchalf['d'.$dv])){
  7266.                   if($oldmchalf['d'.$dv]['am']!=$amtrue){
  7267.                     $mcallocation['d'.$dv]=$dvx;
  7268.                   }
  7269.                 }else{
  7270.                   $mcallocation['d'.$dv]=$dvx;
  7271.                 }
  7272.                 if(!isset($mcallocation['d'.$dv])){$mcallocation['d'.$dv]=$dvx;} 
  7273.                 $mchalf['d'.$dv]['am']=$amtrue
  7274.               }
  7275.               
  7276.              
  7277.               if($d==($intmc-1)){
  7278.                 $pmtrue=false;
  7279.                 if(!is_null($opt['pm'])){
  7280.                   if(($opt['pm']==true) || ($opt['pm']==1)){$dvx=0.5;$pmtrue=true;}
  7281.                 }
  7282.                 if(!is_null($option['pm'])){
  7283.                   $pmok=true;
  7284.                   if($d==0){
  7285.                     if(!is_null($option['am'])){
  7286.                       if(($option['am']==true) || ($option['am']==1)){$pmok=false;$pmtrue=false;}
  7287.                     }
  7288.                   }
  7289.                   if($pmok){
  7290.                     if(($option['pm']==true) || ($option['pm']==1)){$dvx=0.5;$pmtrue=true;}
  7291.                     if(($option['pm']==false) || ($option['pm']==0)){$dvx=1;$pmtrue=false;}
  7292.                   }
  7293.                   if(isset($oldmchalf['d'.$dv])){
  7294.                     if($oldmchalf['d'.$dv]['pm']!=$pmtrue){
  7295.                       $mcallocation['d'.$dv]=$dvx;
  7296.                     }
  7297.                   }else{
  7298.                     $mcallocation['d'.$dv]=$dvx;
  7299.                   }
  7300.                   if(!isset($mcallocation['d'.$dv])){$mcallocation['d'.$dv]=$dvx;} 
  7301.                   $mchalf['d'.$dv]['pm']=$pmtrue;
  7302.                 }
  7303.               }
  7304.               //if(isset($mcallocation['d'.$dv])){$dvx=$mcallocation['d'.$dv];}
  7305.               $tday+=$dvx;
  7306.             }
  7307.           $sdtmc->modify('+1 day');
  7308.         }
  7309.         $tmphismc=array();
  7310.         $tmphismc['startDate']=$currentopt['startDate'];
  7311.         $tmphismc['endDate']=$currentopt['endDate'];
  7312.         $tmphismc['am']=$option['am'];
  7313.         $tmphismc['pm']=$option['pm'];
  7314.         if(is_null($leaveRequest)){
  7315.           $tmphismc['createDate']=date('Y-m-d');
  7316.         }else{
  7317.           $tmphismc['createDate']=$leaveRequest->getCreatedAt()->format('Y-m-d');
  7318.           $tmphismc['am']=$leaveRequest->getIsHalfStart();
  7319.           $tmphismc['pm']=$leaveRequest->getIsHalfEnd();
  7320.         }
  7321.         if(!is_null($option['am'])){$tmphismc['am']=$option['am'];}
  7322.         if(!is_null($option['pm'])){$tmphismc['pm']=$option['pm'];}
  7323.         $tmphismc['day']=$tday;
  7324.       }
  7325.       
  7326.     } 
  7327.   
  7328.     $removeidmc=array();
  7329.     $oldApproved null;
  7330.     $oam false;
  7331.     $opm false;
  7332.     foreach($option as $k=>$v){
  7333.       if($k=='attributes'){
  7334.         foreach($v as $kv=>$vv){
  7335.           $opt['attributes'][$kv]=$vv;
  7336.         }
  7337.       }else{  
  7338.         $isold=false;
  7339.         if(!is_null($olddata)){
  7340.          if($k=='leaveType'){$isold=true;} 
  7341.         }
  7342.         if(!$isold){$opt[$k]=$v;}
  7343.       }
  7344.     }
  7345.    
  7346.     if(is_null($opt['user'])){$opt['user']=$this->getUser();}
  7347.     if(is_null($opt['updateby'])){$opt['updateby']=$opt['user'];}
  7348.     $isApproved null;
  7349.     $isap=1;
  7350.     if(!is_null($opt['isApproved'])){ 
  7351.       $isApproved=$opt['isApproved'];
  7352.       if(($isApproved==false) || ($isApproved==0)){$isap=0;}
  7353.     };
  7354.     $typ='';
  7355.     if(!is_null($opt['leaveType'])){
  7356.       $typ=$opt['leaveType']->getLeaveName();
  7357.       //if($opt['leaveType']->getLeaveName()=='sick'){$isap=1;}
  7358.     }
  7359.     $removedmc=array();
  7360.     $removedgmc=array();
  7361.     if($ismc){
  7362.       $uidmc=$opt['user']->getId();
  7363.       if(!isset($alocation)){$alocation=array();}
  7364.       $idrqx=-1;
  7365.       $lvtypeid=$opt['leaveType']->getId();
  7366.       if(!is_null($leaveRequest)){$idrqx=$leaveRequest->getId();}
  7367.       $removeentmc=array();
  7368.       foreach($idmclist as $idm){
  7369.         $alc=$idm->getAlocation();
  7370.         if($alc==null){$alc==array();}
  7371.         foreach($alc as $kc=>$vc){
  7372.           if(substr($kc,0,1)=='y'){
  7373.             $yc=substr($kc,1,4);
  7374.             if(!isset($removeentmc['x'.$idm->getUser()->getId().'x'.$yc.'x'.$idm->getLeaveType()->getId()])){
  7375.               $removeentmc['x'.$idm->getUser()->getId().'x'.$yc.'x'.$idm->getLeaveType()->getId()]=0;
  7376.             }
  7377.             $removeentmc['x'.$idm->getUser()->getId().'x'.$yc.'x'.$idm->getLeaveType()->getId()]+=$vc;
  7378.           }
  7379.         }
  7380.         if(is_null($createdatdate2)){
  7381.           $createdatdate2=new \DateTime($idm->getCreatedAt()->format('Y-m-d'));
  7382.           if(!$idm->getCreatedBy() instanceof \App\Entity\User){
  7383.             $xiuser=$em->getRepository(\App\Entity\User::class)->find($idm->getCreatedBy());
  7384.             if(!is_null($xiuser)){
  7385.               $updateby=$xiuser->getId();
  7386.             }
  7387.           }else{
  7388.             $updateby=$idm->getCreatedBy()->getId();
  7389.           }  
  7390.           //$createdatdate2=new \DateTime('createDate');
  7391.         }
  7392.         $idmcd=new \DateTime($idm->getCreatedAt()->format('Y-m-d'));
  7393.         if(!$idm->getCreatedBy() instanceof \App\Entity\User){
  7394.           $xiuser=$em->getRepository(\App\Entity\User::class)->find($idm->getCreatedBy());
  7395.           if(!is_null($xiuser)){
  7396.             $updatebyt=$xiuser->getId();
  7397.           }
  7398.         }else{
  7399.           $updatebyt=$idm->getCreatedBy()->getId();
  7400.         }  
  7401.         if($idmcd $createdatdate2){
  7402.           $createdatdate2=new \DateTime($idmcd->format('Y-m-d'));
  7403.           $updateby$updatebyt;
  7404.         }
  7405.         $attridm=$idm->getAttributes();
  7406.         if(isset($attridm['historymc'])){
  7407.           foreach($attridm['historymc'] as $aidmc){
  7408.             if(isset($aidmc['createDate'])){
  7409.               $idmcd=new \DateTime($aidmc['createDate']);
  7410.               if($idmcd $createdatdate2){
  7411.                 $createdatdate2=new \DateTime($idmcd->format('Y-m-d'));
  7412.                 $updateby=$aidmc['createBy'];
  7413.               }
  7414.             }
  7415.           }
  7416.         }
  7417.         if($idm->getId()!=$idrqx){
  7418.           $removedmc[count($removedmc)]=$idm->getId();
  7419.           $rmattr=$idm->getAttributes();
  7420.           if(isset($rmattr['file'])){
  7421.             if(!isset($opt['attributes']['file'])){
  7422.               $opt['attributes']['file']=$rmattr['file'];
  7423.             }
  7424.           }
  7425.           if(isset($rmattr['gcalid'])){
  7426.             $removedgmc[count($removedgmc)]=$rmattr['gcalid'];
  7427.           }
  7428.           $this->deleteRequest($idm);
  7429.         }
  7430.         
  7431.       }
  7432.       $tdays=0;
  7433.       foreach($removeentmc as $kre=>$re){
  7434.         $krc=explode('x',$kre);
  7435.         if(isset($entbyyear['u'.$krc[1]])){
  7436.           if(isset($entbyyear['u'.$krc[1]]['y'.$krc[2]])){
  7437.             if(isset($entbyyear['u'.$krc[1]]['y'.$krc[2]]['t'.$krc[3]])){
  7438.               $entbyyear['u'.$krc[1]]['y'.$krc[2]]['t'.$krc[3]]['left']+=$re;
  7439.             }
  7440.           }  
  7441.         }
  7442.       }
  7443.       foreach($mcallocation as $kh=>$hh){
  7444.         $dth=str_replace('d','',$kh);
  7445.         $sdx=new \DateTime($dth);
  7446.         if(($sdx $mcdate['startDate']) || ($sdx $mcdate['endDate'])){
  7447.           unset($mcallocation[$kh]);
  7448.         }
  7449.       }
  7450.       $updateentmc=array();
  7451.       foreach($mcallocation as $kh=>$hh){
  7452.         $dth=str_replace('d','',$kh);
  7453.         $tmh=strtotime($dth);
  7454.         $yh=date('Y',$tmh);
  7455.         if($yh 2001){
  7456.           if(isset($entbyyear['u'.$uidmc])){
  7457.             if(isset($entbyyear['u'.$uidmc]['y'.$yh])){
  7458.               if(isset($entbyyear['u'.$uidmc]['y'.$yh]['t'.$lvtypeid])){
  7459.                 $mclt=$entbyyear['u'.$uidmc]['y'.$yh]['t'.$lvtypeid]['left'];
  7460.                 $mcl=$mclt-$hh;
  7461.                 
  7462.                 if($mcl 0){
  7463.                     if($mcl > -$hh){
  7464.                       if(!isset($alocation['y'.$yh])){$alocation['y'.$yh]=0;}
  7465.                       $alocation['y'.$yh]+=$mclt;
  7466.                       if(!isset($alocation['unpaid'])){$alocation['unpaid']=array();}
  7467.                       if(!isset($alocation['unpaid']['y'.$yh])){$alocation['unpaid']['y'.$yh]=array();}
  7468.                       if(!isset($alocation['unpaid']['y'.$yh]['value'])){$alocation['unpaid']['y'.$yh]['date']=array();}
  7469.                       if(!isset($alocation['unpaid']['y'.$yh]['value'])){$alocation['unpaid']['y'.$yh]['value']=0;}
  7470.                       $ucdate=count($alocation['unpaid']['y'.$yh]['date']);
  7471.                       $alocation['unpaid']['y'.$yh]['date'][$ucdate]=array();
  7472.                       $alocation['unpaid']['y'.$yh]['date'][$ucdate]['date']=date('Y-m-d',$tmh);
  7473.                       $alocation['unpaid']['y'.$yh]['date'][$ucdate]['value']=$hh;
  7474.                       $alocation['unpaid']['y'.$yh]['value']+=($hh-$mclt);
  7475.                     }else{
  7476.                       if(!isset($alocation['unpaid'])){$alocation['unpaid']=array();}
  7477.                       if(!isset($alocation['unpaid']['y'.$yh])){$alocation['unpaid']['y'.$yh]=array();}
  7478.                       if(!isset($alocation['unpaid']['y'.$yh]['value'])){$alocation['unpaid']['y'.$yh]['date']=array();}
  7479.                       if(!isset($alocation['unpaid']['y'.$yh]['value'])){$alocation['unpaid']['y'.$yh]['value']=0;}
  7480.                       $ucdate=count($alocation['unpaid']['y'.$yh]['date']);
  7481.                       $alocation['unpaid']['y'.$yh]['date'][$ucdate]=array();
  7482.                       $alocation['unpaid']['y'.$yh]['date'][$ucdate]['date']=date('Y-m-d',$tmh);
  7483.                       $alocation['unpaid']['y'.$yh]['date'][$ucdate]['value']=$hh;
  7484.                       $alocation['unpaid']['y'.$yh]['value']+=$hh;
  7485.                     }
  7486.                     $entbyyear['u'.$uidmc]['y'.$yh]['t'.$lvtypeid]['left']=0;
  7487.                     $updateentmc['x'.$uidmc.'x'.$yh.'x'.$lvtypeid]=0;
  7488.                 }else{
  7489.                   if(!isset($alocation['y'.$yh])){$alocation['y'.$yh]=0;}
  7490.                   $alocation['y'.$yh]+=$hh;
  7491.                   $entbyyear['u'.$uidmc]['y'.$yh]['t'.$lvtypeid]['left']-=$hh;
  7492.                   $updateentmc['x'.$uidmc.'x'.$yh.'x'.$lvtypeid]=$entbyyear['u'.$uidmc]['y'.$yh]['t'.$lvtypeid]['left'];
  7493.                 }
  7494.               }else{
  7495.                 if(!isset($alocation['unpaid'])){$alocation['unpaid']=array();}
  7496.                 if(!isset($alocation['unpaid']['y'.$yh])){$alocation['unpaid']['y'.$yh]=array();}
  7497.                 if(!isset($alocation['unpaid']['y'.$yh]['value'])){$alocation['unpaid']['y'.$yh]['date']=array();}
  7498.                 if(!isset($alocation['unpaid']['y'.$yh]['value'])){$alocation['unpaid']['y'.$yh]['value']=0;}
  7499.                 $ucdate=count($alocation['unpaid']['y'.$yh]['date']);
  7500.                 $alocation['unpaid']['y'.$yh]['date'][$ucdate]=array();
  7501.                 $alocation['unpaid']['y'.$yh]['date'][$ucdate]['date']=date('Y-m-d',$tmh);
  7502.                 $alocation['unpaid']['y'.$yh]['date'][$ucdate]['value']=$hh;
  7503.                 $alocation['unpaid']['y'.$yh]['value']+=$hh;
  7504.               }
  7505.             }else{
  7506.               if(!isset($alocation['unpaid'])){$alocation['unpaid']=array();}
  7507.               if(!isset($alocation['unpaid']['y'.$yh])){$alocation['unpaid']['y'.$yh]=array();}
  7508.               if(!isset($alocation['unpaid']['y'.$yh]['value'])){$alocation['unpaid']['y'.$yh]['date']=array();}
  7509.               if(!isset($alocation['unpaid']['y'.$yh]['value'])){$alocation['unpaid']['y'.$yh]['value']=0;}
  7510.               $ucdate=count($alocation['unpaid']['y'.$yh]['date']);
  7511.               $alocation['unpaid']['y'.$yh]['date'][$ucdate]=array();
  7512.               $alocation['unpaid']['y'.$yh]['date'][$ucdate]['date']=date('Y-m-d',$tmh);
  7513.               $alocation['unpaid']['y'.$yh]['date'][$ucdate]['value']=$hh;
  7514.               $alocation['unpaid']['y'.$yh]['value']+=$hh;
  7515.             }
  7516.           }else{
  7517.             if(!isset($alocation['unpaid'])){$alocation['unpaid']=array();}
  7518.             if(!isset($alocation['unpaid']['y'.$yh])){$alocation['unpaid']['y'.$yh]=array();}
  7519.             if(!isset($alocation['unpaid']['y'.$yh]['value'])){$alocation['unpaid']['y'.$yh]['date']=array();}
  7520.             if(!isset($alocation['unpaid']['y'.$yh]['value'])){$alocation['unpaid']['y'.$yh]['value']=0;}
  7521.             $ucdate=count($alocation['unpaid']['y'.$yh]['date']);
  7522.             $alocation['unpaid']['y'.$yh]['date'][$ucdate]=array();
  7523.             $alocation['unpaid']['y'.$yh]['date'][$ucdate]['date']=date('Y-m-d',$tmh);
  7524.             $alocation['unpaid']['y'.$yh]['date'][$ucdate]['value']=$hh;
  7525.             $alocation['unpaid']['y'.$yh]['value']+=$hh;
  7526.           }  
  7527.         }else{
  7528.           if(!isset($alocation['y'.$yh])){$alocation['y'.$yh]=0;}
  7529.           $alocation['y'.$yh]+=$hh;
  7530.         }
  7531.         $tdays+=$hh;
  7532.       }
  7533.       
  7534.       
  7535.         if(!is_null($opt['updateby'])){
  7536.           $tmphismc['createBy']=$opt['updateby']->getId();
  7537.         }else if(!is_null($opt['user'])){
  7538.           $tmphismc['createBy']=$opt['user']->getId();
  7539.         }
  7540.       
  7541.       $opt['attributes']['historymc']=$historymc;
  7542.       $opt['attributes']['mc']=$mcallocation;
  7543.       $opt['attributes']['mcp']=$mchalf;
  7544.       if(is_null($leaveRequest)){ 
  7545.         $leaveRequest = new LeaveRequest();
  7546.       } 
  7547.       $manualapp=false;
  7548.       if(isset($opt['attributes']['autoapproved'])){
  7549.         if(isset($option['isApproved'])){
  7550.           if($option['isApproved']){
  7551.             $manualapp=true;
  7552.           }
  7553.         }
  7554.       }else{
  7555.         if(!isset($opt['attributes']['manualapproved'])){
  7556.           if(!is_null($opt['isApproved'])){
  7557.             $manualapp=true;
  7558.           }
  7559.         }
  7560.       }
  7561.       
  7562.       if($manualapp){
  7563.         $opt['attributes']['manualapproved']=true;
  7564.         unset($opt['attributes']['autoapproved']);
  7565.       }else{
  7566.         $opt['attributes']['autoapproved']=true;
  7567.         if(isset($opt['attributes']['file'])){
  7568.           if($opt['attributes']['file']!=''){
  7569.             if(is_null($opt['isApproved'])){$isApproved=true;}
  7570.           }
  7571.         }else{
  7572.           if($tdays <= 1){
  7573.                   
  7574.             $isApproved=true;
  7575.             if(!is_null($leaveRequest)){
  7576.               $createdat=$leaveRequest->getCreatedAt();
  7577.             }
  7578.           }else{
  7579.             $isApproved=false;
  7580.           } 
  7581.           
  7582.         }
  7583.       }
  7584.      
  7585.       $leaveRequest->setUser($opt['user']);
  7586.       $leaveRequest->setStartDate($mcdate['startDate']);
  7587.       $leaveRequest->setEndDate($mcdate['endDate']);
  7588.       $leaveRequest->setIsHalfStart($opt['am']);
  7589.       $leaveRequest->setIsHalfEnd($opt['pm']);
  7590.       $leaveRequest->setIsApproved($isApproved);
  7591.       $leaveRequest->setLeaveType($opt['leaveType']);
  7592.       $leaveRequest->setDays($tdays);
  7593.       $leaveRequest->setAttributes($opt['attributes']);
  7594.       $leaveRequest->setComment($opt['comment']);
  7595.       if(!is_null($isApproved)){
  7596.         $leaveRequest->setReviewedBy($opt['reviewBy']);
  7597.       }
  7598.       $leaveRequest->setAlocation($alocation);
  7599.       if(isset($opt['log'])){
  7600.         if(!is_array($opt['log'])){$opt['log']=array();}
  7601.         if(isset($opt['log']) && count($opt['log']) > 0){
  7602.           $leaveRequest->setLog($opt['log']);
  7603.         }
  7604.       }
  7605.       $updatedate=null;
  7606.       if(is_null($olddata)){
  7607.         $updatedate=null;
  7608.         if(!is_null($createdatdate2)){
  7609.           $leaveRequest->setCreatedAt($createdatdate2);
  7610.           if(!is_null($updateby)){
  7611.             $leaveRequest->setCreatedBy($updateby);
  7612.           }else{
  7613.             if(is_null($opt['updateby'])){$opt['updateby']=$opt['user'];} 
  7614.             $leaveRequest->setCreatedBy($opt['updateby']->getId());
  7615.           }
  7616.           if($opt['saveupdate']==true){
  7617.             $leaveRequest->setUpdatedAt(new \DateTime());
  7618.             if(is_null($opt['updateby'])){$opt['updateby']=$opt['user'];}
  7619.             $leaveRequest->setUpdatedBy($opt['updateby']);
  7620.             $updatedate=new \DateTime();
  7621.           }
  7622.         }else{
  7623.           $leaveRequest->setCreatedAt(new \DateTime());
  7624.           if(is_null($opt['updateby'])){$opt['updateby']=$opt['user'];}
  7625.           $leaveRequest->setCreatedBy($opt['updateby']->getId());
  7626.         }  
  7627.       }else{
  7628.         if($opt['saveupdate']==true){
  7629.           $leaveRequest->setUpdatedAt(new \DateTime());
  7630.           if(is_null($opt['updateby'])){$opt['updateby']=$opt['user'];}
  7631.           $leaveRequest->setUpdatedBy($opt['updateby']);
  7632.           $updatedate=new \DateTime();
  7633.         }
  7634.       }
  7635.       
  7636.       try {
  7637.         $em->persist($leaveRequest);
  7638.         $em->flush();
  7639.       } catch (Exception $e) {
  7640.         //throw $th;
  7641.       }
  7642.        
  7643.       
  7644.       $rqidx=$leaveRequest->getId();
  7645.       if(!isset($tmphismc['startDate'])){
  7646.         $stdt=new \DateTime($leaveRequest->getStartDate()->format('Y-m-d'));
  7647.         $endt=new \DateTime($leaveRequest->getEndDate()->format('Y-m-d'));
  7648.         $tmphismc['startDate']=$stdt->format('Y-m-d');
  7649.         $tmphismc['endDate']=$endt->format('Y-m-d');
  7650.         $tmphismc['am']=$leaveRequest->getIsHalfStart();
  7651.         $tmphismc['pm']=$leaveRequest->getIsHalfEnd();
  7652.         $tmphismc['day']=$leaveRequest->getDays();
  7653.         $tmphismc['createDate']=$leaveRequest->getCreatedAt()->format('Y-m-d');
  7654.       }  
  7655.       $opt['attributes']['historymc']['d'.$rqidx]=$tmphismc;
  7656.       
  7657.       $leaveRequest->setAttributes($opt['attributes']);
  7658.       $em->persist($leaveRequest);
  7659.       $em->flush(); 
  7660.       if(isset($opt['attributes']['historymc']) && isset($updatedate) && !is_null($updatedate)){
  7661.         foreach($opt['attributes']['historymc'] as $dt){
  7662.           if(isset($dt['createDate'])){
  7663.             $cd=new \DateTime($dt['createDate']);
  7664.             if($cd $updatedate){$updatedate=$cd;}
  7665.           }
  7666.         }
  7667.       }
  7668.       foreach($updateentmc as $kre=>$re){
  7669.         $krc=explode('x',$kre);
  7670.         $leaveentr=$em->getRepository(\App\Entity\LeaveEntitlement::class)->findBy(array('user'=>$krc[1],'year'=>$krc[2],'leaveType'=>$krc[3]));
  7671.         if(!is_null($leaveentr)){
  7672.           foreach($leaveentr as $xl){
  7673.             $xl->setLeaveLeft($re);
  7674.             $em->persist($xl);
  7675.             $em->flush();
  7676.           }
  7677.         }
  7678.       }
  7679.     }else{
  7680.       if(is_null($leaveRequest)){ 
  7681.         $leaveRequest = new LeaveRequest();
  7682.       }  
  7683.         $back $leaveRequest->getAlocation();
  7684.         if(is_null($back)){$back=array();}
  7685.         $alocation = array();
  7686.         if(isset($back['child'])){
  7687.           foreach ($back['child'] as $kb => $bchild) {
  7688.             $yr str_replace('y'''$kb);
  7689.             foreach ($bchild as $kb1 => $vb1) {
  7690.                 $cid str_replace('c'''$kb1);
  7691.                 //$chde = $this->getDoctrine()->getRepository(LeaveEntitlement::class)->findBy(array('user' => $userData, 'id' => $cid, 'year' => $yr));
  7692.                 if (isset($entbyid['c'.$cid])) {
  7693.                     //for ($bb = 0; $bb < count($chde); $bb++) {
  7694.                         $lf $entbyid['c'.$cid]->getLeaveLeft();
  7695.                         $lf $lf $vb1;
  7696.                         $entbyid['c'.$cid]->setLeaveLeft($lf);
  7697.                         $em->persist($entbyid['c'.$cid]);
  7698.                         $em->flush();
  7699.                     //}
  7700.                 }
  7701.             }
  7702.           }
  7703.         }
  7704.         
  7705.         if ($isap == 0) {
  7706.           foreach ($back as $k => $v) {
  7707.             $yr str_replace('y'''$k);
  7708.             switch ($k) {
  7709.                 case 'data':
  7710.                   break; 
  7711.                   case 'dumper':
  7712.                     break;  
  7713.                 case 'error':
  7714.                     break;
  7715.                 case 'type':
  7716.                     break;    
  7717.                 case 'child':
  7718.                     break;
  7719.                 case 'dumper':
  7720.                   break;    
  7721.                 case 'unpaid':
  7722.                     break;
  7723.                 default:
  7724.                     $yr str_replace('y'''$k);
  7725.                     $alocation['y' $yr] = 0;
  7726.                     break;
  7727.             }
  7728.           }
  7729.         } else {
  7730.           $alocation $this->calculate($opt['user'], $opt['leaveType'], $opt['startDate'], $opt['endDate'], $back, array('am' => $opt['am'], 'pm' => $opt['pm']));
  7731.           foreach ($back as $k => $v) {
  7732.               $yr str_replace('y'''$k);
  7733.               switch ($k) {
  7734.                   case 'data':
  7735.                     break;
  7736.                     case 'dumper':
  7737.                       break;  
  7738.                   case 'error':
  7739.                       break;
  7740.                   case 'child':
  7741.                       break;
  7742.                   case 'type':
  7743.                       break;    
  7744.                   case 'unpaid':
  7745.                       break;
  7746.                   case 'dumper':  
  7747.                       break;
  7748.                   default:
  7749.                       if (!isset($alocation['y' $yr])) {
  7750.                           $alocation['y' $yr] = 0;
  7751.                       }
  7752.                       break;
  7753.               }
  7754.           }
  7755.           if ($alocation != false) {
  7756.             $dy 0;
  7757.             $okd false;
  7758.             $upn=false;
  7759.             foreach ($alocation as $ka => $a) {
  7760.                 switch ($ka) {
  7761.                     case 'data':
  7762.                       break;
  7763.                       case 'dumper':
  7764.                         break;
  7765.                     case 'error':
  7766.                         break;
  7767.                     case 'type':
  7768.                         break;
  7769.                     case 'dumper':
  7770.                       break;      
  7771.                     case 'child':
  7772.                         foreach($a as $aa){
  7773.                           foreach($aa as $aaa){
  7774.                             $dy += $aaa;
  7775.                           }  
  7776.                         }
  7777.                         $okd true
  7778.                         break;
  7779.                     case 'unpaid':
  7780.                         if($typ!='sick'){
  7781.                           foreach($a as $aa){
  7782.                             $dy += $aa['value'];
  7783.                           }
  7784.                           $okd true;
  7785.                         }
  7786.                         break; 
  7787.                     case 'type':
  7788.                       break;       
  7789.                     default:
  7790.                         $dy += $a;
  7791.                         $okd true;
  7792.                         break;
  7793.                 }
  7794.             }
  7795.             if($dy==0){
  7796.               foreach ($alocation as $ka => $a) {
  7797.                 switch ($ka) {
  7798.                     case 'data':
  7799.                       break;
  7800.                       case 'dumper':
  7801.                         break;  
  7802.                     case 'error':
  7803.                         break;
  7804.                     case 'type':
  7805.                         break;   
  7806.                     case 'dumper':
  7807.                       break;     
  7808.                     case 'child':
  7809.                         break; 
  7810.                     case 'unpaid':
  7811.                           foreach($a as $aa){
  7812.                             $dy += $aa['value'];
  7813.                           }
  7814.                           $okd true;
  7815.                         break;    
  7816.                     default:
  7817.                         break;
  7818.                 }
  7819.             }          
  7820.             }
  7821.             if ($okd) {
  7822.                 $opt['days'] = $dy;
  7823.             }    
  7824.           }
  7825.         }
  7826.         /*
  7827.         if($opt['days']==0){
  7828.           if(!is_null($olddata)){
  7829.             $opt['days']=$olddata->getDays();
  7830.           }  
  7831.         }
  7832.         $leaveRequest->setUser($opt['user']);
  7833.         $leaveRequest->setStartDate($opt['startDate']);
  7834.         $leaveRequest->setEndDate($opt['endDate']);
  7835.         $leaveRequest->setIsHalfStart($opt['am']);
  7836.         $leaveRequest->setIsHalfEnd($opt['pm']);
  7837.         $leaveRequest->setIsApproved($isApproved);
  7838.         $leaveRequest->setLeaveType($opt['leaveType']);
  7839.         $leaveRequest->setDays($opt['days']);
  7840.         $leaveRequest->setAttributes($opt['attributes']);
  7841.         $leaveRequest->setComment($opt['comment']);
  7842.         if(!is_null($isApproved)){
  7843.           $leaveRequest->setReviewedBy($opt['reviewBy']);
  7844.         }
  7845.         $leaveRequest->setAlocation($alocation);
  7846.         if(isset($opt['log']) && count($opt['log']) > 0){
  7847.           $leaveRequest->setLog($opt['log']);
  7848.         }
  7849.     
  7850.         if(is_null($olddata)){
  7851.           $leaveRequest->setCreatedAt(new \DateTime());
  7852.           $leaveRequest->setCreatedBy($opt['updateby']->getId());
  7853.         }else{
  7854.           if($opt['saveupdate']==true){
  7855.             $leaveRequest->setUpdatedAt(new \DateTime());
  7856.             $leaveRequest->setUpdatedBy($opt['updateby']);
  7857.           }
  7858.         }
  7859.     
  7860.         $em->persist($leaveRequest);
  7861.         $em->flush();
  7862.         $userupd=$leaveRequest->getUser()->getId();
  7863.         if(isset($opt['updateby'])){
  7864.           if(!is_null($opt['updateby'])){
  7865.             if(is_null($olddata)){
  7866.               $userupd=$opt['updateby']->getId();
  7867.             }else{  
  7868.               $userupd=$opt['updateby'];
  7869.             }  
  7870.           }
  7871.         }
  7872.         if(isset($option['setlog'])){
  7873.           $this->log->save($leaveRequest->getUser(), [
  7874.             'owner' => $leaveRequest->getUser(),
  7875.             'message' => $option['setlog'],
  7876.             'old_data' => $olddatalog,
  7877.             'new_data' => $leaveRequest
  7878.         ]);
  7879.         }
  7880.         $this->updateEntitlementFromLeave($opt['user'], $opt['leaveType'], $alocation, $back);  
  7881.         */      
  7882.     }    
  7883.     
  7884.     /*
  7885.     $leaves=clone $leaveRequest;
  7886.     $lefts=$this->_lefts(array(
  7887.       'user'=>$opt['user'],
  7888.       'start'=>$opt['startDate']->format('Y-m-d'),
  7889.       'end'=>$opt['endDate']->format('Y-m-d')
  7890.     ));
  7891.     if(isset($lefts['u'.$opt['user']->getId()]['y'.$opt['startDate']->format('Y')]['t'.$opt['leaveType']->getId()])){
  7892.       $leaves->setDaysLeft($lefts['u'.$opt['user']->getId()]['y'.$opt['startDate']->format('Y')]['t'.$opt['leaveType']->getId()]);
  7893.     }else{
  7894.       $leaves->setDaysLeft(0);
  7895.     }
  7896.     
  7897.     return array(
  7898.       'data'=>$leaves,
  7899.       'olddata'=>$olddata,
  7900.       'isupdate'=>$isupdate,
  7901.       'remove'=>$removedmc,
  7902.       'rgcalid'=>$removedgmc,
  7903.       'updatedate'=>$updatedate
  7904.     );
  7905.     */
  7906.   }
  7907.   public function saveRequest3($option=array()){
  7908.     $default=array(
  7909.       'id'=>null,
  7910.       'user'=>null,
  7911.       'leaveType'=>null,
  7912.       'startDate'=>null,
  7913.       'endDate'=>null,
  7914.       'isApproved'=>null,
  7915.       'am'=>false,
  7916.       'pm'=>false,
  7917.       'days'=>0,
  7918.       'attributes'=>array(),
  7919.       'comment'=>'',
  7920.       'saveupdate'=>true,
  7921.       'updateby'=>null,
  7922.       'reviewBy'=>null,
  7923.       'allocation'=>''
  7924.     );
  7925.     $opt=$default;
  7926.     $opt['log']=array();
  7927.     $currentopt=array();
  7928.     if(isset($option['startDate'])){
  7929.       $currentopt['startDate']=$option['startDate']->format('Y-m-d');
  7930.     }
  7931.     if(isset($option['endDate'])){
  7932.       $currentopt['endDate']=$option['endDate']->format('Y-m-d');
  7933.     }
  7934.     if(isset($option['days'])){
  7935.       $currentopt['days']=$option['days'];
  7936.     }
  7937.     $em $this->entityManager;
  7938.     $leaveRequest=null;
  7939.     $olddata null;
  7940.     $olddatalog null;
  7941.     $isupdate=false;
  7942.     $entbyid=array();
  7943.     $ent=array();
  7944.     $entbyyear=array();
  7945.     $leaveent=$em->getRepository(LeaveEntitlement::class)->findAll();
  7946.     $forceholi=array();
  7947.     foreach($leaveent as $l){
  7948.       $uid=$l->getUser()->getId();
  7949.       $yr=$l->getYear();
  7950.       $ty=$l->getLeaveType()->getId();
  7951.       $lattrs=$l->getAttributes();
  7952.       if(isset($lattrs['forcedate'])){
  7953.         if(!isset($forceholi['u'.$uid])){$forceholi['u'.$uid]=array();}
  7954.         if(!isset($forceholi['u'.$uid]['t'.$ty])){$forceholi['u'.$uid]['t'.$ty]=array();}
  7955.         $forceholi['u'.$uid]['t'.$ty]=array_merge($forceholi['u'.$uid]['t'.$ty],$lattrs['forcedate']);
  7956.       }
  7957.       $entbyid['c'.$l->getId()]=$l;
  7958.       if(!isset($entbyyear['u'.$uid])){$entbyyear['u'.$uid]=array();}
  7959.       if(!isset($entbyyear['u'.$uid]['y'.$yr])){$entbyyear['u'.$uid]['y'.$yr]=array();}
  7960.       if(!isset($entbyyear['u'.$uid]['y'.$yr]['t'.$ty])){
  7961.         $entbyyear['u'.$uid]['y'.$yr]['t'.$ty]=array();
  7962.         $entbyyear['u'.$uid]['y'.$yr]['t'.$ty]['left'] =$l->getLeaveLeft();
  7963.         $entbyyear['u'.$uid]['y'.$yr]['t'.$ty]['id']=$l->getId();
  7964.         $entbyyear['u'.$uid]['y'.$yr]['t'.$ty]['ent']=$l;
  7965.       }
  7966.     }
  7967.     if(isset($option['id'])){
  7968.       $leaveRequest $em->getRepository(LeaveRequest::class)->find($option['id']);
  7969.       if(!is_null($leaveRequest)){ 
  7970.         $olddata = clone $leaveRequest;$isupdate=true;
  7971.         $olddatalog=clone $olddata;
  7972.       }
  7973.     }
  7974.     if(!is_null($olddata)){
  7975.       $opt['isApproved'] = $olddata->getIsApproved();
  7976.       $opt['am'] = $olddata->getIsHalfStart();
  7977.       $opt['pm'] = $olddata->getIsHalfEnd();
  7978.       $opt['comment'] = $olddata->getComment();
  7979.       $opt['attributes'] = $olddata->getAttributes();
  7980.       $opt['startDate'] = $olddata->getStartDate();
  7981.       $opt['endDate'] = $olddata->getEndDate();
  7982.       $opt['leaveType']=$olddata->getLeaveType();
  7983.       $opt['user']=$olddata->getUser();
  7984.       $opt['reviewBy']=$olddata->getReviewedBy();
  7985.       $opt['log']=$olddata->getLog();
  7986.     }
  7987.     $idmc=array();
  7988.     $idmclist=array();
  7989.     $attridmc=array();
  7990.     $logidmc=array();
  7991.     $idmcdellist=array();
  7992.     $ismc=false;
  7993.     $ismccheck=true;
  7994.     $mcdate=array();
  7995.     $updatedate=null;
  7996.     $updateby=null;
  7997.     $mchalf=array();
  7998.     $oldmchalf=array();
  7999.     if(!is_null($opt['leaveType'])){$option['leaveType']=$opt['leaveType'];}
  8000.     if(!is_null($opt['user'])){$option['user']=$opt['user'];}
  8001.     if(isset($option['leaveType'])){
  8002.       if($option['leaveType']->getLeaveName()=='sick'){
  8003.         $ismc=true;
  8004.         if(isset($option['id']) && !is_null($olddata)){
  8005.           $mcdate['startDate']= new \DateTime($opt['startDate']->format('Y-m-d'));
  8006.           $mcdate['endDate']= new \DateTime($opt['endDate']->format('Y-m-d'));
  8007.         }
  8008.         if(isset($option['startDate']) && !is_null($option['startDate'])){$mcdate['startDate']=new \DateTime($option['startDate']->format('Y-m-d'));}
  8009.         if(isset($option['endDate']) && !is_null($option['endDate'])){$mcdate['endDate']=new \DateTime($option['endDate']->format('Y-m-d'));}
  8010.         /*if(isset($mcdate['startDate']) && isset($mcdate['endDate']) && !is_null($opt['startDate']) && !is_null($opt['endDate'])){
  8011.           if(($mcdate['startDate']==$opt['startDate']) && ($mcdate['endDate'] == $opt['endDate'])){
  8012.             $ismccheck=false;
  8013.           }
  8014.         }*/
  8015.       }
  8016.     }  
  8017.     $mcallocation=array();
  8018.     $historymc=array();
  8019.     $tmphismc=array();
  8020.     $myleavetypeid=$option['leaveType']->getId();
  8021.     if($ismc){
  8022.       if(!is_null($option['user'])){
  8023.         $ucountry=$option['user']->getOffice()->getCountry();
  8024.       }
  8025.       $holidays=array();
  8026.       $holidaydt=$em->getRepository(\App\Entity\LeaveBankHoliday::class)->findAll();
  8027.       foreach($holidaydt as $hl){
  8028.         $loc=$hl->getLocation();
  8029.         if(!isset($holidays[$loc])){$holidays[$loc]=array();}
  8030.         $shl=new \DateTime($hl->getDate()->format('Y-m-d'));
  8031.         if(is_null($hl->getEndDate())){
  8032.           $ehl=new \DateTime($hl->getDate()->format('Y-m-d'));
  8033.         }else{
  8034.           $ehl=new \DateTime($hl->getEndDate()->format('Y-m-d'));
  8035.         }  
  8036.        
  8037.         $inval=date_diff($ehl,$shl);
  8038.         $inval=abs($inval->d)+1;
  8039.         for($hv=0;$hv<$inval;$hv++){
  8040.           $holidays[$loc][count($holidays[$loc])]=$shl->format('Y-m-d');
  8041.           $shl->modify('+1 day');
  8042.         }
  8043.       }
  8044.       $offdays=array(0,6);
  8045.       $offdaysdt=array(6,7);
  8046.      
  8047.       if(isset($mcdate['startDate']) && isset($mcdate['endDate'])){
  8048.         if($ismccheck){
  8049.           $stdatemc = new \DateTime($mcdate['startDate']->format('Y-m-d'));
  8050.             $stdatemc->modify('-30 days');
  8051.             $endatemc = new \DateTime($mcdate['endDate']->format('Y-m-d'));
  8052.             $endatemc->modify('+30 days');
  8053.             $getsick=$em->getRepository(LeaveRequest::class)->createQueryBuilder('a')
  8054.             ->select('a')
  8055.             ->where('a.user = :user')
  8056.             ->andWhere('a.leaveType in (:leavetype)')
  8057.             ->andWhere('a.startDate >= :from')
  8058.             ->andWhere('a.startDate <= :to')
  8059.             ->setParameter('from',$stdatemc)
  8060.             ->setParameter('to',  $endatemc)
  8061.             ->setParameter('leavetype',  $option['leaveType'])
  8062.             ->setParameter('user',  $option['user'])
  8063.             ->orderBy('a.startDate')
  8064.             ->getQuery()
  8065.             ->getResult();
  8066.           if(!is_null($getsick)){
  8067.             $rqidx=-1;
  8068.             if(!is_null($leaveRequest)){$rqidx=$leaveRequest->getId();}
  8069.             foreach($getsick as $gs){
  8070.               $attrmc=$gs->getAttributes();
  8071.               $startmc=$gs->getStartDate();
  8072.               $endmc=$gs->getEndDate();
  8073.               $tidmc=-1;
  8074.               if($gs->getId()!=$rqidx){
  8075.                 $lessstart=new \DateTime($mcdate['startDate']->format('Y-m-d'));
  8076.                 $lessstart->modify('-1 day');
  8077.                 $lsok=false;
  8078.                 if(in_array($lessstart->format('N'),$offdaysdt)){$lsok=true;}
  8079.                 if(isset($holidays[$ucountry])){
  8080.                   if(in_array($lessstart->format('Y-m-d'),$holidays[$ucountry])){
  8081.                     $lsok=true;
  8082.                   }
  8083.                 }
  8084.                 if(isset($forceholi['u'.$option['user']->getId()])){
  8085.                   if(isset($forceholi['u'.$option['user']->getId()]['t'.$option['leaveType']->getId()])){
  8086.                     if(in_array($lessstart->format('Y-m-d'),$forceholi['u'.$option['user']->getId()]['t'.$option['leaveType']->getId()])){
  8087.                       $lsok=false;
  8088.                     }
  8089.                   }
  8090.                 }
  8091.                 while($lsok){
  8092.                   $lsok=false;
  8093.                   $lessstart->modify('-1 day');
  8094.                   if(in_array($lessstart->format('N'),$offdaysdt)){$lsok=true;}
  8095.                   if(isset($holidays[$ucountry])){
  8096.                     if(in_array($lessstart->format('Y-m-d'),$holidays[$ucountry])){
  8097.                       $lsok=true;
  8098.                     }
  8099.                   }
  8100.                   if(isset($forceholi['u'.$option['user']->getId()])){
  8101.                     if(isset($forceholi['u'.$option['user']->getId()]['t'.$option['leaveType']->getId()])){
  8102.                       if(in_array($lessstart->format('Y-m-d'),$forceholi['u'.$option['user']->getId()]['t'.$option['leaveType']->getId()])){
  8103.                         $lsok=false;
  8104.                       }
  8105.                     }
  8106.                   }
  8107.                 }
  8108.                 $lessend=new \DateTime($mcdate['endDate']->format('Y-m-d'));
  8109.                 $lessend->modify('+1 day');
  8110.                 $lsok=false;
  8111.                 if(in_array($lessend->format('N'),$offdaysdt)){$lsok=true;}
  8112.                 if(isset($holidays[$ucountry])){
  8113.                   if(in_array($lessend->format('Y-m-d'),$holidays[$ucountry])){
  8114.                     $lsok=true;
  8115.                   }
  8116.                 }
  8117.                 if(isset($forceholi['u'.$option['user']->getId()])){
  8118.                   if(isset($forceholi['u'.$option['user']->getId()]['t'.$option['leaveType']->getId()])){
  8119.                     if(in_array($lessend->format('Y-m-d'),$forceholi['u'.$option['user']->getId()]['t'.$option['leaveType']->getId()])){
  8120.                       $lsok=false;
  8121.                     }
  8122.                   }
  8123.                 }
  8124.                 while($lsok){
  8125.                   $lsok=false;
  8126.                   $lessend->modify('+1 day');
  8127.                   if(in_array($lessend->format('N'),$offdaysdt)){$lsok=true;}
  8128.                   if(isset($holidays[$ucountry])){
  8129.                     if(in_array($lessend->format('Y-m-d'),$holidays[$ucountry])){
  8130.                       $lsok=true;
  8131.                     }
  8132.                   }
  8133.                   if(isset($forceholi['u'.$option['user']->getId()])){
  8134.                     if(isset($forceholi['u'.$option['user']->getId()]['t'.$option['leaveType']->getId()])){
  8135.                       if(in_array($lessend->format('Y-m-d'),$forceholi['u'.$option['user']->getId()]['t'.$option['leaveType']->getId()])){
  8136.                         $lsok=false;
  8137.                       }
  8138.                     }
  8139.                   }
  8140.                 }  
  8141.                 if(($lessstart >= $startmc) && ($lessend <= $endmc)){$tidmc=$gs->getId();}
  8142.                 if(($lessstart <= $startmc) && ($lessend >= $startmc)){$tidmc=$gs->getId();}
  8143.                 if(($lessstart <= $endmc) && ($lessend >= $endmc)){$tidmc=$gs->getId();}
  8144.                 /*print_r("lessstart:".$lessstart->format('Y-m-d'));
  8145.                 print_r("\n");
  8146.                 print_r("lessstart:".$lessstart->format('N'));*/
  8147.                 /*$hf=fopen('../var/log/test.log','a');
  8148.                 ob_start();
  8149.                 //print_r($testresult);
  8150.                 print_r($gs->getId().':');
  8151.                 print_r($lessstart->format('Y-m-d').'=>'.$startmc->format('Y-m-d').':');
  8152.                 print_r($lessend->format('Y-m-d').'=>'.$endmc->format('Y-m-d').':');
  8153.                 print_r("\n");
  8154.                 $txt=ob_get_clean();
  8155.                 fwrite($hf,$txt);
  8156.                 fclose($hf);*/
  8157.               }else{
  8158.                 $tidmc=$gs->getId();
  8159.                 if(isset($currentopt['startDate']) && isset($currentopt['endDate'])){
  8160.                   $endmc=new \DateTime($currentopt['endDate']);
  8161.                   $startmc=new \DateTime($currentopt['startDate']);
  8162.                 }
  8163.                 
  8164.               }  
  8165.               if($tidmc > -1){
  8166.                 if($mcdate['endDate'] < $endmc){$mcdate['endDate']=$endmc;}
  8167.                 if($mcdate['startDate'] > $startmc){$mcdate['startDate']=$startmc;}
  8168.                 $idmclist[count($idmc)]=$gs;
  8169.                 $idmc[count($idmc)]=$tidmc;
  8170.               }
  8171.             }
  8172.             foreach($idmclist as $ml){
  8173.               $sdtmc=new \DateTime($ml->getStartDate()->format('Y-m-d'));
  8174.               $edtmc=new \DateTime($ml->getEndDate()->format('Y-m-d'));
  8175.               $intmc=date_diff($sdtmc,$edtmc);
  8176.               $intmc=abs($intmc->d)+1;
  8177.               $attrmc=$ml->getAttributes();
  8178.               if(isset($attrmc['historymc'])){
  8179.                 foreach($attrmc['historymc'] as $kh=>$h){
  8180.                     $historymc[$kh]=$h;
  8181.                 }
  8182.               }
  8183.               for($d=0;$d<$intmc;$d++){
  8184.                   $dvx=1;
  8185.                   $dv=new \DateTime($sdtmc->format('Y-m-d'));
  8186.                   $okadd=true;
  8187.                   if(in_array(date('w',strtotime($dv->format('Y-m-d'))),$offdays)){$okadd=false;}
  8188.                   if(isset($ucountry)){
  8189.                     if(isset($holidays[$ucountry])){
  8190.                       if(in_array($dv->format('Y-m-d'),$holidays[$ucountry])){$okadd=false;}
  8191.                     }
  8192.                   }
  8193.                   if(isset($forceholi['u'.$option['user']->getId()])){
  8194.                     if(isset($forceholi['u'.$option['user']->getId()]['t'.$option['leaveType']->getId()])){
  8195.                       if(in_array($dv->format('Y-m-d'),$forceholi['u'.$option['user']->getId()]['t'.$option['leaveType']->getId()])){
  8196.                         $okadd=true;
  8197.                       }
  8198.                     }
  8199.                   }
  8200.                   
  8201.                   if($okadd){
  8202.                     if(!isset($mcallocation['d'.$dv->format('Y-m-d')])){
  8203.                       $mcallocation['d'.$dv->format('Y-m-d')]=array();
  8204.                       $mcallocation['d'.$dv->format('Y-m-d')]=0;
  8205.                     }
  8206.                     
  8207.                     if($d==0){
  8208.                       if(!is_null($ml->getIsHalfStart())){
  8209.                         if(($ml->getIsHalfStart()==true) || ($ml->getIsHalfStart()==1)){$dvx=0.5;}
  8210.                       }
  8211.                     }
  8212.                     if($d==($intmc-1)){
  8213.                       if(!is_null($ml->getIsHalfEnd())){
  8214.                         if(($ml->getIsHalfEnd()==true) || ($ml->getIsHalfEnd()==1)){$dvx=0.5;}
  8215.                       }
  8216.                     }
  8217.                     
  8218.                     if(isset($attrmc['mc'])){
  8219.                       if(isset($attrmc['mc']['d'.$dv->format('Y-m-d')])){
  8220.                         //$dvx=$attrmc['mc']['d'.$dv->format('Y-m-d')]; 
  8221.                         $mcallocation['d'.$dv->format('Y-m-d')]=$dvx;
  8222.                       }else{
  8223.                         $mcallocation['d'.$dv->format('Y-m-d')]=$dvx;
  8224.                       }
  8225.                     }else{
  8226.                       $mcallocation['d'.$dv->format('Y-m-d')]=$dvx;
  8227.                     }
  8228.                     if(isset($attrmc['mcp'])){
  8229.                       if(isset($attrmc['mcp']['d'.$dv->format('Y-m-d')])){
  8230.                         $oldmchalf['d'.$dv->format('Y-m-d')]=$attrmc['mcp']['d'.$dv->format('Y-m-d')];
  8231.                         $mchalf['d'.$dv->format('Y-m-d')]=$attrmc['mcp']['d'.$dv->format('Y-m-d')];
  8232.                       }
  8233.                     }
  8234.                     //if($dvx >=  $mcallocation['d'.$dv->format('Y-m-d')]){$mcallocation['d'.$dv->format('Y-m-d')]=$dvx;}
  8235.                   }
  8236.                 $sdtmc->modify('+1 day');
  8237.               }
  8238.             }
  8239.           }
  8240.         }
  8241.        
  8242.         $sdtmc=new \DateTime($mcdate['startDate']->format('Y-m-d'));
  8243.         $edtmc=new \DateTime($mcdate['endDate']->format('Y-m-d'));
  8244.         $intmc=date_diff($sdtmc,$edtmc);
  8245.         $intmc=abs($intmc->d)+1;
  8246.         
  8247.         $createdatdate2=null;
  8248.         for($d=0;$d<$intmc;$d++){
  8249.             $dvx=1;
  8250.             $dv=new \DateTime($sdtmc->format('Y-m-d'));
  8251.             $dv=$dv->format('Y-m-d');
  8252.             $okadd=true;
  8253.             if(in_array(date('w',strtotime($dv)),$offdays)){$okadd=false;}
  8254.             if(isset($ucountry)){
  8255.               if(isset($holidays[$ucountry])){
  8256.                 if(in_array($dv,$holidays[$ucountry])){$okadd=false;}
  8257.               }
  8258.             }
  8259.             if(!isset($mcallocation['d'.$dv]) && ($okadd)){
  8260.               $mcallocation['d'.$dv]=0;
  8261.               if(isset($currentopt['startDate']) && isset($currentopt['endDate'])){
  8262.                 if($dv==$currentopt['startDate']){
  8263.                   if(!is_null($opt['am'])){
  8264.                     if(($opt['am']==true) || ($opt['am']==1)){$dvx=0.5;}
  8265.                   }
  8266.                   if(!is_null($option['am'])){
  8267.                     if(($option['am']==true) || ($option['am']==1)){$dvx=0.5;}
  8268.                   }
  8269.                 }
  8270.                 if($dv==$currentopt['endDate']){
  8271.                   if(!is_null($opt['pm'])){
  8272.                     if(($opt['pm']==true) || ($opt['pm']==1)){$dvx=0.5;}
  8273.                   }
  8274.                   if(!is_null($option['pm'])){
  8275.                     if(($option['pm']==true) || ($option['pm']==1)){$dvx=0.5;}
  8276.                   }                 
  8277.                 }  
  8278.               }
  8279.               if($dvx >=  $mcallocation['d'.$dv]){$mcallocation['d'.$dv]=$dvx;}
  8280.             }
  8281.           $sdtmc->modify('+1 day');
  8282.         }
  8283.       }
  8284.       if(isset($currentopt['startDate']) && isset($currentopt['endDate'])){
  8285.         $sdtmc=new \DateTime($currentopt['startDate']);
  8286.         $edtmc=new \DateTime($currentopt['endDate']);
  8287.         $intmc=date_diff($sdtmc,$edtmc);
  8288.         $intmc=abs($intmc->d)+1;
  8289.         $tday=0;
  8290.         for($d=0;$d<$intmc;$d++){
  8291.             $dvx=1;
  8292.             $dv=new \DateTime($sdtmc->format('Y-m-d'));
  8293.             $dv=$dv->format('Y-m-d');
  8294.             $okadd=true;
  8295.             if(in_array(date('w',strtotime($dv)),$offdays)){$okadd=false;}
  8296.             if(isset($ucountry)){
  8297.               if(isset($holidays[$ucountry])){
  8298.                 if(in_array($dv,$holidays[$ucountry])){$okadd=false;}
  8299.               }
  8300.             }
  8301.             
  8302.             if($okadd){
  8303.               $mchalf['d'.$dv]=array();
  8304.               $mchalf['d'.$dv]['am']=false;
  8305.               $mchalf['d'.$dv]['pm']=false;
  8306.               if(isset($oldmchalf['d'.$dv])){
  8307.                 $mchalf['d'.$dv]=$oldmchalf['d'.$dv];
  8308.               }
  8309.               if($d==0){
  8310.                 $amtrue=false;
  8311.                 if(!is_null($opt['am'])){
  8312.                   if(($opt['am']==true) || ($opt['am']==1)){$dvx=0.5;$amtrue=true;}
  8313.                 }
  8314.                 if(!is_null($option['am'])){
  8315.                   if(($option['am']==true) || ($option['am']==1)){$dvx=0.5;$amtrue=true;}
  8316.                   if(($option['am']==false) || ($option['am']==0)){$dvx=1;$amtrue=false;}
  8317.                 }
  8318.                 if(isset($oldmchalf['d'.$dv])){
  8319.                   if($oldmchalf['d'.$dv]['am']!=$amtrue){
  8320.                     $mcallocation['d'.$dv]=$dvx;
  8321.                   }
  8322.                 }else{
  8323.                   $mcallocation['d'.$dv]=$dvx;
  8324.                 }
  8325.                 if(!isset($mcallocation['d'.$dv])){$mcallocation['d'.$dv]=$dvx;} 
  8326.                 $mchalf['d'.$dv]['am']=$amtrue
  8327.               }
  8328.               
  8329.              
  8330.               if($d==($intmc-1)){
  8331.                 $pmtrue=false;
  8332.                 if(!is_null($opt['pm'])){
  8333.                   if(($opt['pm']==true) || ($opt['pm']==1)){$dvx=0.5;$pmtrue=true;}
  8334.                 }
  8335.                 if(!is_null($option['pm'])){
  8336.                   $pmok=true;
  8337.                   if($d==0){
  8338.                     if(!is_null($option['am'])){
  8339.                       if(($option['am']==true) || ($option['am']==1)){$pmok=false;$pmtrue=false;}
  8340.                     }
  8341.                   }
  8342.                   if($pmok){
  8343.                     if(($option['pm']==true) || ($option['pm']==1)){$dvx=0.5;$pmtrue=true;}
  8344.                     if(($option['pm']==false) || ($option['pm']==0)){$dvx=1;$pmtrue=false;}
  8345.                   }
  8346.                   if(isset($oldmchalf['d'.$dv])){
  8347.                     if($oldmchalf['d'.$dv]['pm']!=$pmtrue){
  8348.                       $mcallocation['d'.$dv]=$dvx;
  8349.                     }
  8350.                   }else{
  8351.                     $mcallocation['d'.$dv]=$dvx;
  8352.                   }
  8353.                   if(!isset($mcallocation['d'.$dv])){$mcallocation['d'.$dv]=$dvx;} 
  8354.                   $mchalf['d'.$dv]['pm']=$pmtrue;
  8355.                 }
  8356.               }
  8357.               $tday+=$dvx;
  8358.             }
  8359.           $sdtmc->modify('+1 day');
  8360.         }
  8361.         $tmphismc=array();
  8362.         $tmphismc['startDate']=$currentopt['startDate'];
  8363.         $tmphismc['endDate']=$currentopt['endDate'];
  8364.         $tmphismc['am']=$option['am'];
  8365.         $tmphismc['pm']=$option['pm'];
  8366.         if(is_null($leaveRequest)){
  8367.           $tmphismc['createDate']=date('Y-m-d');
  8368.         }else{
  8369.           $tmphismc['createDate']=$leaveRequest->getCreatedAt()->format('Y-m-d');
  8370.           $tmphismc['am']=$leaveRequest->getIsHalfStart();
  8371.           $tmphismc['pm']=$leaveRequest->getIsHalfEnd();
  8372.         }
  8373.         if(!is_null($option['am'])){$tmphismc['am']=$option['am'];}
  8374.         if(!is_null($option['pm'])){$tmphismc['pm']=$option['pm'];}
  8375.         $tmphismc['day']=$tday;
  8376.       }
  8377.       
  8378.     } 
  8379.   
  8380.     $removeidmc=array();
  8381.     $oldApproved null;
  8382.     $oam false;
  8383.     $opm false;
  8384.    
  8385.     foreach($option as $k=>$v){
  8386.       if($k=='attributes'){
  8387.         foreach($v as $kv=>$vv){
  8388.           $opt['attributes'][$kv]=$vv;
  8389.         }
  8390.       }else{  
  8391.         $isold=false;
  8392.         if(!is_null($olddata)){
  8393.          if($k=='leaveType'){$isold=true;} 
  8394.         }
  8395.         if(!$isold){$opt[$k]=$v;}
  8396.       }
  8397.     }
  8398.     if(is_null($opt['user'])){$opt['user']=$this->getUser();}
  8399.     if(is_null($opt['updateby'])){$opt['updateby']=$opt['user'];}
  8400.     $isApproved null;
  8401.     $isap=1;
  8402.     if(!is_null($opt['isApproved'])){ 
  8403.       $isApproved=$opt['isApproved'];
  8404.       if(($isApproved==false) || ($isApproved==0)){$isap=0;}
  8405.     };
  8406.     $typ='';
  8407.     if(!is_null($opt['leaveType'])){
  8408.       $typ=$opt['leaveType']->getLeaveName();
  8409.       //if($opt['leaveType']->getLeaveName()=='sick'){$isap=1;}
  8410.     }
  8411.     $removedmc=array();
  8412.     $removedgmc=array();
  8413.     if($ismc){
  8414.       $uidmc=$opt['user']->getId();
  8415.       if(!isset($alocation)){$alocation=array();}
  8416.       $idrqx=-1;
  8417.       $lvtypeid=$opt['leaveType']->getId();
  8418.       if(!is_null($leaveRequest)){$idrqx=$leaveRequest->getId();}
  8419.       $removeentmc=array();
  8420.       foreach($idmclist as $idm){
  8421.         $alc=$idm->getAlocation();
  8422.         if($alc==null){$alc==array();}
  8423.         foreach($alc as $kc=>$vc){
  8424.           if(substr($kc,0,1)=='y'){
  8425.             $yc=substr($kc,1,4);
  8426.             if(!isset($removeentmc['x'.$idm->getUser()->getId().'x'.$yc.'x'.$idm->getLeaveType()->getId()])){
  8427.               $removeentmc['x'.$idm->getUser()->getId().'x'.$yc.'x'.$idm->getLeaveType()->getId()]=0;
  8428.             }
  8429.             $removeentmc['x'.$idm->getUser()->getId().'x'.$yc.'x'.$idm->getLeaveType()->getId()]+=$vc;
  8430.           }
  8431.         }
  8432.         if(is_null($createdatdate2)){
  8433.           $createdatdate2=new \DateTime($idm->getCreatedAt()->format('Y-m-d'));
  8434.           if(!$idm->getCreatedBy() instanceof \App\Entity\User){
  8435.             $xiuser=$em->getRepository(\App\Entity\User::class)->find($idm->getCreatedBy());
  8436.             if(!is_null($xiuser)){
  8437.               $updateby=$xiuser->getId();
  8438.             }
  8439.           }else{
  8440.             $updateby=$idm->getCreatedBy()->getId();
  8441.           }  
  8442.         }
  8443.         $idmcd=new \DateTime($idm->getCreatedAt()->format('Y-m-d'));
  8444.         if(!$idm->getCreatedBy() instanceof \App\Entity\User){
  8445.           $xiuser=$em->getRepository(\App\Entity\User::class)->find($idm->getCreatedBy());
  8446.           if(!is_null($xiuser)){
  8447.             $updatebyt=$xiuser->getId();
  8448.           }
  8449.         }else{
  8450.           $updatebyt=$idm->getCreatedBy()->getId();
  8451.         }  
  8452.         if($idmcd $createdatdate2){
  8453.           $createdatdate2=new \DateTime($idmcd->format('Y-m-d'));
  8454.           $updateby$updatebyt;
  8455.         }
  8456.         $attridm=$idm->getAttributes();
  8457.         if(isset($attridm['historymc'])){
  8458.           foreach($attridm['historymc'] as $aidmc){
  8459.             if(isset($aidmc['createDate'])){
  8460.               $idmcd=new \DateTime($aidmc['createDate']);
  8461.               if($idmcd $createdatdate2){
  8462.                 $createdatdate2=new \DateTime($idmcd->format('Y-m-d'));
  8463.                 $updateby=$aidmc['createBy'];
  8464.               }
  8465.             }
  8466.           }
  8467.         }
  8468.         if($idm->getId()!=$idrqx){
  8469.           $removedmc[count($removedmc)]=$idm->getId();
  8470.           $rmattr=$idm->getAttributes();
  8471.           if(isset($rmattr['file'])){
  8472.             if(!isset($opt['attributes']['file'])){
  8473.               $opt['attributes']['file']=$rmattr['file'];
  8474.             }
  8475.           }
  8476.           if(isset($rmattr['gcalid'])){
  8477.             $removedgmc[count($removedgmc)]=$rmattr['gcalid'];
  8478.           }
  8479.           $this->deleteRequest($idm);
  8480.         }
  8481.         
  8482.       }
  8483.       $tdays=0;
  8484.       foreach($removeentmc as $kre=>$re){
  8485.         $krc=explode('x',$kre);
  8486.         if(isset($entbyyear['u'.$krc[1]])){
  8487.           if(isset($entbyyear['u'.$krc[1]]['y'.$krc[2]])){
  8488.             if(isset($entbyyear['u'.$krc[1]]['y'.$krc[2]]['t'.$krc[3]])){
  8489.               $entbyyear['u'.$krc[1]]['y'.$krc[2]]['t'.$krc[3]]['left']+=$re;
  8490.             }
  8491.           }  
  8492.         }
  8493.       }
  8494.       foreach($mcallocation as $kh=>$hh){
  8495.         $dth=str_replace('d','',$kh);
  8496.         $sdx=new \DateTime($dth);
  8497.         if(($sdx $mcdate['startDate']) || ($sdx $mcdate['endDate'])){
  8498.           unset($mcallocation[$kh]);
  8499.         }
  8500.       }
  8501.       $updateentmc=array();
  8502.       
  8503.       foreach($mcallocation as $kh=>$hh){
  8504.         $dth=str_replace('d','',$kh);
  8505.         $tmh=strtotime($dth);
  8506.         $yh=date('Y',$tmh);
  8507.         
  8508.         $onProbation=($opt['user']->getPersonalInfo()->getJobStatus()!='form.job_status.permanent');
  8509.         if($yh 2001){
  8510.           if((isset($entbyyear['u'.$uidmc])) && (!$onProbation)){
  8511.             if(isset($entbyyear['u'.$uidmc]['y'.$yh])){
  8512.               if(isset($entbyyear['u'.$uidmc]['y'.$yh]['t'.$lvtypeid])){
  8513.                 $mclt=$entbyyear['u'.$uidmc]['y'.$yh]['t'.$lvtypeid]['left'];
  8514.                 $mcl=$mclt-$hh;
  8515.                 //$mcl=-$hh;
  8516.                 //print_r($mclt);
  8517.                 if($mcl 0){
  8518.                     if($mcl > -$hh){
  8519.                       if(!isset($alocation['y'.$yh])){$alocation['y'.$yh]=0;}
  8520.                       $alocation['y'.$yh]+=$mclt;
  8521.                       if(!isset($alocation['unpaid'])){$alocation['unpaid']=array();}
  8522.                       if(!isset($alocation['unpaid']['y'.$yh])){$alocation['unpaid']['y'.$yh]=array();}
  8523.                       if(!isset($alocation['unpaid']['y'.$yh]['value'])){$alocation['unpaid']['y'.$yh]['date']=array();}
  8524.                       if(!isset($alocation['unpaid']['y'.$yh]['value'])){$alocation['unpaid']['y'.$yh]['value']=0;}
  8525.                       $ucdate=count($alocation['unpaid']['y'.$yh]['date']);
  8526.                       $alocation['unpaid']['y'.$yh]['date'][$ucdate]=array();
  8527.                       $alocation['unpaid']['y'.$yh]['date'][$ucdate]['date']=date('Y-m-d',$tmh);
  8528.                       $alocation['unpaid']['y'.$yh]['date'][$ucdate]['value']=$hh;
  8529.                       $alocation['unpaid']['y'.$yh]['value']+=($hh-$mclt);
  8530.                     }else{
  8531.                       if(!isset($alocation['unpaid'])){$alocation['unpaid']=array();}
  8532.                       if(!isset($alocation['unpaid']['y'.$yh])){$alocation['unpaid']['y'.$yh]=array();}
  8533.                       if(!isset($alocation['unpaid']['y'.$yh]['value'])){$alocation['unpaid']['y'.$yh]['date']=array();}
  8534.                       if(!isset($alocation['unpaid']['y'.$yh]['value'])){$alocation['unpaid']['y'.$yh]['value']=0;}
  8535.                       $ucdate=count($alocation['unpaid']['y'.$yh]['date']);
  8536.                       $alocation['unpaid']['y'.$yh]['date'][$ucdate]=array();
  8537.                       $alocation['unpaid']['y'.$yh]['date'][$ucdate]['date']=date('Y-m-d',$tmh);
  8538.                       $alocation['unpaid']['y'.$yh]['date'][$ucdate]['value']=$hh;
  8539.                       $alocation['unpaid']['y'.$yh]['value']+=$hh;
  8540.                     }
  8541.                     $entbyyear['u'.$uidmc]['y'.$yh]['t'.$lvtypeid]['left']=0;
  8542.                     $updateentmc['x'.$uidmc.'x'.$yh.'x'.$lvtypeid]=0;
  8543.                 }else{
  8544.                   if(!isset($alocation['y'.$yh])){$alocation['y'.$yh]=0;}
  8545.                   $alocation['y'.$yh]+=$hh;
  8546.                   $entbyyear['u'.$uidmc]['y'.$yh]['t'.$lvtypeid]['left']-=$hh;
  8547.                   $updateentmc['x'.$uidmc.'x'.$yh.'x'.$lvtypeid]=$entbyyear['u'.$uidmc]['y'.$yh]['t'.$lvtypeid]['left'];
  8548.                 }
  8549.               }else{
  8550.                 if(!isset($alocation['unpaid'])){$alocation['unpaid']=array();}
  8551.                 if(!isset($alocation['unpaid']['y'.$yh])){$alocation['unpaid']['y'.$yh]=array();}
  8552.                 if(!isset($alocation['unpaid']['y'.$yh]['value'])){$alocation['unpaid']['y'.$yh]['date']=array();}
  8553.                 if(!isset($alocation['unpaid']['y'.$yh]['value'])){$alocation['unpaid']['y'.$yh]['value']=0;}
  8554.                 $ucdate=count($alocation['unpaid']['y'.$yh]['date']);
  8555.                 $alocation['unpaid']['y'.$yh]['date'][$ucdate]=array();
  8556.                 $alocation['unpaid']['y'.$yh]['date'][$ucdate]['date']=date('Y-m-d',$tmh);
  8557.                 $alocation['unpaid']['y'.$yh]['date'][$ucdate]['value']=$hh;
  8558.                 $alocation['unpaid']['y'.$yh]['value']+=$hh;
  8559.               }
  8560.             }else{
  8561.               if(!isset($alocation['unpaid'])){$alocation['unpaid']=array();}
  8562.               if(!isset($alocation['unpaid']['y'.$yh])){$alocation['unpaid']['y'.$yh]=array();}
  8563.               if(!isset($alocation['unpaid']['y'.$yh]['value'])){$alocation['unpaid']['y'.$yh]['date']=array();}
  8564.               if(!isset($alocation['unpaid']['y'.$yh]['value'])){$alocation['unpaid']['y'.$yh]['value']=0;}
  8565.               $ucdate=count($alocation['unpaid']['y'.$yh]['date']);
  8566.               $alocation['unpaid']['y'.$yh]['date'][$ucdate]=array();
  8567.               $alocation['unpaid']['y'.$yh]['date'][$ucdate]['date']=date('Y-m-d',$tmh);
  8568.               $alocation['unpaid']['y'.$yh]['date'][$ucdate]['value']=$hh;
  8569.               $alocation['unpaid']['y'.$yh]['value']+=$hh;
  8570.             }
  8571.           }else{
  8572.             if(!isset($alocation['unpaid'])){$alocation['unpaid']=array();}
  8573.             if(!isset($alocation['unpaid']['y'.$yh])){$alocation['unpaid']['y'.$yh]=array();}
  8574.             if(!isset($alocation['unpaid']['y'.$yh]['value'])){$alocation['unpaid']['y'.$yh]['date']=array();}
  8575.             if(!isset($alocation['unpaid']['y'.$yh]['value'])){$alocation['unpaid']['y'.$yh]['value']=0;}
  8576.             $ucdate=count($alocation['unpaid']['y'.$yh]['date']);
  8577.             $alocation['unpaid']['y'.$yh]['date'][$ucdate]=array();
  8578.             $alocation['unpaid']['y'.$yh]['date'][$ucdate]['date']=date('Y-m-d',$tmh);
  8579.             $alocation['unpaid']['y'.$yh]['date'][$ucdate]['value']=$hh;
  8580.             $alocation['unpaid']['y'.$yh]['value']+=$hh;
  8581.           }  
  8582.         }else{
  8583.           if(!isset($alocation['y'.$yh])){$alocation['y'.$yh]=0;}
  8584.           $alocation['y'.$yh]+=$hh;
  8585.         }
  8586.         $tdays+=$hh;
  8587.       }
  8588.       
  8589.       
  8590.         if(!is_null($opt['updateby'])){
  8591.           $tmphismc['createBy']=$opt['updateby']->getId();
  8592.         }else if(!is_null($opt['user'])){
  8593.           $tmphismc['createBy']=$opt['user']->getId();
  8594.         }
  8595.       
  8596.       $opt['attributes']['historymc']=$historymc;
  8597.       $opt['attributes']['mc']=$mcallocation;
  8598.       $opt['attributes']['mcp']=$mchalf;
  8599.       if(is_null($leaveRequest)){ 
  8600.         $leaveRequest = new LeaveRequest();
  8601.       } 
  8602.       $manualapp=false;
  8603.       if(isset($opt['attributes']['autoapproved'])){
  8604.         if(isset($option['isApproved'])){
  8605.           if($option['isApproved']){
  8606.             $manualapp=true;
  8607.           }
  8608.         }
  8609.       }else{
  8610.         if(!isset($opt['attributes']['manualapproved'])){
  8611.           if(!is_null($opt['isApproved'])){
  8612.             $manualapp=true;
  8613.           }
  8614.         }
  8615.       }
  8616.       
  8617.       if($manualapp){
  8618.         $opt['attributes']['manualapproved']=true;
  8619.         unset($opt['attributes']['autoapproved']);
  8620.       }else{
  8621.         $opt['attributes']['autoapproved']=true;
  8622.         if(isset($opt['attributes']['file'])){
  8623.           if($opt['attributes']['file']!=''){
  8624.             if(is_null($opt['isApproved'])){$isApproved=true;}
  8625.           }
  8626.         }else{
  8627.           if(($tdays <= 1) && (!$onProbation)){
  8628.                   
  8629.             $isApproved=true;
  8630.             if(!is_null($leaveRequest)){
  8631.               $createdat=$leaveRequest->getCreatedAt();
  8632.         
  8633.               
  8634.             }
  8635.           }else{
  8636.             $isApproved=false;
  8637.           } 
  8638.           
  8639.         }
  8640.       }
  8641.       $leaveRequest->setUser($opt['user']);
  8642.       $leaveRequest->setStartDate($mcdate['startDate']);
  8643.       $leaveRequest->setEndDate($mcdate['endDate']);
  8644.       $leaveRequest->setIsHalfStart($opt['am']);
  8645.       $leaveRequest->setIsHalfEnd($opt['pm']);
  8646.       $leaveRequest->setIsApproved($isApproved);
  8647.       $leaveRequest->setLeaveType($opt['leaveType']);
  8648.       $leaveRequest->setDays($tdays);
  8649.       $leaveRequest->setAttributes($opt['attributes']);
  8650.       $leaveRequest->setComment($opt['comment']);
  8651.       if(!is_null($isApproved)){
  8652.         $leaveRequest->setReviewedBy($opt['reviewBy']);
  8653.       }
  8654.       $leaveRequest->setAlocation($alocation);
  8655.       if(isset($opt['log'])){
  8656.         if(!is_array($opt['log'])){$opt['log']=array();}
  8657.         if(isset($opt['log']) && count($opt['log']) > 0){
  8658.           $leaveRequest->setLog($opt['log']);
  8659.         }
  8660.       }
  8661.       $updatedate=null;
  8662.       if(is_null($olddata)){
  8663.         $updatedate=null;
  8664.         if(!is_null($createdatdate2)){
  8665.           $leaveRequest->setCreatedAt($createdatdate2);
  8666.           if(!is_null($updateby)){
  8667.             $leaveRequest->setCreatedBy($updateby);
  8668.           }else{
  8669.             if(is_null($opt['updateby'])){$opt['updateby']=$opt['user'];} 
  8670.             $leaveRequest->setCreatedBy($opt['updateby']->getId());
  8671.           }
  8672.           if($opt['saveupdate']==true){
  8673.             $leaveRequest->setUpdatedAt(new \DateTime());
  8674.             if(is_null($opt['updateby'])){$opt['updateby']=$opt['user'];}
  8675.             $leaveRequest->setUpdatedBy($opt['updateby']);
  8676.             $updatedate=new \DateTime();
  8677.           }
  8678.         }else{
  8679.           $leaveRequest->setCreatedAt(new \DateTime());
  8680.           if(is_null($opt['updateby'])){$opt['updateby']=$opt['user'];}
  8681.           $leaveRequest->setCreatedBy($opt['updateby']->getId());
  8682.         }  
  8683.       }else{
  8684.         if($opt['saveupdate']==true){
  8685.           $leaveRequest->setUpdatedAt(new \DateTime());
  8686.           if(is_null($opt['updateby'])){$opt['updateby']=$opt['user'];}
  8687.           $leaveRequest->setUpdatedBy($opt['updateby']);
  8688.           $updatedate=new \DateTime();
  8689.         }
  8690.       }
  8691.       
  8692.       try {
  8693.         $em->persist($leaveRequest);
  8694.         $em->flush();
  8695.       } catch (Exception $e) {
  8696.         //throw $th;
  8697.       }
  8698.        
  8699.       
  8700.       $rqidx=$leaveRequest->getId();
  8701.       if(!isset($tmphismc['startDate'])){
  8702.         $stdt=new \DateTime($leaveRequest->getStartDate()->format('Y-m-d'));
  8703.         $endt=new \DateTime($leaveRequest->getEndDate()->format('Y-m-d'));
  8704.         $tmphismc['startDate']=$stdt->format('Y-m-d');
  8705.         $tmphismc['endDate']=$endt->format('Y-m-d');
  8706.         $tmphismc['am']=$leaveRequest->getIsHalfStart();
  8707.         $tmphismc['pm']=$leaveRequest->getIsHalfEnd();
  8708.         $tmphismc['day']=$leaveRequest->getDays();
  8709.         $tmphismc['createDate']=$leaveRequest->getCreatedAt()->format('Y-m-d');
  8710.       }  
  8711.       $opt['attributes']['historymc']['d'.$rqidx]=$tmphismc;
  8712.       
  8713.       $leaveRequest->setAttributes($opt['attributes']);
  8714.       $em->persist($leaveRequest);
  8715.       $em->flush(); 
  8716.       if(isset($opt['attributes']['historymc']) && isset($updatedate) && !is_null($updatedate)){
  8717.         foreach($opt['attributes']['historymc'] as $dt){
  8718.           if(isset($dt['createDate'])){
  8719.             $cd=new \DateTime($dt['createDate']);
  8720.             if($cd $updatedate){$updatedate=$cd;}
  8721.           }
  8722.         }
  8723.       }
  8724.       foreach($updateentmc as $kre=>$re){
  8725.         $krc=explode('x',$kre);
  8726.         $leaveentr=$em->getRepository(\App\Entity\LeaveEntitlement::class)->findBy(array('user'=>$krc[1],'year'=>$krc[2],'leaveType'=>$krc[3]));
  8727.         if(!is_null($leaveentr)){
  8728.           foreach($leaveentr as $xl){
  8729.             $xl->setLeaveLeft($re);
  8730.             $em->persist($xl);
  8731.             $em->flush();
  8732.           }
  8733.         }
  8734.       }
  8735.     }else{
  8736.       if(is_null($leaveRequest)){ 
  8737.         $leaveRequest = new LeaveRequest();
  8738.       }  
  8739.         $backinput=array();
  8740.         $back $leaveRequest->getAlocation();
  8741.         if(is_null($back)){$back=array();}
  8742.         if(isset($back['data'])){
  8743.           if(isset($back['data']['input'])){
  8744.             foreach($back['data']['input'] as $bkey=>$bvalue){
  8745.               $backinput[$bkey]=$bvalue;
  8746.             }
  8747.           }
  8748.         }
  8749.         if(trim($opt['allocation'])==''){
  8750.           $alocation = array();
  8751.           /*if(isset($back['child'])){
  8752.             foreach ($back['child'] as $kb => $bchild) {
  8753.               $yr = str_replace('y', '', $kb);
  8754.               foreach ($bchild as $kb1 => $vb1) {
  8755.                   $cid = str_replace('c', '', $kb1);
  8756.                   //$chde = $this->getDoctrine()->getRepository(LeaveEntitlement::class)->findBy(array('user' => $userData, 'id' => $cid, 'year' => $yr));
  8757.                   if (isset($entbyid['c'.$cid])) {
  8758.                       //for ($bb = 0; $bb < count($chde); $bb++) {
  8759.                           $lf = $entbyid['c'.$cid]->getLeaveLeft();
  8760.                           $lf = $lf + $vb1;
  8761.                           $entbyid['c'.$cid]->setLeaveLeft($lf);
  8762.                           $em->persist($entbyid['c'.$cid]);
  8763.                           $em->flush();
  8764.                       //}
  8765.                   }
  8766.               }
  8767.             }
  8768.           }*/
  8769.           $myuserid=$opt['user']->getId();
  8770.           if ($isap == 0) {
  8771.             $alocation=json_decode(json_encode($back),true);
  8772.             if(!is_null($olddata)){
  8773.               $myoldapprove=$olddata->getIsApproved();
  8774.               if(($myoldapprove===false) || ($myoldapprove===0)){$back=array();}
  8775.             }
  8776.             $dumper=array();
  8777.             foreach ($back as $k => $v) {
  8778.               $yr str_replace('y'''$k);
  8779.               switch ($k) {
  8780.                   case 'data':
  8781.                     break; 
  8782.                     case 'dumper':
  8783.                       break;  
  8784.                   case 'error':
  8785.                       break;
  8786.                   case 'type':
  8787.                       break;    
  8788.                   case 'child':
  8789.                       foreach($v as $kv=>$v1){
  8790.                         foreach($v1 as $kv1=>$v2){
  8791.                           $key=str_replace('c','',$kv1);
  8792.                           if(!isset($dumper['l'.$key])){$dumper['l'.$key]=$entbyid['c'.$key]->getLeaveLeft();}
  8793.                           $dumper['l'.$key]+=$v2;
  8794.                         }
  8795.                       }
  8796.                       break;
  8797.                   case 'unpaid':
  8798.                       break;
  8799.                   case 'dumper':
  8800.                     break;   
  8801.                   default:
  8802.                     if(substr($k,0,1)=='y'){
  8803.                       $yr str_replace('y'''$k);
  8804.                       $myent=$entbyyear['u'.$myuserid]['y'.$yr]['t'.$myleavetypeid];
  8805.                       $key=$myent['id'];
  8806.                       if(!isset($dumper['l'.$key])){$dumper['l'.$key]=$entbyid['c'.$key]->getLeaveLeft();}
  8807.                       $dumper['l'.$key]+=$v;
  8808.                       //$alocation['y' . $yr] = 0;
  8809.                     }  
  8810.                     break;
  8811.               }
  8812.             }
  8813.           } else {
  8814.             if(!is_null($olddata)){
  8815.               $myoldapprove=$olddata->getIsApproved();
  8816.               if(($myoldapprove===false) || ($myoldapprove===0)){$back=array();}
  8817.             }
  8818.             $alocation $this->calculate($opt['user'], $opt['leaveType'], $opt['startDate'], $opt['endDate'], $back, array('am' => $opt['am'], 'pm' => $opt['pm']));
  8819.             /*foreach ($back as $k => $v) {
  8820.                 $yr = str_replace('y', '', $k);
  8821.                 switch ($k) {
  8822.                     case 'data':
  8823.                       break;
  8824.                       case 'dumper':
  8825.                         break;  
  8826.                     case 'error':
  8827.                         break;
  8828.                     case 'child':
  8829.                         break;
  8830.                     case 'type':
  8831.                         break;    
  8832.                     case 'unpaid':
  8833.                         break;
  8834.                     case 'dumper':
  8835.                       break;    
  8836.                     default:
  8837.                         if (!isset($alocation['y' . $yr])) {
  8838.                             $alocation['y' . $yr] = 0;
  8839.                         }
  8840.                         break;
  8841.                 }
  8842.             }*/
  8843.             if ($alocation != false) {
  8844.               $dumper=array();
  8845.               $dy 0;
  8846.               $okd false;
  8847.               $upn=false;
  8848.               foreach ($alocation as $ka => $a) {
  8849.                   switch ($ka) {
  8850.                       case 'data':
  8851.                         break;
  8852.                         case 'dumper':
  8853.                           break;  
  8854.                       case 'error':
  8855.                           break;
  8856.                       case 'type':
  8857.                           break;
  8858.                       case 'dumper':
  8859.                         break;      
  8860.                       case 'child':
  8861.                           foreach($a as $aa){
  8862.                             foreach($aa as $aaa){
  8863.                               $dy += $aaa;
  8864.                             }  
  8865.                           }
  8866.                           $okd true
  8867.                           break;
  8868.                       case 'unpaid':
  8869.                           if($typ!='sick'){
  8870.                             foreach($a as $aa){
  8871.                               $dy += $aa['value'];
  8872.                             }
  8873.                             $okd true;
  8874.                           }
  8875.                           break; 
  8876.                       case 'type':
  8877.                         break;       
  8878.                       default:
  8879.                         if(!is_array($a)){
  8880.                           $dy += $a;
  8881.                           $okd true;
  8882.                         }
  8883.                           break;
  8884.                   }
  8885.               }
  8886.               if($dy==0){
  8887.                 foreach ($alocation as $ka => $a) {
  8888.                   switch ($ka) {
  8889.                       case 'data':
  8890.                         break;
  8891.                       case 'error':
  8892.                           break;
  8893.                       case 'type':
  8894.                           break;
  8895.                       case 'dumper':
  8896.                         break;       
  8897.                       case 'child':
  8898.                           break; 
  8899.                       case 'unpaid':
  8900.                             foreach($a as $aa){
  8901.                               $dy += $aa['value'];
  8902.                             }
  8903.                             $okd true;
  8904.                           break;    
  8905.                       default:
  8906.                           break;
  8907.                   }
  8908.               }          
  8909.               }
  8910.               if ($okd) {
  8911.                   $opt['days'] = $dy;
  8912.               } 
  8913.               $dumper=$alocation['dumper'];   
  8914.             }
  8915.           }
  8916.           if($opt['days']==0){
  8917.             if(!is_null($olddata)){
  8918.               $opt['days']=$olddata->getDays();
  8919.             }  
  8920.           }
  8921.           //print_r($alocation);
  8922.         
  8923.           $leaveRequest->setUser($opt['user']);
  8924.           $leaveRequest->setStartDate($opt['startDate']);
  8925.           $leaveRequest->setEndDate($opt['endDate']);
  8926.           $leaveRequest->setIsHalfStart($opt['am']);
  8927.           $leaveRequest->setIsHalfEnd($opt['pm']);
  8928.           $leaveRequest->setIsApproved($isApproved);
  8929.           $leaveRequest->setLeaveType($opt['leaveType']);
  8930.           $leaveRequest->setDays($opt['days']);
  8931.           $leaveRequest->setAttributes($opt['attributes']);
  8932.           $leaveRequest->setComment($opt['comment']);
  8933.           if(!is_null($isApproved)){
  8934.             $leaveRequest->setReviewedBy($opt['reviewBy']);
  8935.           }
  8936.           $leaveRequest->setAlocation($alocation);
  8937.           if(isset($opt['log']) && count($opt['log']) > 0){
  8938.             $leaveRequest->setLog($opt['log']);
  8939.           }
  8940.     
  8941.           if(is_null($olddata)){
  8942.             $leaveRequest->setCreatedAt(new \DateTime());
  8943.             $leaveRequest->setCreatedBy($opt['updateby']->getId());
  8944.           }else{
  8945.             if($opt['saveupdate']==true){
  8946.               $leaveRequest->setUpdatedAt(new \DateTime());
  8947.               $leaveRequest->setUpdatedBy($opt['updateby']);
  8948.             }
  8949.           }
  8950.     
  8951.           $em->persist($leaveRequest);
  8952.           $em->flush();
  8953.           $userupd=$leaveRequest->getUser()->getId();
  8954.           if(isset($opt['updateby'])){
  8955.             if(!is_null($opt['updateby'])){
  8956.               if(is_null($olddata)){
  8957.                 $userupd=$opt['updateby']->getId();
  8958.               }else{  
  8959.                 $userupd=$opt['updateby'];
  8960.               }  
  8961.             }
  8962.           }
  8963.           if(isset($option['setlog'])){
  8964.             $this->log->save($leaveRequest->getUser(), [
  8965.               'owner' => $leaveRequest->getUser(),
  8966.               'message' => $option['setlog'],
  8967.               'old_data' => $olddatalog,
  8968.               'new_data' => $leaveRequest
  8969.           ]);
  8970.           }
  8971.           if(isset($dumper)){
  8972.             $dmp=array();
  8973.             foreach($dumper as $k=>$d){
  8974.               $k=str_replace('l','',$k);
  8975.               $dmp[count($dmp)]=$k;
  8976.             }
  8977.             $dmpen=$em->getRepository(\App\Entity\LeaveEntitlement::class)->findBy(array('id'=>$dmp));
  8978.             if(is_array($dmpen)){
  8979.               foreach($dmpen as $de){
  8980.                 if(!is_null($dumper['l'.$de->getId()])){
  8981.                   $de->setLeaveLeft($dumper['l'.$de->getId()]);
  8982.                   $em->persist($de);
  8983.                   $em->flush();
  8984.                 }  
  8985.               }
  8986.             }
  8987.           }
  8988.           //$this->updateEntitlementFromLeave($opt['user'], $opt['leaveType'], $alocation, $back);   */     
  8989.         }else{
  8990.           //has allocation data
  8991.           $yrback=array();
  8992.           if(is_array($back)){
  8993.             foreach($back as $k=>$v){
  8994.               switch ($k) {
  8995.                 case 'data':
  8996.                   break; 
  8997.                   case 'dumper':
  8998.                     break;  
  8999.                 case 'error':
  9000.                     break;
  9001.                 case 'type':
  9002.                     break;    
  9003.                 case 'child':
  9004.                     break;
  9005.                 case 'unpaid':
  9006.                     break;
  9007.                 case 'dumper':
  9008.                   break;   
  9009.                 default:
  9010.                     $yr str_replace('y'''$k);
  9011.                     $yrback[count($yrback)]=$yr;
  9012.                     break;
  9013.               }
  9014.             }
  9015.             $fnby=array('year'=>$yrback);
  9016.             if(!is_null($option['user'])){
  9017.                 $fnby['user']=$option['user'];
  9018.             }
  9019.             $dmpen=$em->getRepository(\App\Entity\LeaveEntitlement::class)->findBy($fnby);
  9020.             $entback=array();
  9021.             $entback2=array();
  9022.             foreach($dmpen as $d){
  9023.                 $entback['l'.$d->getId()]=$d;
  9024.                 if(!isset($entback2['y'.$d->getYear()])){
  9025.                   $entback2['y'.$d->getYear()]=array();
  9026.                 }
  9027.                 $entback2['y'.$d->getYear()]['t'.$d->getLeaveType()->getId()]=$d;
  9028.             }
  9029.             foreach($back as $k=>$v){
  9030.               switch ($k) {
  9031.                 case 'data':
  9032.                   break; 
  9033.                   case 'dumper':
  9034.                     break;  
  9035.                 case 'error':
  9036.                     break;
  9037.                 case 'type':
  9038.                     break;    
  9039.                 case 'child':
  9040.                     foreach($v as $v1){
  9041.                       foreach($v1 as $k2=>$v2){
  9042.                         $cc str_replace('c'''$k2);
  9043.                         if(isset($entback['l'.$cc])){
  9044.                           $d=$entback['l'.$cc];
  9045.                           $ll=$d->getLeaveLeft();
  9046.                           $ll=$ll+$v2;
  9047.                           $d->setLeaveLeft($ll);
  9048.                           $em->persist($d);
  9049.                           $em->flush();
  9050.                         }
  9051.                       }
  9052.                     }
  9053.                     break;
  9054.                 case 'unpaid':
  9055.                     break;
  9056.                 case 'dumper':
  9057.                   break;   
  9058.                 default:
  9059.                     $yr str_replace('y'''$k);
  9060.                     $d=$entback2['y'.$yr]['t'.$gid=$opt['leaveType']->getId()];
  9061.                     $ll=$d->getLeaveLeft();
  9062.                     $ll=$ll+$v;
  9063.                     $d->setLeaveLeft($ll);
  9064.                     $em->persist($d);
  9065.                     $em->flush();
  9066.                     break;
  9067.               }
  9068.             }
  9069.           }
  9070.           
  9071.           $yrnow=date('Y');
  9072.           $opt['allocation']=json_decode($opt['allocation'],true);
  9073.           if(isset($opt['allocation']['data'])){
  9074.             if(isset($opt['allocation']['data']['input'])){
  9075.               $datainputdt=array();
  9076.               foreach($opt['allocation']['data']['input'] as $k=>$vdt){$datainputdt[$k]=$vdt;}  
  9077.           //print_r($back);
  9078.           //print_r($opt['allocation']);
  9079.               if(!is_null($option['user'])){
  9080.                 $ucountry=$option['user']->getOffice()->getCountry();
  9081.               }
  9082.               $holidays=array();
  9083.               $holidaydt=$em->getRepository(\App\Entity\LeaveBankHoliday::class)->findAll();
  9084.               foreach($holidaydt as $hl){
  9085.                 $loc=$hl->getLocation();
  9086.                 if(!isset($holidays[$loc])){$holidays[$loc]=array();}
  9087.                 $shl=new \DateTime($hl->getDate()->format('Y-m-d'));
  9088.                 if(is_null($hl->getEndDate())){
  9089.                   $ehl=new \DateTime($hl->getDate()->format('Y-m-d'));
  9090.                 }else{
  9091.                   $ehl=new \DateTime($hl->getEndDate()->format('Y-m-d'));
  9092.                 }  
  9093.               
  9094.                 $inval=date_diff($ehl,$shl);
  9095.                 $inval=abs($inval->d)+1;
  9096.                 for($hv=0;$hv<$inval;$hv++){
  9097.                   $holidays[$loc][count($holidays[$loc])]=$shl->format('Y-m-d');
  9098.                   $shl->modify('+1 day');
  9099.                 }
  9100.               }
  9101.         
  9102.               $offdays=array(0,6);
  9103.               $offdaysdt=array(6,7);
  9104.               $startdt=new \DateTime($opt['startDate']->format('Y-m-d'));
  9105.               $enddt=new \DateTime($opt['endDate']->format('Y-m-d'));
  9106.               $totaldt=$enddt->diff($startdt);
  9107.               $totaldt=intval($totaldt->format("%a"))+1;
  9108.               $datelist=array();
  9109.               $yeardt=array();
  9110.               //get list effected date
  9111.               $minyeardt=9999;
  9112.               for($t=0;$t<$totaldt;$t++){
  9113.                 $okdt=true;
  9114.                 if(isset($ucountry)){
  9115.                   if(isset($holidays[$ucountry])){
  9116.                     if(in_array($startdt->format('Y-m-d'),$holidays[$ucountry])){
  9117.                       $okdt=false;
  9118.                     }
  9119.                   }
  9120.                 }
  9121.                 if(in_array($startdt->format('N'),$offdaysdt)){$okdt=false;}
  9122.                 if($okdt){
  9123.                   $datelist[count($datelist)]=$startdt->format('Y-m-d');
  9124.                 }
  9125.                 if(!in_array($startdt->format('Y'),$yeardt)){
  9126.                   $yeardt[count($yeardt)]=$startdt->format('Y');
  9127.                   if(intval($startdt->format('Y')) < $minyeardt){$minyeardt=intval($startdt->format('Y'));}
  9128.                 }
  9129.                 $startdt->modify('+1 day');
  9130.               }
  9131.               array_unshift($yeardt,$minyeardt-1);
  9132.               $fnby=array('year'=>$yeardt);
  9133.               if(!is_null($option['user'])){
  9134.                 $fnby['user']=$option['user'];
  9135.               }
  9136.               $dmpen=$em->getRepository(\App\Entity\LeaveEntitlement::class)->findBy($fnby);
  9137.               $entlistdt=array();
  9138.               $entbyiddt=array();
  9139.               foreach($dmpen as $d){
  9140.                 $gid=$d->getId();
  9141.                 $entlistdt['l'.$gid]=array();
  9142.                 $entlistdt['l'.$gid]['total']=$d->getLeaveEntitlements();
  9143.                 $entlistdt['l'.$gid]['left']=$d->getLeaveLeft();
  9144.                 $entlistdt['l'.$gid]['year']=$d->getYear();
  9145.                 $entlistdt['l'.$gid]['type']=$d->getLeaveType()->getId();
  9146.                 $entlistdt['l'.$gid]['parent']=$d->getParent();
  9147.                 $entlistdt['l'.$gid]['attributes']=$d->getAttributes();
  9148.                 $entlistdt['l'.$gid]['use']=0;
  9149.                 $entlistdt['l'.$gid]['date']=array();
  9150.                 $entbyiddt['l'.$gid]=$d;
  9151.               }
  9152.               foreach($entlistdt as $d){
  9153.                 if(($d['parent']!=null) && ($d['parent']!=0)){
  9154.                   if(isset($d['attributes']['followParent'])){
  9155.                     if($d['attributes']['followParent']){
  9156.                       $entlistdt['l'.$d['parent']]['oldleft']=$entlistdt['l'.$d['parent']]['left'];
  9157.                       $entlistdt['l'.$d['parent']]['left']-=($d['total']-$d['left']);
  9158.                     }
  9159.                   }
  9160.                 }
  9161.               }
  9162.               $unpaiddt=array();
  9163.               //calculate by date
  9164.               $cdt=count($datelist);
  9165.               $idt=count($opt['allocation']['data']['input']);
  9166.               for($t=0;$t<$cdt;$t++){
  9167.                 $al=1;
  9168.                 if(isset($opt['am'])){
  9169.                   if(($opt['am']==true) && ($t==0)){$al-=0.5;}
  9170.                 }
  9171.                 if(isset($opt['pm'])){
  9172.                   if(($opt['pm']==true) && ($t==($cdt-1))){$al-=0.5;}
  9173.                 }
  9174.                 $dtx=new \DateTime($datelist[$t]);
  9175.                 $dtformat='d'.$dtx->format('Ymd');
  9176.                 foreach($opt['allocation']['data']['input'] as $k=>$vdt){
  9177.                   $okcut=true;
  9178.                   $gid=$k;
  9179.                   if($vdt<=0){continue;}
  9180.                   if($vdt $al){$al=$al-$vdt;}
  9181.                   $opt['allocation']['data']['input'][$k]-=$al;
  9182.                   if($opt['allocation']['data']['input'][$k]<0){$opt['allocation']['data']['input'][$k]=0;}
  9183.                   if($al 0){
  9184.                     $lfdt=$entlistdt[$gid]['left']-$al;
  9185.                     if((isset($entlistdt[$gid]['attributes']['followParent'])) && ($lfdt >= 0)){
  9186.                       $lfdtp=$entlistdt['l'.$entlistdt[$gid]['parent']]['left']-$al;
  9187.                       if($lfdt 0){
  9188.                         $entlistdt['l'.$entlistdt[$gid]['parent']]['left']=0;
  9189.                         if(!isset($unpaiddt[$yrnow])){
  9190.                           $unpaiddt[$yrnow]=array('value'=>0,'date'=>array());
  9191.                         }
  9192.                         $unpaiddt[$yrnow]['date'][count($unpaiddt[$yrnow]['date'])]=array(
  9193.                           'date'=>$datelist[$t],
  9194.                           'value'=>abs($lfdt)
  9195.                         );
  9196.                         $unpaiddt[$yrnow]['value']+=abs($lfdt);
  9197.                         $ll=($al-$lfdt)-$al;
  9198.                         $entlistdt[$gid]['left']=$entlistdt[$gid]['left']-$ll;
  9199.                         $entlistdt[$gid]['use']+=$ll;
  9200.                         if(!isset($entlistdt[$gid]['date'][$dtformat])){
  9201.                           $entlistdt[$gid]['date'][$dtformat]=0;
  9202.                         }
  9203.                         $entlistdt[$gid]['date'][$dtformat]+=$ll;
  9204.                       }else{
  9205.                         $entlistdt['l'.$entlistdt[$gid]['parent']]['left']=$lfdt;
  9206.                         $entlistdt[$gid]['left']=$lfdt;
  9207.                         $entlistdt[$gid]['use']+=$al;
  9208.                         if(!isset($entlistdt[$gid]['date'][$dtformat])){
  9209.                           $entlistdt[$gid]['date'][$dtformat]=0;
  9210.                         }
  9211.                         $entlistdt[$gid]['date'][$dtformat]+=$al;
  9212.                       }
  9213.                     }else if($lfdt 0){
  9214.                       if(!isset($unpaiddt[$yrnow])){
  9215.                         $unpaiddt[$yrnow]=array('value'=>0,'date'=>array());
  9216.                       }
  9217.                       $unpaiddt[$yrnow]['date'][count($unpaiddt[$yrnow]['date'])]=array(
  9218.                         'date'=>$datelist[$t],
  9219.                         'value'=>abs($lfdt)
  9220.                       );
  9221.                       $unpaiddt[$yrnow]['value']+=abs($lfdt);
  9222.                         $ll=($al-$lfdt)-$al;
  9223.                         if($entlistdt[$gid]['left'] > 0){
  9224.                           $entlistdt[$gid]['use']+=$ll;
  9225.                           $entlistdt[$gid]['left']=0;
  9226.                           if(isset($entlistdt[$gid]['oldleft'])){
  9227.                             $entlistdt[$gid]['oldleft']-=$ll;
  9228.                             if($entlistdt[$gid]['oldleft'] < 0){$entlistdt[$gid]['oldleft']=0;}
  9229.                           }
  9230.                           if(!isset($entlistdt[$gid]['date'][$dtformat])){
  9231.                             $entlistdt[$gid]['date'][$dtformat]=0;
  9232.                           }
  9233.                           $entlistdt[$gid]['date'][$dtformat]+=$ll;
  9234.                         }
  9235.                         
  9236.                     }else if($lfdt >= 0){
  9237.                         $entlistdt[$gid]['left']=$lfdt;
  9238.                         $entlistdt[$gid]['use']+=$al;
  9239.                         if(isset($entlistdt[$gid]['oldleft'])){
  9240.                           $entlistdt[$gid]['oldleft']-=$al;
  9241.                           if($entlistdt[$gid]['oldleft'] < 0){$entlistdt[$gid]['oldleft']=0;}
  9242.                         }
  9243.                         if(!isset($entlistdt[$gid]['date'][$dtformat])){
  9244.                           $entlistdt[$gid]['date'][$dtformat]=0;
  9245.                         }
  9246.                         $entlistdt[$gid]['date'][$dtformat]+=$al;
  9247.                     }
  9248.                     if($opt['allocation']['data']['input'][$k] > 0){break;}
  9249.                   }  
  9250.                 }
  9251.               }
  9252.               $alllist=array('data'=>array(),'type'=>array(),'child'=>array());
  9253.               $alllist['data']['input']=array();
  9254.               $datainputid=array();
  9255.               foreach($datainputdt as $kdt=>$vdt){
  9256.                 $alllist['data']['input'][$kdt]=$vdt;
  9257.                 $datainputid[count($datainputid)]=str_replace('l','',$kdt);
  9258.               }
  9259.               //unpaid part
  9260.               $unpaiddt=$opt['allocation']['unpaid'];
  9261.               if(isset($opt['leaveType'])){
  9262.                 $gid=$opt['leaveType']->getId();
  9263.                 foreach($entlistdt as $kdt=>$vdt){
  9264.                   if($vdt['type']==$gid){
  9265.                     if(!isset($alllist['y'.$vdt['year']])){
  9266.                       $alllist['y'.$vdt['year']]=0;
  9267.                     }
  9268.                     $alllist['y'.$vdt['year']]+=$vdt['use'];
  9269.                     if(!isset($alllist['data']['y'.$vdt['year']])){
  9270.                       $alllist['data']['y'.$vdt['year']]=array();
  9271.                       foreach($vdt['date'] as $kxdt => $vxdt){
  9272.                         if(!isset($alllist['data']['y'.$vdt['year']][$kxdt])){
  9273.                           $alllist['data']['y'.$vdt['year']][$kxdt]=0;
  9274.                         }
  9275.                         $alllist['data']['y'.$vdt['year']][$kxdt]+=$vxdt;
  9276.                       }
  9277.                     }
  9278.                   }
  9279.                   $xkdt=str_replace('l','',$kdt);
  9280.                   if(($vdt['parent']!=0) && ($vdt['parent']!=null)){
  9281.                     
  9282.                     if(!isset($alllist['child']['y'.$vdt['year']])){
  9283.                       $alllist['child']['y'.$vdt['year']]=array();
  9284.                     }
  9285.                     if(!isset($alllist['child']['y'.$vdt['year']]['c'.$xkdt])){
  9286.                       $alllist['child']['y'.$vdt['year']]['c'.$xkdt]=0;
  9287.                     }
  9288.                     $alllist['child']['y'.$vdt['year']]['c'.$xkdt]+=$vdt['use'];
  9289.                     if(!isset($alllist['data']['y'.$vdt['year']])){
  9290.                       $alllist['data']['y'.$vdt['year']]=array();
  9291.                     } 
  9292.                     if(!isset($alllist['data']['y'.$vdt['year']]['child'])){
  9293.                       $alllist['data']['y'.$vdt['year']]['child']=array();
  9294.                     } 
  9295.                     if(!isset($alllist['data']['y'.$vdt['year']]['child']['c'.$xkdt])){
  9296.                       $alllist['data']['y'.$vdt['year']]['child']['c'.$xkdt]=array();
  9297.                     } 
  9298.                     foreach($vdt['date'] as $kxdt => $vxdt){
  9299.                       if(!isset($alllist['data']['y'.$vdt['year']]['child']['c'.$xkdt][$kxdt])){
  9300.                         $alllist['data']['y'.$vdt['year']]['child']['c'.$xkdt][$kxdt]=0;
  9301.                       }
  9302.                       $alllist['data']['y'.$vdt['year']]['child']['c'.$xkdt][$kxdt]+=$vxdt;
  9303.                     }
  9304.                   }
  9305.                   if(!isset($alllist['dumper'])){$alllist['dumper']=array();}
  9306.                   //if(in_array($xkdt,$datainputid)){
  9307.                     if(!isset($alllist['dumper'][$kdt])){$alllist['dumper'][$kdt]=0;}
  9308.                     $alllist['dumper'][$kdt]+=$vdt['left'];
  9309.                     $alllist['type']['c'.$xkdt]=$vdt['attributes']['label'].' '.$vdt['year'];
  9310.                   //}
  9311.                 }
  9312.                 $alllist['unpaid']=$unpaiddt;
  9313.               }
  9314.               
  9315.               $leaveRequest->setUser($opt['user']);
  9316.             $leaveRequest->setStartDate($opt['startDate']);
  9317.             $leaveRequest->setEndDate($opt['endDate']);
  9318.             $leaveRequest->setIsHalfStart($opt['am']);
  9319.             $leaveRequest->setIsHalfEnd($opt['pm']);
  9320.             $leaveRequest->setIsApproved($isApproved);
  9321.             $leaveRequest->setLeaveType($opt['leaveType']);
  9322.             $leaveRequest->setDays($opt['days']);
  9323.             $leaveRequest->setAttributes($opt['attributes']);
  9324.             $leaveRequest->setComment($opt['comment']);
  9325.             if(!is_null($isApproved)){
  9326.               $leaveRequest->setReviewedBy($opt['reviewBy']);
  9327.             }
  9328.             $leaveRequest->setAlocation($alllist);
  9329.             if(isset($opt['log']) && count($opt['log']) > 0){
  9330.               $leaveRequest->setLog($opt['log']);
  9331.             }
  9332.             if(is_null($olddata)){
  9333.               $leaveRequest->setCreatedAt(new \DateTime());
  9334.               $leaveRequest->setCreatedBy($opt['updateby']->getId());
  9335.             }else{
  9336.               if($opt['saveupdate']==true){
  9337.                 $leaveRequest->setUpdatedAt(new \DateTime());
  9338.                 $leaveRequest->setUpdatedBy($opt['updateby']);
  9339.               }
  9340.             }
  9341.             $em->persist($leaveRequest);
  9342.             $em->flush();
  9343.             $userupd=$leaveRequest->getUser()->getId();
  9344.             if(isset($opt['updateby'])){
  9345.               if(!is_null($opt['updateby'])){
  9346.                 if(is_null($olddata)){
  9347.                   $userupd=$opt['updateby']->getId();
  9348.                 }else{  
  9349.                   $userupd=$opt['updateby'];
  9350.                 }  
  9351.               }
  9352.             }
  9353.             if(isset($option['setlog'])){
  9354.               $this->log->save($leaveRequest->getUser(), [
  9355.                 'owner' => $leaveRequest->getUser(),
  9356.                 'message' => $option['setlog'],
  9357.                 'old_data' => $olddatalog,
  9358.                 'new_data' => $leaveRequest
  9359.             ]);
  9360.             }
  9361.             foreach($dmpen as $d){
  9362.               if(isset($entlistdt['l'.$d->getId()])){
  9363.                 $ll=$d->getLeaveLeft();
  9364.                 if($ll!=$entlistdt['l'.$d->getId()]['left']){
  9365.                   if(isset($entlistdt['l'.$d->getId()]['oldleft'])){
  9366.                     $d->setLeaveLeft($entlistdt['l'.$d->getId()]['oldleft']);
  9367.                   }else{
  9368.                     $d->setLeaveLeft($entlistdt['l'.$d->getId()]['left']);
  9369.                   }
  9370.                   $em->persist($d);
  9371.                   $em->flush();
  9372.                 }
  9373.               }  
  9374.             }  
  9375.         }
  9376.       }
  9377.     }
  9378.   }    
  9379.     $leaves=clone $leaveRequest;
  9380.     $lefts=$this->_lefts(array(
  9381.       'user'=>$opt['user'],
  9382.       'start'=>$opt['startDate']->format('Y-m-d'),
  9383.       'end'=>$opt['endDate']->format('Y-m-d')
  9384.     ));
  9385.     if(isset($lefts['u'.$opt['user']->getId()]['y'.$opt['startDate']->format('Y')]['t'.$opt['leaveType']->getId()])){
  9386.       $leaves->setDaysLeft($lefts['u'.$opt['user']->getId()]['y'.$opt['startDate']->format('Y')]['t'.$opt['leaveType']->getId()]);
  9387.     }else{
  9388.       $leaves->setDaysLeft(0);
  9389.     }
  9390.     return array(
  9391.       'data'=>$leaves,
  9392.       'olddata'=>$olddata,
  9393.       'isupdate'=>$isupdate,
  9394.       'remove'=>$removedmc,
  9395.       'rgcalid'=>$removedgmc,
  9396.       'updatedate'=>$updatedate,
  9397.     );
  9398.   }
  9399.   
  9400.   /*
  9401.   public function weeklyLeaveEmail ($leaveData)
  9402.   {
  9403.       $loggedIn = false;
  9404.       $emailOps = $this->params->get('systemEmailOps');
  9405.       // $reminderLog = $editedUser->getReminder();
  9406.       $subject = $this->translator->trans('email.leave.ops.weekly');
  9407.       $emailTemplate = 'email/user-notification/leave/weekly-reminder.html.twig';
  9408.       $this->mailgunService->sendEmail(
  9409.           $subject,
  9410.           [$emailOps],
  9411.           $emailTemplate,
  9412.           [
  9413.               'leaveRequests' => $leaveData,
  9414.               'loop' => 'weekly'
  9415.           ],
  9416.           $loggedIn
  9417.       ); 
  9418.   }
  9419.   */
  9420.   public function weeklyHolidayEmail ($holidayData$email false)
  9421.   {
  9422.       $loggedIn false;
  9423.       $emailOps $email $email $this->params->get('systemEmailOps');
  9424.       foreach($holidayData as $holiday){
  9425.         date_default_timezone_set("Asia/Singapore");
  9426.         $startDate $holiday->getDate();
  9427.         $startDate = new \DateTime($startDate->format('Y-m-d'));
  9428.         $endDate $holiday->getEndDate();
  9429.         $endDate is_null($endDate) ? new \DateTime($startDate->format('Y-m-d')) : new \DateTime($endDate->format('Y-m-d')) ; 
  9430.         $holiday->setDate($startDate);
  9431.         $holiday->setEndDate($endDate);
  9432.       }
  9433.       
  9434.       // $reminderLog = $editedUser->getReminder();
  9435.       //$test = $email && $_SERVER['APP_ENV'] == 'prod' ? '[TEST] ' : '';
  9436.       $subject $this->translator->trans('email.leave.ops.holiday');
  9437.       $emailTemplate 'email/user-notification/leave/holiday-weekly.html.twig';
  9438.       $this->mailgunService->sendEmail(
  9439.           $subject,
  9440.           [$emailOps],
  9441.           $emailTemplate,
  9442.           [
  9443.               'holidays' => $holidayData,
  9444.               'loop' => 'weekly'
  9445.           ],
  9446.           $loggedIn
  9447.       ); 
  9448.   }
  9449.   public function reminderExpireNextMonthLeaveEmail ($leaveData)
  9450.   {
  9451.       $loggedIn false;
  9452.       // $reminderLog = $editedUser->getReminder();
  9453.       $user $leaveData->getUser();
  9454.       $leaveType $leaveData->getLeaveType()->getAttributes()['label'];
  9455.       $subject $this->translator->trans('email.leave.ops.');
  9456.       $emailTemplate 'email/user-notification/leave/expire-reminder.html.twig';
  9457.       $this->mailgunService->sendEmail(
  9458.           $this->translator->trans($subject 'expire', [
  9459.             '%leaveType%' => $leaveType,
  9460.           ]),
  9461.           [$user->getEmail()],
  9462.           $emailTemplate,
  9463.           [
  9464.               'recipient' => $user,
  9465.               'group' => 'user',
  9466.               'user' => $user,
  9467.               'leave' => $leaveData
  9468.           ],
  9469.           $loggedIn
  9470.       );
  9471.   }
  9472.   public function reminderExpireAnnualLeaveEmail ($leaveData)
  9473.   {
  9474.       $loggedIn false;
  9475.       $user $leaveData->getUser();
  9476.       $daysLeft $leaveData->getLeaveLeft();
  9477.       $subject $this->translator->trans('email.leave.ops.');
  9478.       $emailTemplate 'email/user-notification/leave/expire-annual-reminder.html.twig';
  9479.       $this->mailgunService->sendEmail(
  9480.           $this->translator->trans($subject 'expire_annual', [
  9481.             '%days%' => $daysLeft,
  9482.           ]),
  9483.           [$user->getEmail()],
  9484.           $emailTemplate,
  9485.           [
  9486.               'recipient' => $user,
  9487.               'group' => 'user',
  9488.               'user' => $user,
  9489.               'leave' => $leaveData
  9490.           ],
  9491.           $loggedIn
  9492.       );
  9493.   }
  9494.   public function reminderExpireCarryForwardLeaveEmail ($leaveData)
  9495.   {
  9496.       $loggedIn false;
  9497.       // $user = $leaveData->getUser();
  9498.       $user $leaveData['user'];
  9499.       $expireYear $leaveData['year'] + 1;
  9500.       // $expire = '';
  9501.       // if(is_array($leaveData->getAttributes()['expires'])){
  9502.       //   $expire = date("Y",strtotime($leaveData->getAttributes()['expires']['date']));
  9503.       // }else{
  9504.       //   $expire = date("Y", strtotime($leaveData->getAttributes()['expires']));
  9505.       // }
  9506.       $subject $this->translator->trans('email.leave.ops.');
  9507.       $emailTemplate 'email/user-notification/leave/expire-carryforward-reminder.html.twig';
  9508.       $this->mailgunService->sendEmail(
  9509.           $this->translator->trans($subject 'expire_carryforward', [
  9510.             '%year%' => $expireYear,
  9511.           ]),
  9512.           [$user->getEmail()],
  9513.           $emailTemplate,
  9514.           [
  9515.               'recipient' => $user,
  9516.               'group' => 'user',
  9517.               'user' => $user,
  9518.               'leave' => $leaveData
  9519.           ],
  9520.           $loggedIn
  9521.       );
  9522.   }
  9523.   public function reminderExpireBonusAdjLeaveEmail ($leaveData)
  9524.   {
  9525.       $loggedIn false;
  9526.       $user $leaveData->getUser();
  9527.       $label $leaveData->getLeaveType()->getAttributes()['label'];
  9528.       $subject $this->translator->trans('email.leave.reminder.expire_bonus');
  9529.       $emailTemplate 'email/user-notification/leave/expire-bonus-reminder.html.twig';
  9530.       $this->mailgunService->sendEmail(
  9531.           $this->translator->trans($subject, [
  9532.             '%label%' => ucwords($label)
  9533.           ]),
  9534.           [$user->getEmail()],
  9535.           $emailTemplate,
  9536.           [
  9537.               'recipient' => $user,
  9538.               'group' => 'user',
  9539.               'user' => $user,
  9540.               'leave' => $leaveData
  9541.           ],
  9542.           $loggedIn
  9543.       );
  9544.   }
  9545.   
  9546.   public function updateEntitlement($id$value)
  9547.   {
  9548.       $em $this->entityManager;
  9549.       $leave $em->getRepository(LeaveEntitlement::class)->find($id);
  9550.       if ($leave != null) {
  9551.           $realleave $em->getRepository(LeaveEntitlement::class)->find($id);
  9552.           $parent $leave->getParent();
  9553.           $list = array();
  9554.           if (($parent != null) && ($parent != 0)) {
  9555.               $leave $em->getRepository(LeaveEntitlement::class)->find($parent);
  9556.           }
  9557.           $user $leave->getUser();
  9558.           $year $leave->getYear();
  9559.           $type $leave->getLeaveType();
  9560.           $request $em->getRepository(LeaveRequest::class)->createQueryBuilder('a')
  9561.               ->select('a')
  9562.               ->where('a.startDate >= :from')
  9563.               ->andWhere('a.startDate <= :to')
  9564.               ->andWhere('a.leaveType in (:leavetype)')
  9565.               ->andWhere('a.user = :user')
  9566.               ->setParameter('from', new \DateTime($year '-01-01'))
  9567.               ->setParameter('to',  new \DateTime(($year 1) . '-12-31'))
  9568.               ->setParameter('leavetype',  $type)
  9569.               ->setParameter('user',  $user)
  9570.               ->orderBy('a.startDate')
  9571.               ->getQuery()
  9572.               ->getResult();
  9573.           $entityManager $em;
  9574.           foreach ($request as $r) {
  9575.               $alocation = array();
  9576.               $back $r->getAlocation();
  9577.               if ($back == null) {
  9578.                   $back = array();
  9579.               }
  9580.               if (isset($back['child'])) {
  9581.                   foreach ($back['child'] as $kb => $bchild) {
  9582.                       $yr str_replace('y'''$kb);
  9583.                       foreach ($bchild as $kb1 => $vb1) {
  9584.                           $cid str_replace('c'''$kb1);
  9585.                           $chde $em->getRepository(LeaveEntitlement::class)->findBy(array('user' => $user'id' => $cid'year' => $yr));
  9586.                           if (is_array($chde)) {
  9587.                               for ($bb 0$bb count($chde); $bb++) {
  9588.                                   $lf $chde[$bb]->getLeaveLeft();
  9589.                                   $lf $lf $vb1;
  9590.                                   $chde[$bb]->setLeaveLeft($lf);
  9591.                                   $em->persist($chde[$bb]);
  9592.                                   $em->flush();
  9593.                               }
  9594.                           }
  9595.                       }
  9596.                   }
  9597.               }
  9598.               foreach ($back as $k => $b) {
  9599.                   switch ($k) {
  9600.                       case'data':
  9601.                         break;
  9602.                       case 'error':
  9603.                           break;
  9604.                       case 'type':
  9605.                           break;  
  9606.                       case 'dumper':
  9607.                         break;     
  9608.                       case 'child':
  9609.                           $alocation['child'] = array();
  9610.                           break;
  9611.                       case 'unpaid':
  9612.                           $alocation['unpaid'] = array();
  9613.                           break;
  9614.                       default:
  9615.                           $yr str_replace('y'''$k);
  9616.                           $alocation['y' $yr] = 0;
  9617.                           break;
  9618.                   }
  9619.               }
  9620.               $r->setAlocation($alocation);
  9621.               $entityManager->persist($r);
  9622.               $entityManager->flush();
  9623.               $this->updateEntitlementFromLeave($user$type$alocation$back);
  9624.           }
  9625.           $realleave->setUpdatedAt(new \DateTime());
  9626.           $realleave->setLeaveLeft($value);
  9627.           $realleave->setleaveEntitlements($value);
  9628.           $entityManager->persist($realleave);
  9629.           $entityManager->flush();
  9630.           foreach ($request as $r) {
  9631.               $isam $r->getIsHalfStart();
  9632.               $ispm $r->getIsHalfEnd();
  9633.               $alocation $this->calculate($user$type$r->getStartdate(), $r->getEnddate(), null, array('am' => $isam'pm' => $ispm));             
  9634.               $r->setAlocation($alocation);
  9635.               $entityManager->persist($r);
  9636.               $entityManager->flush();
  9637.               $this->updateEntitlementFromLeave($user$type$alocation);
  9638.           }
  9639.       }
  9640.   }
  9641.   
  9642.   public function resetAll($option=array()){
  9643.     $default=array(
  9644.       'user'=>null,
  9645.       'year'=>date('Y')
  9646.     );
  9647.     $em=$this->entityManager;
  9648.     $opt=$default;
  9649.     foreach($option as $k=>$v){$opt[$k]=$v;}
  9650.     $bresult=array();
  9651.     $fn=array();
  9652.     $fn['year']=array($opt['year']-1,$opt['year'],$opt['year']+1);
  9653.     if(!is_null($opt['user'])){ 
  9654.       $fn['user']=$opt['user'];
  9655.       $bresult['user']=$opt['user']->getPersonalInfo()->getFirstName();
  9656.     }
  9657.     $realleave=array();
  9658.     $dataleave=array();
  9659.     $lent=$this->entityManager->getRepository(LeaveEntitlement::class)->findBy($fn);
  9660.     foreach($lent as $l){
  9661.       if($l->getYear()==$opt['year']){
  9662.         $country=$l->getUser()->getOffice()->getCountry();
  9663.         if($l->getLeaveType()->getLeaveName()=='annual'){
  9664.           $attrx=$l->getAttributes();
  9665.           
  9666.           $jobstatus=$l->getUser()->getPersonalInfo()->getJobStatus();
  9667.           if(isset($attrx['given'])){
  9668.             $attrx=$this->_calculate_givendate($l->getYear(),$country,$attrx,$l->getUser()->getPersonalInfo()->getJobJoinDate(),$l->getUser()->getPersonalInfo()->getJobPermanentDate(),$jobstatus);
  9669.           }
  9670.           $l->setAttributes($attrx);
  9671.           $em->persist($l);
  9672.           $em->flush();
  9673.         }
  9674.       }
  9675.       $uid=$l->getUser()->getId();
  9676.       if(!isset($dataleave['u'.$uid])){
  9677.         $dataleave['u'.$uid]=array();
  9678.       }
  9679.       if(!isset($dataleave['u'.$uid]['y'.$l->getYear()])){
  9680.         $dataleave['u'.$uid]['y'.$l->getYear()]=array();
  9681.       }  
  9682.       $dataleave['u'.$uid]['y'.$l->getYear()]['t'.$l->getLeaveType()->getId()]=$l;
  9683.       $realleave['c'.$l->getId()]=$l;
  9684.     } 
  9685.     
  9686.     //get request data
  9687.     $lrq $this->entityManager->getRepository(\App\Entity\LeaveRequest::class)->createQueryBuilder('a')
  9688.     ->select('a')
  9689.     ->where('a.startDate >= :from')
  9690.     ->andWhere('a.startDate <= :to')
  9691.     ->setParameter('from', new \DateTime($opt['year'] . '-01-01'))
  9692.     ->setParameter('to',  new \DateTime($opt['year'] . '-12-31'));
  9693.     if(!is_null($opt['user'])){
  9694.       $lrq->andWhere('a.user = :user')->setParameter('user',  $opt['user']);
  9695.     }
  9696.     $lrq->orderBy('a.startDate');
  9697.     $query=$lrq->getQuery();
  9698.     $result=$query->getResult();
  9699.     foreach($result as $l){
  9700.       $allo=$l->getAlocation();
  9701.       if(is_array($allo)){
  9702.         foreach($allo as $ka => $va){
  9703.           if($ka=='child'){
  9704.             foreach($va as $kc=>$vc){
  9705.               foreach($vc as $kc1 => $vc1){
  9706.                 if(isset($realleave[$kc1])){
  9707.                   $kcl=$realleave[$kc1]->getLeaveLeft()+$vc1;
  9708.                   $realleave[$kc1]->setLeaveLeft($kcl);
  9709.                   $this->entityManager->persist($realleave[$kc1]);
  9710.                   $this->entityManager->flush();
  9711.                 }
  9712.               }
  9713.             }
  9714.           }else if(substr($ka,0,1)=='y'){
  9715.             $yd=str_replace('y','',$ka);
  9716.             if(isset($dataleave['u'.$l->getUser()->getId()]['y'.$yd]['t'.$l->getLeaveType()->getId()])){
  9717.               $kld=$dataleave['u'.$l->getUser()->getId()]['y'.$yd]['t'.$l->getLeaveType()->getId()]->getLeaveLeft()+$va;
  9718.               $dataleave['u'.$l->getUser()->getId()]['y'.$yd]['t'.$l->getLeaveType()->getId()]->setLeaveLeft($kld);
  9719.               $this->entityManager->persist($dataleave['u'.$l->getUser()->getId()]['y'.$yd]['t'.$l->getLeaveType()->getId()]);
  9720.               $this->entityManager->flush();
  9721.             }
  9722.           }
  9723.         }
  9724.       }
  9725.       $l->setAlocation(array());
  9726.       $this->entityManager->persist($l);
  9727.       $this->entityManager->flush();
  9728.     }
  9729.             
  9730.     /*if(($leaveRequest->getLeaveType()->getId()==1) && ($leaveRequest->getUser()->getId()==51)){
  9731.       $ddtxt=array();
  9732.       $ddtxt['alocation']=$alocation;
  9733.       $ddtxt['id']=$leaveRequest->getId();
  9734.       dd($ddtxt);
  9735.     } */
  9736.     
  9737.     foreach($result as $l){
  9738.       $this->saveRequest(
  9739.         array('id'=>$l->getId(),'setlog'=>isset($option['logname'])?$option['logname']:'')
  9740.         );
  9741.     }
  9742.     return $bresult;
  9743.   }
  9744.   function _calculate_givendate($year,$country,$attr,$joindate,$permanentdate,$jobstatus){
  9745.     if(isset($attr['given'])){
  9746.       if(!is_null($joindate)){
  9747.         $ls=new \DateTime($year.'-01-01');
  9748.         if(($country=='SG') || ($country=='HK')){
  9749.           if(!is_null($joindate)){
  9750.             $givendate=new \DateTime($joindate->format('Y-m-d'));
  9751.             $givendate->modify('+3 months');
  9752.           }else{
  9753.             $givendate=$attr['given'];
  9754.             if(is_array($givendate)){
  9755.                 $givendate= new \DateTime($givendate['date']);
  9756.             }else{
  9757.                 $givendate= new \DateTime($givendate);
  9758.             }
  9759.           }
  9760.           if($ls $givendate){$givendate=$ls;}
  9761.           $attr['given']=$givendate->format('Y-m-d');
  9762.         }else if($country=='VN'){
  9763.           if(!is_null($joindate)){
  9764.             $givendate=new \DateTime($year.'-'.$joindate->format('m-d'));
  9765.           }else{
  9766.             $givendate=$attr['given'];
  9767.             if(is_array($givendate)){
  9768.               $givendate= new \DateTime($givendate['date']);
  9769.             }else{
  9770.               $givendate= new \DateTime($givendate);
  9771.             }
  9772.           }   
  9773.           
  9774.           $attr['given']=$givendate->format('Y-m-d');
  9775.         }else{
  9776.           if($jobstatus == 'form.job_status.permanent'){
  9777.             if(!is_null($permanentdate)){
  9778.               $givendate=new \DateTime($permanentdate->format('Y-m-d'));;
  9779.             }else{
  9780.                 $givendate=$attr['given'];
  9781.                 if(is_array($givendate)){
  9782.                   $givendate= new \DateTime($givendate['date']);
  9783.                 }else{
  9784.                   $givendate= new \DateTime($givendate);
  9785.                 }
  9786.             }    
  9787.              
  9788.                 if($ls $givendate){$givendate=$ls;}
  9789.                 
  9790.               $attr['given']=$givendate->format('Y-m-d');
  9791.               
  9792.           }
  9793.         }
  9794.       }
  9795.     }
  9796.     return $attr;    
  9797.   }
  9798.   public function saveLog($user,$entity,$action,$old=null){
  9799.     $em=$this->entityManager;
  9800.     $date=new \DateTime();
  9801.     $date=$date->format('Y-m-d H:i');
  9802.     if(strpos($action,'delete')===false){
  9803.       $ll=$em->getRepository(get_class($entity))->find($entity->getId());
  9804.       $log=$ll->getLog();
  9805.       if(is_null($log)){$log=array();}
  9806.       
  9807.       $c=count($log);
  9808.       $log[$c]=array();
  9809.       $log[$c]['date']=$date;
  9810.       $log[$c]['user']=$user->getPersonalInfo()->getFullName();
  9811.       $log[$c]['action']=$action;
  9812.       $group='LogService';
  9813.       $new=array();
  9814.       if(method_exists($entity,'getStartDate')){ $new['startDate']=$entity->getStartDate()->format('Y-m-d');}
  9815.       if(method_exists($entity,'getEndDate')){ $new['endDate']=$entity->getEndDate()->format('Y-m-d');}
  9816.       if(method_exists($entity,'getDays')){ $new['days']=$entity->getDays();}
  9817.       if(method_exists($entity,'getIsApproved')){ $new['approved']=$entity->getIsApproved();}
  9818.       if(method_exists($entity,'getAlocation')){ $new['allocation']=$entity->getAlocation();}
  9819.       $oldx=array();
  9820.       if(!is_null($old)){
  9821.         $new['change']='';
  9822.         if(method_exists($old,'getStartDate')){ $oldx['startDate']=$old->getStartDate()->format('Y-m-d');}
  9823.         if(method_exists($old,'getEndDate')){ $oldx['endDate']=$old->getEndDate()->format('Y-m-d');}
  9824.         if(method_exists($old,'getDays')){ $oldx['days']=$old->getDays();}
  9825.         if(method_exists($old,'getIsApproved')){ $oldx['approved']=$old->getIsApproved();}
  9826.         if(method_exists($old,'getAlocation')){ $oldx['allocation']=$old->getAlocation();}
  9827.         foreach($oldx as $k=>$v){
  9828.           if(isset($new[$k])){
  9829.             if($new[$k]!=$oldx[$k]){$new['change'].=$k.',';}
  9830.           }
  9831.         }
  9832.       }  
  9833.       
  9834.       /*$hf=fopen('../var/log/test.log','a');
  9835.       ob_start();
  9836.       $object = new \ReflectionObject($entity);
  9837.       foreach($object->getMethods() as $method){
  9838.       
  9839.           //print_r($testresult);
  9840.           print_r($method);
  9841.           
  9842.       }
  9843.       
  9844.       $txt=ob_get_clean();
  9845.       fwrite($hf,$txt);
  9846.       fclose($hf);*/
  9847.       //$new=$this->serializer->serialize($this->serializer->normalize($entity, null, ['groups' => $group, AbstractObjectNormalizer::ENABLE_MAX_DEPTH => true]), 'json');
  9848.       //unset($new['user']);
  9849.       //unset($new['id']);
  9850.       //$new=json_decode($new,true);
  9851.       //unset($new['user']);
  9852.       //unset($new['id']);
  9853.       $log[$c]['data']=$new;
  9854.       /*if(!is_null($old)){
  9855.         $old=$this->serializer->serialize($this->serializer->normalize($old, null, ['groups' => $group, AbstractObjectNormalizer::ENABLE_MAX_DEPTH => true]), 'json');
  9856.         $old=json_decode($old,true);
  9857.         unset($old['user']);
  9858.         unset($old['id']);
  9859.         $log[$c]['olddata']=$old;
  9860.       }*/
  9861.     
  9862.       
  9863.       $ll->setLog($log);
  9864.       $em->persist($ll);
  9865.       $em->flush();
  9866.     }  
  9867.     $type=get_class($entity);
  9868.     $type=explode('\\',$type);
  9869.     $type=$type[count($type)-1];
  9870.     $lt=$entity->getLeaveType();
  9871.     
  9872.     
  9873.     
  9874.     if(method_exists($entity,'getAlocation')){
  9875.       $st=$entity->getStartDate();
  9876.       $yr=$st->format('Y');
  9877.       $lv=array();
  9878.       $lvr=array();
  9879.       $ent=$this->entityManager->getRepository(\App\Entity\leaveEntitlement::class)->findBy(
  9880.         array(
  9881.           'year'=>array($yr-2,$yr-1,$yr*1),
  9882.           'user'=>$entity->getUser()->getId()
  9883.         ));
  9884.       if(is_array($ent)){
  9885.         foreach($ent as $l){
  9886.           $lyr=$l->getYear();
  9887.           $lty=$l->getLeaveType();
  9888.           if(!isset($lv['y'.$lyr])){$lv['y'.$lyr]=array();}
  9889.           $lv['y'.$lyr]['t'.$lty->getId()]=$l;
  9890.           $lvr['c'.$l->getId()]=$l;
  9891.         }
  9892.       }
  9893.       $all=$entity->getAlocation();
  9894.       //datelist
  9895.       foreach($all as $k=>$t){
  9896.         $log=null;
  9897.         $data=array();
  9898.         $data['userId']=$user->getId();
  9899.         $data['userName']=$user->getPersonalInfo()->getFullName();
  9900.         $data['leave']=array();
  9901.         $data['leave']['leaveTypeId']=$entity->getLeaveType()->getId();
  9902.         $data['leave']['leaveTypeName']=$entity->getLeaveType()->getLeaveName();
  9903.         $attrd=$entity->getLeaveType()->getAttributes();
  9904.         $data['leave']['leaveTypeLabel']=isset($attrd['label'])?$attrd['label']:$data['leave']['leaveTypeName'];
  9905.         $data['leave']['leaveStart']=$entity->getStartDate()->format('Y-m-d');
  9906.         $data['leave']['leaveEnd']=$entity->getEndDate()->format('Y-m-d');
  9907.         $data['leave']['isHalfStart']=$entity->getIsHalfStart();
  9908.         $data['leave']['isHalfEnd']=$entity->getIsHalfEnd();
  9909.         $data['leave']['days']=$entity->getDays();
  9910.         $data['leave']['isApproved']=$entity->getIsApproved();
  9911.         $data['record']=array();
  9912.         switch($k){
  9913.           case 'error':
  9914.               break;
  9915.           case 'data':
  9916.               break;
  9917.           case 'dumper':
  9918.               break;    
  9919.           case 'type':
  9920.               break;
  9921.           case 'unpaid':
  9922.               foreach($t as $kt=>$vt){
  9923.                 $log=new \App\Entity\LeaveLog();
  9924.                 $log->setLeaveType($lt);
  9925.                 $tyr=str_replace('y','',$kt);
  9926.                 $ttid=$lt->getId();
  9927.                 if(isset($lv[$kt]['t'.$ttid])){
  9928.                   $data['record']['entId']=$lv[$kt]['t'.$ttid]->getId();
  9929.                   $data['record']['days']=$vt['value'];
  9930.                   $data['record']['year']=$tyr;
  9931.                   $data['record']['status']='unpaid';
  9932.                   $data['record']['leaveId']=$lt->getID();
  9933.                   $data['record']['leaveName']=$lt->getLeaveName();
  9934.                   $attrr=$lv[$kt]['t'.$ttid]->getAttributes();
  9935.                   if(isset($attrr['title'])){
  9936.                     $data['record']['leaveLabel']=isset($attrr['title'])?$attrr['title']:$data['record']['leaveName'];
  9937.                   }else{
  9938.                     $data['record']['leaveLabel']=isset($attrr['label'])?$attrr['label']:$data['record']['leaveName'];
  9939.                   }
  9940.                   //$data['record']['dates']=$vt['date'];
  9941.                 }
  9942.                 $log->setDate(new \DateTimeImmutable());
  9943.                 $log->setUser($entity->getUser());
  9944.                 $log->setAction($action);
  9945.                 $log->setRecordId($entity->getId());
  9946.                 $log->setData($data);
  9947.                 $log->setType($type);
  9948.                 $em->persist($log);
  9949.                 $em->flush();
  9950.               }           
  9951.               break;         
  9952.           case 'child':
  9953.               foreach($t as $c){
  9954.                 foreach($c as $kc => $vc){
  9955.                   $log=new \App\Entity\LeaveLog();
  9956.                   if(isset($lvr[$kc])){
  9957.                     $log->setLeaveType($lvr[$kc]->getLeaveType());
  9958.                     $data['record']['entId']=str_replace('c','',$kc);
  9959.                     $attrr=$lvr[$kc]->getAttributes();
  9960.                     $data['record']['leaveId']=$lvr[$kc]->getLeaveType()->getID();
  9961.                     $data['record']['leaveName']=$lvr[$kc]->getLeaveType()->getLeaveName();
  9962.                     if(isset($attrr['title'])){
  9963.                       $data['record']['leaveLabel']=isset($attrr['title'])?$attrr['title']:$data['record']['leaveName'];
  9964.                     }else{
  9965.                       $data['record']['leaveLabel']=isset($attrr['label'])?$attrr['label']:$data['record']['leaveName'];
  9966.                     }
  9967.                     $data['record']['year']=$lvr[$kc]->getYear();
  9968.                     $data['record']['days']=$vc;
  9969.                     $data['record']['dates']=array();
  9970.                     if(isset($all['data'])){
  9971.                       $dtdates=$all['data'];
  9972.                       foreach($dtdates as $dd){
  9973.                         if(isset($dd['child'])){
  9974.                           foreach($dd['child'] as $kdc=>$vdc){
  9975.                             if($kdc==$kc){
  9976.                               array_push($data['record']['dates'],$vdc);
  9977.                             }
  9978.                           }
  9979.                         }
  9980.                       }
  9981.                     }  
  9982.                     //$data
  9983.                     $log->setDate(new \DateTimeImmutable());
  9984.                     $log->setUser($entity->getUser());
  9985.                     $log->setAction($action);
  9986.                     $log->setRecordId($entity->getId());
  9987.                     $log->setData($data);
  9988.                     $log->setType($type);
  9989.                     $em->persist($log);
  9990.                     $em->flush();
  9991.                   }
  9992.                 }
  9993.               }
  9994.               break;
  9995.           default:
  9996.               $log=new \App\Entity\LeaveLog();
  9997.               $log->setLeaveType($lt);
  9998.               $tyr=str_replace('y','',$k);
  9999.               $ttid=$lt->getId();
  10000.               if(isset($lv[$k]['t'.$ttid])){
  10001.                 $data['record']['entId']=$lv[$k]['t'.$ttid]->getId();
  10002.                 $data['record']['days']=$t;
  10003.                 $data['record']['year']=$tyr;
  10004.                 $data['record']['leaveId']=$lt->getID();
  10005.                 $data['record']['leaveName']=$lt->getLeaveName();
  10006.                 $attrr=$lv[$k]['t'.$ttid]->getAttributes();
  10007.                 if(isset($attrr['title'])){
  10008.                   $data['record']['leaveLabel']=isset($attrr['title'])?$attrr['title']:$data['record']['leaveName'];
  10009.                 }else{
  10010.                   $data['record']['leaveLabel']=isset($attrr['label'])?$attrr['label']:$data['record']['leaveName'];
  10011.                 }
  10012.                 $data['record']['dates']=array();
  10013.               }
  10014.               $log->setDate(new \DateTimeImmutable());
  10015.               $log->setUser($entity->getUser());
  10016.               $log->setAction($action);
  10017.               $log->setRecordId($entity->getId());
  10018.               $log->setData($data);
  10019.               $log->setType($type);
  10020.               $em->persist($log);
  10021.               $em->flush();
  10022.               break;    
  10023.         }
  10024.         if(!is_null($log)){
  10025.           
  10026.         }  
  10027.       }
  10028.     }else if(method_exists($entity,'getLeaveEntitlements')){
  10029.         $log=new \App\Entity\LeaveLog();
  10030.         $log->setDate(new \DateTimeImmutable());
  10031.         $log->setUser($entity->getUser());
  10032.         $log->setLeaveType($entity->getLeaveType());
  10033.         $log->setAction($action);
  10034.         $log->setRecordId($entity->getId());
  10035.         $data=array();
  10036.         $data['userId']=$user->getId();
  10037.         $data['userName']=$user->getPersonalInfo()->getFullName();
  10038.         
  10039.         $data['record']=array();
  10040.         $data['record']['entId']=$entity->getId();
  10041.         $data['record']['days']=$entity->getLeaveEntitlements();
  10042.         $data['record']['year']=$entity->getYear();
  10043.         $data['record']['leaveId']=$lt->getID();
  10044.         $data['record']['leaveName']=$lt->getLeaveName();
  10045.         $attrr=$entity->getAttributes();
  10046.         if(isset($attrr['title'])){
  10047.           $data['record']['leaveLabel']=isset($attrr['title'])?$attrr['title']:$data['record']['leaveName'];
  10048.         }else{
  10049.           $data['record']['leaveLabel']=isset($attrr['label'])?$attrr['label']:$data['record']['leaveName'];
  10050.         }
  10051.         $data['record']['dates']=array();
  10052.         if(isset($attrr['expires'])){$data['record']['dates']['expires']=$attrr['expires'];}
  10053.         if(isset($attrr['given'])){$data['record']['dates']['given']=$attrr['given'];}
  10054.         $log->setData($data);
  10055.         $log->setType($type);
  10056.         $em->persist($log);
  10057.         $em->flush();
  10058.     }
  10059.     
  10060.     
  10061.     
  10062.     
  10063.   }
  10064.   public function todayLeaveEmail($request)
  10065.   {
  10066.     $loggedIn false;
  10067.     $user $request->getUser()->getPersonalInfo()->getFirstName();
  10068.     $leaveType $request->getLeaveType();
  10069.     $dataleaveType ucwords($leaveType->getLeaveName());
  10070.     $startDateData $request->getStartDate();
  10071.     $startDate $startDateData->format('d F');
  10072.     $isHalfStart $request->getIsHalfStart();
  10073.     $isHalfStart $isHalfStart 'PM' 'AM';
  10074.     $endDateData $request->getEndDate();
  10075.     $endDate $endDateData->format('d F Y');
  10076.     $isHalfEnd $request->getIsHalfEnd();
  10077.     $isHalfEnd $isHalfEnd 'AM' 'PM';
  10078.     $todayDateData = new \DateTime();
  10079.     $tDate $todayDateData->format("Y-m-d");
  10080.     $sDate $startDateData->format("Y-m-d");
  10081.     $eDate $endDateData->format("Y-m-d");
  10082.     if($tDate == $sDate){
  10083.       $displayDate $startDateData;
  10084.     }else{
  10085.       $displayDate $endDateData;
  10086.     }
  10087.     $dateDisplay $displayDate->format('d F');
  10088.     $halfDay $isHalfStart == 'PM' $isHalfStart '';
  10089.     $halfDay .= $isHalfEnd == 'AM' $isHalfEnd '';
  10090.     $emailOps $this->params->get('systemEmailOps');
  10091.     $subject $this->translator->trans('email.leave.ops.today');
  10092.     $emailTemplate 'email/user-notification/leave/leave.html.twig';
  10093.     $this->mailgunService->sendEmail(
  10094.       $this->translator->trans($subject, [
  10095.         '%user%' => $user,
  10096.         '%leaveType%' => $dataleaveType,
  10097.         '%startDate%' => $dateDisplay.' '.$halfDay,
  10098.         /*
  10099.         '%endDate%' => $endDate,
  10100.         '%isHalfStart%' => $isHalfStart,
  10101.         '%isHalfEnd%' => $isHalfEnd,
  10102.         */
  10103.       ]),
  10104.       [$emailOps],
  10105.       $emailTemplate,
  10106.       [
  10107.         'leaveRequest' => $request,
  10108.       ],
  10109.       $loggedIn
  10110.     );
  10111.   }
  10112.   function trashRequest(\App\Entity\User $user,\App\Entity\LeaveRequest $request){
  10113.     
  10114.     $em=$this->entityManager;
  10115.     $trash=new \App\Entity\LeaveRequestTrash();
  10116.     $object = new \ReflectionObject($request);
  10117.     $trash->setRecordId($request->getId());
  10118.     $trash->setDeletedAt(new \DateTime());
  10119.     $trash->setDeletedBy($user->getId());
  10120.     foreach ($object->getMethods() as $method) {
  10121.         if(is_object($method)){
  10122.           $nm=$method->name;
  10123.           if(substr($nm,0,3)=='get'){
  10124.             
  10125.             if(($nm!='getId') && ($nm!='getDeletedAt') && ($nm!='getDeletedBy') && ($nm!='getIsApproveds')){
  10126.               $setnm='set'.substr($nm,3,strlen($nm)-3);
  10127.               if(method_exists($trash,$setnm)){
  10128.                 call_user_func(array($trash,$setnm),call_user_func(array($request,$nm)));
  10129.               }
  10130.             }  
  10131.           }
  10132.         }  
  10133.     }
  10134.     $em->persist($trash);
  10135.     $em->flush();
  10136.   }
  10137.   function dateDiffWithoutWeekendsAndHolidays($startDate$endDate$bankHolidays) {
  10138.     $start = new \DateTime($startDate);
  10139.     $end = new \DateTime($endDate);
  10140.     $interval = new \DateInterval('P1D');
  10141.     $excludeWeekends true;
  10142.     $period = new \DatePeriod($start$interval$end);
  10143.     $days 0;
  10144.     foreach ($period as $day) {
  10145.         $isWeekend $day->format('N') >= 6;
  10146.         if ($excludeWeekends && $isWeekend) {
  10147.             continue;
  10148.         }
  10149.         $isHoliday in_array($day->format('Y-m-d'), $bankHolidays);
  10150.         if ($isHoliday) {
  10151.             continue; 
  10152.         }
  10153.         $days++;
  10154.     }
  10155.     return $days;
  10156.   }
  10157.   public function _dashboard($user,$year='',$leave=array('annual','carryover','anniversary','sick','adjustment')){
  10158.     $result=array();
  10159.     $result['dummy']=array();
  10160.     if($year==''){$year=date('Y');}
  10161.     $year=intval($year);
  10162.     $em $this->entityManager;
  10163.     if(is_int($user)){
  10164.       $user=$em->getRepository(\App\Entity\User::class)->find($user);
  10165.     }
  10166.     $arg=array(
  10167.       'user'=>$user,
  10168.       'year'=>array($year,$year-1)
  10169.     );
  10170.     $office=$user->getOffice();
  10171.     $country=$office->getCountry();
  10172.     $isProbation=$this->isOnProbation($user,$country);
  10173.     $isProbation=($isProbation >= new \DateTime(date('Y-m-d')))?true:false;
  10174.     $ent=$em->getRepository(LeaveEntitlement::class)->findBy($arg);
  10175.     if(is_array($ent)){
  10176.       $showother=0;
  10177.       if($isProbation){$showother=-1;}
  10178.       $entbyid=array();
  10179.       $entlist=array();
  10180.       foreach($ent as $l){$entbyid['l'.$l->getId()]=$l;}
  10181.       
  10182.       foreach($ent as $l){
  10183.         $type=$l->getLeaveType();
  10184.         $typeok=$type->getIsActive();
  10185.         if(!$typeok){ continue; }
  10186.         $tid=$type->getId();
  10187.         $lyear=$l->getYear();
  10188.         if(!isset($entlist['l'.$tid])){
  10189.           $entlist['l'.$tid]=array();
  10190.           $entlist['l'.$tid]['total']=array(
  10191.             "name"=>'',
  10192.             "total"=>0,
  10193.             "left"=>0,
  10194.             "review"=>0,
  10195.             "approved"=>0
  10196.           );
  10197.         }
  10198.         if(!isset($entlist['l'.$tid]['y'.$lyear])){
  10199.           $entlist['l'.$tid]['y'.$lyear]=array();
  10200.           $entlist['l'.$tid]['y'.$lyear]['id']=$l->getId();
  10201.           $entlist['l'.$tid]['y'.$lyear]['name']=$type->getLeaveName();
  10202.           $entlist['l'.$tid]['total']['name']=$type->getLeaveName();
  10203.           $entlist['l'.$tid]['y'.$lyear]['total']=0;
  10204.           $entlist['l'.$tid]['y'.$lyear]['left']=0;
  10205.           $entlist['l'.$tid]['y'.$lyear]['approved']=0;
  10206.           $entlist['l'.$tid]['y'.$lyear]['review']=0;
  10207.         }
  10208.         $entlist['l'.$tid]['y'.$lyear]['total']+=$l->getLeaveEntitlements();
  10209.         $entlist['l'.$tid]['y'.$lyear]['left']+=$l->getLeaveLeft();
  10210.         $attr=$l->getAttributes();
  10211.         //expire
  10212.         $entlist['l'.$tid]['y'.$lyear]['expire']=$lyear.'-12-31';
  10213.         $entlist['l'.$tid]['y'.$lyear]['given']=$lyear.'-01-01';
  10214.         if(isset($attr['expires'])){$entlist['l'.$tid]['y'.$lyear]['expire']=$attr['expires'];}
  10215.         if(isset($attr['given'])){$entlist['l'.$tid]['y'.$lyear]['given']=$attr['given'];}
  10216.         $label='';
  10217.         $title='';
  10218.         if(isset($attr['label'])){$label=$attr['label'];}
  10219.         if(isset($attr['title'])){$title=$attr['title'];}
  10220.         if($title==''){$title=$label;}
  10221.         $entlist['l'.$tid]['y'.$lyear]['label']=str_replace('year',$lyear,$label);
  10222.         $entlist['l'.$tid]['y'.$lyear]['title']=str_replace('year',$lyear,$title);
  10223.         $probation=false;
  10224.         if(isset($attr['probation'])){$probation=$attr['probation'];}
  10225.         if(($isProbation) && (($probation==false) || ($type->getLeaveName()=='sick'))){
  10226.           $entlist['l'.$tid]['y'.$lyear]['given']=date('Y-m-d',strtotime('+10 days'));
  10227.           if($showother 1){$showother=-1;}
  10228.         }
  10229.         /*if(($isProbation) && (($probation==true) && ($type->getLeaveName()!='sick'))){
  10230.           $showother=1;
  10231.         }*/
  10232.         //calculate carry over
  10233.         $parent=$l->getParent();
  10234.         if(($parent!=null) && ($parent!=0)){
  10235.           if(isset($attr['followParent'])){
  10236.             if($attr['followParent']==true){
  10237.                 $ptype=$entbyid['l'.$parent]->getLeaveType();
  10238.                 $pid=$ptype->getId();
  10239.                 $pyear=$entbyid['l'.$parent]->getYear();
  10240.                 if(!isset($entlist['l'.$pid])){
  10241.                   $entlist['l'.$pid]=array();
  10242.                   $entlist['l'.$pid]['total']=array(
  10243.                     "name"=>'',
  10244.                     "total"=>0,
  10245.                     "left"=>0,
  10246.                     "review"=>0,
  10247.                     "approved"=>0
  10248.                   );
  10249.                 }
  10250.                 if(!isset($entlist['l'.$pid]['y'.$pyear])){
  10251.                   $entlist['l'.$pid]['y'.$pyear]=array();
  10252.                   $entlist['l'.$pid]['y'.$pyear]['id']=$parent;
  10253.                   $entlist['l'.$pid]['y'.$pyear]['name']=$ptype->getLeaveName();
  10254.                   $entlist['l'.$pid]['total']['name']=$ptype->getLeaveName();
  10255.                   $entlist['l'.$pid]['y'.$pyear]['total']=0;
  10256.                   $entlist['l'.$pid]['y'.$pyear]['left']=0;
  10257.                   $entlist['l'.$pid]['y'.$pyear]['approved']=0;
  10258.                   $entlist['l'.$pid]['y'.$pyear]['review']=0;
  10259.                 }
  10260.                 $ptotal=$entbyid['l'.$parent]->getLeaveEntitlements();
  10261.                 $pleft=$entbyid['l'.$parent]->getLeaveLeft();
  10262.                 $total=$l->getLeaveEntitlements();
  10263.                 $left=$l->getLeaveLeft();
  10264.                 $use=$total-$left;
  10265.                 if($pleft $total){
  10266.                   $entlist['l'.$tid]['y'.$lyear]['total']=$pleft;
  10267.                   $entlist['l'.$tid]['y'.$lyear]['left']=$pleft-$use;
  10268.                 }
  10269.                 $entlist['l'.$pid]['y'.$pyear]['left']-=$use;
  10270.             }
  10271.           }
  10272.         }  
  10273.       }
  10274.       $today=date('Ymd');
  10275.       $leavetypes=array();
  10276.       $leaveids=array();
  10277.       foreach($entlist as $kid=>$v){
  10278.         foreach($v as $kyear=>$v1){
  10279.           if($kyear!='total'){
  10280.             $name=$v1['name'];
  10281.             $exp=intval(str_replace('-','',$v1['expire']));
  10282.             $given=intval(str_replace('-','',$v1['given']));
  10283.             $ok=false;
  10284.             if(($given <= $today) && ($exp >= $today)){$ok=true;}
  10285.             if($ok){
  10286.               $leavetypes[count($leavetypes)]=intval(substr($kid,1,strlen($kid)-1));
  10287.               $leaveids['l'.$v1['id']]=intval(substr($kid,1,strlen($kid)-1));
  10288.             }else{  
  10289.               unset($entlist[$kid][$kyear]);
  10290.             }
  10291.           } 
  10292.         }  
  10293.       }
  10294.       
  10295.       foreach($entlist as $kid=>$v){
  10296.         if(count($entlist[$kid]) < 2){
  10297.           unset($entlist[$kid]);
  10298.         }
  10299.       }
  10300.       
  10301.       //get approved leave;
  10302.       
  10303.       $request $this->entityManager->getRepository(\App\Entity\LeaveRequest::class)->createQueryBuilder('a')
  10304.       ->select('a')
  10305.       ->where('a.startDate >= :from')
  10306.       ->andWhere('a.startDate <= :to')
  10307.       ->andWhere('a.leaveType in (:leavetype)')
  10308.       ->andWhere('a.user = :user')
  10309.       ->setParameter('from', new \DateTime($year '-01-01'))
  10310.       ->setParameter('to',  new \DateTime(($year+1) . '-12-31'))
  10311.       ->setParameter('user',  $user->getId())
  10312.       ->setParameter('leavetype',  $leavetypes)
  10313.       ->getQuery()
  10314.       ->getResult();
  10315.       if(is_array($request)){  
  10316.         foreach($request as $r){
  10317.           $type=$r->getLeaveType()->getId();
  10318.           $approve=false;
  10319.           $reject=false;
  10320.           if(($r->getIsApproved()===true) || ($r->getIsApproved()===1)){$approve=true;}
  10321.           if(($r->getIsApproved()===false) || ($r->getIsApproved()===0)){$approve=true;$reject=true;}
  10322.           $all=$r->getAlocation();
  10323.           if(is_array($all)){
  10324.             foreach($all as $k => $v){
  10325.                 switch ($k){
  10326.                   case 'child':
  10327.                       foreach($v as $kyr => $v1){
  10328.                         foreach($v1 as $kcid => $v2){
  10329.                           $cid=intval(substr($kcid,1,strlen($kcid)-1));
  10330.                           if(isset($leaveids['l'.$cid])){
  10331.                             $ids=$leaveids['l'.$cid];
  10332.                             $ky=substr($kyr,1,strlen($kyr)-1);
  10333.                             if(isset($entlist['l'.$ids]['y'.$ky])){
  10334.                               if($approve){
  10335.                                 if(!$reject){
  10336.                                   $entlist['l'.$ids]['y'.$ky]['approved']+=$v2;
  10337.                                 }
  10338.                               }else{
  10339.                                 $entlist['l'.$ids]['y'.$ky]['review']+=$v2;
  10340.                               }
  10341.                             }
  10342.                           }
  10343.                         }
  10344.                       }
  10345.                     break;
  10346.                   default:
  10347.                     if(substr($k,0,1)=='y'){
  10348.                       $kyear=intval(substr($k,1,strlen($k)-1));
  10349.                       if(isset($entlist['l'.$type]['y'.$kyear])){
  10350.                         if($approve){
  10351.                           if(!$reject){
  10352.                             $entlist['l'.$type]['y'.$kyear]['approved']+=$v;
  10353.                           }  
  10354.                         }else{
  10355.                           $entlist['l'.$type]['y'.$kyear]['review']+=$v;
  10356.                         }
  10357.                       }
  10358.                     }
  10359.                 }
  10360.             }
  10361.           }
  10362.         }
  10363.       }
  10364.       
  10365.         $entlist['lother']=array();
  10366.         $entlist['lother']['total']=array(
  10367.           "name"=>'other',
  10368.           "total"=>0,
  10369.           "left"=>0,
  10370.           "review"=>0,
  10371.           "approved"=>0
  10372.         );
  10373.         foreach($entlist as $kid=>$v){
  10374.           $name=$kid;
  10375.           foreach($v as $kyear=>$v1){
  10376.             $name=$v1['name'];
  10377.             if(in_array($name,$leave)){
  10378.               if($kyear!='total'){
  10379.                 $entlist[$kid]['total']['total']+=$v1['total'];
  10380.                 $entlist[$kid]['total']['left']+=$v1['left'];
  10381.                 $entlist[$kid]['total']['approved']+=$v1['approved'];
  10382.                 $entlist[$kid]['total']['review']+=$v1['review']; 
  10383.               }
  10384.             }else{
  10385.               if($kyear != 'total'){
  10386.                 if(!isset($entlist['lother'][$kyear])){
  10387.                   $entlist['lother'][$kyear]=array();
  10388.                   $entlist['lother'][$kyear]['id']=-1;
  10389.                   $entlist['lother'][$kyear]['name']='other';
  10390.                   $entlist['lother'][$kyear]['total']=0;
  10391.                   $entlist['lother'][$kyear]['left']=0;
  10392.                   $entlist['lother'][$kyear]['approved']=0;
  10393.                   $entlist['lother'][$kyear]['review']=0;
  10394.                 }
  10395.                 $entlist['lother'][$kyear]['total']+=$v1['total'];
  10396.                 $entlist['lother'][$kyear]['left']+=$v1['left'];
  10397.                 $entlist['lother'][$kyear]['approved']+=$v1['approved'];
  10398.                 $entlist['lother'][$kyear]['review']+=$v1['review'];
  10399.                 $entlist['lother']['total']['total']+=$v1['total'];
  10400.                 $entlist['lother']['total']['left']+=$v1['left'];
  10401.                 $entlist['lother']['total']['approved']+=$v1['approved'];
  10402.                 $entlist['lother']['total']['review']+=$v1['review']; 
  10403.               }
  10404.             }
  10405.           }
  10406.           if($kid!='lother'){
  10407.             if(!in_array($name,$leave)){
  10408.               unset($entlist[$kid]);
  10409.             }  
  10410.           }
  10411.         }
  10412.         if($showother 0){unset($entlist['lother']);}
  10413.     }
  10414.     $result=$entlist;
  10415.     return $result;
  10416.   }
  10417.   public function getDataLeaveEntitlements($leaveType = [], $year ''$company$office ''$userData null$leaveData = [],$probationzero=false){
  10418.     $year = empty($year) ? date('Y') : $year;
  10419.     $thisYear date('Y');
  10420.     $todayDate date('Y-m-d');
  10421.     $entitlements $this->leaveEntitlementRepository->findByPage(1999999""'ASC'""''$year$office""$userData);
  10422.     // dd($entitlements);
  10423.     $annual = [];
  10424.     $nowdate=new \DateTime($todayDate);
  10425.     foreach($entitlements as $ent){
  10426.         $typeName $ent->getLeaveType()->getAttributes()['label'];
  10427.         if($leaveType && !in_array($typeName$leaveType)) continue;
  10428.         
  10429.         $id $ent->getId();
  10430.         $user $ent->getUser();
  10431.         $userId $user->getId();
  10432.         $isUserActive $user->getIsActive();
  10433.         $userCompany $user->assignedCompany();
  10434.         $parent $ent->getParent();
  10435.         $attr=$ent->getAttributes();
  10436.         $allowprob=true;
  10437.         $country=$ent->getLeaveType()->getOffice()->getCountry();
  10438.         if($probationzero==true){
  10439.           if(isset($attr['probation'])){
  10440.             $allowprob=$attr['probation'];
  10441.             if($typeName=='Sick'){$allowprob=false;}
  10442.           }else{
  10443.             $allowprob=false;
  10444.           } 
  10445.         }
  10446.         $isprobation=$this->isOnProbation($user,$country,false);
  10447.         if($typeName == 'Annual'){
  10448.           $annual['id'] = $ent->getId();
  10449.           if($allowprob==true){
  10450.             $annual['ent'] = $ent->getLeaveEntitlements();
  10451.             $annual['left'] = $ent->getLeaveLeft();
  10452.           }else{
  10453.             $annual['ent'] = 0;
  10454.             $annual['left'] = 0;
  10455.           }
  10456.         }
  10457.         if($isUserActive && ($userCompany == $company)){
  10458.           if(!isset($leaveData['u'.$userId])){ 
  10459.               $leaveData['u'.$userId] = [];
  10460.           }
  10461.           if(!isset($leaveData['u'.$userId]['user'])){ 
  10462.               $leaveData['u'.$userId]['user'] = $user;
  10463.           }
  10464.           if(!isset($leaveData['u'.$userId]['leaves'][$typeName])){
  10465.             $given = !isset($ent->getAttributes()['given']) ? date($year.'-01-01') : $ent->getAttributes()['given'];
  10466.             $expires = !isset($ent->getAttributes()['expires']) ? date($year.'-12-31') : $ent->getAttributes()['expires'];
  10467.             if($typeName == 'Annual' && is_array($expires)) $expires date('Y-m-d'strtotime($expires['date']));
  10468.             if($typeName == 'adjustment'){
  10469.               $newTypeName $year != $thisYear $typeName.' '.$year $typeName;
  10470.               $leaveData['u'.$userId]['leaves'][$newTypeName.' '.$id] = [
  10471.                 'total' => $ent->getLeaveEntitlements(),
  10472.                 'taken' => 0,
  10473.                 'balance' => 0,
  10474.                 'upcoming' => 0,
  10475.                 'finalbalance' => $ent->getLeaveLeft(),
  10476.                 'approved' => 0,
  10477.                 'review' => 0,
  10478.                 'rejected' => 0,
  10479.                 'given' => $given,
  10480.                 'expires' => $expires
  10481.               ];
  10482.               if($todayDate >= $given && $todayDate <= $expires){
  10483.                 $leaveData['u'.$userId]['leaves'][$newTypeName.' '.$id]['mode'] = 'show';
  10484.               }else{
  10485.                   $leaveData['u'.$userId]['leaves'][$newTypeName.' '.$id]['mode'] = 'hide';
  10486.               }
  10487.             }else{
  10488.               if($typeName == 'Carry Over year'){
  10489.                 $typeName 'Carry Over';
  10490.               }
  10491.               if($year != $thisYear){
  10492.                 $newTypeName $typeName.' '.$year;
  10493.               }else{
  10494.                 $newTypeName $typeName;
  10495.               }
  10496.               $total $ent->getLeaveEntitlements();
  10497.               $finalBalance $ent->getLeaveLeft();
  10498.               if(strpos('Carry Over'$typeName) !== false) {
  10499.                 if($parent == $annual['id']){
  10500.                   if($annual['left'] < $ent->getLeaveEntitlements()){
  10501.                     $total $annual['left'];
  10502.                     $finalBalance $ent->getLeaveLeft() - ($ent->getLeaveEntitlements() - $annual['left']);
  10503.                   }
  10504.                 }
  10505.               }
  10506.               if($allowprob==false){
  10507.                 $isprobation=$this->isOnProbation($user,$country,false);
  10508.                 if($isprobation >= $nowdate){
  10509.                   $total=0;
  10510.                   $finalBalance=0;
  10511.                 }
  10512.               }
  10513.               $leaveData['u'.$userId]['leaves'][$newTypeName] = [
  10514.                 'total' => $total,
  10515.                 'taken' => 0,
  10516.                 'balance' => 0,
  10517.                 'upcoming' => 0,
  10518.                 'finalbalance' => $finalBalance,
  10519.                 'approved' => 0,
  10520.                 'review' => 0,
  10521.                 'rejected' => 0,
  10522.                 'given' => $given,
  10523.                 'expires' => $expires
  10524.               ];
  10525.               if($todayDate >= $given && $todayDate <= $expires){
  10526.                 $leaveData['u'.$userId]['leaves'][$newTypeName]['mode'] = 'show';
  10527.               }else{
  10528.                   if($typeName == 'Carry Over' && (intval($year) == intval($thisYear 1))){
  10529.                     $leaveData['u'.$userId]['leaves'][$newTypeName]['mode'] = 'show';
  10530.                   }else{
  10531.                     $leaveData['u'.$userId]['leaves'][$newTypeName]['mode'] = 'hide';
  10532.                   }
  10533.               }
  10534.             }
  10535.           }  
  10536.         }
  10537.     }
  10538.     return $leaveData;
  10539.   }
  10540.   public function getDataleaveRequests($leaveType = [], $company$office$start$end$userData null$leaveData = [], $isUpcoming false){
  10541.     $thisYear date('Y');
  10542.     $todayDate date('Y-m-d');
  10543.     $year date('Y'strtotime($start));
  10544.     $prevYear strval($year 1);
  10545.     $requests $this->leaveRequestRepository->findByPage(1999"",'ASC'""""""""$office$start$end$userData);
  10546.     foreach($requests as $request){
  10547.       $typeName $request->getLeaveType()->getAttributes()['label'];
  10548.       if($leaveType && !in_array($typeName$leaveType)) continue;
  10549.       $user $request->getUser();
  10550.       $userId $request->getUser()->getId();
  10551.       $country $user->getOffice()->getCountry(); 
  10552.       // $typeName = $requestPrev->getLeaveType()->getLeaveName().$prevYear;
  10553.       $isUserActive $user->getIsActive();
  10554.       $userCompany $user->assignedCompany();
  10555.       $requestStartDate $request->getStartDate()->format('Y-m-d');
  10556.       $requestEndDate $request->getEndDate()->format('Y-m-d');
  10557.       $status $request->getIsApproved() == null 'review' : ($request->getIsApproved() ? 'approved' 'review');
  10558.       // dd($request);
  10559.       $newTypeName $year != $thisYear $typeName.' '.$year $typeName;
  10560.       $yearText $year != $thisYear ' '.$year '';
  10561.       if($isUserActive && ($userCompany == $company)){
  10562.         if(!isset($leaveData['u'.$userId])){ 
  10563.             $leaveData['u'.$userId] = [];
  10564.         }
  10565.         if(!isset($leaveData['u'.$userId]['user'])){ 
  10566.             $leaveData['u'.$userId]['user'] = $user;
  10567.         }
  10568.         if(!isset($leaveData['u'.$userId]['leaves'][$newTypeName])){
  10569.             $leaveData['u'.$userId]['leaves'][$newTypeName][$isUpcoming 'upcoming' 'taken'] = 0;
  10570.             $leaveData['u'.$userId]['leaves'][$newTypeName][$status]=0;
  10571.         }
  10572.         if($typeName == 'Annual' && !isset($leaveData['u'.$userId]['leaves']['Carry Over'.$yearText])){
  10573.           $leaveData['u'.$userId]['leaves']['Carry Over'.$yearText][$isUpcoming 'upcoming' 'taken'] = 0;
  10574.             if($end date($year.'-03-31')){
  10575.               $leaveData['u'.$userId]['leaves']['Carry Over'.$yearText]['mode'] = 'hide';
  10576.             }else{
  10577.               $leaveData['u'.$userId]['leaves']['Carry Over'.$yearText]['mode'] = 'show';
  10578.             }
  10579.         }
  10580.         if(isset($request->getAlocation()['child']['y'.$year])){
  10581.           foreach($request->getAlocation()['child']['y'.$year] as $key => $value){
  10582.             if($request->getAlocation()['type'][$key] == 'anniversary'){
  10583.               // if($end < $requestEndDate && date('Y', strtotime($requestEndDate)) == date('Y', strtotime($end))){
  10584.               if($end $requestEndDate){
  10585.                 if(isset($request->getAlocation()['data']['y'.$year]['child'][$key])){
  10586.                   $dataBonus $request->getAlocation()['data']['y'.$year]['child'][$key];
  10587.                   $bonusDays 0;
  10588.                   foreach($dataBonus as $attr => $value){
  10589.                       $alocDate substr($attr1);
  10590.                       $alocDateFormat date('Y-m-d'strtotime($alocDate));
  10591.                       // if($alocDateFormat >= $end && $alocDateFormat <= $requestEndDate){
  10592.                       //     $bonusDays += $value;
  10593.                       // }
  10594.                       if($alocDateFormat <= $end){
  10595.                         $bonusDays += $value;
  10596.                       }
  10597.                   }
  10598.                   if(array_key_exists('Bonus'.$yearText$leaveData['u'.$userId]['leaves'])){
  10599.                     $leaveData['u'.$userId]['leaves']['Bonus'.$yearText][$isUpcoming 'upcoming' 'taken'] += $bonusDays;
  10600.                     $leaveData['u'.$userId]['leaves']['Bonus'.$yearText][$status] += $bonusDays;
  10601.                   }
  10602.                 }
  10603.               }else{
  10604.                 if(array_key_exists('Bonus'.$yearText$leaveData['u'.$userId]['leaves'])){
  10605.                   $leaveData['u'.$userId]['leaves']['Bonus'.$yearText][$isUpcoming 'upcoming' 'taken'] += $value;
  10606.                   $leaveData['u'.$userId]['leaves']['Bonus'.$yearText][$status] += $value;
  10607.                 }
  10608.               }
  10609.               if($requestStartDate $start){
  10610.                 if(isset($request->getAlocation()['data']['y'.$year]['child'][$key])){
  10611.                   $dataBonus $request->getAlocation()['data']['y'.$year]['child'][$key];
  10612.                   $bonusDays 0;
  10613.                   foreach($dataBonus as $attr => $value){
  10614.                       $alocDate substr($attr1);
  10615.                       $alocDateFormat date('Y-m-d'strtotime($alocDate));
  10616.                       if($alocDateFormat <= $start){
  10617.                           $bonusDays += $value;
  10618.                       }
  10619.                   }
  10620.                   if(array_key_exists('Bonus'.$yearText$leaveData['u'.$userId]['leaves'])){
  10621.                     $leaveData['u'.$userId]['leaves']['Bonus'.$yearText][$isUpcoming 'upcoming' 'taken'] -= $bonusDays;
  10622.                     $leaveData['u'.$userId]['leaves']['Bonus'.$yearText][$status] -= $bonusDays;
  10623.                   }
  10624.                 }
  10625.               }
  10626.             }elseif ($request->getAlocation()['type'][$key] == 'adjustment'){
  10627.               $newKey substr($key1);
  10628.               if($end $requestEndDate){
  10629.                 if(isset($request->getAlocation()['data']['y'.$year]['child'][$key])){
  10630.                     $dataAdj $request->getAlocation()['data']['y'.$year]['child'][$key];
  10631.                     $adjDays 0;
  10632.                     foreach($dataAdj as $attr => $value){
  10633.                         $alocDate substr($attr1);
  10634.                         $alocDateFormat date('Y-m-d'strtotime($alocDate));
  10635.                         // if($alocDateFormat >= $end && $alocDateFormat <= $requestEndDate){
  10636.                         //     $adjDays += $value;
  10637.                         // }
  10638.                         if($alocDateFormat <= $end){
  10639.                           $adjDays += $value;
  10640.                         }
  10641.                     }
  10642.                     if(array_key_exists('adjustment '.$newKey.$yearText$leaveData['u'.$userId]['leaves'])){
  10643.                       $leaveData['u'.$userId]['leaves']['adjustment '.$newKey.$yearText][$isUpcoming 'upcoming' 'taken'] += $adjDays;
  10644.                       $leaveData['u'.$userId]['leaves']['adjustment '.$newKey.$yearText][$status] += $adjDays;
  10645.                     }
  10646.                 }
  10647.               }else{
  10648.                 if(array_key_exists('adjustment '.$newKey.$yearText$leaveData['u'.$userId]['leaves'])){
  10649.                   $leaveData['u'.$userId]['leaves']['adjustment '.$newKey.$yearText][$isUpcoming 'upcoming' 'taken'] += $value;
  10650.                   $leaveData['u'.$userId]['leaves']['adjustment '.$newKey.$yearText][$status] += $value;
  10651.                 }
  10652.               }
  10653.               if($requestStartDate $start){
  10654.                 if(isset($request->getAlocation()['data']['y'.$year]['child'][$key])){
  10655.                   $dataAdj $request->getAlocation()['data']['y'.$year]['child'][$key];
  10656.                   $adjDays 0;
  10657.                   foreach($dataAdj as $attr => $value){
  10658.                       $alocDate substr($attr1);
  10659.                       $alocDateFormat date('Y-m-d'strtotime($alocDate));
  10660.                       if($alocDateFormat <= $start){
  10661.                           $adjDays += $value;
  10662.                       }
  10663.                   }
  10664.                   if(array_key_exists('adjustment '.$newKey.$yearText$leaveData['u'.$userId]['leaves'])){
  10665.                     $leaveData['u'.$userId]['leaves']['adjustment '.$newKey.$yearText][$isUpcoming 'upcoming' 'taken'] -= $adjDays;
  10666.                     $leaveData['u'.$userId]['leaves']['adjustment '.$newKey.$yearText][$status] -= $adjDays;
  10667.                   }
  10668.                 }
  10669.               }
  10670.             }
  10671.           }
  10672.         }
  10673.         // get bonus prev year and carry over
  10674.         if(isset($request->getAlocation()['child']['y'.$prevYear])){
  10675.           foreach($request->getAlocation()['child']['y'.$prevYear] as $key => $value){
  10676.             if($request->getAlocation()['type'][$key] == 'anniversary'){
  10677.               if($end $requestEndDate){
  10678.                 if(isset($request->getAlocation()['data']['y'.$prevYear]['child'][$key])){
  10679.                   $dataBonus $request->getAlocation()['data']['y'.$prevYear]['child'][$key];
  10680.                   $bonusDays 0;
  10681.                   foreach($dataBonus as $attr => $value){
  10682.                       $alocDate substr($attr1);
  10683.                       $alocDateFormat date('Y-m-d'strtotime($alocDate));
  10684.                       // if($alocDateFormat >= $end && $alocDateFormat <= $requestEndDate){
  10685.                       //     $bonusDays += $value;
  10686.                       // }
  10687.                       if($alocDateFormat <= $end){
  10688.                         $bonusDays += $value;
  10689.                       }
  10690.                   }
  10691.                   if(array_key_exists('Bonus '.$prevYear$leaveData['u'.$userId]['leaves'])){
  10692.                     $leaveData['u'.$userId]['leaves']['Bonus '.$prevYear]['taken'] += $bonusDays;
  10693.                     $leaveData['u'.$userId]['leaves']['Bonus '.$prevYear][$status] += $bonusDays;
  10694.                   }
  10695.                 }
  10696.               }else{
  10697.                 if(array_key_exists('Bonus '.$prevYear$leaveData['u'.$userId]['leaves'])){
  10698.                   $leaveData['u'.$userId]['leaves']['Bonus '.$prevYear]['taken'] += $value;
  10699.                   $leaveData['u'.$userId]['leaves']['Bonus '.$prevYear][$status] += $value;
  10700.                 }
  10701.               }
  10702.               if($requestStartDate $start){
  10703.                 if(isset($request->getAlocation()['data']['y'.$prevYear]['child'][$key])){
  10704.                   $dataBonus $request->getAlocation()['data']['y'.$prevYear]['child'][$key];
  10705.                   $bonusDays 0;
  10706.                   foreach($dataBonus as $attr => $value){
  10707.                       $alocDate substr($attr1);
  10708.                       $alocDateFormat date('Y-m-d'strtotime($alocDate));
  10709.                       if($alocDateFormat <= $start){
  10710.                           $bonusDays += $value;
  10711.                       }
  10712.                   }
  10713.                   if(array_key_exists('Bonus '.$prevYear$leaveData['u'.$userId]['leaves'])){
  10714.                     $leaveData['u'.$userId]['leaves']['Bonus '.$prevYear]['taken'] -= $bonusDays;
  10715.                     $leaveData['u'.$userId]['leaves']['Bonus '.$prevYear][$status] -= $bonusDays;
  10716.                   }
  10717.                 }
  10718.               }
  10719.             }
  10720.             elseif($request->getAlocation()['type'][$key] == 'carryover'){
  10721.               if($end $requestEndDate){
  10722.                 if(isset($request->getAlocation()['data']['y'.$prevYear]['child'][$key])){
  10723.                   $dataBonus $request->getAlocation()['data']['y'.$prevYear]['child'][$key];
  10724.                   $carryDays 0;
  10725.                   foreach($dataBonus as $attr => $value){
  10726.                       $alocDate substr($attr1);
  10727.                       $alocDateFormat date('Y-m-d'strtotime($alocDate));
  10728.                       // if($alocDateFormat >= $end && $alocDateFormat <= $requestEndDate){
  10729.                       //     $bonusDays += $value;
  10730.                       // }
  10731.                       if($alocDateFormat <= $end){
  10732.                         $carryDays += $value;
  10733.                       }
  10734.                   }
  10735.                   if(array_key_exists('Carry Over '.$prevYear$leaveData['u'.$userId]['leaves'])){
  10736.                     $leaveData['u'.$userId]['leaves']['Carry Over '.$prevYear]['taken'] += $carryDays;
  10737.                     $leaveData['u'.$userId]['leaves']['Carry Over '.$prevYear][$status] += $carryDays;
  10738.                   }
  10739.                 }
  10740.               }else{
  10741.                 if(array_key_exists('Carry Over '.$prevYear$leaveData['u'.$userId]['leaves'])){
  10742.                   $leaveData['u'.$userId]['leaves']['Carry Over '.$prevYear]['taken'] += $value;
  10743.                   $leaveData['u'.$userId]['leaves']['Carry Over '.$prevYear][$status] += $value;
  10744.                 }
  10745.               }
  10746.               if($requestStartDate $start){
  10747.                 if(isset($request->getAlocation()['data']['y'.$prevYear]['child'][$key])){
  10748.                   $dataBonus $request->getAlocation()['data']['y'.$prevYear]['child'][$key];
  10749.                   $carryDays 0;
  10750.                   foreach($dataBonus as $attr => $value){
  10751.                       $alocDate substr($attr1);
  10752.                       $alocDateFormat date('Y-m-d'strtotime($alocDate));
  10753.                       if($alocDateFormat <= $start){
  10754.                           $carryDays += $value;
  10755.                       }
  10756.                   }
  10757.                   if(array_key_exists('Carry Over '.$prevYear$leaveData['u'.$userId]['leaves'])){
  10758.                     $leaveData['u'.$userId]['leaves']['Carry Over '.$prevYear]['taken'] -= $carryDays;
  10759.                     $leaveData['u'.$userId]['leaves']['Carry Over '.$prevYear][$status] -= $carryDays;
  10760.                   }
  10761.                 }
  10762.               }
  10763.             }
  10764.             /*
  10765.             elseif ($request->getAlocation()['type'][$key] == 'adjustment'){
  10766.               $newKey = substr($key, 1);
  10767.               if($end < $requestEndDate){
  10768.                 if(isset($request->getAlocation()['data']['y'.$prevYear]['child'][$key])){
  10769.                     $dataAdj = $request->getAlocation()['data']['y'.$prevYear]['child'][$key];
  10770.                     $adjDays = 0;
  10771.                     foreach($dataAdj as $attr => $value){
  10772.                         $alocDate = substr($attr, 1);
  10773.                         $alocDateFormat = date('Y-m-d', strtotime($alocDate));
  10774.                         if($alocDateFormat >= $end && $alocDateFormat <= $requestEndDate){
  10775.                             $adjDays += $value;
  10776.                         }
  10777.                     }
  10778.                     if(array_key_exists('adjustment '.$newKey.' '.$prevYear, $leaveData['u'.$userId]['leaves'])){
  10779.                       $leaveData['u'.$userId]['leaves']['adjustment '.$newKey.' '.$prevYear][$isUpcoming ? 'upcoming' : 'taken'] += $adjDays;
  10780.                     }
  10781.                 }
  10782.               }else{
  10783.                 if(array_key_exists('adjustment '.$newKey.' '.$prevYear, $leaveData['u'.$userId]['leaves'])){
  10784.                   $leaveData['u'.$userId]['leaves']['adjustment '.$newKey.' '.$prevYear][$isUpcoming ? 'upcoming' : 'taken'] += $value;
  10785.                 }
  10786.               }
  10787.             }
  10788.             */
  10789.           }
  10790.         }
  10791.         if($end $requestEndDate){
  10792.           $resultDays 0;
  10793.           if (isset($request->getAlocation()['data']['y'.$year])){
  10794.               foreach($request->getAlocation()['data']['y'.$year] as $key => $value){
  10795.                   if($key == 'child') continue;
  10796.                   $alocDate substr($key1);
  10797.                   $alocDateFormat date('Y-m-d'strtotime($alocDate));
  10798.                   // if($alocDateFormat >= $end && $alocDateFormat <= $requestEndDate){
  10799.                   //     $resultDays += $value;
  10800.                   // }
  10801.                   if($alocDateFormat <= $end){
  10802.                       $resultDays += $value;
  10803.                   }
  10804.               }
  10805.               if(array_key_exists($newTypeName$leaveData['u'.$userId]['leaves'])){
  10806.                 $leaveData['u'.$userId]['leaves'][$newTypeName][$isUpcoming 'upcoming' 'taken'] += $resultDays;
  10807.                 $leaveData['u'.$userId]['leaves'][$newTypeName][$status] += $resultDays;
  10808.               }
  10809.           }elseif(isset($request->getAlocation()['y'.$year])){
  10810.               $days $request->getAlocation()['y'.$year];
  10811.               $bankHolidays $this->bankHolidayService->getHoliday($end$requestEndDate$country);
  10812.               $diff $this->dateDiffWithoutWeekendsAndHolidays($end$requestEndDate$bankHolidays);
  10813.               $result $days $diff;
  10814.               if(array_key_exists($newTypeName$leaveData['u'.$userId]['leaves'])){
  10815.                 $leaveData['u'.$userId]['leaves'][$newTypeName][$isUpcoming 'upcoming' 'taken'] += $result;
  10816.                 $leaveData['u'.$userId]['leaves'][$newTypeName][$status] += $result;
  10817.               }
  10818.           }else{
  10819.               if(array_key_exists($newTypeName$leaveData['u'.$userId]['leaves'])){
  10820.                 $leaveData['u'.$userId]['leaves'][$newTypeName][$isUpcoming 'upcoming' 'taken'] += $resultDays;
  10821.                 $leaveData['u'.$userId]['leaves'][$newTypeName][$status] += $resultDays;
  10822.               }
  10823.           }
  10824.           /*
  10825.           $daysCarryOver = !isset($request->getAlocation()['y'.$prevYear]) ? 0 : $request->getAlocation()['y'.$prevYear];
  10826.           
  10827.           if($daysCarryOver){
  10828.               $bankHolidays = $this->bankHolidayService->getHoliday($end, $requestEndDate, $country);
  10829.               $diff = $this->dateDiffWithoutWeekendsAndHolidays($end, $requestEndDate, $bankHolidays);
  10830.               $resultCarryOver = $daysCarryOver - $diff;
  10831.               if(array_key_exists('Carry Over'.$yearText, $leaveData['u'.$userId]['leaves'])){
  10832.                   $leaveData['u'.$userId]['leaves']['Carry Over'.$yearText][$isUpcoming ? 'upcoming' : 'taken'] += $resultCarryOver;
  10833.               }
  10834.           }else{
  10835.               if(array_key_exists('Carry Over'.$yearText, $leaveData['u'.$userId]['leaves'])){
  10836.                   $leaveData['u'.$userId]['leaves']['Carry Over'.$yearText][$isUpcoming ? 'upcoming' : 'taken'] += 0;
  10837.               }
  10838.           }
  10839.           */
  10840.         }
  10841.         else{
  10842.           $leaveData['u'.$userId]['leaves'][$newTypeName][$isUpcoming 'upcoming' 'taken'] += !isset($request->getAlocation()['y'.$year]) ? $request->getAlocation()['y'.$year];
  10843.           $leaveData['u'.$userId]['leaves'][$newTypeName][$status] += !isset($request->getAlocation()['y'.$year]) ? $request->getAlocation()['y'.$year];
  10844.           
  10845.           /*
  10846.           if(isset($leaveData['u'.$userId]['leaves']['Carry Over'.$yearText][$isUpcoming ? 'upcoming' : 'taken'])){
  10847.               $leaveData['u'.$userId]['leaves']['Carry Over'.$yearText][$isUpcoming ? 'upcoming' : 'taken'] += !isset($request->getAlocation()['y'.$prevYear]) ? 0 : $request->getAlocation()['y'.$prevYear];
  10848.           }
  10849.           */
  10850.         }
  10851.         if($requestStartDate $start){
  10852.           $resultDays 0;
  10853.           if (isset($request->getAlocation()['data']['y'.$year])){
  10854.               foreach($request->getAlocation()['data']['y'.$year] as $key => $value){
  10855.                   if($key == 'child') continue;
  10856.                   $alocDate substr($key1);
  10857.                   $alocDateFormat date('Y-m-d'strtotime($alocDate));
  10858.                   if($alocDateFormat <= $start){
  10859.                       $resultDays += $value;
  10860.                   }
  10861.               }
  10862.               if(array_key_exists($newTypeName$leaveData['u'.$userId]['leaves'])){
  10863.                 $leaveData['u'.$userId]['leaves'][$newTypeName][$isUpcoming 'upcoming' 'taken'] -= $resultDays;
  10864.                 $leaveData['u'.$userId]['leaves'][$newTypeName][$status] -= $resultDays;
  10865.               }
  10866.           }elseif(isset($request->getAlocation()['y'.$year])){
  10867.               $days $request->getAlocation()['y'.$year];
  10868.               $bankHolidays $this->bankHolidayService->getHoliday($end$requestEndDate$country);
  10869.               $diff $this->dateDiffWithoutWeekendsAndHolidays($requestStartDate$start$bankHolidays);
  10870.               $result $days $diff;
  10871.               if(array_key_exists($newTypeName$leaveData['u'.$userId]['leaves'])){
  10872.                 $leaveData['u'.$userId]['leaves'][$newTypeName][$isUpcoming 'upcoming' 'taken'] -= $result;
  10873.                 $leaveData['u'.$userId]['leaves'][$newTypeName][$status] -= $result;
  10874.               }
  10875.           }else{
  10876.               if(array_key_exists($newTypeName$leaveData['u'.$userId]['leaves'])){
  10877.                 $leaveData['u'.$userId]['leaves'][$newTypeName][$isUpcoming 'upcoming' 'taken'] -= $resultDays;
  10878.                 $leaveData['u'.$userId]['leaves'][$newTypeName][$status] -= $resultDays;
  10879.               }
  10880.           }
  10881.         }
  10882.       } 
  10883.     }
  10884.     return $leaveData;
  10885.   }
  10886.   public function listLeaveEntitlement($option=array()){
  10887.     $default=array(
  10888.       'user'=>null,
  10889.       'office'=>'',
  10890.       'manager'=>'',
  10891.       'leaveType'=>'',
  10892.       'page'=>1,
  10893.       'limit'=>20,
  10894.       'keyword'=>'',
  10895.       'order'=>'',
  10896.       'orderBy'=>'',
  10897.       'year'=>'',
  10898.       'department'=>'',
  10899.       'byoffice'=>false,
  10900.       'viewdate'=>date('Y-m-d')
  10901.     );
  10902.     $opt=$default;
  10903.     $em $this->entityManager;
  10904.     foreach($option as $k=>$v){$opt[$k]=$v;}
  10905.     $y=new \DateTime($opt['viewdate']);
  10906.     if($opt['year']==''){
  10907.       $opt['year']=$y->format('Y');
  10908.     }else{
  10909.       if($y->format('Y') > $opt['year']){
  10910.         $opt['viewdate']=$opt['year'].'-12-31';
  10911.       }
  10912.     }
  10913.     $firstdate=new \DateTime($opt['year'].'-01-01');
  10914.     $lastdate=new \DateTime($opt['viewdate']);
  10915.     
  10916.     $years=array($opt['year']-1,$opt['year']);
  10917.     $arg=array(
  10918.       'year'=>$years,
  10919.       'isActive'=>1,
  10920.     );
  10921.     if(!is_null($opt['user'])){$arg['user']=$opt['user'];}
  10922.     $ent=array();
  10923.     $entbyid=array();
  10924.     $adjustments=array();
  10925.     $parentdata=array();
  10926.     $leaveEntitlement=$em->getRepository(LeaveEntitlement::class)->findBy($arg);
  10927.     $datenow=new \DateTime(date('Y-m-d'));
  10928.     $entlist=array();
  10929.     $dumptotal=array();
  10930.     if(is_array($leaveEntitlement)){
  10931.       foreach($leaveEntitlement as $l){
  10932.         $entbyid['l'.$l->getId()]=$l;
  10933.       }  
  10934.       foreach($leaveEntitlement as $l){
  10935.         $currentUser=$l->getUser();
  10936.         $uid=$currentUser->getId();
  10937.         $currentLeaveType=$l->getLeaveType();
  10938.         $currentCountry=$currentLeaveType->getOffice()->getCountry();
  10939.         if($currentUser->getIsActive()){
  10940.           if(!isset($adjustments['u'.$uid])){
  10941.             $adjustments['u'.$uid]=array();
  10942.             $adjustments['u'.$uid]['total']=0;
  10943.             $adjustments['u'.$uid]['taken']=0;
  10944.             $adjustments['u'.$uid]['left']=0;
  10945.           }
  10946.           //get exipred
  10947.           $attr=$l->getAttributes();
  10948.           $yr=$l->getYear();
  10949.           $given=$yr.'-01-01';
  10950.           if(isset($attr['given'])){
  10951.             $given=$attr['given'];
  10952.             if(is_array($attr['given'])){$given=$attr['given']['date'];}
  10953.           }
  10954.           
  10955.           $exp=$yr.'-12-31';
  10956.           if(isset($attr['expires'])){
  10957.             $exp=$attr['expires'];
  10958.             if(is_array($attr['expires'])){$exp=$attr['expires']['date'];}
  10959.           }
  10960.           if ($currentUser->getPersonalInfo()->getJobStatus() == 'form.job_status.permanent'){
  10961.             if($l->getLeaveType()->getLeaveName()=='annual'){
  10962.               $jobokdate=$currentUser->getPersonalInfo()->getJobPermanentDate();
  10963.               $gv=new \DateTime($given);
  10964.               $jbok=new \DateTime($jobokdate->format('Y-m-d'));
  10965.               if($gv $jobokdate){
  10966.                 $given=$jobokdate->format('Y-m-d');
  10967.                 $attr['given']=$given;
  10968.                 $l->setAttributes($attr);
  10969.                 $em->persist($l);
  10970.                 $em->flush();
  10971.               }
  10972.             }  
  10973.           }  
  10974.           $given=new \DateTime($given);
  10975.           $exp=new \DateTime($exp);
  10976.           $ok=false;
  10977.           if(($given <= $firstdate) && ($exp >= $firstdate)){$ok=true;}
  10978.           if(($exp >= $lastdate) && ($given <= $lastdate)){$ok=true;}
  10979.           if(($given >= $firstdate) && ($exp <= $lastdate)){$ok=true;}
  10980.           if(($given <= $firstdate) && ($exp >= $lastdate)){$ok=true;}
  10981.           if($given $exp){$ok=false;}
  10982.           //if not expired
  10983.           if($ok){
  10984.             /*if($currentLeaveType->getLeaveName()=='adjustment'){
  10985.               //$adjustments['u'.$uid]['total']+=$l->getLeaveEntitlements();
  10986.               //$adjustments['u'.$uid]['left']+=$l->getLeaveLeft();
  10987.               $adjpid=$l->getParent();
  10988.               if(!in_array($adjpid,$entlist)){
  10989.                 if($l->getYear()==$opt['year']){
  10990.                   $isprobation=$this->isOnProbation($currentUser,$currentCountry,false);
  10991.                   $e=clone $entbyid['l'.$adjpid];
  10992.                   if($isprobation < $datenow){
  10993.                   }else{
  10994.                     $e->setLeaveEntitlements(0);
  10995.                     $e->setLeaveLeft(0);
  10996.                   }
  10997.                   $ent[count($ent)]=$e;
  10998.                   if($adjustments['u'.$uid]['total'] > 0){
  10999.                     $dumptotal['l'.$adjpid]=$adjustments['u'.$uid]['total'];
  11000.                   }
  11001.                 }  
  11002.               }
  11003.             }else{*/
  11004.               $isprobation=$this->isOnProbation($currentUser,$currentCountry,false);
  11005.               if($currentLeaveType->getLeaveName()=='adjustment'){
  11006.                 $isprobation=new \DateTime($datenow->format('Y-m-d'));
  11007.                 $isprobation->modify('-1 day');
  11008.               }
  11009.               if($isprobation $datenow){
  11010.                 if($currentLeaveType->getLeaveName()=='anniversary'){
  11011.                   if($exp >= $lastdate){
  11012.                     $e=clone $l;
  11013.                     $ent[count($ent)]=$e;
  11014.                     $entlist[count($entlist)]=$e->getId();
  11015.                   }
  11016.                 }else{  
  11017.                   $e=clone $l;
  11018.                   $ent[count($ent)]=$e;
  11019.                   $entlist[count($entlist)]=$e->getId();
  11020.                 }
  11021.               }else{
  11022.                 $e=clone $l;
  11023.                 $e->setLeaveEntitlements(0);
  11024.                 $e->setLeaveLeft(0);
  11025.                 $ent[count($ent)]=$e;
  11026.                 $entlist[count($entlist)]=$e->getId();
  11027.               }  
  11028.             //}
  11029.           }
  11030.           if(isset($attr['followParent'])){
  11031.             if($attr['followParent']){
  11032.                 $pid=$l->getParent();
  11033.                 if(!is_null($pid)){
  11034.                   $parentdata['p'.$pid]=array();
  11035.                   $parentdata['p'.$pid]['child']=array();
  11036.                 }
  11037.                 $totalchild=count($parentdata['p'.$pid]['child']);
  11038.                 $parentdata['p'.$pid]['child'][$totalchild]=$l->getLeaveEntitlements() - $l->getLeaveLeft();
  11039.             }
  11040.           }       
  11041.           
  11042.         }  
  11043.       }
  11044.       foreach($leaveEntitlement as $l){
  11045.         $pid=$l->getId();
  11046.         $currentUser=$l->getUser();
  11047.         $currentLeaveType=$l->getLeaveType();
  11048.         $currentCountry=$currentLeaveType->getOffice()->getCountry();
  11049.         if(isset($parentdata['p'.$pid])){
  11050.           $isprobation=$this->isOnProbation($currentUser,$currentCountry,false);
  11051.           if($isprobation $datenow){
  11052.             $parentdata['p'.$pid]['left']=$l->getLeaveLeft();
  11053.           }else{
  11054.             $parentdata['p'.$pid]['left']=0;
  11055.           }  
  11056.           foreach($parentdata['p'.$pid]['child'] as $vpd){
  11057.             $parentdata['p'.$pid]['left']-=$vpd;
  11058.           }
  11059.         }
  11060.       }
  11061.     }
  11062.     // claculate leave left and total
  11063.     $final=array();
  11064.     $dummy=array();
  11065.     foreach($ent as $l){
  11066.       $typeactive=$l->getLeaveType()->getIsActive();
  11067.       if($typeactive){
  11068.         
  11069.         $detect=0;
  11070.         $find=0;
  11071.         $currentUser=$l->getUser();
  11072.         $name=$currentUser->getPersonalInfo()->getFullName();
  11073.         $name=strtolower($name);
  11074.         if(($opt['keyword']!='') || ($opt['office']!='') || ($opt['manager']!='') || ($opt['department']!='')){
  11075.           if($opt['keyword']!=''){
  11076.             $detect++;
  11077.             $opt['keyword']=strtolower($opt['keyword']);
  11078.             if(strpos($name,$opt['keyword'])!==false){
  11079.               $find++;
  11080.             }  
  11081.           }
  11082.           
  11083.           if($opt['office']!=''){
  11084.             $detect++;
  11085.             $oid=$currentUser->getOffice()->getId();
  11086.             $nooffice='';
  11087.             if(is_object($opt['office'])){$nooffice=$opt['office']->getId();}else{$nooffice=$opt['office'];}
  11088.             if($oid==$nooffice){$find++;}
  11089.           }
  11090.           if($opt['department']!=''){
  11091.             $detect++;
  11092.             $oid=$currentUser->getDepartment()->getId();
  11093.             $nodept='';
  11094.             if(is_object($opt['department'])){$nodept=$opt['department']->getId();}else{$nodept=$opt['department'];}
  11095.             if($oid==$nodept){$find++;}
  11096.           }
  11097.           if($opt['manager']!=''){
  11098.             $detect++;
  11099.             $nmo=$currentUser->getAllManager();
  11100.             foreach($nmo as $m){
  11101.               if($m->getId()==$opt['manager']){$find++;}
  11102.             }
  11103.             if($opt['manager']==$currentUser->getId()){$find++;}
  11104.           }
  11105.         }
  11106.         $dummy[]=$opt;
  11107.         if($find>=$detect){
  11108.           $attr=$l->getAttributes();
  11109.           $label=str_replace('+year',$l->getYear(),$attr['label']);
  11110.           $label=str_replace('year',$l->getYear(),$attr['label']);
  11111.           $attr['label']=$label;
  11112.           $l->setAttributes($attr);
  11113.           if(isset($attr['followParent'])){
  11114.             if($attr['followParent']){
  11115.               $pid=$l->getParent();
  11116.               $parentleft=$entbyid['l'.$pid]->getLeaveLeft();
  11117.               $leavetotal=$l->getLeaveEntitlements();
  11118.               $leaveleft=$l->getLeaveLeft();
  11119.               $use=$leavetotal-$leaveleft;
  11120.               if($parentleft $leavetotal){
  11121.                 $leaveleft=$parentleft-$use;
  11122.                 $l->setLeaveEntitlements($parentleft);
  11123.                 $l->setLeaveLeft($leaveleft);
  11124.               }  
  11125.             }
  11126.           }
  11127.           if($l->getLeaveEntitlements()==0){
  11128.             if(isset($dumptotal['l'.$l->getId()])){
  11129.               array_push($final, array('data'=>clone $l,'sort'=>$name));
  11130.             }
  11131.           }else{
  11132.             array_push($final, array('data'=>clone $l,'sort'=>$name));
  11133.           }
  11134.         }
  11135.       }  
  11136.     }
  11137.     //filter
  11138.     
  11139.     foreach($final as $k=>$v){
  11140.       $pid=$v['data']->getId();
  11141.       if(isset($parentdata['p'.$pid])){
  11142.         $final[$k]['data']->setLeaveLeft($parentdata['p'.$pid]['left']);
  11143.       }
  11144.     }
  11145.     usort($final,function($a,$b){
  11146.         if($a['sort'] > $b['sort']){return 1;}
  11147.         return 0;
  11148.     });
  11149.     $c=count($final);
  11150.    return array(
  11151.      'data'=> array_slice($final,($opt['page']-1)*$opt['limit'],$opt['limit']),
  11152.      'adjustment'=>$adjustments,
  11153.      'total'=>$c,
  11154.      'dummy'=>$dummy
  11155.    );
  11156.   }
  11157.   function _count_leave_data($leaveent,$startdate,$enddate,$leavetype,$back=array(),$days=0){
  11158.     $leavedata=array();
  11159.     $tmpleave=array();
  11160.     $entbyid=array();
  11161.     if(is_array($leaveent)){
  11162.       foreach($leaveent as $l){
  11163.         $entbyid['l'.$l->getId()]=$l;
  11164.       }
  11165.       foreach($leaveent as $l){
  11166.         $attr=$l->getAttributes();
  11167.         $attr1=$l->getAttributes();
  11168.         if(!isset($attr['expires'])){$attr['expires']=$l->getYear().'-12-31';}
  11169.         if(!isset($attr['given'])){$attr['given']=$l->getYear().'-01-01';}
  11170.         $exp=new \DateTime($attr['expires']);
  11171.         $given=new \DateTime($attr['given']);  
  11172.         $left=$l->getLeaveLeft();
  11173.         $day=$days;
  11174.         if($days $left){$day=$left;}
  11175.         
  11176.         $ld=count($leavedata);
  11177.         $tmpleave['l'.$l->getId()]=$ld;
  11178.         $leavedata[$ld]=array();
  11179.         $leavedata[$ld]['id']=$l->getId();
  11180.         $leavedata[$ld]['year']=$l->getYear();
  11181.         $leavedata[$ld]['type']=$l->getLeaveType()->getLeaveName();
  11182.         $leavedata[$ld]['label']=str_replace('year','',$attr['label']);
  11183.         $leavedata[$ld]['priority']=0;
  11184.         $leavedata[$ld]['parent']=0;
  11185.         $leavedata[$ld]['typeid']=$l->getLeaveType()->getId();
  11186.         $leavedata[$ld]['maxuse']=$left;
  11187.         $leavedata[$ld]['maxday']=$left;
  11188.         $leavedata[$ld]['use']=0;
  11189.         $leavedata[$ld]['left']=0;
  11190.         $leavedata[$ld]['realleft']=0;
  11191.         $leavedata[$ld]['followparent']=isset($attr1['followParent'])?$attr1['followParent']:false;
  11192.         $leavedata[$ld]['total']=$l->getLeaveEntitlements();
  11193.         $leavedata[$ld]['useuse']=true;
  11194.         if($leavedata[$ld]['type']=='annual'){$leavedata[$ld]['useuse']=false;$leavedata[$ld]['maxday']=$days;}
  11195.         if(!is_null($l->getParent())){
  11196.             if($l->getParent()!=0){
  11197.                 $leavedata[$ld]['parent']=$l->getParent();
  11198.             }
  11199.         }
  11200.         $leavedata[$ld]['expire']=$exp->format('Y-m-d');
  11201.         $leavedata[$ld]['given']=$attr['given'];
  11202.         $leavedata[$ld]['madatory']=false;
  11203.         if(isset($attr['followParent'])){
  11204.             $leavedata[$ld]['madatory']=true;
  11205.         }
  11206.       }
  11207.       if(!empty($back)){
  11208.         foreach($back as $k=>$v){
  11209.             switch($k){
  11210.               case 'data':
  11211.                 break;
  11212.               case 'child':
  11213.                 if(is_array($v) || is_object($v)){
  11214.                   foreach($v as $cyr=>$vc){
  11215.                     
  11216.                     foreach($vc as $kcid=>$vc1){
  11217.                       $cid=substr($kcid,1,strlen($kcid)-1);
  11218.                       foreach($leavedata as $k1 => $v1){
  11219.                         if($v1['id']==intval($cid)){
  11220.                           $leavedata[$k1]['left']+=$vc1;
  11221.                           $leavedata[$k1]['realleft']+=$vc1;
  11222.                           if($leavedata[$k1]['realleft'] <= $days){
  11223.                             $leavedata[$k1]['maxuse']=$leavedata[$k1]['realleft'];
  11224.                           }
  11225.                         }
  11226.                       }  
  11227.                     }
  11228.                   }
  11229.                 }
  11230.                 break;
  11231.               default:
  11232.                 if(substr($k,0,1)=='y'){
  11233.                   $yr=intval(substr($k,1,strlen($k)-1));
  11234.                   
  11235.                   foreach($leavedata as $k1 => $v1){
  11236.                     if(($v1['year']==$yr) && ($v1['typeid']==$leavetype->getId())){
  11237.                       $leavedata[$k1]['left']+=$v;
  11238.                       $leavedata[$k1]['realleft']+=$v;
  11239.                       if($leavedata[$k1]['realleft'] <= $days){
  11240.                         $leavedata[$k1]['maxuse']=$leavedata[$k1]['realleft'];
  11241.                       }
  11242.                     }
  11243.                   }
  11244.                 }
  11245.                 
  11246.             }
  11247.         }
  11248.       }
  11249.       
  11250.       foreach($leavedata as $kl=>$l){
  11251.         $gv=new \DateTime($l['given']);
  11252.         $ex=new \DateTime($l['expire']);
  11253.         if($l['followparent']){
  11254.           $ok=false;
  11255.           if(($startdate <= $gv) && ($enddate >= $gv)){$ok=true;}
  11256.           if(($startdate >= $gv) && ($startdate <= $ex)){$ok=true;}
  11257.           if($ok){
  11258.             $leavedata[$kl]['left']+=$entbyid['l'.$l['id']]->getLeaveLeft();
  11259.             $leavedata[$kl]['realleft']+=$entbyid['l'.$l['id']]->getLeaveLeft();
  11260.           }else{
  11261.             $leavedata[$tmpleave['l'.$l['parent']]]['left']-=($entbyid['l'.$l['id']]->getLeaveEntitlements()-$entbyid['l'.$l['id']]->getLeaveLeft());
  11262.             $leavedata[$tmpleave['l'.$l['parent']]]['realleft']-=($entbyid['l'.$l['id']]->getLeaveEntitlements()-$entbyid['l'.$l['id']]->getLeaveLeft());
  11263.           }
  11264.         }else{
  11265.           $ok=false;
  11266.           if(($startdate <= $gv) && ($enddate >= $gv)){$ok=true;}
  11267.           if(($startdate >= $gv) && ($startdate <= $ex)){$ok=true;}
  11268.           if($ok){
  11269.             $leavedata[$kl]['left']+=$entbyid['l'.$l['id']]->getLeaveLeft();
  11270.             $leavedata[$kl]['realleft']+=$entbyid['l'.$l['id']]->getLeaveLeft();
  11271.             if($l['parent']!=0){
  11272.               $leavedata[$tmpleave['l'.$l['parent']]]['left']+=$entbyid['l'.$l['id']]->getLeaveLeft();
  11273.             }
  11274.           }else{
  11275.             $leavedata[$kl]['left']+=0;
  11276.           }
  11277.         }  
  11278.       }
  11279.       $parentid=array();
  11280.       foreach($leavedata as $kl=>$l){
  11281.         $gv=new \DateTime($l['given']);
  11282.         $ex=new \DateTime($l['expire']);
  11283.         if($l['typeid']==$leavetype->getID()){
  11284.           $parentid[count($parentid)]=$l['id'];
  11285.         }
  11286.       } 
  11287.       foreach($leavedata as $kl=>$l){
  11288.         $gv=new \DateTime($l['given']);
  11289.         $ex=new \DateTime($l['expire']);
  11290.         $ok=false;
  11291.         if(($startdate <= $gv) && ($enddate >= $gv)){$ok=true;}
  11292.         if(($startdate >= $gv) && ($startdate <= $ex)){$ok=true;}
  11293.         if($leavedata[$kl]['typeid']!=$leavetype->getID()){$ok=false;}
  11294.         if(in_array($leavedata[$kl]['parent'],$parentid)){
  11295.           if(($startdate <= $gv) && ($enddate >= $gv)){$ok=true;}
  11296.           if(($startdate >= $gv) && ($startdate <= $ex)){$ok=true;}
  11297.         }
  11298.         if(!$ok){
  11299.           unset($leavedata[$kl]);
  11300.         }
  11301.       } 
  11302.       
  11303.       $leavedata=array_values($leavedata); 
  11304.       foreach($leavedata as $k=> $l){
  11305.         if($l['maxuse'] > $l['realleft']){$leavedata[$k]['maxuse']=$l['realleft'];}
  11306.         if($l['use'] > $l['realleft']){$leavedata[$k]['use']=$l['realleft'];}
  11307.         if($l['maxuse']<=0){
  11308.           if($l['realleft'] <= $days){
  11309.             $leavedata[$k]['maxuse']=$l['realleft'];
  11310.           }else{
  11311.             $leavedata[$k]['maxuse']=$days;
  11312.           }
  11313.         }
  11314.         if($l['typeid']==$leavetype->getId()){
  11315.           $leavelist['realLeft']=$l['realleft'];
  11316.         }
  11317.       }
  11318.     } 
  11319.    
  11320.     return $leavedata;
  11321.   }
  11322.   function sugestion($option=array()){
  11323.     $em=$this->entityManager;
  11324.     $opt=array(
  11325.         'startDate'=>'',
  11326.         'endDate'=>'',
  11327.         'now' => date('Y-m-d'), 
  11328.         'am' => null,
  11329.         'pm' => null,
  11330.         'leave'=>null,
  11331.         'user'=>null,
  11332.         'id'=>null,
  11333.         'keepunpaid'=>true,
  11334.         'request'=>null
  11335.     );
  11336.     //initial value
  11337.     foreach($option as $k=>$v){$opt[$k]=$v;}
  11338.     $leavelist = array();
  11339.     $leavelist['days'] = 0;
  11340.     $leavelist['modif'] = 0;
  11341.     $leavelist['unpaid']=array();
  11342.     $leavelist['blackout']=array();
  11343.     $leavelist['realLeft']=0;
  11344.     $leavelist['totalLeft']=0;
  11345.     $leavelist['totalUnpaid']=0;
  11346.     $leavelist['dummy']=array();
  11347.     /*if(!is_null($opt['id'])){
  11348.         $rq=$em->getRepository(\App\Entity\LeaveType::class)->find($opt['id']);
  11349.         if(!is_null($rq)){
  11350.             $opt['leave']=$rq->getLeaveType();
  11351.             $opt['user']=$rq->getUser();
  11352.             $opt['startDate']=$rq->getStartDate()->format('Y-m-d');
  11353.             $opt['endDate']=$rq->getEndDate()->format('Y-m-d');
  11354.             $opt['am']=$rq->getIsHalfStart();
  11355.             $opt['pm']=$rq->getIsHalfEnd();
  11356.         }
  11357.     }*/
  11358.     //check for request;
  11359.     $back=array();
  11360.     $backdays=999;
  11361.     if($opt['request']!=null){
  11362.       $leaverequest=$em->getRepository(\App\Entity\LeaveRequest::class)->findBy(array('id'=>$opt['request']));
  11363.       if(is_array($leaverequest) || is_object($leaverequest)){
  11364.         foreach($leaverequest as $r){
  11365.           $back=$r->getAlocation();
  11366.           if(is_null($opt['leave'])){$opt['leave']=$r->getLeaveType();}
  11367.           if(is_null($opt['user'])){$opt['user']=$r->getUser();}
  11368.           if($opt['startDate']==''){$opt['startDate']=$r->getStartDate()->format('Y-m-d');}
  11369.           if($opt['endDate']==''){$opt['endDate']=$r->getEndDate()->format('Y-m-d');}
  11370.           if($opt['am']==null){$opt['am']=$r->getIsHalfStart();}
  11371.           if($opt['pm']==null){$opt['pm']=$r->getIsHalfEnd();}
  11372.           $backdays=$r->getDays();
  11373.         }
  11374.       }
  11375.     }
  11376.     if($opt['startDate']==''){$opt['startDate']= date('Y-m-d');}
  11377.     if($opt['endDate']==''){$opt['endDate']= date('Y-m-d');}
  11378.     if($opt['am']==null){$opt['am']=false;}
  11379.     if($opt['pm']==null){$opt['pm']=false;}
  11380.     if(is_null($opt['leave'])){return $leavelist;}
  11381.     if(is_null($opt['user'])){return $leavelist;}
  11382.     $oldcarry=9999;
  11383.     //calculate leave duration
  11384.     $startdate = new \DateTime($opt['startDate']);
  11385.     $enddate = new \DateTime($opt['endDate']);
  11386.     $datego=new \DateTime($opt['startDate']);
  11387.     $daterange $startdate->diff($enddate);
  11388.     $daterange $daterange->format('%a');
  11389.     $daterange $daterange 1;
  11390.     $totalget=$daterange;
  11391.     if($opt['am']==true){$totalget-=0.5;}
  11392.     if($opt['pm']==true){$totalget-=0.5;}
  11393.     //get leave range from db
  11394.     $minyear 999999;
  11395.     $maxyear 0;
  11396.     $yr $datego->format('Y');
  11397.     if ($minyear >= $yr) { $minyear $yr; }
  11398.     if ($maxyear <= $yr) { $maxyear $yr; }
  11399.     if ($daterange 1) {
  11400.         $dtx=new \DateTime($startdate->format('Ymd'));
  11401.         for ($i 1$i $daterange$i++) {
  11402.           $dtx $dtx->modify('+1 day');
  11403.           $yr $dtx->format('Y');
  11404.           if ($minyear >= $yr) {
  11405.             $minyear $yr;
  11406.           }
  11407.           if ($maxyear <= $yr) {
  11408.             $maxyear $yr;
  11409.           }
  11410.         }
  11411.     }
  11412.     $yearlist = array();
  11413.     $minyear $minyear 1;
  11414.     $maxyear $maxyear 1;
  11415.     for ($y $minyear$y <= $maxyear$y++) { $yearlist[count($yearlist)] = $y;}
  11416.     //check for child type
  11417.     $leavetypes=array($opt['leave']->getId());
  11418.     $childtype=array();
  11419.     $childtype['c'.$opt['leave']->getId()]=clone($opt['leave']);
  11420.     $leavetypechild $em->getRepository(\App\Entity\LeaveType::class)->findBy(array('parent' => $opt['leave']->getId()));
  11421.     if(is_array($leavetypechild)){
  11422.         foreach($leavetypechild as $c){
  11423.             $childtype['c'.$c->getId()]=clone($c);
  11424.             $leavetypes[count($leavetypes)]=$c->getId();
  11425.         }
  11426.     }  
  11427.     
  11428.     
  11429.     //get leave entelitement list
  11430.     $leaveent $em->getRepository(\App\Entity\LeaveEntitlement::class)->findBy(array('user' => $opt['user'], 'leaveType' => $leavetypes'year' => $yearlist));
  11431.     $entbyid=array();
  11432.     $leavedata=array();
  11433.     $carry=array();
  11434.     if(is_array($leaveent)){
  11435.         //list atlitement by id
  11436.         foreach($leaveent as $l){
  11437.             $entbyid['l'.$l->getId()]=$l;
  11438.         }
  11439.         //list carry
  11440.         foreach($leaveent as $l){
  11441.             $attr=$l->getAttributes();
  11442.             $attrtype=$childtype['c'.$l->getLeaveType()->getId()]->getAttributes();
  11443.             $attr=array_merge($attr,$attrtype);
  11444.             //followParent this a carry
  11445.             if(isset($attr['followParent'])){
  11446.                 //set parent carry data
  11447.                 $parentid=$l->getParent();
  11448.                 if(!isset($carry['l'.$parentid])){
  11449.                     $carry['l'.$parentid]=array();
  11450.                     $carry['l'.$parentid]['leaves']=array();
  11451.                     $carry['l'.$parentid]['total']=0;
  11452.                     $carry['l'.$parentid]['expire']='1970-01-01';
  11453.                 }
  11454.                 $carry['l'.$parentid]['leaves'][count($carry['l'.$parentid]['leaves'])]=$l->getID();
  11455.                 $carry['l'.$parentid]['total']+=$l->getLeaveEntitlements();
  11456.                 $carrydate=new \DateTime ($carry['l'.$parentid]['expire']);
  11457.                 $exp=new \DateTime($l->getYear().'-12-31');
  11458.                 if(isset($attr['expires'])){$exp=new \DateTime($attr['expires']);}
  11459.                 if(floatval($exp->format('Ymd')) >= floatval($carrydate->format('Ymd'))){
  11460.                     $carry['l'.$parentid]['expire']=$exp->format('Y-m-d');
  11461.                 }    
  11462.             }
  11463.         }
  11464.         //stating here
  11465.         $tmpleave=array();
  11466.         foreach($leaveent as $l){
  11467.           if($l->getYear() <= floatval(date('Y'))){
  11468.             $attr=$l->getAttributes();
  11469.             $attr1=$l->getAttributes();
  11470.             $attrtype=$childtype['c'.$l->getLeaveType()->getId()]->getAttributes();
  11471.             $attr=array_merge($attr,$attrtype);
  11472.             if(!isset($attr['expires'])){$attr['expires']=$l->getYear().'-12-31';}
  11473.             if(!isset($attr['given'])){$attr['given']=$l->getYear().'-01-01';}
  11474.             $exp=new \DateTime($attr['expires']);
  11475.             $given=new \DateTime($attr['given']);
  11476.                 $ld=count($leavedata);
  11477.                 $tmpleave['l'.$l->getId()]=$ld;
  11478.                 $leavedata[$ld]=array();
  11479.                 $leavedata[$ld]['id']=$l->getId();
  11480.                 $leavedata[$ld]['year']=$l->getYear();
  11481.                 $leavedata[$ld]['type']=$l->getLeaveType()->getLeaveName();
  11482.                 $leavedata[$ld]['label']=str_replace('year','',$attr['label']);
  11483.                 $leavedata[$ld]['priority']=0;
  11484.                 $leavedata[$ld]['parent']=0;
  11485.                 $leavedata[$ld]['typeid']=$l->getLeaveType()->getId();
  11486.                 $leavedata[$ld]['maxuse']=0;
  11487.                 $leavedata[$ld]['maxday']=0;
  11488.                 $leavedata[$ld]['use']=0;
  11489.                 $leavedata[$ld]['left']=0;
  11490.                 $leavedata[$ld]['dleft']=0;
  11491.                 $leavedata[$ld]['xleft']=0;
  11492.                 $leavedata[$ld]['realleft']=0;
  11493.                 $leavedata[$ld]['followparent']=isset($attr1['followParent'])?$attr1['followParent']:false;
  11494.                 $leavedata[$ld]['total']=$l->getLeaveEntitlements();
  11495.                 $leavedata[$ld]['useuse']=true;
  11496.                 $leavedata[$ld]['totalunpaid']=0;
  11497.                 $leavedata[$ld]['dates']=array();
  11498.                 if($leavedata[$ld]['type']=='annual'){$leavedata[$ld]['useuse']=false;}
  11499.                 if(!is_null($l->getParent())){
  11500.                     if($l->getParent()!=0){
  11501.                         $leavedata[$ld]['parent']=$l->getParent();
  11502.                     }
  11503.                 }
  11504.                 $leavedata[$ld]['expire']=$exp->format('Y-m-d');
  11505.                 //$extexpire=new \DateTime($exp->format('Y-m-d'));
  11506.                 /*if(isset($attr['extexpire'])){
  11507.                     $extexpire->modify('+1 day');
  11508.                     $leavedata[$ld]['expire']=$extexpire->format('Y-m-d');
  11509.                 }*/
  11510.                 $leavedata[$ld]['given']=$attr['given'];
  11511.                 //$leavedata[$ld]['left']=$l->getLeaveLeft();
  11512.                 $leavedata[$ld]['madatory']=false;
  11513.                 if(isset($attr['followParent'])){
  11514.                     $leavedata[$ld]['madatory']=true;
  11515.                     /*$total=$l->getLeaveEntitlements();
  11516.                     $parentleft=$entbyid['l'.$l->getParent()]->getLeaveLeft();
  11517.                     if($parentleft < $total){
  11518.                         $leavedata[$ld]['left']=$leavedata[$ld]['left']-($total - $parentleft);
  11519.                     }*/
  11520.                 }
  11521.                 if(isset($carry['l'.$l->getId()])){
  11522.                     $leavedata[$ld]['priority']=-1;
  11523.                 }
  11524.                 //$leavedata[$ld]['realleft']=$leavedata[$ld]['left']*1;
  11525.                 //$leavelist['realLeft']+=($leavedata[$ld]['left']*1);
  11526.           }
  11527.         }  
  11528.         //return back if has request
  11529.         
  11530.         if(!empty($back)){
  11531.           foreach($back as $k=>$v){
  11532.               switch($k){
  11533.                 case 'data':
  11534.                   break;
  11535.                 case 'child':
  11536.                   if(is_array($v)){
  11537.                     foreach($v as $cyr=>$vc){
  11538.                       foreach($vc as $kcid=>$vc1){
  11539.                         $cid=substr($kcid,1,strlen($kcid));
  11540.                         foreach($leavedata as $k1 => $v1){
  11541.                           if($v1['id']==$cid){
  11542.                             $leavedata[$k1]['left']+=$vc1;
  11543.                             $leavedata[$k1]['realleft']+=$vc1;
  11544.                             $leavedata[$k1]['dleft']+=$vc1;
  11545.                             $leavedata[$k1]['xleft']+=$vc1;
  11546.                             if(($leavedata[$k1]['parent']!==0) && ($leavedata[$k1]['followparent']!==true)){
  11547.                               foreach($leavedata as $kpr=>$vpr){
  11548.                                 if($vpr['id']===$leavedata[$k1]['parent']){
  11549.                                   $leavedata[$kpr]['xleft']+=$vc1;
  11550.                                   break;
  11551.                                 }
  11552.                               }
  11553.                             }
  11554.                             if(($leavedata[$k1]['realleft'] <= $backdays) && ($leavedata[$k1]['followparent']!==true)) {
  11555.                               $leavedata[$k1]['maxuse']=$leavedata[$k1]['realleft'];
  11556.                             }
  11557.                           }
  11558.                         }  
  11559.                       }
  11560.                     }
  11561.                   }
  11562.                   break;
  11563.                 default:
  11564.                   if(substr($k,0,1)=='y'){
  11565.                     $yr=intval(substr($k,1,strlen($k)-1));
  11566.                     foreach($leavedata as $k1 => $v1){
  11567.                       if(($v1['year']==$yr) && ($v1['typeid']==$opt['leave']->getId())){
  11568.                         $leavedata[$k1]['left']+=$v;
  11569.                         $leavedata[$k1]['dleft']+=$v;
  11570.                         $leavedata[$k1]['realleft']+=$v;
  11571.                         $leavedata[$k1]['xleft']+=$v;
  11572.                         if($leavedata[$k1]['realleft'] <= $backdays){
  11573.                           $leavedata[$k1]['maxuse']=$leavedata[$k1]['realleft'];
  11574.                         }
  11575.                       }
  11576.                     }
  11577.                   }
  11578.                   
  11579.               }
  11580.           }
  11581.         }
  11582.         foreach($leavedata as $kl=>$l){
  11583.           $gv=new \DateTime($l['given']);
  11584.           $ex=new \DateTime($l['expire']);
  11585.           if($l['followparent']){
  11586.             $ok=false;
  11587.             if(($startdate <= $gv) && ($enddate >= $gv)){$ok=true;}
  11588.             if(($startdate >= $gv) && ($startdate <= $ex)){$ok=true;}
  11589.             if($ok){
  11590.               $parentleft=$entbyid['l'.$l['parent']]->getLeaveLeft();
  11591.               if($parentleft $entbyid['l'.$l['id']]->getLeaveEntitlements()){
  11592.                 $parentleft=$entbyid['l'.$l['id']]->getLeaveEntitlements();
  11593.               }
  11594.               $carryuse=($entbyid['l'.$l['id']]->getLeaveEntitlements()-$entbyid['l'.$l['id']]->getLeaveLeft());
  11595.               $carryleft=$parentleft-$carryuse;
  11596.               if($carryleft 0){$carryleft=0;}
  11597.               $leavedata[$kl]['left']+=$carryleft;
  11598.               $leavedata[$kl]['dleft']+=$carryleft;
  11599.               $leavedata[$kl]['realleft']+=$carryleft;
  11600.               $leavedata[$kl]['xleft']+=$carryleft;
  11601.             }else{
  11602.               $leavedata[$tmpleave['l'.$l['parent']]]['left']-=($entbyid['l'.$l['id']]->getLeaveEntitlements()-$entbyid['l'.$l['id']]->getLeaveLeft());
  11603.               $leavedata[$tmpleave['l'.$l['parent']]]['dleft']-=($entbyid['l'.$l['id']]->getLeaveEntitlements()-$entbyid['l'.$l['id']]->getLeaveLeft());
  11604.               $leavedata[$tmpleave['l'.$l['parent']]]['realleft']-=($entbyid['l'.$l['id']]->getLeaveEntitlements()-$entbyid['l'.$l['id']]->getLeaveLeft());
  11605.               $leavedata[$tmpleave['l'.$l['parent']]]['xleft']-=($entbyid['l'.$l['id']]->getLeaveEntitlements()-$entbyid['l'.$l['id']]->getLeaveLeft());
  11606.             }
  11607.           }else{
  11608.             $ok=false;
  11609.             if(($startdate <= $gv) && ($enddate >= $gv)){$ok=true;}
  11610.             if(($startdate >= $gv) && ($startdate <= $ex)){$ok=true;}
  11611.             if($ok){
  11612.               $leavedata[$kl]['left']+=$entbyid['l'.$l['id']]->getLeaveLeft();
  11613.               $leavedata[$kl]['realleft']+=$entbyid['l'.$l['id']]->getLeaveLeft();
  11614.               $leavedata[$kl]['xleft']+=$entbyid['l'.$l['id']]->getLeaveLeft();
  11615.               $leavedata[$kl]['dleft']+=$entbyid['l'.$l['id']]->getLeaveLeft();
  11616.               if($l['parent']!=0){
  11617.                 //$leavedata[$tmpleave['l'.$l['parent']]]['left']+=$entbyid['l'.$l['id']]->getLeaveLeft();
  11618.                 $leavedata[$tmpleave['l'.$l['parent']]]['xleft']+=$entbyid['l'.$l['id']]->getLeaveLeft();
  11619.               }
  11620.             }else{
  11621.               $leavedata[$kl]['left']+=0;
  11622.             }
  11623.           }  
  11624.         }
  11625.         //print_r(json_encode($leavedata));
  11626.         //die();
  11627.         foreach($leavedata as $kl=>$l){
  11628.           $gv=new \DateTime($l['given']);
  11629.           $ex=new \DateTime($l['expire']);
  11630.           $ok=false;
  11631.           if(($startdate <= $gv) && ($enddate >= $gv)){$ok=true;}
  11632.           if(($startdate >= $gv) && ($startdate <= $ex)){$ok=true;}
  11633.           if(!$ok){
  11634.             unset($leavedata[$kl]);
  11635.           }
  11636.         } 
  11637.         $leavedata=array_values($leavedata); 
  11638.     } 
  11639.     
  11640.     //check for holiday
  11641.     $country $opt['leave']->getOffice()->getCountry();
  11642.     $holidayrp $em->getRepository(\App\Entity\LeaveBankHoliday::class)->findBy(array('location' => $country));
  11643.     $holiday = array();
  11644.     foreach ($holidayrp as $h) {
  11645.         $dt $h->getDate()->format('Y-m-d');
  11646.         $dte $h->getEndDate();
  11647.         if(!is_null($dte)){
  11648.             $dte=new \DateTime($h->getEndDate()->format('Y-m-d'));
  11649.             $dtex=new \DateTime($h->getDate()->format('Y-m-d'));
  11650.             while($dtex <= $dte){
  11651.             $holiday[count($holiday)] = $dtex->format('Y-m-d');
  11652.             $dtex->modify('+1 day');
  11653.             }
  11654.         }else{
  11655.             $holiday[count($holiday)] = $dt;
  11656.         } 
  11657.     }
  11658.     //print_r($leavedata);
  11659.     //general
  11660.     $offday = array(06);
  11661.     $leavelist['startDate']=$opt['startDate'];
  11662.     $leavelist['endDate']=$opt['endDate'];
  11663.     //start calculte
  11664.     for ($d 0$d $daterange$d++) {
  11665.         $dd=$datego->format('Y-m-d'); //date that will be calculate
  11666.         $requestday=1//defaut request 1 day leave
  11667.         if(($opt['am']==true) && ($d==0)){$requestday=0.5;} // cut 0.5 of start date if am request
  11668.         if(($opt['pm']==true) && ($d == ($daterange-1))){$requestday=0.5;} // cut 0.5 of start date if pm request
  11669.         $week$datego->format('w');
  11670.         if (in_array($week$offday)) {$requestday=0;} //dont calculate if weekend
  11671.         if (in_array($dd$holiday)) {
  11672.           $requestday=0;
  11673.         } //dont calculate holiday
  11674.         if($requestday!=0){
  11675.             $leavelist['dummy'][]=$dd;
  11676.             //get maximum use of leave data
  11677.             foreach($leavedata as $kd=>$ld){
  11678.                 if($ld['realleft'] > 0){
  11679.                     $given=new \DateTime($ld['given']);
  11680.                     $given=floatval($given->format('Ymd'));
  11681.                     $exp=new \DateTime($ld['expire']);
  11682.                     $exp=floatval($exp->format('Ymd'));
  11683.                     $floatdd=new \DateTime($dd);
  11684.                     $floatdd=floatval($floatdd->format('Ymd'));
  11685.                     if(($floatdd >= $given) && ($floatdd <= $exp)){
  11686.                         $max=$ld['maxuse']+$requestday;
  11687.                         if($max $ld['realleft']){$leavedata[$kd]['maxuse']=$max;}else{$leavedata[$kd]['maxuse']+=$ld['realleft'];}
  11688.                         //print_r($kd.'=>'.$max.'=>'.$ld['left']."\n");
  11689.                     }    
  11690.                 }    
  11691.             } 
  11692.             //create sugestion
  11693.             $currentyear=$datego->format('Y');
  11694.             $leaveuse=array();
  11695.             foreach($leavedata as $kd=>$ld){
  11696.               if(floatval($ld['year']) <= floatval(date('Y'))){
  11697.                 if($ld['realleft'] > 0){
  11698.                   /*if(isset($carry['l'.$ld['id']])){
  11699.                       if($ld['realleft'] <= $carry['l'.$ld['id']]['total']){
  11700.                           $ld['expire']=$carry['l'.$ld['id']]['expire'];
  11701.                       }
  11702.                   }*/
  11703.                   $given=new \DateTime($ld['given']);
  11704.                   $given=floatval($given->format('Ymd'));
  11705.                   $exp=new \DateTime($ld['expire']);
  11706.                   $exp=floatval($exp->format('Ymd'));
  11707.                   $floatdd=new \DateTime($dd);
  11708.                   $floatdd=floatval($floatdd->format('Ymd'));
  11709.                   if(($floatdd >= $given) && ($floatdd <= $exp)){
  11710.                       
  11711.                     $cll=count($leaveuse);
  11712.                     $leaveuse[$cll]=array();
  11713.                     $leaveuse[$cll]['index']=$kd;
  11714.                     $leaveuse[$cll]['value']=$ld;
  11715.                     if($ld['followparent']===true){
  11716.                       foreach($leavedata as $xld){
  11717.                         if($ld['parent']===$xld['id']){
  11718.                           /*if($xld['left'] < $leaveuse[$cll]['value']['left']){
  11719.                             $leaveuse[$cll]['value']['left']=$xld['left'];
  11720.                             $leavedata[$kd]['dleft']=$xld['left'];
  11721.                           }*/
  11722.                           if($xld['dleft'] < $ld['dleft']){
  11723.                             $leavedata[$kd]['dleft']=$xld['dleft'];
  11724.                           }
  11725.                           if($xld['dleft'] < $leaveuse[$cll]['value']['left']){
  11726.                             $leaveuse[$cll]['value']['left']=$xld['dleft'];
  11727.                           }  
  11728.                         }
  11729.                       }
  11730.                     }
  11731.                   }
  11732.                 }
  11733.               }
  11734.             }
  11735.             usort($leaveuse,function($a,$b){
  11736.                 if(isset($a['value']['expire']) && isset($b['value']['expire'])){
  11737.                     $aa=new \DateTime($a['value']['expire']);
  11738.                     $bb=new \DateTime($b['value']['expire']);
  11739.                   $ax=floatval($aa->format('Ymd'));
  11740.                   $bx=floatval($bb->format('Ymd'));
  11741.                   if($ax!=$bx){return $ax $bx;}else{
  11742.                     return 0;
  11743.                     //return $b['value']['priority'] < $a['value']['priority'];
  11744.                   }
  11745.                 }
  11746.                 return 0;
  11747.             });
  11748.             $rqday=$requestday;
  11749.             //set allocation value
  11750.             /*for($l=0;$l<count($leaveuse);$l++){
  11751.               if($leaveuse[$l]['value']['followparent']===true){
  11752.                 for($p=0;$p<count($leaveuse);$p++){
  11753.                   if($leaveuse[$l]['value']['parent']===$leaveuse[$p]['value']['id']){
  11754.                     if($leaveuse[$p]['value']['left'] < $leaveuse[$l]['value']['left']){
  11755.                       $leaveuse[$l]['value']['left']=$leaveuse[$p]['value']['left'];
  11756.                       
  11757.                     }
  11758.                     break;
  11759.                   }
  11760.                 }
  11761.               }
  11762.             }*/
  11763.             $luse=0;
  11764.             $leaveuselimit=count($leaveuse);
  11765.             while(($rqday 0) && ($luse $leaveuselimit)){
  11766.                 $get=$rqday;
  11767.                 if($leavedata[$leaveuse[$luse]['index']]['dleft'] > 0){
  11768.                   if($leaveuse[$luse]['value']['left'] < $rqday){
  11769.                       $get=$leaveuse[$luse]['value']['left'];
  11770.                   }
  11771.                   $leavedata[$leaveuse[$luse]['index']]['left']-=$get;
  11772.                   $leavedata[$leaveuse[$luse]['index']]['dleft']-=$get;
  11773.                   $leaveuse[$luse]['value']['left']-=$get;
  11774.                   $rqday-=$get;
  11775.                   $leavedata[$leaveuse[$luse]['index']]['use']+=$get;
  11776.                 }
  11777.                 if($rqday 0){$luse++;}
  11778.                 if($rqday 1){
  11779.                   $leavedata[$leaveuse[$luse]['index']]['dates'][count($leavedata[$leaveuse[$luse]['index']]['dates'])]=$dd;
  11780.                 }
  11781.             }
  11782.             
  11783.             //unpaid
  11784.             if($rqday 0){
  11785.                 foreach($leaveuse as $lk=>$lu){
  11786.                   if($lu['value']['typeid']==$opt['leave']->getId()){
  11787.                     $leavedata[$lu['index']]['totalunpaid']+=$rqday;
  11788.                     break;
  11789.                   }
  11790.                 }
  11791.                 if(!isset($leavelist['unpaid']['y'.$currentyear])){
  11792.                     $leavelist['unpaid']['y'.$currentyear]=array();
  11793.                     $leavelist['unpaid']['y'.$currentyear]['data']=array();
  11794.                     $leavelist['unpaid']['y'.$currentyear]['value']=0;
  11795.                 }
  11796.                 $leavelist['unpaid']['y'.$currentyear]['value']+=$rqday;
  11797.                 $unpaidtotal=count($leavelist['unpaid']['y'.$currentyear]['data']);
  11798.                 $leavelist['unpaid']['y'.$currentyear]['data'][$unpaidtotal]=array();
  11799.                 $leavelist['unpaid']['y'.$currentyear]['data'][$unpaidtotal]['date']=$dd;
  11800.                 $leavelist['unpaid']['y'.$currentyear]['data'][$unpaidtotal]['value']=$rqday;
  11801.             }
  11802.             $leavelist['days']+=$requestday;
  11803.             $leavelist['modif']+=$requestday;
  11804.             $leavelist['totalUnpaid']+=$rqday;
  11805.         }else{
  11806.             $leavelist['blackout'][count($leavelist['blackout'])]=$dd;
  11807.         }
  11808.         foreach($leavedata as $kd=>$ld){
  11809.           if($leavedata[$kd]['left'] < $leavedata[$kd]['use']){$leavedata[$kd]['maxuse']=$leavedata[$kd]['left'] + $leavedata[$kd]['use'];}
  11810.           if($leavedata[$kd]['maxuse'] > $leavelist['days']){$leavedata[$kd]['maxuse']=$leavelist['days'];}
  11811.           if($leavedata[$kd]['realleft'] < $leavedata[$kd]['use']){$leavedata[$kd]['use']=$leavedata[$kd]['realleft'];}
  11812.           if($leavedata[$kd]['realleft'] < $leavedata[$kd]['maxuse']){$leavedata[$kd]['maxuse']=$leavedata[$kd]['realleft'];}
  11813.           $leavedata[$kd]['maxday']=$leavelist['days'];
  11814.         }  
  11815.         //goto next day
  11816.         $datego $datego->modify('+1 day');
  11817.         
  11818.     } 
  11819.     
  11820.     $leavelist['realLeft']=0;
  11821.     foreach($leavedata as $k=> $l){
  11822.       if($l['maxuse'] > $l['realleft']){$leavedata[$k]['maxuse']=$l['realleft'];}
  11823.       if($l['use'] > $l['realleft']){$leavedata[$k]['use']=$l['realleft'];}
  11824.       if($l['useuse']){
  11825.         if($l['maxday'] > $l['realleft']){$leavedata[$k]['maxday']=$l['realleft'];}
  11826.       }
  11827.       if($l['maxuse']<=0){
  11828.         if($l['realleft'] <= $leavelist['days']){
  11829.           $leavedata[$k]['maxuse']=$l['realleft'];
  11830.         }else{
  11831.           $leavedata[$k]['maxuse']=$leavelist['days'];
  11832.         }
  11833.       }
  11834.       if($l['typeid']==$opt['leave']->getId()){
  11835.         //$leavelist['realLeft']+=$l['xleft'];
  11836.       }
  11837.       if($l['followparent']){
  11838.         if($l['year']!=date('Y')){
  11839.           $leavelist['realLeft']+=$l['xleft'];
  11840.         }
  11841.       }else{
  11842.         $leavelist['realLeft']+=$l['xleft'];
  11843.       }
  11844.     }
  11845.     if($leavelist['realLeft'] <=){
  11846.       foreach($leavedata as $k=> $l){
  11847.         $leavelist['realLeft']+=$l['xleft'];
  11848.       }  
  11849.     }
  11850.     
  11851.     $leavedata=array_values(array_filter($leavedata,function($l){return ($l['maxuse'] > 0);}));
  11852.     $leavelist['totalLeft']=$leavelist['realLeft']-$leavelist['days'];
  11853.     if($leavelist['totalLeft'] < 0){
  11854.       $leavelist['totalUnpaid']=abs($leavelist['totalLeft']);
  11855.       $leavelist['totalLeft']=0;
  11856.       /*foreach($leavedata as $k=>$l){
  11857.         if($l['typeid']==$opt['leave']->getId()){
  11858.           $leavedata[$k]['use']=$leavedata[$k]['use'];
  11859.         }  
  11860.       }*/
  11861.     }
  11862.     //put original use
  11863.     if(!empty($back)){
  11864.       //$leavelist['days']=0;
  11865.       $totaldays=0;
  11866.       foreach($back as $k=>$v){
  11867.         switch($k){
  11868.           case 'data':
  11869.             break;
  11870.           case 'child':
  11871.             if(is_array($v)){
  11872.               foreach($v as $cyr=>$vc){
  11873.                 foreach($vc as $kcid=>$vc1){
  11874.                   $cid=substr($kcid,1,strlen($kcid));
  11875.                   foreach($leavedata as $k1 => $v1){
  11876.                     if($v1['id']==$cid){
  11877.                       $leavedata[$k1]['use']=$vc1;
  11878.                       $totaldays+=$vc1;
  11879.                     }
  11880.                   }
  11881.                 }
  11882.               }
  11883.             }
  11884.             break;
  11885.           default:
  11886.             if(substr($k,0,1)=='y'){
  11887.               $yr=intval(substr($k,1,strlen($k)-1));
  11888.               foreach($leavedata as $k1 => $v1){
  11889.                 if(($v1['year']==$yr) && ($v1['typeid']==$opt['leave']->getId())){
  11890.                   $leavedata[$k1]['use']=$v;
  11891.                   $totaldays+=$v;
  11892.                 }
  11893.               }
  11894.             }
  11895.         }
  11896.       }
  11897.       $leavelist['totalUnpaid']=$leavelist['days']-$totaldays;
  11898.       if($leavelist['totalUnpaid'] < 0){$leavelist['totalUnpaid']=0;}
  11899.       $leavelist['totalLeft']=$leavelist['realLeft']-$totaldays;
  11900.       if($leavelist['totalLeft'] < 0){$leavelist['totalLeft']=0;}
  11901.     }  
  11902.     $leavelist['data']=$leavedata;
  11903.     $leavelist['request']=$back;
  11904.     return $leavelist;
  11905.   }
  11906.   function mc_send_email($id){
  11907.     $result=array();
  11908.     $em=$this->entityManager;
  11909.     $request=$em->getRepository(LeaveRequest::class)->find($id);
  11910.     if($request!=null){
  11911.           $name=$request->getUser()->getPersonalInfo()->getFirstName().' '.$request->getUser()->getPersonalInfo()->getLastName();
  11912.           $date=$request->getStartDate()->format('d M Y');
  11913.           $sdate=$request->getStartDate()->format('Ymd');
  11914.           $edate=$request->getEndDate()->format('Ymd');
  11915.           if($sdate != $edate){
  11916.             $date.= 'until '.$request->getEndDate()->format('d M Y');
  11917.           }
  11918.           $days $request->getDays();
  11919.           $rdate=new \DateTime($request->getEndDate()->format('Y-m-d'));
  11920.           $rdate->modify('+1 day');
  11921.           $rdate=$rdate->format('d M Y');
  11922.           $takeover='';
  11923.           $task='';
  11924.           $subject='Sick Leave Application - '.$name;
  11925.           $emailTemplate 'email/user-notification/leave/mc.html.twig';
  11926.           $to=array('very.sukawirawan@mediatropy.com');
  11927.           $this->mailgunService->sendEmail(
  11928.             $subject,
  11929.             $to,
  11930.             $emailTemplate,
  11931.             [
  11932.               'name' => $name,
  11933.               'date' => $date,
  11934.               'days' => $days,
  11935.               'returndate' => $rdate,
  11936.               'takeover'=>$takeover,
  11937.               'task'=>$task
  11938.             ],
  11939.             false
  11940.           );
  11941.           $result['name']=$name;
  11942.           $result['test']=$date;
  11943.           $result['return']=$rdate;
  11944.     }
  11945.     return $result;
  11946.   }
  11947. }