7

I'm creating Woocommerce totals 'on-the-fly' as my cart items are imported from another CMS.

Currently I am having trouble setting a custom 'fee' for each order, then marking the order as 'on-hold':

                $order->set_date_created($creation_tsz);

                $order->set_address( $address, 'billing' );
                $order->set_address( $address, 'shipping' );
                $order->set_currency('GBP');

                $order->add_fee('Imported Total', $imported_total_here);
                $order->set_fee();

                $order->calculate_totals();

                $order->update_status('on-hold');

Any track on this will be appreciated.

LoicTheAztec
  • 229,944
  • 23
  • 356
  • 399
Callum
  • 554
  • 2
  • 7
  • 18
  • What kind of problem, give us the error you get. And code of set_fee function. – amedv Dec 04 '18 at 00:32
  • ah, is set_fee not a standard function? perhaps thats where i was led astray. for the moment i add_fee and calculate the totals, but when i view the order 0.00 is present for both the fee and total. so order = 0.00 – Callum Dec 04 '18 at 01:47

1 Answers1

16

The WC_Abstract_Legacy_Order method add_fee() is deprecated and set_fee() method doesn't exist for the WC_Order Class (exist only for WC_Cart and WC_API_Orders classes).

To add a Fee to an order programmatically since Woocommerce 3, it's a bit more complicated. There are some parameters to set as the Fee name, the tax status, the tax class (if needed) and the fee amount (excl. taxes).

Also to make the tax calculations, depending on the taxes settings, you will need to set an array containing at minima the customer country code (if the taxes are based on the country)

Let say that the fee amount variable name is $imported_total_fee in the code below:

$order->set_date_created($creation_tsz);

$order->set_address( $address, 'billing' );
$order->set_address( $address, 'shipping' );
$order->set_currency('GBP');

## ------------- ADD FEE PROCESS ---------------- ##

// Get the customer country code
$country_code = $order->get_shipping_country();

// Set the array for tax calculations
$calculate_tax_for = array(
    'country' => $country_code, 
    'state' => '', 
    'postcode' => '', 
    'city' => ''
);

// Get a new instance of the WC_Order_Item_Fee Object
$item_fee = new WC_Order_Item_Fee();

$item_fee->set_name( "Fee" ); // Generic fee name
$item_fee->set_amount( $imported_total_fee ); // Fee amount
$item_fee->set_tax_class( '' ); // default for ''
$item_fee->set_tax_status( 'taxable' ); // or 'none'
$item_fee->set_total( $imported_total_fee ); // Fee amount

// Calculating Fee taxes
$item_fee->calculate_taxes( $calculate_tax_for );

// Add Fee item to the order
$order->add_item( $item_fee );

## ----------------------------------------------- ##

$order->calculate_totals();

$order->update_status('on-hold');

$order->save();

Tested and perfectly works.

LoicTheAztec
  • 229,944
  • 23
  • 356
  • 399
  • 1
    Where will this code be added? I'm working on similar project where i need to add a processing fee dynamically on order created manually... – Kolawole Emmanuel Izzy Mar 12 '20 at 23:12
  • @LoicTheAztec Solution not working with negative value. Actually, I want to add discount on order object. is there any way to add negative fees and non-taxable fees. – Vasim Shaikh May 09 '22 at 14:15