## Overview

The Plan Inputs importer adds inputs to **existing draft plans**, one CSV row per input, with the parent plan identified by `plan_id`. A single file can target multiple plans. This importer only creates plan inputs. It never modifies the parent plan itself, and because a plan can legitimately hold multiple inputs for the same part, per-row updates are not supported. To rebuild a plan’s inputs from scratch, enable the **Replace existing inputs** option in the import dialog. ION then removes the plan’s current inputs and recreates them from the CSV.

```
plan_id | part_number | revision | quantity | due_date   | serial_number
42      | WIDGET-A    | A        | 10       | 2026-05-01 |
42      | WIDGET-B    | A        |  5       | 2026-05-01 |
42      | WIDGET-C    | B        |  1       | 2026-05-01 | SN-12345
```

## Import options

| Option                     | Default | Description |
|---------------------------|---------|-------------|
| Replace existing inputs    | Off     | When enabled, the targeted plans’ existing inputs are removed and recreated from the CSV. When disabled, imported inputs are added to the existing ones. |

## Columns

| Column                           | Required | Description |
|----------------------------------|----------|-------------|
| `plan_id`                        | Yes      | ID of the parent plan. The plan must exist and be in **draft** status. |
| `part_number`                   | Yes      | Part number of the input. Matched case-insensitively. |
| `revision`                       | No       | Part revision. If omitted and the part has exactly one revision, that revision is used; multiple revisions produce an ambiguity error asking you to specify one. |
| `quantity`                       | Yes      | Input quantity. Must be a non-negative integer. |
| `due_date`                      | Yes      | Due date for the input, such as `2026-05-01`. |
| `serial_number`                 | No       | Serial number for the input. |
| `name`                          | No       | Display name for the input. |
| `is_generate_new_demand`       | No       | Whether the input generates new demand. Boolean field (see [accepted values](https://docs.firstresonance.io/administration/ion-importers#accepted-boolean-values)). |
| `is_independent`               | No       | Whether the input is independent. Boolean field (see [accepted values](https://docs.firstresonance.io/administration/ion-importers#accepted-boolean-values)). |

Plan inputs can only be added to **draft** plans. Rows referencing a plan in any other status fail with a row-level error, as do rows referencing a plan ID that doesn’t exist.

This importer does not support custom attributes. Any column outside the list above causes a validation error.
