Ошибка сохранения заказа Magento: нарушение ограничения целостности - PullRequest
4 голосов
/ 13 марта 2012

Я получаю следующую ошибку при оформлении заказа с помощью кредитной / дебетовой карты в Magento:

Order saving error: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '282-189' for key 2

Я не смог получить точный след, поскольку он просто не хотел показывать, чтомне, однако, я проследил его обратно до app/code/core/Mage/Checkout/controllers/OnepageController.php в строке 501 (неотредактировано).Точная строка:

$this->getOnepage()->saveOrder();

Теперь, логика подсказывает мне, что это всего лишь два ордера, имеющие одинаковый ключ при попытке добавить ордер, или я совершенно не прав?

В любом случае, таккроме этого, каков наилучший способ исправить это?Я думал об экспорте заказов, их удалении и повторном импорте, но я чувствую, что это не сработает.

Я использую Magento 1.6.2.0

РЕДАКТИРОВАТЬЯ только что понял, что если я выясню, какая таблица не проходит проверку целостности, я мог бы потенциально очистить эту таблицу (в зависимости от того, какая таблица это), и это исправило бы ее самостоятельно?Любые идеи о том, как выяснить, в какой таблице происходит сбой?

EDIT2: Таким образом, после ответа Огуза Челикдемира выясняется, что виновником является следующее:

2012-03-14T13:59:01+00:00 DEBUG (7): SQL: INSERT INTO `sales_order_tax_item` (`tax_id`, `item_id`, `tax_percent`) VALUES (?, ?, ?) (254, 8, 10)
2012-03-14T13:59:01+00:00 DEBUG (7): SQL: INSERT INTO `sales_order_tax_item` (`tax_id`, `item_id`, `tax_percent`) VALUES (?, ?, ?) (254, 8, 10)

Очевидно, что два одинаковыхtax_id не может быть вставлен.Кто-нибудь есть идеи, как это исправить?

Ответы [ 3 ]

3 голосов
/ 14 марта 2012

Обрезать следующие log таблицы. Чтобы защитить себя, сделайте резервную копию с CONSOLE, а не с Magento.

TRUNCATE `log_customer`;
ALTER TABLE `log_customer` AUTO_INCREMENT=1;
TRUNCATE `log_quote`;
ALTER TABLE `log_quote` AUTO_INCREMENT=1;
TRUNCATE `log_summary`;
ALTER TABLE `log_summary` AUTO_INCREMENT=1;
TRUNCATE `log_visitor_info`;
ALTER TABLE `log_visitor_info` AUTO_INCREMENT=1;
TRUNCATE `log_url`;
ALTER TABLE `log_url` AUTO_INCREMENT=1;
TRUNCATE `log_url_info`;
ALTER TABLE `log_url_info` AUTO_INCREMENT=1;
TRUNCATE `log_visitor`;
ALTER TABLE `log_visitor` AUTO_INCREMENT=1;
TRUNCATE `report_event`;
ALTER TABLE `report_event` AUTO_INCREMENT=1;
TRUNCATE `log_summary_type`;
ALTER TABLE `log_summary_type` AUTO_INCREMENT=1;

РЕДАКТИРОВАТЬ: Для отладки SQL откройте файл /lib/Varien/Db/Adapter/Pdo/Mysql.php и найдите protected $_debug. Статус по умолчанию должен быть false, изменить на true.

После этого файл журнала должен быть доступен в var/debug/sql.txt

Кроме того, возьмите этот ответ stackoverflow Как мне распечатать все запросы в Magento?

РЕДАКТИРОВАТЬ 2: Итак, вот ваши файлы, которые обрабатывают налог с продаж. app/code/core/Mage/Tax/Model/Observer/Observer.php

# Line 144 ( Magento 1.6 edition )
Mage::getModel('tax/sales_order_tax_item')->setData($data)->save();

который звонит sales_order_tax_item модель.

app/core/Mage/Tax/Model/Resource/Sales/Order/Tax/Itemp.php

# Line 51
public function getTaxItemsByItemId($item_id)
{
    $adapter = $this->_getReadAdapter();
    $select = $adapter->select()
        ->from(array('item' => $this->getTable('tax/sales_order_tax_item')), array('tax_id', 'tax_percent'))
        ->join(
            array('tax' => $this->getTable('tax/sales_order_tax')),
            'item.tax_id = tax.tax_id',
            array('title', 'percent', 'base_amount')
        )
        ->where('item_id = ?', $item_id);

    return $adapter->fetchAll($select);
}

Вот функция, которая вызывается из Observer. Итак, что вы можете сделать сейчас, просто добавьте точку останова в Observer или Function и посмотрите выходные данные отладчика. Зачем два раза вызывать эту функцию!

2 голосов
/ 04 декабря 2012

Перейдите в раздел Sales -> Tax -> Manage Tax Rules в панели администратора и проверьте все записи там на предмет дубликатов отношений zone-class.

В моем случае у меня была та же ошибка на странице оформления заказа для продуктов, которые имели налоговый класс "Налогооблагаемые товары", и в Налоговых правилах у меня было две записи для этого класса, и каждая запись была с одной и той же налоговой зоной. Поэтому система попыталась дважды применить один и тот же налог для продукта.

2 голосов
/ 14 марта 2012

Я нашел быстрый грязный хак. Я постараюсь опубликовать это как ошибку для разработчиков. откройте файл app/code/core/Mmage/Tax/Model/Observer.php и перейдите к строке 132. Внутри этого оператора есть оператор if($item), оберните код следующим образом:

$define = 'FIX_'.$item->getId().'_'.$result->getTaxId();
if(!defined($define) || constant($define) != true) {
            // code
    define($define, true);
}

Пример:

if (isset($ratesIdQuoteItemId[$id])) {
    foreach ($ratesIdQuoteItemId[$id] as $quoteItemId) {
        if ($quoteItemId['code'] == $tax['code']) {
            $item = $order->getItemByQuoteItemId($quoteItemId['id']);
            if ($item) {
                $define = 'FIX_'.$item->getId().'_'.$result->getTaxId();
                if(!defined($define) || constant($define) != true) {
                    $data = array(
                        'item_id'       => $item->getId(),
                        'tax_id'        => $result->getTaxId(),
                        'tax_percent'   => $quoteItemId['percent']
                    );
                    Mage::getModel('tax/sales_order_tax_item')->setData($data)->save();
                    define($define, true);
                }
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...