Skip to content
This repository was archived by the owner on Jul 27, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 41 additions & 0 deletions app/controllers/merchants_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
class MerchantsController < ApplicationController
layout "with_sidebar"

before_action :set_merchant, only: %i[ edit update destroy ]

def index
@merchants = Current.family.merchants.alphabetically
end

def new
@merchant = Merchant.new
end

def create
Current.family.merchants.create!(merchant_params)
redirect_to merchants_path, notice: t(".success")
end

def edit
end

def update
@merchant.update!(merchant_params)
redirect_to merchants_path, notice: t(".success")
end

def destroy
@merchant.destroy!
redirect_to merchants_path, notice: t(".success")
end

private

def set_merchant
@merchant = Current.family.merchants.find(params[:id])
end

def merchant_params
params.require(:merchant).permit(:name, :color)
end
end
41 changes: 0 additions & 41 deletions app/controllers/transactions/merchants_controller.rb

This file was deleted.

2 changes: 1 addition & 1 deletion app/models/family.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ class Family < ApplicationRecord
has_many :transactions, through: :accounts
has_many :imports, through: :accounts
has_many :categories, dependent: :destroy
has_many :transaction_merchants, dependent: :destroy, class_name: "Transaction::Merchant"
has_many :merchants, dependent: :destroy

def snapshot(period = Period.all)
query = accounts.active.joins(:balances)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
class Transaction::Merchant < ApplicationRecord
class Merchant < ApplicationRecord
has_many :transactions, dependent: :nullify
belongs_to :family

Expand Down
2 changes: 1 addition & 1 deletion app/models/transaction.rb
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ class Transaction < ApplicationRecord
scope :with_categories, ->(categories) { joins(:category).where(categories: { name: categories }) }
scope :with_accounts, ->(accounts) { joins(:account).where(accounts: { name: accounts }) }
scope :with_account_ids, ->(account_ids) { joins(:account).where(accounts: { id: account_ids }) }
scope :with_merchants, ->(merchants) { joins(:merchant).where(transaction_merchants: { name: merchants }) }
scope :with_merchants, ->(merchants) { joins(:merchant).where(merchants: { name: merchants }) }
scope :on_or_after_date, ->(date) { where("transactions.date >= ?", date) }
scope :on_or_before_date, ->(date) { where("transactions.date <= ?", date) }
scope :with_converted_amount, ->(currency = Current.family.currency) {
Expand Down
2 changes: 1 addition & 1 deletion app/views/categories/index.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,6 @@

<footer class="flex justify-between gap-4">
<%= previous_setting("Tags", tags_path) %>
<%= next_setting("Merchants", transaction_merchants_path) %>
<%= next_setting("Merchants", merchants_path) %>
</footer>
</section>
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
<% is_editing = @merchant.id.present? %>
<div data-controller="merchant-avatar">
<%= form_with model: @merchant, url: is_editing ? transaction_merchant_path(@merchant) : transaction_merchants_path, method: is_editing ? :patch : :post, scope: :transaction_merchant, data: { turbo: false } do |f| %>
<%= form_with model: @merchant, url: is_editing ? merchant_path(@merchant) : merchants_path, method: is_editing ? :patch : :post, scope: :merchant, data: { turbo: false } do |f| %>
<section class="space-y-4">
<div class="w-fit m-auto">
<%= render partial: "transactions/merchants/avatar", locals: { merchant: } %>
<%= render partial: "merchants/avatar", locals: { merchant: } %>
</div>
<div data-controller="select" data-select-active-class="bg-gray-200" data-select-selected-value="<%= @merchant&.color || Transaction::Merchant::COLORS[0] %>">
<div data-controller="select" data-select-active-class="bg-gray-200" data-select-selected-value="<%= @merchant&.color || Merchant::COLORS[0] %>">
<%= f.hidden_field :color, data: { select_target: "input", merchant_avatar_target: "color" } %>
<ul data-select-target="list" class="flex gap-2 items-center">
<% Transaction::Merchant::COLORS.each do |color| %>
<% Merchant::COLORS.each do |color| %>
<li tabindex="0" data-select-target="option" data-action="click->select#selectOption" data-value="<%= color %>" class="flex shrink-0 justify-center items-center w-6 h-6 cursor-pointer hover:bg-gray-200 rounded-full">
<div style="background-color: <%= color %>" class="shrink-0 w-4 h-4 rounded-full"></div>
</li>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
<% merchants.each.with_index do |merchant, index| %>
<div class="flex justify-between items-center p-4 bg-white">
<div class="flex w-full items-center gap-2.5">
<%= render partial: "transactions/merchants/avatar", locals: { merchant: } %>
<%= render partial: "merchants/avatar", locals: { merchant: } %>
<p class="text-gray-900 text-sm truncate">
<%= merchant.name %>
</p>
Expand All @@ -13,13 +13,13 @@
</button>
<div data-menu-target="content" class="absolute z-10 top-10 right-0 border border-alpha-black-25 bg-white rounded-lg shadow-xs w-48 hidden">
<div class="border-t border-b border-alpha-black-100 p-1">
<%= button_to edit_transaction_merchant_path(merchant),
<%= button_to edit_merchant_path(merchant),
method: :get,
class: "flex w-full gap-1 items-center text-sm hover:bg-gray-50 rounded-lg px-3 py-2",
data: { turbo_frame: "modal" } do %>
<%= lucide_icon("pencil-line", class: "w-5 h-5 mr-2") %> <%= t(".edit") %>
<% end %>
<%= button_to transaction_merchant_path(merchant),
<%= button_to merchant_path(merchant),
method: :delete,
class: "flex w-full gap-1 items-center text-sm text-red-600 hover:text-red-800 hover:bg-gray-50 rounded-lg px-3 py-2",
data: {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
<div class="space-y-4">
<div class="flex items-center justify-between">
<h1 class="text-xl font-medium text-gray-900"><%= t(".title") %></h1>
<%= link_to new_transaction_merchant_path, class: "flex text-white text-sm font-medium items-center gap-1 bg-gray-900 rounded-lg p-2 pr-3", data: { turbo_frame: "modal" } do %>
<%= link_to new_merchant_path, class: "flex text-white text-sm font-medium items-center gap-1 bg-gray-900 rounded-lg p-2 pr-3", data: { turbo_frame: "modal" } do %>
<%= lucide_icon("plus", class: "w-5 h-5") %>
<span><%= t(".new_short") %></span>
<% end %>
Expand All @@ -14,7 +14,7 @@
<div class="flex justify-center items-center py-20">
<div class="text-center flex flex-col items-center max-w-[300px]">
<p class="text-gray-900 mb-1 font-medium text-sm"><%= t(".empty") %></p>
<%= link_to new_transaction_merchant_path, class: "w-fit flex text-white text-sm font-medium items-center gap-1 bg-gray-900 rounded-lg p-2 pr-3", data: { turbo_frame: "modal" } do %>
<%= link_to new_merchant_path, class: "w-fit flex text-white text-sm font-medium items-center gap-1 bg-gray-900 rounded-lg p-2 pr-3", data: { turbo_frame: "modal" } do %>
<%= lucide_icon("plus", class: "w-5 h-5") %>
<span><%= t(".new_long") %></span>
<% end %>
Expand All @@ -27,7 +27,7 @@
<span class="text-gray-400 mx-2">&middot;</span>
<p><%= @merchants.count %></p>
</div>
<%= render partial: "transactions/merchants/list", locals: { merchants: @merchants } %>
<%= render partial: "merchants/list", locals: { merchants: @merchants } %>
</div>
<% end %>
</div>
Expand Down
2 changes: 1 addition & 1 deletion app/views/settings/_nav.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@
<%= sidebar_link_to t(".categories_label"), categories_path, icon: "tags" %>
</li>
<li>
<%= sidebar_link_to t(".merchants_label"), transaction_merchants_path, icon: "store" %>
<%= sidebar_link_to t(".merchants_label"), merchants_path, icon: "store" %>
</li>
<li>
<%= sidebar_link_to t(".rules_label"), transaction_rules_path, icon: "list-checks" %>
Expand Down
2 changes: 1 addition & 1 deletion app/views/transactions/bulk_edit.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
<div class="pb-6 space-y-2">
<%= form.date_field :date, label: t(".date_label"), max: Date.current %>
<%= form.collection_select :category_id, Current.family.categories.alphabetically, :id, :name, { prompt: t(".category_placeholder"), label: t(".category_label"), class: "text-gray-400" } %>
<%= form.collection_select :merchant_id, Current.family.transaction_merchants.alphabetically, :id, :name, { prompt: t(".merchant_placeholder"), label: t(".merchant_label"), class: "text-gray-400" } %>
<%= form.collection_select :merchant_id, Current.family.merchants.alphabetically, :id, :name, { prompt: t(".merchant_placeholder"), label: t(".merchant_label"), class: "text-gray-400" } %>
</div>
</details>

Expand Down
2 changes: 1 addition & 1 deletion app/views/transactions/rules/index.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
</div>
</div>
<div class="flex justify-between gap-4">
<%= previous_setting("Merchants", transaction_merchants_path) %>
<%= previous_setting("Merchants", merchants_path) %>
<%= next_setting("Imports", imports_path) %>
</div>
</div>
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<%= lucide_icon("search", class: "w-5 h-5 text-gray-500 absolute inset-y-0 left-2 top-1/2 transform -translate-y-1/2") %>
</div>
<div class="my-2" id="list" data-list-filter-target="list">
<% Current.family.transaction_merchants.alphabetically.each do |merchant| %>
<% Current.family.merchants.alphabetically.each do |merchant| %>
<div class="filterable-item flex items-center gap-2 p-2" data-filter-name="<%= merchant.name %>">
<%= form.check_box :merchants,
{
Expand Down
2 changes: 1 addition & 1 deletion app/views/transactions/show.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@

<% unless @transaction.marked_as_transfer %>
<%= f.collection_select :category_id, Current.family.categories.alphabetically, :id, :name, { prompt: t(".category_placeholder"), label: t(".category_label"), class: "text-gray-400" }, "data-auto-submit-form-target": "auto" %>
<%= f.collection_select :merchant_id, Current.family.transaction_merchants.alphabetically, :id, :name, { prompt: t(".merchant_placeholder"), label: t(".merchant_label"), class: "text-gray-400" }, "data-auto-submit-form-target": "auto" %>
<%= f.collection_select :merchant_id, Current.family.merchants.alphabetically, :id, :name, { prompt: t(".merchant_placeholder"), label: t(".merchant_label"), class: "text-gray-400" }, "data-auto-submit-form-target": "auto" %>
<% end %>

<%= f.collection_select :account_id, Current.family.accounts.alphabetically, :id, :name, { prompt: t(".account_placeholder"), label: t(".account_label"), class: "text-gray-500" }, { class: "form-field__input cursor-not-allowed text-gray-400", disabled: "disabled" } %>
Expand Down
29 changes: 29 additions & 0 deletions config/locales/views/merchants/en.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
---
en:
merchants:
create:
success: New merchant created successfully
destroy:
success: Merchant deleted successfully
edit:
title: Edit merchant
form:
name_placeholder: Merchant name
submit_create: Add merchant
submit_edit: Update
index:
empty: No merchants yet
new_long: New merchant
new_short: New
title: Merchants
list:
confirm_accept: Delete merchant
confirm_body: Are you sure you want to delete this merchant? Removing this merchant
will unlink all associated transactions and may effect your reporting.
confirm_title: Delete merchant?
delete: Delete merchant
edit: Edit merchant
new:
title: New merchant
update:
success: Merchant updated successfully
27 changes: 0 additions & 27 deletions config/locales/views/transactions/en.yml
Original file line number Diff line number Diff line change
Expand Up @@ -50,33 +50,6 @@ en:
transaction: transaction
mark_transfers:
success: Marked as transfer
merchants:
create:
success: New merchant created successfully
destroy:
success: Merchant deleted successfully
edit:
title: Edit merchant
form:
name_placeholder: Merchant name
submit_create: Add merchant
submit_edit: Update
index:
empty: No merchants yet
new_long: New merchant
new_short: New
title: Merchants
list:
confirm_accept: Delete merchant
confirm_body: Are you sure you want to delete this merchant? Removing this
merchant will unlink all associated transactions and may effect your reporting.
confirm_title: Delete merchant?
delete: Delete merchant
edit: Edit merchant
new:
title: New merchant
update:
success: Merchant updated successfully
selection_bar:
mark_transfers: Mark as transfers?
mark_transfers_confirm: Mark as transfers
Expand Down
3 changes: 2 additions & 1 deletion config/routes.rb
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,8 @@
end
end

resources :merchants, only: %i[ index new create edit update destroy ]

resources :transactions do
collection do
post "bulk_delete"
Expand All @@ -59,7 +61,6 @@
scope module: :transactions, as: :transaction do
resources :rows, only: %i[ show update ]
resources :rules, only: %i[ index ]
resources :merchants, only: %i[ index new create edit update destroy ]
end
end
end
Expand Down
5 changes: 5 additions & 0 deletions db/migrate/20240620122201_rename_merchants_table.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
class RenameMerchantsTable < ActiveRecord::Migration[7.2]
def change
rename_table :transaction_merchants, :merchants
end
end
24 changes: 12 additions & 12 deletions db/schema.rb

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading