<?php
declare(strict_types=1);
namespace App\Admin;
use App\Entity\Configuracion;
use App\Entity\EstadoAspecto;
use App\Entity\Reloj;
use App\Form\Type\HTMLType;
use App\Transformer\EstadoAbstractTransformer;
use App\Transformer\MarcaAbstractTransformer;
use Doctrine\ORM\EntityManagerInterface;
use Sonata\AdminBundle\Admin\AbstractAdmin;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
use Sonata\AdminBundle\Datagrid\ListMapper;
use Sonata\AdminBundle\Form\FormMapper;
use Sonata\AdminBundle\Form\Type\ModelListType;
use Sonata\AdminBundle\Show\ShowMapper;
use Sonata\Form\Type\CollectionType;
use Symfony\Component\Form\CallbackTransformer;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
use Vich\UploaderBundle\Form\Type\VichImageType;
final class ValoracionesRelojesSinStockAdmin extends AbstractAdmin
{
private $em;
public function __construct(string $code, string $class, string $baseControllerName, EntityManagerInterface $em)
{
parent::__construct($code, $class, $baseControllerName);
$this->em = $em;
}
protected function configureDatagridFilters(DatagridMapper $filter): void
{
}
protected function configureListFields(ListMapper $list): void
{
}
protected function configureFormFields(FormMapper $form): void
{
$object = $this->getSubject();
$editAction = $object->getId() ? true : false;
/*$relojesSinStocks = $object->getValoracion()?->getValoracionesRElojesSinStocks();
$files = $this->getRequest()->files->all();
$filesRelojesSinStock = reset($files)['valoracionesRelojesSinStocks']??[];
foreach($filesRelojesSinStock as $key => $file)
{
if($relojesSinStocks && $object == $relojesSinStocks[$key])
{
$imagePath = ($file['relojFotoFile']['file'])->getPathName();
// Leer la imagen y codificarla en base64
$imageData = base64_encode(file_get_contents($imagePath));
// Obtener el tipo MIME (jpg, png, gif, etc.)
$imageType = pathinfo($imagePath, PATHINFO_EXTENSION);
// Formato data URL
$dataUrl = "data:image/$imageType;base64,$imageData";
$object->setRelojFoto($dataUrl);
}
}*/
$ITP = $object->getITP();
$comision = $object->getComision();
$margenDeseado = $object->getMargenDeseado();
if(!$editAction)
{
$configuracion = $this->em->getRepository(Configuracion::class)->getConfiguracion('ValoracionesRelojes', 'ITP');
$ITP = $configuracion ? $configuracion->getValue() : null;
$ITP = is_numeric($ITP) ? $ITP : null;
$configuracion = $this->em->getRepository(Configuracion::class)->getConfiguracion('ValoracionesRelojes', 'comision');
$comision = $configuracion ? $configuracion->getValue() : null;
$comision = is_numeric($comision) ? $comision : null;
$configuracion = $this->em->getRepository(Configuracion::class)->getConfiguracion('ValoracionesRelojes', 'margenDeseado');
$margenDeseado = $configuracion ? $configuracion->getValue() : null;
$margenDeseado = is_numeric($margenDeseado) ? $margenDeseado : null;
}
$hiddenReloj = $object && $object->getIDPerseo();
$form
->add('IDPerseo', null, [
'disabled' => $hiddenReloj,
'data' => $hiddenReloj ? (string)$object->getIDPerseo()??'VR0000/0000' : 'VR0000/0000',
'row_attr' => [
'class' => !$hiddenReloj ? 'hidden' : '',
],
])
;
/*if($hiddenReloj)
{*/
$form
->add('relojBaseIcon', HTMLType::class, [
'label' => false,
'mapped' => false,
'row_attr' => [
'class' => 'no-block '. (!$hiddenReloj ? 'hidden' : ''),
],
'template' => 'admin/reloj/icon_reloj_base.html.twig'
]);
/* }
else
{*/
$form
->add('relojBase', ModelListType::class, [
'label' => false,
'class' => Reloj::class,
'row_attr' => [
'class' => 'display-model-list-type ' . ($hiddenReloj ? 'hidden' : ''),
],
'disabled' => $hiddenReloj,
'btn_list' => !$this->isDisabled(),
'btn_edit' => false,
'btn_delete' => false,
'btn_add' => false,
], [
'placeholder' => 'form.valoraciones_relojes.placeholder.reloj',
'link_parameters' => [
'nav_prometeo' => true
],
]);
// }
if(!$this->isHidden()) {
$form
->add('relojFoto', HiddenType::class, [
'attr' => [
'class' => 'vich-image-delete-original'
],
//'data' => $object->getRelojFoto() ? (strpos($object->getRelojFoto(), 'data:image/tmp;base64') !== false) ? null : $object->getRelojFoto() : null,
])
->add('relojFotoFile', VichImageType::class, [
'label' => false,
'required' => false,
'allow_delete' => true,
'download_uri' => true,
'download_label' => false,
//'download_label' => 'form.reloj.label.foto',
'attr' => [
'data-title_image_delete' => null,
'data-message_image_delete' => null,
'class' => 'vich-image-load'
]
])
;
}
else
{
$form
->add('relojFoto', HTMLType::class, [
'label' => false,
'disabled' => true,
'template' => 'admin/valoraciones-relojes/reloj_foto.html.twig'
])
;
}
$form
->add('relojMarca', ModelListType::class, [
'label' => false,
'disabled' => $this->isDisabled(),
'attr' => [
'data-max_length' => 10
],
'row_attr' => [
'class' => 'display-model-list-type',
],
'btn_list' => !$this->isDisabled(),
'btn_edit' => false,//!$this->isDisabled(),
'btn_delete' => false,
'btn_add' => false,//!$this->isDisabled()
], [
'placeholder' => 'form.valoraciones_relojes.placeholder.reloj.marca',
'link_parameters' => [
'nav_prometeo' => true
],
])
->add('relojModelo1', null, [
'label' => false,
'disabled' => $this->isDisabled(),
'attr' => [
'placeholder' => 'form.valoraciones_relojes.placeholder.reloj.modelo1'
]
])
->add('relojRef1', null, [
'label' => false,
'disabled' => $this->isDisabled(),
'attr' => [
'placeholder' => 'form.valoraciones_relojes.placeholder.reloj.ref1'
]
])
->add('relojCaja', CheckboxType::class, [
'label' => false,
'disabled' => $this->isDisabled(),
'required' => false,
'data' => $object->getRelojCaja() ? $object->getRelojCaja() : false,
'attr' => [
'placeholder' => 'form.valoraciones_relojes.placeholder.reloj.caja'
]
])
->add('relojPapeles', CheckboxType::class, [
'label' => false,
'disabled' => $this->isDisabled(),
'required' => false,
'data' => $object->getRelojPapeles() ? $object->getRelojPapeles() : false,
'attr' => [
'placeholder' => 'form.valoraciones_relojes.placeholder.reloj.papeles'
]
])
->add('relojFecha', /*DatePickerType::class*/ null, [
'label' => false,
'disabled' => $this->isDisabled(),
//'format' => 'dd/MM/yyyy',
'attr' => [
'placeholder' => 'form.valoraciones_relojes.placeholder.reloj.fecha'
],
])
->add('relojAspecto', null, [
'label' => false,
'disabled' => $this->isDisabled(),
'placeholder' => 'form.valoraciones_relojes.placeholder.reloj_aspecto',
'query_builder' => $this->em->getRepository(EstadoAspecto::class)->qbAll(),
])
;
if(!$this->isHidden()) {
$form
->add('infoValoracion', null, [
'label' => false,
'attr' => [
'placeholder' => 'form.valoraciones_relojes.placeholder.info_valoracion',
'class' => 'clear-on-change-reloj'
],
'row_attr' => [
'class' => $object?->getInfoValoracion() ? 'more-info more-info-modal' : 'more-info more-info-modal empty',
'more_info' => [
'class' => 'more-info-input-wrap more-info-input-wrap-modal'
]
]
])
;
}
$form
->add('precioOferta', null, [
'label' => false,
'attr' => [
'readonly' => true,
'placeholder' => 'form.valoraciones_relojes.placeholder.precio_oferta',
'class' => 'numeric currencies clear-on-change-reloj'
],
])
->add('precioPromocion', null, [
'label' => false,
'disabled' => $this->isDisabled(),
'attr' => [
'placeholder' => 'form.valoraciones_relojes.placeholder.precio_promocion',
'class' => 'numeric currencies clear-on-change-reloj'
]
])
->add('precioMinVenta', null, [
'label' => false,
'disabled' => $this->isDisabled(),
'attr' => [
'placeholder' => 'form.valoraciones_relojes.placeholder.precio_minimo_venta',
'class' => 'numeric currencies clear-on-change-reloj'
]
])
->add('comision', null, [
'label' => false,
'disabled' => $this->isDisabled(),
'data' => $comision,
'attr' => [
'placeholder' => 'form.valoraciones_relojes.placeholder.comision',
'class' => 'numeric percents clear-on-change-reloj'
]
])
->add('costesTotal', null, [
'label' => false,
'disabled' => $this->isDisabled(),
'attr' => [
'placeholder' => 'form.valoraciones_relojes.placeholder.costes',
'class' => 'numeric currencies clear-on-change-reloj input-left-more-info-join',
'data-manual' => '0',
]
])
;
if(!$this->isHidden()) {
$form
->add('costes', CollectionType::class, [
'label' => false,
'row_attr' => [
'class' => $object?->getCostes()->count() ? 'more-info more-info-modal more-info-input-left-join' : 'more-info more-info-modal more-info-input-left-join empty',
'more_info' => [
'class' => 'more-info-input-wrap more-info-input-wrap-modal more-info-input-wrap-right'
]
],
'by_reference' => false,
], [
'edit' => 'inline',
'inline' => 'table',
'attr' => [
'class' => 'table-costes-valoraciones-relojes-sin-stock'
],
])
// ->add('scriptCalcularCostesEventOnChangePrecio', ScriptType::class, [
// 'template' => 'SCRIPTS/ValoracionesRelojesSinStock/calcular_costes_event_on_change_precio.html.twig'
// ])
;
}
$form
->add('margenDeseado', null, [
'label' => false,
'disabled' => $this->isDisabled(),
'data' => $margenDeseado,
'attr' => [
'placeholder' => 'form.valoraciones_relojes.placeholder.margen_deseado',
'class' => 'numeric percents clear-on-change-reloj'
]
])
->add('margenPromocion', null, [
'label' => false,
'attr' => [
'readonly' => true,
'placeholder' => 'form.valoraciones_relojes.placeholder.margen_promocion',
'class' => 'numeric percents clear-on-change-reloj'
]
])
->add('margenMinimo', null, [
'label' => false,
'attr' => [
'readonly' => true,
'placeholder' => 'form.valoraciones_relojes.placeholder.margen_minimo',
'class' => 'numeric percents clear-on-change-reloj'
]
])
->add('ITP', null, [
'label' => false,
'disabled' => $this->isDisabled(),
'data' => $ITP,
'attr' => [
'placeholder' => 'form.valoraciones_relojes.placeholder.itp',
'class' => 'numeric percents clear-on-change-reloj'
]
])
->add('precioReferencia', null, [
'label' => false,
'disabled' => $this->isDisabled(),
'attr' => [
'placeholder' => 'form.valoraciones_relojes.placeholder.precio_referencia',
'class' => 'numeric currencies clear-on-change-reloj input-left-more-info-join',
'data-manual' => '0',
]
])
;
if(!$this->isHidden()) {
$form
->add('referencias', CollectionType::class, [
'label' => false,
'attr' => [
'placeholder' => 'form.valoraciones_relojes.placeholder.referencias',
'class' => 'more-info-input'
],
'row_attr' => [
'class' => $object?->getReferencias()->count() ? 'more-info more-info-modal more-info-input-left-join' : 'more-info more-info-modal more-info-input-left-join empty',
'more_info' => [
'class' => 'more-info-input-wrap more-info-input-wrap-modal',
]
],
'by_reference' => false,
], [
'edit' => 'inline',
'inline' => 'table',
'attr' => [
'class' => 'table-referencias-valoraciones-relojes-sin-stock'
],
]);
}
$form
->add('precioPagar', null, [
'label' => false,
'disabled' => $this->isDisabled(),
'attr' => [
'placeholder' => 'form.valoraciones_relojes.placeholder.precio_pagar',
'class' => 'numeric currencies clear-on-change-reloj'
]
]);
/*$form->getFormBuilder()->get('relojFecha')
->addModelTransformer(new CallbackTransformer(
function ($fecha) //transform
{
return $fecha;
},
function ($fecha) //reverseTransform
{
return FechaAbstractTransformer::toDateTime($fecha);
})
)
->addViewTransformer(new CallbackTransformer(
function ($fecha) //transform
{
return FechaAbstractTransformer::toString($fecha);
},
function ($fecha) //reverseTransform
{
return $fecha;
})
)
;*/
$form->getFormBuilder()->get('relojMarca')
->addModelTransformer(new CallbackTransformer(
function ($marca) //transform
{
return $marca?->getId() ? $marca : null;
},
function ($marca) //reverseTransform
{
return MarcaAbstractTransformer::toMarca($marca);
})
)
->addViewTransformer(new CallbackTransformer(
function ($marca) //transform
{
return MarcaAbstractTransformer::toString($marca);
},
function ($marca) //reverseTransform
{
return $marca;
})
)
;
$form->getFormBuilder()->get('relojAspecto')
->addModelTransformer(new CallbackTransformer(
function ($estado) //transform
{
return $estado?->getId() ? $estado : null;
},
function ($estado) //reverseTransform
{
return EstadoAbstractTransformer::toEstado($estado);
})
)
->addViewTransformer(new CallbackTransformer(
function ($estado) //transform
{
return EstadoAbstractTransformer::toString($estado);
},
function ($estado) //reverseTransform
{
return $estado;
})
)
;
}
protected function configureShowFields(ShowMapper $show): void
{
}
protected function preValidate(object $object): void
{
parent::preValidate($object);
if ($object && $object->getIDPerseo()) {
$object->setReloj(null);
}
}
private function isHidden()
{
return isset($_GET['modal']);
}
private function isDisabled()
{
return isset($_GET['modal']);
}
}