diff --git a/api/v1/invoice_items/create.php b/api/v1/invoice_items/create.php new file mode 100644 index 000000000..f8158fa36 --- /dev/null +++ b/api/v1/invoice_items/create.php @@ -0,0 +1,204 @@ + 0 +) { + + // Load invoice, scoped to API key permissions + $invoice_sql = mysqli_query( + $mysqli, + "SELECT * + FROM invoices + WHERE invoice_id = $invoice_id + AND invoice_status != 'Paid' + AND 1=1 " . apiClientScopeSql('invoice_client_id') . " + LIMIT 1" + ); + + $invoice_row = $invoice_sql ? mysqli_fetch_assoc($invoice_sql) : null; + + // Ensure supplied client matches invoice client + if ($invoice_row && $client_id != 0 && intval($invoice_row['invoice_client_id']) !== $client_id) { + $invoice_row = null; + } + + if ($invoice_row) { + + $client_id = intval($invoice_row['invoice_client_id']); + $invoice_prefix = escapeSql($invoice_row['invoice_prefix']); + $invoice_number = intval($invoice_row['invoice_number']); + $invoice_discount = floatval($invoice_row['invoice_discount_amount']); + + $subtotal = $price * $qty; + + // Product inventory + if ($product_id) { + + $product_type = escapeSql(getFieldById('products', $product_id, 'product_type')); + + if ($product_type === 'product') { + + $stock_sql = mysqli_query( + $mysqli, + "SELECT COALESCE(SUM(stock_qty),0) AS available_stock + FROM product_stock + WHERE stock_product_id = $product_id" + ); + + $stock_row = mysqli_fetch_assoc($stock_sql); + $available_stock = floatval($stock_row['available_stock']); + + if ($available_stock >= $qty) { + + mysqli_query( + $mysqli, + "INSERT INTO product_stock + SET stock_qty = -$qty, + stock_note = 'QTY $qty - Invoice $invoice_id', + stock_product_id = $product_id" + ); + + } else { + + logAudit( + "API", + "Failure", + "Failed adding item $name to invoice $invoice_prefix$invoice_number via API ($api_key_name) due to insufficient stock", + $client_id + ); + + require_once '../create_output.php'; + exit; + + } + + } + + } + + // Tax + if ($tax_id > 0) { + + $tax_sql = mysqli_query($mysqli, "SELECT tax_percent FROM taxes WHERE tax_id = $tax_id"); + $tax_row = mysqli_fetch_assoc($tax_sql); + + $tax_percent = floatval($tax_row['tax_percent']); + $tax_amount = $subtotal * $tax_percent / 100; + + } else { + + $tax_amount = 0; + + } + + $total = $subtotal + $tax_amount; + + $insert_sql = mysqli_query( + $mysqli, + "INSERT INTO invoice_items SET + item_name = '$name', + item_description = '$description', + item_quantity = $qty, + item_price = $price, + item_subtotal = $subtotal, + item_tax = $tax_amount, + item_total = $total, + item_order = $item_order, + item_tax_id = $tax_id, + item_product_id = $product_id, + item_invoice_id = $invoice_id" + ); + + if ($insert_sql) { + + $insert_id = mysqli_insert_id($mysqli); + + // Recalculate invoice total + $items_sql = mysqli_query( + $mysqli, + "SELECT SUM(item_total) AS invoice_total + FROM invoice_items + WHERE item_invoice_id = $invoice_id" + ); + + $items_row = mysqli_fetch_assoc($items_sql); + $invoice_total = floatval($items_row['invoice_total']); + + $new_invoice_amount = $invoice_total - $invoice_discount; + + mysqli_query( + $mysqli, + "UPDATE invoices + SET invoice_amount = $new_invoice_amount + WHERE invoice_id = $invoice_id + LIMIT 1" + ); + + logAudit( + "Invoice", + "Edit", + "Added item $name to invoice $invoice_prefix$invoice_number via API ($api_key_name)", + $client_id, + $invoice_id + ); + + logAudit( + "API", + "Success", + "Added item $name to invoice $invoice_prefix$invoice_number via API ($api_key_name)", + $client_id + ); + + } + + } + +} + +// Output +require_once '../create_output.php'; \ No newline at end of file