magento2-plugin/Setup/UpgradeSchema.php

104 lines
4.5 KiB
PHP

<?php
declare(strict_types=1);
namespace Storefront\BTCPay\Setup;
use Magento\Framework\App\Config\ConfigResource\ConfigInterface;
use Magento\Framework\DB\Ddl\Table;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\SchemaSetupInterface;
use Magento\Framework\Setup\UpgradeSchemaInterface;
use Magento\Framework\Exception\AlreadyExistsException;
use Magento\Sales\Model\Order;
use Magento\Sales\Model\Order\Status;
use Magento\Sales\Model\Order\StatusFactory;
use Magento\Sales\Model\ResourceModel\Order\Status as StatusResource;
use Magento\Sales\Model\ResourceModel\Order\StatusFactory as StatusResourceFactory;
use Storefront\BTCPay\Model\OrderStatuses;
class UpgradeSchema implements UpgradeSchemaInterface
{
/**
* Status Factory
*
* @var StatusFactory
*/
protected $statusFactory;
/**
* Status Resource Factory
*
* @var StatusResourceFactory
*/
protected $statusResourceFactory;
/**
* @var ConfigInterface
*/
private $configResource;
public function __construct(ConfigInterface $configResource, StatusFactory $statusFactory, StatusResourceFactory $statusResourceFactory)
{
$this->configResource = $configResource;
$this->statusFactory = $statusFactory;
$this->statusResourceFactory = $statusResourceFactory;
}
/**
* {@inheritdoc}
*/
public function upgrade(SchemaSetupInterface $setup, ModuleContextInterface $context)
{
$setup->startSetup();
if (version_compare($context->getVersion(), "2.0.0", "<")) {
// Add new column
$setup->getConnection()->addColumn('btcpay_invoices', 'btcpay_store_id', [
'type' => Table::TYPE_TEXT,
'default' => false,
'comment' => 'BTC Pay Server Store ID',
'after' => 'id'
]);
// Update invoice status. Since the v1, they now start with a capital letter.
$setup->getConnection()->query('update btcpay_invoices set status = CONCAT(UPPER(SUBSTRING(status,1,1)),LOWER(SUBSTRING(status,2)))');
// Add new order statuses and assign them to states
$this->addNewStatusToState(Order::STATE_PENDING_PAYMENT, ['status' => OrderStatuses::STATUS_CODE_PENDING_PAYMENT, 'label' => OrderStatuses::STATUS_LABEL_PENDING_PAYMENT]);
$this->addNewStatusToState(Order::STATE_PAYMENT_REVIEW, ['status' => OrderStatuses::STATUS_CODE_INVALID, 'label' => OrderStatuses::STATUS_LABEL_INVALID]);
$this->addNewStatusToState(Order::STATE_PAYMENT_REVIEW, ['status' => OrderStatuses::STATUS_CODE_UNDERPAID, 'label' => OrderStatuses::STATUS_LABEL_UNDERPAID]);
$this->addNewStatusToState(Order::STATE_PROCESSING, ['status' => OrderStatuses::STATUS_CODE_PAID_CORRECTLY, 'label' => OrderStatuses::STATUS_LABEL_PAID_CORRECTLY]);
$this->addNewStatusToState(Order::STATE_PAYMENT_REVIEW, ['status' => OrderStatuses::STATUS_CODE_OVERPAID, 'label' => OrderStatuses::STATUS_LABEL_OVERPAID]);
// Alter btc_invoices(oder_id) to be compatible
$setup->getConnection()->query("ALTER TABLE btcpay_invoices CHANGE order_id order_id INT(10) UNSIGNED NOT NULL COMMENT 'Order ID'");
// Add foreign key from btcpay_invoices to sales_order table for the order entity ID. On delete restrict + On update cascade.
$setup->getConnection()->query('ALTER TABLE btcpay_invoices ADD CONSTRAINT BTCPAY_INVOICES_ORDER_ID_SALES_ORDER_ID FOREIGN KEY (order_id) REFERENCES sales_order(entity_id) ON DELETE RESTRICT ON UPDATE CASCADE');
// Add magento_store_id column to table btcpay_invoice, and a foreign key to the store table
$setup->getConnection()->query("ALTER TABLE btcpay_invoices ADD magento_store_id SMALLINT(5) UNSIGNED NOT NULL, ADD CONSTRAINT BTCPAY_INVOICES_MAGENTO_STORE_ID_STORE_ID FOREIGN KEY (magento_store_id) REFERENCES store(store_id) ON DELETE RESTRICT ON UPDATE CASCADE");
}
$setup->endSetup();
}
protected function addNewStatusToState($state, $statusData): void
{
/** @var StatusResource $statusResource */
$statusResource = $this->statusResourceFactory->create();
/** @var Status $status */
$status = $this->statusFactory->create();
$status->setData($statusData);
try {
$statusResource->save($status);
} catch (AlreadyExistsException $exception) {
return;
}
$status->assignState($state, false, true);
}
}