false, 'error' => 'Missing parameters']); exit; } // Prüfe Rechnungsstatus $facture = new Facture($db); $facture->fetch($facture_id); if ($facture->statut != Facture::STATUS_DRAFT) { echo json_encode(['success' => false, 'error' => 'Rechnung ist nicht im Entwurf']); exit; } subtotaltitle_debug_log('🗑️ Massenlöschung: ' . count($line_ids) . ' Zeilen'); $db->begin(); $deleted = 0; foreach ($line_ids as $line_id) { $line_id = (int)$line_id; // Aus facturedet löschen $sql = "DELETE FROM ".MAIN_DB_PREFIX."facturedet WHERE rowid = ".$line_id; if ($db->query($sql)) { $deleted++; subtotaltitle_debug_log('✅ Zeile gelöscht: ' . $line_id); } // Aus Manager-Tabelle löschen $sql_manager = "DELETE FROM ".MAIN_DB_PREFIX."facture_lines_manager WHERE fk_facturedet = ".$line_id; $db->query($sql_manager); } // Summen neu berechnen $facture->update_price(1); // line_order neu durchnummerieren $sql = "SELECT rowid FROM ".MAIN_DB_PREFIX."facture_lines_manager"; $sql .= " WHERE fk_facture = ".(int)$facture_id; $sql .= " ORDER BY line_order"; $resql = $db->query($sql); $new_order = 1; while ($obj = $db->fetch_object($resql)) { $sql_upd = "UPDATE ".MAIN_DB_PREFIX."facture_lines_manager SET line_order = ".$new_order." WHERE rowid = ".(int)$obj->rowid; $db->query($sql_upd); $new_order++; } // rang synchronisieren $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 SET rang = ".$rang." WHERE rowid = ".(int)$obj->fk_facturedet; $db->query($sql_upd); $rang++; } $db->commit(); subtotaltitle_debug_log('🗑️ Massenlöschung abgeschlossen: ' . $deleted . ' von ' . count($line_ids)); echo json_encode(['success' => true, 'deleted' => $deleted]);