Orange🍊
d637cd2f75
fix(imports): support QIF dd mmm yyyy date format ( #2500 )
...
* Fix QIF import for dd mmm yyyy dates (#2498 )
American Express QIF exports use dd mmm yyyy D-fields (e.g. D26 Jan 2026).
Import previously failed with "Unable to detect date format" for two reasons:
1. QifParser.normalize_qif_date stripped all internal whitespace, turning
26 Jan 2026 into the unparseable 26Jan2026. For month-name dates the
space IS the separator, so collapse multiples to a single space instead
of removing them. Numeric dates keep the existing strip-all behavior.
2. Family::DATE_FORMATS had no candidate mapping to dd mmm yyyy, so
detect_date_format could not match it. Add "%d %b %Y" (DD MMM YYYY).
Extend the 2-digit-year expansion separator class to include space so
month-name dates with 2-digit years also normalize (26 Jan 26 -> 26 Jan 2026).
Covered by normalize/parse/detect and Amex-style row-generation regression
tests in qif_import_test.rb.
* test(qif): cover month-name 2-digit year normalization & parse
Addresses CodeRabbit nitpick on #2500 : the production change extends
the 2-digit-year expansion regex separator class to include a space
so month-name dates like "26 Jan 26" normalize to "26 Jan 2026".
Add normalize_qif_date and parse_qif_date regressions for that branch.
2026-06-28 17:02:07 +02:00
..
2026-06-11 14:39:36 +02:00
2026-06-02 21:44:57 +02:00
2026-06-02 21:44:57 +02:00
2026-06-02 21:44:57 +02:00
2026-06-21 12:01:39 +02:00
2026-06-26 06:52:09 +02:00
2026-05-27 23:58:00 +02:00
2026-05-27 23:58:00 +02:00
2026-05-13 18:13:48 +02:00
2026-05-13 18:13:48 +02:00
2026-05-13 18:13:48 +02:00
2026-05-30 00:12:54 +02:00
2026-04-01 20:25:06 +02:00
2026-04-01 20:25:06 +02:00
2026-06-20 21:43:20 +02:00
2026-02-06 18:04:03 +01:00
2026-06-27 06:20:50 +02:00
2026-05-12 00:17:49 +02:00
2026-06-11 16:48:40 +02:00
2026-02-06 18:04:03 +01:00
2026-04-13 00:51:23 +02:00
2026-06-15 20:09:39 +02:00
2026-06-08 21:45:35 +02:00
2026-05-27 23:33:08 +02:00
2026-05-26 22:48:23 +02:00
2026-05-12 23:45:19 +02:00
2026-04-27 18:33:22 +02:00
2026-05-12 00:22:37 +02:00
2026-05-12 00:22:37 +02:00
2026-02-19 18:58:01 +01:00
2026-01-23 00:53:24 +01:00
2026-05-30 23:27:18 +02:00
2026-06-11 20:26:40 +02:00
2026-06-27 06:43:12 +02:00
2026-06-09 23:02:26 +02:00
2026-06-18 12:28:32 +02:00
2026-06-15 22:12:24 +02:00
2026-05-17 16:55:01 +02:00
2026-05-13 18:17:10 +02:00
2026-04-07 14:43:17 +02:00
2026-06-28 16:12:33 +02:00
2026-05-12 00:55:46 +02:00
2026-05-09 21:55:20 +02:00
2026-05-31 22:17:56 +02:00
2026-04-08 21:05:58 +02:00
2026-06-20 20:33:09 +02:00
2026-06-20 20:33:09 +02:00
2026-06-08 21:35:12 +02:00
2026-05-12 23:45:19 +02:00
2026-05-13 20:07:00 +02:00
2026-03-25 10:50:23 +01:00
2026-06-01 14:58:18 +02:00
2026-06-16 10:57:35 +02:00
2026-06-11 09:04:56 +02:00
2026-04-29 15:30:04 +02:00
2026-06-02 21:44:57 +02:00
2026-06-02 21:44:57 +02:00
2026-06-02 21:44:57 +02:00
2026-06-26 06:47:38 +02:00
2026-03-14 20:14:18 +01:00
2026-06-14 22:09:02 +02:00
2026-05-03 20:33:29 +02:00
2026-06-25 05:44:44 +02:00
2026-06-04 22:11:51 +02:00
2026-04-07 14:43:17 +02:00
2026-04-07 14:43:17 +02:00
2026-05-13 18:13:48 +02:00
2026-05-13 18:13:48 +02:00
2026-05-30 00:51:16 +02:00
2026-04-23 21:28:38 +02:00
2026-03-11 15:54:01 +01:00
2026-06-01 21:59:46 +02:00
2026-06-25 05:44:44 +02:00
2026-04-11 21:37:07 +02:00
2026-02-19 19:51:42 +01:00
2026-05-17 16:55:01 +02:00
2026-04-10 23:19:48 +02:00
2026-06-04 19:53:52 +02:00
2026-05-09 12:36:41 +02:00
2026-06-16 10:51:51 +02:00
2026-06-28 16:12:33 +02:00
2026-02-19 18:07:47 +01:00
2026-02-11 15:22:56 +01:00
2026-04-13 19:53:04 +02:00
2026-06-02 14:00:16 +02:00
2026-06-06 17:25:27 +02:00
2026-05-12 23:45:19 +02:00
2026-05-18 21:03:04 +02:00
2026-05-12 23:45:19 +02:00
2026-05-12 23:45:19 +02:00
2026-05-12 23:45:19 +02:00
2026-06-16 17:13:03 +02:00
2026-06-04 11:48:44 +02:00
2026-06-18 20:19:36 +02:00
2026-02-08 18:19:37 +01:00
2026-02-08 18:19:37 +01:00
2026-06-06 17:11:33 +02:00
2026-06-18 20:18:18 +02:00
2026-05-05 01:04:29 +02:00
2026-05-27 23:25:46 +02:00
2026-05-12 00:22:37 +02:00
2026-06-01 22:00:48 +02:00
2026-04-18 00:06:24 +02:00
2026-05-12 12:18:17 +02:00
2026-04-07 20:46:05 +02:00
2026-05-03 10:56:31 +02:00
2026-05-03 10:56:31 +02:00
2026-05-12 00:00:49 +02:00
2026-02-06 18:04:29 +01:00
2026-05-12 21:55:22 +02:00
2026-05-30 00:22:25 +02:00
2026-06-04 23:11:43 +02:00
2026-03-19 15:17:55 +01:00
2026-05-28 14:55:21 +02:00
2026-06-28 16:12:33 +02:00
2026-05-30 23:27:18 +02:00
2026-06-28 17:02:07 +02:00
2026-06-03 00:04:32 +02:00
2026-04-03 12:38:37 +02:00
2026-03-13 07:59:45 +01:00
2026-06-19 17:07:09 +02:00
2026-04-29 13:00:38 +02:00
2026-06-25 05:38:06 +02:00
2026-06-28 16:12:33 +02:00
2026-05-30 23:29:37 +02:00
2026-06-15 21:43:08 +02:00
2026-06-27 06:43:12 +02:00
2026-05-12 12:17:00 +02:00
2026-05-08 15:15:23 +02:00
2026-05-09 21:55:20 +02:00
2026-02-10 23:14:58 +01:00
2026-05-05 00:47:45 +02:00
2026-06-03 00:37:21 +02:00
2026-05-28 00:01:34 +02:00
2026-05-13 20:07:00 +02:00
2026-05-12 23:45:19 +02:00
2026-03-14 23:56:27 +01:00
2026-05-13 20:07:00 +02:00
2026-05-12 23:45:19 +02:00
2026-06-20 20:33:09 +02:00
2026-05-03 20:33:29 +02:00
2026-06-15 20:34:34 +02:00
2026-06-16 08:32:17 +02:00