CSV'den Magento'ya siparişleri programlı olarak içe aktarma


17

Eski ve modası geçmiş bir satış noktası sisteminden Magento 1.7'yi yalnızca POS olarak kullanmaya geçiyoruz. Beklenmedik bir şekilde, karşılaştığımız zorluklardan biri, eski sistemden Mage'ye felaket olmadan neredeyse 20 yıllık kayıtların nasıl alınacağıdır.

Müşteri kayıtlarını taşımanın zorluğunu bir kenara bırakarak, bu soruya odaklandığım sorun, tarihsel sipariş verilerini eski POS'tan Mage'ye nasıl taşıyacağım. Konuştuğumuz birçok sipariş kaydı olduğunda kesin rakamlardan% 100 emin değilim, ama en az bir milyon diyebilirim.

İşte buna nasıl yaklaşacağım hakkında düşünüyorum:

  1. Magento'nun onunla iyi oynaması için verilerin nasıl biçimlendirilmesi gerektiğini tam olarak anlayın. Eski POS'tan işe yarayan bir formatta çıkıp çıkamayacağımız sorgulanabilir, ancak bir an için bunun iyi gittiğini varsayalım ...
  2. Güzel biçimlendirilmiş geçmiş verileri içeren bir .CSV dosyası oluşturun
  3. Bu .CSV'yi Magento'nun $ordernesnesine satır satır okumanın bir yolunu bulun -> save ()
  4. Kar!

Benim sorunum nokta 2 & 3, gitmek şekil nasıl biraz bulanık olmasıdır. Oldukça hantal ve Perl içerir bile, ancak ben ihtiyacım, eski POS çıkan verileri biçimlendirebilirsiniz, ama bir kez .CSV dosyası (veya bu işlem için aslında ne tür bir dosya işe yarayacaksa) oldukça net değilim Magento'nun sipariş nesnesine nasıl besleyeceğim.

Bazı Google'ları yaptım ve siparişleri programlı olarak içe aktarmak için Mage'nin sipariş nesnesini kullanan kişilerin örneklerini buldum, ancak ön uç sepeti dışındaki veri kaynaklarını söz konusu nesneye nasıl bağladıkları hakkında çok az tartışma yaptım. Sipariş nesnesinin bir sürümünü inceledim:

$id=1; // get Customer Id
$customer = Mage::getModel('customer/customer')->load($id);

$transaction = Mage::getModel('core/resource_transaction');
$storeId = $customer->getStoreId();
$reservedOrderId = Mage::getSingleton('eav/config')->getEntityType('order')->fetchNewIncrementId($storeId);

$order = Mage::getModel('sales/order')
  ->setIncrementId($reservedOrderId)
  ->setStoreId($storeId)
  ->setQuoteId(0)
  ->setGlobal_currency_code('USD')
  ->setBase_currency_code('USD')
  ->setStore_currency_code('USD')
  ->setOrder_currency_code('USD');

// set Customer data
$order->setCustomer_email($customer->getEmail())
  ->setCustomerFirstname($customer->getFirstname())
  ->setCustomerLastname($customer->getLastname())
  ->setCustomerGroupId($customer->getGroupId())
  ->setCustomer_is_guest(0)
  ->setCustomer($customer);

// set Billing Address
$billing = $customer->getDefaultBillingAddress();
$billingAddress = Mage::getModel('sales/order_address')
  ->setStoreId($storeId)
  ->setAddressType(Mage_Sales_Model_Quote_Address::TYPE_BILLING)
  ->setCustomerId($customer->getId())
  ->setCustomerAddressId($customer->getDefaultBilling())
  ->setCustomer_address_id($billing->getEntityId())
  ->setPrefix($billing->getPrefix())
  ->setFirstname($billing->getFirstname())
  ->setMiddlename($billing->getMiddlename())
  ->setLastname($billing->getLastname())
  ->setSuffix($billing->getSuffix())
  ->setCompany($billing->getCompany())
  ->setStreet($billing->getStreet())
  ->setCity($billing->getCity())
  ->setCountry_id($billing->getCountryId())
  ->setRegion($billing->getRegion())
  ->setRegion_id($billing->getRegionId())
  ->setPostcode($billing->getPostcode())
  ->setTelephone($billing->getTelephone())
  ->setFax($billing->getFax());
$order->setBillingAddress($billingAddress);

$shipping = $customer->getDefaultShippingAddress();
$shippingAddress = Mage::getModel('sales/order_address')
  ->setStoreId($storeId)
  ->setAddressType(Mage_Sales_Model_Quote_Address::TYPE_SHIPPING)
  ->setCustomerId($customer->getId())
  ->setCustomerAddressId($customer->getDefaultShipping())
  ->setCustomer_address_id($shipping->getEntityId())
  ->setPrefix($shipping->getPrefix())
  ->setFirstname($shipping->getFirstname())
  ->setMiddlename($shipping->getMiddlename())
  ->setLastname($shipping->getLastname())
  ->setSuffix($shipping->getSuffix())
  ->setCompany($shipping->getCompany())
  ->setStreet($shipping->getStreet())
  ->setCity($shipping->getCity())
  ->setCountry_id($shipping->getCountryId())
  ->setRegion($shipping->getRegion())
  ->setRegion_id($shipping->getRegionId())
  ->setPostcode($shipping->getPostcode())
  ->setTelephone($shipping->getTelephone())
->setFax($shipping->getFax());

$order->setShippingAddress($shippingAddress)
  ->setShipping_method('flatrate_flatrate')
  ->setShippingDescription($this->getCarrierName('flatrate'));

$orderPayment = Mage::getModel('sales/order_payment')
  ->setStoreId($storeId)
  ->setCustomerPaymentId(0)
  ->setMethod('purchaseorder')
  ->setPo_number(' - ');
$order->setPayment($orderPayment);

// let say, we have 2 products
$subTotal = 0;
  $products = array(
  '1001' => array(
  'qty' => 1
  ),
  '1002' ->array(
  'qty' => 3
  ),
);
foreach ($products as $productId=>$product) {
  $_product = Mage::getModel('catalog/product')->load($productId);
  $rowTotal = $_product->getPrice() * $product['qty'];
  $orderItem = Mage::getModel('sales/order_item')
    ->setStoreId($storeId)
    ->setQuoteItemId(0)
    ->setQuoteParentItemId(NULL)
    ->setProductId($productId)
    ->setProductType($_product->getTypeId())
    ->setQtyBackordered(NULL)
    ->setTotalQtyOrdered($product['rqty'])
    ->setQtyOrdered($product['qty'])
    ->setName($_product->getName())
    ->setSku($_product->getSku())
    ->setPrice($_product->getPrice())
    ->setBasePrice($_product->getPrice())
    ->setOriginalPrice($_product->getPrice())
    ->setRowTotal($rowTotal)
    ->setBaseRowTotal($rowTotal);

  $subTotal += $rowTotal;
  $order->addItem($orderItem);
}

$order->setSubtotal($subTotal)
  ->setBaseSubtotal($subTotal)
  ->setGrandTotal($subTotal)
  ->setBaseGrandTotal($subTotal);

$transaction->addObject($order);
$transaction->addCommitCallback(array($order, 'place'));
$transaction->addCommitCallback(array($order, 'save'));
$transaction->save();

İşte benim özel sorularım:

  1. Bu, bu soruna uzaktan bile duygusal bir yaklaşım gibi görünüyor mu? Ve değilse, bu konuya daha az salak gibi nasıl yaklaşabileceğimi düşünüyorsun?
  2. Bu mantıklı bir yaklaşımsa, sipariş süreci tarafından çağrılan her model için farklı bir .CSV'ye ihtiyacım var mı? yani Mage :: getModel ('satış / sipariş'), Mage :: getModel ('satış / sipariş_adresi'), vb?
  3. Bir .CSV yolu bile var mı?
  4. Veriler bir .CSV'de bulunuyorsa veya sizde ne varsa, bu nesneyi nasıl beslerim?
  5. Tepegözü nasıl sınırlarsınız?

Bunu tamamen aptalca bir şekilde düşünüyorum ve bana çok şey söyleseniz bile, herhangi bir girdiyi gerçekten takdir ediyorum.

Teşekkürler teşekkürler teşekkürler!


1
Durumunuz için gerçekten önemli değil, ancak Magento'da CSV'yi ayrıştırmayı içeren ve yararlı olabilecek önceki bir soru ve @BenMarks'ın cevabına bir göz atın. magento.stackexchange.com/questions/232/…
pspahn

1
İlham almak için buna bakmak isteyebilirsiniz: github.com/avstudnitz/AvS_FastSimpleImport Esas olarak ürün ve müşterileri ithal etmeye odaklanır, ancak hızlı bir ithalat sistemidir. Milyonlarca kayıttan bahsederken, muhtemelen hızlı bir şey istersiniz. Bunu daha önce ürün CSV dosyalarını içe aktarmak için kullandım. Sadece CSV dosyasını okur ve verileri dizilere dönüştürürsünüz. Bu modülü siparişleri kullanmak için genişletmeye çalışmadım. Yani bunun nasıl işleyeceği hakkında hiçbir fikrim yok. İyi şanslar.
Vicky

Öyleyse, siparişleri içe aktarmak için Dataflow - Import'ları otomatikleştirmek kötü bir fikir olur mu? Okuduğum kadarıyla, oldukça yaygın bir çözüm gibi görünüyor.
sparecycle

Yanıtlar:


9

Pek çok oy / görüşle cevap vermedi, bu yüzden ısırırım:

  1. Bu eski POS sistemine bağlı olacaktır, ithalat sırasında verilere masaj yapın.
  2. Varien_IoÖzellikle kendinizi tanıyın Varien_Io_File. Büyük olasılıkla verilerin bu kadar büyük bir koleksiyonu ile ilgili olacak beri kullanımda akılda tutmak gibi akışları StreamReadCsvve StreamWriteCsv. "Akış" hakkında daha fazla ayrıntı . Akış veya doğrusal okuma / yazma olmadan, diğer yükleme / yazma yöntemleriyle bellek sorunlarıyla karşılaşabilirsiniz.

Yukarıda belirtilen ile burada bir örnek var: (kaynak Atwix.com )

/**
 * Generates CSV file with product's list according to the collection in the $this->_list
 * @return array
 */
public function generateMlnList()
{
    if (!is_null($this->_list)) {
        $items = $this->_list->getItems();
        if (count($items) > 0) {

            $io = new Varien_Io_File();
            $path = Mage::getBaseDir('var') . DS . 'export' . DS;
            $name = md5(microtime());
            $file = $path . DS . $name . '.csv';
            $io->setAllowCreateFolders(true);
            $io->open(array('path' => $path));
            $io->streamOpen($file, 'w+');
            $io->streamLock(true);

            $io->streamWriteCsv($this->_getCsvHeaders($items));
            foreach ($items as $product) {
                $io->streamWriteCsv($product->getData());
            }

            return array(
                'type'  => 'filename',
                'value' => $file,
                'rm'    => true // can delete file after use
            );
        }
    }
}

Siparişleri içe aktarmaya gelince, bu örnek en çok yardımcı oldu: (Kaynak: pastebin )

<?php

require_once 'app/Mage.php';

Mage::app();

$quote = Mage::getModel('sales/quote')
    ->setStoreId(Mage::app()->getStore('default')->getId());

if ('do customer orders') {
    // for customer orders:
    $customer = Mage::getModel('customer/customer')
        ->setWebsiteId(1)
        ->loadByEmail('customer@example.com');
    $quote->assignCustomer($customer);
} else {
    // for guesr orders only:
    $quote->setCustomerEmail('customer@example.com');
}

// add product(s)
$product = Mage::getModel('catalog/product')->load(8);
$buyInfo = array(
    'qty' => 1,
    // custom option id => value id
    // or
    // configurable attribute id => value id
);
$quote->addProduct($product, new Varien_Object($buyInfo));

$addressData = array(
    'firstname' => 'Test',
    'lastname' => 'Test',
    'street' => 'Sample Street 10',
    'city' => 'Somewhere',
    'postcode' => '123456',
    'telephone' => '123456',
    'country_id' => 'US',
    'region_id' => 12, // id from directory_country_region table
);

$billingAddress = $quote->getBillingAddress()->addData($addressData);
$shippingAddress = $quote->getShippingAddress()->addData($addressData);

$shippingAddress->setCollectShippingRates(true)->collectShippingRates()
        ->setShippingMethod('flatrate_flatrate')
        ->setPaymentMethod('checkmo');

$quote->getPayment()->importData(array('method' => 'checkmo'));

$quote->collectTotals()->save();

$service = Mage::getModel('sales/service_quote', $quote);
$service->submitAll();
$order = $service->getOrder();

printf("Created order %s\n", $order->getIncrementId());

Örnek ile şimdi kaynak ağır olacak, çünkü kötü uygulama olan ve büyük olasılıkla zaman aşımı ya da belleği oldukça hızlı dolduracak Mage::getModel(...olan foreach döngülerinde çağrılar vardır . Özellikle bunu başka bir foreach / while ile tamamladıysanız.

Bu...

foreach ($products as $productId=>$product) {
  $_product = Mage::getModel('catalog/product')->load($productId);

Şöyle görünmelidir:

$_product = Mage::getModel('catalog/product');
foreach ($products as $productId=>$product) {
  $_product->load($productId);

Her CSV veri bitini Magento nesnelerine ilişkilendirmeye çalışmam . Bu delilik ve biraz fazlalık olurdu, kaynak modeli giriş noktalarına uyun $model->load(EntityId).

Ayrıca 100.000'den fazla siparişi içe aktarmaya çalışıyorsanız, MySQL'in bu kadar büyük hacimleri işlemek için ayarlanmasını sağlamak için gerekli olduğu için büyük ithalatlardan sonra performans için endişe edeceğim, yanlış satış nesneleri hala EAV tabanlı değilim, ve yüksek ses / trafik altında iyi performans göstermez. Magento Enterprise'ın sipariş almak için gerekli olmayan şişirilmiş / eski verileri önlemek için eski verileri "işlemsel" müşteri siparişi tablolarından çıkarmak için bir Müşteri Siparişi Arşivi modülüne sahip olmasının bir nedeni vardır.

Sarmak için: Bu kadar büyük veriyi saklamak için işletmenin gereksinimlerini ve ihtiyaçlarını getireceğim, eğer tamamen rapor ederse, bunu Magento'dan daha iyi alternatifler varsa.



3

Bu tarihi siparişlerin eflatun / mysql performansı üzerindeki etkisini ve durdurulan herhangi bir ürün serisinin de içe aktarılması gerekeceğini düşünerek, tarihi siparişleri müşteri ve ürünlerle birlikte bir şeyde saklamayı düşünebilirsiniz. bir elasticsearch indeksi gibi ve isteğe bağlı bir arama yapın. yani müşteri siparişi geçmişi sayfası.


1

Teklif oluşturmak ve daha sonra bir sipariş oluşturmak, sipariş almanın devasa verileri için çok fazla zaman alıyor.

Bu yüzden, araştırdım ve mysql sorgusu ile büyük sipariş içe aktarma verilerinin sonucunu buldum:

  1. Verileri yalnızca sipariş tablolarına ekledim.

  2. increment_idMagento 1.x'i tanımak için güncelleyin, son sipariş increment_idbu

  3. Bu sorgu teklif, fatura ve gönderi oluşturmuyor:

    SQL Sorguları: -

    1. INSERT INTO `sales_flat_order` (state, status, shipping_description, store_id, customer_id, base_discount_invoiced, base_grand_total, base_shipping_amount, base_shipping_invoiced, base_subtotal, base_subtotal_invoiced, base_tax_amount, base_tax_invoiced, base_total_invoiced, base_total_invoiced_cost, base_total_paid, discount_invoiced, grand_total, shipping_amount, shipping_invoiced, subtotal, subtotal_invoiced, tax_amount, tax_invoiced, total_invoiced, total_paid, customer_group_id, increment_id, base_currency_code, global_currency_code, customer_email, customer_firstname, customer_lastname, customer_middlename, order_currency_code, shipping_method, store_currency_code, store_name, created_at, updated_at, total_item_count, hidden_tax_invoiced, base_hidden_tax_invoiced, is_valid) VALUES ("complete", "complete", "Flat Rate - Fixed", 1, 38322,0,225.7,0,0,214.95,214.95,10.75,10.75,225.7, 0,225.7, 0,225.7,0,0,214.95,214.95,10.75,10.75,225.7,225.7, 1,100026111,"CAD","CAD","abc@gmail.com","abc","abc","", "CAD", "flatrate_flatrate", "CAD", "Main Website\nMain Website Store\nOnline Catalog","2012-01-17 00:00:00","2012-01-17 00:00:00",5,0,0,0);

    2. INSERT INTO `sales_flat_order_grid` (entity_id, status, shipping_description, shipping_method, store_id, customer_id, customer_email, total_qty_ordered, base_grand_total, base_total_paid, grand_total, total_paid, increment_id, base_currency_code, order_currency_code, store_name, created_at, updated_at, payment_validated, billing_name, shipping_name) VALUES (5, "complete", "Flat Rate - Fixed", "flatrate_flatrate", 1, 38322,"abc@gmail.com",5,225.7,225.7,225.7,225.7,100026111,"CAD", "CAD", "Main Website\nMain Website Store\nOnline Catalog","2012-01-17 00:00:00","2012-01-17 00:00:00",1,"abc abc","abc abc");

    3. INSERT INTO `sales_flat_order_address` (parent_id, region_id, customer_id, email, region, postcode, lastname, street, city, telephone, country_id, firstname, address_type, middlename, nick_name) VALUES (5,68,38322,"alicjakeller@gmail.com","Manitoba","R3W 1G9","abc","1607 Concordia Ave E","Winnipeg","204 667-5540","CA","abc","billing","","")

    4. INSERT INTO `sales_flat_order_address` (parent_id, region_id, customer_id, email, region, postcode, lastname, street, city, telephone, country_id, firstname, address_type, middlename, nick_name) VALUES (5,68,38322,"alicjakeller@gmail.com","Manitoba","R3W 1G9","abc","1607 Concordia Ave E","Winnipeg","204 667-5540","CA","abc","shipping","","");

    5. INSERT INTO `sales_flat_order_item` (order_id, store_id, created_at, updated_at, product_id, product_type, sku, name, qty_ordered, price, base_price, original_price, base_original_price, row_total, base_row_total, price_incl_tax, base_price_incl_tax, row_total_incl_tax, base_row_total_incl_tax) VALUES (5,1,"2012-01-17 00:00:00","2012-01-17 00:00:00",4134,"simple","MET2240","ULTRA FLORA IB - 30 CAPS",4,44.99,44.99,44.99,44.99,179.96,179.96,44.99,44.99,179.96,179.96);

    6. INSERT INTO `sales_flat_order_item` (order_id, store_id, created_at, updated_at, product_id, product_type, sku, name, qty_ordered, price, base_price, original_price, base_original_price, row_total, base_row_total, price_incl_tax, base_price_incl_tax, row_total_incl_tax, base_row_total_incl_tax) VALUES (5,1,"2012-01-17 00:00:00","2012-01-17 00:00:00",3198,"simple","WS1600","THYROSENSE - 180 VCAPS + 60 VCAPS FREE",1,34.99,34.99,34.99,34.99,34.99,34.99,34.99,34.99,34.99,34.99);

    7. INSERT INTO `sales_flat_order_payment` (parent_id, base_shipping_amount, shipping_amount, base_amount_paid, amount_paid, base_amount_ordered, amount_ordered, method) VALUES (5,0,0,225.7,225.7,225.7,225.7, "cashondelivery");

    8. UPDATE `eav_entity_store` SET increment_last_id = 100026111 WHERE `entity_type_id` = 5 AND `store_id` = 1;

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.