<?php
/**
* Created by Mediterranean Develup Solutions
* User: jorge.defreitas@develup.solutions
* Date: 13/04/2018
* Time: 10:03
*/
namespace App\MDS\EventsBundle\Controller;
use App\Entity\Configuration;
use App\Entity\SettingsCompany;
use App\MDS\EventsBundle\Entity\Proposal;
use App\MDS\EventsBundle\Entity\ProposalInvoiceDepositControl;
use App\MDS\EventsBundle\Entity\ProposalInvoiceDepositItems;
use App\MDS\EventsBundle\Form\ProposalInvoiceDepositItemsType;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use App\MDS\EventsBundle\Entity\ProposalTracing;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Request;
use DateTime;
use Symfony\Contracts\Translation\TranslatorInterface;
class ProposalInvoiceDepositControlller extends AbstractController
{
private $translator;
public function __construct(TranslatorInterface $translator) {
$this->translator = $translator;
}
/**
* @Route("/proposal/invoicedeposit/proforma/{id}", name="proposal_invoice_deposit_proforma")
*/
public function detailsProformaAction($id, Request $request)
{
$data = array();
$em = $this->getDoctrine()->getManager();
$proposal= $em->getRepository(Proposal::class)->findOneById($id);
$invoicedepositcontrol = $em->getRepository(ProposalInvoiceDepositControl::class)->findByProposalId($id);
$invoicedeposit = new ProposalInvoiceDepositItems();
$invoicedeposit->setProposalId($id);
$form = $this->createProposalInvoiceDepositItemsForm($invoicedeposit);
$controlId = null;
$type = "Proforma";
$prefix = "PFD-";
$date = new \DateTime('now');
$data = $this->baseInvoiceDepositProposal($id, $controlId, $type, $id, $prefix, $date, $request);
return $this->render('MDS/EventsBundle/invoice/invoice-deposit-proforma.html.twig',
array(
'id' => $id,
'cid' => $data['cid'],
'numberadmin' => null,
'type' => $data['type'],
'invoice' => $invoicedepositcontrol,
'number' => $data['number'],
'prefix' => $data['prefix'],
'date' => $data['date'],
'token' => $data['token'],
'proposal' => $data['proposal'],
'company' => $data['company'],
'clients' => $data['clients'],
'invoicedeposititems' => $data['invoicedeposititems'],
'totales_neto' => $data['totales_neto'],
'totales_iva' => $data['totales_iva'],
'totales' => $data['totales'],
'bases_imponibles' => $data['ivas'],
'currency' => $data['currency'],
'form' => $form->createView(),
'mcp' => $proposal->getMcp(),
'propEditable' => !($proposal->getStatus() == 'Invoiced'),
)
);
}
/**
* @Route("/proposal/invoicedeposit/invoice/{id}/{fid}", defaults={"fid" = ""}, name="proposal_invoice_deposit")
*/
public function detailsInvoiceDepositAction($id, $fid, Request $request)
{
$data = array();
$em = $this->getDoctrine()->getManager();
$proposal= $em->getRepository(Proposal::class)->findOneById($id);
$invoicecontrol = $em->getRepository(ProposalInvoiceDepositControl::class)->findByProposalId($id);
$prefix = "IFD-";
if (empty($fid)){
$invoicedeposititems = $em->getRepository(ProposalInvoiceDepositItems::class)->findBy(
array(
'proposalId' => $id,
'controlId' => null,
)
);
if (!empty($invoicedeposititems)){
$invoicedepositcontrol = new ProposalInvoiceDepositControl();
$invoicedepositcontrol->setProposalId($id);
$invoicedepositcontrol->setDateAt(new \DateTime("now"));
$invoicedepositcontrol->setPrefix($prefix);
/* Obtengo usuario logueado */
$user_logueado = $this->get('security.token_storage')->getToken()->getUser();
$user_id = $user_logueado->getId();
$invoicedepositcontrol->setCreatedId($user_id);
$invoicedepositcontrol->setUpdatedId($user_id);
$em->persist($invoicedepositcontrol);
$em->flush();
$controlId = $invoicedepositcontrol->getId();
$date = $invoicedepositcontrol->getDateAt();
foreach($invoicedeposititems as $invoicedeposit){
$invoicedeposit->setControlId($controlId);
$em->persist($invoicedeposit);
}
$em->flush();
return $this->redirectToRoute('proposal_invoice_deposit',
array(
'id' => $id,
'fid' => $invoicedepositcontrol->getId(),
)
);
}else{
return $this->redirectToRoute('proposal_invoice_deposit_proforma',
array(
'id' => $id
)
);
}
}else{
$invoicedepositcontrolconsulta = $em->getRepository(ProposalInvoiceDepositControl::class)->findOneBy(
array(
'proposalId' => $id,
'id' => $fid
)
);
$controlId = $invoicedepositcontrolconsulta->getId();
$date = $invoicedepositcontrolconsulta->getDateAt();
}
$number = $id."-".$controlId;
$type = "Invoice";
$data = $this->baseInvoiceDepositProposal($id, $controlId, $type, $number, $prefix, $date, $request);
/* Obtengo usuario logueado */
$user_logueado = $this->get('security.token_storage')->getToken()->getUser();
$user_id = $user_logueado->getId();
return $this->render('MDS/EventsBundle/invoice/invoice-deposit-invoice.html.twig',
array(
'id' => $id,
'cid' => $data['cid'],
'fid' => $controlId,
'invoice' => $invoicecontrol,
'numberadmin' => $data['numberadmin'],
'type' => $data['type'],
'number' => $data['number'],
'prefix' => $data['prefix'],
'date' => $data['date'],
'token' => $data['token'],
'proposal' => $data['proposal'],
'company' => $data['company'],
'clients' => $data['clients'],
'user' => $user_logueado,
'invoicedeposititems' => $data['invoicedeposititems'],
'totales_neto' => $data['totales_neto'],
'totales_iva' => $data['totales_iva'],
'totales' => $data['totales'],
'bases_imponibles' => $data['ivas'],
'currency' => $data['currency'],
'mcp' => $proposal->getMcp(),
)
);
}
private function createProposalInvoiceDepositItemsForm(ProposalInvoiceDepositItems $entity)
{
$form = $this->createForm(ProposalInvoiceDepositItemsType::class, $entity, array(
'action' => $this->generateUrl('proposal_invoice_Deposit_proforma_add'),
'method' => 'POST'
));
return $form;
}
/**
* @Route("/proposal/invoicedepositdelete/invoice/{id}/{fid}", defaults={"fid" = ""}, name="proposal_invoice_deposit_delete")
*/
public function deleteInvoiceDepositAction($id, $fid, Request $request)
{
$em = $this->getDoctrine()->getManager();
// INICIO: Buscamos en ITEMS los elementos que coincidan
$invoicedeposititems = $em->getRepository(ProposalInvoiceDepositItems::class)->findBy(
array(
'proposalId' => $id,
'controlId' => $fid
)
);
foreach ($invoicedeposititems as $item){
$em->remove($item);
$em->flush();
}
// FIN: Buscamos en ITEMS los elementos que coincidan
// INICIO: Buscamos en CONTROL los elementos que coincidan
$invoicedepositcontrol = $em->getRepository(ProposalInvoiceDepositControl::class)->findBy(
array(
'proposalId' => $id,
'id' => $fid
)
);
foreach ($invoicedepositcontrol as $item){
$numberDeposit = $item->getNumber();
$em->remove($item);
$em->flush();
}
// FIN: Buscamos en CONTROL los elementos que coincidan
/* Obtengo usuario logueado */
$user_logueado = $this->get('security.token_storage')->getToken()->getUser();
$user_id = $user_logueado->getId();
$now = new DateTime('now');
$tracingDeleteDeposit = new ProposalTracing();
$tracingDeleteDeposit->setDateAt($now);
$tracingDeleteDeposit->setCreatedAt($now);
$tracingDeleteDeposit->setUpdatedAt($now);
$tracingDeleteDeposit->setText('Ha eliminado la Factura de deposito No. '.$numberDeposit);
$tracingDeleteDeposit->setAgentId($user_id);
$tracingDeleteDeposit->setProposalId($id);
$tracingDeleteDeposit->setViewed('no');
$tracingDeleteDeposit->setCreatedId($user_id);
$tracingDeleteDeposit->setUpdatedId($user_id);
try{
$em->persist($tracingDeleteDeposit);
$em->flush();
$event = 'The item has been deleted.';
$successMessage = $this->translator->trans($event);
$this->addFlash('mensajereservation', $successMessage);
} catch (\Exception $e){
$event = 'An error occurred: '.$e->getMessage();
$errorMessage = $this->translator->trans($event);
$this->addFlash('mensajereservationerror', $errorMessage);
}
return $this->redirectToRoute('proposal_invoice_deposit_proforma',
array('id' => $id));
}
/**
* @Route("/proposal/invoicedeposit/add", name="proposal_invoice_Deposit_proforma_add")
*/
public function createDepositAction(Request $request)
{
$invoicedeposit = new ProposalInvoiceDepositItems();
$form = $this->createProposalInvoiceDepositItemsForm($invoicedeposit);
$form->handleRequest($request);
if($form->isValid())
{
$em = $this->getDoctrine()->getManager();
/* Obtengo usuario logueado */
$user_logueado = $this->get('security.token_storage')->getToken()->getUser();
$user_id = $user_logueado->getId();
$invoicedeposit->setCreatedId($user_id);
$invoicedeposit->setUpdatedId($user_id);
/* Gestión de eventos en Log */
$user_lastname = $user_logueado->getLastname();
$user_name = $user_logueado->getName();
$user_email = $user_logueado->getEmail();
$user_rol = $user_logueado->getRoles();
$event_url = $request->getPathInfo();
$event_complete = $user_name.' '.$user_lastname.' - '.$user_email.' - '.$user_rol[0].' | '.$event_url;
$em->persist($invoicedeposit);
$em->flush();
$event = 'the Items was registered';
$successMessage = $this->translator->trans($event);
$this->addFlash('mensajeinvoicedepositservices', $successMessage);
return $this->redirectToRoute('proposal_invoice_deposit_proforma',
array(
'id' => $invoicedeposit->getProposalId()
)
);
}else{
$errorMessage = $this->translator->trans('Error, some fields are empty');
$this->addFlash('mensajeinvoicedepositserviceserror', $errorMessage);
}
return $this->redirectToRoute('proposal_invoice_deposit_proforma',
array(
'id' => $invoicedeposit->getProposalId()
)
);
}
/**
* @Route("/proposal/invoicedeposit/print/proforma/{id}", name="proposal_invoice_deposit_proforma_print")
*/
public function printdetailsProformaDepositAction($id, Request $request)
{
$data = array();
$controlId = null;
$type = "Proforma";
$prefix = "PFD-";
$date = new \DateTime('now');
$data = $this->baseInvoiceDepositProposal($id, $controlId, $type, $id, $prefix, $date, $request);
return $this->render('MDS/EventsBundle/invoice/print-invoice-deposit-proforma.html.twig',
array(
'id' => $id,
'cid' => $data['cid'],
'numberadmin' => null,
'type' => $data['type'],
'number' => $data['number'],
'prefix' => $data['prefix'],
'date' => $data['date'],
'token' => $data['token'],
'proposal' => $data['proposal'],
'company' => $data['company'],
'clients' => $data['clients'],
'invoicedeposititems' => $data['invoicedeposititems'],
'totales_neto' => $data['totales_neto'],
'totales_iva' => $data['totales_iva'],
'totales' => $data['totales'],
'bases_imponibles' => $data['ivas'],
'currency' => $data['currency']
)
);
}
/**
* @Route("/proposal/invoicedeposit/print/invoice/{id}/{fid}", name="proposal_invoice_deposit_invoice_print")
*/
public function printdetailsInvoicedepositAction($id, $fid, Request $request)
{
$data = array();
$em = $this->getDoctrine()->getManager();
$invoicedepositcontrolconsulta = $em->getRepository(ProposalInvoiceDepositControl::class)->findOneBy(
array(
'proposalId' => $id,
'id' => $fid
)
);
$type = "Invoice";
$controlId = $invoicedepositcontrolconsulta->getId();
$date = $invoicedepositcontrolconsulta->getDateAt();
$prefix = $invoicedepositcontrolconsulta->getPrefix();
$data = $this->baseInvoiceDepositProposal($id, $controlId, $type, $id, $prefix, $date, $request);
return $this->render('MDS/EventsBundle/invoice/print-invoice-deposit-proforma.html.twig',
array(
'id' => $id,
'cid' => $data['cid'],
'numberadmin' => $data['numberadmin'],
'type' => $data['type'],
'number' => $data['number'],
'prefix' => $data['prefix'],
'date' => $data['date'],
'token' => $data['token'],
'proposal' => $data['proposal'],
'company' => $data['company'],
'clients' => $data['clients'],
'invoicedeposititems' => $data['invoicedeposititems'],
'totales_neto' => $data['totales_neto'],
'totales_iva' => $data['totales_iva'],
'totales' => $data['totales'],
'bases_imponibles' => $data['ivas'],
'currency' => $data['currency']
)
);
}
private function baseInvoiceDepositProposal($id, $controlId, $type, $number, $prefix, $date, Request $request)
{
$em = $this->getDoctrine()->getManager();
$proposal= $em->getRepository(Proposal::class)->findOneById($id);
$company = $em->getRepository(SettingsCompany::class)->findOneById('1');
$parameters = array(
'id' => $proposal->getclientId(),
);
$dql = 'SELECT cl, c.country, re.region, p.name, r.city
FROM App:Client cl
INNER JOIN App:Country c WITH c.id = cl.country
INNER JOIN App:Regions re WITH re.id = cl.region
INNER JOIN App:Provinces p WITH p.id = cl.province
INNER JOIN App:Cities r WITH r.id = cl.population
WHERE cl.id = :id';
$query = $em->createQuery($dql)->setParameters($parameters);
$client = $query->getResult();
if (!is_null($controlId)){
$invoicecontrol = $em->getRepository(ProposalInvoiceDepositControl::class)->findOneById($controlId);
if (!is_null($invoicecontrol->getNumber())){
$numberadmin = $invoicecontrol->getNumber();
}else{
$numberadmin = null;
}
}else{
$numberadmin = null;
}
$invoicedeposititems = $em->getRepository(ProposalInvoiceDepositItems::class)->findBy(
array(
'proposalId' => $id,
'controlId' => $controlId,
)
);
$totales_neto_all = "0";
$totales_iva_all = "0";
$totales_con_iva_all = "0";
$data_iva = array();
$data_deposititems = array();
foreach($invoicedeposititems as $deposititems){
$amount = $deposititems->getAmount();
$iva_base = $deposititems->getIva();
$iva = $iva_base / 100;
if($iva_base !='0'){
$amount_iva = $amount * $iva;
}else{
$amount_iva = "0";
}
$amount_con_iva = $amount + $amount_iva;
$totales_neto_all += $amount;
$totales_iva_all += $amount_iva;
$totales_con_iva_all += $amount_con_iva;
if (empty($totales_ivas_all[$iva_base])){
$totales_ivas_all[$iva_base]= 0;
}
$totales_ivas_all[$iva_base] += $amount_iva;
$data_iva[$iva_base] = array(
'iva' => $iva_base,
'ivas' => $totales_ivas_all[$iva_base],
);
$data_deposititems[] = array(
'id' => $deposititems->getId(),
'name' => $deposititems->getName(),
'amount' => $amount,
'iva' => $iva_base,
'total' => $amount_con_iva
);
}
$currency ="€";
$data = array(
'id' => $id,
'cid' => $controlId,
'type' => $type,
'number' => $number,
'prefix' => $prefix,
'numberadmin' => $numberadmin,
'date' => $date,
'token' => $proposal->getAccessKey(),
'proposal' => $proposal,
'company' => $company,
'clients' => $client,
'invoicedeposititems' => $data_deposititems,
'totales_neto' => $totales_neto_all,
'totales_iva' => $totales_iva_all,
'totales' => $totales_con_iva_all,
'ivas' => $data_iva,
'currency' => $currency,
);
return $data;
}
/**
* @Route("/proposal/invoicedeposit/deleted/items/{id}", name="proposal_invoice_deposit_invoice_deleted_items")
*
*/
public function deleteItemsInvoiceDepositAction($id, Request $request)
{
$em = $this->getDoctrine()->getManager();
$delete = $em->getRepository(ProposalInvoiceDepositItems::class)->findOneById($id);
$em->remove($delete);
$em->flush();
$event = 'The item in the deposit proforma has been removed';
$successMessage = $this->translator->trans($event);
$this->addFlash('mensajeinvoicedepositservices', $successMessage);
return $this->redirectToRoute('proposal_invoice_deposit_proforma',
array(
'id' => $delete->getProposalId(),
)
);
}
/**
* @Route("/proposal/invoicedeposit/number/updated/{cid}/{id}", name="proposal_invoicedeposit_number_update")
*/
public function InvoiceEmptyNumberInvoiceDepositUpdateAction($cid, $id, Request $request)
{
$em = $this->getDoctrine()->getManager();
$invoice = $em->getRepository(ProposalInvoiceDepositControl::class)->findOneById($id);
$numberinvoice = $request->request->get('invoice')['number'];
// d($invoice, $numberinvoice);
if(!empty($numberinvoice) and !is_null($invoice))
{
$invoice->setNumber($numberinvoice);
/* Obtengo usuario logueado */
$user_logueado = $this->get('security.token_storage')->getToken()->getUser();
$user_id = $user_logueado->getId();
$invoice->setUpdatedId($user_id);
$em->persist($invoice);
$em->flush();
$event = 'The Invoice Deposit has been Updated.';
$successMessage = $this->translator->trans($event);
$this->addFlash('mensajeinvoicedepositservices', $successMessage);
}else{
$errorMessage = $this->translator->trans('Error, some fields are empty');
$this->addFlash('mensajeinvoicedepositserviceserror', $errorMessage);
}
return $this->redirectToRoute('proposal_invoice_deposit',
array(
'id' => $cid,
'fid' => $id,
)
);
}
}