Create shipment programmatically
Mon Jan 10 2022 12:32:25 GMT+0000 (Coordinated Universal Time)
// First we create order items.
foreach ($lineItems as $lineItem) {
$orderItem = OrderItem::create([
'type' => 'default',
'purchased_entity' => $lineItem['variation'],
'quantity' => $lineItem['quantity'],
'unit_price' => new Price($lineItem['price'], $currency),
'overridden_unit_price' => TRUE,
]);
$orderItem->save();
$orderItems[] = $orderItem;
}
// Than we create order.
$order = Order::create([
'type' => 'default',
'mail' => $this->currentUser()->getEmail(),
'uid' => $this->currentUser()->id(),
'store_id' => 1,
'order_items' => [$orderItems[0], $orderItems[1]],
'placed' => \Drupal::time()->getCurrentTime(),
]);
$order->save();
// Than we create shipment.
if ($order->get('shipments')->count() == 0) {
$first_shipment = Shipment::create([
'type' => 'default',
'order_id' => $order->id(),
'title' => 'Shipment',
'state' => 'ready'
]);
$first_shipment->save();
}
// After that we create data for shipment item and shipment items.
foreach ($orderItems as $order_item) {
$quantity = $order_item->getQuantity();
$purchased_entity = $order_item->getPurchasedEntity();
if ($purchased_entity->get('weight')->isEmpty()) {
$weight = new Weight(1, WeightUnit::GRAM);
} else {
$weight_item = $purchased_entity->get('weight')->first();
$weight = $weight_item->toMeasurement();
}
// Creating shipment item.
$shipment_item = new ShipmentItem([
'order_item_id' => $order_item ->id(),
'title' => $purchased_entity->label(),
'quantity' => $quantity,
'weight' => $weight->multiply($quantity),
'declared_value' => $order_item->getTotalPrice(),
]);
$first_shipment->addItem($shipment_item);
}
//Than we create shipping methods and add them to shipment.
$shipping_method = ShippingMethod::create([
'stores' => 1,
'name' => $shipping_method_name,
'plugin' => [
'target_plugin_id' => 'flat_rate',
'target_plugin_configuration' => [
'rate_label' =>'Shipping GG',
'rate_amount' => [
'number' => $shipping_price, //TODO: Zameniti sa varijablom
'currency_code' => $currency
]
],
],
'status' => TRUE,
'weight' => 0,
]);
$shipping_method->save();
// Adding newly created shipment method to shipment.
$first_shipment->setShippingMethod($shipping_method);
// After that we add amount to shipment.
$shipping_method_plugin = $shipping_method->getPlugin();
$shipping_rates = $shipping_method_plugin->calculateRates($first_shipment);
$shipping_rate = reset($shipping_rates);
$shipping_service = $shipping_rate->getService()->getId();
$amount = reset($shipping_rates)->getAmount();
$first_shipment->setAmount($amount);
$first_shipment->save();
$order->set('shipments', [$first_shipment]);
$order->save();
// And finally we create shipping and billing profile.
$profile = Profile::create([
'uid' => $order->getCustomerId(),
'type' => 'customer',
]);
$profile->address->given_name = $given_name;
$profile->set('field_address_1', $name);
$profile->address->family_name = $family_name;
$profile->address->organization = $organization;
$profile->set('field_company', $organization);
$profile->address->country_code = $country_code;
$profile->set('field_new_country', $country_code);
$profile->address->locality = $locality;
$profile->set('field_city', $locality);
$profile->address->postal_code = $postal_code;
$profile->set('field_zip_code', $postal_code);
$profile->address->address_line1 = $address_line1;
$profile->set('field_address_1', $address_line1);
$profile->save();
if(empty($order->getBillingProfile())) {
$billing_profile = Profile::create([
'type' => 'customer',
'uid' => $order->getCustomerId(),
]);
$billing_profile->save();
$billing_profile->set('field_address_1', $billing_address);
$billing_profile->set('field_city', $billing_city);
$billing_profile->set('field_company', $billing_company);
$billing_profile->set('field_zip_code', $billing_zip_code);
$billing_profile->save();
$order->setBillingProfile($billing_profile);
$order->save();
}
//TODO: Add other data to profile.
$first_shipment->setShippingProfile($profile);
$first_shipment->setShippingService($shipping_service);
$first_shipment->save();
$order->set('shipments', $first_shipment);
// Including tax into price.
$priceWithTax = $order->getTotalPrice()->getNumber() + ($order->getTotalPrice()->getNumber() * $tax);
$order->set('total_price', new Price($priceWithTax, $currency));
$order->save();



Comments