<?php
namespace App\Controller\EasyAdmin\Wildberries;
use App\Entity\WildberriesProduct;
use Doctrine\ORM\QueryBuilder;
use EasyCorp\Bundle\EasyAdminBundle\Collection\FieldCollection;
use EasyCorp\Bundle\EasyAdminBundle\Collection\FilterCollection;
use EasyCorp\Bundle\EasyAdminBundle\Config\Action;
use EasyCorp\Bundle\EasyAdminBundle\Config\Actions;
use EasyCorp\Bundle\EasyAdminBundle\Config\Crud;
use EasyCorp\Bundle\EasyAdminBundle\Config\Filters;
use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractCrudController;
use EasyCorp\Bundle\EasyAdminBundle\Dto\EntityDto;
use EasyCorp\Bundle\EasyAdminBundle\Dto\SearchDto;
use EasyCorp\Bundle\EasyAdminBundle\Field\AssociationField;
use EasyCorp\Bundle\EasyAdminBundle\Field\BooleanField;
use EasyCorp\Bundle\EasyAdminBundle\Field\CurrencyField;
use EasyCorp\Bundle\EasyAdminBundle\Field\DateTimeField;
use EasyCorp\Bundle\EasyAdminBundle\Field\Field;
use EasyCorp\Bundle\EasyAdminBundle\Field\IdField;
use EasyCorp\Bundle\EasyAdminBundle\Field\IntegerField;
use EasyCorp\Bundle\EasyAdminBundle\Field\MoneyField;
use EasyCorp\Bundle\EasyAdminBundle\Field\TextareaField;
use EasyCorp\Bundle\EasyAdminBundle\Field\TextField;
use EasyCorp\Bundle\EasyAdminBundle\Filter\DateTimeFilter;
use EasyCorp\Bundle\EasyAdminBundle\Filter\NumericFilter;
use EasyCorp\Bundle\EasyAdminBundle\Filter\TextFilter;
use EasyCorp\Bundle\EasyAdminBundle\Orm\EntityRepository;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
class WildberriesProductCrudController extends AbstractCrudController
{
use WildberriesProductBarcodeSearchFixTrait;
private UrlGeneratorInterface $urlGenerator;
public function __construct(UrlGeneratorInterface $urlGenerator)
{
$this->urlGenerator = $urlGenerator;
}
public function createIndexQueryBuilder(SearchDto $searchDto, EntityDto $entityDto, FieldCollection $fields, FilterCollection $filters): QueryBuilder
{
return $this->get(EntityRepository::class)->createQueryBuilder($this->checkOrFixSearchDto($searchDto), $entityDto, $fields, $filters);
}
public static function getEntityFqcn(): string
{
return WildberriesProduct::class;
}
public function configureCrud(Crud $crud): Crud
{
return $crud
->setSearchFields(['id', 'clientId', 'srcProductId', 'article', 'nmId', 'chrtId', 'category', 'brand', 'name', 'color', 'size', 'barcode', 'price', 'discount', 'totalPrice', 'stock', 'stockFbo', 'stockFboFull', 'stockFboNotInOrders', 'fboInWayToClient', 'fboInWayFromClient', 'fboDaysOnSite', 'stockPresent', 'stockCalculated', 'stockHistory', 'priceWriteError', 'stockWriteError', 'infoPrice', 'infoDiscount', 'infoTotalPrice', 'infoStock', 'note'])
->setDefaultSort(['id' => 'DESC'])
->setPaginatorPageSize(50)
->setPaginatorUseOutputWalkers(true)
->setPaginatorFetchJoinCollection(true)
->setEntityLabelInSingular('Заведенная номенклатура')
->setEntityLabelInPlural('Заведенная номенклатура');
}
public function configureActions(Actions $actions): Actions
{
$wbProductReprice = Action::new('wbProductReprice', 'Обновить цену')
->linkToUrl(function (WildberriesProduct $wildberriesProduct): string {
return $this->urlGenerator->generate(
'wb_product_reprice',
['id' => $wildberriesProduct->getId()],
UrlGeneratorInterface::ABSOLUTE_PATH
);
});
$resetFboStock = Action::new('resetFboStock', 'Обнулить FBO')
->linkToUrl(function (WildberriesProduct $wildberriesProduct): string {
return $this->urlGenerator->generate(
'wb_product_fbo_reset',
['id' => $wildberriesProduct->getId()],
UrlGeneratorInterface::ABSOLUTE_PATH
);
});
$wbProductWarehouseFormBind = Action::new('wbProductWarehouseFormBind', 'Привязать к Складу')
->linkToRoute('wb_product_warehouse_bind_form', function (WildberriesProduct $wildberriesProduct): array {
return ['id' => $wildberriesProduct->getId()];
});
return $actions
->add(Crud::PAGE_INDEX, $wbProductWarehouseFormBind)
->add(Crud::PAGE_INDEX, $wbProductReprice)
->add(Crud::PAGE_INDEX, $resetFboStock)
->add(Crud::PAGE_INDEX, Action::DETAIL)
->reorder(Crud::PAGE_INDEX, [Action::DETAIL, Action::EDIT])
->disable('new', 'delete');
}
public function configureFilters(Filters $filters): Filters
{
return $filters
->add(NumericFilter::new('id', 'ID'))
->add(TextFilter::new('article', 'Артикул'))
->add(NumericFilter::new('nmId', 'WB артикул'))
->add(NumericFilter::new('chrtId', 'WB код размера'))
->add(TextFilter::new('category', 'Вид товара'))
->add(TextFilter::new('brand', 'Бренд'))
->add(TextFilter::new('name', 'Наименование'))
->add(TextFilter::new('color', 'Цвет'))
->add(TextFilter::new('size', 'Размер'))
->add(DateTimeFilter::new('createdAt', 'Дата создания'));
}
public function configureFields(string $pageName): iterable
{
$clientId = IntegerField::new('clientId');
$onFbs = Field::new('onFbs');
$onFbo = Field::new('onFbo');
$srcProductId = IntegerField::new('srcProductId');
$article = TextField::new('article', 'Артикул');
$nmId = IntegerField::new('nmId', 'WB артикул');
$chrtId = IntegerField::new('chrtId', 'WB код размера');
$category = TextField::new('category', 'Вид товара');
$brand = TextField::new('brand', 'Бренд');
$name = TextField::new('name', 'Наименование');
$color = TextField::new('color', 'Цвет');
$size = TextField::new('size', 'Размер');
$barcode = TextField::new('barcode', 'Штрихкод');
$createdAt = DateTimeField::new('createdAt', 'Дата создания');
$updatedAt = DateTimeField::new('updatedAt');
$price = MoneyField::new('price', 'Цена')->setCurrency('RUB');
$discount = IntegerField::new('discount', 'Скидка на товар');
$totalPrice = MoneyField::new('totalPrice')->setCurrency('RUB');
$hidePrice = Field::new('hidePrice', 'Не передавать цену')->setTemplatePath('admin/default/field_toggle_inverse.html.twig');
$stock = IntegerField::new('stock', 'Остатки');
$stockFbo = IntegerField::new('stockFbo', 'Остатки FBO');
$stockFboFull = IntegerField::new('stockFboFull');
$stockFboNotInOrders = IntegerField::new('stockFboNotInOrders');
$fboInWayToClient = IntegerField::new('fboInWayToClient');
$fboInWayFromClient = IntegerField::new('fboInWayFromClient');
$fboDaysOnSite = IntegerField::new('fboDaysOnSite');
$stockPresent = IntegerField::new('stockPresent', 'Товары в наличии');
$hideStock = Field::new('hideStock', 'Скрыть остатки')->setTemplatePath('admin/default/field_toggle_inverse.html.twig');
$noMinStock = Field::new('noMinStock', 'Остатки от 1')->setTemplatePath('admin/default/field_toggle_inverse.html.twig');
$stockCalculated = IntegerField::new('stockCalculated');
$stockHistory = TextareaField::new('stockHistory');
$activeChangeTm = DateTimeField::new('activeChangeTm');
$activeWriteTm = DateTimeField::new('activeWriteTm');
$baseReadTm = DateTimeField::new('baseReadTm');
$baseChangeTm = DateTimeField::new('baseChangeTm');
$baseWriteTm = DateTimeField::new('baseWriteTm');
$infoReadTm = DateTimeField::new('infoReadTm', 'Обновлено');
$infoChangeTm = DateTimeField::new('infoChangeTm');
$infoWriteTm = DateTimeField::new('infoWriteTm');
$priceReadTm = DateTimeField::new('priceReadTm');
$priceChangeTm = DateTimeField::new('priceChangeTm');
$priceWriteTm = DateTimeField::new('priceWriteTm', 'Время последней отправки цены на Wildberries');
$priceWriteError = TextareaField::new('priceWriteError', 'Ошибки изменения цен Wildberries');
$stockReadTm = DateTimeField::new('stockReadTm');
$stockChangeTm = DateTimeField::new('stockChangeTm');
$stockWriteTm = DateTimeField::new('stockWriteTm', 'Время последней отправки остатков на Wildberries');
$stockWriteUpdated = BooleanField::new('stockWriteUpdated', 'Остатки изменены');
$stockWriteError = TextareaField::new('stockWriteError', 'Ошибки изменения остатков Wildberries');
$isVisible = BooleanField::new('isVisible', 'Активно');
$isDeleted = BooleanField::new('isDeleted', 'Товар удален');//->setTemplatePath('admin/default/field_boolean_inverse.html.twig');
$infoPrice = MoneyField::new('infoPrice', 'Цена(на WB)')->setCurrency('RUB');
$infoDiscount = MoneyField::new('infoDiscount', 'Скидка(на WB)')->setCurrency('RUB');
$infoTotalPrice = MoneyField::new('infoTotalPrice', 'Цена товара со скидкой(на WB)')->setCurrency('RUB');
$infoStock = IntegerField::new('infoStock');
$note = TextareaField::new('note', 'Заметка');
$client = AssociationField::new('client', 'Площадка');
$srcProduct = AssociationField::new('srcProduct', 'Товар 1С');
$id = IdField::new('id', 'ID');
$fields = [];
switch ($pageName) {
case Crud::PAGE_INDEX:
$fields = [$id, $client, $article, $nmId, $category, $brand, $name, $stock, $stockFbo, $price, $infoPrice, $infoDiscount, $hidePrice, $srcProduct, $hideStock, $noMinStock, $infoReadTm, $isDeleted, $stockWriteUpdated, $createdAt];
break;
case Crud::PAGE_DETAIL:
$fields = [$id, $article, $nmId, $chrtId, $category, $brand, $name, $barcode, $color, $size, $stock, $stockFbo, $stockPresent, $noMinStock, $price, $discount, $infoPrice, $infoDiscount, $infoTotalPrice, $priceWriteTm, $priceWriteError, $note, $srcProduct, $createdAt, $stockWriteTm, $stockWriteUpdated, $stockWriteError, $isDeleted];
break;
case Crud::PAGE_NEW:
case Crud::PAGE_EDIT:
$fields = [$clientId, $onFbs, $onFbo, $srcProductId, $article, $nmId, $chrtId, $category, $brand, $name, $color, $size, $barcode, $createdAt, $updatedAt, $price, $discount, $totalPrice, $hidePrice, $stock, $stockFbo, $stockFboFull, $stockFboNotInOrders, $fboInWayToClient, $fboInWayFromClient, $fboDaysOnSite, $stockPresent, $hideStock, $noMinStock, $stockCalculated, $stockHistory, $activeChangeTm, $activeWriteTm, $baseReadTm, $baseChangeTm, $baseWriteTm, $infoReadTm, $infoChangeTm, $infoWriteTm, $priceReadTm, $priceChangeTm, $priceWriteTm, $priceWriteError, $stockReadTm, $stockChangeTm, $stockWriteTm, $stockWriteUpdated, $stockWriteError, $isVisible, $isDeleted, $infoPrice, $infoDiscount, $infoTotalPrice, $infoStock, $note, $client, $srcProduct];
break;
}
return $fields;
}
}