Nhập đơn hàng từ CSV vào Magento theo lập trình


17

Chúng tôi đang chuyển từ một hệ thống điểm bán cũ, lỗi thời sang sử dụng Magento 1.7 làm POS riêng của chúng tôi. Không có gì bất ngờ, một trong những thách thức chúng tôi gặp phải là làm thế nào để có được gần 20 năm hồ sơ từ hệ thống cũ cho Mage mà không gặp thảm họa.

Đặt thách thức sang một bên là di chuyển hồ sơ khách hàng, vấn đề tôi đang tập trung vào câu hỏi này là làm thế nào tôi sẽ di chuyển dữ liệu đơn hàng lịch sử từ POS cũ sang Pháp sư. Tôi không chắc chắn 100% về con số chính xác khi có nhiều hồ sơ đặt hàng mà chúng tôi đang nói, nhưng tôi sẽ nói ít nhất là một triệu.

Đây là những gì tôi nghĩ về cách tiếp cận này:

  1. Chỉ ra chính xác làm thế nào dữ liệu cần được định dạng để Magento chơi tốt với nó. Liệu chúng ta có thể lấy nó ra khỏi POS cũ ở định dạng hoạt động hay không, nhưng chúng ta hãy giả sử rằng điều này sẽ ổn ...
  2. Tạo tệp .CSV với dữ liệu lịch sử được định dạng độc đáo
  3. Tìm cách đọc .CSV vào $orderhàng đối tượng của Magento theo hàng -> save ()
  4. Lợi nhuận!

Vấn đề của tôi là tôi hơi mơ hồ về cách tiếp cận điểm 2 & 3, hãy tìm hiểu. Tôi có thể định dạng dữ liệu từ POS cũ mà tôi cần, ngay cả khi nó rất cồng kềnh và liên quan đến Perl, nhưng một khi tôi có tệp .CSV (hoặc bất kỳ loại tệp nào thực sự hoạt động cho quy trình này) thì tôi không rõ lắm làm thế nào tôi có thể đưa nó vào đối tượng đặt hàng của Magento.

Tôi đã thực hiện một số Google, và tôi đã đưa ra các ví dụ về những người sử dụng đối tượng đặt hàng của Mage để nhập đơn hàng theo chương trình, nhưng ít thảo luận về cách họ kết nối các nguồn dữ liệu khác với giỏ hàng trước với đối tượng nói trên. Tôi đã nghiên cứu một phiên bản của đối tượng đặt hàng:

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

Vì vậy, đây là câu hỏi cụ thể của tôi:

  1. Điều này có vẻ như là một cách tiếp cận thậm chí từ xa nhạy cảm cho vấn đề này? Và, nếu không, làm thế nào bạn nghĩ rằng tôi có thể tiếp cận vấn đề này như một thằng ngốc?
  2. Nếu đây là một cách tiếp cận hợp lý, tôi có cần một .CSV khác nhau cho mỗi mô hình được gọi theo quy trình đặt hàng không? tức là Mage :: getModel ('doanh số / đơn hàng'), Mage :: getModel ('sales / order_address'), v.v?
  3. Là một .CSV thậm chí là con đường để đi?
  4. Làm cách nào tôi cung cấp dữ liệu của mình cho đối tượng này, cho dù dữ liệu đó có trong .CSV hay bạn có gì?
  5. Làm thế nào bạn sẽ đi về giới hạn trên không?

Ngay cả khi tôi đang nghĩ về điều này theo một cách hoàn toàn ngu ngốc và bạn nói với tôi rất nhiều, tôi thực sự đánh giá cao bất kỳ đầu vào nào.

Cảm ơn bạn, cảm ơn bạn, cảm ơn bạn!


1
Thực sự không có ý nghĩa đối với trường hợp của bạn, nhưng hãy xem câu hỏi trước đây về câu trả lời của tôi và @BenMarks, liên quan đến việc phân tích CSV trong Magento và có thể hữu ích. magento.stackexchange.com/questions/232/ Mạnh
pspahn

1
Bạn có thể muốn xem xét điều này để lấy cảm hứng: github.com/avstudnitz/AvS_FastSimpleImport Nó chủ yếu tập trung vào nhập khẩu sản phẩm và khách hàng, nhưng đó là một hệ thống nhập khẩu nhanh. Khi bạn đang nói về hàng triệu hồ sơ, bạn có thể muốn một cái gì đó nhanh chóng. Tôi đã sử dụng điều này trước đây để nhập tệp CSV sản phẩm. Bạn chỉ cần đọc tệp CSV và chuyển đổi dữ liệu thành mảng. Tôi đã không cố gắng mở rộng mô-đun này để sử dụng đơn đặt hàng mặc dù. Vì vậy, tôi không biết làm thế nào sẽ làm việc ra. Chúc may mắn.
Vicky

Vì vậy, tự động hóa Dataflow - Nhập khẩu để nhập đơn hàng có phải là một ý tưởng tồi? Từ những gì tôi đã đọc, nó dường như là một giải pháp khá phổ biến.
sparecycl

Câu trả lời:


9

Ngạc nhiên không có câu trả lời với rất nhiều phiếu / lượt xem, vì vậy tôi sẽ cắn:

  1. Điều này sẽ phụ thuộc vào hệ thống POS cũ, xoa bóp dữ liệu trong quá trình nhập.
  2. Làm quen với Varien_Io, đặc biệt Varien_Io_File. Vì rất có thể bạn sẽ xử lý một bộ sưu tập dữ liệu lớn như vậy, hãy nhớ sử dụng các luồng như StreamReadCsvStreamWriteCsv. Thêm chi tiết về một "luồng" . Nếu không có luồng hoặc đọc / ghi tuyến tính, bạn có thể gặp vấn đề về bộ nhớ với các phương thức tải / ghi khác.

Với những điều đã nói ở trên là một ví dụ: (nguồn 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
            );
        }
    }
}

Đối với việc nhập đơn hàng, ví dụ này đã giúp ích nhiều nhất: (Nguồn: 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());

Với ví dụ bạn có bây giờ sẽ rất nặng về tài nguyên, vì có Mage::getModel(...các cuộc gọi trong các vòng lặp foreach là một thực tiễn tồi , và rất có thể sẽ hết thời gian, hoặc lấp đầy bộ nhớ khá nhanh. Đặc biệt là nếu bạn có cái này được bọc trong một foreach / while khác.

Điều này...

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

Nên giống như:

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

Tôi sẽ không cố gắng thử và liên kết mọi bit dữ liệu CSV với các đối tượng Magento. Nó sẽ là điên rồ và một chút quá mức, giữ với các điểm nhập mô hình tài nguyên của $model->load(EntityId).

Cũng lưu ý rằng nếu bạn đang cố gắng nhập hơn 100 nghìn đơn hàng + tôi sẽ lo ngại về hiệu suất sau khi nhập lớn vì cần phải điều chỉnh MySQL để xử lý khối lượng lớn như vậy, không đề cập đến nếu tôi không nhầm đối tượng bán hàng vẫn dựa trên EAV, và không thực hiện tốt dưới lưu lượng / lưu lượng lớn. Có một lý do Magento Enterprise có mô-đun Lưu trữ đơn đặt hàng để rút dữ liệu cũ ra khỏi bảng đơn đặt hàng "giao dịch" để ngăn chặn dữ liệu cồng kềnh / cũ kỹ không cần thiết để nhận đơn đặt hàng.

To Wrap: Tôi sẽ đưa ra các yêu cầu và nhu cầu của doanh nghiệp để lưu trữ dữ liệu lớn như vậy, nếu báo cáo hoàn toàn có những lựa chọn thay thế tốt hơn để phù hợp với điều này hơn Magento.


bất cứ ai giúp điều này @ magento.stackexchange.com/questions/125460/ từ
Gem

3

Suy nghĩ về tác động của các đơn đặt hàng lịch sử này sẽ ảnh hưởng đến hiệu suất magento / mysql cộng với thực tế là bất kỳ dòng sản phẩm nào đã bị ngừng sử dụng cũng cần phải được nhập khẩu, nên có thể cân nhắc việc lưu trữ các đơn đặt hàng lịch sử cùng với khách hàng và sản phẩm trong một thứ gì đó giống như một chỉ số elaticsearch và thực hiện tìm kiếm theo yêu cầu. tức là trang lịch sử đặt hàng của khách hàng.


1

Từ việc tạo báo giá và sau đó tạo một đơn đặt hàng đang mất quá nhiều thời gian cho dữ liệu nhập đơn hàng khổng lồ.

Vì vậy, tôi đã nghiên cứu và tìm thấy kết luận về dữ liệu nhập đơn hàng khổng lồ với truy vấn mysql:

  1. Tôi chèn dữ liệu vào các bảng chỉ đặt hàng.

  2. Cập nhật increment_idđể nhận ra magento 1.x, thứ tự cuối cùng increment_idlà đây

  3. Truy vấn này không tạo ra bất kỳ báo giá, hóa đơn và giao hàng:

    Truy vấn 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;

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.