oont-contents/plugins/woocommerce-pdf-invoices-packing-slips/includes/Install.php
2025-02-10 13:57:45 +01:00

581 lines
22 KiB
PHP

<?php
namespace WPO\IPS;
if ( ! defined( 'ABSPATH' ) ) {
exit; // Exit if accessed directly
}
if ( ! class_exists( '\\WPO\\IPS\\Install' ) ) :
class Install {
protected static $_instance = null;
public static function instance() {
if ( is_null( self::$_instance ) ) {
self::$_instance = new self();
}
return self::$_instance;
}
public function __construct() {
// run lifecycle methods
if ( is_admin() && ! defined( 'DOING_AJAX' ) ) {
add_action( 'wp_loaded', array( $this, 'do_install' ) );
}
}
/** Lifecycle methods *******************************************************
* Because register_activation_hook only runs when the plugin is manually
* activated by the user, we're checking the current version against the
* version stored in the database
****************************************************************************/
/**
* Handles version checking
*/
public function do_install() {
// only install when woocommerce is active
if ( ! WPO_WCPDF()->is_woocommerce_activated() ) {
return;
}
$version_setting = 'wpo_wcpdf_version';
$installed_version = get_option( $version_setting );
// installed version lower than plugin version?
if ( version_compare( $installed_version, WPO_WCPDF_VERSION, '<' ) ) {
if ( ! $installed_version ) {
try {
$this->install();
} catch ( \Throwable $th ) {
wcpdf_log_error( sprintf( "Plugin install procedure failed (version %s): %s", WPO_WCPDF_VERSION, $th->getMessage() ), 'critical', $th );
}
} else {
try {
$this->upgrade( $installed_version );
} catch ( \Throwable $th ) {
wcpdf_log_error( sprintf( "Plugin upgrade procedure failed (updating from version %s to %s): %s", $installed_version, WPO_WCPDF_VERSION, $th->getMessage() ), 'critical', $th );
}
}
// new version number
update_option( $version_setting, WPO_WCPDF_VERSION );
} elseif ( $installed_version && version_compare( $installed_version, WPO_WCPDF_VERSION, '>' ) ) {
try {
$this->downgrade( $installed_version );
} catch ( \Throwable $th ) {
wcpdf_log_error( sprintf( "Plugin downgrade procedure failed (downgrading from version %s to %s): %s", $installed_version, WPO_WCPDF_VERSION, $th->getMessage() ), 'critical', $th );
}
// downgrade version number
update_option( $version_setting, WPO_WCPDF_VERSION );
}
// deactivate legacy addons
add_action( 'admin_init', array( WPO_WCPDF(), 'deactivate_legacy_addons') );
}
/**
* Plugin install method. Perform any installation tasks here
*/
protected function install() {
// only install when php version or higher
if ( ! WPO_WCPDF()->is_dependency_version_supported( 'php' ) ) {
return;
}
// check if upgrading from versionless (1.4.14 and older)
if ( get_option( 'wpo_wcpdf_general_settings' ) ) {
$this->upgrade( 'versionless' );
return;
}
// Get tmp folders
$tmp_base = WPO_WCPDF()->main->get_tmp_base();
// check if tmp folder exists => if not, initialize
if ( ! @is_dir( $tmp_base ) || ! wp_is_writable( $tmp_base ) ) {
WPO_WCPDF()->main->init_tmp();
}
// Unsupported currency symbols
$unsupported_symbols = array (
'AED',
'AFN',
'BDT',
'BHD',
'BTC',
'CRC',
'DZD',
'GEL',
'GHS',
'ILS',
'INR',
'IQD',
'IRR',
'IRT',
'JOD',
'KHR',
'KPW',
'KRW',
'KWD',
'LAK',
'LBP',
'LKR',
'LYD',
'MAD',
'MNT',
'MUR',
'MVR',
'NPR',
'OMR',
'PHP',
'PKR',
'PYG',
'QAR',
'RUB',
'SAR',
'SCR',
'SDG',
'SYP',
'THB',
'TND',
'TRY',
'UAH',
'YER',
);
// set default settings
$settings_defaults = array(
'wpo_wcpdf_settings_general' => array(
'download_display' => 'display',
'template_path' => WPO_WCPDF()->plugin_path() . '/templates/Simple',
'currency_font' => ( in_array( get_woocommerce_currency(), $unsupported_symbols ) ) ? 1 : '',
'paper_size' => 'a4',
// 'header_logo' => '',
// 'shop_name' => array(),
// 'shop_address' => array(),
// 'footer' => array(),
// 'extra_1' => array(),
// 'extra_2' => array(),
// 'extra_3' => array(),
),
'wpo_wcpdf_documents_settings_invoice' => array(
'enabled' => 1,
// 'attach_to_email_ids' => array(),
// 'display_shipping_address' => '',
// 'display_email' => '',
// 'display_phone' => '',
// 'display_date' => '',
// 'display_number' => '',
// 'number_format' => array(),
// 'reset_number_yearly' => '',
// 'my_account_buttons' => '',
// 'invoice_number_column' => '',
// 'invoice_date_column' => '',
// 'disable_free' => '',
),
'wpo_wcpdf_documents_settings_packing-slip' => array(
'enabled' => 1,
// 'display_billing_address' => '',
// 'display_email' => '',
// 'display_phone' => '',
),
'wpo_wcpdf_settings_debug' => array(
// 'legacy_mode' => '',
// 'enable_debug' => '',
// 'html_output' => '',
// 'html_output' => '',
'enable_cleanup' => 1,
'cleanup_days' => 7,
),
);
foreach ($settings_defaults as $option => $defaults) {
add_option( $option, $defaults );
}
// set transient for wizard notification
set_transient( 'wpo_wcpdf_new_install', 'yes', DAY_IN_SECONDS * 2 );
// schedule the yearly reset number action
if ( ! empty( WPO_WCPDF()->settings ) && is_callable( array( WPO_WCPDF()->settings, 'schedule_yearly_reset_numbers' ) ) ) {
WPO_WCPDF()->settings->schedule_yearly_reset_numbers();
}
}
/**
* Plugin upgrade method. Perform any required upgrades here
*
* @param string $installed_version the currently installed ('old') version
*/
protected function upgrade( $installed_version ) {
// only upgrade when php version or higher
if ( ! WPO_WCPDF()->is_dependency_version_supported( 'php' ) ) {
return;
}
// sync fonts on every upgrade!
$tmp_base = WPO_WCPDF()->main->get_tmp_base();
// get fonts folder path
$font_path = WPO_WCPDF()->main->get_tmp_path( 'fonts' );
// check if tmp folder exists => if not, initialize
if ( ! @is_dir( $tmp_base ) || ! wp_is_writable( $tmp_base ) || ! @is_dir( $font_path ) || ! wp_is_writable( $font_path ) ) {
WPO_WCPDF()->main->init_tmp();
} else {
// don't try merging fonts with local when updating pre 2.0
$pre_2 = ( $installed_version == 'versionless' || version_compare( $installed_version, '2.0-dev', '<' ) );
$merge_with_local = !$pre_2;
WPO_WCPDF()->main->copy_fonts( $font_path, $merge_with_local );
}
// to ensure fonts will be copied to the upload directory
delete_transient( 'wpo_wcpdf_subfolder_fonts_has_files' );
// 1.5.28 update: copy next invoice number to separate setting
if ( $installed_version == 'versionless' || version_compare( $installed_version, '1.5.28', '<' ) ) {
$template_settings = get_option( 'wpo_wcpdf_template_settings' );
$next_invoice_number = isset($template_settings['next_invoice_number'])?$template_settings['next_invoice_number']:'';
update_option( 'wpo_wcpdf_next_invoice_number', $next_invoice_number );
}
// 2.0-dev update: reorganize settings
if ( $installed_version == 'versionless' || version_compare( $installed_version, '2.0-dev', '<' ) ) {
$old_settings = array(
'wpo_wcpdf_general_settings' => get_option( 'wpo_wcpdf_general_settings' ),
'wpo_wcpdf_template_settings' => get_option( 'wpo_wcpdf_template_settings' ),
'wpo_wcpdf_debug_settings' => get_option( 'wpo_wcpdf_debug_settings' ),
);
// combine invoice number formatting in array
$old_settings['wpo_wcpdf_template_settings']['invoice_number_formatting'] = array();
$format_option_keys = array('padding','suffix','prefix');
foreach ($format_option_keys as $format_option_key) {
if (isset($old_settings['wpo_wcpdf_template_settings']["invoice_number_formatting_{$format_option_key}"])) {
$old_settings['wpo_wcpdf_template_settings']['invoice_number_formatting'][$format_option_key] = $old_settings['wpo_wcpdf_template_settings']["invoice_number_formatting_{$format_option_key}"];
}
}
// convert abbreviated email_ids
if (isset($old_settings['wpo_wcpdf_general_settings']['email_pdf'])) {
foreach ($old_settings['wpo_wcpdf_general_settings']['email_pdf'] as $email_id => $value) {
if ($email_id == 'completed' || $email_id == 'processing') {
$old_settings['wpo_wcpdf_general_settings']['email_pdf']["customer_{$email_id}_order"] = $value;
unset($old_settings['wpo_wcpdf_general_settings']['email_pdf'][$email_id]);
}
}
}
// Migrate template path
// forward slash for consistency/compatibility
if ( ! empty( $old_settings['wpo_wcpdf_template_settings']['template_path'] ) ) {
$template_path = str_replace( '\\', '/', $old_settings['wpo_wcpdf_template_settings']['template_path'] );
// strip abspath (forward slashed) if included
$template_path = str_replace( str_replace('\\','/', ABSPATH), '', $template_path );
// strip pdf subfolder from templates path
$template_path = str_replace( '/templates/pdf/', '/templates/', $template_path );
$old_settings['wpo_wcpdf_template_settings']['template_path'] = $template_path;
}
// map new settings to old
$settings_map = array(
'wpo_wcpdf_settings_general' => array(
'download_display' => array( 'wpo_wcpdf_general_settings' => 'download_display' ),
'template_path' => array( 'wpo_wcpdf_template_settings' => 'template_path' ),
'currency_font' => array( 'wpo_wcpdf_template_settings' => 'currency_font' ),
'paper_size' => array( 'wpo_wcpdf_template_settings' => 'paper_size' ),
'header_logo' => array( 'wpo_wcpdf_template_settings' => 'header_logo' ),
'shop_name' => array( 'wpo_wcpdf_template_settings' => 'shop_name' ),
'shop_address' => array( 'wpo_wcpdf_template_settings' => 'shop_address' ),
'footer' => array( 'wpo_wcpdf_template_settings' => 'footer' ),
'extra_1' => array( 'wpo_wcpdf_template_settings' => 'extra_1' ),
'extra_2' => array( 'wpo_wcpdf_template_settings' => 'extra_2' ),
'extra_3' => array( 'wpo_wcpdf_template_settings' => 'extra_3' ),
),
'wpo_wcpdf_documents_settings_invoice' => array(
'attach_to_email_ids' => array( 'wpo_wcpdf_general_settings' => 'email_pdf' ),
'display_shipping_address' => array( 'wpo_wcpdf_template_settings' => 'invoice_shipping_address' ),
'display_email' => array( 'wpo_wcpdf_template_settings' => 'invoice_email' ),
'display_phone' => array( 'wpo_wcpdf_template_settings' => 'invoice_phone' ),
'display_date' => array( 'wpo_wcpdf_template_settings' => 'display_date' ),
'display_number' => array( 'wpo_wcpdf_template_settings' => 'display_number' ),
'number_format' => array( 'wpo_wcpdf_template_settings' => 'invoice_number_formatting' ),
'reset_number_yearly' => array( 'wpo_wcpdf_template_settings' => 'yearly_reset_invoice_number' ),
'my_account_buttons' => array( 'wpo_wcpdf_general_settings' => 'my_account_buttons' ),
'invoice_number_column' => array( 'wpo_wcpdf_general_settings' => 'invoice_number_column' ),
'invoice_date_column' => array( 'wpo_wcpdf_general_settings' => 'invoice_date_column' ),
'disable_free' => array( 'wpo_wcpdf_general_settings' => 'disable_free' ),
),
'wpo_wcpdf_documents_settings_packing-slip' => array(
'display_billing_address' => array( 'wpo_wcpdf_template_settings' => 'packing_slip_billing_address' ),
'display_email' => array( 'wpo_wcpdf_template_settings' => 'packing_slip_email' ),
'display_phone' => array( 'wpo_wcpdf_template_settings' => 'packing_slip_phone' ),
),
'wpo_wcpdf_settings_debug' => array(
'enable_debug' => array( 'wpo_wcpdf_debug_settings' => 'enable_debug' ),
'html_output' => array( 'wpo_wcpdf_debug_settings' => 'html_output' ),
),
);
// walk through map
foreach ($settings_map as $new_option => $new_settings_keys) {
${$new_option} = array();
foreach ($new_settings_keys as $new_key => $old_setting ) {
$old_key = reset($old_setting);
$old_option = key($old_setting);
if (!empty($old_settings[$old_option][$old_key])) {
// turn translatable fields into array
$translatable_fields = array('shop_name','shop_address','footer','extra_1','extra_2','extra_3');
if (in_array($new_key, $translatable_fields)) {
${$new_option}[$new_key] = array( 'default' => $old_settings[$old_option][$old_key] );
} else {
${$new_option}[$new_key] = $old_settings[$old_option][$old_key];
}
}
}
// auto enable invoice & packing slip
$enabled = array( 'wpo_wcpdf_documents_settings_invoice', 'wpo_wcpdf_documents_settings_packing-slip' );
if ( in_array( $new_option, $enabled ) ) {
${$new_option}['enabled'] = 1;
}
// merge with existing settings
${$new_option."_old"} = get_option( $new_option, ${$new_option} ); // second argument loads new as default in case the settings did not exist yet
${$new_option} = (array) ${$new_option} + (array) ${$new_option."_old"}; // duplicate options take new options as default
// store new option values
update_option( $new_option, ${$new_option} );
}
}
// 2.0-beta-2 update: copy next number to separate db store
if ( version_compare( $installed_version, '2.0-beta-2', '<' ) ) {
$next_number = get_option( 'wpo_wcpdf_next_invoice_number' );
if ( ! empty( $next_number ) ) {
$number_store = new \WPO\IPS\Documents\SequentialNumberStore( 'invoice_number' );
$number_store->set_next( (int) $next_number );
}
// we're not deleting this option yet to make downgrading possible
// delete_option( 'wpo_wcpdf_next_invoice_number' ); // clean up after ourselves
}
// 2.1.9: set cleanup defaults
if ( $installed_version == 'versionless' || version_compare( $installed_version, '2.1.9', '<' ) ) {
$debug_settings = get_option( 'wpo_wcpdf_settings_debug', array() );
$debug_settings['enable_cleanup'] = 1;
$debug_settings['cleanup_days'] = 7;
update_option( 'wpo_wcpdf_settings_debug', $debug_settings );
}
// 2.10.0-dev: migrate template path to template ID
// 2.11.5: improvements to the migration procedure
if ( version_compare( $installed_version, '2.11.5', '<' ) ) {
if ( ! empty( WPO_WCPDF()->settings ) && is_callable( array( WPO_WCPDF()->settings, 'maybe_migrate_template_paths' ) ) ) {
WPO_WCPDF()->settings->maybe_migrate_template_paths();
}
}
// 2.11.2: remove the obsolete .dist font cache file and mustRead.html from local fonts folder
if ( version_compare( $installed_version, '2.11.2', '<' ) ) {
@unlink( trailingslashit( $font_path ) . 'dompdf_font_family_cache.dist.php' );
@unlink( trailingslashit( $font_path ) . 'mustRead.html' );
}
// 2.12.2-dev-1: change 'date' database table default value to '1000-01-01 00:00:00'
if ( version_compare( $installed_version, '2.12.2-dev-1', '<' ) ) {
global $wpdb;
$documents = WPO_WCPDF()->documents->get_documents( 'all' );
foreach ( $documents as $document ) {
$store_name = "{$document->slug}_number";
$method = WPO_WCPDF()->settings->get_sequential_number_store_method();
$table_name = apply_filters( "wpo_wcpdf_number_store_table_name", "{$wpdb->prefix}wcpdf_{$store_name}", $store_name, $method );
if ( $wpdb->get_var( "SHOW TABLES LIKE '{$table_name}'" ) != $table_name ) {
continue;
}
if ( is_callable( array( $document, 'get_sequential_number_store' ) ) ) {
$number_store = $document->get_sequential_number_store();
if ( ! empty( $number_store ) ) {
$column_name = 'date';
$query = $wpdb->query( "ALTER TABLE {$number_store->table_name} ALTER {$column_name} SET DEFAULT '1000-01-01 00:00:00'" );
if ( $query ) {
wcpdf_log_error(
"Default value changed for 'date' column to '1000-01-01 00:00:00' on database table: {$number_store->table_name}",
'info'
);
} else {
wcpdf_log_error(
"An error occurred! The default value for 'date' column couldn't be changed to '1000-01-01 00:00:00' on database table: {$number_store->table_name}",
'critical'
);
}
}
}
}
}
// 3.0.0-dev-1: remove saved option 'use_html5_parser'
if ( version_compare( $installed_version, '3.0.0-dev-1', '<' ) ) {
// removes 'HTML5 parser' setting value
$debug_settings = get_option( 'wpo_wcpdf_settings_debug', array() );
if ( ! empty( $debug_settings['use_html5_parser'] ) ) {
unset( $debug_settings['use_html5_parser'] );
update_option( 'wpo_wcpdf_settings_debug', $debug_settings );
}
}
// 3.3.0-dev-1: schedule the yearly reset number action
if ( version_compare( $installed_version, '3.3.0-dev-1', '<' ) ) {
if ( ! empty( WPO_WCPDF()->settings ) && is_callable( array( WPO_WCPDF()->settings, 'schedule_yearly_reset_numbers' ) ) ) {
WPO_WCPDF()->settings->schedule_yearly_reset_numbers();
}
}
// 3.5.7-dev-1: migrate 'guest_access' setting to 'document_link_access_type'
if ( version_compare( $installed_version, '3.5.7-dev-1', '<' ) ) {
$debug_settings = get_option( 'wpo_wcpdf_settings_debug', array() );
if ( ! empty( $debug_settings['guest_access'] ) ) {
unset( $debug_settings['guest_access'] );
$debug_settings['document_link_access_type'] = 'guest';
update_option( 'wpo_wcpdf_settings_debug', $debug_settings );
}
}
// 3.6.3-dev-1: check if 'legacy_mode' is enabled, and disable it
if ( version_compare( $installed_version, '3.6.3-dev-1', '<' ) ) {
$debug_settings = get_option( 'wpo_wcpdf_settings_debug', array() );
$update = false;
if ( ! empty( $debug_settings['legacy_mode'] ) ) {
unset( $debug_settings['legacy_mode'] );
$update = true;
}
if ( ! empty( $debug_settings['legacy_textdomain'] ) ) {
unset( $debug_settings['legacy_textdomain'] );
$update = true;
}
if ( $update ) {
update_option( 'wpo_wcpdf_settings_debug', $debug_settings );
}
}
// 3.7.0-beta-4: migrate UBL legacy settings
if ( version_compare( $installed_version, '3.7.0-beta-4', '<' ) ) {
// legacy ubl general/invoice settings
$legacy_ubl_general_settings = get_option( 'ubl_wc_general', [] );
$general_settings = get_option( 'wpo_wcpdf_settings_general', [] );
$invoice_ubl_settings = get_option( 'wpo_wcpdf_documents_settings_invoice_ubl', [] );
$settings_to_migrate = [
'vat_number' => 'general',
'coc_number' => 'general',
'company_name' => 'general', // corresponds to 'shop_name' in the General Settings
'attach_to_email_ids' => 'invoice_ubl',
'include_encrypted_pdf' => 'invoice_ubl',
];
foreach ( $settings_to_migrate as $setting => $type ) {
$update = [];
switch ( $type ) {
case 'general':
if ( isset( $legacy_ubl_general_settings[$setting] ) ) {
$legacy_ubl_setting_value = $legacy_ubl_general_settings[$setting];
$setting = ( 'company_name' === $setting && ! isset( $general_settings['shop_name'] ) ) ? 'shop_name' : $setting;
if ( 'company_name' !== $setting ) {
$general_settings[$setting] = $legacy_ubl_setting_value;
$update[] = $type;
}
}
break;
case 'invoice_ubl':
if ( isset( $legacy_ubl_general_settings[$setting] ) ) {
$invoice_ubl_settings[$setting] = $legacy_ubl_general_settings[$setting];
$update[] = $type;
}
break;
}
if ( ! empty( $update ) ) {
$update = array_unique( $update );
foreach ( $update as $type ) {
switch ( $type ) {
case 'general':
update_option( 'wpo_wcpdf_settings_general', $general_settings );
break;
case 'invoice_ubl':
$invoice_ubl_settings['enabled'] = '1';
update_option( 'wpo_wcpdf_documents_settings_invoice_ubl', $invoice_ubl_settings );
break;
}
}
}
}
// legacy ubl tax settings
$legacy_ubl_tax_settings = get_option( 'ubl_wc_taxes', [] );
if ( ! empty( $legacy_ubl_tax_settings ) ) {
update_option( 'wpo_wcpdf_settings_ubl_taxes', $legacy_ubl_tax_settings );
}
// set transient to flush rewrite rules if pretty links are enabled
if ( WPO_WCPDF()->endpoint->pretty_links_enabled() ) {
set_transient( 'wpo_wcpdf_flush_rewrite_rules', 'yes', HOUR_IN_SECONDS );
}
}
// 3.9.5-beta-4: migrate UBL tax schemes/categories
if ( version_compare( $installed_version, '3.9.5-beta-4', '<' ) ) {
$ubl_tax_settings = get_option( 'wpo_wcpdf_settings_ubl_taxes', array() );
if ( ! empty( $ubl_tax_settings ) ) {
array_walk_recursive( $ubl_tax_settings, function ( &$value, $key ) {
if ( in_array( $key, array( 'scheme', 'category' ) ) && ! empty( $value ) ) {
$value = strtoupper( $value );
}
} );
update_option( 'wpo_wcpdf_settings_ubl_taxes', $ubl_tax_settings );
}
}
}
/**
* Plugin downgrade method. Perform any required downgrades here
*
*
* @param string $installed_version the currently installed ('old') version (actually higher since this is a downgrade)
*/
protected function downgrade( $installed_version ) {
// make sure fonts match with version: copy from plugin folder
$tmp_base = WPO_WCPDF()->main->get_tmp_base();
// make sure we have the fonts directory
$font_path = WPO_WCPDF()->main->get_tmp_path( 'fonts' );
// don't continue if we don't have an upload dir
if ($tmp_base === false) {
return false;
}
// check if tmp folder exists => if not, initialize
if ( ! @is_dir( $tmp_base ) || ! wp_is_writable( $tmp_base ) || ! @is_dir( $font_path ) || ! wp_is_writable( $font_path ) ) {
WPO_WCPDF()->main->init_tmp();
} else {
WPO_WCPDF()->main->copy_fonts( $font_path );
}
}
}
endif; // class_exists