Import Recipes from Excel

@if (step() === 'select') {

Upload the recipe workbook. The file is analysed first and you can review every planned change before anything is saved.

Import date Recipes are imported with this date. Existing recipes for the same date are overwritten.
} @if (step() === 'review' && preview()) {

Summary for {{ date() }}

@if (warnings().length > 0) {
Warnings
    @for (w of warnings(); track w) {
  • {{ w }}
  • }
}
Create missing items ({{ unmatched().length }})

Checked items will be created. Unchecked items are not created and dishes that need them are skipped.

@if (unmatched().length > 0) { Select all }
@for (u of unmatched(); track u.name) { {{ u.name }} ({{ u.kind }}{{ u.suggestedGroup ? ' → ' + u.suggestedGroup : '' }}) }
Update sale prices from the menu summary Update fraction and yield % Apply menu sections as tags
Dish details ({{ dishes().length }})
Action {{ row.action }} Name {{ row.name }} Sheet {{ row.sheet }} Yield {{ row.recipeYield | number: '1.0-4' }} Price {{ row.salePrice === null ? '—' : (row.salePrice | number: '1.2-2') }} Message {{ row.message ?? '—' }}
} @if (step() === 'result' && result()) {

Import complete

@if (result()!.createdProducts.length > 0) {

Created: {{ result()!.createdProducts.join(', ') }}

} @if (result()!.warnings.length > 0) {
Warnings
    @for (w of result()!.warnings; track w) {
  • {{ w }}
  • }
} @if (result()!.dishes.length > 0) {
Per-dish report ({{ result()!.dishes.length }})
Status {{ row.status }} Name {{ row.name }} Message {{ row.message ?? '—' }}
}
} @if (errorMessage()) { }
@if (busy()) { } @if (step() === 'select') { } @if (step() === 'review') { } @if (step() === 'result') { }