<?php
//----------------------------------------------------------------------
// src/Logging/Tools.php
// Plan.io Task #3922
//----------------------------------------------------------------------
namespace App\Logging;
use Doctrine\Persistence\ManagerRegistry;
use Symfony\Component\PropertyAccess\PropertyAccess;
use Symfony\Contracts\Translation\TranslatorInterface;
use App\Entity\Common\Attachment;
use App\Entity\Ikea\ServiceOrder;
use App\Entity\Ikea\Template as IkeaTemplate;
use App\Entity\Platform\Devis\Devis;
use App\Entity\Platform\Invoice\Invoice;
use App\Entity\ProjectManager\Blueprint;
use App\Entity\ProjectManager\ProjectNotebookItem;
use App\Entity\Webapp\Document;
use App\Logging\DeletionContextLogger;
use App\Services\LogTools;
class Tools
{
public function __construct(ManagerRegistry $doctrine, TranslatorInterface $translator, LogTools $logTools, DeletionContextLogger $contextLogger)
{
$this->em = $doctrine->getManager();
$this->translator = $translator;
$this->logTools = $logTools;
$this->contextLogger = $contextLogger;
}
public function handleBasicChanges($args, $before, $after)
{
$args["old_value"] = $before;
$args["new_value"] = $after;
return $args;
}
public function handleBasicBoolChanges($args, $before, $after)
{
if ($before && !$after)
{
$args["old_value"] = null;
$args["new_value"] = $this->translator->trans("no");
}
if (!$before && $after)
{
$args["old_value"] = null;
$args["new_value"] = $this->translator->trans("yes");
}
return $args;
}
public function handleLabelChanges($args, $before, $after)
{
$args["old_value"] = null;
$args["new_value"] = null;
if ($before !== null) $args["old_value"] = $before->getValue();
if ($after !== null) $args["new_value"] = $after->getValue();
return $args;
}
public function handleObjectChanges($args, $before, $after)
{
$args["old_value"] = null;
$args["new_value"] = null;
if ($before !== null)
{
if (method_exists($before, "getLogLabel"))
{
$args["old_value"] = $before->getLogLabel();
}
else
{
$args["old_value"] = $before->display();
}
}
if ($after !== null)
{
if (method_exists($after, "getLogLabel"))
{
$args["new_value"] = $after->getLogLabel();
}
else
{
$args["new_value"] = $after->display();
}
}
return $args;
}
public function handleAddressChanges($args, $before, $after)
{
$args["old_value"] = null;
$args["new_value"] = null;
if ($before === null && $after === null)
{
return $args;
}
if ($before !== null && $after !== null)
{
if ($before->differsInValue($after))
{
$args["old_value"] = $before->display();
$args["new_value"] = $after->display();
return $args;
}
}
else
{
// before or after is null, but not both
if ($before !== null) $args["old_value"] = $before->display();
if ($after !== null) $args["new_value"] = $after->display();
return $args;
}
return $args;
}
public function handleDateChanges($args, $before, $after, $displayHours = false)
{
$testFormat = "Ymd";
if ($displayHours) $testFormat = "YmdHi";
$displayFormat = "d/m/Y";
if ($displayHours) $displayFormat = "d/m/Y H:i";
$args["old_value"] = null;
$args["new_value"] = null;
if ($before === null && $after === null)
{
return $args;
}
if ($before !== null && $after !== null)
{
if ($before->format($testFormat) != $after->format($testFormat))
{
$args["old_value"] = $before->format($displayFormat);
$args["new_value"] = $after->format($displayFormat);
return $args;
}
}
else
{
// before or after is null, but not both
if ($before !== null)
{
$args["old_value"] = $before->format($displayFormat);
}
if ($after !== null)
{
$args["new_value"] = $after->format($displayFormat);
}
return $args;
}
return null;
}
public function handleIkeaServiceOrder($OSNumber, $object, $action, $info, $specialAuthor)
{
if (!($object instanceof Attachment) &&
!($object instanceof Devis) &&
!($object instanceof Invoice) &&
!($object instanceof Document))
{
return [];
}
$allArgs = array();
$societyGroup = $object->getSocietyGroup();
$serviceOrders = $this->em->getRepository(ServiceOrder::class)->findBy(array(
'orderNumber' => $OSNumber,
'societyGroup' => $societyGroup,
));
foreach ($serviceOrders as $serviceOrder)
{
$client = $serviceOrder->getClient();
$society = $serviceOrder->getSociety();
$args = array(
"action" => $action,
"object_id" => $serviceOrder->getId(),
"object_bundle" => "Ikea",
"object_entity" => "ServiceOrder",
"object_display" => $serviceOrder->display(),
"object_client_id" => $client !== null ? $client->getId() : null,
"object_client_display" => $client !== null ? $client->getName() : null,
"old_value" => $object->display(),
"new_value" => $object->display(),
"info" => $info,
"special_author" => $specialAuthor,
"society_group" => $serviceOrder->getSocietyGroup(),
"society" => $society !== null ? $society : null,
);
$allArgs[] = $args;
}
return $allArgs;
}
public function handleProjectNotebookItemAdd($args, $notebookItem)
{
$type = $notebookItem->getItemType();
switch ($type)
{
case ProjectNotebookItem::type_number:
{
$args["new_value"] = $notebookItem->getItemData();
return $args;
// break;
}
case ProjectNotebookItem::type_text:
{
$args["new_value"] = $notebookItem->getItemData();
return $args;
// break;
}
case ProjectNotebookItem::type_textarea:
{
$args["new_value"] = $notebookItem->getItemData();
return $args;
// break;
}
case ProjectNotebookItem::type_checkbox:
{
// Checkboxes are created with itemData = 1
// Since we are creating them when we are first checking them
$args["new_value"] = $this->translator->trans("yes");
return $args;
// break;
}
case ProjectNotebookItem::type_select_multiple:
{
// Checkboxes are created with itemData = 1
// Since we are creating them when we are first checking them
$args["new_value"] = $this->translator->trans("yes");
return $args;
// break;
}
case ProjectNotebookItem::type_select:
{
// Handle Special Cases
if ($notebookItem->isSupportsWallSquareness())
{
// In this case both $before and $after are arrays of option item codes
// The 1st item in the array is the line number
$afterItems = json_decode($notebookItem->getItemData(), true);
$newValue = "";
if (!empty($afterItems) && is_array($afterItems))
{
foreach ($afterItems as $key => $iCode)
{
if ($key == 0)
{
$newValue = $iCode;
}
else
{
$i = Blueprint::getItemForCode($iCode);
if ($i !== null)
{
$newValue .= " | ";
$newValue .= $i['label'];
}
}
}
}
$args["new_value"] = $newValue;
return $args;
}
// In this case both $before and $after are option item codes
$afterItem = Blueprint::getItemForCode($notebookItem->getItemData());
if ($afterItem !== null)
{
$args["new_value"] = $afterItem['label'];
}
return $args;
// break;
}
default:
{
// This code should not be reached
$args["old_value"] = null;
$args["new_value"] = null;
return $args;
// break;
}
}
}
public function handleProjectNotebookItemUpdate($args, $notebookItem, $before, $after)
{
$type = $notebookItem->getItemType();
switch ($type)
{
case ProjectNotebookItem::type_number:
{
$args["old_value"] = $before;
$args["new_value"] = $after;
return $args;
// break;
}
case ProjectNotebookItem::type_text:
{
$args["old_value"] = $before;
$args["new_value"] = $after;
return $args;
// break;
}
case ProjectNotebookItem::type_textarea:
{
$args["old_value"] = $before;
$args["new_value"] = $after;
return $args;
// break;
}
case ProjectNotebookItem::type_checkbox:
{
if ($before && !$after)
{
$args["old_value"] = null;
$args["new_value"] = $this->translator->trans("no");
}
if (!$before && $after)
{
$args["old_value"] = null;
$args["new_value"] = $this->translator->trans("yes");
}
return $args;
// break;
}
case ProjectNotebookItem::type_select_multiple:
{
if ($before && !$after)
{
$args["old_value"] = null;
$args["new_value"] = $this->translator->trans("no");
}
if (!$before && $after)
{
$args["old_value"] = null;
$args["new_value"] = $this->translator->trans("yes");
}
return $args;
// break;
}
case ProjectNotebookItem::type_select:
{
// Handle Special Cases
if ($notebookItem->isSupportsWallSquareness() || $notebookItem->isAppliancesWater())
{
// In this case both $before and $after are arrays of option item codes
// The 1st item in the array is the line number
$beforeItems = json_decode($before, true);
$afterItems = json_decode($after, true);
$oldValue = "";
$newValue = "";
if (!empty($beforeItems) && is_array($beforeItems))
{
foreach ($beforeItems as $key => $iCode)
{
if ($key == 0)
{
$oldValue = $iCode;
}
else
{
$i = Blueprint::getItemForCode($iCode);
if ($i !== null)
{
$oldValue .= " | ";
$oldValue .= $i['label'];
}
}
}
}
if (!empty($afterItems) && is_array($afterItems))
{
foreach ($afterItems as $key => $iCode)
{
if ($key == 0)
{
$newValue = $iCode;
}
else
{
$i = Blueprint::getItemForCode($iCode);
if ($i !== null)
{
$newValue .= " | ";
$newValue .= $i['label'];
}
}
}
}
$args["old_value"] = $oldValue;
$args["new_value"] = $newValue;
return $args;
}
// In this case both $before and $after are option item codes
$beforeItem = Blueprint::getItemForCode($before);
$afterItem = Blueprint::getItemForCode($after);
$args["old_value"] = $beforeItem['label'];
$args["new_value"] = $afterItem['label'];
return $args;
// break;
}
default:
{
// This code should not be reached
$args["old_value"] = null;
$args["new_value"] = null;
return $args;
// break;
}
}
}
public function handleProjectNotebookIkeaMethodVersion($args, $before, $after)
{
$args["old_value"] = null;
$args["new_value"] = null;
if ($before == IkeaTemplate::code_custom)
{
$args["old_value"] = $this->translator->trans('ikea_template_method_custom');
}
elseif ($before == IkeaTemplate::code_complete)
{
$args["old_value"] = $this->translator->trans('ikea_template_method_complete');
}
if ($after == IkeaTemplate::code_custom)
{
$args["new_value"] = $this->translator->trans('ikea_template_method_custom');
}
elseif ($after == IkeaTemplate::code_complete)
{
$args["new_value"] = $this->translator->trans('ikea_template_method_complete');
}
$this->logTools->ploopLog("[handleProjectNotebookIkeaMethodVersion]");
$this->logTools->ploopLog("[handleProjectNotebookIkeaMethodVersion] before = ".$args["old_value"]);
$this->logTools->ploopLog("[handleProjectNotebookIkeaMethodVersion] after = ".$args["new_value"]);
return $args;
}
}