UpgradeSchema.php 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554
  1. <?php
  2. /**
  3. * @copyright Vertex. All rights reserved. https://www.vertexinc.com/
  4. * @author Mediotype https://www.mediotype.com/
  5. */
  6. namespace Vertex\Tax\Setup;
  7. use Magento\Framework\DB\Adapter\AdapterInterface;
  8. use Magento\Framework\DB\Ddl\Table;
  9. use Magento\Framework\Module\Setup;
  10. use Magento\Framework\Setup\ModuleContextInterface;
  11. use Magento\Framework\Setup\SchemaSetupInterface;
  12. use Magento\Framework\Setup\UpgradeSchemaInterface;
  13. /**
  14. * Schema Upgrade Script
  15. *
  16. * @codeCoverageIgnore
  17. */
  18. class UpgradeSchema implements UpgradeSchemaInterface
  19. {
  20. /**
  21. * {@inheritdoc}
  22. * @throws \Zend_Db_Exception
  23. */
  24. public function upgrade(
  25. SchemaSetupInterface $setup,
  26. ModuleContextInterface $context
  27. ) {
  28. $installer = $setup;
  29. $db = $installer->getConnection();
  30. if (version_compare($context->getVersion(), '2.0.1') < 0) {
  31. $installer->getConnection()->changeColumn(
  32. $installer->getTable('vertex_taxrequest'),
  33. 'quote_id',
  34. 'quote_id',
  35. [
  36. 'type' => Table::TYPE_BIGINT,
  37. 'length' => 20,
  38. ]
  39. );
  40. $installer->getConnection()->changeColumn(
  41. $installer->getTable('vertex_taxrequest'),
  42. 'order_id',
  43. 'order_id',
  44. [
  45. 'type' => Table::TYPE_BIGINT,
  46. 'length' => 20,
  47. ]
  48. );
  49. }
  50. if (version_compare($context->getVersion(), '100.0.1') < 0) {
  51. $table = $installer->getTable('vertex_taxrequest');
  52. $db->changeColumn(
  53. $table,
  54. 'request_id',
  55. 'request_id',
  56. [
  57. 'type' => Table::TYPE_BIGINT,
  58. 'length' => 20,
  59. 'unsigned' => true,
  60. 'nullable' => false,
  61. 'identity' => true,
  62. 'primary' => true,
  63. ]
  64. );
  65. }
  66. if (version_compare($context->getVersion(), '100.1.0') < 0) {
  67. $this->createCustomerCodeTable($setup);
  68. $this->dropTaxAreaIdColumns($setup);
  69. $this->createVertexInvoiceSentTable($setup);
  70. $this->migrateInvoiceSentData($setup);
  71. $this->deleteInvoiceSentColumnFromInvoiceTable($setup);
  72. }
  73. if (version_compare($context->getVersion(), '100.2.0') < 0) {
  74. $this->createOrderInvoiceStatusTable($setup);
  75. }
  76. if (version_compare($context->getVersion(), '100.3.0') < 0) {
  77. $this->createOrderItemTaxCodeTable($setup);
  78. $this->createOrderItemInvoiceTextCodeTable($setup);
  79. $this->createOrderItemVertexTaxCodeTable($setup);
  80. $this->createCreditmemoItemInvoiceTextCodeTable($setup);
  81. $this->createCreditmemoItemTaxCodeTable($setup);
  82. $this->createCreditmemoItemVertexTaxCodeTable($setup);
  83. }
  84. }
  85. /**
  86. * Create the Vertex Customer Code table
  87. *
  88. * @param SchemaSetupInterface $setup
  89. * @throws \Zend_Db_Exception
  90. */
  91. private function createCustomerCodeTable(SchemaSetupInterface $setup)
  92. {
  93. $tableName = $setup->getTable('vertex_customer_code');
  94. $table = $setup->getConnection()
  95. ->newTable($tableName)
  96. ->addColumn(
  97. 'customer_id',
  98. Table::TYPE_INTEGER,
  99. null,
  100. [
  101. 'primary' => true,
  102. 'nullable' => false,
  103. 'unsigned' => true
  104. ],
  105. 'Customer ID'
  106. )
  107. ->addColumn(
  108. 'customer_code',
  109. Table::TYPE_TEXT,
  110. null,
  111. [
  112. 'nullable' => true,
  113. ],
  114. 'Customer Code for Vertex'
  115. );
  116. $setup->getConnection()
  117. ->createTable($table);
  118. }
  119. /**
  120. * Drop Tax Area IDs from the Address Tables
  121. *
  122. * @param SchemaSetupInterface $setup
  123. */
  124. private function dropTaxAreaIdColumns(SchemaSetupInterface $setup)
  125. {
  126. $orderTable = $setup->getTable('sales_order_address');
  127. if ($this->getConnection($setup, 'sales')->tableColumnExists($orderTable, 'tax_area_id')) {
  128. $this->getConnection($setup, 'sales')->dropColumn($orderTable, 'tax_area_id');
  129. }
  130. $quoteTable = $setup->getTable('quote_address');
  131. if ($this->getConnection($setup, 'checkout')->tableColumnExists($quoteTable, 'tax_area_id')) {
  132. $this->getConnection($setup, 'checkout')->dropColumn($quoteTable, 'tax_area_id');
  133. }
  134. }
  135. /**
  136. * Create the Vertex Invoice Sent table
  137. *
  138. * @param SchemaSetupInterface $setup
  139. * @throws \Zend_Db_Exception
  140. */
  141. private function createVertexInvoiceSentTable(SchemaSetupInterface $setup)
  142. {
  143. $tableName = $setup->getTable('vertex_invoice_sent');
  144. $table = $setup->getConnection()
  145. ->newTable($tableName)
  146. ->addColumn(
  147. 'invoice_id',
  148. Table::TYPE_INTEGER,
  149. null,
  150. [
  151. 'primary' => true,
  152. 'nullable' => false,
  153. 'unsigned' => true,
  154. ],
  155. 'Invoice ID'
  156. )
  157. ->addColumn(
  158. 'sent_to_vertex',
  159. Table::TYPE_BOOLEAN,
  160. null,
  161. [
  162. 'nullable' => false,
  163. 'default' => 0,
  164. ],
  165. 'Invoice has been logged in Vertex'
  166. );
  167. $setup->getConnection()
  168. ->createTable($table);
  169. }
  170. /**
  171. * Migrate Invoice Sent data from the old table column to the new table
  172. *
  173. * @param SchemaSetupInterface $setup
  174. */
  175. private function migrateInvoiceSentData(SchemaSetupInterface $setup)
  176. {
  177. $salesDb = $this->getConnection($setup, 'sales');
  178. $db = $setup->getConnection();
  179. $oldTableName = $setup->getTable('sales_invoice');
  180. $newTableName = $setup->getTable('vertex_invoice_sent');
  181. if (!$salesDb->tableColumnExists($oldTableName, 'vertex_invoice_sent')) {
  182. return;
  183. }
  184. $select = $salesDb->select()
  185. ->from($oldTableName)
  186. ->where('vertex_invoice_sent = 1');
  187. $results = array_map(
  188. function ($rawResult) {
  189. return [
  190. 'invoice_id' => $rawResult['entity_id'],
  191. 'sent_to_vertex' => 1,
  192. ];
  193. },
  194. $salesDb->fetchAll($select)
  195. );
  196. if (!count($results)) {
  197. return;
  198. }
  199. $db->insertMultiple(
  200. $newTableName,
  201. $results
  202. );
  203. }
  204. /**
  205. * Delete the old Invoice Sent column from the Invoice table
  206. *
  207. * @param SchemaSetupInterface $setup
  208. */
  209. private function deleteInvoiceSentColumnFromInvoiceTable(SchemaSetupInterface $setup)
  210. {
  211. $table = $setup->getTable('sales_invoice');
  212. if ($this->getConnection($setup, 'sales')->tableColumnExists($table, 'vertex_invoice_sent')) {
  213. $this->getConnection($setup, 'sales')->dropColumn($table, 'vertex_invoice_sent');
  214. }
  215. }
  216. /**
  217. * Create a table holding a boolean flag for whether or not a Vertex Invoice has been sent for the order
  218. *
  219. * @param SchemaSetupInterface $setup
  220. */
  221. private function createOrderInvoiceStatusTable(SchemaSetupInterface $setup)
  222. {
  223. $tableName = $setup->getTable('vertex_order_invoice_status');
  224. $table = $setup->getConnection()
  225. ->newTable($tableName)
  226. ->addColumn(
  227. 'order_id',
  228. Table::TYPE_INTEGER,
  229. null,
  230. [
  231. 'primary' => true,
  232. 'nullable' => false,
  233. 'unsigned' => true,
  234. ],
  235. 'Order ID'
  236. )
  237. ->addColumn(
  238. 'sent_to_vertex',
  239. Table::TYPE_BOOLEAN,
  240. null,
  241. [
  242. 'nullable' => false,
  243. 'default' => 0,
  244. ],
  245. 'Invoice has been logged in Vertex'
  246. );
  247. $setup->getConnection()
  248. ->createTable($table);
  249. }
  250. /**
  251. * Create a table holding a string with invoice text code for order item from Vertex Invoice request
  252. *
  253. * @param SchemaSetupInterface $setup
  254. */
  255. private function createOrderItemInvoiceTextCodeTable(SchemaSetupInterface $setup)
  256. {
  257. $tableName = $setup->getTable('vertex_sales_order_item_invoice_text_code');
  258. $table = $setup->getConnection()
  259. ->newTable($tableName)
  260. ->addColumn(
  261. 'item_id',
  262. Table::TYPE_INTEGER,
  263. null,
  264. [
  265. 'primary' => false,
  266. 'nullable' => false,
  267. 'unsigned' => true,
  268. ],
  269. 'Order Item ID'
  270. )
  271. ->addColumn(
  272. 'invoice_text_code',
  273. Table::TYPE_TEXT,
  274. 100,
  275. [
  276. 'nullable' => false,
  277. ],
  278. 'Invoice text code from Vertex'
  279. )->addIndex(
  280. $setup->getIdxName(
  281. $tableName,
  282. ['item_id', 'invoice_text_code'],
  283. \Magento\Framework\DB\Adapter\AdapterInterface::INDEX_TYPE_UNIQUE
  284. ),
  285. ['item_id', 'invoice_text_code'],
  286. ['type' => \Magento\Framework\DB\Adapter\AdapterInterface::INDEX_TYPE_UNIQUE]
  287. );
  288. $setup->getConnection()
  289. ->createTable($table);
  290. }
  291. /**
  292. * Create a table holding a string with tax code for order item from Vertex Invoice request
  293. *
  294. * @param SchemaSetupInterface $setup
  295. */
  296. private function createOrderItemTaxCodeTable(SchemaSetupInterface $setup)
  297. {
  298. $tableName = $setup->getTable('vertex_sales_order_item_tax_code');
  299. $table = $setup->getConnection()
  300. ->newTable($tableName)
  301. ->addColumn(
  302. 'item_id',
  303. Table::TYPE_INTEGER,
  304. null,
  305. [
  306. 'primary' => false,
  307. 'nullable' => false,
  308. 'unsigned' => true,
  309. ],
  310. 'Order Item ID'
  311. )
  312. ->addColumn(
  313. 'tax_code',
  314. Table::TYPE_TEXT,
  315. 100,
  316. [
  317. 'nullable' => false,
  318. ],
  319. 'Invoice text code from Vertex'
  320. )->addIndex(
  321. $setup->getIdxName(
  322. $tableName,
  323. ['item_id', 'tax_code'],
  324. \Magento\Framework\DB\Adapter\AdapterInterface::INDEX_TYPE_UNIQUE
  325. ),
  326. ['item_id', 'tax_code'],
  327. ['type' => \Magento\Framework\DB\Adapter\AdapterInterface::INDEX_TYPE_UNIQUE]
  328. );
  329. $setup->getConnection()
  330. ->createTable($table);
  331. }
  332. /**
  333. * Create a table holding a string with vertex tax code for order item from Vertex Invoice request
  334. *
  335. * @param SchemaSetupInterface $setup
  336. */
  337. private function createOrderItemVertexTaxCodeTable(SchemaSetupInterface $setup)
  338. {
  339. $tableName = $setup->getTable('vertex_sales_order_item_vertex_tax_code');
  340. $table = $setup->getConnection()
  341. ->newTable($tableName)
  342. ->addColumn(
  343. 'item_id',
  344. Table::TYPE_INTEGER,
  345. null,
  346. [
  347. 'primary' => false,
  348. 'nullable' => false,
  349. 'unsigned' => true,
  350. ],
  351. 'Order Item ID'
  352. )->addColumn(
  353. 'vertex_tax_code',
  354. Table::TYPE_TEXT,
  355. 100,
  356. [
  357. 'nullable' => false,
  358. ],
  359. 'Text code from Vertex'
  360. )->addIndex(
  361. $setup->getIdxName(
  362. $tableName,
  363. ['item_id', 'vertex_tax_code'],
  364. \Magento\Framework\DB\Adapter\AdapterInterface::INDEX_TYPE_UNIQUE
  365. ),
  366. ['item_id', 'vertex_tax_code'],
  367. ['type' => \Magento\Framework\DB\Adapter\AdapterInterface::INDEX_TYPE_UNIQUE]
  368. );
  369. $setup->getConnection()
  370. ->createTable($table);
  371. }
  372. /**
  373. * Create a table holding a string with invoice text code for creditmemo item from Vertex Invoice request
  374. *
  375. * @param SchemaSetupInterface $setup
  376. */
  377. private function createCreditmemoItemInvoiceTextCodeTable(SchemaSetupInterface $setup)
  378. {
  379. $tableName = $setup->getTable('vertex_sales_creditmemo_item_invoice_text_code');
  380. $table = $setup->getConnection()
  381. ->newTable($tableName)
  382. ->addColumn(
  383. 'item_id',
  384. Table::TYPE_INTEGER,
  385. null,
  386. [
  387. 'primary' => false,
  388. 'nullable' => false,
  389. 'unsigned' => true,
  390. ],
  391. 'Creditmemo Item ID'
  392. )
  393. ->addColumn(
  394. 'invoice_text_code',
  395. Table::TYPE_TEXT,
  396. 100,
  397. [
  398. 'nullable' => false,
  399. ],
  400. 'Invoice text code from Vertex'
  401. )->addIndex(
  402. $setup->getIdxName(
  403. $tableName,
  404. ['item_id', 'invoice_text_code'],
  405. \Magento\Framework\DB\Adapter\AdapterInterface::INDEX_TYPE_UNIQUE
  406. ),
  407. ['item_id', 'invoice_text_code'],
  408. ['type' => \Magento\Framework\DB\Adapter\AdapterInterface::INDEX_TYPE_UNIQUE]
  409. );
  410. $setup->getConnection()
  411. ->createTable($table);
  412. }
  413. /**
  414. * Create a table holding a string with tax code for creditmemo item from Vertex Invoice request
  415. *
  416. * @param SchemaSetupInterface $setup
  417. */
  418. private function createCreditmemoItemTaxCodeTable(SchemaSetupInterface $setup)
  419. {
  420. $tableName = $setup->getTable('vertex_sales_creditmemo_item_tax_code');
  421. $table = $setup->getConnection()
  422. ->newTable($tableName)
  423. ->addColumn(
  424. 'item_id',
  425. Table::TYPE_INTEGER,
  426. null,
  427. [
  428. 'primary' => false,
  429. 'nullable' => false,
  430. 'unsigned' => true,
  431. ],
  432. 'Creditmemo Item ID'
  433. )
  434. ->addColumn(
  435. 'tax_code',
  436. Table::TYPE_TEXT,
  437. 100,
  438. [
  439. 'nullable' => false,
  440. ],
  441. 'Invoice text code from Vertex'
  442. )->addIndex(
  443. $setup->getIdxName(
  444. $tableName,
  445. ['item_id', 'tax_code'],
  446. \Magento\Framework\DB\Adapter\AdapterInterface::INDEX_TYPE_UNIQUE
  447. ),
  448. ['item_id', 'tax_code'],
  449. ['type' => \Magento\Framework\DB\Adapter\AdapterInterface::INDEX_TYPE_UNIQUE]
  450. );
  451. $setup->getConnection()
  452. ->createTable($table);
  453. }
  454. /**
  455. * Create a table holding a string with vertex tax code for creditmemo item from Vertex Invoice request
  456. *
  457. * @param SchemaSetupInterface $setup
  458. */
  459. private function createCreditmemoItemVertexTaxCodeTable(SchemaSetupInterface $setup)
  460. {
  461. $tableName = $setup->getTable('vertex_sales_creditmemo_item_vertex_tax_code');
  462. $table = $setup->getConnection()
  463. ->newTable($tableName)
  464. ->addColumn(
  465. 'item_id',
  466. Table::TYPE_INTEGER,
  467. null,
  468. [
  469. 'primary' => false,
  470. 'nullable' => false,
  471. 'unsigned' => true,
  472. ],
  473. 'Creditmemo Item ID'
  474. )->addColumn(
  475. 'vertex_tax_code',
  476. Table::TYPE_TEXT,
  477. 100,
  478. [
  479. 'nullable' => false,
  480. ],
  481. 'Text code from Vertex'
  482. )->addIndex(
  483. $setup->getIdxName(
  484. $tableName,
  485. ['item_id', 'vertex_tax_code'],
  486. \Magento\Framework\DB\Adapter\AdapterInterface::INDEX_TYPE_UNIQUE
  487. ),
  488. ['item_id', 'vertex_tax_code'],
  489. ['type' => \Magento\Framework\DB\Adapter\AdapterInterface::INDEX_TYPE_UNIQUE]
  490. );
  491. $setup->getConnection()
  492. ->createTable($table);
  493. }
  494. /**
  495. * Retrieve Connection
  496. *
  497. * @param SchemaSetupInterface $setup
  498. * @param string $connectionName
  499. * @return AdapterInterface
  500. */
  501. private function getConnection(SchemaSetupInterface $setup, $connectionName)
  502. {
  503. if ($setup instanceof Setup) {
  504. return $setup->getConnection($connectionName);
  505. }
  506. return $setup->getConnection();
  507. }
  508. }