প্রোগ্রামেমেজেন্টোতে কোনও সিএসভি থেকে অর্ডার আমদানি করা হচ্ছে


17

আমরা একমাত্র পুরাতন, পুরানো পুরানো পয়েন্ট অফ বিক্রয় সিস্টেম থেকে আমাদের পোস হিসাবে একচেটিয়াভাবে Magento 1.7 ব্যবহার করতে চলেছি। অপ্রত্যাশিতভাবে নয়, আমরা একটি চ্যালেঞ্জের মুখোমুখি হ'ল কীভাবে বিপর্যয় ছাড়াই পুরানো সিস্টেম থেকে ম্যাগে প্রায় 20 বছরের রেকর্ড পাওয়া যায়।

এমনকি গ্রাহকের রেকর্ডগুলি স্থানান্তরিত করার চ্যালেঞ্জকে একপাশে রেখে আমি যে প্রশ্নটিতে এই প্রশ্নটির উপরে ফোকাস দিচ্ছি তা হ'ল আমি কীভাবে Pতিহাসিক ক্রম ডেটা মাইজে পুরানো POS থেকে স্থানান্তরিত করতে যাচ্ছি। আমরা যখন সংখ্যার অর্ডার দিয়ে কথা বলি তখন সঠিক সংখ্যার উপর আমি 100% নিশ্চিত নই, তবে আমি কমপক্ষে এক মিলিয়ন বলব।

এখানে কীভাবে যোগাযোগ করা যায় সে সম্পর্কে আমি যা ভাবছি তা এখানে:

  1. ম্যাজেন্টো এটির সাথে সুন্দর খেলতে কীভাবে ডেটা ফর্ম্যাট করতে হবে তা ঠিক করুন। আমরা এটি কার্যকর ফরমেটে পুরানো পস থেকে বেরিয়ে আসতে পারি কিনা তা প্রশ্নবিদ্ধ, তবে আসুন আমরা এক মুহুর্ত ধরে ধরে নিই যে এটি ঠিকঠাক হয় ...
  2. একটি .CSV ফাইল ডাব্লু / সুন্দরভাবে ফর্ম্যাট করা historicalতিহাসিক ডেটা তৈরি করুন
  3. সেই সিসিএসভি পড়ার একটি উপায় সন্ধান করুন Magento এর $orderবস্তু সারিতে সারি -> সংরক্ষণ করুন ()
  4. লাভ!

আমার সমস্যাটি হ'ল আমি কীভাবে পয়েন্ট 2 এবং 3 এ যাব, চিত্রটি কীভাবে যাব সে সম্পর্কে আমি কিছুটা অস্পষ্ট। আমি পুরাতন পস থেকে আগত ডেটা ফর্ম্যাট করতে পারি তবে এটি আমার পক্ষে অত্যন্ত জটিল এবং পার্লের সাথে জড়িত থাকলেও আমার কাছে একবার। সিএসভি ফাইল (অথবা যে কোনও ফাইল টাইপ প্রকৃতপক্ষে এই প্রক্রিয়াটির জন্য কার্যকর হবে) আমি খুব অস্পষ্ট on আমি কীভাবে এটি ম্যাজেন্টোর অর্ডার অবজেক্টে ফিড করব।

আমি কিছু গুগলিং করেছি এবং ম্যাগের অর্ডার অবজেক্টটি প্রোগ্রামের মাধ্যমে আমদানি করতে লোকজনের উদাহরণ নিয়ে এসেছি, তবে তারা কীভাবে সামনের দিকের কার্ট বাদে ডেটা উত্সকে সংযোগ দিচ্ছে তা নিয়ে সামান্য আলোচনা হয়েছে। আমি অর্ডার অবজেক্টের একটি সংস্করণ অধ্যয়ন করছি:

$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. যদি এটি সংবেদনশীল পদ্ধতির হয়, তবে অর্ডার প্রক্রিয়া দ্বারা কল করা প্রতিটি মডেলের জন্য আমার কি আলাদা আলাদা আলাদা সিএসভি দরকার? অর্থাৎ ম্যাজ :: গেটমোডেল ('বিক্রয় / আদেশ'), ম্যাজ :: গেটমোডেল ('বিক্রয় / অর্ডার_অ্যাড্রেস'), ইত্যাদি?
  3. একটি .CSV এমনকি পথ যেতে হবে?
  4. আমি কীভাবে এই তথ্যটিতে আমার ডেটা ফিড করব, সেই ডেটাটি একটি .CSV এর মধ্যে রয়েছে বা আপনার কী আছে?
  5. আপনি কিভাবে ওভারহেড সীমাবদ্ধ সম্পর্কে যেতে হবে?

এমনকি যদি আমি এটি সম্পর্কে সম্পূর্ণ বোকামি উপায়ে চিন্তা করি এবং আপনি আমাকে যতটা বলেন, আমি আসলেই কোনও ইনপুটকে প্রশংসা করি।

আপনাকে ধন্যবাদ, আপনাকে ধন্যবাদ আপনাকে ধন্যবাদ!


1
আপনার ক্ষেত্রে সত্যই তাৎপর্যপূর্ণ নয়, তবে আমার এবং @ বেনমার্কসের উত্তর সম্পর্কে আগের প্রশ্নটি দেখুন, যার মধ্যে ম্যাজেন্টোতে সিএসভি পার্সিং জড়িত রয়েছে এবং এটি কার্যকর হতে পারে। magento.stackexchange.com/questions/232/…
pspahn

1
অনুপ্রেরণার জন্য আপনি এটি দেখতে চাইতে পারেন: github.com/avstudnitz/AvS_FastSimpleImport এটি মূলত পণ্য এবং গ্রাহকদের আমদানিতে ফোকাস করে তবে এটি একটি দ্রুত আমদানি সিস্টেম। আপনি যেমন লক্ষ লক্ষ রেকর্ডের কথা বলছেন, আপনি সম্ভবত দ্রুত কিছু চান। আমি পণ্য CSV ফাইলগুলি আমদানি করার আগে এটি ব্যবহার করেছি। আপনি কেবল সিএসভি ফাইল পড়েছেন এবং ডেটা অ্যারেতে রূপান্তর করেছেন। আমি যদিও আদেশগুলি ব্যবহার করতে এই মডিউলটি প্রসারিত করার চেষ্টা করি নি। সুতরাং এটি কীভাবে কার্যকর হবে তা আমার কোনও ধারণা নেই। শুভকামনা।
ভিকি

সুতরাং, ডাটাফ্লো স্বয়ংক্রিয়করণ করা হবে - আদেশগুলি আমদানি করার জন্য আমদানি করা কী খারাপ ধারণা? আমি যা পড়েছি তা থেকে এটি এমন একটি সমাধান বলে মনে হচ্ছে যা মোটামুটি সাধারণ।
স্পেরিসাইকেল

উত্তর:


9

এতগুলি ভোট / মতামত নিয়ে কোনও উত্তর চমকে উঠেনি, তাই আমি কামড় দেব:

  1. এটি পুরানো POS সিস্টেমের উপর নির্ভর করবে, আমদানির সময় ডেটা ম্যাসেজ করবে।
  2. নিজেকে Varien_Ioবিশেষ করে পরিচিত করুন Varien_Io_File। যেহেতু আপনি সম্ভবত এত বড় ডেটা সংগ্রহের জন্য কাজ করছেন, সুতরাং StreamReadCsvএবং এর মতো স্ট্রিমগুলি ব্যবহার করতে মনে রাখবেন StreamWriteCsv"স্ট্রিম" এর আরও বিশদ । কোনও স্ট্রিম বা লিনিয়ার রিড / লিখন ছাড়া আপনি অন্যান্য লোড / রাইটিং পদ্ধতির সাহায্যে মেমরির সমস্যার মধ্যে চলে যেতে পারেন।

উপরোক্ত সাথে এখানে একটি উদাহরণ রয়েছে: (উত্স অ্যাটিক্স.কম )

/**
 * 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
            );
        }
    }
}

আদেশ আমদানি করার ক্ষেত্রে, এই উদাহরণটি সবচেয়ে বেশি সহায়তা করেছে: (উত্স: পেস্টবিন )

<?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 অবজেক্টের সাথে ডেটাগুলির প্রতিটি সিএসভি বিট চেষ্টা করার চেষ্টা করব না । এটি উন্মাদনা এবং কিছুটা ওভারকিল হবে, এর সংস্থান মডেল এন্ট্রি পয়েন্টগুলির সাথে রাখুন $model->load(EntityId)

এছাড়াও আপনি যদি 100k + অর্ডারের বেশি আমদানি করার চেষ্টা করছেন তবে আমি যদি বৃহত্তর আমদানির পরে কার্যকারিতার জন্য উদ্বিগ্ন হব মাইএসকিউএলকে এ জাতীয় বৃহত পরিমাণে পরিচালনা করতে রাখা হয় তবে আমি উল্লেখ করি না যে আমি যদি ভুলভাবে বিক্রয়কেন্দ্রগুলি এখনও ইএভি ভিত্তিক না হয়ে থাকি, এবং উচ্চ ভলিউম / ট্র্যাফিকের অধীনে ভাল সঞ্চালন করবেন না। অর্ডার নেওয়ার প্রয়োজন নেই এমন পুষ্পিত / বাসি ডেটা রোধ করতে "লেনদেনিক" বিক্রয় অর্ডার টেবিলগুলির থেকে পুরানো ডেটা টেনে বের করার জন্য ম্যাজেন্টো এন্টারপ্রাইজের একটি বিক্রয় আদেশ সংরক্ষণাগার মডিউল রয়েছে reason

মোড়ানোর জন্য: আমি এত বড় ডেটা সঞ্চয় করার জন্য ব্যবসায়ের প্রয়োজনীয়তা এবং প্রয়োজনীয়তা নিয়ে আসব, যদি এর খাঁটিভাবে প্রতিবেদন করা হয় তবে ম্যাগেন্তোর চেয়ে স্যুইটের আরও ভাল বিকল্প আছে।


কেউ কি সাহায্য এই @ magento.stackexchange.com/questions/125460/...
জহর

3

এই historicতিহাসিক আদেশগুলির প্রভাবটি ম্যাজেন্টো / মাইএসকিএল পারফরম্যান্সের উপর পড়বে এবং সেই সাথে যে কোনও পণ্য রেখাগুলি বন্ধ হয়ে গেছে সেগুলিও আমদানি করা দরকার, তবে গ্রাহক এবং পণ্যগুলিতে কোনও কিছুর সাথে historicতিহাসিক আদেশগুলি সংরক্ষণ করার বিষয়টি বিবেচনা করার উপযুক্ত হতে পারে একটি ইলাস্টিক অনুসন্ধান সূচকের মতো এবং চাহিদা অনুসারে অনুসন্ধান চালান। অর্থাত্ গ্রাহকের অর্ডার ইতিহাস পৃষ্ঠা।


1

অর্ডার আমদানির বিশাল ডেটা তৈরিতে উদ্ধৃতি তৈরি করা এবং তারপরে একটি আদেশ তৈরি করা থেকে খুব বেশি সময় নিচ্ছে।

সুতরাং, আমি গবেষণা করেছি এবং মাইএসকিএল কোয়েরি সহ বিশাল অর্ডার আমদানির ডেটার উপসংহারটি পেয়েছি:

  1. আমি কেবল অর্ডার টেবিলগুলিতে ডেটা .োকিয়েছি।

  2. increment_idশেষ আদেশটি ম্যাজেন্টো 1.x সনাক্ত করতে আপডেট করুনincrement_id এটি

  3. এই ক্যোয়ারী কোনও উদ্ধৃতি, চালান এবং চালান তৈরি করছে না:

    এসকিউএল প্রশ্নসমূহ: -

    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;

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.