/hitch_commands/src/SpeedLab/Hitch/CommandsBundle/Command/Item/Processor/ShopifyCatalogFeedFileGenerator.php
PHP | 322 lines | 258 code | 61 blank | 3 comment | 26 complexity | fb5d5274877e376d6432ef50fbfa0da8 MD5 | raw file
- <?php
-
- namespace SpeedLab\Hitch\CommandsBundle\Command\Item\Processor;
-
- use ArrayObject;
- use SpeedLab\Hitch\CommandsBundle\Command\HitchCommandBase;
- use SpeedLab\Hitch\CommandsBundle\Command\Utils\CodeGeneratorInterface;
- use SpeedLab\Hitch\DatabaseBundle\Model\ItemColorCd;
- use SpeedLab\Hitch\DatabaseBundle\Model\ItemColorCdPeer;
- use SpeedLab\Hitch\DatabaseBundle\Model\ItemSizeCd;
- use SpeedLab\Hitch\DatabaseBundle\Model\ItemSizeCdPeer;
- use SpeedLab\Hitch\DatabaseBundle\Model\Vendor;
- use SpeedLab\Hitch\DatabaseBundle\Model\VendorPeer;
- use Symfony\Component\Security\Acl\Exception\Exception;
-
- class ShopifyCatalogFeedFileGenerator extends CatalogFeedFileGenerator
- {
-
- use ShopifyItemsProcessorMixin;
-
- const COLOR_CODE_FIELD = 'option1';
-
- const SIZE_CODE_FIELD = 'option2';
-
- public function buildVendors()
- {
- /* @var CodeGeneratorInterface $codeGenerator */
- $codeGenerator = $this->getCodeGenerator();
-
- $result = new ArrayObject();
- $processedVendors = new ArrayObject();
- $host = $this;
-
- $this->iterateProducts(
- $this->getItems(),
- function($product) use (
- $codeGenerator,
- $result,
- $processedVendors,
- $host
- ) {
-
- $vendorName = $host->normalizeDescriptionText($product->vendor);
- if (isset($processedVendors[$vendorName])) {
- return;
- }
-
- $vendor = VendorPeer::findByDivisionAndVendorName($host->getDivision(), $vendorName);
- if (is_null($vendor)) {
-
- $vendorNum = $codeGenerator->generateCode(
- $vendorName,
- ['namespace' => $host->getDivision() . '_vendor_num']
- );
- $vendorNum = str_pad($vendorNum, 10, '0', STR_PAD_LEFT);
-
- $vendor = new Vendor();
- $vendor->setVendorNum($vendorNum);
- $vendor->setDivision($host->getDivision());
- $vendor->setVendorName($vendorName);
- $vendor->save();
-
- if (isset($this->output)) {
- $this->output->writeln('Processing vendor "' . $product->vendor
- . '" => "' . $vendor->getVendorNum() . '" / ' . $vendor->getVendorName(),
- HitchCommandBase::STYLE_INFO);
- }
-
- } else {
-
- if (isset($this->output)) {
- $this->output->writeln('Loading vendor "' . $product->vendor
- . '" => "' . $vendor->getVendorNum() . '" / ' . $vendor->getVendorName(),
- HitchCommandBase::STYLE_INFO);
- }
-
- }
-
- $entry = new ArrayObject();
- $entry['num'] = $vendor->getVendorNum();
- $entry['name'] = $vendor->getVendorName();
- $entry['address1'] = '';
-
- $result->append($entry);
- $processedVendors[$vendorName] = TRUE;
-
- });
-
- return $result;
- }
-
- public function buildColorCodes()
- {
- /* @var CodeGeneratorInterface $codeGenerator */
- $codeGenerator = $this->getCodeGenerator();
-
- $result = new ArrayObject();
- $processedColors = new ArrayObject();
- $host = $this;
-
- $this->iterateVariants(
- $this->getItems(),
- function($parentProduct, $variant) use (
- $codeGenerator,
- $result,
- $processedColors,
- $host
- ) {
- $colorDesc = $host->normalizeDescriptionText($variant->{self::COLOR_CODE_FIELD});
- if (isset($processedColors[$colorDesc])) {
- return;
- }
-
- $itemColorCode = ItemColorCdPeer::findByDivisionAndColorDesc($host->getDivision(), $colorDesc);
- if (is_null($itemColorCode)) {
- $colorCode = ($codeGenerator->generateCode(
- $colorDesc,
- ['namespace' => $host->getDivision() . '_color_code']
- ));
- $colorCode = strtoupper(str_pad($colorCode, 4, '0', STR_PAD_LEFT));
- $itemColorCode = new ItemColorCd();
- $itemColorCode->setColorCd($colorCode);
- $itemColorCode->setDivision($host->getDivision());
- $itemColorCode->setColorDesc($colorDesc);
- $itemColorCode->setDisplaySeq(0);
- $itemColorCode->setCreatedAt('Now');
- $itemColorCode->save();
-
- if (isset($this->output)) {
- $this->output->writeln('Processing color "' . $variant->{self::COLOR_CODE_FIELD}
- . '" => "' . $itemColorCode->getColorDesc() . '" / ' . $itemColorCode->getColorCd(),
- HitchCommandBase::STYLE_INFO);
- }
-
- } else {
-
- if (isset($this->output)) {
- $this->output->writeln('Loading color "' . $variant->{self::COLOR_CODE_FIELD}
- . '" => "' . $itemColorCode->getColorDesc() . '" / ' . $itemColorCode->getColorCd(),
- HitchCommandBase::STYLE_INFO);
- }
-
- }
-
- $entry = new ArrayObject();
- $entry['position'] = 0;
- $entry['code'] = $itemColorCode->getColorCd();
- $entry['desc'] = $colorDesc;
-
- $result->append($entry);
- $processedColors[$colorDesc] = TRUE;
-
- });
-
- return $result;
- }
-
- public function buildSizeCodes()
- {
- /* @var CodeGeneratorInterface $codeGenerator */
- $codeGenerator = $this->getCodeGenerator();
-
- $result = new ArrayObject();
- $processedSizes = new ArrayObject();
- $host = $this;
-
- $this->iterateVariants(
- $this->getItems(),
- function($parentProduct, $variant) use (
- $codeGenerator,
- $result,
- $processedSizes,
- $host
- ) {
- $sizeDesc = $host->normalizeDescriptionText($variant->{self::SIZE_CODE_FIELD});
- if (isset($processedSizes[$sizeDesc])) {
- return;
- }
-
- $itemSizeCode = ItemSizeCdPeer::findByDivisionAndSizeDesc($this->getDivision(), $sizeDesc);
- if (is_null($itemSizeCode)) {
- $sizeCode = ($codeGenerator->generateCode(
- $sizeDesc,
- ['namespace' => $host->getDivision() . '_size_code']
- ));
- $sizeCode = strtoupper(str_pad($sizeCode, 4, '0', STR_PAD_LEFT));
- $itemSizeCode = new ItemSizeCd();
- $itemSizeCode->setSizeCd($sizeCode);
- $itemSizeCode->setDivision($this->getDivision());
- $itemSizeCode->setSizeDesc($sizeDesc);
- $itemSizeCode->setDisplaySeq(0);
- $itemSizeCode->setCreatedAt('Now');
- $itemSizeCode->save();
-
- if (isset($this->output)) {
- $this->output->writeln('Processing size "' . $variant->{self::SIZE_CODE_FIELD}
- . '" => "' . $itemSizeCode->getSizeDesc() . '" / ' . $itemSizeCode->getSizeCd(),
- HitchCommandBase::STYLE_INFO);
- }
-
- } else {
-
- if (isset($this->output)) {
- $this->output->writeln('Loading size "' . $variant->{self::SIZE_CODE_FIELD}
- . '" => "' . $itemSizeCode->getSizeDesc() . '" / ' . $itemSizeCode->getSizeCd(),
- HitchCommandBase::STYLE_INFO);
- }
-
- }
-
- $entry['position'] = 0;
- $entry['code'] = $itemSizeCode->getSizeCd();
- $entry['desc'] = $sizeDesc;
-
- $result->append($entry);
- $processedSizes[$sizeDesc] = TRUE;
-
- });
- return $result;
- }
-
- public function processItems($vendors, $colorCodes, $sizeCodes)
- {
- $result = new ArrayObject();
- $colorsByDesc = $this->indexArrayBy($colorCodes, 'desc');
- $sizesByDesc = $this->indexArrayBy($sizeCodes, 'desc');
- $vendorsByName = $this->indexArrayBy($vendors, 'name');
- $host = $this;
-
- $totalProcessed = 0;
-
- $this->iterateVariants(
- $this->getItems(),
- function($parentProduct, $variant) use (
- $result,
- $colorsByDesc,
- $sizesByDesc,
- $vendorsByName,
- $host,
- &$totalProcessed
- ) {
-
- if (isset($this->output)) {
- $this->output->writeln('Processing variant "' . $variant->id . '" / product "'
- . $parentProduct->id . '" ...', HitchCommandBase::STYLE_INFO);
- }
-
- $resultCount = count($result);
- if ($resultCount == 0 || $result[$resultCount - 1]['num'] != $parentProduct->id) {
- $lastItem = new ArrayObject();
- $lastItem['num'] = $parentProduct->id;
- $lastItem['desc'] = $parentProduct->title;
- $lastItem['unitWeight'] = $variant->weight;
- $lastItem['skus'] = new ArrayObject();
- $result[] = $lastItem;
- } else {
- $lastItem = $result[$resultCount - 1];
- }
-
- $colorDesc = $host->normalizeDescriptionText($variant->{self::COLOR_CODE_FIELD});
- $colorCode = $colorsByDesc[$colorDesc]['code'];
-
- $sizeDesc = $this->normalizeDescriptionText($variant->{self::SIZE_CODE_FIELD});
- $sizeCode = $sizesByDesc[$sizeDesc]['code'];
-
- $vendorName = $this->normalizeDescriptionText($parentProduct->vendor);
- $vendorNum = $vendorsByName[$vendorName]['num'];
-
- $sku = new ArrayObject();
- $sku['colorCode'] = $colorCode;
- $sku['sizeCode'] = $sizeCode;
- $sku['status'] = 'ACTIVE';
- $sku['retailPrice'] = $variant->price;
- $sku['originalPrice'] = $variant->price;
- $sku['cost'] = 0.0;
- $sku['skucode'] = $host->filterSkucode($variant->sku);
- $sku['barcode'] = $variant->barcode;
- $sku['itemDesc'] = $parentProduct->title;
- $sku['vendorNum'] = $vendorNum;
-
- $lastItem['skus']->append($sku);
-
- $totalProcessed++;
-
- });
-
- if (isset($this->output)) {
- $this->output->writeln('Loaded ' . count($this->getItems()) . ' items from the database.');
- $this->output->writeln('Written ' . count($result) . ' items.');
- $this->output->writeln("A total of $totalProcessed variants were processed.",
- HitchCommandBase::STYLE_INFO);
- }
-
- return $result;
- }
-
- public function validateFeedDataModel($model)
- {
- $barcodes = [];
- foreach ($model['items'] as $item) {
- foreach ($item['skus'] as $sku) {
- if (is_null($sku['barcode']) || $sku['barcode'] == '') {
- throw new Exception("SKU " . print_r($sku, TRUE) . " doesn't have a valid barcode.");
- }
- if (isset($barcodes[$sku['barcode']])) {
- throw new Exception("SKU " . print_r($sku, TRUE) . " doesn't have a unique barcode.");
- } else {
- $barcodes[$sku['barcode']] = TRUE;
- }
- }
- }
- }
-
- private function indexArrayBy($arr, $byKey) {
- $result = new ArrayObject();
- foreach ($arr as $elem) {
- $result[$elem[$byKey]] = $elem;
- }
- return $result;
- }
-
- }