@@ -27,162 +27,162 @@ |
||
| 27 | 27 | */ |
| 28 | 28 | class EE_DMS_4_1_0_question_group_question extends EE_Data_Migration_Script_Stage |
| 29 | 29 | { |
| 30 | - public function __construct() |
|
| 31 | - { |
|
| 32 | - global $wpdb; |
|
| 33 | - $this->_old_table = $wpdb->prefix . "events_qst_group_rel"; |
|
| 34 | - $this->_new_table = $wpdb->prefix . "esp_question_group_question"; |
|
| 35 | - $this->_pretty_name = esc_html__("Question Group to Question Relations", "event_espresso"); |
|
| 36 | - parent::__construct(); |
|
| 37 | - } |
|
| 30 | + public function __construct() |
|
| 31 | + { |
|
| 32 | + global $wpdb; |
|
| 33 | + $this->_old_table = $wpdb->prefix . "events_qst_group_rel"; |
|
| 34 | + $this->_new_table = $wpdb->prefix . "esp_question_group_question"; |
|
| 35 | + $this->_pretty_name = esc_html__("Question Group to Question Relations", "event_espresso"); |
|
| 36 | + parent::__construct(); |
|
| 37 | + } |
|
| 38 | 38 | |
| 39 | 39 | |
| 40 | - /** |
|
| 41 | - * @throws EE_Error |
|
| 42 | - */ |
|
| 43 | - public function _migration_step($num_items_to_migrate = 50) |
|
| 44 | - { |
|
| 45 | - global $wpdb; |
|
| 46 | - $start_at_record = $this->count_records_migrated(); |
|
| 47 | - $rows = $wpdb->get_results( |
|
| 48 | - $wpdb->prepare( |
|
| 49 | - "SELECT * FROM $this->_old_table LIMIT %d,%d", |
|
| 50 | - $start_at_record, |
|
| 51 | - $num_items_to_migrate |
|
| 52 | - ), |
|
| 53 | - ARRAY_A |
|
| 54 | - ); |
|
| 55 | - $items_actually_migrated = 0; |
|
| 56 | - foreach ($rows as $question_group_question) { |
|
| 57 | - $this->_insert_new_question_group_question($question_group_question); |
|
| 58 | - $items_actually_migrated++; |
|
| 59 | - } |
|
| 60 | - if ($this->count_records_migrated() + $items_actually_migrated >= $this->count_records_to_migrate()) { |
|
| 61 | - $this->set_completed(); |
|
| 62 | - } |
|
| 63 | - return $items_actually_migrated; |
|
| 64 | - } |
|
| 40 | + /** |
|
| 41 | + * @throws EE_Error |
|
| 42 | + */ |
|
| 43 | + public function _migration_step($num_items_to_migrate = 50) |
|
| 44 | + { |
|
| 45 | + global $wpdb; |
|
| 46 | + $start_at_record = $this->count_records_migrated(); |
|
| 47 | + $rows = $wpdb->get_results( |
|
| 48 | + $wpdb->prepare( |
|
| 49 | + "SELECT * FROM $this->_old_table LIMIT %d,%d", |
|
| 50 | + $start_at_record, |
|
| 51 | + $num_items_to_migrate |
|
| 52 | + ), |
|
| 53 | + ARRAY_A |
|
| 54 | + ); |
|
| 55 | + $items_actually_migrated = 0; |
|
| 56 | + foreach ($rows as $question_group_question) { |
|
| 57 | + $this->_insert_new_question_group_question($question_group_question); |
|
| 58 | + $items_actually_migrated++; |
|
| 59 | + } |
|
| 60 | + if ($this->count_records_migrated() + $items_actually_migrated >= $this->count_records_to_migrate()) { |
|
| 61 | + $this->set_completed(); |
|
| 62 | + } |
|
| 63 | + return $items_actually_migrated; |
|
| 64 | + } |
|
| 65 | 65 | |
| 66 | 66 | |
| 67 | - public function _count_records_to_migrate() |
|
| 68 | - { |
|
| 69 | - global $wpdb; |
|
| 70 | - return $wpdb->get_var("SELECT COUNT(id) FROM " . $this->_old_table); |
|
| 71 | - } |
|
| 67 | + public function _count_records_to_migrate() |
|
| 68 | + { |
|
| 69 | + global $wpdb; |
|
| 70 | + return $wpdb->get_var("SELECT COUNT(id) FROM " . $this->_old_table); |
|
| 71 | + } |
|
| 72 | 72 | |
| 73 | 73 | |
| 74 | - /** |
|
| 75 | - * Attempts to insert a new question group in the new format given an old one |
|
| 76 | - * |
|
| 77 | - * @param array $old_question_group_question |
|
| 78 | - * @return void |
|
| 79 | - * @throws EE_Error |
|
| 80 | - * @global wpdb $wpdb |
|
| 81 | - */ |
|
| 82 | - private function _insert_new_question_group_question(array $old_question_group_question): void |
|
| 83 | - { |
|
| 84 | - global $wpdb; |
|
| 85 | - $new_question_id = $this->get_migration_script()->get_mapping_new_pk( |
|
| 86 | - $wpdb->prefix . "events_question", |
|
| 87 | - $old_question_group_question['question_id'], |
|
| 88 | - $wpdb->prefix . "esp_question" |
|
| 89 | - ); |
|
| 90 | - $new_question_group_id = $this->get_migration_script()->get_mapping_new_pk( |
|
| 91 | - $wpdb->prefix . "events_qst_group", |
|
| 92 | - $old_question_group_question['group_id'], |
|
| 93 | - $wpdb->prefix . "esp_question_group" |
|
| 94 | - ); |
|
| 95 | - if (! $new_question_id) { |
|
| 96 | - $this->add_error( |
|
| 97 | - sprintf( |
|
| 98 | - esc_html__("Could not find 4.1 question id for 3.1 question #%d.", "event_espresso"), |
|
| 99 | - $old_question_group_question['question_id'] |
|
| 100 | - ) |
|
| 101 | - ); |
|
| 102 | - return; |
|
| 103 | - } |
|
| 104 | - if (! $new_question_group_id) { |
|
| 105 | - $this->add_error( |
|
| 106 | - sprintf( |
|
| 107 | - esc_html__("Could not find 4.1 question group id for 3.1 question group #%d.", "event_espresso"), |
|
| 108 | - $old_question_group_question['group_id'] |
|
| 109 | - ) |
|
| 110 | - ); |
|
| 111 | - return; |
|
| 112 | - } |
|
| 113 | - // if it's a system question, it needs to be in the right system group. otherwise no dice! |
|
| 114 | - if ( |
|
| 115 | - ($this->_is_system_question_group($new_question_group_id) == |
|
| 116 | - $this->_is_system_question_for_question_group($new_question_id)) || |
|
| 117 | - ! $this->_is_system_question_for_question_group($new_question_id) |
|
| 118 | - ) { |
|
| 119 | - $cols_n_values = [ |
|
| 120 | - 'QSG_ID' => $new_question_group_id, |
|
| 121 | - 'QST_ID' => $new_question_id, |
|
| 122 | - ]; |
|
| 123 | - $data_types = [ |
|
| 124 | - '%d',// QSG_ID |
|
| 125 | - '%d',// QST_ID |
|
| 126 | - ]; |
|
| 127 | - $success = $wpdb->insert($this->_new_table, $cols_n_values, $data_types); |
|
| 128 | - if (! $success) { |
|
| 129 | - $this->add_error( |
|
| 130 | - $this->get_migration_script()->_create_error_message_for_db_insertion( |
|
| 131 | - $this->_old_table, |
|
| 132 | - $old_question_group_question, |
|
| 133 | - $this->_new_table, |
|
| 134 | - $cols_n_values, |
|
| 135 | - $data_types |
|
| 136 | - ) |
|
| 137 | - ); |
|
| 138 | - } |
|
| 139 | - } |
|
| 140 | - } |
|
| 74 | + /** |
|
| 75 | + * Attempts to insert a new question group in the new format given an old one |
|
| 76 | + * |
|
| 77 | + * @param array $old_question_group_question |
|
| 78 | + * @return void |
|
| 79 | + * @throws EE_Error |
|
| 80 | + * @global wpdb $wpdb |
|
| 81 | + */ |
|
| 82 | + private function _insert_new_question_group_question(array $old_question_group_question): void |
|
| 83 | + { |
|
| 84 | + global $wpdb; |
|
| 85 | + $new_question_id = $this->get_migration_script()->get_mapping_new_pk( |
|
| 86 | + $wpdb->prefix . "events_question", |
|
| 87 | + $old_question_group_question['question_id'], |
|
| 88 | + $wpdb->prefix . "esp_question" |
|
| 89 | + ); |
|
| 90 | + $new_question_group_id = $this->get_migration_script()->get_mapping_new_pk( |
|
| 91 | + $wpdb->prefix . "events_qst_group", |
|
| 92 | + $old_question_group_question['group_id'], |
|
| 93 | + $wpdb->prefix . "esp_question_group" |
|
| 94 | + ); |
|
| 95 | + if (! $new_question_id) { |
|
| 96 | + $this->add_error( |
|
| 97 | + sprintf( |
|
| 98 | + esc_html__("Could not find 4.1 question id for 3.1 question #%d.", "event_espresso"), |
|
| 99 | + $old_question_group_question['question_id'] |
|
| 100 | + ) |
|
| 101 | + ); |
|
| 102 | + return; |
|
| 103 | + } |
|
| 104 | + if (! $new_question_group_id) { |
|
| 105 | + $this->add_error( |
|
| 106 | + sprintf( |
|
| 107 | + esc_html__("Could not find 4.1 question group id for 3.1 question group #%d.", "event_espresso"), |
|
| 108 | + $old_question_group_question['group_id'] |
|
| 109 | + ) |
|
| 110 | + ); |
|
| 111 | + return; |
|
| 112 | + } |
|
| 113 | + // if it's a system question, it needs to be in the right system group. otherwise no dice! |
|
| 114 | + if ( |
|
| 115 | + ($this->_is_system_question_group($new_question_group_id) == |
|
| 116 | + $this->_is_system_question_for_question_group($new_question_id)) || |
|
| 117 | + ! $this->_is_system_question_for_question_group($new_question_id) |
|
| 118 | + ) { |
|
| 119 | + $cols_n_values = [ |
|
| 120 | + 'QSG_ID' => $new_question_group_id, |
|
| 121 | + 'QST_ID' => $new_question_id, |
|
| 122 | + ]; |
|
| 123 | + $data_types = [ |
|
| 124 | + '%d',// QSG_ID |
|
| 125 | + '%d',// QST_ID |
|
| 126 | + ]; |
|
| 127 | + $success = $wpdb->insert($this->_new_table, $cols_n_values, $data_types); |
|
| 128 | + if (! $success) { |
|
| 129 | + $this->add_error( |
|
| 130 | + $this->get_migration_script()->_create_error_message_for_db_insertion( |
|
| 131 | + $this->_old_table, |
|
| 132 | + $old_question_group_question, |
|
| 133 | + $this->_new_table, |
|
| 134 | + $cols_n_values, |
|
| 135 | + $data_types |
|
| 136 | + ) |
|
| 137 | + ); |
|
| 138 | + } |
|
| 139 | + } |
|
| 140 | + } |
|
| 141 | 141 | |
| 142 | 142 | |
| 143 | - /** |
|
| 144 | - * If this question is a system question, returns the QSG_system number that |
|
| 145 | - * indicates the question group its permitted in. |
|
| 146 | - * |
|
| 147 | - * @param int $new_question_id |
|
| 148 | - * @return int |
|
| 149 | - * @global wpdb $wpdb |
|
| 150 | - */ |
|
| 151 | - private function _is_system_question_for_question_group(int $new_question_id): int |
|
| 152 | - { |
|
| 153 | - global $wpdb; |
|
| 154 | - $system_id = $wpdb->get_var( |
|
| 155 | - $wpdb->prepare( |
|
| 156 | - "SELECT QST_system FROM " . $wpdb->prefix . "esp_question WHERE QST_ID=%d", |
|
| 157 | - $new_question_id |
|
| 158 | - ) |
|
| 159 | - ); |
|
| 160 | - if (in_array($system_id, ['fname', 'lname', 'email'])) { |
|
| 161 | - return 1; |
|
| 162 | - } |
|
| 163 | - if ($system_id != '' && $system_id) { |
|
| 164 | - return 2; |
|
| 165 | - } |
|
| 166 | - return 0; |
|
| 167 | - } |
|
| 143 | + /** |
|
| 144 | + * If this question is a system question, returns the QSG_system number that |
|
| 145 | + * indicates the question group its permitted in. |
|
| 146 | + * |
|
| 147 | + * @param int $new_question_id |
|
| 148 | + * @return int |
|
| 149 | + * @global wpdb $wpdb |
|
| 150 | + */ |
|
| 151 | + private function _is_system_question_for_question_group(int $new_question_id): int |
|
| 152 | + { |
|
| 153 | + global $wpdb; |
|
| 154 | + $system_id = $wpdb->get_var( |
|
| 155 | + $wpdb->prepare( |
|
| 156 | + "SELECT QST_system FROM " . $wpdb->prefix . "esp_question WHERE QST_ID=%d", |
|
| 157 | + $new_question_id |
|
| 158 | + ) |
|
| 159 | + ); |
|
| 160 | + if (in_array($system_id, ['fname', 'lname', 'email'])) { |
|
| 161 | + return 1; |
|
| 162 | + } |
|
| 163 | + if ($system_id != '' && $system_id) { |
|
| 164 | + return 2; |
|
| 165 | + } |
|
| 166 | + return 0; |
|
| 167 | + } |
|
| 168 | 168 | |
| 169 | 169 | |
| 170 | - /** |
|
| 171 | - * Returns the question group's QSG_system value (1 meaning personal info, 2 |
|
| 172 | - * being address info, and 0 being neither) |
|
| 173 | - * |
|
| 174 | - * @param int $new_question_group_id |
|
| 175 | - * @return int |
|
| 176 | - * @global wpdb $wpdb |
|
| 177 | - */ |
|
| 178 | - private function _is_system_question_group(int $new_question_group_id): int |
|
| 179 | - { |
|
| 180 | - global $wpdb; |
|
| 181 | - return (int) $wpdb->get_var( |
|
| 182 | - $wpdb->prepare( |
|
| 183 | - "SELECT QSG_system FROM " . $wpdb->prefix . "esp_question_group WHERE QSG_ID=%d", |
|
| 184 | - $new_question_group_id |
|
| 185 | - ) |
|
| 186 | - ); |
|
| 187 | - } |
|
| 170 | + /** |
|
| 171 | + * Returns the question group's QSG_system value (1 meaning personal info, 2 |
|
| 172 | + * being address info, and 0 being neither) |
|
| 173 | + * |
|
| 174 | + * @param int $new_question_group_id |
|
| 175 | + * @return int |
|
| 176 | + * @global wpdb $wpdb |
|
| 177 | + */ |
|
| 178 | + private function _is_system_question_group(int $new_question_group_id): int |
|
| 179 | + { |
|
| 180 | + global $wpdb; |
|
| 181 | + return (int) $wpdb->get_var( |
|
| 182 | + $wpdb->prepare( |
|
| 183 | + "SELECT QSG_system FROM " . $wpdb->prefix . "esp_question_group WHERE QSG_ID=%d", |
|
| 184 | + $new_question_group_id |
|
| 185 | + ) |
|
| 186 | + ); |
|
| 187 | + } |
|
| 188 | 188 | } |
@@ -14,256 +14,256 @@ |
||
| 14 | 14 | */ |
| 15 | 15 | class EE_DMS_4_1_0_gateways extends EE_Data_Migration_Script_Stage |
| 16 | 16 | { |
| 17 | - private bool $_converted_active_gateways = false; |
|
| 17 | + private bool $_converted_active_gateways = false; |
|
| 18 | 18 | |
| 19 | - protected array $_gateways_we_know_how_to_migrate = [ |
|
| 20 | - 'aim' => 'Aim', |
|
| 21 | - 'bank' => 'Bank', |
|
| 22 | - 'check' => 'Check', |
|
| 23 | - 'invoice' => 'Invoice', |
|
| 24 | - 'paypal' => 'Paypal_Standard', |
|
| 25 | - 'paypal_pro' => 'Paypal_Pro', |
|
| 19 | + protected array $_gateways_we_know_how_to_migrate = [ |
|
| 20 | + 'aim' => 'Aim', |
|
| 21 | + 'bank' => 'Bank', |
|
| 22 | + 'check' => 'Check', |
|
| 23 | + 'invoice' => 'Invoice', |
|
| 24 | + 'paypal' => 'Paypal_Standard', |
|
| 25 | + 'paypal_pro' => 'Paypal_Pro', |
|
| 26 | 26 | |
| 27 | - ]; |
|
| 27 | + ]; |
|
| 28 | 28 | |
| 29 | - protected array $_gateways_we_leave_alone = [ |
|
| 30 | - '2checkout' => '2checkout', |
|
| 31 | - 'anz' => 'Anz', |
|
| 32 | - 'atos' => 'Atos', |
|
| 33 | - 'authnet' => 'Authnet', |
|
| 34 | - 'beanstream' => 'Beanstream', |
|
| 35 | - 'evertec' => 'Evertec', |
|
| 36 | - 'eway' => 'Eway', |
|
| 37 | - 'eway_rapid3' => 'Eway_Rapid3', |
|
| 38 | - 'exact' => 'Exact', |
|
| 39 | - 'firstdata' => 'Firstdata', |
|
| 40 | - 'firstdat_e4' => 'Firstdata_E4', |
|
| 41 | - 'ideal' => 'Ideal', |
|
| 42 | - 'infusion_payment' => 'InfusionSoft', |
|
| 43 | - 'luottokunta' => 'Luottokunta', |
|
| 44 | - 'megasoft' => 'Megasoft', |
|
| 45 | - 'moneris_hpp' => 'Moneris_HPP', |
|
| 46 | - 'mwarrior' => 'Mwarrior', |
|
| 47 | - 'nab' => 'NAB', |
|
| 48 | - 'paychoice' => 'Paychoice', |
|
| 49 | - 'paytrace' => 'Paytrace', |
|
| 50 | - 'psigate' => 'Psigate', |
|
| 51 | - 'purchase_order' => 'Purchase_Order', |
|
| 52 | - 'qbms' => 'QBMS', |
|
| 53 | - 'quickpay' => 'Quickpay', |
|
| 54 | - 'realauth' => 'Realauth', |
|
| 55 | - 'securepay_aus' => 'Securepay_Aus', |
|
| 56 | - 'stripe' => 'Stripe', |
|
| 57 | - 'usaepay_offsite' => 'USAePay_Offsite', |
|
| 58 | - 'usaepay_onsite' => 'USAePay_Onsite', |
|
| 59 | - 'wepay' => 'Wepay', |
|
| 60 | - 'worldpay' => 'Worldpay', |
|
| 61 | - ]; |
|
| 29 | + protected array $_gateways_we_leave_alone = [ |
|
| 30 | + '2checkout' => '2checkout', |
|
| 31 | + 'anz' => 'Anz', |
|
| 32 | + 'atos' => 'Atos', |
|
| 33 | + 'authnet' => 'Authnet', |
|
| 34 | + 'beanstream' => 'Beanstream', |
|
| 35 | + 'evertec' => 'Evertec', |
|
| 36 | + 'eway' => 'Eway', |
|
| 37 | + 'eway_rapid3' => 'Eway_Rapid3', |
|
| 38 | + 'exact' => 'Exact', |
|
| 39 | + 'firstdata' => 'Firstdata', |
|
| 40 | + 'firstdat_e4' => 'Firstdata_E4', |
|
| 41 | + 'ideal' => 'Ideal', |
|
| 42 | + 'infusion_payment' => 'InfusionSoft', |
|
| 43 | + 'luottokunta' => 'Luottokunta', |
|
| 44 | + 'megasoft' => 'Megasoft', |
|
| 45 | + 'moneris_hpp' => 'Moneris_HPP', |
|
| 46 | + 'mwarrior' => 'Mwarrior', |
|
| 47 | + 'nab' => 'NAB', |
|
| 48 | + 'paychoice' => 'Paychoice', |
|
| 49 | + 'paytrace' => 'Paytrace', |
|
| 50 | + 'psigate' => 'Psigate', |
|
| 51 | + 'purchase_order' => 'Purchase_Order', |
|
| 52 | + 'qbms' => 'QBMS', |
|
| 53 | + 'quickpay' => 'Quickpay', |
|
| 54 | + 'realauth' => 'Realauth', |
|
| 55 | + 'securepay_aus' => 'Securepay_Aus', |
|
| 56 | + 'stripe' => 'Stripe', |
|
| 57 | + 'usaepay_offsite' => 'USAePay_Offsite', |
|
| 58 | + 'usaepay_onsite' => 'USAePay_Onsite', |
|
| 59 | + 'wepay' => 'Wepay', |
|
| 60 | + 'worldpay' => 'Worldpay', |
|
| 61 | + ]; |
|
| 62 | 62 | |
| 63 | 63 | |
| 64 | - public function __construct() |
|
| 65 | - { |
|
| 66 | - $this->_pretty_name = esc_html__("Gateways", "event_espresso"); |
|
| 67 | - parent::__construct(); |
|
| 68 | - } |
|
| 64 | + public function __construct() |
|
| 65 | + { |
|
| 66 | + $this->_pretty_name = esc_html__("Gateways", "event_espresso"); |
|
| 67 | + parent::__construct(); |
|
| 68 | + } |
|
| 69 | 69 | |
| 70 | 70 | |
| 71 | - public function _migration_step($num_items_to_migrate = 50) |
|
| 72 | - { |
|
| 73 | - // loads existing EE_Config from DB, if it exists |
|
| 74 | - $new_gateway_config_obj = EE_Config::instance()->gateway; |
|
| 75 | - $items_actually_migrated = 0; |
|
| 76 | - // convert settings |
|
| 77 | - $gateways_to_deal_with = array_merge( |
|
| 78 | - $this->_gateways_we_know_how_to_migrate, |
|
| 79 | - $this->_gateways_we_leave_alone |
|
| 80 | - ); |
|
| 81 | - // just do a part of them on this request |
|
| 82 | - $gateways_to_deal_with = array_slice( |
|
| 83 | - $gateways_to_deal_with, |
|
| 84 | - $this->count_records_migrated(), |
|
| 85 | - $num_items_to_migrate |
|
| 86 | - );// $this->_gateways_we_know_how_to_migrate; |
|
| 87 | - foreach ($gateways_to_deal_with as $old_gateway_slug => $new_gateway_slug) { |
|
| 88 | - $old_gateway_wp_option_name = $this->_get_old_gateway_option_name($new_gateway_slug); |
|
| 89 | - if (isset($this->_gateways_we_know_how_to_migrate[ $old_gateway_slug ])) { |
|
| 90 | - // determine the old option's name |
|
| 91 | - $old_gateway_settings = $this->_get_old_gateway_option($new_gateway_slug); |
|
| 92 | - if (! $old_gateway_settings) { |
|
| 93 | - // no settings existed for this gateway anyways... weird... |
|
| 94 | - $items_actually_migrated++; |
|
| 95 | - continue; |
|
| 96 | - } |
|
| 97 | - // now prepare the settings to make sure they're in the 4.1 format |
|
| 98 | - $new_gateway_settings = $this->_convert_gateway_settings( |
|
| 99 | - (array) $old_gateway_settings, |
|
| 100 | - $new_gateway_slug |
|
| 101 | - ); |
|
| 71 | + public function _migration_step($num_items_to_migrate = 50) |
|
| 72 | + { |
|
| 73 | + // loads existing EE_Config from DB, if it exists |
|
| 74 | + $new_gateway_config_obj = EE_Config::instance()->gateway; |
|
| 75 | + $items_actually_migrated = 0; |
|
| 76 | + // convert settings |
|
| 77 | + $gateways_to_deal_with = array_merge( |
|
| 78 | + $this->_gateways_we_know_how_to_migrate, |
|
| 79 | + $this->_gateways_we_leave_alone |
|
| 80 | + ); |
|
| 81 | + // just do a part of them on this request |
|
| 82 | + $gateways_to_deal_with = array_slice( |
|
| 83 | + $gateways_to_deal_with, |
|
| 84 | + $this->count_records_migrated(), |
|
| 85 | + $num_items_to_migrate |
|
| 86 | + );// $this->_gateways_we_know_how_to_migrate; |
|
| 87 | + foreach ($gateways_to_deal_with as $old_gateway_slug => $new_gateway_slug) { |
|
| 88 | + $old_gateway_wp_option_name = $this->_get_old_gateway_option_name($new_gateway_slug); |
|
| 89 | + if (isset($this->_gateways_we_know_how_to_migrate[ $old_gateway_slug ])) { |
|
| 90 | + // determine the old option's name |
|
| 91 | + $old_gateway_settings = $this->_get_old_gateway_option($new_gateway_slug); |
|
| 92 | + if (! $old_gateway_settings) { |
|
| 93 | + // no settings existed for this gateway anyways... weird... |
|
| 94 | + $items_actually_migrated++; |
|
| 95 | + continue; |
|
| 96 | + } |
|
| 97 | + // now prepare the settings to make sure they're in the 4.1 format |
|
| 98 | + $new_gateway_settings = $this->_convert_gateway_settings( |
|
| 99 | + (array) $old_gateway_settings, |
|
| 100 | + $new_gateway_slug |
|
| 101 | + ); |
|
| 102 | 102 | |
| 103 | - $new_gateway_config_obj->payment_settings[ $new_gateway_slug ] = $new_gateway_settings; |
|
| 104 | - // and when we're done, remove the old option. Sometimes we'd prefer to do this in a different stage, but |
|
| 105 | - // I think it's ok to do right away this time (we wont need gateway settings elsewhere) |
|
| 106 | - delete_option($old_gateway_wp_option_name); |
|
| 107 | - } else {// it must be one of the ones we mostly leave alone |
|
| 108 | - global $wpdb; |
|
| 109 | - // yeah we could do this all in one query... and if you're reading this and would like to, go ahead. Although you'll |
|
| 110 | - // only be saving users 50 milliseconds the one time this runs... |
|
| 111 | - $wpdb->query( |
|
| 112 | - $wpdb->prepare( |
|
| 113 | - "UPDATE " . $wpdb->options . " SET autoload='no' WHERE option_name=%s", |
|
| 114 | - $old_gateway_wp_option_name |
|
| 115 | - ) |
|
| 116 | - ); |
|
| 117 | - } |
|
| 103 | + $new_gateway_config_obj->payment_settings[ $new_gateway_slug ] = $new_gateway_settings; |
|
| 104 | + // and when we're done, remove the old option. Sometimes we'd prefer to do this in a different stage, but |
|
| 105 | + // I think it's ok to do right away this time (we wont need gateway settings elsewhere) |
|
| 106 | + delete_option($old_gateway_wp_option_name); |
|
| 107 | + } else {// it must be one of the ones we mostly leave alone |
|
| 108 | + global $wpdb; |
|
| 109 | + // yeah we could do this all in one query... and if you're reading this and would like to, go ahead. Although you'll |
|
| 110 | + // only be saving users 50 milliseconds the one time this runs... |
|
| 111 | + $wpdb->query( |
|
| 112 | + $wpdb->prepare( |
|
| 113 | + "UPDATE " . $wpdb->options . " SET autoload='no' WHERE option_name=%s", |
|
| 114 | + $old_gateway_wp_option_name |
|
| 115 | + ) |
|
| 116 | + ); |
|
| 117 | + } |
|
| 118 | 118 | |
| 119 | - $items_actually_migrated++; |
|
| 120 | - } |
|
| 121 | - // if we can keep going, and it hasn't been done yet, convert active gateways |
|
| 122 | - if ($items_actually_migrated < $num_items_to_migrate && ! $this->_converted_active_gateways) { |
|
| 123 | - $this->_convert_active_gateways(); |
|
| 124 | - $this->_converted_active_gateways = true; |
|
| 125 | - $items_actually_migrated++; |
|
| 126 | - } |
|
| 119 | + $items_actually_migrated++; |
|
| 120 | + } |
|
| 121 | + // if we can keep going, and it hasn't been done yet, convert active gateways |
|
| 122 | + if ($items_actually_migrated < $num_items_to_migrate && ! $this->_converted_active_gateways) { |
|
| 123 | + $this->_convert_active_gateways(); |
|
| 124 | + $this->_converted_active_gateways = true; |
|
| 125 | + $items_actually_migrated++; |
|
| 126 | + } |
|
| 127 | 127 | |
| 128 | - EE_Config::instance()->update_espresso_config(false, false); |
|
| 129 | - if ($this->count_records_migrated() + $items_actually_migrated >= $this->count_records_to_migrate()) { |
|
| 130 | - $this->set_completed(); |
|
| 131 | - } |
|
| 132 | - return $items_actually_migrated; |
|
| 133 | - } |
|
| 128 | + EE_Config::instance()->update_espresso_config(false, false); |
|
| 129 | + if ($this->count_records_migrated() + $items_actually_migrated >= $this->count_records_to_migrate()) { |
|
| 130 | + $this->set_completed(); |
|
| 131 | + } |
|
| 132 | + return $items_actually_migrated; |
|
| 133 | + } |
|
| 134 | 134 | |
| 135 | 135 | |
| 136 | - public function _count_records_to_migrate(): int |
|
| 137 | - { |
|
| 138 | - $count_of_gateways_to_convert = (int) count($this->_gateways_we_know_how_to_migrate); |
|
| 139 | - $step_of_setting_active_gateways = 1; |
|
| 140 | - $count_of_gateways_to_leave_alone = (int) count($this->_gateways_we_leave_alone); |
|
| 141 | - // $button_images_to_update = |
|
| 142 | - return $count_of_gateways_to_convert + $step_of_setting_active_gateways + $count_of_gateways_to_leave_alone; |
|
| 143 | - } |
|
| 136 | + public function _count_records_to_migrate(): int |
|
| 137 | + { |
|
| 138 | + $count_of_gateways_to_convert = (int) count($this->_gateways_we_know_how_to_migrate); |
|
| 139 | + $step_of_setting_active_gateways = 1; |
|
| 140 | + $count_of_gateways_to_leave_alone = (int) count($this->_gateways_we_leave_alone); |
|
| 141 | + // $button_images_to_update = |
|
| 142 | + return $count_of_gateways_to_convert + $step_of_setting_active_gateways + $count_of_gateways_to_leave_alone; |
|
| 143 | + } |
|
| 144 | 144 | |
| 145 | 145 | |
| 146 | - /** |
|
| 147 | - * Takes the old array of 3.1 gateway settings for this gateway and converts it |
|
| 148 | - * into an array with all the 4.1 gateway setting array keys (often the keys were |
|
| 149 | - * changed from 3.1 to 4.1) |
|
| 150 | - * |
|
| 151 | - * @param array $old_gateway_settings |
|
| 152 | - * @param string $new_gateway_slug |
|
| 153 | - * @return array |
|
| 154 | - */ |
|
| 155 | - private function _convert_gateway_settings(array $old_gateway_settings, string $new_gateway_slug): array |
|
| 156 | - { |
|
| 157 | - $new_gateway_settings = $old_gateway_settings; |
|
| 158 | - switch ($new_gateway_slug) { |
|
| 159 | - case 'Bank': |
|
| 160 | - $new_gateway_settings['account_number'] = $old_gateway_settings['bank_account']; |
|
| 161 | - $new_gateway_settings['page_title'] = $old_gateway_settings['bank_title']; |
|
| 162 | - break; |
|
| 163 | - case 'Invoice': |
|
| 164 | - $new_gateway_settings['invoice_logo_url'] = $old_gateway_settings['image_url']; |
|
| 165 | - // Dont' migrate the old invoice payee address. It was usually given dummy data. And in EE4 |
|
| 166 | - // it gets used in the receipts which are available to everyone. So usually it's best to not |
|
| 167 | - // migrate this. |
|
| 168 | - unset($new_gateway_settings['payment_address']); |
|
| 169 | - break; |
|
| 170 | - case 'Paypal_Pro': |
|
| 171 | - $new_gateway_settings['email'] = $old_gateway_settings['paypal_pro_email']; |
|
| 172 | - $new_gateway_settings['username'] = $old_gateway_settings['paypal_api_username']; |
|
| 173 | - $new_gateway_settings['password'] = $old_gateway_settings['paypal_api_password']; |
|
| 174 | - $new_gateway_settings['signature'] = $old_gateway_settings['paypal_api_signature']; |
|
| 175 | - $new_gateway_settings['credit_cards'] = explode(",", $old_gateway_settings['paypal_api_credit_cards']); |
|
| 176 | - $new_gateway_settings['use_sandbox'] = $old_gateway_settings['paypal_pro_use_sandbox']; |
|
| 177 | - break; |
|
| 178 | - } |
|
| 179 | - return $new_gateway_settings; |
|
| 180 | - } |
|
| 146 | + /** |
|
| 147 | + * Takes the old array of 3.1 gateway settings for this gateway and converts it |
|
| 148 | + * into an array with all the 4.1 gateway setting array keys (often the keys were |
|
| 149 | + * changed from 3.1 to 4.1) |
|
| 150 | + * |
|
| 151 | + * @param array $old_gateway_settings |
|
| 152 | + * @param string $new_gateway_slug |
|
| 153 | + * @return array |
|
| 154 | + */ |
|
| 155 | + private function _convert_gateway_settings(array $old_gateway_settings, string $new_gateway_slug): array |
|
| 156 | + { |
|
| 157 | + $new_gateway_settings = $old_gateway_settings; |
|
| 158 | + switch ($new_gateway_slug) { |
|
| 159 | + case 'Bank': |
|
| 160 | + $new_gateway_settings['account_number'] = $old_gateway_settings['bank_account']; |
|
| 161 | + $new_gateway_settings['page_title'] = $old_gateway_settings['bank_title']; |
|
| 162 | + break; |
|
| 163 | + case 'Invoice': |
|
| 164 | + $new_gateway_settings['invoice_logo_url'] = $old_gateway_settings['image_url']; |
|
| 165 | + // Dont' migrate the old invoice payee address. It was usually given dummy data. And in EE4 |
|
| 166 | + // it gets used in the receipts which are available to everyone. So usually it's best to not |
|
| 167 | + // migrate this. |
|
| 168 | + unset($new_gateway_settings['payment_address']); |
|
| 169 | + break; |
|
| 170 | + case 'Paypal_Pro': |
|
| 171 | + $new_gateway_settings['email'] = $old_gateway_settings['paypal_pro_email']; |
|
| 172 | + $new_gateway_settings['username'] = $old_gateway_settings['paypal_api_username']; |
|
| 173 | + $new_gateway_settings['password'] = $old_gateway_settings['paypal_api_password']; |
|
| 174 | + $new_gateway_settings['signature'] = $old_gateway_settings['paypal_api_signature']; |
|
| 175 | + $new_gateway_settings['credit_cards'] = explode(",", $old_gateway_settings['paypal_api_credit_cards']); |
|
| 176 | + $new_gateway_settings['use_sandbox'] = $old_gateway_settings['paypal_pro_use_sandbox']; |
|
| 177 | + break; |
|
| 178 | + } |
|
| 179 | + return $new_gateway_settings; |
|
| 180 | + } |
|
| 181 | 181 | |
| 182 | 182 | |
| 183 | - /** |
|
| 184 | - * Returns the 3.1 gateway settings for the given 4.1 gateway |
|
| 185 | - * |
|
| 186 | - * @param string $new_gateway_slug |
|
| 187 | - * @return null|array |
|
| 188 | - */ |
|
| 189 | - private function _get_old_gateway_option(string $new_gateway_slug): ?array |
|
| 190 | - { |
|
| 191 | - return get_option( |
|
| 192 | - $this->_get_old_gateway_option_name($new_gateway_slug), |
|
| 193 | - null |
|
| 194 | - ); |
|
| 195 | - } |
|
| 183 | + /** |
|
| 184 | + * Returns the 3.1 gateway settings for the given 4.1 gateway |
|
| 185 | + * |
|
| 186 | + * @param string $new_gateway_slug |
|
| 187 | + * @return null|array |
|
| 188 | + */ |
|
| 189 | + private function _get_old_gateway_option(string $new_gateway_slug): ?array |
|
| 190 | + { |
|
| 191 | + return get_option( |
|
| 192 | + $this->_get_old_gateway_option_name($new_gateway_slug), |
|
| 193 | + null |
|
| 194 | + ); |
|
| 195 | + } |
|
| 196 | 196 | |
| 197 | 197 | |
| 198 | - /** |
|
| 199 | - * Figures out the correct 3.1 gateway settings option name for the given 4.1 gateway |
|
| 200 | - * |
|
| 201 | - * @param string $new_gateway_slug |
|
| 202 | - * @return string |
|
| 203 | - */ |
|
| 204 | - private function _get_old_gateway_option_name(string $new_gateway_slug): string |
|
| 205 | - { |
|
| 206 | - $new_gateway_slugs_to_new = array_flip( |
|
| 207 | - array_merge( |
|
| 208 | - $this->_gateways_we_know_how_to_migrate, |
|
| 209 | - $this->_gateways_we_leave_alone |
|
| 210 | - ) |
|
| 211 | - ); |
|
| 212 | - $old_gateway_slug = $new_gateway_slugs_to_new[ $new_gateway_slug ]; |
|
| 213 | - $normal_option_prefix = 'event_espresso_'; |
|
| 214 | - $normal_option_postfix = '_settings'; |
|
| 215 | - switch ($new_gateway_slug) { |
|
| 216 | - case 'Bank': |
|
| 217 | - $option_name = $normal_option_prefix . 'bank_deposit' . $normal_option_postfix; |
|
| 218 | - break; |
|
| 219 | - case 'Aim': |
|
| 220 | - $option_name = $normal_option_prefix . 'authnet_aim' . $normal_option_postfix; |
|
| 221 | - break; |
|
| 222 | - case 'Check': |
|
| 223 | - $option_name = $normal_option_prefix . 'check_payment' . $normal_option_postfix; |
|
| 224 | - break; |
|
| 225 | - case 'Ideal': |
|
| 226 | - $option_name = $normal_option_prefix . 'ideal_mollie' . $normal_option_postfix; |
|
| 227 | - break; |
|
| 228 | - case 'Invoice': |
|
| 229 | - $option_name = $normal_option_prefix . 'invoice_payment' . $normal_option_postfix; |
|
| 230 | - break; |
|
| 231 | - case 'Purchase_Order': |
|
| 232 | - $option_name = $normal_option_prefix . 'purchase_order_payment' . $normal_option_postfix; |
|
| 233 | - break; |
|
| 234 | - case 'USAePay_Offsite': |
|
| 235 | - $option_name = 'espresso_usaepay_offsite' . $normal_option_postfix; |
|
| 236 | - break; |
|
| 237 | - case 'USAePay_Onsite': |
|
| 238 | - $option_name = 'espresso_usaepay_onsite' . $normal_option_postfix; |
|
| 239 | - break; |
|
| 240 | - default: |
|
| 241 | - $option_name = apply_filters( |
|
| 242 | - 'FHEE__EE_DMS_4_1_0_gateways__get_old_gateway_option', |
|
| 243 | - $normal_option_prefix . $old_gateway_slug . $normal_option_postfix |
|
| 244 | - ); |
|
| 245 | - } |
|
| 246 | - return $option_name; |
|
| 247 | - } |
|
| 198 | + /** |
|
| 199 | + * Figures out the correct 3.1 gateway settings option name for the given 4.1 gateway |
|
| 200 | + * |
|
| 201 | + * @param string $new_gateway_slug |
|
| 202 | + * @return string |
|
| 203 | + */ |
|
| 204 | + private function _get_old_gateway_option_name(string $new_gateway_slug): string |
|
| 205 | + { |
|
| 206 | + $new_gateway_slugs_to_new = array_flip( |
|
| 207 | + array_merge( |
|
| 208 | + $this->_gateways_we_know_how_to_migrate, |
|
| 209 | + $this->_gateways_we_leave_alone |
|
| 210 | + ) |
|
| 211 | + ); |
|
| 212 | + $old_gateway_slug = $new_gateway_slugs_to_new[ $new_gateway_slug ]; |
|
| 213 | + $normal_option_prefix = 'event_espresso_'; |
|
| 214 | + $normal_option_postfix = '_settings'; |
|
| 215 | + switch ($new_gateway_slug) { |
|
| 216 | + case 'Bank': |
|
| 217 | + $option_name = $normal_option_prefix . 'bank_deposit' . $normal_option_postfix; |
|
| 218 | + break; |
|
| 219 | + case 'Aim': |
|
| 220 | + $option_name = $normal_option_prefix . 'authnet_aim' . $normal_option_postfix; |
|
| 221 | + break; |
|
| 222 | + case 'Check': |
|
| 223 | + $option_name = $normal_option_prefix . 'check_payment' . $normal_option_postfix; |
|
| 224 | + break; |
|
| 225 | + case 'Ideal': |
|
| 226 | + $option_name = $normal_option_prefix . 'ideal_mollie' . $normal_option_postfix; |
|
| 227 | + break; |
|
| 228 | + case 'Invoice': |
|
| 229 | + $option_name = $normal_option_prefix . 'invoice_payment' . $normal_option_postfix; |
|
| 230 | + break; |
|
| 231 | + case 'Purchase_Order': |
|
| 232 | + $option_name = $normal_option_prefix . 'purchase_order_payment' . $normal_option_postfix; |
|
| 233 | + break; |
|
| 234 | + case 'USAePay_Offsite': |
|
| 235 | + $option_name = 'espresso_usaepay_offsite' . $normal_option_postfix; |
|
| 236 | + break; |
|
| 237 | + case 'USAePay_Onsite': |
|
| 238 | + $option_name = 'espresso_usaepay_onsite' . $normal_option_postfix; |
|
| 239 | + break; |
|
| 240 | + default: |
|
| 241 | + $option_name = apply_filters( |
|
| 242 | + 'FHEE__EE_DMS_4_1_0_gateways__get_old_gateway_option', |
|
| 243 | + $normal_option_prefix . $old_gateway_slug . $normal_option_postfix |
|
| 244 | + ); |
|
| 245 | + } |
|
| 246 | + return $option_name; |
|
| 247 | + } |
|
| 248 | 248 | |
| 249 | 249 | |
| 250 | - private function _convert_active_gateways() |
|
| 251 | - { |
|
| 252 | - // just does it all one big swoop |
|
| 253 | - $old_active_gateways = get_option('event_espresso_active_gateways'); |
|
| 254 | - $new_active_gateways = EE_Config::instance()->gateway->active_gateways; |
|
| 255 | - foreach ($old_active_gateways as $old_gateway_slug => $filepath) { |
|
| 256 | - if (! isset($this->_gateways_we_know_how_to_migrate[ $old_gateway_slug ])) { |
|
| 257 | - $this->add_error( |
|
| 258 | - sprintf(esc_html__("The %s gateway does not exist in EE 4.1", "event_espresso"), $old_gateway_slug) |
|
| 259 | - ); |
|
| 260 | - continue; |
|
| 261 | - } |
|
| 262 | - $new_gateway_slug = $this->_gateways_we_know_how_to_migrate[ $old_gateway_slug ]; |
|
| 250 | + private function _convert_active_gateways() |
|
| 251 | + { |
|
| 252 | + // just does it all one big swoop |
|
| 253 | + $old_active_gateways = get_option('event_espresso_active_gateways'); |
|
| 254 | + $new_active_gateways = EE_Config::instance()->gateway->active_gateways; |
|
| 255 | + foreach ($old_active_gateways as $old_gateway_slug => $filepath) { |
|
| 256 | + if (! isset($this->_gateways_we_know_how_to_migrate[ $old_gateway_slug ])) { |
|
| 257 | + $this->add_error( |
|
| 258 | + sprintf(esc_html__("The %s gateway does not exist in EE 4.1", "event_espresso"), $old_gateway_slug) |
|
| 259 | + ); |
|
| 260 | + continue; |
|
| 261 | + } |
|
| 262 | + $new_gateway_slug = $this->_gateways_we_know_how_to_migrate[ $old_gateway_slug ]; |
|
| 263 | 263 | |
| 264 | - // in the new format we can also upload gateways to the uploads directory and |
|
| 265 | - $new_active_gateways[ $new_gateway_slug ] = false; |
|
| 266 | - } |
|
| 267 | - EE_Config::instance()->gateway->active_gateways = $new_active_gateways; |
|
| 268 | - } |
|
| 264 | + // in the new format we can also upload gateways to the uploads directory and |
|
| 265 | + $new_active_gateways[ $new_gateway_slug ] = false; |
|
| 266 | + } |
|
| 267 | + EE_Config::instance()->gateway->active_gateways = $new_active_gateways; |
|
| 268 | + } |
|
| 269 | 269 | } |
@@ -176,825 +176,825 @@ |
||
| 176 | 176 | */ |
| 177 | 177 | class EE_DMS_4_1_0_events extends EE_Data_Migration_Script_Stage |
| 178 | 178 | { |
| 179 | - private string $_old_start_end_table; |
|
| 180 | - |
|
| 181 | - private string $_new_meta_table; |
|
| 182 | - |
|
| 183 | - private string $_new_datetime_table; |
|
| 184 | - |
|
| 185 | - |
|
| 186 | - /** |
|
| 187 | - * Just initializes the status of the migration |
|
| 188 | - */ |
|
| 189 | - public function __construct() |
|
| 190 | - { |
|
| 191 | - global $wpdb; |
|
| 192 | - $this->_old_table = $wpdb->prefix . "events_detail"; |
|
| 193 | - $this->_old_start_end_table = $wpdb->prefix . "events_start_end"; |
|
| 194 | - $this->_new_table = $wpdb->prefix . "posts"; |
|
| 195 | - $this->_new_meta_table = $wpdb->prefix . "esp_event_meta"; |
|
| 196 | - $this->_new_datetime_table = $wpdb->prefix . "esp_datetime"; |
|
| 197 | - $this->_pretty_name = esc_html__("Events", "event_espresso"); |
|
| 198 | - parent::__construct(); |
|
| 199 | - } |
|
| 200 | - |
|
| 201 | - |
|
| 202 | - /** |
|
| 203 | - * Counts the records to migrate; the public version may cache it |
|
| 204 | - * |
|
| 205 | - * @return int |
|
| 206 | - */ |
|
| 207 | - public function _count_records_to_migrate(): int |
|
| 208 | - { |
|
| 209 | - global $wpdb; |
|
| 210 | - return (int) $wpdb->get_var("SELECT COUNT(*) FROM " . $this->_old_table . ' WHERE event_status !="D"'); |
|
| 211 | - } |
|
| 212 | - |
|
| 213 | - |
|
| 214 | - /** |
|
| 215 | - * IMPORTANT: if an error is encountered, or everything is finished, this stage should update its status property |
|
| 216 | - * accordingly. Note: it should not alter the count of items migrated. That is done in the public function that |
|
| 217 | - * calls this. IMPORTANT: The count of items migrated should ONLY be less than $num_items_to_migrate when it's the |
|
| 218 | - * last migration step, otherwise it should always return $num_items_to_migrate. (Eg, if we're migrating attendees |
|
| 219 | - * rows from the database, and $num_items_to_migrate is set to 50, then we SHOULD actually migrate 50 rows,but at |
|
| 220 | - * very least we MUST report/return 50 items migrated) |
|
| 221 | - * |
|
| 222 | - * @param int $num_items_to_migrate |
|
| 223 | - * @return int number of items ACTUALLY migrated |
|
| 224 | - * @throws EE_Error |
|
| 225 | - */ |
|
| 226 | - protected function _migration_step($num_items_to_migrate = 50) |
|
| 227 | - { |
|
| 228 | - global $wpdb; |
|
| 229 | - // because the migration of each event can be a LOT more work, make each step smaller |
|
| 230 | - $num_items_to_migrate = max(1, $num_items_to_migrate / 5); |
|
| 231 | - $events = |
|
| 232 | - $wpdb->get_results( |
|
| 233 | - $wpdb->prepare( |
|
| 234 | - "SELECT * FROM $this->_old_table WHERE event_status!='D' LIMIT %d,%d", |
|
| 235 | - $this->count_records_migrated(), |
|
| 236 | - $num_items_to_migrate |
|
| 237 | - ), |
|
| 238 | - ARRAY_A |
|
| 239 | - ); |
|
| 240 | - $items_migrated_this_step = 0; |
|
| 241 | - |
|
| 242 | - foreach ($events as $event_row) { |
|
| 243 | - $guid = null; |
|
| 244 | - // insert new 4.1 Attendee object using $wpdb |
|
| 245 | - $post_id = $this->_insert_cpt($event_row); |
|
| 246 | - if ($post_id) { |
|
| 247 | - $this->get_migration_script()->set_mapping( |
|
| 248 | - $this->_old_table, |
|
| 249 | - $event_row['id'], |
|
| 250 | - $this->_new_table, |
|
| 251 | - $post_id |
|
| 252 | - ); |
|
| 253 | - $meta_id = $this->_insert_event_meta($event_row, $post_id); |
|
| 254 | - if ($meta_id) { |
|
| 255 | - $this->get_migration_script()->set_mapping( |
|
| 256 | - $this->_old_table, |
|
| 257 | - $event_row['id'], |
|
| 258 | - $this->_new_meta_table, |
|
| 259 | - $meta_id |
|
| 260 | - ); |
|
| 261 | - } |
|
| 262 | - $this->_convert_start_end_times($event_row, $post_id); |
|
| 263 | - $event_meta = maybe_unserialize($event_row['event_meta']); |
|
| 264 | - $guid = $event_meta['event_thumbnail_url'] ?? null; |
|
| 265 | - if ($guid) { |
|
| 266 | - $this->get_migration_script()->convert_image_url_to_attachment_and_attach_to_post( |
|
| 267 | - $guid, |
|
| 268 | - $post_id, |
|
| 269 | - $this |
|
| 270 | - ); |
|
| 271 | - } |
|
| 272 | - // maybe create a venue from info on the event? |
|
| 273 | - $new_venue_id = $this->_maybe_create_venue($event_row); |
|
| 274 | - if ($new_venue_id) { |
|
| 275 | - $this->_insert_new_venue_to_event($post_id, $new_venue_id); |
|
| 276 | - } |
|
| 277 | - $this->_add_post_metas($event_row, $post_id); |
|
| 278 | - } |
|
| 279 | - $items_migrated_this_step++; |
|
| 280 | - if ($guid) { |
|
| 281 | - // if we had to check for an image attachment |
|
| 282 | - // then let's call it a day (avoid timing out, because this took a long time) |
|
| 283 | - break; |
|
| 284 | - } |
|
| 285 | - } |
|
| 286 | - if ($this->count_records_migrated() + $items_migrated_this_step >= $this->count_records_to_migrate()) { |
|
| 287 | - $this->set_status(EE_Data_Migration_Manager::status_completed); |
|
| 288 | - } |
|
| 289 | - return $items_migrated_this_step; |
|
| 290 | - } |
|
| 291 | - |
|
| 292 | - |
|
| 293 | - /** |
|
| 294 | - * Stores any extra 3.1 "event_meta" column things as post meta |
|
| 295 | - * |
|
| 296 | - * @param array $old_event |
|
| 297 | - * @param int $post_id |
|
| 298 | - * @return void |
|
| 299 | - */ |
|
| 300 | - private function _add_post_metas(array $old_event, int $post_id) |
|
| 301 | - { |
|
| 302 | - $event_meta = maybe_unserialize($old_event['event_meta']); |
|
| 303 | - if (! $event_meta || ! is_array($event_meta)) { |
|
| 304 | - return; |
|
| 305 | - } |
|
| 306 | - unset($event_meta['date_submitted']); // factored into CPT |
|
| 307 | - unset($event_meta['additional_attendee_reg_info']);// factored into event meta table |
|
| 308 | - unset($event_meta['default_payment_status']); // dido |
|
| 309 | - unset($event_meta['event_thumbnail_url']); // used to find post featured image |
|
| 310 | - foreach ($event_meta as $meta_key => $meta_value) { |
|
| 311 | - if ($meta_key) {// if the meta key is just an empty string, ignore it |
|
| 312 | - $success = add_post_meta($post_id, $meta_key, $meta_value, true); |
|
| 313 | - if (! $success) { |
|
| 314 | - $this->add_error( |
|
| 315 | - sprintf( |
|
| 316 | - esc_html__( |
|
| 317 | - "Could not add post meta for CPT with ID #%d. Meta key: '%s',meta value:'%d' for 3.1 event: %s", |
|
| 318 | - "event_espresso" |
|
| 319 | - ), |
|
| 320 | - $post_id, |
|
| 321 | - $meta_key, |
|
| 322 | - $meta_value, |
|
| 323 | - implode(",", $old_event) |
|
| 324 | - ) |
|
| 325 | - ); |
|
| 326 | - } |
|
| 327 | - } |
|
| 328 | - } |
|
| 329 | - if ($old_event['alt_email']) { |
|
| 330 | - add_post_meta($post_id, 'alt_email', $old_event['alt_email']); |
|
| 331 | - } |
|
| 332 | - if ($old_event['recurrence_id']) { |
|
| 333 | - add_post_meta($post_id, 'recurrence_id', $old_event['recurrence_id']); |
|
| 334 | - } |
|
| 335 | - } |
|
| 336 | - |
|
| 337 | - |
|
| 338 | - /** |
|
| 339 | - * Finds a unique slug for this event, given its name (we could have simply used |
|
| 340 | - * the old unique_identifier column, but it added a long string of seemingly random characters onto the end |
|
| 341 | - * and really wasn't that pretty for a slug, so we decided we'd make our own slug again) |
|
| 342 | - * |
|
| 343 | - * @param string $event_name (the name of the event for reading by humans) |
|
| 344 | - * @param string $old_identifier the old EE3 identifier (a long unique string) |
|
| 345 | - * @param string $new_post_status a post status |
|
| 346 | - * @return string |
|
| 347 | - */ |
|
| 348 | - private function _find_unique_slug( |
|
| 349 | - string $event_name, |
|
| 350 | - string $old_identifier = '', |
|
| 351 | - string $new_post_status = 'publish' |
|
| 352 | - ): string { |
|
| 353 | - $original_name = $event_name ? sanitize_title($event_name) : $old_identifier; |
|
| 354 | - return wp_unique_post_slug($original_name, 0, $new_post_status, EspressoPostType::EVENTS, 0); |
|
| 355 | - } |
|
| 356 | - |
|
| 357 | - |
|
| 358 | - /** |
|
| 359 | - * returns whether there is a post that has this same slug (post_title) |
|
| 360 | - * |
|
| 361 | - * @param string $slug |
|
| 362 | - * @return boolean |
|
| 363 | - * @global wpdb $wpdb |
|
| 364 | - */ |
|
| 365 | - private function _other_post_exists_with_that_slug(string $slug): bool |
|
| 366 | - { |
|
| 367 | - global $wpdb; |
|
| 368 | - $query = |
|
| 369 | - $wpdb->prepare( |
|
| 370 | - "SELECT COUNT(ID) FROM $this->_new_table WHERE event_status != 'D' AND post_name = %s", |
|
| 371 | - $slug |
|
| 372 | - ); |
|
| 373 | - $count = $wpdb->get_var($query); |
|
| 374 | - return (bool) intval($count); |
|
| 375 | - } |
|
| 376 | - |
|
| 377 | - |
|
| 378 | - /** |
|
| 379 | - * @param $old_event |
|
| 380 | - * @return int |
|
| 381 | - */ |
|
| 382 | - private function _insert_cpt($old_event): int |
|
| 383 | - { |
|
| 384 | - global $wpdb; |
|
| 385 | - // convert 3.1 event status to 4.1 CPT status |
|
| 386 | - // for reference, 3.1 event stati available for setting are: |
|
| 387 | - // $status = array(array('id' => 'A', 'text' => esc_html__('Public', 'event_espresso')), array('id' => 'S', 'text' => esc_html__('Waitlist', 'event_espresso')), array('id' => 'O', 'text' => esc_html__('Ongoing', 'event_espresso')), array('id' => 'R', 'text' => esc_html__('Draft', 'event_espresso')), array('id' => 'D', 'text' => esc_html__('Deleted', 'event_espresso'))); |
|
| 388 | - // and the json api uses the following to convert from 3.1 to 4.0 |
|
| 389 | - // 'S'=>'secondary/waitlist', |
|
| 390 | - // 'A'=>'active', |
|
| 391 | - // 'X'=>'denied', |
|
| 392 | - // 'IA'=>'inactive', |
|
| 393 | - // 'O'=>'ongoing', |
|
| 394 | - // 'P'=>'pending', |
|
| 395 | - // 'R'=>'draft', |
|
| 396 | - // 'D'=>'deleted'); |
|
| 397 | - // 4.1 Event Post stati are the normal post statis |
|
| 398 | - // (publish,future,draft,pending,private,trash,auto-draft,inherit) |
|
| 399 | - // and 3 custom ones: cancelled,postponed,sold_out |
|
| 400 | - $status_conversions = [ |
|
| 401 | - 'R' => 'draft', |
|
| 402 | - 'X' => 'draft', |
|
| 403 | - // 4.1 doesn't have a "not approved for publishing" status. this is what posts are set to that aren't approved |
|
| 404 | - 'P' => 'pending', |
|
| 405 | - 'IA' => 'draft', |
|
| 406 | - // draft and in the past |
|
| 407 | - // IA=inactive in 3.1: events were switched to this when they expired. in 4.1 that's just calculated |
|
| 408 | - 'O' => 'publish', |
|
| 409 | - // @todo: will be an event type later; if this is the status, set the end date WAAAY later; and add term for 'ongoing' |
|
| 410 | - 'A' => 'publish', |
|
| 411 | - 'S' => 'draft', |
|
| 412 | - // @todo: is it ok to just mark secondary/waitlist events as DRAFTS? |
|
| 413 | - 'D' => 'trash', |
|
| 414 | - ]; |
|
| 415 | - $post_status = $status_conversions[ $old_event['event_status'] ]; |
|
| 416 | - // check if we've sold out |
|
| 417 | - if (intval($old_event['reg_limit']) <= self::count_registrations($old_event['id'])) { |
|
| 418 | - $post_status = 'sold_out'; |
|
| 419 | - } |
|
| 420 | - // FYI postponed and cancelled don't exist in 3.1 |
|
| 421 | - $cols_n_values = [ |
|
| 422 | - 'post_title' => stripslashes($old_event['event_name']),// EVT_name |
|
| 423 | - 'post_content' => stripslashes($old_event['event_desc']),// EVT_desc |
|
| 424 | - 'post_name' => $this->_find_unique_slug( |
|
| 425 | - $old_event['event_name'], |
|
| 426 | - $old_event['event_identifier'], |
|
| 427 | - $post_status |
|
| 428 | - ),// EVT_slug |
|
| 429 | - 'post_date' => $old_event['submitted'],// EVT_created NOT |
|
| 430 | - 'post_date_gmt' => get_gmt_from_date($old_event['submitted']), |
|
| 431 | - 'post_excerpt' => '',// EVT_short_desc |
|
| 432 | - 'post_modified' => $old_event['submitted'],// EVT_modified |
|
| 433 | - 'post_modified_gmt' => get_gmt_from_date($old_event['submitted']), |
|
| 434 | - 'post_author' => $old_event['wp_user'],// EVT_wp_user |
|
| 435 | - 'post_parent' => 0,// parent maybe get this from some REM field? |
|
| 436 | - 'menu_order' => 0,// EVT_order |
|
| 437 | - 'post_type' => EspressoPostType::EVENTS,// post_type |
|
| 438 | - 'post_status' => $post_status,// status |
|
| 439 | - ]; |
|
| 440 | - $cols_n_values_with_no_invalid_text = []; |
|
| 441 | - foreach ($cols_n_values as $col => $value) { |
|
| 442 | - $value_sans_invalid_chars = $wpdb->strip_invalid_text_for_column($this->_new_table, $col, $value); |
|
| 443 | - if (! is_wp_error($value_sans_invalid_chars)) { |
|
| 444 | - $cols_n_values_with_no_invalid_text[ $col ] = $value_sans_invalid_chars; |
|
| 445 | - } else { |
|
| 446 | - // otherwise leave it as-is. It will blow everything up and stop the migration |
|
| 447 | - $cols_n_values_with_no_invalid_text[ $col ] = $value; |
|
| 448 | - } |
|
| 449 | - } |
|
| 450 | - $cols_n_values = $cols_n_values_with_no_invalid_text; |
|
| 451 | - $data_types = [ |
|
| 452 | - '%s',// EVT_name |
|
| 453 | - '%s',// EVT_desc |
|
| 454 | - '%s',// EVT_slug |
|
| 455 | - '%s',// EVT_created |
|
| 456 | - '%s', |
|
| 457 | - '%s',// EVT_short_desc |
|
| 458 | - '%s',// EVT_modified |
|
| 459 | - '%s', |
|
| 460 | - '%s',// EVT_wp_user |
|
| 461 | - '%d',// post_parent |
|
| 462 | - '%d',// EVT_order |
|
| 463 | - '%s',// post_type |
|
| 464 | - '%s',// status |
|
| 465 | - ]; |
|
| 466 | - $success = $wpdb->insert( |
|
| 467 | - $this->_new_table, |
|
| 468 | - $cols_n_values, |
|
| 469 | - $data_types |
|
| 470 | - ); |
|
| 471 | - if (! $success) { |
|
| 472 | - $this->add_error( |
|
| 473 | - $this->get_migration_script()->_create_error_message_for_db_insertion( |
|
| 474 | - $this->_old_table, |
|
| 475 | - $old_event, |
|
| 476 | - $this->_new_table, |
|
| 477 | - $cols_n_values, |
|
| 478 | - $data_types |
|
| 479 | - ) |
|
| 480 | - ); |
|
| 481 | - return 0; |
|
| 482 | - } |
|
| 483 | - return $wpdb->insert_id; |
|
| 484 | - } |
|
| 485 | - |
|
| 486 | - |
|
| 487 | - /** |
|
| 488 | - * Counts all the registrations for the event in the 3.1 DB. (takes into account attendee rows which represent |
|
| 489 | - * various registrations) |
|
| 490 | - * |
|
| 491 | - * @param int $event_id |
|
| 492 | - * @return int |
|
| 493 | - * @global wpdb $wpdb |
|
| 494 | - */ |
|
| 495 | - public static function count_registrations(int $event_id): int |
|
| 496 | - { |
|
| 497 | - global $wpdb; |
|
| 498 | - return (int) $wpdb->get_var( |
|
| 499 | - $wpdb->prepare("SELECT sum(quantity) FROM {$wpdb->prefix}events_attendee WHERE event_id=%d", $event_id) |
|
| 500 | - ); |
|
| 501 | - } |
|
| 502 | - |
|
| 503 | - |
|
| 504 | - /** |
|
| 505 | - * @param $old_event |
|
| 506 | - * @param $new_cpt_id |
|
| 507 | - * @return int |
|
| 508 | - */ |
|
| 509 | - private function _insert_event_meta($old_event, $new_cpt_id): int |
|
| 510 | - { |
|
| 511 | - global $wpdb; |
|
| 512 | - $event_meta = maybe_unserialize($old_event['event_meta']); |
|
| 513 | - // for reference, 3.1 'default_payment_status' are: $default_payment_status = array( |
|
| 514 | - // array('id' => "", 'text' => 'No Change'), |
|
| 515 | - // array('id' => 'Incomplete', 'text' => 'Incomplete'), |
|
| 516 | - // array('id' => 'Pending', 'text' => 'Pending'), |
|
| 517 | - // //array('id' => 'Completed', 'text' => 'Completed') |
|
| 518 | - // ); |
|
| 519 | - $default_reg_status = |
|
| 520 | - $this->get_migration_script()->convert_3_1_payment_status_to_4_1_STS_ID( |
|
| 521 | - $event_meta['default_payment_status'] ?? '', |
|
| 522 | - intval($old_event['require_pre_approval']) |
|
| 523 | - ); |
|
| 524 | - $cols_n_values = [ |
|
| 525 | - 'EVT_ID' => $new_cpt_id,// EVT_ID_fk |
|
| 526 | - 'EVT_display_desc' => 'Y' == $old_event['display_desc'], |
|
| 527 | - 'EVT_display_ticket_selector' => 'Y' == $old_event['display_reg_form'], |
|
| 528 | - 'EVT_visible_on' => $this->get_migration_script()->convert_date_string_to_utc( |
|
| 529 | - $this, |
|
| 530 | - $old_event, |
|
| 531 | - current_time( |
|
| 532 | - 'mysql' |
|
| 533 | - ), |
|
| 534 | - $old_event['timezone_string'] |
|
| 535 | - ),// don't use the old 'visible_on', as it wasn't ever used |
|
| 536 | - 'EVT_additional_limit' => $old_event['allow_multiple'] == 'N' ? 1 |
|
| 537 | - : $old_event['additional_limit'], |
|
| 538 | - 'EVT_default_registration_status' => $default_reg_status, |
|
| 539 | - 'EVT_member_only' => $old_event['member_only'], |
|
| 540 | - 'EVT_phone' => $old_event['phone'], |
|
| 541 | - 'EVT_allow_overflow' => 'Y' == $old_event['allow_overflow'], |
|
| 542 | - 'EVT_timezone_string' => $old_event['timezone_string'], |
|
| 543 | - 'EVT_external_URL' => $old_event['externalURL'], |
|
| 544 | - 'EVT_donations' => false,// doesn't exist in 3.1 |
|
| 545 | - |
|
| 546 | - ]; |
|
| 547 | - $data_types = [ |
|
| 548 | - '%s',// EVT_ID |
|
| 549 | - '%d',// EVT_display_desc |
|
| 550 | - '%d',// EVT_display_ticket_selector |
|
| 551 | - '%s',// EVT_visible_on |
|
| 552 | - '%d',// EVT_additional_limit |
|
| 553 | - '%s',// EVT_default_registration_status |
|
| 554 | - '%d',// EVT_member_only |
|
| 555 | - '%s',// EVT_phone |
|
| 556 | - '%d',// EVT_allow_overflow |
|
| 557 | - '%s',// EVT_timezone_string |
|
| 558 | - '%s',// EVT_external_URL |
|
| 559 | - '%d',// EVT_donations |
|
| 560 | - ]; |
|
| 561 | - $success = $wpdb->insert( |
|
| 562 | - $this->_new_meta_table, |
|
| 563 | - $cols_n_values, |
|
| 564 | - $data_types |
|
| 565 | - ); |
|
| 566 | - if (! $success) { |
|
| 567 | - $this->add_error( |
|
| 568 | - $this->get_migration_script()->_create_error_message_for_db_insertion( |
|
| 569 | - $this->_old_table, |
|
| 570 | - $old_event, |
|
| 571 | - $this->_new_meta_table, |
|
| 572 | - $cols_n_values, |
|
| 573 | - $data_types |
|
| 574 | - ) |
|
| 575 | - ); |
|
| 576 | - return 0; |
|
| 577 | - } |
|
| 578 | - return $wpdb->insert_id; |
|
| 579 | - } |
|
| 580 | - |
|
| 581 | - |
|
| 582 | - /** |
|
| 583 | - * @param $old_event |
|
| 584 | - * @return int |
|
| 585 | - */ |
|
| 586 | - private function _maybe_create_venue($old_event): int |
|
| 587 | - { |
|
| 588 | - if ( |
|
| 589 | - $old_event['address'] || |
|
| 590 | - $old_event['address2'] || |
|
| 591 | - $old_event['city'] || |
|
| 592 | - $old_event['state'] || |
|
| 593 | - $old_event['zip'] || |
|
| 594 | - $old_event['venue_title'] || |
|
| 595 | - $old_event['venue_url'] || |
|
| 596 | - $old_event['venue_image'] || |
|
| 597 | - $old_event['venue_phone'] || |
|
| 598 | - $old_event['virtual_url'] || |
|
| 599 | - $old_event['virtual_phone'] |
|
| 600 | - ) { |
|
| 601 | - $old_id = $this->_duplicate_venue_exists($old_event); |
|
| 602 | - if ($old_id) { |
|
| 603 | - return $old_id; |
|
| 604 | - } |
|
| 605 | - $new_id = $this->_insert_venue_into_posts($old_event); |
|
| 606 | - if ($new_id) { |
|
| 607 | - $this->_insert_venue_into_meta_table($new_id, $old_event); |
|
| 608 | - $guid = $old_event['venue_image'] ?? null; |
|
| 609 | - if ($guid) { |
|
| 610 | - $this->get_migration_script()->convert_image_url_to_attachment_and_attach_to_post( |
|
| 611 | - $guid, |
|
| 612 | - $new_id, |
|
| 613 | - $this |
|
| 614 | - ); |
|
| 615 | - } |
|
| 616 | - } |
|
| 617 | - // we don't bother recording the conversion from old events to venues as that |
|
| 618 | - // will complicate finding the conversion from old venues to new events |
|
| 619 | - return $new_id; |
|
| 620 | - } |
|
| 621 | - return 0; |
|
| 622 | - } |
|
| 623 | - |
|
| 624 | - |
|
| 625 | - /** |
|
| 626 | - * Assuming there is venue data on this event, check if there is a duplicate venue already in the system for it. |
|
| 627 | - * If so, return it. Otherwise, return NULL. |
|
| 628 | - * |
|
| 629 | - * @param array $old_event |
|
| 630 | - * @return int duplicate venue id |
|
| 631 | - */ |
|
| 632 | - private function _duplicate_venue_exists(array $old_event): int |
|
| 633 | - { |
|
| 634 | - global $wpdb; |
|
| 635 | - $conditions = [ |
|
| 636 | - 'VNU_address' => $old_event ['address'], |
|
| 637 | - 'VNU_address2' => $old_event['address2'], |
|
| 638 | - 'VNU_city' => $old_event['city'], |
|
| 639 | - 'VNU_zip' => $old_event['zip'], |
|
| 640 | - 'post_title' => $this->_get_venue_title_for_event($old_event), |
|
| 641 | - 'VNU_phone' => $old_event['venue_phone'],// VNU_phone |
|
| 642 | - 'VNU_url' => $old_event['venue_url'],// VNU_url |
|
| 643 | - 'VNU_virtual_phone' => $old_event['virtual_phone'],// VNU_virtual_phone |
|
| 644 | - 'VNU_virtual_url' => $old_event['virtual_url'],// VNU_virtual_url |
|
| 645 | - ]; |
|
| 646 | - $sql_conditions = []; |
|
| 647 | - foreach ($conditions as $column => $value) { |
|
| 648 | - $sql_conditions [] = $wpdb->prepare("$column = %s", $value); |
|
| 649 | - } |
|
| 650 | - $query = "SELECT VNU_ID |
|
| 179 | + private string $_old_start_end_table; |
|
| 180 | + |
|
| 181 | + private string $_new_meta_table; |
|
| 182 | + |
|
| 183 | + private string $_new_datetime_table; |
|
| 184 | + |
|
| 185 | + |
|
| 186 | + /** |
|
| 187 | + * Just initializes the status of the migration |
|
| 188 | + */ |
|
| 189 | + public function __construct() |
|
| 190 | + { |
|
| 191 | + global $wpdb; |
|
| 192 | + $this->_old_table = $wpdb->prefix . "events_detail"; |
|
| 193 | + $this->_old_start_end_table = $wpdb->prefix . "events_start_end"; |
|
| 194 | + $this->_new_table = $wpdb->prefix . "posts"; |
|
| 195 | + $this->_new_meta_table = $wpdb->prefix . "esp_event_meta"; |
|
| 196 | + $this->_new_datetime_table = $wpdb->prefix . "esp_datetime"; |
|
| 197 | + $this->_pretty_name = esc_html__("Events", "event_espresso"); |
|
| 198 | + parent::__construct(); |
|
| 199 | + } |
|
| 200 | + |
|
| 201 | + |
|
| 202 | + /** |
|
| 203 | + * Counts the records to migrate; the public version may cache it |
|
| 204 | + * |
|
| 205 | + * @return int |
|
| 206 | + */ |
|
| 207 | + public function _count_records_to_migrate(): int |
|
| 208 | + { |
|
| 209 | + global $wpdb; |
|
| 210 | + return (int) $wpdb->get_var("SELECT COUNT(*) FROM " . $this->_old_table . ' WHERE event_status !="D"'); |
|
| 211 | + } |
|
| 212 | + |
|
| 213 | + |
|
| 214 | + /** |
|
| 215 | + * IMPORTANT: if an error is encountered, or everything is finished, this stage should update its status property |
|
| 216 | + * accordingly. Note: it should not alter the count of items migrated. That is done in the public function that |
|
| 217 | + * calls this. IMPORTANT: The count of items migrated should ONLY be less than $num_items_to_migrate when it's the |
|
| 218 | + * last migration step, otherwise it should always return $num_items_to_migrate. (Eg, if we're migrating attendees |
|
| 219 | + * rows from the database, and $num_items_to_migrate is set to 50, then we SHOULD actually migrate 50 rows,but at |
|
| 220 | + * very least we MUST report/return 50 items migrated) |
|
| 221 | + * |
|
| 222 | + * @param int $num_items_to_migrate |
|
| 223 | + * @return int number of items ACTUALLY migrated |
|
| 224 | + * @throws EE_Error |
|
| 225 | + */ |
|
| 226 | + protected function _migration_step($num_items_to_migrate = 50) |
|
| 227 | + { |
|
| 228 | + global $wpdb; |
|
| 229 | + // because the migration of each event can be a LOT more work, make each step smaller |
|
| 230 | + $num_items_to_migrate = max(1, $num_items_to_migrate / 5); |
|
| 231 | + $events = |
|
| 232 | + $wpdb->get_results( |
|
| 233 | + $wpdb->prepare( |
|
| 234 | + "SELECT * FROM $this->_old_table WHERE event_status!='D' LIMIT %d,%d", |
|
| 235 | + $this->count_records_migrated(), |
|
| 236 | + $num_items_to_migrate |
|
| 237 | + ), |
|
| 238 | + ARRAY_A |
|
| 239 | + ); |
|
| 240 | + $items_migrated_this_step = 0; |
|
| 241 | + |
|
| 242 | + foreach ($events as $event_row) { |
|
| 243 | + $guid = null; |
|
| 244 | + // insert new 4.1 Attendee object using $wpdb |
|
| 245 | + $post_id = $this->_insert_cpt($event_row); |
|
| 246 | + if ($post_id) { |
|
| 247 | + $this->get_migration_script()->set_mapping( |
|
| 248 | + $this->_old_table, |
|
| 249 | + $event_row['id'], |
|
| 250 | + $this->_new_table, |
|
| 251 | + $post_id |
|
| 252 | + ); |
|
| 253 | + $meta_id = $this->_insert_event_meta($event_row, $post_id); |
|
| 254 | + if ($meta_id) { |
|
| 255 | + $this->get_migration_script()->set_mapping( |
|
| 256 | + $this->_old_table, |
|
| 257 | + $event_row['id'], |
|
| 258 | + $this->_new_meta_table, |
|
| 259 | + $meta_id |
|
| 260 | + ); |
|
| 261 | + } |
|
| 262 | + $this->_convert_start_end_times($event_row, $post_id); |
|
| 263 | + $event_meta = maybe_unserialize($event_row['event_meta']); |
|
| 264 | + $guid = $event_meta['event_thumbnail_url'] ?? null; |
|
| 265 | + if ($guid) { |
|
| 266 | + $this->get_migration_script()->convert_image_url_to_attachment_and_attach_to_post( |
|
| 267 | + $guid, |
|
| 268 | + $post_id, |
|
| 269 | + $this |
|
| 270 | + ); |
|
| 271 | + } |
|
| 272 | + // maybe create a venue from info on the event? |
|
| 273 | + $new_venue_id = $this->_maybe_create_venue($event_row); |
|
| 274 | + if ($new_venue_id) { |
|
| 275 | + $this->_insert_new_venue_to_event($post_id, $new_venue_id); |
|
| 276 | + } |
|
| 277 | + $this->_add_post_metas($event_row, $post_id); |
|
| 278 | + } |
|
| 279 | + $items_migrated_this_step++; |
|
| 280 | + if ($guid) { |
|
| 281 | + // if we had to check for an image attachment |
|
| 282 | + // then let's call it a day (avoid timing out, because this took a long time) |
|
| 283 | + break; |
|
| 284 | + } |
|
| 285 | + } |
|
| 286 | + if ($this->count_records_migrated() + $items_migrated_this_step >= $this->count_records_to_migrate()) { |
|
| 287 | + $this->set_status(EE_Data_Migration_Manager::status_completed); |
|
| 288 | + } |
|
| 289 | + return $items_migrated_this_step; |
|
| 290 | + } |
|
| 291 | + |
|
| 292 | + |
|
| 293 | + /** |
|
| 294 | + * Stores any extra 3.1 "event_meta" column things as post meta |
|
| 295 | + * |
|
| 296 | + * @param array $old_event |
|
| 297 | + * @param int $post_id |
|
| 298 | + * @return void |
|
| 299 | + */ |
|
| 300 | + private function _add_post_metas(array $old_event, int $post_id) |
|
| 301 | + { |
|
| 302 | + $event_meta = maybe_unserialize($old_event['event_meta']); |
|
| 303 | + if (! $event_meta || ! is_array($event_meta)) { |
|
| 304 | + return; |
|
| 305 | + } |
|
| 306 | + unset($event_meta['date_submitted']); // factored into CPT |
|
| 307 | + unset($event_meta['additional_attendee_reg_info']);// factored into event meta table |
|
| 308 | + unset($event_meta['default_payment_status']); // dido |
|
| 309 | + unset($event_meta['event_thumbnail_url']); // used to find post featured image |
|
| 310 | + foreach ($event_meta as $meta_key => $meta_value) { |
|
| 311 | + if ($meta_key) {// if the meta key is just an empty string, ignore it |
|
| 312 | + $success = add_post_meta($post_id, $meta_key, $meta_value, true); |
|
| 313 | + if (! $success) { |
|
| 314 | + $this->add_error( |
|
| 315 | + sprintf( |
|
| 316 | + esc_html__( |
|
| 317 | + "Could not add post meta for CPT with ID #%d. Meta key: '%s',meta value:'%d' for 3.1 event: %s", |
|
| 318 | + "event_espresso" |
|
| 319 | + ), |
|
| 320 | + $post_id, |
|
| 321 | + $meta_key, |
|
| 322 | + $meta_value, |
|
| 323 | + implode(",", $old_event) |
|
| 324 | + ) |
|
| 325 | + ); |
|
| 326 | + } |
|
| 327 | + } |
|
| 328 | + } |
|
| 329 | + if ($old_event['alt_email']) { |
|
| 330 | + add_post_meta($post_id, 'alt_email', $old_event['alt_email']); |
|
| 331 | + } |
|
| 332 | + if ($old_event['recurrence_id']) { |
|
| 333 | + add_post_meta($post_id, 'recurrence_id', $old_event['recurrence_id']); |
|
| 334 | + } |
|
| 335 | + } |
|
| 336 | + |
|
| 337 | + |
|
| 338 | + /** |
|
| 339 | + * Finds a unique slug for this event, given its name (we could have simply used |
|
| 340 | + * the old unique_identifier column, but it added a long string of seemingly random characters onto the end |
|
| 341 | + * and really wasn't that pretty for a slug, so we decided we'd make our own slug again) |
|
| 342 | + * |
|
| 343 | + * @param string $event_name (the name of the event for reading by humans) |
|
| 344 | + * @param string $old_identifier the old EE3 identifier (a long unique string) |
|
| 345 | + * @param string $new_post_status a post status |
|
| 346 | + * @return string |
|
| 347 | + */ |
|
| 348 | + private function _find_unique_slug( |
|
| 349 | + string $event_name, |
|
| 350 | + string $old_identifier = '', |
|
| 351 | + string $new_post_status = 'publish' |
|
| 352 | + ): string { |
|
| 353 | + $original_name = $event_name ? sanitize_title($event_name) : $old_identifier; |
|
| 354 | + return wp_unique_post_slug($original_name, 0, $new_post_status, EspressoPostType::EVENTS, 0); |
|
| 355 | + } |
|
| 356 | + |
|
| 357 | + |
|
| 358 | + /** |
|
| 359 | + * returns whether there is a post that has this same slug (post_title) |
|
| 360 | + * |
|
| 361 | + * @param string $slug |
|
| 362 | + * @return boolean |
|
| 363 | + * @global wpdb $wpdb |
|
| 364 | + */ |
|
| 365 | + private function _other_post_exists_with_that_slug(string $slug): bool |
|
| 366 | + { |
|
| 367 | + global $wpdb; |
|
| 368 | + $query = |
|
| 369 | + $wpdb->prepare( |
|
| 370 | + "SELECT COUNT(ID) FROM $this->_new_table WHERE event_status != 'D' AND post_name = %s", |
|
| 371 | + $slug |
|
| 372 | + ); |
|
| 373 | + $count = $wpdb->get_var($query); |
|
| 374 | + return (bool) intval($count); |
|
| 375 | + } |
|
| 376 | + |
|
| 377 | + |
|
| 378 | + /** |
|
| 379 | + * @param $old_event |
|
| 380 | + * @return int |
|
| 381 | + */ |
|
| 382 | + private function _insert_cpt($old_event): int |
|
| 383 | + { |
|
| 384 | + global $wpdb; |
|
| 385 | + // convert 3.1 event status to 4.1 CPT status |
|
| 386 | + // for reference, 3.1 event stati available for setting are: |
|
| 387 | + // $status = array(array('id' => 'A', 'text' => esc_html__('Public', 'event_espresso')), array('id' => 'S', 'text' => esc_html__('Waitlist', 'event_espresso')), array('id' => 'O', 'text' => esc_html__('Ongoing', 'event_espresso')), array('id' => 'R', 'text' => esc_html__('Draft', 'event_espresso')), array('id' => 'D', 'text' => esc_html__('Deleted', 'event_espresso'))); |
|
| 388 | + // and the json api uses the following to convert from 3.1 to 4.0 |
|
| 389 | + // 'S'=>'secondary/waitlist', |
|
| 390 | + // 'A'=>'active', |
|
| 391 | + // 'X'=>'denied', |
|
| 392 | + // 'IA'=>'inactive', |
|
| 393 | + // 'O'=>'ongoing', |
|
| 394 | + // 'P'=>'pending', |
|
| 395 | + // 'R'=>'draft', |
|
| 396 | + // 'D'=>'deleted'); |
|
| 397 | + // 4.1 Event Post stati are the normal post statis |
|
| 398 | + // (publish,future,draft,pending,private,trash,auto-draft,inherit) |
|
| 399 | + // and 3 custom ones: cancelled,postponed,sold_out |
|
| 400 | + $status_conversions = [ |
|
| 401 | + 'R' => 'draft', |
|
| 402 | + 'X' => 'draft', |
|
| 403 | + // 4.1 doesn't have a "not approved for publishing" status. this is what posts are set to that aren't approved |
|
| 404 | + 'P' => 'pending', |
|
| 405 | + 'IA' => 'draft', |
|
| 406 | + // draft and in the past |
|
| 407 | + // IA=inactive in 3.1: events were switched to this when they expired. in 4.1 that's just calculated |
|
| 408 | + 'O' => 'publish', |
|
| 409 | + // @todo: will be an event type later; if this is the status, set the end date WAAAY later; and add term for 'ongoing' |
|
| 410 | + 'A' => 'publish', |
|
| 411 | + 'S' => 'draft', |
|
| 412 | + // @todo: is it ok to just mark secondary/waitlist events as DRAFTS? |
|
| 413 | + 'D' => 'trash', |
|
| 414 | + ]; |
|
| 415 | + $post_status = $status_conversions[ $old_event['event_status'] ]; |
|
| 416 | + // check if we've sold out |
|
| 417 | + if (intval($old_event['reg_limit']) <= self::count_registrations($old_event['id'])) { |
|
| 418 | + $post_status = 'sold_out'; |
|
| 419 | + } |
|
| 420 | + // FYI postponed and cancelled don't exist in 3.1 |
|
| 421 | + $cols_n_values = [ |
|
| 422 | + 'post_title' => stripslashes($old_event['event_name']),// EVT_name |
|
| 423 | + 'post_content' => stripslashes($old_event['event_desc']),// EVT_desc |
|
| 424 | + 'post_name' => $this->_find_unique_slug( |
|
| 425 | + $old_event['event_name'], |
|
| 426 | + $old_event['event_identifier'], |
|
| 427 | + $post_status |
|
| 428 | + ),// EVT_slug |
|
| 429 | + 'post_date' => $old_event['submitted'],// EVT_created NOT |
|
| 430 | + 'post_date_gmt' => get_gmt_from_date($old_event['submitted']), |
|
| 431 | + 'post_excerpt' => '',// EVT_short_desc |
|
| 432 | + 'post_modified' => $old_event['submitted'],// EVT_modified |
|
| 433 | + 'post_modified_gmt' => get_gmt_from_date($old_event['submitted']), |
|
| 434 | + 'post_author' => $old_event['wp_user'],// EVT_wp_user |
|
| 435 | + 'post_parent' => 0,// parent maybe get this from some REM field? |
|
| 436 | + 'menu_order' => 0,// EVT_order |
|
| 437 | + 'post_type' => EspressoPostType::EVENTS,// post_type |
|
| 438 | + 'post_status' => $post_status,// status |
|
| 439 | + ]; |
|
| 440 | + $cols_n_values_with_no_invalid_text = []; |
|
| 441 | + foreach ($cols_n_values as $col => $value) { |
|
| 442 | + $value_sans_invalid_chars = $wpdb->strip_invalid_text_for_column($this->_new_table, $col, $value); |
|
| 443 | + if (! is_wp_error($value_sans_invalid_chars)) { |
|
| 444 | + $cols_n_values_with_no_invalid_text[ $col ] = $value_sans_invalid_chars; |
|
| 445 | + } else { |
|
| 446 | + // otherwise leave it as-is. It will blow everything up and stop the migration |
|
| 447 | + $cols_n_values_with_no_invalid_text[ $col ] = $value; |
|
| 448 | + } |
|
| 449 | + } |
|
| 450 | + $cols_n_values = $cols_n_values_with_no_invalid_text; |
|
| 451 | + $data_types = [ |
|
| 452 | + '%s',// EVT_name |
|
| 453 | + '%s',// EVT_desc |
|
| 454 | + '%s',// EVT_slug |
|
| 455 | + '%s',// EVT_created |
|
| 456 | + '%s', |
|
| 457 | + '%s',// EVT_short_desc |
|
| 458 | + '%s',// EVT_modified |
|
| 459 | + '%s', |
|
| 460 | + '%s',// EVT_wp_user |
|
| 461 | + '%d',// post_parent |
|
| 462 | + '%d',// EVT_order |
|
| 463 | + '%s',// post_type |
|
| 464 | + '%s',// status |
|
| 465 | + ]; |
|
| 466 | + $success = $wpdb->insert( |
|
| 467 | + $this->_new_table, |
|
| 468 | + $cols_n_values, |
|
| 469 | + $data_types |
|
| 470 | + ); |
|
| 471 | + if (! $success) { |
|
| 472 | + $this->add_error( |
|
| 473 | + $this->get_migration_script()->_create_error_message_for_db_insertion( |
|
| 474 | + $this->_old_table, |
|
| 475 | + $old_event, |
|
| 476 | + $this->_new_table, |
|
| 477 | + $cols_n_values, |
|
| 478 | + $data_types |
|
| 479 | + ) |
|
| 480 | + ); |
|
| 481 | + return 0; |
|
| 482 | + } |
|
| 483 | + return $wpdb->insert_id; |
|
| 484 | + } |
|
| 485 | + |
|
| 486 | + |
|
| 487 | + /** |
|
| 488 | + * Counts all the registrations for the event in the 3.1 DB. (takes into account attendee rows which represent |
|
| 489 | + * various registrations) |
|
| 490 | + * |
|
| 491 | + * @param int $event_id |
|
| 492 | + * @return int |
|
| 493 | + * @global wpdb $wpdb |
|
| 494 | + */ |
|
| 495 | + public static function count_registrations(int $event_id): int |
|
| 496 | + { |
|
| 497 | + global $wpdb; |
|
| 498 | + return (int) $wpdb->get_var( |
|
| 499 | + $wpdb->prepare("SELECT sum(quantity) FROM {$wpdb->prefix}events_attendee WHERE event_id=%d", $event_id) |
|
| 500 | + ); |
|
| 501 | + } |
|
| 502 | + |
|
| 503 | + |
|
| 504 | + /** |
|
| 505 | + * @param $old_event |
|
| 506 | + * @param $new_cpt_id |
|
| 507 | + * @return int |
|
| 508 | + */ |
|
| 509 | + private function _insert_event_meta($old_event, $new_cpt_id): int |
|
| 510 | + { |
|
| 511 | + global $wpdb; |
|
| 512 | + $event_meta = maybe_unserialize($old_event['event_meta']); |
|
| 513 | + // for reference, 3.1 'default_payment_status' are: $default_payment_status = array( |
|
| 514 | + // array('id' => "", 'text' => 'No Change'), |
|
| 515 | + // array('id' => 'Incomplete', 'text' => 'Incomplete'), |
|
| 516 | + // array('id' => 'Pending', 'text' => 'Pending'), |
|
| 517 | + // //array('id' => 'Completed', 'text' => 'Completed') |
|
| 518 | + // ); |
|
| 519 | + $default_reg_status = |
|
| 520 | + $this->get_migration_script()->convert_3_1_payment_status_to_4_1_STS_ID( |
|
| 521 | + $event_meta['default_payment_status'] ?? '', |
|
| 522 | + intval($old_event['require_pre_approval']) |
|
| 523 | + ); |
|
| 524 | + $cols_n_values = [ |
|
| 525 | + 'EVT_ID' => $new_cpt_id,// EVT_ID_fk |
|
| 526 | + 'EVT_display_desc' => 'Y' == $old_event['display_desc'], |
|
| 527 | + 'EVT_display_ticket_selector' => 'Y' == $old_event['display_reg_form'], |
|
| 528 | + 'EVT_visible_on' => $this->get_migration_script()->convert_date_string_to_utc( |
|
| 529 | + $this, |
|
| 530 | + $old_event, |
|
| 531 | + current_time( |
|
| 532 | + 'mysql' |
|
| 533 | + ), |
|
| 534 | + $old_event['timezone_string'] |
|
| 535 | + ),// don't use the old 'visible_on', as it wasn't ever used |
|
| 536 | + 'EVT_additional_limit' => $old_event['allow_multiple'] == 'N' ? 1 |
|
| 537 | + : $old_event['additional_limit'], |
|
| 538 | + 'EVT_default_registration_status' => $default_reg_status, |
|
| 539 | + 'EVT_member_only' => $old_event['member_only'], |
|
| 540 | + 'EVT_phone' => $old_event['phone'], |
|
| 541 | + 'EVT_allow_overflow' => 'Y' == $old_event['allow_overflow'], |
|
| 542 | + 'EVT_timezone_string' => $old_event['timezone_string'], |
|
| 543 | + 'EVT_external_URL' => $old_event['externalURL'], |
|
| 544 | + 'EVT_donations' => false,// doesn't exist in 3.1 |
|
| 545 | + |
|
| 546 | + ]; |
|
| 547 | + $data_types = [ |
|
| 548 | + '%s',// EVT_ID |
|
| 549 | + '%d',// EVT_display_desc |
|
| 550 | + '%d',// EVT_display_ticket_selector |
|
| 551 | + '%s',// EVT_visible_on |
|
| 552 | + '%d',// EVT_additional_limit |
|
| 553 | + '%s',// EVT_default_registration_status |
|
| 554 | + '%d',// EVT_member_only |
|
| 555 | + '%s',// EVT_phone |
|
| 556 | + '%d',// EVT_allow_overflow |
|
| 557 | + '%s',// EVT_timezone_string |
|
| 558 | + '%s',// EVT_external_URL |
|
| 559 | + '%d',// EVT_donations |
|
| 560 | + ]; |
|
| 561 | + $success = $wpdb->insert( |
|
| 562 | + $this->_new_meta_table, |
|
| 563 | + $cols_n_values, |
|
| 564 | + $data_types |
|
| 565 | + ); |
|
| 566 | + if (! $success) { |
|
| 567 | + $this->add_error( |
|
| 568 | + $this->get_migration_script()->_create_error_message_for_db_insertion( |
|
| 569 | + $this->_old_table, |
|
| 570 | + $old_event, |
|
| 571 | + $this->_new_meta_table, |
|
| 572 | + $cols_n_values, |
|
| 573 | + $data_types |
|
| 574 | + ) |
|
| 575 | + ); |
|
| 576 | + return 0; |
|
| 577 | + } |
|
| 578 | + return $wpdb->insert_id; |
|
| 579 | + } |
|
| 580 | + |
|
| 581 | + |
|
| 582 | + /** |
|
| 583 | + * @param $old_event |
|
| 584 | + * @return int |
|
| 585 | + */ |
|
| 586 | + private function _maybe_create_venue($old_event): int |
|
| 587 | + { |
|
| 588 | + if ( |
|
| 589 | + $old_event['address'] || |
|
| 590 | + $old_event['address2'] || |
|
| 591 | + $old_event['city'] || |
|
| 592 | + $old_event['state'] || |
|
| 593 | + $old_event['zip'] || |
|
| 594 | + $old_event['venue_title'] || |
|
| 595 | + $old_event['venue_url'] || |
|
| 596 | + $old_event['venue_image'] || |
|
| 597 | + $old_event['venue_phone'] || |
|
| 598 | + $old_event['virtual_url'] || |
|
| 599 | + $old_event['virtual_phone'] |
|
| 600 | + ) { |
|
| 601 | + $old_id = $this->_duplicate_venue_exists($old_event); |
|
| 602 | + if ($old_id) { |
|
| 603 | + return $old_id; |
|
| 604 | + } |
|
| 605 | + $new_id = $this->_insert_venue_into_posts($old_event); |
|
| 606 | + if ($new_id) { |
|
| 607 | + $this->_insert_venue_into_meta_table($new_id, $old_event); |
|
| 608 | + $guid = $old_event['venue_image'] ?? null; |
|
| 609 | + if ($guid) { |
|
| 610 | + $this->get_migration_script()->convert_image_url_to_attachment_and_attach_to_post( |
|
| 611 | + $guid, |
|
| 612 | + $new_id, |
|
| 613 | + $this |
|
| 614 | + ); |
|
| 615 | + } |
|
| 616 | + } |
|
| 617 | + // we don't bother recording the conversion from old events to venues as that |
|
| 618 | + // will complicate finding the conversion from old venues to new events |
|
| 619 | + return $new_id; |
|
| 620 | + } |
|
| 621 | + return 0; |
|
| 622 | + } |
|
| 623 | + |
|
| 624 | + |
|
| 625 | + /** |
|
| 626 | + * Assuming there is venue data on this event, check if there is a duplicate venue already in the system for it. |
|
| 627 | + * If so, return it. Otherwise, return NULL. |
|
| 628 | + * |
|
| 629 | + * @param array $old_event |
|
| 630 | + * @return int duplicate venue id |
|
| 631 | + */ |
|
| 632 | + private function _duplicate_venue_exists(array $old_event): int |
|
| 633 | + { |
|
| 634 | + global $wpdb; |
|
| 635 | + $conditions = [ |
|
| 636 | + 'VNU_address' => $old_event ['address'], |
|
| 637 | + 'VNU_address2' => $old_event['address2'], |
|
| 638 | + 'VNU_city' => $old_event['city'], |
|
| 639 | + 'VNU_zip' => $old_event['zip'], |
|
| 640 | + 'post_title' => $this->_get_venue_title_for_event($old_event), |
|
| 641 | + 'VNU_phone' => $old_event['venue_phone'],// VNU_phone |
|
| 642 | + 'VNU_url' => $old_event['venue_url'],// VNU_url |
|
| 643 | + 'VNU_virtual_phone' => $old_event['virtual_phone'],// VNU_virtual_phone |
|
| 644 | + 'VNU_virtual_url' => $old_event['virtual_url'],// VNU_virtual_url |
|
| 645 | + ]; |
|
| 646 | + $sql_conditions = []; |
|
| 647 | + foreach ($conditions as $column => $value) { |
|
| 648 | + $sql_conditions [] = $wpdb->prepare("$column = %s", $value); |
|
| 649 | + } |
|
| 650 | + $query = "SELECT VNU_ID |
|
| 651 | 651 | FROM |
| 652 | 652 | $wpdb->posts as p INNER JOIN |
| 653 | 653 | {$wpdb->prefix}esp_venue_meta as v ON p.ID = v.VNU_ID |
| 654 | 654 | WHERE " . implode(" AND ", $sql_conditions) . " LIMIT 1"; |
| 655 | - return (int) $wpdb->get_var($query); |
|
| 656 | - } |
|
| 657 | - |
|
| 658 | - |
|
| 659 | - /** |
|
| 660 | - * Gets teh venue's title or makes one up if there is none |
|
| 661 | - * |
|
| 662 | - * @param array $event_data_array keys are events_details columns and values are their values |
|
| 663 | - * @return string |
|
| 664 | - */ |
|
| 665 | - protected function _get_venue_title_for_event(array $event_data_array): string |
|
| 666 | - { |
|
| 667 | - return $event_data_array['venue_title'] |
|
| 668 | - ? stripslashes($event_data_array['venue_title']) |
|
| 669 | - : stripslashes( |
|
| 670 | - sprintf( |
|
| 671 | - esc_html__('Venue of %s', 'event_espresso'), |
|
| 672 | - $event_data_array['event_name'] |
|
| 673 | - ) |
|
| 674 | - ); |
|
| 675 | - } |
|
| 676 | - |
|
| 677 | - |
|
| 678 | - /** |
|
| 679 | - * Inserts the CPT |
|
| 680 | - * |
|
| 681 | - * @param array $old_event keys are cols, values are col values |
|
| 682 | - * @return int |
|
| 683 | - */ |
|
| 684 | - private function _insert_venue_into_posts(array $old_event): int |
|
| 685 | - { |
|
| 686 | - global $wpdb; |
|
| 687 | - $insertion_array = [ |
|
| 688 | - 'post_title' => $this->_get_venue_title_for_event($old_event),// VNU_name |
|
| 689 | - 'post_content' => '',// VNU_desc |
|
| 690 | - 'post_name' => $this->_find_unique_slug( |
|
| 691 | - $old_event['venue_title'], |
|
| 692 | - sanitize_title('venue-of-' . $old_event['event_name']) |
|
| 693 | - ),// VNU_identifier |
|
| 694 | - 'post_date' => current_time('mysql'),// VNU_created |
|
| 695 | - 'post_date_gmt' => get_gmt_from_date(current_time('mysql')), |
|
| 696 | - 'post_excerpt' => '',// VNU_short_desc arbitrary only 50 characters |
|
| 697 | - 'post_modified' => current_time('mysql'),// VNU_modified |
|
| 698 | - 'post_modified_gmt' => get_gmt_from_date(current_time('mysql')), |
|
| 699 | - 'post_author' => $old_event['wp_user'],// VNU_wp_user |
|
| 700 | - 'post_parent' => 0,// parent |
|
| 701 | - 'menu_order' => 0,// VNU_order |
|
| 702 | - 'post_type' => EspressoPostType::VENUES,// post_type |
|
| 703 | - ]; |
|
| 704 | - $data_types_array = [ |
|
| 705 | - '%s',// VNU_name |
|
| 706 | - '%s',// VNU_desc |
|
| 707 | - '%s',// VNU_identifier |
|
| 708 | - '%s',// VNU_created |
|
| 709 | - '%s', |
|
| 710 | - '%s',// VNU_short_desc |
|
| 711 | - '%s',// VNU_modified |
|
| 712 | - '%s', |
|
| 713 | - '%d',// VNU_wp_user |
|
| 714 | - '%d',// parent |
|
| 715 | - '%d',// VNU_order |
|
| 716 | - '%s',// post_type |
|
| 717 | - ]; |
|
| 718 | - $success = $wpdb->insert( |
|
| 719 | - $wpdb->posts, |
|
| 720 | - $insertion_array, |
|
| 721 | - $data_types_array |
|
| 722 | - ); |
|
| 723 | - if (! $success) { |
|
| 724 | - $this->add_error( |
|
| 725 | - $this->get_migration_script()->_create_error_message_for_db_insertion( |
|
| 726 | - $this->_old_table, |
|
| 727 | - $old_event, |
|
| 728 | - $this->_new_table, |
|
| 729 | - $insertion_array, |
|
| 730 | - $data_types_array |
|
| 731 | - ) |
|
| 732 | - ); |
|
| 733 | - return 0; |
|
| 734 | - } |
|
| 735 | - return $wpdb->insert_id; |
|
| 736 | - } |
|
| 737 | - |
|
| 738 | - |
|
| 739 | - /** |
|
| 740 | - * Inserts into the venue_meta table |
|
| 741 | - * |
|
| 742 | - * @param int $cpt_id |
|
| 743 | - * @param array $old_event |
|
| 744 | - * @return void |
|
| 745 | - */ |
|
| 746 | - private function _insert_venue_into_meta_table(int $cpt_id, array $old_event): void |
|
| 747 | - { |
|
| 748 | - global $wpdb; |
|
| 749 | - |
|
| 750 | - // assume the country is the same as the organization's old settings |
|
| 751 | - $country_iso = $this->get_migration_script()->get_default_country_iso(); |
|
| 752 | - // find the state from the venue, or the organization, or just guess california |
|
| 753 | - if (! $old_event['state']) { |
|
| 754 | - $old_org_options = get_option('events_organization_settings'); |
|
| 755 | - $state_name = stripslashes($old_org_options['organization_state']); |
|
| 756 | - } else { |
|
| 757 | - $state_name = $old_event['state']; |
|
| 758 | - } |
|
| 759 | - if (! $state_name) { |
|
| 760 | - $state_name = 'CA'; |
|
| 761 | - } |
|
| 762 | - // get a state ID with the same name, if possible |
|
| 763 | - try { |
|
| 764 | - $state = $this->get_migration_script()->get_or_create_state($state_name, $country_iso); |
|
| 765 | - $state_id = $state['STA_ID']; |
|
| 766 | - } catch (EE_Error $e) { |
|
| 767 | - $this->add_error($e->getMessage()); |
|
| 768 | - $state_id = 0; |
|
| 769 | - } |
|
| 770 | - // now insert into meta table |
|
| 771 | - $insertion_array = [ |
|
| 772 | - 'VNU_ID' => $cpt_id,// VNU_ID_fk |
|
| 773 | - 'VNU_address' => stripslashes($old_event['address']),// VNU_address |
|
| 774 | - 'VNU_address2' => stripslashes($old_event['address2']),// VNU_address2 |
|
| 775 | - 'VNU_city' => stripslashes($old_event['city']),// VNU_city |
|
| 776 | - 'STA_ID' => $state_id,// STA_ID |
|
| 777 | - 'CNT_ISO' => $country_iso,// CNT_ISO |
|
| 778 | - 'VNU_zip' => $old_event['zip'],// VNU_zip |
|
| 779 | - 'VNU_phone' => $old_event['venue_phone'],// VNU_phone |
|
| 780 | - 'VNU_capacity' => -1,// VNU_capacity |
|
| 781 | - 'VNU_url' => $old_event['venue_url'],// VNU_url |
|
| 782 | - 'VNU_virtual_phone' => $old_event['virtual_phone'],// VNU_virtual_phone |
|
| 783 | - 'VNU_virtual_url' => $old_event['virtual_url'],// VNU_virtual_url |
|
| 784 | - 'VNU_google_map_link' => '',// VNU_google_map_link |
|
| 785 | - 'VNU_enable_for_gmap' => true, // VNU_enable_for_gmap |
|
| 786 | - ]; |
|
| 787 | - $data_types = [ |
|
| 788 | - '%d',// VNU_ID_fk |
|
| 789 | - '%s',// VNU_address |
|
| 790 | - '%s',// VNU_address2 |
|
| 791 | - '%s',// VNU_city |
|
| 792 | - '%d',// STA_ID |
|
| 793 | - '%s',// CNT_ISO |
|
| 794 | - '%s',// VNU_zip |
|
| 795 | - '%s',// VNU_phone |
|
| 796 | - '%d',// VNU_capacity |
|
| 797 | - '%s',// VNU_url |
|
| 798 | - '%s',// VNU_virtual_phone |
|
| 799 | - '%s',// VNU_virtual_url |
|
| 800 | - '%s',// VNU_google_map_link |
|
| 801 | - '%d',// VNU_enable_for_gmap |
|
| 802 | - ]; |
|
| 803 | - $success = $wpdb->insert($wpdb->prefix . "esp_venue_meta", $insertion_array, $data_types); |
|
| 804 | - if (! $success) { |
|
| 805 | - $this->add_error( |
|
| 806 | - $this->get_migration_script()->_create_error_message_for_db_insertion( |
|
| 807 | - $this->_old_table, |
|
| 808 | - $old_event, |
|
| 809 | - $this->_new_meta_table, |
|
| 810 | - $insertion_array, |
|
| 811 | - $data_types |
|
| 812 | - ) |
|
| 813 | - ); |
|
| 814 | - } |
|
| 815 | - } |
|
| 816 | - |
|
| 817 | - |
|
| 818 | - /** |
|
| 819 | - * @param $new_event_id |
|
| 820 | - * @param $new_venue_id |
|
| 821 | - * @return void |
|
| 822 | - */ |
|
| 823 | - private function _insert_new_venue_to_event($new_event_id, $new_venue_id): void |
|
| 824 | - { |
|
| 825 | - global $wpdb; |
|
| 826 | - if (! $new_event_id) { |
|
| 827 | - $this->add_error( |
|
| 828 | - sprintf(esc_html__("Could not find 4.1 event id for 3.1 event #%d.", "event_espresso"), $new_event_id) |
|
| 829 | - ); |
|
| 830 | - return; |
|
| 831 | - } |
|
| 832 | - if (! $new_venue_id) { |
|
| 833 | - $this->add_error( |
|
| 834 | - sprintf(esc_html__("Could not find 4.1 venue id for 3.1 venue #%d.", "event_espresso"), $new_venue_id) |
|
| 835 | - ); |
|
| 836 | - return; |
|
| 837 | - } |
|
| 838 | - $cols_n_values = [ |
|
| 839 | - 'EVT_ID' => $new_event_id, |
|
| 840 | - 'VNU_ID' => $new_venue_id, |
|
| 841 | - 'EVV_primary' => true, |
|
| 842 | - ]; |
|
| 843 | - $data_types = [ |
|
| 844 | - '%d',// EVT_ID |
|
| 845 | - '%d',// VNU_ID |
|
| 846 | - '%d',// EVT_primary |
|
| 847 | - ]; |
|
| 848 | - $success = $wpdb->insert($wpdb->prefix . "esp_event_venue", $cols_n_values, $data_types); |
|
| 849 | - if (! $success) { |
|
| 850 | - $this->add_error( |
|
| 851 | - $this->get_migration_script()->_create_error_message_for_db_insertion( |
|
| 852 | - $this->_old_table, |
|
| 853 | - [], |
|
| 854 | - $this->_new_table, |
|
| 855 | - $cols_n_values, |
|
| 856 | - $data_types |
|
| 857 | - ) |
|
| 858 | - ); |
|
| 859 | - } |
|
| 860 | - } |
|
| 861 | - |
|
| 862 | - |
|
| 863 | - /** |
|
| 864 | - * Converts all the 3.1 start-end times for the event to 4.1 datetimes |
|
| 865 | - * |
|
| 866 | - * @param array $old_event results of get_results(...,ARRAY_A) |
|
| 867 | - * @param int $new_cpt_id new post ID |
|
| 868 | - * @return void (if there are errors though, adds them to the stage's error list |
|
| 869 | - * @throws EE_Error |
|
| 870 | - * @global wpdb $wpdb |
|
| 871 | - */ |
|
| 872 | - private function _convert_start_end_times(array $old_event, int $new_cpt_id) |
|
| 873 | - { |
|
| 874 | - $start_end_times = $this->_get_old_start_end_times($old_event['id']); |
|
| 875 | - foreach ($start_end_times as $start_end_time) { |
|
| 876 | - $datetime_id = $this->_insert_new_datetime($start_end_time, $old_event, $new_cpt_id); |
|
| 877 | - if ($datetime_id) { |
|
| 878 | - $this->get_migration_script()->set_mapping( |
|
| 879 | - $this->_old_start_end_table, |
|
| 880 | - $start_end_time['id'], |
|
| 881 | - $this->_new_datetime_table, |
|
| 882 | - $datetime_id |
|
| 883 | - ); |
|
| 884 | - } |
|
| 885 | - } |
|
| 886 | - } |
|
| 887 | - |
|
| 888 | - |
|
| 889 | - /** |
|
| 890 | - * Queries the 3.1 wp_events_start_end table to get all the start and end times for the event |
|
| 891 | - * |
|
| 892 | - * @param int $old_event_id |
|
| 893 | - * @return array |
|
| 894 | - * @global wpdb $wpdb |
|
| 895 | - */ |
|
| 896 | - private function _get_old_start_end_times(int $old_event_id): array |
|
| 897 | - { |
|
| 898 | - global $wpdb; |
|
| 899 | - return $wpdb->get_results( |
|
| 900 | - $wpdb->prepare("SELECT * FROM $this->_old_start_end_table WHERE event_id=%d", $old_event_id), |
|
| 901 | - ARRAY_A |
|
| 902 | - ); |
|
| 903 | - } |
|
| 904 | - |
|
| 905 | - |
|
| 906 | - /** |
|
| 907 | - * Inserts a 4.1 datetime given the 3.1 start_end db row and event_details row |
|
| 908 | - * |
|
| 909 | - * @param array $start_end_time_row |
|
| 910 | - * @param array $old_event_row |
|
| 911 | - * @param int $new_cpt_id |
|
| 912 | - * @return int ID of new datetime |
|
| 913 | - */ |
|
| 914 | - private function _insert_new_datetime(array $start_end_time_row, array $old_event_row, int $new_cpt_id): int |
|
| 915 | - { |
|
| 916 | - global $wpdb; |
|
| 917 | - $start_date = $old_event_row['start_date']; |
|
| 918 | - $start_time = $this->get_migration_script()->convertTimeFromAMPM($start_end_time_row['start_time']); |
|
| 919 | - $end_date = $old_event_row['end_date']; |
|
| 920 | - $end_time = $this->get_migration_script()->convertTimeFromAMPM($start_end_time_row['end_time']); |
|
| 921 | - $existing_datetimes = $this->_count_other_datetimes_exist_for_new_event($new_cpt_id); |
|
| 922 | - $start_datetime_utc = |
|
| 923 | - $this->get_migration_script()->convert_date_string_to_utc( |
|
| 924 | - $this, |
|
| 925 | - $start_end_time_row, |
|
| 926 | - "$start_date $start_time:00", |
|
| 927 | - $old_event_row['timezone_string'] |
|
| 928 | - ); |
|
| 929 | - $end_datetime_utc = |
|
| 930 | - $this->get_migration_script()->convert_date_string_to_utc( |
|
| 931 | - $this, |
|
| 932 | - $start_end_time_row, |
|
| 933 | - "$end_date $end_time:00", |
|
| 934 | - $old_event_row['timezone_string'] |
|
| 935 | - ); |
|
| 936 | - $cols_n_values = [ |
|
| 937 | - 'EVT_ID' => $new_cpt_id, |
|
| 938 | - // EVT_ID |
|
| 939 | - 'DTT_EVT_start' => $start_datetime_utc, |
|
| 940 | - // DTT_EVT_start |
|
| 941 | - 'DTT_EVT_end' => $end_datetime_utc, |
|
| 942 | - // DTT_EVT_end |
|
| 943 | - 'DTT_reg_limit' => intval($start_end_time_row['reg_limit']) ? $start_end_time_row['reg_limit'] |
|
| 944 | - : $old_event_row['reg_limit'], |
|
| 945 | - // DTT_reg_limit |
|
| 946 | - 'DTT_sold' => 0, |
|
| 947 | - // note: we will increment this as registrations are added during the migration |
|
| 948 | - // 'DTT_is_primary'=> 0 == $existing_datetimes ,//DTT_is_primary... if count==0, then we'll call it the 'primary' |
|
| 949 | - 'DTT_order' => $existing_datetimes, |
|
| 950 | - // DTT_order, just give it the same order as the count of how many datetimes already exist |
|
| 951 | - 'DTT_parent' => 0, |
|
| 952 | - 'DTT_deleted' => false, |
|
| 953 | - ]; |
|
| 954 | - $data_types = [ |
|
| 955 | - '%d',// EVT_Id |
|
| 956 | - '%s',// DTT_EVT_start |
|
| 957 | - '%s',// DTT_EVT_end |
|
| 958 | - '%d',// DTT_reg_limit |
|
| 959 | - '%d',// DTT_sold |
|
| 960 | - // '%d',//DTT_is_primary |
|
| 961 | - '%d',// DTT_order |
|
| 962 | - '%d',// DTT_parent |
|
| 963 | - '%d',// DTT_deleted |
|
| 964 | - ]; |
|
| 965 | - $success = $wpdb->insert($this->_new_datetime_table, $cols_n_values, $data_types); |
|
| 966 | - if (! $success) { |
|
| 967 | - $this->add_error( |
|
| 968 | - $this->get_migration_script()->_create_error_message_for_db_insertion( |
|
| 969 | - $this->_old_start_end_table, |
|
| 970 | - array_merge($old_event_row, $start_end_time_row), |
|
| 971 | - $this->_new_datetime_table, |
|
| 972 | - $cols_n_values, |
|
| 973 | - $data_types |
|
| 974 | - ) |
|
| 975 | - ); |
|
| 976 | - return 0; |
|
| 977 | - } |
|
| 978 | - return $wpdb->insert_id; |
|
| 979 | - } |
|
| 980 | - |
|
| 981 | - |
|
| 982 | - /** |
|
| 983 | - * Checks if there's a 4.1 datetime for this event already. This is mostly only handy |
|
| 984 | - * when deciding whether a datetime we're about ot insert should be the 'primary' or not |
|
| 985 | - * |
|
| 986 | - * @param int $cpt_event_id |
|
| 987 | - * @return int |
|
| 988 | - * @global wpdb $wpdb |
|
| 989 | - */ |
|
| 990 | - private function _count_other_datetimes_exist_for_new_event(int $cpt_event_id): int |
|
| 991 | - { |
|
| 992 | - global $wpdb; |
|
| 993 | - return (int) $wpdb->get_var( |
|
| 994 | - $wpdb->prepare( |
|
| 995 | - "SELECT COUNT(*) FROM $this->_new_datetime_table WHERE EVT_ID=%d", |
|
| 996 | - $cpt_event_id |
|
| 997 | - ) |
|
| 998 | - ); |
|
| 999 | - } |
|
| 655 | + return (int) $wpdb->get_var($query); |
|
| 656 | + } |
|
| 657 | + |
|
| 658 | + |
|
| 659 | + /** |
|
| 660 | + * Gets teh venue's title or makes one up if there is none |
|
| 661 | + * |
|
| 662 | + * @param array $event_data_array keys are events_details columns and values are their values |
|
| 663 | + * @return string |
|
| 664 | + */ |
|
| 665 | + protected function _get_venue_title_for_event(array $event_data_array): string |
|
| 666 | + { |
|
| 667 | + return $event_data_array['venue_title'] |
|
| 668 | + ? stripslashes($event_data_array['venue_title']) |
|
| 669 | + : stripslashes( |
|
| 670 | + sprintf( |
|
| 671 | + esc_html__('Venue of %s', 'event_espresso'), |
|
| 672 | + $event_data_array['event_name'] |
|
| 673 | + ) |
|
| 674 | + ); |
|
| 675 | + } |
|
| 676 | + |
|
| 677 | + |
|
| 678 | + /** |
|
| 679 | + * Inserts the CPT |
|
| 680 | + * |
|
| 681 | + * @param array $old_event keys are cols, values are col values |
|
| 682 | + * @return int |
|
| 683 | + */ |
|
| 684 | + private function _insert_venue_into_posts(array $old_event): int |
|
| 685 | + { |
|
| 686 | + global $wpdb; |
|
| 687 | + $insertion_array = [ |
|
| 688 | + 'post_title' => $this->_get_venue_title_for_event($old_event),// VNU_name |
|
| 689 | + 'post_content' => '',// VNU_desc |
|
| 690 | + 'post_name' => $this->_find_unique_slug( |
|
| 691 | + $old_event['venue_title'], |
|
| 692 | + sanitize_title('venue-of-' . $old_event['event_name']) |
|
| 693 | + ),// VNU_identifier |
|
| 694 | + 'post_date' => current_time('mysql'),// VNU_created |
|
| 695 | + 'post_date_gmt' => get_gmt_from_date(current_time('mysql')), |
|
| 696 | + 'post_excerpt' => '',// VNU_short_desc arbitrary only 50 characters |
|
| 697 | + 'post_modified' => current_time('mysql'),// VNU_modified |
|
| 698 | + 'post_modified_gmt' => get_gmt_from_date(current_time('mysql')), |
|
| 699 | + 'post_author' => $old_event['wp_user'],// VNU_wp_user |
|
| 700 | + 'post_parent' => 0,// parent |
|
| 701 | + 'menu_order' => 0,// VNU_order |
|
| 702 | + 'post_type' => EspressoPostType::VENUES,// post_type |
|
| 703 | + ]; |
|
| 704 | + $data_types_array = [ |
|
| 705 | + '%s',// VNU_name |
|
| 706 | + '%s',// VNU_desc |
|
| 707 | + '%s',// VNU_identifier |
|
| 708 | + '%s',// VNU_created |
|
| 709 | + '%s', |
|
| 710 | + '%s',// VNU_short_desc |
|
| 711 | + '%s',// VNU_modified |
|
| 712 | + '%s', |
|
| 713 | + '%d',// VNU_wp_user |
|
| 714 | + '%d',// parent |
|
| 715 | + '%d',// VNU_order |
|
| 716 | + '%s',// post_type |
|
| 717 | + ]; |
|
| 718 | + $success = $wpdb->insert( |
|
| 719 | + $wpdb->posts, |
|
| 720 | + $insertion_array, |
|
| 721 | + $data_types_array |
|
| 722 | + ); |
|
| 723 | + if (! $success) { |
|
| 724 | + $this->add_error( |
|
| 725 | + $this->get_migration_script()->_create_error_message_for_db_insertion( |
|
| 726 | + $this->_old_table, |
|
| 727 | + $old_event, |
|
| 728 | + $this->_new_table, |
|
| 729 | + $insertion_array, |
|
| 730 | + $data_types_array |
|
| 731 | + ) |
|
| 732 | + ); |
|
| 733 | + return 0; |
|
| 734 | + } |
|
| 735 | + return $wpdb->insert_id; |
|
| 736 | + } |
|
| 737 | + |
|
| 738 | + |
|
| 739 | + /** |
|
| 740 | + * Inserts into the venue_meta table |
|
| 741 | + * |
|
| 742 | + * @param int $cpt_id |
|
| 743 | + * @param array $old_event |
|
| 744 | + * @return void |
|
| 745 | + */ |
|
| 746 | + private function _insert_venue_into_meta_table(int $cpt_id, array $old_event): void |
|
| 747 | + { |
|
| 748 | + global $wpdb; |
|
| 749 | + |
|
| 750 | + // assume the country is the same as the organization's old settings |
|
| 751 | + $country_iso = $this->get_migration_script()->get_default_country_iso(); |
|
| 752 | + // find the state from the venue, or the organization, or just guess california |
|
| 753 | + if (! $old_event['state']) { |
|
| 754 | + $old_org_options = get_option('events_organization_settings'); |
|
| 755 | + $state_name = stripslashes($old_org_options['organization_state']); |
|
| 756 | + } else { |
|
| 757 | + $state_name = $old_event['state']; |
|
| 758 | + } |
|
| 759 | + if (! $state_name) { |
|
| 760 | + $state_name = 'CA'; |
|
| 761 | + } |
|
| 762 | + // get a state ID with the same name, if possible |
|
| 763 | + try { |
|
| 764 | + $state = $this->get_migration_script()->get_or_create_state($state_name, $country_iso); |
|
| 765 | + $state_id = $state['STA_ID']; |
|
| 766 | + } catch (EE_Error $e) { |
|
| 767 | + $this->add_error($e->getMessage()); |
|
| 768 | + $state_id = 0; |
|
| 769 | + } |
|
| 770 | + // now insert into meta table |
|
| 771 | + $insertion_array = [ |
|
| 772 | + 'VNU_ID' => $cpt_id,// VNU_ID_fk |
|
| 773 | + 'VNU_address' => stripslashes($old_event['address']),// VNU_address |
|
| 774 | + 'VNU_address2' => stripslashes($old_event['address2']),// VNU_address2 |
|
| 775 | + 'VNU_city' => stripslashes($old_event['city']),// VNU_city |
|
| 776 | + 'STA_ID' => $state_id,// STA_ID |
|
| 777 | + 'CNT_ISO' => $country_iso,// CNT_ISO |
|
| 778 | + 'VNU_zip' => $old_event['zip'],// VNU_zip |
|
| 779 | + 'VNU_phone' => $old_event['venue_phone'],// VNU_phone |
|
| 780 | + 'VNU_capacity' => -1,// VNU_capacity |
|
| 781 | + 'VNU_url' => $old_event['venue_url'],// VNU_url |
|
| 782 | + 'VNU_virtual_phone' => $old_event['virtual_phone'],// VNU_virtual_phone |
|
| 783 | + 'VNU_virtual_url' => $old_event['virtual_url'],// VNU_virtual_url |
|
| 784 | + 'VNU_google_map_link' => '',// VNU_google_map_link |
|
| 785 | + 'VNU_enable_for_gmap' => true, // VNU_enable_for_gmap |
|
| 786 | + ]; |
|
| 787 | + $data_types = [ |
|
| 788 | + '%d',// VNU_ID_fk |
|
| 789 | + '%s',// VNU_address |
|
| 790 | + '%s',// VNU_address2 |
|
| 791 | + '%s',// VNU_city |
|
| 792 | + '%d',// STA_ID |
|
| 793 | + '%s',// CNT_ISO |
|
| 794 | + '%s',// VNU_zip |
|
| 795 | + '%s',// VNU_phone |
|
| 796 | + '%d',// VNU_capacity |
|
| 797 | + '%s',// VNU_url |
|
| 798 | + '%s',// VNU_virtual_phone |
|
| 799 | + '%s',// VNU_virtual_url |
|
| 800 | + '%s',// VNU_google_map_link |
|
| 801 | + '%d',// VNU_enable_for_gmap |
|
| 802 | + ]; |
|
| 803 | + $success = $wpdb->insert($wpdb->prefix . "esp_venue_meta", $insertion_array, $data_types); |
|
| 804 | + if (! $success) { |
|
| 805 | + $this->add_error( |
|
| 806 | + $this->get_migration_script()->_create_error_message_for_db_insertion( |
|
| 807 | + $this->_old_table, |
|
| 808 | + $old_event, |
|
| 809 | + $this->_new_meta_table, |
|
| 810 | + $insertion_array, |
|
| 811 | + $data_types |
|
| 812 | + ) |
|
| 813 | + ); |
|
| 814 | + } |
|
| 815 | + } |
|
| 816 | + |
|
| 817 | + |
|
| 818 | + /** |
|
| 819 | + * @param $new_event_id |
|
| 820 | + * @param $new_venue_id |
|
| 821 | + * @return void |
|
| 822 | + */ |
|
| 823 | + private function _insert_new_venue_to_event($new_event_id, $new_venue_id): void |
|
| 824 | + { |
|
| 825 | + global $wpdb; |
|
| 826 | + if (! $new_event_id) { |
|
| 827 | + $this->add_error( |
|
| 828 | + sprintf(esc_html__("Could not find 4.1 event id for 3.1 event #%d.", "event_espresso"), $new_event_id) |
|
| 829 | + ); |
|
| 830 | + return; |
|
| 831 | + } |
|
| 832 | + if (! $new_venue_id) { |
|
| 833 | + $this->add_error( |
|
| 834 | + sprintf(esc_html__("Could not find 4.1 venue id for 3.1 venue #%d.", "event_espresso"), $new_venue_id) |
|
| 835 | + ); |
|
| 836 | + return; |
|
| 837 | + } |
|
| 838 | + $cols_n_values = [ |
|
| 839 | + 'EVT_ID' => $new_event_id, |
|
| 840 | + 'VNU_ID' => $new_venue_id, |
|
| 841 | + 'EVV_primary' => true, |
|
| 842 | + ]; |
|
| 843 | + $data_types = [ |
|
| 844 | + '%d',// EVT_ID |
|
| 845 | + '%d',// VNU_ID |
|
| 846 | + '%d',// EVT_primary |
|
| 847 | + ]; |
|
| 848 | + $success = $wpdb->insert($wpdb->prefix . "esp_event_venue", $cols_n_values, $data_types); |
|
| 849 | + if (! $success) { |
|
| 850 | + $this->add_error( |
|
| 851 | + $this->get_migration_script()->_create_error_message_for_db_insertion( |
|
| 852 | + $this->_old_table, |
|
| 853 | + [], |
|
| 854 | + $this->_new_table, |
|
| 855 | + $cols_n_values, |
|
| 856 | + $data_types |
|
| 857 | + ) |
|
| 858 | + ); |
|
| 859 | + } |
|
| 860 | + } |
|
| 861 | + |
|
| 862 | + |
|
| 863 | + /** |
|
| 864 | + * Converts all the 3.1 start-end times for the event to 4.1 datetimes |
|
| 865 | + * |
|
| 866 | + * @param array $old_event results of get_results(...,ARRAY_A) |
|
| 867 | + * @param int $new_cpt_id new post ID |
|
| 868 | + * @return void (if there are errors though, adds them to the stage's error list |
|
| 869 | + * @throws EE_Error |
|
| 870 | + * @global wpdb $wpdb |
|
| 871 | + */ |
|
| 872 | + private function _convert_start_end_times(array $old_event, int $new_cpt_id) |
|
| 873 | + { |
|
| 874 | + $start_end_times = $this->_get_old_start_end_times($old_event['id']); |
|
| 875 | + foreach ($start_end_times as $start_end_time) { |
|
| 876 | + $datetime_id = $this->_insert_new_datetime($start_end_time, $old_event, $new_cpt_id); |
|
| 877 | + if ($datetime_id) { |
|
| 878 | + $this->get_migration_script()->set_mapping( |
|
| 879 | + $this->_old_start_end_table, |
|
| 880 | + $start_end_time['id'], |
|
| 881 | + $this->_new_datetime_table, |
|
| 882 | + $datetime_id |
|
| 883 | + ); |
|
| 884 | + } |
|
| 885 | + } |
|
| 886 | + } |
|
| 887 | + |
|
| 888 | + |
|
| 889 | + /** |
|
| 890 | + * Queries the 3.1 wp_events_start_end table to get all the start and end times for the event |
|
| 891 | + * |
|
| 892 | + * @param int $old_event_id |
|
| 893 | + * @return array |
|
| 894 | + * @global wpdb $wpdb |
|
| 895 | + */ |
|
| 896 | + private function _get_old_start_end_times(int $old_event_id): array |
|
| 897 | + { |
|
| 898 | + global $wpdb; |
|
| 899 | + return $wpdb->get_results( |
|
| 900 | + $wpdb->prepare("SELECT * FROM $this->_old_start_end_table WHERE event_id=%d", $old_event_id), |
|
| 901 | + ARRAY_A |
|
| 902 | + ); |
|
| 903 | + } |
|
| 904 | + |
|
| 905 | + |
|
| 906 | + /** |
|
| 907 | + * Inserts a 4.1 datetime given the 3.1 start_end db row and event_details row |
|
| 908 | + * |
|
| 909 | + * @param array $start_end_time_row |
|
| 910 | + * @param array $old_event_row |
|
| 911 | + * @param int $new_cpt_id |
|
| 912 | + * @return int ID of new datetime |
|
| 913 | + */ |
|
| 914 | + private function _insert_new_datetime(array $start_end_time_row, array $old_event_row, int $new_cpt_id): int |
|
| 915 | + { |
|
| 916 | + global $wpdb; |
|
| 917 | + $start_date = $old_event_row['start_date']; |
|
| 918 | + $start_time = $this->get_migration_script()->convertTimeFromAMPM($start_end_time_row['start_time']); |
|
| 919 | + $end_date = $old_event_row['end_date']; |
|
| 920 | + $end_time = $this->get_migration_script()->convertTimeFromAMPM($start_end_time_row['end_time']); |
|
| 921 | + $existing_datetimes = $this->_count_other_datetimes_exist_for_new_event($new_cpt_id); |
|
| 922 | + $start_datetime_utc = |
|
| 923 | + $this->get_migration_script()->convert_date_string_to_utc( |
|
| 924 | + $this, |
|
| 925 | + $start_end_time_row, |
|
| 926 | + "$start_date $start_time:00", |
|
| 927 | + $old_event_row['timezone_string'] |
|
| 928 | + ); |
|
| 929 | + $end_datetime_utc = |
|
| 930 | + $this->get_migration_script()->convert_date_string_to_utc( |
|
| 931 | + $this, |
|
| 932 | + $start_end_time_row, |
|
| 933 | + "$end_date $end_time:00", |
|
| 934 | + $old_event_row['timezone_string'] |
|
| 935 | + ); |
|
| 936 | + $cols_n_values = [ |
|
| 937 | + 'EVT_ID' => $new_cpt_id, |
|
| 938 | + // EVT_ID |
|
| 939 | + 'DTT_EVT_start' => $start_datetime_utc, |
|
| 940 | + // DTT_EVT_start |
|
| 941 | + 'DTT_EVT_end' => $end_datetime_utc, |
|
| 942 | + // DTT_EVT_end |
|
| 943 | + 'DTT_reg_limit' => intval($start_end_time_row['reg_limit']) ? $start_end_time_row['reg_limit'] |
|
| 944 | + : $old_event_row['reg_limit'], |
|
| 945 | + // DTT_reg_limit |
|
| 946 | + 'DTT_sold' => 0, |
|
| 947 | + // note: we will increment this as registrations are added during the migration |
|
| 948 | + // 'DTT_is_primary'=> 0 == $existing_datetimes ,//DTT_is_primary... if count==0, then we'll call it the 'primary' |
|
| 949 | + 'DTT_order' => $existing_datetimes, |
|
| 950 | + // DTT_order, just give it the same order as the count of how many datetimes already exist |
|
| 951 | + 'DTT_parent' => 0, |
|
| 952 | + 'DTT_deleted' => false, |
|
| 953 | + ]; |
|
| 954 | + $data_types = [ |
|
| 955 | + '%d',// EVT_Id |
|
| 956 | + '%s',// DTT_EVT_start |
|
| 957 | + '%s',// DTT_EVT_end |
|
| 958 | + '%d',// DTT_reg_limit |
|
| 959 | + '%d',// DTT_sold |
|
| 960 | + // '%d',//DTT_is_primary |
|
| 961 | + '%d',// DTT_order |
|
| 962 | + '%d',// DTT_parent |
|
| 963 | + '%d',// DTT_deleted |
|
| 964 | + ]; |
|
| 965 | + $success = $wpdb->insert($this->_new_datetime_table, $cols_n_values, $data_types); |
|
| 966 | + if (! $success) { |
|
| 967 | + $this->add_error( |
|
| 968 | + $this->get_migration_script()->_create_error_message_for_db_insertion( |
|
| 969 | + $this->_old_start_end_table, |
|
| 970 | + array_merge($old_event_row, $start_end_time_row), |
|
| 971 | + $this->_new_datetime_table, |
|
| 972 | + $cols_n_values, |
|
| 973 | + $data_types |
|
| 974 | + ) |
|
| 975 | + ); |
|
| 976 | + return 0; |
|
| 977 | + } |
|
| 978 | + return $wpdb->insert_id; |
|
| 979 | + } |
|
| 980 | + |
|
| 981 | + |
|
| 982 | + /** |
|
| 983 | + * Checks if there's a 4.1 datetime for this event already. This is mostly only handy |
|
| 984 | + * when deciding whether a datetime we're about ot insert should be the 'primary' or not |
|
| 985 | + * |
|
| 986 | + * @param int $cpt_event_id |
|
| 987 | + * @return int |
|
| 988 | + * @global wpdb $wpdb |
|
| 989 | + */ |
|
| 990 | + private function _count_other_datetimes_exist_for_new_event(int $cpt_event_id): int |
|
| 991 | + { |
|
| 992 | + global $wpdb; |
|
| 993 | + return (int) $wpdb->get_var( |
|
| 994 | + $wpdb->prepare( |
|
| 995 | + "SELECT COUNT(*) FROM $this->_new_datetime_table WHERE EVT_ID=%d", |
|
| 996 | + $cpt_event_id |
|
| 997 | + ) |
|
| 998 | + ); |
|
| 999 | + } |
|
| 1000 | 1000 | } |
@@ -189,11 +189,11 @@ discard block |
||
| 189 | 189 | public function __construct() |
| 190 | 190 | { |
| 191 | 191 | global $wpdb; |
| 192 | - $this->_old_table = $wpdb->prefix . "events_detail"; |
|
| 193 | - $this->_old_start_end_table = $wpdb->prefix . "events_start_end"; |
|
| 194 | - $this->_new_table = $wpdb->prefix . "posts"; |
|
| 195 | - $this->_new_meta_table = $wpdb->prefix . "esp_event_meta"; |
|
| 196 | - $this->_new_datetime_table = $wpdb->prefix . "esp_datetime"; |
|
| 192 | + $this->_old_table = $wpdb->prefix."events_detail"; |
|
| 193 | + $this->_old_start_end_table = $wpdb->prefix."events_start_end"; |
|
| 194 | + $this->_new_table = $wpdb->prefix."posts"; |
|
| 195 | + $this->_new_meta_table = $wpdb->prefix."esp_event_meta"; |
|
| 196 | + $this->_new_datetime_table = $wpdb->prefix."esp_datetime"; |
|
| 197 | 197 | $this->_pretty_name = esc_html__("Events", "event_espresso"); |
| 198 | 198 | parent::__construct(); |
| 199 | 199 | } |
@@ -207,7 +207,7 @@ discard block |
||
| 207 | 207 | public function _count_records_to_migrate(): int |
| 208 | 208 | { |
| 209 | 209 | global $wpdb; |
| 210 | - return (int) $wpdb->get_var("SELECT COUNT(*) FROM " . $this->_old_table . ' WHERE event_status !="D"'); |
|
| 210 | + return (int) $wpdb->get_var("SELECT COUNT(*) FROM ".$this->_old_table.' WHERE event_status !="D"'); |
|
| 211 | 211 | } |
| 212 | 212 | |
| 213 | 213 | |
@@ -300,17 +300,17 @@ discard block |
||
| 300 | 300 | private function _add_post_metas(array $old_event, int $post_id) |
| 301 | 301 | { |
| 302 | 302 | $event_meta = maybe_unserialize($old_event['event_meta']); |
| 303 | - if (! $event_meta || ! is_array($event_meta)) { |
|
| 303 | + if ( ! $event_meta || ! is_array($event_meta)) { |
|
| 304 | 304 | return; |
| 305 | 305 | } |
| 306 | - unset($event_meta['date_submitted']); // factored into CPT |
|
| 307 | - unset($event_meta['additional_attendee_reg_info']);// factored into event meta table |
|
| 308 | - unset($event_meta['default_payment_status']); // dido |
|
| 309 | - unset($event_meta['event_thumbnail_url']); // used to find post featured image |
|
| 306 | + unset($event_meta['date_submitted']); // factored into CPT |
|
| 307 | + unset($event_meta['additional_attendee_reg_info']); // factored into event meta table |
|
| 308 | + unset($event_meta['default_payment_status']); // dido |
|
| 309 | + unset($event_meta['event_thumbnail_url']); // used to find post featured image |
|
| 310 | 310 | foreach ($event_meta as $meta_key => $meta_value) { |
| 311 | 311 | if ($meta_key) {// if the meta key is just an empty string, ignore it |
| 312 | 312 | $success = add_post_meta($post_id, $meta_key, $meta_value, true); |
| 313 | - if (! $success) { |
|
| 313 | + if ( ! $success) { |
|
| 314 | 314 | $this->add_error( |
| 315 | 315 | sprintf( |
| 316 | 316 | esc_html__( |
@@ -412,63 +412,63 @@ discard block |
||
| 412 | 412 | // @todo: is it ok to just mark secondary/waitlist events as DRAFTS? |
| 413 | 413 | 'D' => 'trash', |
| 414 | 414 | ]; |
| 415 | - $post_status = $status_conversions[ $old_event['event_status'] ]; |
|
| 415 | + $post_status = $status_conversions[$old_event['event_status']]; |
|
| 416 | 416 | // check if we've sold out |
| 417 | 417 | if (intval($old_event['reg_limit']) <= self::count_registrations($old_event['id'])) { |
| 418 | 418 | $post_status = 'sold_out'; |
| 419 | 419 | } |
| 420 | 420 | // FYI postponed and cancelled don't exist in 3.1 |
| 421 | - $cols_n_values = [ |
|
| 422 | - 'post_title' => stripslashes($old_event['event_name']),// EVT_name |
|
| 423 | - 'post_content' => stripslashes($old_event['event_desc']),// EVT_desc |
|
| 421 | + $cols_n_values = [ |
|
| 422 | + 'post_title' => stripslashes($old_event['event_name']), // EVT_name |
|
| 423 | + 'post_content' => stripslashes($old_event['event_desc']), // EVT_desc |
|
| 424 | 424 | 'post_name' => $this->_find_unique_slug( |
| 425 | 425 | $old_event['event_name'], |
| 426 | 426 | $old_event['event_identifier'], |
| 427 | 427 | $post_status |
| 428 | - ),// EVT_slug |
|
| 429 | - 'post_date' => $old_event['submitted'],// EVT_created NOT |
|
| 428 | + ), // EVT_slug |
|
| 429 | + 'post_date' => $old_event['submitted'], // EVT_created NOT |
|
| 430 | 430 | 'post_date_gmt' => get_gmt_from_date($old_event['submitted']), |
| 431 | - 'post_excerpt' => '',// EVT_short_desc |
|
| 432 | - 'post_modified' => $old_event['submitted'],// EVT_modified |
|
| 431 | + 'post_excerpt' => '', // EVT_short_desc |
|
| 432 | + 'post_modified' => $old_event['submitted'], // EVT_modified |
|
| 433 | 433 | 'post_modified_gmt' => get_gmt_from_date($old_event['submitted']), |
| 434 | - 'post_author' => $old_event['wp_user'],// EVT_wp_user |
|
| 435 | - 'post_parent' => 0,// parent maybe get this from some REM field? |
|
| 436 | - 'menu_order' => 0,// EVT_order |
|
| 437 | - 'post_type' => EspressoPostType::EVENTS,// post_type |
|
| 438 | - 'post_status' => $post_status,// status |
|
| 434 | + 'post_author' => $old_event['wp_user'], // EVT_wp_user |
|
| 435 | + 'post_parent' => 0, // parent maybe get this from some REM field? |
|
| 436 | + 'menu_order' => 0, // EVT_order |
|
| 437 | + 'post_type' => EspressoPostType::EVENTS, // post_type |
|
| 438 | + 'post_status' => $post_status, // status |
|
| 439 | 439 | ]; |
| 440 | 440 | $cols_n_values_with_no_invalid_text = []; |
| 441 | 441 | foreach ($cols_n_values as $col => $value) { |
| 442 | 442 | $value_sans_invalid_chars = $wpdb->strip_invalid_text_for_column($this->_new_table, $col, $value); |
| 443 | - if (! is_wp_error($value_sans_invalid_chars)) { |
|
| 444 | - $cols_n_values_with_no_invalid_text[ $col ] = $value_sans_invalid_chars; |
|
| 443 | + if ( ! is_wp_error($value_sans_invalid_chars)) { |
|
| 444 | + $cols_n_values_with_no_invalid_text[$col] = $value_sans_invalid_chars; |
|
| 445 | 445 | } else { |
| 446 | 446 | // otherwise leave it as-is. It will blow everything up and stop the migration |
| 447 | - $cols_n_values_with_no_invalid_text[ $col ] = $value; |
|
| 447 | + $cols_n_values_with_no_invalid_text[$col] = $value; |
|
| 448 | 448 | } |
| 449 | 449 | } |
| 450 | 450 | $cols_n_values = $cols_n_values_with_no_invalid_text; |
| 451 | 451 | $data_types = [ |
| 452 | - '%s',// EVT_name |
|
| 453 | - '%s',// EVT_desc |
|
| 454 | - '%s',// EVT_slug |
|
| 455 | - '%s',// EVT_created |
|
| 452 | + '%s', // EVT_name |
|
| 453 | + '%s', // EVT_desc |
|
| 454 | + '%s', // EVT_slug |
|
| 455 | + '%s', // EVT_created |
|
| 456 | 456 | '%s', |
| 457 | - '%s',// EVT_short_desc |
|
| 458 | - '%s',// EVT_modified |
|
| 457 | + '%s', // EVT_short_desc |
|
| 458 | + '%s', // EVT_modified |
|
| 459 | 459 | '%s', |
| 460 | - '%s',// EVT_wp_user |
|
| 461 | - '%d',// post_parent |
|
| 462 | - '%d',// EVT_order |
|
| 463 | - '%s',// post_type |
|
| 464 | - '%s',// status |
|
| 460 | + '%s', // EVT_wp_user |
|
| 461 | + '%d', // post_parent |
|
| 462 | + '%d', // EVT_order |
|
| 463 | + '%s', // post_type |
|
| 464 | + '%s', // status |
|
| 465 | 465 | ]; |
| 466 | - $success = $wpdb->insert( |
|
| 466 | + $success = $wpdb->insert( |
|
| 467 | 467 | $this->_new_table, |
| 468 | 468 | $cols_n_values, |
| 469 | 469 | $data_types |
| 470 | 470 | ); |
| 471 | - if (! $success) { |
|
| 471 | + if ( ! $success) { |
|
| 472 | 472 | $this->add_error( |
| 473 | 473 | $this->get_migration_script()->_create_error_message_for_db_insertion( |
| 474 | 474 | $this->_old_table, |
@@ -521,8 +521,8 @@ discard block |
||
| 521 | 521 | $event_meta['default_payment_status'] ?? '', |
| 522 | 522 | intval($old_event['require_pre_approval']) |
| 523 | 523 | ); |
| 524 | - $cols_n_values = [ |
|
| 525 | - 'EVT_ID' => $new_cpt_id,// EVT_ID_fk |
|
| 524 | + $cols_n_values = [ |
|
| 525 | + 'EVT_ID' => $new_cpt_id, // EVT_ID_fk |
|
| 526 | 526 | 'EVT_display_desc' => 'Y' == $old_event['display_desc'], |
| 527 | 527 | 'EVT_display_ticket_selector' => 'Y' == $old_event['display_reg_form'], |
| 528 | 528 | 'EVT_visible_on' => $this->get_migration_script()->convert_date_string_to_utc( |
@@ -532,7 +532,7 @@ discard block |
||
| 532 | 532 | 'mysql' |
| 533 | 533 | ), |
| 534 | 534 | $old_event['timezone_string'] |
| 535 | - ),// don't use the old 'visible_on', as it wasn't ever used |
|
| 535 | + ), // don't use the old 'visible_on', as it wasn't ever used |
|
| 536 | 536 | 'EVT_additional_limit' => $old_event['allow_multiple'] == 'N' ? 1 |
| 537 | 537 | : $old_event['additional_limit'], |
| 538 | 538 | 'EVT_default_registration_status' => $default_reg_status, |
@@ -541,29 +541,29 @@ discard block |
||
| 541 | 541 | 'EVT_allow_overflow' => 'Y' == $old_event['allow_overflow'], |
| 542 | 542 | 'EVT_timezone_string' => $old_event['timezone_string'], |
| 543 | 543 | 'EVT_external_URL' => $old_event['externalURL'], |
| 544 | - 'EVT_donations' => false,// doesn't exist in 3.1 |
|
| 544 | + 'EVT_donations' => false, // doesn't exist in 3.1 |
|
| 545 | 545 | |
| 546 | 546 | ]; |
| 547 | - $data_types = [ |
|
| 548 | - '%s',// EVT_ID |
|
| 549 | - '%d',// EVT_display_desc |
|
| 550 | - '%d',// EVT_display_ticket_selector |
|
| 551 | - '%s',// EVT_visible_on |
|
| 552 | - '%d',// EVT_additional_limit |
|
| 553 | - '%s',// EVT_default_registration_status |
|
| 554 | - '%d',// EVT_member_only |
|
| 555 | - '%s',// EVT_phone |
|
| 556 | - '%d',// EVT_allow_overflow |
|
| 557 | - '%s',// EVT_timezone_string |
|
| 558 | - '%s',// EVT_external_URL |
|
| 559 | - '%d',// EVT_donations |
|
| 547 | + $data_types = [ |
|
| 548 | + '%s', // EVT_ID |
|
| 549 | + '%d', // EVT_display_desc |
|
| 550 | + '%d', // EVT_display_ticket_selector |
|
| 551 | + '%s', // EVT_visible_on |
|
| 552 | + '%d', // EVT_additional_limit |
|
| 553 | + '%s', // EVT_default_registration_status |
|
| 554 | + '%d', // EVT_member_only |
|
| 555 | + '%s', // EVT_phone |
|
| 556 | + '%d', // EVT_allow_overflow |
|
| 557 | + '%s', // EVT_timezone_string |
|
| 558 | + '%s', // EVT_external_URL |
|
| 559 | + '%d', // EVT_donations |
|
| 560 | 560 | ]; |
| 561 | - $success = $wpdb->insert( |
|
| 561 | + $success = $wpdb->insert( |
|
| 562 | 562 | $this->_new_meta_table, |
| 563 | 563 | $cols_n_values, |
| 564 | 564 | $data_types |
| 565 | 565 | ); |
| 566 | - if (! $success) { |
|
| 566 | + if ( ! $success) { |
|
| 567 | 567 | $this->add_error( |
| 568 | 568 | $this->get_migration_script()->_create_error_message_for_db_insertion( |
| 569 | 569 | $this->_old_table, |
@@ -632,16 +632,16 @@ discard block |
||
| 632 | 632 | private function _duplicate_venue_exists(array $old_event): int |
| 633 | 633 | { |
| 634 | 634 | global $wpdb; |
| 635 | - $conditions = [ |
|
| 635 | + $conditions = [ |
|
| 636 | 636 | 'VNU_address' => $old_event ['address'], |
| 637 | 637 | 'VNU_address2' => $old_event['address2'], |
| 638 | 638 | 'VNU_city' => $old_event['city'], |
| 639 | 639 | 'VNU_zip' => $old_event['zip'], |
| 640 | 640 | 'post_title' => $this->_get_venue_title_for_event($old_event), |
| 641 | - 'VNU_phone' => $old_event['venue_phone'],// VNU_phone |
|
| 642 | - 'VNU_url' => $old_event['venue_url'],// VNU_url |
|
| 643 | - 'VNU_virtual_phone' => $old_event['virtual_phone'],// VNU_virtual_phone |
|
| 644 | - 'VNU_virtual_url' => $old_event['virtual_url'],// VNU_virtual_url |
|
| 641 | + 'VNU_phone' => $old_event['venue_phone'], // VNU_phone |
|
| 642 | + 'VNU_url' => $old_event['venue_url'], // VNU_url |
|
| 643 | + 'VNU_virtual_phone' => $old_event['virtual_phone'], // VNU_virtual_phone |
|
| 644 | + 'VNU_virtual_url' => $old_event['virtual_url'], // VNU_virtual_url |
|
| 645 | 645 | ]; |
| 646 | 646 | $sql_conditions = []; |
| 647 | 647 | foreach ($conditions as $column => $value) { |
@@ -651,7 +651,7 @@ discard block |
||
| 651 | 651 | FROM |
| 652 | 652 | $wpdb->posts as p INNER JOIN |
| 653 | 653 | {$wpdb->prefix}esp_venue_meta as v ON p.ID = v.VNU_ID |
| 654 | - WHERE " . implode(" AND ", $sql_conditions) . " LIMIT 1"; |
|
| 654 | + WHERE ".implode(" AND ", $sql_conditions)." LIMIT 1"; |
|
| 655 | 655 | return (int) $wpdb->get_var($query); |
| 656 | 656 | } |
| 657 | 657 | |
@@ -684,43 +684,43 @@ discard block |
||
| 684 | 684 | private function _insert_venue_into_posts(array $old_event): int |
| 685 | 685 | { |
| 686 | 686 | global $wpdb; |
| 687 | - $insertion_array = [ |
|
| 688 | - 'post_title' => $this->_get_venue_title_for_event($old_event),// VNU_name |
|
| 689 | - 'post_content' => '',// VNU_desc |
|
| 687 | + $insertion_array = [ |
|
| 688 | + 'post_title' => $this->_get_venue_title_for_event($old_event), // VNU_name |
|
| 689 | + 'post_content' => '', // VNU_desc |
|
| 690 | 690 | 'post_name' => $this->_find_unique_slug( |
| 691 | 691 | $old_event['venue_title'], |
| 692 | - sanitize_title('venue-of-' . $old_event['event_name']) |
|
| 693 | - ),// VNU_identifier |
|
| 694 | - 'post_date' => current_time('mysql'),// VNU_created |
|
| 692 | + sanitize_title('venue-of-'.$old_event['event_name']) |
|
| 693 | + ), // VNU_identifier |
|
| 694 | + 'post_date' => current_time('mysql'), // VNU_created |
|
| 695 | 695 | 'post_date_gmt' => get_gmt_from_date(current_time('mysql')), |
| 696 | - 'post_excerpt' => '',// VNU_short_desc arbitrary only 50 characters |
|
| 697 | - 'post_modified' => current_time('mysql'),// VNU_modified |
|
| 696 | + 'post_excerpt' => '', // VNU_short_desc arbitrary only 50 characters |
|
| 697 | + 'post_modified' => current_time('mysql'), // VNU_modified |
|
| 698 | 698 | 'post_modified_gmt' => get_gmt_from_date(current_time('mysql')), |
| 699 | - 'post_author' => $old_event['wp_user'],// VNU_wp_user |
|
| 700 | - 'post_parent' => 0,// parent |
|
| 701 | - 'menu_order' => 0,// VNU_order |
|
| 702 | - 'post_type' => EspressoPostType::VENUES,// post_type |
|
| 699 | + 'post_author' => $old_event['wp_user'], // VNU_wp_user |
|
| 700 | + 'post_parent' => 0, // parent |
|
| 701 | + 'menu_order' => 0, // VNU_order |
|
| 702 | + 'post_type' => EspressoPostType::VENUES, // post_type |
|
| 703 | 703 | ]; |
| 704 | 704 | $data_types_array = [ |
| 705 | - '%s',// VNU_name |
|
| 706 | - '%s',// VNU_desc |
|
| 707 | - '%s',// VNU_identifier |
|
| 708 | - '%s',// VNU_created |
|
| 705 | + '%s', // VNU_name |
|
| 706 | + '%s', // VNU_desc |
|
| 707 | + '%s', // VNU_identifier |
|
| 708 | + '%s', // VNU_created |
|
| 709 | 709 | '%s', |
| 710 | - '%s',// VNU_short_desc |
|
| 711 | - '%s',// VNU_modified |
|
| 710 | + '%s', // VNU_short_desc |
|
| 711 | + '%s', // VNU_modified |
|
| 712 | 712 | '%s', |
| 713 | - '%d',// VNU_wp_user |
|
| 714 | - '%d',// parent |
|
| 715 | - '%d',// VNU_order |
|
| 716 | - '%s',// post_type |
|
| 713 | + '%d', // VNU_wp_user |
|
| 714 | + '%d', // parent |
|
| 715 | + '%d', // VNU_order |
|
| 716 | + '%s', // post_type |
|
| 717 | 717 | ]; |
| 718 | - $success = $wpdb->insert( |
|
| 718 | + $success = $wpdb->insert( |
|
| 719 | 719 | $wpdb->posts, |
| 720 | 720 | $insertion_array, |
| 721 | 721 | $data_types_array |
| 722 | 722 | ); |
| 723 | - if (! $success) { |
|
| 723 | + if ( ! $success) { |
|
| 724 | 724 | $this->add_error( |
| 725 | 725 | $this->get_migration_script()->_create_error_message_for_db_insertion( |
| 726 | 726 | $this->_old_table, |
@@ -750,13 +750,13 @@ discard block |
||
| 750 | 750 | // assume the country is the same as the organization's old settings |
| 751 | 751 | $country_iso = $this->get_migration_script()->get_default_country_iso(); |
| 752 | 752 | // find the state from the venue, or the organization, or just guess california |
| 753 | - if (! $old_event['state']) { |
|
| 753 | + if ( ! $old_event['state']) { |
|
| 754 | 754 | $old_org_options = get_option('events_organization_settings'); |
| 755 | 755 | $state_name = stripslashes($old_org_options['organization_state']); |
| 756 | 756 | } else { |
| 757 | 757 | $state_name = $old_event['state']; |
| 758 | 758 | } |
| 759 | - if (! $state_name) { |
|
| 759 | + if ( ! $state_name) { |
|
| 760 | 760 | $state_name = 'CA'; |
| 761 | 761 | } |
| 762 | 762 | // get a state ID with the same name, if possible |
@@ -769,39 +769,39 @@ discard block |
||
| 769 | 769 | } |
| 770 | 770 | // now insert into meta table |
| 771 | 771 | $insertion_array = [ |
| 772 | - 'VNU_ID' => $cpt_id,// VNU_ID_fk |
|
| 773 | - 'VNU_address' => stripslashes($old_event['address']),// VNU_address |
|
| 774 | - 'VNU_address2' => stripslashes($old_event['address2']),// VNU_address2 |
|
| 775 | - 'VNU_city' => stripslashes($old_event['city']),// VNU_city |
|
| 776 | - 'STA_ID' => $state_id,// STA_ID |
|
| 777 | - 'CNT_ISO' => $country_iso,// CNT_ISO |
|
| 778 | - 'VNU_zip' => $old_event['zip'],// VNU_zip |
|
| 779 | - 'VNU_phone' => $old_event['venue_phone'],// VNU_phone |
|
| 780 | - 'VNU_capacity' => -1,// VNU_capacity |
|
| 781 | - 'VNU_url' => $old_event['venue_url'],// VNU_url |
|
| 782 | - 'VNU_virtual_phone' => $old_event['virtual_phone'],// VNU_virtual_phone |
|
| 783 | - 'VNU_virtual_url' => $old_event['virtual_url'],// VNU_virtual_url |
|
| 784 | - 'VNU_google_map_link' => '',// VNU_google_map_link |
|
| 772 | + 'VNU_ID' => $cpt_id, // VNU_ID_fk |
|
| 773 | + 'VNU_address' => stripslashes($old_event['address']), // VNU_address |
|
| 774 | + 'VNU_address2' => stripslashes($old_event['address2']), // VNU_address2 |
|
| 775 | + 'VNU_city' => stripslashes($old_event['city']), // VNU_city |
|
| 776 | + 'STA_ID' => $state_id, // STA_ID |
|
| 777 | + 'CNT_ISO' => $country_iso, // CNT_ISO |
|
| 778 | + 'VNU_zip' => $old_event['zip'], // VNU_zip |
|
| 779 | + 'VNU_phone' => $old_event['venue_phone'], // VNU_phone |
|
| 780 | + 'VNU_capacity' => -1, // VNU_capacity |
|
| 781 | + 'VNU_url' => $old_event['venue_url'], // VNU_url |
|
| 782 | + 'VNU_virtual_phone' => $old_event['virtual_phone'], // VNU_virtual_phone |
|
| 783 | + 'VNU_virtual_url' => $old_event['virtual_url'], // VNU_virtual_url |
|
| 784 | + 'VNU_google_map_link' => '', // VNU_google_map_link |
|
| 785 | 785 | 'VNU_enable_for_gmap' => true, // VNU_enable_for_gmap |
| 786 | 786 | ]; |
| 787 | - $data_types = [ |
|
| 788 | - '%d',// VNU_ID_fk |
|
| 789 | - '%s',// VNU_address |
|
| 790 | - '%s',// VNU_address2 |
|
| 791 | - '%s',// VNU_city |
|
| 792 | - '%d',// STA_ID |
|
| 793 | - '%s',// CNT_ISO |
|
| 794 | - '%s',// VNU_zip |
|
| 795 | - '%s',// VNU_phone |
|
| 796 | - '%d',// VNU_capacity |
|
| 797 | - '%s',// VNU_url |
|
| 798 | - '%s',// VNU_virtual_phone |
|
| 799 | - '%s',// VNU_virtual_url |
|
| 800 | - '%s',// VNU_google_map_link |
|
| 801 | - '%d',// VNU_enable_for_gmap |
|
| 787 | + $data_types = [ |
|
| 788 | + '%d', // VNU_ID_fk |
|
| 789 | + '%s', // VNU_address |
|
| 790 | + '%s', // VNU_address2 |
|
| 791 | + '%s', // VNU_city |
|
| 792 | + '%d', // STA_ID |
|
| 793 | + '%s', // CNT_ISO |
|
| 794 | + '%s', // VNU_zip |
|
| 795 | + '%s', // VNU_phone |
|
| 796 | + '%d', // VNU_capacity |
|
| 797 | + '%s', // VNU_url |
|
| 798 | + '%s', // VNU_virtual_phone |
|
| 799 | + '%s', // VNU_virtual_url |
|
| 800 | + '%s', // VNU_google_map_link |
|
| 801 | + '%d', // VNU_enable_for_gmap |
|
| 802 | 802 | ]; |
| 803 | - $success = $wpdb->insert($wpdb->prefix . "esp_venue_meta", $insertion_array, $data_types); |
|
| 804 | - if (! $success) { |
|
| 803 | + $success = $wpdb->insert($wpdb->prefix."esp_venue_meta", $insertion_array, $data_types); |
|
| 804 | + if ( ! $success) { |
|
| 805 | 805 | $this->add_error( |
| 806 | 806 | $this->get_migration_script()->_create_error_message_for_db_insertion( |
| 807 | 807 | $this->_old_table, |
@@ -823,13 +823,13 @@ discard block |
||
| 823 | 823 | private function _insert_new_venue_to_event($new_event_id, $new_venue_id): void |
| 824 | 824 | { |
| 825 | 825 | global $wpdb; |
| 826 | - if (! $new_event_id) { |
|
| 826 | + if ( ! $new_event_id) { |
|
| 827 | 827 | $this->add_error( |
| 828 | 828 | sprintf(esc_html__("Could not find 4.1 event id for 3.1 event #%d.", "event_espresso"), $new_event_id) |
| 829 | 829 | ); |
| 830 | 830 | return; |
| 831 | 831 | } |
| 832 | - if (! $new_venue_id) { |
|
| 832 | + if ( ! $new_venue_id) { |
|
| 833 | 833 | $this->add_error( |
| 834 | 834 | sprintf(esc_html__("Could not find 4.1 venue id for 3.1 venue #%d.", "event_espresso"), $new_venue_id) |
| 835 | 835 | ); |
@@ -840,13 +840,13 @@ discard block |
||
| 840 | 840 | 'VNU_ID' => $new_venue_id, |
| 841 | 841 | 'EVV_primary' => true, |
| 842 | 842 | ]; |
| 843 | - $data_types = [ |
|
| 844 | - '%d',// EVT_ID |
|
| 845 | - '%d',// VNU_ID |
|
| 846 | - '%d',// EVT_primary |
|
| 843 | + $data_types = [ |
|
| 844 | + '%d', // EVT_ID |
|
| 845 | + '%d', // VNU_ID |
|
| 846 | + '%d', // EVT_primary |
|
| 847 | 847 | ]; |
| 848 | - $success = $wpdb->insert($wpdb->prefix . "esp_event_venue", $cols_n_values, $data_types); |
|
| 849 | - if (! $success) { |
|
| 848 | + $success = $wpdb->insert($wpdb->prefix."esp_event_venue", $cols_n_values, $data_types); |
|
| 849 | + if ( ! $success) { |
|
| 850 | 850 | $this->add_error( |
| 851 | 851 | $this->get_migration_script()->_create_error_message_for_db_insertion( |
| 852 | 852 | $this->_old_table, |
@@ -926,14 +926,14 @@ discard block |
||
| 926 | 926 | "$start_date $start_time:00", |
| 927 | 927 | $old_event_row['timezone_string'] |
| 928 | 928 | ); |
| 929 | - $end_datetime_utc = |
|
| 929 | + $end_datetime_utc = |
|
| 930 | 930 | $this->get_migration_script()->convert_date_string_to_utc( |
| 931 | 931 | $this, |
| 932 | 932 | $start_end_time_row, |
| 933 | 933 | "$end_date $end_time:00", |
| 934 | 934 | $old_event_row['timezone_string'] |
| 935 | 935 | ); |
| 936 | - $cols_n_values = [ |
|
| 936 | + $cols_n_values = [ |
|
| 937 | 937 | 'EVT_ID' => $new_cpt_id, |
| 938 | 938 | // EVT_ID |
| 939 | 939 | 'DTT_EVT_start' => $start_datetime_utc, |
@@ -951,19 +951,19 @@ discard block |
||
| 951 | 951 | 'DTT_parent' => 0, |
| 952 | 952 | 'DTT_deleted' => false, |
| 953 | 953 | ]; |
| 954 | - $data_types = [ |
|
| 955 | - '%d',// EVT_Id |
|
| 956 | - '%s',// DTT_EVT_start |
|
| 957 | - '%s',// DTT_EVT_end |
|
| 958 | - '%d',// DTT_reg_limit |
|
| 959 | - '%d',// DTT_sold |
|
| 954 | + $data_types = [ |
|
| 955 | + '%d', // EVT_Id |
|
| 956 | + '%s', // DTT_EVT_start |
|
| 957 | + '%s', // DTT_EVT_end |
|
| 958 | + '%d', // DTT_reg_limit |
|
| 959 | + '%d', // DTT_sold |
|
| 960 | 960 | // '%d',//DTT_is_primary |
| 961 | - '%d',// DTT_order |
|
| 962 | - '%d',// DTT_parent |
|
| 963 | - '%d',// DTT_deleted |
|
| 961 | + '%d', // DTT_order |
|
| 962 | + '%d', // DTT_parent |
|
| 963 | + '%d', // DTT_deleted |
|
| 964 | 964 | ]; |
| 965 | - $success = $wpdb->insert($this->_new_datetime_table, $cols_n_values, $data_types); |
|
| 966 | - if (! $success) { |
|
| 965 | + $success = $wpdb->insert($this->_new_datetime_table, $cols_n_values, $data_types); |
|
| 966 | + if ( ! $success) { |
|
| 967 | 967 | $this->add_error( |
| 968 | 968 | $this->get_migration_script()->_create_error_message_for_db_insertion( |
| 969 | 969 | $this->_old_start_end_table, |
@@ -66,159 +66,159 @@ |
||
| 66 | 66 | */ |
| 67 | 67 | class EE_DMS_4_1_0_questions extends EE_Data_Migration_Script_Stage |
| 68 | 68 | { |
| 69 | - private string $_option_table; |
|
| 69 | + private string $_option_table; |
|
| 70 | 70 | |
| 71 | 71 | |
| 72 | - public function __construct() |
|
| 73 | - { |
|
| 74 | - global $wpdb; |
|
| 75 | - $this->_pretty_name = esc_html__("Questions", "event_espresso"); |
|
| 76 | - $this->_old_table = $wpdb->prefix . "events_question"; |
|
| 77 | - $this->_new_table = $wpdb->prefix . "esp_question"; |
|
| 78 | - $this->_option_table = $wpdb->prefix . "esp_question_option"; |
|
| 79 | - parent::__construct(); |
|
| 80 | - } |
|
| 72 | + public function __construct() |
|
| 73 | + { |
|
| 74 | + global $wpdb; |
|
| 75 | + $this->_pretty_name = esc_html__("Questions", "event_espresso"); |
|
| 76 | + $this->_old_table = $wpdb->prefix . "events_question"; |
|
| 77 | + $this->_new_table = $wpdb->prefix . "esp_question"; |
|
| 78 | + $this->_option_table = $wpdb->prefix . "esp_question_option"; |
|
| 79 | + parent::__construct(); |
|
| 80 | + } |
|
| 81 | 81 | |
| 82 | 82 | |
| 83 | - /** |
|
| 84 | - * @throws EE_Error |
|
| 85 | - */ |
|
| 86 | - public function _migration_step($num_items_to_migrate = 50) |
|
| 87 | - { |
|
| 88 | - global $wpdb; |
|
| 89 | - $start_at_record = $this->count_records_migrated(); |
|
| 90 | - $rows = $wpdb->get_results( |
|
| 91 | - $wpdb->prepare("SELECT * FROM $this->_old_table LIMIT %d,%d", $start_at_record, $num_items_to_migrate), |
|
| 92 | - ARRAY_A |
|
| 93 | - ); |
|
| 94 | - $items_actually_migrated = 0; |
|
| 95 | - foreach ($rows as $question_row) { |
|
| 96 | - $new_id = $this->_insert_new_question($question_row); |
|
| 97 | - $this->get_migration_script()->set_mapping( |
|
| 98 | - $this->_old_table, |
|
| 99 | - $question_row['id'], |
|
| 100 | - $this->_new_table, |
|
| 101 | - $new_id |
|
| 102 | - ); |
|
| 103 | - $items_actually_migrated++; |
|
| 104 | - } |
|
| 105 | - if ($this->count_records_migrated() + $items_actually_migrated >= $this->count_records_to_migrate()) { |
|
| 106 | - $this->set_completed(); |
|
| 107 | - } |
|
| 108 | - return $items_actually_migrated; |
|
| 109 | - } |
|
| 83 | + /** |
|
| 84 | + * @throws EE_Error |
|
| 85 | + */ |
|
| 86 | + public function _migration_step($num_items_to_migrate = 50) |
|
| 87 | + { |
|
| 88 | + global $wpdb; |
|
| 89 | + $start_at_record = $this->count_records_migrated(); |
|
| 90 | + $rows = $wpdb->get_results( |
|
| 91 | + $wpdb->prepare("SELECT * FROM $this->_old_table LIMIT %d,%d", $start_at_record, $num_items_to_migrate), |
|
| 92 | + ARRAY_A |
|
| 93 | + ); |
|
| 94 | + $items_actually_migrated = 0; |
|
| 95 | + foreach ($rows as $question_row) { |
|
| 96 | + $new_id = $this->_insert_new_question($question_row); |
|
| 97 | + $this->get_migration_script()->set_mapping( |
|
| 98 | + $this->_old_table, |
|
| 99 | + $question_row['id'], |
|
| 100 | + $this->_new_table, |
|
| 101 | + $new_id |
|
| 102 | + ); |
|
| 103 | + $items_actually_migrated++; |
|
| 104 | + } |
|
| 105 | + if ($this->count_records_migrated() + $items_actually_migrated >= $this->count_records_to_migrate()) { |
|
| 106 | + $this->set_completed(); |
|
| 107 | + } |
|
| 108 | + return $items_actually_migrated; |
|
| 109 | + } |
|
| 110 | 110 | |
| 111 | 111 | |
| 112 | - public function _count_records_to_migrate() |
|
| 113 | - { |
|
| 114 | - global $wpdb; |
|
| 115 | - return $wpdb->get_var("SELECT COUNT(id) FROM " . $this->_old_table); |
|
| 116 | - } |
|
| 112 | + public function _count_records_to_migrate() |
|
| 113 | + { |
|
| 114 | + global $wpdb; |
|
| 115 | + return $wpdb->get_var("SELECT COUNT(id) FROM " . $this->_old_table); |
|
| 116 | + } |
|
| 117 | 117 | |
| 118 | 118 | |
| 119 | - private function _insert_new_question($old_question): int |
|
| 120 | - { |
|
| 121 | - global $wpdb; |
|
| 122 | - // if this pretends to be a 'system' question, check if we already have a |
|
| 123 | - // system question for that string. If so, pretend THAT new question |
|
| 124 | - // is what we just inserted |
|
| 125 | - if ($old_question['system_name']) { |
|
| 126 | - $id_of_new_system_question = intval( |
|
| 127 | - $wpdb->get_var( |
|
| 128 | - $wpdb->prepare( |
|
| 129 | - "SELECT QST_ID FROM $this->_new_table WHERE QST_system = %s", |
|
| 130 | - $old_question['system_name'] |
|
| 131 | - ) |
|
| 132 | - ) |
|
| 133 | - ); |
|
| 134 | - if ($id_of_new_system_question) { |
|
| 135 | - return $id_of_new_system_question; |
|
| 136 | - } |
|
| 137 | - // ok so this must be the first one. Carry on. |
|
| 138 | - } |
|
| 119 | + private function _insert_new_question($old_question): int |
|
| 120 | + { |
|
| 121 | + global $wpdb; |
|
| 122 | + // if this pretends to be a 'system' question, check if we already have a |
|
| 123 | + // system question for that string. If so, pretend THAT new question |
|
| 124 | + // is what we just inserted |
|
| 125 | + if ($old_question['system_name']) { |
|
| 126 | + $id_of_new_system_question = intval( |
|
| 127 | + $wpdb->get_var( |
|
| 128 | + $wpdb->prepare( |
|
| 129 | + "SELECT QST_ID FROM $this->_new_table WHERE QST_system = %s", |
|
| 130 | + $old_question['system_name'] |
|
| 131 | + ) |
|
| 132 | + ) |
|
| 133 | + ); |
|
| 134 | + if ($id_of_new_system_question) { |
|
| 135 | + return $id_of_new_system_question; |
|
| 136 | + } |
|
| 137 | + // ok so this must be the first one. Carry on. |
|
| 138 | + } |
|
| 139 | 139 | |
| 140 | - $cols_n_values = [ |
|
| 141 | - 'QST_display_text' => stripslashes($old_question['question']), |
|
| 142 | - 'QST_admin_label' => sanitize_title($old_question['question'] ?: ''), |
|
| 143 | - 'QST_system' => (string) $old_question['system_name'], |
|
| 144 | - 'QST_type' => $old_question['question_type'], |
|
| 145 | - 'QST_required' => 'Y' == $old_question['required'], |
|
| 146 | - 'QST_required_text' => stripslashes($old_question['required_text'] ?: ''), |
|
| 147 | - 'QST_order' => $old_question['sequence'], |
|
| 148 | - 'QST_admin_only' => 'Y' == $old_question['admin_only'], |
|
| 149 | - 'QST_wp_user' => $old_question['wp_user'], |
|
| 150 | - 'QST_deleted' => false, |
|
| 151 | - ]; |
|
| 152 | - $data_types = [ |
|
| 153 | - '%s',// QST_display_text |
|
| 154 | - '%s',// QST-admin_label |
|
| 155 | - '%s',// QST_system |
|
| 156 | - '%s',// QST_type |
|
| 157 | - '%d',// QST_required |
|
| 158 | - '%s',// QST_required_text |
|
| 159 | - '%d',// QST_order |
|
| 160 | - '%d',// QST_admin_only |
|
| 161 | - '%d',// QST_wp_user |
|
| 162 | - '%d',// QST_deleted |
|
| 163 | - ]; |
|
| 164 | - $success = $wpdb->insert($this->_new_table, $cols_n_values, $data_types); |
|
| 165 | - if (! $success) { |
|
| 166 | - $this->add_error( |
|
| 167 | - $this->get_migration_script()->_create_error_message_for_db_insertion( |
|
| 168 | - $this->_old_table, |
|
| 169 | - $old_question, |
|
| 170 | - $this->_new_table, |
|
| 171 | - $cols_n_values, |
|
| 172 | - $data_types |
|
| 173 | - ) |
|
| 174 | - ); |
|
| 175 | - return 0; |
|
| 176 | - } |
|
| 177 | - $new_id = $wpdb->insert_id; |
|
| 178 | - // now take care of possibly adding question options |
|
| 179 | - if (in_array($old_question['question_type'], ['DROPDOWN', 'SINGLE', 'MULTIPLE'])) { |
|
| 180 | - $options = explode(",", $old_question['response']); |
|
| 181 | - foreach ($options as $option) { |
|
| 182 | - $this->_insert_question_option($option, $new_id); |
|
| 183 | - } |
|
| 184 | - } |
|
| 185 | - return $new_id; |
|
| 186 | - } |
|
| 140 | + $cols_n_values = [ |
|
| 141 | + 'QST_display_text' => stripslashes($old_question['question']), |
|
| 142 | + 'QST_admin_label' => sanitize_title($old_question['question'] ?: ''), |
|
| 143 | + 'QST_system' => (string) $old_question['system_name'], |
|
| 144 | + 'QST_type' => $old_question['question_type'], |
|
| 145 | + 'QST_required' => 'Y' == $old_question['required'], |
|
| 146 | + 'QST_required_text' => stripslashes($old_question['required_text'] ?: ''), |
|
| 147 | + 'QST_order' => $old_question['sequence'], |
|
| 148 | + 'QST_admin_only' => 'Y' == $old_question['admin_only'], |
|
| 149 | + 'QST_wp_user' => $old_question['wp_user'], |
|
| 150 | + 'QST_deleted' => false, |
|
| 151 | + ]; |
|
| 152 | + $data_types = [ |
|
| 153 | + '%s',// QST_display_text |
|
| 154 | + '%s',// QST-admin_label |
|
| 155 | + '%s',// QST_system |
|
| 156 | + '%s',// QST_type |
|
| 157 | + '%d',// QST_required |
|
| 158 | + '%s',// QST_required_text |
|
| 159 | + '%d',// QST_order |
|
| 160 | + '%d',// QST_admin_only |
|
| 161 | + '%d',// QST_wp_user |
|
| 162 | + '%d',// QST_deleted |
|
| 163 | + ]; |
|
| 164 | + $success = $wpdb->insert($this->_new_table, $cols_n_values, $data_types); |
|
| 165 | + if (! $success) { |
|
| 166 | + $this->add_error( |
|
| 167 | + $this->get_migration_script()->_create_error_message_for_db_insertion( |
|
| 168 | + $this->_old_table, |
|
| 169 | + $old_question, |
|
| 170 | + $this->_new_table, |
|
| 171 | + $cols_n_values, |
|
| 172 | + $data_types |
|
| 173 | + ) |
|
| 174 | + ); |
|
| 175 | + return 0; |
|
| 176 | + } |
|
| 177 | + $new_id = $wpdb->insert_id; |
|
| 178 | + // now take care of possibly adding question options |
|
| 179 | + if (in_array($old_question['question_type'], ['DROPDOWN', 'SINGLE', 'MULTIPLE'])) { |
|
| 180 | + $options = explode(",", $old_question['response']); |
|
| 181 | + foreach ($options as $option) { |
|
| 182 | + $this->_insert_question_option($option, $new_id); |
|
| 183 | + } |
|
| 184 | + } |
|
| 185 | + return $new_id; |
|
| 186 | + } |
|
| 187 | 187 | |
| 188 | 188 | |
| 189 | - /** |
|
| 190 | - * Adds a question option to the db |
|
| 191 | - * |
|
| 192 | - * @param string $option |
|
| 193 | - * @param int $question_id |
|
| 194 | - * @return void |
|
| 195 | - * @global wpdb $wpdb |
|
| 196 | - */ |
|
| 197 | - private function _insert_question_option(string $option, int $question_id): void |
|
| 198 | - { |
|
| 199 | - $option = trim($option); |
|
| 200 | - global $wpdb; |
|
| 201 | - $cols_n_values = [ |
|
| 202 | - 'QST_ID' => $question_id, |
|
| 203 | - 'QSO_value' => $option, |
|
| 204 | - 'QSO_deleted' => false, |
|
| 205 | - ]; |
|
| 206 | - $data_types = [ |
|
| 207 | - '%d',// QST_ID |
|
| 208 | - '%s',// QSO_value |
|
| 209 | - '%d',// QSO_deleted |
|
| 210 | - ]; |
|
| 211 | - $success = $wpdb->insert($this->_option_table, $cols_n_values, $data_types); |
|
| 212 | - if (! $success) { |
|
| 213 | - $this->add_error( |
|
| 214 | - $this->get_migration_script()->_create_error_message_for_db_insertion( |
|
| 215 | - $this->_old_table, |
|
| 216 | - ['option' => $option, 'new_question_id' => $question_id], |
|
| 217 | - $this->_option_table, |
|
| 218 | - $cols_n_values, |
|
| 219 | - $data_types |
|
| 220 | - ) |
|
| 221 | - ); |
|
| 222 | - } |
|
| 223 | - } |
|
| 189 | + /** |
|
| 190 | + * Adds a question option to the db |
|
| 191 | + * |
|
| 192 | + * @param string $option |
|
| 193 | + * @param int $question_id |
|
| 194 | + * @return void |
|
| 195 | + * @global wpdb $wpdb |
|
| 196 | + */ |
|
| 197 | + private function _insert_question_option(string $option, int $question_id): void |
|
| 198 | + { |
|
| 199 | + $option = trim($option); |
|
| 200 | + global $wpdb; |
|
| 201 | + $cols_n_values = [ |
|
| 202 | + 'QST_ID' => $question_id, |
|
| 203 | + 'QSO_value' => $option, |
|
| 204 | + 'QSO_deleted' => false, |
|
| 205 | + ]; |
|
| 206 | + $data_types = [ |
|
| 207 | + '%d',// QST_ID |
|
| 208 | + '%s',// QSO_value |
|
| 209 | + '%d',// QSO_deleted |
|
| 210 | + ]; |
|
| 211 | + $success = $wpdb->insert($this->_option_table, $cols_n_values, $data_types); |
|
| 212 | + if (! $success) { |
|
| 213 | + $this->add_error( |
|
| 214 | + $this->get_migration_script()->_create_error_message_for_db_insertion( |
|
| 215 | + $this->_old_table, |
|
| 216 | + ['option' => $option, 'new_question_id' => $question_id], |
|
| 217 | + $this->_option_table, |
|
| 218 | + $cols_n_values, |
|
| 219 | + $data_types |
|
| 220 | + ) |
|
| 221 | + ); |
|
| 222 | + } |
|
| 223 | + } |
|
| 224 | 224 | } |
@@ -26,186 +26,186 @@ |
||
| 26 | 26 | |
| 27 | 27 | class EE_DMS_4_1_0_checkins extends EE_Data_Migration_Script_Stage_Table |
| 28 | 28 | { |
| 29 | - public function __construct() |
|
| 30 | - { |
|
| 31 | - global $wpdb; |
|
| 32 | - $this->_pretty_name = esc_html__('Check-ins', 'event_espresso'); |
|
| 33 | - $this->_old_table = $wpdb->prefix . "events_attendee"; |
|
| 34 | - $this->select_expression = 'att.*, e.event_status'; |
|
| 35 | - $this->_extra_where_sql = 'AS att |
|
| 29 | + public function __construct() |
|
| 30 | + { |
|
| 31 | + global $wpdb; |
|
| 32 | + $this->_pretty_name = esc_html__('Check-ins', 'event_espresso'); |
|
| 33 | + $this->_old_table = $wpdb->prefix . "events_attendee"; |
|
| 34 | + $this->select_expression = 'att.*, e.event_status'; |
|
| 35 | + $this->_extra_where_sql = 'AS att |
|
| 36 | 36 | INNER JOIN ' . $wpdb->prefix . 'events_detail AS e ON att.event_id=e.id |
| 37 | 37 | WHERE e.event_status!="D"'; |
| 38 | - $this->_new_table = $wpdb->prefix . "esp_checkin"; |
|
| 39 | - parent::__construct(); |
|
| 40 | - } |
|
| 38 | + $this->_new_table = $wpdb->prefix . "esp_checkin"; |
|
| 39 | + parent::__construct(); |
|
| 40 | + } |
|
| 41 | 41 | |
| 42 | 42 | |
| 43 | - /** |
|
| 44 | - * @throws EE_Error |
|
| 45 | - */ |
|
| 46 | - protected function _migrate_old_row($old_row) |
|
| 47 | - { |
|
| 48 | - global $wpdb; |
|
| 49 | - $new_reg_table = $wpdb->prefix . "esp_registration"; |
|
| 43 | + /** |
|
| 44 | + * @throws EE_Error |
|
| 45 | + */ |
|
| 46 | + protected function _migrate_old_row($old_row) |
|
| 47 | + { |
|
| 48 | + global $wpdb; |
|
| 49 | + $new_reg_table = $wpdb->prefix . "esp_registration"; |
|
| 50 | 50 | |
| 51 | - $num_to_checkin_at_this_time = max([intval($old_row['checked_in_quantity']), intval($old_row['checked_in'])]); |
|
| 51 | + $num_to_checkin_at_this_time = max([intval($old_row['checked_in_quantity']), intval($old_row['checked_in'])]); |
|
| 52 | 52 | |
| 53 | - $new_registrations_for_attendee = |
|
| 54 | - $this->get_migration_script()->get_mapping_new_pk($this->_old_table, $old_row['id'], $new_reg_table); |
|
| 55 | - if (! $new_registrations_for_attendee) { |
|
| 56 | - $new_registrations_for_attendee = []; |
|
| 57 | - } |
|
| 58 | - $new_datetime = $this->_try_to_find_datetime($old_row); |
|
| 53 | + $new_registrations_for_attendee = |
|
| 54 | + $this->get_migration_script()->get_mapping_new_pk($this->_old_table, $old_row['id'], $new_reg_table); |
|
| 55 | + if (! $new_registrations_for_attendee) { |
|
| 56 | + $new_registrations_for_attendee = []; |
|
| 57 | + } |
|
| 58 | + $new_datetime = $this->_try_to_find_datetime($old_row); |
|
| 59 | 59 | |
| 60 | - // make sure registrations array is numerically indexed starting at 0 (it probably already is) |
|
| 61 | - $new_registrations_for_attendee = array_values($new_registrations_for_attendee); |
|
| 62 | - $new_checkin_ids = []; |
|
| 63 | - for ($i = 0; $i < abs($num_to_checkin_at_this_time); $i++) { |
|
| 64 | - $new_reg_id = $new_registrations_for_attendee[ $i ]; |
|
| 65 | - if (! $new_reg_id) { |
|
| 66 | - $this->add_error( |
|
| 67 | - sprintf( |
|
| 68 | - esc_html__( |
|
| 69 | - /* translators: %1$s database row represented in JSON, %2$s number of registrations to check in |
|
| 60 | + // make sure registrations array is numerically indexed starting at 0 (it probably already is) |
|
| 61 | + $new_registrations_for_attendee = array_values($new_registrations_for_attendee); |
|
| 62 | + $new_checkin_ids = []; |
|
| 63 | + for ($i = 0; $i < abs($num_to_checkin_at_this_time); $i++) { |
|
| 64 | + $new_reg_id = $new_registrations_for_attendee[ $i ]; |
|
| 65 | + if (! $new_reg_id) { |
|
| 66 | + $this->add_error( |
|
| 67 | + sprintf( |
|
| 68 | + esc_html__( |
|
| 69 | + /* translators: %1$s database row represented in JSON, %2$s number of registrations to check in |
|
| 70 | 70 | * %3$s number of registrations for the attendee, %4$s new registration rows represented in JSON |
| 71 | 71 | */ |
| 72 | - // @codingStandardsIgnoreStart |
|
| 73 | - 'It appears we wanted to check-in more registrations than actually exist. The old attendee record (%1$s) indicated we should check-in %2$d registrations, but there are only %3$d registrations for that attendee (%4$s)', |
|
| 74 | - // @codingStandardsIgnoreEnd |
|
| 75 | - 'event_espresso' |
|
| 76 | - ), |
|
| 77 | - $this->_json_encode($old_row), |
|
| 78 | - abs($num_to_checkin_at_this_time), |
|
| 79 | - count($new_registrations_for_attendee), |
|
| 80 | - $this->_json_encode($new_registrations_for_attendee) |
|
| 81 | - ) |
|
| 82 | - ); |
|
| 83 | - break; |
|
| 84 | - } |
|
| 85 | - $existing_checkin_record = $wpdb->get_var( |
|
| 86 | - $wpdb->prepare( |
|
| 87 | - "SELECT CHK_ID FROM $this->_new_table WHERE REG_ID = %d ORDER BY CHK_ID DESC LIMIT 1", |
|
| 88 | - $new_reg_id |
|
| 89 | - ) |
|
| 90 | - ); |
|
| 91 | - if (! $existing_checkin_record) { |
|
| 92 | - $new_id = $this->_insert_checkin_record($new_reg_id, $new_datetime); |
|
| 93 | - if ($new_id) { |
|
| 94 | - $new_checkin_ids[] = $new_id; |
|
| 95 | - } |
|
| 96 | - } |
|
| 97 | - } |
|
| 98 | - if ($new_checkin_ids) { |
|
| 99 | - $this->get_migration_script()->set_mapping( |
|
| 100 | - $this->_old_table, |
|
| 101 | - $old_row['id'], |
|
| 102 | - $this->_new_table, |
|
| 103 | - $new_checkin_ids |
|
| 104 | - ); |
|
| 105 | - } |
|
| 106 | - } |
|
| 72 | + // @codingStandardsIgnoreStart |
|
| 73 | + 'It appears we wanted to check-in more registrations than actually exist. The old attendee record (%1$s) indicated we should check-in %2$d registrations, but there are only %3$d registrations for that attendee (%4$s)', |
|
| 74 | + // @codingStandardsIgnoreEnd |
|
| 75 | + 'event_espresso' |
|
| 76 | + ), |
|
| 77 | + $this->_json_encode($old_row), |
|
| 78 | + abs($num_to_checkin_at_this_time), |
|
| 79 | + count($new_registrations_for_attendee), |
|
| 80 | + $this->_json_encode($new_registrations_for_attendee) |
|
| 81 | + ) |
|
| 82 | + ); |
|
| 83 | + break; |
|
| 84 | + } |
|
| 85 | + $existing_checkin_record = $wpdb->get_var( |
|
| 86 | + $wpdb->prepare( |
|
| 87 | + "SELECT CHK_ID FROM $this->_new_table WHERE REG_ID = %d ORDER BY CHK_ID DESC LIMIT 1", |
|
| 88 | + $new_reg_id |
|
| 89 | + ) |
|
| 90 | + ); |
|
| 91 | + if (! $existing_checkin_record) { |
|
| 92 | + $new_id = $this->_insert_checkin_record($new_reg_id, $new_datetime); |
|
| 93 | + if ($new_id) { |
|
| 94 | + $new_checkin_ids[] = $new_id; |
|
| 95 | + } |
|
| 96 | + } |
|
| 97 | + } |
|
| 98 | + if ($new_checkin_ids) { |
|
| 99 | + $this->get_migration_script()->set_mapping( |
|
| 100 | + $this->_old_table, |
|
| 101 | + $old_row['id'], |
|
| 102 | + $this->_new_table, |
|
| 103 | + $new_checkin_ids |
|
| 104 | + ); |
|
| 105 | + } |
|
| 106 | + } |
|
| 107 | 107 | |
| 108 | 108 | |
| 109 | - /** |
|
| 110 | - * Tries to find the new datetime the Check-in was for, based on the attendee row |
|
| 111 | - * (because we know the attendee was for an event as a specific time, and we know |
|
| 112 | - * the event's OLD ID...) |
|
| 113 | - * |
|
| 114 | - * @param array $old_attendee |
|
| 115 | - * @return array row of datetime from DB |
|
| 116 | - * @throws EE_Error |
|
| 117 | - * @global wpdb $wpdb |
|
| 118 | - */ |
|
| 119 | - private function _try_to_find_datetime(array $old_attendee): array |
|
| 120 | - { |
|
| 121 | - global $wpdb; |
|
| 109 | + /** |
|
| 110 | + * Tries to find the new datetime the Check-in was for, based on the attendee row |
|
| 111 | + * (because we know the attendee was for an event as a specific time, and we know |
|
| 112 | + * the event's OLD ID...) |
|
| 113 | + * |
|
| 114 | + * @param array $old_attendee |
|
| 115 | + * @return array row of datetime from DB |
|
| 116 | + * @throws EE_Error |
|
| 117 | + * @global wpdb $wpdb |
|
| 118 | + */ |
|
| 119 | + private function _try_to_find_datetime(array $old_attendee): array |
|
| 120 | + { |
|
| 121 | + global $wpdb; |
|
| 122 | 122 | |
| 123 | - $new_event_id = |
|
| 124 | - $this->get_migration_script()->get_mapping_new_pk( |
|
| 125 | - $wpdb->prefix . "events_detail", |
|
| 126 | - $old_attendee['event_id'], |
|
| 127 | - $wpdb->posts |
|
| 128 | - ); |
|
| 129 | - if (! $new_event_id) { |
|
| 130 | - $this->add_error( |
|
| 131 | - sprintf( |
|
| 132 | - esc_html__( |
|
| 133 | - /* translators: 1: original event ID, 2: original attendee database row */ |
|
| 134 | - // @codingStandardsIgnoreStart |
|
| 135 | - 'Could not find new event ID with old event ID %1$d, on attendee row %2$s; and because of that couldn\'t find the correct datetime for Check-in', |
|
| 136 | - // @codingStandardsIgnoreEnd |
|
| 137 | - 'event_espresso' |
|
| 138 | - ), |
|
| 139 | - $old_attendee['event_id'], |
|
| 140 | - $this->_json_encode($old_attendee) |
|
| 141 | - ) |
|
| 142 | - ); |
|
| 143 | - return []; |
|
| 144 | - } |
|
| 145 | - $old_att_start_date = $old_attendee['start_date']; |
|
| 146 | - $old_att_start_time = $this->get_migration_script()->convertTimeFromAMPM($old_attendee['event_time']); |
|
| 147 | - $old_att_datetime = |
|
| 148 | - $this->get_migration_script()->convert_date_string_to_utc( |
|
| 149 | - $this, |
|
| 150 | - $old_attendee, |
|
| 151 | - "$old_att_start_date $old_att_start_time:00" |
|
| 152 | - ); |
|
| 123 | + $new_event_id = |
|
| 124 | + $this->get_migration_script()->get_mapping_new_pk( |
|
| 125 | + $wpdb->prefix . "events_detail", |
|
| 126 | + $old_attendee['event_id'], |
|
| 127 | + $wpdb->posts |
|
| 128 | + ); |
|
| 129 | + if (! $new_event_id) { |
|
| 130 | + $this->add_error( |
|
| 131 | + sprintf( |
|
| 132 | + esc_html__( |
|
| 133 | + /* translators: 1: original event ID, 2: original attendee database row */ |
|
| 134 | + // @codingStandardsIgnoreStart |
|
| 135 | + 'Could not find new event ID with old event ID %1$d, on attendee row %2$s; and because of that couldn\'t find the correct datetime for Check-in', |
|
| 136 | + // @codingStandardsIgnoreEnd |
|
| 137 | + 'event_espresso' |
|
| 138 | + ), |
|
| 139 | + $old_attendee['event_id'], |
|
| 140 | + $this->_json_encode($old_attendee) |
|
| 141 | + ) |
|
| 142 | + ); |
|
| 143 | + return []; |
|
| 144 | + } |
|
| 145 | + $old_att_start_date = $old_attendee['start_date']; |
|
| 146 | + $old_att_start_time = $this->get_migration_script()->convertTimeFromAMPM($old_attendee['event_time']); |
|
| 147 | + $old_att_datetime = |
|
| 148 | + $this->get_migration_script()->convert_date_string_to_utc( |
|
| 149 | + $this, |
|
| 150 | + $old_attendee, |
|
| 151 | + "$old_att_start_date $old_att_start_time:00" |
|
| 152 | + ); |
|
| 153 | 153 | |
| 154 | - $datetime_table = $wpdb->prefix . "esp_datetime"; |
|
| 155 | - // add all conditions to an array from which we can SHIFT conditions off in order to widen our search |
|
| 156 | - // the most important condition should be last, as it will be array_shift'ed off last |
|
| 157 | - $conditions = [ |
|
| 158 | - $wpdb->prepare("$datetime_table.DTT_EVT_start = %s", $old_att_datetime),// times match? |
|
| 159 | - $wpdb->prepare("$datetime_table.EVT_ID = %d", $new_event_id),// events match? |
|
| 160 | - ]; |
|
| 161 | - // start running queries, widening search each time by removing a condition |
|
| 162 | - do { |
|
| 163 | - $full_query = "SELECT * FROM $datetime_table WHERE " . implode(" AND ", $conditions) . " LIMIT 1"; |
|
| 164 | - $datetime_found = $wpdb->get_row($full_query, ARRAY_A); |
|
| 165 | - array_shift($conditions); |
|
| 166 | - } while (! $datetime_found && $conditions); |
|
| 167 | - return $datetime_found; |
|
| 168 | - } |
|
| 154 | + $datetime_table = $wpdb->prefix . "esp_datetime"; |
|
| 155 | + // add all conditions to an array from which we can SHIFT conditions off in order to widen our search |
|
| 156 | + // the most important condition should be last, as it will be array_shift'ed off last |
|
| 157 | + $conditions = [ |
|
| 158 | + $wpdb->prepare("$datetime_table.DTT_EVT_start = %s", $old_att_datetime),// times match? |
|
| 159 | + $wpdb->prepare("$datetime_table.EVT_ID = %d", $new_event_id),// events match? |
|
| 160 | + ]; |
|
| 161 | + // start running queries, widening search each time by removing a condition |
|
| 162 | + do { |
|
| 163 | + $full_query = "SELECT * FROM $datetime_table WHERE " . implode(" AND ", $conditions) . " LIMIT 1"; |
|
| 164 | + $datetime_found = $wpdb->get_row($full_query, ARRAY_A); |
|
| 165 | + array_shift($conditions); |
|
| 166 | + } while (! $datetime_found && $conditions); |
|
| 167 | + return $datetime_found; |
|
| 168 | + } |
|
| 169 | 169 | |
| 170 | 170 | |
| 171 | - /** |
|
| 172 | - * Adds a new Check-in/checkout record according to $new_reg_id,$new_datetime_id,$checking_in, and $timestamp |
|
| 173 | - * |
|
| 174 | - * @param int $new_reg_id |
|
| 175 | - * @param array $new_datetime |
|
| 176 | - * @return int new Check-in id |
|
| 177 | - */ |
|
| 178 | - private function _insert_checkin_record(int $new_reg_id, array $new_datetime): int |
|
| 179 | - { |
|
| 180 | - global $wpdb; |
|
| 171 | + /** |
|
| 172 | + * Adds a new Check-in/checkout record according to $new_reg_id,$new_datetime_id,$checking_in, and $timestamp |
|
| 173 | + * |
|
| 174 | + * @param int $new_reg_id |
|
| 175 | + * @param array $new_datetime |
|
| 176 | + * @return int new Check-in id |
|
| 177 | + */ |
|
| 178 | + private function _insert_checkin_record(int $new_reg_id, array $new_datetime): int |
|
| 179 | + { |
|
| 180 | + global $wpdb; |
|
| 181 | 181 | |
| 182 | 182 | |
| 183 | - // ok we can actually do what we set out to do: add a checkin/checkout record |
|
| 184 | - $cols_n_values = [ |
|
| 185 | - 'REG_ID' => $new_reg_id, |
|
| 186 | - 'DTT_ID' => $new_datetime['DTT_ID'] ?? 0, |
|
| 187 | - 'CHK_in' => true, |
|
| 188 | - 'CHK_timestamp' => $new_datetime['DTT_EVT_start'] ?? null, |
|
| 189 | - ]; |
|
| 190 | - $data_types = [ |
|
| 191 | - '%d',// REG_ID |
|
| 192 | - '%d',// DTT_ID |
|
| 193 | - '%d',// CHK_in |
|
| 194 | - '%s',// CHK_timestamp |
|
| 195 | - ]; |
|
| 196 | - $success = $wpdb->insert($this->_new_table, $cols_n_values, $data_types); |
|
| 197 | - if (! $success) { |
|
| 198 | - $this->add_error( |
|
| 199 | - $this->get_migration_script()->_create_error_message_for_db_insertion( |
|
| 200 | - $this->_old_table, |
|
| 201 | - [], |
|
| 202 | - $this->_new_table, |
|
| 203 | - $cols_n_values, |
|
| 204 | - $data_types |
|
| 205 | - ) |
|
| 206 | - ); |
|
| 207 | - return 0; |
|
| 208 | - } |
|
| 209 | - return $wpdb->insert_id; |
|
| 210 | - } |
|
| 183 | + // ok we can actually do what we set out to do: add a checkin/checkout record |
|
| 184 | + $cols_n_values = [ |
|
| 185 | + 'REG_ID' => $new_reg_id, |
|
| 186 | + 'DTT_ID' => $new_datetime['DTT_ID'] ?? 0, |
|
| 187 | + 'CHK_in' => true, |
|
| 188 | + 'CHK_timestamp' => $new_datetime['DTT_EVT_start'] ?? null, |
|
| 189 | + ]; |
|
| 190 | + $data_types = [ |
|
| 191 | + '%d',// REG_ID |
|
| 192 | + '%d',// DTT_ID |
|
| 193 | + '%d',// CHK_in |
|
| 194 | + '%s',// CHK_timestamp |
|
| 195 | + ]; |
|
| 196 | + $success = $wpdb->insert($this->_new_table, $cols_n_values, $data_types); |
|
| 197 | + if (! $success) { |
|
| 198 | + $this->add_error( |
|
| 199 | + $this->get_migration_script()->_create_error_message_for_db_insertion( |
|
| 200 | + $this->_old_table, |
|
| 201 | + [], |
|
| 202 | + $this->_new_table, |
|
| 203 | + $cols_n_values, |
|
| 204 | + $data_types |
|
| 205 | + ) |
|
| 206 | + ); |
|
| 207 | + return 0; |
|
| 208 | + } |
|
| 209 | + return $wpdb->insert_id; |
|
| 210 | + } |
|
| 211 | 211 | } |
@@ -20,163 +20,163 @@ |
||
| 20 | 20 | */ |
| 21 | 21 | class EE_DMS_4_1_0_event_question_group extends EE_Data_Migration_Script_Stage_Table |
| 22 | 22 | { |
| 23 | - /** |
|
| 24 | - * @throws EE_Error |
|
| 25 | - */ |
|
| 26 | - public function _migrate_old_row($old_row) |
|
| 27 | - { |
|
| 28 | - // $txn_id = $this->get_migration_script()->get_mapping_new_pk($this->_old_table, $old_row['id'], $this->_new_transaction_table); |
|
| 29 | - // if ( ! $txn_id ){ |
|
| 30 | - // $this->add_error(sprintf(esc_html__("Could not find the transaction for the 3.1 attendee %d from row %s", "event_espresso"),$old_row['id'],$this->_json_encode($old_row))); |
|
| 31 | - // return; |
|
| 32 | - // } |
|
| 33 | - // $txn = $this->_get_txn($txn_id); |
|
| 34 | - // $new_line_items = $this->_insert_new_line_items($txn,$old_row); |
|
| 35 | - // $this->get_migration_script()->set_mapping($this->_old_table,$old_row['id'],$this->_new_line_table,$new_line_items); |
|
| 23 | + /** |
|
| 24 | + * @throws EE_Error |
|
| 25 | + */ |
|
| 26 | + public function _migrate_old_row($old_row) |
|
| 27 | + { |
|
| 28 | + // $txn_id = $this->get_migration_script()->get_mapping_new_pk($this->_old_table, $old_row['id'], $this->_new_transaction_table); |
|
| 29 | + // if ( ! $txn_id ){ |
|
| 30 | + // $this->add_error(sprintf(esc_html__("Could not find the transaction for the 3.1 attendee %d from row %s", "event_espresso"),$old_row['id'],$this->_json_encode($old_row))); |
|
| 31 | + // return; |
|
| 32 | + // } |
|
| 33 | + // $txn = $this->_get_txn($txn_id); |
|
| 34 | + // $new_line_items = $this->_insert_new_line_items($txn,$old_row); |
|
| 35 | + // $this->get_migration_script()->set_mapping($this->_old_table,$old_row['id'],$this->_new_line_table,$new_line_items); |
|
| 36 | 36 | |
| 37 | - $this->_insert_new_event_question_groups($old_row); |
|
| 38 | - } |
|
| 39 | - // function _migration_step($num_items=50){ |
|
| 40 | - // global $wpdb; |
|
| 41 | - // $start_at_record = $this->count_records_migrated(); |
|
| 42 | - // $rows = $wpdb->get_results($wpdb->prepare("SELECT * FROM $this->_old_table LIMIT %d,%d",$start_at_record,$num_items),ARRAY_A); |
|
| 43 | - // $items_actually_migrated = 0; |
|
| 44 | - // foreach($rows as $old_event){ |
|
| 45 | - // $this->_insert_new_event_question_groups($old_event); |
|
| 46 | - // $items_actually_migrated++; |
|
| 47 | - // } |
|
| 48 | - // if($this->count_records_migrated() + $items_actually_migrated >= $this->count_records_to_migrate()){ |
|
| 49 | - // $this->set_completed(); |
|
| 50 | - // } |
|
| 51 | - // return $items_actually_migrated; |
|
| 52 | - // } |
|
| 53 | - // function _count_records_to_migrate() { |
|
| 54 | - // global $wpdb; |
|
| 55 | - // $count = $wpdb->get_var("SELECT COUNT(id) FROM ".$this->_old_table); |
|
| 56 | - // return $count; |
|
| 57 | - // } |
|
| 58 | - public function __construct() |
|
| 59 | - { |
|
| 60 | - global $wpdb; |
|
| 61 | - $this->_old_table = $wpdb->prefix . "events_detail"; |
|
| 62 | - $this->_extra_where_sql = 'WHERE event_status!="D"'; |
|
| 63 | - $this->_new_table = $wpdb->prefix . "esp_event_question_group"; |
|
| 64 | - $this->_pretty_name = esc_html__("Question Groups in each Event", "event_espresso"); |
|
| 65 | - parent::__construct(); |
|
| 66 | - } |
|
| 37 | + $this->_insert_new_event_question_groups($old_row); |
|
| 38 | + } |
|
| 39 | + // function _migration_step($num_items=50){ |
|
| 40 | + // global $wpdb; |
|
| 41 | + // $start_at_record = $this->count_records_migrated(); |
|
| 42 | + // $rows = $wpdb->get_results($wpdb->prepare("SELECT * FROM $this->_old_table LIMIT %d,%d",$start_at_record,$num_items),ARRAY_A); |
|
| 43 | + // $items_actually_migrated = 0; |
|
| 44 | + // foreach($rows as $old_event){ |
|
| 45 | + // $this->_insert_new_event_question_groups($old_event); |
|
| 46 | + // $items_actually_migrated++; |
|
| 47 | + // } |
|
| 48 | + // if($this->count_records_migrated() + $items_actually_migrated >= $this->count_records_to_migrate()){ |
|
| 49 | + // $this->set_completed(); |
|
| 50 | + // } |
|
| 51 | + // return $items_actually_migrated; |
|
| 52 | + // } |
|
| 53 | + // function _count_records_to_migrate() { |
|
| 54 | + // global $wpdb; |
|
| 55 | + // $count = $wpdb->get_var("SELECT COUNT(id) FROM ".$this->_old_table); |
|
| 56 | + // return $count; |
|
| 57 | + // } |
|
| 58 | + public function __construct() |
|
| 59 | + { |
|
| 60 | + global $wpdb; |
|
| 61 | + $this->_old_table = $wpdb->prefix . "events_detail"; |
|
| 62 | + $this->_extra_where_sql = 'WHERE event_status!="D"'; |
|
| 63 | + $this->_new_table = $wpdb->prefix . "esp_event_question_group"; |
|
| 64 | + $this->_pretty_name = esc_html__("Question Groups in each Event", "event_espresso"); |
|
| 65 | + parent::__construct(); |
|
| 66 | + } |
|
| 67 | 67 | |
| 68 | 68 | |
| 69 | - /** |
|
| 70 | - * Attempts to insert a new question group in the new format given an old one |
|
| 71 | - * |
|
| 72 | - * @param array $old_event |
|
| 73 | - * @return void |
|
| 74 | - * @throws EE_Error |
|
| 75 | - * @global wpdb $wpdb |
|
| 76 | - */ |
|
| 77 | - private function _insert_new_event_question_groups(array $old_event) |
|
| 78 | - { |
|
| 79 | - $new_event_question_group_ids = []; |
|
| 80 | - $question_groups_for_primary = maybe_unserialize($old_event['question_groups']); |
|
| 81 | - if (is_array($question_groups_for_primary)) { |
|
| 82 | - foreach ($question_groups_for_primary as $old_question_group_id) { |
|
| 83 | - $new_id = $this->_insert_event_question_group( |
|
| 84 | - $old_event, |
|
| 85 | - (int) $old_question_group_id, |
|
| 86 | - true |
|
| 87 | - ); |
|
| 88 | - if ($new_id) { |
|
| 89 | - $new_event_question_group_ids[] = $new_id; |
|
| 90 | - } |
|
| 91 | - } |
|
| 92 | - } |
|
| 93 | - $event_meta = maybe_unserialize($old_event['event_meta']); |
|
| 94 | - if (isset($event_meta['add_attendee_question_groups'])) { |
|
| 95 | - if (is_array($event_meta['add_attendee_question_groups'])) { |
|
| 96 | - foreach ($event_meta['add_attendee_question_groups'] as $old_question_group_id) { |
|
| 97 | - $new_id = $this->_insert_event_question_group($old_event, $old_question_group_id, false); |
|
| 98 | - if ($new_id) { |
|
| 99 | - $new_event_question_group_ids[] = $new_id; |
|
| 100 | - } |
|
| 101 | - } |
|
| 102 | - } |
|
| 103 | - } |
|
| 69 | + /** |
|
| 70 | + * Attempts to insert a new question group in the new format given an old one |
|
| 71 | + * |
|
| 72 | + * @param array $old_event |
|
| 73 | + * @return void |
|
| 74 | + * @throws EE_Error |
|
| 75 | + * @global wpdb $wpdb |
|
| 76 | + */ |
|
| 77 | + private function _insert_new_event_question_groups(array $old_event) |
|
| 78 | + { |
|
| 79 | + $new_event_question_group_ids = []; |
|
| 80 | + $question_groups_for_primary = maybe_unserialize($old_event['question_groups']); |
|
| 81 | + if (is_array($question_groups_for_primary)) { |
|
| 82 | + foreach ($question_groups_for_primary as $old_question_group_id) { |
|
| 83 | + $new_id = $this->_insert_event_question_group( |
|
| 84 | + $old_event, |
|
| 85 | + (int) $old_question_group_id, |
|
| 86 | + true |
|
| 87 | + ); |
|
| 88 | + if ($new_id) { |
|
| 89 | + $new_event_question_group_ids[] = $new_id; |
|
| 90 | + } |
|
| 91 | + } |
|
| 92 | + } |
|
| 93 | + $event_meta = maybe_unserialize($old_event['event_meta']); |
|
| 94 | + if (isset($event_meta['add_attendee_question_groups'])) { |
|
| 95 | + if (is_array($event_meta['add_attendee_question_groups'])) { |
|
| 96 | + foreach ($event_meta['add_attendee_question_groups'] as $old_question_group_id) { |
|
| 97 | + $new_id = $this->_insert_event_question_group($old_event, $old_question_group_id, false); |
|
| 98 | + if ($new_id) { |
|
| 99 | + $new_event_question_group_ids[] = $new_id; |
|
| 100 | + } |
|
| 101 | + } |
|
| 102 | + } |
|
| 103 | + } |
|
| 104 | 104 | |
| 105 | 105 | |
| 106 | - $this->get_migration_script()->set_mapping( |
|
| 107 | - $this->_old_table, |
|
| 108 | - $old_event['id'], |
|
| 109 | - $this->_new_table, |
|
| 110 | - $new_event_question_group_ids |
|
| 111 | - ); |
|
| 112 | - } |
|
| 106 | + $this->get_migration_script()->set_mapping( |
|
| 107 | + $this->_old_table, |
|
| 108 | + $old_event['id'], |
|
| 109 | + $this->_new_table, |
|
| 110 | + $new_event_question_group_ids |
|
| 111 | + ); |
|
| 112 | + } |
|
| 113 | 113 | |
| 114 | 114 | |
| 115 | - /** |
|
| 116 | - * @throws EE_Error |
|
| 117 | - */ |
|
| 118 | - private function _insert_event_question_group( |
|
| 119 | - array $old_event, |
|
| 120 | - int $old_question_group_id, |
|
| 121 | - bool $primary |
|
| 122 | - ): int { |
|
| 123 | - global $wpdb; |
|
| 124 | - $new_question_group_id = $this->get_migration_script()->get_mapping_new_pk( |
|
| 125 | - $wpdb->prefix . "events_qst_group", |
|
| 126 | - $old_question_group_id, |
|
| 127 | - $wpdb->prefix . "esp_question_group" |
|
| 128 | - ); |
|
| 115 | + /** |
|
| 116 | + * @throws EE_Error |
|
| 117 | + */ |
|
| 118 | + private function _insert_event_question_group( |
|
| 119 | + array $old_event, |
|
| 120 | + int $old_question_group_id, |
|
| 121 | + bool $primary |
|
| 122 | + ): int { |
|
| 123 | + global $wpdb; |
|
| 124 | + $new_question_group_id = $this->get_migration_script()->get_mapping_new_pk( |
|
| 125 | + $wpdb->prefix . "events_qst_group", |
|
| 126 | + $old_question_group_id, |
|
| 127 | + $wpdb->prefix . "esp_question_group" |
|
| 128 | + ); |
|
| 129 | 129 | |
| 130 | - if (! $new_question_group_id) { |
|
| 131 | - $this->add_error( |
|
| 132 | - sprintf( |
|
| 133 | - // translators: %s question ID, %s event ID |
|
| 134 | - esc_html__("Could not find 4.1 question ID for 3.1 question id #%s on event $%s", "event_espresso"), |
|
| 135 | - $old_question_group_id, |
|
| 136 | - $old_event['id'] |
|
| 137 | - ) |
|
| 138 | - ); |
|
| 139 | - return 0; |
|
| 140 | - } |
|
| 141 | - $new_event_id = $this->get_migration_script()->get_mapping_new_pk( |
|
| 142 | - $wpdb->prefix . "events_detail", |
|
| 143 | - intval($old_event['id']), |
|
| 144 | - $wpdb->posts |
|
| 145 | - ); |
|
| 146 | - if (! $new_event_id) { |
|
| 147 | - $this->add_error( |
|
| 148 | - sprintf( |
|
| 149 | - // translators: %s event ID |
|
| 150 | - esc_html__("Could not find 4.1 event 3.1 event id #%s", "event_espresso"), |
|
| 151 | - $old_event['id'] |
|
| 152 | - ) |
|
| 153 | - ); |
|
| 154 | - return 0; |
|
| 155 | - } |
|
| 156 | - $cols_n_values = [ |
|
| 157 | - 'EVT_ID' => $new_event_id, |
|
| 158 | - 'QSG_ID' => $new_question_group_id, |
|
| 159 | - 'EQG_primary' => $primary, |
|
| 160 | - ]; |
|
| 130 | + if (! $new_question_group_id) { |
|
| 131 | + $this->add_error( |
|
| 132 | + sprintf( |
|
| 133 | + // translators: %s question ID, %s event ID |
|
| 134 | + esc_html__("Could not find 4.1 question ID for 3.1 question id #%s on event $%s", "event_espresso"), |
|
| 135 | + $old_question_group_id, |
|
| 136 | + $old_event['id'] |
|
| 137 | + ) |
|
| 138 | + ); |
|
| 139 | + return 0; |
|
| 140 | + } |
|
| 141 | + $new_event_id = $this->get_migration_script()->get_mapping_new_pk( |
|
| 142 | + $wpdb->prefix . "events_detail", |
|
| 143 | + intval($old_event['id']), |
|
| 144 | + $wpdb->posts |
|
| 145 | + ); |
|
| 146 | + if (! $new_event_id) { |
|
| 147 | + $this->add_error( |
|
| 148 | + sprintf( |
|
| 149 | + // translators: %s event ID |
|
| 150 | + esc_html__("Could not find 4.1 event 3.1 event id #%s", "event_espresso"), |
|
| 151 | + $old_event['id'] |
|
| 152 | + ) |
|
| 153 | + ); |
|
| 154 | + return 0; |
|
| 155 | + } |
|
| 156 | + $cols_n_values = [ |
|
| 157 | + 'EVT_ID' => $new_event_id, |
|
| 158 | + 'QSG_ID' => $new_question_group_id, |
|
| 159 | + 'EQG_primary' => $primary, |
|
| 160 | + ]; |
|
| 161 | 161 | |
| 162 | - $data_types = [ |
|
| 163 | - '%d',// EVT_ID |
|
| 164 | - '%d',// QSG_ID |
|
| 165 | - '%d',// EQG_primary |
|
| 166 | - ]; |
|
| 167 | - $success = $wpdb->insert($this->_new_table, $cols_n_values, $data_types); |
|
| 168 | - if (! $success) { |
|
| 169 | - $this->add_error( |
|
| 170 | - $this->get_migration_script()->_create_error_message_for_db_insertion( |
|
| 171 | - $this->_old_table, |
|
| 172 | - $old_event, |
|
| 173 | - $this->_new_table, |
|
| 174 | - $cols_n_values, |
|
| 175 | - $data_types |
|
| 176 | - ) |
|
| 177 | - ); |
|
| 178 | - return 0; |
|
| 179 | - } |
|
| 180 | - return $wpdb->insert_id; |
|
| 181 | - } |
|
| 162 | + $data_types = [ |
|
| 163 | + '%d',// EVT_ID |
|
| 164 | + '%d',// QSG_ID |
|
| 165 | + '%d',// EQG_primary |
|
| 166 | + ]; |
|
| 167 | + $success = $wpdb->insert($this->_new_table, $cols_n_values, $data_types); |
|
| 168 | + if (! $success) { |
|
| 169 | + $this->add_error( |
|
| 170 | + $this->get_migration_script()->_create_error_message_for_db_insertion( |
|
| 171 | + $this->_old_table, |
|
| 172 | + $old_event, |
|
| 173 | + $this->_new_table, |
|
| 174 | + $cols_n_values, |
|
| 175 | + $data_types |
|
| 176 | + ) |
|
| 177 | + ); |
|
| 178 | + return 0; |
|
| 179 | + } |
|
| 180 | + return $wpdb->insert_id; |
|
| 181 | + } |
|
| 182 | 182 | } |
@@ -224,942 +224,942 @@ |
||
| 224 | 224 | */ |
| 225 | 225 | class EE_DMS_4_1_0_attendees extends EE_Data_Migration_Script_Stage_Table |
| 226 | 226 | { |
| 227 | - private string $_new_attendee_cpt_table; |
|
| 227 | + private string $_new_attendee_cpt_table; |
|
| 228 | 228 | |
| 229 | - private string $_new_attendee_meta_table; |
|
| 229 | + private string $_new_attendee_meta_table; |
|
| 230 | 230 | |
| 231 | - private string $_new_reg_table; |
|
| 231 | + private string $_new_reg_table; |
|
| 232 | 232 | |
| 233 | - private string $_new_transaction_table; |
|
| 233 | + private string $_new_transaction_table; |
|
| 234 | 234 | |
| 235 | - private string $_new_payment_table; |
|
| 235 | + private string $_new_payment_table; |
|
| 236 | 236 | |
| 237 | - private string $_old_mer_table; |
|
| 237 | + private string $_old_mer_table; |
|
| 238 | 238 | |
| 239 | - private string $_new_ticket_table; |
|
| 239 | + private string $_new_ticket_table; |
|
| 240 | 240 | |
| 241 | - private string $_new_ticket_datetime_table; |
|
| 241 | + private string $_new_ticket_datetime_table; |
|
| 242 | 242 | |
| 243 | - private string $_new_datetime_table; |
|
| 243 | + private string $_new_datetime_table; |
|
| 244 | 244 | |
| 245 | - private string $_new_datetime_ticket_table; |
|
| 245 | + private string $_new_datetime_ticket_table; |
|
| 246 | 246 | |
| 247 | - private string $_new_price_table; |
|
| 247 | + private string $_new_price_table; |
|
| 248 | 248 | |
| 249 | - private string $_new_ticket_price_table; |
|
| 249 | + private string $_new_ticket_price_table; |
|
| 250 | 250 | |
| 251 | - /** |
|
| 252 | - * Remembers whether the mer table exists |
|
| 253 | - * |
|
| 254 | - * @var boolean |
|
| 255 | - */ |
|
| 256 | - private ?bool $_mer_tables_exist = null; |
|
| 251 | + /** |
|
| 252 | + * Remembers whether the mer table exists |
|
| 253 | + * |
|
| 254 | + * @var boolean |
|
| 255 | + */ |
|
| 256 | + private ?bool $_mer_tables_exist = null; |
|
| 257 | 257 | |
| 258 | 258 | |
| 259 | - public function __construct() |
|
| 260 | - { |
|
| 261 | - global $wpdb; |
|
| 262 | - $this->_pretty_name = esc_html__("Attendees", "event_espresso"); |
|
| 263 | - $this->_old_table = $wpdb->prefix . "events_attendee"; |
|
| 264 | - // Only select the event status column from the event table. |
|
| 265 | - $this->select_expression = 'att.*, e.event_status'; |
|
| 266 | - // Only select attendees for events that aren't deleted. |
|
| 267 | - $this->_extra_where_sql = 'AS att |
|
| 259 | + public function __construct() |
|
| 260 | + { |
|
| 261 | + global $wpdb; |
|
| 262 | + $this->_pretty_name = esc_html__("Attendees", "event_espresso"); |
|
| 263 | + $this->_old_table = $wpdb->prefix . "events_attendee"; |
|
| 264 | + // Only select the event status column from the event table. |
|
| 265 | + $this->select_expression = 'att.*, e.event_status'; |
|
| 266 | + // Only select attendees for events that aren't deleted. |
|
| 267 | + $this->_extra_where_sql = 'AS att |
|
| 268 | 268 | INNER JOIN ' . $wpdb->prefix . 'events_detail AS e ON att.event_id=e.id |
| 269 | 269 | WHERE e.event_status!="D"'; |
| 270 | - $this->_old_mer_table = $wpdb->prefix . "events_multi_event_registration_id_group"; |
|
| 271 | - $this->_new_attendee_cpt_table = $wpdb->posts; |
|
| 272 | - $this->_new_attendee_meta_table = $wpdb->prefix . "esp_attendee_meta"; |
|
| 273 | - $this->_new_reg_table = $wpdb->prefix . "esp_registration"; |
|
| 274 | - $this->_new_transaction_table = $wpdb->prefix . "esp_transaction"; |
|
| 275 | - $this->_new_payment_table = $wpdb->prefix . "esp_payment"; |
|
| 276 | - $this->_new_ticket_table = $wpdb->prefix . "esp_ticket"; |
|
| 277 | - $this->_new_ticket_datetime_table = $wpdb->prefix . "esp_datetime_ticket"; |
|
| 278 | - $this->_new_datetime_table = $wpdb->prefix . "esp_datetime"; |
|
| 279 | - $this->_new_datetime_ticket_table = $wpdb->prefix . "esp_datetime_ticket"; |
|
| 280 | - $this->_new_price_table = $wpdb->prefix . "esp_price"; |
|
| 281 | - $this->_new_ticket_price_table = $wpdb->prefix . "esp_ticket_price"; |
|
| 282 | - parent::__construct(); |
|
| 283 | - } |
|
| 284 | - |
|
| 285 | - |
|
| 286 | - /** |
|
| 287 | - * @throws EE_Error |
|
| 288 | - */ |
|
| 289 | - protected function _migrate_old_row($old_row) |
|
| 290 | - { |
|
| 291 | - // first check if there's already a new attendee with similar characteristics |
|
| 292 | - $new_att_id = $this->_find_attendee_cpt_matching($old_row); |
|
| 293 | - if (! $new_att_id) { |
|
| 294 | - $new_att_id = $this->_insert_new_attendee_cpt($old_row); |
|
| 295 | - if (! $new_att_id) { |
|
| 296 | - // if we couldn't even make an attendee, abandon all hope |
|
| 297 | - return; |
|
| 298 | - } |
|
| 299 | - $new_att_meta_id = $this->_insert_attendee_meta_row($old_row, $new_att_id); |
|
| 300 | - if ($new_att_meta_id) { |
|
| 301 | - $this->get_migration_script()->set_mapping( |
|
| 302 | - $this->_old_table, |
|
| 303 | - $old_row['id'], |
|
| 304 | - $this->_new_attendee_meta_table, |
|
| 305 | - $new_att_meta_id |
|
| 306 | - ); |
|
| 307 | - } |
|
| 308 | - } |
|
| 309 | - $this->get_migration_script()->set_mapping( |
|
| 310 | - $this->_old_table, |
|
| 311 | - $old_row['id'], |
|
| 312 | - $this->_new_attendee_cpt_table, |
|
| 313 | - $new_att_id |
|
| 314 | - ); |
|
| 315 | - |
|
| 316 | - $txn_id = $this->_insert_new_transaction($old_row); |
|
| 317 | - if (! $txn_id) { |
|
| 318 | - // if we couldn't make the transaction, also abandon all hope |
|
| 319 | - return; |
|
| 320 | - } |
|
| 321 | - $this->get_migration_script()->set_mapping( |
|
| 322 | - $this->_old_table, |
|
| 323 | - $old_row['id'], |
|
| 324 | - $this->_new_transaction_table, |
|
| 325 | - $txn_id |
|
| 326 | - ); |
|
| 327 | - $pay_id = $this->_insert_new_payment($old_row, $txn_id); |
|
| 328 | - if ($pay_id) { |
|
| 329 | - $this->get_migration_script()->set_mapping( |
|
| 330 | - $this->_old_table, |
|
| 331 | - $old_row['id'], |
|
| 332 | - $this->_new_payment_table, |
|
| 333 | - $pay_id |
|
| 334 | - ); |
|
| 335 | - } |
|
| 336 | - |
|
| 337 | - |
|
| 338 | - // even if there was no payment, we can go ahead with adding the reg |
|
| 339 | - $new_regs = $this->_insert_new_registrations($old_row, $new_att_id, $txn_id); |
|
| 340 | - if ($new_regs) { |
|
| 341 | - $this->get_migration_script()->set_mapping( |
|
| 342 | - $this->_old_table, |
|
| 343 | - $old_row['id'], |
|
| 344 | - $this->_new_reg_table, |
|
| 345 | - $new_regs |
|
| 346 | - ); |
|
| 347 | - } |
|
| 348 | - } |
|
| 349 | - |
|
| 350 | - |
|
| 351 | - /** |
|
| 352 | - * Checks if there's already an attendee CPT in the db that has the same |
|
| 353 | - * first and last name, and email. If so, returns its ID as an int. |
|
| 354 | - * |
|
| 355 | - * @param array $old_attendee |
|
| 356 | - * @return int |
|
| 357 | - * @global wpdb $wpdb |
|
| 358 | - */ |
|
| 359 | - private function _find_attendee_cpt_matching(array $old_attendee): int |
|
| 360 | - { |
|
| 361 | - global $wpdb; |
|
| 362 | - $existing_attendee_id = |
|
| 363 | - $wpdb->get_var( |
|
| 364 | - $wpdb->prepare( |
|
| 365 | - "SELECT id FROM " . |
|
| 366 | - $this->_new_attendee_cpt_table . |
|
| 367 | - " AS cpt INNER JOIN " . |
|
| 368 | - $this->_new_attendee_meta_table . |
|
| 369 | - " AS meta ON cpt.ID = meta.ATT_ID WHERE meta.ATT_fname = %s AND meta.ATT_lname = %s AND meta.ATT_email = %s LIMIT 1", |
|
| 370 | - $old_attendee['fname'], |
|
| 371 | - $old_attendee['lname'], |
|
| 372 | - $old_attendee['email'] |
|
| 373 | - ) |
|
| 374 | - ); |
|
| 375 | - return intval($existing_attendee_id); |
|
| 376 | - } |
|
| 377 | - |
|
| 378 | - |
|
| 379 | - private function _insert_new_attendee_cpt($old_attendee): int |
|
| 380 | - { |
|
| 381 | - global $wpdb; |
|
| 382 | - $cols_n_values = [ |
|
| 383 | - 'post_title' => stripslashes($old_attendee['fname'] . " " . $old_attendee['lname']),// ATT_full_name |
|
| 384 | - 'post_content' => '',// ATT_bio |
|
| 385 | - 'post_name' => sanitize_title($old_attendee['fname'] . "-" . $old_attendee['lname']),// ATT_slug |
|
| 386 | - 'post_date' => $this->get_migration_script()->convert_date_string_to_utc( |
|
| 387 | - $this, |
|
| 388 | - $old_attendee, |
|
| 389 | - $old_attendee['date'] |
|
| 390 | - ),// ATT_created |
|
| 391 | - 'post_excerpt' => '',// ATT_short_bio |
|
| 392 | - 'post_modified' => $this->get_migration_script()->convert_date_string_to_utc( |
|
| 393 | - $this, |
|
| 394 | - $old_attendee, |
|
| 395 | - $old_attendee['date'] |
|
| 396 | - ),// ATT_modified |
|
| 397 | - 'post_author' => 0,// ATT_author |
|
| 398 | - 'post_parent' => 0,// ATT_parent |
|
| 399 | - 'post_type' => EspressoPostType::ATTENDEES, |
|
| 400 | - 'post_status' => 'publish',// status |
|
| 401 | - ]; |
|
| 402 | - $data_types = [ |
|
| 403 | - '%s',// ATT_full_name |
|
| 404 | - '%s',// ATT_bio |
|
| 405 | - '%s',// ATT_slug |
|
| 406 | - '%s',// ATT_created |
|
| 407 | - '%s',// ATT_short_bio |
|
| 408 | - '%s',// ATT_modified |
|
| 409 | - '%d',// ATT_author |
|
| 410 | - '%d',// ATT_parent |
|
| 411 | - '%s',// post_type |
|
| 412 | - '%s',// status |
|
| 413 | - ]; |
|
| 414 | - $success = $wpdb->insert($this->_new_attendee_cpt_table, $cols_n_values, $data_types); |
|
| 415 | - if (! $success) { |
|
| 416 | - $this->add_error( |
|
| 417 | - $this->get_migration_script()->_create_error_message_for_db_insertion( |
|
| 418 | - $this->_old_table, |
|
| 419 | - $old_attendee, |
|
| 420 | - $this->_new_attendee_cpt_table, |
|
| 421 | - $cols_n_values, |
|
| 422 | - $data_types |
|
| 423 | - ) |
|
| 424 | - ); |
|
| 425 | - return 0; |
|
| 426 | - } |
|
| 427 | - return $wpdb->insert_id; |
|
| 428 | - } |
|
| 429 | - |
|
| 430 | - |
|
| 431 | - private function _insert_attendee_meta_row($old_attendee, $new_attendee_cpt_id): int |
|
| 432 | - { |
|
| 433 | - global $wpdb; |
|
| 434 | - // get the state and country ids from the old row |
|
| 435 | - try { |
|
| 436 | - $new_country = |
|
| 437 | - $this->get_migration_script()->get_or_create_country(stripslashes($old_attendee['country_id'])); |
|
| 438 | - $new_country_iso = $new_country['CNT_ISO']; |
|
| 439 | - } catch (EE_Error $exception) { |
|
| 440 | - $new_country_iso = $this->get_migration_script()->get_default_country_iso(); |
|
| 441 | - } |
|
| 442 | - try { |
|
| 443 | - $new_state = |
|
| 444 | - $this->get_migration_script()->get_or_create_state( |
|
| 445 | - stripslashes($old_attendee['state']), |
|
| 446 | - $new_country_iso |
|
| 447 | - ); |
|
| 448 | - $new_state_id = $new_state['STA_ID']; |
|
| 449 | - } catch (EE_Error $exception) { |
|
| 450 | - $new_state_id = 0; |
|
| 451 | - } |
|
| 452 | - $cols_n_values = [ |
|
| 453 | - 'ATT_ID' => $new_attendee_cpt_id, |
|
| 454 | - 'ATT_fname' => stripslashes($old_attendee['fname']), |
|
| 455 | - 'ATT_lname' => stripslashes($old_attendee['lname']), |
|
| 456 | - 'ATT_address' => stripslashes($old_attendee['address']), |
|
| 457 | - 'ATT_address2' => stripslashes($old_attendee['address2']), |
|
| 458 | - 'ATT_city' => stripslashes($old_attendee['city']), |
|
| 459 | - 'STA_ID' => $new_state_id, |
|
| 460 | - 'CNT_ISO' => $new_country_iso, |
|
| 461 | - 'ATT_zip' => stripslashes($old_attendee['zip']), |
|
| 462 | - 'ATT_email' => stripslashes($old_attendee['email']), |
|
| 463 | - 'ATT_phone' => stripslashes($old_attendee['phone']), |
|
| 464 | - ]; |
|
| 465 | - $data_types = [ |
|
| 466 | - '%d',// ATT_ID |
|
| 467 | - '%s',// ATT_fname |
|
| 468 | - '%s',// ATT_lname |
|
| 469 | - '%s',// ATT_address |
|
| 470 | - '%s',// ATT_address2 |
|
| 471 | - '%s',// ATT_city |
|
| 472 | - '%d',// STA_ID |
|
| 473 | - '%s',// CNT_ISO |
|
| 474 | - '%s',// ATT_zip |
|
| 475 | - '%s',// ATT_email |
|
| 476 | - '%s',// ATT_phone |
|
| 477 | - ]; |
|
| 478 | - $success = $wpdb->insert($this->_new_attendee_meta_table, $cols_n_values, $data_types); |
|
| 479 | - if (! $success) { |
|
| 480 | - $this->add_error( |
|
| 481 | - $this->get_migration_script()->_create_error_message_for_db_insertion( |
|
| 482 | - $this->_old_table, |
|
| 483 | - $old_attendee, |
|
| 484 | - $this->_new_attendee_meta_table, |
|
| 485 | - $cols_n_values, |
|
| 486 | - $data_types |
|
| 487 | - ) |
|
| 488 | - ); |
|
| 489 | - return 0; |
|
| 490 | - } |
|
| 491 | - return $wpdb->insert_id; |
|
| 492 | - } |
|
| 493 | - |
|
| 494 | - |
|
| 495 | - /** |
|
| 496 | - * Note: we don't necessarily create a new transaction for each attendee row. |
|
| 497 | - * Only if the old attendee 'is_primary' is true; otherwise we find the old attendee row that |
|
| 498 | - * 'is_primary' and has the same 'txn_id', then we return ITS new transaction id |
|
| 499 | - * |
|
| 500 | - * @param array $old_attendee |
|
| 501 | - * @return int new transaction id |
|
| 502 | - * @throws EE_Error |
|
| 503 | - * @global wpdb $wpdb |
|
| 504 | - */ |
|
| 505 | - private function _insert_new_transaction(array $old_attendee): int |
|
| 506 | - { |
|
| 507 | - global $wpdb; |
|
| 508 | - |
|
| 509 | - // first: let's check for an existing transaction for this old attendee |
|
| 510 | - if (intval($old_attendee['is_primary'])) {// primary attendee, so create txn |
|
| 511 | - $txn_id = |
|
| 512 | - $this->get_migration_script()->get_mapping_new_pk( |
|
| 513 | - $this->_old_table, |
|
| 514 | - intval($old_attendee['id']), |
|
| 515 | - $this->_new_transaction_table |
|
| 516 | - ); |
|
| 517 | - } else { // non-primary attendee, so find its primary attendee's transaction |
|
| 518 | - $primary_attendee_old_id = |
|
| 519 | - $wpdb->get_var( |
|
| 520 | - $wpdb->prepare( |
|
| 521 | - "SELECT id FROM " . $this->_old_table . " WHERE is_primary=1 and registration_id=%s", |
|
| 522 | - $old_attendee['registration_id'] |
|
| 523 | - ) |
|
| 524 | - ); |
|
| 525 | - if (! $primary_attendee_old_id) { |
|
| 526 | - $primary_attendee = |
|
| 527 | - $this->_find_mer_primary_attendee_using_mer_tables($old_attendee['registration_id']); |
|
| 528 | - $primary_attendee_old_id = is_array($primary_attendee) ? $primary_attendee['id'] : null; |
|
| 529 | - } |
|
| 530 | - $txn_id = |
|
| 531 | - $this->get_migration_script()->get_mapping_new_pk( |
|
| 532 | - $this->_old_table, |
|
| 533 | - intval($primary_attendee_old_id), |
|
| 534 | - $this->_new_transaction_table |
|
| 535 | - ); |
|
| 536 | - if (! $txn_id) { |
|
| 537 | - $this->add_error( |
|
| 538 | - sprintf( |
|
| 539 | - esc_html__( |
|
| 540 | - "Could not find primary attendee's new transaction. Current attendee is: %s, we think the 3.1 primary attendee for it has id %d, but there's no 4.1 transaction for that primary attendee id.", |
|
| 541 | - "event_espresso" |
|
| 542 | - ), |
|
| 543 | - $this->_json_encode($old_attendee), |
|
| 544 | - $primary_attendee_old_id |
|
| 545 | - ) |
|
| 546 | - ); |
|
| 547 | - $txn_id = 0; |
|
| 548 | - } |
|
| 549 | - } |
|
| 550 | - // if there isn't yet a transaction row for this, create one |
|
| 551 | - // (so even if it was a non-primary attendee with no EE3 primary attendee, |
|
| 552 | - // it ought to have SOME transaction, so we'll make one) |
|
| 553 | - if (! $txn_id) { |
|
| 554 | - // maps 3.1 payment stati onto 4.1 transaction stati |
|
| 555 | - $txn_status_mapping = [ |
|
| 556 | - 'Completed' => 'TCM', |
|
| 557 | - 'Pending' => 'TIN', |
|
| 558 | - 'Payment Declined' => 'TIN', |
|
| 559 | - 'Incomplete' => 'TIN', |
|
| 560 | - 'Not Completed' => 'TIN', |
|
| 561 | - 'Cancelled' => 'TIN', |
|
| 562 | - 'Declined' => 'TIN', |
|
| 563 | - ]; |
|
| 564 | - $STS_ID = $txn_status_mapping[ $old_attendee['payment_status'] ] ?? 'TIN'; |
|
| 565 | - $cols_n_values = [ |
|
| 566 | - 'TXN_timestamp' => $this->get_migration_script()->convert_date_string_to_utc( |
|
| 567 | - $this, |
|
| 568 | - $old_attendee, |
|
| 569 | - $old_attendee['date'] |
|
| 570 | - ), |
|
| 571 | - 'TXN_total' => floatval($old_attendee['total_cost']), |
|
| 572 | - 'TXN_paid' => floatval($old_attendee['amount_pd']), |
|
| 573 | - 'STS_ID' => $STS_ID, |
|
| 574 | - 'TXN_hash_salt' => $old_attendee['hashSalt'], |
|
| 575 | - ]; |
|
| 576 | - $data_types = [ |
|
| 577 | - '%s',// TXN_timestamp |
|
| 578 | - '%f',// TXN_total |
|
| 579 | - '%f',// TXN_paid |
|
| 580 | - '%s',// STS_ID |
|
| 581 | - '%s',// TXN_hash_salt |
|
| 582 | - ]; |
|
| 583 | - $success = $wpdb->insert($this->_new_transaction_table, $cols_n_values, $data_types); |
|
| 584 | - if (! $success) { |
|
| 585 | - $this->add_error( |
|
| 586 | - $this->get_migration_script()->_create_error_message_for_db_insertion( |
|
| 587 | - $this->_old_table, |
|
| 588 | - $old_attendee, |
|
| 589 | - $this->_new_transaction_table, |
|
| 590 | - $cols_n_values, |
|
| 591 | - $data_types |
|
| 592 | - ) |
|
| 593 | - ); |
|
| 594 | - return 0; |
|
| 595 | - } |
|
| 596 | - $txn_id = $wpdb->insert_id; |
|
| 597 | - } |
|
| 598 | - |
|
| 599 | - return $txn_id; |
|
| 600 | - } |
|
| 601 | - |
|
| 602 | - |
|
| 603 | - /** |
|
| 604 | - * Detects if the MER tables exist |
|
| 605 | - * |
|
| 606 | - * @return boolean |
|
| 607 | - * @global wpdb $wpdb |
|
| 608 | - */ |
|
| 609 | - private function _mer_tables_exist(): ?bool |
|
| 610 | - { |
|
| 611 | - if ($this->_mer_tables_exist === null) { |
|
| 612 | - global $wpdb; |
|
| 613 | - |
|
| 614 | - if ($wpdb->get_var("SHOW TABLES LIKE '$this->_old_mer_table'") != $this->_old_mer_table) { |
|
| 615 | - $this->_mer_tables_exist = false; |
|
| 616 | - } else { |
|
| 617 | - $this->_mer_tables_exist = true; |
|
| 618 | - } |
|
| 619 | - } |
|
| 620 | - return $this->_mer_tables_exist; |
|
| 621 | - } |
|
| 622 | - |
|
| 623 | - |
|
| 624 | - /** |
|
| 625 | - * Gets the 4.1 registration's status given the 3.1 attendee row. We consider |
|
| 626 | - * whether the event required pre-approval or not,a dn the 4.1 payment status. |
|
| 627 | - * |
|
| 628 | - * @param array $old_attendee_row |
|
| 629 | - * @return string |
|
| 630 | - * @global wpdb $wpdb |
|
| 631 | - */ |
|
| 632 | - private function _get_reg_status_for_old_payment_status(array $old_attendee_row): string |
|
| 633 | - { |
|
| 634 | - // need event default reg status and if pre_approval was required |
|
| 635 | - global $wpdb; |
|
| 636 | - $event_required_pre_approval = |
|
| 637 | - $wpdb->get_var( |
|
| 638 | - $wpdb->prepare( |
|
| 639 | - "SELECT require_pre_approval FROM " . $wpdb->prefix . "events_detail WHERE id = %d", |
|
| 640 | - $old_attendee_row['event_id'] |
|
| 641 | - ) |
|
| 642 | - ); |
|
| 643 | - return $this->get_migration_script()->convert_3_1_payment_status_to_4_1_STS_ID( |
|
| 644 | - $old_attendee_row['payment_status'], |
|
| 645 | - intval($event_required_pre_approval) && intval($old_attendee_row['pre_approve']) |
|
| 646 | - ); |
|
| 647 | - } |
|
| 648 | - |
|
| 649 | - |
|
| 650 | - /** |
|
| 651 | - * Adds however many registrations are indicated by the old attendee's QUANTITY field, |
|
| 652 | - * and returns an array of their IDs |
|
| 653 | - * |
|
| 654 | - * @param array $old_attendee |
|
| 655 | - * @param int $new_attendee_id |
|
| 656 | - * @param int $new_txn_id |
|
| 657 | - * @return array of new registration ids |
|
| 658 | - * @throws EE_Error |
|
| 659 | - * @global wpdb $wpdb |
|
| 660 | - */ |
|
| 661 | - private function _insert_new_registrations(array $old_attendee, int $new_attendee_id, int $new_txn_id): array |
|
| 662 | - { |
|
| 663 | - global $wpdb; |
|
| 664 | - |
|
| 665 | - $STS_ID = $this->_get_reg_status_for_old_payment_status($old_attendee); |
|
| 666 | - $new_event_id = |
|
| 667 | - $this->get_migration_script()->get_mapping_new_pk( |
|
| 668 | - $wpdb->prefix . 'events_detail', |
|
| 669 | - $old_attendee['event_id'], |
|
| 670 | - $wpdb->posts |
|
| 671 | - ); |
|
| 672 | - if (! $new_event_id) { |
|
| 673 | - $this->add_error( |
|
| 674 | - sprintf( |
|
| 675 | - esc_html__( |
|
| 676 | - "Could not find NEW event CPT ID for old event '%d' on old attendee %s", |
|
| 677 | - "event_espresso" |
|
| 678 | - ), |
|
| 679 | - $old_attendee['event_id'], |
|
| 680 | - $this->_json_encode($old_attendee) |
|
| 681 | - ) |
|
| 682 | - ); |
|
| 683 | - } |
|
| 684 | - |
|
| 685 | - $ticket_id = $this->_try_to_find_new_ticket_id($old_attendee, $new_event_id); |
|
| 686 | - if (! $ticket_id) { |
|
| 687 | - $ticket_id = $this->_insert_new_ticket_because_none_found($old_attendee, $new_event_id); |
|
| 688 | - $this->add_error( |
|
| 689 | - sprintf( |
|
| 690 | - esc_html__( |
|
| 691 | - 'Could not find a ticket for old attendee with id %d for new event %d, so created a new ticket with id %d', |
|
| 692 | - 'event_espresso' |
|
| 693 | - ), |
|
| 694 | - $old_attendee['id'], |
|
| 695 | - $new_event_id, |
|
| 696 | - $ticket_id |
|
| 697 | - ) |
|
| 698 | - ); |
|
| 699 | - } |
|
| 700 | - $regs_on_this_row = intval($old_attendee['quantity']); |
|
| 701 | - $new_regs = []; |
|
| 702 | - // 4 cases we need to account for: |
|
| 703 | - // 1 old attendee_details row with a quantity of X (no mer) |
|
| 704 | - // Y old attendee_details rows with a quantity of 1 (no mer) joined by their common registration_id |
|
| 705 | - // Y old attendee_details rows with a quantity of x (because of mer) |
|
| 706 | - // Y old attendee_details rows with a quantity of 1 (because of mer) joined by wp_events_multi_event_registration_id_group |
|
| 707 | - for ($count = 1; $count <= $regs_on_this_row; $count++) { |
|
| 708 | - // sum regs on older rows |
|
| 709 | - $regs_on_this_event_and_txn = $this->_sum_old_attendees_on_old_txn($old_attendee, true); |
|
| 710 | - $cols_n_values = [ |
|
| 711 | - 'EVT_ID' => $new_event_id, |
|
| 712 | - 'ATT_ID' => $new_attendee_id, |
|
| 713 | - 'TXN_ID' => $new_txn_id, |
|
| 714 | - 'TKT_ID' => $ticket_id, |
|
| 715 | - 'STS_ID' => $STS_ID, |
|
| 716 | - 'REG_date' => $this->get_migration_script()->convert_date_string_to_utc( |
|
| 717 | - $this, |
|
| 718 | - $old_attendee, |
|
| 719 | - $old_attendee['date'] |
|
| 720 | - ), |
|
| 721 | - 'REG_final_price' => $old_attendee['final_price'], |
|
| 722 | - 'REG_session' => substr($old_attendee['attendee_session'], 0, 44), |
|
| 723 | - 'REG_code' => sanitize_key($old_attendee['registration_id']), |
|
| 724 | - 'REG_url_link' => sanitize_key($old_attendee['registration_id'] . '-' . $count), |
|
| 725 | - 'REG_count' => $regs_on_this_event_and_txn + $count, |
|
| 726 | - 'REG_group_size' => $this->_sum_old_attendees_on_old_txn($old_attendee), |
|
| 727 | - 'REG_att_is_going' => true, |
|
| 728 | - 'REG_deleted' => false, |
|
| 729 | - ]; |
|
| 730 | - $data_types = [ |
|
| 731 | - '%d',// EVT_ID |
|
| 732 | - '%d',// ATT_ID |
|
| 733 | - '%d',// TXN_ID |
|
| 734 | - '%d',// TKT_ID |
|
| 735 | - '%s',// STS_ID |
|
| 736 | - '%s',// REG_date |
|
| 737 | - '%f',// REG_final_price |
|
| 738 | - '%s',// REG_session |
|
| 739 | - '%s',// REG_code |
|
| 740 | - '%s',// REG_url_link |
|
| 741 | - '%d',// REG_count |
|
| 742 | - '%d',// REG_group_size |
|
| 743 | - '%d',// REG_att_is_going |
|
| 744 | - '%d',// REG_deleted |
|
| 745 | - ]; |
|
| 746 | - $success = $wpdb->insert($this->_new_reg_table, $cols_n_values, $data_types); |
|
| 747 | - if (! $success) { |
|
| 748 | - $this->add_error( |
|
| 749 | - $this->get_migration_script()->_create_error_message_for_db_insertion( |
|
| 750 | - $this->_old_table, |
|
| 751 | - $old_attendee, |
|
| 752 | - $this->_new_reg_table, |
|
| 753 | - $cols_n_values, |
|
| 754 | - $data_types |
|
| 755 | - ) |
|
| 756 | - ); |
|
| 757 | - return []; |
|
| 758 | - } |
|
| 759 | - $cols_n_values['REG_ID'] = $wpdb->insert_id; |
|
| 760 | - $new_regs[] = $wpdb->insert_id; |
|
| 761 | - } |
|
| 762 | - $this->_add_regs_to_ticket_and_datetimes($ticket_id, count($new_regs), $STS_ID); |
|
| 763 | - return $new_regs; |
|
| 764 | - } |
|
| 765 | - |
|
| 766 | - |
|
| 767 | - /** |
|
| 768 | - * Increments the sold values on the ticket and its related datetimes by the amount sold, |
|
| 769 | - * which should be done directly after adding the rows. Yes this means we're constantly incrementing |
|
| 770 | - * the sold amounts as we go, and is less efficient than a single big query, |
|
| 771 | - * but it's safer because we KNOW these regs have been added, rather than inferring |
|
| 772 | - * that they WILL be added (because the attendees stage runs nearly last during |
|
| 773 | - * the migration script) |
|
| 774 | - * |
|
| 775 | - * @param int $new_ticket_id |
|
| 776 | - * @param int $quantity_sold |
|
| 777 | - * @param string $STS_ID |
|
| 778 | - * @return boolean whether they were successfully updated or not |
|
| 779 | - */ |
|
| 780 | - protected function _add_regs_to_ticket_and_datetimes(int $new_ticket_id, int $quantity_sold, string $STS_ID): bool |
|
| 781 | - { |
|
| 782 | - if ($STS_ID != 'RAP') { |
|
| 783 | - return true; |
|
| 784 | - } |
|
| 785 | - global $wpdb; |
|
| 786 | - $success = |
|
| 787 | - $wpdb->query( |
|
| 788 | - $wpdb->prepare( |
|
| 789 | - "UPDATE $this->_new_ticket_table SET TKT_sold=TKT_sold+%d WHERE TKT_ID=%d", |
|
| 790 | - $quantity_sold, |
|
| 791 | - $new_ticket_id |
|
| 792 | - ) |
|
| 793 | - ); |
|
| 794 | - if ($success) { |
|
| 795 | - // get the ticket's datetimes, and increment them too |
|
| 796 | - $success_update_datetimes = $wpdb->query( |
|
| 797 | - $wpdb->prepare( |
|
| 798 | - "UPDATE $this->_new_ticket_table TKT |
|
| 270 | + $this->_old_mer_table = $wpdb->prefix . "events_multi_event_registration_id_group"; |
|
| 271 | + $this->_new_attendee_cpt_table = $wpdb->posts; |
|
| 272 | + $this->_new_attendee_meta_table = $wpdb->prefix . "esp_attendee_meta"; |
|
| 273 | + $this->_new_reg_table = $wpdb->prefix . "esp_registration"; |
|
| 274 | + $this->_new_transaction_table = $wpdb->prefix . "esp_transaction"; |
|
| 275 | + $this->_new_payment_table = $wpdb->prefix . "esp_payment"; |
|
| 276 | + $this->_new_ticket_table = $wpdb->prefix . "esp_ticket"; |
|
| 277 | + $this->_new_ticket_datetime_table = $wpdb->prefix . "esp_datetime_ticket"; |
|
| 278 | + $this->_new_datetime_table = $wpdb->prefix . "esp_datetime"; |
|
| 279 | + $this->_new_datetime_ticket_table = $wpdb->prefix . "esp_datetime_ticket"; |
|
| 280 | + $this->_new_price_table = $wpdb->prefix . "esp_price"; |
|
| 281 | + $this->_new_ticket_price_table = $wpdb->prefix . "esp_ticket_price"; |
|
| 282 | + parent::__construct(); |
|
| 283 | + } |
|
| 284 | + |
|
| 285 | + |
|
| 286 | + /** |
|
| 287 | + * @throws EE_Error |
|
| 288 | + */ |
|
| 289 | + protected function _migrate_old_row($old_row) |
|
| 290 | + { |
|
| 291 | + // first check if there's already a new attendee with similar characteristics |
|
| 292 | + $new_att_id = $this->_find_attendee_cpt_matching($old_row); |
|
| 293 | + if (! $new_att_id) { |
|
| 294 | + $new_att_id = $this->_insert_new_attendee_cpt($old_row); |
|
| 295 | + if (! $new_att_id) { |
|
| 296 | + // if we couldn't even make an attendee, abandon all hope |
|
| 297 | + return; |
|
| 298 | + } |
|
| 299 | + $new_att_meta_id = $this->_insert_attendee_meta_row($old_row, $new_att_id); |
|
| 300 | + if ($new_att_meta_id) { |
|
| 301 | + $this->get_migration_script()->set_mapping( |
|
| 302 | + $this->_old_table, |
|
| 303 | + $old_row['id'], |
|
| 304 | + $this->_new_attendee_meta_table, |
|
| 305 | + $new_att_meta_id |
|
| 306 | + ); |
|
| 307 | + } |
|
| 308 | + } |
|
| 309 | + $this->get_migration_script()->set_mapping( |
|
| 310 | + $this->_old_table, |
|
| 311 | + $old_row['id'], |
|
| 312 | + $this->_new_attendee_cpt_table, |
|
| 313 | + $new_att_id |
|
| 314 | + ); |
|
| 315 | + |
|
| 316 | + $txn_id = $this->_insert_new_transaction($old_row); |
|
| 317 | + if (! $txn_id) { |
|
| 318 | + // if we couldn't make the transaction, also abandon all hope |
|
| 319 | + return; |
|
| 320 | + } |
|
| 321 | + $this->get_migration_script()->set_mapping( |
|
| 322 | + $this->_old_table, |
|
| 323 | + $old_row['id'], |
|
| 324 | + $this->_new_transaction_table, |
|
| 325 | + $txn_id |
|
| 326 | + ); |
|
| 327 | + $pay_id = $this->_insert_new_payment($old_row, $txn_id); |
|
| 328 | + if ($pay_id) { |
|
| 329 | + $this->get_migration_script()->set_mapping( |
|
| 330 | + $this->_old_table, |
|
| 331 | + $old_row['id'], |
|
| 332 | + $this->_new_payment_table, |
|
| 333 | + $pay_id |
|
| 334 | + ); |
|
| 335 | + } |
|
| 336 | + |
|
| 337 | + |
|
| 338 | + // even if there was no payment, we can go ahead with adding the reg |
|
| 339 | + $new_regs = $this->_insert_new_registrations($old_row, $new_att_id, $txn_id); |
|
| 340 | + if ($new_regs) { |
|
| 341 | + $this->get_migration_script()->set_mapping( |
|
| 342 | + $this->_old_table, |
|
| 343 | + $old_row['id'], |
|
| 344 | + $this->_new_reg_table, |
|
| 345 | + $new_regs |
|
| 346 | + ); |
|
| 347 | + } |
|
| 348 | + } |
|
| 349 | + |
|
| 350 | + |
|
| 351 | + /** |
|
| 352 | + * Checks if there's already an attendee CPT in the db that has the same |
|
| 353 | + * first and last name, and email. If so, returns its ID as an int. |
|
| 354 | + * |
|
| 355 | + * @param array $old_attendee |
|
| 356 | + * @return int |
|
| 357 | + * @global wpdb $wpdb |
|
| 358 | + */ |
|
| 359 | + private function _find_attendee_cpt_matching(array $old_attendee): int |
|
| 360 | + { |
|
| 361 | + global $wpdb; |
|
| 362 | + $existing_attendee_id = |
|
| 363 | + $wpdb->get_var( |
|
| 364 | + $wpdb->prepare( |
|
| 365 | + "SELECT id FROM " . |
|
| 366 | + $this->_new_attendee_cpt_table . |
|
| 367 | + " AS cpt INNER JOIN " . |
|
| 368 | + $this->_new_attendee_meta_table . |
|
| 369 | + " AS meta ON cpt.ID = meta.ATT_ID WHERE meta.ATT_fname = %s AND meta.ATT_lname = %s AND meta.ATT_email = %s LIMIT 1", |
|
| 370 | + $old_attendee['fname'], |
|
| 371 | + $old_attendee['lname'], |
|
| 372 | + $old_attendee['email'] |
|
| 373 | + ) |
|
| 374 | + ); |
|
| 375 | + return intval($existing_attendee_id); |
|
| 376 | + } |
|
| 377 | + |
|
| 378 | + |
|
| 379 | + private function _insert_new_attendee_cpt($old_attendee): int |
|
| 380 | + { |
|
| 381 | + global $wpdb; |
|
| 382 | + $cols_n_values = [ |
|
| 383 | + 'post_title' => stripslashes($old_attendee['fname'] . " " . $old_attendee['lname']),// ATT_full_name |
|
| 384 | + 'post_content' => '',// ATT_bio |
|
| 385 | + 'post_name' => sanitize_title($old_attendee['fname'] . "-" . $old_attendee['lname']),// ATT_slug |
|
| 386 | + 'post_date' => $this->get_migration_script()->convert_date_string_to_utc( |
|
| 387 | + $this, |
|
| 388 | + $old_attendee, |
|
| 389 | + $old_attendee['date'] |
|
| 390 | + ),// ATT_created |
|
| 391 | + 'post_excerpt' => '',// ATT_short_bio |
|
| 392 | + 'post_modified' => $this->get_migration_script()->convert_date_string_to_utc( |
|
| 393 | + $this, |
|
| 394 | + $old_attendee, |
|
| 395 | + $old_attendee['date'] |
|
| 396 | + ),// ATT_modified |
|
| 397 | + 'post_author' => 0,// ATT_author |
|
| 398 | + 'post_parent' => 0,// ATT_parent |
|
| 399 | + 'post_type' => EspressoPostType::ATTENDEES, |
|
| 400 | + 'post_status' => 'publish',// status |
|
| 401 | + ]; |
|
| 402 | + $data_types = [ |
|
| 403 | + '%s',// ATT_full_name |
|
| 404 | + '%s',// ATT_bio |
|
| 405 | + '%s',// ATT_slug |
|
| 406 | + '%s',// ATT_created |
|
| 407 | + '%s',// ATT_short_bio |
|
| 408 | + '%s',// ATT_modified |
|
| 409 | + '%d',// ATT_author |
|
| 410 | + '%d',// ATT_parent |
|
| 411 | + '%s',// post_type |
|
| 412 | + '%s',// status |
|
| 413 | + ]; |
|
| 414 | + $success = $wpdb->insert($this->_new_attendee_cpt_table, $cols_n_values, $data_types); |
|
| 415 | + if (! $success) { |
|
| 416 | + $this->add_error( |
|
| 417 | + $this->get_migration_script()->_create_error_message_for_db_insertion( |
|
| 418 | + $this->_old_table, |
|
| 419 | + $old_attendee, |
|
| 420 | + $this->_new_attendee_cpt_table, |
|
| 421 | + $cols_n_values, |
|
| 422 | + $data_types |
|
| 423 | + ) |
|
| 424 | + ); |
|
| 425 | + return 0; |
|
| 426 | + } |
|
| 427 | + return $wpdb->insert_id; |
|
| 428 | + } |
|
| 429 | + |
|
| 430 | + |
|
| 431 | + private function _insert_attendee_meta_row($old_attendee, $new_attendee_cpt_id): int |
|
| 432 | + { |
|
| 433 | + global $wpdb; |
|
| 434 | + // get the state and country ids from the old row |
|
| 435 | + try { |
|
| 436 | + $new_country = |
|
| 437 | + $this->get_migration_script()->get_or_create_country(stripslashes($old_attendee['country_id'])); |
|
| 438 | + $new_country_iso = $new_country['CNT_ISO']; |
|
| 439 | + } catch (EE_Error $exception) { |
|
| 440 | + $new_country_iso = $this->get_migration_script()->get_default_country_iso(); |
|
| 441 | + } |
|
| 442 | + try { |
|
| 443 | + $new_state = |
|
| 444 | + $this->get_migration_script()->get_or_create_state( |
|
| 445 | + stripslashes($old_attendee['state']), |
|
| 446 | + $new_country_iso |
|
| 447 | + ); |
|
| 448 | + $new_state_id = $new_state['STA_ID']; |
|
| 449 | + } catch (EE_Error $exception) { |
|
| 450 | + $new_state_id = 0; |
|
| 451 | + } |
|
| 452 | + $cols_n_values = [ |
|
| 453 | + 'ATT_ID' => $new_attendee_cpt_id, |
|
| 454 | + 'ATT_fname' => stripslashes($old_attendee['fname']), |
|
| 455 | + 'ATT_lname' => stripslashes($old_attendee['lname']), |
|
| 456 | + 'ATT_address' => stripslashes($old_attendee['address']), |
|
| 457 | + 'ATT_address2' => stripslashes($old_attendee['address2']), |
|
| 458 | + 'ATT_city' => stripslashes($old_attendee['city']), |
|
| 459 | + 'STA_ID' => $new_state_id, |
|
| 460 | + 'CNT_ISO' => $new_country_iso, |
|
| 461 | + 'ATT_zip' => stripslashes($old_attendee['zip']), |
|
| 462 | + 'ATT_email' => stripslashes($old_attendee['email']), |
|
| 463 | + 'ATT_phone' => stripslashes($old_attendee['phone']), |
|
| 464 | + ]; |
|
| 465 | + $data_types = [ |
|
| 466 | + '%d',// ATT_ID |
|
| 467 | + '%s',// ATT_fname |
|
| 468 | + '%s',// ATT_lname |
|
| 469 | + '%s',// ATT_address |
|
| 470 | + '%s',// ATT_address2 |
|
| 471 | + '%s',// ATT_city |
|
| 472 | + '%d',// STA_ID |
|
| 473 | + '%s',// CNT_ISO |
|
| 474 | + '%s',// ATT_zip |
|
| 475 | + '%s',// ATT_email |
|
| 476 | + '%s',// ATT_phone |
|
| 477 | + ]; |
|
| 478 | + $success = $wpdb->insert($this->_new_attendee_meta_table, $cols_n_values, $data_types); |
|
| 479 | + if (! $success) { |
|
| 480 | + $this->add_error( |
|
| 481 | + $this->get_migration_script()->_create_error_message_for_db_insertion( |
|
| 482 | + $this->_old_table, |
|
| 483 | + $old_attendee, |
|
| 484 | + $this->_new_attendee_meta_table, |
|
| 485 | + $cols_n_values, |
|
| 486 | + $data_types |
|
| 487 | + ) |
|
| 488 | + ); |
|
| 489 | + return 0; |
|
| 490 | + } |
|
| 491 | + return $wpdb->insert_id; |
|
| 492 | + } |
|
| 493 | + |
|
| 494 | + |
|
| 495 | + /** |
|
| 496 | + * Note: we don't necessarily create a new transaction for each attendee row. |
|
| 497 | + * Only if the old attendee 'is_primary' is true; otherwise we find the old attendee row that |
|
| 498 | + * 'is_primary' and has the same 'txn_id', then we return ITS new transaction id |
|
| 499 | + * |
|
| 500 | + * @param array $old_attendee |
|
| 501 | + * @return int new transaction id |
|
| 502 | + * @throws EE_Error |
|
| 503 | + * @global wpdb $wpdb |
|
| 504 | + */ |
|
| 505 | + private function _insert_new_transaction(array $old_attendee): int |
|
| 506 | + { |
|
| 507 | + global $wpdb; |
|
| 508 | + |
|
| 509 | + // first: let's check for an existing transaction for this old attendee |
|
| 510 | + if (intval($old_attendee['is_primary'])) {// primary attendee, so create txn |
|
| 511 | + $txn_id = |
|
| 512 | + $this->get_migration_script()->get_mapping_new_pk( |
|
| 513 | + $this->_old_table, |
|
| 514 | + intval($old_attendee['id']), |
|
| 515 | + $this->_new_transaction_table |
|
| 516 | + ); |
|
| 517 | + } else { // non-primary attendee, so find its primary attendee's transaction |
|
| 518 | + $primary_attendee_old_id = |
|
| 519 | + $wpdb->get_var( |
|
| 520 | + $wpdb->prepare( |
|
| 521 | + "SELECT id FROM " . $this->_old_table . " WHERE is_primary=1 and registration_id=%s", |
|
| 522 | + $old_attendee['registration_id'] |
|
| 523 | + ) |
|
| 524 | + ); |
|
| 525 | + if (! $primary_attendee_old_id) { |
|
| 526 | + $primary_attendee = |
|
| 527 | + $this->_find_mer_primary_attendee_using_mer_tables($old_attendee['registration_id']); |
|
| 528 | + $primary_attendee_old_id = is_array($primary_attendee) ? $primary_attendee['id'] : null; |
|
| 529 | + } |
|
| 530 | + $txn_id = |
|
| 531 | + $this->get_migration_script()->get_mapping_new_pk( |
|
| 532 | + $this->_old_table, |
|
| 533 | + intval($primary_attendee_old_id), |
|
| 534 | + $this->_new_transaction_table |
|
| 535 | + ); |
|
| 536 | + if (! $txn_id) { |
|
| 537 | + $this->add_error( |
|
| 538 | + sprintf( |
|
| 539 | + esc_html__( |
|
| 540 | + "Could not find primary attendee's new transaction. Current attendee is: %s, we think the 3.1 primary attendee for it has id %d, but there's no 4.1 transaction for that primary attendee id.", |
|
| 541 | + "event_espresso" |
|
| 542 | + ), |
|
| 543 | + $this->_json_encode($old_attendee), |
|
| 544 | + $primary_attendee_old_id |
|
| 545 | + ) |
|
| 546 | + ); |
|
| 547 | + $txn_id = 0; |
|
| 548 | + } |
|
| 549 | + } |
|
| 550 | + // if there isn't yet a transaction row for this, create one |
|
| 551 | + // (so even if it was a non-primary attendee with no EE3 primary attendee, |
|
| 552 | + // it ought to have SOME transaction, so we'll make one) |
|
| 553 | + if (! $txn_id) { |
|
| 554 | + // maps 3.1 payment stati onto 4.1 transaction stati |
|
| 555 | + $txn_status_mapping = [ |
|
| 556 | + 'Completed' => 'TCM', |
|
| 557 | + 'Pending' => 'TIN', |
|
| 558 | + 'Payment Declined' => 'TIN', |
|
| 559 | + 'Incomplete' => 'TIN', |
|
| 560 | + 'Not Completed' => 'TIN', |
|
| 561 | + 'Cancelled' => 'TIN', |
|
| 562 | + 'Declined' => 'TIN', |
|
| 563 | + ]; |
|
| 564 | + $STS_ID = $txn_status_mapping[ $old_attendee['payment_status'] ] ?? 'TIN'; |
|
| 565 | + $cols_n_values = [ |
|
| 566 | + 'TXN_timestamp' => $this->get_migration_script()->convert_date_string_to_utc( |
|
| 567 | + $this, |
|
| 568 | + $old_attendee, |
|
| 569 | + $old_attendee['date'] |
|
| 570 | + ), |
|
| 571 | + 'TXN_total' => floatval($old_attendee['total_cost']), |
|
| 572 | + 'TXN_paid' => floatval($old_attendee['amount_pd']), |
|
| 573 | + 'STS_ID' => $STS_ID, |
|
| 574 | + 'TXN_hash_salt' => $old_attendee['hashSalt'], |
|
| 575 | + ]; |
|
| 576 | + $data_types = [ |
|
| 577 | + '%s',// TXN_timestamp |
|
| 578 | + '%f',// TXN_total |
|
| 579 | + '%f',// TXN_paid |
|
| 580 | + '%s',// STS_ID |
|
| 581 | + '%s',// TXN_hash_salt |
|
| 582 | + ]; |
|
| 583 | + $success = $wpdb->insert($this->_new_transaction_table, $cols_n_values, $data_types); |
|
| 584 | + if (! $success) { |
|
| 585 | + $this->add_error( |
|
| 586 | + $this->get_migration_script()->_create_error_message_for_db_insertion( |
|
| 587 | + $this->_old_table, |
|
| 588 | + $old_attendee, |
|
| 589 | + $this->_new_transaction_table, |
|
| 590 | + $cols_n_values, |
|
| 591 | + $data_types |
|
| 592 | + ) |
|
| 593 | + ); |
|
| 594 | + return 0; |
|
| 595 | + } |
|
| 596 | + $txn_id = $wpdb->insert_id; |
|
| 597 | + } |
|
| 598 | + |
|
| 599 | + return $txn_id; |
|
| 600 | + } |
|
| 601 | + |
|
| 602 | + |
|
| 603 | + /** |
|
| 604 | + * Detects if the MER tables exist |
|
| 605 | + * |
|
| 606 | + * @return boolean |
|
| 607 | + * @global wpdb $wpdb |
|
| 608 | + */ |
|
| 609 | + private function _mer_tables_exist(): ?bool |
|
| 610 | + { |
|
| 611 | + if ($this->_mer_tables_exist === null) { |
|
| 612 | + global $wpdb; |
|
| 613 | + |
|
| 614 | + if ($wpdb->get_var("SHOW TABLES LIKE '$this->_old_mer_table'") != $this->_old_mer_table) { |
|
| 615 | + $this->_mer_tables_exist = false; |
|
| 616 | + } else { |
|
| 617 | + $this->_mer_tables_exist = true; |
|
| 618 | + } |
|
| 619 | + } |
|
| 620 | + return $this->_mer_tables_exist; |
|
| 621 | + } |
|
| 622 | + |
|
| 623 | + |
|
| 624 | + /** |
|
| 625 | + * Gets the 4.1 registration's status given the 3.1 attendee row. We consider |
|
| 626 | + * whether the event required pre-approval or not,a dn the 4.1 payment status. |
|
| 627 | + * |
|
| 628 | + * @param array $old_attendee_row |
|
| 629 | + * @return string |
|
| 630 | + * @global wpdb $wpdb |
|
| 631 | + */ |
|
| 632 | + private function _get_reg_status_for_old_payment_status(array $old_attendee_row): string |
|
| 633 | + { |
|
| 634 | + // need event default reg status and if pre_approval was required |
|
| 635 | + global $wpdb; |
|
| 636 | + $event_required_pre_approval = |
|
| 637 | + $wpdb->get_var( |
|
| 638 | + $wpdb->prepare( |
|
| 639 | + "SELECT require_pre_approval FROM " . $wpdb->prefix . "events_detail WHERE id = %d", |
|
| 640 | + $old_attendee_row['event_id'] |
|
| 641 | + ) |
|
| 642 | + ); |
|
| 643 | + return $this->get_migration_script()->convert_3_1_payment_status_to_4_1_STS_ID( |
|
| 644 | + $old_attendee_row['payment_status'], |
|
| 645 | + intval($event_required_pre_approval) && intval($old_attendee_row['pre_approve']) |
|
| 646 | + ); |
|
| 647 | + } |
|
| 648 | + |
|
| 649 | + |
|
| 650 | + /** |
|
| 651 | + * Adds however many registrations are indicated by the old attendee's QUANTITY field, |
|
| 652 | + * and returns an array of their IDs |
|
| 653 | + * |
|
| 654 | + * @param array $old_attendee |
|
| 655 | + * @param int $new_attendee_id |
|
| 656 | + * @param int $new_txn_id |
|
| 657 | + * @return array of new registration ids |
|
| 658 | + * @throws EE_Error |
|
| 659 | + * @global wpdb $wpdb |
|
| 660 | + */ |
|
| 661 | + private function _insert_new_registrations(array $old_attendee, int $new_attendee_id, int $new_txn_id): array |
|
| 662 | + { |
|
| 663 | + global $wpdb; |
|
| 664 | + |
|
| 665 | + $STS_ID = $this->_get_reg_status_for_old_payment_status($old_attendee); |
|
| 666 | + $new_event_id = |
|
| 667 | + $this->get_migration_script()->get_mapping_new_pk( |
|
| 668 | + $wpdb->prefix . 'events_detail', |
|
| 669 | + $old_attendee['event_id'], |
|
| 670 | + $wpdb->posts |
|
| 671 | + ); |
|
| 672 | + if (! $new_event_id) { |
|
| 673 | + $this->add_error( |
|
| 674 | + sprintf( |
|
| 675 | + esc_html__( |
|
| 676 | + "Could not find NEW event CPT ID for old event '%d' on old attendee %s", |
|
| 677 | + "event_espresso" |
|
| 678 | + ), |
|
| 679 | + $old_attendee['event_id'], |
|
| 680 | + $this->_json_encode($old_attendee) |
|
| 681 | + ) |
|
| 682 | + ); |
|
| 683 | + } |
|
| 684 | + |
|
| 685 | + $ticket_id = $this->_try_to_find_new_ticket_id($old_attendee, $new_event_id); |
|
| 686 | + if (! $ticket_id) { |
|
| 687 | + $ticket_id = $this->_insert_new_ticket_because_none_found($old_attendee, $new_event_id); |
|
| 688 | + $this->add_error( |
|
| 689 | + sprintf( |
|
| 690 | + esc_html__( |
|
| 691 | + 'Could not find a ticket for old attendee with id %d for new event %d, so created a new ticket with id %d', |
|
| 692 | + 'event_espresso' |
|
| 693 | + ), |
|
| 694 | + $old_attendee['id'], |
|
| 695 | + $new_event_id, |
|
| 696 | + $ticket_id |
|
| 697 | + ) |
|
| 698 | + ); |
|
| 699 | + } |
|
| 700 | + $regs_on_this_row = intval($old_attendee['quantity']); |
|
| 701 | + $new_regs = []; |
|
| 702 | + // 4 cases we need to account for: |
|
| 703 | + // 1 old attendee_details row with a quantity of X (no mer) |
|
| 704 | + // Y old attendee_details rows with a quantity of 1 (no mer) joined by their common registration_id |
|
| 705 | + // Y old attendee_details rows with a quantity of x (because of mer) |
|
| 706 | + // Y old attendee_details rows with a quantity of 1 (because of mer) joined by wp_events_multi_event_registration_id_group |
|
| 707 | + for ($count = 1; $count <= $regs_on_this_row; $count++) { |
|
| 708 | + // sum regs on older rows |
|
| 709 | + $regs_on_this_event_and_txn = $this->_sum_old_attendees_on_old_txn($old_attendee, true); |
|
| 710 | + $cols_n_values = [ |
|
| 711 | + 'EVT_ID' => $new_event_id, |
|
| 712 | + 'ATT_ID' => $new_attendee_id, |
|
| 713 | + 'TXN_ID' => $new_txn_id, |
|
| 714 | + 'TKT_ID' => $ticket_id, |
|
| 715 | + 'STS_ID' => $STS_ID, |
|
| 716 | + 'REG_date' => $this->get_migration_script()->convert_date_string_to_utc( |
|
| 717 | + $this, |
|
| 718 | + $old_attendee, |
|
| 719 | + $old_attendee['date'] |
|
| 720 | + ), |
|
| 721 | + 'REG_final_price' => $old_attendee['final_price'], |
|
| 722 | + 'REG_session' => substr($old_attendee['attendee_session'], 0, 44), |
|
| 723 | + 'REG_code' => sanitize_key($old_attendee['registration_id']), |
|
| 724 | + 'REG_url_link' => sanitize_key($old_attendee['registration_id'] . '-' . $count), |
|
| 725 | + 'REG_count' => $regs_on_this_event_and_txn + $count, |
|
| 726 | + 'REG_group_size' => $this->_sum_old_attendees_on_old_txn($old_attendee), |
|
| 727 | + 'REG_att_is_going' => true, |
|
| 728 | + 'REG_deleted' => false, |
|
| 729 | + ]; |
|
| 730 | + $data_types = [ |
|
| 731 | + '%d',// EVT_ID |
|
| 732 | + '%d',// ATT_ID |
|
| 733 | + '%d',// TXN_ID |
|
| 734 | + '%d',// TKT_ID |
|
| 735 | + '%s',// STS_ID |
|
| 736 | + '%s',// REG_date |
|
| 737 | + '%f',// REG_final_price |
|
| 738 | + '%s',// REG_session |
|
| 739 | + '%s',// REG_code |
|
| 740 | + '%s',// REG_url_link |
|
| 741 | + '%d',// REG_count |
|
| 742 | + '%d',// REG_group_size |
|
| 743 | + '%d',// REG_att_is_going |
|
| 744 | + '%d',// REG_deleted |
|
| 745 | + ]; |
|
| 746 | + $success = $wpdb->insert($this->_new_reg_table, $cols_n_values, $data_types); |
|
| 747 | + if (! $success) { |
|
| 748 | + $this->add_error( |
|
| 749 | + $this->get_migration_script()->_create_error_message_for_db_insertion( |
|
| 750 | + $this->_old_table, |
|
| 751 | + $old_attendee, |
|
| 752 | + $this->_new_reg_table, |
|
| 753 | + $cols_n_values, |
|
| 754 | + $data_types |
|
| 755 | + ) |
|
| 756 | + ); |
|
| 757 | + return []; |
|
| 758 | + } |
|
| 759 | + $cols_n_values['REG_ID'] = $wpdb->insert_id; |
|
| 760 | + $new_regs[] = $wpdb->insert_id; |
|
| 761 | + } |
|
| 762 | + $this->_add_regs_to_ticket_and_datetimes($ticket_id, count($new_regs), $STS_ID); |
|
| 763 | + return $new_regs; |
|
| 764 | + } |
|
| 765 | + |
|
| 766 | + |
|
| 767 | + /** |
|
| 768 | + * Increments the sold values on the ticket and its related datetimes by the amount sold, |
|
| 769 | + * which should be done directly after adding the rows. Yes this means we're constantly incrementing |
|
| 770 | + * the sold amounts as we go, and is less efficient than a single big query, |
|
| 771 | + * but it's safer because we KNOW these regs have been added, rather than inferring |
|
| 772 | + * that they WILL be added (because the attendees stage runs nearly last during |
|
| 773 | + * the migration script) |
|
| 774 | + * |
|
| 775 | + * @param int $new_ticket_id |
|
| 776 | + * @param int $quantity_sold |
|
| 777 | + * @param string $STS_ID |
|
| 778 | + * @return boolean whether they were successfully updated or not |
|
| 779 | + */ |
|
| 780 | + protected function _add_regs_to_ticket_and_datetimes(int $new_ticket_id, int $quantity_sold, string $STS_ID): bool |
|
| 781 | + { |
|
| 782 | + if ($STS_ID != 'RAP') { |
|
| 783 | + return true; |
|
| 784 | + } |
|
| 785 | + global $wpdb; |
|
| 786 | + $success = |
|
| 787 | + $wpdb->query( |
|
| 788 | + $wpdb->prepare( |
|
| 789 | + "UPDATE $this->_new_ticket_table SET TKT_sold=TKT_sold+%d WHERE TKT_ID=%d", |
|
| 790 | + $quantity_sold, |
|
| 791 | + $new_ticket_id |
|
| 792 | + ) |
|
| 793 | + ); |
|
| 794 | + if ($success) { |
|
| 795 | + // get the ticket's datetimes, and increment them too |
|
| 796 | + $success_update_datetimes = $wpdb->query( |
|
| 797 | + $wpdb->prepare( |
|
| 798 | + "UPDATE $this->_new_ticket_table TKT |
|
| 799 | 799 | INNER JOIN $this->_new_ticket_datetime_table as DTK ON TKT.TKT_ID = DTK.TKT_ID |
| 800 | 800 | INNER JOIN $this->_new_datetime_table as DTT ON DTK.DTT_ID = DTT.DTT_ID |
| 801 | 801 | SET DTT.DTT_sold = DTT.DTT_sold + %d WHERE TKT.TKT_ID = %d", |
| 802 | - $quantity_sold, |
|
| 803 | - $new_ticket_id |
|
| 804 | - ) |
|
| 805 | - ); |
|
| 806 | - if (! $success_update_datetimes) { |
|
| 807 | - $this->add_error( |
|
| 808 | - sprintf( |
|
| 809 | - esc_html__( |
|
| 810 | - "Could not update datetimes related to ticket with ID %d's TKT_sold by %d because %s", |
|
| 811 | - "event_espresso" |
|
| 812 | - ), |
|
| 813 | - $new_ticket_id, |
|
| 814 | - $quantity_sold, |
|
| 815 | - $wpdb->last_error |
|
| 816 | - ) |
|
| 817 | - ); |
|
| 818 | - } |
|
| 819 | - } else { |
|
| 820 | - $this->add_error( |
|
| 821 | - sprintf( |
|
| 822 | - esc_html__("Could not update ticket with ID %d's TKT_sold by %d because %s", "event_espresso"), |
|
| 823 | - $new_ticket_id, |
|
| 824 | - $quantity_sold, |
|
| 825 | - $wpdb->last_error |
|
| 826 | - ) |
|
| 827 | - ); |
|
| 828 | - } |
|
| 829 | - return true; |
|
| 830 | - } |
|
| 831 | - |
|
| 832 | - |
|
| 833 | - /** |
|
| 834 | - * Makes a guess at which ticket is the one the attendee purchased. |
|
| 835 | - * Obviously, the old attendee's event_id narrows it down quite a bit; |
|
| 836 | - * then the old attendee's orig_price and event_time, and price_option can uniquely identify the ticket |
|
| 837 | - * however, if we don't find an exact match, see if any of those conditions match; |
|
| 838 | - * and lastly if none of that works, just use the first ticket for the event we find |
|
| 839 | - * |
|
| 840 | - * @param array $old_attendee |
|
| 841 | - * @param $new_event_id |
|
| 842 | - * @return string|null |
|
| 843 | - */ |
|
| 844 | - private function _try_to_find_new_ticket_id(array $old_attendee, $new_event_id): ?string |
|
| 845 | - { |
|
| 846 | - global $wpdb; |
|
| 847 | - $tickets_table = $this->_new_ticket_table; |
|
| 848 | - $datetime_tickets_table = $this->_new_ticket_datetime_table; |
|
| 849 | - $datetime_table = $this->_new_datetime_table; |
|
| 850 | - |
|
| 851 | - $old_att_price_option = $old_attendee['price_option']; |
|
| 852 | - $old_att_price = floatval($old_attendee['orig_price']); |
|
| 853 | - |
|
| 854 | - $old_att_start_date = $old_attendee['start_date']; |
|
| 855 | - $old_att_start_time = $this->get_migration_script()->convertTimeFromAMPM($old_attendee['event_time']); |
|
| 856 | - $old_att_datetime = |
|
| 857 | - $this->get_migration_script()->convert_date_string_to_utc( |
|
| 858 | - $this, |
|
| 859 | - $old_attendee, |
|
| 860 | - "$old_att_start_date $old_att_start_time:00" |
|
| 861 | - ); |
|
| 862 | - // add all conditions to an array from which we can SHIFT conditions off in order to widen our search |
|
| 863 | - // the most important condition should be last, as it will be array_shift'ed off last |
|
| 864 | - $conditions = [ |
|
| 865 | - $wpdb->prepare("$datetime_table.DTT_EVT_start = %s", $old_att_datetime),// times match? |
|
| 866 | - $wpdb->prepare("$tickets_table.TKT_price = %f", $old_att_price),// prices match? |
|
| 867 | - $wpdb->prepare("$tickets_table.TKT_name = %s", $old_att_price_option),// names match? |
|
| 868 | - $wpdb->prepare("$datetime_table.EVT_ID = %d", $new_event_id),// events match? |
|
| 869 | - ]; |
|
| 870 | - $select_and_join_part = "SELECT $tickets_table.TKT_ID FROM $tickets_table INNER JOIN |
|
| 802 | + $quantity_sold, |
|
| 803 | + $new_ticket_id |
|
| 804 | + ) |
|
| 805 | + ); |
|
| 806 | + if (! $success_update_datetimes) { |
|
| 807 | + $this->add_error( |
|
| 808 | + sprintf( |
|
| 809 | + esc_html__( |
|
| 810 | + "Could not update datetimes related to ticket with ID %d's TKT_sold by %d because %s", |
|
| 811 | + "event_espresso" |
|
| 812 | + ), |
|
| 813 | + $new_ticket_id, |
|
| 814 | + $quantity_sold, |
|
| 815 | + $wpdb->last_error |
|
| 816 | + ) |
|
| 817 | + ); |
|
| 818 | + } |
|
| 819 | + } else { |
|
| 820 | + $this->add_error( |
|
| 821 | + sprintf( |
|
| 822 | + esc_html__("Could not update ticket with ID %d's TKT_sold by %d because %s", "event_espresso"), |
|
| 823 | + $new_ticket_id, |
|
| 824 | + $quantity_sold, |
|
| 825 | + $wpdb->last_error |
|
| 826 | + ) |
|
| 827 | + ); |
|
| 828 | + } |
|
| 829 | + return true; |
|
| 830 | + } |
|
| 831 | + |
|
| 832 | + |
|
| 833 | + /** |
|
| 834 | + * Makes a guess at which ticket is the one the attendee purchased. |
|
| 835 | + * Obviously, the old attendee's event_id narrows it down quite a bit; |
|
| 836 | + * then the old attendee's orig_price and event_time, and price_option can uniquely identify the ticket |
|
| 837 | + * however, if we don't find an exact match, see if any of those conditions match; |
|
| 838 | + * and lastly if none of that works, just use the first ticket for the event we find |
|
| 839 | + * |
|
| 840 | + * @param array $old_attendee |
|
| 841 | + * @param $new_event_id |
|
| 842 | + * @return string|null |
|
| 843 | + */ |
|
| 844 | + private function _try_to_find_new_ticket_id(array $old_attendee, $new_event_id): ?string |
|
| 845 | + { |
|
| 846 | + global $wpdb; |
|
| 847 | + $tickets_table = $this->_new_ticket_table; |
|
| 848 | + $datetime_tickets_table = $this->_new_ticket_datetime_table; |
|
| 849 | + $datetime_table = $this->_new_datetime_table; |
|
| 850 | + |
|
| 851 | + $old_att_price_option = $old_attendee['price_option']; |
|
| 852 | + $old_att_price = floatval($old_attendee['orig_price']); |
|
| 853 | + |
|
| 854 | + $old_att_start_date = $old_attendee['start_date']; |
|
| 855 | + $old_att_start_time = $this->get_migration_script()->convertTimeFromAMPM($old_attendee['event_time']); |
|
| 856 | + $old_att_datetime = |
|
| 857 | + $this->get_migration_script()->convert_date_string_to_utc( |
|
| 858 | + $this, |
|
| 859 | + $old_attendee, |
|
| 860 | + "$old_att_start_date $old_att_start_time:00" |
|
| 861 | + ); |
|
| 862 | + // add all conditions to an array from which we can SHIFT conditions off in order to widen our search |
|
| 863 | + // the most important condition should be last, as it will be array_shift'ed off last |
|
| 864 | + $conditions = [ |
|
| 865 | + $wpdb->prepare("$datetime_table.DTT_EVT_start = %s", $old_att_datetime),// times match? |
|
| 866 | + $wpdb->prepare("$tickets_table.TKT_price = %f", $old_att_price),// prices match? |
|
| 867 | + $wpdb->prepare("$tickets_table.TKT_name = %s", $old_att_price_option),// names match? |
|
| 868 | + $wpdb->prepare("$datetime_table.EVT_ID = %d", $new_event_id),// events match? |
|
| 869 | + ]; |
|
| 870 | + $select_and_join_part = "SELECT $tickets_table.TKT_ID FROM $tickets_table INNER JOIN |
|
| 871 | 871 | $datetime_tickets_table ON $tickets_table.TKT_ID = $datetime_tickets_table.TKT_ID INNER JOIN |
| 872 | 872 | $datetime_table ON $datetime_tickets_table.DTT_ID = $datetime_table.DTT_ID"; |
| 873 | - // start running queries, widening search each time by removing a condition |
|
| 874 | - do { |
|
| 875 | - $full_query = $select_and_join_part . " WHERE " . implode(" AND ", $conditions) . " LIMIT 1"; |
|
| 876 | - $ticket_id_found = $wpdb->get_var($full_query); |
|
| 877 | - array_shift($conditions); |
|
| 878 | - } while (! $ticket_id_found && $conditions); |
|
| 879 | - return $ticket_id_found; |
|
| 880 | - } |
|
| 881 | - |
|
| 882 | - |
|
| 883 | - /** |
|
| 884 | - * If we couldn't find a 4.1 ticket for a 3.1 attendee row, this function creates one; |
|
| 885 | - * and it also tries to find a datetime that works, and inserts a price, and associates |
|
| 886 | - * the new ticket to that datetime and price. |
|
| 887 | - * |
|
| 888 | - * @return int ticket id |
|
| 889 | - */ |
|
| 890 | - private function _insert_new_ticket_because_none_found($old_attendee, $new_event_id): int |
|
| 891 | - { |
|
| 892 | - global $wpdb; |
|
| 893 | - $old_att_price_option = $old_attendee['price_option']; |
|
| 894 | - $old_att_price = floatval($old_attendee['orig_price']); |
|
| 895 | - |
|
| 896 | - $old_att_start_date = $old_attendee['start_date']; |
|
| 897 | - $old_att_start_time = $this->get_migration_script()->convertTimeFromAMPM( |
|
| 898 | - $old_attendee['event_time'] |
|
| 899 | - ); |
|
| 900 | - $old_att_start_datetime = |
|
| 901 | - $this->get_migration_script()->convert_date_string_to_utc( |
|
| 902 | - $this, |
|
| 903 | - $old_attendee, |
|
| 904 | - "$old_att_start_date $old_att_start_time:00" |
|
| 905 | - ); |
|
| 906 | - $old_att_end_datetime = null; |
|
| 907 | - |
|
| 908 | - |
|
| 909 | - // insert new datetime unless we find one |
|
| 910 | - $datetime_id = |
|
| 911 | - $wpdb->get_var( |
|
| 912 | - $wpdb->prepare( |
|
| 913 | - "SELECT DTT_ID FROM " . |
|
| 914 | - $this->_new_datetime_table . |
|
| 915 | - " WHERE DTT_EVT_start=%s AND EVT_ID=%d LIMIT 1", |
|
| 916 | - $old_att_start_datetime, |
|
| 917 | - $new_event_id |
|
| 918 | - ), |
|
| 919 | - ARRAY_A |
|
| 920 | - ); |
|
| 921 | - if (! $datetime_id) { |
|
| 922 | - $old_att_end_date = $old_attendee['start_date']; |
|
| 923 | - $old_att_end_time = $this->get_migration_script()->convertTimeFromAMPM( |
|
| 924 | - $old_attendee['event_time'] |
|
| 925 | - ); |
|
| 926 | - $old_att_end_datetime = $this->get_migration_script()->convert_date_string_to_utc( |
|
| 927 | - $this, |
|
| 928 | - $old_attendee, |
|
| 929 | - "$old_att_end_date $old_att_end_time:00" |
|
| 930 | - ); |
|
| 931 | - $wpdb->insert( |
|
| 932 | - $this->_new_datetime_table, |
|
| 933 | - [ |
|
| 934 | - 'EVT_ID' => $new_event_id, |
|
| 935 | - 'DTT_EVT_start' => $old_att_start_datetime, |
|
| 936 | - 'DTT_EVT_end' => $old_att_end_datetime, |
|
| 937 | - 'DTT_deleted' => true, |
|
| 938 | - ], |
|
| 939 | - [ |
|
| 940 | - '%d',// EVT_ID |
|
| 941 | - '%s',// DTT_EVT_start |
|
| 942 | - '%s',// DTT_EVT_end |
|
| 943 | - '%d',// DTT_deleted |
|
| 944 | - ] |
|
| 945 | - ); |
|
| 946 | - $datetime_id = $wpdb->insert_id; |
|
| 947 | - } |
|
| 948 | - |
|
| 949 | - // insert new ticket |
|
| 950 | - $wpdb->insert( |
|
| 951 | - $wpdb->prefix . 'esp_ticket', |
|
| 952 | - [ |
|
| 953 | - 'TKT_name' => $old_att_price_option, |
|
| 954 | - 'TKT_qty' => -1, |
|
| 955 | - 'TKT_price' => $old_att_price, |
|
| 956 | - 'TKT_start_date' => $old_att_start_datetime, |
|
| 957 | - // we really have no clue what the time should be, but at least it was available when they attended |
|
| 958 | - 'TKT_end_date' => $old_att_end_datetime, |
|
| 959 | - |
|
| 960 | - ], |
|
| 961 | - [ |
|
| 962 | - '%s',// name |
|
| 963 | - '%d',// qty |
|
| 964 | - '%d',// price |
|
| 965 | - '%s',// start_date |
|
| 966 | - '%s',// end_date |
|
| 967 | - ] |
|
| 968 | - ); |
|
| 969 | - $ticket_id = $wpdb->insert_id; |
|
| 970 | - // associate the ticket with the datetime we found earlier |
|
| 971 | - $wpdb->insert( |
|
| 972 | - $this->_new_datetime_ticket_table, |
|
| 973 | - [ |
|
| 974 | - 'DTT_ID' => $datetime_id, |
|
| 975 | - 'TKT_ID' => $ticket_id, |
|
| 976 | - ], |
|
| 977 | - [ |
|
| 978 | - '%d',// DTT_ID |
|
| 979 | - '%d',// TKT_ID |
|
| 980 | - ] |
|
| 981 | - ); |
|
| 982 | - // insert new price |
|
| 983 | - $wpdb->insert( |
|
| 984 | - $this->_new_price_table, |
|
| 985 | - [ |
|
| 986 | - 'PRC_amount' => $old_att_price, |
|
| 987 | - 'PRT_ID' => EE_DMS_4_1_0_prices::price_type_base, |
|
| 988 | - 'PRC_name' => $old_att_price_option, |
|
| 989 | - 'PRC_deleted' => true, |
|
| 990 | - ], |
|
| 991 | - [ |
|
| 992 | - '%d',// PRC_amount |
|
| 993 | - '%d',// PRT_ID |
|
| 994 | - '%s',// PRC_name |
|
| 995 | - '%d',// PRC_deleted |
|
| 996 | - ] |
|
| 997 | - ); |
|
| 998 | - $price_id = $wpdb->insert_id; |
|
| 999 | - // associate the price to the ticket |
|
| 1000 | - $wpdb->insert( |
|
| 1001 | - $this->_new_ticket_price_table, |
|
| 1002 | - [ |
|
| 1003 | - 'TKT_ID' => $ticket_id, |
|
| 1004 | - 'PRC_ID' => $price_id, |
|
| 1005 | - ], |
|
| 1006 | - [ |
|
| 1007 | - '%d',// TKT_ID |
|
| 1008 | - '%d',// PRC_ID |
|
| 1009 | - ] |
|
| 1010 | - ); |
|
| 1011 | - return $ticket_id; |
|
| 1012 | - } |
|
| 1013 | - |
|
| 1014 | - |
|
| 1015 | - /** |
|
| 1016 | - * Counts all the registrations on this transaction. If $count_only_older is TRUE then returns the number added SO |
|
| 1017 | - * FAR (ie, only considers attendee rows with an ID less than this one's), but if $count_only_older is FALSe |
|
| 1018 | - * returns ALL |
|
| 1019 | - * |
|
| 1020 | - * @param array $old_attendee_row |
|
| 1021 | - * @param boolean $count_only_older true if you want the running count (ie, the total up to this row), and false if |
|
| 1022 | - * you want ALL |
|
| 1023 | - * @return int |
|
| 1024 | - * @global wpdb $wpdb |
|
| 1025 | - */ |
|
| 1026 | - private function _sum_old_attendees_on_old_txn(array $old_attendee_row, bool $count_only_older = false): int |
|
| 1027 | - { |
|
| 1028 | - global $wpdb; |
|
| 1029 | - $count_only_older_sql = $count_only_older ? $wpdb->prepare(" AND id<%d", $old_attendee_row['id']) : ''; |
|
| 1030 | - $count = |
|
| 1031 | - intval( |
|
| 1032 | - $wpdb->get_var( |
|
| 1033 | - $wpdb->prepare( |
|
| 1034 | - "SELECT SUM(quantity) FROM " . |
|
| 1035 | - $this->_old_table . |
|
| 1036 | - " WHERE registration_id=%s $count_only_older_sql", |
|
| 1037 | - $old_attendee_row['registration_id'] |
|
| 1038 | - ) |
|
| 1039 | - ) |
|
| 1040 | - ); |
|
| 1041 | - |
|
| 1042 | - if ($this->_mer_tables_exist()) { |
|
| 1043 | - // if MER exists, then it's a little tricky. |
|
| 1044 | - // when users registered by adding items to the cart, and it was a |
|
| 1045 | - // group registration requiring additional attendee INFO, then the attendee rows |
|
| 1046 | - // DO NOT have the same registration_id (although they probably should have) |
|
| 1047 | - // they are related just like MER attendee rows are related, through the MER group table |
|
| 1048 | - // BUT we want to count all the MER attendee rows for the same registration |
|
| 1049 | - $primary_attendee = |
|
| 1050 | - $this->_find_mer_primary_attendee_using_mer_tables($old_attendee_row['registration_id']); |
|
| 1051 | - |
|
| 1052 | - // No primary attendee to work with? Return the count. |
|
| 1053 | - if (is_null($primary_attendee)) { |
|
| 1054 | - return (int) $count; |
|
| 1055 | - } |
|
| 1056 | - |
|
| 1057 | - $count_using_mer_table = |
|
| 1058 | - $wpdb->get_var( |
|
| 1059 | - $wpdb->prepare( |
|
| 1060 | - "SELECT SUM(quantity) FROM $this->_old_table att INNER JOIN $this->_old_mer_table mer ON att.registration_id = mer.registration_id WHERE att.event_id=%d AND mer.primary_registration_id = %s $count_only_older_sql", |
|
| 1061 | - $old_attendee_row['event_id'], |
|
| 1062 | - $primary_attendee['registration_id'] |
|
| 1063 | - ) |
|
| 1064 | - ); |
|
| 1065 | - $count = max($count_using_mer_table, $count); |
|
| 1066 | - } |
|
| 1067 | - return (int) $count; |
|
| 1068 | - } |
|
| 1069 | - |
|
| 1070 | - |
|
| 1071 | - private function _insert_new_payment($old_attendee, $new_txn_id): int |
|
| 1072 | - { |
|
| 1073 | - global $wpdb; |
|
| 1074 | - // Only add a payment for primary attendees. Important note: partial payments were marked as "Pending". |
|
| 1075 | - // Also, an offline payment had blank status (ie, ""). |
|
| 1076 | - $old_pay_stati_indicating_no_payment = ['', 'Incomplete', 'Not Completed']; |
|
| 1077 | - // if this is for a primary 3.1 attendee which WASN'T free and has a completed, cancelled, or declined payment... |
|
| 1078 | - if ( |
|
| 1079 | - intval($old_attendee['is_primary']) && |
|
| 1080 | - floatval($old_attendee['total_cost']) && |
|
| 1081 | - ! in_array($old_attendee['payment_status'], $old_pay_stati_indicating_no_payment) |
|
| 1082 | - ) { |
|
| 1083 | - $pay_status_mapping = [ |
|
| 1084 | - 'Completed' => 'PAP', |
|
| 1085 | - 'Payment Declined' => 'PDC', |
|
| 1086 | - 'Cancelled' => 'PCN', |
|
| 1087 | - 'Declined' => 'PDC', |
|
| 1088 | - ]; |
|
| 1089 | - |
|
| 1090 | - $by_admin = $old_attendee['payment'] == 'Admin'; |
|
| 1091 | - |
|
| 1092 | - // IE, if we don't recognize the status, assume payment failed |
|
| 1093 | - $STS_ID = $pay_status_mapping[ $old_attendee['payment_status'] ] ?? 'PFL'; |
|
| 1094 | - |
|
| 1095 | - $cols_n_values = [ |
|
| 1096 | - 'TXN_ID' => $new_txn_id, |
|
| 1097 | - 'STS_ID' => $STS_ID, |
|
| 1098 | - 'PAY_timestamp' => $this->get_migration_script()->convert_date_string_to_utc( |
|
| 1099 | - $this, |
|
| 1100 | - $old_attendee, |
|
| 1101 | - $old_attendee['date'] |
|
| 1102 | - ), |
|
| 1103 | - 'PAY_method' => 'CART', |
|
| 1104 | - 'PAY_amount' => $old_attendee['amount_pd'], |
|
| 1105 | - // 'txn_type' was used both for the gateway's name, and for other payment notes. |
|
| 1106 | - 'PAY_gateway' => $old_attendee['txn_type'], |
|
| 1107 | - 'PAY_extra_accntng' => $old_attendee['txn_type'], |
|
| 1108 | - 'PAY_gateway_response' => '', |
|
| 1109 | - 'PAY_txn_id_chq_nmbr' => substr($old_attendee['txn_id'], 0, 32), |
|
| 1110 | - 'PAY_via_admin' => $by_admin, |
|
| 1111 | - 'PAY_details' => $old_attendee['transaction_details'], |
|
| 1112 | - ]; |
|
| 1113 | - $data_types = [ |
|
| 1114 | - '%d',// TXN_Id |
|
| 1115 | - '%s',// STS_ID |
|
| 1116 | - '%s',// PAY_timestamp |
|
| 1117 | - '%s',// PAY_method |
|
| 1118 | - '%f',// PAY_amount |
|
| 1119 | - '%s',// PAY_gateway |
|
| 1120 | - '%s',// PAY_gateway_response |
|
| 1121 | - '%s',// PAY_txn_id_chq_nmbr |
|
| 1122 | - '%d',// PAY_via_admin |
|
| 1123 | - '%s',// PAY_details |
|
| 1124 | - ]; |
|
| 1125 | - $success = $wpdb->insert($this->_new_payment_table, $cols_n_values, $data_types); |
|
| 1126 | - if (! $success) { |
|
| 1127 | - $this->add_error( |
|
| 1128 | - $this->get_migration_script()->_create_error_message_for_db_insertion( |
|
| 1129 | - $this->_old_table, |
|
| 1130 | - $old_attendee, |
|
| 1131 | - $this->_new_attendee_cpt_table, |
|
| 1132 | - $cols_n_values, |
|
| 1133 | - $data_types |
|
| 1134 | - ) |
|
| 1135 | - ); |
|
| 1136 | - return 0; |
|
| 1137 | - } |
|
| 1138 | - return $wpdb->insert_id; |
|
| 1139 | - } |
|
| 1140 | - return 0; |
|
| 1141 | - } |
|
| 1142 | - |
|
| 1143 | - |
|
| 1144 | - /** |
|
| 1145 | - * If MER is active, if you want ot find the other registrations on that attendee row |
|
| 1146 | - * |
|
| 1147 | - * @param string $old_registration_id |
|
| 1148 | - * @return array|null |
|
| 1149 | - * @global wpdb $wpdb |
|
| 1150 | - */ |
|
| 1151 | - private function _find_mer_primary_attendee_using_mer_tables(string $old_registration_id): ?array |
|
| 1152 | - { |
|
| 1153 | - if (! $this->_mer_tables_exist()) { |
|
| 1154 | - return null; |
|
| 1155 | - } |
|
| 1156 | - global $wpdb; |
|
| 1157 | - return $wpdb->get_row( |
|
| 1158 | - $wpdb->prepare( |
|
| 1159 | - "SELECT * FROM $this->_old_mer_table AS mer INNER JOIN $this->_old_table AS att ON mer.primary_registration_id = att.registration_id WHERE mer.registration_id=%s LIMIT 1", |
|
| 1160 | - $old_registration_id |
|
| 1161 | - ), |
|
| 1162 | - ARRAY_A |
|
| 1163 | - ); |
|
| 1164 | - } |
|
| 873 | + // start running queries, widening search each time by removing a condition |
|
| 874 | + do { |
|
| 875 | + $full_query = $select_and_join_part . " WHERE " . implode(" AND ", $conditions) . " LIMIT 1"; |
|
| 876 | + $ticket_id_found = $wpdb->get_var($full_query); |
|
| 877 | + array_shift($conditions); |
|
| 878 | + } while (! $ticket_id_found && $conditions); |
|
| 879 | + return $ticket_id_found; |
|
| 880 | + } |
|
| 881 | + |
|
| 882 | + |
|
| 883 | + /** |
|
| 884 | + * If we couldn't find a 4.1 ticket for a 3.1 attendee row, this function creates one; |
|
| 885 | + * and it also tries to find a datetime that works, and inserts a price, and associates |
|
| 886 | + * the new ticket to that datetime and price. |
|
| 887 | + * |
|
| 888 | + * @return int ticket id |
|
| 889 | + */ |
|
| 890 | + private function _insert_new_ticket_because_none_found($old_attendee, $new_event_id): int |
|
| 891 | + { |
|
| 892 | + global $wpdb; |
|
| 893 | + $old_att_price_option = $old_attendee['price_option']; |
|
| 894 | + $old_att_price = floatval($old_attendee['orig_price']); |
|
| 895 | + |
|
| 896 | + $old_att_start_date = $old_attendee['start_date']; |
|
| 897 | + $old_att_start_time = $this->get_migration_script()->convertTimeFromAMPM( |
|
| 898 | + $old_attendee['event_time'] |
|
| 899 | + ); |
|
| 900 | + $old_att_start_datetime = |
|
| 901 | + $this->get_migration_script()->convert_date_string_to_utc( |
|
| 902 | + $this, |
|
| 903 | + $old_attendee, |
|
| 904 | + "$old_att_start_date $old_att_start_time:00" |
|
| 905 | + ); |
|
| 906 | + $old_att_end_datetime = null; |
|
| 907 | + |
|
| 908 | + |
|
| 909 | + // insert new datetime unless we find one |
|
| 910 | + $datetime_id = |
|
| 911 | + $wpdb->get_var( |
|
| 912 | + $wpdb->prepare( |
|
| 913 | + "SELECT DTT_ID FROM " . |
|
| 914 | + $this->_new_datetime_table . |
|
| 915 | + " WHERE DTT_EVT_start=%s AND EVT_ID=%d LIMIT 1", |
|
| 916 | + $old_att_start_datetime, |
|
| 917 | + $new_event_id |
|
| 918 | + ), |
|
| 919 | + ARRAY_A |
|
| 920 | + ); |
|
| 921 | + if (! $datetime_id) { |
|
| 922 | + $old_att_end_date = $old_attendee['start_date']; |
|
| 923 | + $old_att_end_time = $this->get_migration_script()->convertTimeFromAMPM( |
|
| 924 | + $old_attendee['event_time'] |
|
| 925 | + ); |
|
| 926 | + $old_att_end_datetime = $this->get_migration_script()->convert_date_string_to_utc( |
|
| 927 | + $this, |
|
| 928 | + $old_attendee, |
|
| 929 | + "$old_att_end_date $old_att_end_time:00" |
|
| 930 | + ); |
|
| 931 | + $wpdb->insert( |
|
| 932 | + $this->_new_datetime_table, |
|
| 933 | + [ |
|
| 934 | + 'EVT_ID' => $new_event_id, |
|
| 935 | + 'DTT_EVT_start' => $old_att_start_datetime, |
|
| 936 | + 'DTT_EVT_end' => $old_att_end_datetime, |
|
| 937 | + 'DTT_deleted' => true, |
|
| 938 | + ], |
|
| 939 | + [ |
|
| 940 | + '%d',// EVT_ID |
|
| 941 | + '%s',// DTT_EVT_start |
|
| 942 | + '%s',// DTT_EVT_end |
|
| 943 | + '%d',// DTT_deleted |
|
| 944 | + ] |
|
| 945 | + ); |
|
| 946 | + $datetime_id = $wpdb->insert_id; |
|
| 947 | + } |
|
| 948 | + |
|
| 949 | + // insert new ticket |
|
| 950 | + $wpdb->insert( |
|
| 951 | + $wpdb->prefix . 'esp_ticket', |
|
| 952 | + [ |
|
| 953 | + 'TKT_name' => $old_att_price_option, |
|
| 954 | + 'TKT_qty' => -1, |
|
| 955 | + 'TKT_price' => $old_att_price, |
|
| 956 | + 'TKT_start_date' => $old_att_start_datetime, |
|
| 957 | + // we really have no clue what the time should be, but at least it was available when they attended |
|
| 958 | + 'TKT_end_date' => $old_att_end_datetime, |
|
| 959 | + |
|
| 960 | + ], |
|
| 961 | + [ |
|
| 962 | + '%s',// name |
|
| 963 | + '%d',// qty |
|
| 964 | + '%d',// price |
|
| 965 | + '%s',// start_date |
|
| 966 | + '%s',// end_date |
|
| 967 | + ] |
|
| 968 | + ); |
|
| 969 | + $ticket_id = $wpdb->insert_id; |
|
| 970 | + // associate the ticket with the datetime we found earlier |
|
| 971 | + $wpdb->insert( |
|
| 972 | + $this->_new_datetime_ticket_table, |
|
| 973 | + [ |
|
| 974 | + 'DTT_ID' => $datetime_id, |
|
| 975 | + 'TKT_ID' => $ticket_id, |
|
| 976 | + ], |
|
| 977 | + [ |
|
| 978 | + '%d',// DTT_ID |
|
| 979 | + '%d',// TKT_ID |
|
| 980 | + ] |
|
| 981 | + ); |
|
| 982 | + // insert new price |
|
| 983 | + $wpdb->insert( |
|
| 984 | + $this->_new_price_table, |
|
| 985 | + [ |
|
| 986 | + 'PRC_amount' => $old_att_price, |
|
| 987 | + 'PRT_ID' => EE_DMS_4_1_0_prices::price_type_base, |
|
| 988 | + 'PRC_name' => $old_att_price_option, |
|
| 989 | + 'PRC_deleted' => true, |
|
| 990 | + ], |
|
| 991 | + [ |
|
| 992 | + '%d',// PRC_amount |
|
| 993 | + '%d',// PRT_ID |
|
| 994 | + '%s',// PRC_name |
|
| 995 | + '%d',// PRC_deleted |
|
| 996 | + ] |
|
| 997 | + ); |
|
| 998 | + $price_id = $wpdb->insert_id; |
|
| 999 | + // associate the price to the ticket |
|
| 1000 | + $wpdb->insert( |
|
| 1001 | + $this->_new_ticket_price_table, |
|
| 1002 | + [ |
|
| 1003 | + 'TKT_ID' => $ticket_id, |
|
| 1004 | + 'PRC_ID' => $price_id, |
|
| 1005 | + ], |
|
| 1006 | + [ |
|
| 1007 | + '%d',// TKT_ID |
|
| 1008 | + '%d',// PRC_ID |
|
| 1009 | + ] |
|
| 1010 | + ); |
|
| 1011 | + return $ticket_id; |
|
| 1012 | + } |
|
| 1013 | + |
|
| 1014 | + |
|
| 1015 | + /** |
|
| 1016 | + * Counts all the registrations on this transaction. If $count_only_older is TRUE then returns the number added SO |
|
| 1017 | + * FAR (ie, only considers attendee rows with an ID less than this one's), but if $count_only_older is FALSe |
|
| 1018 | + * returns ALL |
|
| 1019 | + * |
|
| 1020 | + * @param array $old_attendee_row |
|
| 1021 | + * @param boolean $count_only_older true if you want the running count (ie, the total up to this row), and false if |
|
| 1022 | + * you want ALL |
|
| 1023 | + * @return int |
|
| 1024 | + * @global wpdb $wpdb |
|
| 1025 | + */ |
|
| 1026 | + private function _sum_old_attendees_on_old_txn(array $old_attendee_row, bool $count_only_older = false): int |
|
| 1027 | + { |
|
| 1028 | + global $wpdb; |
|
| 1029 | + $count_only_older_sql = $count_only_older ? $wpdb->prepare(" AND id<%d", $old_attendee_row['id']) : ''; |
|
| 1030 | + $count = |
|
| 1031 | + intval( |
|
| 1032 | + $wpdb->get_var( |
|
| 1033 | + $wpdb->prepare( |
|
| 1034 | + "SELECT SUM(quantity) FROM " . |
|
| 1035 | + $this->_old_table . |
|
| 1036 | + " WHERE registration_id=%s $count_only_older_sql", |
|
| 1037 | + $old_attendee_row['registration_id'] |
|
| 1038 | + ) |
|
| 1039 | + ) |
|
| 1040 | + ); |
|
| 1041 | + |
|
| 1042 | + if ($this->_mer_tables_exist()) { |
|
| 1043 | + // if MER exists, then it's a little tricky. |
|
| 1044 | + // when users registered by adding items to the cart, and it was a |
|
| 1045 | + // group registration requiring additional attendee INFO, then the attendee rows |
|
| 1046 | + // DO NOT have the same registration_id (although they probably should have) |
|
| 1047 | + // they are related just like MER attendee rows are related, through the MER group table |
|
| 1048 | + // BUT we want to count all the MER attendee rows for the same registration |
|
| 1049 | + $primary_attendee = |
|
| 1050 | + $this->_find_mer_primary_attendee_using_mer_tables($old_attendee_row['registration_id']); |
|
| 1051 | + |
|
| 1052 | + // No primary attendee to work with? Return the count. |
|
| 1053 | + if (is_null($primary_attendee)) { |
|
| 1054 | + return (int) $count; |
|
| 1055 | + } |
|
| 1056 | + |
|
| 1057 | + $count_using_mer_table = |
|
| 1058 | + $wpdb->get_var( |
|
| 1059 | + $wpdb->prepare( |
|
| 1060 | + "SELECT SUM(quantity) FROM $this->_old_table att INNER JOIN $this->_old_mer_table mer ON att.registration_id = mer.registration_id WHERE att.event_id=%d AND mer.primary_registration_id = %s $count_only_older_sql", |
|
| 1061 | + $old_attendee_row['event_id'], |
|
| 1062 | + $primary_attendee['registration_id'] |
|
| 1063 | + ) |
|
| 1064 | + ); |
|
| 1065 | + $count = max($count_using_mer_table, $count); |
|
| 1066 | + } |
|
| 1067 | + return (int) $count; |
|
| 1068 | + } |
|
| 1069 | + |
|
| 1070 | + |
|
| 1071 | + private function _insert_new_payment($old_attendee, $new_txn_id): int |
|
| 1072 | + { |
|
| 1073 | + global $wpdb; |
|
| 1074 | + // Only add a payment for primary attendees. Important note: partial payments were marked as "Pending". |
|
| 1075 | + // Also, an offline payment had blank status (ie, ""). |
|
| 1076 | + $old_pay_stati_indicating_no_payment = ['', 'Incomplete', 'Not Completed']; |
|
| 1077 | + // if this is for a primary 3.1 attendee which WASN'T free and has a completed, cancelled, or declined payment... |
|
| 1078 | + if ( |
|
| 1079 | + intval($old_attendee['is_primary']) && |
|
| 1080 | + floatval($old_attendee['total_cost']) && |
|
| 1081 | + ! in_array($old_attendee['payment_status'], $old_pay_stati_indicating_no_payment) |
|
| 1082 | + ) { |
|
| 1083 | + $pay_status_mapping = [ |
|
| 1084 | + 'Completed' => 'PAP', |
|
| 1085 | + 'Payment Declined' => 'PDC', |
|
| 1086 | + 'Cancelled' => 'PCN', |
|
| 1087 | + 'Declined' => 'PDC', |
|
| 1088 | + ]; |
|
| 1089 | + |
|
| 1090 | + $by_admin = $old_attendee['payment'] == 'Admin'; |
|
| 1091 | + |
|
| 1092 | + // IE, if we don't recognize the status, assume payment failed |
|
| 1093 | + $STS_ID = $pay_status_mapping[ $old_attendee['payment_status'] ] ?? 'PFL'; |
|
| 1094 | + |
|
| 1095 | + $cols_n_values = [ |
|
| 1096 | + 'TXN_ID' => $new_txn_id, |
|
| 1097 | + 'STS_ID' => $STS_ID, |
|
| 1098 | + 'PAY_timestamp' => $this->get_migration_script()->convert_date_string_to_utc( |
|
| 1099 | + $this, |
|
| 1100 | + $old_attendee, |
|
| 1101 | + $old_attendee['date'] |
|
| 1102 | + ), |
|
| 1103 | + 'PAY_method' => 'CART', |
|
| 1104 | + 'PAY_amount' => $old_attendee['amount_pd'], |
|
| 1105 | + // 'txn_type' was used both for the gateway's name, and for other payment notes. |
|
| 1106 | + 'PAY_gateway' => $old_attendee['txn_type'], |
|
| 1107 | + 'PAY_extra_accntng' => $old_attendee['txn_type'], |
|
| 1108 | + 'PAY_gateway_response' => '', |
|
| 1109 | + 'PAY_txn_id_chq_nmbr' => substr($old_attendee['txn_id'], 0, 32), |
|
| 1110 | + 'PAY_via_admin' => $by_admin, |
|
| 1111 | + 'PAY_details' => $old_attendee['transaction_details'], |
|
| 1112 | + ]; |
|
| 1113 | + $data_types = [ |
|
| 1114 | + '%d',// TXN_Id |
|
| 1115 | + '%s',// STS_ID |
|
| 1116 | + '%s',// PAY_timestamp |
|
| 1117 | + '%s',// PAY_method |
|
| 1118 | + '%f',// PAY_amount |
|
| 1119 | + '%s',// PAY_gateway |
|
| 1120 | + '%s',// PAY_gateway_response |
|
| 1121 | + '%s',// PAY_txn_id_chq_nmbr |
|
| 1122 | + '%d',// PAY_via_admin |
|
| 1123 | + '%s',// PAY_details |
|
| 1124 | + ]; |
|
| 1125 | + $success = $wpdb->insert($this->_new_payment_table, $cols_n_values, $data_types); |
|
| 1126 | + if (! $success) { |
|
| 1127 | + $this->add_error( |
|
| 1128 | + $this->get_migration_script()->_create_error_message_for_db_insertion( |
|
| 1129 | + $this->_old_table, |
|
| 1130 | + $old_attendee, |
|
| 1131 | + $this->_new_attendee_cpt_table, |
|
| 1132 | + $cols_n_values, |
|
| 1133 | + $data_types |
|
| 1134 | + ) |
|
| 1135 | + ); |
|
| 1136 | + return 0; |
|
| 1137 | + } |
|
| 1138 | + return $wpdb->insert_id; |
|
| 1139 | + } |
|
| 1140 | + return 0; |
|
| 1141 | + } |
|
| 1142 | + |
|
| 1143 | + |
|
| 1144 | + /** |
|
| 1145 | + * If MER is active, if you want ot find the other registrations on that attendee row |
|
| 1146 | + * |
|
| 1147 | + * @param string $old_registration_id |
|
| 1148 | + * @return array|null |
|
| 1149 | + * @global wpdb $wpdb |
|
| 1150 | + */ |
|
| 1151 | + private function _find_mer_primary_attendee_using_mer_tables(string $old_registration_id): ?array |
|
| 1152 | + { |
|
| 1153 | + if (! $this->_mer_tables_exist()) { |
|
| 1154 | + return null; |
|
| 1155 | + } |
|
| 1156 | + global $wpdb; |
|
| 1157 | + return $wpdb->get_row( |
|
| 1158 | + $wpdb->prepare( |
|
| 1159 | + "SELECT * FROM $this->_old_mer_table AS mer INNER JOIN $this->_old_table AS att ON mer.primary_registration_id = att.registration_id WHERE mer.registration_id=%s LIMIT 1", |
|
| 1160 | + $old_registration_id |
|
| 1161 | + ), |
|
| 1162 | + ARRAY_A |
|
| 1163 | + ); |
|
| 1164 | + } |
|
| 1165 | 1165 | } |
@@ -7,86 +7,86 @@ |
||
| 7 | 7 | */ |
| 8 | 8 | class EE_DMS_4_1_0_category_details extends EE_Data_Migration_Script_Stage |
| 9 | 9 | { |
| 10 | - private string $_new_term_table; |
|
| 10 | + private string $_new_term_table; |
|
| 11 | 11 | |
| 12 | 12 | |
| 13 | - /** |
|
| 14 | - * @throws EE_Error |
|
| 15 | - */ |
|
| 16 | - public function _migration_step($num_items_to_migrate = 50) |
|
| 17 | - { |
|
| 18 | - global $wpdb; |
|
| 19 | - $start_at_record = $this->count_records_migrated(); |
|
| 20 | - $rows = |
|
| 21 | - $wpdb->get_results( |
|
| 22 | - $wpdb->prepare( |
|
| 23 | - "SELECT * FROM $this->_old_table LIMIT %d,%d", |
|
| 24 | - $start_at_record, |
|
| 25 | - $num_items_to_migrate |
|
| 26 | - ), |
|
| 27 | - ARRAY_A |
|
| 28 | - ); |
|
| 29 | - $items_actually_migrated = 0; |
|
| 30 | - foreach ($rows as $category_detail_row) { |
|
| 31 | - $term_and_taxonomy_ids = wp_insert_term( |
|
| 32 | - stripslashes($category_detail_row['category_name']), |
|
| 33 | - 'espresso_event_categories', |
|
| 34 | - [ |
|
| 35 | - 'description' => stripslashes($category_detail_row['category_desc']), |
|
| 36 | - 'slug' => $category_detail_row['category_identifier'], |
|
| 37 | - ] |
|
| 38 | - ); |
|
| 39 | - if ($term_and_taxonomy_ids instanceof WP_Error) { |
|
| 40 | - $this->add_error( |
|
| 41 | - sprintf( |
|
| 42 | - esc_html__( |
|
| 43 | - "Could not create WP Term_Taxonomy from old category: %s. The Error was: %s", |
|
| 44 | - "event_espresso" |
|
| 45 | - ), |
|
| 46 | - $this->_json_encode($category_detail_row), |
|
| 47 | - $term_and_taxonomy_ids->get_error_message() |
|
| 48 | - ) |
|
| 49 | - ); |
|
| 50 | - $items_actually_migrated++; |
|
| 51 | - continue; |
|
| 52 | - } |
|
| 53 | - $term_id = $term_and_taxonomy_ids['term_id']; |
|
| 54 | - $term_taxonomy_id = $term_and_taxonomy_ids['term_taxonomy_id']; |
|
| 55 | - $this->get_migration_script()->set_mapping( |
|
| 56 | - $this->_old_table, |
|
| 57 | - $category_detail_row['id'], |
|
| 58 | - $this->_new_term_table, |
|
| 59 | - $term_id |
|
| 60 | - ); |
|
| 61 | - $this->get_migration_script()->set_mapping( |
|
| 62 | - $this->_old_table, |
|
| 63 | - $category_detail_row['id'], |
|
| 64 | - $this->_new_table, |
|
| 65 | - $term_taxonomy_id |
|
| 66 | - ); |
|
| 67 | - $items_actually_migrated++; |
|
| 68 | - } |
|
| 69 | - if ($this->count_records_migrated() + $items_actually_migrated >= $this->count_records_to_migrate()) { |
|
| 70 | - $this->set_completed(); |
|
| 71 | - } |
|
| 72 | - return $items_actually_migrated; |
|
| 73 | - } |
|
| 13 | + /** |
|
| 14 | + * @throws EE_Error |
|
| 15 | + */ |
|
| 16 | + public function _migration_step($num_items_to_migrate = 50) |
|
| 17 | + { |
|
| 18 | + global $wpdb; |
|
| 19 | + $start_at_record = $this->count_records_migrated(); |
|
| 20 | + $rows = |
|
| 21 | + $wpdb->get_results( |
|
| 22 | + $wpdb->prepare( |
|
| 23 | + "SELECT * FROM $this->_old_table LIMIT %d,%d", |
|
| 24 | + $start_at_record, |
|
| 25 | + $num_items_to_migrate |
|
| 26 | + ), |
|
| 27 | + ARRAY_A |
|
| 28 | + ); |
|
| 29 | + $items_actually_migrated = 0; |
|
| 30 | + foreach ($rows as $category_detail_row) { |
|
| 31 | + $term_and_taxonomy_ids = wp_insert_term( |
|
| 32 | + stripslashes($category_detail_row['category_name']), |
|
| 33 | + 'espresso_event_categories', |
|
| 34 | + [ |
|
| 35 | + 'description' => stripslashes($category_detail_row['category_desc']), |
|
| 36 | + 'slug' => $category_detail_row['category_identifier'], |
|
| 37 | + ] |
|
| 38 | + ); |
|
| 39 | + if ($term_and_taxonomy_ids instanceof WP_Error) { |
|
| 40 | + $this->add_error( |
|
| 41 | + sprintf( |
|
| 42 | + esc_html__( |
|
| 43 | + "Could not create WP Term_Taxonomy from old category: %s. The Error was: %s", |
|
| 44 | + "event_espresso" |
|
| 45 | + ), |
|
| 46 | + $this->_json_encode($category_detail_row), |
|
| 47 | + $term_and_taxonomy_ids->get_error_message() |
|
| 48 | + ) |
|
| 49 | + ); |
|
| 50 | + $items_actually_migrated++; |
|
| 51 | + continue; |
|
| 52 | + } |
|
| 53 | + $term_id = $term_and_taxonomy_ids['term_id']; |
|
| 54 | + $term_taxonomy_id = $term_and_taxonomy_ids['term_taxonomy_id']; |
|
| 55 | + $this->get_migration_script()->set_mapping( |
|
| 56 | + $this->_old_table, |
|
| 57 | + $category_detail_row['id'], |
|
| 58 | + $this->_new_term_table, |
|
| 59 | + $term_id |
|
| 60 | + ); |
|
| 61 | + $this->get_migration_script()->set_mapping( |
|
| 62 | + $this->_old_table, |
|
| 63 | + $category_detail_row['id'], |
|
| 64 | + $this->_new_table, |
|
| 65 | + $term_taxonomy_id |
|
| 66 | + ); |
|
| 67 | + $items_actually_migrated++; |
|
| 68 | + } |
|
| 69 | + if ($this->count_records_migrated() + $items_actually_migrated >= $this->count_records_to_migrate()) { |
|
| 70 | + $this->set_completed(); |
|
| 71 | + } |
|
| 72 | + return $items_actually_migrated; |
|
| 73 | + } |
|
| 74 | 74 | |
| 75 | 75 | |
| 76 | - public function _count_records_to_migrate() |
|
| 77 | - { |
|
| 78 | - global $wpdb; |
|
| 79 | - return $wpdb->get_var("SELECT COUNT(id) FROM $this->_old_table"); |
|
| 80 | - } |
|
| 76 | + public function _count_records_to_migrate() |
|
| 77 | + { |
|
| 78 | + global $wpdb; |
|
| 79 | + return $wpdb->get_var("SELECT COUNT(id) FROM $this->_old_table"); |
|
| 80 | + } |
|
| 81 | 81 | |
| 82 | 82 | |
| 83 | - public function __construct() |
|
| 84 | - { |
|
| 85 | - $this->_pretty_name = esc_html__("Category Details", "event_espresso"); |
|
| 86 | - global $wpdb; |
|
| 87 | - $this->_old_table = $wpdb->prefix . "events_category_detail"; |
|
| 88 | - $this->_new_table = $wpdb->prefix . "term_taxonomy"; |
|
| 89 | - $this->_new_term_table = $wpdb->prefix . "terms"; |
|
| 90 | - parent::__construct(); |
|
| 91 | - } |
|
| 83 | + public function __construct() |
|
| 84 | + { |
|
| 85 | + $this->_pretty_name = esc_html__("Category Details", "event_espresso"); |
|
| 86 | + global $wpdb; |
|
| 87 | + $this->_old_table = $wpdb->prefix . "events_category_detail"; |
|
| 88 | + $this->_new_table = $wpdb->prefix . "term_taxonomy"; |
|
| 89 | + $this->_new_term_table = $wpdb->prefix . "terms"; |
|
| 90 | + parent::__construct(); |
|
| 91 | + } |
|
| 92 | 92 | } |
@@ -10,48 +10,48 @@ |
||
| 10 | 10 | */ |
| 11 | 11 | class EE_DMS_4_5_0_update_wp_user_for_question_groups extends EE_Data_Migration_Script_Stage_Table |
| 12 | 12 | { |
| 13 | - public function __construct() |
|
| 14 | - { |
|
| 15 | - global $wpdb; |
|
| 16 | - $this->_pretty_name = esc_html__("Question Groups", "event_espresso"); |
|
| 17 | - $this->_old_table = $wpdb->prefix . "esp_question_group"; |
|
| 18 | - parent::__construct(); |
|
| 19 | - } |
|
| 13 | + public function __construct() |
|
| 14 | + { |
|
| 15 | + global $wpdb; |
|
| 16 | + $this->_pretty_name = esc_html__("Question Groups", "event_espresso"); |
|
| 17 | + $this->_old_table = $wpdb->prefix . "esp_question_group"; |
|
| 18 | + parent::__construct(); |
|
| 19 | + } |
|
| 20 | 20 | |
| 21 | 21 | |
| 22 | - /** |
|
| 23 | - * @throws ReflectionException |
|
| 24 | - * @throws EE_Error |
|
| 25 | - */ |
|
| 26 | - protected function _migrate_old_row($old_row) |
|
| 27 | - { |
|
| 28 | - // foreach ticket row we add the id for the current logged in user. |
|
| 29 | - global $wpdb; |
|
| 30 | - $user_id = EEH_Activation::get_default_creator_id(); |
|
| 31 | - $user_id = $user_id ?: 0; |
|
| 32 | - $updated = $wpdb->update( |
|
| 33 | - $this->_old_table, |
|
| 34 | - ['QSG_wp_user' => $user_id], |
|
| 35 | - ['QSG_ID' => $old_row['QSG_ID']], |
|
| 36 | - [ |
|
| 37 | - '%d',// QSG_wp_user |
|
| 38 | - ], |
|
| 39 | - [ |
|
| 40 | - '%d',// QSG_ID |
|
| 41 | - ] |
|
| 42 | - ); |
|
| 43 | - if (false === $updated) { |
|
| 44 | - $this->add_error( |
|
| 45 | - sprintf( |
|
| 46 | - esc_html__( |
|
| 47 | - "Error in updating table %s setting QSG_wp_user = %d where QSG_ID = %d", |
|
| 48 | - 'event_espresso' |
|
| 49 | - ), |
|
| 50 | - $this->_old_table, |
|
| 51 | - $user_id, |
|
| 52 | - $old_row['QSG_ID'] |
|
| 53 | - ) |
|
| 54 | - ); |
|
| 55 | - } |
|
| 56 | - } |
|
| 22 | + /** |
|
| 23 | + * @throws ReflectionException |
|
| 24 | + * @throws EE_Error |
|
| 25 | + */ |
|
| 26 | + protected function _migrate_old_row($old_row) |
|
| 27 | + { |
|
| 28 | + // foreach ticket row we add the id for the current logged in user. |
|
| 29 | + global $wpdb; |
|
| 30 | + $user_id = EEH_Activation::get_default_creator_id(); |
|
| 31 | + $user_id = $user_id ?: 0; |
|
| 32 | + $updated = $wpdb->update( |
|
| 33 | + $this->_old_table, |
|
| 34 | + ['QSG_wp_user' => $user_id], |
|
| 35 | + ['QSG_ID' => $old_row['QSG_ID']], |
|
| 36 | + [ |
|
| 37 | + '%d',// QSG_wp_user |
|
| 38 | + ], |
|
| 39 | + [ |
|
| 40 | + '%d',// QSG_ID |
|
| 41 | + ] |
|
| 42 | + ); |
|
| 43 | + if (false === $updated) { |
|
| 44 | + $this->add_error( |
|
| 45 | + sprintf( |
|
| 46 | + esc_html__( |
|
| 47 | + "Error in updating table %s setting QSG_wp_user = %d where QSG_ID = %d", |
|
| 48 | + 'event_espresso' |
|
| 49 | + ), |
|
| 50 | + $this->_old_table, |
|
| 51 | + $user_id, |
|
| 52 | + $old_row['QSG_ID'] |
|
| 53 | + ) |
|
| 54 | + ); |
|
| 55 | + } |
|
| 56 | + } |
|
| 57 | 57 | } |