<?php
namespace Globals\ClaimManagementBundle\Controller\ClaimFlow;
use Globals\ClaimManagementBundle\DependencyInjection\FormHelpers\DisbursementTimeLogFormHelper;
use Globals\ClaimManagementBundle\Entity\DiaryEntry;
use Globals\ClaimManagementBundle\Entity\DiaryOtherResource;
use Globals\ClaimManagementBundle\Event\ClaimDiaryAssignedEvent;
use Globals\ClaimManagementBundle\Event\ClaimDiaryCompleteEvent;
use Globals\ClaimManagementBundle\Form\DiaryFormType;
use Globals\ResourceManagementBundle\Service\SLogger;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\Serializer\Encoder\JsonEncoder;
use Symfony\Component\Serializer\Encoder\XmlEncoder;
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
use Symfony\Component\Serializer\Serializer;
use Globals\ClaimManagementBundle\Entity\DocumentLibrary;
use Globals\CompanyManagementBundle\Entity\Company;
/**
* @Route("/claims/fragments")
*/
class ClaimDiaryController extends Controller
{
/**
* @Route("/claim-diary/{claim_id}")
*/
public function autoDiaryRead($claim_id, Request $request)
{
$bShowRefUrl = false;
if ($claim_id) {
$em = $this->getDoctrine()->getManager();
$claim = $this->getDoctrine()->getRepository('ClaimManagementBundle:Claim')->find($claim_id);
$companyId = 1;
if ($claim->getCustomer()) {
$ClaimCustomer = $claim->getCustomer();
if ($ClaimCustomer->getSubCompany()) {
$companyId = $ClaimCustomer->getSubCompany()->getId();
}
}
$company = $em->getRepository("CompanyManagementBundle:Company")->find($companyId);
$this->denyAccessUnlessGranted("view_diaries_tab", $claim);
$assignmentService = $this->get('claim.assignment');
$alertMessageDateExpiryArray = $assignmentService->validLicense($claim);
$alertMessageDateExpiry = $alertMessageDateExpiryArray['alertMessageDateExpiry'];
/**
* Added by AMH 2018-09-13, to restrict
* resource dropdown, so that if user is adjuster,
* he can only edit himself as the resource
*/
$User = $this->container->get("security.token_storage")->getToken()->getUser();
$optionsArray = [
'claim_id' => $claim->getId(),
'adjuster_id' => 0
];
if ($User->getRoles() == ["ROLE_ADJUSTER"]) {
$optionsArray['adjuster_id'] = $User->getId();
}
$createForm = $this->createForm(DiaryFormType::class, new DiaryEntry(), $optionsArray);
/**
* Added 8/30/2017
*
* Here we'll load up all the resources available (possibly excluding logged in user?) to add
* to the Diary.
*
*/
$foundResources = $this->getDoctrine()->getRepository('ResourceManagementBundle:Resource')->getUsersOnClaim($claim);
$dateOpened = $claim->getDateReopened() ? $claim->getDateReopened() : ($claim->getDateOpened() ? $claim->getDateOpened() :$claim->getDateCreated());
$dateClosed = $claim->getDateClosed()? $claim->getDateClosed(): new \DateTime('now');
if($dateClosed < $dateOpened){
$dateClosed = new \DateTime('now');
}
$difference = date_diff($dateOpened,$dateClosed);
$difference = (array)$difference;
$daysOpen = array();
$daysOpen['days'] = $difference['days'];
$daysOpen['h'] = $difference['h'];
$daysOpen['m'] = $difference['m'];
$systemParamService = $this->container->get('core.system_parameter_control');
$systemAdminUsers = $systemParamService->getAccessArray('Invoicing_access');
$bShowInvoiceAccessTab = false;
$user = $this->get('security.token_storage')->getToken()->getUser();
if (!empty($systemAdminUsers) && in_array($user->getId(),$systemAdminUsers)) {
$bShowInvoiceAccessTab = true;
}
if ($claim->getStatus()>=10) {
$bShowRefUrl = true;
}
// dd($foundResources);
return $this->render('ClaimManagementBundle:ClaimFlowScreen/Fragments:auto-diary-fragment.html.twig', [
'resources' => $foundResources,
'active' => 'claim_diary',
'claim' => $claim,
'company' => $company,
'createForm' => $createForm->createView(),
"daysOpen" => $daysOpen,
'bShowInvoiceAccessTab' => $bShowInvoiceAccessTab,
'alertMessageDateExpiry' =>$alertMessageDateExpiry,
"ShowRefUrl" =>$bShowRefUrl
]);
} else {
throw new NotFoundHttpException('Could not find this claim!');
}
}
/**
* @Route("/claim-diary/add/{claim_id}")
*/
public function addDiaryRead($claim_id)
{
if ($claim_id) {
$diary = new DiaryEntry();
$claim = $this->getDoctrine()->getRepository('ClaimManagementBundle:Claim')->find($claim_id);
$this->denyAccessUnlessGranted("view_diaries_tab", $claim);
/**
* Added by AMH 2018-09-13, to restrict
* resource dropdown, so that if user is adjuster,
* he can only edit himself as the resource
*/
$User = $this->container->get("security.token_storage")->getToken()->getUser();
$optionsArray = [
'claim_id' => $claim->getId(),
'adjuster_id' => 0
];
if ($User->getRoles() == ["ROLE_ADJUSTER"]) {
$optionsArray['adjuster_id'] = $User->getId();
}
$assoicatedResources = $this->getDoctrine()->getRepository('ResourceManagementBundle:Resource')->getUsersOnClaim($claim);
$createForm = $this->createForm(DiaryFormType::class, $diary, $optionsArray);
return $this->render('ClaimManagementBundle:ClaimFlowScreen/Fragments/modals:auto-diary-modal.html.twig', [
'resources' => $assoicatedResources,
'diary' => $diary,
'claim' => $claim,
'createForm' => $createForm->createView()
]);
} else {
throw new NotFoundHttpException('Could not find this claim!');
}
}
/**
* @Route("/claim-diary/edit/{claim_id}/{diary_id}", defaults={"diary_id" = "none"})
*/
public function editDiaryRead($claim_id, $diary_id, Request $request)
{
if ($claim_id) {
if ($diary_id) {
$diary = $this->getDoctrine()->getRepository('ClaimManagementBundle:DiaryEntry')->find($diary_id);
$this->denyAccessUnlessGranted("edit_diary", $diary);
} else {
$diary = new DiaryEntry();
}
$claim = $this->getDoctrine()->getRepository('ClaimManagementBundle:Claim')->find($claim_id);
$this->denyAccessUnlessGranted("view_diaries_tab", $claim);
/**
* Added by AMH 2018-09-13, to restrict
* resource dropdown, so that if user is adjuster,
* he can only edit himself as the resource
*/
$User = $this->container->get("security.token_storage")->getToken()->getUser();
$optionsArray = [
'claim_id' => $claim->getId(),
'adjuster_id' => 0
];
if ($User->getRoles() == ["ROLE_ADJUSTER"]) {
$optionsArray['adjuster_id'] = $User->getId();
}
$editForm = $this->createForm(DiaryFormType::class, $diary, $optionsArray);
return $this->render('ClaimManagementBundle:ClaimFlowScreen/Fragments/modals:auto-diary-edit-modal.html.twig', [
'diary' => $diary,
'active' => 'claim_diary',
'claim' => $claim,
'editForm' => $editForm->createView()
]);
} else {
throw new NotFoundHttpException('Could not find this claim!');
}
}
/**
* TimeLog Datalist Ajax Data Route
*
* @Route("/all/{claim_id}")
*/
public function claimDiaryDatatablesAction($claim_id, Request $request)
{
# Array of columns that will be sorted
$columnsArr = [
"id",
"resourceName",
"dueDate",
"description",
"dateCreated",
"authorName",
"priority",
"status"
];
$User = $this->container->get("security.token_storage")->getToken()->getUser();
$isAdjuster = false;
if ($User->getRoles() == ["ROLE_ADJUSTER"]) {
$isAdjuster = true;
}
# Build Query and PDO Parameters that will be passed to PaginatorService class
$dataParams = array();
$sql = "SELECT DE.id,
(CONCAT(R.first_name,' ',R.last_name)) as resourceName,
DE.dueDate,
DE.description,
DE.dateCreated,
(CONCAT(R2.first_name,' ',R2.last_name)) authorName,
DE.priority,
DE.status,
DE.claim_id
FROM diary_entry DE
LEFT JOIN resource R ON R.id = DE.resource_id
LEFT JOIN resource R2 ON R2.id = DE.author_id
WHERE 1 = 1 ";
if ($claim_id) {
$sql .= "AND DE.claim_id = :claimId ";
$dataParams['claimId'] = $claim_id;
}
if ($isAdjuster) {
$sql .= "AND DE.resource_id = :adjuster_id ";
$dataParams['adjuster_id'] = $User->getId();
}
# build keyword filter, which is requested by datatables ajax when someone types into keyword field
$keyword_filter = "AND (resourceName like :keyword OR authorName like :keyword OR De.description like :keyword) ";
# specifiy group by
$group_by = "";
# call PaginatorService
$paginator = $this->container->get("resource.paginator_service");
$data = $paginator->getPaginationResults($request, $sql, $dataParams, "", $columnsArr, "", $keyword_filter, "keyword", $group_by, "GET");
# Manipulate the resultset to be recieved by datatable
$data = $this->manipulateClaimDiaryData($data);
return new JsonResponse($data);
}
private function manipulateClaimDiaryData($data)
{
$data = $data['data'];
$result = [];
foreach ($data as $index => $row) {
$row['dueDate'] = date("m/d/Y", strtotime($row['dueDate']));
$row['dateCreated'] = date("m/d/Y H:i A", strtotime($row['dateCreated']));
if ($row['status'] == 1) {
$word = "Completed";
} else if (strtotime($row['dueDate']) < strtotime(date("Y-m-d"))) {
$word = "Overdue";
} else {
$word = "Pending";
}
$row['status'] = $word;
# store into another array
$result[$index] = $row;
}
$result['data'] = $result;
return $result;
}
/**
* @Route("/claim-diary/multiedit/{claim_id}/{diaries}", defaults={"diary_id" = "none"})
*/
public function editMultiDiaryRead($claim_id, $diaries,Request $request)
{
if ($claim_id) {
$diary = new DiaryEntry();
$claim = $this->getDoctrine()->getRepository('ClaimManagementBundle:Claim')->find($claim_id);
$this->denyAccessUnlessGranted("view_diaries_tab", $claim);
$Tblid=$diaries;
$DiaryId=explode('@',$Tblid);
//dd($DiaryId);
$diary=[];
foreach($DiaryId as $diary_id) {
//dd($Tblid);
$diaryEntry = $this->getDoctrine()->getRepository('ClaimManagementBundle:DiaryEntry')->find($diary_id);
//$diary[]['Resource']=$diaryEntry->getResource()->getId();
$diary[$diary_id]['Resource']=$diaryEntry->getResource()->getFullName();
$diary[$diary_id]['DueDate']=$diaryEntry->getDueDate();
$diary[$diary_id]['Priority']=$diaryEntry->getPriority();
$diary[$diary_id]['Description']=$diaryEntry->getDescription();
}
//dd($diary);
/**
* Added by AMH 2018-09-13, to restrict
* resource dropdown, so that if user is adjuster,
* he can only edit himself as the resource
*/
$User = $this->container->get("security.token_storage")->getToken()->getUser();
$optionsArray = [
'claim_id' => $claim->getId(),
'adjuster_id' => 0
];
if ($User->getRoles() == ["ROLE_ADJUSTER"]) {
$optionsArray['adjuster_id'] = $User->getId();
}
//$createForm = $this->createForm(DiaryFormType::class, $diary, $optionsArray);
return $this->render('ClaimManagementBundle:ClaimFlowScreen/Fragments/modals:multi-diary-edit-modal.html.twig', [
'diary' => $diary,
'claim' => $claim,
//'createForm' => $createForm->createView()
]);
} else {
throw new NotFoundHttpException('Could not find this claim!');
}
}
/**
* @Route("/claim-diary/multicomplete/{claim_id}", defaults={"diary_id" = null})
*/
public function multidiaryComplete($claim_id,Request $request)
{
// dd($request->request);
if ($claim_id) {
$dispatch = $this->get('event_dispatcher');
$Tblid=$request->request->get('diaries');
$DiaryId=explode('@',$Tblid);
//dd($DiaryId);
foreach($DiaryId as $diary_id) {
//dd($Tblid);
$diaryEntry = $this->getDoctrine()->getRepository('ClaimManagementBundle:DiaryEntry')->find($diary_id);
$diaryEntry->setStatus(1);
$em = $this->getDoctrine()->getManager();
$em->persist($diaryEntry);
$em->flush();
/**
* @date 08/11/2017
*
* Implementing service to push a note to the Claim
*
*/
$NoteService = $this->get('claim.note_provider');
// Todo ClaimDiaryAssignedEvent listener for this event
$dispatch->dispatch(ClaimDiaryCompleteEvent::NAME, new ClaimDiaryCompleteEvent($diaryEntry));
$NoteService->addClaimNote($diaryEntry->getClaim(), "Diary entry '" . $diaryEntry->getDescription() . "' was completed!", false, 70);
}
return new JsonResponse(['diary'=> $claim_id]);
} else {
throw new NotFoundHttpException('Could not find this claim!');
}
}
/**
* @Route("/claim-diary/multidiaryeditentry/{claim_id}", defaults={"diary_id" = null})
*/
public function multidiaryeditEntry($claim_id,Request $request)
{
$dispatch = $this->get('event_dispatcher');
// This is the EM we'll use
$em = $this->getDoctrine()->getManager();
$LoggedInUser = $this->container->get("security.token_storage")->getToken()->getUser();
if($claim_id){
$claim = $this->getDoctrine()->getRepository('ClaimManagementBundle:Claim')->find($claim_id);
$response = [];
$diaryFormData = $request->request->get('diary_form');
//dd($diaryFormData);
$Tblid=$request->request->get('strDiariesIds');
$DiaryId=explode('@',$Tblid);
//dd($DiaryId);
$i=0;
foreach($DiaryId as $diary_id) {
$diary = $this->getDoctrine()->getRepository('ClaimManagementBundle:DiaryEntry')->find($diary_id);
$taskAssignedResource = $em->getRepository("ResourceManagementBundle:Resource")->find($diary->getResource());
$diary->setDescription($diaryFormData['description'][$i]);
$diary->setResource($taskAssignedResource);
$diary->setDueDate(new \DateTime($diaryFormData['dueDate'][$i]));
$diary->setPriority($diaryFormData['priority'][$i]);
$diary->setStatus(0);
//$DiaryEntry->setDateCreated( new \DateTime() );
/**
* @date 08/11/2017
*
* Implementing service to push a note to the Claim
*
*/
$NoteService = $this->get('claim.note_provider');
$NoteService->addClaimNote($diary->getClaim(), "Diary entry status as pending and Due date was updated!", false, 70);
$em->persist($diary);
$em->flush();
$response['error'] = false;
$i++;
}
return new JsonResponse($response);
}else{
throw new NotFoundHttpException("Couldn't find this claim!");
}
}
/**
* @Route("/create/claim-diary/{claim_id}/{diary_id}", defaults={"diary_id" = null})
*/
public function addMultiDiaryEntry($claim_id, $diary_id, Request $request)
{
$dispatch = $this->get('event_dispatcher');
// This is the EM we'll use
$em = $this->getDoctrine()->getManager();
$LoggedInUser = $this->container->get("security.token_storage")->getToken()->getUser();
if($claim_id){
$claim = $this->getDoctrine()->getRepository('ClaimManagementBundle:Claim')->find($claim_id);
$diaryFormData = $request->request->get('diary_form');
$countRecord=count($diaryFormData['resource']);
//dd($countRecord);
for($i=0;$i<$countRecord;$i++){
$diary = new DiaryEntry();
$taskAssignedResource = $em->getRepository("ResourceManagementBundle:Resource")->find($diaryFormData['resource'][$i]);
$diary->setDescription($diaryFormData['description'][$i]);
$diary->setResource($taskAssignedResource);
$diary->setDueDate(new \DateTime($diaryFormData['dueDate'][$i]));
$diary->setPriority($diaryFormData['priority'][$i]);
$diary->setClaim($claim);
$diary->setAuthor($LoggedInUser);
$diary->setStatus(0);
$diary->setDateCreated( new \DateTime() );
$em->persist($diary);
$em->flush();
$NoteService = $this->get('claim.note_provider');
$dispatch->dispatch(ClaimDiaryAssignedEvent::NAME, new ClaimDiaryAssignedEvent($diary));
$NoteService->addClaimNote($diary->getClaim(), "Diary entry '" . $diary->getDescription() . "' was created!", false, 70);
}
$response['error'] = false;
return new JsonResponse($response);
}else{
throw new NotFoundHttpException("Couldn't find this claim!");
}
}
}