Files
sure/app/controllers/import/configurations_controller.rb
Serge L 78b334277c QIF imports: Add date format auto-detection and manual override (#1368)
* feat: improve QIF import date format selection

- Added a reusable date format auto-detection method.

- Show a live preview of the first parsed date that updates client-side
  as the user changes the dropdown selection, via a new
  qif-date-format Stimulus controller.

- Show an error alert and disable the submit button when no supported
  date format can parse the file's dates.

* A few polishing fixes:
- Missing return on redirects
Stale REASONABLE_DATE_RANGE constant.
- Replaced the frozen constant with a class method
Bare inline rescue — Replaced Date.strptime(s, fmt) rescue nil with an explicit begin/rescue catching.
- save!(validate: false) in controller — Changed to update_column(:column_mappings, ...) in qif_category_selections_controller.rb:22, matching the pattern used in detect_and_set_qif_date_format!.
- Unescaped JSON in HTML attribute — Replaced the raw <div> with tag.div ... do block in show.html.erb:16, letting Rails properly escape the data attribute value.

* fix: address review feedback for QIF date format feature

- Add missing `return` after redirect for non-QIF imports
- Pass date_format to parse_opening_balance in will_adjust_opening_anchor?
- Return empty array when no usable date sample exists for format preview
- Add sr-only label to date format select for accessibility
- Consolidate duplicate try_parse_date/parse_qif_date into single method
- Remove misleading ambiguity scoring comment from detect_date_format
- Skip redundant sync_mappings when date format already triggered a sync

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Use %{product_name} interpolation in locale strings

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-05 09:27:24 +02:00

58 lines
1.7 KiB
Ruby

class Import::ConfigurationsController < ApplicationController
layout "imports"
before_action :set_import
def show
# PDF imports are auto-configured from AI extraction, skip to clean step
redirect_to import_clean_path(@import) and return if @import.is_a?(PdfImport)
redirect_to import_qif_category_selection_path(@import) and return if @import.is_a?(QifImport)
end
def update
if params[:refresh_only]
@import.update!(rows_to_skip: params.dig(:import, :rows_to_skip).to_i)
redirect_to import_configuration_path(@import)
else
@import.update!(import_params)
@import.generate_rows_from_csv
@import.reload.sync_mappings
redirect_to import_clean_path(@import), notice: t(".success")
end
rescue ActiveRecord::RecordInvalid => e
message = e.record.errors.full_messages.to_sentence.presence || e.message
redirect_back_or_to import_configuration_path(@import), alert: message
end
private
def set_import
@import = Current.family.imports.find(params[:import_id])
end
def import_params
params.fetch(:import, {}).permit(
:date_col_label,
:amount_col_label,
:name_col_label,
:category_col_label,
:tags_col_label,
:account_col_label,
:qty_col_label,
:ticker_col_label,
:exchange_operating_mic_col_label,
:price_col_label,
:entity_type_col_label,
:notes_col_label,
:currency_col_label,
:date_format,
:number_format,
:signage_convention,
:amount_type_strategy,
:amount_type_identifier_value,
:amount_type_inflow_value,
:rows_to_skip
)
end
end