false, 'error' => 'Missing parameters')); exit; } // Hole Section-Info $sql = "SELECT fk_facture FROM ".MAIN_DB_PREFIX."facture_lines_manager"; $sql .= " WHERE rowid = ".(int)$section_id; $sql .= " AND line_type = 'section'"; $resql = $db->query($sql); if (!$resql || $db->num_rows($resql) == 0) { echo json_encode(array('success' => false, 'error' => 'Section not found')); exit; } $section = $db->fetch_object($resql); $facture_id = $section->fk_facture; $db->begin(); // 1. Hole alle Sections (sortiert) $sql = "SELECT rowid FROM ".MAIN_DB_PREFIX."facture_lines_manager"; $sql .= " WHERE fk_facture = ".(int)$facture_id; $sql .= " AND line_type = 'section'"; $sql .= " ORDER BY line_order"; $resql = $db->query($sql); $sections = array(); while ($obj = $db->fetch_object($resql)) { $sections[] = $obj->rowid; } // 2. Finde Index und tausche $current_index = array_search($section_id, $sections); if ($current_index === false) { echo json_encode(array('success' => false, 'error' => 'Section not in list')); exit; } if ($direction == 'up') { if ($current_index == 0) { echo json_encode(array('success' => false, 'error' => 'Already at top')); exit; } $swap_index = $current_index - 1; } else { if ($current_index == count($sections) - 1) { echo json_encode(array('success' => false, 'error' => 'Already at bottom')); exit; } $swap_index = $current_index + 1; } // Tausche $temp = $sections[$current_index]; $sections[$current_index] = $sections[$swap_index]; $sections[$swap_index] = $temp; // 3. Baue komplette neue Reihenfolge auf $new_order = 1; $updates = array(); // Freie Produkte zuerst $sql = "SELECT rowid FROM ".MAIN_DB_PREFIX."facture_lines_manager"; $sql .= " WHERE fk_facture = ".(int)$facture_id; $sql .= " AND line_type = 'product'"; $sql .= " AND parent_section IS NULL"; $sql .= " ORDER BY line_order"; $resql = $db->query($sql); while ($obj = $db->fetch_object($resql)) { $updates[$obj->rowid] = $new_order; $new_order++; } // Freie Textzeilen $sql = "SELECT rowid FROM ".MAIN_DB_PREFIX."facture_lines_manager"; $sql .= " WHERE fk_facture = ".(int)$facture_id; $sql .= " AND line_type = 'text'"; $sql .= " AND parent_section IS NULL"; $sql .= " ORDER BY line_order"; $resql = $db->query($sql); while ($obj = $db->fetch_object($resql)) { $updates[$obj->rowid] = $new_order; $new_order++; } // Sections in neuer Reihenfolge foreach ($sections as $sec_id) { // Section-Header $updates[$sec_id] = $new_order; $new_order++; // Produkte dieser Section $sql = "SELECT rowid FROM ".MAIN_DB_PREFIX."facture_lines_manager"; $sql .= " WHERE fk_facture = ".(int)$facture_id; $sql .= " AND line_type = 'product'"; $sql .= " AND parent_section = ".(int)$sec_id; $sql .= " ORDER BY line_order"; $resql = $db->query($sql); while ($obj = $db->fetch_object($resql)) { $updates[$obj->rowid] = $new_order; $new_order++; } // Textzeilen dieser Section $sql = "SELECT rowid FROM ".MAIN_DB_PREFIX."facture_lines_manager"; $sql .= " WHERE fk_facture = ".(int)$facture_id; $sql .= " AND line_type = 'text'"; $sql .= " AND parent_section = ".(int)$sec_id; $sql .= " ORDER BY line_order"; $resql = $db->query($sql); while ($obj = $db->fetch_object($resql)) { $updates[$obj->rowid] = $new_order; $new_order++; } // ========== SUBTOTAL DIESER SECTION ========== $sql = "SELECT rowid FROM ".MAIN_DB_PREFIX."facture_lines_manager"; $sql .= " WHERE fk_facture = ".(int)$facture_id; $sql .= " AND line_type = 'subtotal'"; $sql .= " AND parent_section = ".(int)$sec_id; $resql = $db->query($sql); while ($obj = $db->fetch_object($resql)) { $updates[$obj->rowid] = $new_order; $new_order++; } } // 4. Führe alle Updates aus foreach ($updates as $rowid => $order) { $sql = "UPDATE ".MAIN_DB_PREFIX."facture_lines_manager"; $sql .= " SET line_order = ".(int)$order; $sql .= " WHERE rowid = ".(int)$rowid; $db->query($sql); } // 5. Sync rang $sql = "SELECT fk_facturedet FROM ".MAIN_DB_PREFIX."facture_lines_manager"; $sql .= " WHERE fk_facture = ".(int)$facture_id; $sql .= " AND line_type = 'product'"; $sql .= " ORDER BY line_order"; $resql = $db->query($sql); $rang = 1; while ($obj = $db->fetch_object($resql)) { $sql_upd = "UPDATE ".MAIN_DB_PREFIX."facturedet"; $sql_upd .= " SET rang = ".$rang; $sql_upd .= " WHERE rowid = ".(int)$obj->fk_facturedet; $db->query($sql_upd); $rang++; } $db->commit(); echo json_encode(array('success' => true));