Você pode se deparar com o seguinte erro ao tentar finalizar um pedido:
Cenário:
- Pedido que contém um produto de assinatura (recorrente)
- Cliente está se registrando na loja (novo cliente fazendo um pedido)
- Magento 1.x
Nos logs do Magento (var/log/exception.log) você talvez encontre algo como o stack abaixo:
Next Zend_Db_Statement_Exception: SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`pagseguro_exemplo`.`sales_recurring_profile`, CONSTRAINT `FK_SALES_RECURRING_PROFILE_CUSTOMER_ID_CUSTOMER_ENTITY_ENTITY_ID` FOREIGN KEY (`customer_id`) REFERENCES `customer_entity` (`entity_i), query was: INSERT INTO `sales_recurring_profile` (`state`, `customer_id`, `store_id`, `method_code`, `created_at`, `updated_at`, `start_datetime`, `internal_reference_id`, `schedule_description`, `period_unit`, `period_frequency`, `billing_amount`, `currency_code`, `order_info`, `order_item_info`, `billing_address_info`, `shipping_address_info`, `profile_vendor_info`, `additional_info`) VALUES (\?, \?, \?, \?, '2020-06-04 06:13:49', '2020-06-04 06:13:49', '2020-06-04 06:13:49', \?, \?, \?, \?, \?, \?, \?, \?, \?, \?, \?, \?) in /pasta/magento/lib/Zend/Db/Statement/Pdo.php:235
Stack trace:
#0 /pasta/magento/lib/Varien/Db/Statement/Pdo/Mysql.php(110): Zend_Db_Statement_Pdo->_execute(Array)
#1 /pasta/magento/app/code/core/Zend/Db/Statement.php(291): Varien_Db_Statement_Pdo_Mysql->_execute(Array)
#2 /pasta/magento/lib/Zend/Db/Adapter/Abstract.php(480): Zend_Db_Statement->execute(Array)
#3 /pasta/magento/lib/Zend/Db/Adapter/Pdo/Abstract.php(238): Zend_Db_Adapter_Abstract->query('INSERT INTO `sa...', Array)
#4 /pasta/magento/lib/Varien/Db/Adapter/Pdo/Mysql.php(504): Zend_Db_Adapter_Pdo_Abstract->query('INSERT INTO `sa...', Array)
#5 /pasta/magento/lib/Zend/Db/Adapter/Abstract.php(576): Varien_Db_Adapter_Pdo_Mysql->query('INSERT INTO `sa...', Array)
#6 /pasta/magento/app/code/core/Mage/Core/Model/Resource/Db/Abstract.php(453): Zend_Db_Adapter_Abstract->insert('sales_recurring...', Array)
#7 /pasta/magento/app/code/core/Mage/Core/Model/Abstract.php(318): Mage_Core_Model_Resource_Db_Abstract->save(Object(Mage_Sales_Model_Recurring_Profile))
#8 /pasta/magento/app/code/core/Mage/Sales/Model/Recurring/Profile.php(152): Mage_Core_Model_Abstract->save()
#9 /pasta/magento/app/code/core/Mage/Sales/Model/Service/Quote.php(331): Mage_Sales_Model_Recurring_Profile->submit()
#10 /pasta/magento/app/code/core/Mage/Sales/Model/Service/Quote.php(223): Mage_Sales_Model_Service_Quote->_submitRecurringPaymentProfiles()
#11 /pasta/magento/app/code/core/Mage/Sales/Model/Service/Quote.php(238): Mage_Sales_Model_Service_Quote->submitNominalItems()
#12 /pasta/magento/app/code/core/Mage/Checkout/Model/Type/Onepage.php(819): Mage_Sales_Model_Service_Quote->submitAll()
#13 /pasta/magento/app/code/core/Mage/Checkout/controllers/OnepageController.php(602): Mage_Checkout_Model_Type_Onepage->saveOrder()
#14 /pasta/magento/app/code/core/Mage/Core/Controller/Varien/Action.php(418): Mage_Checkout_OnepageController->saveOrderAction()
#15 /pasta/magento/app/code/core/Mage/Core/Controller/Varien/Router/Standard.php(254): Mage_Core_Controller_Varien_Action->dispatch('saveOrder')
#16 /pasta/magento/app/code/core/Mage/Core/Controller/Varien/Front.php(172): Mage_Core_Controller_Varien_Router_Standard->match(Object(Mage_Core_Controller_Request_Http))
#17 /pasta/magento/app/code/core/Mage/Core/Model/App.php(381): Mage_Core_Controller_Varien_Front->dispatch()
#18 /pasta/magento/app/Mage.php(686): Mage_Core_Model_App->run(Array)
#19 /pasta/magento/index.php(83): Mage::run('', 'store')
#20 /Users/martins/.composer/vendor/weprovide/valet-plus/server.php(131): require('/Users/martins/...')
#21 {main}
Causa do erro
O erro se dá por conta de um bug nativo do Magento. Este problema é pouco explorado e pouco documentado por aí pois quase ninguém usa ou explorou suficientemente os recursos de recorrência da plataforma.
Basicamente, o banco de dados do Magento espera que o campo que identifica o cliente na tabela de recorrência exista na tabela de clientes. Porém, quando o cliente está se registrando ao mesmo tempo que está assinando um de seus produtos, o Magento não cria o cadastro do cliente em sua loja. Desta forma, um erro de chave não esperado no banco de dados acontece.
Como resolver
A forma mais rápida de resolver o problema é removendo este vínculo. Para fazer isso, execute o SQL abaixo na sua base de dados:
alter table sales_recurring_profile
drop foreign key FK_SALES_RECURRING_PROFILE_CUSTOMER_ID_CUSTOMER_ENTITY_ENTITY_ID;
Como voltar atrás
Caso por alguma razão você queira recriar a relação que acabamos de apagar, execute o SQL abaixo em sua base de dados:
alter table sales_recurring_profile
add constraint FK_SALES_RECURRING_PROFILE_CUSTOMER_ID_CUSTOMER_ENTITY_ENTITY_ID
foreign key (customer_id) references customer_entity (entity_id)
on update cascade on delete set null;
Comentários
0 comentário
Por favor, entre para comentar.