<?php
/**
* Created by Mediterranean Develup Solutions
* User: jorge.defreitas@develup.solutions
* Date: 14/08/2017
* Time: 12:15
*/
namespace App\MDS\EventsBundle\Controller;
use App\Entity\Configuration;
use App\Entity\SettingsCompany;
use App\Entity\Supplier;
use App\MDS\EventsBundle\Entity\Proposal;
use App\MDS\EventsBundle\Entity\ProposalSupplierServices;
use App\MDS\EventsBundle\Entity\ProposalSupplierServicesCosts;
use App\Service\ProposalSupplierServicesService;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Contracts\Translation\TranslatorInterface;
class ProposalSupplierServicesCostsController extends AbstractController
{
private $translator;
public function __construct(TranslatorInterface $translator) {
$this->translator = $translator;
}
/*
* ATENCION LAS RAIZ DE @Route POR DEFECTO DEL BUNDLE: EventsBundle ES /events/, NO PONERLO EN LA @Route("")
*
* */
/**
* @Route("/proposal/costs/supplier/view/{id}", name="proposal_supplier_services_costs")
*/
public function costsSupplierAction($id, Request $request)
{
$em = $this->getDoctrine()->getManager();
$proposal = $em->getRepository(Proposal::class)->findOneById($id);
/* Obtengo usuario logueado */
$user_logueado = $this->get('security.token_storage')->getToken()->getUser();
$user_id = $user_logueado->getId();
// $services_id= $em->getRepository(SupplierIdServices::class)->findAll();
/* INSERTAMOS Y ACTUALIZAMOS LA BASE DE DATOS ProposalSupplierServicesCosts*/
/* Sacamos los proveedores dentro de la proposal*/
// $supplier_control = $em->getRepository(ProposalSupplierControl::class)->findByProposalId($id);
$services_supplier = $em->getRepository(ProposalSupplierServices::class)->findBy(
array(
'proposalId' => $id,
'isFather' => '',
'status' => 'Confirmed',
),
array(
'id' => 'ASC'
)
);
$supplier_control = array();
foreach($services_supplier as $servicessupplier){
if (!is_null($servicessupplier->getsupplierId()) && $servicessupplier->getsupplierId() != '0'){
// if (!is_null($servicessupplier->getsupplierId())){
$supplier_control[$servicessupplier->getSupplierId()] = $servicessupplier->getSupplierId();
}
}
$data_supplier = array();
$idcostsfuera = array();
foreach($supplier_control as $supplierControl){
$services_hay = $em->getRepository(ProposalSupplierServices::class)->findBy(
array(
'proposalId' => $id,
'supplierId' => $supplierControl,
'isFather' => '0',
'status' => 'Confirmed',
),
array(
'id' => 'ASC'
)
);
$total_neto = 0;
$total_iva = 0;
if (!empty($services_hay)){
$datos = array();
foreach($services_hay as $serviceshay){
if (!is_null($serviceshay->getsupplierId())){
if ($serviceshay->getDirectPayment() == true){
$symbol_pago = " PD-YES";
}else{
$symbol_pago = " PD-NO";
}
$datos[$serviceshay->getServiceCatId().' I'.$serviceshay->getIva().$symbol_pago][] = $serviceshay;
}
}
foreach ($datos as $datos1){
$totales = "0";
$totales_direct = "0";
$dentroServiceIds = "";
$ids = array();
$contando_costs="0";
foreach ($datos1 as $datos2){
//COLOR POR SERVICIO
$contcolor ="";
switch ($datos2->getServiceCatName()) {
case "Accommodation":
$contcolor = 'teal';
break;
case "Menu" :
$contcolor = 'purple';
break;
case "Lounge":
$contcolor = 'warning';
break;
case "Activities":
$contcolor = 'blue';
break;
case "Itineraries":
$contcolor = 'indigo';
break;
case "Cruise":
$contcolor = 'brown';
break;
case "Transport":
$contcolor = 'grey';
break;
case "Av":
$contcolor = 'slate';
break;
case "Creative":
$contcolor = 'orange';
break;
case "Gifts":
$contcolor = 'pink';
break;
case "Entertainment":
$contcolor = 'green';
break;
case "Guide":
$contcolor = 'orange';
break;
case "Others":
$contcolor = 'danger';
break;
case "Technology":
$contcolor = 'slate-800';
break;
case "Assistant":
$contcolor = 'indigo-800';
break;
case "DDR":
$contcolor = 'green-300';
break;
}
$directPayment = $datos2->getDirectPayment();
$ids[] = $datos2->getId();
// $opcommission = $datos2->getOpCommission();
// $comision = $datos2->getCommission();
if (is_null($datos2->getCommission()) or empty($datos2->getCommission())){
$comision = 0;
}else{
$comision = $datos2->getCommission();
}
$opiva = $datos2->getOpIva();
// $iva = $datos2->getIva();
if (is_null($datos2->getIva()) or empty($datos2->getIva())){
$iva = 0;
}else{
$iva = $datos2->getIva();
}
$supplierId = $datos2->getSupplierId();
$dateInAt = $datos2->getDateInAt();
$dateOutAt = $datos2->getDateOutAt();
if (!is_null($dateInAt) and !is_null($dateOutAt)){
$days = $dateInAt->diff($dateOutAt);
$day = $days->days;
}else{
$day = "0";
}
// $price = $datos2->getPrice();
if (is_null($datos2->getPrice()) or empty($datos2->getPrice())){
$price = 0;
}else{
$price = $datos2->getPrice();
}
$units = $datos2->getUnits();
$pax = $datos2->getPax();
$idcat = $datos2->getServiceCatId();
$idcatName = $datos2->getServiceCatName();
$total = $this->CalculoTotalCosts($price, $units, $pax, $day, $idcat, $opiva, $iva);
if ($directPayment == true){
if($opiva =='0'){
$iva = $iva / 100;
$total = $total / ($iva + 1);
}
$comision_direct = ($comision / 100);
$total_direct = $total * $comision_direct;
$totales_direct += $total_direct;
}else{
$totales += $total;
}
/* CONSULTAMOS PARA SUMAR */
$parameters = array(
'servicesId' => '%'.$datos2->getId().'%',
'proposalId' => $id,
'serviceCatId' => $idcat,
'supplierId' => $supplierId,
);
$dql = 'SELECT p
FROM EventsBundle:ProposalSupplierServicesCosts p
WHERE p.servicesId LIKE :servicesId
and p.proposalId = :proposalId
and p.serviceCatId = :serviceCatId
and p.supplierId = :supplierId
ORDER BY p.serviceCatId, p.id ASC ';
$query = $em->createQuery($dql)->setParameters($parameters);
$costs_count = $query->getResult();
if (!empty($costs_count)){
$dentroServiceIds = $costs_count['0']->getServicesId();
$idcosts = $costs_count['0']->getId();
$contando_costs += 1;
$idcostsfuera[$idcosts] = $idcosts;
}
}
$Adentroidservices = explode(",", $dentroServiceIds);
$idservices = implode(",", $ids);
if ($contando_costs == "0"){
/* Para dentro de ProposalSupplierServicesCosts */
$costs = new ProposalSupplierServicesCosts();
$costs->setProposalId($id);
$costs->setServicesId($idservices);
$costs->setSupplierId($supplierId);
if ($directPayment == true){
$costs->setTotalServices(-$totales_direct);
$costs->setCommission('0');
$costs->setOpIva('1');
$costs->setIvaServices('21');
}else{
$costs->setTotalServices($totales);
$costs->setCommission($comision);
$costs->setOpIva($opiva);
// Se detecta un error con IVA que vienen en con opIva en negativo, el totalservices se clacula para ponerse antes de impuestos, pero el opIva se pone como si no se hiciera este calculo
$costs->setOpIva(1);
$costs->setIvaServices($iva);
}
// $costs->setTotalServices($totales);
// $costs->setCommission($comision);
// $costs->setOpIva($opiva);
// $costs->setIvaServices($iva);
$costs->setServiceCatId($idcat);
$costs->setServiceCatName($idcatName);
$costs->setCreatedId($user_id);
$costs->setUpdatedId($user_id);
$costs->setContcolor($contcolor);
$costs->setEdited('0');
$em->persist($costs);
$em->flush();
$idcostsfuera[$costs->getId()] = $costs->getId();
}else{
if(count($ids) != $contando_costs or count($ids) != count($Adentroidservices)){
$costs= $em->getRepository(ProposalSupplierServicesCosts::class)->findOneById($idcosts);
$costs->setServicesId($idservices);
if ($directPayment == true){
$costs->setTotalServices(-$totales_direct);
}else{
$costs->setTotalServices($totales);
}
$costs->setUpdatedId($user_id);
$costs->setEdited('1');
$em->persist($costs);
$em->flush();
}else{
// d('test', $idcosts);
}
}
}
}
}
$supplierexistentesquery = $em->getRepository(ProposalSupplierServicesCosts::class)->findByProposalId($id);
$supplierexistecontrolbase = [];
foreach($supplierexistentesquery as $supplierexistentes){
if ($supplierexistentes->getsupplierId() != '0'){
$supplierexistecontrolbase[$supplierexistentes->getSupplierId()] = $supplierexistentes->getSupplierId();
}
}
foreach($supplierexistecontrolbase as $supplierexistecontrol){
// d($supplier_existentes->getSupplierId());
$costs_supplier = $em->getRepository(ProposalSupplierServicesCosts::class)->findBy(
array(
'proposalId' => $id,
'supplierId' => $supplierexistecontrol,
// 'supplierId' => $supplierControl
)
);
$total_neto = 0;
$total_iva = 0;
$data_costs = array();
foreach ($costs_supplier as $costssupplier){
if (empty($costssupplier->getCommission()) OR is_null($costssupplier->getCommission() OR $costssupplier->getCommission() == " ")){
$comisionEmpty = 0;
}else{
$comisionEmpty = $costssupplier->getCommission();
}
if (empty($costssupplier->getTotalServices()) OR is_null($costssupplier->getTotalServices() OR $costssupplier->getTotalServices() == " ")){
$TotalServicesEmpty = 0;
}else{
$TotalServicesEmpty = $costssupplier->getTotalServices();
}
if (empty($costssupplier->getIvaServices()) OR is_null($costssupplier->getIvaServices() OR $costssupplier->getIvaServices() == " ")){
$IvaServicesEmpty = 0;
}else{
$IvaServicesEmpty = $costssupplier->getIvaServices();
}
// $totales_neto = $costssupplier->getTotalServices() / ($costssupplier->getCommission() /100 + 1);
$totales_neto = (float)$TotalServicesEmpty * ( ( 100 - (float)$comisionEmpty ) / 100);
if ($costssupplier->getOpIva() == "0"){
// Si es menos(-) es Entre(/)
$totales_neto = $totales_neto / ($IvaServicesEmpty / 100 + 1);
}
$total_neto += $totales_neto;
$iva = $totales_neto * ($IvaServicesEmpty / 100);
$totales_iva = $totales_neto * ($IvaServicesEmpty / 100 + 1);
$total_iva += $totales_iva;
$data_costs[] = array(
'data' => $costssupplier,
'total_neto' => $totales_neto,
'iva' => $iva,
'total_iva' => $totales_iva
);
}
$totales_data = array(
'total_neto' => $total_neto,
'total_iva' => $total_iva,
);
$suppliers = $em->getRepository(Supplier::class)->findById($supplierexistecontrol);
foreach ($suppliers as $supplier){
$data_supplier[] = array(
'master' => 'supplier',
'supplier' => $supplier,
'data' => $data_costs,
'totales' => $totales_data
);
}
}
$costs_supplier_cero = $em->getRepository(ProposalSupplierServicesCosts::class)->findBy(
array(
'proposalId' => $id,
'supplierId' => 0
)
);
if (!is_null($costs_supplier_cero)){
$total_neto = 0;
$total_iva = 0;
$data_costs_cero = array();
foreach ($costs_supplier_cero as $costssupplier){
if (empty($costssupplier->getCommission()) OR is_null($costssupplier->getCommission()) OR $costssupplier->getCommission() == " "){
$comisionEmpty = 0;
}else{
$comisionEmpty = $costssupplier->getCommission();
}
if (empty($costssupplier->getTotalServices()) OR is_null($costssupplier->getTotalServices() OR $costssupplier->getTotalServices() == " ")){
$TotalServicesEmpty = 0;
}else{
$TotalServicesEmpty = $costssupplier->getTotalServices();
}
if (empty($costssupplier->getIvaServices()) OR is_null($costssupplier->getIvaServices() OR $costssupplier->getIvaServices() == " ")){
$IvaServicesEmpty = 0;
}else{
$IvaServicesEmpty = $costssupplier->getIvaServices();
}
// $totales_neto = $costssupplier->getTotalServices() / ($costssupplier->getCommission() /100 + 1);
$totales_neto = (float)$TotalServicesEmpty * ( ( 100 - (float)$comisionEmpty ) / 100);
if ($costssupplier->getOpIva() == "0"){
// Si es menos(-) es Entre(/)
$totales_neto = $totales_neto / ($IvaServicesEmpty / 100 + 1);
}
$total_neto += $totales_neto;
$iva = $totales_neto * ($IvaServicesEmpty / 100);
$totales_iva = $totales_neto * ($IvaServicesEmpty / 100 + 1);
$total_iva += $totales_iva;
/* Obtener y agregar el nombre del proveedor */
if (!is_null($costssupplier->getSupplierIdExpenses()) and $costssupplier->getSupplierIdExpenses() != 0 ){
$supplierExp = $em->getRepository(Supplier::class)->findOneById($costssupplier->getSupplierIdExpenses());
if(!empty($supplierExp)){
$costssupplier->setSupplierIdExpenses($supplierExp->getCompany());
}else{
$costssupplier->setSupplierIdExpenses('');
}
}else{
$costssupplier->setSupplierIdExpenses('');
}
$data_costs_cero[] = array(
'data' => $costssupplier,
'total_neto' => $totales_neto,
'iva' => $iva,
'total_iva' => $totales_iva
);
}
$totales_data = array(
'total_neto' => $total_neto,
'total_iva' => $total_iva,
);
$company = $em->getRepository(SettingsCompany::class)->findByPriority('1');
$data_supplier[] = array(
'master' => 'company',
'supplier' => $company,
'data' => $data_costs_cero,
'totales' => $totales_data
);
}
/*Supplier list*/
$list_Supplier = $em->getRepository(Supplier::class)->findAll();
$arraySupplier =array();
foreach($list_Supplier as $listSupplier) {
$arraySupplier[] = array(
'id' => $listSupplier->getId(),
'company' => $listSupplier->getCompany(),
'name' => $listSupplier->getName(),
);
}
/* Actualizar los costos pasando serviciosid a cero(0) */
$costs_limpiar = $em->getRepository(ProposalSupplierServicesCosts::class)->findByProposalId($id);
foreach($costs_limpiar as $costslimpiarArray){
if (!in_array($costslimpiarArray->getId(), $idcostsfuera)) {
if ($costslimpiarArray->getServicesId() != 0){
// d($costslimpiarArray->getId(), "No Cero");
$costslimpiarArray->setServicesId('0');
$costslimpiarArray->setContcolor('info');
if(!($proposal->getStatus()=='Invoiced')) {
$em->persist($costslimpiarArray);
$em->flush();
}
} else {
// d($costslimpiarArray->getId(), "Si Cero");
}
}
}
/* Fin Actualizar los costos pasando serviciosid a cero(0) */
return $this->render('MDS/EventsBundle/costs-supplier/update-costs-supplier.html.twig',
array(
'id' => $id,
'listSupplier' => $arraySupplier,
'token' => $proposal->getAccessKey(),
'mcp' => $proposal->getMcp(),
'costsSupplier' => $data_supplier,
'propEditable' => !($proposal->getStatus() == 'Invoiced'),
));
}
public function CalculoTotalCosts($price, $units, $pax, $days, $idcat, $opiva, $iva)
{
//Units
if(empty($units) or $units =="0"){
$units = "1";
}
// Calculo Especial por categoria
//Alojamientos
if($idcat =="1"){
$informativo_days = "si";
$pax = "1";
}
//Transporte
elseif($idcat =="13"){
$informativo_days = "no";
$pax = "1";
// if($days > "1"){
// $days = "2";
// }else{
// $days = "1";
// }
}
//Guia
elseif($idcat =="8"){
$informativo_days = "no";
$pax = "1";
}
//Lounge
elseif($idcat =="10"){
$informativo_days = "no";
$pax = "1";
}else{
$informativo_days = "no";
}
//Pax
if(empty($pax) or $pax =="0"){
$pax = "1";
}
if($informativo_days =="no"){
//Days
if(empty($days) or $days =="0"){
$days = "1";
}else{
$days = $days + 1 ;
}
}
/* si viene iva negativo */
if($opiva =='0'){
$iva = $iva / 100;
$price = $price / ($iva + 1);
$price = round($price, 2);
}
$total_items = $price * $units * $pax * $days;
return $total_items;
}
/**
* @Route("/proposal/costs/supplier/updated", name="proposal_supplier_services_costs_updates", methods={"POST"})
*/
public function udatedAction(Request $request)
{
$data_costs = $request->request->get('costsSupplier');
$em = $this->getDoctrine()->getManager();
$supplier_costs = $em->getRepository(ProposalSupplierServicesCosts::class)->findOneById($data_costs['id']);
if(!is_null($data_costs))
{
/* Obtengo usuario logueado */
$user_logueado = $this->get('security.token_storage')->getToken()->getUser();
$user_id = $user_logueado->getId();
$supplier_costs->setTotalServices($data_costs['total']);
$supplier_costs->setCommission($data_costs['commission']);
$supplier_costs->setOpIva($data_costs['opIva']);
$supplier_costs->setIvaServices($data_costs['iva']);
$supplier_costs->setUpdatedId($user_id);
$supplier_costs->setEdited('0');
$em->persist($supplier_costs);
$em->flush();
$event = 'The cost updated in total costs supplier in Proposal.';
$successMessage = $this->translator->trans($event);
$this->addFlash('mensajeproposalcostsservices', $successMessage);
}else{
$errorMessage = $this->translator->trans('Error, some fields are empty');
$this->addFlash('mensajeproposalcostsservicesrror', $errorMessage);
}
return $this->redirectToRoute('proposal_supplier_services_costs',
array(
'id' => $supplier_costs->getProposalId(),
'_fragment' => $data_costs['id']
)
);
}
/**
* @Route("/proposal/costs/supplier/add", name="proposal_supplier_services_costs_add", methods={"POST"})
*/
public function AddAction(Request $request, EntityManagerInterface $em, ProposalSupplierServicesService $proposalSupplierServicesService)
{
$data_costs = $request->request->get('costsSupplier');
/* Obtengo usuario logueado */
$user_logueado = $this->get('security.token_storage')->getToken()->getUser();
$user_id = $user_logueado->getId();
$response = $proposalSupplierServicesService->supplierServicesCostAdd($data_costs, $user_id, $em);
$message = $this->translator->trans($response['msg']);
$this->addFlash($response['type'], $message);
return $this->redirectToRoute('proposal_supplier_services_costs',
array(
'id' => $data_costs['proposalId']
)
);
}
/**
* @Route("/proposal/costs/supplier/deleted/{id}", name="proposal_supplier_services_costs_deleted")
*
*/
public function deleteServicesAction($id, Request $request)
{
$em = $this->getDoctrine()->getManager();
$delete = $em->getRepository(ProposalSupplierServicesCosts::class)->findOneById($id);
$em->remove($delete);
$em->flush();
$event = 'The Costs total Supplier has been Deleted.';
$successMessage = $this->translator->trans($event);
$this->addFlash('mensajeproposalcostsservices', $successMessage);
return $this->redirectToRoute('proposal_supplier_services_costs',
array(
'id' => $delete->getProposalId()
)
);
}
}