Nach Migration der Daten wurde festgestellt dass Preise und Vererbungen fehlerhaft sind.
Um dies nun zu beheben hab ich ein Plugin geschrieben:
<?php
declare(strict_types=1);
namespace PricingFixer\Commands;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Command\Command;
use Shopware\Core\Defaults;
use Shopware\Core\Framework\Context;
use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
use Shopware\Core\Content\Product\ProductEntity;
use Shopware\Core\Framework\DataAbstractionLayer\Search\EntitySearchResult;
class PricingFixerCommand extends Command
{
protected function configure(): void
{
$this->setName("fix:pricing")->setDescription("fixes pricing of main products, removes prices from variants");
}
protected EntityRepositoryInterface $productRepository;
public function __construct(
EntityRepositoryInterface $productRepository,
) {
parent::__construct();
$this->productRepository = $productRepository;
}
protected function execute(InputInterface $input, OutputInterface $output): int
{
$this->restoreVariantsInheritance();
$output->writeln("done.");
return 0;
}
protected function restoreVariantsInheritance()
{
$context = Context::createDefaultContext();
$context->setConsiderInheritance(true);
$criteria = new Criteria();
$criteria->addFilter(new EqualsFilter("productNumber", "X2020")); // <- Beispiel-Produkt, sonst ("parentId", null)
$products = $this->productRepository->search(
$criteria,
Context::createDefaultContext()
)->getEntities();
foreach ($products as $product) {
$variants = $this->getProductVariants($product)->getEntities();
foreach ($variants as $variant) {
$product = [
"id" => $variant->getUniqueIdentifier(),
"price" => [[
"currencyId" => Defaults::CURRENCY,
"gross" => 0,
"net" => 0,
"linked" => true,
]]
];
$this->productRepository->update([$product], $context);
}
}
}
protected function getProductVariants(ProductEntity $product): EntitySearchResult
{
$parentProduct = $product->getParent();
if ($parentProduct != null) {
$product = $parentProduct;
}
$criteria = new Criteria();
$criteria->addFilter(new EqualsFilter(
"parentId",
$product->getUniqueIdentifier()
));
return $this->productRepository->search($criteria, Context::createDefaultContext());
}
}
Wie zu sehen, wird hierbei gross und net auf 0 gesetzt da diese nicht benötigt werden.
Die Property linked sollte allerdings dafür sorgen, dass die Variante wieder vom Hauptprodukt die Preise vererbt bekommt.
Der Code scheint zu funktionieren, eine Produkt Indexierung wird ausgelöst, aber die Vererbung wird einfach nicht wiederhergestellt.
Kann mir irgendjemand bitte sagen, was das verdammte Probleme hier ist?