873be910a5
The "VAT code by revenue rate" rows were hardcoded to the Swiss/LI rates (8.1/2.6/3.8/0), so a code at any other rate (e.g. DE 19%/7%) had no row to map. Derive the rows from the distinct rates of the OUTPUT VAT codes instead — retype a code to a local rate and its row appears automatically; remove the last code at a rate and the row drops. The CH/LI seeds are unchanged and still produce the same four rows. Frontend rateKey() mirrors backend ledgerService.rateKey so the saved map keys keep matching the export-time lookup. Each rate's dropdown is scoped to output codes at that rate. Empty state when no output codes exist.