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 );
}