Im using Gravity forms to create an WooCommerce order programmatically.
If an email added to the form already exists, it takes the shipping and billing from the users account. This works and it adds the VAT correctly.
For a user that is not logged in, they add name, email, phone and country to the form, and the user is created automatically. The order is created, and the user is added. But in this case, the AT is not added and I have to manually recalculate the order for the VAT to be added.
How do I make sure the VAT is added when a user is programmatically created as well ?
code:
add_action( 'gform_after_submission_16', 'post_to_third_party', 10, 2 );
function post_to_third_party( $entry, $form ) {
global $woocommerce;
var_dump($entry);
$product_id = rgar( $entry, '21' );
$address = array(
'first_name' => rgar( $entry, '20.3' ),
'last_name' => rgar( $entry, '20.6' ),
'email' => rgar( $entry, '10' ),
'phone' => rgar( $entry, '16' ),
'address_1' => rgar( $entry, '24.1' ),
'address_2' => rgar( $entry, '24.2' ),
'city' => rgar( $entry, '24.3' ),
'state' => rgar( $entry, '24.4' ),
'postcode' => rgar( $entry, '24.5' ),
'country' => rgar( $entry, '24.6' ),
);
$order = wc_create_order();
$order->add_product( wc_get_product($product_id), 1);
$order->set_address( $address, 'billing' );
$country = rgar( $entry, '24.6' );
$username = rgar( $entry, '20.3' );
$user_email = rgar( $entry, '10' );
$user_id = username_exists( $username );
if ( !$user_id and email_exists($user_email) == false ) {
$random_password = wp_generate_password( $length=12, $include_standard_special_chars=false );
$user_id = wp_create_user( $username, $random_password, $user_email );
} else {
$random_password = __('User already exists. Password inherited.');
$user = get_user_by( 'ID', $user_id );
$firstname = get_user_meta( $user_id, 'billing_first_name', true );
$lastname = get_user_meta( $user_id, 'billing_last_name', true );
$address_1 = get_user_meta( $user_id, 'billing_address_1', true );
$address_2 = get_user_meta( $user_id, 'billing_address_2', true );
$city = get_user_meta( $user_id, 'billing_city', true );
$postcode = get_user_meta( $user_id, 'billing_postcode', true );
$country = get_user_meta( $user_id, 'billing_country', true );
$state = get_user_meta( $user_id, 'billing_state', true );
$firstname_ship = get_user_meta( $user_id, 'shipping_first_name', true );
$lastname_ship = get_user_meta( $user_id, 'shipping_last_name', true );
$address_1_ship = get_user_meta( $user_id, 'shipping_address_1', true );
$address_2_ship = get_user_meta( $user_id, 'shipping_address_2', true );
$city__ship = get_user_meta( $user_id, 'shipping_city', true );
$postcode_ship = get_user_meta( $user_id, 'shipping_postcode', true );
$country_ship = get_user_meta( $user_id, 'shipping_country', true );
$state_ship = get_user_meta( $user_id, 'shipping_state', true );
$address2 = array(
'first_name' => $firstname,
'last_name' => $lastname,
'address_1' => $address_1,
'address_2' => $address_2,
'city' => $city,
'state' => $state,
'postcode' => $postcode,
'country' => $country,
);
$address3 = array(
'first_name' => $firstname_ship,
'last_name' => $lastname_ship,
'address_1' => $address_1_ship,
'address_2' => $address_2_ship,
'city' => $city_ship,
'state' => $state_ship,
'postcode' => $postcode_ship,
'country' => $country_ship,
);
$order->set_address( $address2, 'billing' );
$order->set_address( $address3, 'shipping' );
}
$order->set_customer_id( $user_id );
$note = rgar( $entry, '5' ); ;
$order->add_order_note( $note );
$order->set_customer_note( $note );
$emails = WC()->mailer()->get_emails();
$emails['WC_Email_Customer_New_Account']->trigger( $user_id, $random_password, true );
$order->calculate_totals();
$order->update_status('autoquote', TRUE);
$order->save();
}
Edit:
Seems like my new users are not correct created, they are missing name, phone and country. I added
wp_update_user([
'ID' => $user_id,
'first_name' => rgar( $entry, '20.3' ),
'last_name' => rgar( $entry, '20.6' ),
'phone' => rgar( $entry, '16' ),
'country' => rgar( $entry, '24.6' )
]);
after $user_id = wp_create_user( $username, $random_password, $user_email );
And this sets the name correct on the user, but is still missing phone and country.