<?php
declare(strict_types=1);
namespace App\Admin;
use App\Entity\EstadoAspecto;
use App\Entity\Marca;
use App\Entity\Reloj;
use App\Enum\EstadoOperacionEnum;
use App\Enum\RegimenEnum;
use App\Enum\TipoOperacionEnum;
use App\Form\Type\HTMLType;
use App\Form\Type\ScriptType;
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\DatePickerType;
use Sonata\Form\Type\DateTimePickerType;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
use Symfony\Component\Validator\Constraints\Count;
use Symfony\Component\Validator\Constraints\NotBlank;
use Vich\UploaderBundle\Form\Type\VichImageType;
final class DetalleCompraAdmin extends AbstractAdmin
{
public function __construct(string $code, string $class, string $baseControllerName, private EntityManagerInterface $em)
{
parent::__construct($code, $class, $baseControllerName);
$this->setTranslationDomain('detalleCompraAdmin');
}
protected function configureDatagridFilters(DatagridMapper $filter): void
{
$filter
;
}
protected function configureListFields(ListMapper $list): void
{
$list
->add(ListMapper::NAME_ACTIONS, null, [
'actions' => [
'show' => [],
'edit' => [],
'delete' => [],
],
])
;
}
protected function configureFormFields(FormMapper $form): void
{
$this->setTranslationDomain('detalleCompraAdmin');
$object = $this->getSubject();
$isCompraGestion = $object->getCompra()?->getOperacion()?->isCompraGestion();
$operacion = $object?->getCompra()?->getOperacion();
$estadoOperacion = $operacion?->getEstado()?->getKey();
$classNoBlock = $isCompraGestion && $estadoOperacion === EstadoOperacionEnum::ESTADO_EN_TRAMITACION ? 'no-block' : '';
$regimenReadonly = $operacion?->getExportacion() ? 'readonly' : '';
$form
->add('precioCoste', null, [
'label' => false,
'translation_domain' => 'detalleCompraAdmin',
'attr' => [
'placeholder' => 'form.detalle_compra.placeholder.precio_coste',
'class' => 'numeric currencies',
'style' => !$estadoOperacion || $estadoOperacion === EstadoOperacionEnum::ESTADO_EN_TRAMITACION ? 'height: 78px;' : null
],
'row_attr' => [
'class' => "$classNoBlock control-block-unblock-fields",
]
])
->add('precioPromocion', null, [
'label' => false,
'translation_domain' => 'detalleCompraAdmin',
// 'disabled' => true,
'attr' => [
'placeholder' => 'form.detalle_compra.placeholder.precio_promocion',
'class' => 'numeric currencies'
]
])
/*->add('reloj', null, [
'label' => false,
'disabled' => true,
'placeholder' => 'form.detalle_compra.placeholder.reloj'
])*/
// ->add('reloj', ModelListType::class, [
// 'label' => false,
// 'class' => Reloj::class,
// 'attr' => [
// 'data-max_length' => 10
// ],
// 'row_attr' => [
// 'class' => !$this->isDisabled() ? 'display-model-list-type disabled' : 'display-model-list-type',
// ],
//// 'btn_list' => !$this->isDisabled(),
// 'btn_edit' => false,
// 'btn_delete' => false,
// 'btn_add' => false
// ], [
// 'placeholder' => 'form.detalle_compra.placeholder.reloj',
// 'link_parameters' => [
// 'nav_prometeo' => true
// ],
// ])
->add('relojFoto', HiddenType::class, [
'attr' => [
'class' => 'vich-image-delete-original'
]
])
->add('relojFotoFile', VichImageType::class, [
'label' => false,
'required' => false,
'disabled' => $this->isDisabled(),
'allow_delete' => true,
'download_uri' => true,
'download_label' => false,
'attr' => [
'data-title_image_delete' => null,
'data-message_image_delete' => null,
'class' => 'vich-image-load'
],
'row_attr' => [
'class' => 'no-block'
]
])
->add('reloj.promociones', HTMLType::class, [
'label' => false,
'row_attr' => [
'class' => 'no-block',
],
'template' => 'admin/reloj/icon_promocion.html.twig'
])
->add('relojRegimen', ChoiceType::class, [
'label' => false,
'placeholder' => 'form.detalle_compra.placeholder.reloj_regimen',
'disabled' => $this->isDisabled(),
'choices' => array_flip(RegimenEnum::getRegimenes()),
'choice_label' => function ($choice, $key, $value) {
return $this->getTranslator()->trans(RegimenEnum::getRegimen($choice), [], 'enum');
},
'data' => $object->getRelojRegimen() ? $object->getRelojRegimen() : RegimenEnum::REGIMEN_REBU,
'row_attr' => [
'class' => "control-unblock-block control-regimen $regimenReadonly"
]
])
->add('relojMarca', ModelListType::class, [
'label' => false,
'class' => Marca::class,
'attr' => [
'data-max_length' => 10
],
'row_attr' => [
'class' => $this->isDisabled() ? 'display-model-list-type disabled control-unblock-block' : 'display-model-list-type control-unblock-block',
],
// 'btn_list' => !$this->isDisabled(),
'btn_edit' => false,
'btn_delete' => false,
'btn_add' => false,
], [
'placeholder' => 'form.detalle_compra.placeholder.reloj.marca',
'link_parameters' => [
'nav_prometeo' => true
],
])
->add('relojModelo1', null, [
'label' => false,
'translation_domain' => 'detalleCompraAdmin',
'disabled' => $this->isDisabled(),
'attr' => [
'placeholder' => 'form.detalle_compra.placeholder.reloj.modelo1'
],
'row_attr' => [
'class' => 'control-unblock-block'
]
])
->add('relojModelo2', null, [
'label' => false,
'translation_domain' => 'detalleCompraAdmin',
'disabled' => $this->isDisabled(),
'attr' => [
'placeholder' => 'form.detalle_compra.placeholder.reloj.modelo2'
],
'row_attr' => [
'class' => 'control-unblock-block'
]
])
->add('relojRef1', null, [
'label' => false,
'translation_domain' => 'detalleCompraAdmin',
'disabled' => $this->isDisabled(),
'attr' => [
'placeholder' => 'form.detalle_compra.placeholder.reloj.ref1'
],
'row_attr' => [
'class' => 'control-unblock-block'
]
])
->add('relojRef2', null, [
'label' => false,
'translation_domain' => 'detalleCompraAdmin',
'disabled' => $this->isDisabled(),
'attr' => [
'placeholder' => 'form.detalle_compra.placeholder.reloj.ref2'
],
'row_attr' => [
'class' => 'control-unblock-block'
]
])
->add('relojSerie', null, [
'label' => false,
'translation_domain' => 'detalleCompraAdmin',
'disabled' => $this->isDisabled(),
'attr' => [
'placeholder' => 'form.detalle_compra.placeholder.reloj.serie'
],
'row_attr' => [
'class' => 'control-unblock-block'
]
])
->add('relojFecha', DatePickerType::class, [
'label' => false,
'translation_domain' => 'detalleCompraAdmin',
'disabled' => $this->isDisabled(),
'format' => 'dd-MM-yyyy',
'attr' => [
'placeholder' => 'form.detalle_compra.placeholder.reloj.fecha'
],
'row_attr' => [
'class' => 'control-unblock-block'
]
])
->add('relojAspecto', null, [
'label' => false,
'translation_domain' => 'detalleCompraAdmin',
'disabled' => $this->isDisabled(),
'placeholder' => 'form.detalle_compra.placeholder.reloj.aspecto',
'query_builder' => $this->em->getRepository(EstadoAspecto::class)->qbAll(),
'row_attr' => [
'class' => 'control-unblock-block'
]
])
->add('relojCaja', CheckboxType::class, [
'label' => false,
'required' => false,
'disabled' => $this->isDisabled(),
'data' => $object->isRelojCaja() ?? false,
'row_attr' => [
'class' => 'control-unblock-block'
]
])
->add('relojPapeles', CheckboxType::class, [
'label' => false,
'required' => false,
'data' => $object->isRelojPapeles() ?? false,
'disabled' => $this->isDisabled(),
'row_attr' => [
'class' => 'control-unblock-block'
]
])
->add('comentario', null, [
'label' => false,
'translation_domain' => 'detalleCompraAdmin',
'attr' => [
'placeholder' => 'form.detalle_compra.placeholder.comentario'
],
'row_attr' => [
'class' => "control-unblock-block $classNoBlock"
]
])
;
/*if(!$isCompraGestion && $estadoOperacion && $estadoOperacion === EstadoOperacionEnum::ESTADO_TRAMITADA) {
$form
->add('_unblock_block', HTMLType::class, [
'label' => false,
'row_attr' => [
'class' => 'no-block',
],
'template' => 'admin/reloj/icon_unblock_block.html.twig'
])
;
}*/
if(!$isCompraGestion && $estadoOperacion && $estadoOperacion !== EstadoOperacionEnum::ESTADO_EN_TRAMITACION) {
$reloj = $object->getRelojGestion();
$form
->add('fechaVerificacion', DatePickerType::class, [
'label' => false,
'translation_domain' => 'detalleCompraAdmin',
'format' => 'dd-MM-yyyy',
'attr' => [
'placeholder' => 'form.detalle_compra.placeholder.fecha_verificacion',
],
'row_attr' => [
'class' => $this->isBlock($estadoOperacion) || $reloj ? 'control-fecha-verificacion show-title-no-block' : 'no-block control-fecha-verificacion'
],
'datepicker_options' => [
'useCurrent' => false,
]
//'constraints' => [new NotBlank()],
])
->add('reloj.actividadCompra', HTMLType::class, [
'label' => false,
'row_attr' => [
'class' => 'no-block',
],
'template' => 'admin/reloj/icon_actividad_compra.html.twig'
])
;
}
if(($operacion?->getTipo() === TipoOperacionEnum::OPERACION_GESTION &&
$estadoOperacion &&
($estadoOperacion === EstadoOperacionEnum::ESTADO_CONFIRMADA || $estadoOperacion === EstadoOperacionEnum::ESTADO_FINALIZADA) &&
$object->getFechaCancelacion())
) {
$form->add('fechaCancelacion', DatePickerType::class, [
'label' => false,
'translation_domain' => 'detalleCompraAdmin',
'format' => 'dd-MM-yyyy',
'attr' => [
'placeholder' => 'form.detalle_compra.placeholder.fecha_cancelacion',
'icon_title' => $this->getTranslator()->trans('form.detalle_compra.icon_title.fecha_cancelacion', [], 'detalleCompraAdmin')
],
'row_attr' => [
'class' => 'show-title-no-block'
],
]);
}
if($operacion?->getTipo() === TipoOperacionEnum::OPERACION_GESTION &&
$estadoOperacion &&
($estadoOperacion === EstadoOperacionEnum::ESTADO_CONFIRMADA || $estadoOperacion === EstadoOperacionEnum::ESTADO_FINALIZADA) &&
$object->getReloj()?->getFechaVenta())
{
$form->add('reloj.fechaVenta', DatePickerType::class, [
'label' => false,
'translation_domain' => 'detalleCompraAdmin',
'format' => 'dd-MM-yyyy',
'attr' => [
'placeholder' => 'form.detalle_compra.placeholder.fecha_venta',
'icon_title' => $this->getTranslator()->trans('form.detalle_compra.icon_title.fecha_venta', [], 'detalleCompraAdmin')
],
'row_attr' => [
'class' => 'show-title-no-block'
],
]);
}
if($operacion?->getTipo() === TipoOperacionEnum::OPERACION_GESTION &&
$estadoOperacion &&
($estadoOperacion === EstadoOperacionEnum::ESTADO_CONFIRMADA || $estadoOperacion === EstadoOperacionEnum::ESTADO_FINALIZADA) &&
$object->getReloj()?->getFechaCompra() && $object->getReloj()->isCompraDirecta())
{
$form->add('reloj.fechaCompra', DatePickerType::class, [
'label' => false,
'translation_domain' => 'detalleCompraAdmin',
'format' => 'dd-MM-yyyy',
'attr' => [
'placeholder' => 'form.detalle_compra.placeholder.fecha_compra',
'icon_title' => $this->getTranslator()->trans('form.detalle_compra.icon_title.fecha_compra', [], 'detalleCompraAdmin')
],
'row_attr' => [
'class' => 'show-title-no-block'
],
]);
}
if($operacion?->getTipo() === TipoOperacionEnum::OPERACION_GESTION &&
$estadoOperacion &&
$estadoOperacion === EstadoOperacionEnum::ESTADO_CONFIRMADA &&
!($object->getReloj()?->hasBeenSold() || $object->getReloj()?->hasBeenBought()) &&
!$object->getFechaCancelacion()
)
{
$form
->add('_cancel', HTMLType::class, [
'label' => false,
'row_attr' => [
'class' => 'no-block',
],
'template' => 'admin/reloj/icon_cancel.html.twig',
])
;
}
if($operacion->getExportacion())
{
$alertCosteImportacionIva = ($object->getCosteImportacionIva() !== 0.0 ? '' : 'control-coste-importacion-alert');
$alertCosteImportacionOtros = ($object->getCosteImportacionOtros() !== 0.0 ? '' : 'control-coste-importacion-alert');
$form
->add('costeImportacionIva', null, [
'label' => false,
'translation_domain' => 'detalleCompraAdmin',
// 'disabled' => true,
'attr' => [
'placeholder' => 'form.detalle_compra.placeholder.coste_importacion_iva',
'class' => "numeric currencies control-coste-importacion $alertCosteImportacionIva"
]
])
->add('costeImportacionOtros', null, [
'label' => false,
'translation_domain' => 'detalleCompraAdmin',
// 'disabled' => true,
'attr' => [
'placeholder' => 'form.detalle_compra.placeholder.coste_importacion_otros',
'class' => "numeric currencies control-coste-importacion $alertCosteImportacionOtros"
]
])
;
}
}
protected function configureShowFields(ShowMapper $show): void
{
}
private function isDisabled(): bool
{
$object = $this->getSubject();
$operacion = $object->getCompra()?->getOperacion();
return $object->getReloj() && ($operacion->getEstado()->getKey() === EstadoOperacionEnum::ESTADO_CONFIRMADA || $operacion->getEstado()->getKey() === EstadoOperacionEnum::ESTADO_ASENTADA) ? true : false;
}
private function isBlock(string $estadoOperacion):bool
{
return !($estadoOperacion === EstadoOperacionEnum::ESTADO_TRAMITADA);
}
}