oont-contents/plugins/webappick-product-feed-for-woocommerce/V5/Tax/CustomTax.php
2025-03-31 21:42:48 +02:00

123 lines
4.4 KiB
PHP

<?php
namespace CTXFeed\V5\Tax;
use CTXFeed\V5\Utility\Cache;
use WC_Tax;
use CTXFeed\V5\Utility\Settings;
class CustomTax implements TaxInterface {
private $product;
private $config;
public function __construct( $product, $config ) {
$this->product = $product;
$this->config = $config;
}
public function get_tax() {
$taxes = $this->get_taxes();
return $taxes[0];
}
public function get_taxes() {
$taxes = Cache::get( 'ctx_feed_tax_info' );
if ( ! $taxes ) {
$all_tax_rates = [];
// Retrieve all tax classes.
$tax_classes = WC_Tax::get_tax_classes();
// Make sure "Standard rate" (empty class name) is present.
if ( ! in_array( '', $tax_classes, true ) ) {
array_unshift( $tax_classes, '' );
}
// For each tax class, get all rates.
if ( ! empty( $tax_classes ) ) {
foreach ( $tax_classes as $tax_class ) {
$taxes = WC_Tax::get_rates_for_tax_class( $tax_class );
if ( ! empty( $taxes ) ) {
foreach ( $taxes as $key => $tax ) {
$tax_class_name = ( '' === $tax_class ) ? 'standard-rate' : $tax->tax_rate_class;
$all_tax_rates [ $tax_class_name ][ $key ]['id'] = $tax->tax_rate_id;
$all_tax_rates [ $tax_class_name ][ $key ]['country'] = $tax->tax_rate_country;
$all_tax_rates [ $tax_class_name ][ $key ]['state'] = $tax->tax_rate_state;
$all_tax_rates [ $tax_class_name ][ $key ]['postcode'] = isset( $tax->postcode ) ? is_array( $tax->postcode ) ? implode( ',', $tax->postcode ) : $tax->postcode : '';
$all_tax_rates [ $tax_class_name ][ $key ]['postcode_count'] = $tax->postcode_count;
$all_tax_rates [ $tax_class_name ][ $key ]['city'] = isset( $tax->city ) ? is_array( $tax->city ) ? implode( ',', $tax->city ) : $tax->city : '';
$all_tax_rates [ $tax_class_name ][ $key ]['city_count '] = $tax->city_count;
$all_tax_rates [ $tax_class_name ][ $key ]['rate'] = number_format( $tax->tax_rate, 2 );
$all_tax_rates [ $tax_class_name ][ $key ]['name'] = $tax->tax_rate_name;
$all_tax_rates [ $tax_class_name ][ $key ]['shipping'] = $tax->tax_rate_shipping;
$all_tax_rates [ $tax_class_name ][ $key ]['priority'] = $tax->tax_rate_priority;
}
}
}
}
$taxes = ! empty( $all_tax_rates ) ? $all_tax_rates : false;
Cache::set( 'ctx_feed_tax_info', $taxes );
}
return $taxes;
}
public function merchant_formatted_tax($key) {
$all_taxes = $this->get_taxes();
$taxClass = empty( $this->product->get_tax_class() ) ? 'standard-rate' : $this->product->get_tax_class();
$feedType = $this->config->get_feed_file_type();
$str = "";
$allow_all_country = Settings::get( 'allow_all_shipping' );
$tax_country = $this->config->get_tax_country();
$feed_country = $this->config->get_feed_country();
if ( $all_taxes && isset( $all_taxes[ $taxClass ] ) && ! empty( $all_taxes[ $taxClass ] ) ) {
$taxes = array_values( $all_taxes[ $taxClass ] );
foreach ( $taxes as $k=>$tax ) {
if ( $tax_country != "" ) {
if ( $tax_country == 'feed' ) {
$allow_all_country = 'no';
}
if ( $tax_country == 'all' ) {
$allow_all_country = 'yes';
}
}
if ( $feed_country !== $tax['country'] && $allow_all_country == 'no') {
unset( $taxes[ $k ] );
}
}
if ( "xml" === $feedType ) {
$i = 1;
foreach ( $taxes as $tax ) {
$country = htmlentities( $tax['country'], ENT_XML1 | ENT_QUOTES, 'UTF-8' );
$state = htmlentities( $tax['state'], ENT_XML1 | ENT_QUOTES, 'UTF-8' );
$rate = htmlentities( $tax['rate'], ENT_XML1 | ENT_QUOTES, 'UTF-8' );
$shipping = ( $tax['shipping'] ) ? "yes" : "no";
$str .= ( $i > 1 ) ? PHP_EOL . "<g:tax>" : PHP_EOL;
$str .= PHP_EOL . "<g:country>$country</g:country>";
$str .= PHP_EOL . "<g:region>$state</g:region>";
$str .= PHP_EOL . "<g:rate>$rate</g:rate>";
$str .= PHP_EOL . "<g:tax_ship>$shipping</g:tax_ship>";
$str .= ( $i !== count( $taxes ) ) ? PHP_EOL . "</g:tax>" : PHP_EOL;
$i ++;
}
} else if ( $key !== '' && isset( $taxes[ $key ] ) ) {
$shipping = ( $taxes[ $key ]['shipping'] ) ? "yes" : "no";
$str = $taxes[ $key ]['country'] . ":" . $taxes[ $key ]['state'] . ":" . $taxes[ $key ]['rate'] . ":" . $shipping;
}
}
return $str;
}
}