<?php
declare(strict_types=1);
namespace App\Nolimit\Contract\Controller;
use App\Entity\Company;
use App\Entity\CompanyType;
use App\Entity\ContractStatus;
use App\Entity\Currency;
use App\Entity\Project;
use App\Entity\ProjectType;
use App\Entity\Unit;
use App\Nolimit\Contract\Manager\ContractManager;
use App\Nolimit\Contract\Manager\ContractTrancheManager;
use App\Nolimit\Contract\Persister\ContractPersister;
use App\Nolimit\Contract\Persister\ContractTranchePersister;
use App\Nolimit\Contract\Provider\ContractDatatableProvider;
use App\Nolimit\Contract\Provider\ContractProvider;
use App\Nolimit\Pdf\PdfGenerator;
use App\Nolimit\Task\Manager\TaskManager;
use App\Repository\CompanyRepository;
use App\Repository\ContractRepository;
use App\Repository\ContractStatusRepository;
use App\Repository\LanguageRepository;
use App\Repository\ProjectRepository;
use App\Nolimit\Contract\Provider\ContractTrancheDatatableProvider;
use App\Repository\ProjectTypeRepository;
use App\Repository\TaskRepository;
use App\Repository\TrancheRepository;
use App\Repository\UnitRepository;
use Doctrine\ORM\EntityManagerInterface;
use Sonata\AdminBundle\Controller\CRUDController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Contracts\Translation\TranslatorInterface;
class ContractController extends CRUDController
{
/**
* @var EntityManagerInterface
*/
private $em;
private ContractManager $contractManager;
private ContractDatatableProvider $contractDatatableProvider;
private TaskRepository $taskRepository;
private ContractRepository $contractRepository;
private ContractTrancheDatatableProvider $contractTrancheDatatableProvider;
private ContractTrancheManager $contractTrancheManager;
private TrancheRepository $trancheRepository;
private ProjectRepository $projectRepository;
private ContractProvider $contractProvider;
private ContractPersister $contractPersister;
private ContractTranchePersister $contractTranchePersister;
private CompanyRepository $companyRepository;
private ProjectTypeRepository $projectTypeRepository;
private ContractStatusRepository $contractStatusRepository;
private PdfGenerator $pdfGenerator;
private LanguageRepository $languageRepository;
private TranslatorInterface $translator;
private UnitRepository $unitRepository;
private TaskManager $taskManager;
public function __construct(EntityManagerInterface $em,
ContractManager $contractManager,
ContractDatatableProvider $contractDatatableProvider,
TaskRepository $taskRepository,
ContractRepository $contractRepository,
ContractTrancheDatatableProvider $contractTrancheDatatableProvider,
ProjectRepository $projectRepository,
ContractTrancheManager $contractTrancheManager,
TrancheRepository $trancheRepository,
ContractProvider $contractProvider,
ContractPersister $contractPersister,
ContractTranchePersister $contractTranchePersister,
CompanyRepository $companyRepository,
ProjectTypeRepository $projectTypeRepository,
ContractStatusRepository $contractStatusRepository,
PdfGenerator $pdfGenerator,
LanguageRepository $languageRepository,
TranslatorInterface $translator,
UnitRepository $unitRepository,
TaskManager $taskManager)
{
$this->em = $em;
$this->contractManager = $contractManager;
$this->contractDatatableProvider = $contractDatatableProvider;
$this->taskRepository = $taskRepository;
$this->contractRepository = $contractRepository;
$this->projectRepository = $projectRepository;
$this->contractTrancheDatatableProvider = $contractTrancheDatatableProvider;
$this->contractTrancheManager = $contractTrancheManager;
$this->trancheRepository = $trancheRepository;
$this->contractProvider = $contractProvider;
$this->contractPersister = $contractPersister;
$this->contractTranchePersister = $contractTranchePersister;
$this->companyRepository = $companyRepository;
$this->projectTypeRepository = $projectTypeRepository;
$this->contractStatusRepository = $contractStatusRepository;
$this->pdfGenerator = $pdfGenerator;
$this->translator = $translator;
$this->unitRepository = $unitRepository;
$this->languageRepository = $languageRepository;
$this->taskManager = $taskManager;
}
public function listAction(Request $request): Response
{
$companies = $this->companyRepository->findBy(array("deleted"=>false,"companyType"=>CompanyType::COMPANY_TYPE_K));
$projectType = $this->projectTypeRepository->findAll();
$contractStatus = $this->contractStatusRepository->findAll();
$selectedStatus=array(ContractStatus::CONTRACT_STATUS_LETREHOZOTT,ContractStatus::CONTRACT_STATUS_ELKULDOTT, ContractStatus::CONTRACT_STATUS_ALAIRT);
return $this->renderWithExtraParams('/contract/contract_view.html.twig', array(
'companies' => $companies,
'projectType' => $projectType,
'selectedStatus'=>$selectedStatus,
'contractStatus' => $contractStatus
));
}
/**
* @Route("/admin/contract/contract/contract_filter", name="contract_filter", methods={"POST"} )
*/
public function contractFilterAction(): Response
{
// $status=$this->em->getRepository(ProjectStatus::class)->findAll();
// $data['selected_status']=array();
// foreach ($status as $item)
// {
// $data['status'][$item->getId()]=$item->getName();
// if($item->getId()!=ProjectStatus::APV_STATUS_INCHIS)
// {
// array_push($data['selected_status'],$item->getId());
// }
// }
// $treatment=$this->em->getRepository(ApvTreatment::class)->findAll();
// foreach ($treatment as $item2)
// {
// $data['treatment'][$item2->getId()]=$item2->getName();
// }
// $up=$this->em->getRepository(UnitateProductie::class)->findAll();
// foreach ($up as $item3)
// {
// $data['up'][$item3->getId()]=$item3->getCod().' - '.$item3->getName();
// }
// $contract=$this->em->getRepository(ProjectType::class)->findAll();
// foreach ($contract as $item4)
// {
// $data['contract'][$item4->getId()]=$item4->getName();
// }
//
$data = "";
return new JsonResponse($data, 200);
}
/**
* @Route("/admin/app/contract/contract_filtered", name="contract_filtered", methods={"POST"} )
*/
public function contractFilteredAction(Request $request): Response
{
$adata['adata'] = $this->contractManager->getFilteredData($request);
return $this->json($adata);
}
/**
* @Route("/admin/app/contract/contract_list", name="contract_list", methods={"POST"} )
*/
public function contractListAction(TranslatorInterface $translator)
{
$adata['data'] = $this->contractDatatableProvider->datatableRows();
return $this->json($adata);
}
/**
* @Route("/admin/contract/contract_new_act_aditional", name="contract_new_act_aditional", methods={"POST"} )
*/
public function contractNewActAditionalAction(Request $request): Response
{
$contractId = (int)$request->request->get("id");
$contractParent = $this->contractRepository->find($contractId);
$getNextNumber = $this->contractRepository->findOneBy(['contractParent' => $contractParent], ['nr' => 'DESC']);
$nrActAditional = ($getNextNumber) ? (int)$getNextNumber->getNr() + 1 : 1;
return $this->renderWithExtraParams('/contract/act_aditional.html.twig', array(
'contractParent' => $contractParent,
'nrActAditional' => $nrActAditional,
));
}
/**
* @Route("/admin/contract/contract_new", name="contract_new", methods={"POST"} )
*/
public function contractNewAction(): Response
{
$companies = $this->companyRepository->findBy(array("deleted"=>false,"companyType"=>CompanyType::COMPANY_TYPE_K));
$projectTypes = $this->projectTypeRepository->findBy(array('deleted' => 0));
$currencies = $this->em->getRepository(Currency::class)->findAll();
$languages = $this->languageRepository->findAll();
$contractStatuses = $this->contractStatusRepository->findAll();
$nextContractNumberAndSeria = $this->contractProvider->findNextNrDoc();
return $this->renderWithExtraParams('/contract/contract_add_edit.html.twig', array(
'companies' => $companies,
'projectTypes' => $projectTypes,
'currencies' => $currencies,
'contractNrAndSeria' => $nextContractNumberAndSeria,
'languages' => $languages,
'contractStatuses'=> $contractStatuses,
));
}
/**
* @Route("/admin/contract/contract_save_act_aditional", name="contract_save_act_aditional", methods={"POST"} )
*/
public function contractSaveActAditionalAction(Request $request): Response
{
$actAditional = $this->contractPersister->saveActAditional($request);
$data[] = $this->contractDatatableProvider->datatableRow($actAditional);
return new JsonResponse(array('msg' => true, 'datatableRow' => $data[0]), 200);
}
/**
* @Route("/admin/contract/contract_save", name="contract_save", methods={"POST"} )
*/
public function contractSaveAction(Request $request): Response
{
$contract = $this->contractPersister->saveContract($request);
//viewnak szukseges adatok. A datatable megjeleniteshez szukseges adatokat adja
$data[] = $this->contractDatatableProvider->datatableRow($contract);
return new JsonResponse(array('msg' => true, 'datatableRow' => $data[0]), 200);
}
/**
* @Route("/admin/contract/contract_edit", name="contract_edit", methods={"GET","POST"} )
*/
public function contractEditAction(Request $request): Response
{
$contractId = (int)$request->request->get("id");
$contract = $this->contractRepository->find($contractId);
$companies = $this->companyRepository->findBy(array("deleted"=>false,"companyType"=>CompanyType::COMPANY_TYPE_K));
$projectTypes = $this->projectTypeRepository->findBy(array('deleted' => 0));
$currencies = $this->em->getRepository(Currency::class)->findAll();
$languages = $this->languageRepository->findAll();
$contractStatuses = $this->contractStatusRepository->findAll();
$projects = $this->contractManager->getCompanyNotContractedProject($contract->getCompany()->getId(), $contract->getProjectType()->getId(), $contract->getProject()->getId());
if($contract->getProjectType()->getId() == ProjectType::PROJECT_TYPE_ACT_ADITIONAL){
return $this->renderWithExtraParams('/contract/act_aditional.html.twig', array(
'contractParent' => $contract->getContractParent(),
'contract' => $contract,
));
}else{
return $this->renderWithExtraParams('/contract/contract_add_edit.html.twig', array(
'contract' => $contract,
'companies' => $companies,
'projectTypes' => $projectTypes,
'currencies' => $currencies,
'projects' => $projects,
'languages' => $languages,
'contractStatuses'=> $contractStatuses,
));
}
}
/**
* @Route("/admin/contract/contract_delete", name="contract_delete", methods={"GET","POST"} )
*/
public function contractDeleteAction(Request $request): Response
{
$id = $request->request->get('id');
$this->contractManager->deleteContract((int)$id);
return new JsonResponse(array('msg' => true), 200);
}
/**
* @Route("/admin/contract/get_client_project", name="get_client_project", methods={"GET","POST"} )
*/
public function getClientProjectAction(Request $request): Response
{
$companyId = (int)$request->request->get("company_id");
$projectTypeId = (int)$request->request->get("project_type_id");
$contractId = (int)$request->request->get("contract_id");
$projectId = (int)$request->request->get("project_id");
$projectWithoutContract = $this->contractManager->getCompanyNotContractedProject($companyId, $projectTypeId, $projectId);
$contract = null;
if ($contractId > 0) {
$contract = $this->contractRepository->find($contractId);
}
return $this->renderWithExtraParams('/contract/contract_company_projects.html.twig', array(
'projects' => $projectWithoutContract,
'contract' => $contract
));
}
/**
* @Route("/admin/contract/add_contract_tranche/{id}", name="add_contract_tranche", methods={"POST"} )
*/
public function addContractTrancheAction(Request $request): Response
{
$contractId = $request->attributes->get('id');
$contract = $this->contractRepository->find($contractId);
$units=$this->unitRepository->findAll();
$isActAditionalWithMaintenanceParent = $contract->getContractParent() !== null && $contract->getContractParent()->getProjectType()->getId() === ProjectType::PROJECT_TYPE_KARBANTARTAS;
$isMaintenanceOrActAditional = $contract->getProjectType()->getId() === ProjectType::PROJECT_TYPE_KARBANTARTAS || $isActAditionalWithMaintenanceParent;
$unUsedMaintenanceHours = $isMaintenanceOrActAditional ? $this->taskRepository->getUnusedMaintenanceHours($contract->getProject()->getId())[0]['scheduledHours'] : 0;
$unusedMaintenanceHoursByTask = $isMaintenanceOrActAditional ? $this->taskRepository->getUnusedMaintenanceHoursByTask($contract->getProject()->getId()) : [];
//dump($unusedMaintenanceHoursByTask);
//exit;
return $this->renderWithExtraParams('/contract/contract_tranche_add_edit.html.twig', array(
'contract' => $contract,
'units' => $units,
'unUsedMaintenanceHours' => $unUsedMaintenanceHours,
'unusedMaintenanceHoursByTask' => $unusedMaintenanceHoursByTask
));
}
/**
* @Route("/admin/contract/edit_contract_tranche/{contract_id}/{tranche_id}", name="edit_contract_tranche", methods={"POST"} )
*/
public function editContractTrancheAction(Request $request): Response
{
$contractId = $request->attributes->get('contract_id');
$contract = $this->contractRepository->find($contractId);
$units=$this->unitRepository->findAll();
$trancheId = $request->attributes->get('tranche_id');
$contract_tranche = $this->trancheRepository->find($trancheId);
$selected_tasks = $this->taskRepository->findBy(array('tranche' => $contract_tranche));
$selected_tasks_ids = $this->contractTrancheManager->taskIdsImplode($selected_tasks);
$selected_tasks_values = $this->contractTrancheManager->taskValuesImplode($selected_tasks);
$isActAditionalWithMaintenanceParent = $contract->getContractParent() !== null && $contract->getContractParent()->getProjectType()->getId() === ProjectType::PROJECT_TYPE_KARBANTARTAS;
$isMaintenanceOrActAditional = $contract->getProjectType()->getId() === ProjectType::PROJECT_TYPE_KARBANTARTAS || $isActAditionalWithMaintenanceParent;
$unUsedMaintenanceHours = $isMaintenanceOrActAditional ? $this->taskRepository->getUnusedMaintenanceHours($contract->getProject()->getId())[0]['scheduledHours'] : 0;
$unusedMaintenanceHoursByTask = $isMaintenanceOrActAditional ? $this->taskRepository->getUnusedMaintenanceHoursByTask($contract->getProject()->getId()) : [];
//tranche_hour
$trancheMin = 0;
foreach ($selected_tasks as $item){
$trancheMin +=($item->isNotUsed())?$item->getNotUsedMinutes():$item->getWorkedMinutes();
}
$tranche_hour = $this->taskManager->convertMinInHourMin($trancheMin);
//selected not used
$selectedNotUsedTaskId = 0;
$selectedNotUsedTask = $this->taskRepository->findOneBy(['tranche'=>$contract_tranche,'notUsed'=>1]);
if($selectedNotUsedTask && $contract_tranche->getUnit()->getId() == Unit::UNIT_ORA){
$unusedMaintenanceHoursByTask[]=array('id'=>$selectedNotUsedTask->getId(),'name'=>$selectedNotUsedTask->getName().' - '.$selectedNotUsedTask->getNotUsedMinutes().' perc','notUsedMinutes'=>$selectedNotUsedTask->getNotUsedMinutes());
$selectedNotUsedTaskId = $selectedNotUsedTask->getId();
}
$billableValueCrandTotal = $this->taskRepository->getTaskGrandTotalByTranche((int)$trancheId)[0]['grandTotal'];
//dump($billableValueCrandTotal);
//exit;
return $this->renderWithExtraParams('/contract/contract_tranche_add_edit.html.twig', array(
'contract' => $contract,
'contract_tranche' => $contract_tranche,
'selected_tasks_ids' => $selected_tasks_ids,
'selected_tasks_values' => $selected_tasks_values,
'units' => $units,
'unUsedMaintenanceHours' => $unUsedMaintenanceHours,
'unusedMaintenanceHoursByTask' => $unusedMaintenanceHoursByTask,
'tranche_hour' => $tranche_hour,
'selectedNotUsedTaskId' => $selectedNotUsedTaskId,
'billableValueGrandTotal' => ($billableValueCrandTotal)?$billableValueCrandTotal:''
));
}
/**
* @Route("/admin/contract/contract_tranche_task_items", name="contract_tranche_task_items", methods={"POST"} )
*/
public function contractTrancheTaskItemsAction(Request $request): Response
{
$project_id = (int)$request->get("project_id");
$project=$this->projectRepository->find($project_id);
$tranche_id = (int)$request->get("tranche_id");
if ($tranche_id == 0) {
if($project->getProjectType()->getId() == ProjectType::PROJECT_TYPE_WEB_FEJLESZTES || $project->getProjectType()->getId() == ProjectType::PROJECT_TYPE_ERP_FEJLESZTES || $project->getProjectType()->getId() == ProjectType::PROJECT_TYPE_ACT_ADITIONAL)
{
$free_tasks = $this->taskRepository->getFreeCreatedTasks($project_id);
}
elseif ($project->getProjectType()->getId() == ProjectType::PROJECT_TYPE_KARBANTARTAS || $project->getProjectType()->getId() == ProjectType::PROJECT_TYPE_HOSTING)
{
$free_tasks = $this->taskRepository->getFreeCompletedTasks($project_id);
}
$adata['data'] = $this->contractTrancheDatatableProvider->datatableRows($free_tasks);
} else {
$tranche = $this->trancheRepository->find($tranche_id);
if($project->getProjectType()->getId() == ProjectType::PROJECT_TYPE_WEB_FEJLESZTES || $project->getProjectType()->getId() == ProjectType::PROJECT_TYPE_ERP_FEJLESZTES || $project->getProjectType()->getId() == ProjectType::PROJECT_TYPE_ACT_ADITIONAL)
{
$free_tasks = $this->taskRepository->getFreeTasksAndTrancheCreatedTasks($project_id, $tranche_id);
//dump($project_id,$tranche_id,count($free_tasks));
//exit;
}
elseif ($project->getProjectType()->getId() == ProjectType::PROJECT_TYPE_KARBANTARTAS || $project->getProjectType()->getId() == ProjectType::PROJECT_TYPE_HOSTING)
{
$free_tasks = $this->taskRepository->getFreeTasksAndTrancheCompletedTasks($project_id, $tranche_id);
}
$trancheContract = $tranche->getContract();
$isActAditionalWithMaintenanceParent = $trancheContract->getContractParent() !== null && $trancheContract->getContractParent()->getProjectType()->getId() === ProjectType::PROJECT_TYPE_KARBANTARTAS;
$isMaintenanceOrActAditional = $trancheContract->getProjectType()->getId() === ProjectType::PROJECT_TYPE_KARBANTARTAS || $isActAditionalWithMaintenanceParent;
$filterNotUsedForOra = $isMaintenanceOrActAditional && $tranche->getUnit()->getId() == Unit::UNIT_ORA;
$selected_tasks = $filterNotUsedForOra ? $this->taskRepository->findBy(['tranche' => $tranche_id, 'notUsed' => null]) : $this->taskRepository->findBy(['tranche' => $tranche_id]);
$selected_tasks_ids = $this->contractTrancheManager->taskIdsImplode($selected_tasks);
$adata['data'] = $this->contractTrancheDatatableProvider->editDatatableRows($free_tasks, $selected_tasks_ids);
}
return $this->json($adata);
}
/**
* @Route("/admin/contract/contract_tranche_save", name="contract_tranche_save", methods={"POST"} )
*/
public function contractTrancheSaveAction(Request $request): Response
{
$data = $this->contractTrancheManager->saveContractTranche($request);
return new JsonResponse(array('msg' => $data['msg'], 'success' => $data['success']), 200);
}
/**
* @Route("/admin/app/task/delete_tranche", name="delete_tranche", methods={"POST"} )
*/
public function deleteTrancheAction(Request $request): Response
{
$result = $this->contractTranchePersister->deleteContractTranche($request);
$contract_id = (int)$request->get('contract_id');
$contract = $this->contractRepository->find($contract_id);
$data[] = $this->contractDatatableProvider->datatableRow($contract);
return new JsonResponse(array('msg' => true, 'datatableRow' => $data[0]), 200);
}
/**
* @Route("/admin/app/contract/contract_print_pdf", name="contract_print_pdf", methods={"POST"} )
*/
public function contractPrintPdfAction(Request $request): Response
{
$id = (int)$request->request->get("id");
$contract = $this->contractRepository->find($id);
$filename = 'CONTRACT NR '.$contract->getNr().' '.$contract->getCompany()->getName().' '.$contract->getDataDin()->format('d-m-Y').'.pdf';
if($contract->getContractStatus()->getId()!=ContractStatus::CONTRACT_STATUS_ALAIRT && $contract->getContractStatus()->getId()!=ContractStatus::CONTRACT_STATUS_KIVITELEZETT)
{
$this->contractManager->pdfContract($contract);
}
$protocol = stripos($_SERVER['SERVER_PROTOCOL'], 'https') === 0 ? 'https://' : 'http://';
$domainName = $_SERVER['HTTP_HOST'] . '/';
$dirname = '/contract/' . $filename;
return new JsonResponse(array('filePath' => $protocol . $domainName . $dirname, 'filename' => $filename), 200);
}
/**
* @Route("/admin/contract/contract_projecttype", name="contract_projecttype", methods={"GET","POST"} )
*/
public function contractProjectTypeAction(Request $request): Response
{
$id = (int)$request->get('itemId');
switch ($id) {
case ProjectType::PROJECT_TYPE_HOSTING:
return $this->renderWithExtraParams('/contractType/contract_hosting.html.twig', array('contract' => false));
break;
case (ProjectType::PROJECT_TYPE_KARBANTARTAS):
return $this->renderWithExtraParams('/contractType/contract_karbantartas.html.twig', array('contract' => false));
break;
case ProjectType::PROJECT_TYPE_ERP_FEJLESZTES:
return $this->renderWithExtraParams('/contractType/contract_ERP_fejlesztes.html.twig', array('contract' => false));
break;
case ProjectType::PROJECT_TYPE_WEB_FEJLESZTES:
return $this->renderWithExtraParams('/contractType/contract_web_fejlesztes.html.twig', array('contract' => false));
break;
}
}
/**
* @Route("/admin/app/task/contract_tranche_task_divide", name="contract_tranche_task_divide", methods={"POST"} )
*/
public function contractTrancheTaskDivideAction(Request $request): Response
{
$id = $request->get('id');
$task = $this->taskRepository->find($id);
return $this->renderWithExtraParams('/contract/task_divide.html.twig', array(
'task'=>$task,
'title'=>$this->translator->trans('Edit log')
));
}
/**
* @Route("/admin/contract/contract_tranche_task_divide_save", name="contract_tranche_task_divide_save", methods={"POST"} )
*/
public function contractTrancheTaskDivideSaveAction(Request $request): Response
{
$data = $this->contractTrancheManager->divideContractTrancheTask($request);
return new JsonResponse(array ('editedDatatableRow' => $data['editedDatatableRow'],'datatableRow' => $data['datatableRow'], 'success' => $data['success']), 200);
}
// /**
// * @Route("/admin/contract/contract_type", name="contract_type", methods={"GET","POST"} )
// */
// public function contractAddAction(Request $request, TranslatorInterface $translator): Response
// {
// $id = $request->get('id');
// return $this->renderWithExtraParams('/contract/contract.html.twig', array(
// 'contract' => '',
// ));
//
// }
//
// /**
// * @Route("/admin/contract/contract_type", name="contract_type", methods={"GET","POST"} )
// */
// public function contractTypeAction(Request $request): Response
// {
// $id =(int)$request->get('itemId');
// if(ProjectType::PROJECT_TYPE_VANZARECUMPARARE == $id){
// //vanzare cumparare
// return $this->renderWithExtraParams('/contractType/contractVanzareCumparare.html.twig');
//
// }else{
// //edit
// return $this->renderWithExtraParams('/contractType/contractPrestariServicii.html.twig');
// }
// }
}