<?php
namespace App\Controller\Finance;
use App\Entity\Finance\Proposal;
use App\Entity\Finance\ProposalElement;
use App\Entity\HR\Employee;
use App\Form\Finance\ContractType;
use App\Entity\Finance\Contract;
use App\Entity\Finance\ContractElement;
use App\Form\Finance\ProposalType;
use App\Form\Finance\ProposalInterviewType;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Contracts\Translation\TranslatorInterface;
use Symfony\Component\Routing\Annotation\Route;
use App\Service\Kernel\KernelService;
use Symfony\Component\Form\Extension\Core\Type\NumberType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
/**
* @Route("/{_locale}/proposal")
*/
class ProposalController extends AbstractController
{
/**
* @Route("/index/{state}/{open}/{my}/{user}/{interview}", name="proposal_index", methods={"GET"})
*/
public function index(int $state=0, int $open=0, int $my=0, int $user=0, int $interview = 0): Response
{
$classname = explode("\\", get_class($this));
$arraysize = count($classname);
$attribute = str_replace("Controller", "", $classname[$arraysize-1]) . ":" . str_replace("Action", "", __FUNCTION__);
$this->denyAccessUnlessGranted($attribute);
return $this->render('finance/proposal/index.html.twig',[
'state' => $state,
'open' => $open,
'my' => $my,
'user' => $user,
'interview' => $interview,
]);
}
/**
* @Route("/table/{state}/{open}/{my}/{leadId}/{user}/{interview}", name="proposal_table", methods={"GET"})
*/
public function table(int $state, int $open, int $my,int $leadId, int $user = 0, int $interview = 0) :Response{
$classname = explode("\\", get_class($this));
$arraysize = count($classname);
$attribute = str_replace("Controller", "", $classname[$arraysize-1]) . ":" . str_replace("Action", "", __FUNCTION__);
$this->denyAccessUnlessGranted($attribute);
$button = $state + 3*$open + 9*$my + 27*$interview;
return $this->render('finance/proposal/table.html.twig', [
'button' => $button, 'state' => $state, 'open' => $open, 'my' => $my, 'leadId' => $leadId,'user' => $user, 'interview'=>$interview
]);
}
/**
* @Route("/tabledetails/{state}/{open}/{my}/{leadId}/{user}/{interview}", name="proposal_tabledetails", methods={"GET","POST"})
*/
public function tabledetails(Request $request, int $state,int $open,int $my,int $leadId,int $user=0,int $interview = 0,TranslatorInterface $translator, KernelService $kernel_service) : Response {
$classname = explode("\\", get_class($this));
$arraysize = count($classname);
$attribute = str_replace("Controller", "", $classname[$arraysize -1]) . ":" . str_replace("Action", "", __FUNCTION__);
$this->denyAccessUnlessGranted($attribute);
$start = $request->get('start');
$length = $request->get('length');
$em = $this->getDoctrine()->getManager();
$organization = $this->getUser()->getOrganization();
if ($organization == null)
{
$organizationid = 0;
}
else
{
$organizationid = $organization->getId();
}
$filter = $request->get('search')['value'];
//$openbasedondate = $kernel_service->getApplicationInfoValue('Kernel.OpenProposalBasedOnDate');
$columns = $request->get('columns');
$order = $request->get('order');
$orderColumn = $order[0]["column"];
$orderby = $this->orderColumns($orderColumn, $interview);
$direction = strtoupper($order[0]["dir"]);
$queryString = "SELECT s FROM App\Entity\Finance\Proposal s LEFT JOIN s.client t LEFT JOIN s.endClient u LEFT JOIN s.proposalElement v LEFT JOIN v.employee w WHERE ((s.state = ?1) ";
if($open == 1){
/*if ($openbasedondate == true)
{
$queryString = $queryString . "AND (s.proposedOn >= ?3) ";
}
else
{*/
$queryString = $queryString . "AND (s.open = ?3) ";
//}
}
if($my == 1){
$queryString = $queryString . "AND (s.owner = ?4 ) ";
}
if($user != 0){
$queryString = $queryString . "AND (s.owner = ?4 ) ";
}
if($leadId != -1){
$queryString = $queryString . "AND (s.lead = ?5) ";
}
if($interview != 0){
$queryString = $queryString . "AND (s.interview = ?6) ";
}
$queryString = $queryString ."AND ((?2 = 0) or ((s.organization = ?2) or (s.organization is null)))) ";
if(!empty($filter) == true){
$queryString = $queryString ."AND ((((s.subject LIKE '%".$filter."%') "
. "or (concat(w.firstname,' ', w.lastname) LIKE '%".$filter."%')"
. "or (t.company LIKE '%".$filter."%')) "
. "or (u.company LIKE '%".$filter."%')) "
. "or (s.proposedOn LIKE '%".$filter."%')) ";
}
$queryString = $queryString ."ORDER BY ".$orderby." ".$direction;
$query = $em->createQuery($queryString);
$count = $query->setParameter(2, $organizationid)
->setParameter(1, $state);
if($open == 1){
/*if ($openbasedondate == true)
{
$dateInTwoWeeks = strtotime('-2 weeks');
$count->setParameter(3, $dateInTwoWeeks);
}
else
{*/
$count->setParameter(3, $open);
//}
}
if($my == 1){
$count->setParameter(4, $this->getUser());
}
if($user != 0){
$count->setParameter(4, $user);
}
if($leadId != -1){
$count->setParameter(5, $leadId);
}
if($interview != 0){
$count->setParameter(6, $interview);
}
$total = count($count->getResult());
$query->setMaxResults($length)
->setFirstResult($start);
$proposals = $query->getResult();
$twig = clone $this->get('twig');
$datawithlinks = array();
foreach($proposals as $row){
$i = 0;
$newrow = array();
$element = null;
foreach ($row->getProposalElement() as $element2)
{
if ($element2->getState() == 0)
{
$element =$element2;
}
}
$url = $twig->createTemplate("{{ path('proposal_show', {'id': id }) }}")->render(array("id" => $row->getId()));
$newrow[$i] = $row->getId();
$i++;
$newrow[$i] = $url;
$i++;
//$newrow[$i] = $translator->trans("".$row->getType());
//$i++;
if ($element != null)
{
$newrow[$i] = "".$element->getEmployee();
$i++;
$newrow[$i] = "".$element->getIntakePrice();
$i++;
$newrow[$i] = "".$element->getUnitPrice();
$i++;
} else
{
$newrow[$i] = "";
$i++;
$newrow[$i] = "";
$i++;
$newrow[$i] = "";
$i++;
}
$newrow[$i] = $row->getSubject();
$i++;
if ($interview == 1)
{
if ($row->getInterviewDate() != null)
{
$newrow[$i] = "".$row->getInterviewDate()->format('d/m/Y');
}
else
{
$newrow[$i] = "";
}
}
else
{
if ($row->getProposedOn() != null)
{
$newrow[$i] = "".$row->getProposedOn()->format('d/m/Y');
}
else
{
$newrow[$i] = "";
}
}
$i++;
$newrow[$i] = "".$row->getContactPerson();
$i++;
$newrow[$i] = "".$row->getClient();
$i++;
$newrow[$i] = "".$row->getEndClient();
$i++;
$newrow[$i] = "".$row->getOwner();
$i++;
if($row->getOpen()){
$state = "Open";
}else{
$state = "Closed";
}
$newrow[$i] = $translator->trans($state);
$i++;
$newrow[$i] = "".$row->getOrganization();
$i++;
$datawithlinks[] = $newrow;
}
$return = array(
"draw" => intval($request->get('draw')),
"recordsTotal" => $total,
"recordsFiltered" => $total,
"aaData" => $datawithlinks
);
$return = json_encode($return);
return new Response($return,200,array('Content-type' => 'application/json'));
}
public function orderColumns($orderColumn, $interview){
$orderby = "";
switch($orderColumn){
case 0:
$orderby = "s.id"; // i don't think this works
break;
case 2:
$orderby = "s.id"; // i don't think this works
break;
case 3:
$orderby = "s.id"; // i don't think this works
break;
case 4:
$orderby = "s.id"; // i don't think this works
break;
case 5:
$orderby = "s.subject";
break;
case 6:
if ($interview == 1)
{
$orderby = "s.interviewDate";
}
else
{
$orderby = "s.proposedOn";
}
break;
case 7:
$orderby = "s.contactPerson";
break;
case 8:
$orderby = "s.client";
break;
case 9:
$orderby = "s.endClient";
break;
case 10:
$orderby = "s.owner"; // total amount don't work
break;
case 11:
$orderby = "s.open";
break;
case 12:
$orderby = "s.organization";
break;
}
return $orderby;
}
/**
* @Route("/{id}/newcontract", name="proposal_newContract", methods={"GET","POST"})
*/
public function newContract(Request $request, Proposal $proposal): Response
{
$classname = explode("\\", get_class($this));
$arraysize = count($classname);
$attribute = str_replace("Controller", "", $classname[$arraysize-1]) . ":" . str_replace("Action", "", __FUNCTION__);
$this->denyAccessUnlessGranted($attribute);
$entityManager = $this->getDoctrine()->getManager();
$contract = new Contract();
$date = new \DateTime();
$contract->setStartDate($date);
$contract->setEndDate($date);
$contract->setContractCreated($date);
$contract->setProposal($proposal);
$contract->setSubject($proposal->getSubject());
$contract->setType($proposal->getType());
$contract->setClient($proposal->getClient());
$contract->setEndClient($proposal->getEndClient());
$contract->setOwner($proposal->getOwner());
$contract->setOpen($proposal->getOpen());
$contract->setNoExtension(false);
$contract->setSend2signedCopies(false);
$contract->setReceivedCounterSigned(false);
$contract->setState(0);
$contract->setContactPerson($proposal->getContactPerson());
$contract->setOrganization($proposal->getOrganization());
$entityManager->persist($contract);
$proposal->setOpen(false);
$entityManager->persist($proposal);
foreach($proposal->getProposalElement() as $element)
{
$contractelement = new ContractElement();
$contractelement->setContract($contract);
$contractelement->setEmployee($element->getEmployee());
$contractelement->setFrequency($element->getFrequency());
$contractelement->setIntakePrice($element->getIntakePrice());
$contractelement->setUnitPrice($element->getUnitPrice());
$contractelement->setProduct($element->getProduct());
$contractelement->setQuantity($element->getQuantity());
$contractelement->setReceivedBack(false);
$contractelement->setSendCounterSigned(false);
$contractelement->setContractSendToConsultant(false);
$contractelement->setState(0);
$entityManager->persist($contractelement);
}
$entityManager->flush();
return $this->redirectToRoute('contract_edit', array('id' => $contract->getId()));
}
/**
* @Route("/new/{id?0}", name="proposal_new", methods={"GET","POST"})
*/
public function new(Request $request, int $id = 0, KernelService $kernelservice): Response
{
$classname = explode("\\", get_class($this));
$arraysize = count($classname);
$attribute = str_replace("Controller", "", $classname[$arraysize-1]) . ":" . str_replace("Action", "", __FUNCTION__);
$this->denyAccessUnlessGranted($attribute);
$entityManager = $this->getDoctrine()->getManager();
$proposal = new Proposal();
$date = new \DateTime();
$proposal->setProposedOn($date);
$proposal->setOpen(true);
$proposal->setOwner($this->getUser());
$organization = $this->getUser()->getOrganization();
$simpleProposals = $kernelservice->getApplicationInfoValue("Sales.SimpleProposals");
$form = $this->createForm(ProposalType::class, $proposal,
['organization' => $organization, 'action' => $this->generateUrl('proposal_new'), 'attr' => ['id' => $this->generateUrl('proposal_new')]]);
if($simpleProposals)
{
$required = true;
$employee = null;
$employees = array();
if ($id != 0)
{
$employeeentity = $entityManager->getRepository(Employee::class)->findOneById($id);
$employees["".$employeeentity]
= "SU".$employeeentity->getId();
$employee = "SU".$employeeentity->getId();
}
$form->add('employeeselect2',ChoiceType::class, array('priority' => 3, 'label' => 'Employee',
'required' => true,
'multiple' => false,
'mapped' => false,
'data' => $employee,
'choices' => $employees,
'attr' => array('class' => 'selectemployee')
));
$form->add('intakePrice', NumberType::class, array('priority' => 2, 'mapped' => false, 'label' => 'IntakePrice','required' => $required));
$form->add('unitPrice', NumberType::class, array('priority' => 1, 'mapped' => false, 'label' => 'Proposal.UnitPrice','required' => $required));
}
if ($this->getUser()->getOrganization() == null) {
$form->add('organization', null, array('label' => 'Organization',
'query_builder' => function ($repository) {
return $repository->createQueryBuilder('s')->where("s.state = 0");
},
'attr' => ['class' => 'select2']));
}
$form->handleRequest($request);
if ($form->isSubmitted()) {// && $form->isValid()) {
$proposal->setState(0);
if ($this->getUser()->getOrganization() != null) {
$proposal->setOrganization($this->getUser()->getOrganization());
}
$entityManager->persist($proposal);
$entityManager->flush();
$requestdata = $request->request->all("proposal");
$unitprice = 0;
if (isset($requestdata['unitPrice']) == true)
{
$unitprice = floatval(str_replace(',', '.', $requestdata['unitPrice']));
}
$intakeprice = 0;
if (isset($requestdata['intakePrice']) == true)
{
$intakeprice = floatval(str_replace(',', '.', $requestdata['intakePrice']));
}
if (isset($requestdata['employeeselect2']) == true) {
$employeeselect2 = $requestdata['employeeselect2'];
$employee = null;
$employeetype = substr($employeeselect2, 0, 2);
$employeeid = substr($employeeselect2, 2);
if ($employeetype == "SU") {
$proposalElement = new ProposalElement();
$proposalElement->setProposal($proposal);
$proposalElement
->setEmployee(
$entityManager->getRepository(Employee::class)
->findOneById($employeeid));
$proposalElement->setIntakePrice($intakeprice);
$proposalElement->setUnitPrice($unitprice);
$proposalElement->setState(0);
$proposalElement->setQuantity(0);
$entityManager->persist($proposalElement);
$entityManager->flush();
}
}
$this->denyAccessUnlessGranted($attribute, $proposal);
//return $this->redirectToRoute('proposal_index');
return $this->redirectToRoute('proposal_show', array('id' => $proposal->getId()));
}
return $this->render('finance/proposal/new.html.twig', [
'proposal' => $proposal,
'form' => $form->createView(),
]);
}
/**
* @Route("/{id}", name="proposal_show", methods={"GET"})
*/
public function show(Proposal $proposal, KernelService $kernelservice): Response
{
$classname = explode("\\", get_class($this));
$arraysize = count($classname);
$attribute = str_replace("Controller", "", $classname[$arraysize-1]) . ":" . str_replace("Action", "", __FUNCTION__);
$this->denyAccessUnlessGranted($attribute, $proposal);
$simpleProposals = $kernelservice->getApplicationInfoValue("Sales.SimpleProposals");
$interviewProposals = $kernelservice->getApplicationInfoValue("Sales.InterviewProposals");
return $this->render('finance/proposal/show.html.twig', [
'proposal' => $proposal,
'simpleProposals' => $simpleProposals,
'interviewProposals' => $interviewProposals
]);
}
/**
* @Route("/{id}/audit", name="proposal_showaudit", methods={"GET"})
*/
public function showaudit(Proposal $proposal): Response
{
$classname = explode("\\", get_class($this));
$arraysize = count($classname);
$attribute = str_replace("Controller", "", $classname[$arraysize-1]) . ":" . str_replace("Action", "", __FUNCTION__);
$this->denyAccessUnlessGranted($attribute, $proposal);
return $this->render('finance/proposal/showaudit.html.twig', [
'proposal' => $proposal,
]);
}
/**
* @Route("/{id}/archive", name="proposal_archive", methods={"GET"})
*/
public function archive(Proposal $proposal): Response
{
$classname = explode("\\", get_class($this));
$arraysize = count($classname);
$attribute = str_replace("Controller", "", $classname[$arraysize-1]) . ":" . str_replace("Action", "", __FUNCTION__);
$this->denyAccessUnlessGranted($attribute, $proposal);
$entityManager = $this->getDoctrine()->getManager();
$proposal->setState(1);
$entityManager->persist($proposal);
$entityManager->flush();
return $this->redirectToRoute('proposal_show', array('id' => $proposal->getId()));
}
/**
* @Route("/{id}/restore", name="proposal_restore", methods={"GET"})
*/
public function restore(Proposal $proposal): Response
{
$classname = explode("\\", get_class($this));
$arraysize = count($classname);
$attribute = str_replace("Controller", "", $classname[$arraysize-1]) . ":" . str_replace("Action", "", __FUNCTION__);
$this->denyAccessUnlessGranted($attribute, $proposal);
$entityManager = $this->getDoctrine()->getManager();
$proposal->setState(0);
$entityManager->persist($proposal);
$entityManager->flush();
return $this->redirectToRoute('proposal_show', array('id' => $proposal->getId()));
}
/**
* @Route("/{id}/delete", name="proposal_logicaldelete", methods={"GET"})
*/
public function logicaldelete(Proposal $proposal): Response
{
$classname = explode("\\", get_class($this));
$arraysize = count($classname);
$attribute = str_replace("Controller", "", $classname[$arraysize-1]) . ":" . str_replace("Action", "", __FUNCTION__);
$this->denyAccessUnlessGranted($attribute, $proposal);
$entityManager = $this->getDoctrine()->getManager();
$proposal->setState(2);
$entityManager->persist($proposal);
$entityManager->flush();
return $this->redirectToRoute('proposal_index');
}
/**
* @Route("/{id}/edit", name="proposal_edit", methods={"GET","POST"})
*/
public function edit(Request $request, Proposal $proposal, KernelService $kernelservice): Response
{
$classname = explode("\\", get_class($this));
$arraysize = count($classname);
$attribute = str_replace("Controller", "", $classname[$arraysize-1]) . ":" . str_replace("Action", "", __FUNCTION__);
$this->denyAccessUnlessGranted($attribute, $proposal);
$form = $this->createForm(ProposalType::class, $proposal,
['organization' => $proposal->getOrganization() , 'action' => $this->generateUrl('proposal_edit', array('id' => $proposal->getId())),
'attr' => ['id' => $this->generateUrl('proposal_edit', array('id' => $proposal->getId()))]]);
$simpleProposals = $kernelservice->getApplicationInfoValue("Sales.SimpleProposals");
if($simpleProposals)
{
$employees = array();
$employee = "";
$unitPrice = 0;
$intakePrice = 0;
if ($proposal->getProposalElement()->isEmpty() == false) {
$element = $proposal->getProposalElement()->first();
$employee = $element->getEmployee();
$unitPrice = $element->getUnitPrice();
$intakePrice = $element->getIntakePrice();
if ($element->getEmployee() != null)
{
$employees["".$element->getEmployee()]
= "SU".$element->getEmployee()->getId();
$employee = "SU".$element->getEmployee()->getId();
}
}
$required = true;
$form->add('employeeselect2',ChoiceType::class, array('priority' => 3, 'label' => 'Employee',
'required' => true,
'multiple' => false,
'mapped' => false,
'data' => $employee,
'choices' => $employees,
'attr' => array('class' => 'selectemployee')
));
$form->add('intakePrice', NumberType::class, array('priority' => 2, 'data' => $intakePrice, 'mapped' => false, 'label' => 'IntakePrice','required' => $required));
$form->add('unitPrice', NumberType::class, array('priority' => 1, 'data' => $unitPrice, 'mapped' => false, 'label' => 'UnitPrice','required' => $required));
}
$form->handleRequest($request);
if ($form->isSubmitted()) { // && $form->isValid()) {
$this->getDoctrine()->getManager()->flush();
if($simpleProposals)
{
if ($proposal->getProposalElement()->isEmpty() == false) {
$element = $proposal->getProposalElement()->first();
$requestdata = $request->request->all("proposal");
if (isset($requestdata['unitPrice']) == true)
{
$element->setUnitPrice($requestdata['unitPrice']);
}
if (isset($requestdata['intakePrice']) == true)
{
$element->setIntakePrice($requestdata['intakePrice']);
}
if (isset($requestdata['employeeselect2']) == true) {
$employeeselect2 = $requestdata['employeeselect2'];
$employee = null;
$entityManager = $this->getDoctrine()->getManager();
$employeetype = substr($employeeselect2, 0, 2);
$employeeid = substr($employeeselect2, 2);
if ($employeetype == "SU") {
$element
->setEmployee(
$entityManager->getRepository(Employee::class)
->findOneById($employeeid));
}
}
$entityManager->persist($element);
$entityManager->flush();
}
}
return $this->redirectToRoute('proposal_show', array('id' => $proposal->getId()));
}
return $this->render('finance/proposal/edit.html.twig', [
'proposal' => $proposal,
'form' => $form->createView(),
]);
}
/**
* @Route("/{id}/editinterview", name="proposal_editinterview", methods={"GET","POST"})
*/
public function editinterview(Request $request, Proposal $proposal, KernelService $kernelservice): Response
{
$classname = explode("\\", get_class($this));
$arraysize = count($classname);
$attribute = str_replace("Controller", "", $classname[$arraysize-1]) . ":" . str_replace("Action", "", __FUNCTION__);
$this->denyAccessUnlessGranted($attribute, $proposal);
$form = $this->createForm(ProposalInterviewType::class, $proposal,
['action' => $this->generateUrl('proposal_editinterview', array('id' => $proposal->getId())),
'attr' => ['id' => $this->generateUrl('proposal_editinterview', array('id' => $proposal->getId()))]]);
$form->handleRequest($request);
if ($form->isSubmitted()) { // && $form->isValid()) {
$this->getDoctrine()->getManager()->flush();
return $this->redirectToRoute('proposal_show', array('id' => $proposal->getId()));
}
return $this->render('finance/proposal/editinterview.html.twig', [
'proposal' => $proposal,
'form' => $form->createView(),
]);
}
/**
* @Route("/{id}", name="proposal_delete", methods={"DELETE"})
*/
public function delete(Request $request, Proposal $proposal): Response
{
$classname = explode("\\", get_class($this));
$arraysize = count($classname);
$attribute = str_replace("Controller", "", $classname[$arraysize-1]) . ":" . str_replace("Action", "", __FUNCTION__);
$this->denyAccessUnlessGranted($attribute, $proposal);
if ($this->isCsrfTokenValid('delete'.$proposal->getId(), $request->request->get('_token'))) {
$entityManager = $this->getDoctrine()->getManager();
$entityManager->remove($proposal);
$entityManager->flush();
}
return $this->redirectToRoute('proposal_index');
}
}