मैगेंटो में एक CSV से प्रोग्रामेटिक रूप से ऑर्डर आयात करना


17

हम एक पुराने, आउट-ऑफ-सेल सिस्टम से Magento 1.7 का उपयोग करने के लिए विशेष रूप से हमारे पीओएस के रूप में उपयोग कर रहे हैं। अप्रत्याशित रूप से नहीं, हम जिन चुनौतियों का सामना कर रहे हैं, उनमें से एक यह है कि पुरानी व्यवस्था से तबाही के बिना पुराने सिस्टम से लगभग 20 साल के रिकॉर्ड कैसे प्राप्त किए जाएं।

ग्राहक रिकॉर्ड को स्थानांतरित करने की चुनौती को भी अलग करते हुए, जिस समस्या पर मैं इस सवाल पर ध्यान केंद्रित कर रहा हूं, वह यह है कि मैं पुराने POS से Mage के ऐतिहासिक ऑर्डर डेटा को कैसे स्थानांतरित करने जा रहा हूं। जब हम बात कर रहे हैं तो कई संख्याओं पर यह सुनिश्चित नहीं होता है कि हम कितने ऑर्डर रिकॉर्ड कर रहे हैं, लेकिन मैं कम से कम एक मिलियन कहूंगा।

यहां बताया गया है कि मैं इस बारे में क्या सोच रहा हूं:

  1. मैगेंटो को इसके साथ अच्छा खेलने के लिए डेटा को वास्तव में कैसे तैयार किया जाना चाहिए, इसका पता लगाएं। क्या हम इसे पुराने पीओएस से एक प्रारूप में निकाल सकते हैं जो काम करता है, यह संदिग्ध है, लेकिन आइए एक पल के लिए मान लें कि यह अच्छा है ...
  2. .CSV फ़ाइल w / अच्छी तरह से स्वरूपित ऐतिहासिक डेटा बनाएँ
  3. पढ़ने के लिए एक रास्ता खोजें। $orderपंक्ति द्वारा Magento के ऑब्जेक्ट रो में .CSV -> सहेजें ()
  4. फायदा!

मेरी समस्या यह है कि मैं बिंदु 2 और 3 पर कैसे जा सकता हूं, इस बारे में थोड़ा फजी हूं, आंकड़े पर जाएं। मैं पुराने पीओएस से बाहर आने वाले डेटा को प्रारूपित कर सकता हूं, हालांकि मुझे इसकी आवश्यकता है, भले ही यह अत्यधिक बोझिल हो और इसमें पर्ल शामिल हो, लेकिन एक बार मेरे पास .CSV फ़ाइल (या जो भी फ़ाइल प्रकार वास्तव में इस प्रक्रिया के लिए काम करेगा) मैं बहुत अस्पष्ट हूं। मैं इसे Magento के ऑर्डर ऑब्जेक्ट में कैसे खिलाऊंगा।

मैंने कुछ Googling किया है, और मैं Mage के ऑर्डर ऑब्जेक्ट का उपयोग करके लोगों के उदाहरणों के साथ प्रोग्राम ऑर्डर आयात करने के उदाहरणों के साथ आया हूं, लेकिन वे इस बात पर बहुत कम चर्चा करते हैं कि वे ऑब्जेक्ट को फ्रंट एंड कार्ट के अलावा अन्य डेटा स्रोतों से कैसे कनेक्ट कर रहे हैं। मैं ऑर्डर ऑब्जेक्ट के एक संस्करण का अध्ययन कर रहा हूं:

$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();

तो यहाँ मेरे विशिष्ट प्रश्न हैं:

  1. क्या यह इस समस्या के लिए दूर से ही कामुक दृष्टिकोण की तरह प्रतीत होता है? और, यदि नहीं, तो आपको कैसे लगता है कि मैं इस मुद्दे को कम बेवकूफ की तरह देख सकता हूं?
  2. यदि यह एक कामुक दृष्टिकोण है, तो क्या मुझे ऑर्डर प्रक्रिया द्वारा प्रत्येक मॉडल के लिए एक अलग .CSV की आवश्यकता है? Mage :: getModel ('बिक्री / ऑर्डर'), Mage :: getModel ('बिक्री / ऑर्डर_एड्रेस'), आदि?
  3. क्या एक .CSV भी जाने का रास्ता है?
  4. मैं इस ऑब्जेक्ट में अपना डेटा कैसे खिलाऊंगा, क्या वह डेटा एक .CSV में निहित है या आपके पास क्या है?
  5. आप ओवरहेड को सीमित करने के बारे में कैसे जाएंगे?

यहां तक ​​कि अगर मैं इस बारे में पूरी तरह से मूर्खतापूर्ण तरीके से सोच रहा हूं और आप मुझे उतना ही बताते हैं, मैं वास्तव में किसी भी इनपुट की सराहना करता हूं।

धन्यवाद धन्यवाद धन्यवाद!


1
आपके मामले में वास्तव में महत्वपूर्ण नहीं है, लेकिन मेरे और @BenMarks के उत्तर के पिछले प्रश्न पर एक नज़र है, जिसमें मैगेंटो में CSV को पार्स करना शामिल है और उपयोगी हो सकता है। magento.stackexchange.com/questions/232/…
pspahn

1
आप इसे प्रेरणा के लिए देखना चाहते हैं: github.com/avstudnitz/AvS_FastSimpleImport यह मुख्य रूप से उत्पादों और ग्राहकों को आयात करने पर ध्यान केंद्रित करता है, लेकिन यह एक तेज आयात प्रणाली है। जैसा कि आप लाखों रिकॉर्ड के बारे में बात कर रहे हैं, आप शायद कुछ तेज़ चाहते हैं। मैंने उत्पाद CSV फ़ाइलों को आयात करने से पहले इसका उपयोग किया है। आप बस CSV फ़ाइल पढ़ें और डेटा को सरणियों में रूपांतरित करें। हालांकि मैंने आदेशों का उपयोग करने के लिए इस मॉड्यूल को विस्तारित करने का प्रयास नहीं किया है। इसलिए मुझे नहीं पता कि यह कैसे काम करेगा। सौभाग्य।
विक्की

तो, डेटाफ़्लो को स्वचालित करना - ऑर्डर आयात करने के लिए आयात एक बुरा विचार होगा? मैंने जो पढ़ा है, उससे यह एक समाधान प्रतीत होता है जो काफी सामान्य है।
टायसायकल

जवाबों:


9

इतने वोटों / विचारों से कोई जवाब नहीं मिला, इसलिए मैं काट लूंगा:

  1. यह पुराने पीओएस सिस्टम पर निर्भर करेगा, आयात के दौरान डेटा की मालिश करेगा।
  2. Varien_Ioविशेष रूप से अपने आप को परिचित करें Varien_Io_File। जब से तुम सबसे अधिक संभावना डेटा के इस तरह के एक बड़ा संग्रह के साथ काम किया जाएगा, उपयोग करने के लिए ध्यान में रखना के रूप में ऐसी धाराओं StreamReadCsvऔर StreamWriteCsvएक "स्ट्रीम" पर अधिक जानकारी । स्ट्रीम या लीनियर रीड / राइट के बिना आप मेमोरी मुद्दों में अन्य लोड / लिखने के तरीकों से चल सकते हैं।

उपरोक्त के साथ यहाँ एक उदाहरण है: (स्रोत 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
            );
        }
    }
}

ऑर्डर आयात करने के लिए, इस उदाहरण ने सबसे अधिक मदद की है: (स्रोत: 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());

उदाहरण के साथ आपके पास अब संसाधन भारी हो जाएगा, क्योंकि Mage::getModel(...फ़ॉरच लूप में कॉल होते हैं जो खराब अभ्यास है , और यह संभवतः या तो टाइमआउट, या जल्दी से मेमोरी को भरने की संभावना है। खासकर यदि आपके पास यह एक और फॉर्च्यूनर में लिपटा हुआ है / जबकि।

इस...

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

जैसा दिखना चाहिए:

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

मैं Magento ऑब्जेक्ट्स के लिए डेटा के हर CSV बिट्स को आज़माने और संबंधित करने का प्रयास नहीं करूंगा । यह पागलपन और थोड़ी सी अधिकता होगी, संसाधन मॉडल प्रविष्टि बिंदुओं के साथ रखें $model->load(EntityId)

यह भी ध्यान दें कि यदि आप 100k + ऑर्डर से अधिक आयात करने का प्रयास कर रहे हैं, तो मैं बड़े आयात के बाद प्रदर्शन के लिए चिंतित होऊंगा क्योंकि MySQL को ऐसे बड़े वॉल्यूम को संभालने के लिए रखना आवश्यक है, यह भी उल्लेख नहीं है कि अगर मैं गलत नहीं हूं तो बिक्री ऑब्जेक्ट अभी भी EAV आधारित हैं, और उच्च मात्रा / यातायात के तहत अच्छा प्रदर्शन नहीं करते हैं। एक कारण है कि मैगेंटो एंटरप्राइज के पास पुराने डेटा को "ट्रांसेक्शनल" बिक्री आदेश तालिकाओं से बाहर निकालने के लिए बिक्री आदेश संग्रह मॉड्यूल है, जो फूला हुआ / बासी डेटा को रोकने के लिए है जिसे ऑर्डर लेने के लिए आवश्यक नहीं है।

रैप करने के लिए: मैं इस तरह के बड़े डेटा को स्टोर करने के लिए व्यवसाय की आवश्यकताओं और जरूरतों को सामने लाऊंगा, अगर इसकी विशुद्ध रिपोर्टिंग मैगेंटो की तुलना में इसे सूट करने के लिए बेहतर विकल्प हैं।


किसी को भी यह मदद @ magento.stackexchange.com/questions/125460/…
रत्न

3

इन ऐतिहासिक आदेशों के प्रभाव के बारे में सोचकर मैगेंटो / mysql के प्रदर्शन के साथ-साथ इस तथ्य पर भी ध्यान दिया जाएगा कि किसी भी उत्पाद लाइन को बंद कर दिया गया है, उसे भी आयात करने की आवश्यकता होगी, तो यह ग्राहक और उत्पादों के साथ ऐतिहासिक आदेशों को संग्रहीत करने पर विचार करने के लायक हो सकता है। एक elasticsearch सूचकांक की तरह और मांग पर एक खोज करते हैं। यानी कस्टमर ऑर्डर हिस्ट्री पेज।


1

उद्धरण बनाने से और फिर ऑर्डर बनाने से ऑर्डर आयात के विशाल डेटा के लिए बहुत अधिक समय लगता है।

तो, मैंने शोध किया है और mysql क्वेरी के साथ विशाल ऑर्डर आयात डेटा का निष्कर्ष पाया है:

  1. मैंने केवल ऑर्डर टेबल में डेटा डाला।

  2. increment_idMagento 1.x को पहचानने के लिए अपडेट करें , यह अंतिम आदेश increment_idहै

  3. यह क्वेरी कोई उद्धरण, चालान और शिपमेंट नहीं बना रही है:

    SQL क्वेरी: -

    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;

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.