HEX
Server: Microsoft-IIS/8.5
System: Windows NT YDAWBH120 6.3 build 9600 (Windows Server 2012 R2 Standard Edition) AMD64
User: tentjecom_web (0)
PHP: 7.4.14
Disabled: NONE
Upload Files
File: D:/HostingSpaces/Velosophe/dev.abloc.cc/wwwroot/app/plugins/universal_nonshipping/functions.php
<?php

defined( 'ABSPATH' ) or die( 'Not Allowed.' );

if( !function_exists( 'pr' ) ) {
    function pr( $e ) {
        echo "<pre>";
        print_r( $e );
        echo "</pre>";
    }
}

if( !function_exists( 'vd' ) ) {
    function vd( $e ) {
        echo "<pre>";
        var_dump( $e );
        echo "</pre>";
    }
}

if (!function_exists('jl')) {
    function jl( $e, $loc = __DIR__, $file_name = '', $raw_log = false ) {
        $raw_log = $raw_log === true;
        if( !is_dir( $loc ) ) $loc = __DIR__;
        if( !$file_name ) {
            $file_name = 'log' . ( !$raw_log ? '.json' : '' ) ;
        }
        $log_data = $raw_log ? print_r( $e, true ) : @json_encode( $e, JSON_PRETTY_PRINT );
        @error_log( $log_data . "\n\n", 3, $loc . "/{$file_name}" );
    }
}

if (!function_exists('lg')) {
    function lg( $e, $loc = __DIR__, $file_name = '' ) {
        jl( $e, $loc, $file_name, true );
    }
}

function fietskoeriers_make_dabba_data( $order, $get_errors = false ) {
	$errors = array();
	$deliveryType = 1; // static data
	$product = 1; // default value
	// address
	{
		$billing_addr = $order->get_address();
		$addr = $order->get_address( 'shipping' );
		$company = $addr[ 'company' ];
		$name = $order->get_formatted_shipping_full_name();
		if( empty( $name ) ) $errors[] = __( 'Name is empty.', 'wcfks' );
		if( $name && $company ) {
			$name = $company . " t.a.v. " . $name;
		}
		$street = $addr[ 'address_1' ];
		// get the nr
		{
			preg_match('/(\W\d.*)/', $street, $nr_matches);
			$nr = trim( (string) $nr_matches[ 0 ] );
			if( strlen( $nr ) > 20 ) $nr = substr( $nr, -20 );
			$street = trim( str_replace( $nr, '', $street ) );
			if( strlen($street) > 100 ) $errors[] = __( 'Street and/or Number are too long for Dabba API. Please fix and resend.', 'wcfks' );
			if( empty( $nr ) ) $errors[] = __( 'nr is empty.', 'wcfks' );
		}
		if( empty( $street ) ) $errors[] = __( 'street is empty.', 'wcfks' );
		$postalCode = $addr[ 'postcode' ];
		if( empty( $postalCode ) ) $errors[] = __( 'postalCode is empty.', 'wcfks' );
		$city = $addr[ 'city' ];
		if( empty( $city ) ) $errors[] = __( 'city is empty.', 'wcfks' );
		$country = $addr[ 'country' ];
		if( empty( $country ) ) $errors[] = __( 'country is empty.', 'wcfks' );
		$phone = $billing_addr[ 'phone' ];
		if( empty( $phone ) ) $errors[] = __( 'phone is empty.', 'wcfks' );
		$email = $billing_addr[ 'email' ];
		if( empty( $email ) ) $errors[] = __( 'email is empty.', 'wcfks' );
		
		$address = array(
			'name' => $name,
			'street' => $street,
			'nr' => $nr,
			'postalCode' => $postalCode,
			'city' => $city,
			'country' => $country,
			'phone' => $phone,
			'email' => $email,
		);
	}
	$quantity = 1; // static data to test
	$dabba_data = array(
		'order' => array(
			'deliveryType' => $deliveryType,
			'product' => $product,
			'address' => $address,
			'quantity' => $quantity,
			'comment' => "WC {$order->id}",
		),
	);
	
	if( $customer_address = fietskoeriers_get_customer_address( true ) ) $dabba_data[ 'order' ][ 'customerAddress' ] = $customer_address;
	
	if( $get_errors === true ) return $errors;
	return $dabba_data;
}

function fietskoeriers_get_box_qtys( $order ) {
	$box_qtys = get_post_meta( $order->id, '_dabba_box_qtys', true );
	if( is_array( $box_qtys ) && !empty( $box_qtys )  ) return $box_qtys;
	$fietskoeriers_api_setup = fietskoeriers_get_api_setup();
	// default values
	$box_qtys = array(
		1 => array(
			'delivery_type' => 1,
			'qty' => 1
		),
		2 => array(
			'delivery_type' => 1,
			'qty' => 0
		),
		3 => array(
			'delivery_type' => 1,
			'qty' => 0
		)
	);
	if( 'yes' === $fietskoeriers_api_setup[ 'enable' ] ) {
		$box_qtys = array();
		for( $i = 1; $i <= 3; $i++ ) {
			if( $i == $fietskoeriers_api_setup[ 'box_type' ] ) {
				$box_qtys[ $i ] = array(
					'delivery_type'	=>	(int) $fietskoeriers_api_setup[ 'delivery_type' ],
					'qty'			=>	(int) $fietskoeriers_api_setup[ 'quantity' ],
				);
				continue;
			}
			$box_qtys[ $i ] = array(
				'delivery_type'	=>	1,
				'qty'			=>	0
			);
		}
	}
	return $box_qtys;
	
	$order_items = $order->get_items();
	foreach( $order_items as $order_item ) {
		// get the associated product
		$product_id = $order_item[ 'product_id' ];
		
		// get the order item quantity
		$qty = $order_item[ 'qty' ];
		
		// get the dabba type and max qty for the product
		{
			$_dabba_box_type = get_post_meta( $product_id, '_dabba_box_type', true );
			if( !in_array( $_dabba_box_type, array( 1, 2, 3 ) ) ) $_dabba_box_type = 1;
			$_dabba_product_quantity = (int) get_post_meta( $product_id, '_dabba_product_quantity', true );
			if( !$_dabba_product_quantity ) $_dabba_product_quantity = 1;
		}
		
		$_dabba_qty = ceil( $qty / $_dabba_product_quantity );
		$box_qtys[ $_dabba_box_type ] += $_dabba_qty;
	}
	
	return $box_qtys;
}

function fietskoeriers_get_dabba_instance() {
    global $Dabba;
    if( is_a( $Dabba, 'Dabba' ) ) return $Dabba;

	// include class if not there
	if( !class_exists( 'Dabba' ) ) require_once __DIR__ . '/dabba.class.php';
	
	$dabba_api_email = get_option( 'fietskoeriers_dabba_api_email' );
	$dabba_api_password = get_option( 'fietskoeriers_dabba_api_password' );
	
	if( empty( $dabba_api_email ) || empty( $dabba_api_password ) ) return;
	$Dabba = new Dabba( $dabba_api_email, $dabba_api_password );
	return $Dabba;
}

function fietskoeriers_call_dabba_api( $order ) {
	// make order object
	if( is_numeric( $order ) ) $order = wc_get_order( $order );
	
	// save meta
	update_post_meta( $order->id, '_dabba_call_initiated', 1 );
	
	// get dabba instance
	if( !$dabba = fietskoeriers_get_dabba_instance() ) {
		$order->add_order_note( __( 'Dabba API: Unable to get Dabba instance, Please make sure you have saved the dabba api credentials in settings.', 'wcfks' ) );
		return;
	}
	
	// get the boxes and qtys
	$box_qtys = fietskoeriers_get_box_qtys( $order );
	
	// make dabba data
	$dabba_data = fietskoeriers_make_dabba_data( $order );
	
	// add order note
	$order->add_order_note( __( 'Dabba API: Initiated', 'wcfks' ) );
	
	//reset the dabba api errors if previously set
	delete_post_meta( $order->id, '_dabba_api_errors' );
	
	// call dabba api for all orders
	{
		$dabba_order_ids = array();
		$dabba_error_msgs = array();
		foreach( $box_qtys as $box_type => $box_qty_arr ) {
			$box_qty = $box_qty_arr[ 'qty' ];
			$deliveryType = $box_qty_arr[ 'delivery_type' ];
			if( !$box_qty ) continue;
			$dabba_data[ 'order' ][ 'product' ] = $box_type;
			$dabba_data[ 'order' ][ 'quantity' ] = $box_qty;
			$dabba_data[ 'order' ][ 'deliveryType' ] = $deliveryType;
			// call dabba create order api
			$create_order_response = (array) $dabba->createOrder( $dabba_data );
			if( isset( $create_order_response[ 'id' ] ) ) {
				// order is completed and add note for it
				$order_id = $create_order_response[ 'id' ];
				$dabba_order_ids[] = $order_id;
				$order->add_order_note( sprintf( __( 'Dabba API: Success - OrderID: %s', 'wcfks' ), $order_id ) );
			} else {
				$error = isset( $create_order_response[ 'error' ] ) ? $create_order_response[ 'error' ] : __( 'Something went wrong, Please try again.', 'wcfks' );
				$dabba_error_msgs[] = $error;
				$order->add_order_note( 'Dabba API: Error - ' . $error );
				jl( $dabba_data, __DIR__, 'dabba_api_log', true );
				// add note with link to log file
				{
					$link = untrailingslashit( plugin_dir_url( __FILE__ ) ) . '/dabba_api_log';
					$order->add_order_note( sprintf( __( 'Dabba API: <a target="_blank" href="%s">Error Log File</a>', 'wcfks' ), $link ) );
				}
			}
		}
		if( !empty( $dabba_order_ids ) ) {
			update_post_meta( $order->id, '_dabba_order_ids', $dabba_order_ids );
			fietskoeriers_save_dabba_labels( $order->id );
			fietskoeriers_save_dabba_trace_codes( $order->id );
		}
		if( !empty( $dabba_error_msgs ) ) update_post_meta( $order->id, '_dabba_api_errors', $dabba_error_msgs );
	}
}

function fietskoeriers_labels_dir( $order_id, $get_url = false ) {
	if( !is_numeric( $order_id ) ) return;
	
	$wp_upload_dir = wp_upload_dir();
	
	$labels_dir = untrailingslashit( $wp_upload_dir[ 'basedir' ] ) . "/dabba_api_labels";
	if( !is_dir( $labels_dir ) ) mkdir( $labels_dir );
	$labels_dir = $labels_dir . "/{$order_id}";
	if( !is_dir( $labels_dir ) ) mkdir( $labels_dir );
	
	if( $get_url === true ) $labels_dir = untrailingslashit( $wp_upload_dir[ 'baseurl' ] ) . "/dabba_api_labels/{$order_id}";
	return $labels_dir;
}

function fietskoeriers_save_dabba_labels( $order_id ) {
	$dabba_order_ids = get_post_meta( $order_id, '_dabba_order_ids', true );
	$has_dabba_order_ids = is_array( $dabba_order_ids ) && !empty( $dabba_order_ids );
	if( !$has_dabba_order_ids || !$dabba = fietskoeriers_get_dabba_instance() ) return;
	
	// make upload paths and urls
	{
		$labels_dir = fietskoeriers_labels_dir( $order_id );
		$labels_dir_url = fietskoeriers_labels_dir( $order_id, true );
	}
	
	// array to save labels urls
	$dabba_label_urls = array();
	// save labels for OrderIds
	foreach( $dabba_order_ids as $dabba_order_id ) {
		$label = $dabba->getLabel( $dabba_order_id );
		if( !$label ) continue;
		// save label url to array
		{
			$label_file_url = $labels_dir_url . "/" . $dabba_order_id . ".pdf";
			$dabba_label_urls[] = $label_file_url;
		}
		// save label to file as pdf
		{
			$label_file_path = $labels_dir . "/" . $dabba_order_id . ".pdf";
			$h = fopen( $label_file_path, 'w' );
			fwrite( $h, $label );
			fclose( $h );
		}
	}
	if( !empty( $dabba_label_urls ) ) update_post_meta( $order_id, '_dabba_label_urls', $dabba_label_urls );
}

function fietskoeriers_save_dabba_trace_codes( $order_id ) {
	$dabba_order_ids = get_post_meta( $order_id, '_dabba_order_ids', true );
	$has_dabba_order_ids = is_array( $dabba_order_ids ) && !empty( $dabba_order_ids );
	if( !$has_dabba_order_ids || !$dabba = fietskoeriers_get_dabba_instance() ) return;
	
	// array to save track codes
	$dabba_track_codes = array();
	$dabba_track_urls = array();
	// save track codes and urls for OrderIds
	foreach( $dabba_order_ids as $dabba_order_id ) {
		$dabba_order = $dabba->getOrder( $dabba_order_id );
		if( !$dabba_order ) continue;
		$dabba_order = (array) $dabba_order[ 'order' ];
		// save track code to array
		{
			$trackTrace = $dabba_order[ 'trackTrace' ];
			$dabba_track_codes[ $dabba_order_id ] = $trackTrace;
		}
		
		// save track url to array
		{
			$postalCode = $dabba_order[ 'address' ][ 'postalCode' ];
			$dabba_track_urls[ $dabba_order_id ] = sprintf( 'https://www.fietskoeriers.nl/trackandtrace?code=%s&zip=%s', $trackTrace, $postalCode );
		}
	}
	if( !empty( $dabba_track_codes ) ) update_post_meta( $order_id, '_dabba_track_codes', $dabba_track_codes );
	if( !empty( $dabba_track_urls ) ) update_post_meta( $order_id, '_dabba_track_urls', $dabba_track_urls );
}

function fietskoeriers_get_customer_address( $validate = false ) {
	if( true === $validate && 'yes' !== (string) get_option( 'fietskoeriers_add_sender_to_dabba' ) ) return;
	$defaults = array_map( 'fietskoeriers_empty_string', fietskoeriers_get_customer_address_fields() );
	
	$address = apply_filters( 'fietskoeriers_customer_address', wp_parse_args( array_filter( (array) get_option( 'fietskoeriers_customer_address' ) ), $defaults ) );
	if( true === $validate ) foreach( $address as $field => $value ) if( array_key_exists( $field, $defaults ) && !$value ) return;
	return $address;
}

function fietskoeriers_get_customer_address_fields() {
	return apply_filters( 'fietskoeriers_customer_address_fields', array(
		'name'			=>	__( 'Name', 'wcfks' ),
		'street'		=>	__( 'Street', 'wcfks' ),
		'nr'			=>	__( 'House Number', 'wcfks' ),
		'postalCode'	=>	__( 'Postal Code', 'wcfks' ),
		'city'			=>	__( 'City', 'wcfks' ),
		'country'		=>	__( 'Country', 'wcfks' ),
		'phone'			=>	__( 'Phone', 'wcfks' ),
		'email'			=>	__( 'Email', 'wcfks' ),
	) );
}

function fietskoeriers_empty_string( $e ) {
	return '';
}

function fietskoeriers_get_api_setup() {
	$defaults = array(
		'enable'		=>	'no',
		'box_type'		=>	1,
		'quantity'		=>	1,
		'delivery_type'	=>	1,
	);
	$setup_option = get_option( 'fietskoeriers_api_setup' );
	return wp_parse_args( $setup_option, $defaults );
}