<?php
namespace App\EventSubscriber;
use App\Controller\Api\DocumentManagerController;
use App\Entity\Customer;
use App\Entity\CustomerCertificateDocuments;
use App\Entity\ProjectOrderExpensePositions;
use App\Entity\ProjectOrderExpenses;
use App\Entity\ProjectOrders;
use App\Entity\Projects;
use App\Entity\ProjectStakeholders;
use App\Entity\ProjectStatus;
use App\Entity\StockItems;
use App\Entity\Stocks;
use App\Entity\StockTransactions;
use App\Entity\WorkerCertificateDocuments;
use App\Entity\Worker;
use App\Entity\WorkerInProject;
use App\Entity\WorkerTimesheet;
use App\Repository\ProjectOrdersRepository;
use App\Service\TimesheetInterface\TimesheetReaderInterface;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\PersistentCollection;
use Doctrine\Persistence\Event\LifecycleEventArgs;
use Doctrine\ORM\Events;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use App\Entity\InvoiceType;
use Doctrine\Persistence\ManagerRegistry;
use Doctrine\ORM\UnitOfWork;
/**
* Doctrine during load jobs
*/
class DoctrineSubscriber implements EventSubscriberInterface
{
private $servArgCustomerCertFetchDir;
private $servArgWorkerCertFetchDir;
private $serviceArgs;
private ManagerRegistry $managerRegistry;
# public function __construct( $servArgCustomerCertFetchDir, $servArgCustomerCertManageDir, $servArgWorkerCertFetchDir, $servArgWorkerCertManageDir, $servArgWorkerImagesFetchDir, $args )
public function __construct( $args, ManagerRegistry $managerRegistry )
{
$this->serviceArgs = $args;
$this->managerRegistry = $managerRegistry;
}
// Listen to postLoad event
public static function getSubscribedEvents()
{
return array(
// Update yaml file
Events::postLoad,
#Events::postFlush,
#Events::postUpdate,
#Events::postPersist,
Events::prePersist,
#Events::preUpdate,
#Events::preRemove,
#Events::onFlush,
#Events::postFlush
);
}
// public function postFlush(LifecycleEventArgs $args){
// dd('postFlush');
// }
// Set the services.yaml param on the entity
public function postLoad( LifecycleEventArgs $args)
{
$entity = $args->getObject();
// replaced to Dynamic Process via Request to app_project_order_expenses_generate_document_path
// if( $entity instanceof ProjectOrderExpenses ){
// /**
// * Burda Expense Direk cagirilirken ona ait posiotnda da tekrar cagriliyro olabilir
// * busebeble containe kullanarak islemi filtrele
// */
//
// $documentPath = $entity->getFilename();
//
// if (!empty($documentPath)) {
// // `expenseDocumentPath` zaten mevcut değilse ekle
// if (!str_contains($documentPath, $this->serviceArgs['dirs']['expenseDocumentPath'])) {
// $documentPath = $this->serviceArgs['dirs']['expenseDocumentPath'] . DIRECTORY_SEPARATOR . $documentPath;
// $entity->setFilename($documentPath);
// }
// }
// #dump($entity->getId(), $entity->getDocumentPath());
//
// }
if ($entity instanceof CustomerCertificateDocuments ) {
$entity->setHydrateDocumentsData([
"id" => $entity->getId(),
"file_name" => $entity->getName(),
"file_real_path" => $this->serviceArgs['dirs']['customerCertFetchDir'] . DIRECTORY_SEPARATOR . $entity->getName(),
"extension" => DocumentManagerController::getFileExtension( $entity->getName() ),
"type" => DocumentManagerController::getFileFullType( DocumentManagerController::getFileExtension( $entity->getName() ) ),
// Access from frontend
"remove_path" => "/api/customer/remove-customer-certificate-history-document/" . $entity->getCustomerCertificateHistory()->getCustomerCertificate()->getCustomer()->getSlug() . "/" . DocumentManagerController::Encrypt($entity->getId()),
// Access just backend
"remove_link" => $this->serviceArgs['dirs']['customerCertManageDir'] . DIRECTORY_SEPARATOR . $entity->getName()
]);
}
if ( $entity instanceof WorkerCertificateDocuments ) {
$entity->setHydrateDocumentsData([
"id" => $entity->getId(),
"file_name" => $entity->getName(),
"file_real_path" => $this->serviceArgs['dirs']['workerCertFetchDir'] . DIRECTORY_SEPARATOR . $entity->getName(),
"extension" => DocumentManagerController::getFileExtension( $entity->getName() ),
"type" => DocumentManagerController::getFileFullType( DocumentManagerController::getFileExtension( $entity->getName() )),
// Access from frontend
"remove_path" => "/api/worker/remove-worker-certificate-history-document/" . $entity->getWorkerCertificateHistory()->getWorkerCertificate()->getWorker()->getSlug() . "/" . DocumentManagerController::Encrypt($entity->getId()),
// Access just backend
"remove_link" =>$this->serviceArgs['dirs']['workerCertManageDir'] . DIRECTORY_SEPARATOR . $entity->getName()
]);
}
if ( $entity instanceof Worker ) {
$entity->setProfileImageFullPath( $this->serviceArgs['dirs']['workerImagesFetchDir'] . DIRECTORY_SEPARATOR . $entity->getProfileImage() );
// Actually Activity
// Set Fully Name
$entity->setFullName( $entity->getName() . ' ' . $entity->getSurname() );
}
if ( $entity instanceof Customer ) {
$entity->setLogoImageFullPath( $this->serviceArgs['dirs']['customerImagesFetchDir'] . DIRECTORY_SEPARATOR . $entity->getCompanyLogo() );
}
if ( $entity instanceof WorkerInProject || $entity instanceof ProjectStakeholders || $entity instanceof Projects ) {
$completed = false;
$params = "in process";
if( $entity instanceof WorkerInProject ){
if( $entity->getForciblyCompleted() || ( $entity->getEndAt() && ($entity->getEndAt() < new \DateTimeImmutable('now')) ) ){
$params = "completed";
$completed = true;
}
} else {
if( $entity->getEndAt() && ($entity->getEndAt() < new \DateTimeImmutable('now')) ){
$params = "completed";
$completed = true;
}
}
$project_name = '';
if( $entity instanceof WorkerInProject ){
$project_name = $entity->getProject()->getProject()->getName();
} else if( $entity instanceof ProjectStakeholders ){
$project_name = $entity->getProject()->getName();
} else if( $entity instanceof Projects ){
$project_name = $entity->getName();
}
/**@var $found ProjectStatus*/
$found = $args->getObjectManager()->getRepository(ProjectStatus::class)->findOneBy(["name"=>$params]);
$entity->setStatus([
"project_name" => $project_name,
'name'=>$found->getName(),
'color'=>$found->getColor(),
'completed'=>$completed
]);
}
/**
* By Manage give an error
* @deprecated */
if( $entity instanceof ProjectOrders ){
return;
#dd($args->getObjectManager());
$entityManager = $args->getObjectManager();
$unitOfWork = $entityManager->getUnitOfWork();
$entityState = $unitOfWork->getEntityState($entity);
if($entityState === UnitOfWork::STATE_NEW) {
// return;
}
#return;
try{
if( is_null($entity->getInvoiceType())){
#dd(12);
$projectOwner = $entity->getProject()->getOwner();
// Set Standard
if(!$projectOwner){
$invoiceTypes = $args->getObjectManager()->getRepository(InvoiceType::class)->findOneBy(["name"=>"Standard"]);
#dd($invoiceTypes);
$entity->setInvoiceType($invoiceTypes);
return;
}
// Owner Defined but invoice type not selected than Set Standard
if(is_null($projectOwner->getInvoiceType())){
$invoiceTypes = $args->getObjectManager()->getRepository(InvoiceType::class)->findOneBy(["name"=>"Standard"]);
#dd($invoiceTypes);
#$entity->setInvoiceType($invoiceTypes);
return;
}
// dd($projectOwner->getInvoiceType());
$entity->setInvoiceType($projectOwner->getInvoiceType());
}
} catch (\Exception $exception){
}
}
if( $entity instanceof Stocks ){
$em = $args->getObjectManager();
$availableStockQuantity = $this->finalCalculatedStockQuantityFromTransactions($entity->getStockTransactions());
$entity->setAvailableStockQuantity( $availableStockQuantity );
}
if( $entity instanceof StockItems ){
$em = $args->getObjectManager();
$finalQuantities = $entity->getStocks()->map(function (/**@var Stocks $stock*/$stock) {
return $this->finalCalculatedStockQuantityFromTransactions($stock->getStockTransactions());
});
$entity->setTotalAvailableQuantity(array_sum($finalQuantities->toArray()));
}
}
private function finalCalculatedStockQuantityFromTransactions(PersistentCollection $transactions): float {
$finalQuantity = 0;
foreach ( $transactions as $transaction) {
$qty = $transaction->getQuantity();
if ($transaction->getTransactionType() === 'in') {
$finalQuantity += $qty;
} elseif ($transaction->getTransactionType() === 'out') {
$finalQuantity -= $qty;
}
}
return $finalQuantity;
}
// Set the services.yaml param on the entity
// public function preRemove( LifecycleEventArgs $args)
// {
// $certDocEntity = $args->getObject();
// dd($certDocEntity);
// }
// Set the services.yaml param on the entity
// public function postFlush( LifecycleEventArgs $args)
// {
// dd('Flush');
// $certDocEntity = $args->getObject();
// if ($certDocEntity instanceof CustomerCertificateDocuments ) {
// $certDocEntity->setServiceArgumentFileFetchDir( $this->servArgCustomerCertFetchDir );
// }
//
// if ( $certDocEntity instanceof WorkerCertificateDocuments ) {
// $certDocEntity->setServiceArgumentFileFetchDir( $this->servArgWorkerCertFetchDir );
// }
// }
// Set the services.yaml param on the entity
// public function postUpdate( LifecycleEventArgs $args)
// {
// dd('Update');
// $certDocEntity = $args->getObject();
// if ($certDocEntity instanceof CustomerCertificateDocuments ) {
// $certDocEntity->setServiceArgumentFileFetchDir( $this->servArgCustomerCertFetchDir );
// }
//
// if ( $certDocEntity instanceof WorkerCertificateDocuments ) {
// $certDocEntity->setServiceArgumentFileFetchDir( $this->servArgWorkerCertFetchDir );
// }
// }
// Set the services.yaml param on the entity
// public function postPersist( LifecycleEventArgs $args)
// {
// dd('postPersist');
// $certDocEntity = $args->getObject();
// if ($certDocEntity instanceof CustomerCertificateDocuments ) {
// $certDocEntity->setServiceArgumentFileFetchDir( $this->servArgCustomerCertFetchDir );
// }
//
// if ( $certDocEntity instanceof WorkerCertificateDocuments ) {
// $certDocEntity->setServiceArgumentFileFetchDir( $this->servArgWorkerCertFetchDir );
// }
// }
//
// // Set the services.yaml param on the entity
// public function prePersist( LifecycleEventArgs $args)
// {
// dd('prePersist');
// $certDocEntity = $args->getObject();
// if ($certDocEntity instanceof CustomerCertificateDocuments ) {
// $certDocEntity->setServiceArgumentFileFetchDir( $this->servArgCustomerCertFetchDir, );
// }
//
// if ( $certDocEntity instanceof WorkerCertificateDocuments ) {
// $certDocEntity->setServiceArgumentFileFetchDir( $this->servArgWorkerCertFetchDir );
// }
// }
// Set the services.yaml param on the entity
// public function preUpdate( LifecycleEventArgs $args)
// {
// dd('preUpdate');
// $certDocEntity = $args->getObject();
// if ($certDocEntity instanceof CustomerCertificateDocuments ) {
// $certDocEntity->setServiceArgumentFileFetchDir( $this->servArgCustomerCertFetchDir );
// }
//
// if ( $certDocEntity instanceof WorkerCertificateDocuments ) {
// $certDocEntity->setServiceArgumentFileFetchDir( $this->servArgWorkerCertFetchDir );
// }
// }
}