/**
  * Get purchase_list
  * Get a list of products that needs to be delivered and are not in stock
  *
  * @access public
  * @return array $products
  */
 public function get_purchase_list()
 {
     $delivery_items = \Skeleton\Package\Delivery\Item::get_undelivered();
     $to_deliver = [];
     foreach ($delivery_items as $delivery_item) {
         if (!isset($to_deliver[$delivery_item->deliverable_object_classname . '-' . $delivery_item->deliverable_object_id])) {
             $to_deliver[$delivery_item->deliverable_object_classname . '-' . $delivery_item->deliverable_object_id] = 0;
         }
         $to_deliver[$delivery_item->deliverable_object_classname . '-' . $delivery_item->deliverable_object_id]++;
     }
     foreach ($this->get_backorder() as $purchase_order_item) {
         $product = $purchase_order_item->get_stock_object();
         if (!isset($to_deliver[get_class($product) . '-' . $product->id])) {
             continue;
         }
         $backordered = $purchase_order_item->amount - $purchase_order_item->delivered;
         $to_deliver[get_class($product) . '-' . $product->id] -= $backordered;
         if ($to_deliver[get_class($product) . '-' . $product->id] < 0) {
             unset($to_deliver[get_class($product) . '-' . $product->id]);
         }
     }
     $purchase_list = [];
     foreach ($to_deliver as $key => $count) {
         list($classname, $id) = explode('-', $key);
         $class = $classname::get_by_id($id);
         $supplier = self::get_for_object($class);
         if ($supplier === null) {
             continue;
         }
         if ($supplier->id != $this->id) {
             continue;
         }
         $stock = Stock::get($class);
         if ($stock > $count) {
             continue;
         }
         $to_deliver_count = $count - $stock;
         for ($i = 1; $i <= $to_deliver_count; $i++) {
             $purchase_list[] = $class;
         }
     }
     return $purchase_list;
 }