255 lines
11 KiB
PHP
255 lines
11 KiB
PHP
<?php
|
|
if ( ! defined( 'ABSPATH' ) ) {
|
|
exit;
|
|
}
|
|
global $wpdb;
|
|
|
|
// Get all the rates and locations. Snagging all at once should significantly cut down on the number of queries.
|
|
$rates = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM `{$wpdb->prefix}woocommerce_tax_rates` WHERE `tax_rate_class` = %s ORDER BY `tax_rate_order`;", sanitize_title( $current_class ) ) );
|
|
$locations = $wpdb->get_results( "SELECT * FROM `{$wpdb->prefix}woocommerce_tax_rate_locations`" );
|
|
|
|
// Set the rates keys equal to their ids.
|
|
$rates = array_combine( wp_list_pluck( $rates, 'tax_rate_id' ), $rates );
|
|
|
|
// Drop the locations into the rates array.
|
|
foreach ( $locations as $location ) {
|
|
if ( ! isset( $rates[ $location->tax_rate_id ]->{$location->location_type} ) ) {
|
|
$rates[ $location->tax_rate_id ]->{$location->location_type} = array();
|
|
}
|
|
$rates[ $location->tax_rate_id ]->{$location->location_type}[] = $location->location_code;
|
|
}
|
|
|
|
// Localize and enqueue our js.
|
|
wp_register_script( 'htmlSettingsTaxLocalizeScript', WC()->plugin_url() . '/assets/js/admin/settings_views_html-settings-tax.js', array( 'jquery', 'wp-util' ), WC_VERSION );
|
|
wp_localize_script( 'htmlSettingsTaxLocalizeScript', 'htmlSettingsTaxLocalizeScript', array(
|
|
'current_class' => $current_class,
|
|
'rates' => $rates,
|
|
'page' => $page,
|
|
'limit' => $limit,
|
|
'strings' => array(
|
|
|
|
),
|
|
) );
|
|
wp_enqueue_script( 'htmlSettingsTaxLocalizeScript' );
|
|
|
|
?>
|
|
<h3><?php printf( __( 'Tax Rates for the "%s" Class', 'woocommerce' ), $current_class ? esc_html( $current_class ) : __( 'Standard', 'woocommerce' ) ); ?></h3>
|
|
<p><?php printf( __( 'Define tax rates for countries and states below. <a href="%s">See here</a> for available alpha-2 country codes.', 'woocommerce' ), 'http://en.wikipedia.org/wiki/ISO_3166-1#Current_codes' ); ?></p>
|
|
<table class="wc_tax_rates wc_input_table sortable widefat">
|
|
<thead>
|
|
<tr>
|
|
<th class="sort"> </th>
|
|
<th width="8%"><?php _e( 'Country Code', 'woocommerce' ); ?> <span class="tips" data-tip="<?php esc_attr_e('A 2 digit country code, e.g. US. Leave blank to apply to all.', 'woocommerce'); ?>">[?]</span></th>
|
|
<th width="8%"><?php _e( 'State Code', 'woocommerce' ); ?> <span class="tips" data-tip="<?php esc_attr_e('A 2 digit state code, e.g. AL. Leave blank to apply to all.', 'woocommerce'); ?>">[?]</span></th>
|
|
<th><?php _e( 'ZIP/Postcode', 'woocommerce' ); ?> <span class="tips" data-tip="<?php esc_attr_e('Postcode for this rule. Semi-colon (;) separate multiple values. Leave blank to apply to all areas. Wildcards (*) can be used. Ranges for numeric postcodes (e.g. 12345-12350) will be expanded into individual postcodes.', 'woocommerce'); ?>">[?]</span></th>
|
|
<th><?php _e( 'City', 'woocommerce' ); ?> <span class="tips" data-tip="<?php esc_attr_e('Cities for this rule. Semi-colon (;) separate multiple values. Leave blank to apply to all cities.', 'woocommerce'); ?>">[?]</span></th>
|
|
<th width="8%"><?php _e( 'Rate %', 'woocommerce' ); ?> <span class="tips" data-tip="<?php esc_attr_e( 'Enter a tax rate (percentage) to 4 decimal places.', 'woocommerce' ); ?>">[?]</span></th>
|
|
<th width="8%"><?php _e( 'Tax Name', 'woocommerce' ); ?> <span class="tips" data-tip="<?php esc_attr_e('Enter a name for this tax rate.', 'woocommerce'); ?>">[?]</span></th>
|
|
<th width="8%"><?php _e( 'Priority', 'woocommerce' ); ?> <span class="tips" data-tip="<?php esc_attr_e('Choose a priority for this tax rate. Only 1 matching rate per priority will be used. To define multiple tax rates for a single area you need to specify a different priority per rate.', 'woocommerce'); ?>">[?]</span></th>
|
|
<th width="8%"><?php _e( 'Compound', 'woocommerce' ); ?> <span class="tips" data-tip="<?php esc_attr_e('Choose whether or not this is a compound rate. Compound tax rates are applied on top of other tax rates.', 'woocommerce'); ?>">[?]</span></th>
|
|
<th width="8%"><?php _e( 'Shipping', 'woocommerce' ); ?> <span class="tips" data-tip="<?php esc_attr_e('Choose whether or not this tax rate also gets applied to shipping.', 'woocommerce'); ?>">[?]</span></th>
|
|
</tr>
|
|
</thead>
|
|
<tfoot>
|
|
<tr>
|
|
<th colspan="10">
|
|
<a href="#" class="button plus insert"><?php _e( 'Insert row', 'woocommerce' ); ?></a>
|
|
<a href="#" class="button minus remove_tax_rates"><?php _e( 'Remove selected row(s)', 'woocommerce' ); ?></a>
|
|
<div class="pagination">
|
|
<?php
|
|
echo str_replace( 'page-numbers', 'page-numbers button', paginate_links( array(
|
|
'base' => esc_url_raw( add_query_arg( 'p', '%#%', remove_query_arg( 'p' ) ) ),
|
|
'format' => '',
|
|
'add_args' => '',
|
|
'type' => 'plain',
|
|
'prev_text' => '«',
|
|
'next_text' => '»',
|
|
'current' => $page,
|
|
'total' => ceil( absint( $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(tax_rate_id) FROM {$wpdb->prefix}woocommerce_tax_rates WHERE tax_rate_class = %s;", sanitize_title( $current_class ) ) ) ) / $limit )
|
|
) ) );
|
|
?>
|
|
</div>
|
|
|
|
<a href="#" download="tax_rates.csv" class="button export"><?php _e( 'Export CSV', 'woocommerce' ); ?></a>
|
|
<a href="<?php echo admin_url( 'admin.php?import=woocommerce_tax_rate_csv' ); ?>" class="button import"><?php _e( 'Import CSV', 'woocommerce' ); ?></a>
|
|
</th>
|
|
</tr>
|
|
</tfoot>
|
|
<tbody id="rates">
|
|
</tbody>
|
|
</table>
|
|
|
|
<script type="text/html" id="tmpl-wc-tax-table-row">
|
|
<tr class="tips" data-tip="<?php echo esc_attr( sprintf( __( 'Tax rate ID: %s', 'woocommerce' ), '{{ data.tax_rate_id }}' ) ); ?>">
|
|
<td class="sort">
|
|
<# if ( ! data.new ) { #>
|
|
<input type="hidden" class="remove_tax_rate" name="remove_tax_rate[{{ data.tax_rate_id }}]" value="0" />
|
|
<# } #>
|
|
</td>
|
|
|
|
<td class="country">
|
|
<input type="text" value="{{ data.tax_rate_country }}" placeholder="*" name="tax_rate_country[{{ data.tax_rate_id }}]" class="wc_input_country_iso" />
|
|
</td>
|
|
|
|
<td class="state">
|
|
<input type="text" value="{{ data.tax_rate_state }}" placeholder="*" name="tax_rate_state[{{ data.tax_rate_id }}]" />
|
|
</td>
|
|
|
|
<td class="postcode">
|
|
<input type="text" value="<# if ( data.postcode ) print( data.postcode.join( '; ' ) ); #>" placeholder="*" data-name="tax_rate_postcode[{{ data.tax_rate_id }}]" />
|
|
</td>
|
|
|
|
<td class="city">
|
|
<input type="text" value="<# if ( data.city ) print( data.city.join( '; ' ) ); #>" placeholder="*" data-name="tax_rate_city[{{ data.tax_rate_id }}]" />
|
|
</td>
|
|
|
|
<td class="rate">
|
|
<input type="number" step="any" min="0" value="{{ data.tax_rate }}" placeholder="0" name="tax_rate[{{ data.tax_rate_id }}]" />
|
|
</td>
|
|
|
|
<td class="name">
|
|
<input type="text" value="{{ data.tax_rate_name }}" name="tax_rate_name[{{ data.tax_rate_id }}]" />
|
|
</td>
|
|
|
|
<td class="priority">
|
|
<input type="number" step="1" min="1" value="{{ data.tax_rate_priority }}" name="tax_rate_priority[{{ data.tax_rate_id }}]" />
|
|
</td>
|
|
|
|
<td class="compound">
|
|
<input type="checkbox" class="checkbox" name="tax_rate_compound[{{ data.tax_rate_id }}]" <# if ( 1 === data.tax_rate_compound ) { #> checked="checked" <# } #> />
|
|
</td>
|
|
|
|
<td class="apply_to_shipping">
|
|
<input type="checkbox" class="checkbox" name="tax_rate_shipping[{{ data.tax_rate_id }}]" <# if ( 1 === data.tax_rate_shipping ) { #> checked="checked" <# } #> />
|
|
</td>
|
|
</tr>
|
|
</script>
|
|
|
|
<script type="text/javascript">
|
|
jQuery( function() {
|
|
jQuery('.wc_tax_rates .remove_tax_rates').click(function() {
|
|
var $tbody = jQuery('.wc_tax_rates').find('tbody');
|
|
if ( $tbody.find('tr.current').size() > 0 ) {
|
|
$current = $tbody.find('tr.current');
|
|
$current.find('input').val('');
|
|
$current.find('input.remove_tax_rate').val('1');
|
|
|
|
$current.each(function(){
|
|
if ( jQuery(this).is('.new') )
|
|
jQuery(this).remove();
|
|
else
|
|
jQuery(this).hide();
|
|
});
|
|
} else {
|
|
alert('<?php echo esc_js( __( 'No row(s) selected', 'woocommerce' ) ); ?>');
|
|
}
|
|
return false;
|
|
});
|
|
|
|
jQuery('.wc_tax_rates .export').click(function() {
|
|
|
|
var csv_data = "data:application/csv;charset=utf-8,<?php echo esc_js( implode( ',', array(
|
|
__( 'Country Code', 'woocommerce' ),
|
|
__( 'State Code', 'woocommerce' ),
|
|
__( 'ZIP/Postcode', 'woocommerce' ),
|
|
__( 'City', 'woocommerce' ),
|
|
__( 'Rate %', 'woocommerce' ),
|
|
__( 'Tax Name', 'woocommerce' ),
|
|
__( 'Priority', 'woocommerce' ),
|
|
__( 'Compound', 'woocommerce' ),
|
|
__( 'Shipping', 'woocommerce' ),
|
|
__( 'Tax Class', 'woocommerce' ),
|
|
) ) ); ?>\n";
|
|
|
|
jQuery('#rates tr:visible').each(function() {
|
|
var row = '';
|
|
jQuery(this).find('td:not(.sort) input').each(function() {
|
|
|
|
if ( jQuery(this).is('.checkbox') ) {
|
|
|
|
if ( jQuery(this).is(':checked') ) {
|
|
val = 1;
|
|
} else {
|
|
val = 0;
|
|
}
|
|
|
|
} else {
|
|
|
|
var val = jQuery(this).val();
|
|
|
|
if ( ! val )
|
|
val = jQuery(this).attr('placeholder');
|
|
}
|
|
|
|
row = row + val + ',';
|
|
});
|
|
row = row + '<?php echo $current_class; ?>';
|
|
//row.substring( 0, row.length - 1 );
|
|
csv_data = csv_data + row + "\n";
|
|
});
|
|
|
|
jQuery(this).attr( 'href', encodeURI( csv_data ) );
|
|
|
|
return true;
|
|
});
|
|
|
|
jQuery('.wc_tax_rates .insert').click(function() {
|
|
var $tbody = jQuery('.wc_tax_rates').find('tbody');
|
|
var size = $tbody.find('tr').size();
|
|
var code = wp.template( 'wc-tax-table-row' )( {
|
|
tax_rate_id : 'new-' + size,
|
|
tax_rate_priority : 1,
|
|
tax_rate_shipping : 1,
|
|
new : true
|
|
} );
|
|
|
|
if ( $tbody.find('tr.current').size() > 0 ) {
|
|
$tbody.find('tr.current').after( code );
|
|
} else {
|
|
$tbody.append( code );
|
|
}
|
|
|
|
jQuery( "td.country input" ).autocomplete({
|
|
source: availableCountries,
|
|
minLength: 3
|
|
});
|
|
|
|
jQuery( "td.state input" ).autocomplete({
|
|
source: availableStates,
|
|
minLength: 3
|
|
});
|
|
|
|
return false;
|
|
});
|
|
|
|
jQuery('.wc_tax_rates td.postcode, .wc_tax_rates td.city').find('input').change(function() {
|
|
jQuery(this).attr( 'name', jQuery(this).attr( 'data-name' ) );
|
|
});
|
|
|
|
var availableCountries = [<?php
|
|
$countries = array();
|
|
foreach ( WC()->countries->get_allowed_countries() as $value => $label )
|
|
$countries[] = '{ label: "' . esc_attr( $label ) . '", value: "' . $value . '" }';
|
|
echo implode( ', ', $countries );
|
|
?>];
|
|
|
|
var availableStates = [<?php
|
|
$countries = array();
|
|
foreach ( WC()->countries->get_allowed_country_states() as $value => $label )
|
|
foreach ( $label as $code => $state )
|
|
$countries[] = '{ label: "' . esc_attr( $state ) . '", value: "' . $code . '" }';
|
|
echo implode( ', ', $countries );
|
|
?>];
|
|
|
|
jQuery( "td.country input" ).autocomplete({
|
|
source: availableCountries,
|
|
minLength: 3
|
|
});
|
|
|
|
jQuery( "td.state input" ).autocomplete({
|
|
source: availableStates,
|
|
minLength: 3
|
|
});
|
|
});
|
|
</script>
|