function delete_invoice_item($itemid)
 {
     log_debug("accounts_invoices_manage", "Executing delete_invoice_itemid({$itemid})");
     // sanatise item ID
     $itemid = @security_script_input_predefined("any", $itemid);
     // fetch the invoice ID and type
     $sql_item_obj = new sql_query();
     $sql_item_obj->string = "SELECT invoiceid, invoicetype FROM account_items WHERE id='" . $itemid . "' LIMIT 1";
     $sql_item_obj->execute();
     if (!$sql_item_obj->num_rows()) {
         throw new SoapFault("Sender", "INVALID_ITEMID");
     }
     $sql_item_obj->fetch_array();
     if (user_permissions_get("accounts_" . $sql_item_obj->data[0]["invoicetype"] . "_write")) {
         $obj_invoice_item = new invoice_items();
         $obj_invoice_item->type_invoice = $sql_item_obj->data[0]["invoicetype"];
         $obj_invoice_item->id_invoice = $sql_item_obj->data[0]["invoiceid"];
         $obj_invoice_item->id_item = $itemid;
         // make sure invoice is not locked
         if ($obj_invoice_item->check_lock()) {
             throw new SoapFault("Sender", "LOCKED");
         }
         /*
         	Perform Changes
         */
         // start SQL transaction
         $sql_obj = new sql_query();
         $sql_obj->trans_begin();
         if (!$obj_invoice_item->action_delete()) {
             $sql_obj->trans_rollback();
             throw new SoapFault("Sender", "UNEXPECTED_ACTION_ERROR");
         }
         // re-calculate taxes, totals and ledgers as required
         $obj_invoice_item->action_update_tax();
         $obj_invoice_item->action_update_total();
         $obj_invoice_item->action_update_ledger();
         // commit
         if (error_check()) {
             $sql_obj->trans_rollback();
             throw new SoapFault("Sender", "UNEXPECTED_ACTION_ERROR");
         } else {
             $sql_obj->trans_commit();
             return 1;
         }
     } else {
         throw new SoapFault("Sender", "ACCESS DENIED");
     }
 }