Skip to content

Commit 974db6b

Browse files
committed
ACP2E-2679: Updating time of Date and Time type product attributes via CSV import
1 parent 6a5060a commit 974db6b

File tree

4 files changed

+89
-2
lines changed

4 files changed

+89
-2
lines changed

app/code/Magento/CatalogImportExport/Model/Export/Product.php

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -368,6 +368,11 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity
368368
*/
369369
private $stockConfiguration;
370370

371+
/**
372+
* @var array
373+
*/
374+
private array $attributeFrontendTypes = [];
375+
371376
/**
372377
* Product constructor.
373378
*
@@ -1062,7 +1067,7 @@ protected function collectRawData()
10621067

10631068
if ($this->_attributeTypes[$code] == 'datetime') {
10641069
if (in_array($code, $this->dateAttrCodes)
1065-
|| in_array($code, $this->userDefinedAttributes)
1070+
|| $this->attributeFrontendTypes[$code] === 'date'
10661071
) {
10671072
$attrValue = $this->_localeDate->formatDateTime(
10681073
new \DateTime($attrValue),
@@ -1657,6 +1662,7 @@ protected function initAttributes()
16571662
$this->_attributeValues[$attribute->getAttributeCode()] = $this->getAttributeOptions($attribute);
16581663
$this->_attributeTypes[$attribute->getAttributeCode()] =
16591664
\Magento\ImportExport\Model\Import::getAttributeType($attribute);
1665+
$this->attributeFrontendTypes[$attribute->getAttributeCode()] = $attribute->getFrontendInput();
16601666
if ($attribute->getIsUserDefined()) {
16611667
$this->userDefinedAttributes[] = $attribute->getAttributeCode();
16621668
}

app/code/Magento/CatalogImportExport/Model/Import/Product.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2058,7 +2058,7 @@ private function saveProductAttributesPhase(
20582058
if ('datetime' == $attribute->getBackendType()
20592059
&& (
20602060
in_array($attribute->getAttributeCode(), $this->dateAttrCodes)
2061-
|| $attribute->getIsUserDefined()
2061+
|| $attribute->getFrontendInput() === 'date'
20622062
)
20632063
) {
20642064
$attrValue = $this->dateTime->formatDate($attrValue, false);

dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/Export/ProductTest.php

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,16 @@
1212
use Magento\Catalog\Api\ProductRepositoryInterface;
1313
use Magento\Catalog\Model\ResourceModel\Product\Attribute\Collection as ProductAttributeCollection;
1414
use Magento\Catalog\Observer\SwitchPriceAttributeScopeOnConfigChange;
15+
use Magento\Catalog\Test\Fixture\Attribute as AttributeFixture;
1516
use Magento\Catalog\Test\Fixture\Category as CategoryFixture;
1617
use Magento\Catalog\Test\Fixture\Product as ProductFixture;
1718
use Magento\CatalogImportExport\Model\Export\Product\Type\Simple as SimpleProductType;
1819
use Magento\CatalogInventory\Api\StockConfigurationInterface;
1920
use Magento\CatalogInventory\Api\StockItemRepositoryInterface;
2021
use Magento\CatalogInventory\Model\Stock\Item;
22+
use Magento\Directory\Helper\Data as DirectoryData;
2123
use Magento\Framework\App\Config\ReinitableConfigInterface;
24+
use Magento\Framework\App\Config\ScopeConfigInterface;
2225
use Magento\Framework\Exception\NoSuchEntityException;
2326
use Magento\Framework\Serialize\Serializer\Json;
2427
use Magento\ImportExport\Api\Data\LocalizedExportInfoInterface;
@@ -27,6 +30,7 @@
2730
use Magento\Store\Model\StoreManagerInterface;
2831
use Magento\Store\Test\Fixture\Store as StoreFixture;
2932
use Magento\TestFramework\Fixture\AppArea;
33+
use Magento\TestFramework\Fixture\Config;
3034
use Magento\TestFramework\Fixture\DataFixture;
3135
use Magento\TestFramework\Fixture\DataFixtureStorage;
3236
use Magento\TestFramework\Fixture\DataFixtureStorageManager;
@@ -917,4 +921,34 @@ public function testExportWithSpecificLocale(): void
917921
$exportInfo->setExportFilter($this->objectManager->get(Json::class)->serialize($exportFilter));
918922
$this->assertStringContainsString('Katalog, Suche', $exportManager->export($exportInfo));
919923
}
924+
925+
#[
926+
AppArea('adminhtml'),
927+
Config(DirectoryData::XML_PATH_DEFAULT_TIMEZONE, 'America/Chicago', ScopeConfigInterface::SCOPE_TYPE_DEFAULT),
928+
DataFixture(
929+
AttributeFixture::class,
930+
['frontend_input' => 'date', 'backend_type' => 'datetime', 'attribute_code' => 'date_attr'],
931+
'date_attr'
932+
),
933+
DataFixture(
934+
AttributeFixture::class,
935+
['frontend_input' => 'datetime', 'backend_type' => 'datetime', 'attribute_code' => 'datetime_attr'],
936+
'datetime_attr'
937+
),
938+
DataFixture(
939+
ProductFixture::class,
940+
['datetime_attr' => '2015-07-19 08:30:00', 'date_attr' => '2017-02-07'],
941+
'product'
942+
)
943+
]
944+
public function testExportProductWithDateAndDatetimeAttributes(): void
945+
{
946+
$sku = $this->fixtures->get('product')->getSku();
947+
$product = $this->productRepository->get($sku, storeId: Store::DEFAULT_STORE_ID, forceReload: true);
948+
$this->assertEquals('2015-07-19 08:30:00', $product->getDatetimeAttr());
949+
$this->assertEquals('2017-02-07 00:00:00', $product->getDateAttr());
950+
$csv = $this->doExport(['sku' => $sku]);
951+
$this->assertMatchesRegularExpression('#datetime_attr=7/19/15,\p{Zs}3:30\p{Zs}AM#u', $csv);
952+
$this->assertMatchesRegularExpression('#date_attr=2/7/17("|(,\w+=))#', $csv);
953+
}
920954
}

dev/tests/integration/testsuite/Magento/CatalogImportExport/Model/Import/ProductTest/ProductOtherTest.php

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,13 @@
1010
use Magento\Catalog\Helper\Data as CatalogConfig;
1111
use Magento\Catalog\Model\Product;
1212
use Magento\Catalog\Model\ResourceModel\Product as ProductResource;
13+
use Magento\Catalog\Test\Fixture\Attribute as AttributeFixture;
1314
use Magento\Catalog\Test\Fixture\Product as ProductFixture;
1415
use Magento\CatalogImportExport\Model\Import\ProductTestBase;
1516
use Magento\CatalogInventory\Model\StockRegistry;
17+
use Magento\Directory\Helper\Data as DirectoryData;
1618
use Magento\Framework\Api\SearchCriteria;
19+
use Magento\Framework\App\Config\ScopeConfigInterface;
1720
use Magento\Framework\App\Filesystem\DirectoryList;
1821
use Magento\Framework\Filesystem;
1922
use Magento\ImportExport\Helper\Data;
@@ -821,4 +824,48 @@ public function testImportWithSpecificLocale(): void
821824
$simpleProduct = $this->getProductBySku($p1->getSku());
822825
$this->assertEquals(Product\Visibility::VISIBILITY_NOT_VISIBLE, (int) $simpleProduct->getVisibility());
823826
}
827+
828+
#[
829+
Config(DirectoryData::XML_PATH_DEFAULT_TIMEZONE, 'America/Chicago', ScopeConfigInterface::SCOPE_TYPE_DEFAULT),
830+
DataFixture(
831+
AttributeFixture::class,
832+
['frontend_input' => 'date', 'backend_type' => 'datetime', 'attribute_code' => 'date_attr'],
833+
'date_attr'
834+
),
835+
DataFixture(
836+
AttributeFixture::class,
837+
['frontend_input' => 'datetime', 'backend_type' => 'datetime', 'attribute_code' => 'datetime_attr'],
838+
'datetime_attr'
839+
),
840+
DataFixture(
841+
ProductFixture::class,
842+
['datetime_attr' => '2015-07-19 08:30:00', 'date_attr' => '2017-02-07'],
843+
'product'
844+
),
845+
DataFixture(
846+
CsvFileFixture::class,
847+
[
848+
'rows' => [
849+
['sku', 'store_view_code', 'additional_attributes'],
850+
['$product.sku$', 'default', 'datetime_attr=10/9/23, 1:15 PM,date_attr=12/11/23'],
851+
]
852+
],
853+
'file'
854+
),
855+
]
856+
public function testImportProductWithDateAndDatetimeAttributes(): void
857+
{
858+
$fixtures = DataFixtureStorageManager::getStorage();
859+
$sku = $fixtures->get('product')->getSku();
860+
$pathToFile = $fixtures->get('file')->getAbsolutePath();
861+
$product = $this->productRepository->get($sku, storeId: Store::DEFAULT_STORE_ID, forceReload: true);
862+
$this->assertEquals('2015-07-19 08:30:00', $product->getDatetimeAttr());
863+
$this->assertEquals('2017-02-07 00:00:00', $product->getDateAttr());
864+
$importModel = $this->createImportModel($pathToFile);
865+
$this->assertErrorsCount(0, $importModel->validateData());
866+
$importModel->importData();
867+
$product = $this->productRepository->get($sku, storeId: Store::DEFAULT_STORE_ID, forceReload: true);
868+
$this->assertEquals('2023-10-09 18:15:00', $product->getDatetimeAttr());
869+
$this->assertEquals('2023-12-11 00:00:00', $product->getDateAttr());
870+
}
824871
}

0 commit comments

Comments
 (0)