- Posts: 62
- Thank you received: 1
Order by cronjob - including Hikmarket vendors
8 years 4 months ago #293293
by nuntius
Order by cronjob - including Hikmarket vendors was created by nuntius
-- HikaShop version -- : 3.4.0
-- HikaMarket version -- : 2.1.1
-- Joomla version -- : 3.8.8
-- PHP version -- : 7.0.30
-- Browser(s) name and version -- : Chrome latest
-- Error-message(debug-mod must be tuned on) -- : none
Hello,
I am currently building a script to create an order through a cronjob. The cronjob retrieves orders made by a client using EDI ( en.wikipedia.org/wiki/Electronic_data_interchange ).
I would like to create the least amount of custom code and use as many standardized code from Hikashop and Hikmarket itself.
Currently I have used the example code of the developers documentation using this:
In a for each edi_product loop
Then creating the order
This will create the order fine, but it will not create the sub orders of the vendors. Is there a way to use Hikashop or Hikamarket standardized code to get what needs to be done? Maybe simulating a checkout? I am able to simulate the login of the user in the cronjob if needed.
Perhaps you can steer me in the right direction. I would prefer to use as little custom code as possible for maintainability.
Thank you in advance.
Cheers,
Teeuwis
-- HikaMarket version -- : 2.1.1
-- Joomla version -- : 3.8.8
-- PHP version -- : 7.0.30
-- Browser(s) name and version -- : Chrome latest
-- Error-message(debug-mod must be tuned on) -- : none
Hello,
I am currently building a script to create an order through a cronjob. The cronjob retrieves orders made by a client using EDI ( en.wikipedia.org/wiki/Electronic_data_interchange ).
I would like to create the least amount of custom code and use as many standardized code from Hikashop and Hikmarket itself.
Currently I have used the example code of the developers documentation using this:
In a for each edi_product loop
Code:
$product = new stdClass();
$productClass = hikashop_get('class.product');
$product = $productClass->get($productRow[0]);
$product->order_product_id = $product->product_id;
$product->order_product_name = $product->product_name;
$product->order_product_code = $product->product_code;
$product->order_product_quantity = $edi_product->product_quantity;
(...)
$currencyClass->getPrices($product,$ids,$currency_id,$main_currency,$zone_id,$discount_before_tax);
$product->order_product_price = $product->prices[0]->price_value;
$fullprice += $product->order_product_quantity*$product->order_product_price;
$products[] = $product;
Code:
$order = new stdClass();
$order->order_user_id = $order_user_id;
$status = $config->get('order_created_status');
$order->order_status = $status;
(...)
$order->cart->products = $products;
$order->order_full_price = $fullprice;
$paymentClass = hikashop_get('class.payment');
$paymentClass->checkPaymentOptions($order);
$orderClass = hikashop_get('class.order');
$order->order_id = $orderClass->save($order);
This will create the order fine, but it will not create the sub orders of the vendors. Is there a way to use Hikashop or Hikamarket standardized code to get what needs to be done? Maybe simulating a checkout? I am able to simulate the login of the user in the cronjob if needed.
Perhaps you can steer me in the right direction. I would prefer to use as little custom code as possible for maintainability.
Thank you in advance.
Cheers,
Teeuwis
Please Log in or Create an account to join the conversation.
8 years 4 months ago #293298
by nicolas
Replied by nicolas on topic Order by cronjob - including Hikmarket vendors
Hi,
You don't have all the necessary data in the $order for HikaMarket to be able to handle its process properly.
the "finish" process of the checkout provides a lot more things in $order in which HikaMarket can base itself.
I would recommand to do it differently:
- first, use the "addProduct" function of class.cart to add the products to a cart:
where XX is the id of a product and YY its quantity and AA the id of another product and BB its quantity (and you can add more products as well if you want.
- second, convert the cart into an order with the "createFromCart" function of class.order:
That will do a lot more things that you didn't do with your code, it's much more simple, and it will avoid a lot of problems for you.
You don't have all the necessary data in the $order for HikaMarket to be able to handle its process properly.
the "finish" process of the checkout provides a lot more things in $order in which HikaMarket can base itself.
I would recommand to do it differently:
- first, use the "addProduct" function of class.cart to add the products to a cart:
Code:
$cartClass = hikashop_get('class.cart');
$cart_id = $cartClass->getCurrentCartId();
$cartClass->addProduct($cart_id, array(array('id'=>XX,'qty'=>YY), array('id'=>AA, 'qty'=>BB)));
- second, convert the cart into an order with the "createFromCart" function of class.order:
Code:
$orderClass = hikashop_get('class.order');
$order = $orderClass->createFromCart($cart_id);
The following user(s) said Thank You: nuntius
Please Log in or Create an account to join the conversation.
8 years 4 months ago #293489
by nuntius
Replied by nuntius on topic Order by cronjob - including Hikmarket vendors
Hi Nicolas,
Thank you for this.
When I replace my code using the code you suggested, it generates a nearly empty order. Perhaps I integrated it wrong in my code.
I also get this notice:
Notice: Undefined property: stdClass::$cart_type in /var/www/vhosts/nuntius.nl/cpgh.nuntius.nl/administrator/components/com_hikashop/classes/order.php on line 549
Thank you for this.
When I replace my code using the code you suggested, it generates a nearly empty order. Perhaps I integrated it wrong in my code.
I also get this notice:
Notice: Undefined property: stdClass::$cart_type in /var/www/vhosts/nuntius.nl/cpgh.nuntius.nl/administrator/components/com_hikashop/classes/order.php on line 549
Code:
$hikadir = $local_dir_root.'administrator'.DS.'components'.DS.'com_hikashop'.DS.'helpers'.DS.'helper.php';
if(!@include_once($hikadir)){ return false; }
$config =& hikashop_config();
$cartClass = hikashop_get('class.cart');
foreach ($edi_klant as $key => $value) {
(...)
// Here i retrieve all customer data relevant to the EDI
(...)
$query = $db->getQuery(true)
->select('id, password')
->from('#__users')
->where('username=' . $db->quote($credentials['username']));
$db->setQuery($query);
$result = $db->loadObject();
if ($result)
{
$match = JUserHelper::verifyPassword($credentials['password'], $result->password, $result->id);
if ($match === true)
{
$user = JUser::getInstance($result->id);
$loginresult = $app->login($credentials);
}
else
{
// login failed (...)
}
} else {
// Invalid user (...)
}
$product_data = array();
foreach ($edi_bestelling[$key] as $pkey => $edi_product) {
$query = $db->getQuery(true);
$query
->select(array($db->qn('product_id'),'COUNT(*)'))
->from($db->qn('#__hikashop_product'))
->where($db->qn('product_ean') . ' = '. $db->q($edi_product->product_ean))
->group('product_id');
$db->setQuery($query);
$productRow = $db->loadRow();
if(is_array($productRow)) {
if($productRow[1] == 1) {
$product_data[] = array('id' => $productRow[0], 'qty' => $edi_product->product_quantity);
} elseif($productRow[1] == 0) {
// No product found
} elseif($productRow[1] > 1) {
// No unique product for EAN
}
}
}
$cart_id = $cartClass->getCurrentCartId();
$cartClass->addProduct($cart_id, $product_data);
$orderClass = hikashop_get('class.order');
$order = $orderClass->createFromCart($cart_id);
$orderClass->save($order);
if($order) {
print "SUCCES";
print_r($order);
} else {
print "FAIL";
print_r($order);
}
$app->logout( $result->id );
Please Log in or Create an account to join the conversation.
8 years 4 months ago #293508
by Jerome
Jerome - Obsidev.com
HikaMarket & HikaSerial developer / HikaShop core dev team.
Replied by Jerome on topic Order by cronjob - including Hikmarket vendors
Hello,
Please note that Nicolas gave you the basis for an order creation via a cart.
But you will need to provide more information to the cart regarding the addresses, etc. The kind of data that your customer provide during the checkout !
Even if the HikaShop/HikaMarket support can help with the understand and usage of the components ; your request is more related to custom development. Please understand that we cannot analyze and correct your custom code for you.
I would recommend you to take a look at the HikaShop cart class and some code related to the checkout ; it should help you to see what functions you would need to provide the data.
Please also not that "getCurrentCardId" is a front-end function which will give you the cart for the current user ; you might want to use directly the cart_id for a specific user if you're running in the backend.
You might also want to take a look at the function "createOrderFromCart" if you do not want to use cart to create your orders ; but it would require some development.
Regards,
Please note that Nicolas gave you the basis for an order creation via a cart.
But you will need to provide more information to the cart regarding the addresses, etc. The kind of data that your customer provide during the checkout !
Even if the HikaShop/HikaMarket support can help with the understand and usage of the components ; your request is more related to custom development. Please understand that we cannot analyze and correct your custom code for you.
I would recommend you to take a look at the HikaShop cart class and some code related to the checkout ; it should help you to see what functions you would need to provide the data.
Please also not that "getCurrentCardId" is a front-end function which will give you the cart for the current user ; you might want to use directly the cart_id for a specific user if you're running in the backend.
You might also want to take a look at the function "createOrderFromCart" if you do not want to use cart to create your orders ; but it would require some development.
Regards,
Jerome - Obsidev.com
HikaMarket & HikaSerial developer / HikaShop core dev team.
The following user(s) said Thank You: nuntius
Please Log in or Create an account to join the conversation.
8 years 4 months ago #293881
by nuntius
Replied by nuntius on topic Order by cronjob - including Hikmarket vendors
Hello Jerome,
Thank you for your input. I've managed to develop a working cronjob now.
Just one more question, where can I find related code to custom fields for the order which the normally client fills in the front-end?
I will have to input them manually, but using the code below doesn't seem to work. Where can I find related check-out code for giving custom fields their value?
Thank you for your input. I've managed to develop a working cronjob now.
Just one more question, where can I find related code to custom fields for the order which the normally client fills in the front-end?
I will have to input them manually, but using the code below doesn't seem to work. Where can I find related check-out code for giving custom fields their value?
Code:
$order->klantreferentie = $value->referentie;
(...)
$orderClass->save($order);
Please Log in or Create an account to join the conversation.
8 years 4 months ago #293887
by nicolas
Replied by nicolas on topic Order by cronjob - including Hikmarket vendors
Hi,
That code is fine.
Either there is nothing in $value->referentie or there is some code in (...) which touch to the value in $order->klantreferentie.
That code is fine.
Either there is nothing in $value->referentie or there is some code in (...) which touch to the value in $order->klantreferentie.
The following user(s) said Thank You: nuntius
Please Log in or Create an account to join the conversation.
8 years 4 months ago - 8 years 4 months ago #293967
by nuntius
Replied by nuntius on topic Order by cronjob - including Hikmarket vendors
Nevermind. I debugged it....
And for anyone interested, here is the code.
And for anyone interested, here is the code.
Code:
$cart = new stdClass();
$cart->user_id = $order_user_id; // Logged in user
// Save an entry to DB to be able to get cart_id
$cartClass->save($cart);
$cart_id = $cartClass->getCurrentCartId('cart');
// Add all selected products at once
$cartClass->addProduct($cart_id, $product_data);
// Create basic order from cart input
$orderClass = hikashop_get('class.order');
$order = $orderClass->createFromCart($cart_id);
// Retrieve current order to update custom fields
$updateOrder = new stdClass();
$updateOrder = $orderClass->get($order->order_id);
// Custom field(s) value(s)
$updateOrder->klantreferentie = $value->referentie;
// Save order with custom field values
$orderClass->save($updateOrder);
Last edit: 8 years 4 months ago by nuntius.
Please Log in or Create an account to join the conversation.
Moderators: Obsidev
Time to create page: 0.198 seconds