diff --git a/.devcontainer/docker-compose.yml b/.devcontainer/docker-compose.yml index 165d3e21..cf22c08a 100644 --- a/.devcontainer/docker-compose.yml +++ b/.devcontainer/docker-compose.yml @@ -1,4 +1,15 @@ -version: "3" +x-db-env: &db_env + POSTGRES_USER: postgres + POSTGRES_DB: postgres + POSTGRES_PASSWORD: postgres + +x-rails-env: &rails_env + DB_HOST: db + HOST: "0.0.0.0" + POSTGRES_USER: postgres + POSTGRES_PASSWORD: postgres + BUNDLE_PATH: /bundle + REDIS_URL: redis://redis:6379/1 services: app: @@ -16,32 +27,41 @@ services: command: sleep infinity environment: - DB_HOST: db - HOST: "0.0.0.0" - POSTGRES_USER: postgres - POSTGRES_PASSWORD: postgres - BUNDLE_PATH: /bundle + <<: *rails_env depends_on: - db - redis + worker: + build: + context: .. + dockerfile: .devcontainer/Dockerfile + command: bundle exec sidekiq + restart: unless-stopped + environment: + <<: *rails_env + depends_on: + - redis + redis: image: redis:latest ports: - "6379:6379" + restart: unless-stopped + volumes: + - redis-data:/data db: image: postgres:latest restart: unless-stopped volumes: - postgres-data:/var/lib/postgresql/data environment: - POSTGRES_USER: postgres - POSTGRES_DB: postgres - POSTGRES_PASSWORD: postgres + <<: *db_env ports: - "5432:5432" volumes: postgres-data: + redis-data: bundle_cache: diff --git a/Gemfile b/Gemfile index 8801edfe..7d219c27 100644 --- a/Gemfile +++ b/Gemfile @@ -58,6 +58,7 @@ gem "intercom-rails" gem "plaid" gem "rotp", "~> 6.3" gem "rqrcode", "~> 2.2" +gem "activerecord-import" # AI gem "ruby-openai" diff --git a/Gemfile.lock b/Gemfile.lock index 10c82495..c3e5ceaf 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -61,6 +61,8 @@ GEM activemodel (= 7.2.2.1) activesupport (= 7.2.2.1) timeout (>= 0.4.0) + activerecord-import (2.1.0) + activerecord (>= 4.2) activestorage (7.2.2.1) actionpack (= 7.2.2.1) activejob (= 7.2.2.1) @@ -532,6 +534,7 @@ PLATFORMS x86_64-linux-musl DEPENDENCIES + activerecord-import aws-sdk-s3 (~> 1.177.0) bcrypt (~> 3.1) benchmark-ips diff --git a/app/helpers/account/entries_helper.rb b/app/helpers/account/entries_helper.rb index af2f16f7..5fac75cc 100644 --- a/app/helpers/account/entries_helper.rb +++ b/app/helpers/account/entries_helper.rb @@ -18,7 +18,7 @@ module Account::EntriesHelper end end - deduped_entries.group_by(&:date).map do |date, grouped_entries| + deduped_entries.group_by(&:date).sort.reverse_each.map do |date, grouped_entries| content = capture do yield grouped_entries end diff --git a/app/models/transaction_import.rb b/app/models/transaction_import.rb index 2bb9d4d5..cf3f6e12 100644 --- a/app/models/transaction_import.rb +++ b/app/models/transaction_import.rb @@ -3,7 +3,7 @@ class TransactionImport < Import transaction do mappings.each(&:create_mappable!) - rows.each do |row| + transactions = rows.map do |row| mapped_account = if account account else @@ -13,17 +13,22 @@ class TransactionImport < Import category = mappings.categories.mappable_for(row.category) tags = row.tags_list.map { |tag| mappings.tags.mappable_for(tag) }.compact - entry = mapped_account.entries.build \ - date: row.date_iso, - amount: row.signed_amount, - name: row.name, - currency: row.currency, - notes: row.notes, - entryable: Account::Transaction.new(category: category, tags: tags), - import: self - - entry.save! + Account::Transaction.new( + category: category, + tags: tags, + entry: Account::Entry.new( + account: mapped_account, + date: row.date_iso, + amount: row.signed_amount, + name: row.name, + currency: row.currency, + notes: row.notes, + import: self + ) + ) end + + Account::Transaction.import!(transactions, recursive: true) end end diff --git a/app/views/pages/dashboard/_balance_sheet.html.erb b/app/views/pages/dashboard/_balance_sheet.html.erb index 2f90257c..82491b13 100644 --- a/app/views/pages/dashboard/_balance_sheet.html.erb +++ b/app/views/pages/dashboard/_balance_sheet.html.erb @@ -12,7 +12,7 @@
<% end %> -