<?php
namespace Globals\ClaimManagementBundle\Controller\ClaimFlow;
use Globals\ClaimManagementBundle\DependencyInjection\FormHelpers\DisbursementTimeLogFormHelper;
use Globals\ClaimManagementBundle\Entity\Claim;
use Globals\CustomerManagementBundle\Entity\Customer;
use Globals\ResourceManagementBundle\Entity\Resource;
use Globals\ResourceManagementBundle\Service\SLogger;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Globals\ClaimManagementBundle\Form\DisbursementTimeLogType;
use Globals\InvoiceManagementBundle\Entity\Disbursement;
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;
/**
* @Route("/claims/fragments")
*/
class ClaimTimeLogController extends Controller
{
/**
* Time Log Datalist Route
*
* @Route("/time-log/{id}")
* @ParamConverter("claim", class="ClaimManagementBundle:Claim")
*/
public function timeLogAction(Claim $claim, Request $request)
{
$em = $this->getDoctrine()->getManager();
$company = $em->getRepository("CompanyManagementBundle:Company")->find(1);
$bShowRefUrl = false;
if ($claim) {
$this->denyAccessUnlessGranted("view_timelog_tab", $claim);
$hasInvoices = false;
$em = $this->container->get("doctrine.orm.default_entity_manager");
$HasInvoice = $em->getRepository("InvoiceManagementBundle:Invoice")->findFinalByClaimID($claim);
if ($HasInvoice) {
$hasInvoices = true;
}
$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;
}
$assignmentService = $this->get('claim.assignment');
$alertMessageDateExpiryArray = $assignmentService->validLicense($claim);
$alertMessageDateExpiry = $alertMessageDateExpiryArray['alertMessageDateExpiry'];
return $this->render(
'ClaimManagementBundle:ClaimFlowScreen/Fragments:time-log-fragment.html.twig',
[
'active' => 'time_log',
'claim' => $claim,
"hasInvoices" => $hasInvoices,
'company' => $company,
"daysOpen" => $daysOpen,
'bShowInvoiceAccessTab' => $bShowInvoiceAccessTab,
'alertMessageDateExpiry' =>$alertMessageDateExpiry,
"ShowRefUrl" =>$bShowRefUrl
]
);
} else {
throw new NotFoundHttpException('Could not find this claim!');
}
}
/**
* TimeLog Datalist Ajax Data Route
*
* @Route("/time-log/search/{id}")
*/
public function timeLog_AjaxAction(Request $request, Claim $claim)
{
# Make sure valid claim object was passed
if ($claim == null) {
throw $this->createNotFoundException("Claim does not exist.");
}
$User = $this->container->get("security.token_storage")->getToken()->getUser();
## Use PaginatorService to return paginated results to DataTables Ajax Request
$claimId = $claim->getId();
# Array of columns that will be sorted
$columnsArr = array(
"expenseName",
"description",
"quantity",
"cost",
"quantity",
"adjusterName",
"dateCreated",
"invoice_id"
);
$isTeExpense = $request->query->get("isTeExpense");
$isAdjuster = false;
if ($this->isGranted("ROLE_ADJUSTER") == true && $this->isGranted("ROLE_TEAM_LEADER") == false) {
$isAdjuster = true;
}
# Build Query and PDO Parameters that will be passed to PaginatorService class
$dataParams = array();
$sql = "SELECT sd.id,
ifnull(e.expenseName, e2.expenseName) as expenseName,
-- ifnull(eg.name, ifnull(eg2.name, sd.description)) as description,
sd.description as description,
sd.quantity, sd.cost,
CONCAT(r.first_name, ' ', r.last_name) AS adjusterName, sd.dateCreated, sd.invoice_id, "
. (($isAdjuster) ? "CASE WHEN r.id = " . $User->getId() . " AND c.sub_status_id = 0 THEN 1 ELSE 0 END" : "1") . " AS can_edit,
CASE
WHEN IFNULL(sd.invoice_id,0) != 0 THEN 0
ELSE 1
END AS can_delete
FROM disbursement sd
LEFT JOIN expense e
ON sd.expense_id = e.id
LEFT JOIN expense_group eg
ON e.expense_group_id = eg.id
LEFT JOIN customer_expense ce
ON sd.customer_expense_id = ce.id
LEFT JOIN expense e2
ON ce.expense_id = e2.id
LEFT JOIN expense_group eg2
ON e2.expense_group_id = eg2.id
INNER JOIN resource r
ON sd.resource_id = r.id
INNER JOIN claim c
ON sd.claim_id = c.id
WHERE 1 = 1 ";
# Filter by Resource ID
if ($claimId > 0) {
$sql .= "AND sd.claim_id = :claimId ";
$dataParams['claimId'] = $claimId;
}
if ($isTeExpense > -1) {
$sql .= "AND e.isTeExpense = :isTeExpense ";
$dataParams['isTeExpense'] = $isTeExpense;
}
# build keyword filter, which is requested by datatables ajax when someone types into keyword field
$keyword_filter = "AND (sd.description like :keyword OR e.expenseName like :keyword OR invoice_id LIKE :keyword) ";
# call PaginatorService
$paginator = $this->container->get("resource.paginator_service");
$retVal = $paginator->getPaginationResults($request, $sql, $dataParams, "sd.dateCreated ASC", $columnsArr, "", $keyword_filter, "keyword", "");
# Manipulate the resultset to be recieved by datatable
$Results2 = $retVal['data'];
$Results = array();
//$subtotal = 0;
$systemParamService = $this->container->get('core.system_parameter_control');
$systemAdminUsers = $systemParamService->getAccessArray('Invoicing_access');
$allowDelete = false;
$user = $this->get('security.token_storage')->getToken()->getUser();
if (!empty($systemAdminUsers) && in_array($user->getId(),$systemAdminUsers)) {
$allowDelete = true;
}
foreach ($Results2 as $index => $getResult) {
$getResult2 = $getResult;
//$subtotal += $getResult['cost'];
$cost = number_format($getResult['cost'], 2, ".", ",");
$total = number_format(($getResult['cost'] * $getResult['quantity']), 2, ".", ",");
$getResult2['dateCreated'] = date("m/d/Y", strtotime($getResult['dateCreated']));
$getResult2['cost'] = "$" . $cost;
$getResult2['total'] = "$" . $total;
$getResult2['allow_delete'] = $allowDelete ? "1" : "0";
unset($getResult2['entryDate']);
$Results[$index] = $getResult2;
}
$retVal['data'] = $Results;
return new JsonResponse($retVal);
}
/**
* ajax html content used when user tries
* to create a time log entry
*
* @Route("/time-log/add/{id}")
*/
public function timeLogModal(Claim $claim)
{
$hasInvoices = false;
$em = $this->container->get("doctrine.orm.default_entity_manager");
$HasInvoice = $em->getRepository("InvoiceManagementBundle:Invoice")->findFinalByClaimID($claim);
if ($HasInvoice) {
$hasInvoices = true;
}
$slog = new Slogger();
$User = $this->container->get("security.token_storage")->getToken()->getUser();
//dd($User->getRoles());
$this->denyAccessUnlessGranted("view_timelog_tab", $claim);
$adjuster_id = 0;
if ($User->getRoles() == ["ROLE_ADJUSTER"]) {
$adjuster_id = $User->getId();
}
$slog->log("ClaimId");
$slog->log($claim->getId());
$formFactory = $this->container->get("form.factory");
$ExpenseId='';
$AdjusterType='';
$FieldOrDesk='';
$CustomerId=0;
$CustomerExpense=$claim->getCustomer()->getAllowExpense();
$claimResources = $em->getRepository("ClaimManagementBundle:Assignments")->findBy(
[ "claim" => $claim]
);
//dd($CustomerExpense);
foreach ($claimResources as $getClaimResource) {
$getAdjustertype = $getClaimResource->getResource()->getResourceType()->getResourceType();
if ($getAdjustertype == "Desk Examiner") {
$AdjusterType .=$getClaimResource->getResource()->getId().'@0'.',';
}else if ($getAdjustertype == "Field Adjuster") {
$AdjusterType .=$getClaimResource->getResource()->getId().'@1'.',';
}else{
$AdjusterType .=$getClaimResource->getResource()->getId().'@3'.',';
}
}
$AdjusterType =rtrim($AdjusterType,',');
//echo "<pre>";
//print_r($AdjusterType);
//die;
if($CustomerExpense){
$CustomerId=$claim->getCustomer()->getId();
$expenseIds = $em->getRepository("InvoiceManagementBundle:CustomerExpense")->findBy(['customer'=>$CustomerId]);
//dd($expenseIds);
if(!empty($expenseIds)){
foreach ($expenseIds as $expenseKey=>$expense){
$ExpenseId .= $expense->getExpense()->getId().',';
if(!is_null($expense->getIsFieldOrDesk())) {
$FieldOrDesk .= $expense->getExpense()->getId() . '@' . $expense->getIsFieldOrDesk() . ',';
}
}
$ExpenseId =rtrim($ExpenseId,',');
$FieldOrDesk =rtrim($FieldOrDesk,',');
}
}
//dd($FieldOrDesk);
$form = $this->createForm(DisbursementTimeLogType::class, new Disbursement(), array('claim_id' => $claim->getId(), 'adjuster_id' => $adjuster_id));
return $this->render("@ClaimManagement/ClaimFlowScreen/Fragments/modals/add-expense-modal.html.twig", [
"claim" => $claim,
'form' => $form->createView(),
"hasInvoices" => $hasInvoices,
"CustomerId" => $CustomerId,
"ExpenseId" => $ExpenseId,
"FieldOrDesk" => $FieldOrDesk,
"AdjusterType" => $AdjusterType
]);
}
/**
* @Route("/claim/authenticate/{id}")
*/
public function claimAuthenticationAction(Claim $claim)
{
$hasPerils = false;
$hasAdjusters = false;
$hasResources = false;
$hasInvoices = false;
$hasFinalInvoice = false;
$hasDisbursements = false;
$isInspected = false;
$ResourcesHaveContracts = true;
$allContractData = array();
if ($claim) {
$em = $this->container->get("doctrine.orm.default_entity_manager");
//check for duplicate claim
$sql = "SELECT COUNT(*) as invoice_count
FROM invoice
WHERE claim_id = :claim_id";
$stmt = $em->getConnection()->prepare($sql);
$stmt->execute([
"claim_id" => $claim->getId()
]);
$claim_count = $stmt->fetchAll( \PDO::FETCH_ASSOC );
if( $claim_count[0]['invoice_count'] > 0 ){
$hasInvoices = true;
}
$HasFinalInvoice = $em->getRepository("InvoiceManagementBundle:Invoice")->findFinalByClaimID($claim);
if ($HasFinalInvoice) {
$hasFinalInvoice = true;
}
$HasResource = $em->getRepository("ClaimManagementBundle:Assignments")->findBy([
"claim" => $claim, "isCurrentAssignment" => true
]);
if (count($HasResource) > 0) {
$hasResources = true;
}
$HasAdjusters = $em->getRepository("ClaimManagementBundle:Assignments")->getAdjustersByClaim($claim);
if (count($HasAdjusters) > 0) {
$hasAdjusters = true;
}
$hasPerils = false;
$Claim = $em->getRepository("ClaimManagementBundle:Claim")->find($claim->getId());
if ($Claim->getPeril()) {
$hasPerils = true;
}
$em = $this->container->get("doctrine.orm.default_entity_manager");
$HasDisbursement = $em->getRepository("InvoiceManagementBundle:Disbursement")->findBy([
"claim" => $claim
]);
if (count($HasDisbursement) > 0) {
$hasDisbursements = true;
}
$ClaimResources = $em->getRepository("ClaimManagementBundle:Assignments")->findBy([
"claim" => $claim, "isCurrentAssignment" => true
]);
$slog = new SLogger();
$sql = "SELECT DISTINCT cc.w2_contract, cc.required
FROM company_contract cc
WHERE active = :active ";
$stmt = $em->getConnection()->prepare($sql);
$stmt->execute(['active' => 1]);
$results = $stmt->fetchAll( \PDO::FETCH_ASSOC );
$haveWingSpn = 'Y';
foreach ($results as $needsW2Val) {
#Check if the contract is required
if($needsW2Val['required']){
$slog->log("1");
foreach($ClaimResources as $getClaimResource){
$HasContractWingSpan = $em->getRepository("ResourceManagementBundle:Contract")->createQueryBuilder('rc')
->select('rc')
->where("rc.resource = :resource")
->andWhere("rc.status = :status")
->andWhere("rc.companyContract = :companyContract")
->setParameter("resource", $getClaimResource->getResource())
->setParameter("companyContract", 5)
->setParameter("status", 3)
->getQuery()
->setMaxResults(1)
->getOneOrNullResult();
if ($HasContractWingSpan == null) {
$slog->log("6");
$ResourcesHaveContracts = false;
$haveWingSpn = 'N';
}else{
if(!in_array($getClaimResource->getResource()->getId(),$allContractData))
$allContractData[] = $getClaimResource->getResource()->getId();
}
}
}
}
if($haveWingSpn == 'N'){
$ResourcesHaveContracts = true;
foreach ($results as $needsW2Val) {
#Check if the contract is required
if($needsW2Val['required']){
$slog->log("1");
foreach($ClaimResources as $getClaimResource){
#Check if W2 employee needs validation
if($needsW2Val['w2_contract']){
$slog->log("2");
#Validate only W2 employee
if($getClaimResource->getResource()->getIsW2()){
$HasContract = $em->getRepository("ResourceManagementBundle:Contract")->createQueryBuilder('rc')
->select('rc')
->where("rc.resource = :resource")
->setParameter("resource", $getClaimResource->getResource())
->andWhere("rc.status = :status")
->setParameter("status", 2)
->getQuery()
->setMaxResults(1)
->getOneOrNullResult();
$slog = new Slogger();
$slog->log('hascontract');
$slog->log($HasContract);
if ($HasContract == null) {
$slog->log("3");
$ResourcesHaveContracts = false;
}else{
if(!in_array($getClaimResource->getResource()->getId(),$allContractData))
$allContractData[] = $getClaimResource->getResource()->getId();
}
}
}else{ #otherwse, we validate only 1099 employee
$slog->log("4");
if(!$getClaimResource->getResource()->getIsW2()){
$slog->log("5");
$HasContract = $em->getRepository("ResourceManagementBundle:Contract")->createQueryBuilder('rc')
->select('rc')
->where("rc.resource = :resource")
->setParameter("resource", $getClaimResource->getResource())
->andWhere("rc.status = :status")
->setParameter("status", 2)
->getQuery()
->setMaxResults(1)
->getOneOrNullResult();
if ($HasContract == null) {
$slog->log("6");
$ResourcesHaveContracts = false;
}else{
if(!in_array($getClaimResource->getResource()->getId(),$allContractData))
$allContractData[] = $getClaimResource->getResource()->getId();
}
}
}
}
}
}
}
$isInspected = $claim->getIsInspected();
/*if($needsInspection){;
$isInspected = $claim->getIsInspected();
$slog->log("isInspected ".$isInspected);
}else{
$isInspected = true;
$slog->log("isInspected ".$isInspected);
}*/
}
if(count($allContractData) == count($ClaimResources)){
$ResourcesHaveContracts = true;
}
$systemParamService = $this->container->get('core.system_parameter_control');
$isRequireResourceHaveContract = $systemParamService->getSystemControlData("requires_resources_have_contract");
if('0' === $isRequireResourceHaveContract){
$ResourcesHaveContracts = true;
}
$isRequireSiteInspectionComplete = $systemParamService->getSystemControlData("requires_site_inspection_complete");
if('0' === $isRequireSiteInspectionComplete){
$isInspected = true;
}
$retVal = array(
"hasInvoices" => $hasInvoices,
"hasFinalInvoice" => $hasFinalInvoice,
"hasResources" => $hasResources,
"hasAdjusters" => $hasAdjusters,
"hasDisbursements" => $hasDisbursements,
"hasPerils" => $hasPerils,
"ResourcesHaveContracts" => $ResourcesHaveContracts,
"isInspected" => $isInspected
);
return new JsonResponse($retVal);
}
/**
* @Route("/claim/has_disbursements/{id}")
*/
public function claimHasDisbursmentsAction(Claim $claim)
{
$retVal = array(
"hasDisbursements" => false
);
return new JsonResponse($retVal);
}
/**
* @Route("/time-log/edit/{claimId}/{disbursementId}")
*/
public function timeLogEditAction($claimId, $disbursementId)
{
$hasInvoices = false;
$em = $this->container->get("doctrine.orm.default_entity_manager");
$claim = $em->getRepository("ClaimManagementBundle:Claim")->find($claimId);
$disbursement = $em->getRepository("InvoiceManagementBundle:Disbursement")->find($disbursementId);
$customerExpenseId = 0;
$disbursementId = $disbursement->getExpense()->getId();
$customerExpense = $disbursement->getCustomerExpense();
if ($customerExpense) {
$customerExpenseId = $customerExpense->getId();
}
$HasInvoice = $em->getRepository("InvoiceManagementBundle:Invoice")->findFinalByClaimID($claim);
if ($HasInvoice) {
$hasInvoices = true;
}
$form = $this->createForm(DisbursementTimeLogType::class, $disbursement, array('claim_id' => $claim->getId()));
return $this->render("@ClaimManagement/ClaimFlowScreen/Fragments/modals/edit-expense-modal.html.twig", [
"claim" => $claim,
'form' => $form->createView(),
"hasInvoices" => $hasInvoices,
"disbursement" => $disbursement,
"expenseId" => $disbursementId,
"customerExpenseId" => $customerExpenseId
]);
}
/**
* @Route("/time-log/delete/{id}")
* @Method(methods={"POST"})
*/
public function deleteTimeLogAction(Request $request, Claim $claim)
{
$em = $this->container->get("doctrine.orm.entity_manager");
# Request ID to delete
$id = intval($request->request->get("id"));
$deleteReason = $request->request->get("deleteReason", "");
$user = $this->get('security.token_storage')->getToken()->getUser();
$username = ($user instanceof Resource) ? $user->getFullName() : "";
# Delete Certificate
$Disbursement = $em->getRepository("InvoiceManagementBundle:Disbursement")->find($id);
$ClaimNote = $this->container->get("claim.note_provider");
$ClaimNote->addClaimNote(
$claim,
sprintf("Disbursement %s was deleted from Claim by %s with reason (%s)",
$Disbursement->getExpense()->getExpenseName(), $username, $deleteReason),
false,
61
);
$em->remove($Disbursement);
$em->flush();
/*$retVal = array(
"status" => "success",
"error_msgs" => []
);*/
$retVal = array(
'error' => false,
'error_msgs' => []
);
return new JsonResponse($retVal);
}
/**
* @Route("/auto_expenses/get/{customer}/{claim_id}")
* @ParamConverter("customer", class="CustomerManagementBundle:Customer")
*/
public function getAutoExpenses(Customer $customer, $claim_id)
{
$em = $this->container->get("doctrine.orm.default_entity_manager");
if($customer){
$autoExpenses = [];
$sql = "SELECT ce.id, ce.isAutoExpense, e.expenseName, ce.cost, ce.expense_id
FROM customer_expense ce
LEFT JOIN expense e ON ce.expense_id = e.id
WHERE customer_id = :customer_id
AND ce.isAutoExpense = :isAutoExpense";
$dataParams = array();
$dataParams['customer_id'] = $customer->getId();
$dataParams['isAutoExpense'] = 1;
$stmt = $em->getConnection()->prepare($sql);
$stmt->execute($dataParams);
$customerExpenses = $stmt->fetchAll(\PDO::FETCH_ASSOC);
$i = 0;
foreach($customerExpenses as $customerExpense) {
/*$sql = "SELECT *
FROM disbursement
WHERE expense_id = :expense_id";
$dataParams = array();
$dataParams['expense_id'] = $customerExpense['id'];
$stmt = $em->getConnection()->prepare($sql);
$stmt->execute($dataParams);
$disbursementExists = $stmt->fetchAll(\PDO::FETCH_ASSOC);*/
//if ($customerExpense['isAutoExpense'] == 1) {
array_push($autoExpenses, [
"identifier" => $i,
"description" => $customerExpense['expenseName'],
"amount" => $customerExpense['cost'],
"expense" => $customerExpense['expense_id'],
"customerExpense" => $customerExpense['id']
]);
$i++;
// }
}
return $this->render("@ClaimManagement/ClaimFlowScreen/Fragments/modals/auto-expense-modal.html.twig", [
"lastIdentifier" => $i,
"autoExpenses" => $autoExpenses,
"claim_id" => $claim_id
]);
}else{
throw new NotFoundHttpException("Couldn't find this customer!");
}
}
/**
* @Route("/auto_expenses/load")
*/
public function getAutoExpenseSubtotal(Request $request)
{
$data = $request->request->get('autoExpense');
# number of items
$quantity = $data['qty'];
# cost in string
$cost = $data['amount'];
# proper dollar amount
$cost = floatval(ltrim($cost, '$'));
# total
$subtotal = $quantity * $cost;
return new JsonResponse(['subtotal' => $subtotal]);
}
}