<?php
namespace App\Service;
use App\Entity\LeaveEntitlement;
use App\Entity\LeaveMCRecord;
use App\Entity\LeaveRequest;
use App\Entity\LeaveType;
use App\Entity\Office;
use App\Entity\OfficeLeave;
use App\Repository\LeaveEntitlementRepository;
use App\Repository\LeaveRequestRepository;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use App\Service\LogService;
use App\Service\MailgunService;
use Symfony\Component\Intl\Intl;
use Symfony\Component\Intl\Countries;
use Symfony\Component\Serializer\SerializerInterface;
use Symfony\Component\Serializer\Normalizer\AbstractNormalizer;
use Symfony\Component\Serializer\Encoder\JsonEncoder;
use Symfony\Component\Serializer\Normalizer\AbstractObjectNormalizer;
class LeaveService
{
private $entityManager;
private $log;
private $params;
private $mailgunService;
private $translator;
private $serializer;
private $leaveEntitlementRepository;
private $leaveRequestRepository;
private $bankHolidayService;
private $icsService;
public function __construct(EntityManagerInterface $entityManager, LogService $log, ParameterBagInterface $params, MailgunService $mailgunService, TranslatorInterface $translator,SerializerInterface $serializer, LeaveEntitlementRepository $leaveEntitlementRepository, LeaveRequestRepository $leaveRequestRepository, BankHolidayService $bankHolidayService, ICSService $icsService)
{
$this->entityManager = $entityManager;
$this->log = $log;
$this->params = $params;
$this->mailgunService = $mailgunService;
$this->translator = $translator;
$this->serializer = $serializer;
$this->leaveEntitlementRepository = $leaveEntitlementRepository;
$this->leaveRequestRepository = $leaveRequestRepository;
$this->bankHolidayService = $bankHolidayService;
$this->icsService = $icsService;
}
private function _date_attar_use($attr,$year,$joindate,$ext=0){
$jd=new \DateTime($joindate);
$jdext=new \DateTime($joindate);
$jdp=new \DateTime($joindate);
$jdp->modify('+1 day');
$jdm=new \DateTime($joindate);
$jdm->modify('-1 day');
$jpx=$jdp->format('m-d');
$jmx=$jdm->format('m-d');
$attr=str_replace('next-',($year+1).'-',$attr);
$attr=str_replace('year-',$year.'-',$attr);
$attr=str_replace('joindate+year+1',$year.'-'.$jpx,$attr);
$attr=str_replace('joindate+next+1',($year+1).'-'.$jpx,$attr);
$attr=str_replace('joindate+year+-1',$year.'-'.$jmx,$attr);
$attr=str_replace('joindate+next+-1',($year+1).'-'.$jmx,$attr);
$attr=str_replace('joindate+year',$year.'-'.$jd->format('m-d'),$attr);
$attr=str_replace('joindate+fix',$year.'-'.$jd->format('m-d'),$attr);
$attr=str_replace('joindate+next',($year+1).'-'.$jd->format('m-d'),$attr);
if($ext > 0){
$jdext->modify('+'.$ext.' months');
if($year <= intval($jdext->format('Y'))){$attr=$jdext->format('Y-m-d');}
}
return $attr;
}
/*private function _attribute_set($dataAttributes, $mode, $year, $expire, \App\Entity\User $user)
{
$attr = array();
switch ($mode) {
case 'period':
$dataAttributes += [
"expires" => $expire,
"given" => $year . "-01-01",
"year" => $year
];
$jn = $user->getPersonalInfo()->getJobJoinDate();
if ($jn == null) {
$jn = new \DateTime(date('Y-m-d'));
}else{
$jn=new \DateTime($user->getPersonalInfo()->getJobJoinDate()->format('Y-m-d'));
}
$jn->modify('+3 months');
$dtx = new \DateTime($year . "-01-01");
if ($dtx < $jn) {
$dtx = $jn;
}
$dataAttributes["expires"] = $expire->format('Y-m-d');
$dataAttributes["given"] = $dtx->format('Y-m-d');
break;
case 'anniversary':
$join = $user->getPersonalInfo()->getJobJoinDate() ? new \DateTime($user->getPersonalInfo()->getJobJoinDate()->format('Y-m-d')) : new \DateTime();
$y = $join->format('Y');
$join = $join->format('m-d');
$given = new \DateTime($year . '-' . $join);
$given->modify('+1 day');
$given=$given->format('Y-m-d');
$exp = ($year + 1) . '-' . $join;
$days = 0;
$ynow = ($year - $y);
if ($ynow >= $dataAttributes['incrementalStart']) {
$days = ($ynow * $dataAttributes['incrementalValue']);
}
if ($join != null) {
$dataAttributes += [
"expires" => $exp,
"given" => $given,
"year" => $year,
"days" => $days
];
$dataAttributes["expires"] = $exp;
$dataAttributes["given"] = $given;
$dataAttributes["days"] = $days;
} else {
$dataAttributes += [
"expires" => $year . '-' . date('m-d'),
"given" => $year . '-' . date('m-d'),
"year" => $year,
"days" => 0
];
$dataAttributes["expires"] = $year . '-' . date('m-d');
$dataAttributes["given"] = $year . '-' . date('m-d');
$dataAttributes["days"] = $days;
}
break;
default:
break;
}
return $dataAttributes;
}*/
public function _attribute_set($dataAttributes, $year, $maxday,\App\Entity\User $user)
{
$attr = array();
$jbdate=$user->getPersonalInfo()->getJobJoinDate();
if(is_null($jbdate)){return false;}
$dataAttributes['year']=$year;
if(isset($dataAttributes['expiredate'])){
$de=$dataAttributes['expiredate'];
$dataAttributes['expires']=$this->_date_attar_use($de,$year,$jbdate->format('Y-m-d'));
}
if(isset($dataAttributes['givendate'])){
$de=$dataAttributes['givendate'];
$ext=isset($dataAttributes['extenddate'])?$dataAttributes['extenddate']:0;
$dataAttributes['given']=$this->_date_attar_use($de,$year,$jbdate->format('Y-m-d'),$ext);
}
$uendate=$year.'-12-31';
if(isset($dataAttributes['expires'])){
$uendate=$dataAttributes['expires'];
}
$config=isset($dataAttributes['config'])?$dataAttributes['config']:[];
$usepro=isset($dataAttributes['useprorate'])?$dataAttributes['useprorate']:false;
$dataAttributes['days']=$this->_prorate($jbdate->format('Y-m-d'),$uendate,$maxday,$config,$usepro);
if(isset($dataAttributes['isIncremental'])){
if($dataAttributes['isIncremental']){
$dataAttributes['days']=(($year-intval($jbdate->format('Y')))-$dataAttributes['incrementalStart'])*$dataAttributes['incrementalValue'];
}
}
if(isset($dataAttributes['given']) && isset($dataAttributes['expires'])){
if($dataAttributes['given'] > $dataAttributes['expires']){
//$dataAttributes['days']=0;
}
}
return $dataAttributes;
}
/*private function _add_leave_data($user, $year, $expire, $type, $parent = array(null, 0), $edit = false)
{
$leaveEntitlement = $this->entityManager->getRepository(LeaveEntitlement::class)->findBy(array('user' => $user, 'year' => ($year), 'leaveType' => $type, 'parent' => $parent));
$add = true;
if (empty($leaveEntitlement)) {
$dataAttributes = $type->getAttributes();
$noadd=false;
if(isset($dataAttributes['noadd'])){
if($dataAttributes['noadd']){$noadd=true;}
}
if(!$noadd){
$leaveEntitlement = new LeaveEntitlement();
$leaveEntitlement->setUser($user);
$leaveEntitlement->setYear($year);
$leaveEntitlement->setLeaveType($type);
$leaveEntitlement->setLeaveApproved(null);
if($user->inProbation()){
$leaveEntitlement->setLeaveEntitlements(0);
$leaveEntitlement->setLeaveLeft(0);
if($type->getLeaveName()=='sick'){
$leaveEntitlement->setLeaveEntitlements($type->getDays());
$leaveEntitlement->setLeaveLeft($type->getDays());
}
}else{
$leaveEntitlement->setLeaveEntitlements($type->getDays());
$leaveEntitlement->setLeaveLeft($type->getDays());
}
$leaveEntitlement->setIsActive(true);
if ($dataAttributes != null) {
if (isset($dataAttributes['mode'])) {
$m = $dataAttributes['mode'];
} else {
$m = 'fix';
}
$dataAttributes = $this->_attribute_set($dataAttributes, $m, $year, $expire, $user);
if(isset($dataAttributes['disallowUser'])){
unset($dataAttributes['disallowUser']);
}
if (isset($dataAttributes['days'])) {
$leaveEntitlement->setLeaveEntitlements($dataAttributes['days']);
$leaveEntitlement->setLeaveLeft($dataAttributes['days']);
}
}
if (!is_array($parent)) {
$leaveEntitlement->setParent($parent);
}
$leaveEntitlement->setAttributes($dataAttributes);
$leaveEntitlement->setCreatedBy($user);
if (isset($dataAttributes['gender'])) {
if ($dataAttributes['gender'] != $user->getPersonalInfo()->getGender()) {
$add = false;
}
}
if ($add) {
if($type->getLeaveName()=='sick'){
$leaveEntitlement->setLeaveEntitlements($type->getDays());
$leaveEntitlement->setLeaveLeft($type->getDays());
}
$country = $user->getOffice()->getCountry();
if($country=='VN'){
if($type->getLeaveName()=='annual'){
$dtx = $user->getPersonalInfo()->getJobJoinDate();
$dty=$dtx->format('Y');
//if(($year-$dtx) < 2){
if(($year-$dty)==0){
$leaveEntitlement->setLeaveEntitlements(5);
$leaveEntitlement->setLeaveLeft(5);
$gv=new \DateTime($dtx->format('Y-m-d'));
$exp=new \DateTime($dtx->format('Y-m-d'));
$exp->modify('+1 year');
$exp->modify('-1 day');
$dataAttributes['given']=$gv->format('Y-m-d');
$dataAttributes['expires']=$exp->format('Y-m-d');
$leaveEntitlement->setAttributes($dataAttributes);
}else{
$leaveEntitlement->setLeaveEntitlements($type->getDays());
$leaveEntitlement->setLeaveLeft($type->getDays());
$gv=new \DateTime($year.'-'.$dtx->format('m-d'));
$exp=new \DateTime(($year+1).'-'.$dtx->format('m-d'));
$exp->modify('-1 day');
$dataAttributes['given']=$gv->format('Y-m-d');
$dataAttributes['expires']=$exp->format('Y-m-d');
$leaveEntitlement->setAttributes($dataAttributes);
}
//}else if(($year-$dtx)==0){
// $nm=new \DateTime($dtx->format('Y-m-d'));
// $nm=$nm->format('m');
// $nm=(12-$nm)+1;
// $ct=floor($nm/$type->getDays());
// $leaveEntitlement->setLeaveEntitlements($ct);
// $leaveEntitlement->setLeaveLeft($ct);
// $gv=new \DateTime($dtx->format('Y-m-d'));
// $gv->modify('+1 year');
// $exp=new \DateTime(($year+2).'-03-31');
// $dataAttributes['given']=$gv->format('Y-m-d');
// $dataAttributes['expires']=$exp->format('Y-m-d');
//}
//}
}
}
$this->entityManager->persist($leaveEntitlement);
$this->entityManager->flush();
}
}
} else {
if ($edit) {
foreach ($leaveEntitlement as $le) {
$ent = $le->getLeaveEntitlements();
$left = $le->getLeaveLeft();
$dataAttributes = $le->getAttributes();
if ($dataAttributes != null) {
if (isset($dataAttributes['mode'])) {
$m = $dataAttributes['mode'];
} else {
$m = 'fix';
}
$dataAttributes = $this->_attribute_set($dataAttributes, $m, $year, $expire, $user);
if(isset($dataAttributes['disallowUser'])){
unset($dataAttributes['disallowUser']);
}
//if (isset($dataAttributes['days'])) {
// $ext = $dataAttributes['days'] - $ent;
// $left = $left + $ext;
// $le->setLeaveEntitlements($dataAttributes['days']);
// $le->setLeaveLeft($left);
//}
}
if (!is_array($parent)) {
$le->setParent($parent);
}
$country = $user->getOffice()->getCountry();
if($country=='VN'){
if($type->getLeaveName()=='annual'){
$dtx = $user->getPersonalInfo()->getJobJoinDate();
$dty=$dtx->format('Y');
//if(($year-$dtx) < 2){
if(($year-$dty)==0){
$lfd=$le->getLeaveLeft();
$glt=$le->getLeaveEntitlements();
$lday=5;
$lfd=$lfd-($glt-$lday);
$le->getLeaveLeft($lfd);
$le->setLeaveEntitlements($lday);
$gv=new \DateTime($dtx->format('Y-m-d'));
$exp=new \DateTime($dtx->format('Y-m-d'));
$exp->modify('+1 year');
$exp->modify('-1 day');
$dataAttributes['given']=$gv->format('Y-m-d');
$dataAttributes['expires']=$exp->format('Y-m-d');
$le->setAttributes($dataAttributes);
}else{
$lfd=$le->getLeaveLeft();
$glt=$le->getLeaveEntitlements();
$lday=$type->getDays();
$lfd=$lfd-($glt-$lday);
$le->getLeaveLeft($lfd);
$le->setLeaveEntitlements($lday);
$gv=new \DateTime(($year).'-'.$dtx->format('m-d'));
$exp=new \DateTime(($year+1).'-'.$dtx->format('m-d'));
$exp->modify('-1 day');
$dataAttributes['given']=$gv->format('Y-m-d');
$dataAttributes['expires']=$exp->format('Y-m-d');
$le->setAttributes($dataAttributes);
}
//else if(($year-$dtx)==0){
//$nm=new \DateTime($dtx->format('Y-m-d'));
//$nm=$nm->format('m');
//$nm=(12-$nm)+1;
//$ct=floor($nm/$type->getDays());
//$leaveEntitlement->setLeaveEntitlements($ct);
//$leaveEntitlement->setLeaveLeft($ct);
//$gv=new \DateTime($dtx->format('Y-m-d'));
//$gv->modify('+1 year');
//$exp=new \DateTime(($year+2).'-03-31');
//$dataAttributes['given']=$gv->format('Y-m-d');
//$dataAttributes['expires']=$exp->format('Y-m-d');
//}
//}
}
}
$this->entityManager->persist($le);
$this->entityManager->flush();
}
$add = true;
}
}
if ($add) {
return $leaveEntitlement;
} else {
return false;
}
}*/
private function _add_leave_data($user, $year, $expire, $type, $parent = array(null, 0), $oldent=null)
{
if($oldent==null){
$oldent=new leaveEntitlement();
}
return $oldent;
}
public function saveUserLeave(\App\Entity\User $user,$year = '')
{
$office = $user->getOffice();
if($year==''){
$year = date("Y");
}
if ($office != null) {
$leaveType = $this->entityManager->getRepository(LeaveType::class)->findBy(array('office' => $office, 'parent' => array(null, 0)));
for ($i = -1; $i < 1; $i++) {
$expire = $this->_expire($year + $i);
foreach ($leaveType as $l) {
$leave = $this->_add_leave_data($user, ($year + $i), $expire, $l, array(null, 0), true);
if(!is_bool($leave)){
if(is_array($leave)){
foreach($leave as $lll){
$childType = $this->entityManager->getRepository(LeaveType::class)->findBy(array('office' => $office, 'parent' => array($l->getId())));
if (count($childType) > 0) {
foreach ($childType as $c) {
$cleave = $this->_add_leave_data($user, ($year + $i), $expire, $c,$lll->getId() , true);
}
}
}
}else{
$childType = $this->entityManager->getRepository(LeaveType::class)->findBy(array('office' => $office, 'parent' => array($l->getId())));
if (count($childType) > 0) {
foreach ($childType as $c) {
$cleave = $this->_add_leave_data($user, ($year + $i), $expire, $c,$leave->getId() , true);
}
}
}
}
}
/*foreach ($leaveType as $l) {
$childType = $this->entityManager->getRepository(LeaveType::class)->findBy(array('office' => $office, 'parent' => array($l->getId())));
if (count($childType) > 0) {
foreach ($childType as $c) {
$cleave = $this->_add_leave_data($user, ($year + $i), $expire, $c,$l->getId() , true);
}
}
}*/
}
}
}
public function setAnnualSickLeave($office)
{
// get office leave data
$officeLeave = $office->getOfficeLeave();
$office = $officeLeave->getOffice();
// check leave type data
$leaveTypeAnnual = $this->entityManager->getRepository(LeaveType::class)->findOneBy(array('leaveName' => 'annual', 'office' => $office));
$leaveTypeSick = $this->entityManager->getRepository(LeaveType::class)->findOneBy(array('leaveName' => 'sick', 'office' => $office));
// create data leave type
if (is_null($leaveTypeAnnual) && is_null($leaveTypeSick)) {
$leaveTypeAnnual = new LeaveType();
$leaveTypeAnnual->setLeaveName('annual');
$leaveTypeAnnual->setOffice($office);
$leaveTypeAnnual->setIsActive(true);
$leaveTypeAnnual->setIsMandatory(true);
$dataAttributes = [
"mode" => "period",
"label" => 'Annual',
"isIncremental" => $officeLeave->getIsIncremental(),
"incrementalStart" => $officeLeave->getIncrementalStart(),
"incrementalValue" => $officeLeave->getIncrementalValue(),
];
$leaveTypeAnnual->setDays($officeLeave->getAnnualDays());
$leaveTypeAnnual->setAttributes($dataAttributes);
$leaveTypeAnnual->setCreatedAt(new \DateTime());
$this->entityManager->persist($leaveTypeAnnual);
$this->entityManager->flush();
$leaveTypeAnniversary = new LeaveType();
$leaveTypeAnniversary->setLeaveName('anniversary');
$leaveTypeAnniversary->setOffice($office);
$leaveTypeAnniversary->setIsActive(true);
$leaveTypeAnniversary->setIsMandatory(true);
$dataAttributes = [
"mode" => "anniversary",
"label" => 'Bonus',
"isIncremental" => true,
"incrementalStart" => 1,
"incrementalValue" => 1,
"hide" => true
];
$leaveTypeAnniversary->setDays(1);
$leaveTypeAnniversary->setAttributes($dataAttributes);
$leaveTypeAnniversary->setCreatedAt(new \DateTime());
$leaveTypeAnniversary->setParent($leaveTypeAnnual->getID());
$this->entityManager->persist($leaveTypeAnniversary);
$this->entityManager->flush();
$leaveTypeSick = new LeaveType();
$leaveTypeSick->setLeaveName('sick');
$leaveTypeSick->setOffice($office);
$leaveTypeSick->setIsActive(true);
$leaveTypeSick->setIsMandatory(true);
$leaveTypeSick->setDays($officeLeave->getSickDays());
$dataAttributes = [
"mode" => "fix",
"label" => 'Sick',
"deductedafter" => 1,
"keepyear" => true,
"hide" => true,
];
$leaveTypeSick->setAttributes($dataAttributes);
$leaveTypeSick->setCreatedAt(new \DateTime());
$this->entityManager->persist($leaveTypeSick);
$this->entityManager->flush();
}
// create entitlement where data zero
$usersOffice = $office->getAllUser();
$year = date("Y");
for ($i = -1; $i < 1; $i++) {
foreach ($usersOffice as $user) {
$expire = $this->_expire($year + $i);
$leaveType = $this->entityManager->getRepository(LeaveType::class)->findBy(array('office' => $office, 'parent' => array(null, 0)));
foreach ($leaveType as $l) {
$leave = $this->_add_leave_data($user, ($year + $i), $expire, $l);
if ($leave !== false) {
if (is_array($leave)) {
foreach ($leave as $lv) {
$parent = $lv->getId();
$childType = $this->entityManager->getRepository(LeaveType::class)->findBy(array('office' => $office, 'parent' => array($l->getId())));
if (count($childType) > 0) {
foreach ($childType as $c) {
$cleave = $this->_add_leave_data($user, ($year + $i), $expire, $c, $parent);
}
}
}
} else {
$parent = $leave->getId();
$childType = $this->entityManager->getRepository(LeaveType::class)->findBy(array('office' => $office, 'parent' => array($l->getId())));
if (count($childType) > 0) {
foreach ($childType as $c) {
$cleave = $this->_add_leave_data($user, ($year + $i), $expire, $c, $parent);
}
}
}
}
}
}
}
}
public function getQuotaLeave($user)
{
$year = date("Y");
$leaves = $this->entityManager->getRepository(LeaveEntitlement::class)->findBy(['user' => $user, 'year' => $year]);
$quota = 0;
foreach ($leaves as $leave) {
if ($leave->getAttributes()['label'] == 'Annual') {
$quota += $leave->getLeaveEntitlements();
}
if ($leave->getAttributes()['label'] == 'Bonus') {
$quota += $leave->getLeaveEntitlements();
}
}
return $quota;
}
public function getQuotaLeaveLeft($user)
{
$year = date("Y");
$leaves = $this->entityManager->getRepository(LeaveEntitlement::class)->findBy(['user' => $user, 'year' => $year]);
$quota = 0;
foreach ($leaves as $leave) {
if ($leave->getAttributes()['label'] == 'Annual') {
$quota += $leave->getLeaveLeft();
}
if ($leave->getAttributes()['label'] == 'Bonus') {
$quota += $leave->getLeaveLeft();
}
}
return $quota;
}
public function getTotalLeaveLeft($user, $leaveType)
{
$year = date("Y");
$leaves = $this->entityManager->getRepository(LeaveEntitlement::class)->findOneBy(['user' => $user, 'year' => $year, 'leaveType' => $leaveType]);
$quota = 0;
$quota = $leaves->getLeaveLeft();
return $quota;
}
public function checkEntitlements($user)
{
$userId = $user->getId();
$leaveEntitlement = $this->entityManager->getRepository(LeaveEntitlement::class)->findByUser($userId);
if (!empty($leaveEntitlement)) {
return true;
} else {
return false;
}
}
private function _expire($year)
{
$expire = new \DateTime(date("Y-m-d 00:00:00", strtotime(($year + 1) . "-03-31")));
return $expire;
}
public function defineLeaveEntitlements($user)
{
$useroffice = $user->getOffice();
if ($useroffice != null) {
$officeLeave = $user->getOffice()->getOfficeLeave();
$year = date("Y");
if ($officeLeave != null) {
for ($i = 0; $i < 2; $i++) {
$leaveRow = $this->entityManager->getRepository(LeaveEntitlement::class)->findOneBy(array('user' => $user, 'year' => ($year + $i)));
if ($leaveRow == null) {
$leaveRow = new LeaveEntitlement();
$leaveRow->setUser($user);
$leaveRow->setLeaveEntitlements($officeLeave->getAnnualDays());
$leaveRow->setIsIncremental($officeLeave->getIsIncremental());
$leaveRow->setIncrementalStart($officeLeave->getIncrementalStart());
$leaveRow->setIncrementalValue($officeLeave->getIncrementalValue());
$leaveRow->setAnnualDays($officeLeave->getAnnualDays());
$leaveRow->setsickEntitlements($officeLeave->getSickDays());
$leaveRow->setExpiredAt($this->_expire($year + $i + 1));
$leaveRow->setYear($year + $i);
$leaveRow->setLeaveLeft($officeLeave->getAnnualDays());
$leaveRow->setSickLeft($officeLeave->getSickDays());
$leaveRow->setCreatedBy($user);
$leaveRow->setCreatedAt(new \DateTime());
$this->entityManager->persist($leaveRow);
$this->entityManager->flush();
}
}
}
}
}
public function getCountries()
{
$country = Countries::getNames();
$country_choices = array_flip($country);
$countries = $this->entityManager->getRepository(Office::class)->findCountries();
// $countries = array_unique($countries);
$countries = array_map("unserialize", array_unique(array_map("serialize", $countries)));
$countries = array_column($countries, 'country');
$data = [];
foreach ($country_choices as $country => $covalue) {
foreach ($countries as $choice => $cvalue) {
if ($cvalue == $covalue) {
$data += [$country => $covalue];
}
}
}
return $data;
}
public function getLeaveLeft($user, $leaveType)
{
// $office = $user->getOffice();
// $leaveTypeRow = $this->entityManager->getRepository(LeaveType::class)->findOneBy(array('leaveName'=>$leaveType, 'office'=>$office));
$leaveEntitlement = $this->entityManager->getRepository(LeaveEntitlement::class)->findOneBy(array('user' => $user, 'leaveType' => $leaveType));
if (!empty($leaveEntitlement)) {
$leaveLeft = $leaveEntitlement->getLeaveLeft();
} else {
$leaveLeft = 0;
}
return $leaveLeft;
// $leaveEntitlement = $this->entityManager->getRepository(LeaveEntitlement::class)->findByUser($userId);
// if (!empty($leaveEntitlement)){
// $leaveLeft = $leaveEntitlement[0]->getLeaveLeft();
// }
// else {
// $leaveLeft = 0;
// }
// return $leaveLeft;
}
public function updateRequestApproved($user, $leaveType)
{
$userId = $user->getId();
// $office = $user->getOffice();
$result['status'] = 'OK';
// get leave approved
$leaveUsed = $this->entityManager->getRepository(LeaveRequest::class)->findLeaveApproved($userId);
if (!empty($leaveUsed)) {
$leaveApproved = $leaveUsed[0]['LeaveApprovedDays'];
} else {
$leaveApproved = '0';
}
// update leave approved to entitlement
// $leaveEntitlement = $this->entityManager->getRepository(LeaveEntitlement::class)->findByUser($userId);
// $leaveTypeRow = $this->entityManager->getRepository(LeaveType::class)->findOneBy(array('leaveName'=>$leaveType, 'office'=>$office));
$leaveEntitlement = $this->entityManager->getRepository(LeaveEntitlement::class)->findOneBy(array('user' => $user, 'leaveType' => $leaveType));
if (!empty($leaveEntitlement)) {
$leaveEntitlement->setLeaveApproved($leaveApproved);
$leaveLeft = $leaveEntitlement->getLeaveEntitlements() - $leaveApproved;
$leaveEntitlement->setLeaveLeft($leaveLeft);
$this->entityManager->flush();
} else {
$result['status'] = 'ERROR';
$result['message'] = 'Entitlement Empty. Please create holiday entitlement first!';
}
return $result;
}
public function getMcLeft($userId)
{
$leaveEntitlement = $this->entityManager->getRepository(LeaveEntitlement::class)->findByUser($userId);
if (!empty($leaveEntitlement)) {
$mcLeft = $leaveEntitlement[0]->getSickLeft();
} else {
$mcLeft = 0;
}
return $mcLeft;
}
public function updateMcJustified($user)
{
$userId = $user->getId();
$office = $user->getOffice();
$year = date("Y");
$mcTaken = $this->entityManager->getRepository(LeaveMCRecord::class)->findMcTaken($userId);
if (!empty($mcTaken)) {
$mcJustified = $mcTaken[0]['mcTakenDays'];
} else {
$mcJustified = 0;
}
$leaveType = $this->entityManager->getRepository(LeaveType::class)->findOneBy(array('leaveName' => 'sick', 'office' => $office));
$leaveSickEntitlement = $this->entityManager->getRepository(LeaveEntitlement::class)->findOneBy(array('user' => $user, 'year' => $year, 'leaveType' => $leaveType));
if (!empty($leaveSickEntitlement)) {
$leaveSickEntitlement->setLeaveApproved($mcJustified);
$leaveLeft = $leaveSickEntitlement->getLeaveEntitlements() - $mcJustified;
$leaveSickEntitlement->setLeaveLeft($leaveLeft);
$this->entityManager->flush();
}
}
public function importXLS($inputFileName, $option = array())
{
/* usage
file: exp test.xlsx
option:
array(
"entity"=>"entityname"
"filter"=>"date"
);
filter to check if have the same data, yes=>will be update, no=>add new data
*/
$default = array(
/*'column'=>array(
'description'=>'LeaveBankHoliday.description',
'date'=>'LeaveBankHoliday.date',
'location'=>'LeaveBankHoliday.location',
),*/
'auto' => true,
'entity' => '',
'filter' => 'date'
);
$options = $default;
foreach ($option as $k => $v) {
$options[$k] = $v;
}
$allowedMime = [
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
'application/octet-stream'
];
if ($inputFileName != null) {
if (strtolower($inputFileName->getClientOriginalExtension()) == 'xlsx' && in_array($inputFileName->getMimeType(), $allowedMime)) {
$em = $this->entityManager;
$reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader('Xlsx');
$reader->setReadDataOnly(true);
$spreadsheet = $reader->load($inputFileName);
$worksheet = $spreadsheet->getActiveSheet();
$highestRow = $worksheet->getHighestRow();
$highestColumn = $worksheet->getHighestColumn();
$highestColumnIndex = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::columnIndexFromString($highestColumn);
if (($options['auto']) && ($options['entity'] != '')) {
$class = '\\App\\Entity\\' . $options['entity'];
$options['column'] = array();
$collist = $em->getClassMetadata($class)->fieldMappings;
for ($col = 1; $col <= $highestColumnIndex; $col++) {
$value = $worksheet->getCellByColumnAndRow($col, 1)->getValue();
if (isset($collist[$value])) {
$options['column'][strtolower($value)] = $options['entity'] . '.' . $value;
}
}
}
$entity = array();
foreach ($options['column'] as $o) {
$o = explode('.', $o);
if (!isset($entity[$o[0]])) {
$class = '\\App\\Entity\\' . $o[0];
$entity[$o[0]] = array();
$entity[$o[0]]['entity'] = $em->getRepository($class);
$entity[$o[0]]['column'] = $em->getClassMetadata($class)->fieldMappings;
//$entity[$o[0]]=$em->getRepository(\App\Entity\LeaveBankHoliday::class);
}
}
$value = $worksheet->getCellByColumnAndRow(2, 2)->getValue();
//$isdate=\PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($value);
//$value=$worksheet->getCellByColumnAndRow(2,2)->getDataType();
$result = array();
//search cols
$collist = array();
if (($highestRow > 0) && ($highestColumnIndex > 0)) {
for ($col = 1; $col <= $highestColumnIndex; $col++) {
$value = $worksheet->getCellByColumnAndRow($col, 1)->getValue();
$value = trim($value);
$value = strtolower($value);
if (isset($options['column'][$value])) {
$o = $options['column'][$value];
$o = explode('.', $o);
$collist[$value] = array();
$collist[$value]['number'] = $col;
$collist[$value]['entity'] = $o[0];
$collist[$value]['column'] = $o[1];
$collist[$value]['type'] = $entity[$o[0]]['column'][$value]['type'];
$collist[$value]['field'] = 'set' . strtoupper(substr($o[1], 0, 1)) . substr($o[1], 1, strlen($o[1]) - 1);
$collist[$value]['fieldget'] = 'get' . strtoupper(substr($o[1], 0, 1)) . substr($o[1], 1, strlen($o[1]) - 1);
}
}
}
if (isset($options['filter'])) {
if (is_array($options['filter'])) {
} else {
if (isset($collist[strtolower($options['filter'])])) {
$entity[$collist[strtolower($options['filter'])]['entity']]['filter'] = array();
$entity[$collist[strtolower($options['filter'])]['entity']]['filter'][$options['filter']] = null;
}
}
}
//$xcol=$em->getClassMetadata('\App\Entity\LeaveBankHoliday')->fieldMappings;
for ($row = 1; $row <= $highestRow; $row++) {
if ($row > 1) {
$class = '';
$input = array();
foreach ($entity as $k => $v) {
if (isset($v['filter'])) {
$filter = $v['filter'];
foreach ($filter as $kf => $vf) {
$cellv = $worksheet->getCellByColumnAndRow($collist[$kf]['number'], $row)->getValue();
if ($collist[$kf]['type'] != 'date') {
$filter[$kf] = $cellv;
} else {
$dt = \PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($cellv);
$filter[$kf] = $dt;
}
}
$input[$k] = $v['entity']->findBy($filter, null, 1);
if ($input[$k] == null) {
$class = '\\App\\Entity\\' . $k;
$input[$k] = new $class();
} else {
$input[$k] = $input[$k][0];
}
} else {
$class = '\\App\\Entity\\' . $k;
$input[$k] = new $class();
}
//
}
//$input=new $class();
$num = count($result);
$result[$num] = array();
foreach ($collist as $colname => $col) {
$value = $worksheet->getCellByColumnAndRow($col['number'], $row)->getValue();
if ($col["type"] != 'date') {
if ($value != null) {
$input[$col['entity']]->{$col["field"]}($value);
$result[$num][$col['column']] = $value;
} else {
$input[$col['entity']]->{$col["field"]}([]);
$result[$num][$col['column']] = $value;
}
} else {
if ($value != null) {
$dt = \PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($value);
$input[$col['entity']]->{$col["field"]}($dt);
$result[$num][$col['column']] = $dt->format('Y-m-d');
$result[$num][$col['column'] . '_formatdate'] = $dt->format('d F Y');
} else {
$dt = new \DateTime('0000-00-00');
$input[$col['entity']]->{$col["field"]}($dt);
$result[$num][$col['column']] = $dt->format('Y-m-d');
$result[$num][$col['column'] . '_formatdate'] = $dt->format('d F Y');
}
}
}
foreach ($input as $inp) {
$ok = true;
if ($inp->getDate() == null) {
$ok = false;
}
if ($inp->getDescription() == null) {
$ok = false;
}
if ($inp->getDescription() != null) {
if (trim($inp->getDescription()) == '') {
$ok = false;
}
}
if ($inp->getDate() != null) {
if ($inp->getDate()->format('Y-m-d') == '0000-00-00') {
$ok = false;
}
}
if ($ok) {
$em->persist($inp);
$em->flush();
$result[$num]['id'] = $inp->getId();
}
}
}
}
/*for($row=1; $row <= $highestRow ; $row++){
if($row > 1){
foreach($collist as $colname=>$col){
$value=$worksheet->getCellByColumnAndRow($col['number'],$row)->getValue();
$entity[$col['entity']]->$col['filed']($value);
}
}
foreach($entity as $e){
$em->persist($e);
$em->flush();
}
}*/
/*$tr=new \App\Entity\LeaveBankHoliday();
$tr->setDescription('ID');
$tr->setDate(new \DateTime('2022-10-10'));
$tr->setLocation('ID');
$em->persist($tr);
$em->flush();*/
return $result;
}
}
}
private function _entitlementByUser(\App\Entity\User $users = null, $year)
{
$result = array();
$userlist = array();
if ($users == null) {
$users = $entitlement = $this->entityManager->getRepository(\App\Entity\User::class)->findAllActive();
}
if (!is_array($users)) {
$users = array($users);
}
$leavelist = array();
$leaveentitlement = $this->entityManager->getRepository(\App\Entity\LeaveEntitlement::class)->findBy(array('year' => array($year - 1, $year)));
foreach ($leaveentitlement as $l) {
$uid = $l->getUser()->getId();
$yr = $l->getYear();
$type = $l->getLeaveType();
if ($type != null) {
$type = $l->getLeaveType()->getId();
if (!isset($leavelist['u' . $uid])) {
$leavelist['u' . $uid] = array();
}
if (!isset($leavelist['u' . $uid]['y' . $yr])) {
$leavelist['u' . $uid]['y' . $yr] = array();
}
$leavelist['u' . $uid]['y' . $yr]['t' . $type] = $l;
}
}
$reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader('Xlsx');
$reader->setReadDataOnly(true);
$spreadsheet = $reader->load('../templates/report/entitlement.xlsx');
$worksheet = $spreadsheet->getActiveSheet();
$highrow = $worksheet->getHighestRow();
$highcol = $worksheet->getHighestColumn();
$highestColumnIndex = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::columnIndexFromString($highcol);
$values = array();
$highcols = 0;
$highrows = $highrow;
for ($y = $highrow; $y >= 1; $y--) {
$v = $worksheet->getCellByColumnAndRow(1, $y)->getValue();
if (($v != '') && ($v != null)) {
$highrows = $y;
break;
}
}
$highrow = $highrows;
for ($c = 1; $c <= $highestColumnIndex; $c++) {
$v = $worksheet->getCellByColumnAndRow($c, $highrow)->getValue();
if ($v != '') {
$values[$c] = $v;
$highcols = $c;
}
}
$row = $highrow;
$now = new \DateTime();
$now->setTime(0, 0, 0, 0);
foreach ($leavelist as $k0 => $l0) {
$rcount = $row;
$rfirst = $row;
foreach ($l0['y' . $year] as $k1 => $l1) {
$attr = $l1->getAttributes();
$adder = 1;
for ($c = 1; $c <= $highcols; $c++) {
$cl = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::stringFromColumnIndex($c);
$worksheet->getStyle($cl . $row)->getAlignment()->setVertical(\PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_TOP);
$m = str_replace('-mergemain', '', $values[$c]);
$m = str_replace('-merge', '', $m);
switch ($m) {
case '[location]':
$val = $l1->getUser()->getOffice()->getCountry();
$worksheet->getCellByColumnAndRow($c, $row)->setValue($val);
break;
case '[name]':
$val = $l1->getUser()->getPersonalInfo()->getFullName();
$worksheet->getCellByColumnAndRow($c, $row)->setValue($val);
break;
case '[joindate]':
$val = $l1->getUser()->getPersonalInfo()->getJobJoinDate();
if ($val != null) {
$dt = \PhpOffice\PhpSpreadsheet\Shared\Date::dateTimeToExcel($val);
$worksheet->getCellByColumnAndRow($c, $row)->setValue($dt);
$worksheet->getStyle($cl . $row)
->getNumberFormat()
->setFormatCode('dd mmm yyyy');
} else {
$worksheet->getCellByColumnAndRow($c, $row)->setValue('');
}
break;
case '[leavetype]':
$pl = 0;
if ($l1->getParent() == null) {
$yr1 = $year - 1;
if (isset($leavelist[$k0]['y' . $yr1])) {
$ol = $leavelist[$k0]['y' . $yr1];
if (isset($ol[$k1])) {
$oattr = $ol[$k1]->getAttributes();
if (isset($oattr['exipres'])) {
if (is_array($oattr['expires'])) {
$exp = new DateTime($oattr['expires']['date']);
} else {
$exp = new DateTime($oattr['expires']);
}
$given = new Datetime($attr['given']);
if (($now >= $given) && ($exp >= $now)) {
$pl = 1;
$adder = 2;
$worksheet->getCellByColumnAndRow($c, $row)->setValue('Carry Leave');
}
}
}
}
}
$ty = $l1->getLeaveType()->getLeaveName();
$val = isset($attr['label']) ? $attr['label'] : $ty;
$worksheet->getCellByColumnAndRow($c, $row + $pl)->setValue($val);
break;
case '[left]':
$pl = 0;
$yr1 = $year - 1;
if (isset($leavelist[$k0]['y' . $yr1])) {
if ($l1->getParent() == null) {
$ol = $leavelist[$k0]['y' . $yr1];
if (isset($ol[$k1])) {
$oattr = $ol[$k1]->getAttributes();
if (isset($oattr['exipres'])) {
if (is_array($oattr['expires'])) {
$exp = new DateTime($oattr['expires']['date']);
} else {
$exp = new DateTime($oattr['expires']);
}
$given = new Datetime($attr['given']);
if (($now >= $given) && ($exp >= $now)) {
$pl = 1;
$adder = 2;
$worksheet->getCellByColumnAndRow($c, $row)->setValue($ol[$k1]->getLeaveLeft());
}
}
}
} else {
if (isset($attr['exipres'])) {
if (is_array($attr['expires'])) {
$exp = new DateTime($attr['expires']['date']);
} else {
$exp = new DateTime($attr['expires']);
}
$given = new Datetime($attr['given']);
if (($now >= $given) && ($now <= $exp)) {
$val = $l1->getLeaveLeft();
} else {
$val = $ol[$k1]->getLeaveLeft();
}
}
}
} else {
if (isset($attr['exipres'])) {
if (is_array($attr['expires'])) {
$exp = new DateTime($attr['expires']['date']);
} else {
$exp = new DateTime($attr['expires']);
}
$given = new Datetime($attr['given']);
if (($now >= $given) && ($now <= $exp)) {
$val = $l1->getLeaveLeft();
} else {
$val = 0;
}
} else {
$val = $l1->getLeaveLeft();
}
}
$worksheet->getCellByColumnAndRow($c, $row + $pl)->setValue($val);
break;
case '[given]':
$pl = 0;
$yr1 = $year - 1;
if (isset($leavelist[$k0]['y' . $yr1])) {
if ($l1->getParent() == null) {
$ol = $leavelist[$k0]['y' . $yr1];
if (isset($ol[$k1])) {
$oattr = $ol[$k1]->getAttributes();
if (isset($oattr['exipres'])) {
if (is_array($oattr['expires'])) {
$exp = new DateTime($oattr['expires']['date']);
} else {
$exp = new DateTime($oattr['expires']);
}
$given = new Datetime($attr['given']);
if (($now >= $given) && ($exp >= $now)) {
$pl = 1;
$adder = 2;
$worksheet->getCellByColumnAndRow($c, $row)->setValue($ol[$k1]->getLeaveEntitlements());
}
}
}
} else {
if (isset($attr['exipres'])) {
if (is_array($attr['expires'])) {
$exp = new DateTime($attr['expires']['date']);
} else {
$exp = new DateTime($attr['expires']);
}
$given = new Datetime($attr['given']);
if (($now >= $given) && ($now <= $exp)) {
$val = $l1->getLeaveEntitlements()();
} else {
$val = $ol[$k1]->getLeaveEntitlements()();
}
}
}
} else {
if (isset($attr['exipres'])) {
if (is_array($attr['expires'])) {
$exp = new DateTime($attr['expires']['date']);
} else {
$exp = new DateTime($attr['expires']);
}
$given = new Datetime($attr['given']);
if (($now >= $given) && ($now <= $exp)) {
$val = $l1->getLeaveEntitlements();
} else {
$val = 0;
}
} else {
$val = $l1->getLeaveEntitlements();
}
}
$val = $l1->getLeaveEntitlements();
$worksheet->getCellByColumnAndRow($c, $row + $pl)->setValue($val);
break;
default:
break;
}
}
$row += $adder;
$rcount += $adder;
}
$rcount = $rcount - 1;
if ($rcount > ($rfirst + 1)) {
for ($c = 1; $c < $highcols; $c++) {
if (strpos($values[$c], '-merge') !== false) {
$cl = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::stringFromColumnIndex($c);
$worksheet->mergeCells($cl . $rfirst . ':' . $cl . $rcount);
}
}
}
}
for ($r = 1; $r < $highrow; $r++) {
for ($c = 1; $c <= $highcols; $c++) {
$v = $worksheet->getCellByColumnAndRow($c, $r)->getValue();
if (($v != '') && ($v != null)) {
switch ($v) {
case '[year]':
$worksheet->getCellByColumnAndRow($c, $r)->setValue($year);
break;
default:
break;
}
}
}
}
$writer = new \PhpOffice\PhpSpreadsheet\Writer\Xlsx($spreadsheet);
ob_start();
$writer->save('php://output');
//return $result;
return ob_get_clean();
}
public function entitlementReport($option = array())
{
$dafault = array(
'year' => date('Y')
);
$result = $this->_entitlementByUser(null, '2022');
return $result;
}
private function _leaveRequestByUser(\App\Entity\User $users = null, $startdate, $enddate)
{
if ($users == null) {
$users = $entitlement = $this->entityManager->getRepository(\App\Entity\User::class)->findAllActive();
}
if (!is_array($users)) {
$users = array($users);
}
$yr1 = new \DateTime($startdate);
$yr1 = $yr1->format('Y');
$yr1 = $yr1 - 1;
$yr2 = new \DateTime($enddate);
$yr2 = $yr2->format('Y');
$yrs = array();
for ($y = $yr1; $y <= $yr2; $y++) {
$yrs[count($yrs)] = $y;
}
$entlist = array();
$entbyid = array();
$entleft = array();
$leaveentitlement = $this->entityManager->getRepository(\App\Entity\LeaveEntitlement::class)->findBy(array('year' => $yrs));
foreach ($leaveentitlement as $l) {
$uid = $l->getUser()->getId();
$yrx = $l->getYear();
$type = $l->getLeaveType();
if ($type != null) {
$type = $l->getLeaveType()->getId();
if (!isset($entlist['u' . $uid])) {
$entlist['u' . $uid] = array();
}
if (!isset($entlist['u' . $uid]['y' . $yrx])) {
$entlist['u' . $uid]['y' . $yrx] = array();
}
$entlist['u' . $uid]['y' . $yrx]['t' . $type] = $l;
if (!isset($entleft['u' . $uid])) {
$entleft['u' . $uid] = array();
}
if (!isset($entleft['u' . $uid]['y' . $yrx])) {
$entleflt['u' . $uid]['y' . $yrx] = array();
}
$entleft['u' . $uid]['y' . $yrx]['t' . $type] = array();
$entleft['u' . $uid]['y' . $yrx]['t' . $type]['given'] = $l->getLeaveEntitlements();
$entleft['u' . $uid]['y' . $yrx]['t' . $type]['left'] = $l->getLeaveEntitlements();
$entleft['u' . $uid]['y' . $yrx]['t' . $type]['rleft'] = $l->getLeaveLeft();
$entleft['u' . $uid]['y' . $yrx]['t' . $type]['rgiven'] = $l->getLeaveLeft();
$entleft['u' . $uid]['y' . $yrx]['t' . $type]['igiven'] = $l->getLeaveLeft();
}
$entbyid['c' . $l->getId()] = $l;
}
$sldate = new \DateTime($startdate);
$slyear = $sldate->format('Y');
$eldate = new \DateTime($enddate);
$elyear = $eldate->format('Y');
$leaverequest = $this->entityManager->getRepository(\App\Entity\LeaveRequest::class);
$lqresult = $this->entityManager->getRepository(\App\Entity\LeaveRequest::class)->createQueryBuilder('a')
->select('a')
->where('a.startDate >= :from')
->andWhere('a.startDate <= :to')
->setParameter('from', new \DateTime($slyear . '-01-01'))
->setParameter('to', new \DateTime($elyear . '-12-31'))
->orderBy('a.startDate')
->getQuery()
->getResult();
$leavelist = array();
foreach ($lqresult as $ll) {
$uid = $ll->getUser()->getId();
if (!isset($leavelist['u' . $uid])) {
$leavelist['u' . $uid] = array();
}
$leavelist['u' . $uid][count($leavelist['u' . $uid])] = $ll;
}
$reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader('Xlsx');
$reader->setReadDataOnly(true);
$spreadsheet = $reader->load('../templates/report/leave.xlsx');
$worksheet = $spreadsheet->getActiveSheet();
$highrow = $worksheet->getHighestRow();
$highcol = $worksheet->getHighestColumn();
$highestColumnIndex = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::columnIndexFromString($highcol);
$values = array();
$highcols = 0;
$highrows = $highrow;
for ($y = $highrow; $y >= 1; $y--) {
$v = $worksheet->getCellByColumnAndRow(1, $y)->getValue();
if (($v != '') && ($v != null)) {
$highrows = $y;
break;
}
}
$highrow = $highrows;
for ($c = 1; $c <= $highestColumnIndex; $c++) {
$v = $worksheet->getCellByColumnAndRow($c, $highrow)->getValue();
if ($v != '') {
$values[$c] = $v;
$highcols = $c;
}
$worksheet->getCellByColumnAndRow($c, $highrow)->setValue('');
}
$row = $highrow;
$now = new \DateTime();
$now->setTime(0, 0, 0, 0);
//left calculation
$dataleft = array();
foreach ($lqresult as $l) {
$lid = $l->getId();
$uid = $l->getUser()->getId();
$ty = $l->getLeaveType()->getId();
$dataleft['l' . $lid] = array();
$allo = $l->getAlocation();
if ($allo == null) {
$allo = array();
}
$sl = $l->getStartDate();
$sy = $sl->format('Y');
foreach ($allo as $k => $a) {
switch ($k) {
case 'data':
break;
case 'dumper':
break;
case 'error':
break;
case 'type':
break;
case 'child':
break;
case 'unpaid':
break;
default:
$yy = str_replace('y', '', $k);
if (isset($endleft['u' . $uid]['y' . ($yy - 1)])) {
$endleft['u' . $uid]['y' . ($yy - 1)]['t' . $ty]['rgiven'] += $a;
$endleft['u' . $uid]['y' . ($yy - 1)]['t' . $ty]['igiven'] += $a;
}
break;
}
}
}
foreach ($leavelist as $k => $l) {
$rcount = $row;
$rfirst = $row;
foreach ($l as $l1) {
$alocation = $l1->getAlocation();
$okshow = false;
if (($l1->getStartDate() >= $sldate) && ($l1->getEndDate() <= $eldate)) {
$okshow = true;
}
if ($alocation == null) {
$alocation = array();
}
$addrow = array();
if ($l1->getLeaveType()->getLeaveName() != 'sick') {
if (!is_null($l1->getIsApproved())) {
if (($l1->getIsApproved() == false) || ($l1->getIsApproved() == 0)) {
$okshow = false;
}
}
}
for ($c = 1; $c <= $highcols; $c++) {
$cl = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::stringFromColumnIndex($c);
$worksheet->getStyle($cl . $row)->getAlignment()->setVertical(\PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_TOP);
$m = str_replace('-mergemain', '', $values[$c]);
$m = str_replace('-merge', '', $m);
switch ($m) {
case '[location]':
if ($okshow) {
$val = $l1->getUser()->getOffice()->getCountry();
$worksheet->getCellByColumnAndRow($c, $row)->setValue($val);
}
break;
case '[name]':
if ($okshow) {
$val = $l1->getUser()->getPersonalInfo()->getFullName();
$worksheet->getCellByColumnAndRow($c, $row)->setValue($val);
}
break;
case '[startdate]':
$val = $l1->getStartDate();
if ($okshow) {
if ($val != null) {
$dt = \PhpOffice\PhpSpreadsheet\Shared\Date::dateTimeToExcel($val);
$worksheet->getCellByColumnAndRow($c, $row)->setValue($dt);
$worksheet->getStyle($cl . $row)
->getNumberFormat()
->setFormatCode('dd mmm yyyy');
} else {
$worksheet->getCellByColumnAndRow($c, $row)->setValue('');
}
}
break;
case '[enddate]':
$val = $l1->getEndDate();
if ($okshow) {
if ($val != null) {
$dt = \PhpOffice\PhpSpreadsheet\Shared\Date::dateTimeToExcel($val);
$worksheet->getCellByColumnAndRow($c, $row)->setValue($dt);
$worksheet->getStyle($cl . $row)
->getNumberFormat()
->setFormatCode('dd mmm yyyy');
} else {
$worksheet->getCellByColumnAndRow($c, $row)->setValue('');
}
}
break;
case '[days]':
$val = $l1->getLeaveType()->getId();
$sdate = $l1->getStartDate()->format('Y');
if (isset($alocation['child'])) {
if (isset($alocation['child']['y' . $sdate])) {
if (count($alocation['child']['y' . $sdate]) > 0) {
foreach ($alocation['child']['y' . $sdate] as $ckey => $chd) {
if (!isset($addrow[$c])) {
$addrow[$c] = 0;
}
if ($okshow) {
$worksheet->getCellByColumnAndRow($c, $row + $addrow[$c])->setValue($chd);
}
$addrow[$c]++;
}
}
}
}
if (isset($alocation['y' . ($sdate - 1)])) {
if (isset($entlist[$k])) {
if (isset($entlist[$k]['y' . ($sdate - 1)])) {
if (isset($entlist[$k]['y' . ($sdate - 1)]['t' . $val])) {
if (!isset($addrow[$c])) {
$addrow[$c] = 0;
}
if ($okshow) {
$worksheet->getCellByColumnAndRow($c, $row + $addrow[$c])->setValue($alocation['y' . ($sdate - 1)]);
}
$addrow[$c]++;
}
}
}
}
$unpaid = false;
if (isset($alocation['unpaid'])) {
if (isset($alocation['unpaid']['y' . $sdate])) {
$unpaid = true;
}
}
if (isset($alocation['y' . $sdate]) || $unpaid) {
if (isset($entlist[$k])) {
if (isset($entlist[$k]['y' . $sdate])) {
if (isset($entlist[$k]['y' . $sdate]['t' . $val])) {
if (!isset($addrow[$c])) {
$addrow[$c] = 0;
}
if ($okshow) {
$vl = isset($alocation['y' . $sdate]) ? $alocation['y' . $sdate] : 0;
if ($unpaid) {
$vl += $alocation['unpaid']['y' . $sdate]['value'];
}
$worksheet->getCellByColumnAndRow($c, $row + $addrow[$c])->setValue($vl);
}
$addrow[$c]++;
}
}
}
}
break;
case '[leavetype]':
$lbl = '';
$val = $l1->getLeaveType()->getId();
$nm = $l1->getLeaveType()->getLeaveName();
$sdate = $l1->getStartDate()->format('Y');
if (isset($alocation['child'])) {
if (isset($alocation['child']['y' . $sdate])) {
if (count($alocation['child']['y' . $sdate]) > 0) {
foreach ($alocation['child']['y' . $sdate] as $ckey => $chd) {
$chid = $entbyid[$ckey]->getLeaveType()->getId();
$chnm = $entbyid[$ckey]->getLeaveType()->getLeaveName();
$chattr = $entbyid[$ckey]->getAttributes();
$chlbl = isset($chattr['label']) ? $chattr['label'] : $chnm;
if (!isset($addrow[$c])) {
$addrow[$c] = 0;
}
if ($okshow) {
$worksheet->getCellByColumnAndRow($c, $row + $addrow[$c])->setValue($chlbl);
}
$addrow[$c]++;
}
}
}
}
if (isset($alocation['y' . ($sdate - 1)])) {
if (isset($entlist[$k])) {
if (isset($entlist[$k]['y' . ($sdate - 1)])) {
if (isset($entlist[$k]['y' . ($sdate - 1)]['t' . $val])) {
$lbl = 'Carry Offer';
if (!isset($addrow[$c])) {
$addrow[$c] = 0;
}
if ($okshow) {
$worksheet->getCellByColumnAndRow($c, $row + $addrow[$c])->setValue($lbl);
}
$addrow[$c]++;
}
}
}
}
$unpaid = false;
if (isset($alocation['unpaid'])) {
if (isset($alocation['unpaid']['y' . $sdate])) {
$unpaid = true;
}
}
if (isset($alocation['y' . $sdate]) || $unpaid) {
if (isset($entlist[$k])) {
if (isset($entlist[$k]['y' . $sdate])) {
if (isset($entlist[$k]['y' . $sdate]['t' . $val])) {
$lbl = $entlist[$k]['y' . $sdate]['t' . $val]->getAttributes();
$lbl = isset($lbl['label']) ? $lbl['label'] : $nm;
if (!isset($addrow[$c])) {
$addrow[$c] = 0;
}
if ($okshow) {
$worksheet->getCellByColumnAndRow($c, $row + $addrow[$c])->setValue($lbl);
}
$addrow[$c]++;
}
}
}
}
break;
case '[given]':
$val = $l1->getLeaveType()->getId();
$sdate = $l1->getStartDate()->format('Y');
if (isset($alocation['child'])) {
if (isset($alocation['child']['y' . $sdate])) {
if (count($alocation['child']['y' . $sdate]) > 0) {
foreach ($alocation['child']['y' . $sdate] as $ckey => $chd) {
$chlbl = $entbyid[$ckey]->getLeaveEntitlements();
if (!isset($addrow[$c])) {
$addrow[$c] = 0;
}
if ($okshow) {
$worksheet->getCellByColumnAndRow($c, $row + $addrow[$c])->setValue($chlbl);
}
$addrow[$c]++;
}
}
}
}
if (isset($alocation['y' . ($sdate - 1)])) {
if (isset($entlist[$k])) {
if (isset($entlist[$k]['y' . ($sdate - 1)])) {
if (isset($entlist[$k]['y' . ($sdate - 1)]['t' . $val])) {
$lbl = $entleft[$k]['y' . ($sdate - 1)]['t' . $val]['rgiven'];
if (!isset($addrow[$c])) {
$addrow[$c] = 0;
}
if ($okshow) {
$worksheet->getCellByColumnAndRow($c, $row + $addrow[$c])->setValue($lbl);
}
$addrow[$c]++;
}
}
}
}
$unpaid = false;
if (isset($alocation['unpaid'])) {
if (isset($alocation['unpaid']['y' . $sdate])) {
$unpaid = true;
}
}
if (isset($alocation['y' . $sdate]) || $unpaid) {
if (isset($entlist[$k])) {
if (isset($entlist[$k]['y' . $sdate])) {
if (isset($entlist[$k]['y' . $sdate]['t' . $val])) {
$lbl = $entlist[$k]['y' . $sdate]['t' . $val]->getLeaveEntitlements();
if (!isset($addrow[$c])) {
$addrow[$c] = 0;
}
if ($okshow) {
$worksheet->getCellByColumnAndRow($c, $row + $addrow[$c])->setValue($lbl);
}
$addrow[$c]++;
}
}
}
}
break;
case '[left]':
$val = $l1->getLeaveType()->getId();
$sdate = $l1->getStartDate()->format('Y');
if (isset($alocation['child'])) {
if (isset($alocation['child']['y' . $sdate])) {
if (count($alocation['child']['y' . $sdate]) > 0) {
foreach ($alocation['child']['y' . $sdate] as $ckey => $chd) {
$cty = $entbyid[$ckey]->getLeaveType()->getId();
if (isset($entleft[$k]['y' . $sdate])) {
if (isset($entleft[$k]['y' . $sdate]['t' . $cty])) {
$entleft[$k]['y' . $sdate]['t' . $cty]['left'] -= $chd;
$chlbl = $entleft[$k]['y' . $sdate]['t' . $cty]['left'];
if (!isset($addrow[$c])) {
$addrow[$c] = 0;
}
if ($okshow) {
if ($lbl < 0) {
$lbl = 0;
}
$worksheet->getCellByColumnAndRow($c, $row + $addrow[$c])->setValue($chlbl);
}
$addrow[$c]++;
}
}
}
}
}
}
if (isset($alocation['y' . ($sdate - 1)])) {
if (isset($entlist[$k])) {
if (isset($entlist[$k]['y' . ($sdate - 1)])) {
if (isset($entlist[$k]['y' . ($sdate - 1)]['t' . $val])) {
if (isset($entleft[$k]['y' . ($sdate - 1)])) {
if (isset($entleft[$k]['y' . ($sdate - 1)]['t' . $val])) {
$entleft[$k]['y' . ($sdate - 1)]['t' . $val]['igiven'] -= $alocation['y' . ($sdate - 1)];
$lbl = $entleft[$k]['y' . ($sdate - 1)]['t' . $val]['igiven'];
if (!isset($addrow[$c])) {
$addrow[$c] = 0;
}
if ($okshow) {
if ($lbl < 0) {
$lbl = 0;
}
$worksheet->getCellByColumnAndRow($c, $row + $addrow[$c])->setValue($lbl);
}
$addrow[$c]++;
}
}
}
}
}
}
$unpaid = false;
if (isset($alocation['unpaid'])) {
if (isset($alocation['unpaid']['y' . $sdate])) {
$unpaid = true;
}
}
if (isset($alocation['y' . $sdate]) || $unpaid) {
if (isset($entlist[$k])) {
if (isset($entlist[$k]['y' . $sdate])) {
if (isset($entlist[$k]['y' . $sdate]['t' . $val])) {
if (isset($entleft[$k]['y' . $sdate]['t' . $val])) {
$vl = isset($alocation['y' . $sdate]) ? $alocation['y' . $sdate] : 0;
$entleft[$k]['y' . $sdate]['t' . $val]['left'] -= $vl;
$lbl = $entleft[$k]['y' . $sdate]['t' . $val]['left'];
if (!isset($addrow[$c])) {
$addrow[$c] = 0;
}
if ($okshow) {
if ($lbl < 0) {
$lbl = 0;
}
$worksheet->getCellByColumnAndRow($c, $row + $addrow[$c])->setValue($lbl);
}
$addrow[$c]++;
}
}
}
}
}
break;
case '[unpaid]':
if (isset($alocation['unpaid'])) {
if (isset($alocation['unpaid']['y' . $sdate])) {
if ($okshow) {
$worksheet->getCellByColumnAndRow($c, $row)->setValue($alocation['unpaid']['y' . $sdate]['value']);
}
}
}
$attrlv = $l1->getLeaveType()->getAttributes();
$sdate = $l1->getStartDate()->format('Y');
if ($attrlv != null) {
if (isset($attrlv['deductedafter'])) {
if ($okshow) {
$dy = $l1->getDays();
$dyok = false;
$dy = $dy - $attrlv['deductedafter'];
if ($entleft[$k]['y' . $sdate]['t' . $l1->getLeaveType()->getId()]['left'] < 0) {
$dy = $l1->getDays();
}
if (!is_null($l1->getIsApproved())) {
if (($l1->getIsApproved() == true) || ($l1->getIsApproved() == 1)) {
$dy = 0;
}
}
if ($dy > 0) {
$worksheet->getCellByColumnAndRow($c, $row)->setValue($dy);
}
}
}
}
break;
default:
break;
}
}
if ($okshow) {
if (count($addrow) > 0) {
$mx = max($addrow);
for ($c = 1; $c <= $highcols; $c++) {
if (strpos($values[$c], '-merge') !== false) {
$rr = ($row + $mx) - 1;
$cl = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::stringFromColumnIndex($c);
$worksheet->mergeCells($cl . $row . ':' . $cl . $rr);
}
}
$row += $mx;
} else {
$row++;
}
}
}
}
for ($r = 1; $r < $highrow; $r++) {
for ($c = 1; $c <= $highcols; $c++) {
$v = $worksheet->getCellByColumnAndRow($c, $r)->getValue();
if (($v != '') && ($v != null)) {
switch ($v) {
case '[periode]':
$txt = $sldate->format('d F Y') . ' - ' . $eldate->format('d F Y');
$worksheet->getCellByColumnAndRow($c, $r)->setValue($txt);
break;
default:
break;
}
}
}
}
$writer = new \PhpOffice\PhpSpreadsheet\Writer\Xlsx($spreadsheet);
ob_start();
$writer->save('php://output');
//return $result;
return ob_get_clean();
}
public function leaveReport($option)
{
$option = base64_decode($option);
$option = json_decode($option);
$default = array(
'start' => date('Y') . '-01-01',
'end' => date('Y') . '-12-31',
'user' => null
);
$opt = $default;
foreach ($option as $k => $v) {
$opt[$k] = $v;
}
$result = $this->_leaveRequestByUser($opt['user'], $opt['start'], $opt['end']);
return $result;
}
public function upcomingReport($option){
$option = base64_decode($option);
$option = json_decode($option);
/*$option = base64_decode($option);
$option = json_decode($option);*/
$default = array(
'start' => date('Y') . '-01-01',
'end' => date('Y') . '-12-31',
'user' => null
);
$opt = $default;
foreach ($option as $k => $v) {
$opt[$k] = $v;
}
$sldate=new \DateTime($opt['start']);
$eldate=new \DateTime($opt['end']);
$data=array();
$leaverequest = $this->entityManager->getRepository(\App\Entity\LeaveRequest::class)->findLeaveByDate(array(
array(
'start'=>$sldate,
'end'=>$eldate
)
));
if(!is_null($leaverequest)){
foreach($leaverequest as $r){
$obj=array();
$startdate=$r->getStartDate();
$enddate=$r->getEndDate();
$obj['sort']=$startdate->format('Ymd');
$obj['startdate']= \PhpOffice\PhpSpreadsheet\Shared\Date::dateTimeToExcel($startdate);
$obj['enddate']= \PhpOffice\PhpSpreadsheet\Shared\Date::dateTimeToExcel($enddate);
$obj['days']=$r->getDays();
$obj['name']=$r->getUser()->getPersonalInfo()->getFullName();
$leavetype=$r->getLeaveType();
$attr=$leavetype->getAttributes();
$lvtype='';
if(isset($attr['label'])){$lvtype=$attr['label'];}else{$lvtype=$leavetype->getLeaveName();}
$obj['leavetype']=$lvtype;
$obj['location']=$r->getUser()->getOffice()->getCountry();
array_push($data,$obj);
}
}
$holiday = $this->entityManager->getRepository(\App\Entity\LeaveBankHoliday::class)->findLeaveByDate(array(
array(
'start'=>$sldate,
'end'=>$eldate
)
));
if(!is_null($holiday)){
foreach($holiday as $r){
$obj=array();
$startdate=$r->getdate();
$enddate=$r->getEndDate();
if(is_null($enddate)){
$enddate=$r->getdate();
}
$obj['sort']=$startdate->format('Ymd');
$obj['startdate']= \PhpOffice\PhpSpreadsheet\Shared\Date::dateTimeToExcel($startdate);
$obj['enddate']= \PhpOffice\PhpSpreadsheet\Shared\Date::dateTimeToExcel($enddate);
$df=date_diff($enddate,$startdate);
$obj['days']=abs($df->d);
$obj['name']=$r->getDescription();
$lvtype='PH';
$obj['leavetype']=$lvtype;
$obj['location']=$r->getLocation();
array_push($data,$obj);
}
}
usort($data,function($a,$b){
if($a['sort']==$b['sort']){return 0;}
return ($a['sort']<$b['sort'])?-1:1;
});
//converter
$reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader('Xlsx');
$reader->setReadDataOnly(true);
$spreadsheet = $reader->load('../templates/report/upcoming.xlsx');
$worksheet = $spreadsheet->getActiveSheet();
$highrow = $worksheet->getHighestRow();
$highcol = $worksheet->getHighestColumn();
$highestColumnIndex = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::columnIndexFromString($highcol);
$values = array();
$highcols = 0;
$highrows = $highrow;
for ($y = $highrow; $y >= 1; $y--) {
$v = $worksheet->getCellByColumnAndRow(1, $y)->getValue();
if (($v != '') && ($v != null)) {
$highrows = $y;
break;
}
}
$highrow = $highrows;
for ($c = 1; $c <= $highestColumnIndex; $c++) {
$v = $worksheet->getCellByColumnAndRow($c, $highrow)->getValue();
if ($v != '') {
$values[$c] = $v;
$highcols = $c;
}
$worksheet->getCellByColumnAndRow($c, $highrow)->setValue('');
}
$row = $highrow;
for ($r = 1; $r < $highrow; $r++) {
for ($c = 1; $c <= $highcols; $c++) {
$v = $worksheet->getCellByColumnAndRow($c, $r)->getValue();
if (($v != '') && ($v != null)) {
switch ($v) {
case '[periode]':
$txt = $sldate->format('d F Y') . ' - ' . $eldate->format('d F Y');
$worksheet->getCellByColumnAndRow($c, $r)->setValue($txt);
break;
default:
break;
}
}
}
}
foreach($data as $d){
for ($c = 1; $c <= $highcols; $c++) {
$v=str_replace(array('[',']'),'',$values[$c]);
if(isset($d[$v])){
$cl = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::stringFromColumnIndex($c);
$worksheet->getCellByColumnAndRow($c, $row)->setValue($d[$v]);
if(($c==1) || ($c==2)){
$worksheet->getStyle($cl . $row)
->getNumberFormat()
->setFormatCode('dd mmm yyyy');
}
}
}
$row++;
}
$writer = new \PhpOffice\PhpSpreadsheet\Writer\Xlsx($spreadsheet);
ob_start();
$writer->save('php://output');
//return $result;
return ob_get_clean();
}
public function exportBankHoliday()
{
$spreadsheet = new \PhpOffice\PhpSpreadsheet\Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->setCellValue('A1', 'description');
$sheet->setCellValue('B1', 'date');
$sheet->setCellValue('C1', 'end date');
$sheet->setCellValue('D1', 'location');
$em = $this->entityManager;
$leavebank = $em->getRepository(\App\Entity\LeaveBankHoliday::class)->findAll();
$row = 2;
foreach ($leavebank as $l) {
$dt = $l->getDate();
$dtend='';
if(!is_null($l->getEndDate())){
$dtend = $l->getEndDate();
}
$dt = \PhpOffice\PhpSpreadsheet\Shared\Date::dateTimeToExcel($dt);
$sheet->setCellValue('A' . $row, $l->getDescription());
$sheet->setCellValue('B' . $row, $dt);
$sheet->getStyle('B' . $row)
->getNumberFormat()
->setFormatCode('dd mmm yyyy');
if($dtend !=''){
$dtend = \PhpOffice\PhpSpreadsheet\Shared\Date::dateTimeToExcel($dtend);
$sheet->setCellValue('C' . $row, $dtend);
$sheet->getStyle('C' . $row)
->getNumberFormat()
->setFormatCode('dd mmm yyyy');
}
$sheet->setCellValue('D' . $row, $l->getLocation());
$row++;
}
$writer = new \PhpOffice\PhpSpreadsheet\Writer\Xlsx($spreadsheet);
ob_start();
$writer->save('php://output');
ob_end_clean();
return ob_get_clean();
//$writer->save('../var/log/test.xlsx');
//$writer->save('hello world.xlsx');
}
function _leave_use($date,$leaveAttr,$probation,$start){
$use=null;
$given=null;
$expire=null;
$probation=new \DateTime($probation);
$year=$leaveAttr['year'];
$nowx=new \DateTime(date('Y-m-d'));
if(isset($leaveAttr)){
if(isset($leaveAttr['active'])){
if(isset($leaveAttr['attr']['expires'])){
if(is_array($leaveAttr['attr']['expires'])){
$expire=new \DateTime($leaveAttr['attr']['expires']['date']);
}else{
$expire=new \DateTime($leaveAttr['attr']['expires']);
}
}
/*if(isset($leaveAttr['attr']['carryDate'])){
$carrydate=new \DateTime($leaveAttr['attr']['carryDate']);
if(($date < $carrydate) && ($leaveAttr['expires'] >= $carrydate)){
$expire=$carrydate->modify('-1 day');
$expire=new \DateTime($expire->format('Y-m-d'));
}
}*/
if($expire==null){$expire=new \DateTime($year.'-12-31');}
if(isset($leaveAttr['attr']['given'])){
if(is_array($leaveAttr['attr']['given'])){
$given=new \DateTime($leaveAttr['attr']['given']['date']);
}else{
$given=new \DateTime($leaveAttr['attr']['given']);
}
}
if($given==null){$given=new \DateTime($year.'-01-01');}
//if($given < $probation){$given=new \DateTime($probation->format('Y-m-d'));}
if(($probation < $nowx) && ($given > $probation)){
$given=new \DateTime($probation->format('Y-m-d'));
}
if(isset($leaveAttr['totalcarry'])){
if($leaveAttr['totalcarry'] >= $leaveAttr['left']){
if((!is_null($leaveAttr['carrygiven'])) && (!is_null($leaveAttr['carryexpire']))){
$dt=new \DateTime($date->format('Y-m-d'));
$gv=new \DateTime($leaveAttr['carrygiven']);
if($dt < $gv){
$expire= new \DateTime($leaveAttr['carryexpire']);
}
}
}
}
if(($given <= $date) && ($expire >= $date) &&($date >= $start)){
$use=$leaveAttr;
$use['expire']=$expire;
$use['given']=$given;
}
}
}
return $use;
}
public function isOnProbation($user,$country,$isprobation=false){
$probation=null;
if ($user->getPersonalInfo()->getJobStatus() == 'form.job_status.permanent'){
$probation=new \DateTime();
date_modify($probation,'-1 day');
return $probation;
}
if($isprobation==true){
$probation=new \DateTime();
date_modify($probation,'-1 day');
}else{
//if(!is_null($user->getPersonalInfo()->getJobPermanentDate())){
// $probation = new \DateTime($user->getPersonalInfo()->getJobPermanentDate()->format('Y-m-d'));
//}
if(($country=='SG') || ($country=='HK')){
if ($user->getPersonalInfo()->getJobStatus() != 'form.job_status.permanent'){
if($user->getPersonalInfo()->getJobStatus() != 'form.job_status.probation'){
if($user->getPersonalInfo()->getJobJoinDate()!=null){
$probation = new \DateTime($user->getPersonalInfo()->getJobJoinDate()->format('Y-m-d'));
$probation->modify('+3 months');
}
}else{
$probation = new \DateTime(date('Y-m-d'));
$probation->modify('+12 months');
}
}else{
//if ($probation == null) {
$probation = new \DateTime($user->getPersonalInfo()->getJobJoinDate()->format('Y-m-d'));
//}
}
}else{
if ($probation == null) {
if ($user->getPersonalInfo()->getJobStatus() != 'form.job_status.permanent') {
if($user->getPersonalInfo()->getJobStatus() != 'form.job_status.probation'){
if($user->getPersonalInfo()->getJobJoinDate()!=null){
$probation = new \DateTime($user->getPersonalInfo()->getJobJoinDate()->format('Y-m-d'));
$probation->modify('+12 months');
}
}else{
$probation = new \DateTime(date('Y-m-d'));
$probation->modify('+12 months');
}
}else{
$probation = new \DateTime($user->getPersonalInfo()->getJobJoinDate()->format('Y-m-d'));
}
}
}
if($country=='VN'){
//if(($leavetype->getLeaveName()=='sick') || ($country=='VN')){
$probation = new \DateTime($user->getPersonalInfo()->getJobJoinDate()->format('Y-m-d'));
$probation='test';
}
}
return $probation;
}
public function calculate(\App\Entity\User $user, \App\Entity\LeaveType $leavetype, \DateTime $startdate, \DateTime $enddate, $back = null, $option = array()){
$oldcarry=9999;
$default = array(
'now' => date('Y-m-d'),
'am' => false,
'pm' => false,
'keepunpaid'=>true,
);
$opt = $default;
if (count($option) > 0) {
foreach ($option as $k => $v) {
$opt[$k] = $v;
}
}
if ($back == null) {
$back = array();
}
$curyear=new \DateTime($opt['now']);
$curyear=$curyear->format('Y');
$testresult = array();
$em = $this->entityManager;
$offday = array(0, 6);
$leavelist = array();
$leavelist['child'] = array();
$leavelist['unpaid'] = array();
$leavelist['data'] = array();
$minyear = 999999;
$maxyear = 0;
$daterange = $startdate->diff($enddate);
$daterange = $daterange->format('%a');
$daterange = $daterange + 1;
$date = new \DateTime($startdate->format('Y-m-d'));
$yr = $date->format('Y');
if ($minyear >= $yr) { $minyear = $yr; }
if ($maxyear <= $yr) { $maxyear = $yr; }
if ($daterange > 1) {
for ($i = 1; $i < $daterange; $i++) {
$date = $date->modify('+1 day');
$yr = $date->format('Y');
if ($minyear >= $yr) {
$minyear = $yr;
}
if ($maxyear <= $yr) {
$maxyear = $yr;
}
}
}
$unpaiddate=array();
//check year from startdate and enddate get data from leave enteltainent
$yearlist = array();
$minyear = $minyear - 1;
$maxyear = $maxyear + 1;
for ($y = $minyear; $y <= $maxyear; $y++) { $yearlist[count($yearlist)] = $y;}
$leaveent = $em->getRepository(LeaveEntitlement::class)->findBy(array('user' => $user, 'leaveType' => $leavetype, 'year' => $yearlist));
$leaveAttr = array();
$leavechd = array();
$leavectype=array();
$parents=array();
$unpaid = array();
$forceholi=array();
//add leave data to array();
foreach ($leaveent as $l) {
$cattr=$l->getAttributes();
if(!isset($leavectype['c'.$l->getId()])){$leavectype['c'.$l->getId()]=$l->getLeaveType()->getLeaveName();}
//if($l->getUser()->getOffice()->getId()==$l->getLeaveType()->getOffice()->getId()){
$prid = $l->getId();
$parents[count($parents)]=$prid;
$leaveAttr['y' . $l->getYear()] = array();
$leaveAttr['y' . $l->getYear()]['id']=$prid;
$leaveAttr['y' . $l->getYear()]['year']=$l->getYear();
$leaveAttr['y' . $l->getYear()]['attr'] = $l->getAttributes();
$leaveAttr['y' . $l->getYear()]['total'] = $l->getLeaveEntitlements();
$leaveAttr['y' . $l->getYear()]['left'] = $l->getLeaveLeft();
$leaveAttr['y' . $l->getYear()]['active'] = $l->getIsActive();
$leaveAttr['y' . $l->getYear()]['mode']=$l->getLeaveType()->getLeaveName();
//get the rest attribute from office leave type
$typ = $l->getLeaveType()->getAttributes();
foreach ($typ as $tk => $tv) {
if (!isset($leaveAttr['y' . $l->getYear()]['attr'][$tk])) {
$leaveAttr['y' . $l->getYear()]['attr'][$tk] = $tv;
}
}
if (!isset($leaveAttr['y' . $l->getYear()]['attr']['carryData'])) {
$leaveAttr['y' . $l->getYear()]['attr']['carryData'] = [];
}
if(isset($cattr['forcedate'])){$forceholi=array_merge($forceholi,$cattr['forcedate']);}
//add child data to leave like bonus / adjustment / carry
//}
}
$leavechild = $em->getRepository(LeaveEntitlement::class)->findBy(array('user' => $user, 'year' => $yearlist, 'parent' => $parents));
foreach ($leavechild as $c) {
$ctname=$c->getLeaveType()->getLeaveName();
$ctid=$c->getId();
$ctyear=$c->getYear();
$cattr=$c->getAttributes();
if(!isset($leavectype['c'. $c->getId()])){$leavectype['c'.$c->getId()]=$ctname;}
if(!isset($leavechd['y' . $ctyear])){
$leavechd['y' . $ctyear] = array();
}
$leavechd['y' . $ctyear]['c' . $ctid] = array();
$leavechd['y' . $ctyear]['c' . $ctid]['id']=$c->getId();
$leavechd['y' . $ctyear]['c' . $ctid]['year']=$c->getYear();
$leavechd['y' . $ctyear]['c' . $ctid]['child']=true;
$leavechd['y' . $ctyear]['c' . $ctid]['attr'] = $c->getAttributes();
$leavechd['y' . $ctyear]['c' . $ctid]['total'] = $c->getLeaveEntitlements();
$leavechd['y' . $ctyear]['c' . $ctid]['left'] = $c->getLeaveLeft();
$leavechd['y' . $ctyear]['c' . $ctid]['active'] = $c->getIsActive();
if(isset($cattr['followParent'])){
if($cattr['followParent']){
if(!isset($leaveAttr['y'.$ctyear]['carry'])){
$leaveAttr['y'.$ctyear]['carry']=array();
}
if(!isset($leaveAttr['y'.$ctyear]['totalcarry'])){$leaveAttr['y'.$ctyear]['totalcarry']=0;}
if(!isset($leaveAttr['y'.$ctyear]['carryexpire'])){$leaveAttr['y'.$ctyear]['carryexpire']=isset($cattr['expires'])?$cattr['expires']:null;}
if(!isset($leaveAttr['y'.$ctyear]['carrygiven'])){$leaveAttr['y'.$ctyear]['carrygiven']=isset($cattr['given'])?$cattr['given']:null;}
if(!isset($leaveAttr['y'.$ctyear]['usecarrydate'])){$leaveAttr['y'.$ctyear]['usecarrydate']=false;}
$leaveAttr['y'.$ctyear]['totalcarry']+=$c->getLeaveEntitlements();
$jcarry=count($leaveAttr['y'.$ctyear]['carry']);
$leaveAttr['y'.$ctyear]['carry'][$jcarry]=$ctyear.','.$ctid;
$leavechd['y' . $ctyear]['c' . $ctid]['annual']=$ctyear;
}
}
//get the rest attribute from office leave type
$typ = $c->getLeaveType()->getAttributes();
foreach ($typ as $tk => $tv) {
if (!isset($leaveAttr['y' . $c->getYear()]['c'.$c->getId()]['attr'][$tk])) {
$leavechd['y' . $c->getYear()]['c'.$c->getId()]['attr'][$tk] = $tv;
}
}
if(isset($cattr['forcedate'])){$forceholi=array_merge($forceholi,$cattr['forcedate']);}
}
foreach ($back as $k => $v) {
//calculate back main leave
if(substr($k,0,1)=='y'){
$yb = str_replace('y', '', $k);
if (isset($leaveAttr['y' . $yb])) {
// $leaveAttr['y' . $l->getYear()]['left'] = $leaveAttr['y' . $l->getYear()]['left'] + $v;
$leaveAttr['y' . $yb]['left'] = $leaveAttr['y' . $yb]['left'] + $v;
}
}
//calculate back child Leave
if($k=='child'){
foreach($v as $kk => $kv){
foreach($kv as $kkk => $kkv){
$leavechd[$kk][$kkk]['left']+=$kkv;
}
}
}
if($k=='unpaid'){
if($opt['keepunpaid']){
$unpaid=$back[$k];
if(count($back[$k]) > 0){
foreach($back[$k] as $uv){
if(isset($uv['date'])){
foreach($uv['date'] as $udt){
$unpaiddate[count($unpaiddate)]=$udt['date'];
}
}
}
}
}else{
$back[$k]=array();
}
}
}
$country = $leavetype->getOffice()->getCountry();
$holidayrp = $em->getRepository(\App\Entity\LeaveBankHoliday::class)->findBy(array('location' => $country));
$holiday = array();
foreach ($holidayrp as $h) {
$dt = $h->getDate()->format('Y-m-d');
$dte = $h->getEndDate();
if(!is_null($dte)){
$dte=new \DateTime($h->getEndDate()->format('Y-m-d'));
$dtex=new \DateTime($h->getDate()->format('Y-m-d'));
while($dtex <= $dte){
$holiday[count($holiday)] = $dtex->format('Y-m-d');
$dtex->modify('+1 day');
}
}else{
$holiday[count($holiday)] = $dt;
}
}
$date = new \DateTime($startdate->format('Y-m-d'));
$testresult[count($testresult)] = $date;
$now = new \DateTime($opt['now']);
if($user->getPersonalInfo()->getJobStatus() == 'form.job_status.permanent'){
$now = new \DateTime();
}
if ($now > $startdate) { $now = $startdate; }
$child = array();
$datedata = array();
$probation=$this->isOnProbation($user,$country,false);
for ($d = 0; $d < $daterange; $d++) {
$dd=$date->format('Y-m-d');
$isunpaiddate=in_array($dd,$unpaiddate);
//skip is unpaid
if((!$isunpaiddate) || (!$opt['keepunpaid'])){
$keep = 0;
$cutam = 0;
$cutpm = 0;
if ($d == 0) {
if ($opt['am']) {
$cutam = 0.5;
}
}
if ($d == ($daterange - 1)) {
if ($opt['pm']) {
$cutpm = 0.5;
}
}
if ($d == ($daterange - 1)) {
if (($daterange <= 1) && ($opt['am'])) {
$cutpm = 0;
}
}
$w = $date->format('w');
$h = $date->format('Y-m-d');
$dtact = $date->format('Y-m-d');
if (!isset($datedata[$h])) {
$datedata[$dtact] = 0;
}
$ok = true;
$isunpaid = false;
if (in_array($w, $offday) && (!in_array($h,$forceholi))) {
$ok = false;
}
if (in_array($h, $holiday) && (!in_array($h,$forceholi))) {
$ok = false;
}
$unpaidleave = false;
if (isset($leaveAttr['y' . $yr])) {
if (isset($leaveAttr['y' . $yr]['attr']['unpaid'])) {
$unpaidleave = $leaveAttr['y' . $yr]['attr']['unpaid'];
if (is_null($unpaidleave)) {
$unpaidleave = false;
}
if ($unpaidleave == 0) {
$unpaidleave = false;
}
if ($unpaidleave == 1) {
$unpaidleave = true;
}
}
}
if($ok){
$yrd = $date->format('Y');
if($unpaidleave){
if (isset($leaveAttr['y' . $curyear])) {
if ($ok) {
if (!isset($unpaid['y' . $curyear])) {
$unpaid['y' . $curyear] = array();
$unpaid['y' . $curyear]['date'] = array();
$unpaid['y' . $curyear]['value'] = 0;
}
$dcnt = count($unpaid['y' . $curyear]['date']);
$unpaid['y' . $curyear]['date'][$dcnt] = array();
$unpaid['y' . $curyear]['date'][$dcnt]['date'] = $date->format('Y-m-d');
$unpaid['y' . $curyear]['date'][$dcnt]['value'] = 1;
$unpaid['y' . $curyear]['date'][$dcnt]['value'] -= $cutam;
$unpaid['y' . $curyear]['date'][$dcnt]['value'] -= $cutpm;
$unpaid['y' . $curyear]['value']++;
$unpaid['y' . $curyear]['value'] -= $cutam;
$unpaid['y' . $curyear]['value'] -= $cutpm;
$cutam = 0;
$cutpm = 0;
}
}
}else{
if(isset($leaveAttr['y'.$yrd])){
$xprob=$probation->format('Y-m-d');
if(isset($leaveAttr['y'.$yrd]['attr']['probation'])){
if($leaveAttr['y'.$yrd]['attr']['probation']==true){
$xprob=new \DateTime();
date_modify($xprob,'-1 day');
$xprob=$xprob->format('Y-m-d');
}
}
$cmp=$leaveAttr['y'.$yrd]['left'];
if(isset($leaveAttr['y'.$yrd]['carry'])){
$cmp=$leaveAttr['y'.$yrd]['left'];
foreach($leaveAttr['y'.$yrd]['carry'] as $lucr){
$scr=explode(',',$lucr);
$tcr=isset($leavechd['y'.$scr[0]]['c'.$scr[1]]['total'])?$leavechd['y'.$scr[0]]['c'.$scr[1]]['total']:0;
$tcl=isset($leavechd['y'.$scr[0]]['c'.$scr[1]]['left'])?$leavechd['y'.$scr[0]]['c'.$scr[1]]['left']:0;
$cmp=$cmp-($tcr - $tcl);
}
}
if($cmp > 0){
$thisyear=$this->_leave_use($date,$leaveAttr['y'.$yrd],$xprob,$now);
}else{
$thisyear=array();
}
}else{
$thisyear=array();
}
if(isset($leaveAttr['y'.($yrd-1)])){
$xprob=$probation->format('Y-m-d');
if(isset($leaveAttr['y'.($yrd-1)]['attr']['probation'])){
if($leaveAttr['y'.($yrd-1)]['attr']['probation']==true){
$xprob=new \DateTime();
date_modify($xprob,'-1 day');
$xprob=$xprob->format('Y-m-d');
}
}
$cmp=$leaveAttr['y'.($yrd-1)]['left'];
if(isset($leaveAttr['y'.($yrd-1)]['carry'])){
$cmp=$leaveAttr['y'.($yrd-1)]['left'];
foreach($leaveAttr['y'.($yrd-1)]['carry'] as $lucr){
$scr=explode(',',$lucr);
$tcr=isset($leavechd['y'.$scr[0]]['c'.$scr[1]]['total'])?$leavechd['y'.$scr[0]]['c'.$scr[1]]['total']:0;
$tcl=isset($leavechd['y'.$scr[0]]['c'.$scr[1]]['left'])?$leavechd['y'.$scr[0]]['c'.$scr[1]]['left']:0;
$cmp=$cmp-($tcr - $tcl);
}
}
if($cmp > 0){
$lastyear=$this->_leave_use($date,$leaveAttr['y'.($yrd-1)],$xprob,$now);
}else{
$lastyear=array();
}
}else{
$lastyear=array();
}
/*if(isset($leaveAttr['y'.($yrd-1)])){
$carryover=$this->_leave_use($date,$leaveAttr['y'.($yrd-1)],$probation->format('Y-m-d'),$now);
}else{
$carryover=array();
}*/
$childover=array();
if(isset($leavechd['y' . $yrd])){
foreach($leavechd['y'.$yrd] as $leavek=>$leavev){
$xprob=$probation->format('Y-m-d');
if(isset($leavechd['y'.$yrd][$leavek]['attr']['probation'])){
if($leavechd['y'.$yrd][$leavek]['attr']['probation']==true){
$xprob=new \DateTime();
date_modify($xprob,'-1 day');
$xprob=$xprob->format('Y-m-d');
}
}
$cmp=9999;
if(isset($leavev['annual'])){
if(isset($leaveAttr['y'.$leavev['annual']])){
if(isset($leaveAttr['y'.$leavev['annual']]['carry'])){
$cmp=$leaveAttr['y'.$leavev['annual']]['left'];
foreach($leaveAttr['y'.$leavev['annual']]['carry'] as $lucr){
$scr=explode(',',$lucr);
$tcr=isset($leavechd['y'.$scr[0]]['c'.$scr[1]]['total'])?$leavechd['y'.$scr[0]]['c'.$scr[1]]['total']:0;
$tcl=isset($leavechd['y'.$scr[0]]['c'.$scr[1]]['left'])?$leavechd['y'.$scr[0]]['c'.$scr[1]]['left']:0;
$cmp=$cmp-($tcr - $tcl);
}
}
}
}
if($cmp > 0){
$lval=$this->_leave_use($date,$leavev,$xprob,$now);
}else{
$lval=array();
}
if(isset($lval['total'])){$childover[count($childover)]=$lval;}
}
}
if(isset($leavechd['y' . ($yrd-1)])){
foreach($leavechd['y'.($yrd-1)] as $leavek=>$leavev){
$xprob=$probation->format('Y-m-d');
$cmp=9999;
if(isset($leavev['annual'])){
if(isset($leaveAttr['y'.$leavev['annual']])){
if(isset($leaveAttr['y'.$leavev['annual']]['carry'])){
$cmp=$leaveAttr['y'.$leavev['annual']]['left'];
foreach($leaveAttr['y'.$leavev['annual']]['carry'] as $lucr){
$scr=explode(',',$lucr);
$tcr=isset($leavechd['y'.$scr[0]]['c'.$scr[1]]['total'])?$leavechd['y'.$scr[0]]['c'.$scr[1]]['total']:0;
$tcl=isset($leavechd['y'.$scr[0]]['c'.$scr[1]]['left'])?$leavechd['y'.$scr[0]]['c'.$scr[1]]['left']:0;
$cmp=$cmp-($tcr - $tcl);
}
}
}
}
if($cmp > 0){
$lval=$this->_leave_use($date,$leavev,$xprob,$now);
}else{
$lval=array();
}
if(isset($lval['total'])){$childover[count($childover)]=$lval;}
}
}
$leaveuse=array();
/*if(isset($carryover['total'])){
if($carryover['left'] > 0){
$lvcount=count($leaveuse);
$leaveuse[$lvcount]=$carryover;
$leaveuse[$lvcount]['modetype']='carry';
}
}*/
if(isset($thisyear['total'])){
if($thisyear['left'] > 0){
$lvcount=count($leaveuse);
$leaveuse[$lvcount]=$thisyear;
$leaveuse[$lvcount]['modetype']='annual';
}
}
if(isset($lastyear['total'])){
if($lastyear['left'] > 0){
$lvcount=count($leaveuse);
$leaveuse[$lvcount]=$lastyear;
$leaveuse[$lvcount]['modetype']='annual';
}
}
if(count($childover) > 0){
foreach($childover as $ch){
if($ch['left'] > 0){
$leaveuse[count($leaveuse)]=$ch;
}
}
}
$upx=0;
if(count($leaveuse) > 0){
usort($leaveuse,function($a,$b){
if(isset($a['expire']) && isset($b['expire'])){
$ax=$a['expire']->format('Ymd');
$bx=$b['expire']->format('Ymd');
return $ax <=> $bx;
}
return 0;
});
$keep=1-(float) $cutam;
$keep=$keep-(float) $cutpm;
$lastlv=null;
foreach($leaveuse as $lu){
/*if(isset($lu['annual'])){
if($lu['left'] > 0){
$lu['left']=$leaveAttr['y'.$lu['annual']]['left']-($lu['total'] - $lu['left']);
}
}
if(isset($lu['carry'])){
foreach($lu['carry'] as $lucr){
$scr=explode(',',$lucr);
$tcr=$leavechd['y'.$scr[0]]['c'.$scr[1]]['total'];
$tcl=$leavechd['y'.$scr[0]]['c'.$scr[1]]['left'];
$lu['left']=$lu['left']-($tcr - $tcl);
}
}*/
if($lu['left'] > 0){
$lvbound=null;
if(isset($lu['carry'])){$lvbound=$lu;}
if(isset($lu['annual'])){$lvbound=$leaveAttr['y'.$lu['annual']];}
if(!is_null($lvbound)){
$cmp=$lvbound['left'];
foreach($lvbound['carry'] as $lucr){
$scr=explode(',',$lucr);
$tcr=isset($leavechd['y'.$scr[0]]['c'.$scr[1]]['total'])?$leavechd['y'.$scr[0]]['c'.$scr[1]]['total']:0;
$tcl=isset($leavechd['y'.$scr[0]]['c'.$scr[1]]['left'])?$leavechd['y'.$scr[0]]['c'.$scr[1]]['left']:0;
$cmp=$cmp-($tcr - $tcl);
}
$lu['left']=$cmp;
//if($keep > $cmp){$keep=$cmp;}
}
if(($keep > 0) && ($lu['left'] > 0)){
$dkeep=1-(float) $cutam;
$dkeep=$dkeep-(float)$cutpm;
$keepleft=1-(float) $cutam;
$keepleft=$keepleft-(float) $cutpm;
if($lu['left'] >= $keepleft){
$keep=$keep-$keepleft;
if($keep < 0){$dkeep=$keepleft+$keep;}
}else{
$dkeep=$dkeep-$lu['left'];
$keep=$keep-$lu['left'];
}
if(isset($lu['child'])){
if(!isset($child['y'.$lu['year']])){
$child['y'.$lu['year']]=array();
}
if(!isset($child['y'.$lu['year']]['c'.$lu['id']])){$child['y'.$lu['year']]['c'.$lu['id']]=0;}
$child['y'.$lu['year']]['c'.$lu['id']]+=(float) $dkeep;
$leavechd['y'.$lu['year']]['c'.$lu['id']]['left']-=(float) $dkeep;
if(!isset($leavelist['data']['y'.$lu['year']])){$leavelist['data']['y'.$lu['year']]=array();}
if(!isset($leavelist['data']['y'.$lu['year']]['child'])){
$leavelist['data']['y'.$lu['year']]['child']=array();
}
if(!isset($leavelist['data']['y'.$lu['year']]['child']['c'.$lu['id']])){
$leavelist['data']['y'.$lu['year']]['child']['c'.$lu['id']]=array();
}
if(!isset($leavelist['data']['y'.$lu['year']]['c'.$lu['id']]['d'.$date->format('Ymd')])){
$leavelist['data']['y'.$lu['year']]['child']['c'.$lu['id']]['d'.$date->format('Ymd')]=1;
}
}else{
if(!isset($leavelist['y'.$lu['year']])){$leavelist['y'.$lu['year']]=0;};
$leavelist['y'.$lu['year']]+=(float) $dkeep;
$leaveAttr['y'.$lu['year']]['left']-=(float) $dkeep;
if(!isset($leavelist['data'])){$leavelist['data']=array();}
if(!isset($leavelist['data']['y'.$lu['year']])){
$leavelist['data']['y'.$lu['year']]=array();
}
if(!isset($leavelist['data']['y'.$lu['year']]['d'.$date->format('Ymd')])){
$leavelist['data']['y'.$lu['year']]['d'.$date->format('Ymd')]=$dkeep;
}
}
$lu['left']=-$dkeep;
$lastlv=$lu;
}
}
$cutpm=0;
$cutam=0;
}
//if($d==($daterange-1)){
//$keep-=$cutam;
//$keep-=$cutpm;
//}
if($keep > 0){
//if($d==($daterange-1)){
$upx=$keep;
//}
}else{
if($d==($daterange-1)){
if(!is_null($lastlv)){
if(isset($lastlv['child'])){
if(!isset($child['y'.$lastlv['year']])){
$child['y'.$lastlv['year']]=array();
}
if(!isset($child['y'.$lastlv['year']]['c'.$lastlv['id']])){
$child['y'.$lastlv['year']]['c'.$lastlv['id']]=0;
}
$child['y'.$lastlv['year']]['c'.$lastlv['id']]-=(float) $cutam;
$child['y'.$lastlv['year']]['c'.$lastlv['id']]-=(float) $cutpm;
$leavechd['y'.$lastlv['year']]['c'.$lastlv['id']]['left']+=(float) $cutam;
$leavechd['y'.$lastlv['year']]['c'.$lastlv['id']]['left']+=(float) $cutpm;
if(!isset($leavelist['data']['y'.$lastlv['year']])){$leavelist['data']['y'.$lastlv['year']]=array();}
if(!isset($leavelist['data']['y'.$lastlv['year']]['child'])){
$leavelist['data']['y'.$lastlv['year']]['child']=array();
}
if(!isset($leavelist['data']['y'.$lastlv['year']]['child']['c'.$lastlv['id']])){
$leavelist['data']['y'.$lastlv['year']]['child']['c'.$lastlv['id']]=array();
}
if(!isset($leavelist['data']['y'.$lastlv['year']]['child']['c'.$lastlv['id']]['d'.$date->format('Ymd')])){
$leavelist['data']['y'.$lastlv['year']]['child']['c'.$lastlv['id']]['d'.$date->format('Ymd')]=1;
}
$leavelist['data']['y'.$lastlv['year']]['child']['c'.$lastlv['id']]['d'.$date->format('Ymd')]-=(float) $cutam;
$leavelist['data']['y'.$lastlv['year']]['child']['c'.$lastlv['id']]['d'.$date->format('Ymd')]-=(float) $cutpm;
}else{
if(!isset($leavelist['y'.$lastlv['year']])){$leavelist['y'.$lastlv['year']]=0;}
$leavelist['y'.$lastlv['year']]-=(float) $cutpm;
$leavelist['y'.$lastlv['year']]-=(float) $cutam;
$leaveAttr['y'.$lastlv['year']]['left']+=(float) $cutam;
$leaveAttr['y'.$lastlv['year']]['left']+=(float) $cutpm;
if(!isset($leavelist['data'])){$leavelist['data']=array();}
if(!isset($leavelist['data']['y'.$lu['year']])){
$leavelist['data']['y'.$lu['year']]=array();
}
if(!isset($leavelist['data']['y'.$lastlv['year']]['d'.$date->format('Ymd')])){
$leavelist['data']['y'.$lastlv['year']]['d'.$date->format('Ymd')]=1;
}
$leavelist['data']['y'.$lastlv['year']]['d'.$date->format('Ymd')]-=(float) $cutam;
$leavelist['data']['y'.$lastlv['year']]['d'.$date->format('Ymd')]-=(float) $cutpm;
}
}
}
}
}else{
$upx=1;
//if($d==($daterange-1)){
$upx-=(float) $cutam;
$upx-=(float) $cutpm;
//}
}
if($upx > 0){
if (!isset($unpaid['y' . $curyear])) {
$unpaid['y' . $curyear] = array();
$unpaid['y' . $curyear]['date'] = array();
$unpaid['y' . $curyear]['value'] = 0;
}
if(isset($unpaid['y' . $curyear]['date'])){
$dcnt = count($unpaid['y' . $curyear]['date']);
$unpaid['y' . $curyear]['date'][$dcnt] = array();
$unpaid['y' . $curyear]['date'][$dcnt]['date'] = $date->format('Y-m-d');
$unpaid['y' . $curyear]['date'][$dcnt]['value'] = $upx;
$unpaid['y' . $curyear]['value']+=(float) $upx;
}
$cutam = 0;
$cutpm = 0;
$pro=new \DateTime($probation->format('Y-m-d'));
if(($leavetype->getLeaveName()=='sick') && ($date >= $pro)){
if(!isset($leavelist['y'.$yrd])){$leavelist['y'.$yrd]=0;}
$leavelist['y'.$yrd]+=(float) $upx;
}
}
}
}
}
$date = $date->modify('+1 day');
}
$leavelist['child'] = $child;
$leavelist['unpaid'] = $unpaid;
$leavelist['type']=$leavectype;
$dumper=array();
foreach($leaveAttr as $ld){
$dumper['l'.$ld['id']]=$ld['left'];
}
foreach($leavechd as $ld){
foreach($ld as $kd => $vd){
$dumper['l'.$vd['id']]=$vd['left'];
}
}
$leavelist['dumper']=$dumper;
if (isset($leave['error'])) {
return false;
}
return $leavelist;
}
public function removeAllocation($id,$keepunpaid=true){
$em = $this->entityManager;
$rq=$em->getRepository(\App\Entity\leaveRequest::class)->findById($id);
if(!is_null($rq)){
foreach($rq as $r){
$isApproved=$r->getIsApproved();
if(($isApproved===false) || ($isApproved===0)){
continue;
}
$start=$r->getStartDate();
$end=$r->getEndDate();
$leavetype=$r->getLeaveType()->getId();
$ys=intval($start->format('Y'))-1;
$ye=intval($end->format('Y'))+1;
$years=array();
for($i=$ys;$i<=$ye;$i++){
$years[count($years)]=$i;
}
$user=$r->getUser();
$en=$em->getRepository(\App\Entity\LeaveEntitlement::class)->findBy(array('user'=>$user,'year'=>$years));
$enlist=array();
$enlistbyid=array();
if(!is_null($en)){
foreach($en as $e){
$y=$e->getYear();
$t=$e->getleaveType()->getId();
if(!isset($enlist['y'.$y])){$enlist['y'.$y]=array();}
$enlist['y'.$y]['t'.$t]=$e;
$enlistbyid['c'.$e->getId()]=$e;
}
}
$allo=$r->getAlocation();
foreach($allo as $k=>$a){
switch($k){
case 'unpaid':
if(!$keepunpaid){
unset($allo[$k]);
}else{
if(count($allo[$k]) < 1){
unset($allo[$k]);
}
}
break;
case 'child':
if(count($allo[$k]) > 0){
//year
foreach($a as $k1=>$v1){
//child
foreach($v1 as $k2=>$v2){
if(isset($enlistbyid[$k2])){
$el=$enlistbyid[$k2];
$oleft=$el->getLeaveLeft();
$left=$oleft+$v2;
$total=$el->getLeaveEntitlements();
if($left > $total){$left=$total;}
$el->setLeaveLeft($left);
$log=$el->getLog();
$dtnow=new \DateTime();
if(is_null($log)){$log=array();}
$logdata[count($log)]=array(
'date'=>$dtnow->format('Y-m-d H:i:s'),
'left'=>$oleft.'=>'.$left,
'message'=>'change left',
'runby'=>'removeAllocation'
);
$el->setUpdatedAt($dtnow);
$el->setLog($logdata);
$em->persist($el);
$em->flush();
unset($allo[$k][$k1][$k2]);
}
}
if(count($allo[$k][$k1]) < 1){
unset($allo[$k][$k1]);
}
}
}
if(count($allo[$k]) < 1){
unset($allo[$k]);
}
break;
default:
if(substr($k,0,1)=='y'){
$yr=intval(str_replace('y','',$k));
if(isset($enlist['y'.$yr]['t'.$leavetype])){
$el=$enlist['y'.$yr]['t'.$leavetype];
$oleft=$el->getLeaveLeft();
$left=$oleft+$a;
$total=$el->getLeaveEntitlements();
if($left > $total){$left=$total;}
$el->setLeaveLeft($left);
$log=$el->getLog();
if(is_null($log)){$log=array();}
$dtnow=new \DateTime();
$logdata[count($log)]=array(
'date'=>$dtnow->format('Y-m-d H:i:s'),
'left'=>$oleft.'=>'.$left,
'message'=>'change left',
'runby'=>'removeAllocation'
);
$el->setUpdatedAt($dtnow);
$el->setLog($logdata);
$em->persist($el);
$em->flush();
}
}
unset($allo[$k]);
}
}
if(is_null($allo)){$allo=array();}
$r->setAlocation($allo);
$log=$r->getLog();
$dtnow=new \DateTime();
$logdata[count($log)]=array(
'date'=>$dtnow->format('Y-m-d H:i:s'),
'allocation'=>$allo,
'message'=>'change Allocation',
'runby'=>'removeAllocation'
);
$r->setUpdatedAt($dtnow);
$r->setLog($logdata);
$em->persist($r);
$em->flush();
}
};
}
public function recalculate($option)
{
$default = array(
'user' => null,
'type' => null,
'office' => null,
'days' => null
);
$opt = $default;
foreach ($option as $k => $v) {
$opt[$k] = $v;
}
$lent = $this->entityManager->getRepository(\App\Entity\LeaveEntitlement::class)->findAll();
foreach ($lent as $l) {
$ok = true;
if (!is_null($opt['user'])) {
if ($l->getUser()->getId() != $opt['user']) {
$ok = false;
}
}
if (!is_null($opt['office'])) {
if ($l->getUser()->getOffice()->getId != $opt['office']) {
$ok = false;
}
}
if (!is_null($opt['type'])) {
if ($l->getLeaveType()->getId() != $opt['$type']) {
$ok = false;
}
}
if ($ok) {
$left = $l->getLeaveEntitlements();
if (!is_null($opt['days'])) {
$left = $days;
$l->setLeaveEntitlements($left);
}
$l->setLeaveLeft($left);
$this->entityManager->persist($l);
$this->entityManager->flush();
}
}
$lrq = $this->entityManager->getRepository(\App\Entity\LeaveRequest::class)->findAll();
foreach ($lrq as $l) {
$ok = true;
if (!is_null($opt['user'])) {
if ($l->getUser()->getId() != $opt['user']) {
$ok = false;
}
}
if (!is_null($opt['office'])) {
if ($l->getUser()->getOffice()->getId != $opt['office']) {
$ok = false;
}
}
if (!is_null($opt['type'])) {
if ($l->getLeaveType()->getId() != $opt['$type']) {
$ok = false;
}
}
if ($ok) {
$l->setAlocation(array());
$this->entityManager->persist($l);
$this->entityManager->flush();
}
}
$lrq = $this->entityManager->getRepository(\App\Entity\LeaveRequest::class)->findAll();
foreach ($lrq as $l) {
$ok = true;
if (!is_null($opt['user'])) {
if ($l->getUser()->getId() != $opt['user']) {
$ok = false;
}
}
if (!is_null($opt['office'])) {
if ($l->getUser()->getOffice()->getId != $opt['office']) {
$ok = false;
}
}
if (!is_null($opt['type'])) {
if ($l->getLeaveType()->getId() != $opt['$type']) {
$ok = false;
}
}
if ($ok) {
$user = $l->getUser();
$lt = $l->getLeaveType();
$sd = $l->getStartDate();
$ed = $l->getEndDate();
$am = $l->getIsHalfStart();
$pm = $l->getIsHalfEnd();
$dt = $l->getUpdatedAt();
if ($dt == null) {
$dt = $l->getCreatedAt();
}
if ($dt == null) {
$dt = new \DateTime();
}
$dt = $dt->format('Y-m-d');
$opt = array();
$opt['am'] = $am;
$opt['pm'] = $pm;
$opt['now'] = $dt;
$isok = true;
if ($lt->getLeaveName() !== 'sick') {
if (is_null($l->getIsApproved())) {
} else {
if (($l->getIsApproved() == false) || ($l->getIsApproved() == 0)) {
$isok = false;
}
}
}
if ($isok) {
$allo = $this->leaveService->calculate($user, $lt, $sd, $ed, null, $opt);
$l->setAlocation($allo);
$this->entityManager->persist($l);
$this->entityManager->flush();
$this->leaveService->updateEntitlementFromLeave($user, $lt, $allo);
}
}
}
}
function updateEntitlementFromLeave(\App\Entity\User $user, \App\Entity\LeaveType $leavetype, $alocation, $oldalocation = null)
{
if ($oldalocation == null) {
$oldalocation = array();
}
$em = $this->entityManager;
$haserror = false;
if ($alocation == false) {
return false;
}
foreach ($alocation as $y => $a) {
switch ($y) {
case 'data':
break;
case 'error':
break;
case 'type':
break;
case 'dumper':
break;
case 'child':
foreach ($a as $cy => $c) {
$yr = str_replace('y', '', $cy);
foreach ($c as $ck => $cc) {
$cid = str_replace('c', '', $ck);
$leaveentitlement = $em->getRepository(LeaveEntitlement::class)->findBy(array('user' => $user, 'id' => $cid, 'year' => $yr));
if ($leaveentitlement != null) {
$c = count($leaveentitlement);
for ($j = 0; $j < $c; $j++) {
$left = $leaveentitlement[$j]->getLeaveLeft();
$l = 0;
if (isset($oldalocation['y' . $yr][$ck])) {
$l = $oldalocation['y' . $yr][$ck];
}
$left = ($left - $cc) + $l;
$leaveentitlement[$j]->setLeaveLeft($left);
$em->persist($leaveentitlement[$j]);
$em->flush();
}
}
}
}
break;
case 'unpaid':
break;
default:
$yr = str_replace('y', '', $y);
$leaveentitlement = $em->getRepository(LeaveEntitlement::class)->findBy(array('user' => $user, 'leaveType' => $leavetype, 'year' => $yr));
if ($leaveentitlement != null) {
$c = count($leaveentitlement);
for ($j = 0; $j < $c; $j++) {
$left = $leaveentitlement[$j]->getLeaveLeft();
$atl = $leaveentitlement[$j]->getAttributes();
$att = $leaveentitlement[$j]->getLeaveType()->getAttributes();
$isunpaid = false;
if (isset($atl['unpaid'])) {
if (($atl['unpaid'] == 1) || ($atl['unpaid'] == true)) {
$isunpaid = true;
}
} elseif (isset($att['unpaid'])) {
if (($att['unpaid'] == 1) || ($att['unpaid'] == true)) {
$isunpaid = true;
}
}
if (($isunpaid) && ($left > 0)) {
$left = 0;
}
$l = 0;
if (isset($oldalocation['y' . $yr])) {
$l = $oldalocation['y' . $yr];
}
$left = ($left - $a) + $l;
/*if(($leaveentitlement[$j]->getLeaveType()->getLeaveName()=='annual') && ($leaveentitlement[$j]->getUser()->getId()==51) && ($leaveentitlement[$j]->getYear()=='2022')){
dd($left.' a='.$a.' l='.$l);
}*/
$leaveentitlement[$j]->setLeaveLeft($left);
$em->persist($leaveentitlement[$j]);
$em->flush();
}
}
break;
}
}
return true;
}
public function requestLeaveEmail($request, $editedUser, $template='request.html.twig')
{
$loggedIn = $request ? true : false;
$emailGroup = $this->params->get('systemEmailGroup');
// $reminderLog = $editedUser->getReminder();
$user = $editedUser->getPersonalInfo()->getFirstName();
$leaveType = $request->getLeaveType();
$dataleaveType = ucwords($leaveType->getLeaveName());
$startDateData = $request->getStartDate();
$startDate = $startDateData->format('d F Y');
$isHalfStart = $request->getIsHalfStart();
$isHalfStart = $isHalfStart ? 'PM' : 'AM';
$endDateData = $request->getEndDate();
$endDate = $endDateData->format('d F Y');
$isHalfEnd = $request->getIsHalfEnd();
$isHalfEnd = $isHalfEnd ? 'AM' : 'PM';
$leaveRequest = $request;
$emailParameter=[
'recipient' => $editedUser,
'group' => 'user',
'user' => $editedUser,
'leaveRequest' => $leaveRequest
];
$attr=$request->getAttributes();
$takeoverEmail=array();
if(isset($attr['task'])){
$emailParameter['task']=array();
$emailParameter['task']['task']=str_replace("\n",'<br>',$attr['task']['task']);
$takeover=$this->entityManager->getRepository(\App\Entity\User::class)->findBy(array('id'=>$attr['task']['takeover']));
$takeoverName='';
if(is_array($takeover)){
foreach ($takeover as $t){
$takeoverName.=$t->getPersonalInfo()->getFullName().' ,';
$takeoverEmail[count($takeoverEmail)]=$t->getEmail();
}
$takeoverName=trim($takeoverName,',');
$takeoverName=trim($takeoverName);
}
$emailParameter['task']['takeover']=$takeoverName;
}
// $leaveRequest = $this->entityManager->getRepository(LeaveRequest::class)->findOneBy(['user'=>$editedUser, 'leaveType'=>$leaveType, 'startDate' => $startDateData, 'endDate' => $endDateData ]);
$subject = "email.leave.request.";
$emailTemplate = 'email/user-notification/leave/'.$template;
$this->mailgunService->sendEmail(
$this->translator->trans($subject . 'user', [
'%leaveType%' => $dataleaveType,
'%startDate%' => $startDate,
'%endDate%' => $endDate,
'%isHalfStart%' => $isHalfStart,
'%isHalfEnd%' => $isHalfEnd,
]),
[$editedUser->getEmail()],
$emailTemplate,
$emailParameter,
$loggedIn
);
foreach ($editedUser->getAllManager() as $manager) {
$emailParameter['group']='manager';
$emailParameter['recipient']=$manager;
$emailParameter['user']=$editedUser;
$emailParameter['leaveRequest']=$leaveRequest;
$this->mailgunService->sendEmail(
$this->translator->trans($subject . 'manager', [
'%user%' => $user,
'%leaveType%' => $dataleaveType,
'%startDate%' => $startDate,
'%endDate%' => $endDate,
'%isHalfStart%' => $isHalfStart,
'%isHalfEnd%' => $isHalfEnd,
]),
[$manager->getEmail()],
$emailTemplate,
$emailParameter,
$loggedIn
);
}
foreach ($emailGroup as $groupName => $groupEmail) {
if ($groupName == 'hr') {
$emailParameter['group']=$groupName;
$emailParameter['recipient']=strtoupper($groupName) . ' Team';
$emailParameter['user']=$editedUser;
$emailParameter['leaveRequest']=$leaveRequest;
$this->mailgunService->sendEmail(
$this->translator->trans($subject . $groupName, [
'%user%' => $user,
'%leaveType%' => $dataleaveType,
'%startDate%' => $startDate,
'%endDate%' => $endDate,
'%isHalfStart%' => $isHalfStart,
'%isHalfEnd%' => $isHalfEnd,
]),
[$groupEmail],
$emailTemplate,
$emailParameter,
$loggedIn
);
}
};
if(count($takeoverEmail) > 0){
$emailParameter['group']='takeover';
$emailParameter['recipient']='Team Member';
$emailParameter['user']=$editedUser;
$emailParameter['leaveRequest']=$leaveRequest;
$this->mailgunService->sendEmail(
$this->translator->trans($subject . 'user', [
'%user%' => $user,
'%leaveType%' => $dataleaveType,
'%startDate%' => $startDate,
'%endDate%' => $endDate,
'%isHalfStart%' => $isHalfStart,
'%isHalfEnd%' => $isHalfEnd,
]),
$takeoverEmail,
$emailTemplate,
$emailParameter,
$loggedIn
);
}
}
public function requestedAdminLeaveEmail($request, $editedUser, $admin, $isToday = false)
{
$loggedIn = $request ? true : false;
$emailGroup = $this->params->get('systemEmailGroup');
// $reminderLog = $editedUser->getReminder();
$user = $editedUser->getPersonalInfo()->getFirstName();
$leaveType = $request->getLeaveType();
$dataleaveType = ucwords($leaveType->getLeaveName());
$startDateData = $request->getStartDate();
$startDate = $startDateData->format('d F Y');
$isHalfStart = $request->getIsHalfStart();
$isHalfStartTime = $isHalfStart ? '130000' : '090000';
$isHalfStart = $isHalfStart ? 'PM' : 'AM';
$endDateData = $request->getEndDate();
$endDate = $endDateData->format('d F Y');
$isHalfEnd = $request->getIsHalfEnd();
$isHalfEndTime = $isHalfEnd ? '140000' : '180000';
$isHalfEnd = $isHalfEnd ? 'AM' : 'PM';
// $leaveRequest = $this->entityManager->getRepository(LeaveRequest::class)->findOneBy(['user'=>$editedUser, 'leaveType'=>$leaveType, 'startDate' => $startDateData, 'endDate' => $endDateData ]);
$leaveRequest = $request;
$subject = "email.leave.requested.";
$emailTemplate = 'email/user-notification/leave/requested-admin.html.twig';
$attendee = [
[
'name' => $request->getUser()->getPersonalInfo()->getFullName(),
'email' => $request->getUser()->getEmail(),
'role' => 'REQ-PARTICIPANT'
],
];
$startDateTime = $request->getStartDate()->format('Ymd') . ($isHalfStart != 'AM' ? 'T' . $isHalfStartTime : '');
$endDateTime = $request->getEndDate()->format('Ymd') . ($isHalfEnd != 'PM' || $isHalfStart != 'AM' ? 'T' . $isHalfEndTime : '');
if($request->getStartDate()->format('Ymd') != $request->getEndDate()->format('Ymd')){
if($isHalfEnd != 'PM' || $isHalfStart != 'AM'){
$endDateTime = $request->getEndDate()->format('Ymd') . 'T' . $isHalfEndTime;
}else{
$endDateTime = strval($request->getEndDate()->format('Ymd') + 1);
}
}
// $startDateTime = $request->getStartDate()->format('Ymd') . 'T' . $isHalfStartTime;
// $endDateTime = $request->getEndDate()->format('Ymd') . 'T' . $isHalfEndTime;
$ICSTitle = 'On ' . $leaveType->getAttributes()['label'] . ' Leave';
$desc = $editedUser->getPersonalInfo()->getFirstName().' on '. $leaveType->getAttributes()['label'] .' leave for '.$request->getDays().' day(s).\nFor urgent matters, please contact '.$editedUser->getManager()->getPersonalInfo()->getFirstName();
$icsData = $this->icsService->generateEventFile([
'uid' => $request->getId() . $request->getUser()->getId() . ':' . $request->getUser()->getEmail(),
'title' => $ICSTitle . ': ' . $request->getUser()->getPersonalInfo()->getFullName(),
'description' => $desc,
'startDateTime' => $startDateTime,
'endDateTime' => $endDateTime,
'location' => $request->getUser()->getOffice()->getFullName(),
'organizer' => [
'name' => $this->params->get('systemEmailName'),
'email' => $_SERVER['APP_ENV'] == 'prod' ? $this->params->get('systemEmailAddr') : 'devops@mediatropy.com'
],
// 'organizer' => [
// 'name' => $request->getUser()->getPersonalInfo()->getFullName(),
// 'email' => $request->getUser()->getEmail()
// ],
'attendee' => $attendee,
'reschedule' => 0,
'reminderTime' => '-15M',
'reminderDescription' => 'Reminder: '.$desc,
'fileName' => 'Leave-' . $request->getId()
], true);
if ($leaveType->getAttributes()['label'] == 'Sick'){
$startDate = $startDateData->format('d F');
$subject = "email.leave.requested_sick.";
$emailTemplate = 'email/user-notification/leave/requested-admin-sick.html.twig';
// condition today or not
if($isToday){
$startDate = $startDateData->format('d F');
$subject = "email.leave.requested_sick_today.";
$emailTemplate = 'email/user-notification/leave/requested-admin-sick-today.html.twig';
}
$this->mailgunService->sendEmailWithAttachment([
'subject' => $this->translator->trans($subject . 'user', [
'%leaveType%' => $dataleaveType,
'%startDate%' => $startDate,
// '%endDate%' => $endDate,
// '%isHalfStart%' => $isHalfStart,
// '%isHalfEnd%' => $isHalfEnd,
]),
'to' => $editedUser->getEmail(),
'template' => $emailTemplate,
'params' => [
'admin' => $admin,
'recipient' => $editedUser,
'group' => 'user',
'user' => $editedUser,
'leaveRequest' => $leaveRequest
],
'ical' => $icsData
], $loggedIn
);
foreach ($editedUser->getAllManager() as $manager) {
$this->mailgunService->sendEmail(
$this->translator->trans($subject . 'manager', [
'%user%' => $user,
'%leaveType%' => $dataleaveType,
'%startDate%' => $startDate,
/*
'%endDate%' => $endDate,
'%isHalfStart%' => $isHalfStart,
'%isHalfEnd%' => $isHalfEnd,
*/
]),
[$manager->getEmail()],
$emailTemplate,
[
'admin' => $admin,
'recipient' => $manager,
'group' => 'manager',
'user' => $editedUser,
'leaveRequest' => $leaveRequest
],
$loggedIn
);
}
} else{
$this->mailgunService->sendEmail(
$this->translator->trans($subject . 'admin', [
'%user%' => $user,
'%leaveType%' => $dataleaveType,
'%startDate%' => $startDate,
'%endDate%' => $endDate,
'%isHalfStart%' => $isHalfStart,
'%isHalfEnd%' => $isHalfEnd,
]),
[$admin->getEmail()],
$emailTemplate,
[
'admin' => $admin,
'recipient' => $admin,
'group' => 'admin',
'user' => $editedUser,
'leaveRequest' => $leaveRequest
],
$loggedIn
);
$this->mailgunService->sendEmail(
$this->translator->trans($subject . 'user', [
'%leaveType%' => $dataleaveType,
'%startDate%' => $startDate,
'%endDate%' => $endDate,
'%isHalfStart%' => $isHalfStart,
'%isHalfEnd%' => $isHalfEnd,
]),
[$editedUser->getEmail()],
$emailTemplate,
[
'admin' => $admin,
'recipient' => $editedUser,
'group' => 'user',
'user' => $editedUser,
'leaveRequest' => $leaveRequest
],
$loggedIn
);
foreach ($editedUser->getAllManager() as $manager) {
$this->mailgunService->sendEmail(
$this->translator->trans($subject . 'manager', [
'%user%' => $user,
'%leaveType%' => $dataleaveType,
'%startDate%' => $startDate,
'%endDate%' => $endDate,
'%isHalfStart%' => $isHalfStart,
'%isHalfEnd%' => $isHalfEnd,
]),
[$manager->getEmail()],
$emailTemplate,
[
'admin' => $admin,
'recipient' => $manager,
'group' => 'manager',
'user' => $editedUser,
'leaveRequest' => $leaveRequest
],
$loggedIn
);
}
foreach ($emailGroup as $groupName => $groupEmail) {
if ($groupName == 'hr') {
$this->mailgunService->sendEmail(
$this->translator->trans($subject . $groupName, [
'%user%' => $user,
'%leaveType%' => $dataleaveType,
'%startDate%' => $startDate,
'%endDate%' => $endDate,
'%isHalfStart%' => $isHalfStart,
'%isHalfEnd%' => $isHalfEnd,
]),
[$groupEmail],
$emailTemplate,
[
'admin' => $admin,
'recipient' => strtoupper($groupName) . ' Team',
'user' => $editedUser,
'group' => $groupName,
'leaveRequest' => $leaveRequest
],
$loggedIn
);
}
};
}
}
public function updateRequestLeaveEmail($request, $editedUser, $admin = '')
{
$loggedIn = $request ? true : false;
$emailGroup = $this->params->get('systemEmailGroup');
$emailOps = $this->params->get('systemEmailOps');
// $reminderLog = $editedUser->getReminder();
$user = $editedUser->getPersonalInfo()->getFirstName();
$leaveType = $request->getLeaveType();
$dataleaveType = ucwords($leaveType->getLeaveName());
$startDateData = $request->getStartDate();
$startDate = $startDateData->format('d F Y');
$isHalfStart = $request->getIsHalfStart();
$isHalfStartTime = $isHalfStart ? '130000' : '090000';
$isHalfStart = $isHalfStart ? 'PM' : 'AM';
$endDateData = $request->getEndDate();
$endDate = $endDateData->format('d F Y');
$isHalfEnd = $request->getIsHalfEnd();
$isHalfEndTime = $isHalfEnd ? '140000' : '180000';
$isHalfEnd = $isHalfEnd ? 'AM' : 'PM';
$today = new \DateTime();
$todayDateData = $today->format('Ymd');
$status = $request->getIsApproved() ? 'Approved' : 'Rejected';
// $leaveRequest = $this->entityManager->getRepository(LeaveRequest::class)->findOneBy(['user'=>$editedUser, 'leaveType'=>$leaveType, 'startDate' => $startDateData, 'endDate' => $endDateData ]);
$leaveRequest = $request;
$subject = "email.leave.update.";
$emailTemplate = 'email/user-notification/leave/status-update.html.twig';
$attendee = [
[
'name' => $request->getUser()->getPersonalInfo()->getFullName(),
'email' => $request->getUser()->getEmail(),
'role' => 'REQ-PARTICIPANT'
],
];
$startDateTime = $request->getStartDate()->format('Ymd') . ($isHalfStart != 'AM' ? 'T' . $isHalfStartTime : '');
$endDateTime = $request->getEndDate()->format('Ymd') . ($isHalfEnd != 'PM' || $isHalfStart != 'AM' ? 'T' . $isHalfEndTime : '');
if($request->getStartDate()->format('Ymd') != $request->getEndDate()->format('Ymd')){
if($isHalfEnd != 'PM' || $isHalfStart != 'AM'){
$endDateTime = $request->getEndDate()->format('Ymd') . 'T' . $isHalfEndTime;
}else{
$endDateTime = strval($request->getEndDate()->format('Ymd') + 1);
}
}
// $startDateTime = $request->getStartDate()->format('Ymd') . 'T' . $isHalfStartTime;
// $endDateTime = $request->getEndDate()->format('Ymd') . 'T' . $isHalfEndTime;
$ICSTitle = 'On ' . $leaveType->getAttributes()['label'] . ' Leave';
$desc = $editedUser->getPersonalInfo()->getFirstName().' on '. $leaveType->getAttributes()['label'] .' leave for '.$request->getDays().' day(s).\nFor urgent matters, please contact '.$editedUser->getManager()->getPersonalInfo()->getFirstName();
$icsData = $this->icsService->generateEventFile([
'uid' => $request->getId() . $request->getUser()->getId() . ':' . $request->getUser()->getEmail(),
'title' => $ICSTitle . ': ' . $request->getUser()->getPersonalInfo()->getFullName(),
'description' => $desc,
'startDateTime' => $startDateTime,
'endDateTime' => $endDateTime,
'location' => $request->getUser()->getOffice()->getFullName(),
'organizer' => [
'name' => $this->params->get('systemEmailName'),
'email' => $_SERVER['APP_ENV'] == 'prod' ? $this->params->get('systemEmailAddr') : 'devops@mediatropy.com'
],
// 'organizer' => [
// 'name' => $request->getUser()->getPersonalInfo()->getFullName(),
// 'email' => $request->getUser()->getEmail()
// ],
'attendee' => $attendee,
'reschedule' => 0,
'reminderTime' => '-15M',
'reminderDescription' => 'Reminder: '.$desc,
'fileName' => 'Leave-' . $request->getId()
], true);
if($leaveType->getAttributes()['label']=='Sick'){
$startDate = $startDateData->format('d F');
$subject = "email.leave.update_sick.";
$emailTemplate = 'email/user-notification/leave/status-update-sick.html.twig';
if($status == 'Rejected'){
$this->mailgunService->sendEmail(
$this->translator->trans($subject . 'user', [
'%leaveType%' => $dataleaveType,
'%startDate%' => $startDate,
// '%endDate%' => $endDate,
// '%isHalfStart%' => $isHalfStart,
// '%isHalfEnd%' => $isHalfEnd,
]),
[$editedUser->getEmail()],
$emailTemplate,
[
'admin' => $admin,
'recipient' => $editedUser,
'group' => 'user',
'user' => $editedUser,
'leaveRequest' => $leaveRequest
],
$loggedIn
);
}elseif($status == 'Approved'){
$this->mailgunService->sendEmailWithAttachment([
'subject' => $this->translator->trans($subject . 'user', [
'%leaveType%' => $dataleaveType,
'%startDate%' => $startDate,
// '%endDate%' => $endDate,
// '%isHalfStart%' => $isHalfStart,
// '%isHalfEnd%' => $isHalfEnd,
]),
'to' => $editedUser->getEmail(),
'template' => $emailTemplate,
'params' => [
'admin' => $admin,
'recipient' => $editedUser,
'group' => 'user',
'user' => $editedUser,
'leaveRequest' => $leaveRequest
],
'ical' => $icsData
], $loggedIn
);
}
foreach ($editedUser->getAllManager() as $manager) {
$this->mailgunService->sendEmail(
$this->translator->trans($subject . 'manager', [
'%user%' => $user,
'%leaveType%' => $dataleaveType,
'%startDate%' => $startDate,
/*
'%endDate%' => $endDate,
'%isHalfStart%' => $isHalfStart,
'%isHalfEnd%' => $isHalfEnd,
*/
]),
[$manager->getEmail()],
$emailTemplate,
[
'admin' => $admin,
'recipient' => $manager,
'group' => 'manager',
'user' => $editedUser,
'leaveRequest' => $leaveRequest
],
$loggedIn
);
}
if($startDateData->format("Ymd") >= $todayDateData || $endDateData->format("Ymd") >= $todayDateData){
$this->mailgunService->sendEmail(
$this->translator->trans($subject . 'ops', [
'%user%' => $user,
'%leaveType%' => $dataleaveType,
'%startDate%' => $startDate,
]),
[$emailOps],
$emailTemplate,
[
'admin' => $admin,
'recipient' => 'Team',
'group' => 'ops',
'user' => $editedUser,
'leaveRequest' => $leaveRequest
],
$loggedIn
);
}
}else{
if($status == 'Rejected'){
$this->mailgunService->sendEmail(
$this->translator->trans($subject . 'user', [
'%leaveType%' => $dataleaveType,
'%startDate%' => $startDate,
'%endDate%' => $endDate,
'%isHalfStart%' => $isHalfStart,
'%isHalfEnd%' => $isHalfEnd,
]),
[$editedUser->getEmail()],
$emailTemplate,
[
'recipient' => $editedUser,
'group' => 'user',
'user' => $editedUser,
'leaveRequest' => $leaveRequest
],
$loggedIn
);
}elseif($status == 'Approved'){
$this->mailgunService->sendEmailWithAttachment([
'subject' => $this->translator->trans($subject . 'user', [
'%leaveType%' => $dataleaveType,
'%startDate%' => $startDate,
'%endDate%' => $endDate,
'%isHalfStart%' => $isHalfStart,
'%isHalfEnd%' => $isHalfEnd,
]),
'to' => $editedUser->getEmail(),
'template' => $emailTemplate,
'params' => [
'recipient' => $editedUser,
'group' => 'user',
'user' => $editedUser,
'leaveRequest' => $leaveRequest
],
'ical' => $icsData
], $loggedIn
);
}
foreach ($editedUser->getAllManager() as $manager) {
$this->mailgunService->sendEmail(
$this->translator->trans($subject . 'manager', [
'%user%' => $user,
'%leaveType%' => $dataleaveType,
'%startDate%' => $startDate,
'%endDate%' => $endDate,
'%isHalfStart%' => $isHalfStart,
'%isHalfEnd%' => $isHalfEnd,
]),
[$manager->getEmail()],
$emailTemplate,
[
'recipient' => $manager,
'group' => 'manager',
'user' => $editedUser,
'leaveRequest' => $leaveRequest
],
$loggedIn
);
}
foreach ($emailGroup as $groupName => $groupEmail) {
if ($groupName == 'hr') {
$this->mailgunService->sendEmail(
$this->translator->trans($subject . $groupName, [
'%user%' => $user,
'%leaveType%' => $dataleaveType,
'%startDate%' => $startDate,
'%endDate%' => $endDate,
'%isHalfStart%' => $isHalfStart,
'%isHalfEnd%' => $isHalfEnd,
]),
[$groupEmail],
$emailTemplate,
[
'recipient' => strtoupper($groupName) . ' Team',
'user' => $editedUser,
'group' => $groupName,
'leaveRequest' => $leaveRequest
],
$loggedIn
);
}
}
}
}
public function deleteRequestLeaveEmail($request, $editedUser)
{
$loggedIn = $request ? true : false;
$emailGroup = $this->params->get('systemEmailGroup');
$emailOps = $this->params->get('systemEmailOps');
// $reminderLog = $editedUser->getReminder();
$user = $editedUser->getPersonalInfo()->getFirstName();
$leaveType = $request->getLeaveType();
$dataleaveType = ucwords($leaveType->getLeaveName());
$startDateData = $request->getStartDate();
$startDate = $startDateData->format('d F Y');
$isHalfStart = $request->getIsHalfStart();
$isHalfStartTime = $isHalfStart ? '130000' : '090000';
$isHalfStart = $isHalfStart ? 'PM' : 'AM';
$endDateData = $request->getEndDate();
$endDate = $endDateData->format('d F Y');
$isHalfEnd = $request->getIsHalfEnd();
$isHalfEndTime = $isHalfEnd ? '140000' : '180000';
$isHalfEnd = $isHalfEnd ? 'AM' : 'PM';
$today = new \DateTime();
$todayDateData = $today->format('Ymd');
$status = $request->getIsApproved() ? 'Approved' : 'Rejected';
// $leaveRequest = $this->entityManager->getRepository(LeaveRequest::class)->findOneBy(['user'=>$editedUser, 'leaveType'=>$leaveType, 'startDate' => $startDateData, 'endDate' => $endDateData ]);
$leaveRequest = $request;
$subject = "email.leave.delete.";
$emailTemplate = 'email/user-notification/leave/request-deleted.html.twig';
$attendee = [
[
'name' => $request->getUser()->getPersonalInfo()->getFullName(),
'email' => $request->getUser()->getEmail(),
'role' => 'REQ-PARTICIPANT'
],
];
$startDateTime = $request->getStartDate()->format('Ymd') . ($isHalfStart != 'AM' ? 'T' . $isHalfStartTime : '');
$endDateTime = $request->getEndDate()->format('Ymd') . ($isHalfEnd != 'PM' || $isHalfStart != 'AM' ? 'T' . $isHalfEndTime : '');
if($request->getStartDate()->format('Ymd') != $request->getEndDate()->format('Ymd')){
if($isHalfEnd != 'PM' || $isHalfStart != 'AM'){
$endDateTime = $request->getEndDate()->format('Ymd') . 'T' . $isHalfEndTime;
}else{
$endDateTime = strval($request->getEndDate()->format('Ymd') + 1);
}
}
// $startDateTime = $request->getStartDate()->format('Ymd') . 'T' . $isHalfStartTime;
// $endDateTime = $request->getEndDate()->format('Ymd') . 'T' . $isHalfEndTime;
$ICSTitle = 'On ' . $leaveType->getAttributes()['label'] . ' Leave';
$desc = $editedUser->getPersonalInfo()->getFirstName().' on '. $leaveType->getAttributes()['label'] .' leave for '.$request->getDays().' day(s).\nFor urgent matters, please contact '.$editedUser->getManager()->getPersonalInfo()->getFirstName();
$icsData = $this->icsService->generateEventFile([
'uid' => $request->getId() . $request->getUser()->getId() . ':' . $request->getUser()->getEmail(),
'title' => $ICSTitle . ': ' . $request->getUser()->getPersonalInfo()->getFullName(),
'description' => $desc,
'startDateTime' => $startDateTime,
'endDateTime' => $endDateTime,
'location' => $request->getUser()->getOffice()->getFullName(),
'organizer' => [
'name' => $this->params->get('systemEmailName'),
'email' => $_SERVER['APP_ENV'] == 'prod' ? $this->params->get('systemEmailAddr') : 'devops@mediatropy.com'
],
// 'organizer' => [
// 'name' => $request->getUser()->getPersonalInfo()->getFullName(),
// 'email' => $request->getUser()->getEmail()
// ],
'attendee' => $attendee,
'reschedule' => 0,
'reminderTime' => '-15M',
'reminderDescription' => 'Reminder: '.$desc,
'fileName' => 'Leave-' . $request->getId()
], true, 'CANCEL');
if($status == 'Rejected'){
// $this->mailgunService->sendEmail(
// $this->translator->trans($subject . 'user', [
// '%leaveType%' => $dataleaveType,
// '%startDate%' => $startDate,
// '%endDate%' => $endDate,
// '%isHalfStart%' => $isHalfStart,
// '%isHalfEnd%' => $isHalfEnd,
// ]),
// [$editedUser->getEmail()],
// $emailTemplate,
// [
// 'recipient' => $editedUser,
// 'group' => 'user',
// 'user' => $editedUser,
// 'leaveRequest' => $leaveRequest
// ],
// $loggedIn
// );
}elseif($status == 'Approved'){
$this->mailgunService->sendEmailWithAttachment([
'subject' => $this->translator->trans($subject . 'user', [
'%leaveType%' => $dataleaveType,
'%startDate%' => $startDate,
'%endDate%' => $endDate,
'%isHalfStart%' => $isHalfStart,
'%isHalfEnd%' => $isHalfEnd,
]),
'to' => $editedUser->getEmail(),
'template' => $emailTemplate,
'params' => [
'recipient' => $editedUser,
'group' => 'user',
'user' => $editedUser,
'leaveRequest' => $leaveRequest
],
'ical' => $icsData
], $loggedIn
);
}
foreach ($editedUser->getAllManager() as $manager) {
$this->mailgunService->sendEmail(
$this->translator->trans($subject . 'manager', [
'%user%' => $user,
'%leaveType%' => $dataleaveType,
'%startDate%' => $startDate,
'%endDate%' => $endDate,
'%isHalfStart%' => $isHalfStart,
'%isHalfEnd%' => $isHalfEnd,
]),
[$manager->getEmail()],
$emailTemplate,
[
'recipient' => $manager,
'group' => 'manager',
'user' => $editedUser,
'leaveRequest' => $leaveRequest
],
$loggedIn
);
}
foreach ($emailGroup as $groupName => $groupEmail) {
if ($groupName == 'hr') {
$this->mailgunService->sendEmail(
$this->translator->trans($subject . $groupName, [
'%user%' => $user,
'%leaveType%' => $dataleaveType,
'%startDate%' => $startDate,
'%endDate%' => $endDate,
'%isHalfStart%' => $isHalfStart,
'%isHalfEnd%' => $isHalfEnd,
]),
[$groupEmail],
$emailTemplate,
[
'recipient' => strtoupper($groupName) . ' Team',
'user' => $editedUser,
'group' => $groupName,
'leaveRequest' => $leaveRequest
],
$loggedIn
);
}
}
}
public function reminderRequestLeaveEmail($leaveData, $editedUser)
{
$loggedIn = false;
$emailGroup = $this->params->get('systemEmailGroup');
// $reminderLog = $editedUser->getReminder();
$user = $editedUser->getPersonalInfo()->getFirstName();
$leaveType = $leaveData->getLeaveType();
$dataleaveType = ucwords($leaveType->getLeaveName());
$startDate = $leaveData->getStartDate()->format('d F Y');
$endDate = $leaveData->getEndDate()->format('d F Y');
$isHalfStart = $leaveData->getIsHalfStart();
$isHalfStart = $isHalfStart ? 'PM' : 'AM';
$isHalfEnd = $leaveData->getIsHalfEnd();
$isHalfEnd = $isHalfEnd ? 'AM' : 'PM';
//$leaveRequest = $this->entityManager->getRepository(LeaveRequest::class)->findOneBy(['user'=>$editedUser, 'leaveType'=>$leaveType]);
$subject = "email.leave.reminder.";
$emailTemplate = 'email/user-notification/leave/request-reminder.html.twig';
$this->mailgunService->sendEmail(
$this->translator->trans($subject . 'user', [
'%leaveType%' => $dataleaveType,
'%startDate%' => $startDate,
'%endDate%' => $endDate,
'%isHalfStart%' => $isHalfStart,
'%isHalfEnd%' => $isHalfEnd,
]),
[$editedUser->getEmail()],
$emailTemplate,
[
'recipient' => $editedUser,
'group' => 'user',
'user' => $editedUser,
'leaveRequest' => $leaveData
],
$loggedIn
);
foreach ($editedUser->getAllManager() as $manager) {
$this->mailgunService->sendEmail(
$this->translator->trans($subject . 'manager', [
'%user%' => $user,
'%leaveType%' => $dataleaveType,
'%startDate%' => $startDate,
'%endDate%' => $endDate,
'%isHalfStart%' => $isHalfStart,
'%isHalfEnd%' => $isHalfEnd,
]),
[$manager->getEmail()],
$emailTemplate,
[
'recipient' => $manager,
'group' => 'manager',
'user' => $editedUser,
'leaveRequest' => $leaveData
],
$loggedIn
);
}
foreach ($emailGroup as $groupName => $groupEmail) {
if ($groupName == 'hr') {
$this->mailgunService->sendEmail(
$this->translator->trans($subject . $groupName, [
'%user%' => $user,
'%leaveType%' => $dataleaveType,
'%startDate%' => $startDate,
'%endDate%' => $endDate,
'%isHalfStart%' => $isHalfStart,
'%isHalfEnd%' => $isHalfEnd,
]),
[$groupEmail],
$emailTemplate,
[
'recipient' => strtoupper($groupName) . ' Team',
'user' => $editedUser,
'group' => $groupName,
'leaveRequest' => $leaveData
],
$loggedIn
);
}
};
}
public function dailyLeaveEmail($leaveData)
{
$loggedIn = false;
$emailOps = $this->params->get('systemEmailOps');
$today = date("d F");
// $reminderLog = $editedUser->getReminder();
$subject = $this->translator->trans('email.leave.ops.daily', ['%today%' => $today]);
$emailTemplate = 'email/user-notification/leave/daily-reminder.html.twig';
$this->mailgunService->sendEmail(
$subject,
[$emailOps],
$emailTemplate,
[
'leaveRequests' => $leaveData,
'loop' => 'daily'
],
$loggedIn
);
}
public function weeklyLeaveEmail($leaveData)
{
$loggedIn = false;
$emailOps = $this->params->get('systemEmailOps');
// $reminderLog = $editedUser->getReminder();
$subject = $this->translator->trans('email.leave.ops.weekly');
$emailTemplate = 'email/user-notification/leave/weekly-reminder.html.twig';
$this->mailgunService->sendEmail(
$subject,
[$emailOps],
$emailTemplate,
[
'leaveRequests' => $leaveData,
'loop' => 'weekly'
],
$loggedIn
);
}
public function leavePermanent(\App\Entity\User $user, $force = false, $cron = false,$forceexc='',$permanent=false,$option=array())
{
$jobstatus = $user->getPersonalInfo()->getJobStatus();
$execute = false;
if (!$cron) {
if ($jobstatus == 'form.job_status.permanent') {
if(!$permanent){$execute = true;}
}
}
$country = $user->getOffice()->getCountry();
$lpresult=array();
if ($cron) {
$dtx = $user->getPersonalInfo()->getJobJoinDate();
if ($dtx != null) {
$now = new \DateTime(date('Y-m-d'));
$now->modify('-3 months');
if (($now == $dtx) && ($jobstatus != 'form.job_status.permanent')) {
$execute = true;
}
}
}
if($forceexc=='run'){$execute=true;}
if ($execute) {
$em = $this->entityManager;
$yr = date('Y');
$leaveent = $em->getRepository(\App\Entity\LeaveEntitlement::class)->findBy(array('user' => $user, 'year' => $yr));
$dt=null;
if(!is_null($user->getPersonalInfo()->getJobPermanentDate())){
$dt = new \DateTime($user->getPersonalInfo()->getJobPermanentDate()->format('Y-m-d'));
}
$dt1 = new \DateTime($user->getPersonalInfo()->getJobJoinDate()->format('Y-m-d'));
$ls = new \DateTime($yr . '-12-31');
$office = $user->getOffice();
$leavetype = $em->getRepository(\App\Entity\LeaveType::class)->findBy(array('office' => $office));
$lvty = array();
$oldenan=null;
foreach ($leavetype as $l) {
$lvty['t' . $l->getId()] = $l;
if($l->getLeaveName()=='annual'){
$oldenan = $em->getRepository(\App\Entity\LeaveEntitlement::class)->findBy(array('user' => $user, 'year' => ($yr-1),'leaveType'=>$l->getId(),'leaveEntitlements'=>0));
}
}
ob_start();
foreach($lvty as $k=>$v){
// print_r($k);
}
$txt=ob_get_clean();
$lpresult['execute2']=$txt;
if ($leaveent != null) {
foreach ($leaveent as $l) {
$attr = $l->getAttributes();
$attrx = $l->getAttributes();
$attrp = $l->getLeaveType()->getAttributes();
foreach ($attrp as $k => $v) {
if (!isset($attr[$k])) {
$attr[$k] = $v;
}
}
$leaveyear = 12;
if (isset($lvty['t' . $l->getLeaveType()->getId()])) {
$leaveyear = $lvty['t' . $l->getLeaveType()->getId()]->getDays();
}
$lvcount=array('annual');
if ((in_array($l->getLeaveType()->getLeaveName(),$lvcount)) && ($l->getUser()->getId() == $user->getId())) {
if(isset($attr['prorate'])){
//if(!isset($attr['startleave'])){$attr['startleave']='';}
if ($force) {
unset($attr['prorate']);
}
if(is_null($l->getUpdatedAt())){unset($attr['prorate']);}
if($l->getLeaveEntitlements()==0){unset($attr['prorate']);}
}
if (!isset($attr['prorate'])) {
$dt = new \DateTime($user->getPersonalInfo()->getJobJoinDate()->format('Y-m-d'));
$lpresult['user']=$user->getPersonalInfo()->getFirstName();
$lpresult['execute1']='execute1';
if (!is_null($dt)) {
$lpresult['datejoin']=$dt->format('Y-m-d');
$df = $user->getPersonalInfo()->getJobJoinDate()->format('d');
$mm = $ls->diff($user->getPersonalInfo()->getJobJoinDate());
$mm = ($mm->format('%y') * 12) + $mm->format('%m');
$lpresult['totalmonthreal']=$mm;
if ($mm < 12) {
$mx = $mm + 1;
if ($df > 1) {
$mx = $mx - 1;
}
$lpresult['totalmonth']=$mx;
$cal = floor(($leaveyear / 12) * $mx);
$attrx['prorate'] = true;
$pr=$l->getParent();
if(is_null($pr) || ($pr==0)){
if(isset($attrx['given'])){
$gvx=$attrx['given'];
if(!is_array($attrx['given'])){$gvx=new \DateTime($attrx['given']);}
$gv=new \DateTime(date('Y-m-d'));
if($gv < $gvx){$attrx['given']=$gv->format('Y-m-d');}
}
}
if($l->getLeaveType()->getLeaveName()=='annual'){
$attrx=$this->_calculate_givendate($l->getYear(),$country,$attrx,$user->getPersonalInfo()->getJobJoinDate(),$user->getPersonalInfo()->getJobPermanentDate(),$jobstatus);
}
$l->setAttributes($attrx);
$ollf = $l->getLeaveEntitlements();
if($l->getLeaveType()->getLeaveName()=='annual'){
$lpresult['leavetype']=$l->getLeaveType()->getLeaveName();
$lpresult['calulate']=$cal;
}
$l->setLeaveEntitlements($cal);
$lf = ($cal - $ollf) + $l->getLeaveLeft();
$l->setLeaveLeft($lf);
$em->persist($l);
$em->flush();
}else{
if($l->getLeaveType()->getLeaveName()=='annual'){
if($l->getLeaveEntitlements()==0){
$l->setLeaveEntitlements($l->getLeaveType()->getDays());
$l->setLeaveLeft($l->getLeaveType()->getDays());
$em->persist($l);
$em->flush();
}
}
}
if(is_array($oldenan)){
$ls2=new \DateTime((date('Y')-1).'-12-31');
$mm = $ls2->diff($user->getPersonalInfo()->getJobJoinDate());
$mm = ($mm->format('%y') * 12) + $mm->format('%m');
if(($mm < 12) && ($mm >= 0)){
if($l->getLeaveType()->getLeaveName()=='annual'){
if(is_array($oldenan)){
foreach($oldenan as $lan){
if($lan->getLeaveEntitlements()==0){
$mx = $mm + 1;
if ($df > 1) {
$mx = $mx - 1;
}
$cal = floor(($leaveyear / 12) * $mx);
$lan->setLeaveEntitlements($cal);
$lan->setLeaveLeft($cal);
$em->persist($lan);
$em->flush();
}
}
}
}
}
}
}
//return true;
} else {
if($l->getLeaveType()->getLeaveName()=='annual'){
$attrx=$this->_calculate_givendate($l->getYear(),$country,$attrx,$user->getPersonalInfo()->getJobJoinDate(),$user->getPersonalInfo()->getJobPermanentDate(),$jobstatus);
$l->setAttributes($attrx);
$em->persist($l);
$em->flush();
}
//return false;
}
}else{
$pr=$l->getParent();
if(is_null($pr) || ($pr==0)){
$mm = $ls->diff($user->getPersonalInfo()->getJobJoinDate());
$mm = ($mm->format('%y') * 12) + $mm->format('%m');
$cal=$leaveyear;
if($mm < 12){
$ollf = $l->getLeaveEntitlements();
if($ollf ==0){
$l->setLeaveEntitlements($cal);
$lf = ($cal - $ollf) + $l->getLeaveLeft();
$l->setLeaveLeft($lf);
$em->persist($l);
$em->flush();
}
}
}
}
if($l->getLeaveType()->getLeaveName()=='annual'){
$attrx=$this->_calculate_givendate($l->getYear(),$country,$attrx,$user->getPersonalInfo()->getJobJoinDate(),$user->getPersonalInfo()->getJobPermanentDate(),$jobstatus);
$l->setAttributes($attrx);
$em->persist($l);
$em->flush();
}
}
}
if(!is_null($user)){
$lpresult['userr']=$user->getPersonalInfo()->getFirstName();
}
$rsback=$this->resetAll(array('user'=>$user,'logname'=>'log.leave.reset.permanent'));
foreach($rsback as $kr=>$r){
$lpresult['b'.$kr]=$r;
}
}
//Vietnam
/*$hf=fopen('../var/log/test.log','w');
ob_start();
print_r('country');
print_r($country);
print_r("\n");
$txt=ob_get_clean();
fwrite($hf,$txt);
fclose($hf);*/
if($country=='VN'){
$em = $this->entityManager;
$dtx = $user->getPersonalInfo()->getJobJoinDate();
if($dtx!=null){
$dty = new \DateTime($dtx->format('Y-m-d'));
$dty=$dty->format('Y');
$ynow = date('Y');
if(($ynow-$dty) <= 2){
$leavetype = $em->getRepository(\App\Entity\LeaveType::class)->findBy(array('office' => $user->getOffice()));
$lannual = null;
$lvtype=array();
foreach ($leavetype as $l) {
array_push($lvtype,$l);
if($l->getLeaveName()=='annual'){
$lannual=$l;
}
}
if(!is_null($lannual)){
$leaveent = $em->getRepository(\App\Entity\LeaveEntitlement::class)->findBy(array('user' => $user, 'year' => $ynow,'leaveType'=>$lannual));
if(!is_null($leaveent)){
foreach($leaveent as $l){
// first year set to 5
if(($ynow-$dty)==0){
$lf=$l->getLeaveLeft();
$tl=$l->getLeaveEntitlements();
$lf=$lf-($tl-5);
$l->setLeaveLeft($lf);
$l->setLeaveEntitlements(5);
$attr=$l->getAttributes();
if(!is_array($attr)){
$attr=$lannual->getAttributes();
}
$gv=new \DateTime($dtx->format('Y-m-d'));
$exp=new \DateTime($dtx->format('Y-m-d'));
$exp->modify('+1 year');
$exp->modify('-1 day');
$attr['given']=$gv->format('Y-m-d');
$attr['expires']=$exp->format('Y-m-d');
$l->setAttributes($attr);
$em->persist($l);
$em->flush();
}else{
$lf=$l->getLeaveLeft();
$tl=$l->getLeaveEntitlements();
$lf=$lf-($tl-$lannual->getDays());
$l->setLeaveLeft($lf);
$l->setLeaveEntitlements($lannual->getDays());
$attr=$l->getAttributes();
if(!is_array($attr)){
$attr=$lannual->getAttributes();
}
$gv=new \DateTime($ynow.'-'.$dtx->format('m-d'));
$exp=new \DateTime(($ynow+1).'-'.$dtx->format('m-d'));
$exp->modify('-1 day');
$attr['given']=$gv->format('Y-m-d');
$attr['expires']=$exp->format('Y-m-d');
$l->setAttributes($attr);
$em->persist($l);
$em->flush();
}
/*else if(($ynow-$dtx)==1){
//second year pro rate
$nm=new \DateTime($dtx->format('Y-m-d'));
$nm=$nm->format('m');
$nm=(12-$nm)+1;
$lf=$l->getLeft();
$tl=$l->getLeaveEntitlement();
$ct=floor($nm/$lannual->getDays());
$lf=$lf-($tl-$ct);
$l->setLeft($lf);
$l->getLeaveEntitlement($ct);
$attr=$l->getAttributes();
if(!is_array($attr)){
$attr=$lannual->getAttributes();
}
$gv=new \DateTime($dtx->format('Y-m-d'));
$gv->modify('+1 year');
$exp=new \DateTime(($year+2).'-03-31');
$attr['given']=$gv->format('Y-m-d');
$attr['expires']=$exp->format('Y-m-d');
$l->setAttributes($attr);
$em->persist($l);
$em->flush();
}*/
}
}else{
foreach($leavetype as $l){
$leave=$this->_add_leave_data($u,$opt['year'],$exp,$l);
if($leave!==false){
if(is_array($leave)){
foreach($leave as $lv){
$parent=$lv->getId();
$childType=$this->entityManager->getRepository(LeaveType::class)->findBy(array('office'=>$u->getOffice(),'parent'=>array($l->getId())));
if(count($childType) > 0){
foreach($childType as $c){
if(!isset($lent['u'.$uuid])){
$cleave=$this->_add_leave_data($u,$opt['year'],$exp,$c,$parent);
}else{
if(!isset($lent['u'.$uuid]['y'.$opt['year']])){
$cleave=$this->_add_leave_data($u,$opt['year'],$exp,$c,$parent);
}else{
if(!isset($lent['u'.$uuid]['y'.$opt['year']]['t'.$c->getId()])){
$cleave=$this->_add_leave_data($u,$opt['year'],$exp,$c,$parent);
}
}
}
}
}
}
}else{
$parent=$leave->getId();
$childType=$this->entityManager->getRepository(LeaveType::class)->findBy(array('office'=>$u->getOffice(),'parent'=>array($l->getId())));
if(count($childType) > 0){
foreach($childType as $c){
if(!isset($lent['u'.$uuid])){
$cleave=$this->_add_leave_data($u,$opt['year'],$exp,$c,$parent);
}else{
if(!isset($lent['u'.$uuid]['y'.$opt['year']])){
$cleave=$this->_add_leave_data($u,$opt['year'],$exp,$c,$parent);
}else{
if(!isset($lent['u'.$uuid]['y'.$opt['year']]['t'.$c->getId()])){
$cleave=$this->_add_leave_data($u,$opt['year'],$exp,$c,$parent);
}
}
}
}
}
}
}
}
}
}else{
}
}
}
}
return $lpresult;
}
function _getRequestLeave($arg){
$opt=array(
'year'=>date('Y'),
'type'=>array()
);
foreach($arg as $k=>$v){$opt[$k]=$v;}
$opt['year']=$opt['year']*1;
$em = $this->entityManager;
$rq=$em->createQueryBuilder()
->select('r')
->from(\App\Entity\LeaveRequest::class,'r')
->where('(r.endDate >= :last) and (r.startDate <= :now) and (r.leaveType in (:ltype))')
->setParameter('last',new \DateTime(($opt['year']-1).'-01-01'))
->setParameter('now',new \DateTime($opt['year'].'-12-31'))
->setParameter('ltype',$opt['type'])
->getQuery()->getResult();
return $rq;
}
function _takenRequest($arg){
$opt=array(
'year'=>date('Y'),
'type'=>array(),
'leave'=>array(),
);
foreach($arg as $k=>$v){$opt[$k]=$v;}
$rq=$this->_getRequestLeave($opt);
$sp=array();
$defaultexp=date('Ymd');
if($opt['year'] < date('Y')){$defaultexp=$opt['year'].'1231';}
$rleave=array();
foreach($opt['leave'] as $l){
$u=$l->getUser()->getId();
$lt=$l->getLeaveType()->getId();
if(!isset($rleave['u'.$u])){$rleave['u'.$u]=array();}
if(!isset($rleave['u'.$u]['l'.$lt])){$rleave['u'.$u]['l'.$lt]=array();}
$rleave['u'.$u]['l'.$lt]['y'.$l->getYear()]=$l->getId();
}
foreach($rq as $r){
$uu=$r->getUser();
$u=$uu->getId();
$tt=$r->getLeaveType();
$allo=$r->getAlocation();
$st=$r->getStartDate()->format('Y-m-d');
$st=strtotime($st);
$ed=$r->getEndDate()->format('Y-m-d');
$ed=strtotime($ed);
$yst=date('Y',$st); $yed=date('Y',$ed);
if(!isset($sp['u'.$u])){$sp['u'.$u]=array();}
if(isset($allo['data'])){
}else{
foreach($allo as $k=>$a){
switch ($k){
case 'error':
break;
case 'unpaid':
break;
case 'type':
break;
case 'dumper':
break;
case 'data':
break;
case 'child':
break;
default:
$yr=$yst;
$x=substr($k,0,1);
if($x!='y'){break;}
$yr=str_replace('y','',$k);
if(isset($rleave['u'.$u]['l'.$tt->getId()]['y'.$yr])){
$attr=$opt['leave']['l'.$rleave['u'.$u]['l'.$tt->getId()]['y'.$yr]]->getAttributes();
if(!isset($sp['u'.$u]['l'.$tt->getId()])){
$sp['u'.$u]['l'.$tt->getId()]=array();
}
if(!isset($sp['u'.$u]['l'.$tt->getId()]['y'.$yr])){
$sp['u'.$u]['l'.$tt->getId()]['y'.$yr]=array();
$sp['u'.$u]['l'.$tt->getId()]['y'.$yr]['carry']=0;
$sp['u'.$u]['l'.$tt->getId()]['y'.$yr]['taken']=0;
}
if(isset($attr['carryDate'])){
$cd=strtotime($attr['carryDate']);
$cd=date('Ymd',$cd);
//carryover
if(date('Ymd',$ed) >= $cd){
//full carryover
if(date('Ymd',$yst) >= $cd){
$sp['u'.$u]['l'.$tt->getId()]['y'.$yr]['carry']+=$a;
}else{
//half
$day=abs(floor(($ed-$st)/(24*60*60)))+1;
$dy=$st;
for($i=0;$i<$day;$i++){
$tg=date('Ymd',$dy);
if($tg >= $cd){
$sp['u'.$u]['l'.$tt->getId()]['y'.$yr]['carry']+=$a;
}else{
$sp['u'.$u]['l'.$tt->getId()]['y'.$yr]['taken']+=$a;
}
$dy=strtotime('+1 day',$dy);
}
}
}else{
$sp['u'.$u]['l'.$tt->getId()]['y'.$yr]['taken']+=$a;
}
}else{
$sp['u'.$u]['l'.$tt->getId()]['y'.$yr]['taken']+=$a;
}
}
}
}
}
}
return $sp;
}
public function leaveEntitlement($option=array()){
$default=array(
'user'=>null,
'office'=>'',
'manager'=>'',
'leaveType'=>'',
'page'=>1,
'limit'=>20,
'keyword'=>'',
'order'=>'',
'orderBy'=>'',
'year'=>date('Y'),
'byoffice'=>false
);
$opt=$default;
$em = $this->entityManager;
foreach($option as $k=>$v){$opt[$k]=$v;}
if(($opt['year']=='') || is_null($opt['year'])){$opt['year']=date('Y');}
$oldsearch=array('year'=>array($opt['year']-2,$opt['year']-1));
if(!is_null($opt['user'])){$oldsearch['user']=$opt['user'];}
$ynow1=date('Y');
$dataentid=array();
$leaves=array();
$entsearch=array(
'year'=>array($opt['year']-1,$opt['year'])
);
if(!is_null($opt['user'])){$entsearch['user']=$opt['user'];}
$leaveEntitlement=$em->getRepository(LeaveEntitlement::class)->findBy($entsearch);
$ynow1=date('Y');
$adjustments=array();
$adjdata=array();
$final=array();
//arange leave
$adjlast=date('Ymd');
if($opt['year']!=$ynow1){$adjlast=$opt['year'].'1231';}
$adjstart=($opt['year']-1).'0101';
$lvlist=array();
$rleave=array();
foreach($leaveEntitlement as $l){
$tt=$l->getLeaveType();
$uu=$l->getUser();
$u=$uu->getId();
$t=$tt->getId();
$y=$l->getYear();
$attr=$l->getAttributes();
$dataentid['l'.$l->getId()]=$l;
if(!isset($rleave['u'.$u])){$rleave['u'.$u]=array();}
if(!isset($rleave['u'.$u]['l'.$t])){$rleave['u'.$u]['l'.$t]=array();}
$rleave['u'.$u]['l'.$t]['y'.$l->getYear()]=$l;
if($uu->getIsActive()){
if(!isset($adjustments['u'.$u])){
$adjustments['u'.$u]=array();
$adjustments['u'.$u]['total']=0;
$adjustments['u'.$u]['taken']=0;
$adjustments['u'.$u]['left']=0;
}
if($tt->getLeaveName()=='adjustment'){
if(isset($attr['expires'])){
$d=new \DateTime($attr['expires']);
$g=new \DateTime($attr['given']);
$adjok=false;
if(($adjlast <= $d->format('Ymd')) && ($adjlast >= $g->format('Ymd'))){$adjok=true;}
if(($d->format('Ymd') <= $adjlast) && ($g->format('Ymd') >= $adjstart)){$adjok=true;}
if($adjok){
if(!isset($adjustments['u'.$u])){
$adjustments['u'.$u]=array();
$adjustments['u'.$u]['total']=0;
$adjustments['u'.$u]['left']=0;
};
$adjustments['u'.$u]['total']+=$l->getLeaveEntitlements();
$adjustments['u'.$u]['left']+=$l->getLeaveLeft();
/*if(!isset($adjdata['u'.$u])){$adjdata['u'.$u]=array();}
$adjdata['u'.$u]['l'.$l->getId()]=clone $l;*/
$adjdata['l'.$l->getId()]=array();
$adjdata['l'.$l->getId()]['expire']=new \DateTime($attr['expires']);
$adjdata['l'.$l->getId()]['given']=new \DateTime($attr['given']);
$adjdata['l'.$l->getId()]['total']=$l->getLeaveEntitlements();
}
}
}else{
$ok=true;
if(($attr['mode']=='fix') && ($y!=$opt['year'])){$ok=false;}
if($ok){
if(!isset($leaves['u'.$u])){$leaves['u'.$u]=array();}
if(!isset($leaves['u'.$u]['y'.$y])){$leaves['u'.$u]['y'.$y]=array();}
$leaves['u'.$u]['y'.$y]['t'.$t]=clone $l;
}
}
}
if(($tt->getLeaveName()=='annual') && (!in_array($tt->getId(),$lvlist))){
array_push($lvlist,$tt->getId());
}
}
//find request for now and last year for carry over
$rqlist=array();
$carrydate=array();
$useradj=array();
$sprq=$this->_takenRequest(array(
'year'=>$opt['year'],
'type'=>$lvlist,
'leave'=>$dataentid
));
$defaultstart=($opt['year']-2).'0901';
$defaultexp=($opt['year']+1).'1231';
foreach($leaveEntitlement as $u=>$l){
$lu=$l->getUser();
$luid=$lu->getId();
$lt=$l->getLeaveType();
$ltid=$lt->getId();
$lyr=$l->getYear();
$attr=$l->getAttributes();
if ($lu->getIsActive()){
$noadd=isset($attr['noadd'])?$attr['noadd']:false;
if(!$noadd){
if(isset($attr['expires'])){
if(is_array($attr['expires'])){$attr['expires']=$attr['expires']['date'];}
$attr['expires']=date('Ymd',strtotime($attr['expires']));
}else{
$attr['expires']=$l->getYear().'1231';
}
if(isset($attr['given'])){
if(is_array($attr['given'])){$attr['given']=$attr['given']['date'];}
$attr['given']=date('Ymd',strtotime($attr['given']));
}else{
$attr['given']=$l->getYear().'0101';
}
if(isset($attr['carryDate'])){
$crdt=new \DateTime($attr['carryDate']);
$crdt->modify('-1 day');
$crdt=$crdt->format('Y-m-d');
}
if(($attr['given'] >= $defaultstart) && ($attr['expires'] <= $defaultexp)){
if($lyr!=$opt['year']){
if(isset($sprq['u'.$luid])){
if(isset($sprq['u'.$luid]['l'.$ltid])){
if(isset($sprq['u'.$luid]['l'.$ltid]['y'.$lyr])){
if(isset($rleave['u'.$luid])){
if(isset($rleave['u'.$luid]['l'.$ltid])){
if(isset($rleave['u'.$luid]['l'.$ltid]['y'.$lyr])){
$carry = clone $rleave['u'.$luid]['l'.$ltid]['y'.$lyr];
$cattr=$carry->getAttributes();
$cattr['label']='Carry Over '.$lyr;
$carry->setAttributes($cattr);
$ctotal=$l->getLeaveEntitlements();
$ctotal=$ctotal-$sprq['u'.$luid]['l'.$ltid]['y'.$lyr]['taken'];
$carry->setLeaveEntitlements($ctotal);
array_push($final,array('data'=>$carry,'sort'=>$carry->getUser()->getPersonalInfo()->getFullName()));
}
/*$cattr=$carry->getAttributes();
$cattr['label']='Carry Over';
$carry->setAttributes($cattr);
$ctotal=$l->getLeaveEntitlement();
$ctotal=$ctotal-$sprq['u'.$luid]['l'.$ltid]['taken'];
$carry->setLeaveEntitlement($ctotal);*/
//array_push($final,array('data'=>$carry,'sort'=>$carry->getUser()->getPersonalInfo()->getFullName()));
}
}
}
}
}
}
if(isset($attr['carryDate'])){
$attr['expires']=$crdt;
$l->setAttributes($attr);
$attr['expires']=date('Ymd',strtotime($attr['expires']));
}
if($attr['expires'] >= ($opt['year'].'1231')){
array_push($final,array('data'=>$l,'sort'=>$lu->getPersonalInfo()->getFullName()));
}
}
}
}
}
//end find last casrry
$now = new \DateTime(date('Y-m-d'));
if($opt['year'] < $now->format('Y')){
$now = new \DateTime($opt['year'].'-12-31');
}
if(($opt['keyword']!='') || ($opt['office']!='') || ($opt['manager']!='')){
$ff=array_merge($final,array());
$final=array();
foreach($ff as $f){
$okf=0;
$okt=0;
$nmu=$f['data']->getUser();
$nm=$nmu->getPersonalInfo()->getFullName();
if($opt['keyword']!=''){
$okt++;
$nm=strtolower($nm);
$opt['keyword']=strtolower($opt['keyword']);
if(strpos($nm,$opt['keyword'])!==false){
$okf++;
}
}
if($opt['office']!=''){
$okt++;
$nmo=$nmu->getOffice()->getId();
$nooffice='';
if(is_object($opt['office'])){$nooffice=$opt['office']->getId();}else{$nooffice=$opt['office'];}
if($nmo==$nooffice){$okf++;}
}
if($opt['manager']!=''){
$okt++;
$nmo=$nmu->getAllManager();
foreach($nmo as $m){
if($m->getId()==$opt['manager']){$okf++;}
}
}
if($okf==$okt){
array_push($final,$f);
}
}
}
usort($final,function($a,$b){
if($a['sort'] > $b['sort']){return 1;}
return 0;
});
$c=count($final);
return array(
'data'=> array_slice($final,($opt['page']-1)*$opt['limit'],$opt['limit']),
'adjustment'=>$adjustments,
'total'=>$c
);
}
private function _lefts($options){
$default=array(
'user'=>null,
'start'=>date('Y').'-01-01',
'end'=>date('Y').'-12-31'
);
$opt=$default;
foreach($options as $k=>$v){$opt[$k]=$v;}
$em = $this->entityManager;
$yr=new \DateTime($opt['start']);
$yr=$yr->format('Y');
$yr=$yr-1;
$years=array();
$yre=new \DateTime($opt['end']);
$yre=$yre->format('Y');
for($i=$yr;$i<=$yre;$i++){
$years[count($years)]=$i;
}
$oldsearch=array('year' => $years);
if(!is_null($opt['user'])){ $oldsearch['user']=$opt['user']; }
$leavesold = $em->getRepository(\App\Entity\LeaveEntitlement::class)->findBy($oldsearch);
$lefts = array();
$entbyid = array();
$now=new \DateTime(date('Y-m-d'));
$leavea=array();
foreach ($leavesold as $l) {
if(!isset($leavea['u'.$l->getUser()->getId()])){
$leavea['u'.$l->getUser()->getId()]=array();
}
if(!isset($leavea['u'.$l->getUser()->getId()]['y'.$l->getYear()])){
$leavea['u'.$l->getUser()->getId()]['y'.$l->getYear()]=array();
}
$leavea['u'.$l->getUser()->getId()]['y'.$l->getYear()]['t'.$l->getLeaveType()->getId()]=$l;
}
foreach ($leavesold as $l) {
$uid = $l->getUser()->getId();
$pr = $l->getParent();
if (($pr == null) || ($pr == 0)) {
if (!isset($lefts['u' . $uid])) {
$lefts['u' . $uid] = array();
}
if (!isset($lefts['u' . $uid]['y' . $l->getYear()])) {
$lefts['u' . $uid]['y' . $l->getYear()] = array();
}
$attr=$l->getAttributes();
if(isset($attr['given']) && isset($attr['expires'])){
if(is_array($attr['given'])){
$gv=new \DateTime($attr['given']['date']);
}else{
$gv=new \DateTime($attr['given']);
}
if(is_array($attr['expires'])){
$exp=new \DateTime($attr['expires']['date']);
}else{
$exp=new \DateTime($attr['expires']);
}
if(($exp >= $now) && ($gv <= $now)){
if(!isset($lefts['u' . $uid]['y' . $l->getYear()]['t' . $l->getLeaveType()->getId()])){
$lefts['u' . $uid]['y' . $l->getYear()]['t' . $l->getLeaveType()->getId()]=0;
}
$lf = $l->getLeaveLeft();
$lefts['u' . $uid]['y' . $l->getYear()]['t' . $l->getLeaveType()->getId()] += ($lf*1);
}
}else{
if(!isset($lefts['u' . $uid]['y' . $l->getYear()]['t' . $l->getLeaveType()->getId()])){
$lefts['u' . $uid]['y' . $l->getYear()]['t' . $l->getLeaveType()->getId()]=0;
}
$lf = $l->getLeaveLeft();
$lefts['u' . $uid]['y' . $l->getYear()]['t' . $l->getLeaveType()->getId()] += ($lf*1);
}
if(isset($leavea['u'.$uid])){
if(isset($leavea['u'.$uid]['y'.($l->getYear()-1)])){
if(isset($leavea['u'.$uid]['y'.($l->getYear()-1)]['t'.$l->getLeaveType()->getId()])){
$l2=$leavea['u'.$uid]['y'.($l->getYear()-1)]['t'.$l->getLeaveType()->getId()];
$attr2=$l2->getAttributes();
if(isset($attr2['given']) && isset($attr2['expires'])){
if(is_array($attr2['given'])){
$gv=new \DateTime($attr2['given']['date']);
}else{
$gv=new \DateTime($attr2['given']);
}
if(is_array($attr2['expires'])){
$exp=new \DateTime($attr2['expires']['date']);
}else{
$exp=new \DateTime($attr2['expires']);
}
if(($exp >= $now) && ($gv <= $now)){
$lf = $l2->getLeaveLeft();
if(!isset($lefts['u' . $uid]['y' . $l->getYear()]['t' . $l->getLeaveType()->getId()])){
$lefts['u' . $uid]['y' . $l->getYear()]['t' . $l->getLeaveType()->getId()]=0;
}
$lefts['u' . $uid]['y' . $l->getYear()]['t' . $l->getLeaveType()->getId()] += ($lf*1);
}
}
}
}
}
}
$entbyid['c'.$l->getId()] = $l;
}
foreach ($leavesold as $l) {
$pr = $l->getParent();
if (($pr != null) && ($pr != 0)) {
if(isset($entbyid['c'.$pr])){
$ll = $entbyid['c'.$pr];
$uid = $ll->getUser()->getId();
$lf = $l->getLeaveLeft();
if(isset($lefts['u' . $uid]['y' . $ll->getYear()]['t' . $ll->getLeaveType()->getId()])){
$attr=$l->getAttributes();
if(isset($attr['given']) && isset($attr['expires'])){
if(is_array($attr['given'])){
$gv=new \DateTime($attr['given']['date']);
}else{
$gv=new \DateTime($attr['given']);
}
if(is_array($attr['expires'])){
$exp=new \DateTime($attr['expires']['date']);
}else{
$exp=new \DateTime($attr['expires']);
}
if(($exp >= $now) && ($gv <= $now)){
if(!isset($lefts['u' . $uid]['y' . $ll->getYear()]['t' . $ll->getLeaveType()->getId()])){
$lefts['u' . $uid]['y' . $ll->getYear()]['t' . $ll->getLeaveType()->getId()]=0;
}
$lefts['u' . $uid]['y' . $ll->getYear()]['t' . $ll->getLeaveType()->getId()] += ($lf*1);
}
}else{
if(!isset($lefts['u' . $uid]['y' . $ll->getYear()]['t' . $ll->getLeaveType()->getId()])){
$lefts['u' . $uid]['y' . $ll->getYear()]['t' . $ll->getLeaveType()->getId()]=0;
}
$lefts['u' . $uid]['y' . $ll->getYear()]['t' . $ll->getLeaveType()->getId()] += ($lf*1);
}
}
if(isset($leavea['u'.$uid])){
if(isset($leavea['u'.$uid]['y'.($ll->getYear()-1)])){
if(isset($leavea['u'.$uid]['y'.($ll->getYear()-1)]['t'.$l->getLeaveType()->getId()])){
$l2=$leavea['u'.$uid]['y'.($l->getYear()-1)]['t'.$l->getLeaveType()->getId()];
$attr2=$l2->getAttributes();
if(isset($attr2['given']) && isset($attr2['expires'])){
if(is_array($attr2['given'])){
$gv=new \DateTime($attr2['given']['date']);
}else{
$gv=new \DateTime($attr2['given']);
}
if(is_array($attr2['expires'])){
$exp=new \DateTime($attr2['expires']['date']);
}else{
$exp=new \DateTime($attr2['expires']);
}
if(($exp >= $now) && ($gv <= $now)){
$lf = $l2->getLeaveLeft();
if(!isset($lefts['u' . $uid]['y' . $ll->getYear()]['t' . $ll->getLeaveType()->getId()])){
$lefts['u' . $uid]['y' . $ll->getYear()]['t' . $ll->getLeaveType()->getId()]=0;
}
$lefts['u' . $uid]['y' . $ll->getYear()]['t' . $ll->getLeaveType()->getId()] += ($lf*1);
}
}
}
}
}
}
}
}
return $lefts;
}
private function _countDays($start,$end, $country,$am=false,$pm=false){
$em = $this->entityManager;
$startdate=new \DateTime($start);
$enddate=new \DateTime($end);
$offday = array(0, 6);
$holidayrp = $em->getRepository(\App\Entity\LeaveBankHoliday::class)->findBy(array('location' => $country));
$holiday = array();
foreach ($holidayrp as $h) {
if(!is_null($h->getEndDate())){
$dte = new \DateTime($h->getEndDate()->format('Y-m-d'));
$dtex=new \DateTime($h->getDate()->format('Y-m-d'));
while($dtex <= $dte){
$holiday[count($holiday)] = $dtex->format('Y-m-d');
$dtex->modify('+1 day');
}
}else{
$dtex=new \DateTime($h->getDate()->format('Y-m-d'));
$holiday[count($holiday)] = $dtex->format('Y-m-d');
}
}
$daterange = $startdate->diff($enddate);
$daterange = $daterange->format('%a');
$daterange = $daterange + 1;
$days=0;
$date=new \DateTime($start);
for ($d = 0; $d < $daterange; $d++) {
$ok=true;
$w = $date->format('w');
$h = $date->format('Y-m-d');
if (in_array($w, $offday)) {$ok = false;}
if (in_array($h, $holiday)) {$ok = false;}
if($ok){
$cutam = 0;
$cutpm = 0;
if (($d == 0) && ($am)){$cutam = 0.5;}
if ($d == ($daterange - 1) && ($pm)) {$cutpm = 0.5;}
$days++;
$days=$days-$cutam;
$days=$days-$cutpm;
}
$date->modify('+1 day');
}
if($days < 1){$days=0.5;}
return $days;
}
public function leaveRequest($option=array()){
$default=array(
'user'=>null,
'office'=>'',
'leaveType'=>'',
'leaveStatus'=>'',
'page'=>1,
'limit'=>20,
'keyword'=>'',
'order'=>'',
'orderBy'=>'',
'start'=>date('Y').'-01-01',
'end'=>date('Y').'-12-31',
'manager'=>''
);
$opt=$default;
$em = $this->entityManager;
//$opt['user']=$em->getRepository(\App\Entity\User::class)->find(51);
foreach($option as $k=>$v){$opt[$k]=$v;}
if(($opt['start']=='') || is_null($opt['start'])){$opt['start']=date('Y').'-01-01';}
if(($opt['end']=='') || is_null($opt['end'])){$opt['end']=date('Y').'-12-31';}
$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']);
$leaveRequestTotal = $em->getRepository(LeaveRequest::class)->countByPage($opt['keyword'], $opt['manager'], $opt['leaveStatus'],$opt['leaveType'],$opt['office'],$opt['start'],$opt['end'],$opt['user']);
$yr=new \DateTime($opt['start']);
$yr=$yr->format('Y');
$yr=$yr-1;
$years=array();
$yre=new \DateTime($opt['end']);
$yre=$yre->format('Y');
for($i=$yr;$i<=$yre;$i++){
$years[count($years)]=$i;
}
$oldsearch=array('year' => $years);
if(!is_null($opt['user'])){ $oldsearch['user']=$opt['user']; }
$leavesold = $em->getRepository(LeaveEntitlement::class)->findBy($oldsearch);
$lefts = array();
$entbyid = array();
$now=new \DateTime(date('Y-m-d'));
$leavea=array();
foreach ($leavesold as $l) {
if(!isset($leavea['u'.$l->getUser()->getId()])){
$leavea['u'.$l->getUser()->getId()]=array();
}
if(!isset($leavea['u'.$l->getUser()->getId()]['y'.$l->getYear()])){
$leavea['u'.$l->getUser()->getId()]['y'.$l->getYear()]=array();
}
$leavea['u'.$l->getUser()->getId()]['y'.$l->getYear()]['t'.$l->getLeaveType()->getId()]=$l;
}
foreach ($leavesold as $l) {
$uid = $l->getUser()->getId();
$pr = $l->getParent();
if (($pr == null) || ($pr == 0)) {
if (!isset($lefts['u' . $uid])) {
$lefts['u' . $uid] = array();
}
if (!isset($lefts['u' . $uid]['y' . $l->getYear()])) {
$lefts['u' . $uid]['y' . $l->getYear()] = array();
}
$attr=$l->getAttributes();
if(isset($attr['given']) && isset($attr['expires'])){
if(is_array($attr['given'])){
$gv=new \DateTime($attr['given']['date']);
}else{
$gv=new \DateTime($attr['given']);
}
if(is_array($attr['expires'])){
$exp=new \DateTime($attr['expires']['date']);
}else{
$exp=new \DateTime($attr['expires']);
}
if(($exp >= $now) && ($gv <= $now)){
if(!isset($lefts['u' . $uid]['y' . $l->getYear()]['t' . $l->getLeaveType()->getId()])){
$lefts['u' . $uid]['y' . $l->getYear()]['t' . $l->getLeaveType()->getId()]=0;
}
$lf = $l->getLeaveLeft();
$lefts['u' . $uid]['y' . $l->getYear()]['t' . $l->getLeaveType()->getId()] += ($lf*1);
}
}else{
if(!isset($lefts['u' . $uid]['y' . $l->getYear()]['t' . $l->getLeaveType()->getId()])){
$lefts['u' . $uid]['y' . $l->getYear()]['t' . $l->getLeaveType()->getId()]=0;
}
$lf = $l->getLeaveLeft();
$lefts['u' . $uid]['y' . $l->getYear()]['t' . $l->getLeaveType()->getId()] += ($lf*1);
}
if(isset($leavea['u'.$uid])){
if(isset($leavea['u'.$uid]['y'.($l->getYear()-1)])){
if(isset($leavea['u'.$uid]['y'.($l->getYear()-1)]['t'.$l->getLeaveType()->getId()])){
$l2=$leavea['u'.$uid]['y'.($l->getYear()-1)]['t'.$l->getLeaveType()->getId()];
$attr2=$l2->getAttributes();
if(isset($attr2['given']) && isset($attr2['expires'])){
if(is_array($attr2['given'])){
$gv=new \DateTime($attr2['given']['date']);
}else{
$gv=new \DateTime($attr2['given']);
}
if(is_array($attr2['expires'])){
$exp=new \DateTime($attr2['expires']['date']);
}else{
$exp=new \DateTime($attr2['expires']);
}
if(($exp >= $now) && ($gv <= $now)){
$lf = $l2->getLeaveLeft();
if(!isset($lefts['u' . $uid]['y' . $l->getYear()]['t' . $l->getLeaveType()->getId()])){
$lefts['u' . $uid]['y' . $l->getYear()]['t' . $l->getLeaveType()->getId()]=0;
}
$lefts['u' . $uid]['y' . $l->getYear()]['t' . $l->getLeaveType()->getId()] += ($lf*1);
}
}
}
}
}
}
$entbyid['c'.$l->getId()] = $l;
}
foreach ($leavesold as $l) {
$pr = $l->getParent();
if (($pr != null) && ($pr != 0)) {
if(isset($entbyid['c'.$pr])){
$ll = $entbyid['c'.$pr];
$uid = $ll->getUser()->getId();
$lf = $l->getLeaveLeft();
if(isset($lefts['u' . $uid]['y' . $ll->getYear()]['t' . $ll->getLeaveType()->getId()])){
$attr=$l->getAttributes();
if(isset($attr['given']) && isset($attr['expires'])){
if(is_array($attr['given'])){
$gv=new \DateTime($attr['given']['date']);
}else{
$gv=new \DateTime($attr['given']);
}
if(is_array($attr['expires'])){
$exp=new \DateTime($attr['expires']['date']);
}else{
$exp=new \DateTime($attr['expires']);
}
if(($exp >= $now) && ($gv <= $now)){
if(!isset($lefts['u' . $uid]['y' . $ll->getYear()]['t' . $ll->getLeaveType()->getId()])){
$lefts['u' . $uid]['y' . $ll->getYear()]['t' . $ll->getLeaveType()->getId()]=0;
}
$lefts['u' . $uid]['y' . $ll->getYear()]['t' . $ll->getLeaveType()->getId()] += ($lf*1);
}
}else{
if(!isset($lefts['u' . $uid]['y' . $ll->getYear()]['t' . $ll->getLeaveType()->getId()])){
$lefts['u' . $uid]['y' . $ll->getYear()]['t' . $ll->getLeaveType()->getId()]=0;
}
$lefts['u' . $uid]['y' . $ll->getYear()]['t' . $ll->getLeaveType()->getId()] += ($lf*1);
}
}
if(isset($leavea['u'.$uid])){
if(isset($leavea['u'.$uid]['y'.($ll->getYear()-1)])){
if(isset($leavea['u'.$uid]['y'.($ll->getYear()-1)]['t'.$l->getLeaveType()->getId()])){
$l2=$leavea['u'.$uid]['y'.($l->getYear()-1)]['t'.$l->getLeaveType()->getId()];
$attr2=$l2->getAttributes();
if(isset($attr2['given']) && isset($attr2['expires'])){
if(is_array($attr2['given'])){
$gv=new \DateTime($attr2['given']['date']);
}else{
$gv=new \DateTime($attr2['given']);
}
if(is_array($attr2['expires'])){
$exp=new \DateTime($attr2['expires']['date']);
}else{
$exp=new \DateTime($attr2['expires']);
}
if(($exp >= $now) && ($gv <= $now)){
$lf = $l2->getLeaveLeft();
if(!isset($lefts['u' . $uid]['y' . $ll->getYear()]['t' . $ll->getLeaveType()->getId()])){
$lefts['u' . $uid]['y' . $ll->getYear()]['t' . $ll->getLeaveType()->getId()]=0;
}
$lefts['u' . $uid]['y' . $ll->getYear()]['t' . $ll->getLeaveType()->getId()] += ($lf*1);
}
}
}
}
}
}
}
}
$leaves=array();
$em = $this->entityManager;
foreach($leaveRequest as $l){
$uid=$l->getUser()->getId();
$ty=$l->getLeaveType()->getId();
$yrx=$l->getStartDate();
$yrx=$yrx->format('Y');
if($l->getDays()==0){
if(!is_null($l->getIsApproved())){
if($l->getIsApproved()==false){
$days=$this->_countDays($l->getStartDate()->format('Y-m-d'),$l->getEndDate()->format('Y-m-d'),$l->getUser()->getOffice()->getCountry(),$l->getIsHalfStart(),$l->getIsHalfEnd());
$l->setDays($days);
$em->persist($l);
$em->flush();
}
}
}
$c=count($leaves);
$cl=clone $l;
$leaves[$c]=$cl;
if(isset($lefts['u'.$uid]['y'.$yrx]['t'.$ty])){
$dy=$lefts['u'.$uid]['y'.$yrx]['t'.$ty];
}else{
$dy=0;
}
$leaves[$c]->setDaysLeft($dy);
}
/*if(!is_null($opt['user'])){
$email=$opt['user']->getEmail();
//joan.ilari@mediatropy.com
if($email == 'very.sukawirawan@mediatropy.com'){
$hf=fopen('../var/log/test.log','a');
ob_start();
print_r($leaveRequestTotal."\n");
foreach($leaves as $l){
print_r($email.':'.$l->getLeaveType()->getLeaveName().':');
print_r($l->getStartDate()->format('Y-m-d'));
print_r("\n");
}
$txt=ob_get_clean();
fwrite($hf,$txt);
fclose($hf);
}
}*/
if(count($leaves) > $leaveRequestTotal){$leaveRequestTotal=count($leaves);}
return(array(
'data'=>$leaves,
'total'=>$leaveRequestTotal
));
}
/*public function _prorate($joindate,$endyear,$max,$country=''){
$endyear=new \DateTime($endyear);
$joindate=new \DateTime($joindate);
if($country==='VN'){
$ey= $endyear->format('Y').'-'.$joindate->format('m-d');
$endyear=new \DateTime($ey);
}
$diff=$endyear->diff($joindate);
$month=($diff->y * 12)+$diff->m;
$date=intval($joindate->format('d'));
if($date==1){$month+=1;}
$prorate=round(($month/12)*$max);
if(($country==='VN') && ($month < 12)){$prorate=5;}
if($prorate > $max){$prorate=$max;}
return $prorate;
}*/
/* Save Enteltainment Part */
public function _prorate($joindate,$endyear,$max,$config=array(),$isprorate=true){
$endyear=new \DateTime($endyear);
$joindate=new \DateTime($joindate);
$diff=$endyear->diff($joindate);
$month=($diff->y * 12)+$diff->m;
$date=intval($joindate->format('d'));
if($date==1){$month+=1;}
$prorate=round(($month/12)*$max);
/*
* use config from atrribute for country role exp config
"config":[{
"start": 1,
"end": 3,
"days": "default",
},
{
"start": 3
"end": 9999,
"days": 15,
}]
from 1year to 3year got default base on set days, 3year onward get 15 days
*/
if(count($config) > 0){
foreach($config as $c){
$c['start']=$c['start']*12;
$c['end']=$c['end']*12;
if($c['days']=='default'){$c['days']=$max;}
if(($month >= $c['start']) && ($month <= $c['end'])){
$max=$c['days'];
if(!$isprorate){$prorate=$c['days'];}
}
}
}
if(($prorate > $max) || (!$isprorate)){$prorate=$max;}
return $prorate;
}
public function GenerateDefaultType($office){
//load leave configuration from json file
$fp=file_get_contents($this->params->get('kernel.project_dir').'/leave.json','r');
$leaveconfig=array();
if($fp!==false){
$leaveconfig=json_decode($fp,true);
}
$list=array();
foreach($leaveconfig as $k=>$v){
$v['name']=$k;
$this->SaveType(array(
'office'=>$office,
'leave'=>$v,
'changedays'=>false
));
}
}
public function SaveType($option=array()){
$default=array(
'office'=>null,
'leave'=>null,
'changedays'=>true
);
$opt=$default;
/*$handle=fopen($this->params->get('kernel.project_dir').'/var/log/testx.log','w');
ob_start();
$txt=ob_get_clean();
fwrite($handle,$txt);
fclose($handle);*/
foreach($option as $k=>$v){$opt[$k]=$v;}
if(is_null($opt['office'])){return;}
if(is_null($opt['leave'])){
$this->GenerateDefaultType($opt['office']);
}
if(is_null($opt['office']) && (is_null($opt['leave']))){
return;
}
if(!isset($opt['leave']['name'])){return;}
$em = $this->entityManager;
$arg=array(
'office'=>$opt['office'],
);
$leavetype=null;
$list=array();
$officetype=$em->getRepository(\App\Entity\LeaveType::class)->findBy($arg);
if(!is_null($officetype)){
foreach($officetype as $l){
$list[$l->getLeaveName()]=$l;
}
}
$leavetype=isset($list[$opt['leave']['name']])?$list[$opt['leave']['name']]:null;
if(is_null($leavetype)){
$leavetype=new \App\Entity\LeaveType();
$leavetype->setIsMandatory(isset($opt['leave']['IsMandatory'])?$opt['leave']['IsMandatory']:true);
$leavetype->setIsActive(isset($opt['leave']['IsActive'])?$opt['leave']['IsActive']:true);
$leavetype->setLeaveName($opt['leave']['name']);
$leavetype->setOffice($opt['office']);
$attr=array(
'mode'=>'fix',
'hide'=>false,
'label'=>isset($opt['leave']['Label'])?$opt['leave']['Label']:$opt['leave']['name']
);
if(isset($opt['leave']['Attributes'])){
foreach($opt['leave']['Attributes'] as $kl => $vl){
if(!isset($attr[$kl])){$attr[$kl]=$vl;}
}
}
$leavetype->setAttributes($attr);
$leavetype->setDays(isset($opt['leave']['Days'])?$opt['leave']['Days']:0);
if(isset($opt['leave']['Parent'])){
if(isset($list[$opt['leave']['Parent']])){
$leavetype->setParent($list[$opt['leave']['Parent']]->getId());
}
}
}else{
$attr=$leavetype->getAttributes();
if(isset($opt['leave']['Attributes'])){;
foreach($opt['leave']['Attributes'] as $kl => $vl){
if(!isset($attr[$kl])){
$attr[$kl]=$vl;
}
}
}
$leavetype->setAttributes($attr);
$days=$leavetype->getDays();
$newtdays=$days;
if($opt['changedays']){
$newtdays=isset($opt['leave']['Days'])?$opt['leave']['Days']:$days;
}
$leavetype->setDays($newtdays);
if(isset($opt['leave']['Parent'])){
if(isset($list[$opt['leave']['Parent']])){
$leavetype->setParent($list[$opt['leave']['Parent']]->getId());
}
}
$leavetype->setIsMandatory(isset($opt['leave']['IsMandatory'])?$opt['leave']['IsMandatory']:true);
$leavetype->setIsActive(isset($opt['leave']['IsActive'])?$opt['leave']['IsActive']:true);
}
$em->persist($leavetype);
$em->flush();
/*if(!is_null($opt['office'])){
$this->saveLeaveEntitlement2(array('office'=>$opt['office']));
}*/
}
public function saveLeaveEntitlement2($option=array()){
$default=array(
'office'=>null,
'user'=>null,
'id'=>null,
'year'=>date('Y'),
'days'=>-1,
'createby'=>null,
'type'=>null,
'nochange'=>false,
'sameparent'=>false,
'manual'=>false
);
$opt=$default;
foreach($option as $k=>$v){$opt[$k]=$v;}
if($opt['year']==''){$opt['year']=date('Y');}
$em = $this->entityManager;
$entleave=null;
if($opt['id']){
$entleave=$em->getRepository(\App\Entity\LeaveEntitlement::class)->findBy(array('id'=>$opt['id']));
if(is_null($entleave)){return;}
foreach($entleave as $e){
if($opt['days'] < 0){
$opt['days']=$e->getDays();
}
$opt['user']=$e->getUser();
$opt['type']=$e->getLeaveType()->getLeaveName();
$opt['year']=$e->getYear();
}
}
if(!is_null($opt['user'])){$opt['office']=$opt['user']->getOffice();}
if(is_null($opt['office'])){
$levetypes=$em->getRepository(\App\Entity\LeaveType::class)->findAll();
}else{
$levetypes=$em->getRepository(\App\Entity\LeaveType::class)->findBy(array('office'=>$opt['office']));
}
//arange type by office and leave name
$typelist=array();
$typelistbyid=array();
foreach($levetypes as $l){
$oid=$l->getOffice()->getId();
if(!isset($typelist['o'.$oid])){$typelist['o'.$oid]=array();}
$typelist['o'.$oid][$l->getLeaveName()]=$l;
$typelistbyid['t'.$l->getId()]=$l;
}
if(is_null($entleave)){
if(is_null($opt['user'])){
$uarg=array(
'isActive'=>true,
);
//load user by spesic office
if(!is_null($opt['office'])){$uarg['office']=$opt['office'];}
$opt['user']=$em->getRepository(\App\Entity\User::class)->findBy($uarg);
}
$userlist=array();
if(!is_array($opt['user'])){$opt['user']=array($opt['user']);}
foreach($opt['user'] as $u){
$userlist[count($userlist)]=$u->getId();
}
$entleave=$em->getRepository(\App\Entity\LeaveEntitlement::class)->findBy(array('year'=>$opt['year'],'user'=>$userlist));
}
$entlist=array();
if(!is_null($entleave)){
//arrange enteltainment by user year and type
foreach($entleave as $l){
$uid=$l->getUser()->getId();
$oid=$l->getUser()->getOffice()->getId();
$y=$l->getYear();
$tid=$l->getLeaveType()->getId();
$oty=$tid;
if(!is_null($opt['type'])){
$oty=$typelist['o'.$oid][$opt['type']]->getId();
}
//if($oty==$tid){
if(!isset($entlist['u'.$uid])){$entlist['u'.$uid]=array();}
if(!isset($entlist['u'.$uid]['y'.$y])){$entlist['u'.$uid]['y'.$y]=array();}
$entlist['u'.$uid]['y'.$y]['t'.$tid]=$l;
//}
}
}
if(!is_array($opt['user'])){$opt['user']=array($opt['user']);}
foreach($opt['user'] as $u){
$uid=$u->getId();
$uoffice=$u->getOffice();
if(!is_null($uoffice)){
$oid=$uoffice->getId();
if(isset($typelist['o'.$oid])){
if(is_array($typelist['o'.$oid])){
foreach($typelist['o'.$oid] as $ko=>$vo){
$oty=$ko;
if(!is_null($opt['type'])){$oty=$opt['type'];}
//do as requested type
$runit=true;
$xvoattr=$vo->getAttributes();
if($ko!=$oty){$runit=false;}
if(isset($xvoattr['noadd'])){
if($xvoattr['noadd'] && is_null($opt['type'])){$runit=false;}
}
if($runit){
$tid=$vo->getId();
$newleave=false;
$hasparent=false;
$parentdays=0;
if(isset($entlist['u'.$uid]['y'.$opt['year']]['t'.$tid])){
$leaveuse=$entlist['u'.$uid]['y'.$opt['year']]['t'.$tid];
}else{
$newleave=true;
$leaveuse=new \App\Entity\LeaveEntitlement();
$leaveuse->setUser($u);
$leaveuse->setYear($opt['year']);
$leaveuse->setLeaveType($vo);
$leaveuse->setCreatedAt(new \DateTime());
$leaveuse->setCreatedBy($opt['createby']);
$leaveuse->setIsActive(true);
$parent=$vo->getParent();
//child leave
if(!is_null($parent) && ($parent!=0)){
$hasparent=true;
if(isset($entlist['u'.$uid]['y'.$opt['year']]['t'.$parent])){
$leaveuse->setParent($entlist['u'.$uid]['y'.$opt['year']]['t'.$parent]->getId());
$parentdays=$entlist['u'.$uid]['y'.$opt['year']]['t'.$parent]->getLeaveEntitlements();
}else{
//ad leave parent if not exist
$leaveparent=new \App\Entity\LeaveEntitlement();
$leaveparent->setUser($u);
$leaveparent->setYear($opt['year']);
$leaveparent->setLeaveType($typelistbyid['t'.$parent]);
//_attribute_set($dataAttributes, $year, $maxday,\App\Entity\User $user);
$voattr=$typelistbyid['t'.$parent]->getAttributes();
$pdays=$typelistbyid['t'.$parent]->getDays();
$parentdays=$pdays;
$attr=$this->_attribute_set($voattr,$opt['year'],$pdays,$u);
if($attr!==false){
$parentdays=$attr['days'];
$leaveparent->setLeaveEntitlements($attr['days']);
$leaveparent->setLeaveLeft($attr['days']);
$leaveparent->setAttributes($attr);
$leaveparent->setCreatedAt(new \DateTime());
$leaveparent->setCreatedBy($opt['createby']);
$leaveparent->setIsActive(true);
$em->persist($leaveparent);
$em->flush();
$entlist['u'.$uid]['y'.$opt['year']]['t'.$parent]=$leaveparent;
$leaveuse->setParent($entlist['u'.$uid]['y'.$opt['year']]['t'.$parent]->getId());
}
}
}
}
$days=($opt['days'] < 0)?$vo->getDays():$opt['days'];
$attr=$this->_attribute_set($xvoattr,$opt['year'],$days,$u);
if(($opt['days'] > 0) && ($opt['manual']==true)){
$attr['days']=$opt['days'];
}
if(isset($xvoattr['followParent'])){
if(($xvoattr['followParent']===true) && ($hasparent) && ($opt['sameparent']===true)){
$attr['days']=$parentdays;
}
}
if($attr!==false){
$hasmanual=false;
if(isset($attr['manual'])){ $hasmanual=true;}
if($opt['manual']===true){$attr['manual']=true;}
$leaveuse->setAttributes($attr);
$odays=$leaveuse->getLeaveEntitlements();
$left=$leaveuse->getLeaveLeft();
$changeit=false;
if($opt['nochange']===false){$changeit=true;}
if($hasmanual===true){$changeit=false;}
if($changeit || $newleave){
if($opt['manual']===true){
$left=$left-($odays-$days);
$leaveuse->setLeaveEntitlements($days);
}else{
$left=$left-($odays-$attr['days']);
$leaveuse->setLeaveEntitlements($attr['days']);
}
$leaveuse->setLeaveLeft($left);
}else{
if($opt['manual']===true){
$left=$left-($odays-$days);
$leaveuse->setLeaveLeft($left);
$leaveuse->setLeaveEntitlements($days);
}
}
$em->persist($leaveuse);
$em->flush();
if(!isset($entlist['u'.$uid])){$entlist['u'.$uid]=array();}
if(!isset($entlist['u'.$uid]['y'.$opt['year']])){$entlist['u'.$uid]['y'.$opt['year']]=array();}
$entlist['u'.$uid]['y'.$opt['year']]['t'.$vo->getId()]=$leaveuse;
}
}
}
}
}
}
}
return $entleave;
}
function getRequest($option=array()){
$yr=date('Y');
$default=array(
'from'=>$yr . '-01-01',
'to'=>($yr+1) . '-12-31',
'user'=>null,
'leavetype'=>null,
'entitlement'=>null
);
$opt=$default;
foreach($option as $k=>$v){$opt[$k]=$v;}
if(!is_null($opt['entitlement'])){
$attr=$opt['entitlement']->getAttributes();
$opt['user']=$opt['entitlement']->getUser();
$opt['leavetype']=$opt['entitlement']->getLeaveType();
$yr=$opt['entitlement']->getYear();
if(isset($attr['given'])){
$opt['from'] = new \DateTime($attr['given']);
$opt['from'] = $opt['from']->format('Y-m-d');
}else{
$opt['from']=$yr . '-01-01';
}
if(isset($attr['expires'])){
$opt['to'] = new \DateTime($attr['expires']);
$opt['to']->modify('+3 months');
$opt['to'] = $opt['to']->format('Y-m-d');
}else{
$opt['to']=($yr+1) . '-12-31';
}
}
$mcs = $this->entityManager->getRepository(\App\Entity\LeaveRequest::class)->createQueryBuilder('a')
->select('a')
->where('a.startDate >= :from')
->andWhere('a.startDate <= :to')
->setParameter('from', new \DateTime($opt['from']))
->setParameter('to', new \DateTime($opt['to']));
if(!is_null($opt['user'])){
$mcs->andWhere('a.user = :user')->setParameter('user',$opt['user']);
}
if(!is_null($opt['leavetype'])){
$pr=$opt['leavetype']->getParent();
if(($pr==0) || (is_null($pr))){$pr=$opt['leavetype']->getId();}
$mcs->andWhere('a.leaveType = :leave')->setParameter('leave', $pr);
}
//->andWhere('a.user = :user')
//->andWhere('a.leaveType = :leave')
//->andWhere('a.id = 1496')
//->setParameter('user', $user)
//->setParameter('leave', 4)
//->orderBy('a.startDate')
return $mcs->getQuery()->getResult();
}
public function createLeaveEntitlement($option=array()){
$default=array(
"user"=>null,
"office"=>null,
"year"=>date('Y'),
);
$opt=$default;
foreach($option as $k=>$v){$opt[$k]=$v;}
if($opt['year']==''){$opt['year']=date('Y');}
$uid=null;
$ofid=null;
$em = $this->entityManager;
if(!is_null($opt['user'])){
$opt['office']=$opt['user']->getOffice();
$uid=$opt['user']->getId();
}
$usr=null;
if(!is_null($opt['office'])){
$ofid=$opt['office']->getId();
};
if(!is_null($uid)){
$usr=$em->getRepository(\App\Entity\User::class)->findBy(array('id'=>$uid));
}else{
if(!is_null($ofid)){
$usr=$em->getRepository(\App\Entity\User::class)->findBy(array('office'=>$opt['office']));
}else{
$usr=$em->getRepository(\App\Entity\User::class)->findAll();
}
}
$lvtype=null;
if(!is_null($ofid)){
$lvtype=$em->getRepository(\App\Entity\LeaveType::class)->findBy(array('office'=>$opt['office'],'parent'=>array(null,0)));
}else{
$lvtype=$em->getRepository(\App\Entity\LeaveType::class)->findBy(array('parent'=>array(null,0)));
}
$sc=array('year'=>$opt['year']);
if(!is_null($opt['user'])){
$sc['user']=$opt['user'];
}
$ent=$em->getRepository(\App\Entity\LeaveEntitlement::class)->findBy($sc);
$lent=array();
if(!is_null($ent)){
foreach($ent as $l){
$luid=$l->getUser()->getId();
$lyr=$l->getYear();
$ty=$l->getLeaveType()->getId();
if(!isset($lent['u'.$luid])){$lent['u'.$luid]=array();}
if(!isset($lent['u'.$luid]['y'.$lyr])){$lent['u'.$luid]['y'.$lyr]=array();}
$lent['u'.$luid]['y'.$lyr]['t'.$ty]=$l;
}
}
$exp=($opt['year']+1).'-03-31';
$exp=new \DateTime($exp);
if(!is_null($usr) && !is_null($lvtype)){
foreach($usr as $u){
$uuid=$u->getId();
if(!is_null($u->getOffice())){
$oid=$u->getOffice()->getId();
foreach($lvtype as $l){
$lvid=$l->getId();
$loid=$l->getOffice()->getId();
$ok=false;
$okoffice=($oid==$loid);
$leaveon=null;
if($okoffice){
if(!isset($lent['u'.$uuid])){
$ok=true;
}else{
if(!isset($lent['u'.$uuid]['y'.$opt['year']])){
$ok=true;
}else{
if(!isset($lent['u'.$uuid]['y'.$opt['year']]['t'.$lvid])){
$ok=true;
}else{
$leaveon=$lent['u'.$uuid]['y'.$opt['year']]['t'.$lvid];
}
}
}
}
//ok = new leave
if($ok){
$leave=$this->_add_leave_data($u,$opt['year'],$exp,$l);
if($leave!==false){
if(is_array($leave)){
foreach($leave as $lv){
$parent=$lv->getId();
$childType=$this->entityManager->getRepository(LeaveType::class)->findBy(array('office'=>$u->getOffice(),'parent'=>array($l->getId())));
if(count($childType) > 0){
foreach($childType as $c){
if(!isset($lent['u'.$uuid])){
$cleave=$this->_add_leave_data($u,$opt['year'],$exp,$c,$parent);
}else{
if(!isset($lent['u'.$uuid]['y'.$opt['year']])){
$cleave=$this->_add_leave_data($u,$opt['year'],$exp,$c,$parent);
}else{
if(!isset($lent['u'.$uuid]['y'.$opt['year']]['t'.$c->getId()])){
$cleave=$this->_add_leave_data($u,$opt['year'],$exp,$c,$parent);
}
}
}
}
}
}
}else{
$parent=$leave->getId();
$childType=$this->entityManager->getRepository(LeaveType::class)->findBy(array('office'=>$u->getOffice(),'parent'=>array($l->getId())));
if(count($childType) > 0){
foreach($childType as $c){
if(!isset($lent['u'.$uuid])){
$cleave=$this->_add_leave_data($u,$opt['year'],$exp,$c,$parent);
}else{
if(!isset($lent['u'.$uuid]['y'.$opt['year']])){
$cleave=$this->_add_leave_data($u,$opt['year'],$exp,$c,$parent);
}else{
if(!isset($lent['u'.$uuid]['y'.$opt['year']]['t'.$c->getId()])){
$cleave=$this->_add_leave_data($u,$opt['year'],$exp,$c,$parent);
}
}
}
}
}
}
}
}else{
//edit mode
if(!is_null($leaveon)){
$newdays=$l->getDays();
$leftx=$leaveon->getLeaveLeft();
$daysx=$leaveon->getLeaveEntitlements();
$country=$leaveon->getUser()->getOffice()->getCountry();
if($country=='VN'){
if($leaveon->getLeaveType()->getLeaveName()=='annual'){
$dtjoin=$leaveon->getUser()->getPersonalInfo()->getJobJoinDate();
$dtjyear=$dtjoin->format('Y');
$dtyear=$leaveon->getYear();
$attr=$leaveon->getAttributes();
if(($dtyear-$dtjyear) == 0){
$gv=new \DateTime($dtjoin->format('Y-m-d'));
$exp=new \DateTime($dtjoin->format('Y-m-d'));
$exp->modify('+1 year');
$exp->modify('-1 days');
$attr['given']=$gv->format('Y-m-d');
$attr['expires']=$exp->format('Y-m-d');
$leaveon->setAttributes($attr);
$newdays=5;
}else{
$gv=new \DateTime($dtyear.'-'.$dtjoin->format('m-d'));
$exp=new \DateTime(($dtyear+1).'-'.$dtjoin->format('m-d'));
$exp->modify('-1 days');
$attr['given']=$gv->format('Y-m-d');
$attr['expires']=$exp->format('Y-m-d');
$leaveon->setAttributes($attr);
}
/*else if((($dtyear-$dtjyear) == 1)){
$gv=new \DateTime($dtjoin->format('Y-m-d'));
$gv->modify('+1 year');
$gvyear=$gv->format('Y');
$exp=new \DateTime(($gvyear+1).'-03-31');
$attr['given']=$gv->format('Y-m-d');
$attr['expires']=$exp->format('Y-m-d');
$leaveon->setAttributes($attr);
$nm=$dtjoin->format('m');
$nm=(12-$nm)+1;
$newdays=($nm/12)*$l->getDays();
}*/
}
}
if($l->getLeaveName()==='annual'){
$ujoindate=$u->getPersonalInfo()->getJobJoinDate();
$tujoindate=$ujoindate->format('Y-m-d');
$uendate=$opt['year'].'-12-31';
$maxday=$l->getDays();
$prorate=$this->_prorate($tujoindate,$uendate,$maxday,$country);
}else{
$prorate=$newdays;
}
$leftx=$leftx+($prorate - $daysx);
$leaveon->setLeaveEntitlements($prorate);
$leaveon->setLeaveLeft($leftx);
$em->persist($leaveon);
$em->flush();
//if($leaveon->getUser()->getId()=='166'){
// dd('left:'.$leftx);
//}
}
}
}
}
$rsback=$this->resetAll(array('user'=>$u,'logname'=>'log.leave.create'));
}
}
}
public function saveLeaveEntitlement($office,$option=array()){
$bonus=null;
$annual=null;
$sick=null;
$leavetype=$office->getLeaveTypes();
$em = $this->entityManager;
if($leavetype!=null){
foreach($leavetype as $l){
foreach($option as $k=>$v){
if($l->getLeaveName()==$k){
$l->setDays($v);
$em->persist($l);
$em->flush();
}
}
if($l->getLeaveName()=='sick'){$sick=$l;}
if($l->getLeaveName()=='annual'){$annual=$l;}
if($l->getLeaveName()=='anniversary'){$bonus=$l;}
}
}
if(is_null($sick)){
if(isset($option['sick'])){
$sick = new LeaveType();
$sick->setLeaveName('sick');
$sick->setOffice($office);
$sick->setIsActive(true);
$sick->setIsMandatory(true);
$sick->setDays($option['sick']);
$dataAttributes = [
"mode"=>"fix",
"label"=>'Sick',
"deductedafter"=>2,
"keepyear"=>true,
"hide"=>true,
];
$sick->setAttributes($dataAttributes);
$sick->setCreatedAt(new \DateTime());
$em->persist($sick);
$em->flush();
}
}
if(is_null($annual)){
if(isset($option['annual'])){
$annual = new LeaveType();
$annual->setLeaveName('annual');
$annual->setOffice($office);
$annual->setIsActive(true);
$annual->setIsMandatory(true);
$dataAttributes = [
"mode"=>"period",
"label"=>'Annual',
"isIncremental" => false,
"incrementalStart" => 12,
"incrementalValue" => 1,
];
$annual->setDays($option['annual']);
$annual->setAttributes($dataAttributes);
$annual->setCreatedAt(new \DateTime());
$em->persist($annual);
$em->flush();
}
}
if((is_null($bonus)) && (!is_null($annual))){
$bonus = new LeaveType();
$bonus->setLeaveName('anniversary');
$bonus->setOffice($office);
$bonus->setIsActive(true);
$bonus->setIsMandatory(true);
$dataAttributes = [
"mode"=>"anniversary",
"label"=>'Bonus',
"isIncremental" => true,
"incrementalStart" => 1,
"incrementalValue" => 1,
"hide"=>true
];
$bonus->setDays(1);
$bonus->setAttributes($dataAttributes);
$bonus->setCreatedAt(new \DateTime());
$bonus->setParent($annual->getID());
$em->persist($bonus);
$em->flush();
}
$this->createLeaveEntitlement(array(
'office'=>$office
));
}
public function leaveProRateCron($force = false)
{
$em = $this->entityManager;
$users = $em->getRepository(\App\Entity\User::class)->findAllActive();
$total = 0;
foreach ($users as $user) {
try {
$office = $user->getOffice();
$country = '';
if (!is_null($office)) {
$country = $office->getCountry();
}
if (($country == 'SG') || ($country == 'HK')) {
$this->leavePermanent($user, $force, true);
$total++;
}
} catch (Exception $e) {
continue;
}
}
return $total;
}
public function deleteRequest(\App\Entity\LeaveRequest $leaveRequest){
$em = $this->entityManager;
$userData=$leaveRequest->getUser();
$leaveType=$leaveRequest->getLeaveType();
$back = $leaveRequest->getAlocation();
if ($back == null) {
$back = array();
}
$alocation = array();
if (isset($back['child'])) {
foreach ($back['child'] as $kb => $bchild) {
$yr = str_replace('y', '', $kb);
foreach ($bchild as $kb1 => $vb1) {
$cid = str_replace('c', '', $kb1);
$chde = $this->getDoctrine()->getRepository(LeaveEntitlement::class)->findBy(array('user' => $userData, 'id' => $cid, 'year' => $yr));
if (is_array($chde)) {
for ($bb = 0; $bb < count($chde); $bb++) {
$lf = $chde[$bb]->getLeaveLeft();
$lf = $lf + $vb1;
$chde[$bb]->setLeaveLeft($lf);
$this->getDoctrine()->getManager()->persist($chde[$bb]);
$this->getDoctrine()->getManager()->flush();
}
}
}
}
}
foreach ($back as $k => $b) {
switch ($k) {
case 'data':
break;
case 'dumper':
break;
case 'error':
break;
case 'type':
break;
case 'child':
break;
default:
$yr = str_replace('y', '', $k);
$alocation['y' . $yr] = 0;
break;
}
}
$em->remove($leaveRequest);
$em->flush();
$this->updateEntitlementFromLeave($userData, $leaveType, $alocation, $back);
}
public function saveRequest($option=array()){
$default=array(
'id'=>null,
'user'=>null,
'leaveType'=>null,
'startDate'=>null,
'endDate'=>null,
'isApproved'=>null,
'am'=>false,
'pm'=>false,
'days'=>0,
'attributes'=>array(),
'comment'=>'',
'saveupdate'=>true,
'updateby'=>null,
'reviewBy'=>null,
);
$opt=$default;
$opt['log']=array();
$currentopt=array();
if(isset($option['startDate'])){
$currentopt['startDate']=$option['startDate']->format('Y-m-d');
}
if(isset($option['endDate'])){
$currentopt['endDate']=$option['endDate']->format('Y-m-d');
}
if(isset($option['days'])){
$currentopt['days']=$option['days'];
}
$em = $this->entityManager;
$leaveRequest=null;
$olddata = null;
$olddatalog = null;
$isupdate=false;
$entbyid=array();
$ent=array();
$entbyyear=array();
$leaveent=$em->getRepository(LeaveEntitlement::class)->findAll();
foreach($leaveent as $l){
$uid=$l->getUser()->getId();
$yr=$l->getYear();
$ty=$l->getLeaveType()->getId();
$entbyid['c'.$l->getId()]=$l;
if(!isset($entbyyear['u'.$uid])){$entbyyear['u'.$uid]=array();}
if(!isset($entbyyear['u'.$uid]['y'.$yr])){$entbyyear['u'.$uid]['y'.$yr]=array();}
if(!isset($entbyyear['u'.$uid]['y'.$yr]['t'.$ty])){
$entbyyear['u'.$uid]['y'.$yr]['t'.$ty]=array();
$entbyyear['u'.$uid]['y'.$yr]['t'.$ty]['left'] =$l->getLeaveLeft();
$entbyyear['u'.$uid]['y'.$yr]['t'.$ty]['ent']=$l;
}
}
if(isset($option['id'])){
$leaveRequest = $em->getRepository(LeaveRequest::class)->find($option['id']);
if(!is_null($leaveRequest)){
$olddata = clone $leaveRequest;$isupdate=true;
$olddatalog=clone $olddata;
}
}
if(!is_null($olddata)){
$opt['isApproved'] = $olddata->getIsApproved();
$opt['am'] = $olddata->getIsHalfStart();
$opt['pm'] = $olddata->getIsHalfEnd();
$opt['comment'] = $olddata->getComment();
$opt['attributes'] = $olddata->getAttributes();
$opt['startDate'] = $olddata->getStartDate();
$opt['endDate'] = $olddata->getEndDate();
$opt['leaveType']=$olddata->getLeaveType();
$opt['user']=$olddata->getUser();
$opt['reviewBy']=$olddata->getReviewedBy();
$opt['log']=$olddata->getLog();
}
$idmc=array();
$idmclist=array();
$attridmc=array();
$logidmc=array();
$idmcdellist=array();
$ismc=false;
$ismccheck=true;
$mcdate=array();
$updatedate=null;
$updateby=null;
$mchalf=array();
$oldmchalf=array();
if(!is_null($opt['leaveType'])){$option['leaveType']=$opt['leaveType'];}
if(!is_null($opt['user'])){$option['user']=$opt['user'];}
if(isset($option['leaveType'])){
if($option['leaveType']->getLeaveName()=='sick'){
$ismc=true;
if(isset($option['id']) && !is_null($olddata)){
$mcdate['startDate']= new \DateTime($opt['startDate']->format('Y-m-d'));
$mcdate['endDate']= new \DateTime($opt['endDate']->format('Y-m-d'));
}
if(isset($option['startDate']) && !is_null($option['startDate'])){$mcdate['startDate']=new \DateTime($option['startDate']->format('Y-m-d'));}
if(isset($option['endDate']) && !is_null($option['endDate'])){$mcdate['endDate']=new \DateTime($option['endDate']->format('Y-m-d'));}
/*if(isset($mcdate['startDate']) && isset($mcdate['endDate']) && !is_null($opt['startDate']) && !is_null($opt['endDate'])){
if(($mcdate['startDate']==$opt['startDate']) && ($mcdate['endDate'] == $opt['endDate'])){
$ismccheck=false;
}
}*/
}
}
$mcallocation=array();
$historymc=array();
$tmphismc=array();
if($ismc){
if(!is_null($option['user'])){
$ucountry=$option['user']->getOffice()->getCountry();
}
$holidays=array();
$holidaydt=$em->getRepository(\App\Entity\LeaveBankHoliday::class)->findAll();
foreach($holidaydt as $hl){
$loc=$hl->getLocation();
if(!isset($holidays[$loc])){$holidays[$loc]=array();}
$shl=new \DateTime($hl->getDate()->format('Y-m-d'));
if(is_null($hl->getEndDate())){
$ehl=new \DateTime($hl->getDate()->format('Y-m-d'));
}else{
$ehl=new \DateTime($hl->getEndDate()->format('Y-m-d'));
}
$inval=date_diff($ehl,$shl);
$inval=abs($inval->d)+1;
for($hv=0;$hv<$inval;$hv++){
$holidays[$loc][count($holidays[$loc])]=$shl->format('Y-m-d');
$shl->modify('+1 day');
}
}
$offdays=array(0,6);
$offdaysdt=array(6,7);
if(isset($mcdate['startDate']) && isset($mcdate['endDate'])){
if($ismccheck){
$stdatemc = new \DateTime($mcdate['startDate']->format('Y-m-d'));
$stdatemc->modify('-30 days');
$endatemc = new \DateTime($mcdate['endDate']->format('Y-m-d'));
$endatemc->modify('+30 days');
$getsick=$em->getRepository(LeaveRequest::class)->createQueryBuilder('a')
->select('a')
->where('a.user = :user')
->andWhere('a.leaveType in (:leavetype)')
->andWhere('a.startDate >= :from')
->andWhere('a.startDate <= :to')
->setParameter('from',$stdatemc)
->setParameter('to', $endatemc)
->setParameter('leavetype', $option['leaveType'])
->setParameter('user', $option['user'])
->orderBy('a.startDate')
->getQuery()
->getResult();
if(!is_null($getsick)){
$rqidx=-1;
if(!is_null($leaveRequest)){$rqidx=$leaveRequest->getId();}
foreach($getsick as $gs){
$attrmc=$gs->getAttributes();
$startmc=$gs->getStartDate();
$endmc=$gs->getEndDate();
$tidmc=-1;
if($gs->getId()!=$rqidx){
$lessstart=new \DateTime($mcdate['startDate']->format('Y-m-d'));
$lessstart->modify('-1 day');
$lsok=false;
if(in_array($lessstart->format('N'),$offdaysdt)){$lsok=true;}
if(isset($holidays[$ucountry])){
if(in_array($lessstart->format('Y-m-d'),$holidays[$ucountry])){
$lsok=true;
}
}
while($lsok){
$lsok=false;
$lessstart->modify('-1 day');
if(in_array($lessstart->format('N'),$offdaysdt)){$lsok=true;}
if(isset($holidays[$ucountry])){
if(in_array($lessstart->format('Y-m-d'),$holidays[$ucountry])){
$lsok=true;
}
}
}
$lessend=new \DateTime($mcdate['endDate']->format('Y-m-d'));
$lessend->modify('+1 day');
$lsok=false;
if(in_array($lessend->format('N'),$offdaysdt)){$lsok=true;}
if(isset($holidays[$ucountry])){
if(in_array($lessend->format('Y-m-d'),$holidays[$ucountry])){
$lsok=true;
}
}
while($lsok){
$lsok=false;
$lessend->modify('+1 day');
if(in_array($lessend->format('N'),$offdaysdt)){$lsok=true;}
if(isset($holidays[$ucountry])){
if(in_array($lessend->format('Y-m-d'),$holidays[$ucountry])){
$lsok=true;
}
}
}
if(($lessstart >= $startmc) && ($lessend <= $endmc)){$tidmc=$gs->getId();}
if(($lessstart <= $startmc) && ($lessend >= $startmc)){$tidmc=$gs->getId();}
if(($lessstart <= $endmc) && ($lessend >= $endmc)){$tidmc=$gs->getId();}
/*print_r("lessstart:".$lessstart->format('Y-m-d'));
print_r("\n");
print_r("lessstart:".$lessstart->format('N'));*/
/*$hf=fopen('../var/log/test.log','a');
ob_start();
//print_r($testresult);
print_r($gs->getId().':');
print_r($lessstart->format('Y-m-d').'=>'.$startmc->format('Y-m-d').':');
print_r($lessend->format('Y-m-d').'=>'.$endmc->format('Y-m-d').':');
print_r("\n");
$txt=ob_get_clean();
fwrite($hf,$txt);
fclose($hf);*/
}else{
$tidmc=$gs->getId();
if(isset($currentopt['startDate']) && isset($currentopt['endDate'])){
$endmc=new \DateTime($currentopt['endDate']);
$startmc=new \DateTime($currentopt['startDate']);
}
}
if($tidmc > -1){
if($mcdate['endDate'] < $endmc){$mcdate['endDate']=$endmc;}
if($mcdate['startDate'] > $startmc){$mcdate['startDate']=$startmc;}
$idmclist[count($idmc)]=$gs;
$idmc[count($idmc)]=$tidmc;
}
}
foreach($idmclist as $ml){
$sdtmc=new \DateTime($ml->getStartDate()->format('Y-m-d'));
$edtmc=new \DateTime($ml->getEndDate()->format('Y-m-d'));
$intmc=date_diff($sdtmc,$edtmc);
$intmc=abs($intmc->d)+1;
$attrmc=$ml->getAttributes();
if(isset($attrmc['historymc'])){
foreach($attrmc['historymc'] as $kh=>$h){
$historymc[$kh]=$h;
}
}
for($d=0;$d<$intmc;$d++){
$dvx=1;
$dv=new \DateTime($sdtmc->format('Y-m-d'));
$okadd=true;
if(in_array(date('w',strtotime($dv->format('Y-m-d'))),$offdays)){$okadd=false;}
if(isset($ucountry)){
if(isset($holidays[$ucountry])){
if(in_array($dv->format('Y-m-d'),$holidays[$ucountry])){$okadd=false;}
}
}
if($okadd){
if(!isset($mcallocation['d'.$dv->format('Y-m-d')])){
$mcallocation['d'.$dv->format('Y-m-d')]=array();
$mcallocation['d'.$dv->format('Y-m-d')]=0;
}
if($d==0){
if(!is_null($ml->getIsHalfStart())){
if(($ml->getIsHalfStart()==true) || ($ml->getIsHalfStart()==1)){$dvx=0.5;}
}
}
if($d==($intmc-1)){
if(!is_null($ml->getIsHalfEnd())){
if(($ml->getIsHalfEnd()==true) || ($ml->getIsHalfEnd()==1)){$dvx=0.5;}
}
}
if(isset($attrmc['mc'])){
if(isset($attrmc['mc']['d'.$dv->format('Y-m-d')])){
$dvx=$attrmc['mc']['d'.$dv->format('Y-m-d')];
$mcallocation['d'.$dv->format('Y-m-d')]=$dvx;
}else{
$mcallocation['d'.$dv->format('Y-m-d')]=$dvx;
}
}else{
$mcallocation['d'.$dv->format('Y-m-d')]=$dvx;
}
if(isset($attrmc['mcp'])){
if(isset($attrmc['mcp']['d'.$dv->format('Y-m-d')])){
$oldmchalf['d'.$dv->format('Y-m-d')]=$attrmc['mcp']['d'.$dv->format('Y-m-d')];
$mchalf['d'.$dv->format('Y-m-d')]=$attrmc['mcp']['d'.$dv->format('Y-m-d')];
}
}
//if($dvx >= $mcallocation['d'.$dv->format('Y-m-d')]){$mcallocation['d'.$dv->format('Y-m-d')]=$dvx;}
}
$sdtmc->modify('+1 day');
}
}
}
}
/*$hf=fopen('../var/log/test.log','w');
ob_start();
print_r("");
$txt=ob_get_clean();
fwrite($hf,$txt);
fclose($hf);*/
$sdtmc=new \DateTime($mcdate['startDate']->format('Y-m-d'));
$edtmc=new \DateTime($mcdate['endDate']->format('Y-m-d'));
$intmc=date_diff($sdtmc,$edtmc);
$intmc=abs($intmc->d)+1;
/*$hf=fopen('../var/log/test.log','w');
ob_start();
print_r("");
$txt=ob_get_clean();
fwrite($hf,$txt);
fclose($hf);*/
$createdatdate2=null;
for($d=0;$d<$intmc;$d++){
$dvx=1;
$dv=new \DateTime($sdtmc->format('Y-m-d'));
$dv=$dv->format('Y-m-d');
$okadd=true;
if(in_array(date('w',strtotime($dv)),$offdays)){$okadd=false;}
if(isset($ucountry)){
if(isset($holidays[$ucountry])){
if(in_array($dv,$holidays[$ucountry])){$okadd=false;}
}
}
if(!isset($mcallocation['d'.$dv]) && ($okadd)){
$mcallocation['d'.$dv]=0;
if(isset($currentopt['startDate']) && isset($currentopt['endDate'])){
if($dv==$currentopt['startDate']){
if(!is_null($opt['am'])){
if(($opt['am']==true) || ($opt['am']==1)){$dvx=0.5;}
}
if(!is_null($option['am'])){
if(($option['am']==true) || ($option['am']==1)){$dvx=0.5;}
}
}
if($dv==$currentopt['endDate']){
if(!is_null($opt['pm'])){
if(($opt['pm']==true) || ($opt['pm']==1)){$dvx=0.5;}
}
if(!is_null($option['pm'])){
if(($option['pm']==true) || ($option['pm']==1)){$dvx=0.5;}
}
}
}
if($dvx >= $mcallocation['d'.$dv]){$mcallocation['d'.$dv]=$dvx;}
}
$sdtmc->modify('+1 day');
}
}
if(isset($currentopt['startDate']) && isset($currentopt['endDate'])){
$sdtmc=new \DateTime($currentopt['startDate']);
$edtmc=new \DateTime($currentopt['endDate']);
$intmc=date_diff($sdtmc,$edtmc);
$intmc=abs($intmc->d)+1;
$tday=0;
for($d=0;$d<$intmc;$d++){
$dvx=1;
$dv=new \DateTime($sdtmc->format('Y-m-d'));
$dv=$dv->format('Y-m-d');
$okadd=true;
if(in_array(date('w',strtotime($dv)),$offdays)){$okadd=false;}
if(isset($ucountry)){
if(isset($holidays[$ucountry])){
if(in_array($dv,$holidays[$ucountry])){$okadd=false;}
}
}
if($okadd){
$mchalf['d'.$dv]=array();
$mchalf['d'.$dv]['am']=false;
$mchalf['d'.$dv]['pm']=false;
if(isset($oldmchalf['d'.$dv])){
$mchalf['d'.$dv]=$oldmchalf['d'.$dv];
}
if($d==0){
$amtrue=false;
if(!is_null($opt['am'])){
if(($opt['am']==true) || ($opt['am']==1)){$dvx=0.5;$amtrue=true;}
}
if(!is_null($option['am'])){
if(($option['am']==true) || ($option['am']==1)){$dvx=0.5;$amtrue=true;}
if(($option['am']==false) || ($option['am']==0)){$dvx=1;$amtrue=false;}
}
if(isset($oldmchalf['d'.$dv])){
if($oldmchalf['d'.$dv]['am']!=$amtrue){
$mcallocation['d'.$dv]=$dvx;
}
}else{
$mcallocation['d'.$dv]=$dvx;
}
if(!isset($mcallocation['d'.$dv])){$mcallocation['d'.$dv]=$dvx;}
$mchalf['d'.$dv]['am']=$amtrue;
}
if($d==($intmc-1)){
$pmtrue=false;
if(!is_null($opt['pm'])){
if(($opt['pm']==true) || ($opt['pm']==1)){$dvx=0.5;$pmtrue=true;}
}
if(!is_null($option['pm'])){
$pmok=true;
if($d==0){
if(!is_null($option['am'])){
if(($option['am']==true) || ($option['am']==1)){$pmok=false;$pmtrue=false;}
}
}
if($pmok){
if(($option['pm']==true) || ($option['pm']==1)){$dvx=0.5;$pmtrue=true;}
if(($option['pm']==false) || ($option['pm']==0)){$dvx=1;$pmtrue=false;}
}
if(isset($oldmchalf['d'.$dv])){
if($oldmchalf['d'.$dv]['pm']!=$pmtrue){
$mcallocation['d'.$dv]=$dvx;
}
}else{
$mcallocation['d'.$dv]=$dvx;
}
if(!isset($mcallocation['d'.$dv])){$mcallocation['d'.$dv]=$dvx;}
$mchalf['d'.$dv]['pm']=$pmtrue;
}
/*$hf=fopen('../var/log/test.log','w');
ob_start();
if(!is_null($option['pm'])){
print_r($option['pm']);
print_r("\n");
}
print_r($dvx);
print_r("\n");
$txt=ob_get_clean();
fwrite($hf,$txt);
fclose($hf);*/
}
//if(isset($mcallocation['d'.$dv])){$dvx=$mcallocation['d'.$dv];}
$tday+=$dvx;
}
$sdtmc->modify('+1 day');
}
$tmphismc=array();
$tmphismc['startDate']=$currentopt['startDate'];
$tmphismc['endDate']=$currentopt['endDate'];
$tmphismc['am']=$option['am'];
$tmphismc['pm']=$option['pm'];
if(is_null($leaveRequest)){
$tmphismc['createDate']=date('Y-m-d');
}else{
$tmphismc['createDate']=$leaveRequest->getCreatedAt()->format('Y-m-d');
$tmphismc['am']=$leaveRequest->getIsHalfStart();
$tmphismc['pm']=$leaveRequest->getIsHalfEnd();
}
if(!is_null($option['am'])){$tmphismc['am']=$option['am'];}
if(!is_null($option['pm'])){$tmphismc['pm']=$option['pm'];}
$tmphismc['day']=$tday;
}
}
$removeidmc=array();
$oldApproved = null;
$oam = false;
$opm = false;
foreach($option as $k=>$v){
if($k=='attributes'){
foreach($v as $kv=>$vv){
$opt['attributes'][$kv]=$vv;
}
}else{
$isold=false;
if(!is_null($olddata)){
if($k=='leaveType'){$isold=true;}
}
if(!$isold){$opt[$k]=$v;}
}
}
if(is_null($opt['user'])){$opt['user']=$this->getUser();}
if(is_null($opt['updateby'])){$opt['updateby']=$opt['user'];}
$isApproved = null;
$isap=1;
if(!is_null($opt['isApproved'])){
$isApproved=$opt['isApproved'];
if(($isApproved==false) || ($isApproved==0)){$isap=0;}
};
$typ='';
if(!is_null($opt['leaveType'])){
$typ=$opt['leaveType']->getLeaveName();
//if($opt['leaveType']->getLeaveName()=='sick'){$isap=1;}
}
$removedmc=array();
$removedgmc=array();
if($ismc){
$uidmc=$opt['user']->getId();
if(!isset($alocation)){$alocation=array();}
$idrqx=-1;
$lvtypeid=$opt['leaveType']->getId();
if(!is_null($leaveRequest)){$idrqx=$leaveRequest->getId();}
$removeentmc=array();
foreach($idmclist as $idm){
$alc=$idm->getAlocation();
if($alc==null){$alc==array();}
foreach($alc as $kc=>$vc){
if(substr($kc,0,1)=='y'){
$yc=substr($kc,1,4);
if(!isset($removeentmc['x'.$idm->getUser()->getId().'x'.$yc.'x'.$idm->getLeaveType()->getId()])){
$removeentmc['x'.$idm->getUser()->getId().'x'.$yc.'x'.$idm->getLeaveType()->getId()]=0;
}
$removeentmc['x'.$idm->getUser()->getId().'x'.$yc.'x'.$idm->getLeaveType()->getId()]+=$vc;
}
}
if(is_null($createdatdate2)){
$createdatdate2=new \DateTime($idm->getCreatedAt()->format('Y-m-d'));
if(!$idm->getCreatedBy() instanceof \App\Entity\User){
$xiuser=$em->getRepository(\App\Entity\User::class)->find($idm->getCreatedBy());
if(!is_null($xiuser)){
$updateby=$xiuser->getId();
}
}else{
$updateby=$idm->getCreatedBy()->getId();
}
/*$hf=fopen('../var/log/test.log','w');
ob_start();
//print_r($testresult);
print_r($updateby);
print_r("\n");
$txt=ob_get_clean();
fwrite($hf,$txt);
fclose($hf);*/
//$createdatdate2=new \DateTime('createDate');
}
$idmcd=new \DateTime($idm->getCreatedAt()->format('Y-m-d'));
if(!$idm->getCreatedBy() instanceof \App\Entity\User){
$xiuser=$em->getRepository(\App\Entity\User::class)->find($idm->getCreatedBy());
if(!is_null($xiuser)){
$updatebyt=$xiuser->getId();
}
}else{
$updatebyt=$idm->getCreatedBy()->getId();
}
if($idmcd < $createdatdate2){
$createdatdate2=new \DateTime($idmcd->format('Y-m-d'));
$updateby= $updatebyt;
}
$attridm=$idm->getAttributes();
if(isset($attridm['historymc'])){
foreach($attridm['historymc'] as $aidmc){
if(isset($aidmc['createDate'])){
$idmcd=new \DateTime($aidmc['createDate']);
if($idmcd < $createdatdate2){
$createdatdate2=new \DateTime($idmcd->format('Y-m-d'));
$updateby=$aidmc['createBy'];
}
}
}
}
if($idm->getId()!=$idrqx){
$removedmc[count($removedmc)]=$idm->getId();
$rmattr=$idm->getAttributes();
if(isset($rmattr['file'])){
if(!isset($opt['attributes']['file'])){
$opt['attributes']['file']=$rmattr['file'];
}
}
if(isset($rmattr['gcalid'])){
$removedgmc[count($removedgmc)]=$rmattr['gcalid'];
}
$this->deleteRequest($idm);
}
}
$tdays=0;
foreach($removeentmc as $kre=>$re){
$krc=explode('x',$kre);
if(isset($entbyyear['u'.$krc[1]])){
if(isset($entbyyear['u'.$krc[1]]['y'.$krc[2]])){
if(isset($entbyyear['u'.$krc[1]]['y'.$krc[2]]['t'.$krc[3]])){
$entbyyear['u'.$krc[1]]['y'.$krc[2]]['t'.$krc[3]]['left']+=$re;
}
}
}
}
foreach($mcallocation as $kh=>$hh){
$dth=str_replace('d','',$kh);
$sdx=new \DateTime($dth);
if(($sdx < $mcdate['startDate']) || ($sdx > $mcdate['endDate'])){
unset($mcallocation[$kh]);
}
}
$updateentmc=array();
foreach($mcallocation as $kh=>$hh){
$dth=str_replace('d','',$kh);
$tmh=strtotime($dth);
$yh=date('Y',$tmh);
if($yh > 2001){
if(isset($entbyyear['u'.$uidmc])){
if(isset($entbyyear['u'.$uidmc]['y'.$yh])){
if(isset($entbyyear['u'.$uidmc]['y'.$yh]['t'.$lvtypeid])){
$mclt=$entbyyear['u'.$uidmc]['y'.$yh]['t'.$lvtypeid]['left'];
$mcl=$mclt-$hh;
if($mcl < 0){
if($mcl > -$hh){
if(!isset($alocation['y'.$yh])){$alocation['y'.$yh]=0;}
$alocation['y'.$yh]+=$mclt;
if(!isset($alocation['unpaid'])){$alocation['unpaid']=array();}
if(!isset($alocation['unpaid']['y'.$yh])){$alocation['unpaid']['y'.$yh]=array();}
if(!isset($alocation['unpaid']['y'.$yh]['value'])){$alocation['unpaid']['y'.$yh]['date']=array();}
if(!isset($alocation['unpaid']['y'.$yh]['value'])){$alocation['unpaid']['y'.$yh]['value']=0;}
$ucdate=count($alocation['unpaid']['y'.$yh]['date']);
$alocation['unpaid']['y'.$yh]['date'][$ucdate]=array();
$alocation['unpaid']['y'.$yh]['date'][$ucdate]['date']=date('Y-m-d',$tmh);
$alocation['unpaid']['y'.$yh]['date'][$ucdate]['value']=$hh;
$alocation['unpaid']['y'.$yh]['value']+=($hh-$mclt);
}else{
if(!isset($alocation['unpaid'])){$alocation['unpaid']=array();}
if(!isset($alocation['unpaid']['y'.$yh])){$alocation['unpaid']['y'.$yh]=array();}
if(!isset($alocation['unpaid']['y'.$yh]['value'])){$alocation['unpaid']['y'.$yh]['date']=array();}
if(!isset($alocation['unpaid']['y'.$yh]['value'])){$alocation['unpaid']['y'.$yh]['value']=0;}
$ucdate=count($alocation['unpaid']['y'.$yh]['date']);
$alocation['unpaid']['y'.$yh]['date'][$ucdate]=array();
$alocation['unpaid']['y'.$yh]['date'][$ucdate]['date']=date('Y-m-d',$tmh);
$alocation['unpaid']['y'.$yh]['date'][$ucdate]['value']=$hh;
$alocation['unpaid']['y'.$yh]['value']+=$hh;
}
$entbyyear['u'.$uidmc]['y'.$yh]['t'.$lvtypeid]['left']=0;
$updateentmc['x'.$uidmc.'x'.$yh.'x'.$lvtypeid]=0;
}else{
if(!isset($alocation['y'.$yh])){$alocation['y'.$yh]=0;}
$alocation['y'.$yh]+=$hh;
$entbyyear['u'.$uidmc]['y'.$yh]['t'.$lvtypeid]['left']-=$hh;
$updateentmc['x'.$uidmc.'x'.$yh.'x'.$lvtypeid]=$entbyyear['u'.$uidmc]['y'.$yh]['t'.$lvtypeid]['left'];
}
}else{
if(!isset($alocation['unpaid'])){$alocation['unpaid']=array();}
if(!isset($alocation['unpaid']['y'.$yh])){$alocation['unpaid']['y'.$yh]=array();}
if(!isset($alocation['unpaid']['y'.$yh]['value'])){$alocation['unpaid']['y'.$yh]['date']=array();}
if(!isset($alocation['unpaid']['y'.$yh]['value'])){$alocation['unpaid']['y'.$yh]['value']=0;}
$ucdate=count($alocation['unpaid']['y'.$yh]['date']);
$alocation['unpaid']['y'.$yh]['date'][$ucdate]=array();
$alocation['unpaid']['y'.$yh]['date'][$ucdate]['date']=date('Y-m-d',$tmh);
$alocation['unpaid']['y'.$yh]['date'][$ucdate]['value']=$hh;
$alocation['unpaid']['y'.$yh]['value']+=$hh;
}
}else{
if(!isset($alocation['unpaid'])){$alocation['unpaid']=array();}
if(!isset($alocation['unpaid']['y'.$yh])){$alocation['unpaid']['y'.$yh]=array();}
if(!isset($alocation['unpaid']['y'.$yh]['value'])){$alocation['unpaid']['y'.$yh]['date']=array();}
if(!isset($alocation['unpaid']['y'.$yh]['value'])){$alocation['unpaid']['y'.$yh]['value']=0;}
$ucdate=count($alocation['unpaid']['y'.$yh]['date']);
$alocation['unpaid']['y'.$yh]['date'][$ucdate]=array();
$alocation['unpaid']['y'.$yh]['date'][$ucdate]['date']=date('Y-m-d',$tmh);
$alocation['unpaid']['y'.$yh]['date'][$ucdate]['value']=$hh;
$alocation['unpaid']['y'.$yh]['value']+=$hh;
}
}else{
if(!isset($alocation['unpaid'])){$alocation['unpaid']=array();}
if(!isset($alocation['unpaid']['y'.$yh])){$alocation['unpaid']['y'.$yh]=array();}
if(!isset($alocation['unpaid']['y'.$yh]['value'])){$alocation['unpaid']['y'.$yh]['date']=array();}
if(!isset($alocation['unpaid']['y'.$yh]['value'])){$alocation['unpaid']['y'.$yh]['value']=0;}
$ucdate=count($alocation['unpaid']['y'.$yh]['date']);
$alocation['unpaid']['y'.$yh]['date'][$ucdate]=array();
$alocation['unpaid']['y'.$yh]['date'][$ucdate]['date']=date('Y-m-d',$tmh);
$alocation['unpaid']['y'.$yh]['date'][$ucdate]['value']=$hh;
$alocation['unpaid']['y'.$yh]['value']+=$hh;
}
}else{
if(!isset($alocation['y'.$yh])){$alocation['y'.$yh]=0;}
$alocation['y'.$yh]+=$hh;
}
$tdays+=$hh;
/*$hf=fopen('../var/log/test.log','a');
ob_start();
//print_r($testresult);
print_r($option['id'].'->'.$tdays);
print_r("\n");
$txt=ob_get_clean();
fwrite($hf,$txt);
fclose($hf);*/
}
if(!is_null($opt['updateby'])){
$tmphismc['createBy']=$opt['updateby']->getId();
}else if(!is_null($opt['user'])){
$tmphismc['createBy']=$opt['user']->getId();
}
$opt['attributes']['historymc']=$historymc;
$opt['attributes']['mc']=$mcallocation;
$opt['attributes']['mcp']=$mchalf;
if(is_null($leaveRequest)){
$leaveRequest = new LeaveRequest();
}
$manualapp=false;
if(isset($opt['attributes']['autoapproved'])){
if(isset($option['isApproved'])){
if($option['isApproved']){
$manualapp=true;
}
}
}else{
if(!isset($opt['attributes']['manualapproved'])){
if(!is_null($opt['isApproved'])){
$manualapp=true;
}
}
}
if($manualapp){
$opt['attributes']['manualapproved']=true;
unset($opt['attributes']['autoapproved']);
}else{
$opt['attributes']['autoapproved']=true;
if(isset($opt['attributes']['file'])){
if($opt['attributes']['file']!=''){
if(is_null($opt['isApproved'])){$isApproved=true;}
}
}else{
if($tdays <= 1){
$isApproved=true;
if(!is_null($leaveRequest)){
$createdat=$leaveRequest->getCreatedAt();
/*if($leaveRequest->getEndDate() < $leaveRequest->getCreatedAt()){
$hf=fopen('../var/log/test.log','a');
ob_start();
//print_r($testresult);
print_r($leaveRequest->getEndDate());
print_r("\n");
print_r($leaveRequest->getCreatedAt());
print_r("\n");
print_r("\n");
$txt=ob_get_clean();
fwrite($hf,$txt);
fclose($hf);
$isApproved=false;
}*/
}
}else{
$isApproved=false;
}
}
}
$leaveRequest->setUser($opt['user']);
$leaveRequest->setStartDate($mcdate['startDate']);
$leaveRequest->setEndDate($mcdate['endDate']);
$leaveRequest->setIsHalfStart($opt['am']);
$leaveRequest->setIsHalfEnd($opt['pm']);
$leaveRequest->setIsApproved($isApproved);
$leaveRequest->setLeaveType($opt['leaveType']);
$leaveRequest->setDays($tdays);
$leaveRequest->setAttributes($opt['attributes']);
$leaveRequest->setComment($opt['comment']);
if(!is_null($isApproved)){
$leaveRequest->setReviewedBy($opt['reviewBy']);
}
$leaveRequest->setAlocation($alocation);
if(isset($opt['log'])){
if(!is_array($opt['log'])){$opt['log']=array();}
if(isset($opt['log']) && count($opt['log']) > 0){
$leaveRequest->setLog($opt['log']);
}
}
$updatedate=null;
if(is_null($olddata)){
$updatedate=null;
if(!is_null($createdatdate2)){
$leaveRequest->setCreatedAt($createdatdate2);
if(!is_null($updateby)){
$leaveRequest->setCreatedBy($updateby);
}else{
if(is_null($opt['updateby'])){$opt['updateby']=$opt['user'];}
$leaveRequest->setCreatedBy($opt['updateby']->getId());
}
if($opt['saveupdate']==true){
$leaveRequest->setUpdatedAt(new \DateTime());
if(is_null($opt['updateby'])){$opt['updateby']=$opt['user'];}
$leaveRequest->setUpdatedBy($opt['updateby']);
$updatedate=new \DateTime();
}
}else{
$leaveRequest->setCreatedAt(new \DateTime());
if(is_null($opt['updateby'])){$opt['updateby']=$opt['user'];}
$leaveRequest->setCreatedBy($opt['updateby']->getId());
}
}else{
if($opt['saveupdate']==true){
$leaveRequest->setUpdatedAt(new \DateTime());
if(is_null($opt['updateby'])){$opt['updateby']=$opt['user'];}
$leaveRequest->setUpdatedBy($opt['updateby']);
$updatedate=new \DateTime();
}
}
try {
$em->persist($leaveRequest);
$em->flush();
} catch (Exception $e) {
//throw $th;
}
$rqidx=$leaveRequest->getId();
if(!isset($tmphismc['startDate'])){
$stdt=new \DateTime($leaveRequest->getStartDate()->format('Y-m-d'));
$endt=new \DateTime($leaveRequest->getEndDate()->format('Y-m-d'));
$tmphismc['startDate']=$stdt->format('Y-m-d');
$tmphismc['endDate']=$endt->format('Y-m-d');
$tmphismc['am']=$leaveRequest->getIsHalfStart();
$tmphismc['pm']=$leaveRequest->getIsHalfEnd();
$tmphismc['day']=$leaveRequest->getDays();
$tmphismc['createDate']=$leaveRequest->getCreatedAt()->format('Y-m-d');
}
$opt['attributes']['historymc']['d'.$rqidx]=$tmphismc;
$leaveRequest->setAttributes($opt['attributes']);
$em->persist($leaveRequest);
$em->flush();
if(isset($opt['attributes']['historymc']) && isset($updatedate) && !is_null($updatedate)){
foreach($opt['attributes']['historymc'] as $dt){
if(isset($dt['createDate'])){
$cd=new \DateTime($dt['createDate']);
if($cd > $updatedate){$updatedate=$cd;}
}
}
}
foreach($updateentmc as $kre=>$re){
$krc=explode('x',$kre);
$leaveentr=$em->getRepository(\App\Entity\LeaveEntitlement::class)->findBy(array('user'=>$krc[1],'year'=>$krc[2],'leaveType'=>$krc[3]));
if(!is_null($leaveentr)){
foreach($leaveentr as $xl){
$xl->setLeaveLeft($re);
$em->persist($xl);
$em->flush();
}
}
}
}else{
if(is_null($leaveRequest)){
$leaveRequest = new LeaveRequest();
}
$back = $leaveRequest->getAlocation();
if(is_null($back)){$back=array();}
$alocation = array();
if(isset($back['child'])){
foreach ($back['child'] as $kb => $bchild) {
$yr = str_replace('y', '', $kb);
foreach ($bchild as $kb1 => $vb1) {
$cid = str_replace('c', '', $kb1);
//$chde = $this->getDoctrine()->getRepository(LeaveEntitlement::class)->findBy(array('user' => $userData, 'id' => $cid, 'year' => $yr));
if (isset($entbyid['c'.$cid])) {
//for ($bb = 0; $bb < count($chde); $bb++) {
$lf = $entbyid['c'.$cid]->getLeaveLeft();
$lf = $lf + $vb1;
$entbyid['c'.$cid]->setLeaveLeft($lf);
$em->persist($entbyid['c'.$cid]);
$em->flush();
//}
}
}
}
}
if ($isap == 0) {
foreach ($back as $k => $v) {
$yr = str_replace('y', '', $k);
switch ($k) {
case 'data':
break;
case 'error':
break;
case 'type':
break;
case 'dumper':
break;
case 'child':
break;
case 'unpaid':
break;
default:
$yr = str_replace('y', '', $k);
$alocation['y' . $yr] = 0;
break;
}
}
} else {
$alocation = $this->calculate($opt['user'], $opt['leaveType'], $opt['startDate'], $opt['endDate'], $back, array('am' => $opt['am'], 'pm' => $opt['pm']));
foreach ($back as $k => $v) {
$yr = str_replace('y', '', $k);
switch ($k) {
case 'data':
break;
case 'error':
break;
case 'child':
break;
case 'dumper':
break;
case 'type':
break;
case 'unpaid':
break;
default:
if (!isset($alocation['y' . $yr])) {
$alocation['y' . $yr] = 0;
}
break;
}
}
if ($alocation != false) {
$dy = 0;
$okd = false;
$upn=false;
foreach ($alocation as $ka => $a) {
switch ($ka) {
case 'data':
break;
case 'dumper':
break;
case 'error':
break;
case 'type':
break;
case 'dumper':
break;
case 'child':
foreach($a as $aa){
foreach($aa as $aaa){
$dy += $aaa;
}
}
$okd = true;
break;
case 'unpaid':
if($typ!='sick'){
foreach($a as $aa){
$dy += $aa['value'];
}
$okd = true;
}
break;
case 'type':
break;
case 'dumper':
break;
default:
$dy += $a;
$okd = true;
break;
}
}
if($dy==0){
foreach ($alocation as $ka => $a) {
switch ($ka) {
case 'data':
break;
case 'dumper':
break;
case 'error':
break;
case 'type':
break;
case 'child':
break;
case 'dumper':
break;
case 'unpaid':
foreach($a as $aa){
$dy += $aa['value'];
}
$okd = true;
break;
default:
break;
}
}
}
if ($okd) {
$opt['days'] = $dy;
}
}
}
if($opt['days']==0){
if(!is_null($olddata)){
$opt['days']=$olddata->getDays();
}
}
$leaveRequest->setUser($opt['user']);
$leaveRequest->setStartDate($opt['startDate']);
$leaveRequest->setEndDate($opt['endDate']);
$leaveRequest->setIsHalfStart($opt['am']);
$leaveRequest->setIsHalfEnd($opt['pm']);
$leaveRequest->setIsApproved($isApproved);
$leaveRequest->setLeaveType($opt['leaveType']);
$leaveRequest->setDays($opt['days']);
$leaveRequest->setAttributes($opt['attributes']);
$leaveRequest->setComment($opt['comment']);
if(!is_null($isApproved)){
$leaveRequest->setReviewedBy($opt['reviewBy']);
}
$leaveRequest->setAlocation($alocation);
if(isset($opt['log']) && count($opt['log']) > 0){
$leaveRequest->setLog($opt['log']);
}
if(is_null($olddata)){
$leaveRequest->setCreatedAt(new \DateTime());
$leaveRequest->setCreatedBy($opt['updateby']->getId());
}else{
if($opt['saveupdate']==true){
$leaveRequest->setUpdatedAt(new \DateTime());
$leaveRequest->setUpdatedBy($opt['updateby']);
}
}
$em->persist($leaveRequest);
$em->flush();
$userupd=$leaveRequest->getUser()->getId();
if(isset($opt['updateby'])){
if(!is_null($opt['updateby'])){
if(is_null($olddata)){
$userupd=$opt['updateby']->getId();
}else{
$userupd=$opt['updateby'];
}
}
}
if(isset($option['setlog'])){
$this->log->save($leaveRequest->getUser(), [
'owner' => $leaveRequest->getUser(),
'message' => $option['setlog'],
'old_data' => $olddatalog,
'new_data' => $leaveRequest
]);
}
$this->updateEntitlementFromLeave($opt['user'], $opt['leaveType'], $alocation, $back);
}
/*if(!isset($opt['attributes']['history'])){
$opt['attributes']['history']=array();
}
if(count($removeidmc) > 0){
foreach($removeidmc as $rm){
if(is_array($attridmc[$rm['no']])){
foreach($attridmc[$rm['no']] as $k=>$v){
if(isset($opt['attributes'][$k])){
if($k=='gcalid'){
}else if($k=='history'){
foreach($v as $history){
$opt['attributes']['history'][count($opt['attributes']['history'])]=$history;
}
}else{
$opt['attributes'][$k].=','.$v;
}
}
}
}
if(is_array($logidmc[$rm['no']])){
foreach($logidmc as $v){
$opt['log'][count($opt['log'])]=$v;
}
}
}
foreach($opt['attributes'] as $k=>$v){
if(!is_array($opt['attributes'][$k])){
$opt['attributes'][$k]=trim($v,',');
}
}
}
$today=new \DateTime();
$historyc=count($opt['attributes']['history']);
$opt['attributes']['history'][$historyc]=array();
$opt['attributes']['history'][$historyc]['date']=$today->format('Y-m-d H:i:s');
$opt['attributes']['history'][$historyc]['day']=$opt['days'];
$opt['attributes']['history'][$historyc]['startDate']=$opt['startDate']->format('Y-m-d');
$opt['attributes']['history'][$historyc]['endDate']=$opt['endDate']->format('Y-m-d');
$opt['attributes']['history'][$historyc]['remove']=array();
if(count($removeidmc) > 0){
foreach($removeidmc as $rm){
$opt['attributes']['history'][$historyc]['remove'][count($opt['attributes']['history'][$historyc]['remove'])]=$idmcdellist[$rm['no']];
}
}
$opt['attributes']['history'][$historyc]['current']=$currentopt;
$rqid=array();
$rgcalid=array();
if(count($removeidmc) > 0){
foreach($removeidmc as $rm){
$rqid[count($rqid)]=$rm['id'];
}
$removeRequest = $em->getRepository(LeaveRequest::class)->findBy(array('id'=>$rqid));
foreach($removeRequest as $r){
$rattr=$r->getAttributes();
if(isset($rattr['gcalid'])){
$rgcalid[count($rgcalid)]=$rattr['gcalid'];
}
$this->deleteRequest($r);
}
} */
$leaves=clone $leaveRequest;
$lefts=$this->_lefts(array(
'user'=>$opt['user'],
'start'=>$opt['startDate']->format('Y-m-d'),
'end'=>$opt['endDate']->format('Y-m-d')
));
if(isset($lefts['u'.$opt['user']->getId()]['y'.$opt['startDate']->format('Y')]['t'.$opt['leaveType']->getId()])){
$leaves->setDaysLeft($lefts['u'.$opt['user']->getId()]['y'.$opt['startDate']->format('Y')]['t'.$opt['leaveType']->getId()]);
}else{
$leaves->setDaysLeft(0);
}
/*'remove'=>$rqid,
'rgcalid'=>$rgcalid*/
/*$txt=ob_get_clean();
fwrite($hftest,$txt);
fclose($hftest);*/
return array(
'data'=>$leaves,
'olddata'=>$olddata,
'isupdate'=>$isupdate,
'remove'=>$removedmc,
'rgcalid'=>$removedgmc,
'updatedate'=>$updatedate
);
}
public function saveRequest2($option=array()){
$default=array(
'id'=>null,
'user'=>null,
'leaveType'=>null,
'startDate'=>null,
'endDate'=>null,
'isApproved'=>null,
'am'=>false,
'pm'=>false,
'days'=>0,
'attributes'=>array(),
'comment'=>'',
'saveupdate'=>true,
'updateby'=>null,
'reviewBy'=>null,
);
$opt=$default;
$opt['log']=array();
$currentopt=array();
if(isset($option['startDate'])){
$currentopt['startDate']=$option['startDate']->format('Y-m-d');
}
if(isset($option['endDate'])){
$currentopt['endDate']=$option['endDate']->format('Y-m-d');
}
if(isset($option['days'])){
$currentopt['days']=$option['days'];
}
$em = $this->entityManager;
$leaveRequest=null;
$olddata = null;
$olddatalog = null;
$isupdate=false;
$entbyid=array();
$ent=array();
$entbyyear=array();
$leaveent=$em->getRepository(LeaveEntitlement::class)->findAll();
foreach($leaveent as $l){
$uid=$l->getUser()->getId();
$yr=$l->getYear();
$ty=$l->getLeaveType()->getId();
$entbyid['c'.$l->getId()]=$l;
if(!isset($entbyyear['u'.$uid])){$entbyyear['u'.$uid]=array();}
if(!isset($entbyyear['u'.$uid]['y'.$yr])){$entbyyear['u'.$uid]['y'.$yr]=array();}
if(!isset($entbyyear['u'.$uid]['y'.$yr]['t'.$ty])){
$entbyyear['u'.$uid]['y'.$yr]['t'.$ty]=array();
$entbyyear['u'.$uid]['y'.$yr]['t'.$ty]['left'] =$l->getLeaveLeft();
$entbyyear['u'.$uid]['y'.$yr]['t'.$ty]['ent']=$l;
}
}
/*print_r("");
print_r("\n");*/
if(isset($option['id'])){
$leaveRequest = $em->getRepository(LeaveRequest::class)->find($option['id']);
if(!is_null($leaveRequest)){
$olddata = clone $leaveRequest;$isupdate=true;
$olddatalog=clone $olddata;
}
}
if(!is_null($olddata)){
$opt['isApproved'] = $olddata->getIsApproved();
$opt['am'] = $olddata->getIsHalfStart();
$opt['pm'] = $olddata->getIsHalfEnd();
$opt['comment'] = $olddata->getComment();
$opt['attributes'] = $olddata->getAttributes();
$opt['startDate'] = $olddata->getStartDate();
$opt['endDate'] = $olddata->getEndDate();
$opt['leaveType']=$olddata->getLeaveType();
$opt['user']=$olddata->getUser();
$opt['reviewBy']=$olddata->getReviewedBy();
$opt['log']=$olddata->getLog();
}
$idmc=array();
$idmclist=array();
$attridmc=array();
$logidmc=array();
$idmcdellist=array();
$ismc=false;
$ismccheck=true;
$mcdate=array();
$updatedate=null;
$updateby=null;
$mchalf=array();
$oldmchalf=array();
if(!is_null($opt['leaveType'])){$option['leaveType']=$opt['leaveType'];}
if(!is_null($opt['user'])){$option['user']=$opt['user'];}
if(isset($option['leaveType'])){
if($option['leaveType']->getLeaveName()=='sick'){
$ismc=true;
if(isset($option['id']) && !is_null($olddata)){
$mcdate['startDate']= new \DateTime($opt['startDate']->format('Y-m-d'));
$mcdate['endDate']= new \DateTime($opt['endDate']->format('Y-m-d'));
}
if(isset($option['startDate']) && !is_null($option['startDate'])){$mcdate['startDate']=new \DateTime($option['startDate']->format('Y-m-d'));}
if(isset($option['endDate']) && !is_null($option['endDate'])){$mcdate['endDate']=new \DateTime($option['endDate']->format('Y-m-d'));}
}
}
$mcallocation=array();
$historymc=array();
$tmphismc=array();
if($ismc){
if(!is_null($option['leaveType'])){
$ucountry=$option['leaveType']->getOffice()->getCountry();
}elseif(!is_null($option['user'])){
$ucountry=$option['user']->getOffice()->getCountry();
}
$holidays=array();
$holidaydt=$em->getRepository(\App\Entity\LeaveBankHoliday::class)->findAll();
foreach($holidaydt as $hl){
$loc=$hl->getLocation();
if(!isset($holidays[$loc])){$holidays[$loc]=array();}
$shl=new \DateTime($hl->getDate()->format('Y-m-d'));
if(is_null($hl->getEndDate())){
$ehl=new \DateTime($hl->getDate()->format('Y-m-d'));
}else{
$ehl=new \DateTime($hl->getEndDate()->format('Y-m-d'));
}
$inval=date_diff($ehl,$shl);
$inval=abs($inval->d)+1;
for($hv=0;$hv<$inval;$hv++){
$holidays[$loc][count($holidays[$loc])]=$shl->format('Y-m-d');
$shl->modify('+1 day');
}
}
$offdays=array(0,6);
$offdaysdt=array(6,7);
if(isset($mcdate['startDate']) && isset($mcdate['endDate'])){
if($ismccheck){
$stdatemc = new \DateTime($mcdate['startDate']->format('Y-m-d'));
$stdatemc->modify('-30 days');
$endatemc = new \DateTime($mcdate['endDate']->format('Y-m-d'));
$endatemc->modify('+30 days');
$getsick=$em->getRepository(LeaveRequest::class)->createQueryBuilder('a')
->select('a')
->where('a.user = :user')
->andWhere('a.leaveType in (:leavetype)')
->andWhere('a.startDate >= :from')
->andWhere('a.startDate <= :to')
->setParameter('from',$stdatemc)
->setParameter('to', $endatemc)
->setParameter('leavetype', $option['leaveType'])
->setParameter('user', $option['user'])
->orderBy('a.startDate')
->getQuery()
->getResult();
if(!is_null($getsick)){
$rqidx=-1;
if(!is_null($leaveRequest)){$rqidx=$leaveRequest->getId();}
foreach($getsick as $gs){
$attrmc=$gs->getAttributes();
$startmc=$gs->getStartDate();
$endmc=$gs->getEndDate();
$tidmc=-1;
if($gs->getId()!=$rqidx){
$lessstart=new \DateTime($mcdate['startDate']->format('Y-m-d'));
$lessstart->modify('-1 day');
$lsok=false;
if(in_array($lessstart->format('N'),$offdaysdt)){$lsok=true;}
if(isset($holidays[$ucountry])){
if(in_array($lessstart->format('Y-m-d'),$holidays[$ucountry])){
$lsok=true;
}
}
while($lsok){
$lsok=false;
$lessstart->modify('-1 day');
if(in_array($lessstart->format('N'),$offdaysdt)){$lsok=true;}
if(isset($holidays[$ucountry])){
if(in_array($lessstart->format('Y-m-d'),$holidays[$ucountry])){
$lsok=true;
}
}
}
$lessend=new \DateTime($mcdate['endDate']->format('Y-m-d'));
$lessend->modify('+1 day');
$lsok=false;
if(in_array($lessend->format('N'),$offdaysdt)){$lsok=true;}
if(isset($holidays[$ucountry])){
if(in_array($lessend->format('Y-m-d'),$holidays[$ucountry])){
$lsok=true;
}
}
while($lsok){
$lsok=false;
$lessend->modify('+1 day');
if(in_array($lessend->format('N'),$offdaysdt)){$lsok=true;}
if(isset($holidays[$ucountry])){
if(in_array($lessend->format('Y-m-d'),$holidays[$ucountry])){
$lsok=true;
}
}
}
if(($lessstart >= $startmc) && ($lessend <= $endmc)){$tidmc=$gs->getId();}
if(($lessstart <= $startmc) && ($lessend >= $startmc)){$tidmc=$gs->getId();}
if(($lessstart <= $endmc) && ($lessend >= $endmc)){$tidmc=$gs->getId();}
}else{
$tidmc=$gs->getId();
if(isset($currentopt['startDate']) && isset($currentopt['endDate'])){
$endmc=new \DateTime($currentopt['endDate']);
$startmc=new \DateTime($currentopt['startDate']);
}
}
if($tidmc > -1){
if($mcdate['endDate'] < $endmc){$mcdate['endDate']=$endmc;}
if($mcdate['startDate'] > $startmc){$mcdate['startDate']=$startmc;}
$idmclist[count($idmc)]=$gs;
$idmc[count($idmc)]=$tidmc;
}
}
foreach($idmclist as $ml){
$sdtmc=new \DateTime($ml->getStartDate()->format('Y-m-d'));
$edtmc=new \DateTime($ml->getEndDate()->format('Y-m-d'));
$intmc=date_diff($sdtmc,$edtmc);
$intmc=abs($intmc->d)+1;
$attrmc=$ml->getAttributes();
if(isset($attrmc['historymc'])){
foreach($attrmc['historymc'] as $kh=>$h){
$historymc[$kh]=$h;
}
}
for($d=0;$d<$intmc;$d++){
$dvx=1;
$dv=new \DateTime($sdtmc->format('Y-m-d'));
$okadd=true;
if(in_array(date('w',strtotime($dv->format('Y-m-d'))),$offdays)){$okadd=false;}
if(isset($ucountry)){
if(isset($holidays[$ucountry])){
if(in_array($dv->format('Y-m-d'),$holidays[$ucountry])){$okadd=false;}
}
}
if($okadd){
if(!isset($mcallocation['d'.$dv->format('Y-m-d')])){
$mcallocation['d'.$dv->format('Y-m-d')]=array();
$mcallocation['d'.$dv->format('Y-m-d')]=0;
}
if($d==0){
if(!is_null($ml->getIsHalfStart())){
if(($ml->getIsHalfStart()==true) || ($ml->getIsHalfStart()==1)){$dvx=0.5;}
}
}
if($d==($intmc-1)){
if(!is_null($ml->getIsHalfEnd())){
if(($ml->getIsHalfEnd()==true) || ($ml->getIsHalfEnd()==1)){$dvx=0.5;}
}
}
if(isset($attrmc['mc'])){
if(isset($attrmc['mc']['d'.$dv->format('Y-m-d')])){
$dvx=$attrmc['mc']['d'.$dv->format('Y-m-d')];
$mcallocation['d'.$dv->format('Y-m-d')]=$dvx;
}else{
$mcallocation['d'.$dv->format('Y-m-d')]=$dvx;
}
}else{
$mcallocation['d'.$dv->format('Y-m-d')]=$dvx;
}
if(isset($attrmc['mcp'])){
if(isset($attrmc['mcp']['d'.$dv->format('Y-m-d')])){
$oldmchalf['d'.$dv->format('Y-m-d')]=$attrmc['mcp']['d'.$dv->format('Y-m-d')];
$mchalf['d'.$dv->format('Y-m-d')]=$attrmc['mcp']['d'.$dv->format('Y-m-d')];
}
}
//if($dvx >= $mcallocation['d'.$dv->format('Y-m-d')]){$mcallocation['d'.$dv->format('Y-m-d')]=$dvx;}
}
$sdtmc->modify('+1 day');
}
}
}
}
$sdtmc=new \DateTime($mcdate['startDate']->format('Y-m-d'));
$edtmc=new \DateTime($mcdate['endDate']->format('Y-m-d'));
$intmc=date_diff($sdtmc,$edtmc);
$intmc=abs($intmc->d)+1;
$createdatdate2=null;
for($d=0;$d<$intmc;$d++){
$dvx=1;
$dv=new \DateTime($sdtmc->format('Y-m-d'));
$dv=$dv->format('Y-m-d');
$okadd=true;
if(in_array(date('w',strtotime($dv)),$offdays)){$okadd=false;}
if(isset($ucountry)){
if(isset($holidays[$ucountry])){
if(in_array($dv,$holidays[$ucountry])){$okadd=false;}
}
}
if(!isset($mcallocation['d'.$dv]) && ($okadd)){
$mcallocation['d'.$dv]=0;
if(isset($currentopt['startDate']) && isset($currentopt['endDate'])){
if($dv==$currentopt['startDate']){
if(!is_null($opt['am'])){
if(($opt['am']==true) || ($opt['am']==1)){$dvx=0.5;}
}
if(!is_null($option['am'])){
if(($option['am']==true) || ($option['am']==1)){$dvx=0.5;}
}
}
if($dv==$currentopt['endDate']){
if(!is_null($opt['pm'])){
if(($opt['pm']==true) || ($opt['pm']==1)){$dvx=0.5;}
}
if(!is_null($option['pm'])){
if(($option['pm']==true) || ($option['pm']==1)){$dvx=0.5;}
}
}
}
if($dvx >= $mcallocation['d'.$dv]){$mcallocation['d'.$dv]=$dvx;}
}
$sdtmc->modify('+1 day');
}
}
if(isset($currentopt['startDate']) && isset($currentopt['endDate'])){
$sdtmc=new \DateTime($currentopt['startDate']);
$edtmc=new \DateTime($currentopt['endDate']);
$intmc=date_diff($sdtmc,$edtmc);
$intmc=abs($intmc->d)+1;
$tday=0;
for($d=0;$d<$intmc;$d++){
$dvx=1;
$dv=new \DateTime($sdtmc->format('Y-m-d'));
$dv=$dv->format('Y-m-d');
$okadd=true;
if(in_array(date('w',strtotime($dv)),$offdays)){$okadd=false;}
if(isset($ucountry)){
if(isset($holidays[$ucountry])){
if(in_array($dv,$holidays[$ucountry])){$okadd=false;}
}
}
if($okadd){
$mchalf['d'.$dv]=array();
$mchalf['d'.$dv]['am']=false;
$mchalf['d'.$dv]['pm']=false;
if(isset($oldmchalf['d'.$dv])){
$mchalf['d'.$dv]=$oldmchalf['d'.$dv];
}
if($d==0){
$amtrue=false;
if(!is_null($opt['am'])){
if(($opt['am']==true) || ($opt['am']==1)){$dvx=0.5;$amtrue=true;}
}
if(!is_null($option['am'])){
if(($option['am']==true) || ($option['am']==1)){$dvx=0.5;$amtrue=true;}
if(($option['am']==false) || ($option['am']==0)){$dvx=1;$amtrue=false;}
}
if(isset($oldmchalf['d'.$dv])){
if($oldmchalf['d'.$dv]['am']!=$amtrue){
$mcallocation['d'.$dv]=$dvx;
}
}else{
$mcallocation['d'.$dv]=$dvx;
}
if(!isset($mcallocation['d'.$dv])){$mcallocation['d'.$dv]=$dvx;}
$mchalf['d'.$dv]['am']=$amtrue;
}
if($d==($intmc-1)){
$pmtrue=false;
if(!is_null($opt['pm'])){
if(($opt['pm']==true) || ($opt['pm']==1)){$dvx=0.5;$pmtrue=true;}
}
if(!is_null($option['pm'])){
$pmok=true;
if($d==0){
if(!is_null($option['am'])){
if(($option['am']==true) || ($option['am']==1)){$pmok=false;$pmtrue=false;}
}
}
if($pmok){
if(($option['pm']==true) || ($option['pm']==1)){$dvx=0.5;$pmtrue=true;}
if(($option['pm']==false) || ($option['pm']==0)){$dvx=1;$pmtrue=false;}
}
if(isset($oldmchalf['d'.$dv])){
if($oldmchalf['d'.$dv]['pm']!=$pmtrue){
$mcallocation['d'.$dv]=$dvx;
}
}else{
$mcallocation['d'.$dv]=$dvx;
}
if(!isset($mcallocation['d'.$dv])){$mcallocation['d'.$dv]=$dvx;}
$mchalf['d'.$dv]['pm']=$pmtrue;
}
}
//if(isset($mcallocation['d'.$dv])){$dvx=$mcallocation['d'.$dv];}
$tday+=$dvx;
}
$sdtmc->modify('+1 day');
}
$tmphismc=array();
$tmphismc['startDate']=$currentopt['startDate'];
$tmphismc['endDate']=$currentopt['endDate'];
$tmphismc['am']=$option['am'];
$tmphismc['pm']=$option['pm'];
if(is_null($leaveRequest)){
$tmphismc['createDate']=date('Y-m-d');
}else{
$tmphismc['createDate']=$leaveRequest->getCreatedAt()->format('Y-m-d');
$tmphismc['am']=$leaveRequest->getIsHalfStart();
$tmphismc['pm']=$leaveRequest->getIsHalfEnd();
}
if(!is_null($option['am'])){$tmphismc['am']=$option['am'];}
if(!is_null($option['pm'])){$tmphismc['pm']=$option['pm'];}
$tmphismc['day']=$tday;
}
}
$removeidmc=array();
$oldApproved = null;
$oam = false;
$opm = false;
foreach($option as $k=>$v){
if($k=='attributes'){
foreach($v as $kv=>$vv){
$opt['attributes'][$kv]=$vv;
}
}else{
$isold=false;
if(!is_null($olddata)){
if($k=='leaveType'){$isold=true;}
}
if(!$isold){$opt[$k]=$v;}
}
}
if(is_null($opt['user'])){$opt['user']=$this->getUser();}
if(is_null($opt['updateby'])){$opt['updateby']=$opt['user'];}
$isApproved = null;
$isap=1;
if(!is_null($opt['isApproved'])){
$isApproved=$opt['isApproved'];
if(($isApproved==false) || ($isApproved==0)){$isap=0;}
};
$typ='';
if(!is_null($opt['leaveType'])){
$typ=$opt['leaveType']->getLeaveName();
//if($opt['leaveType']->getLeaveName()=='sick'){$isap=1;}
}
$removedmc=array();
$removedgmc=array();
if($ismc){
$uidmc=$opt['user']->getId();
if(!isset($alocation)){$alocation=array();}
$idrqx=-1;
$lvtypeid=$opt['leaveType']->getId();
if(!is_null($leaveRequest)){$idrqx=$leaveRequest->getId();}
$removeentmc=array();
foreach($idmclist as $idm){
$alc=$idm->getAlocation();
if($alc==null){$alc==array();}
foreach($alc as $kc=>$vc){
if(substr($kc,0,1)=='y'){
$yc=substr($kc,1,4);
if(!isset($removeentmc['x'.$idm->getUser()->getId().'x'.$yc.'x'.$idm->getLeaveType()->getId()])){
$removeentmc['x'.$idm->getUser()->getId().'x'.$yc.'x'.$idm->getLeaveType()->getId()]=0;
}
$removeentmc['x'.$idm->getUser()->getId().'x'.$yc.'x'.$idm->getLeaveType()->getId()]+=$vc;
}
}
if(is_null($createdatdate2)){
$createdatdate2=new \DateTime($idm->getCreatedAt()->format('Y-m-d'));
if(!$idm->getCreatedBy() instanceof \App\Entity\User){
$xiuser=$em->getRepository(\App\Entity\User::class)->find($idm->getCreatedBy());
if(!is_null($xiuser)){
$updateby=$xiuser->getId();
}
}else{
$updateby=$idm->getCreatedBy()->getId();
}
//$createdatdate2=new \DateTime('createDate');
}
$idmcd=new \DateTime($idm->getCreatedAt()->format('Y-m-d'));
if(!$idm->getCreatedBy() instanceof \App\Entity\User){
$xiuser=$em->getRepository(\App\Entity\User::class)->find($idm->getCreatedBy());
if(!is_null($xiuser)){
$updatebyt=$xiuser->getId();
}
}else{
$updatebyt=$idm->getCreatedBy()->getId();
}
if($idmcd < $createdatdate2){
$createdatdate2=new \DateTime($idmcd->format('Y-m-d'));
$updateby= $updatebyt;
}
$attridm=$idm->getAttributes();
if(isset($attridm['historymc'])){
foreach($attridm['historymc'] as $aidmc){
if(isset($aidmc['createDate'])){
$idmcd=new \DateTime($aidmc['createDate']);
if($idmcd < $createdatdate2){
$createdatdate2=new \DateTime($idmcd->format('Y-m-d'));
$updateby=$aidmc['createBy'];
}
}
}
}
if($idm->getId()!=$idrqx){
$removedmc[count($removedmc)]=$idm->getId();
$rmattr=$idm->getAttributes();
if(isset($rmattr['file'])){
if(!isset($opt['attributes']['file'])){
$opt['attributes']['file']=$rmattr['file'];
}
}
if(isset($rmattr['gcalid'])){
$removedgmc[count($removedgmc)]=$rmattr['gcalid'];
}
$this->deleteRequest($idm);
}
}
$tdays=0;
foreach($removeentmc as $kre=>$re){
$krc=explode('x',$kre);
if(isset($entbyyear['u'.$krc[1]])){
if(isset($entbyyear['u'.$krc[1]]['y'.$krc[2]])){
if(isset($entbyyear['u'.$krc[1]]['y'.$krc[2]]['t'.$krc[3]])){
$entbyyear['u'.$krc[1]]['y'.$krc[2]]['t'.$krc[3]]['left']+=$re;
}
}
}
}
foreach($mcallocation as $kh=>$hh){
$dth=str_replace('d','',$kh);
$sdx=new \DateTime($dth);
if(($sdx < $mcdate['startDate']) || ($sdx > $mcdate['endDate'])){
unset($mcallocation[$kh]);
}
}
$updateentmc=array();
foreach($mcallocation as $kh=>$hh){
$dth=str_replace('d','',$kh);
$tmh=strtotime($dth);
$yh=date('Y',$tmh);
if($yh > 2001){
if(isset($entbyyear['u'.$uidmc])){
if(isset($entbyyear['u'.$uidmc]['y'.$yh])){
if(isset($entbyyear['u'.$uidmc]['y'.$yh]['t'.$lvtypeid])){
$mclt=$entbyyear['u'.$uidmc]['y'.$yh]['t'.$lvtypeid]['left'];
$mcl=$mclt-$hh;
if($mcl < 0){
if($mcl > -$hh){
if(!isset($alocation['y'.$yh])){$alocation['y'.$yh]=0;}
$alocation['y'.$yh]+=$mclt;
if(!isset($alocation['unpaid'])){$alocation['unpaid']=array();}
if(!isset($alocation['unpaid']['y'.$yh])){$alocation['unpaid']['y'.$yh]=array();}
if(!isset($alocation['unpaid']['y'.$yh]['value'])){$alocation['unpaid']['y'.$yh]['date']=array();}
if(!isset($alocation['unpaid']['y'.$yh]['value'])){$alocation['unpaid']['y'.$yh]['value']=0;}
$ucdate=count($alocation['unpaid']['y'.$yh]['date']);
$alocation['unpaid']['y'.$yh]['date'][$ucdate]=array();
$alocation['unpaid']['y'.$yh]['date'][$ucdate]['date']=date('Y-m-d',$tmh);
$alocation['unpaid']['y'.$yh]['date'][$ucdate]['value']=$hh;
$alocation['unpaid']['y'.$yh]['value']+=($hh-$mclt);
}else{
if(!isset($alocation['unpaid'])){$alocation['unpaid']=array();}
if(!isset($alocation['unpaid']['y'.$yh])){$alocation['unpaid']['y'.$yh]=array();}
if(!isset($alocation['unpaid']['y'.$yh]['value'])){$alocation['unpaid']['y'.$yh]['date']=array();}
if(!isset($alocation['unpaid']['y'.$yh]['value'])){$alocation['unpaid']['y'.$yh]['value']=0;}
$ucdate=count($alocation['unpaid']['y'.$yh]['date']);
$alocation['unpaid']['y'.$yh]['date'][$ucdate]=array();
$alocation['unpaid']['y'.$yh]['date'][$ucdate]['date']=date('Y-m-d',$tmh);
$alocation['unpaid']['y'.$yh]['date'][$ucdate]['value']=$hh;
$alocation['unpaid']['y'.$yh]['value']+=$hh;
}
$entbyyear['u'.$uidmc]['y'.$yh]['t'.$lvtypeid]['left']=0;
$updateentmc['x'.$uidmc.'x'.$yh.'x'.$lvtypeid]=0;
}else{
if(!isset($alocation['y'.$yh])){$alocation['y'.$yh]=0;}
$alocation['y'.$yh]+=$hh;
$entbyyear['u'.$uidmc]['y'.$yh]['t'.$lvtypeid]['left']-=$hh;
$updateentmc['x'.$uidmc.'x'.$yh.'x'.$lvtypeid]=$entbyyear['u'.$uidmc]['y'.$yh]['t'.$lvtypeid]['left'];
}
}else{
if(!isset($alocation['unpaid'])){$alocation['unpaid']=array();}
if(!isset($alocation['unpaid']['y'.$yh])){$alocation['unpaid']['y'.$yh]=array();}
if(!isset($alocation['unpaid']['y'.$yh]['value'])){$alocation['unpaid']['y'.$yh]['date']=array();}
if(!isset($alocation['unpaid']['y'.$yh]['value'])){$alocation['unpaid']['y'.$yh]['value']=0;}
$ucdate=count($alocation['unpaid']['y'.$yh]['date']);
$alocation['unpaid']['y'.$yh]['date'][$ucdate]=array();
$alocation['unpaid']['y'.$yh]['date'][$ucdate]['date']=date('Y-m-d',$tmh);
$alocation['unpaid']['y'.$yh]['date'][$ucdate]['value']=$hh;
$alocation['unpaid']['y'.$yh]['value']+=$hh;
}
}else{
if(!isset($alocation['unpaid'])){$alocation['unpaid']=array();}
if(!isset($alocation['unpaid']['y'.$yh])){$alocation['unpaid']['y'.$yh]=array();}
if(!isset($alocation['unpaid']['y'.$yh]['value'])){$alocation['unpaid']['y'.$yh]['date']=array();}
if(!isset($alocation['unpaid']['y'.$yh]['value'])){$alocation['unpaid']['y'.$yh]['value']=0;}
$ucdate=count($alocation['unpaid']['y'.$yh]['date']);
$alocation['unpaid']['y'.$yh]['date'][$ucdate]=array();
$alocation['unpaid']['y'.$yh]['date'][$ucdate]['date']=date('Y-m-d',$tmh);
$alocation['unpaid']['y'.$yh]['date'][$ucdate]['value']=$hh;
$alocation['unpaid']['y'.$yh]['value']+=$hh;
}
}else{
if(!isset($alocation['unpaid'])){$alocation['unpaid']=array();}
if(!isset($alocation['unpaid']['y'.$yh])){$alocation['unpaid']['y'.$yh]=array();}
if(!isset($alocation['unpaid']['y'.$yh]['value'])){$alocation['unpaid']['y'.$yh]['date']=array();}
if(!isset($alocation['unpaid']['y'.$yh]['value'])){$alocation['unpaid']['y'.$yh]['value']=0;}
$ucdate=count($alocation['unpaid']['y'.$yh]['date']);
$alocation['unpaid']['y'.$yh]['date'][$ucdate]=array();
$alocation['unpaid']['y'.$yh]['date'][$ucdate]['date']=date('Y-m-d',$tmh);
$alocation['unpaid']['y'.$yh]['date'][$ucdate]['value']=$hh;
$alocation['unpaid']['y'.$yh]['value']+=$hh;
}
}else{
if(!isset($alocation['y'.$yh])){$alocation['y'.$yh]=0;}
$alocation['y'.$yh]+=$hh;
}
$tdays+=$hh;
}
if(!is_null($opt['updateby'])){
$tmphismc['createBy']=$opt['updateby']->getId();
}else if(!is_null($opt['user'])){
$tmphismc['createBy']=$opt['user']->getId();
}
$opt['attributes']['historymc']=$historymc;
$opt['attributes']['mc']=$mcallocation;
$opt['attributes']['mcp']=$mchalf;
if(is_null($leaveRequest)){
$leaveRequest = new LeaveRequest();
}
$manualapp=false;
if(isset($opt['attributes']['autoapproved'])){
if(isset($option['isApproved'])){
if($option['isApproved']){
$manualapp=true;
}
}
}else{
if(!isset($opt['attributes']['manualapproved'])){
if(!is_null($opt['isApproved'])){
$manualapp=true;
}
}
}
if($manualapp){
$opt['attributes']['manualapproved']=true;
unset($opt['attributes']['autoapproved']);
}else{
$opt['attributes']['autoapproved']=true;
if(isset($opt['attributes']['file'])){
if($opt['attributes']['file']!=''){
if(is_null($opt['isApproved'])){$isApproved=true;}
}
}else{
if($tdays <= 1){
$isApproved=true;
if(!is_null($leaveRequest)){
$createdat=$leaveRequest->getCreatedAt();
}
}else{
$isApproved=false;
}
}
}
$leaveRequest->setUser($opt['user']);
$leaveRequest->setStartDate($mcdate['startDate']);
$leaveRequest->setEndDate($mcdate['endDate']);
$leaveRequest->setIsHalfStart($opt['am']);
$leaveRequest->setIsHalfEnd($opt['pm']);
$leaveRequest->setIsApproved($isApproved);
$leaveRequest->setLeaveType($opt['leaveType']);
$leaveRequest->setDays($tdays);
$leaveRequest->setAttributes($opt['attributes']);
$leaveRequest->setComment($opt['comment']);
if(!is_null($isApproved)){
$leaveRequest->setReviewedBy($opt['reviewBy']);
}
$leaveRequest->setAlocation($alocation);
if(isset($opt['log'])){
if(!is_array($opt['log'])){$opt['log']=array();}
if(isset($opt['log']) && count($opt['log']) > 0){
$leaveRequest->setLog($opt['log']);
}
}
$updatedate=null;
if(is_null($olddata)){
$updatedate=null;
if(!is_null($createdatdate2)){
$leaveRequest->setCreatedAt($createdatdate2);
if(!is_null($updateby)){
$leaveRequest->setCreatedBy($updateby);
}else{
if(is_null($opt['updateby'])){$opt['updateby']=$opt['user'];}
$leaveRequest->setCreatedBy($opt['updateby']->getId());
}
if($opt['saveupdate']==true){
$leaveRequest->setUpdatedAt(new \DateTime());
if(is_null($opt['updateby'])){$opt['updateby']=$opt['user'];}
$leaveRequest->setUpdatedBy($opt['updateby']);
$updatedate=new \DateTime();
}
}else{
$leaveRequest->setCreatedAt(new \DateTime());
if(is_null($opt['updateby'])){$opt['updateby']=$opt['user'];}
$leaveRequest->setCreatedBy($opt['updateby']->getId());
}
}else{
if($opt['saveupdate']==true){
$leaveRequest->setUpdatedAt(new \DateTime());
if(is_null($opt['updateby'])){$opt['updateby']=$opt['user'];}
$leaveRequest->setUpdatedBy($opt['updateby']);
$updatedate=new \DateTime();
}
}
try {
$em->persist($leaveRequest);
$em->flush();
} catch (Exception $e) {
//throw $th;
}
$rqidx=$leaveRequest->getId();
if(!isset($tmphismc['startDate'])){
$stdt=new \DateTime($leaveRequest->getStartDate()->format('Y-m-d'));
$endt=new \DateTime($leaveRequest->getEndDate()->format('Y-m-d'));
$tmphismc['startDate']=$stdt->format('Y-m-d');
$tmphismc['endDate']=$endt->format('Y-m-d');
$tmphismc['am']=$leaveRequest->getIsHalfStart();
$tmphismc['pm']=$leaveRequest->getIsHalfEnd();
$tmphismc['day']=$leaveRequest->getDays();
$tmphismc['createDate']=$leaveRequest->getCreatedAt()->format('Y-m-d');
}
$opt['attributes']['historymc']['d'.$rqidx]=$tmphismc;
$leaveRequest->setAttributes($opt['attributes']);
$em->persist($leaveRequest);
$em->flush();
if(isset($opt['attributes']['historymc']) && isset($updatedate) && !is_null($updatedate)){
foreach($opt['attributes']['historymc'] as $dt){
if(isset($dt['createDate'])){
$cd=new \DateTime($dt['createDate']);
if($cd > $updatedate){$updatedate=$cd;}
}
}
}
foreach($updateentmc as $kre=>$re){
$krc=explode('x',$kre);
$leaveentr=$em->getRepository(\App\Entity\LeaveEntitlement::class)->findBy(array('user'=>$krc[1],'year'=>$krc[2],'leaveType'=>$krc[3]));
if(!is_null($leaveentr)){
foreach($leaveentr as $xl){
$xl->setLeaveLeft($re);
$em->persist($xl);
$em->flush();
}
}
}
}else{
if(is_null($leaveRequest)){
$leaveRequest = new LeaveRequest();
}
$back = $leaveRequest->getAlocation();
if(is_null($back)){$back=array();}
$alocation = array();
if(isset($back['child'])){
foreach ($back['child'] as $kb => $bchild) {
$yr = str_replace('y', '', $kb);
foreach ($bchild as $kb1 => $vb1) {
$cid = str_replace('c', '', $kb1);
//$chde = $this->getDoctrine()->getRepository(LeaveEntitlement::class)->findBy(array('user' => $userData, 'id' => $cid, 'year' => $yr));
if (isset($entbyid['c'.$cid])) {
//for ($bb = 0; $bb < count($chde); $bb++) {
$lf = $entbyid['c'.$cid]->getLeaveLeft();
$lf = $lf + $vb1;
$entbyid['c'.$cid]->setLeaveLeft($lf);
$em->persist($entbyid['c'.$cid]);
$em->flush();
//}
}
}
}
}
if ($isap == 0) {
foreach ($back as $k => $v) {
$yr = str_replace('y', '', $k);
switch ($k) {
case 'data':
break;
case 'dumper':
break;
case 'error':
break;
case 'type':
break;
case 'child':
break;
case 'dumper':
break;
case 'unpaid':
break;
default:
$yr = str_replace('y', '', $k);
$alocation['y' . $yr] = 0;
break;
}
}
} else {
$alocation = $this->calculate($opt['user'], $opt['leaveType'], $opt['startDate'], $opt['endDate'], $back, array('am' => $opt['am'], 'pm' => $opt['pm']));
foreach ($back as $k => $v) {
$yr = str_replace('y', '', $k);
switch ($k) {
case 'data':
break;
case 'dumper':
break;
case 'error':
break;
case 'child':
break;
case 'type':
break;
case 'unpaid':
break;
case 'dumper':
break;
default:
if (!isset($alocation['y' . $yr])) {
$alocation['y' . $yr] = 0;
}
break;
}
}
if ($alocation != false) {
$dy = 0;
$okd = false;
$upn=false;
foreach ($alocation as $ka => $a) {
switch ($ka) {
case 'data':
break;
case 'dumper':
break;
case 'error':
break;
case 'type':
break;
case 'dumper':
break;
case 'child':
foreach($a as $aa){
foreach($aa as $aaa){
$dy += $aaa;
}
}
$okd = true;
break;
case 'unpaid':
if($typ!='sick'){
foreach($a as $aa){
$dy += $aa['value'];
}
$okd = true;
}
break;
case 'type':
break;
default:
$dy += $a;
$okd = true;
break;
}
}
if($dy==0){
foreach ($alocation as $ka => $a) {
switch ($ka) {
case 'data':
break;
case 'dumper':
break;
case 'error':
break;
case 'type':
break;
case 'dumper':
break;
case 'child':
break;
case 'unpaid':
foreach($a as $aa){
$dy += $aa['value'];
}
$okd = true;
break;
default:
break;
}
}
}
if ($okd) {
$opt['days'] = $dy;
}
}
}
/*
if($opt['days']==0){
if(!is_null($olddata)){
$opt['days']=$olddata->getDays();
}
}
$leaveRequest->setUser($opt['user']);
$leaveRequest->setStartDate($opt['startDate']);
$leaveRequest->setEndDate($opt['endDate']);
$leaveRequest->setIsHalfStart($opt['am']);
$leaveRequest->setIsHalfEnd($opt['pm']);
$leaveRequest->setIsApproved($isApproved);
$leaveRequest->setLeaveType($opt['leaveType']);
$leaveRequest->setDays($opt['days']);
$leaveRequest->setAttributes($opt['attributes']);
$leaveRequest->setComment($opt['comment']);
if(!is_null($isApproved)){
$leaveRequest->setReviewedBy($opt['reviewBy']);
}
$leaveRequest->setAlocation($alocation);
if(isset($opt['log']) && count($opt['log']) > 0){
$leaveRequest->setLog($opt['log']);
}
if(is_null($olddata)){
$leaveRequest->setCreatedAt(new \DateTime());
$leaveRequest->setCreatedBy($opt['updateby']->getId());
}else{
if($opt['saveupdate']==true){
$leaveRequest->setUpdatedAt(new \DateTime());
$leaveRequest->setUpdatedBy($opt['updateby']);
}
}
$em->persist($leaveRequest);
$em->flush();
$userupd=$leaveRequest->getUser()->getId();
if(isset($opt['updateby'])){
if(!is_null($opt['updateby'])){
if(is_null($olddata)){
$userupd=$opt['updateby']->getId();
}else{
$userupd=$opt['updateby'];
}
}
}
if(isset($option['setlog'])){
$this->log->save($leaveRequest->getUser(), [
'owner' => $leaveRequest->getUser(),
'message' => $option['setlog'],
'old_data' => $olddatalog,
'new_data' => $leaveRequest
]);
}
$this->updateEntitlementFromLeave($opt['user'], $opt['leaveType'], $alocation, $back);
*/
}
/*
$leaves=clone $leaveRequest;
$lefts=$this->_lefts(array(
'user'=>$opt['user'],
'start'=>$opt['startDate']->format('Y-m-d'),
'end'=>$opt['endDate']->format('Y-m-d')
));
if(isset($lefts['u'.$opt['user']->getId()]['y'.$opt['startDate']->format('Y')]['t'.$opt['leaveType']->getId()])){
$leaves->setDaysLeft($lefts['u'.$opt['user']->getId()]['y'.$opt['startDate']->format('Y')]['t'.$opt['leaveType']->getId()]);
}else{
$leaves->setDaysLeft(0);
}
return array(
'data'=>$leaves,
'olddata'=>$olddata,
'isupdate'=>$isupdate,
'remove'=>$removedmc,
'rgcalid'=>$removedgmc,
'updatedate'=>$updatedate
);
*/
}
public function saveRequest3($option=array()){
$default=array(
'id'=>null,
'user'=>null,
'leaveType'=>null,
'startDate'=>null,
'endDate'=>null,
'isApproved'=>null,
'am'=>false,
'pm'=>false,
'days'=>0,
'attributes'=>array(),
'comment'=>'',
'saveupdate'=>true,
'updateby'=>null,
'reviewBy'=>null,
'allocation'=>''
);
$opt=$default;
$opt['log']=array();
$currentopt=array();
if(isset($option['startDate'])){
$currentopt['startDate']=$option['startDate']->format('Y-m-d');
}
if(isset($option['endDate'])){
$currentopt['endDate']=$option['endDate']->format('Y-m-d');
}
if(isset($option['days'])){
$currentopt['days']=$option['days'];
}
$em = $this->entityManager;
$leaveRequest=null;
$olddata = null;
$olddatalog = null;
$isupdate=false;
$entbyid=array();
$ent=array();
$entbyyear=array();
$leaveent=$em->getRepository(LeaveEntitlement::class)->findAll();
$forceholi=array();
foreach($leaveent as $l){
$uid=$l->getUser()->getId();
$yr=$l->getYear();
$ty=$l->getLeaveType()->getId();
$lattrs=$l->getAttributes();
if(isset($lattrs['forcedate'])){
if(!isset($forceholi['u'.$uid])){$forceholi['u'.$uid]=array();}
if(!isset($forceholi['u'.$uid]['t'.$ty])){$forceholi['u'.$uid]['t'.$ty]=array();}
$forceholi['u'.$uid]['t'.$ty]=array_merge($forceholi['u'.$uid]['t'.$ty],$lattrs['forcedate']);
}
$entbyid['c'.$l->getId()]=$l;
if(!isset($entbyyear['u'.$uid])){$entbyyear['u'.$uid]=array();}
if(!isset($entbyyear['u'.$uid]['y'.$yr])){$entbyyear['u'.$uid]['y'.$yr]=array();}
if(!isset($entbyyear['u'.$uid]['y'.$yr]['t'.$ty])){
$entbyyear['u'.$uid]['y'.$yr]['t'.$ty]=array();
$entbyyear['u'.$uid]['y'.$yr]['t'.$ty]['left'] =$l->getLeaveLeft();
$entbyyear['u'.$uid]['y'.$yr]['t'.$ty]['id']=$l->getId();
$entbyyear['u'.$uid]['y'.$yr]['t'.$ty]['ent']=$l;
}
}
if(isset($option['id'])){
$leaveRequest = $em->getRepository(LeaveRequest::class)->find($option['id']);
if(!is_null($leaveRequest)){
$olddata = clone $leaveRequest;$isupdate=true;
$olddatalog=clone $olddata;
}
}
if(!is_null($olddata)){
$opt['isApproved'] = $olddata->getIsApproved();
$opt['am'] = $olddata->getIsHalfStart();
$opt['pm'] = $olddata->getIsHalfEnd();
$opt['comment'] = $olddata->getComment();
$opt['attributes'] = $olddata->getAttributes();
$opt['startDate'] = $olddata->getStartDate();
$opt['endDate'] = $olddata->getEndDate();
$opt['leaveType']=$olddata->getLeaveType();
$opt['user']=$olddata->getUser();
$opt['reviewBy']=$olddata->getReviewedBy();
$opt['log']=$olddata->getLog();
}
$idmc=array();
$idmclist=array();
$attridmc=array();
$logidmc=array();
$idmcdellist=array();
$ismc=false;
$ismccheck=true;
$mcdate=array();
$updatedate=null;
$updateby=null;
$mchalf=array();
$oldmchalf=array();
if(!is_null($opt['leaveType'])){$option['leaveType']=$opt['leaveType'];}
if(!is_null($opt['user'])){$option['user']=$opt['user'];}
if(isset($option['leaveType'])){
if($option['leaveType']->getLeaveName()=='sick'){
$ismc=true;
if(isset($option['id']) && !is_null($olddata)){
$mcdate['startDate']= new \DateTime($opt['startDate']->format('Y-m-d'));
$mcdate['endDate']= new \DateTime($opt['endDate']->format('Y-m-d'));
}
if(isset($option['startDate']) && !is_null($option['startDate'])){$mcdate['startDate']=new \DateTime($option['startDate']->format('Y-m-d'));}
if(isset($option['endDate']) && !is_null($option['endDate'])){$mcdate['endDate']=new \DateTime($option['endDate']->format('Y-m-d'));}
/*if(isset($mcdate['startDate']) && isset($mcdate['endDate']) && !is_null($opt['startDate']) && !is_null($opt['endDate'])){
if(($mcdate['startDate']==$opt['startDate']) && ($mcdate['endDate'] == $opt['endDate'])){
$ismccheck=false;
}
}*/
}
}
$mcallocation=array();
$historymc=array();
$tmphismc=array();
$myleavetypeid=$option['leaveType']->getId();
if($ismc){
if(!is_null($option['user'])){
$ucountry=$option['user']->getOffice()->getCountry();
}
$holidays=array();
$holidaydt=$em->getRepository(\App\Entity\LeaveBankHoliday::class)->findAll();
foreach($holidaydt as $hl){
$loc=$hl->getLocation();
if(!isset($holidays[$loc])){$holidays[$loc]=array();}
$shl=new \DateTime($hl->getDate()->format('Y-m-d'));
if(is_null($hl->getEndDate())){
$ehl=new \DateTime($hl->getDate()->format('Y-m-d'));
}else{
$ehl=new \DateTime($hl->getEndDate()->format('Y-m-d'));
}
$inval=date_diff($ehl,$shl);
$inval=abs($inval->d)+1;
for($hv=0;$hv<$inval;$hv++){
$holidays[$loc][count($holidays[$loc])]=$shl->format('Y-m-d');
$shl->modify('+1 day');
}
}
$offdays=array(0,6);
$offdaysdt=array(6,7);
if(isset($mcdate['startDate']) && isset($mcdate['endDate'])){
if($ismccheck){
$stdatemc = new \DateTime($mcdate['startDate']->format('Y-m-d'));
$stdatemc->modify('-30 days');
$endatemc = new \DateTime($mcdate['endDate']->format('Y-m-d'));
$endatemc->modify('+30 days');
$getsick=$em->getRepository(LeaveRequest::class)->createQueryBuilder('a')
->select('a')
->where('a.user = :user')
->andWhere('a.leaveType in (:leavetype)')
->andWhere('a.startDate >= :from')
->andWhere('a.startDate <= :to')
->setParameter('from',$stdatemc)
->setParameter('to', $endatemc)
->setParameter('leavetype', $option['leaveType'])
->setParameter('user', $option['user'])
->orderBy('a.startDate')
->getQuery()
->getResult();
if(!is_null($getsick)){
$rqidx=-1;
if(!is_null($leaveRequest)){$rqidx=$leaveRequest->getId();}
foreach($getsick as $gs){
$attrmc=$gs->getAttributes();
$startmc=$gs->getStartDate();
$endmc=$gs->getEndDate();
$tidmc=-1;
if($gs->getId()!=$rqidx){
$lessstart=new \DateTime($mcdate['startDate']->format('Y-m-d'));
$lessstart->modify('-1 day');
$lsok=false;
if(in_array($lessstart->format('N'),$offdaysdt)){$lsok=true;}
if(isset($holidays[$ucountry])){
if(in_array($lessstart->format('Y-m-d'),$holidays[$ucountry])){
$lsok=true;
}
}
if(isset($forceholi['u'.$option['user']->getId()])){
if(isset($forceholi['u'.$option['user']->getId()]['t'.$option['leaveType']->getId()])){
if(in_array($lessstart->format('Y-m-d'),$forceholi['u'.$option['user']->getId()]['t'.$option['leaveType']->getId()])){
$lsok=false;
}
}
}
while($lsok){
$lsok=false;
$lessstart->modify('-1 day');
if(in_array($lessstart->format('N'),$offdaysdt)){$lsok=true;}
if(isset($holidays[$ucountry])){
if(in_array($lessstart->format('Y-m-d'),$holidays[$ucountry])){
$lsok=true;
}
}
if(isset($forceholi['u'.$option['user']->getId()])){
if(isset($forceholi['u'.$option['user']->getId()]['t'.$option['leaveType']->getId()])){
if(in_array($lessstart->format('Y-m-d'),$forceholi['u'.$option['user']->getId()]['t'.$option['leaveType']->getId()])){
$lsok=false;
}
}
}
}
$lessend=new \DateTime($mcdate['endDate']->format('Y-m-d'));
$lessend->modify('+1 day');
$lsok=false;
if(in_array($lessend->format('N'),$offdaysdt)){$lsok=true;}
if(isset($holidays[$ucountry])){
if(in_array($lessend->format('Y-m-d'),$holidays[$ucountry])){
$lsok=true;
}
}
if(isset($forceholi['u'.$option['user']->getId()])){
if(isset($forceholi['u'.$option['user']->getId()]['t'.$option['leaveType']->getId()])){
if(in_array($lessend->format('Y-m-d'),$forceholi['u'.$option['user']->getId()]['t'.$option['leaveType']->getId()])){
$lsok=false;
}
}
}
while($lsok){
$lsok=false;
$lessend->modify('+1 day');
if(in_array($lessend->format('N'),$offdaysdt)){$lsok=true;}
if(isset($holidays[$ucountry])){
if(in_array($lessend->format('Y-m-d'),$holidays[$ucountry])){
$lsok=true;
}
}
if(isset($forceholi['u'.$option['user']->getId()])){
if(isset($forceholi['u'.$option['user']->getId()]['t'.$option['leaveType']->getId()])){
if(in_array($lessend->format('Y-m-d'),$forceholi['u'.$option['user']->getId()]['t'.$option['leaveType']->getId()])){
$lsok=false;
}
}
}
}
if(($lessstart >= $startmc) && ($lessend <= $endmc)){$tidmc=$gs->getId();}
if(($lessstart <= $startmc) && ($lessend >= $startmc)){$tidmc=$gs->getId();}
if(($lessstart <= $endmc) && ($lessend >= $endmc)){$tidmc=$gs->getId();}
/*print_r("lessstart:".$lessstart->format('Y-m-d'));
print_r("\n");
print_r("lessstart:".$lessstart->format('N'));*/
/*$hf=fopen('../var/log/test.log','a');
ob_start();
//print_r($testresult);
print_r($gs->getId().':');
print_r($lessstart->format('Y-m-d').'=>'.$startmc->format('Y-m-d').':');
print_r($lessend->format('Y-m-d').'=>'.$endmc->format('Y-m-d').':');
print_r("\n");
$txt=ob_get_clean();
fwrite($hf,$txt);
fclose($hf);*/
}else{
$tidmc=$gs->getId();
if(isset($currentopt['startDate']) && isset($currentopt['endDate'])){
$endmc=new \DateTime($currentopt['endDate']);
$startmc=new \DateTime($currentopt['startDate']);
}
}
if($tidmc > -1){
if($mcdate['endDate'] < $endmc){$mcdate['endDate']=$endmc;}
if($mcdate['startDate'] > $startmc){$mcdate['startDate']=$startmc;}
$idmclist[count($idmc)]=$gs;
$idmc[count($idmc)]=$tidmc;
}
}
foreach($idmclist as $ml){
$sdtmc=new \DateTime($ml->getStartDate()->format('Y-m-d'));
$edtmc=new \DateTime($ml->getEndDate()->format('Y-m-d'));
$intmc=date_diff($sdtmc,$edtmc);
$intmc=abs($intmc->d)+1;
$attrmc=$ml->getAttributes();
if(isset($attrmc['historymc'])){
foreach($attrmc['historymc'] as $kh=>$h){
$historymc[$kh]=$h;
}
}
for($d=0;$d<$intmc;$d++){
$dvx=1;
$dv=new \DateTime($sdtmc->format('Y-m-d'));
$okadd=true;
if(in_array(date('w',strtotime($dv->format('Y-m-d'))),$offdays)){$okadd=false;}
if(isset($ucountry)){
if(isset($holidays[$ucountry])){
if(in_array($dv->format('Y-m-d'),$holidays[$ucountry])){$okadd=false;}
}
}
if(isset($forceholi['u'.$option['user']->getId()])){
if(isset($forceholi['u'.$option['user']->getId()]['t'.$option['leaveType']->getId()])){
if(in_array($dv->format('Y-m-d'),$forceholi['u'.$option['user']->getId()]['t'.$option['leaveType']->getId()])){
$okadd=true;
}
}
}
if($okadd){
if(!isset($mcallocation['d'.$dv->format('Y-m-d')])){
$mcallocation['d'.$dv->format('Y-m-d')]=array();
$mcallocation['d'.$dv->format('Y-m-d')]=0;
}
if($d==0){
if(!is_null($ml->getIsHalfStart())){
if(($ml->getIsHalfStart()==true) || ($ml->getIsHalfStart()==1)){$dvx=0.5;}
}
}
if($d==($intmc-1)){
if(!is_null($ml->getIsHalfEnd())){
if(($ml->getIsHalfEnd()==true) || ($ml->getIsHalfEnd()==1)){$dvx=0.5;}
}
}
if(isset($attrmc['mc'])){
if(isset($attrmc['mc']['d'.$dv->format('Y-m-d')])){
//$dvx=$attrmc['mc']['d'.$dv->format('Y-m-d')];
$mcallocation['d'.$dv->format('Y-m-d')]=$dvx;
}else{
$mcallocation['d'.$dv->format('Y-m-d')]=$dvx;
}
}else{
$mcallocation['d'.$dv->format('Y-m-d')]=$dvx;
}
if(isset($attrmc['mcp'])){
if(isset($attrmc['mcp']['d'.$dv->format('Y-m-d')])){
$oldmchalf['d'.$dv->format('Y-m-d')]=$attrmc['mcp']['d'.$dv->format('Y-m-d')];
$mchalf['d'.$dv->format('Y-m-d')]=$attrmc['mcp']['d'.$dv->format('Y-m-d')];
}
}
//if($dvx >= $mcallocation['d'.$dv->format('Y-m-d')]){$mcallocation['d'.$dv->format('Y-m-d')]=$dvx;}
}
$sdtmc->modify('+1 day');
}
}
}
}
$sdtmc=new \DateTime($mcdate['startDate']->format('Y-m-d'));
$edtmc=new \DateTime($mcdate['endDate']->format('Y-m-d'));
$intmc=date_diff($sdtmc,$edtmc);
$intmc=abs($intmc->d)+1;
$createdatdate2=null;
for($d=0;$d<$intmc;$d++){
$dvx=1;
$dv=new \DateTime($sdtmc->format('Y-m-d'));
$dv=$dv->format('Y-m-d');
$okadd=true;
if(in_array(date('w',strtotime($dv)),$offdays)){$okadd=false;}
if(isset($ucountry)){
if(isset($holidays[$ucountry])){
if(in_array($dv,$holidays[$ucountry])){$okadd=false;}
}
}
if(!isset($mcallocation['d'.$dv]) && ($okadd)){
$mcallocation['d'.$dv]=0;
if(isset($currentopt['startDate']) && isset($currentopt['endDate'])){
if($dv==$currentopt['startDate']){
if(!is_null($opt['am'])){
if(($opt['am']==true) || ($opt['am']==1)){$dvx=0.5;}
}
if(!is_null($option['am'])){
if(($option['am']==true) || ($option['am']==1)){$dvx=0.5;}
}
}
if($dv==$currentopt['endDate']){
if(!is_null($opt['pm'])){
if(($opt['pm']==true) || ($opt['pm']==1)){$dvx=0.5;}
}
if(!is_null($option['pm'])){
if(($option['pm']==true) || ($option['pm']==1)){$dvx=0.5;}
}
}
}
if($dvx >= $mcallocation['d'.$dv]){$mcallocation['d'.$dv]=$dvx;}
}
$sdtmc->modify('+1 day');
}
}
if(isset($currentopt['startDate']) && isset($currentopt['endDate'])){
$sdtmc=new \DateTime($currentopt['startDate']);
$edtmc=new \DateTime($currentopt['endDate']);
$intmc=date_diff($sdtmc,$edtmc);
$intmc=abs($intmc->d)+1;
$tday=0;
for($d=0;$d<$intmc;$d++){
$dvx=1;
$dv=new \DateTime($sdtmc->format('Y-m-d'));
$dv=$dv->format('Y-m-d');
$okadd=true;
if(in_array(date('w',strtotime($dv)),$offdays)){$okadd=false;}
if(isset($ucountry)){
if(isset($holidays[$ucountry])){
if(in_array($dv,$holidays[$ucountry])){$okadd=false;}
}
}
if($okadd){
$mchalf['d'.$dv]=array();
$mchalf['d'.$dv]['am']=false;
$mchalf['d'.$dv]['pm']=false;
if(isset($oldmchalf['d'.$dv])){
$mchalf['d'.$dv]=$oldmchalf['d'.$dv];
}
if($d==0){
$amtrue=false;
if(!is_null($opt['am'])){
if(($opt['am']==true) || ($opt['am']==1)){$dvx=0.5;$amtrue=true;}
}
if(!is_null($option['am'])){
if(($option['am']==true) || ($option['am']==1)){$dvx=0.5;$amtrue=true;}
if(($option['am']==false) || ($option['am']==0)){$dvx=1;$amtrue=false;}
}
if(isset($oldmchalf['d'.$dv])){
if($oldmchalf['d'.$dv]['am']!=$amtrue){
$mcallocation['d'.$dv]=$dvx;
}
}else{
$mcallocation['d'.$dv]=$dvx;
}
if(!isset($mcallocation['d'.$dv])){$mcallocation['d'.$dv]=$dvx;}
$mchalf['d'.$dv]['am']=$amtrue;
}
if($d==($intmc-1)){
$pmtrue=false;
if(!is_null($opt['pm'])){
if(($opt['pm']==true) || ($opt['pm']==1)){$dvx=0.5;$pmtrue=true;}
}
if(!is_null($option['pm'])){
$pmok=true;
if($d==0){
if(!is_null($option['am'])){
if(($option['am']==true) || ($option['am']==1)){$pmok=false;$pmtrue=false;}
}
}
if($pmok){
if(($option['pm']==true) || ($option['pm']==1)){$dvx=0.5;$pmtrue=true;}
if(($option['pm']==false) || ($option['pm']==0)){$dvx=1;$pmtrue=false;}
}
if(isset($oldmchalf['d'.$dv])){
if($oldmchalf['d'.$dv]['pm']!=$pmtrue){
$mcallocation['d'.$dv]=$dvx;
}
}else{
$mcallocation['d'.$dv]=$dvx;
}
if(!isset($mcallocation['d'.$dv])){$mcallocation['d'.$dv]=$dvx;}
$mchalf['d'.$dv]['pm']=$pmtrue;
}
}
$tday+=$dvx;
}
$sdtmc->modify('+1 day');
}
$tmphismc=array();
$tmphismc['startDate']=$currentopt['startDate'];
$tmphismc['endDate']=$currentopt['endDate'];
$tmphismc['am']=$option['am'];
$tmphismc['pm']=$option['pm'];
if(is_null($leaveRequest)){
$tmphismc['createDate']=date('Y-m-d');
}else{
$tmphismc['createDate']=$leaveRequest->getCreatedAt()->format('Y-m-d');
$tmphismc['am']=$leaveRequest->getIsHalfStart();
$tmphismc['pm']=$leaveRequest->getIsHalfEnd();
}
if(!is_null($option['am'])){$tmphismc['am']=$option['am'];}
if(!is_null($option['pm'])){$tmphismc['pm']=$option['pm'];}
$tmphismc['day']=$tday;
}
}
$removeidmc=array();
$oldApproved = null;
$oam = false;
$opm = false;
foreach($option as $k=>$v){
if($k=='attributes'){
foreach($v as $kv=>$vv){
$opt['attributes'][$kv]=$vv;
}
}else{
$isold=false;
if(!is_null($olddata)){
if($k=='leaveType'){$isold=true;}
}
if(!$isold){$opt[$k]=$v;}
}
}
if(is_null($opt['user'])){$opt['user']=$this->getUser();}
if(is_null($opt['updateby'])){$opt['updateby']=$opt['user'];}
$isApproved = null;
$isap=1;
if(!is_null($opt['isApproved'])){
$isApproved=$opt['isApproved'];
if(($isApproved==false) || ($isApproved==0)){$isap=0;}
};
$typ='';
if(!is_null($opt['leaveType'])){
$typ=$opt['leaveType']->getLeaveName();
//if($opt['leaveType']->getLeaveName()=='sick'){$isap=1;}
}
$removedmc=array();
$removedgmc=array();
if($ismc){
$uidmc=$opt['user']->getId();
if(!isset($alocation)){$alocation=array();}
$idrqx=-1;
$lvtypeid=$opt['leaveType']->getId();
if(!is_null($leaveRequest)){$idrqx=$leaveRequest->getId();}
$removeentmc=array();
foreach($idmclist as $idm){
$alc=$idm->getAlocation();
if($alc==null){$alc==array();}
foreach($alc as $kc=>$vc){
if(substr($kc,0,1)=='y'){
$yc=substr($kc,1,4);
if(!isset($removeentmc['x'.$idm->getUser()->getId().'x'.$yc.'x'.$idm->getLeaveType()->getId()])){
$removeentmc['x'.$idm->getUser()->getId().'x'.$yc.'x'.$idm->getLeaveType()->getId()]=0;
}
$removeentmc['x'.$idm->getUser()->getId().'x'.$yc.'x'.$idm->getLeaveType()->getId()]+=$vc;
}
}
if(is_null($createdatdate2)){
$createdatdate2=new \DateTime($idm->getCreatedAt()->format('Y-m-d'));
if(!$idm->getCreatedBy() instanceof \App\Entity\User){
$xiuser=$em->getRepository(\App\Entity\User::class)->find($idm->getCreatedBy());
if(!is_null($xiuser)){
$updateby=$xiuser->getId();
}
}else{
$updateby=$idm->getCreatedBy()->getId();
}
}
$idmcd=new \DateTime($idm->getCreatedAt()->format('Y-m-d'));
if(!$idm->getCreatedBy() instanceof \App\Entity\User){
$xiuser=$em->getRepository(\App\Entity\User::class)->find($idm->getCreatedBy());
if(!is_null($xiuser)){
$updatebyt=$xiuser->getId();
}
}else{
$updatebyt=$idm->getCreatedBy()->getId();
}
if($idmcd < $createdatdate2){
$createdatdate2=new \DateTime($idmcd->format('Y-m-d'));
$updateby= $updatebyt;
}
$attridm=$idm->getAttributes();
if(isset($attridm['historymc'])){
foreach($attridm['historymc'] as $aidmc){
if(isset($aidmc['createDate'])){
$idmcd=new \DateTime($aidmc['createDate']);
if($idmcd < $createdatdate2){
$createdatdate2=new \DateTime($idmcd->format('Y-m-d'));
$updateby=$aidmc['createBy'];
}
}
}
}
if($idm->getId()!=$idrqx){
$removedmc[count($removedmc)]=$idm->getId();
$rmattr=$idm->getAttributes();
if(isset($rmattr['file'])){
if(!isset($opt['attributes']['file'])){
$opt['attributes']['file']=$rmattr['file'];
}
}
if(isset($rmattr['gcalid'])){
$removedgmc[count($removedgmc)]=$rmattr['gcalid'];
}
$this->deleteRequest($idm);
}
}
$tdays=0;
foreach($removeentmc as $kre=>$re){
$krc=explode('x',$kre);
if(isset($entbyyear['u'.$krc[1]])){
if(isset($entbyyear['u'.$krc[1]]['y'.$krc[2]])){
if(isset($entbyyear['u'.$krc[1]]['y'.$krc[2]]['t'.$krc[3]])){
$entbyyear['u'.$krc[1]]['y'.$krc[2]]['t'.$krc[3]]['left']+=$re;
}
}
}
}
foreach($mcallocation as $kh=>$hh){
$dth=str_replace('d','',$kh);
$sdx=new \DateTime($dth);
if(($sdx < $mcdate['startDate']) || ($sdx > $mcdate['endDate'])){
unset($mcallocation[$kh]);
}
}
$updateentmc=array();
foreach($mcallocation as $kh=>$hh){
$dth=str_replace('d','',$kh);
$tmh=strtotime($dth);
$yh=date('Y',$tmh);
$onProbation=($opt['user']->getPersonalInfo()->getJobStatus()!='form.job_status.permanent');
if($yh > 2001){
if((isset($entbyyear['u'.$uidmc])) && (!$onProbation)){
if(isset($entbyyear['u'.$uidmc]['y'.$yh])){
if(isset($entbyyear['u'.$uidmc]['y'.$yh]['t'.$lvtypeid])){
$mclt=$entbyyear['u'.$uidmc]['y'.$yh]['t'.$lvtypeid]['left'];
$mcl=$mclt-$hh;
//$mcl=-$hh;
//print_r($mclt);
if($mcl < 0){
if($mcl > -$hh){
if(!isset($alocation['y'.$yh])){$alocation['y'.$yh]=0;}
$alocation['y'.$yh]+=$mclt;
if(!isset($alocation['unpaid'])){$alocation['unpaid']=array();}
if(!isset($alocation['unpaid']['y'.$yh])){$alocation['unpaid']['y'.$yh]=array();}
if(!isset($alocation['unpaid']['y'.$yh]['value'])){$alocation['unpaid']['y'.$yh]['date']=array();}
if(!isset($alocation['unpaid']['y'.$yh]['value'])){$alocation['unpaid']['y'.$yh]['value']=0;}
$ucdate=count($alocation['unpaid']['y'.$yh]['date']);
$alocation['unpaid']['y'.$yh]['date'][$ucdate]=array();
$alocation['unpaid']['y'.$yh]['date'][$ucdate]['date']=date('Y-m-d',$tmh);
$alocation['unpaid']['y'.$yh]['date'][$ucdate]['value']=$hh;
$alocation['unpaid']['y'.$yh]['value']+=($hh-$mclt);
}else{
if(!isset($alocation['unpaid'])){$alocation['unpaid']=array();}
if(!isset($alocation['unpaid']['y'.$yh])){$alocation['unpaid']['y'.$yh]=array();}
if(!isset($alocation['unpaid']['y'.$yh]['value'])){$alocation['unpaid']['y'.$yh]['date']=array();}
if(!isset($alocation['unpaid']['y'.$yh]['value'])){$alocation['unpaid']['y'.$yh]['value']=0;}
$ucdate=count($alocation['unpaid']['y'.$yh]['date']);
$alocation['unpaid']['y'.$yh]['date'][$ucdate]=array();
$alocation['unpaid']['y'.$yh]['date'][$ucdate]['date']=date('Y-m-d',$tmh);
$alocation['unpaid']['y'.$yh]['date'][$ucdate]['value']=$hh;
$alocation['unpaid']['y'.$yh]['value']+=$hh;
}
$entbyyear['u'.$uidmc]['y'.$yh]['t'.$lvtypeid]['left']=0;
$updateentmc['x'.$uidmc.'x'.$yh.'x'.$lvtypeid]=0;
}else{
if(!isset($alocation['y'.$yh])){$alocation['y'.$yh]=0;}
$alocation['y'.$yh]+=$hh;
$entbyyear['u'.$uidmc]['y'.$yh]['t'.$lvtypeid]['left']-=$hh;
$updateentmc['x'.$uidmc.'x'.$yh.'x'.$lvtypeid]=$entbyyear['u'.$uidmc]['y'.$yh]['t'.$lvtypeid]['left'];
}
}else{
if(!isset($alocation['unpaid'])){$alocation['unpaid']=array();}
if(!isset($alocation['unpaid']['y'.$yh])){$alocation['unpaid']['y'.$yh]=array();}
if(!isset($alocation['unpaid']['y'.$yh]['value'])){$alocation['unpaid']['y'.$yh]['date']=array();}
if(!isset($alocation['unpaid']['y'.$yh]['value'])){$alocation['unpaid']['y'.$yh]['value']=0;}
$ucdate=count($alocation['unpaid']['y'.$yh]['date']);
$alocation['unpaid']['y'.$yh]['date'][$ucdate]=array();
$alocation['unpaid']['y'.$yh]['date'][$ucdate]['date']=date('Y-m-d',$tmh);
$alocation['unpaid']['y'.$yh]['date'][$ucdate]['value']=$hh;
$alocation['unpaid']['y'.$yh]['value']+=$hh;
}
}else{
if(!isset($alocation['unpaid'])){$alocation['unpaid']=array();}
if(!isset($alocation['unpaid']['y'.$yh])){$alocation['unpaid']['y'.$yh]=array();}
if(!isset($alocation['unpaid']['y'.$yh]['value'])){$alocation['unpaid']['y'.$yh]['date']=array();}
if(!isset($alocation['unpaid']['y'.$yh]['value'])){$alocation['unpaid']['y'.$yh]['value']=0;}
$ucdate=count($alocation['unpaid']['y'.$yh]['date']);
$alocation['unpaid']['y'.$yh]['date'][$ucdate]=array();
$alocation['unpaid']['y'.$yh]['date'][$ucdate]['date']=date('Y-m-d',$tmh);
$alocation['unpaid']['y'.$yh]['date'][$ucdate]['value']=$hh;
$alocation['unpaid']['y'.$yh]['value']+=$hh;
}
}else{
if(!isset($alocation['unpaid'])){$alocation['unpaid']=array();}
if(!isset($alocation['unpaid']['y'.$yh])){$alocation['unpaid']['y'.$yh]=array();}
if(!isset($alocation['unpaid']['y'.$yh]['value'])){$alocation['unpaid']['y'.$yh]['date']=array();}
if(!isset($alocation['unpaid']['y'.$yh]['value'])){$alocation['unpaid']['y'.$yh]['value']=0;}
$ucdate=count($alocation['unpaid']['y'.$yh]['date']);
$alocation['unpaid']['y'.$yh]['date'][$ucdate]=array();
$alocation['unpaid']['y'.$yh]['date'][$ucdate]['date']=date('Y-m-d',$tmh);
$alocation['unpaid']['y'.$yh]['date'][$ucdate]['value']=$hh;
$alocation['unpaid']['y'.$yh]['value']+=$hh;
}
}else{
if(!isset($alocation['y'.$yh])){$alocation['y'.$yh]=0;}
$alocation['y'.$yh]+=$hh;
}
$tdays+=$hh;
}
if(!is_null($opt['updateby'])){
$tmphismc['createBy']=$opt['updateby']->getId();
}else if(!is_null($opt['user'])){
$tmphismc['createBy']=$opt['user']->getId();
}
$opt['attributes']['historymc']=$historymc;
$opt['attributes']['mc']=$mcallocation;
$opt['attributes']['mcp']=$mchalf;
if(is_null($leaveRequest)){
$leaveRequest = new LeaveRequest();
}
$manualapp=false;
if(isset($opt['attributes']['autoapproved'])){
if(isset($option['isApproved'])){
if($option['isApproved']){
$manualapp=true;
}
}
}else{
if(!isset($opt['attributes']['manualapproved'])){
if(!is_null($opt['isApproved'])){
$manualapp=true;
}
}
}
if($manualapp){
$opt['attributes']['manualapproved']=true;
unset($opt['attributes']['autoapproved']);
}else{
$opt['attributes']['autoapproved']=true;
if(isset($opt['attributes']['file'])){
if($opt['attributes']['file']!=''){
if(is_null($opt['isApproved'])){$isApproved=true;}
}
}else{
if(($tdays <= 1) && (!$onProbation)){
$isApproved=true;
if(!is_null($leaveRequest)){
$createdat=$leaveRequest->getCreatedAt();
}
}else{
$isApproved=false;
}
}
}
$leaveRequest->setUser($opt['user']);
$leaveRequest->setStartDate($mcdate['startDate']);
$leaveRequest->setEndDate($mcdate['endDate']);
$leaveRequest->setIsHalfStart($opt['am']);
$leaveRequest->setIsHalfEnd($opt['pm']);
$leaveRequest->setIsApproved($isApproved);
$leaveRequest->setLeaveType($opt['leaveType']);
$leaveRequest->setDays($tdays);
$leaveRequest->setAttributes($opt['attributes']);
$leaveRequest->setComment($opt['comment']);
if(!is_null($isApproved)){
$leaveRequest->setReviewedBy($opt['reviewBy']);
}
$leaveRequest->setAlocation($alocation);
if(isset($opt['log'])){
if(!is_array($opt['log'])){$opt['log']=array();}
if(isset($opt['log']) && count($opt['log']) > 0){
$leaveRequest->setLog($opt['log']);
}
}
$updatedate=null;
if(is_null($olddata)){
$updatedate=null;
if(!is_null($createdatdate2)){
$leaveRequest->setCreatedAt($createdatdate2);
if(!is_null($updateby)){
$leaveRequest->setCreatedBy($updateby);
}else{
if(is_null($opt['updateby'])){$opt['updateby']=$opt['user'];}
$leaveRequest->setCreatedBy($opt['updateby']->getId());
}
if($opt['saveupdate']==true){
$leaveRequest->setUpdatedAt(new \DateTime());
if(is_null($opt['updateby'])){$opt['updateby']=$opt['user'];}
$leaveRequest->setUpdatedBy($opt['updateby']);
$updatedate=new \DateTime();
}
}else{
$leaveRequest->setCreatedAt(new \DateTime());
if(is_null($opt['updateby'])){$opt['updateby']=$opt['user'];}
$leaveRequest->setCreatedBy($opt['updateby']->getId());
}
}else{
if($opt['saveupdate']==true){
$leaveRequest->setUpdatedAt(new \DateTime());
if(is_null($opt['updateby'])){$opt['updateby']=$opt['user'];}
$leaveRequest->setUpdatedBy($opt['updateby']);
$updatedate=new \DateTime();
}
}
try {
$em->persist($leaveRequest);
$em->flush();
} catch (Exception $e) {
//throw $th;
}
$rqidx=$leaveRequest->getId();
if(!isset($tmphismc['startDate'])){
$stdt=new \DateTime($leaveRequest->getStartDate()->format('Y-m-d'));
$endt=new \DateTime($leaveRequest->getEndDate()->format('Y-m-d'));
$tmphismc['startDate']=$stdt->format('Y-m-d');
$tmphismc['endDate']=$endt->format('Y-m-d');
$tmphismc['am']=$leaveRequest->getIsHalfStart();
$tmphismc['pm']=$leaveRequest->getIsHalfEnd();
$tmphismc['day']=$leaveRequest->getDays();
$tmphismc['createDate']=$leaveRequest->getCreatedAt()->format('Y-m-d');
}
$opt['attributes']['historymc']['d'.$rqidx]=$tmphismc;
$leaveRequest->setAttributes($opt['attributes']);
$em->persist($leaveRequest);
$em->flush();
if(isset($opt['attributes']['historymc']) && isset($updatedate) && !is_null($updatedate)){
foreach($opt['attributes']['historymc'] as $dt){
if(isset($dt['createDate'])){
$cd=new \DateTime($dt['createDate']);
if($cd > $updatedate){$updatedate=$cd;}
}
}
}
foreach($updateentmc as $kre=>$re){
$krc=explode('x',$kre);
$leaveentr=$em->getRepository(\App\Entity\LeaveEntitlement::class)->findBy(array('user'=>$krc[1],'year'=>$krc[2],'leaveType'=>$krc[3]));
if(!is_null($leaveentr)){
foreach($leaveentr as $xl){
$xl->setLeaveLeft($re);
$em->persist($xl);
$em->flush();
}
}
}
}else{
if(is_null($leaveRequest)){
$leaveRequest = new LeaveRequest();
}
$backinput=array();
$back = $leaveRequest->getAlocation();
if(is_null($back)){$back=array();}
if(isset($back['data'])){
if(isset($back['data']['input'])){
foreach($back['data']['input'] as $bkey=>$bvalue){
$backinput[$bkey]=$bvalue;
}
}
}
if(trim($opt['allocation'])==''){
$alocation = array();
/*if(isset($back['child'])){
foreach ($back['child'] as $kb => $bchild) {
$yr = str_replace('y', '', $kb);
foreach ($bchild as $kb1 => $vb1) {
$cid = str_replace('c', '', $kb1);
//$chde = $this->getDoctrine()->getRepository(LeaveEntitlement::class)->findBy(array('user' => $userData, 'id' => $cid, 'year' => $yr));
if (isset($entbyid['c'.$cid])) {
//for ($bb = 0; $bb < count($chde); $bb++) {
$lf = $entbyid['c'.$cid]->getLeaveLeft();
$lf = $lf + $vb1;
$entbyid['c'.$cid]->setLeaveLeft($lf);
$em->persist($entbyid['c'.$cid]);
$em->flush();
//}
}
}
}
}*/
$myuserid=$opt['user']->getId();
if ($isap == 0) {
$alocation=json_decode(json_encode($back),true);
if(!is_null($olddata)){
$myoldapprove=$olddata->getIsApproved();
if(($myoldapprove===false) || ($myoldapprove===0)){$back=array();}
}
$dumper=array();
foreach ($back as $k => $v) {
$yr = str_replace('y', '', $k);
switch ($k) {
case 'data':
break;
case 'dumper':
break;
case 'error':
break;
case 'type':
break;
case 'child':
foreach($v as $kv=>$v1){
foreach($v1 as $kv1=>$v2){
$key=str_replace('c','',$kv1);
if(!isset($dumper['l'.$key])){$dumper['l'.$key]=$entbyid['c'.$key]->getLeaveLeft();}
$dumper['l'.$key]+=$v2;
}
}
break;
case 'unpaid':
break;
case 'dumper':
break;
default:
if(substr($k,0,1)=='y'){
$yr = str_replace('y', '', $k);
$myent=$entbyyear['u'.$myuserid]['y'.$yr]['t'.$myleavetypeid];
$key=$myent['id'];
if(!isset($dumper['l'.$key])){$dumper['l'.$key]=$entbyid['c'.$key]->getLeaveLeft();}
$dumper['l'.$key]+=$v;
//$alocation['y' . $yr] = 0;
}
break;
}
}
} else {
if(!is_null($olddata)){
$myoldapprove=$olddata->getIsApproved();
if(($myoldapprove===false) || ($myoldapprove===0)){$back=array();}
}
$alocation = $this->calculate($opt['user'], $opt['leaveType'], $opt['startDate'], $opt['endDate'], $back, array('am' => $opt['am'], 'pm' => $opt['pm']));
/*foreach ($back as $k => $v) {
$yr = str_replace('y', '', $k);
switch ($k) {
case 'data':
break;
case 'dumper':
break;
case 'error':
break;
case 'child':
break;
case 'type':
break;
case 'unpaid':
break;
case 'dumper':
break;
default:
if (!isset($alocation['y' . $yr])) {
$alocation['y' . $yr] = 0;
}
break;
}
}*/
if ($alocation != false) {
$dumper=array();
$dy = 0;
$okd = false;
$upn=false;
foreach ($alocation as $ka => $a) {
switch ($ka) {
case 'data':
break;
case 'dumper':
break;
case 'error':
break;
case 'type':
break;
case 'dumper':
break;
case 'child':
foreach($a as $aa){
foreach($aa as $aaa){
$dy += $aaa;
}
}
$okd = true;
break;
case 'unpaid':
if($typ!='sick'){
foreach($a as $aa){
$dy += $aa['value'];
}
$okd = true;
}
break;
case 'type':
break;
default:
if(!is_array($a)){
$dy += $a;
$okd = true;
}
break;
}
}
if($dy==0){
foreach ($alocation as $ka => $a) {
switch ($ka) {
case 'data':
break;
case 'error':
break;
case 'type':
break;
case 'dumper':
break;
case 'child':
break;
case 'unpaid':
foreach($a as $aa){
$dy += $aa['value'];
}
$okd = true;
break;
default:
break;
}
}
}
if ($okd) {
$opt['days'] = $dy;
}
$dumper=$alocation['dumper'];
}
}
if($opt['days']==0){
if(!is_null($olddata)){
$opt['days']=$olddata->getDays();
}
}
//print_r($alocation);
$leaveRequest->setUser($opt['user']);
$leaveRequest->setStartDate($opt['startDate']);
$leaveRequest->setEndDate($opt['endDate']);
$leaveRequest->setIsHalfStart($opt['am']);
$leaveRequest->setIsHalfEnd($opt['pm']);
$leaveRequest->setIsApproved($isApproved);
$leaveRequest->setLeaveType($opt['leaveType']);
$leaveRequest->setDays($opt['days']);
$leaveRequest->setAttributes($opt['attributes']);
$leaveRequest->setComment($opt['comment']);
if(!is_null($isApproved)){
$leaveRequest->setReviewedBy($opt['reviewBy']);
}
$leaveRequest->setAlocation($alocation);
if(isset($opt['log']) && count($opt['log']) > 0){
$leaveRequest->setLog($opt['log']);
}
if(is_null($olddata)){
$leaveRequest->setCreatedAt(new \DateTime());
$leaveRequest->setCreatedBy($opt['updateby']->getId());
}else{
if($opt['saveupdate']==true){
$leaveRequest->setUpdatedAt(new \DateTime());
$leaveRequest->setUpdatedBy($opt['updateby']);
}
}
$em->persist($leaveRequest);
$em->flush();
$userupd=$leaveRequest->getUser()->getId();
if(isset($opt['updateby'])){
if(!is_null($opt['updateby'])){
if(is_null($olddata)){
$userupd=$opt['updateby']->getId();
}else{
$userupd=$opt['updateby'];
}
}
}
if(isset($option['setlog'])){
$this->log->save($leaveRequest->getUser(), [
'owner' => $leaveRequest->getUser(),
'message' => $option['setlog'],
'old_data' => $olddatalog,
'new_data' => $leaveRequest
]);
}
if(isset($dumper)){
$dmp=array();
foreach($dumper as $k=>$d){
$k=str_replace('l','',$k);
$dmp[count($dmp)]=$k;
}
$dmpen=$em->getRepository(\App\Entity\LeaveEntitlement::class)->findBy(array('id'=>$dmp));
if(is_array($dmpen)){
foreach($dmpen as $de){
if(!is_null($dumper['l'.$de->getId()])){
$de->setLeaveLeft($dumper['l'.$de->getId()]);
$em->persist($de);
$em->flush();
}
}
}
}
//$this->updateEntitlementFromLeave($opt['user'], $opt['leaveType'], $alocation, $back); */
}else{
//has allocation data
$yrback=array();
if(is_array($back)){
foreach($back as $k=>$v){
switch ($k) {
case 'data':
break;
case 'dumper':
break;
case 'error':
break;
case 'type':
break;
case 'child':
break;
case 'unpaid':
break;
case 'dumper':
break;
default:
$yr = str_replace('y', '', $k);
$yrback[count($yrback)]=$yr;
break;
}
}
$fnby=array('year'=>$yrback);
if(!is_null($option['user'])){
$fnby['user']=$option['user'];
}
$dmpen=$em->getRepository(\App\Entity\LeaveEntitlement::class)->findBy($fnby);
$entback=array();
$entback2=array();
foreach($dmpen as $d){
$entback['l'.$d->getId()]=$d;
if(!isset($entback2['y'.$d->getYear()])){
$entback2['y'.$d->getYear()]=array();
}
$entback2['y'.$d->getYear()]['t'.$d->getLeaveType()->getId()]=$d;
}
foreach($back as $k=>$v){
switch ($k) {
case 'data':
break;
case 'dumper':
break;
case 'error':
break;
case 'type':
break;
case 'child':
foreach($v as $v1){
foreach($v1 as $k2=>$v2){
$cc = str_replace('c', '', $k2);
if(isset($entback['l'.$cc])){
$d=$entback['l'.$cc];
$ll=$d->getLeaveLeft();
$ll=$ll+$v2;
$d->setLeaveLeft($ll);
$em->persist($d);
$em->flush();
}
}
}
break;
case 'unpaid':
break;
case 'dumper':
break;
default:
$yr = str_replace('y', '', $k);
$d=$entback2['y'.$yr]['t'.$gid=$opt['leaveType']->getId()];
$ll=$d->getLeaveLeft();
$ll=$ll+$v;
$d->setLeaveLeft($ll);
$em->persist($d);
$em->flush();
break;
}
}
}
$yrnow=date('Y');
$opt['allocation']=json_decode($opt['allocation'],true);
if(isset($opt['allocation']['data'])){
if(isset($opt['allocation']['data']['input'])){
$datainputdt=array();
foreach($opt['allocation']['data']['input'] as $k=>$vdt){$datainputdt[$k]=$vdt;}
//print_r($back);
//print_r($opt['allocation']);
if(!is_null($option['user'])){
$ucountry=$option['user']->getOffice()->getCountry();
}
$holidays=array();
$holidaydt=$em->getRepository(\App\Entity\LeaveBankHoliday::class)->findAll();
foreach($holidaydt as $hl){
$loc=$hl->getLocation();
if(!isset($holidays[$loc])){$holidays[$loc]=array();}
$shl=new \DateTime($hl->getDate()->format('Y-m-d'));
if(is_null($hl->getEndDate())){
$ehl=new \DateTime($hl->getDate()->format('Y-m-d'));
}else{
$ehl=new \DateTime($hl->getEndDate()->format('Y-m-d'));
}
$inval=date_diff($ehl,$shl);
$inval=abs($inval->d)+1;
for($hv=0;$hv<$inval;$hv++){
$holidays[$loc][count($holidays[$loc])]=$shl->format('Y-m-d');
$shl->modify('+1 day');
}
}
$offdays=array(0,6);
$offdaysdt=array(6,7);
$startdt=new \DateTime($opt['startDate']->format('Y-m-d'));
$enddt=new \DateTime($opt['endDate']->format('Y-m-d'));
$totaldt=$enddt->diff($startdt);
$totaldt=intval($totaldt->format("%a"))+1;
$datelist=array();
$yeardt=array();
//get list effected date
$minyeardt=9999;
for($t=0;$t<$totaldt;$t++){
$okdt=true;
if(isset($ucountry)){
if(isset($holidays[$ucountry])){
if(in_array($startdt->format('Y-m-d'),$holidays[$ucountry])){
$okdt=false;
}
}
}
if(in_array($startdt->format('N'),$offdaysdt)){$okdt=false;}
if($okdt){
$datelist[count($datelist)]=$startdt->format('Y-m-d');
}
if(!in_array($startdt->format('Y'),$yeardt)){
$yeardt[count($yeardt)]=$startdt->format('Y');
if(intval($startdt->format('Y')) < $minyeardt){$minyeardt=intval($startdt->format('Y'));}
}
$startdt->modify('+1 day');
}
array_unshift($yeardt,$minyeardt-1);
$fnby=array('year'=>$yeardt);
if(!is_null($option['user'])){
$fnby['user']=$option['user'];
}
$dmpen=$em->getRepository(\App\Entity\LeaveEntitlement::class)->findBy($fnby);
$entlistdt=array();
$entbyiddt=array();
foreach($dmpen as $d){
$gid=$d->getId();
$entlistdt['l'.$gid]=array();
$entlistdt['l'.$gid]['total']=$d->getLeaveEntitlements();
$entlistdt['l'.$gid]['left']=$d->getLeaveLeft();
$entlistdt['l'.$gid]['year']=$d->getYear();
$entlistdt['l'.$gid]['type']=$d->getLeaveType()->getId();
$entlistdt['l'.$gid]['parent']=$d->getParent();
$entlistdt['l'.$gid]['attributes']=$d->getAttributes();
$entlistdt['l'.$gid]['use']=0;
$entlistdt['l'.$gid]['date']=array();
$entbyiddt['l'.$gid]=$d;
}
foreach($entlistdt as $d){
if(($d['parent']!=null) && ($d['parent']!=0)){
if(isset($d['attributes']['followParent'])){
if($d['attributes']['followParent']){
$entlistdt['l'.$d['parent']]['oldleft']=$entlistdt['l'.$d['parent']]['left'];
$entlistdt['l'.$d['parent']]['left']-=($d['total']-$d['left']);
}
}
}
}
$unpaiddt=array();
//calculate by date
$cdt=count($datelist);
$idt=count($opt['allocation']['data']['input']);
for($t=0;$t<$cdt;$t++){
$al=1;
if(isset($opt['am'])){
if(($opt['am']==true) && ($t==0)){$al-=0.5;}
}
if(isset($opt['pm'])){
if(($opt['pm']==true) && ($t==($cdt-1))){$al-=0.5;}
}
$dtx=new \DateTime($datelist[$t]);
$dtformat='d'.$dtx->format('Ymd');
foreach($opt['allocation']['data']['input'] as $k=>$vdt){
$okcut=true;
$gid=$k;
if($vdt<=0){continue;}
if($vdt < $al){$al=$al-$vdt;}
$opt['allocation']['data']['input'][$k]-=$al;
if($opt['allocation']['data']['input'][$k]<0){$opt['allocation']['data']['input'][$k]=0;}
if($al > 0){
$lfdt=$entlistdt[$gid]['left']-$al;
if((isset($entlistdt[$gid]['attributes']['followParent'])) && ($lfdt >= 0)){
$lfdtp=$entlistdt['l'.$entlistdt[$gid]['parent']]['left']-$al;
if($lfdt < 0){
$entlistdt['l'.$entlistdt[$gid]['parent']]['left']=0;
if(!isset($unpaiddt[$yrnow])){
$unpaiddt[$yrnow]=array('value'=>0,'date'=>array());
}
$unpaiddt[$yrnow]['date'][count($unpaiddt[$yrnow]['date'])]=array(
'date'=>$datelist[$t],
'value'=>abs($lfdt)
);
$unpaiddt[$yrnow]['value']+=abs($lfdt);
$ll=($al-$lfdt)-$al;
$entlistdt[$gid]['left']=$entlistdt[$gid]['left']-$ll;
$entlistdt[$gid]['use']+=$ll;
if(!isset($entlistdt[$gid]['date'][$dtformat])){
$entlistdt[$gid]['date'][$dtformat]=0;
}
$entlistdt[$gid]['date'][$dtformat]+=$ll;
}else{
$entlistdt['l'.$entlistdt[$gid]['parent']]['left']=$lfdt;
$entlistdt[$gid]['left']=$lfdt;
$entlistdt[$gid]['use']+=$al;
if(!isset($entlistdt[$gid]['date'][$dtformat])){
$entlistdt[$gid]['date'][$dtformat]=0;
}
$entlistdt[$gid]['date'][$dtformat]+=$al;
}
}else if($lfdt < 0){
if(!isset($unpaiddt[$yrnow])){
$unpaiddt[$yrnow]=array('value'=>0,'date'=>array());
}
$unpaiddt[$yrnow]['date'][count($unpaiddt[$yrnow]['date'])]=array(
'date'=>$datelist[$t],
'value'=>abs($lfdt)
);
$unpaiddt[$yrnow]['value']+=abs($lfdt);
$ll=($al-$lfdt)-$al;
if($entlistdt[$gid]['left'] > 0){
$entlistdt[$gid]['use']+=$ll;
$entlistdt[$gid]['left']=0;
if(isset($entlistdt[$gid]['oldleft'])){
$entlistdt[$gid]['oldleft']-=$ll;
if($entlistdt[$gid]['oldleft'] < 0){$entlistdt[$gid]['oldleft']=0;}
}
if(!isset($entlistdt[$gid]['date'][$dtformat])){
$entlistdt[$gid]['date'][$dtformat]=0;
}
$entlistdt[$gid]['date'][$dtformat]+=$ll;
}
}else if($lfdt >= 0){
$entlistdt[$gid]['left']=$lfdt;
$entlistdt[$gid]['use']+=$al;
if(isset($entlistdt[$gid]['oldleft'])){
$entlistdt[$gid]['oldleft']-=$al;
if($entlistdt[$gid]['oldleft'] < 0){$entlistdt[$gid]['oldleft']=0;}
}
if(!isset($entlistdt[$gid]['date'][$dtformat])){
$entlistdt[$gid]['date'][$dtformat]=0;
}
$entlistdt[$gid]['date'][$dtformat]+=$al;
}
if($opt['allocation']['data']['input'][$k] > 0){break;}
}
}
}
$alllist=array('data'=>array(),'type'=>array(),'child'=>array());
$alllist['data']['input']=array();
$datainputid=array();
foreach($datainputdt as $kdt=>$vdt){
$alllist['data']['input'][$kdt]=$vdt;
$datainputid[count($datainputid)]=str_replace('l','',$kdt);
}
//unpaid part
$unpaiddt=$opt['allocation']['unpaid'];
if(isset($opt['leaveType'])){
$gid=$opt['leaveType']->getId();
foreach($entlistdt as $kdt=>$vdt){
if($vdt['type']==$gid){
if(!isset($alllist['y'.$vdt['year']])){
$alllist['y'.$vdt['year']]=0;
}
$alllist['y'.$vdt['year']]+=$vdt['use'];
if(!isset($alllist['data']['y'.$vdt['year']])){
$alllist['data']['y'.$vdt['year']]=array();
foreach($vdt['date'] as $kxdt => $vxdt){
if(!isset($alllist['data']['y'.$vdt['year']][$kxdt])){
$alllist['data']['y'.$vdt['year']][$kxdt]=0;
}
$alllist['data']['y'.$vdt['year']][$kxdt]+=$vxdt;
}
}
}
$xkdt=str_replace('l','',$kdt);
if(($vdt['parent']!=0) && ($vdt['parent']!=null)){
if(!isset($alllist['child']['y'.$vdt['year']])){
$alllist['child']['y'.$vdt['year']]=array();
}
if(!isset($alllist['child']['y'.$vdt['year']]['c'.$xkdt])){
$alllist['child']['y'.$vdt['year']]['c'.$xkdt]=0;
}
$alllist['child']['y'.$vdt['year']]['c'.$xkdt]+=$vdt['use'];
if(!isset($alllist['data']['y'.$vdt['year']])){
$alllist['data']['y'.$vdt['year']]=array();
}
if(!isset($alllist['data']['y'.$vdt['year']]['child'])){
$alllist['data']['y'.$vdt['year']]['child']=array();
}
if(!isset($alllist['data']['y'.$vdt['year']]['child']['c'.$xkdt])){
$alllist['data']['y'.$vdt['year']]['child']['c'.$xkdt]=array();
}
foreach($vdt['date'] as $kxdt => $vxdt){
if(!isset($alllist['data']['y'.$vdt['year']]['child']['c'.$xkdt][$kxdt])){
$alllist['data']['y'.$vdt['year']]['child']['c'.$xkdt][$kxdt]=0;
}
$alllist['data']['y'.$vdt['year']]['child']['c'.$xkdt][$kxdt]+=$vxdt;
}
}
if(!isset($alllist['dumper'])){$alllist['dumper']=array();}
//if(in_array($xkdt,$datainputid)){
if(!isset($alllist['dumper'][$kdt])){$alllist['dumper'][$kdt]=0;}
$alllist['dumper'][$kdt]+=$vdt['left'];
$alllist['type']['c'.$xkdt]=$vdt['attributes']['label'].' '.$vdt['year'];
//}
}
$alllist['unpaid']=$unpaiddt;
}
$leaveRequest->setUser($opt['user']);
$leaveRequest->setStartDate($opt['startDate']);
$leaveRequest->setEndDate($opt['endDate']);
$leaveRequest->setIsHalfStart($opt['am']);
$leaveRequest->setIsHalfEnd($opt['pm']);
$leaveRequest->setIsApproved($isApproved);
$leaveRequest->setLeaveType($opt['leaveType']);
$leaveRequest->setDays($opt['days']);
$leaveRequest->setAttributes($opt['attributes']);
$leaveRequest->setComment($opt['comment']);
if(!is_null($isApproved)){
$leaveRequest->setReviewedBy($opt['reviewBy']);
}
$leaveRequest->setAlocation($alllist);
if(isset($opt['log']) && count($opt['log']) > 0){
$leaveRequest->setLog($opt['log']);
}
if(is_null($olddata)){
$leaveRequest->setCreatedAt(new \DateTime());
$leaveRequest->setCreatedBy($opt['updateby']->getId());
}else{
if($opt['saveupdate']==true){
$leaveRequest->setUpdatedAt(new \DateTime());
$leaveRequest->setUpdatedBy($opt['updateby']);
}
}
$em->persist($leaveRequest);
$em->flush();
$userupd=$leaveRequest->getUser()->getId();
if(isset($opt['updateby'])){
if(!is_null($opt['updateby'])){
if(is_null($olddata)){
$userupd=$opt['updateby']->getId();
}else{
$userupd=$opt['updateby'];
}
}
}
if(isset($option['setlog'])){
$this->log->save($leaveRequest->getUser(), [
'owner' => $leaveRequest->getUser(),
'message' => $option['setlog'],
'old_data' => $olddatalog,
'new_data' => $leaveRequest
]);
}
foreach($dmpen as $d){
if(isset($entlistdt['l'.$d->getId()])){
$ll=$d->getLeaveLeft();
if($ll!=$entlistdt['l'.$d->getId()]['left']){
if(isset($entlistdt['l'.$d->getId()]['oldleft'])){
$d->setLeaveLeft($entlistdt['l'.$d->getId()]['oldleft']);
}else{
$d->setLeaveLeft($entlistdt['l'.$d->getId()]['left']);
}
$em->persist($d);
$em->flush();
}
}
}
}
}
}
}
$leaves=clone $leaveRequest;
$lefts=$this->_lefts(array(
'user'=>$opt['user'],
'start'=>$opt['startDate']->format('Y-m-d'),
'end'=>$opt['endDate']->format('Y-m-d')
));
if(isset($lefts['u'.$opt['user']->getId()]['y'.$opt['startDate']->format('Y')]['t'.$opt['leaveType']->getId()])){
$leaves->setDaysLeft($lefts['u'.$opt['user']->getId()]['y'.$opt['startDate']->format('Y')]['t'.$opt['leaveType']->getId()]);
}else{
$leaves->setDaysLeft(0);
}
return array(
'data'=>$leaves,
'olddata'=>$olddata,
'isupdate'=>$isupdate,
'remove'=>$removedmc,
'rgcalid'=>$removedgmc,
'updatedate'=>$updatedate,
);
}
/*
public function weeklyLeaveEmail ($leaveData)
{
$loggedIn = false;
$emailOps = $this->params->get('systemEmailOps');
// $reminderLog = $editedUser->getReminder();
$subject = $this->translator->trans('email.leave.ops.weekly');
$emailTemplate = 'email/user-notification/leave/weekly-reminder.html.twig';
$this->mailgunService->sendEmail(
$subject,
[$emailOps],
$emailTemplate,
[
'leaveRequests' => $leaveData,
'loop' => 'weekly'
],
$loggedIn
);
}
*/
public function weeklyHolidayEmail ($holidayData, $email = false)
{
$loggedIn = false;
$emailOps = $email ? $email : $this->params->get('systemEmailOps');
foreach($holidayData as $holiday){
date_default_timezone_set("Asia/Singapore");
$startDate = $holiday->getDate();
$startDate = new \DateTime($startDate->format('Y-m-d'));
$endDate = $holiday->getEndDate();
$endDate = is_null($endDate) ? new \DateTime($startDate->format('Y-m-d')) : new \DateTime($endDate->format('Y-m-d')) ;
$holiday->setDate($startDate);
$holiday->setEndDate($endDate);
}
// $reminderLog = $editedUser->getReminder();
//$test = $email && $_SERVER['APP_ENV'] == 'prod' ? '[TEST] ' : '';
$subject = $this->translator->trans('email.leave.ops.holiday');
$emailTemplate = 'email/user-notification/leave/holiday-weekly.html.twig';
$this->mailgunService->sendEmail(
$subject,
[$emailOps],
$emailTemplate,
[
'holidays' => $holidayData,
'loop' => 'weekly'
],
$loggedIn
);
}
public function reminderExpireNextMonthLeaveEmail ($leaveData)
{
$loggedIn = false;
// $reminderLog = $editedUser->getReminder();
$user = $leaveData->getUser();
$leaveType = $leaveData->getLeaveType()->getAttributes()['label'];
$subject = $this->translator->trans('email.leave.ops.');
$emailTemplate = 'email/user-notification/leave/expire-reminder.html.twig';
$this->mailgunService->sendEmail(
$this->translator->trans($subject . 'expire', [
'%leaveType%' => $leaveType,
]),
[$user->getEmail()],
$emailTemplate,
[
'recipient' => $user,
'group' => 'user',
'user' => $user,
'leave' => $leaveData
],
$loggedIn
);
}
public function reminderExpireAnnualLeaveEmail ($leaveData)
{
$loggedIn = false;
$user = $leaveData->getUser();
$daysLeft = $leaveData->getLeaveLeft();
$subject = $this->translator->trans('email.leave.ops.');
$emailTemplate = 'email/user-notification/leave/expire-annual-reminder.html.twig';
$this->mailgunService->sendEmail(
$this->translator->trans($subject . 'expire_annual', [
'%days%' => $daysLeft,
]),
[$user->getEmail()],
$emailTemplate,
[
'recipient' => $user,
'group' => 'user',
'user' => $user,
'leave' => $leaveData
],
$loggedIn
);
}
public function reminderExpireCarryForwardLeaveEmail ($leaveData)
{
$loggedIn = false;
// $user = $leaveData->getUser();
$user = $leaveData['user'];
$expireYear = $leaveData['year'] + 1;
// $expire = '';
// if(is_array($leaveData->getAttributes()['expires'])){
// $expire = date("Y",strtotime($leaveData->getAttributes()['expires']['date']));
// }else{
// $expire = date("Y", strtotime($leaveData->getAttributes()['expires']));
// }
$subject = $this->translator->trans('email.leave.ops.');
$emailTemplate = 'email/user-notification/leave/expire-carryforward-reminder.html.twig';
$this->mailgunService->sendEmail(
$this->translator->trans($subject . 'expire_carryforward', [
'%year%' => $expireYear,
]),
[$user->getEmail()],
$emailTemplate,
[
'recipient' => $user,
'group' => 'user',
'user' => $user,
'leave' => $leaveData
],
$loggedIn
);
}
public function reminderExpireBonusAdjLeaveEmail ($leaveData)
{
$loggedIn = false;
$user = $leaveData->getUser();
$label = $leaveData->getLeaveType()->getAttributes()['label'];
$subject = $this->translator->trans('email.leave.reminder.expire_bonus');
$emailTemplate = 'email/user-notification/leave/expire-bonus-reminder.html.twig';
$this->mailgunService->sendEmail(
$this->translator->trans($subject, [
'%label%' => ucwords($label)
]),
[$user->getEmail()],
$emailTemplate,
[
'recipient' => $user,
'group' => 'user',
'user' => $user,
'leave' => $leaveData
],
$loggedIn
);
}
public function updateEntitlement($id, $value)
{
$em = $this->entityManager;
$leave = $em->getRepository(LeaveEntitlement::class)->find($id);
if ($leave != null) {
$realleave = $em->getRepository(LeaveEntitlement::class)->find($id);
$parent = $leave->getParent();
$list = array();
if (($parent != null) && ($parent != 0)) {
$leave = $em->getRepository(LeaveEntitlement::class)->find($parent);
}
$user = $leave->getUser();
$year = $leave->getYear();
$type = $leave->getLeaveType();
$request = $em->getRepository(LeaveRequest::class)->createQueryBuilder('a')
->select('a')
->where('a.startDate >= :from')
->andWhere('a.startDate <= :to')
->andWhere('a.leaveType in (:leavetype)')
->andWhere('a.user = :user')
->setParameter('from', new \DateTime($year . '-01-01'))
->setParameter('to', new \DateTime(($year + 1) . '-12-31'))
->setParameter('leavetype', $type)
->setParameter('user', $user)
->orderBy('a.startDate')
->getQuery()
->getResult();
$entityManager = $em;
foreach ($request as $r) {
$alocation = array();
$back = $r->getAlocation();
if ($back == null) {
$back = array();
}
if (isset($back['child'])) {
foreach ($back['child'] as $kb => $bchild) {
$yr = str_replace('y', '', $kb);
foreach ($bchild as $kb1 => $vb1) {
$cid = str_replace('c', '', $kb1);
$chde = $em->getRepository(LeaveEntitlement::class)->findBy(array('user' => $user, 'id' => $cid, 'year' => $yr));
if (is_array($chde)) {
for ($bb = 0; $bb < count($chde); $bb++) {
$lf = $chde[$bb]->getLeaveLeft();
$lf = $lf + $vb1;
$chde[$bb]->setLeaveLeft($lf);
$em->persist($chde[$bb]);
$em->flush();
}
}
}
}
}
foreach ($back as $k => $b) {
switch ($k) {
case'data':
break;
case 'error':
break;
case 'type':
break;
case 'dumper':
break;
case 'child':
$alocation['child'] = array();
break;
case 'unpaid':
$alocation['unpaid'] = array();
break;
default:
$yr = str_replace('y', '', $k);
$alocation['y' . $yr] = 0;
break;
}
}
$r->setAlocation($alocation);
$entityManager->persist($r);
$entityManager->flush();
$this->updateEntitlementFromLeave($user, $type, $alocation, $back);
}
$realleave->setUpdatedAt(new \DateTime());
$realleave->setLeaveLeft($value);
$realleave->setleaveEntitlements($value);
$entityManager->persist($realleave);
$entityManager->flush();
foreach ($request as $r) {
$isam = $r->getIsHalfStart();
$ispm = $r->getIsHalfEnd();
$alocation = $this->calculate($user, $type, $r->getStartdate(), $r->getEnddate(), null, array('am' => $isam, 'pm' => $ispm));
$r->setAlocation($alocation);
$entityManager->persist($r);
$entityManager->flush();
$this->updateEntitlementFromLeave($user, $type, $alocation);
}
}
}
public function resetAll($option=array()){
$default=array(
'user'=>null,
'year'=>date('Y')
);
$em=$this->entityManager;
$opt=$default;
foreach($option as $k=>$v){$opt[$k]=$v;}
$bresult=array();
$fn=array();
$fn['year']=array($opt['year']-1,$opt['year'],$opt['year']+1);
if(!is_null($opt['user'])){
$fn['user']=$opt['user'];
$bresult['user']=$opt['user']->getPersonalInfo()->getFirstName();
}
$realleave=array();
$dataleave=array();
$lent=$this->entityManager->getRepository(LeaveEntitlement::class)->findBy($fn);
foreach($lent as $l){
if($l->getYear()==$opt['year']){
$country=$l->getUser()->getOffice()->getCountry();
if($l->getLeaveType()->getLeaveName()=='annual'){
$attrx=$l->getAttributes();
$jobstatus=$l->getUser()->getPersonalInfo()->getJobStatus();
if(isset($attrx['given'])){
$attrx=$this->_calculate_givendate($l->getYear(),$country,$attrx,$l->getUser()->getPersonalInfo()->getJobJoinDate(),$l->getUser()->getPersonalInfo()->getJobPermanentDate(),$jobstatus);
}
$l->setAttributes($attrx);
$em->persist($l);
$em->flush();
}
}
$uid=$l->getUser()->getId();
if(!isset($dataleave['u'.$uid])){
$dataleave['u'.$uid]=array();
}
if(!isset($dataleave['u'.$uid]['y'.$l->getYear()])){
$dataleave['u'.$uid]['y'.$l->getYear()]=array();
}
$dataleave['u'.$uid]['y'.$l->getYear()]['t'.$l->getLeaveType()->getId()]=$l;
$realleave['c'.$l->getId()]=$l;
}
//get request data
$lrq = $this->entityManager->getRepository(\App\Entity\LeaveRequest::class)->createQueryBuilder('a')
->select('a')
->where('a.startDate >= :from')
->andWhere('a.startDate <= :to')
->setParameter('from', new \DateTime($opt['year'] . '-01-01'))
->setParameter('to', new \DateTime($opt['year'] . '-12-31'));
if(!is_null($opt['user'])){
$lrq->andWhere('a.user = :user')->setParameter('user', $opt['user']);
}
$lrq->orderBy('a.startDate');
$query=$lrq->getQuery();
$result=$query->getResult();
foreach($result as $l){
$allo=$l->getAlocation();
if(is_array($allo)){
foreach($allo as $ka => $va){
if($ka=='child'){
foreach($va as $kc=>$vc){
foreach($vc as $kc1 => $vc1){
if(isset($realleave[$kc1])){
$kcl=$realleave[$kc1]->getLeaveLeft()+$vc1;
$realleave[$kc1]->setLeaveLeft($kcl);
$this->entityManager->persist($realleave[$kc1]);
$this->entityManager->flush();
}
}
}
}else if(substr($ka,0,1)=='y'){
$yd=str_replace('y','',$ka);
if(isset($dataleave['u'.$l->getUser()->getId()]['y'.$yd]['t'.$l->getLeaveType()->getId()])){
$kld=$dataleave['u'.$l->getUser()->getId()]['y'.$yd]['t'.$l->getLeaveType()->getId()]->getLeaveLeft()+$va;
$dataleave['u'.$l->getUser()->getId()]['y'.$yd]['t'.$l->getLeaveType()->getId()]->setLeaveLeft($kld);
$this->entityManager->persist($dataleave['u'.$l->getUser()->getId()]['y'.$yd]['t'.$l->getLeaveType()->getId()]);
$this->entityManager->flush();
}
}
}
}
$l->setAlocation(array());
$this->entityManager->persist($l);
$this->entityManager->flush();
}
/*if(($leaveRequest->getLeaveType()->getId()==1) && ($leaveRequest->getUser()->getId()==51)){
$ddtxt=array();
$ddtxt['alocation']=$alocation;
$ddtxt['id']=$leaveRequest->getId();
dd($ddtxt);
} */
foreach($result as $l){
$this->saveRequest(
array('id'=>$l->getId(),'setlog'=>isset($option['logname'])?$option['logname']:'')
);
}
return $bresult;
}
function _calculate_givendate($year,$country,$attr,$joindate,$permanentdate,$jobstatus){
if(isset($attr['given'])){
if(!is_null($joindate)){
$ls=new \DateTime($year.'-01-01');
if(($country=='SG') || ($country=='HK')){
if(!is_null($joindate)){
$givendate=new \DateTime($joindate->format('Y-m-d'));
$givendate->modify('+3 months');
}else{
$givendate=$attr['given'];
if(is_array($givendate)){
$givendate= new \DateTime($givendate['date']);
}else{
$givendate= new \DateTime($givendate);
}
}
if($ls > $givendate){$givendate=$ls;}
$attr['given']=$givendate->format('Y-m-d');
}else if($country=='VN'){
if(!is_null($joindate)){
$givendate=new \DateTime($year.'-'.$joindate->format('m-d'));
}else{
$givendate=$attr['given'];
if(is_array($givendate)){
$givendate= new \DateTime($givendate['date']);
}else{
$givendate= new \DateTime($givendate);
}
}
$attr['given']=$givendate->format('Y-m-d');
}else{
if($jobstatus == 'form.job_status.permanent'){
if(!is_null($permanentdate)){
$givendate=new \DateTime($permanentdate->format('Y-m-d'));;
}else{
$givendate=$attr['given'];
if(is_array($givendate)){
$givendate= new \DateTime($givendate['date']);
}else{
$givendate= new \DateTime($givendate);
}
}
if($ls > $givendate){$givendate=$ls;}
$attr['given']=$givendate->format('Y-m-d');
}
}
}
}
return $attr;
}
public function saveLog($user,$entity,$action,$old=null){
$em=$this->entityManager;
$date=new \DateTime();
$date=$date->format('Y-m-d H:i');
if(strpos($action,'delete')===false){
$ll=$em->getRepository(get_class($entity))->find($entity->getId());
$log=$ll->getLog();
if(is_null($log)){$log=array();}
$c=count($log);
$log[$c]=array();
$log[$c]['date']=$date;
$log[$c]['user']=$user->getPersonalInfo()->getFullName();
$log[$c]['action']=$action;
$group='LogService';
$new=array();
if(method_exists($entity,'getStartDate')){ $new['startDate']=$entity->getStartDate()->format('Y-m-d');}
if(method_exists($entity,'getEndDate')){ $new['endDate']=$entity->getEndDate()->format('Y-m-d');}
if(method_exists($entity,'getDays')){ $new['days']=$entity->getDays();}
if(method_exists($entity,'getIsApproved')){ $new['approved']=$entity->getIsApproved();}
if(method_exists($entity,'getAlocation')){ $new['allocation']=$entity->getAlocation();}
$oldx=array();
if(!is_null($old)){
$new['change']='';
if(method_exists($old,'getStartDate')){ $oldx['startDate']=$old->getStartDate()->format('Y-m-d');}
if(method_exists($old,'getEndDate')){ $oldx['endDate']=$old->getEndDate()->format('Y-m-d');}
if(method_exists($old,'getDays')){ $oldx['days']=$old->getDays();}
if(method_exists($old,'getIsApproved')){ $oldx['approved']=$old->getIsApproved();}
if(method_exists($old,'getAlocation')){ $oldx['allocation']=$old->getAlocation();}
foreach($oldx as $k=>$v){
if(isset($new[$k])){
if($new[$k]!=$oldx[$k]){$new['change'].=$k.',';}
}
}
}
/*$hf=fopen('../var/log/test.log','a');
ob_start();
$object = new \ReflectionObject($entity);
foreach($object->getMethods() as $method){
//print_r($testresult);
print_r($method);
}
$txt=ob_get_clean();
fwrite($hf,$txt);
fclose($hf);*/
//$new=$this->serializer->serialize($this->serializer->normalize($entity, null, ['groups' => $group, AbstractObjectNormalizer::ENABLE_MAX_DEPTH => true]), 'json');
//unset($new['user']);
//unset($new['id']);
//$new=json_decode($new,true);
//unset($new['user']);
//unset($new['id']);
$log[$c]['data']=$new;
/*if(!is_null($old)){
$old=$this->serializer->serialize($this->serializer->normalize($old, null, ['groups' => $group, AbstractObjectNormalizer::ENABLE_MAX_DEPTH => true]), 'json');
$old=json_decode($old,true);
unset($old['user']);
unset($old['id']);
$log[$c]['olddata']=$old;
}*/
$ll->setLog($log);
$em->persist($ll);
$em->flush();
}
$type=get_class($entity);
$type=explode('\\',$type);
$type=$type[count($type)-1];
$lt=$entity->getLeaveType();
if(method_exists($entity,'getAlocation')){
$st=$entity->getStartDate();
$yr=$st->format('Y');
$lv=array();
$lvr=array();
$ent=$this->entityManager->getRepository(\App\Entity\leaveEntitlement::class)->findBy(
array(
'year'=>array($yr-2,$yr-1,$yr*1),
'user'=>$entity->getUser()->getId()
));
if(is_array($ent)){
foreach($ent as $l){
$lyr=$l->getYear();
$lty=$l->getLeaveType();
if(!isset($lv['y'.$lyr])){$lv['y'.$lyr]=array();}
$lv['y'.$lyr]['t'.$lty->getId()]=$l;
$lvr['c'.$l->getId()]=$l;
}
}
$all=$entity->getAlocation();
//datelist
foreach($all as $k=>$t){
$log=null;
$data=array();
$data['userId']=$user->getId();
$data['userName']=$user->getPersonalInfo()->getFullName();
$data['leave']=array();
$data['leave']['leaveTypeId']=$entity->getLeaveType()->getId();
$data['leave']['leaveTypeName']=$entity->getLeaveType()->getLeaveName();
$attrd=$entity->getLeaveType()->getAttributes();
$data['leave']['leaveTypeLabel']=isset($attrd['label'])?$attrd['label']:$data['leave']['leaveTypeName'];
$data['leave']['leaveStart']=$entity->getStartDate()->format('Y-m-d');
$data['leave']['leaveEnd']=$entity->getEndDate()->format('Y-m-d');
$data['leave']['isHalfStart']=$entity->getIsHalfStart();
$data['leave']['isHalfEnd']=$entity->getIsHalfEnd();
$data['leave']['days']=$entity->getDays();
$data['leave']['isApproved']=$entity->getIsApproved();
$data['record']=array();
switch($k){
case 'error':
break;
case 'data':
break;
case 'dumper':
break;
case 'type':
break;
case 'unpaid':
foreach($t as $kt=>$vt){
$log=new \App\Entity\LeaveLog();
$log->setLeaveType($lt);
$tyr=str_replace('y','',$kt);
$ttid=$lt->getId();
if(isset($lv[$kt]['t'.$ttid])){
$data['record']['entId']=$lv[$kt]['t'.$ttid]->getId();
$data['record']['days']=$vt['value'];
$data['record']['year']=$tyr;
$data['record']['status']='unpaid';
$data['record']['leaveId']=$lt->getID();
$data['record']['leaveName']=$lt->getLeaveName();
$attrr=$lv[$kt]['t'.$ttid]->getAttributes();
if(isset($attrr['title'])){
$data['record']['leaveLabel']=isset($attrr['title'])?$attrr['title']:$data['record']['leaveName'];
}else{
$data['record']['leaveLabel']=isset($attrr['label'])?$attrr['label']:$data['record']['leaveName'];
}
//$data['record']['dates']=$vt['date'];
}
$log->setDate(new \DateTimeImmutable());
$log->setUser($entity->getUser());
$log->setAction($action);
$log->setRecordId($entity->getId());
$log->setData($data);
$log->setType($type);
$em->persist($log);
$em->flush();
}
break;
case 'child':
foreach($t as $c){
foreach($c as $kc => $vc){
$log=new \App\Entity\LeaveLog();
if(isset($lvr[$kc])){
$log->setLeaveType($lvr[$kc]->getLeaveType());
$data['record']['entId']=str_replace('c','',$kc);
$attrr=$lvr[$kc]->getAttributes();
$data['record']['leaveId']=$lvr[$kc]->getLeaveType()->getID();
$data['record']['leaveName']=$lvr[$kc]->getLeaveType()->getLeaveName();
if(isset($attrr['title'])){
$data['record']['leaveLabel']=isset($attrr['title'])?$attrr['title']:$data['record']['leaveName'];
}else{
$data['record']['leaveLabel']=isset($attrr['label'])?$attrr['label']:$data['record']['leaveName'];
}
$data['record']['year']=$lvr[$kc]->getYear();
$data['record']['days']=$vc;
$data['record']['dates']=array();
if(isset($all['data'])){
$dtdates=$all['data'];
foreach($dtdates as $dd){
if(isset($dd['child'])){
foreach($dd['child'] as $kdc=>$vdc){
if($kdc==$kc){
array_push($data['record']['dates'],$vdc);
}
}
}
}
}
//$data
$log->setDate(new \DateTimeImmutable());
$log->setUser($entity->getUser());
$log->setAction($action);
$log->setRecordId($entity->getId());
$log->setData($data);
$log->setType($type);
$em->persist($log);
$em->flush();
}
}
}
break;
default:
$log=new \App\Entity\LeaveLog();
$log->setLeaveType($lt);
$tyr=str_replace('y','',$k);
$ttid=$lt->getId();
if(isset($lv[$k]['t'.$ttid])){
$data['record']['entId']=$lv[$k]['t'.$ttid]->getId();
$data['record']['days']=$t;
$data['record']['year']=$tyr;
$data['record']['leaveId']=$lt->getID();
$data['record']['leaveName']=$lt->getLeaveName();
$attrr=$lv[$k]['t'.$ttid]->getAttributes();
if(isset($attrr['title'])){
$data['record']['leaveLabel']=isset($attrr['title'])?$attrr['title']:$data['record']['leaveName'];
}else{
$data['record']['leaveLabel']=isset($attrr['label'])?$attrr['label']:$data['record']['leaveName'];
}
$data['record']['dates']=array();
}
$log->setDate(new \DateTimeImmutable());
$log->setUser($entity->getUser());
$log->setAction($action);
$log->setRecordId($entity->getId());
$log->setData($data);
$log->setType($type);
$em->persist($log);
$em->flush();
break;
}
if(!is_null($log)){
}
}
}else if(method_exists($entity,'getLeaveEntitlements')){
$log=new \App\Entity\LeaveLog();
$log->setDate(new \DateTimeImmutable());
$log->setUser($entity->getUser());
$log->setLeaveType($entity->getLeaveType());
$log->setAction($action);
$log->setRecordId($entity->getId());
$data=array();
$data['userId']=$user->getId();
$data['userName']=$user->getPersonalInfo()->getFullName();
$data['record']=array();
$data['record']['entId']=$entity->getId();
$data['record']['days']=$entity->getLeaveEntitlements();
$data['record']['year']=$entity->getYear();
$data['record']['leaveId']=$lt->getID();
$data['record']['leaveName']=$lt->getLeaveName();
$attrr=$entity->getAttributes();
if(isset($attrr['title'])){
$data['record']['leaveLabel']=isset($attrr['title'])?$attrr['title']:$data['record']['leaveName'];
}else{
$data['record']['leaveLabel']=isset($attrr['label'])?$attrr['label']:$data['record']['leaveName'];
}
$data['record']['dates']=array();
if(isset($attrr['expires'])){$data['record']['dates']['expires']=$attrr['expires'];}
if(isset($attrr['given'])){$data['record']['dates']['given']=$attrr['given'];}
$log->setData($data);
$log->setType($type);
$em->persist($log);
$em->flush();
}
}
public function todayLeaveEmail($request)
{
$loggedIn = false;
$user = $request->getUser()->getPersonalInfo()->getFirstName();
$leaveType = $request->getLeaveType();
$dataleaveType = ucwords($leaveType->getLeaveName());
$startDateData = $request->getStartDate();
$startDate = $startDateData->format('d F');
$isHalfStart = $request->getIsHalfStart();
$isHalfStart = $isHalfStart ? 'PM' : 'AM';
$endDateData = $request->getEndDate();
$endDate = $endDateData->format('d F Y');
$isHalfEnd = $request->getIsHalfEnd();
$isHalfEnd = $isHalfEnd ? 'AM' : 'PM';
$todayDateData = new \DateTime();
$tDate = $todayDateData->format("Y-m-d");
$sDate = $startDateData->format("Y-m-d");
$eDate = $endDateData->format("Y-m-d");
if($tDate == $sDate){
$displayDate = $startDateData;
}else{
$displayDate = $endDateData;
}
$dateDisplay = $displayDate->format('d F');
$halfDay = $isHalfStart == 'PM' ? $isHalfStart : '';
$halfDay .= $isHalfEnd == 'AM' ? $isHalfEnd : '';
$emailOps = $this->params->get('systemEmailOps');
$subject = $this->translator->trans('email.leave.ops.today');
$emailTemplate = 'email/user-notification/leave/leave.html.twig';
$this->mailgunService->sendEmail(
$this->translator->trans($subject, [
'%user%' => $user,
'%leaveType%' => $dataleaveType,
'%startDate%' => $dateDisplay.' '.$halfDay,
/*
'%endDate%' => $endDate,
'%isHalfStart%' => $isHalfStart,
'%isHalfEnd%' => $isHalfEnd,
*/
]),
[$emailOps],
$emailTemplate,
[
'leaveRequest' => $request,
],
$loggedIn
);
}
function trashRequest(\App\Entity\User $user,\App\Entity\LeaveRequest $request){
$em=$this->entityManager;
$trash=new \App\Entity\LeaveRequestTrash();
$object = new \ReflectionObject($request);
$trash->setRecordId($request->getId());
$trash->setDeletedAt(new \DateTime());
$trash->setDeletedBy($user->getId());
foreach ($object->getMethods() as $method) {
if(is_object($method)){
$nm=$method->name;
if(substr($nm,0,3)=='get'){
if(($nm!='getId') && ($nm!='getDeletedAt') && ($nm!='getDeletedBy') && ($nm!='getIsApproveds')){
$setnm='set'.substr($nm,3,strlen($nm)-3);
if(method_exists($trash,$setnm)){
call_user_func(array($trash,$setnm),call_user_func(array($request,$nm)));
}
}
}
}
}
$em->persist($trash);
$em->flush();
}
function dateDiffWithoutWeekendsAndHolidays($startDate, $endDate, $bankHolidays) {
$start = new \DateTime($startDate);
$end = new \DateTime($endDate);
$interval = new \DateInterval('P1D');
$excludeWeekends = true;
$period = new \DatePeriod($start, $interval, $end);
$days = 0;
foreach ($period as $day) {
$isWeekend = $day->format('N') >= 6;
if ($excludeWeekends && $isWeekend) {
continue;
}
$isHoliday = in_array($day->format('Y-m-d'), $bankHolidays);
if ($isHoliday) {
continue;
}
$days++;
}
return $days;
}
public function _dashboard($user,$year='',$leave=array('annual','carryover','anniversary','sick','adjustment')){
$result=array();
$result['dummy']=array();
if($year==''){$year=date('Y');}
$year=intval($year);
$em = $this->entityManager;
if(is_int($user)){
$user=$em->getRepository(\App\Entity\User::class)->find($user);
}
$arg=array(
'user'=>$user,
'year'=>array($year,$year-1)
);
$office=$user->getOffice();
$country=$office->getCountry();
$isProbation=$this->isOnProbation($user,$country);
$isProbation=($isProbation >= new \DateTime(date('Y-m-d')))?true:false;
$ent=$em->getRepository(LeaveEntitlement::class)->findBy($arg);
if(is_array($ent)){
$showother=0;
if($isProbation){$showother=-1;}
$entbyid=array();
$entlist=array();
foreach($ent as $l){$entbyid['l'.$l->getId()]=$l;}
foreach($ent as $l){
$type=$l->getLeaveType();
$typeok=$type->getIsActive();
if(!$typeok){ continue; }
$tid=$type->getId();
$lyear=$l->getYear();
if(!isset($entlist['l'.$tid])){
$entlist['l'.$tid]=array();
$entlist['l'.$tid]['total']=array(
"name"=>'',
"total"=>0,
"left"=>0,
"review"=>0,
"approved"=>0
);
}
if(!isset($entlist['l'.$tid]['y'.$lyear])){
$entlist['l'.$tid]['y'.$lyear]=array();
$entlist['l'.$tid]['y'.$lyear]['id']=$l->getId();
$entlist['l'.$tid]['y'.$lyear]['name']=$type->getLeaveName();
$entlist['l'.$tid]['total']['name']=$type->getLeaveName();
$entlist['l'.$tid]['y'.$lyear]['total']=0;
$entlist['l'.$tid]['y'.$lyear]['left']=0;
$entlist['l'.$tid]['y'.$lyear]['approved']=0;
$entlist['l'.$tid]['y'.$lyear]['review']=0;
}
$entlist['l'.$tid]['y'.$lyear]['total']+=$l->getLeaveEntitlements();
$entlist['l'.$tid]['y'.$lyear]['left']+=$l->getLeaveLeft();
$attr=$l->getAttributes();
//expire
$entlist['l'.$tid]['y'.$lyear]['expire']=$lyear.'-12-31';
$entlist['l'.$tid]['y'.$lyear]['given']=$lyear.'-01-01';
if(isset($attr['expires'])){$entlist['l'.$tid]['y'.$lyear]['expire']=$attr['expires'];}
if(isset($attr['given'])){$entlist['l'.$tid]['y'.$lyear]['given']=$attr['given'];}
$label='';
$title='';
if(isset($attr['label'])){$label=$attr['label'];}
if(isset($attr['title'])){$title=$attr['title'];}
if($title==''){$title=$label;}
$entlist['l'.$tid]['y'.$lyear]['label']=str_replace('year',$lyear,$label);
$entlist['l'.$tid]['y'.$lyear]['title']=str_replace('year',$lyear,$title);
$probation=false;
if(isset($attr['probation'])){$probation=$attr['probation'];}
if(($isProbation) && (($probation==false) || ($type->getLeaveName()=='sick'))){
$entlist['l'.$tid]['y'.$lyear]['given']=date('Y-m-d',strtotime('+10 days'));
if($showother < 1){$showother=-1;}
}
/*if(($isProbation) && (($probation==true) && ($type->getLeaveName()!='sick'))){
$showother=1;
}*/
//calculate carry over
$parent=$l->getParent();
if(($parent!=null) && ($parent!=0)){
if(isset($attr['followParent'])){
if($attr['followParent']==true){
$ptype=$entbyid['l'.$parent]->getLeaveType();
$pid=$ptype->getId();
$pyear=$entbyid['l'.$parent]->getYear();
if(!isset($entlist['l'.$pid])){
$entlist['l'.$pid]=array();
$entlist['l'.$pid]['total']=array(
"name"=>'',
"total"=>0,
"left"=>0,
"review"=>0,
"approved"=>0
);
}
if(!isset($entlist['l'.$pid]['y'.$pyear])){
$entlist['l'.$pid]['y'.$pyear]=array();
$entlist['l'.$pid]['y'.$pyear]['id']=$parent;
$entlist['l'.$pid]['y'.$pyear]['name']=$ptype->getLeaveName();
$entlist['l'.$pid]['total']['name']=$ptype->getLeaveName();
$entlist['l'.$pid]['y'.$pyear]['total']=0;
$entlist['l'.$pid]['y'.$pyear]['left']=0;
$entlist['l'.$pid]['y'.$pyear]['approved']=0;
$entlist['l'.$pid]['y'.$pyear]['review']=0;
}
$ptotal=$entbyid['l'.$parent]->getLeaveEntitlements();
$pleft=$entbyid['l'.$parent]->getLeaveLeft();
$total=$l->getLeaveEntitlements();
$left=$l->getLeaveLeft();
$use=$total-$left;
if($pleft < $total){
$entlist['l'.$tid]['y'.$lyear]['total']=$pleft;
$entlist['l'.$tid]['y'.$lyear]['left']=$pleft-$use;
}
$entlist['l'.$pid]['y'.$pyear]['left']-=$use;
}
}
}
}
$today=date('Ymd');
$leavetypes=array();
$leaveids=array();
foreach($entlist as $kid=>$v){
foreach($v as $kyear=>$v1){
if($kyear!='total'){
$name=$v1['name'];
$exp=intval(str_replace('-','',$v1['expire']));
$given=intval(str_replace('-','',$v1['given']));
$ok=false;
if(($given <= $today) && ($exp >= $today)){$ok=true;}
if($ok){
$leavetypes[count($leavetypes)]=intval(substr($kid,1,strlen($kid)-1));
$leaveids['l'.$v1['id']]=intval(substr($kid,1,strlen($kid)-1));
}else{
unset($entlist[$kid][$kyear]);
}
}
}
}
foreach($entlist as $kid=>$v){
if(count($entlist[$kid]) < 2){
unset($entlist[$kid]);
}
}
//get approved leave;
$request = $this->entityManager->getRepository(\App\Entity\LeaveRequest::class)->createQueryBuilder('a')
->select('a')
->where('a.startDate >= :from')
->andWhere('a.startDate <= :to')
->andWhere('a.leaveType in (:leavetype)')
->andWhere('a.user = :user')
->setParameter('from', new \DateTime($year . '-01-01'))
->setParameter('to', new \DateTime(($year+1) . '-12-31'))
->setParameter('user', $user->getId())
->setParameter('leavetype', $leavetypes)
->getQuery()
->getResult();
if(is_array($request)){
foreach($request as $r){
$type=$r->getLeaveType()->getId();
$approve=false;
$reject=false;
if(($r->getIsApproved()===true) || ($r->getIsApproved()===1)){$approve=true;}
if(($r->getIsApproved()===false) || ($r->getIsApproved()===0)){$approve=true;$reject=true;}
$all=$r->getAlocation();
if(is_array($all)){
foreach($all as $k => $v){
switch ($k){
case 'child':
foreach($v as $kyr => $v1){
foreach($v1 as $kcid => $v2){
$cid=intval(substr($kcid,1,strlen($kcid)-1));
if(isset($leaveids['l'.$cid])){
$ids=$leaveids['l'.$cid];
$ky=substr($kyr,1,strlen($kyr)-1);
if(isset($entlist['l'.$ids]['y'.$ky])){
if($approve){
if(!$reject){
$entlist['l'.$ids]['y'.$ky]['approved']+=$v2;
}
}else{
$entlist['l'.$ids]['y'.$ky]['review']+=$v2;
}
}
}
}
}
break;
default:
if(substr($k,0,1)=='y'){
$kyear=intval(substr($k,1,strlen($k)-1));
if(isset($entlist['l'.$type]['y'.$kyear])){
if($approve){
if(!$reject){
$entlist['l'.$type]['y'.$kyear]['approved']+=$v;
}
}else{
$entlist['l'.$type]['y'.$kyear]['review']+=$v;
}
}
}
}
}
}
}
}
$entlist['lother']=array();
$entlist['lother']['total']=array(
"name"=>'other',
"total"=>0,
"left"=>0,
"review"=>0,
"approved"=>0
);
foreach($entlist as $kid=>$v){
$name=$kid;
foreach($v as $kyear=>$v1){
$name=$v1['name'];
if(in_array($name,$leave)){
if($kyear!='total'){
$entlist[$kid]['total']['total']+=$v1['total'];
$entlist[$kid]['total']['left']+=$v1['left'];
$entlist[$kid]['total']['approved']+=$v1['approved'];
$entlist[$kid]['total']['review']+=$v1['review'];
}
}else{
if($kyear != 'total'){
if(!isset($entlist['lother'][$kyear])){
$entlist['lother'][$kyear]=array();
$entlist['lother'][$kyear]['id']=-1;
$entlist['lother'][$kyear]['name']='other';
$entlist['lother'][$kyear]['total']=0;
$entlist['lother'][$kyear]['left']=0;
$entlist['lother'][$kyear]['approved']=0;
$entlist['lother'][$kyear]['review']=0;
}
$entlist['lother'][$kyear]['total']+=$v1['total'];
$entlist['lother'][$kyear]['left']+=$v1['left'];
$entlist['lother'][$kyear]['approved']+=$v1['approved'];
$entlist['lother'][$kyear]['review']+=$v1['review'];
$entlist['lother']['total']['total']+=$v1['total'];
$entlist['lother']['total']['left']+=$v1['left'];
$entlist['lother']['total']['approved']+=$v1['approved'];
$entlist['lother']['total']['review']+=$v1['review'];
}
}
}
if($kid!='lother'){
if(!in_array($name,$leave)){
unset($entlist[$kid]);
}
}
}
if($showother < 0){unset($entlist['lother']);}
}
$result=$entlist;
return $result;
}
public function getDataLeaveEntitlements($leaveType = [], $year = '', $company, $office = '', $userData = null, $leaveData = [],$probationzero=false){
$year = empty($year) ? date('Y') : $year;
$thisYear = date('Y');
$todayDate = date('Y-m-d');
$entitlements = $this->leaveEntitlementRepository->findByPage(1, 999999, "", 'ASC', "", '', $year, $office, "", $userData);
// dd($entitlements);
$annual = [];
$nowdate=new \DateTime($todayDate);
foreach($entitlements as $ent){
$typeName = $ent->getLeaveType()->getAttributes()['label'];
if($leaveType && !in_array($typeName, $leaveType)) continue;
$id = $ent->getId();
$user = $ent->getUser();
$userId = $user->getId();
$isUserActive = $user->getIsActive();
$userCompany = $user->assignedCompany();
$parent = $ent->getParent();
$attr=$ent->getAttributes();
$allowprob=true;
$country=$ent->getLeaveType()->getOffice()->getCountry();
if($probationzero==true){
if(isset($attr['probation'])){
$allowprob=$attr['probation'];
if($typeName=='Sick'){$allowprob=false;}
}else{
$allowprob=false;
}
}
$isprobation=$this->isOnProbation($user,$country,false);
if($typeName == 'Annual'){
$annual['id'] = $ent->getId();
if($allowprob==true){
$annual['ent'] = $ent->getLeaveEntitlements();
$annual['left'] = $ent->getLeaveLeft();
}else{
$annual['ent'] = 0;
$annual['left'] = 0;
}
}
if($isUserActive && ($userCompany == $company)){
if(!isset($leaveData['u'.$userId])){
$leaveData['u'.$userId] = [];
}
if(!isset($leaveData['u'.$userId]['user'])){
$leaveData['u'.$userId]['user'] = $user;
}
if(!isset($leaveData['u'.$userId]['leaves'][$typeName])){
$given = !isset($ent->getAttributes()['given']) ? date($year.'-01-01') : $ent->getAttributes()['given'];
$expires = !isset($ent->getAttributes()['expires']) ? date($year.'-12-31') : $ent->getAttributes()['expires'];
if($typeName == 'Annual' && is_array($expires)) $expires = date('Y-m-d', strtotime($expires['date']));
if($typeName == 'adjustment'){
$newTypeName = $year != $thisYear ? $typeName.' '.$year : $typeName;
$leaveData['u'.$userId]['leaves'][$newTypeName.' '.$id] = [
'total' => $ent->getLeaveEntitlements(),
'taken' => 0,
'balance' => 0,
'upcoming' => 0,
'finalbalance' => $ent->getLeaveLeft(),
'approved' => 0,
'review' => 0,
'rejected' => 0,
'given' => $given,
'expires' => $expires
];
if($todayDate >= $given && $todayDate <= $expires){
$leaveData['u'.$userId]['leaves'][$newTypeName.' '.$id]['mode'] = 'show';
}else{
$leaveData['u'.$userId]['leaves'][$newTypeName.' '.$id]['mode'] = 'hide';
}
}else{
if($typeName == 'Carry Over year'){
$typeName = 'Carry Over';
}
if($year != $thisYear){
$newTypeName = $typeName.' '.$year;
}else{
$newTypeName = $typeName;
}
$total = $ent->getLeaveEntitlements();
$finalBalance = $ent->getLeaveLeft();
if(strpos('Carry Over', $typeName) !== false) {
if($parent == $annual['id']){
if($annual['left'] < $ent->getLeaveEntitlements()){
$total = $annual['left'];
$finalBalance = $ent->getLeaveLeft() - ($ent->getLeaveEntitlements() - $annual['left']);
}
}
}
if($allowprob==false){
$isprobation=$this->isOnProbation($user,$country,false);
if($isprobation >= $nowdate){
$total=0;
$finalBalance=0;
}
}
$leaveData['u'.$userId]['leaves'][$newTypeName] = [
'total' => $total,
'taken' => 0,
'balance' => 0,
'upcoming' => 0,
'finalbalance' => $finalBalance,
'approved' => 0,
'review' => 0,
'rejected' => 0,
'given' => $given,
'expires' => $expires
];
if($todayDate >= $given && $todayDate <= $expires){
$leaveData['u'.$userId]['leaves'][$newTypeName]['mode'] = 'show';
}else{
if($typeName == 'Carry Over' && (intval($year) == intval($thisYear - 1))){
$leaveData['u'.$userId]['leaves'][$newTypeName]['mode'] = 'show';
}else{
$leaveData['u'.$userId]['leaves'][$newTypeName]['mode'] = 'hide';
}
}
}
}
}
}
return $leaveData;
}
public function getDataleaveRequests($leaveType = [], $company, $office, $start, $end, $userData = null, $leaveData = [], $isUpcoming = false){
$thisYear = date('Y');
$todayDate = date('Y-m-d');
$year = date('Y', strtotime($start));
$prevYear = strval($year - 1);
$requests = $this->leaveRequestRepository->findByPage(1, 999, "",'ASC', "", "", "", "", $office, $start, $end, $userData);
foreach($requests as $request){
$typeName = $request->getLeaveType()->getAttributes()['label'];
if($leaveType && !in_array($typeName, $leaveType)) continue;
$user = $request->getUser();
$userId = $request->getUser()->getId();
$country = $user->getOffice()->getCountry();
// $typeName = $requestPrev->getLeaveType()->getLeaveName().$prevYear;
$isUserActive = $user->getIsActive();
$userCompany = $user->assignedCompany();
$requestStartDate = $request->getStartDate()->format('Y-m-d');
$requestEndDate = $request->getEndDate()->format('Y-m-d');
$status = $request->getIsApproved() == null ? 'review' : ($request->getIsApproved() ? 'approved' : 'review');
// dd($request);
$newTypeName = $year != $thisYear ? $typeName.' '.$year : $typeName;
$yearText = $year != $thisYear ? ' '.$year : '';
if($isUserActive && ($userCompany == $company)){
if(!isset($leaveData['u'.$userId])){
$leaveData['u'.$userId] = [];
}
if(!isset($leaveData['u'.$userId]['user'])){
$leaveData['u'.$userId]['user'] = $user;
}
if(!isset($leaveData['u'.$userId]['leaves'][$newTypeName])){
$leaveData['u'.$userId]['leaves'][$newTypeName][$isUpcoming ? 'upcoming' : 'taken'] = 0;
$leaveData['u'.$userId]['leaves'][$newTypeName][$status]=0;
}
if($typeName == 'Annual' && !isset($leaveData['u'.$userId]['leaves']['Carry Over'.$yearText])){
$leaveData['u'.$userId]['leaves']['Carry Over'.$yearText][$isUpcoming ? 'upcoming' : 'taken'] = 0;
if($end > date($year.'-03-31')){
$leaveData['u'.$userId]['leaves']['Carry Over'.$yearText]['mode'] = 'hide';
}else{
$leaveData['u'.$userId]['leaves']['Carry Over'.$yearText]['mode'] = 'show';
}
}
if(isset($request->getAlocation()['child']['y'.$year])){
foreach($request->getAlocation()['child']['y'.$year] as $key => $value){
if($request->getAlocation()['type'][$key] == 'anniversary'){
// if($end < $requestEndDate && date('Y', strtotime($requestEndDate)) == date('Y', strtotime($end))){
if($end < $requestEndDate){
if(isset($request->getAlocation()['data']['y'.$year]['child'][$key])){
$dataBonus = $request->getAlocation()['data']['y'.$year]['child'][$key];
$bonusDays = 0;
foreach($dataBonus as $attr => $value){
$alocDate = substr($attr, 1);
$alocDateFormat = date('Y-m-d', strtotime($alocDate));
// if($alocDateFormat >= $end && $alocDateFormat <= $requestEndDate){
// $bonusDays += $value;
// }
if($alocDateFormat <= $end){
$bonusDays += $value;
}
}
if(array_key_exists('Bonus'.$yearText, $leaveData['u'.$userId]['leaves'])){
$leaveData['u'.$userId]['leaves']['Bonus'.$yearText][$isUpcoming ? 'upcoming' : 'taken'] += $bonusDays;
$leaveData['u'.$userId]['leaves']['Bonus'.$yearText][$status] += $bonusDays;
}
}
}else{
if(array_key_exists('Bonus'.$yearText, $leaveData['u'.$userId]['leaves'])){
$leaveData['u'.$userId]['leaves']['Bonus'.$yearText][$isUpcoming ? 'upcoming' : 'taken'] += $value;
$leaveData['u'.$userId]['leaves']['Bonus'.$yearText][$status] += $value;
}
}
if($requestStartDate < $start){
if(isset($request->getAlocation()['data']['y'.$year]['child'][$key])){
$dataBonus = $request->getAlocation()['data']['y'.$year]['child'][$key];
$bonusDays = 0;
foreach($dataBonus as $attr => $value){
$alocDate = substr($attr, 1);
$alocDateFormat = date('Y-m-d', strtotime($alocDate));
if($alocDateFormat <= $start){
$bonusDays += $value;
}
}
if(array_key_exists('Bonus'.$yearText, $leaveData['u'.$userId]['leaves'])){
$leaveData['u'.$userId]['leaves']['Bonus'.$yearText][$isUpcoming ? 'upcoming' : 'taken'] -= $bonusDays;
$leaveData['u'.$userId]['leaves']['Bonus'.$yearText][$status] -= $bonusDays;
}
}
}
}elseif ($request->getAlocation()['type'][$key] == 'adjustment'){
$newKey = substr($key, 1);
if($end < $requestEndDate){
if(isset($request->getAlocation()['data']['y'.$year]['child'][$key])){
$dataAdj = $request->getAlocation()['data']['y'.$year]['child'][$key];
$adjDays = 0;
foreach($dataAdj as $attr => $value){
$alocDate = substr($attr, 1);
$alocDateFormat = date('Y-m-d', strtotime($alocDate));
// if($alocDateFormat >= $end && $alocDateFormat <= $requestEndDate){
// $adjDays += $value;
// }
if($alocDateFormat <= $end){
$adjDays += $value;
}
}
if(array_key_exists('adjustment '.$newKey.$yearText, $leaveData['u'.$userId]['leaves'])){
$leaveData['u'.$userId]['leaves']['adjustment '.$newKey.$yearText][$isUpcoming ? 'upcoming' : 'taken'] += $adjDays;
$leaveData['u'.$userId]['leaves']['adjustment '.$newKey.$yearText][$status] += $adjDays;
}
}
}else{
if(array_key_exists('adjustment '.$newKey.$yearText, $leaveData['u'.$userId]['leaves'])){
$leaveData['u'.$userId]['leaves']['adjustment '.$newKey.$yearText][$isUpcoming ? 'upcoming' : 'taken'] += $value;
$leaveData['u'.$userId]['leaves']['adjustment '.$newKey.$yearText][$status] += $value;
}
}
if($requestStartDate < $start){
if(isset($request->getAlocation()['data']['y'.$year]['child'][$key])){
$dataAdj = $request->getAlocation()['data']['y'.$year]['child'][$key];
$adjDays = 0;
foreach($dataAdj as $attr => $value){
$alocDate = substr($attr, 1);
$alocDateFormat = date('Y-m-d', strtotime($alocDate));
if($alocDateFormat <= $start){
$adjDays += $value;
}
}
if(array_key_exists('adjustment '.$newKey.$yearText, $leaveData['u'.$userId]['leaves'])){
$leaveData['u'.$userId]['leaves']['adjustment '.$newKey.$yearText][$isUpcoming ? 'upcoming' : 'taken'] -= $adjDays;
$leaveData['u'.$userId]['leaves']['adjustment '.$newKey.$yearText][$status] -= $adjDays;
}
}
}
}
}
}
// get bonus prev year and carry over
if(isset($request->getAlocation()['child']['y'.$prevYear])){
foreach($request->getAlocation()['child']['y'.$prevYear] as $key => $value){
if($request->getAlocation()['type'][$key] == 'anniversary'){
if($end < $requestEndDate){
if(isset($request->getAlocation()['data']['y'.$prevYear]['child'][$key])){
$dataBonus = $request->getAlocation()['data']['y'.$prevYear]['child'][$key];
$bonusDays = 0;
foreach($dataBonus as $attr => $value){
$alocDate = substr($attr, 1);
$alocDateFormat = date('Y-m-d', strtotime($alocDate));
// if($alocDateFormat >= $end && $alocDateFormat <= $requestEndDate){
// $bonusDays += $value;
// }
if($alocDateFormat <= $end){
$bonusDays += $value;
}
}
if(array_key_exists('Bonus '.$prevYear, $leaveData['u'.$userId]['leaves'])){
$leaveData['u'.$userId]['leaves']['Bonus '.$prevYear]['taken'] += $bonusDays;
$leaveData['u'.$userId]['leaves']['Bonus '.$prevYear][$status] += $bonusDays;
}
}
}else{
if(array_key_exists('Bonus '.$prevYear, $leaveData['u'.$userId]['leaves'])){
$leaveData['u'.$userId]['leaves']['Bonus '.$prevYear]['taken'] += $value;
$leaveData['u'.$userId]['leaves']['Bonus '.$prevYear][$status] += $value;
}
}
if($requestStartDate < $start){
if(isset($request->getAlocation()['data']['y'.$prevYear]['child'][$key])){
$dataBonus = $request->getAlocation()['data']['y'.$prevYear]['child'][$key];
$bonusDays = 0;
foreach($dataBonus as $attr => $value){
$alocDate = substr($attr, 1);
$alocDateFormat = date('Y-m-d', strtotime($alocDate));
if($alocDateFormat <= $start){
$bonusDays += $value;
}
}
if(array_key_exists('Bonus '.$prevYear, $leaveData['u'.$userId]['leaves'])){
$leaveData['u'.$userId]['leaves']['Bonus '.$prevYear]['taken'] -= $bonusDays;
$leaveData['u'.$userId]['leaves']['Bonus '.$prevYear][$status] -= $bonusDays;
}
}
}
}
elseif($request->getAlocation()['type'][$key] == 'carryover'){
if($end < $requestEndDate){
if(isset($request->getAlocation()['data']['y'.$prevYear]['child'][$key])){
$dataBonus = $request->getAlocation()['data']['y'.$prevYear]['child'][$key];
$carryDays = 0;
foreach($dataBonus as $attr => $value){
$alocDate = substr($attr, 1);
$alocDateFormat = date('Y-m-d', strtotime($alocDate));
// if($alocDateFormat >= $end && $alocDateFormat <= $requestEndDate){
// $bonusDays += $value;
// }
if($alocDateFormat <= $end){
$carryDays += $value;
}
}
if(array_key_exists('Carry Over '.$prevYear, $leaveData['u'.$userId]['leaves'])){
$leaveData['u'.$userId]['leaves']['Carry Over '.$prevYear]['taken'] += $carryDays;
$leaveData['u'.$userId]['leaves']['Carry Over '.$prevYear][$status] += $carryDays;
}
}
}else{
if(array_key_exists('Carry Over '.$prevYear, $leaveData['u'.$userId]['leaves'])){
$leaveData['u'.$userId]['leaves']['Carry Over '.$prevYear]['taken'] += $value;
$leaveData['u'.$userId]['leaves']['Carry Over '.$prevYear][$status] += $value;
}
}
if($requestStartDate < $start){
if(isset($request->getAlocation()['data']['y'.$prevYear]['child'][$key])){
$dataBonus = $request->getAlocation()['data']['y'.$prevYear]['child'][$key];
$carryDays = 0;
foreach($dataBonus as $attr => $value){
$alocDate = substr($attr, 1);
$alocDateFormat = date('Y-m-d', strtotime($alocDate));
if($alocDateFormat <= $start){
$carryDays += $value;
}
}
if(array_key_exists('Carry Over '.$prevYear, $leaveData['u'.$userId]['leaves'])){
$leaveData['u'.$userId]['leaves']['Carry Over '.$prevYear]['taken'] -= $carryDays;
$leaveData['u'.$userId]['leaves']['Carry Over '.$prevYear][$status] -= $carryDays;
}
}
}
}
/*
elseif ($request->getAlocation()['type'][$key] == 'adjustment'){
$newKey = substr($key, 1);
if($end < $requestEndDate){
if(isset($request->getAlocation()['data']['y'.$prevYear]['child'][$key])){
$dataAdj = $request->getAlocation()['data']['y'.$prevYear]['child'][$key];
$adjDays = 0;
foreach($dataAdj as $attr => $value){
$alocDate = substr($attr, 1);
$alocDateFormat = date('Y-m-d', strtotime($alocDate));
if($alocDateFormat >= $end && $alocDateFormat <= $requestEndDate){
$adjDays += $value;
}
}
if(array_key_exists('adjustment '.$newKey.' '.$prevYear, $leaveData['u'.$userId]['leaves'])){
$leaveData['u'.$userId]['leaves']['adjustment '.$newKey.' '.$prevYear][$isUpcoming ? 'upcoming' : 'taken'] += $adjDays;
}
}
}else{
if(array_key_exists('adjustment '.$newKey.' '.$prevYear, $leaveData['u'.$userId]['leaves'])){
$leaveData['u'.$userId]['leaves']['adjustment '.$newKey.' '.$prevYear][$isUpcoming ? 'upcoming' : 'taken'] += $value;
}
}
}
*/
}
}
if($end < $requestEndDate){
$resultDays = 0;
if (isset($request->getAlocation()['data']['y'.$year])){
foreach($request->getAlocation()['data']['y'.$year] as $key => $value){
if($key == 'child') continue;
$alocDate = substr($key, 1);
$alocDateFormat = date('Y-m-d', strtotime($alocDate));
// if($alocDateFormat >= $end && $alocDateFormat <= $requestEndDate){
// $resultDays += $value;
// }
if($alocDateFormat <= $end){
$resultDays += $value;
}
}
if(array_key_exists($newTypeName, $leaveData['u'.$userId]['leaves'])){
$leaveData['u'.$userId]['leaves'][$newTypeName][$isUpcoming ? 'upcoming' : 'taken'] += $resultDays;
$leaveData['u'.$userId]['leaves'][$newTypeName][$status] += $resultDays;
}
}elseif(isset($request->getAlocation()['y'.$year])){
$days = $request->getAlocation()['y'.$year];
$bankHolidays = $this->bankHolidayService->getHoliday($end, $requestEndDate, $country);
$diff = $this->dateDiffWithoutWeekendsAndHolidays($end, $requestEndDate, $bankHolidays);
$result = $days - $diff;
if(array_key_exists($newTypeName, $leaveData['u'.$userId]['leaves'])){
$leaveData['u'.$userId]['leaves'][$newTypeName][$isUpcoming ? 'upcoming' : 'taken'] += $result;
$leaveData['u'.$userId]['leaves'][$newTypeName][$status] += $result;
}
}else{
if(array_key_exists($newTypeName, $leaveData['u'.$userId]['leaves'])){
$leaveData['u'.$userId]['leaves'][$newTypeName][$isUpcoming ? 'upcoming' : 'taken'] += $resultDays;
$leaveData['u'.$userId]['leaves'][$newTypeName][$status] += $resultDays;
}
}
/*
$daysCarryOver = !isset($request->getAlocation()['y'.$prevYear]) ? 0 : $request->getAlocation()['y'.$prevYear];
if($daysCarryOver){
$bankHolidays = $this->bankHolidayService->getHoliday($end, $requestEndDate, $country);
$diff = $this->dateDiffWithoutWeekendsAndHolidays($end, $requestEndDate, $bankHolidays);
$resultCarryOver = $daysCarryOver - $diff;
if(array_key_exists('Carry Over'.$yearText, $leaveData['u'.$userId]['leaves'])){
$leaveData['u'.$userId]['leaves']['Carry Over'.$yearText][$isUpcoming ? 'upcoming' : 'taken'] += $resultCarryOver;
}
}else{
if(array_key_exists('Carry Over'.$yearText, $leaveData['u'.$userId]['leaves'])){
$leaveData['u'.$userId]['leaves']['Carry Over'.$yearText][$isUpcoming ? 'upcoming' : 'taken'] += 0;
}
}
*/
}
else{
$leaveData['u'.$userId]['leaves'][$newTypeName][$isUpcoming ? 'upcoming' : 'taken'] += !isset($request->getAlocation()['y'.$year]) ? 0 : $request->getAlocation()['y'.$year];
$leaveData['u'.$userId]['leaves'][$newTypeName][$status] += !isset($request->getAlocation()['y'.$year]) ? 0 : $request->getAlocation()['y'.$year];
/*
if(isset($leaveData['u'.$userId]['leaves']['Carry Over'.$yearText][$isUpcoming ? 'upcoming' : 'taken'])){
$leaveData['u'.$userId]['leaves']['Carry Over'.$yearText][$isUpcoming ? 'upcoming' : 'taken'] += !isset($request->getAlocation()['y'.$prevYear]) ? 0 : $request->getAlocation()['y'.$prevYear];
}
*/
}
if($requestStartDate < $start){
$resultDays = 0;
if (isset($request->getAlocation()['data']['y'.$year])){
foreach($request->getAlocation()['data']['y'.$year] as $key => $value){
if($key == 'child') continue;
$alocDate = substr($key, 1);
$alocDateFormat = date('Y-m-d', strtotime($alocDate));
if($alocDateFormat <= $start){
$resultDays += $value;
}
}
if(array_key_exists($newTypeName, $leaveData['u'.$userId]['leaves'])){
$leaveData['u'.$userId]['leaves'][$newTypeName][$isUpcoming ? 'upcoming' : 'taken'] -= $resultDays;
$leaveData['u'.$userId]['leaves'][$newTypeName][$status] -= $resultDays;
}
}elseif(isset($request->getAlocation()['y'.$year])){
$days = $request->getAlocation()['y'.$year];
$bankHolidays = $this->bankHolidayService->getHoliday($end, $requestEndDate, $country);
$diff = $this->dateDiffWithoutWeekendsAndHolidays($requestStartDate, $start, $bankHolidays);
$result = $days - $diff;
if(array_key_exists($newTypeName, $leaveData['u'.$userId]['leaves'])){
$leaveData['u'.$userId]['leaves'][$newTypeName][$isUpcoming ? 'upcoming' : 'taken'] -= $result;
$leaveData['u'.$userId]['leaves'][$newTypeName][$status] -= $result;
}
}else{
if(array_key_exists($newTypeName, $leaveData['u'.$userId]['leaves'])){
$leaveData['u'.$userId]['leaves'][$newTypeName][$isUpcoming ? 'upcoming' : 'taken'] -= $resultDays;
$leaveData['u'.$userId]['leaves'][$newTypeName][$status] -= $resultDays;
}
}
}
}
}
return $leaveData;
}
public function listLeaveEntitlement($option=array()){
$default=array(
'user'=>null,
'office'=>'',
'manager'=>'',
'leaveType'=>'',
'page'=>1,
'limit'=>20,
'keyword'=>'',
'order'=>'',
'orderBy'=>'',
'year'=>'',
'department'=>'',
'byoffice'=>false,
'viewdate'=>date('Y-m-d')
);
$opt=$default;
$em = $this->entityManager;
foreach($option as $k=>$v){$opt[$k]=$v;}
$y=new \DateTime($opt['viewdate']);
if($opt['year']==''){
$opt['year']=$y->format('Y');
}else{
if($y->format('Y') > $opt['year']){
$opt['viewdate']=$opt['year'].'-12-31';
}
}
$firstdate=new \DateTime($opt['year'].'-01-01');
$lastdate=new \DateTime($opt['viewdate']);
$years=array($opt['year']-1,$opt['year']);
$arg=array(
'year'=>$years,
'isActive'=>1,
);
if(!is_null($opt['user'])){$arg['user']=$opt['user'];}
$ent=array();
$entbyid=array();
$adjustments=array();
$parentdata=array();
$leaveEntitlement=$em->getRepository(LeaveEntitlement::class)->findBy($arg);
$datenow=new \DateTime(date('Y-m-d'));
$entlist=array();
$dumptotal=array();
if(is_array($leaveEntitlement)){
foreach($leaveEntitlement as $l){
$entbyid['l'.$l->getId()]=$l;
}
foreach($leaveEntitlement as $l){
$currentUser=$l->getUser();
$uid=$currentUser->getId();
$currentLeaveType=$l->getLeaveType();
$currentCountry=$currentLeaveType->getOffice()->getCountry();
if($currentUser->getIsActive()){
if(!isset($adjustments['u'.$uid])){
$adjustments['u'.$uid]=array();
$adjustments['u'.$uid]['total']=0;
$adjustments['u'.$uid]['taken']=0;
$adjustments['u'.$uid]['left']=0;
}
//get exipred
$attr=$l->getAttributes();
$yr=$l->getYear();
$given=$yr.'-01-01';
if(isset($attr['given'])){
$given=$attr['given'];
if(is_array($attr['given'])){$given=$attr['given']['date'];}
}
$exp=$yr.'-12-31';
if(isset($attr['expires'])){
$exp=$attr['expires'];
if(is_array($attr['expires'])){$exp=$attr['expires']['date'];}
}
if ($currentUser->getPersonalInfo()->getJobStatus() == 'form.job_status.permanent'){
if($l->getLeaveType()->getLeaveName()=='annual'){
$jobokdate=$currentUser->getPersonalInfo()->getJobPermanentDate();
$gv=new \DateTime($given);
$jbok=new \DateTime($jobokdate->format('Y-m-d'));
if($gv > $jobokdate){
$given=$jobokdate->format('Y-m-d');
$attr['given']=$given;
$l->setAttributes($attr);
$em->persist($l);
$em->flush();
}
}
}
$given=new \DateTime($given);
$exp=new \DateTime($exp);
$ok=false;
if(($given <= $firstdate) && ($exp >= $firstdate)){$ok=true;}
if(($exp >= $lastdate) && ($given <= $lastdate)){$ok=true;}
if(($given >= $firstdate) && ($exp <= $lastdate)){$ok=true;}
if(($given <= $firstdate) && ($exp >= $lastdate)){$ok=true;}
if($given > $exp){$ok=false;}
//if not expired
if($ok){
/*if($currentLeaveType->getLeaveName()=='adjustment'){
//$adjustments['u'.$uid]['total']+=$l->getLeaveEntitlements();
//$adjustments['u'.$uid]['left']+=$l->getLeaveLeft();
$adjpid=$l->getParent();
if(!in_array($adjpid,$entlist)){
if($l->getYear()==$opt['year']){
$isprobation=$this->isOnProbation($currentUser,$currentCountry,false);
$e=clone $entbyid['l'.$adjpid];
if($isprobation < $datenow){
}else{
$e->setLeaveEntitlements(0);
$e->setLeaveLeft(0);
}
$ent[count($ent)]=$e;
if($adjustments['u'.$uid]['total'] > 0){
$dumptotal['l'.$adjpid]=$adjustments['u'.$uid]['total'];
}
}
}
}else{*/
$isprobation=$this->isOnProbation($currentUser,$currentCountry,false);
if($currentLeaveType->getLeaveName()=='adjustment'){
$isprobation=new \DateTime($datenow->format('Y-m-d'));
$isprobation->modify('-1 day');
}
if($isprobation < $datenow){
if($currentLeaveType->getLeaveName()=='anniversary'){
if($exp >= $lastdate){
$e=clone $l;
$ent[count($ent)]=$e;
$entlist[count($entlist)]=$e->getId();
}
}else{
$e=clone $l;
$ent[count($ent)]=$e;
$entlist[count($entlist)]=$e->getId();
}
}else{
$e=clone $l;
$e->setLeaveEntitlements(0);
$e->setLeaveLeft(0);
$ent[count($ent)]=$e;
$entlist[count($entlist)]=$e->getId();
}
//}
}
if(isset($attr['followParent'])){
if($attr['followParent']){
$pid=$l->getParent();
if(!is_null($pid)){
$parentdata['p'.$pid]=array();
$parentdata['p'.$pid]['child']=array();
}
$totalchild=count($parentdata['p'.$pid]['child']);
$parentdata['p'.$pid]['child'][$totalchild]=$l->getLeaveEntitlements() - $l->getLeaveLeft();
}
}
}
}
foreach($leaveEntitlement as $l){
$pid=$l->getId();
$currentUser=$l->getUser();
$currentLeaveType=$l->getLeaveType();
$currentCountry=$currentLeaveType->getOffice()->getCountry();
if(isset($parentdata['p'.$pid])){
$isprobation=$this->isOnProbation($currentUser,$currentCountry,false);
if($isprobation < $datenow){
$parentdata['p'.$pid]['left']=$l->getLeaveLeft();
}else{
$parentdata['p'.$pid]['left']=0;
}
foreach($parentdata['p'.$pid]['child'] as $vpd){
$parentdata['p'.$pid]['left']-=$vpd;
}
}
}
}
// claculate leave left and total
$final=array();
$dummy=array();
foreach($ent as $l){
$typeactive=$l->getLeaveType()->getIsActive();
if($typeactive){
$detect=0;
$find=0;
$currentUser=$l->getUser();
$name=$currentUser->getPersonalInfo()->getFullName();
$name=strtolower($name);
if(($opt['keyword']!='') || ($opt['office']!='') || ($opt['manager']!='') || ($opt['department']!='')){
if($opt['keyword']!=''){
$detect++;
$opt['keyword']=strtolower($opt['keyword']);
if(strpos($name,$opt['keyword'])!==false){
$find++;
}
}
if($opt['office']!=''){
$detect++;
$oid=$currentUser->getOffice()->getId();
$nooffice='';
if(is_object($opt['office'])){$nooffice=$opt['office']->getId();}else{$nooffice=$opt['office'];}
if($oid==$nooffice){$find++;}
}
if($opt['department']!=''){
$detect++;
$oid=$currentUser->getDepartment()->getId();
$nodept='';
if(is_object($opt['department'])){$nodept=$opt['department']->getId();}else{$nodept=$opt['department'];}
if($oid==$nodept){$find++;}
}
if($opt['manager']!=''){
$detect++;
$nmo=$currentUser->getAllManager();
foreach($nmo as $m){
if($m->getId()==$opt['manager']){$find++;}
}
if($opt['manager']==$currentUser->getId()){$find++;}
}
}
$dummy[]=$opt;
if($find>=$detect){
$attr=$l->getAttributes();
$label=str_replace('+year',$l->getYear(),$attr['label']);
$label=str_replace('year',$l->getYear(),$attr['label']);
$attr['label']=$label;
$l->setAttributes($attr);
if(isset($attr['followParent'])){
if($attr['followParent']){
$pid=$l->getParent();
$parentleft=$entbyid['l'.$pid]->getLeaveLeft();
$leavetotal=$l->getLeaveEntitlements();
$leaveleft=$l->getLeaveLeft();
$use=$leavetotal-$leaveleft;
if($parentleft < $leavetotal){
$leaveleft=$parentleft-$use;
$l->setLeaveEntitlements($parentleft);
$l->setLeaveLeft($leaveleft);
}
}
}
if($l->getLeaveEntitlements()==0){
if(isset($dumptotal['l'.$l->getId()])){
array_push($final, array('data'=>clone $l,'sort'=>$name));
}
}else{
array_push($final, array('data'=>clone $l,'sort'=>$name));
}
}
}
}
//filter
foreach($final as $k=>$v){
$pid=$v['data']->getId();
if(isset($parentdata['p'.$pid])){
$final[$k]['data']->setLeaveLeft($parentdata['p'.$pid]['left']);
}
}
usort($final,function($a,$b){
if($a['sort'] > $b['sort']){return 1;}
return 0;
});
$c=count($final);
return array(
'data'=> array_slice($final,($opt['page']-1)*$opt['limit'],$opt['limit']),
'adjustment'=>$adjustments,
'total'=>$c,
'dummy'=>$dummy
);
}
function _count_leave_data($leaveent,$startdate,$enddate,$leavetype,$back=array(),$days=0){
$leavedata=array();
$tmpleave=array();
$entbyid=array();
if(is_array($leaveent)){
foreach($leaveent as $l){
$entbyid['l'.$l->getId()]=$l;
}
foreach($leaveent as $l){
$attr=$l->getAttributes();
$attr1=$l->getAttributes();
if(!isset($attr['expires'])){$attr['expires']=$l->getYear().'-12-31';}
if(!isset($attr['given'])){$attr['given']=$l->getYear().'-01-01';}
$exp=new \DateTime($attr['expires']);
$given=new \DateTime($attr['given']);
$left=$l->getLeaveLeft();
$day=$days;
if($days > $left){$day=$left;}
$ld=count($leavedata);
$tmpleave['l'.$l->getId()]=$ld;
$leavedata[$ld]=array();
$leavedata[$ld]['id']=$l->getId();
$leavedata[$ld]['year']=$l->getYear();
$leavedata[$ld]['type']=$l->getLeaveType()->getLeaveName();
$leavedata[$ld]['label']=str_replace('year','',$attr['label']);
$leavedata[$ld]['priority']=0;
$leavedata[$ld]['parent']=0;
$leavedata[$ld]['typeid']=$l->getLeaveType()->getId();
$leavedata[$ld]['maxuse']=$left;
$leavedata[$ld]['maxday']=$left;
$leavedata[$ld]['use']=0;
$leavedata[$ld]['left']=0;
$leavedata[$ld]['realleft']=0;
$leavedata[$ld]['followparent']=isset($attr1['followParent'])?$attr1['followParent']:false;
$leavedata[$ld]['total']=$l->getLeaveEntitlements();
$leavedata[$ld]['useuse']=true;
if($leavedata[$ld]['type']=='annual'){$leavedata[$ld]['useuse']=false;$leavedata[$ld]['maxday']=$days;}
if(!is_null($l->getParent())){
if($l->getParent()!=0){
$leavedata[$ld]['parent']=$l->getParent();
}
}
$leavedata[$ld]['expire']=$exp->format('Y-m-d');
$leavedata[$ld]['given']=$attr['given'];
$leavedata[$ld]['madatory']=false;
if(isset($attr['followParent'])){
$leavedata[$ld]['madatory']=true;
}
}
if(!empty($back)){
foreach($back as $k=>$v){
switch($k){
case 'data':
break;
case 'child':
if(is_array($v) || is_object($v)){
foreach($v as $cyr=>$vc){
foreach($vc as $kcid=>$vc1){
$cid=substr($kcid,1,strlen($kcid)-1);
foreach($leavedata as $k1 => $v1){
if($v1['id']==intval($cid)){
$leavedata[$k1]['left']+=$vc1;
$leavedata[$k1]['realleft']+=$vc1;
if($leavedata[$k1]['realleft'] <= $days){
$leavedata[$k1]['maxuse']=$leavedata[$k1]['realleft'];
}
}
}
}
}
}
break;
default:
if(substr($k,0,1)=='y'){
$yr=intval(substr($k,1,strlen($k)-1));
foreach($leavedata as $k1 => $v1){
if(($v1['year']==$yr) && ($v1['typeid']==$leavetype->getId())){
$leavedata[$k1]['left']+=$v;
$leavedata[$k1]['realleft']+=$v;
if($leavedata[$k1]['realleft'] <= $days){
$leavedata[$k1]['maxuse']=$leavedata[$k1]['realleft'];
}
}
}
}
}
}
}
foreach($leavedata as $kl=>$l){
$gv=new \DateTime($l['given']);
$ex=new \DateTime($l['expire']);
if($l['followparent']){
$ok=false;
if(($startdate <= $gv) && ($enddate >= $gv)){$ok=true;}
if(($startdate >= $gv) && ($startdate <= $ex)){$ok=true;}
if($ok){
$leavedata[$kl]['left']+=$entbyid['l'.$l['id']]->getLeaveLeft();
$leavedata[$kl]['realleft']+=$entbyid['l'.$l['id']]->getLeaveLeft();
}else{
$leavedata[$tmpleave['l'.$l['parent']]]['left']-=($entbyid['l'.$l['id']]->getLeaveEntitlements()-$entbyid['l'.$l['id']]->getLeaveLeft());
$leavedata[$tmpleave['l'.$l['parent']]]['realleft']-=($entbyid['l'.$l['id']]->getLeaveEntitlements()-$entbyid['l'.$l['id']]->getLeaveLeft());
}
}else{
$ok=false;
if(($startdate <= $gv) && ($enddate >= $gv)){$ok=true;}
if(($startdate >= $gv) && ($startdate <= $ex)){$ok=true;}
if($ok){
$leavedata[$kl]['left']+=$entbyid['l'.$l['id']]->getLeaveLeft();
$leavedata[$kl]['realleft']+=$entbyid['l'.$l['id']]->getLeaveLeft();
if($l['parent']!=0){
$leavedata[$tmpleave['l'.$l['parent']]]['left']+=$entbyid['l'.$l['id']]->getLeaveLeft();
}
}else{
$leavedata[$kl]['left']+=0;
}
}
}
$parentid=array();
foreach($leavedata as $kl=>$l){
$gv=new \DateTime($l['given']);
$ex=new \DateTime($l['expire']);
if($l['typeid']==$leavetype->getID()){
$parentid[count($parentid)]=$l['id'];
}
}
foreach($leavedata as $kl=>$l){
$gv=new \DateTime($l['given']);
$ex=new \DateTime($l['expire']);
$ok=false;
if(($startdate <= $gv) && ($enddate >= $gv)){$ok=true;}
if(($startdate >= $gv) && ($startdate <= $ex)){$ok=true;}
if($leavedata[$kl]['typeid']!=$leavetype->getID()){$ok=false;}
if(in_array($leavedata[$kl]['parent'],$parentid)){
if(($startdate <= $gv) && ($enddate >= $gv)){$ok=true;}
if(($startdate >= $gv) && ($startdate <= $ex)){$ok=true;}
}
if(!$ok){
unset($leavedata[$kl]);
}
}
$leavedata=array_values($leavedata);
foreach($leavedata as $k=> $l){
if($l['maxuse'] > $l['realleft']){$leavedata[$k]['maxuse']=$l['realleft'];}
if($l['use'] > $l['realleft']){$leavedata[$k]['use']=$l['realleft'];}
if($l['maxuse']<=0){
if($l['realleft'] <= $days){
$leavedata[$k]['maxuse']=$l['realleft'];
}else{
$leavedata[$k]['maxuse']=$days;
}
}
if($l['typeid']==$leavetype->getId()){
$leavelist['realLeft']=$l['realleft'];
}
}
}
return $leavedata;
}
function sugestion($option=array()){
$em=$this->entityManager;
$opt=array(
'startDate'=>'',
'endDate'=>'',
'now' => date('Y-m-d'),
'am' => null,
'pm' => null,
'leave'=>null,
'user'=>null,
'id'=>null,
'keepunpaid'=>true,
'request'=>null
);
//initial value
foreach($option as $k=>$v){$opt[$k]=$v;}
$leavelist = array();
$leavelist['days'] = 0;
$leavelist['modif'] = 0;
$leavelist['unpaid']=array();
$leavelist['blackout']=array();
$leavelist['realLeft']=0;
$leavelist['totalLeft']=0;
$leavelist['totalUnpaid']=0;
$leavelist['dummy']=array();
/*if(!is_null($opt['id'])){
$rq=$em->getRepository(\App\Entity\LeaveType::class)->find($opt['id']);
if(!is_null($rq)){
$opt['leave']=$rq->getLeaveType();
$opt['user']=$rq->getUser();
$opt['startDate']=$rq->getStartDate()->format('Y-m-d');
$opt['endDate']=$rq->getEndDate()->format('Y-m-d');
$opt['am']=$rq->getIsHalfStart();
$opt['pm']=$rq->getIsHalfEnd();
}
}*/
//check for request;
$back=array();
$backdays=999;
if($opt['request']!=null){
$leaverequest=$em->getRepository(\App\Entity\LeaveRequest::class)->findBy(array('id'=>$opt['request']));
if(is_array($leaverequest) || is_object($leaverequest)){
foreach($leaverequest as $r){
$back=$r->getAlocation();
if(is_null($opt['leave'])){$opt['leave']=$r->getLeaveType();}
if(is_null($opt['user'])){$opt['user']=$r->getUser();}
if($opt['startDate']==''){$opt['startDate']=$r->getStartDate()->format('Y-m-d');}
if($opt['endDate']==''){$opt['endDate']=$r->getEndDate()->format('Y-m-d');}
if($opt['am']==null){$opt['am']=$r->getIsHalfStart();}
if($opt['pm']==null){$opt['pm']=$r->getIsHalfEnd();}
$backdays=$r->getDays();
}
}
}
if($opt['startDate']==''){$opt['startDate']= date('Y-m-d');}
if($opt['endDate']==''){$opt['endDate']= date('Y-m-d');}
if($opt['am']==null){$opt['am']=false;}
if($opt['pm']==null){$opt['pm']=false;}
if(is_null($opt['leave'])){return $leavelist;}
if(is_null($opt['user'])){return $leavelist;}
$oldcarry=9999;
//calculate leave duration
$startdate = new \DateTime($opt['startDate']);
$enddate = new \DateTime($opt['endDate']);
$datego=new \DateTime($opt['startDate']);
$daterange = $startdate->diff($enddate);
$daterange = $daterange->format('%a');
$daterange = $daterange + 1;
$totalget=$daterange;
if($opt['am']==true){$totalget-=0.5;}
if($opt['pm']==true){$totalget-=0.5;}
//get leave range from db
$minyear = 999999;
$maxyear = 0;
$yr = $datego->format('Y');
if ($minyear >= $yr) { $minyear = $yr; }
if ($maxyear <= $yr) { $maxyear = $yr; }
if ($daterange > 1) {
$dtx=new \DateTime($startdate->format('Ymd'));
for ($i = 1; $i < $daterange; $i++) {
$dtx = $dtx->modify('+1 day');
$yr = $dtx->format('Y');
if ($minyear >= $yr) {
$minyear = $yr;
}
if ($maxyear <= $yr) {
$maxyear = $yr;
}
}
}
$yearlist = array();
$minyear = $minyear - 1;
$maxyear = $maxyear + 1;
for ($y = $minyear; $y <= $maxyear; $y++) { $yearlist[count($yearlist)] = $y;}
//check for child type
$leavetypes=array($opt['leave']->getId());
$childtype=array();
$childtype['c'.$opt['leave']->getId()]=clone($opt['leave']);
$leavetypechild = $em->getRepository(\App\Entity\LeaveType::class)->findBy(array('parent' => $opt['leave']->getId()));
if(is_array($leavetypechild)){
foreach($leavetypechild as $c){
$childtype['c'.$c->getId()]=clone($c);
$leavetypes[count($leavetypes)]=$c->getId();
}
}
//get leave entelitement list
$leaveent = $em->getRepository(\App\Entity\LeaveEntitlement::class)->findBy(array('user' => $opt['user'], 'leaveType' => $leavetypes, 'year' => $yearlist));
$entbyid=array();
$leavedata=array();
$carry=array();
if(is_array($leaveent)){
//list atlitement by id
foreach($leaveent as $l){
$entbyid['l'.$l->getId()]=$l;
}
//list carry
foreach($leaveent as $l){
$attr=$l->getAttributes();
$attrtype=$childtype['c'.$l->getLeaveType()->getId()]->getAttributes();
$attr=array_merge($attr,$attrtype);
//followParent this a carry
if(isset($attr['followParent'])){
//set parent carry data
$parentid=$l->getParent();
if(!isset($carry['l'.$parentid])){
$carry['l'.$parentid]=array();
$carry['l'.$parentid]['leaves']=array();
$carry['l'.$parentid]['total']=0;
$carry['l'.$parentid]['expire']='1970-01-01';
}
$carry['l'.$parentid]['leaves'][count($carry['l'.$parentid]['leaves'])]=$l->getID();
$carry['l'.$parentid]['total']+=$l->getLeaveEntitlements();
$carrydate=new \DateTime ($carry['l'.$parentid]['expire']);
$exp=new \DateTime($l->getYear().'-12-31');
if(isset($attr['expires'])){$exp=new \DateTime($attr['expires']);}
if(floatval($exp->format('Ymd')) >= floatval($carrydate->format('Ymd'))){
$carry['l'.$parentid]['expire']=$exp->format('Y-m-d');
}
}
}
//stating here
$tmpleave=array();
foreach($leaveent as $l){
if($l->getYear() <= floatval(date('Y'))){
$attr=$l->getAttributes();
$attr1=$l->getAttributes();
$attrtype=$childtype['c'.$l->getLeaveType()->getId()]->getAttributes();
$attr=array_merge($attr,$attrtype);
if(!isset($attr['expires'])){$attr['expires']=$l->getYear().'-12-31';}
if(!isset($attr['given'])){$attr['given']=$l->getYear().'-01-01';}
$exp=new \DateTime($attr['expires']);
$given=new \DateTime($attr['given']);
$ld=count($leavedata);
$tmpleave['l'.$l->getId()]=$ld;
$leavedata[$ld]=array();
$leavedata[$ld]['id']=$l->getId();
$leavedata[$ld]['year']=$l->getYear();
$leavedata[$ld]['type']=$l->getLeaveType()->getLeaveName();
$leavedata[$ld]['label']=str_replace('year','',$attr['label']);
$leavedata[$ld]['priority']=0;
$leavedata[$ld]['parent']=0;
$leavedata[$ld]['typeid']=$l->getLeaveType()->getId();
$leavedata[$ld]['maxuse']=0;
$leavedata[$ld]['maxday']=0;
$leavedata[$ld]['use']=0;
$leavedata[$ld]['left']=0;
$leavedata[$ld]['dleft']=0;
$leavedata[$ld]['xleft']=0;
$leavedata[$ld]['realleft']=0;
$leavedata[$ld]['followparent']=isset($attr1['followParent'])?$attr1['followParent']:false;
$leavedata[$ld]['total']=$l->getLeaveEntitlements();
$leavedata[$ld]['useuse']=true;
$leavedata[$ld]['totalunpaid']=0;
$leavedata[$ld]['dates']=array();
if($leavedata[$ld]['type']=='annual'){$leavedata[$ld]['useuse']=false;}
if(!is_null($l->getParent())){
if($l->getParent()!=0){
$leavedata[$ld]['parent']=$l->getParent();
}
}
$leavedata[$ld]['expire']=$exp->format('Y-m-d');
//$extexpire=new \DateTime($exp->format('Y-m-d'));
/*if(isset($attr['extexpire'])){
$extexpire->modify('+1 day');
$leavedata[$ld]['expire']=$extexpire->format('Y-m-d');
}*/
$leavedata[$ld]['given']=$attr['given'];
//$leavedata[$ld]['left']=$l->getLeaveLeft();
$leavedata[$ld]['madatory']=false;
if(isset($attr['followParent'])){
$leavedata[$ld]['madatory']=true;
/*$total=$l->getLeaveEntitlements();
$parentleft=$entbyid['l'.$l->getParent()]->getLeaveLeft();
if($parentleft < $total){
$leavedata[$ld]['left']=$leavedata[$ld]['left']-($total - $parentleft);
}*/
}
if(isset($carry['l'.$l->getId()])){
$leavedata[$ld]['priority']=-1;
}
//$leavedata[$ld]['realleft']=$leavedata[$ld]['left']*1;
//$leavelist['realLeft']+=($leavedata[$ld]['left']*1);
}
}
//return back if has request
if(!empty($back)){
foreach($back as $k=>$v){
switch($k){
case 'data':
break;
case 'child':
if(is_array($v)){
foreach($v as $cyr=>$vc){
foreach($vc as $kcid=>$vc1){
$cid=substr($kcid,1,strlen($kcid));
foreach($leavedata as $k1 => $v1){
if($v1['id']==$cid){
$leavedata[$k1]['left']+=$vc1;
$leavedata[$k1]['realleft']+=$vc1;
$leavedata[$k1]['dleft']+=$vc1;
$leavedata[$k1]['xleft']+=$vc1;
if(($leavedata[$k1]['parent']!==0) && ($leavedata[$k1]['followparent']!==true)){
foreach($leavedata as $kpr=>$vpr){
if($vpr['id']===$leavedata[$k1]['parent']){
$leavedata[$kpr]['xleft']+=$vc1;
break;
}
}
}
if(($leavedata[$k1]['realleft'] <= $backdays) && ($leavedata[$k1]['followparent']!==true)) {
$leavedata[$k1]['maxuse']=$leavedata[$k1]['realleft'];
}
}
}
}
}
}
break;
default:
if(substr($k,0,1)=='y'){
$yr=intval(substr($k,1,strlen($k)-1));
foreach($leavedata as $k1 => $v1){
if(($v1['year']==$yr) && ($v1['typeid']==$opt['leave']->getId())){
$leavedata[$k1]['left']+=$v;
$leavedata[$k1]['dleft']+=$v;
$leavedata[$k1]['realleft']+=$v;
$leavedata[$k1]['xleft']+=$v;
if($leavedata[$k1]['realleft'] <= $backdays){
$leavedata[$k1]['maxuse']=$leavedata[$k1]['realleft'];
}
}
}
}
}
}
}
foreach($leavedata as $kl=>$l){
$gv=new \DateTime($l['given']);
$ex=new \DateTime($l['expire']);
if($l['followparent']){
$ok=false;
if(($startdate <= $gv) && ($enddate >= $gv)){$ok=true;}
if(($startdate >= $gv) && ($startdate <= $ex)){$ok=true;}
if($ok){
$parentleft=$entbyid['l'.$l['parent']]->getLeaveLeft();
if($parentleft > $entbyid['l'.$l['id']]->getLeaveEntitlements()){
$parentleft=$entbyid['l'.$l['id']]->getLeaveEntitlements();
}
$carryuse=($entbyid['l'.$l['id']]->getLeaveEntitlements()-$entbyid['l'.$l['id']]->getLeaveLeft());
$carryleft=$parentleft-$carryuse;
if($carryleft < 0){$carryleft=0;}
$leavedata[$kl]['left']+=$carryleft;
$leavedata[$kl]['dleft']+=$carryleft;
$leavedata[$kl]['realleft']+=$carryleft;
$leavedata[$kl]['xleft']+=$carryleft;
}else{
$leavedata[$tmpleave['l'.$l['parent']]]['left']-=($entbyid['l'.$l['id']]->getLeaveEntitlements()-$entbyid['l'.$l['id']]->getLeaveLeft());
$leavedata[$tmpleave['l'.$l['parent']]]['dleft']-=($entbyid['l'.$l['id']]->getLeaveEntitlements()-$entbyid['l'.$l['id']]->getLeaveLeft());
$leavedata[$tmpleave['l'.$l['parent']]]['realleft']-=($entbyid['l'.$l['id']]->getLeaveEntitlements()-$entbyid['l'.$l['id']]->getLeaveLeft());
$leavedata[$tmpleave['l'.$l['parent']]]['xleft']-=($entbyid['l'.$l['id']]->getLeaveEntitlements()-$entbyid['l'.$l['id']]->getLeaveLeft());
}
}else{
$ok=false;
if(($startdate <= $gv) && ($enddate >= $gv)){$ok=true;}
if(($startdate >= $gv) && ($startdate <= $ex)){$ok=true;}
if($ok){
$leavedata[$kl]['left']+=$entbyid['l'.$l['id']]->getLeaveLeft();
$leavedata[$kl]['realleft']+=$entbyid['l'.$l['id']]->getLeaveLeft();
$leavedata[$kl]['xleft']+=$entbyid['l'.$l['id']]->getLeaveLeft();
$leavedata[$kl]['dleft']+=$entbyid['l'.$l['id']]->getLeaveLeft();
if($l['parent']!=0){
//$leavedata[$tmpleave['l'.$l['parent']]]['left']+=$entbyid['l'.$l['id']]->getLeaveLeft();
$leavedata[$tmpleave['l'.$l['parent']]]['xleft']+=$entbyid['l'.$l['id']]->getLeaveLeft();
}
}else{
$leavedata[$kl]['left']+=0;
}
}
}
//print_r(json_encode($leavedata));
//die();
foreach($leavedata as $kl=>$l){
$gv=new \DateTime($l['given']);
$ex=new \DateTime($l['expire']);
$ok=false;
if(($startdate <= $gv) && ($enddate >= $gv)){$ok=true;}
if(($startdate >= $gv) && ($startdate <= $ex)){$ok=true;}
if(!$ok){
unset($leavedata[$kl]);
}
}
$leavedata=array_values($leavedata);
}
//check for holiday
$country = $opt['leave']->getOffice()->getCountry();
$holidayrp = $em->getRepository(\App\Entity\LeaveBankHoliday::class)->findBy(array('location' => $country));
$holiday = array();
foreach ($holidayrp as $h) {
$dt = $h->getDate()->format('Y-m-d');
$dte = $h->getEndDate();
if(!is_null($dte)){
$dte=new \DateTime($h->getEndDate()->format('Y-m-d'));
$dtex=new \DateTime($h->getDate()->format('Y-m-d'));
while($dtex <= $dte){
$holiday[count($holiday)] = $dtex->format('Y-m-d');
$dtex->modify('+1 day');
}
}else{
$holiday[count($holiday)] = $dt;
}
}
//print_r($leavedata);
//general
$offday = array(0, 6);
$leavelist['startDate']=$opt['startDate'];
$leavelist['endDate']=$opt['endDate'];
//start calculte
for ($d = 0; $d < $daterange; $d++) {
$dd=$datego->format('Y-m-d'); //date that will be calculate
$requestday=1; //defaut request 1 day leave
if(($opt['am']==true) && ($d==0)){$requestday=0.5;} // cut 0.5 of start date if am request
if(($opt['pm']==true) && ($d == ($daterange-1))){$requestday=0.5;} // cut 0.5 of start date if pm request
$week= $datego->format('w');
if (in_array($week, $offday)) {$requestday=0;} //dont calculate if weekend
if (in_array($dd, $holiday)) {
$requestday=0;
} //dont calculate holiday
if($requestday!=0){
$leavelist['dummy'][]=$dd;
//get maximum use of leave data
foreach($leavedata as $kd=>$ld){
if($ld['realleft'] > 0){
$given=new \DateTime($ld['given']);
$given=floatval($given->format('Ymd'));
$exp=new \DateTime($ld['expire']);
$exp=floatval($exp->format('Ymd'));
$floatdd=new \DateTime($dd);
$floatdd=floatval($floatdd->format('Ymd'));
if(($floatdd >= $given) && ($floatdd <= $exp)){
$max=$ld['maxuse']+$requestday;
if($max < $ld['realleft']){$leavedata[$kd]['maxuse']=$max;}else{$leavedata[$kd]['maxuse']+=$ld['realleft'];}
//print_r($kd.'=>'.$max.'=>'.$ld['left']."\n");
}
}
}
//create sugestion
$currentyear=$datego->format('Y');
$leaveuse=array();
foreach($leavedata as $kd=>$ld){
if(floatval($ld['year']) <= floatval(date('Y'))){
if($ld['realleft'] > 0){
/*if(isset($carry['l'.$ld['id']])){
if($ld['realleft'] <= $carry['l'.$ld['id']]['total']){
$ld['expire']=$carry['l'.$ld['id']]['expire'];
}
}*/
$given=new \DateTime($ld['given']);
$given=floatval($given->format('Ymd'));
$exp=new \DateTime($ld['expire']);
$exp=floatval($exp->format('Ymd'));
$floatdd=new \DateTime($dd);
$floatdd=floatval($floatdd->format('Ymd'));
if(($floatdd >= $given) && ($floatdd <= $exp)){
$cll=count($leaveuse);
$leaveuse[$cll]=array();
$leaveuse[$cll]['index']=$kd;
$leaveuse[$cll]['value']=$ld;
if($ld['followparent']===true){
foreach($leavedata as $xld){
if($ld['parent']===$xld['id']){
/*if($xld['left'] < $leaveuse[$cll]['value']['left']){
$leaveuse[$cll]['value']['left']=$xld['left'];
$leavedata[$kd]['dleft']=$xld['left'];
}*/
if($xld['dleft'] < $ld['dleft']){
$leavedata[$kd]['dleft']=$xld['dleft'];
}
if($xld['dleft'] < $leaveuse[$cll]['value']['left']){
$leaveuse[$cll]['value']['left']=$xld['dleft'];
}
}
}
}
}
}
}
}
usort($leaveuse,function($a,$b){
if(isset($a['value']['expire']) && isset($b['value']['expire'])){
$aa=new \DateTime($a['value']['expire']);
$bb=new \DateTime($b['value']['expire']);
$ax=floatval($aa->format('Ymd'));
$bx=floatval($bb->format('Ymd'));
if($ax!=$bx){return $ax > $bx;}else{
return 0;
//return $b['value']['priority'] < $a['value']['priority'];
}
}
return 0;
});
$rqday=$requestday;
//set allocation value
/*for($l=0;$l<count($leaveuse);$l++){
if($leaveuse[$l]['value']['followparent']===true){
for($p=0;$p<count($leaveuse);$p++){
if($leaveuse[$l]['value']['parent']===$leaveuse[$p]['value']['id']){
if($leaveuse[$p]['value']['left'] < $leaveuse[$l]['value']['left']){
$leaveuse[$l]['value']['left']=$leaveuse[$p]['value']['left'];
}
break;
}
}
}
}*/
$luse=0;
$leaveuselimit=count($leaveuse);
while(($rqday > 0) && ($luse < $leaveuselimit)){
$get=$rqday;
if($leavedata[$leaveuse[$luse]['index']]['dleft'] > 0){
if($leaveuse[$luse]['value']['left'] < $rqday){
$get=$leaveuse[$luse]['value']['left'];
}
$leavedata[$leaveuse[$luse]['index']]['left']-=$get;
$leavedata[$leaveuse[$luse]['index']]['dleft']-=$get;
$leaveuse[$luse]['value']['left']-=$get;
$rqday-=$get;
$leavedata[$leaveuse[$luse]['index']]['use']+=$get;
}
if($rqday > 0){$luse++;}
if($rqday < 1){
$leavedata[$leaveuse[$luse]['index']]['dates'][count($leavedata[$leaveuse[$luse]['index']]['dates'])]=$dd;
}
}
//unpaid
if($rqday > 0){
foreach($leaveuse as $lk=>$lu){
if($lu['value']['typeid']==$opt['leave']->getId()){
$leavedata[$lu['index']]['totalunpaid']+=$rqday;
break;
}
}
if(!isset($leavelist['unpaid']['y'.$currentyear])){
$leavelist['unpaid']['y'.$currentyear]=array();
$leavelist['unpaid']['y'.$currentyear]['data']=array();
$leavelist['unpaid']['y'.$currentyear]['value']=0;
}
$leavelist['unpaid']['y'.$currentyear]['value']+=$rqday;
$unpaidtotal=count($leavelist['unpaid']['y'.$currentyear]['data']);
$leavelist['unpaid']['y'.$currentyear]['data'][$unpaidtotal]=array();
$leavelist['unpaid']['y'.$currentyear]['data'][$unpaidtotal]['date']=$dd;
$leavelist['unpaid']['y'.$currentyear]['data'][$unpaidtotal]['value']=$rqday;
}
$leavelist['days']+=$requestday;
$leavelist['modif']+=$requestday;
$leavelist['totalUnpaid']+=$rqday;
}else{
$leavelist['blackout'][count($leavelist['blackout'])]=$dd;
}
foreach($leavedata as $kd=>$ld){
if($leavedata[$kd]['left'] < $leavedata[$kd]['use']){$leavedata[$kd]['maxuse']=$leavedata[$kd]['left'] + $leavedata[$kd]['use'];}
if($leavedata[$kd]['maxuse'] > $leavelist['days']){$leavedata[$kd]['maxuse']=$leavelist['days'];}
if($leavedata[$kd]['realleft'] < $leavedata[$kd]['use']){$leavedata[$kd]['use']=$leavedata[$kd]['realleft'];}
if($leavedata[$kd]['realleft'] < $leavedata[$kd]['maxuse']){$leavedata[$kd]['maxuse']=$leavedata[$kd]['realleft'];}
$leavedata[$kd]['maxday']=$leavelist['days'];
}
//goto next day
$datego = $datego->modify('+1 day');
}
$leavelist['realLeft']=0;
foreach($leavedata as $k=> $l){
if($l['maxuse'] > $l['realleft']){$leavedata[$k]['maxuse']=$l['realleft'];}
if($l['use'] > $l['realleft']){$leavedata[$k]['use']=$l['realleft'];}
if($l['useuse']){
if($l['maxday'] > $l['realleft']){$leavedata[$k]['maxday']=$l['realleft'];}
}
if($l['maxuse']<=0){
if($l['realleft'] <= $leavelist['days']){
$leavedata[$k]['maxuse']=$l['realleft'];
}else{
$leavedata[$k]['maxuse']=$leavelist['days'];
}
}
if($l['typeid']==$opt['leave']->getId()){
//$leavelist['realLeft']+=$l['xleft'];
}
if($l['followparent']){
if($l['year']!=date('Y')){
$leavelist['realLeft']+=$l['xleft'];
}
}else{
$leavelist['realLeft']+=$l['xleft'];
}
}
if($leavelist['realLeft'] <=0 ){
foreach($leavedata as $k=> $l){
$leavelist['realLeft']+=$l['xleft'];
}
}
$leavedata=array_values(array_filter($leavedata,function($l){return ($l['maxuse'] > 0);}));
$leavelist['totalLeft']=$leavelist['realLeft']-$leavelist['days'];
if($leavelist['totalLeft'] < 0){
$leavelist['totalUnpaid']=abs($leavelist['totalLeft']);
$leavelist['totalLeft']=0;
/*foreach($leavedata as $k=>$l){
if($l['typeid']==$opt['leave']->getId()){
$leavedata[$k]['use']=$leavedata[$k]['use'];
}
}*/
}
//put original use
if(!empty($back)){
//$leavelist['days']=0;
$totaldays=0;
foreach($back as $k=>$v){
switch($k){
case 'data':
break;
case 'child':
if(is_array($v)){
foreach($v as $cyr=>$vc){
foreach($vc as $kcid=>$vc1){
$cid=substr($kcid,1,strlen($kcid));
foreach($leavedata as $k1 => $v1){
if($v1['id']==$cid){
$leavedata[$k1]['use']=$vc1;
$totaldays+=$vc1;
}
}
}
}
}
break;
default:
if(substr($k,0,1)=='y'){
$yr=intval(substr($k,1,strlen($k)-1));
foreach($leavedata as $k1 => $v1){
if(($v1['year']==$yr) && ($v1['typeid']==$opt['leave']->getId())){
$leavedata[$k1]['use']=$v;
$totaldays+=$v;
}
}
}
}
}
$leavelist['totalUnpaid']=$leavelist['days']-$totaldays;
if($leavelist['totalUnpaid'] < 0){$leavelist['totalUnpaid']=0;}
$leavelist['totalLeft']=$leavelist['realLeft']-$totaldays;
if($leavelist['totalLeft'] < 0){$leavelist['totalLeft']=0;}
}
$leavelist['data']=$leavedata;
$leavelist['request']=$back;
return $leavelist;
}
function mc_send_email($id){
$result=array();
$em=$this->entityManager;
$request=$em->getRepository(LeaveRequest::class)->find($id);
if($request!=null){
$name=$request->getUser()->getPersonalInfo()->getFirstName().' '.$request->getUser()->getPersonalInfo()->getLastName();
$date=$request->getStartDate()->format('d M Y');
$sdate=$request->getStartDate()->format('Ymd');
$edate=$request->getEndDate()->format('Ymd');
if($sdate != $edate){
$date.= 'until '.$request->getEndDate()->format('d M Y');
}
$days = $request->getDays();
$rdate=new \DateTime($request->getEndDate()->format('Y-m-d'));
$rdate->modify('+1 day');
$rdate=$rdate->format('d M Y');
$takeover='';
$task='';
$subject='Sick Leave Application - '.$name;
$emailTemplate = 'email/user-notification/leave/mc.html.twig';
$to=array('very.sukawirawan@mediatropy.com');
$this->mailgunService->sendEmail(
$subject,
$to,
$emailTemplate,
[
'name' => $name,
'date' => $date,
'days' => $days,
'returndate' => $rdate,
'takeover'=>$takeover,
'task'=>$task
],
false
);
$result['name']=$name;
$result['test']=$date;
$result['return']=$rdate;
}
return $result;
}
}