function update_stock($txn_id = NULL, $phpsessionid = NULL)
{
    global $pref;
    $sqlcheck = new db();
    $trans_array = transaction($phpsessionid, 0, 0, "Completed");
    $items_array = unserialize($trans_array['all_items']);
    $count = 1;
    $temp_array = "";
    while ($items_array["db_id_" . $count]) {
        if ($sqlcheck->db_Select("easyshop_items", "*", "item_id = '" . $items_array["db_id_" . $count] . "'")) {
            while ($row = $sqlcheck->db_Fetch()) {
                if ($row['item_track_stock'] == 2) {
                    // Is this a tracked stock item?
                    if ($row['item_instock'] >= $items_array["quantity" . $count]) {
                        $newstock = $row['item_instock'] - $items_array["quantity_" . $count];
                        if ($row['item_minimum'] == 0 || $row['item_minimum'] == NULL) {
                            // Minimum level is flexible, but with bottom-level 1.
                            $minimum_level = 1;
                        } else {
                            $minimum_level = $row['item_minimum'];
                        }
                        if ($newstock <= $minimum_level && $newstock != 0) {
                            // Minimum level is reached; send e-mail alert
                            ShopMail::easyshop_sendalert($row['item_id'], $newstock, $minimum_level, 1);
                            // Alert-type = 1
                        }
                        if ($newstock == 0) {
                            $sqlcheck->db_Update("easyshop_items", "item_instock = '" . $newstock . "', item_out_of_stock = '2'\r\n\t\t\t\t\t\t\t\t\tWHERE item_id = '" . $items_array["db_id_" . $count] . "'");
                            ShopMail::easyshop_sendalert($row['item_id'], $newstock, $minimum_level, 3);
                            // Alert-type = 3
                        } else {
                            $sqlcheck->db_Update("easyshop_items", "item_instock = '" . $newstock . "'\r\n\t\t\t\t\t\t\t\t\tWHERE item_id = '" . $items_array["db_id_" . $count] . "'");
                        }
                    } else {
                        // There is a problem; client has paid for more items than are in stock
                        // Raise out of stock flag and send email
                        $sqlcheck->db_Update("easyshop_items", "item_instock = '0', item_out_of_stock = '2'\r\n\t\t\t\t\t\t\t\t\tWHERE item_id = '" . $items_array["db_id_" . $count] . "'");
                        ShopMail::easyshop_sendalert($row['item_id'], $newstock, $minimum_level, 2);
                        // Alert-type = 2
                    }
                }
                if ($row['prod_promo_class'] != 255 && $row['prod_promo_class'] != 0 && $trans_array['ipn_user_id'] > 0) {
                    // Auto promotion of user
                    $sqlcheck2 = new db();
                    $sqlcheck3 = new db();
                    require_once e_HANDLER . 'userclass_class.php';
                    $promo_class_name = r_userclass_name($row['prod_promo_class']);
                    $sqlcheck2->db_Select("user", "*", "user_id='" . $trans_array['ipn_user_id'] . "'");
                    if ($row2 = $sqlcheck2->db_Fetch()) {
                        $user_name = $row2['user_name'];
                        $class_extant = explode(',', $row2['user_class']);
                        foreach ($class_extant as $key => $value) {
                            if (intval($value) == 0) {
                                unset($class_extant[$key]);
                            }
                        }
                        if ($row['prod_promo_class'] != 255 && $row['prod_promo_class'] != 0 && !in_array($row['prod_promo_class'], $class_extant)) {
                            $class_extant[] = $row['prod_promo_class'];
                        }
                        $new_array = array_unique($class_extant);
                        sort($new_array);
                        $class_list = implode(',', $new_array);
                        $sqlcheck3->db_Update("user", "user_class='" . $class_list . "' where user_id='" . $trans_array['ipn_user_id'] . "'");
                        $mailto = !(isset($pref['siteadminemail']) && strlen($pref['siteadminemail']) == 0) ? $pref['replyto_email'] : $pref['siteadminemail'];
                        // Keep 0.7.8 compatible
                        $subject = $pref['sitename'] . ": " . EASYSHOP_IPN_30;
                        // [USERNAME] upgraded to class [PROMOCLASS]
                        $subject = str_replace("[USERNAME]", $user_name, $subject);
                        $subject = str_replace("[PROMOCLASS]", $promo_class_name, $subject);
                        $message = EASYSHOP_IPN_31 . "<br /><br />";
                        $message .= EASYSHOP_IPN_32 . "<br /><br />";
                        $message .= EASYSHOP_IPN_33 . "<br />";
                        $message .= "<br />" . EASYSHOP_IPN_34 . " " . $pref['siteurl'];
                        $message .= "<br /><br />&copy; " . date("Y") . " EasyShop";
                        $message = str_replace("[USERNAME]", $row2['user_name'], $message);
                        $message = str_replace("[USERLINK]", SITEURL . "user.php?id." . $trans_array['ipn_user_id'], $message);
                        $message = str_replace("[PROMOCLASS]", r_userclass_name($row['prod_promo_class']), $message);
                        $message = str_replace("[TRANSACTIONID]", $trans_array['txn_id'], $message);
                        $message = str_replace("[PRODUCTPRICE]", $items_array["amount_" . $count], $message);
                        $message = str_replace("[PRODUCTQTY]", $items_array["quantity_" . $count], $message);
                        $message = str_replace("[CURRENCY]", $trans_array['mc_currency'], $message);
                        $message = str_replace("[GROSSAMOUNT]", $trans_array['mc_gross'], $message);
                        $message = str_replace("[PAYMENTDATE]", $trans_array['payment_date'], $message);
                        $message = str_replace("[PRODLINK]", SITEURL . e_PLUGIN . "easyshop/easyshop.php?prod." . $items_array["db_id_" . $count], $message);
                        $message = str_replace("[PRODUCTNAME]", $items_array["item_name_" . $count], $message);
                        $user_message = EASYSHOP_IPN_35;
                        $user_message .= "<br />" . EASYSHOP_IPN_36;
                        $user_message .= "<br />" . EASYSHOP_IPN_34 . " " . $pref['siteurl'];
                        $user_message .= "<br /><br />&copy; " . date("Y") . " EasyShop";
                        $user_message = str_replace("[PRODUCTNAME]", $items_array["item_name_" . $count], $user_message);
                        $user_message = str_replace("[PROMOCLASS]", r_userclass_name($row['prod_promo_class']), $user_message);
                        //ShopMail::easyshop_sendemail($mailto, $subject, $message, $headers2, $attachment_name);
                        if ($row2['user_class'] != $class_list) {
                            // Only send an e-mail if the user_class array actually changed
                            ShopMail::easyshop_sendemail($mailto, $subject, $message, $headers2, $attachment_name);
                            // Mail to admin
                            ShopMail::easyshop_sendemail($row2['user_email'], $subject, $user_message, $headers2, $attachment_name);
                            // Mail to user
                        }
                    }
                }
                $temp_array = array($row['item_id'] => array("item_name" => $items_array["item_name_" . $count], "db_id" => $row['item_id']));
            }
        } else {
            // This item does not exist!!!
            //$sqlcheck -> db_Close();
            return FALSE;
        }
        $count++;
    }
    // Send downloads
    $to_email = $trans_array['payer_email'];
    ShopMail::easyshop_senddownloads($temp_array, $to_email);
    //$sqlcheck -> db_Close();
    return TRUE;
}