Newer
Older
TillQliro / Setup / InstallSchema.php
@Jonas Jonsson Jonas Jonsson on 2 Apr 2024 14 KB Initial
<?php
/**
 * Copyright © Qliro AB. All rights reserved.
 * See LICENSE.txt for license details.
 */

// @codingStandardsIgnoreFile
// phpcs:ignoreFile

namespace Qliro\QliroOne\Setup;

use Magento\Framework\DB\Ddl\Table;
use Magento\Framework\Setup\InstallSchemaInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\SchemaSetupInterface;
use Magento\Framework\DB\Adapter\AdapterInterface;
use Qliro\QliroOne\Api\Data\CheckoutStatusInterface;
use Qliro\QliroOne\Model\LogRecord as LogRecordModel;
use Qliro\QliroOne\Model\ResourceModel\LogRecord;
use Qliro\QliroOne\Model\Link as LinkModel;
use Qliro\QliroOne\Model\ResourceModel\Link;
use Qliro\QliroOne\Model\ResourceModel\Lock;
use Qliro\QliroOne\Model\OrderManagementStatus as OrderManagementStatusModel;
use Qliro\QliroOne\Model\ResourceModel\OrderManagementStatus;

class InstallSchema implements InstallSchemaInterface
{
    /**
     * @param SchemaSetupInterface $setup
     * @param ModuleContextInterface $context
     * @throws \Zend_Db_Exception
     */
    public function install(SchemaSetupInterface $setup, ModuleContextInterface $context)
    {
        $installer = $setup;
        $installer->startSetup();

        if (!$installer->tableExists(LogRecord::TABLE_LOG)) {
            $table = $installer->getConnection()
                ->newTable($installer->getTable(LogRecord::TABLE_LOG))
                ->addColumn(
                    LogRecordModel::FIELD_ID,
                    Table::TYPE_INTEGER,
                    null,
                    ['identity' => true, 'unsigned' => true, 'nullable' => false, 'primary' => true],
                    'Log line id'
                )
                ->addColumn(
                    LogRecordModel::FIELD_DATE,
                    Table::TYPE_TIMESTAMP,
                    null,
                    ['nullable' => false, 'default' => Table::TIMESTAMP_INIT],
                    'Date'
                )
                ->addColumn(LogRecordModel::FIELD_LEVEL, Table::TYPE_TEXT, 32, ['nullable' => false], 'Log level')
                ->addColumn(
                    LogRecordModel::FIELD_PROCESS_ID,
                    Table::TYPE_INTEGER,
                    null,
                    ['unsigned' => true, 'nullable' => false],
                    'Process ID'
                )
                ->addColumn(
                    LogRecordModel::FIELD_REFERENCE,
                    Table::TYPE_TEXT,
                    25,
                    [],
                    'Merchant ID')
                ->addColumn(
                    LogRecordModel::FIELD_TAGS,
                    Table::TYPE_TEXT,
                    256,
                    ['unsigned' => true],
                    'Comma separated list of tags')
                ->addColumn(LogRecordModel::FIELD_MESSAGE, Table::TYPE_TEXT, null, [], 'Message')
                ->addColumn(LogRecordModel::FIELD_EXTRA, Table::TYPE_TEXT, null, [], 'Extra data')
                ->addIndex(
                    $installer->getIdxName(LogRecord::TABLE_LOG, [LogRecordModel::FIELD_DATE]),
                    [LogRecordModel::FIELD_DATE]
                )
                ->addIndex(
                    $installer->getIdxName(LogRecord::TABLE_LOG, [LogRecordModel::FIELD_LEVEL]),
                    [LogRecordModel::FIELD_LEVEL]
                )
                ->addIndex(
                    $installer->getIdxName(LogRecord::TABLE_LOG, [LogRecordModel::FIELD_REFERENCE]),
                    [LogRecordModel::FIELD_REFERENCE]
                )
                ->addIndex(
                    $installer->getIdxName(LogRecord::TABLE_LOG, [LogRecordModel::FIELD_PROCESS_ID]),
                    [LogRecordModel::FIELD_PROCESS_ID]
                )
                ->setComment('QliroOne log');
            $installer->getConnection()->createTable($table);
        }

        if (!$installer->tableExists(Link::TABLE_LINK)) {
            $table = $installer->getConnection()
                ->newTable($installer->getTable(Link::TABLE_LINK))
                ->addColumn(
                    LinkModel::FIELD_ID,
                    Table::TYPE_INTEGER,
                    10,
                    ['identity' => true, 'unsigned' => true, 'nullable' => false, 'primary' => true],
                    'Link ID'
                )->addColumn(
                    LinkModel::FIELD_IS_ACTIVE,
                    Table::TYPE_SMALLINT,
                    1,
                    ['unsigned' => true, 'default' => 1, 'nullable' => false],
                    'Flag indicating if link is still in used'
                )
                ->addColumn(
                    LinkModel::FIELD_REFERENCE,
                    Table::TYPE_TEXT,
                    25,
                    ['nullable' => false],
                    'Unique QliroOne order merchant reference'
                )
                ->addColumn(
                    LinkModel::FIELD_QUOTE_ID,
                    Table::TYPE_INTEGER,
                    10,
                    ['unsigned' => true],
                    'Quote ID, null when order has been created'
                )
                ->addColumn(
                    LinkModel::FIELD_QLIRO_ORDER_ID,
                    Table::TYPE_INTEGER,
                    12,
                    ['unsigned' => true],
                    'QliroOne Order ID'
                )
                ->addColumn(
                    LinkModel::FIELD_QLIRO_ORDER_STATUS,
                    Table::TYPE_TEXT,
                    32,
                    ['default' => CheckoutStatusInterface::STATUS_IN_PROCESS],
                    'QliroOne Order Status'
                )
                ->addColumn(
                    LinkModel::FIELD_ORDER_ID,
                    Table::TYPE_INTEGER,
                    10,
                    ['unsigned' => true],
                    'Order ID, null before order has been created'
                )
                ->addColumn(
                    LinkModel::FIELD_QUOTE_SNAPSHOT,
                    Table::TYPE_TEXT,
                    null,
                    ['nullable' => false],
                    'Quote snapshot signature'
                )
                ->addColumn(
                    LinkModel::FIELD_REMOTE_IP,
                    Table::TYPE_TEXT,
                    null,
                    [],
                    'Client IP when link was created'
                )
                ->addColumn(
                    LinkModel::FIELD_CREATED_AT,
                    Table::TYPE_TIMESTAMP,
                    null,
                    ['nullable' => false, 'default' => Table::TIMESTAMP_INIT],
                    'Link creation timestamp'
                )
                ->addColumn(
                    LinkModel::FIELD_UPDATED_AT,
                    Table::TYPE_TIMESTAMP,
                    null,
                    ['nullable' => false, 'default' => Table::TIMESTAMP_INIT],
                    'Link last update timestamp'
                )
                ->addColumn(
                    LinkModel::FIELD_MESSAGE,
                    Table::TYPE_TEXT,
                    null,
                    ['nullable' => true],
                    'Latest message or error message'
                )
                ->addIndex(
                    $installer->getIdxName(Link::TABLE_LINK, [LinkModel::FIELD_IS_ACTIVE]),
                    [LinkModel::FIELD_IS_ACTIVE]
                )
                ->addIndex(
                    $installer->getIdxName(
                        Link::TABLE_LINK,
                        [LinkModel::FIELD_REFERENCE],
                        AdapterInterface::INDEX_TYPE_UNIQUE
                    ),
                    [LinkModel::FIELD_REFERENCE],
                    ['type' => AdapterInterface::INDEX_TYPE_UNIQUE]
                )
                ->addIndex(
                    $installer->getIdxName(Link::TABLE_LINK, [LinkModel::FIELD_QUOTE_ID]),
                    [LinkModel::FIELD_QUOTE_ID]
                )
                ->addIndex(
                    $installer->getIdxName(Link::TABLE_LINK, [LinkModel::FIELD_QLIRO_ORDER_ID]),
                    [LinkModel::FIELD_QLIRO_ORDER_ID]
                )
                ->addIndex(
                    $installer->getIdxName(Link::TABLE_LINK, [LinkModel::FIELD_ORDER_ID]),
                    [LinkModel::FIELD_ORDER_ID]
                )
                ->addIndex(
                    $installer->getIdxName(Link::TABLE_LINK, [LinkModel::FIELD_CREATED_AT]),
                    [LinkModel::FIELD_CREATED_AT]
                )
                ->addIndex(
                    $installer->getIdxName(Link::TABLE_LINK, [LinkModel::FIELD_UPDATED_AT]),
                    [LinkModel::FIELD_UPDATED_AT]
                )
                ->setComment('Link QliroOne orders with Magento');
            $installer->getConnection()->createTable($table);
        }

        if (!$installer->tableExists(Lock::TABLE_LOCK)) {
            $table = $installer->getConnection()
                ->newTable($installer->getTable(Lock::TABLE_LOCK))
                ->addColumn(
                    Lock::FIELD_ID,
                    Table::TYPE_INTEGER,
                    12,
                    ['unsigned' => true, 'nullable' => false],
                    'QliroOne Order ID'
                )
                ->addColumn(
                    Lock::FIELD_CREATED_AT,
                    Table::TYPE_TIMESTAMP,
                    null,
                    ['nullable' => false, 'default' => Table::TIMESTAMP_INIT],
                    'Timestamp when lock was created'
                )
                ->addColumn(
                    Lock::FIELD_PROCESS_ID,
                    Table::TYPE_INTEGER,
                    8,
                    ['unsigned' => true, 'nullable' => false],
                    'PID'
                )
                ->addIndex(
                    $installer->getIdxName(Lock::TABLE_LOCK, [Lock::FIELD_ID], AdapterInterface::INDEX_TYPE_UNIQUE),
                    [Lock::FIELD_ID],
                    ['type' => AdapterInterface::INDEX_TYPE_UNIQUE]
                )
                ->addIndex(
                    $installer->getIdxName(Lock::TABLE_LOCK, [Lock::FIELD_CREATED_AT]),
                    [Lock::FIELD_CREATED_AT]
                )
                ->setComment('Lock for creating Magento order');
            $installer->getConnection()->createTable($table);
        }

        if (!$installer->tableExists(OrderManagementStatus::TABLE_OM_STATUS)) {
            $table = $installer->getConnection()
                ->newTable($installer->getTable(OrderManagementStatus::TABLE_OM_STATUS))
                ->addColumn(
                    OrderManagementStatusModel::FIELD_ID,
                    Table::TYPE_INTEGER,
                    null,
                    ['identity' => true, 'unsigned' => true, 'nullable' => false, 'primary' => true],
                    'Id'
                )
                ->addColumn(
                    OrderManagementStatusModel::FIELD_DATE,
                    Table::TYPE_TIMESTAMP,
                    null,
                    ['nullable' => false, 'default' => Table::TIMESTAMP_INIT],
                    'Date'
                )
                ->addColumn(
                    OrderManagementStatusModel::FIELD_TRANSACTION_ID,
                    Table::TYPE_INTEGER,
                    null,
                    ['unsigned' => true, 'nullable' => false],
                    'Payment Transaction ID'
                )
                ->addColumn(
                    OrderManagementStatusModel::FIELD_RECORD_TYPE,
                    Table::TYPE_TEXT,
                    25,
                    [],
                    'Record Type'
                )
                ->addColumn(
                    OrderManagementStatusModel::FIELD_RECORD_ID,
                    Table::TYPE_INTEGER,
                    null,
                    ['unsigned' => true, 'nullable' => false],
                    'Record ID'
                )
                ->addColumn(
                    OrderManagementStatusModel::FIELD_TRANSACTION_STATUS,
                    Table::TYPE_TEXT,
                    255,
                    [],
                    'Transaction Status'
                )
                ->addColumn(
                    OrderManagementStatusModel::FIELD_NOTIFICATION_STATUS,
                    Table::TYPE_TEXT,
                    10,
                    [],
                    'Notification Status'
                )
                ->addColumn(
                    OrderManagementStatusModel::FIELD_MESSAGE,
                    Table::TYPE_TEXT,
                    null,
                    [],
                    'Possible Message'
                )
                ->addColumn(
                    OrderManagementStatusModel::FIELD_QLIRO_ORDER_ID,
                    Table::TYPE_INTEGER,
                    null,
                    ['unsigned' => true, 'nullable' => false],
                    'Qliro Order Id'
                )->addIndex(
                    $installer->getIdxName(
                        OrderManagementStatus::TABLE_OM_STATUS,
                        [OrderManagementStatusModel::FIELD_DATE]
                    ),
                    [OrderManagementStatusModel::FIELD_DATE]
                )->addIndex(
                    $installer->getIdxName(
                        OrderManagementStatus::TABLE_OM_STATUS,
                        [OrderManagementStatusModel::FIELD_TRANSACTION_ID]
                    ),
                    [OrderManagementStatusModel::FIELD_TRANSACTION_ID]
                )->addIndex(
                    $installer->getIdxName(
                        OrderManagementStatus::TABLE_OM_STATUS,
                        [OrderManagementStatusModel::FIELD_TRANSACTION_STATUS]
                    ),
                    [OrderManagementStatusModel::FIELD_TRANSACTION_STATUS]
                )->addIndex(
                    $installer->getIdxName(
                        OrderManagementStatus::TABLE_OM_STATUS,
                        [OrderManagementStatusModel::FIELD_RECORD_ID]
                    ),
                    [OrderManagementStatusModel::FIELD_RECORD_ID]
                )
                ->setComment('QliroOne OM Notification Statuses');
            $installer->getConnection()->createTable($table);
        }

        $installer->endSetup();
    }
}