<?php
namespace Diplix\KMGBundle\Controller\Dispatching;
use Diplix\Commons\DataHandlingBundle\Entity\SysLogEntry;
use Diplix\Commons\DataHandlingBundle\Repository\SysLogRepository;
use Diplix\KMGBundle\Controller\BaseController;
use Diplix\KMGBundle\Controller\Service\Api2Controller;
use Diplix\KMGBundle\DataTables\DataTablesHelper;
use Diplix\KMGBundle\Entity\Accounting\Billing;
use Diplix\KMGBundle\Entity\Accounting\CoopMember;
use Diplix\KMGBundle\Entity\Accounting\Job;
use Diplix\KMGBundle\Entity\Accounting\JobInterestExpression;
use Diplix\KMGBundle\Entity\Address;
use Diplix\KMGBundle\Entity\Availability;
use Diplix\KMGBundle\Entity\Dispatching\ChatMessage;
use Diplix\KMGBundle\Entity\Dispatching\DispatchQueueItem;
use Diplix\KMGBundle\Entity\Note;
use Diplix\KMGBundle\Entity\Order;
use Diplix\KMGBundle\Entity\OrderStatus;
use Diplix\KMGBundle\Entity\Platform\PlatformClient;
use Diplix\KMGBundle\Entity\Role;
use Diplix\KMGBundle\Entity\Setting;
use Diplix\KMGBundle\Entity\User;
use Diplix\KMGBundle\Form\Dispatching\NoteDoneForm;
use Diplix\KMGBundle\Form\Dispatching\NoteForm;
use Diplix\KMGBundle\Form\Dispatching\OrderDispatchStatusForm;
use Diplix\KMGBundle\Helper\ChatMessageNormalizer;
use Diplix\KMGBundle\Helper\SimpleFileNormalizer;
use Diplix\KMGBundle\Repository\OrderRepository;
use Diplix\KMGBundle\Service\ArrayLogWrapper;
use Diplix\KMGBundle\Service\JobAllocator;
use Diplix\KMGBundle\Service\MobileNotifier;
use Diplix\KMGBundle\Service\Notifier;
use Diplix\KMGBundle\Service\OrderHandler;
use Doctrine\ORM\AbstractQuery;
use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\QueryBuilder;
use Doctrine\ORM\Tools\Pagination\Paginator;
use Liip\ImagineBundle\Imagine\Cache\CacheManager;
use PhpImap\Mailbox;
use SecIT\ImapBundle\Service\Imap;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Serializer\Encoder\JsonEncoder;
use Symfony\Component\Serializer\Normalizer\DateTimeNormalizer;
use Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer;
use Symfony\Component\Serializer\Serializer;
class DashboardController extends BaseController
{
protected $chatRepo;
public function __construct(
protected MobileNotifier $mobileNotifier,
protected Notifier $notifier,
protected OrderHandler $orderHandler,
protected Imap $imapService,
protected CacheManager $imgagineCacheManager,
private readonly \Doctrine\Persistence\ManagerRegistry $managerRegistry
)
{
}
protected function init()
{
$this->ensureUserHasRole(Role::DISPO);
}
protected function getMembers()
{
$repo = $this->managerRegistry->getRepository(CoopMember::class);
return $repo->findBy(["active"=>true],['shortCode'=>'asc']);
}
protected function getUsersWhichAreMember()
{
$repo = $this->managerRegistry->getRepository(User::class);
return $repo->findUsersWhichAreMember();
}
protected function isDashoardPermitted(?string $dispatchCategory): bool
{
$possible = $this->getCurrentUser()->getDashboards();
$categoryToCheck = $dispatchCategory ?? PlatformClient::DEFAULT_DASHBOARD;
return in_array($categoryToCheck, $possible, true);
}
public function dashboard2Action(Request $request)
{
$this->init();
$osr = $this->managerRegistry->getRepository(OrderStatus::class)->getByIdMap();
$osr = array_map(function($el){ return $el->getName();},$osr);
$dispatchCategory = $request->query->get('category',null);
if (!$this->isDashoardPermitted($dispatchCategory))
{
$this->addFlash('danger','Bitte prüfen Sie Ihre Berechtigungen');
return $this->redirectToRoute('kmg_home');
}
return $this->render('@DiplixKMG/Dispatching/dashboard_react.html.twig',[
'members' => $this->getMembers(),
'dispatchCategory' => $dispatchCategory,
'statusMap' => $osr,
]);
}
protected function prepareOrderArrayForOutput(&$arr)
{
if ($arr === null) return null;
$arr['orderStatus'] = $arr['orderStatus']['id'];
$arr['orderTime'] = $arr['orderTime']->format(Api2Controller::DATE_FORMAT);
$arr['jobPdfRequestedOn'] = $arr['jobPdfRequestedOn'] !==null ? $arr['jobPdfRequestedOn']->format(Api2Controller::DATE_FORMAT) : null;
$arr['assignedTo'] = $arr['assignedTo'] !== null ? $arr['assignedTo']['id'] : null;
$route = [];
foreach ($arr['addressList'] as $a)
{
$route [] = sprintf('%s', $a['city']);
}
$route = implode(' > ',$route);
$arr['route'] = $route;
return $arr;
}
public function dashboardData2Action(Request $request)
{
$this->init();
/** @var EntityRepository $repo */
$repo = $this->managerRegistry->getRepository(Order::class);
/** @var QueryBuilder $cb */
$cb = $repo->getQb();
$dispatchCategory = $request->query->get('category',null);
if (!$this->isDashoardPermitted($dispatchCategory))
{
return $this->getJsonDataResponse($request,false,null,"Bitte prüfen Sie Ihre Berechtigungen");
}
if (!empty($dispatchCategory))
{
$cb->andWhere('A.dispatchCategory = :dicat')->setParameter('dicat',$dispatchCategory);
}
else
{
$cb->andWhere('A.dispatchCategory is null');
}
// hide some
// $cb->andWhere('A.remoteStatus != :rs')->setParameter('rs',Order::REMOTE_PENDING);
$cb->andWhere( $cb->expr()->notIn('A.orderStatus',':hiddenStati'))
->setParameter('hiddenStati',[OrderStatus::STATUS_CANCELED, OrderStatus::STATUS_DRAFT, OrderStatus::STATUS_INSTANT_ORDER_PENDING]);
// only rides to x days to the future
$from = new \DateTime(); $from->setTime(0,0,0); $from->sub(new \DateInterval('P1D'));
$to = clone $from;
$to->add(new \DateInterval('P150D')); $to->setTime(23,59,59);
$cb->andWhere('A.orderTime <= :to')->setParameter('to',$to);
// all rides from yesterday, independant of status
$cb->andWhere($cb->expr()->gte("A.orderTime",":from"))
->setParameter('from',$from);
/*
// limit finished rides but always show all open rides
$cb->andWhere($cb->expr()->orX(
$cb->expr()->eq('A.orderStatus',OrderStatus::STATUS_OPEN),
$cb->expr()->gte("A.orderTime",":from")
))->setParameter('from',$from);
*/
$cb->orderBy('A.orderTime');
$data = $cb->getQuery()->getResult(AbstractQuery::HYDRATE_ARRAY);
$id2i = [];
for ($i=0;$i<$ic=count($data);$i++) {
$this->prepareOrderArrayForOutput($data[$i]);
$data[$i]['hasInterest'] = false;
$id2i[$data[$i]['orderId']] = $i;
}
$fer = $this->managerRegistry->getRepository(JobInterestExpression::class);
$fe = $fer->findFutureInterests($from);
/** @var JobInterestExpression $row */
foreach ($fe as $row)
{
$on = $row->getJob()->getKnownOrder()->getOrderId();
if (array_key_exists($on,$id2i))
{
$data[ $id2i[$on] ] ['hasInterest'] = true;
}
}
return new JsonResponse([
'success' => true,
'from' => $from,
'until' => $to,
'data' => $data
]);
}
/**
* @param $id
* @param int $hydrationMode
* @return array|Order
* @throws \Doctrine\ORM\NoResultException
* @throws \Doctrine\ORM\NonUniqueResultException
*/
protected function fetchSingle($id, $hydrationMode = AbstractQuery::HYDRATE_ARRAY)
{
/** @var OrderRepository $repo */
$repo = $this->managerRegistry->getRepository(Order::class);
$cb = $repo->getQb()->where('A.id = :id')->setParameter('id',$id);
return $cb->getQuery()->getSingleResult($hydrationMode);
}
public function singleDataAction(Request $request, $id)
{
try {
$item = $this->fetchSingle($id);
$this->prepareOrderArrayForOutput($item);
return $this->getJsonDataResponse($request,true, $item);
}
catch (\Throwable $ex)
{
return $this->getJsonDataResponse($request,false,null,$ex->getMessage());
}
}
public function assignMemberAction(Request $request, $orderId, $memberId)
{
$this->init();
try {
$order = $this->fetchSingle($orderId,AbstractQuery::HYDRATE_OBJECT);
// if ($order->getXchgTo()!==null)
// {
// throw new \RuntimeException('Fahrt ist Fremdystem zugeordnet.');
// }
$oh = $this->orderHandler;
$oh->setTransactionTag($request->query->get('transactionTag',''));
$order = $oh->assignMemberToOrder((int)$orderId, $memberId);
$item = $this->fetchSingle($order->getId());
$this->prepareOrderArrayForOutput($item);
return $this->getJsonDataResponse($request,true, $item);
}
catch (\Throwable $ex)
{
$item = $this->fetchSingle($orderId);
$this->prepareOrderArrayForOutput($item);
return $this->getJsonDataResponse($request,false,$item,$ex->getMessage());
}
}
public function triggerMemberNotificationAction(Request $request, $orderId)
{
$this->init();
try {
$order = $this->fetchSingle($orderId,AbstractQuery::HYDRATE_OBJECT);
if ($order->getAssignedTo()===null)
{
throw new \RuntimeException('Kein Mitglied zugewiesen.');
}
$this->notifier->triggerOrderUpdateForMember($order,Notifier::M_CONFIRMATION_REQUIRED);
return $this->getJsonDataResponse($request,true);
}
catch (\Throwable $ex)
{
return $this->getJsonDataResponse($request,false,null,'Benachrichtigung fehlgeschlagen: ' . $ex->getMessage());
}
}
public function contextAction(Request $request)
{
$this->init();
$osr = $this->managerRegistry->getRepository(OrderStatus::class)->getByIdMap();
$statusMap = array_map(function($el){ return $el->getName();},$osr);
$memberList = $this->getMembers();
return $this->getJsonDataResponse($request,true,[
'memberList' => $memberList,
'statusMap' => $statusMap
]);
}
public function memberUserListAction(Request $request)
{
$this->init();
return $this->getJsonDataResponse($request,true,[
'userList' => $this->getUsersWhichAreMember(),
]);
}
public function deviceLogAction(Request $request , $orderId)
{
$this->init();
$sysRepo = $this->managerRegistry->getRepository(SysLogEntry::class);
$dqiRepo = $this->managerRegistry->getRepository(DispatchQueueItem::class);
$order = $this->managerRegistry->getManager()->find(Order::class,$orderId);
// queue items
$items = $dqiRepo->findBy([
'order' => $order,
]);
$idList = array_map(function ($o){ return $o->getId(); },$items);
$shortedList = [];
$idx = 1;
foreach ($idList as $id)
{
$shortedList[$id] = $idx++;
}
$sortedItems= [];
foreach ($items as $i)
{
$sortedItems[$i->getId()] = $i;
}
//print_r($idList);
$data = $sysRepo->findBy([
'refStr' => $idList,
'type' => MobileNotifier::LOG_TYPE
],['logTime'=>'desc']);
$html = '<table class="table">';
/** @var SysLogEntry $one */
foreach ($data as $one)
{
$ref = $sortedItems[$one->getRefStr()] ?? null;
$html .= sprintf('<tr>
<td>%s</td>
<td title="%s">%s</td>
<td>%s</td>
<td>%s</td>
<td>%s</td>
</tr>',
$one->getLogTime()->format('d.m.y H:i:s'),
$one->getRefStr(),
$shortedList[$one->getRefStr()],
$one->getMessage(),
$ref !== null ? ($ref->getMember() !== null ? $ref->getMember()->getName() : '-kein-') : 'null',
$ref !== null ? ($ref->getBeOwner() !== null ? $ref->getBeOwner()->getShortName() : '-kein-Besitzer-') : 'null'
);
}
if (count($data)<1)
{
$html.= '<tr><td> - keine Daten -</td></tr>';
}
$html .='</table>';
return $this->getJsonDataResponse($request,true, $html);
}
public static function checkImapMailStatus(Mailbox $box)
{
$result = [
'mails' => -1,
'unread' => -1,
'error' => null
];
try {
$info = $box->getMailboxInfo();
$result['mails'] = $info->{'Nmsgs'};
$result['unread'] = $info->{'Unread'};
}
catch (\Throwable $ex)
{
$result['error'] = $ex->getMessage();
}
return $result;
}
public function checkImapStatusAction(Request $request)
{
$this->init();
$result = self::checkImapMailStatus($this->imapService->get('kmg_dispo'));
return $this->getJsonDataResponse($request,($result['error']===null), $result);
}
protected function sendMessageToSingleMember(User $u, $msg, $parent = null)
{
assert($u->getMember()!==null);
$message = ChatMessage::textTo($u,$msg);
if ($parent!==null)
{
$message->setGroupParent($parent);
}
$this->chatRepo->persistFlush($message);
$message->setQueueItem( DispatchQueueItem::createFor(DispatchQueueItem::ACT_MESSAGE,$u->getMember(),$u,$this->getCurrentUser()));
$this->mobileNotifier->queue($message->getQueueItem());
$this->chatRepo->persistFlush($message);
$this->notifier->notifyWebSocketAboutChatMessage($message);
$this->mobileNotifier->dispatchSingle($message->getQueueItem());
return $message;
}
public function sendMessageToMemberAction(Request $request)
{
$this->init();
$this->chatRepo = $this->managerRegistry->getRepository(ChatMessage::class);
$userRepo = $this->managerRegistry->getRepository(User::class);
$data = \GuzzleHttp\json_decode($request->getContent(),true);
$u = $data['userId'];
$msg = $data['message'];
if ($u!==0)
{
$all = [ $userRepo->findOneBy(['id'=>$u]) ];
}
else {
$all = $userRepo->findUsersWhichAreMember();
}
$parent = null;
/** @var User $targetUser */
foreach ($all as $targetUser)
{
$m = $this->sendMessageToSingleMember($targetUser,$msg,$parent);
if ($parent===null)
{
$parent = $m;
}
}
return $this->getJsonDataResponse($request,true);
}
public function getMessagesAction(Request $request, $userId)
{
$this->init();
$chatRepo = $this->managerRegistry->getRepository(ChatMessage::class);
$userRepo = $this->managerRegistry->getRepository(User::class);
$all = $chatRepo->findFor((int)$userId);
$serializer = ChatMessage::getSerializer( $this->imgagineCacheManager );
$data = $serializer->serialize($all, 'json',["filterName"=>"avatar_small"]);
return $this->getJsonDataResponse($request,true,json_decode($data,false));
}
public function getNotesAction(Request $request)
{
$this->init();
$noteRepo = $this->managerRegistry->getRepository(Note::class);
$all = $noteRepo->findMyNotes($this->getCurrentUser(),false);
$data = array_map(function(Note $el){
return [
'id' => $el->getId(),
'text' => $el->getText(),
'startTime' => $el->getStartTime()->format('d.m.y H:i:s'),
'done' => $el->getDone() !== null,
'type' => $el->getType(),
'audience' => $el->getAudience() !== null ? $el->getAudience()->getLastName() : null,
'customer' => $el->getCustomer() !== null ? $el->getCustomer()->getName() : null
];
},$all);
return $this->getJsonDataResponse($request,true,$data);
}
public function memberAvailabilityAction(Request $request, $orderId)
{
$this->init();
$orderRepo = $this->managerRegistry->getRepository(Order::class);
$userRepo = $this->managerRegistry->getRepository(User::class);
$memberRepo = $this->managerRegistry->getRepository(CoopMember::class);
$avRepo = $this->managerRegistry->getRepository(Availability::class);
$jexRepo = $this->managerRegistry->getRepository(JobInterestExpression::class);
$order = $orderRepo->findOneBy(['id'=>$orderId]);
$orderTime = $order->getOrderTime();
// $memberUser = $userRepo->findUsersWhichAreMember();
$memberList = $memberRepo->findBy(['showInCalendar'=>true]);
// a) alle termine im zielzeitraum
$now = new \DateTime();
$avsByMember = $avRepo->findForRange($orderTime,$orderTime,true,null,false);
// b) bereitschaftsmeldungen für den aktuellen tag
$readyByMember = $avRepo->findForRange($now,$now,true,null,false,null,null,[Availability::READY]);
// c) fahrten heutiger tag
$ridesToday = $orderRepo->findAssignedToAnyMemberForDay($now);
// d) Interessenmeldungungen
$interests = $jexRepo->findFutureInterests(null,[$order->getJob()->getId()]);
$interestMemberIds = [];
/** @var JobInterestExpression $i */
foreach ($interests as $i)
{
$interestMemberIds[]= $i->getMember()->getId();
}
// [..]
/*
*
* -> Anzahl Fahrten heutiger Tag pro Mitglied in der Wertigkeit Ihrer Ready-Meldung (die je nach Zeitabstand unterschiedlich hoch ist - erste Meldung am
* höchsten, spätere Meldung niederwertiger)
*
* Tag fängt um 0 Uhr an.
* Fahrt um 12. Erste Anmeldung am Tag kommt dran (z.B. Anmeldungen um 9 ,11, 11:55) --> Anmeldung von 9 kommt zum Zug
*
* falls bereits Fahrt an dem Tag -1, wieder Bereit gemeldet + 1 , Reihenfolge der Anmeldezeiten bleibt gewichtet (zuerst gemeldet = erster)
*
*
* Leute ohne Einträge -> wer die wenigsten Fahrten am Tag hat kommt zum Zug
*
*
*
* + Fahrten am Tag anzeigen
* + anzeigee Shortcode
*
*
*
*/
// gewichten
$weightsByMember = [];
$commentsByMember = [];
$members = [];
/** @var CoopMember $m */
foreach ($memberList as $m)
{
if (!array_key_exists($m->getId(),$weightsByMember))
{
$memberId = $m->getId();
$weightsByMember[ $memberId ] = 100;
$commentsByMember[ $memberId ] = [];
if ($m->isCoopPartner())
{
$weightsByMember[ $memberId ] -= 30;
$commentsByMember[$memberId] []= '-30 Kooperationspartner';
}
if (in_array($m->getId(),$interestMemberIds))
{
$weightsByMember[ $memberId ] += 10;
$commentsByMember[$memberId] []= '+10 Interesse bekundet';
}
}
$members[$m->getId()] = $m;
}
// auf orderTime liegende Termine führen zu Abzug
foreach ($avsByMember as $memberId => $avList)
{
/** @var Availability $av */
foreach ($avList as $av)
{
if (!array_key_exists($memberId,$weightsByMember))
{
continue; // throw new \RuntimeException(sprintf('member#%d unknown in availability#%d',$memberId,$av->getId()));
}
if ($av->getAvailType()=== Availability::NOT_AVAILABLE)
{
if (in_array($memberId,$interestMemberIds))
{
// falls intessiert zählt N/V nicht
$commentsByMember[$memberId] []= '-0 Nicht verfügbar (nicht gezählt da Interesse bekundet)';
}
else
{
$weightsByMember[$memberId] -= 50;
$commentsByMember[$memberId] []= '-50 Nicht verfügbar';
}
}
else
if ($av->getAvailType()!== Availability::READY)
{
$weightsByMember[$memberId] -= 1;
$commentsByMember[$memberId] []= '-1 Kalendereintrag';
}
}
}
// Ready-Meldungen
foreach ($readyByMember as $memberId => $avList)
{
$rides = array_key_exists($memberId,$ridesToday) ? $ridesToday[$memberId] : [];
$lastRide = count($rides)>0 ? end($rides) : null;
$lastAv = count($avList)>0 ? end($avList) : null;
if (($lastRide!==null)&&($lastAv!==null))
{
if ($lastAv->getAvailFrom() > $lastRide->getOrderTime())
{
$minutes = ($now->getTimestamp() - $av->getAvailFrom()->getTimestamp())/60;
$faktor = 1 * max(floor($minutes/30),1);
$weightsByMember[$memberId] += $faktor;
$commentsByMember[$memberId] [] = sprintf("+%d Verfügbar nach Fahrt",$faktor);
}
}
else
if ($lastAv!==null)
{ // an dieser Stelle Verfügbar ber bisher keine Fahrt heute
$minutes = ($now->getTimestamp() - $av->getAvailFrom()->getTimestamp())/60;
$faktor = 2 * max(ceil($minutes/30),1);
$weightsByMember[$memberId] += $faktor;
$commentsByMember[$memberId] [] = sprintf("+%d Verfügbar heute",$faktor);
}
else
if ($lastRide!==null)
{
// an diesr Stelle Fahrt aber keine Verfügbarkeitsmeldung
$weightsByMember[$memberId] -= 5;
$commentsByMember[$memberId] [] = "-5 Fahrt um".$lastRide->getOrderTime()->format("H:i");
}
}
arsort($weightsByMember); // sort by descending weight
return $this->getJsonDataResponse(
$request,
true,
[
'html' =>
$this->renderView('@DiplixKMG/Dispatching/member-availabilites-for-order.html.twig',[
'weight'=>$weightsByMember,
'members'=>$members,
'avByMember'=>$avsByMember,
'readyByMember'=>$readyByMember,
'avDisplayMap' => Availability::$displayMap,
'avColorMap'=> Availability::$colorMap
]),
'weight'=>$weightsByMember,
'members'=>$members,
'avByMember'=>$avsByMember,
'readyByMember'=>$readyByMember,
'avDisplayMap' => Availability::$displayMap,
'avColorMap'=> Availability::$colorMap,
'comments'=>$commentsByMember
]
);
}
public function testAllocatorAction(Request $request)
{
$this->init();
$orderRepo = $this->managerRegistry->getRepository(Order::class);
// Bestellungen
$start = (new \DateTime())->modify('+ 1 day')->setTime(0,0,0,0);
$end = clone $start;
$end->setTime(8,59,59);
$orders = $orderRepo->findNotAssignedToAnyMemberForDateRange($start,$end);
$memberRepo = $this->managerRegistry->getRepository(CoopMember::class);
$members = $memberRepo->findBy(['showInCalendar'=>true]);
$membersById = [];
foreach ($members as $m)
{
$membersById[$m->getId()] = $m;
}
$setRepo = $this->managerRegistry->getRepository(Setting::class);
$allocEnabled = $setRepo->getOptional(Setting::AUTOMATIC_RIDE_ASSIGNMENT,false);
// assignment
$arrLog = new ArrayLogWrapper();
$jac = new JobAllocator($this->managerRegistry->getManager(),$arrLog);
$results = $jac->assignForNextDayProposal();
return $this->render('@DiplixKMG/Dispatching/alloc.html.twig',[
'orders'=>$orders,
'allocEnabled'=>$allocEnabled,
'members' => $membersById,
'map'=>$results,
'log'=> $arrLog->get()
]);
}
public function setAutomaticAction(Request $request,$mode)
{
$this->init();
$setRepo = $this->managerRegistry->getRepository(Setting::class);
$setRepo->set(Setting::AUTOMATIC_RIDE_ASSIGNMENT,$mode==='on'?true:false);
return $this->redirectToRoute('dispatch-preview-allocator');
}
public function checkLoggedInAction(Request $request)
{
// actually this is not working in combination with the configured firewall/access_control
// as long as we can reach this point and send any response we are still logged in
// otherwise symfony triggers a redirect
if(!$this->isGranted(Role::USER))
{
return $this->getJsonDataResponse($request,false);
}
return $this->getJsonDataResponse($request,true);
}
public function editNoteAction(Request $request , $noteId)
{
$this->init();
$em = $this->managerRegistry->getManager();
$noteRepo = $em->getRepository(Note::class);
if ($noteId==0)
{
$row = new Note();
$row->setStartTime(new \DateTimeImmutable());
}
else
{
$row = $noteRepo->find($noteId);
if ($row===null)
{
return $this->getJsonDataResponse($request,false,null,'Notiz nicht gefunden');
}
}
try {
$form = $this->createForm(NoteForm::class,$row,[]);
$form->handleRequest($request);
if ($form->isSubmitted())
{
if ($form->isValid())
{
$em->persist($row);
$em->flush();
return $this->getJsonDataResponse($request,true);
}
return $this->getJsonDataResponse($request,false,
$this->renderView('@DiplixKMG/Default/dialog_edit.html.twig',[
'form' =>$form->createView(),
'row' =>$row,
]),
'Bitte überprüfen Sie Ihre Eingabe. '.$form->getErrors()->__toString());
}
return $this->getJsonDataResponse(
$request,
true,
$this->renderView('@DiplixKMG/Default/dialog_edit.html.twig',[
'form' =>$form->createView(),
'row' =>$row,
])
);
}
catch (\Exception $ex)
{
//throw $ex;
return $this->getJsonDataResponse($request,false,$ex->getMessage(),$ex->getMessage());
}
}
public function doneNoteAction(Request $request , $noteId)
{
$this->init();
$em = $this->managerRegistry->getManager();
$noteRepo = $em->getRepository(Note::class);
$row = $noteRepo->find($noteId);
if ($row===null)
{
return $this->getJsonDataResponse($request,false,null,'Notiz nicht gefunden');
}
try {
$form = $this->createForm(NoteDoneForm::class,$row,[]);
$form->handleRequest($request);
if ($form->isSubmitted())
{
if ($form->isValid())
{
$row->setDone(new \DateTimeImmutable());
$em->flush();
return $this->getJsonDataResponse($request,true);
}
return $this->getJsonDataResponse($request,false,
$this->renderView('@DiplixKMG/Default/dialog_edit.html.twig',[
'form' =>$form->createView(),
'row' =>$row,
]),
'Bitte überprüfen Sie Ihre Eingabe. '.$form->getErrors()->__toString());
}
return $this->getJsonDataResponse(
$request,
true,
$this->renderView('@DiplixKMG/Default/dialog_edit.html.twig',[
'form' =>$form->createView(),
'row' =>$row,
])
);
}
catch (\Exception $ex)
{
//throw $ex;
return $this->getJsonDataResponse($request,false,$ex->getMessage(),$ex->getMessage());
}
}
}