Memiliki beberapa tampilan toko berbagi kisaran jumlah kenaikan urutan yang sama

13

Dapatkah Magento dikonfigurasikan sedemikian rupa, sehingga beberapa tampilan toko dari situs web yang sama dapat berbagiincrement_id rentang nomor pesanan yang sama ? Dan jika demikian, bagaimana caranya?

Misalnya, dengan pengaturan multistore seperti ini di core_store:

store_id        code    website_id    group_id
       0       admin             0           0
       1       alpha             1           1
       2       bravo             2           2
       3     charlie             2           2

Sekarang tampilan toko baru deltaditambahkan:

store_id        code    website_id    group_id
       4       delta             1           1

Dengan asumsi alphaid kenaikan pesanan terakhir saat ini adalah 1000123, cara mencapai:

next sell    order number
    alpha         1000124
    delta         1000125
    delta         1000126
    alpha         1000127

Pertanyaan yang sama berlaku untuk beberapa tampilan toko yang berbagi increment_idrentang nomor faktur yang sama , dan / atau berbagi increment_idrentang nomor kredit yang sama .

Apakah Magento mendukung ini di luar kebiasaan?

Jürgen Thelen
sumber
Dengan bimbingan dari @ alessandro-ronchi saya mengimplementasikan solusi seperti ini. gist.github.com/mblarsen/012dce6f55ad5d442f41e9157e74530e bekerja sangat baik untuk saya.
Michael

Jawaban:

5

Saya membayangkan ini akan sangat sulit. Id kenaikan disimpan di eav_entity_storetabel dan tidak mengherankan setiap toko memiliki entri sendiri yang diperbarui ketika pesanan (dan kutipan, faktur dll) dibuat. Untuk membuat semua toko menggunakan incrementer yang sama, Anda harus menulis ulang logika ini sehingga menggunakan baris yang sama di DB. Dampak apa yang mungkin terjadi pada area situs lainnya adalah hal lain yang perlu dipertimbangkan.

Richard Cleverley
sumber
Saya setuju dengan Richard.
Sylvain Rayé
Anda mungkin benar tetapi menjalankan kode ini membuat semua faktur saya mengikuti urutan nomor yang samaMage::getModel('eav/entity_type')->loadByCode('invoice')->setIncrementPerStore(false)->save()
Jay Ghosh
3

Anda dapat mengganti model pesanan, pengiriman, faktur, dan memo kenaikan kredit dengan menulis ulang kelas "eav / entity_increment_numeric" yang menyediakan logika khusus dalam Model milik Anda.

Lihatlah kelas leluhur (Mage_Eav_Model_Entity_Increment_Numeric dan Mage_Eav_Model_Entity_Increment_Abstract) untuk memahami cara menyediakan logika Anda sendiri.

Anda dapat membedakan logika antara entitas yang berbeda dengan memeriksa parameter $ entityTypeCode pada fungsi getNextId () yang akan Anda timpa.

Cara lain (yang lebih invasif) adalah menentukan model kenaikan yang berbeda untuk setiap jenis entitas dengan menimpa (melalui skrip instal) nilai kolom "increment_model" pada tabel "eav_entity_type". Secara pribadi saya lebih suka solusi "menulis ulang" yang disebutkan di atas.

Perhatikan: id kenaikan memiliki batasan keunikan dalam versi Magento terbaru sehingga Anda tidak dapat menyimpan id kenaikan yang sama untuk dua entitas berbeda dari tipe yang sama. Dengan kata lain Anda tidak dapat memiliki dua faktur berbeda dengan id kenaikan yang sama.

Semoga ini bisa membantu.

Alessandro Ronchi
sumber
Melihat ke dalam ini, tetapi saya tidak dapat menemukan getLastId()di Mage_Eav_Model_Entity_Increment_Numericatau di kelas atau antarmuka lain dalam hierarki. Btw, ini seharusnya jawaban yang diterima.
Michael
UPDATE: Baru menyadari itu adalah properti yang ditetapkan pada Varien_ObjectdariMage_Eav_Model_Entity_Type
Michael
Diimplementasikan seperti ini: gist.github.com/mblarsen/012dce6f55ad5d442f41e9157e74530e
Michael
2

Sambil menggali lebih dalam, saya menyadari itu eav_entity_type.increment_per_storemungkin bisa membantu.

Ini. Tetapi hanya untuk kasus ini, ketika Anda ingin semua tampilan toko (secara global, tidak peduli di mana situs web mereka tetapkan) dari instalasi Magento Anda untuk berbagi increment_idrentang nomor urutan yang sama .

Ini tidak menyelesaikan masalah spesifik saya, tetapi mungkin bermanfaat bagi beberapa orang lain, jadi di sini kita mulai:

Untuk mengaktifkan berbagi nomor pesanan Anda secara global, atur eav_entity_type.increment_per_storeentitas pesanan ke 0,

Ini mengarah ke Mage_Eav_Model_Entity_Type::fetchNewIncrementId()penggunaan store_id = 0saat memuat eav_entity_storecatatan entitas pesanan, terlepas dari tampilan toko yang benar-benar miliknya.

Jika tidak ada catatan seperti itu, Magento membuat, menggunakan store_iddan increment_prefixdari 0.

public function fetchNewIncrementId($storeId = null)
{
    if (!$this->getIncrementModel()) {
        return false;
    }

    if (!$this->getIncrementPerStore() || ($storeId === null)) {
        /**
         * store_id null we can have for entity from removed store
         */
        $storeId = 0;
    }

    // Start transaction to run SELECT ... FOR UPDATE
    $this->_getResource()->beginTransaction();

    $entityStoreConfig = Mage::getModel('eav/entity_store')
        ->loadByEntityStore($this->getId(), $storeId);

    if (!$entityStoreConfig->getId()) {
        $entityStoreConfig
            ->setEntityTypeId($this->getId())
            ->setStoreId($storeId)
            ->setIncrementPrefix($storeId)
            ->save();
    }

    $incrementInstance = Mage::getModel($this->getIncrementModel())
        ->setPrefix($entityStoreConfig->getIncrementPrefix())
        ->setPadLength($this->getIncrementPadLength())
        ->setPadChar($this->getIncrementPadChar())
        ->setLastId($entityStoreConfig->getIncrementLastId())
        ->setEntityTypeId($entityStoreConfig->getEntityTypeId())
        ->setStoreId($entityStoreConfig->getStoreId());

    /**
     * do read lock on eav/entity_store to solve potential timing issues
     * (most probably already done by beginTransaction of entity save)
     */
    $incrementId = $incrementInstance->getNextId();
    $entityStoreConfig->setIncrementLastId($incrementId);
    $entityStoreConfig->save();

    // Commit increment_last_id changes
    $this->_getResource()->commit();

    return $incrementId;
}

Ini harus bekerja untuk semua jenis entitas menggunakan eav/entity_increment_numericmodel seperti order, invoice, shipmentdan creditmemo.

Perlu diketahui, bahwa saya belum dapat menemukan dokumentasi resmi increment_per_store. Dan tidak ada opsi di backend Magento yang memungkinkan Anda mengonfigurasi ini.

Ini mungkin atau mungkin tidak berarti, bahwa itu tidak dianggap digunakan secara resmi.

Gunakan dengan risiko Anda sendiri. Jika perubahan Anda mendatangkan malapetaka, jangan salahkan saya. Anda sudah diperingatkan ^^

Jürgen Thelen
sumber
1

Itu tidak didukung di luar kotak. Saya juga ingin melakukan ini sekali untuk memiliki tampilan toko kedua untuk Uji A / B berbagi increment_id yang sama dari toko asli.

Saya mencoba mencocokkan 2 angka itu dengan cara sederhana ketika checkout_submit_all_afterdipecat, tetapi merasa sangat tidak nyaman dengan itu, jadi saya menjatuhkannya. Saya kira dengan lebih banyak tampilan toko dan banyak lalu lintas ini dapat menghasilkan kekacauan nyata sehingga Anda harus menggali lebih dalam logika Magentos.

mnp
sumber
0

Larutan:

Memiliki urutan berbeda / faktur / creditmemo dll ... kisaran nomor cukup bagus, untuk negara yang berbeda, yang paling sering berarti pada tingkat grup toko.

Tetapi memiliki rentang angka yang berbeda pada tingkat tampilan toko adalah hal yang buruk jika Anda menggunakan tampilan toko untuk bahasa yang berbeda, yang mungkin dilakukan di 90% dari semua kasus.

Untungnya tidak sesulit yang diusulkan di utas ini:

Apa yang akan kita lakukan adalah kita mengambil id tampilan toko default daripada menggunakan id tampilan toko yang dipanggil dengan metode ini . Kami melakukan ini dengan menyelesaikan grup toko untuk tampilan toko saat ini dan mengambil id tampilan toko default. Kemudian setiap tampilan toko dari grup toko tertentu menggunakan format rentang nomor yang sama (yang dari tampilan toko default).

Buat kelas ini:

class Funky_Module_Model_Entity_Type extends Mage_Eav_Model_Entity_Type
{
    /**
     * Retreive new incrementId
     *
     * @param int $storeId
     * @return string
     * @throws Exception
     */
    public function fetchNewIncrementId($storeId = null)
    {
        if (!$this->getIncrementModel()) {
            return false;
        }

        if (!$this->getIncrementPerStore() || ($storeId === null)) {
            /**
             * store_id null we can have for entity from removed store
             */
            $storeId = 0;
        }

        //FIX START:
        $groupId = Mage::getModel('core/store')->load($storeId)->getGroupId();
        $group =  Mage::getModel('core/store_group')->load($groupId);
        $storeId = $group->getDefaultStoreId();
        //FIX END:

        // Start transaction to run SELECT ... FOR UPDATE
        $this->_getResource()->beginTransaction();

        try {

            $entityStoreConfig = Mage::getModel('eav/entity_store')
                ->loadByEntityStore($this->getId(), $storeId);

            if (!$entityStoreConfig->getId()) {
                $entityStoreConfig
                    ->setEntityTypeId($this->getId())
                    ->setStoreId($storeId)
                    ->setIncrementPrefix($storeId)
                    ->save();
            }

            $incrementInstance = Mage::getModel($this->getIncrementModel())
                ->setPrefix($entityStoreConfig->getIncrementPrefix())
                ->setPadLength($this->getIncrementPadLength())
                ->setPadChar($this->getIncrementPadChar())
                ->setLastId($entityStoreConfig->getIncrementLastId())
                ->setEntityTypeId($entityStoreConfig->getEntityTypeId())
                ->setStoreId($entityStoreConfig->getStoreId());

            /**
             * do read lock on eav/entity_store to solve potential timing issues
             * (most probably already done by beginTransaction of entity save)
             */
            $incrementId = $incrementInstance->getNextId();
            $entityStoreConfig->setIncrementLastId($incrementId);
            $entityStoreConfig->save();

            // Commit increment_last_id changes
            $this->_getResource()->commit();
        } catch (Exception $e) {
            $this->_getResource()->rollBack();
            throw $e;
        }

        return $incrementId;
    }

}

Tambahkan penulisan ulang ini ke config.xml modul Anda:

<global>
   <models>
            <eav>
                <rewrite>
                     <entity_type>Gigaset_Core_Model_Entity_Type</entity_type>
                </rewrite>
            </eav> 
    ...

Jika Anda memiliki cara yang lebih baik, tanpa harus menulis ulang menyebarkan pengetahuan. Selamat bersenang-senang. Jangan hack inti.

Michael Leiss
sumber
0

Gunakan di magento2 ... PILIH * DARI sales_sequence_meta

Semua baris sequence_table digunakan pada tabel kenaikan yang sama. Contoh 'sequence_order_1' contoh: sales_sequence_metaSET UPDATE sequence_table= 'sequence_order_1'. dimana meta_id = ?? ()

Catatan: Kosongkan semua sebelumnya Kutipan dan faktur terkait baris ATAU Gunakan pada tabel sequence_value tertinggi pada tabel ini (sequence_order_1, sequence_order_0, sequence_order_2)

Ziaur Rahaman
sumber