myLogger = \Config\Services::mylogger(); $this->userModel = new UserModel(); $this->planModel = new PlanModel(); $this->flightModel = new FlightModel(); $this->flightTripsModel = new FlightTripsModel(); $this->accomodationModel = new AccomodationModel(); $this->busModel = new BusModel(); $this->insuranceModel = new InsuranceModel(); $this->miscellaneousModel = new MiscellaneousModel(); $this->taxiModel = new TaxiModel(); $this->trainModel = new TrainModel(); $this->visaModel = new VisaModel(); $this->forexModel = new ForexModel(); $this->forexPerdiemModel = new ForexPerdiemModel(); $this->planStatusModel = new PlanStatusModel(); $this->organizationModel = new OrganizationModel(); $this->planRemarkModel = new PlanRemarkModel(); $this->userVisaDetailsModel = new UserVisaDetailsModel(); $this->mailTemplateModel = new MailTemplateModel(); $this->reportsModel = new ReportsModel(); } public function index() { $org_id = $this->request->getGet('org_id'); $user_id = $this->request->getVar('user_id'); if (isset($user_id)) { $plans = $this->planModel->getActivePlan($org_id, 'USER', $user_id); }else{ $plans = $this->planModel->getActivePlan($org_id); } if (!$plans) { return $this->respond(['status' => 200,'message' => 'failed','data' => 'No Plans found']); } return $this->respond(['status' => 200,'message' => 'success','data' => $plans]); } public function findApprovalList() { $org_id = $this->request->getGet('org_id'); $user_id = $this->request->getVar('user_id'); $userData = $this->userModel->where('user_id',$user_id)->first(); $userName = $userData['first_name'].' '.$userData['last_name']; $a1Data = $this->planStatusModel->select('plan_id')->where('a1_id',$user_id)->where('a1_action','Approval')->where('is_active',1)->findAll(); $a2Data = $this->planStatusModel->select('plan_id')->where('a2_id',$user_id)->where('a2_action','Approval')->where('is_active',1)->findAll(); $a3Data = $this->planStatusModel->select('plan_id')->where('a3_id',$user_id)->where('a3_action','Approval')->where('is_active',1)->findAll(); $a4Data = $this->planStatusModel->select('plan_id')->where('a4_id',$user_id)->where('a4_action','Approval')->where('is_active',1)->findAll(); $mergedArray = array_merge($a1Data, $a2Data, $a3Data, $a4Data); $planIds = array_unique(array_column($mergedArray, "plan_id")); $plans = []; if (count($planIds)) { $plans = $this->planModel->getActivePlan($org_id, 'APPROVAL', $user_id , $planIds); if (!$plans) { return $this->respond(['status' => 200,'message' => 'failed','data' => 'No Plans found']); } foreach ($plans as &$plan) { $plan['approver_id'] = $user_id; $plan['approver_name'] = 'Self'; $plan['delegater_id'] = 0; $plan['approver_status'] = getApproverCurrentAction( $plan['plan_id'], $user_id ); } unset($plan); } $delecatedPlans = getDelegatedPlans($org_id, $user_id); $mergedArray = array_merge($plans , $delecatedPlans); if(empty($mergedArray)){ return $this->respond(['status' => 200,'message' => 'success','data' => []]); } return $this->respond(['status' => 200,'message' => 'success','data' => $mergedArray]); } public function findTravelAgentPlanList() { $org_id = $this->request->getGet('org_id'); $user_id = $this->request->getVar('user_id'); $userData = $this->userModel->where('user_id', $user_id)->first(); // var_dump($userData['agent_supported_service_ids']); // dd(json_decode($userData['agent_supported_service_ids'])); if($userData['agent_supported_service_ids'] != null) { $S1Data = $S2Data = $S3Data = $S4Data = $S5Data = $S6Data = $S7Data = $S8Data = $S9Data = []; foreach (json_decode($userData['agent_supported_service_ids'],true) as $Servicekey => $Servicevalue) { if($Servicevalue['service_id'] == 1) { $S1Data = $this->flightModel->select('plan_id')->distinct()->where('is_active',1)->findAll(); }else if($Servicevalue['service_id'] == 2) { $S2Data = $this->trainModel->select('plan_id')->distinct()->where('is_active',1)->findAll(); }else if($Servicevalue['service_id'] == 3) { $S3Data = $this->busModel->select('plan_id')->distinct()->where('is_active',1)->findAll(); }else if($Servicevalue['service_id'] == 4) { $S4Data = $this->taxiModel->select('plan_id')->distinct()->where('is_active',1)->findAll(); }else if($Servicevalue['service_id'] == 5) { $S5Data = $this->accomodationModel->select('plan_id')->distinct()->where('is_active',1)->findAll(); }else if($Servicevalue['service_id'] == 6) { $S6Data = $this->forexModel->select('plan_id')->distinct()->where('is_active',1)->findAll(); }else if($Servicevalue['service_id'] == 7) { $S7Data = $this->insuranceModel->select('plan_id')->distinct()->where('is_active',1)->findAll(); }else if($Servicevalue['service_id'] == 8) { $S8Data = $this->visaModel->select('plan_id')->distinct()->where('is_active',1)->findAll(); }else if($Servicevalue['service_id'] == 9) { $S9Data = $this->miscellaneousModel->select('plan_id')->distinct()->where('is_active',1)->findAll(); } } $mergedArray = array_merge($S1Data, $S2Data, $S3Data, $S4Data, $S5Data, $S6Data, $S7Data, $S8Data, $S9Data); $planIds = array_unique(array_column($mergedArray, "plan_id")); if (empty($planIds)) { return $this->respond(['status' => 200,'message' => 'failed','data' => 'No Plans found']); } $plans = $this->planModel->getActivePlan($org_id, 'AGENT', $user_id , $planIds); if (!$plans) { return $this->respond(['status' => 200,'message' => 'failed','data' => 'No Plans found']); } return $this->respond(['status' => 200,'message' => 'success','data' => $plans]); }else{ return $this->respond(['status' => 200,'message' => 'failed','data' => 'Service not mapped to the agent.']); } } public function find($planId = null , $callFrom = 'client') { // Fetch the plan $plan = $this->planModel->select( 'm_plan.*, CONCAT_WS(U.first_name," ",U.last_name) as user_name, CONCAT_WS(C.first_name," ",C.last_name) as plan_created_by, CONCAT_WS(T.first_name," ",T.last_name) as traveller_name, TS.status_value, TT.dropdown_value as trip_type_value, IB.dropdown_value as is_billable_value, POT.dropdown_value as purpose_of_travel_value, FD.dropdown_value as functional_department_value, Dep.name as cost_center_value' ) ->join('m_users U', 'U.user_id = m_plan.user_id ', 'left') ->join('m_users C', 'C.user_id = m_plan.created_by ', 'left') ->join('m_traveller T', 'T.traveller_id = m_plan.traveller_id ', 'left') ->join('m_travel_statuses TS', 'TS.id = m_plan.status ', 'left') ->join('m_dropdown TT', 'TT.dropdown_key = m_plan.trip_type AND TT.dropdown = "plan_trip_type"', 'left') ->join('m_dropdown IB', 'IB.dropdown_key = m_plan.is_billable AND IB.dropdown = "plan_is_billable"', 'left') ->join('m_dropdown POT', 'POT.dropdown_key = m_plan.purpose_of_travel AND POT.dropdown = "plan_purpose_of_travel"', 'left') ->join('m_dropdown FD', 'FD.dropdown_key = m_plan.functional_department AND FD.dropdown = "plan_functional_department"', 'left') ->join('m_department Dep', 'Dep.department_id = m_plan.cost_center_id ', 'left') ->where('m_plan.is_active', 1) ->find($planId); if ($plan) { //get flight details $flights = $this->flightModel->where('plan_id', $planId)->where('is_active', 1)->findAll(); foreach ($flights as &$flight) { $flight['trips'] = $this->flightTripsModel->where('flight_id', $flight['flight_id'])->where('is_active', 1)->findAll(); foreach ($flight['trips'] as &$item) { if (isset($item['date'])) { $item['date'] = format_date_for_client($item['date']); } } } $plan['flight'] = $flights; //get accomodation details $plan['accomodation'] = $this->accomodationModel->where('plan_id', $planId)->where('is_active', 1)->findAll(); foreach ($plan['accomodation'] as &$item) { if (isset($item['checkin_date'])) { $item['checkin_date'] = format_date_for_client($item['checkin_date']); } if (isset($item['checkout_date'])) { $item['checkout_date'] = format_date_for_client($item['checkout_date']); } } //get bus details $plan['bus'] = $this->busModel->where('plan_id', $planId)->where('is_active', 1)->findAll(); foreach ($plan['bus'] as &$item) { if (isset($item['date'])) { $item['date'] = format_date_for_client($item['date']); } } //get insurance details $plan['insurance'] = $this->insuranceModel->where('plan_id', $planId)->where('is_active', 1)->findAll(); foreach ($plan['insurance'] as &$item) { if (isset($item['start_date'])) { $item['start_date'] = format_date_for_client($item['start_date']); } if (isset($item['end_date'])) { $item['end_date'] = format_date_for_client($item['end_date']); } if (isset($item['nominee_dob'])) { $item['nominee_dob'] = format_date_for_client($item['nominee_dob']); } } //get miscellaneous details $plan['miscellaneous'] = $this->miscellaneousModel->where('plan_id', $planId)->where('is_active', 1)->findAll(); //get taxi details $plan['taxi'] = $this->taxiModel->where('plan_id', $planId)->where('is_active', 1)->findAll(); foreach ($plan['taxi'] as &$item) { if (isset($item['date'])) { $item['date'] = format_date_for_client($item['date']); } } //get train details $plan['train'] = $this->trainModel->where('plan_id', $planId)->where('is_active', 1)->findAll(); foreach ($plan['train'] as &$item) { if (isset($item['date'])) { $item['date'] = format_date_for_client($item['date']); } } //get visa details $plan['visa'] = $this->visaModel->where('plan_id', $planId)->where('is_active', 1)->findAll(); foreach ($plan['visa'] as &$item) { if (isset($item['start_date'])) { $item['start_date'] = format_date_for_client($item['start_date']); } } //get visa details $plan['forex'] = $this->forexModel->where('plan_id', $planId)->where('is_active', 1)->findAll(); foreach ($plan['forex'] as &$item) { if (isset($item['start_date'])) { $item['start_date'] = format_date_for_client($item['start_date']); } if (isset($item['end_date'])) { $item['end_date'] = format_date_for_client($item['end_date']); } $forexPerdiem = $this->forexPerdiemModel->where('country_code',$item['country_code'])->find(); $item['cash_percentage'] = 15; $item['card_percentage'] = 85; if($forexPerdiem) { $item['card_percentage'] = $forexPerdiem[0]['card_percentage']; $item['cash_percentage'] = $forexPerdiem[0]['cash_percentage']; } } //get plan status and it's approver $plan['plan_status'] = getCurrentPlanStatus($planId); if($callFrom == 'client') { return $this->respond(['status' => 200,'message' => 'success','data' => $plan]); }else{ return $plan; } }else{ return $this->respond(['status' => 200,'message' => 'failed','data' => []]); } } public function createOrEditPlan() { try { $json = $this->request->getJSON(true); // Check if plan_id exists if (!empty($json['plan_id'])) { $plan = $this->planModel->find($json['plan_id']); } if (isset($plan)) { // Update existing plan $this->planModel->update($json['plan_id'], $json); $planId = $json['plan_id']; } else { // Insert new plan $planId = $this->planModel->insert($json, true); } $sendMailForEdit = false; if (!empty($json['flight'])) { //check data changed while edit form submit if (!empty($json['plan_id'])) { if (isFlightTripDataChanged($this->flightTripsModel, $planId, $json['flight'])) { $sendMailForEdit = true; } } $this->saveFlights($json['flight'], $planId); } if (!empty($json['accomodation'])) { //check data changed while edit form submit if (!empty($json['plan_id'])) { if (isDataChanged($this->accomodationModel, $planId, $json['accomodation'])) { $sendMailForEdit = true; } } $this->saveAccomodations($json['accomodation'], $planId); } if (!empty($json['bus'])) { //check data changed while edit form submit if (!empty($json['plan_id'])) { if (isDataChanged($this->busModel, $planId, $json['bus'])) { $sendMailForEdit = true; } } $this->saveBuses($json['bus'], $planId); } if (!empty($json['insurance'])) { $this->saveInsurance($json['insurance'], $planId); } if (!empty($json['miscellaneous'])) { $this->saveMiscellaneous($json['miscellaneous'], $planId); } if (!empty($json['taxi'])) { //check data changed while edit form submit if (!empty($json['plan_id'])) { if (isDataChanged($this->taxiModel, $planId, $json['taxi'])) { $sendMailForEdit = true; } } $this->saveTaxi($json['taxi'], $planId); } if (!empty($json['train'])) { //check data changed while edit form submit if (!empty($json['plan_id'])) { if (isDataChanged($this->trainModel, $planId, $json['train'])) { $sendMailForEdit = true; } } $this->saveTrain($json['train'], $planId); } if (!empty($json['visa'])) { //check data changed while edit form submit if (!empty($json['plan_id'])) { if (isDataChanged($this->visaModel, $planId, $json['visa'])) { $sendMailForEdit = true; } } $this->saveVisa($json['visa'], $planId); } if (!empty($json['forex'])) { //check data changed while edit form submit if (!empty($json['plan_id'])) { if (isDataChanged($this->forexModel, $planId, $json['forex'])) { $sendMailForEdit = true; } } $this->saveForex($json['forex'], $planId); } //status handler palnStatusHandler($planId , $sendMailForEdit); //update plan status if all action null updatePlanStatus($planId); //generate pdf for creation and every updation on the plan $this->generatePlanPdf($planId,false); //send creation mail if (empty($json['plan_id'])) { sendPlanCreationMail($planId); } //send updation mail if (!empty($json['plan_id']) && $sendMailForEdit == true) { sendPlanUpdationMail($planId); } // Send mail to agent if plan status is 3 $plan = $this->planModel->where('plan_id', $planId)->where('status', 3)->first(); if ($plan) { send_email_agent(env('ORG_id'), $planId); } return $this->respond(['status' => 'success', 'plan_id' => $planId]); } catch (\Exception $e) { return $this->failServerError('Failed to create : ' . $e->getMessage()); } } private function saveFlights($flights, $planId) { foreach ($flights as $flight) { $flight['plan_id'] = $planId; if (!empty($flight['flight_id'])) { $existingFlight = $this->flightModel->find($flight['flight_id']); if ($existingFlight) { $this->flightModel->update($flight['flight_id'], $flight); $flightId = $flight['flight_id']; } } else { $flightId = $this->flightModel->insert($flight, true); } if (!empty($flight['trips'])) { foreach ($flight['trips'] as $trip) { $trip['flight_id'] = $flightId; $trip['date'] = normalize_date($trip['date']); if (!empty($trip['flight_trip_id'])) { $existingTrip = $this->flightTripsModel->find($trip['flight_trip_id']); if ($existingTrip) { $this->flightTripsModel->update($trip['flight_trip_id'], $trip); } } else { $this->flightTripsModel->insert($trip); } } } } } private function saveAccomodations($accomodations, $planId) { foreach ($accomodations as $data) { $data['plan_id'] = $planId; $data['checkin_date'] = normalize_date($data['checkin_date']); $data['checkout_date'] = normalize_date($data['checkout_date']); if (!empty($data['accomodation_id'])) { $this->accomodationModel->update($data['accomodation_id'], $data); } else { $this->accomodationModel->insert($data); } } } private function saveBuses($buses, $planId) { foreach ($buses as $data) { $data['plan_id'] = $planId; $data['date'] = normalize_date($data['date']); if (!empty($data['bus_id'])) { $this->busModel->update($data['bus_id'], $data); } else { $this->busModel->insert($data); } } } private function saveInsurance($insurance, $planId) { foreach ($insurance as $data) { $data['plan_id'] = $planId; $data['start_date'] = normalize_date($data['start_date']); $data['end_date'] = normalize_date($data['end_date']); $data['nominee_dob'] = normalize_date($data['nominee_dob']); if (!empty($data['insurance_id'])) { $this->insuranceModel->update($data['insurance_id'], $data); } else { $this->insuranceModel->insert($data); } } } private function saveMiscellaneous($miscellaneous, $planId) { foreach ($miscellaneous as $data) { $data['plan_id'] = $planId; if (!empty($data['miscellaneous_id'])) { $this->miscellaneousModel->update($data['miscellaneous_id'], $data); } else { $this->miscellaneousModel->insert($data); } } } private function saveTaxi($taxis, $planId) { foreach ($taxis as $data) { $data['plan_id'] = $planId; $data['date'] = normalize_date($data['date']); if (!empty($data['taxi_id'])) { $this->taxiModel->update($data['taxi_id'], $data); } else { $this->taxiModel->insert($data); } } } private function saveTrain($trains, $planId) { foreach ($trains as $data) { $data['plan_id'] = $planId; $data['date'] = normalize_date($data['date']); if (!empty($data['train_id'])) { $this->trainModel->update($data['train_id'], $data); } else { $this->trainModel->insert($data); } } } private function saveVisa($visas, $planId) { foreach ($visas as $data) { $data['plan_id'] = $planId; $data['start_date'] = normalize_date($data['start_date']); if (!empty($data['visa_id'])) { $this->visaModel->update($data['visa_id'], $data); } else { $this->visaModel->insert($data); } } } private function saveForex($forex, $planId) { foreach ($forex as $data) { $data['plan_id'] = $planId; $data['start_date'] = normalize_date($data['start_date']); $data['end_date'] = normalize_date($data['end_date']); if (!empty($data['forex_id'])) { $this->forexModel->update($data['forex_id'], $data); } else { $this->forexModel->insert($data); } } } public function getForexPerdiem() { try { $json = $this->request->getJSON(true); $country_code = $json['country_code']; $start_date = $json['start_date']; $end_date = $json['end_date']; $user_id = $json['user_id']; $forexCardNo = $this->userModel->where('user_id',$user_id)->get()->getRow()->forex_pre_paid_card_number; // Convert to DateTime objects $start = \DateTime::createFromFormat('d-m-Y', $start_date); $end = \DateTime::createFromFormat('d-m-Y', $end_date); // Calculate difference $interval = $start->diff($end); $duration = $interval->days; // Add 1 to include the start date if($duration == 0){ return $this->respond(['status' => 'failed', 'perdiem_amount' => 0 , 'currency' => '' , 'duration'=> $duration,'cash_percentage'=> 0,'card_percentage'=> 0, 'forex_card_no'=> null ]); } $forexPerdiem = $this->forexPerdiemModel->where('country_code',$country_code)->find(); $res = 0; if($forexPerdiem) { $perdiem_amount = $forexPerdiem[0]['perdiem_amount']; $currency = $forexPerdiem[0]['currency']; $card_percentage = $forexPerdiem[0]['card_percentage']; $cash_percentage = $forexPerdiem[0]['cash_percentage']; $res = $perdiem_amount * $duration; return $this->respond(['status' => 'success', 'perdiem_amount' => $res , 'currency' => $currency , 'duration'=> $duration, 'cash_percentage'=> $cash_percentage,'card_percentage'=> $card_percentage , 'forex_card_no'=>$forexCardNo ]); }else{ return $this->respond(['status' => 'failed', 'perdiem_amount' => 0 , 'currency' => '' , 'duration'=> $duration,'cash_percentage'=> 0,'card_percentage'=> 0, 'forex_card_no'=> null ]); } } catch (\Exception $e) { return $this->failServerError('Failed to create : ' . $e->getMessage()); } } public function approvePlan() { try { $json = $this->request->getJSON(true); $plan_id = $json['plan_id']; $user_id = $json['user_id']; $delegation_user_id = $json['delegation_user_id'] ?? 0; if ((int)$delegation_user_id == 0) { $actionDoneBy = $user_id; } else { $actionDoneBy = $delegation_user_id; } $status = false; //approver 1 $a1Data = $this->planStatusModel->where('plan_id',$plan_id)->where('a1_id',$user_id)->where('a1_action','Approval')->where('is_active',1)->findAll(); if($a1Data){ $this->planStatusModel->set(['is_a1_action_done'=>1,'a1_action_done_on'=>date('Y-m-d H:i:s'),'a1_reject_reason'=>null,'a1_action_done_by'=>$actionDoneBy]) ->where('plan_id',$plan_id) ->where('a1_id',$user_id) ->where('a1_action','Approval') ->where('is_active',1) ->update(); $status = true; } //approver 2 $a2Data = $this->planStatusModel->where('plan_id',$plan_id)->where('a2_id',$user_id)->where('a2_action','Approval')->where('is_active',1)->findAll(); if($a2Data){ $this->planStatusModel->set(['is_a2_action_done'=>1,'a2_action_done_on'=>date('Y-m-d H:i:s'),'a2_reject_reason'=>null,'a2_action_done_by'=>$actionDoneBy]) ->where('plan_id',$plan_id) ->where('a2_id',$user_id) ->where('a2_action','Approval') ->where('is_active',1) ->update(); $status = true; } //approver 3 $a3Data = $this->planStatusModel->where('plan_id',$plan_id)->where('a3_id',$user_id)->where('a3_action','Approval')->where('is_active',1)->findAll(); if($a3Data){ $this->planStatusModel->set(['is_a3_action_done'=>1,'a3_action_done_on'=>date('Y-m-d H:i:s'),'a3_reject_reason'=>null,'a3_action_done_by'=>$actionDoneBy]) ->where('plan_id',$plan_id) ->where('a3_id',$user_id) ->where('a3_action','Approval') ->where('is_active',1) ->update(); $status = true; } //approver 4 $a4Data = $this->planStatusModel->where('plan_id',$plan_id)->where('a4_id',$user_id)->where('a4_action','Approval')->where('is_active',1)->findAll(); if($a4Data){ $this->planStatusModel->set(['is_a4_action_done'=>1,'a4_action_done_on'=>date('Y-m-d H:i:s'),'a4_reject_reason'=>null,'a4_action_done_by'=>$actionDoneBy]) ->where('plan_id',$plan_id) ->where('a4_id',$user_id) ->where('a4_action','Approval') ->where('is_active',1) ->update(); $status = true; } //response if($status) { //update plan status updatePlanStatus($plan_id); //update pdf content $this->generatePlanPdf($plan_id); //send approval mail sendPlanApprovalOrRejectMail($plan_id,'A'); //send parallel or Sequential mail sendPlanCreationMail($plan_id, 'send_mail_to_only_approver'); // Send mail to agent if plan status is 3 $plan = $this->planModel->where('plan_id', $plan_id)->where('status', 3)->first(); if ($plan) { send_email_agent(env('ORG_id'), $plan_id); } return $this->respond(['status' => 200, 'message' => 'success' ]); }else{ return $this->respond(['status' => 404, 'message' => 'failed' ]); } } catch (\Exception $e) { return $this->failServerError('Failed to create : ' . $e->getMessage()); } } public function rejectPlan() { try { $json = $this->request->getJSON(true); $plan_id = $json['plan_id']; $user_id = $json['user_id']; $reason = $json['reason']; $delegation_user_id = $json['delegation_user_id'] ?? 0; if ($delegation_user_id == 0) { $actionDoneBy = $user_id; } else { $actionDoneBy = $delegation_user_id; } $status = false; //approver 1 $a1Data = $this->planStatusModel->where('plan_id',$plan_id)->where('a1_id',$user_id)->where('a1_action','Approval')->where('is_active',1)->findAll(); if($a1Data){ $this->planStatusModel->set(['is_a1_action_done'=>0,'a1_reject_reason'=>$reason,'a1_action_done_on'=>date('Y-m-d H:i:s'),'a1_action_done_by'=>$actionDoneBy]) ->where('plan_id',$plan_id) ->where('a1_id',$user_id) ->where('a1_action','Approval') ->where('is_active',1) ->update(); $status = true; } //approver 2 $a2Data = $this->planStatusModel->where('plan_id',$plan_id)->where('a2_id',$user_id)->where('a2_action','Approval')->where('is_active',1)->findAll(); if($a2Data){ $this->planStatusModel->set(['is_a2_action_done'=>0,'a2_reject_reason'=>$reason,'a2_action_done_on'=>date('Y-m-d H:i:s'),'a2_action_done_by'=>$actionDoneBy]) ->where('plan_id',$plan_id) ->where('a2_id',$user_id) ->where('a2_action','Approval') ->where('is_active',1) ->update(); $status = true; } //approver 3 $a3Data = $this->planStatusModel->where('plan_id',$plan_id)->where('a3_id',$user_id)->where('a3_action','Approval')->where('is_active',1)->findAll(); if($a3Data){ $this->planStatusModel->set(['is_a3_action_done'=>0, 'a3_reject_reason'=>$reason, 'a3_action_done_on'=>date('Y-m-d H:i:s'),'a3_action_done_by'=>$actionDoneBy]) ->where('plan_id',$plan_id) ->where('a3_id',$user_id) ->where('a3_action','Approval') ->where('is_active',1) ->update(); $status = true; } //approver 4 $a4Data = $this->planStatusModel->where('plan_id',$plan_id)->where('a4_id',$user_id)->where('a4_action','Approval')->where('is_active',1)->findAll(); if($a4Data){ $this->planStatusModel->set(['is_a4_action_done'=>0, 'a4_reject_reason'=>$reason, 'a4_action_done_on'=>date('Y-m-d H:i:s'),'a4_action_done_by'=>$actionDoneBy]) ->where('plan_id',$plan_id) ->where('a4_id',$user_id) ->where('a4_action','Approval') ->where('is_active',1) ->update(); $status = true; } //response if($status) { //update plan status $this->planModel->set(['status'=>4])->where('plan_id',$plan_id)->update(); //update pdf content $this->generatePlanPdf($plan_id); //send reject mail sendPlanApprovalOrRejectMail($plan_id,'R'); return $this->respond(['status' => 200, 'message' => 'success' ]); }else{ return $this->respond(['status' => 404, 'message' => 'failed' ]); } } catch (\Exception $e) { return $this->failServerError('Failed to create : ' . $e->getMessage()); } } public function getRemarksByPlanId() { $planId = $this->request->getGet('plan_id'); $userId = $this->request->getGet('user_id'); $this->planRemarkModel ->select('c_plan_remark.*, CONCAT(U.first_name, " ", U.last_name) AS created_by_name, R.value AS created_by_role') ->join('m_users U', 'U.user_id = c_plan_remark.created_by', 'left') ->join('m_role R', 'U.role_id = R.id', 'left') ->where('c_plan_remark.plan_id', $planId) ->where('c_plan_remark.is_active', 1); if (!empty($userId)) { $this->planRemarkModel->where('c_plan_remark.created_by', $userId); } $remarks = $this->planRemarkModel ->orderBy('c_plan_remark.created_on', 'DESC') ->findAll(); if (empty($remarks)) { return $this->failNotFound('No remarks found for this plan.'); } return $this->respond([ 'status' => 200, 'message' => 'Remarks fetched successfully.', 'data' => $remarks ]); } public function addOrEditPlanRemark() { $input = $this->request->getJSON(true); $data = [ 'plan_id' => $input['plan_id'] ?? null, 'remarks' => $input['remarks'] ?? '', 'is_active' => $input['is_active'] ?? '' ]; if (!isset($input['id']) || empty($input['id'])) { // Create new remark $data['created_by'] = $input['created_by'] ?? null; if (!$this->planRemarkModel->insert($data)) { return $this->failValidationErrors($this->planRemarkModel->errors()); } return $this->respondCreated(['status' => 201, 'message' => 'Remark created successfully.']); } else { // Update existing remark $id = $input['id']; $data['updated_by'] = $input['updated_by'] ?? null; if (!$this->planRemarkModel->update($id, $data)) { return $this->failValidationErrors($this->planRemarkModel->errors()); } return $this->respond(['status' => 200, 'message' => 'Remark updated successfully.']); } } public function statusDashboard() { try { $org_id = $this->request->getGet('org_id'); $plans = $this->planModel->where('org_id', $org_id)->where('is_active', 1)->findAll(); // Count occurrences of each status ID $statusCounts = array_count_values(array_column($plans, 'status')); // dd($statusCounts); $statusResult = []; $statusLabels = [ 1 => 'Pending Approval', 2 => 'Partially Approved', 3 => 'Approved', 4 => 'Rejected', 5 => 'Processed', 6 => 'Completed', 7 => 'Cancelled' ]; // Count occurrences of each type ID $typeCounts = array_count_values(array_column($plans, 'trip_type')); $typeResult = []; $typeLabels = [ 1 => 'Domestic', 2 => 'International' ]; $todayStart = date('Y-m-d 00:00:00'); $todayEnd = date('Y-m-d 23:59:59'); // $startOfWeek = date('Y-m-d 00:00:00', strtotime('monday this week')); // $endOfWeek = date('Y-m-d 23:59:59', strtotime('sunday this week')); $startOfWeek = date('Y-m-d 00:00:00', strtotime('-7 days')); $endOfWeek = date('Y-m-d 23:59:59'); // today $typeResultToday = []; $typeResultWeekly = []; $todayType = array_filter($plans, function ($plan) use ($todayStart, $todayEnd) { return $plan['created_on'] >= $todayStart && $plan['created_on'] <= $todayEnd; }); $todayTypeCounts = array_count_values(array_column($todayType, 'trip_type')); $weeklyType = array_filter($plans, function ($plan) use ($startOfWeek, $endOfWeek) { return $plan['created_on'] >= $startOfWeek && $plan['created_on'] <= $endOfWeek; }); $weeklyTypeCounts = array_count_values(array_column($weeklyType, 'trip_type')); for ($i = 1; $i <= 2; $i++) { // Fixed loop condition $typeResult[] = [ 'value' => $typeLabels[$i], 'count' => $typeCounts[$i] ?? 0 // Handle missing values ]; $typeResultToday[] = [ 'value' => $typeLabels[$i], 'count' => $todayTypeCounts[$i] ?? 0 // Handle missing values ]; $typeResultWeekly[] = [ 'value' => $typeLabels[$i], 'count' => $weeklyTypeCounts[$i] ?? 0 // Handle missing values ]; } $statusResultToday = []; $statusResultWeekly = []; $todayStatus = array_filter($plans, function ($plan) use ($todayStart, $todayEnd) { return $plan['created_on'] >= $todayStart && $plan['created_on'] <= $todayEnd; }); $todayStatusCounts = array_count_values(array_column($todayStatus, 'status')); $weeklyStatus = array_filter($plans, function ($plan) use ($startOfWeek, $endOfWeek) { return $plan['created_on'] >= $startOfWeek && $plan['created_on'] <= $endOfWeek; }); $weeklyStatusCounts = array_count_values(array_column($weeklyStatus, 'status')); for ($i = 1; $i <= 7; $i++) { // Fixed loop condition if($i == 5 || $i == 6){ continue; } $statusResult[] = [ 'value' => $statusLabels[$i], 'count' => $statusCounts[$i] ?? 0 // Handle missing values ]; $statusResultToday[] = [ 'value' => $statusLabels[$i], 'count' => $todayStatusCounts[$i] ?? 0 // Handle missing values ]; $statusResultWeekly[] = [ 'value' => $statusLabels[$i], 'count' => $weeklyStatusCounts[$i] ?? 0 // Handle missing values ]; } $data['statusBasedCount'] = $statusResult; $data['statusBasedTodayCount'] = $statusResultToday; $data['statusBasedWeeklyCount'] = $statusResultWeekly; $data['typeBasedCount'] = $typeResult; $data['typeBasedTodayCount'] = $typeResultToday; $data['typeBasedWeeklyCount'] = $typeResultWeekly; // === Today's Date & Week Range === $today = date('Y-m-d'); $startOfWeek = date('Y-m-d', strtotime('monday this week')); $endOfWeek = date('Y-m-d', strtotime('sunday this week')); $todayCounts = ['Domestic' => 0, 'International' => 0]; $weekCounts = ['Domestic' => 0, 'International' => 0]; foreach ($plans as $plan) { $createdAt = substr($plan['created_on'], 0, 10); // Get 'Y-m-d' part $type = $plan['trip_type'] == 1 ? 'Domestic' : 'International'; if ($createdAt == $today) { $todayCounts[$type]++; } if ($createdAt >= $startOfWeek && $createdAt <= $endOfWeek) { $weekCounts[$type]++; } } $data['statusBasedCount'] = $statusResult; $data['typeBasedCount'] = $typeResult; $data['todayTripCounts'] = $this->selectedServiceDashboardDaily(); $data['weekTripCounts'] = $this->selectedServiceDashboardWeekly(); return $this->respond(['status' => 200, 'message' => 'success', 'data' => $data ]); } catch (\Exception $e) { return $this->failServerError('Failed : ' . $e->getMessage()); } } public function downloadPlan() { $plan_id = $this->request->getGet('plan_id'); $filePath = WRITEPATH . 'pdf/trips/trip_' . $plan_id . '.pdf'; $filename = 'trip_' . $plan_id . '.pdf'; if (!file_exists($filePath)) { return $this->failNotFound('File not found'); } return $this->response->download($filePath, null)->setFileName($filename); } public function viewPlan() { $plan_id = $this->request->getGet('plan_id'); $html = $this->generatePlanPdf($plan_id , true); return $this->respond(['status' => 200, 'message' => 'success', 'data' => $html ]); } public function getTripStartDate($array,$trip_start_date) { if(count($array) == 0) { return $trip_start_date; } foreach ($array as $val) { if ($val['date'] < $trip_start_date) { $trip_start_date = $val['date']; } } return $trip_start_date; } public function generatePlanPdf($planId = null , $view = false) { // Fetch the plan $plan = $this->planModel->select( 'm_plan.*, CONCAT_WS(U.first_name," ",U.last_name) as user_name, U.employee_code,U.passport_number,U.date_of_expiry,U.place_of_issue,U.forex_pre_paid_card_number, CONCAT_WS(C.first_name," ",C.last_name) as plan_created_by, CONCAT_WS(T.first_name," ",T.last_name) as traveller_name, TS.status_value, TT.dropdown_value as trip_type_value, IB.dropdown_value as is_billable_value, POT.dropdown_value as purpose_of_travel_value, FD.dropdown_value as functional_department_value, CC.name as cost_center_value,ORG.logo', // Dep.name as cost_center_value' // old. don't why dep name used. ) ->join('m_users U', 'U.user_id = m_plan.user_id ', 'left') ->join('m_users C', 'C.user_id = m_plan.created_by ', 'left') ->join('m_traveller T', 'T.traveller_id = m_plan.traveller_id ', 'left') ->join('m_travel_statuses TS', 'TS.id = m_plan.status ', 'left') ->join('m_dropdown TT', 'TT.dropdown_key = m_plan.trip_type AND TT.dropdown = "plan_trip_type"', 'left') ->join('m_dropdown IB', 'IB.dropdown_key = m_plan.is_billable AND IB.dropdown = "plan_is_billable"', 'left') ->join('m_dropdown POT', 'POT.dropdown_key = m_plan.purpose_of_travel AND POT.dropdown = "plan_purpose_of_travel"', 'left') ->join('m_dropdown FD', 'FD.dropdown_key = m_plan.functional_department AND FD.dropdown = "plan_functional_department"', 'left') ->join('m_department Dep', 'Dep.department_id = m_plan.cost_center_id ', 'left') ->join('m_cost_center CC', 'CC.cost_center_id = m_plan.cost_center_id ', 'left') ->join('m_organization ORG', 'ORG.org_id = m_plan.org_id ', 'left') ->where('m_plan.is_active', 1) ->find($planId); $userId = isset($plan['traveller_id']) && !empty($plan['traveller_id']) ? $plan['created_by'] : $plan['user_id']; // $orgId = !empty($plan) ? $plan['org_id'] : ""; $orgLogo = !empty($plan) ? $plan['logo'] : ""; $tripType = $plan['trip_type']; $plan['allowed_class'] = getAllowedClassForUser($tripType,$userId); $plan['trip_start_date'] = '9999-12-31'; if ($plan) { //get flight details $flights = $this->flightModel->where('plan_id', $planId)->where('is_active', 1)->findAll(); foreach ($flights as &$flight) { $flight['trips'] = $this->flightTripsModel->select('cc_flight_trips.* ,FC.dropdown_value as flight_class , FP.Airport as from_place_name , TP.Airport as to_place_name ') ->join('m_dropdown FC', 'FC.dropdown_key = cc_flight_trips.class AND FC.dropdown = "flight_class"', 'left') ->join('Airport_Code_State FP', 'FP.Code = cc_flight_trips.from_place', 'left') ->join('Airport_Code_State TP', 'TP.Code = cc_flight_trips.to_place', 'left') ->where('cc_flight_trips.flight_id', $flight['flight_id']) ->where('cc_flight_trips.is_active', 1) ->findAll(); $plan['trip_start_date'] = $this->getTripStartDate($flight['trips'],$plan['trip_start_date']); } $plan['flight'] = $flights; //get accomodation details $plan['accomodation'] = $this->accomodationModel->select('c_accomodation.*, C.dropdown_value as hotel_class, H.hotel_name') ->join('m_dropdown C', 'C.dropdown_key = c_accomodation.class AND C.dropdown = "hotel_class"', 'left') ->join('m_hotels H', 'H.hotel_id = c_accomodation.hotel_id', 'left') ->where('c_accomodation.plan_id', $planId) ->where('c_accomodation.is_active', 1)->findAll(); //get bus details $plan['bus'] = $this->busModel->where('plan_id', $planId)->where('is_active', 1)->findAll(); $plan['trip_start_date'] = $this->getTripStartDate($plan['bus'],$plan['trip_start_date']); //get insurance details $plan['insurance'] = $this->insuranceModel->select('c_insurance.* ,IT.dropdown_value as type_of_insurance_value ') ->join('m_dropdown IT', 'IT.dropdown_key = c_insurance.type_of_insurance AND IT.dropdown = "insurance_type_of_insurance"', 'left') ->where('c_insurance.plan_id', $planId)->where('c_insurance.is_active', 1)->findAll(); //get miscellaneous details $plan['miscellaneous'] = $this->miscellaneousModel->select('c_miscellaneous.* ,SR.dropdown_value as special_request_value ') ->join('m_dropdown SR', 'SR.dropdown_key = c_miscellaneous.special_request AND SR.dropdown = "miscellaneous_special_request"', 'left') ->where('c_miscellaneous.plan_id', $planId)->where('c_miscellaneous.is_active', 1)->findAll(); //get taxi details $plan['taxi'] = $this->taxiModel->select('c_taxi.* ,CT.dropdown_value as car_type_value,CRF.dropdown_value as car_required_for_value ') ->join('m_dropdown CT', 'CT.dropdown_key = c_taxi.car_type AND CT.dropdown = "taxt_car_type"', 'left') ->join('m_dropdown CRF', 'CRF.dropdown_key = c_taxi.car_required_for AND CRF.dropdown = "taxi_car_required_for"', 'left') ->where('c_taxi.plan_id', $planId)->where('c_taxi.is_active', 1) ->findAll(); $plan['trip_start_date'] = $this->getTripStartDate($plan['taxi'],$plan['trip_start_date']); //get train details $plan['train'] = $this->trainModel->select('c_train.* ,TC.dropdown_value as train_class, FS.Station_Name as from_station, TS.Station_Name as to_station') ->join('m_dropdown TC', 'TC.dropdown_key = c_train.class AND TC.dropdown = "train_class"', 'left') ->join('Train_Stations FS', 'FS.Station_Code = c_train.from_station', 'left') ->join('Train_Stations TS', 'TS.Station_Code = c_train.to_station', 'left') ->where('c_train.plan_id', $planId)->where('c_train.is_active', 1) ->findAll(); $plan['trip_start_date'] = $this->getTripStartDate($plan['train'],$plan['trip_start_date']); //get visa details $plan['visa'] = $this->visaModel->select('c_visa.* ,VT.dropdown_value as visa_type_value , C.country_name ') ->join('m_dropdown VT', 'VT.dropdown_key = c_visa.type_of_visa AND VT.dropdown = "visa_type_of_visa"', 'left') ->join('m_country C', 'C.country_code = c_visa.country_code', 'left') ->where('c_visa.plan_id', $planId)->where('c_visa.is_active', 1)->findAll(); //get visa details $plan['forex'] = $this->forexModel->select('c_forex.* ,C.country_name ') ->join('m_country C', 'C.country_code = c_forex.country_code', 'left') ->where('c_forex.plan_id', $planId)->where('c_forex.is_active', 1) ->findAll(); //get org details $plan['org_data'] = $this->organizationModel->where('org_id', $plan['org_id'])->where('is_active', 1)->first(); $plan['visa_data'] = $this->userVisaDetailsModel->select('c_user_visa_details.valid_from ,c_user_visa_details.valid_upto ,C.country_name ,VT.dropdown_value as visa_type_value') ->join('m_country C', 'C.country_code = c_user_visa_details.country_code', 'left') ->join('m_dropdown VT', 'VT.dropdown_key = c_user_visa_details.visa_type_id AND VT.dropdown = "visa_type_of_visa"', 'left') ->where('c_user_visa_details.user_id', $plan['user_id']) ->where('c_user_visa_details.is_active', 1) ->where('c_user_visa_details.valid_from <=', date('Y-m-d')) ->where('c_user_visa_details.valid_upto >=', date('Y-m-d')) ->findAll(); $userId = $plan['user_id'] ?? $plan['traveller_id']; //current plan status $status = getCurrentPlanStatus($planId); $plan['status_details'] = $status; //get user data $plan['user_data'] = $this->userModel->where('user_id', $userId)->first(); $plan['view'] = $view; $data['data'] = $plan; // dd($data); // echo view('pdf', $data); die; $html = view('pdf', $data); if($view == true){ return $html; } // Load mPDF $mpdf = new \Mpdf\Mpdf([ 'tempDir' => WRITEPATH . 'mpdf-temp', 'mode' => 'utf-8', 'format' => 'A4', 'margin_left' => 5, 'margin_right' => 5, 'margin_top' => 30, 'margin_bottom' => 15 ]); $mpdf->WriteHTML($html); // Output PDF to a temp file $filePath = WRITEPATH . 'pdf/trips/trip_' . $planId . '.pdf'; if (file_exists($filePath)) { unlink($filePath); }else{ $this->planModel->set(['pdf_file_path'=>$filePath])->where('plan_id',$planId)->update(); } $mpdf->Output($filePath, \Mpdf\Output\Destination::FILE); return $filePath; }else{ return $this->respond(['status' => 200,'message' => 'failed','data' => []]); } } public function forexDownload() { $forexId = $this->request->getGet('forex_id'); $userId = $this->request->getGet('user_id'); $data['forexData'] = $this->forexModel->select('c_forex.* , C.country_name , P.org_id,P.created_on as date, U.first_name,U.last_name,U.mobile_no,U.email,U.address,U.passport_number,U.place_of_issue,U.date_of_issue,U.date_of_expiry, POT.dropdown_value as purpose_of_visit, ') ->join('m_country C', 'C.country_code = c_forex.country_code', 'left') ->join('m_plan P', 'P.plan_id = c_forex.plan_id', 'left') ->join('m_users U', 'U.user_id = P.user_id ', 'left') ->join('m_dropdown POT', 'POT.dropdown_key = P.purpose_of_travel AND POT.dropdown = "plan_purpose_of_travel"', 'left') ->where('c_forex.forex_id', $forexId)->where('c_forex.is_active', 1) ->first(); $data['org_data'] = $this->organizationModel->where('org_id', $data['forexData']['org_id'])->where('is_active', 1)->first(); $data['forexData']['org_name'] = $data['org_data']['name']; $data['forexData']['forex_card_number'] = $data['forexData']['card_number']; $data['forexData']['passport_place_of_issue'] = $data['forexData']['place_of_issue']; $data['forexData']['passport_date_of_issue'] = $data['forexData']['date_of_issue']; $data['forexData']['passport_date_of_expiry'] = $data['forexData']['date_of_expiry']; $data['forexData']['purpose_of_visit'] = $data['forexData']['purpose_of_visit']; $data['forexData']['place_of_visit'] = $data['forexData']['country_name']; $data['forexData']['staying_duration'] = $data['forexData']['duration']; $data['forexData']['total_forex_exchange_amount'] = $data['forexData']['perdiem_amount'] + $data['forexData']['transport'] + $data['forexData']['accommodation'] + $data['forexData']['telephone']; $templateData = $this->mailTemplateModel->where('org_id', $data['forexData']['org_id'] )->where('template_name', 'forex' )->first(); //replace the placeholder foreach ($data['forexData'] as $key => $value) { $placeHolder = '%'.$key.'%'; $templateData['body_html'] = str_replace($placeHolder, $value ?? '', $templateData['body_html']); } $html = $templateData['body_html']; // $html = view('forex',$data); // Load mPDF $mpdf = new \Mpdf\Mpdf([ 'tempDir' => WRITEPATH . 'mpdf-temp', 'mode' => 'utf-8', 'format' => 'A4', 'margin_left' => 5, 'margin_right' => 5, 'margin_top' => 30, 'margin_bottom' => 15 ]); $mpdf->WriteHTML($html); // Output PDF to a temp file $filePath = WRITEPATH . 'pdf/forex/forex_' . $data['forexData']['plan_id'] . '.pdf'; if (file_exists($filePath)) { unlink($filePath); } $mpdf->Output($filePath, \Mpdf\Output\Destination::FILE); $filename = 'forex_' . $data['forexData']['plan_id'] . '.pdf'; if (!file_exists($filePath)) { return $this->failNotFound('File not found'); } return $this->response->download($filePath, null)->setFileName($filename); // $templateData = $this->mailTemplateModel->where('org_id', 1 )->where('template_name', 'forex' )->first(); // echo $templateData['body_html'];die; } public function protectedPage() { $plan_id = $this->request->getVar('plan_id'); $plan = $this->planModel->where('MD5(plan_id)', $plan_id)->first(); $planId = $plan['plan_id']; $delegation_user_id = $this->request->getVar('delegation_user_id') ?? null; $data['html'] = $this->generatePlanPdf((int)$planId, true); $data['plan_id'] = $planId; $data['user_id'] = $this->request->getVar('user_id'); $data['delegation_user_id'] = $delegation_user_id; $data['status'] = getApproverCurrentAction( $data['plan_id'], $data['user_id'] ); echo view('protected_page',$data); } public function canclePlan() { $plan_id = $this->request->getGet('plan_id') ?? null; log_message('error', "Recived plan_id: {$plan_id} in update()"); if(empty($plan_id)){ log_message('error', 'Plan ID missing or empty'); return $this->failNotFound('Plan ID is required'); } $return = $this->planModel->where('plan_id', $plan_id)->set(['status' => 7])->update(); if($return){ log_message('error', "Plan status updated successfully for plan_id: {$plan_id} in update()"); return $this->respond([ 'status' => 200, 'message' => 'Plan status updated successfully', 'data' => ['plan_id' => $plan_id] ]); }else{ log_message('error', "Failed to update plan status for plan_id: {$plan_id} in update()"); return $this->respond([ 'status' => 200, 'message' => 'Failed to updated plan status', 'data' => ['plan_id' => $plan_id] ]); } } public function get_plan_approval_status() { $plan_id = $this->request->getGet('plan_id') ?? null; $planData = $this->planModel->where('plan_id', $plan_id)->first(); $data['model_heading'] = 'Trip ID - '.$planData['plan_id'].', Trip Title - '.$planData['trip_title']; //get plan status and it's approver $data['approver_data'] = getCurrentPlanStatus($plan_id); return $this->respond(['status' => 200, 'message' => 'success', 'data' => $data ]); } public function url() { echo '
';
$user = $this->userModel->where('email', 'pavithrakavi1100@gmail.com')->first();
echo getUserPlanCreationRestrictionStatus($user); die;
print_r(getPlanApproverAction(126)); die;
return $this->generatePlanPdf(57, true);
die;
updatePlanStatus(57); die;
palnStatusHandler(57, false); die;
echo '';
// sendPlanCreationMail(39);
// echo '';
// print_r(getAllowedClassForUser(2,4)['hotel']); die;
return send_email_agent(env('ORG_id') , 62);
return updatePlanStatus(62);
}
// faf stands for flight accomodation and forex
public function selectedServiceDashboardWeekly(){
$flightResult = $this->reportsModel->flightServiceDashboardWeekly();
$accomodationResult = $this->reportsModel->accomodationServiceDashboardWeekly();
$forexResult = $this->reportsModel->forexServiceDashboardWeekly();
$result = [
"flight" => $flightResult ,
"acomodation" => $accomodationResult ,
"forex" => $forexResult
];
return $result = $this->splitResultbasedOnTripType($result);
}
public function selectedServiceDashboardDaily(){
$flightResult = $this->reportsModel->flightServiceDashboardDaily();
$accomodationResult = $this->reportsModel->accomodationServiceDashboardDaily();
$forexResult = $this->reportsModel->forexServiceDashboardDaily();
$result = [
"flight" => $flightResult ,
"acomodation" => $accomodationResult ,
"forex" => $forexResult
];
return $result = $this->splitResultbasedOnTripType($result);
}
public function splitResultBasedOnTripType(array $result): array
{
$finalResult = [];
$trip_types = ['International', 'Domestic'];
$statuses = ['Pending Approval', 'Partially Approved', 'Approved', 'Rejected', 'Cancelled'];
foreach ($result as $service => $entries) {
$resultSet = [] ;
foreach ($trip_types as $trip_type) {
foreach ($statuses as $status) {
$resultSet[$service][$trip_type][$status] = 0;
}
}
foreach ($entries as $entry) {
$tripType = $entry['trip_type'];
$status = $entry['Status'];
$count = (int) $entry['count'];
$resultSet[$service][$tripType][$status] += $count;
}
foreach ($statuses as $status) {
$resultSet[$service]['Both'][$status] =
$resultSet[$service]['International'][$status] +
$resultSet[$service]['Domestic'][$status];
}
$finalResult [] = $resultSet;
}
return $finalResult;
}
}