mirror of
https://github.com/maybe-finance/maybe.git
synced 2025-08-02 20:15:22 +02:00
Merge pull request #255 from robzolkos/delegated-type-accounts
Rework Account to use delegated types
This commit is contained in:
commit
c10fab9a7c
56 changed files with 506 additions and 98 deletions
|
@ -2,38 +2,39 @@ class AccountsController < ApplicationController
|
|||
before_action :authenticate_user!
|
||||
|
||||
def new
|
||||
end
|
||||
|
||||
def new_bank
|
||||
@account = Depository.new
|
||||
end
|
||||
|
||||
def new_credit
|
||||
@account = Credit.new
|
||||
if params[:type].blank? || Account.accountable_types.include?("Account::#{params[:type]}")
|
||||
@account = if params[:type].blank?
|
||||
Account.new
|
||||
else
|
||||
Account.new(accountable_type: "Account::#{params[:type]}")
|
||||
end
|
||||
else
|
||||
head :not_found
|
||||
end
|
||||
end
|
||||
|
||||
def show
|
||||
end
|
||||
|
||||
def create
|
||||
@account = account_type_class.new(account_params)
|
||||
@account.family = current_family
|
||||
@account = Account.new(account_params.merge(family: current_family))
|
||||
@account.accountable = account_params[:accountable_type].constantize.new
|
||||
|
||||
if @account.save
|
||||
redirect_to root_path
|
||||
redirect_to accounts_path, notice: "New account created successfully"
|
||||
else
|
||||
render :new
|
||||
render "new", status: :unprocessable_entity
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def account_params
|
||||
params.require(:account).permit(:name, :balance, :type, :subtype)
|
||||
params.require(:account).permit(:name, :accountable_type, :balance, :subtype)
|
||||
end
|
||||
|
||||
def account_type_class
|
||||
if params[:type].present? && Account::VALID_ACCOUNT_TYPES.include?(params[:type])
|
||||
if params[:type].present? && Account.accountable_types.include?(params[:type])
|
||||
params[:type].constantizes
|
||||
else
|
||||
Account # Default to Account if type is not provided or invalid
|
||||
|
|
|
@ -6,4 +6,8 @@ module ApplicationHelper
|
|||
def header_title(page_title)
|
||||
content_for(:header_title) { page_title }
|
||||
end
|
||||
|
||||
def permitted_accountable_partial(name)
|
||||
name.underscore
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,7 +1,14 @@
|
|||
class Account < ApplicationRecord
|
||||
VALID_ACCOUNT_TYPES = %w[Investment Depository Credit Loan Property Vehicle OtherAsset OtherLiability].freeze
|
||||
|
||||
belongs_to :family
|
||||
|
||||
scope :depository, -> { where(type: "Depository") }
|
||||
delegated_type :accountable, types: %w[ Account::Credit Account::Depository Account::Investment Account::Loan Account::OtherAsset Account::OtherLiability Account::Property Account::Vehicle], dependent: :destroy
|
||||
|
||||
delegate :icon, :type_name, :color, to: :accountable
|
||||
|
||||
# Class method to get a representative instance of each accountable type
|
||||
def self.accountable_type_instances
|
||||
accountable_types.map do |type|
|
||||
type.constantize.new
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
18
app/models/account/credit.rb
Normal file
18
app/models/account/credit.rb
Normal file
|
@ -0,0 +1,18 @@
|
|||
class Account::Credit < ApplicationRecord
|
||||
include Accountable
|
||||
|
||||
def icon
|
||||
"icon-credit-card.svg"
|
||||
end
|
||||
|
||||
def type_name
|
||||
"Credit Card"
|
||||
end
|
||||
|
||||
def color
|
||||
{
|
||||
background: "bg-[#E6F6FA]",
|
||||
text: "text-[#189FC7]"
|
||||
}
|
||||
end
|
||||
end
|
18
app/models/account/depository.rb
Normal file
18
app/models/account/depository.rb
Normal file
|
@ -0,0 +1,18 @@
|
|||
class Account::Depository < ApplicationRecord
|
||||
include Accountable
|
||||
|
||||
def icon
|
||||
"icon-bank-accounts.svg"
|
||||
end
|
||||
|
||||
def type_name
|
||||
"Bank Accounts"
|
||||
end
|
||||
|
||||
def color
|
||||
{
|
||||
background: "bg-[#EAF4FF]",
|
||||
text: "text-[#3492FB]"
|
||||
}
|
||||
end
|
||||
end
|
18
app/models/account/investment.rb
Normal file
18
app/models/account/investment.rb
Normal file
|
@ -0,0 +1,18 @@
|
|||
class Account::Investment < ApplicationRecord
|
||||
include Accountable
|
||||
|
||||
def icon
|
||||
"icon-bank-accounts.svg"
|
||||
end
|
||||
|
||||
def type_name
|
||||
"Investments"
|
||||
end
|
||||
|
||||
def color
|
||||
{
|
||||
background: "bg-[#EDF7F4]",
|
||||
text: "text-[#1BD5A1]"
|
||||
}
|
||||
end
|
||||
end
|
18
app/models/account/loan.rb
Normal file
18
app/models/account/loan.rb
Normal file
|
@ -0,0 +1,18 @@
|
|||
class Account::Loan < ApplicationRecord
|
||||
include Accountable
|
||||
|
||||
def icon
|
||||
"icon-bank-accounts.svg"
|
||||
end
|
||||
|
||||
def type_name
|
||||
"Loan"
|
||||
end
|
||||
|
||||
def color
|
||||
{
|
||||
background: "bg-[#EDF7F4]",
|
||||
text: "text-[#1BD5A1]"
|
||||
}
|
||||
end
|
||||
end
|
18
app/models/account/other_asset.rb
Normal file
18
app/models/account/other_asset.rb
Normal file
|
@ -0,0 +1,18 @@
|
|||
class Account::OtherAsset < ApplicationRecord
|
||||
include Accountable
|
||||
|
||||
def icon
|
||||
"icon-bank-accounts.svg"
|
||||
end
|
||||
|
||||
def type_name
|
||||
"Other Asset"
|
||||
end
|
||||
|
||||
def color
|
||||
{
|
||||
background: "bg-[#EDF7F4]",
|
||||
text: "text-[#1BD5A1]"
|
||||
}
|
||||
end
|
||||
end
|
18
app/models/account/other_liability.rb
Normal file
18
app/models/account/other_liability.rb
Normal file
|
@ -0,0 +1,18 @@
|
|||
class Account::OtherLiability < ApplicationRecord
|
||||
include Accountable
|
||||
|
||||
def icon
|
||||
"icon-bank-accounts.svg"
|
||||
end
|
||||
|
||||
def type_name
|
||||
"Other Liability"
|
||||
end
|
||||
|
||||
def color
|
||||
{
|
||||
background: "bg-[#EDF7F4]",
|
||||
text: "text-[#1BD5A1]"
|
||||
}
|
||||
end
|
||||
end
|
18
app/models/account/property.rb
Normal file
18
app/models/account/property.rb
Normal file
|
@ -0,0 +1,18 @@
|
|||
class Account::Property < ApplicationRecord
|
||||
include Accountable
|
||||
|
||||
def icon
|
||||
"icon-real-estate.svg"
|
||||
end
|
||||
|
||||
def type_name
|
||||
"Real Estate"
|
||||
end
|
||||
|
||||
def color
|
||||
{
|
||||
background: "bg-[#FEF0F7]",
|
||||
text: "text-[#F03695]"
|
||||
}
|
||||
end
|
||||
end
|
18
app/models/account/vehicle.rb
Normal file
18
app/models/account/vehicle.rb
Normal file
|
@ -0,0 +1,18 @@
|
|||
class Account::Vehicle < ApplicationRecord
|
||||
include Accountable
|
||||
|
||||
def icon
|
||||
"icon-bank-accounts.svg"
|
||||
end
|
||||
|
||||
def type_name
|
||||
"Vehicle"
|
||||
end
|
||||
|
||||
def color
|
||||
{
|
||||
background: "bg-[#EDF7F4]",
|
||||
text: "text-[#1BD5A1]"
|
||||
}
|
||||
end
|
||||
end
|
7
app/models/concerns/accountable.rb
Normal file
7
app/models/concerns/accountable.rb
Normal file
|
@ -0,0 +1,7 @@
|
|||
module Accountable
|
||||
extend ActiveSupport::Concern
|
||||
|
||||
included do
|
||||
has_one :account, as: :accountable, touch: true
|
||||
end
|
||||
end
|
|
@ -1,2 +0,0 @@
|
|||
class Depository < Account
|
||||
end
|
9
app/views/accounts/_account_type.html.erb
Normal file
9
app/views/accounts/_account_type.html.erb
Normal file
|
@ -0,0 +1,9 @@
|
|||
<div class="relative flex-col items-center px-5 py-4 space-x-3 text-center bg-white border border-gray-100 shadow-sm rounded-xl hover:border-gray-200">
|
||||
<%= link_to new_account_path(type: account_type.class.name.demodulize), class: "flex flex-col items-center justify-center w-full text-center focus:outline-none" do %>
|
||||
<span class="absolute inset-0" aria-hidden="true"></span>
|
||||
<span class="flex w-10 h-10 shrink-0 grow-0 items-center justify-center rounded-xl <%= account_type.color[:background] %> mb-2">
|
||||
<%= inline_svg_tag(account_type.icon, class: "#{account_type.color[:text]} stroke-current") %>
|
||||
</span>
|
||||
<%= account_type.type_name %>
|
||||
<% end %>
|
||||
</div>
|
0
app/views/accounts/account/_credit.html.erb
Normal file
0
app/views/accounts/account/_credit.html.erb
Normal file
4
app/views/accounts/account/_depository.html.erb
Normal file
4
app/views/accounts/account/_depository.html.erb
Normal file
|
@ -0,0 +1,4 @@
|
|||
<div class="relative p-4 border border-gray-100 bg-offwhite rounded-xl focus-within:bg-white focus-within:shadow focus-within:opacity-100">
|
||||
<label for="account_name" class="block text-sm font-medium opacity-50 focus-within:opacity-100">Type</label>
|
||||
<%= f.select :subtype, options_for_select([["Checking", "checking"], ["Savings", "savings"]], selected: ""), {}, class: "block w-full p-0 mt-1 bg-transparent border-none focus:outline-none focus:ring-0" %>
|
||||
</div>
|
0
app/views/accounts/account/_investment.html.erb
Normal file
0
app/views/accounts/account/_investment.html.erb
Normal file
0
app/views/accounts/account/_loan.html.erb
Normal file
0
app/views/accounts/account/_loan.html.erb
Normal file
0
app/views/accounts/account/_other_asset.html.erb
Normal file
0
app/views/accounts/account/_other_asset.html.erb
Normal file
0
app/views/accounts/account/_other_liability.html.erb
Normal file
0
app/views/accounts/account/_other_liability.html.erb
Normal file
0
app/views/accounts/account/_property.html.erb
Normal file
0
app/views/accounts/account/_property.html.erb
Normal file
0
app/views/accounts/account/_vehicle.html.erb
Normal file
0
app/views/accounts/account/_vehicle.html.erb
Normal file
17
app/views/accounts/index.html.erb
Normal file
17
app/views/accounts/index.html.erb
Normal file
|
@ -0,0 +1,17 @@
|
|||
|
||||
<h2 class="text-2xl font-semibold font-display">Cash</h2>
|
||||
<h3 class="mt-1 mb-4 text-sm text-gray-500"><%#= number_to_currency current_family.cash_balance %></h3>
|
||||
|
||||
<% current_family.accounts.each do |account| %>
|
||||
<div class="flex items-center justify-between px-3 py-3 mb-2 bg-white shadow-sm rounded-xl">
|
||||
<div class="flex items-center text-sm">
|
||||
<%= account.name %>
|
||||
</div>
|
||||
<div class="flex items-center text-sm">
|
||||
<%= account.accountable %>
|
||||
</div>
|
||||
<p class="text-sm text-right">
|
||||
<span class="block mb-1"><%= number_to_currency account.balance %></span>
|
||||
</p>
|
||||
</div>
|
||||
<% end %>
|
|
@ -1,43 +1,39 @@
|
|||
<h1 class="text-3xl font-semibold font-display">Add an account</h1>
|
||||
|
||||
<div class="grid grid-cols-2 gap-4 mt-8 text-sm sm:grid-cols-3 md:grid-cols-4">
|
||||
<div class="relative flex-col items-center px-5 py-4 space-x-3 text-center bg-white border border-gray-100 shadow-sm rounded-xl hover:border-gray-200">
|
||||
<%= link_to new_bank_path, class: "flex flex-col items-center justify-center w-full text-center focus:outline-none" do %>
|
||||
<span class="absolute inset-0" aria-hidden="true"></span>
|
||||
<span class="flex w-10 h-10 shrink-0 grow-0 items-center justify-center rounded-xl bg-[#EAF4FF] mb-2">
|
||||
<%= inline_svg_tag('icon-bank-accounts.svg', class: 'text-[#3492FB] stroke-current') %>
|
||||
</span>
|
||||
Bank accounts
|
||||
<% end %>
|
||||
<% if params[:type].blank? || Account.accountable_types.include?("Account::#{params[:type]}") == false %>
|
||||
<div class="grid grid-cols-2 gap-4 mt-8 text-sm sm:grid-cols-3 md:grid-cols-4">
|
||||
<%= render partial: "account_type", collection: Account.accountable_type_instances %>
|
||||
</div>
|
||||
<% else %>
|
||||
<div class="relative flex items-center mb-5 space-x-2">
|
||||
<%= link_to new_account_path, class: "" do %>
|
||||
<%= inline_svg_tag('icon-arrow-left.svg', class: 'text-gray-500 fill-current') %>
|
||||
<% end %>
|
||||
<h2 class="text-2xl font-semibold font-display">Enter <%= params[:type] %> account</h2>
|
||||
</div>
|
||||
|
||||
<div class="relative flex-col items-center px-5 py-4 space-x-3 text-center bg-white border border-gray-100 shadow-sm rounded-xl hover:border-gray-200">
|
||||
<%= link_to new_credit_path, class: "flex flex-col items-center justify-center w-full text-center focus:outline-none" do %>
|
||||
<span class="absolute inset-0" aria-hidden="true"></span>
|
||||
<span class="flex w-10 h-10 shrink-0 grow-0 items-center justify-center rounded-xl bg-[#E6F6FA] mb-2">
|
||||
<%= inline_svg_tag('icon-credit-card.svg', class: 'text-[#189FC7] stroke-current') %>
|
||||
</span>
|
||||
Credit cards
|
||||
<% end %>
|
||||
</div>
|
||||
<%= form_with model: @account, url: accounts_path, scope: :account, html: { class: "space-y-4" } do |f| %>
|
||||
<%= f.hidden_field :accountable_type %>
|
||||
|
||||
<div class="relative flex-col items-center px-5 py-4 space-x-3 text-center bg-white border border-gray-100 shadow-sm rounded-xl hover:border-gray-200">
|
||||
<%= link_to "new_investment_path", class: "flex flex-col items-center justify-center w-full text-center focus:outline-none" do %>
|
||||
<span class="absolute inset-0" aria-hidden="true"></span>
|
||||
<span class="flex w-10 h-10 shrink-0 grow-0 items-center justify-center rounded-xl bg-[#EDF7F4] mb-2">
|
||||
<%= inline_svg_tag('icon-investments.svg', class: 'text-[#1BD5A1] stroke-current') %>
|
||||
</span>
|
||||
Investments
|
||||
<% end %>
|
||||
</div>
|
||||
<div class="relative p-4 border border-gray-100 bg-offwhite rounded-xl focus-within:bg-white focus-within:shadow focus-within:opacity-100">
|
||||
<%# <span class="absolute px-2 py-1 text-xs font-medium text-gray-400 uppercase bg-gray-200 rounded-full opacity-50 right-3">Optional</span> %>
|
||||
<label for="account_name" class="block text-sm font-medium opacity-50 focus-within:opacity-100">Name</label>
|
||||
<%= f.text_field :name, placeholder: "Account name", required: 'required', class: "p-0 mt-1 bg-transparent border-none opacity-50 focus:outline-none focus:ring-0 focus-within:opacity-100" %>
|
||||
</div>
|
||||
|
||||
<div class="relative flex-col items-center px-5 py-4 space-x-3 text-center bg-white border border-gray-100 shadow-sm rounded-xl hover:border-gray-200">
|
||||
<%= link_to "new_real_estate_path", class: "flex flex-col items-center justify-center w-full text-center focus:outline-none" do %>
|
||||
<span class="absolute inset-0" aria-hidden="true"></span>
|
||||
<span class="flex w-10 h-10 shrink-0 grow-0 items-center justify-center rounded-xl bg-[#FEF0F7] mb-2">
|
||||
<%= inline_svg_tag('icon-real-estate.svg', class: 'text-[#F03695] stroke-current') %>
|
||||
</span>
|
||||
Real estate
|
||||
<% end %>
|
||||
</div>
|
||||
</div>
|
||||
<%= render "accounts/#{permitted_accountable_partial(@account.accountable_type)}", f: f %>
|
||||
|
||||
<div class="relative p-4 border border-gray-100 bg-offwhite rounded-xl focus-within:bg-white focus-within:shadow focus-within:opacity-100">
|
||||
<label for="account_name" class="block text-sm font-medium opacity-50 focus-within:opacity-100">Balance</label>
|
||||
<div class="flex">
|
||||
<%= f.number_field :balance, placeholder: "$0.00", in: 0.00..100000000.00, required: 'required', class: "p-0 mt-1 bg-transparent border-none opacity-50 focus:outline-none focus:ring-0 focus-within:opacity-100" %>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="absolute right-5 bottom-5">
|
||||
<button type="submit" class="flex items-center justify-center w-12 h-12 mb-2 bg-black rounded-full shrink-0 grow-0 hover:bg-gray-600">
|
||||
<i class="text-xl text-white fa-regular fa-check"></i>
|
||||
</button>
|
||||
</div>
|
||||
<% end %>
|
||||
<% end %>
|
||||
|
|
|
@ -1,34 +0,0 @@
|
|||
<div class="relative flex items-center mb-5 space-x-2">
|
||||
<%= link_to new_account_path, class: "" do %>
|
||||
<%= inline_svg_tag('icon-arrow-left.svg', class: 'text-gray-500 fill-current') %>
|
||||
<% end %>
|
||||
<h2 class="text-2xl font-semibold font-display">Enter bank account</h2>
|
||||
</div>
|
||||
|
||||
<%= form_with model: @account, url: accounts_path, scope: :account, html: { class: "space-y-4" } do |f| %>
|
||||
<%= f.hidden_field :type, value: "Depository" %>
|
||||
|
||||
<div class="relative p-4 border border-gray-100 bg-offwhite rounded-xl focus-within:bg-white focus-within:shadow focus-within:opacity-100">
|
||||
<%# <span class="absolute px-2 py-1 text-xs font-medium text-gray-400 uppercase bg-gray-200 rounded-full opacity-50 right-3">Optional</span> %>
|
||||
<label for="account_name" class="block text-sm font-medium opacity-50 focus-within:opacity-100">Name</label>
|
||||
<%= f.text_field :name, placeholder: "Account name", required: 'required', class: "p-0 mt-1 bg-transparent border-none opacity-50 focus:outline-none focus:ring-0 focus-within:opacity-100" %>
|
||||
</div>
|
||||
|
||||
<div class="relative p-4 border border-gray-100 bg-offwhite rounded-xl focus-within:bg-white focus-within:shadow focus-within:opacity-100">
|
||||
<label for="account_name" class="block text-sm font-medium opacity-50 focus-within:opacity-100">Type</label>
|
||||
<%= f.select :subtype, options_for_select([["Checking", "checking"], ["Savings", "savings"]], selected: ""), {}, class: "block w-full p-0 mt-1 bg-transparent border-none focus:outline-none focus:ring-0" %>
|
||||
</div>
|
||||
|
||||
<div class="relative p-4 border border-gray-100 bg-offwhite rounded-xl focus-within:bg-white focus-within:shadow focus-within:opacity-100">
|
||||
<label for="account_name" class="block text-sm font-medium opacity-50 focus-within:opacity-100">Balance</label>
|
||||
<div class="flex">
|
||||
<%= f.number_field :balance, placeholder: "$0.00", in: 0.00..100000000.00, required: 'required', class: "p-0 mt-1 bg-transparent border-none opacity-50 focus:outline-none focus:ring-0 focus-within:opacity-100" %>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="absolute right-5 bottom-5">
|
||||
<button type="submit" class="flex items-center justify-center w-12 h-12 mb-2 bg-black rounded-full shrink-0 grow-0 hover:bg-gray-600">
|
||||
<i class="text-xl text-white fa-regular fa-check"></i>
|
||||
</button>
|
||||
</div>
|
||||
<% end %>
|
|
@ -63,7 +63,7 @@
|
|||
<div>
|
||||
<h2 class="text-sm font-semibold font-display">Cash</h2>
|
||||
|
||||
<% current_family.accounts.depository.each do |account| %>
|
||||
<% current_family.accounts.each do |account| %>
|
||||
<div class="flex items-center justify-between py-2">
|
||||
<div class="flex items-center text-sm">
|
||||
<%= account.name %>
|
||||
|
|
|
@ -79,4 +79,7 @@ Rails.application.configure do
|
|||
|
||||
# Apply autocorrection by RuboCop to files generated by `bin/rails generate`.
|
||||
config.generators.apply_rubocop_autocorrect_after_generate!
|
||||
|
||||
# Allow connection from any host in development
|
||||
config.hosts = nil
|
||||
end
|
||||
|
|
|
@ -4,6 +4,7 @@ module.exports = {
|
|||
content: [
|
||||
'./public/*.html',
|
||||
'./app/helpers/**/*.rb',
|
||||
'./app/models/**/*.rb',
|
||||
'./app/javascript/**/*.js',
|
||||
'./app/views/**/*.{erb,haml,html,slim}'
|
||||
],
|
||||
|
|
7
db/migrate/20240202191425_create_account_loans.rb
Normal file
7
db/migrate/20240202191425_create_account_loans.rb
Normal file
|
@ -0,0 +1,7 @@
|
|||
class CreateAccountLoans < ActiveRecord::Migration[7.2]
|
||||
def change
|
||||
create_table :account_loans, id: :uuid do |t|
|
||||
t.timestamps
|
||||
end
|
||||
end
|
||||
end
|
7
db/migrate/20240202191746_add_accountable_to_account.rb
Normal file
7
db/migrate/20240202191746_add_accountable_to_account.rb
Normal file
|
@ -0,0 +1,7 @@
|
|||
class AddAccountableToAccount < ActiveRecord::Migration[7.2]
|
||||
def change
|
||||
add_column :accounts, :accountable_type, :string
|
||||
add_column :accounts, :accountable_id, :uuid
|
||||
add_index :accounts, :accountable_type
|
||||
end
|
||||
end
|
7
db/migrate/20240202192214_create_account_depositories.rb
Normal file
7
db/migrate/20240202192214_create_account_depositories.rb
Normal file
|
@ -0,0 +1,7 @@
|
|||
class CreateAccountDepositories < ActiveRecord::Migration[7.2]
|
||||
def change
|
||||
create_table :account_depositories, id: :uuid do |t|
|
||||
t.timestamps
|
||||
end
|
||||
end
|
||||
end
|
7
db/migrate/20240202192231_create_account_credits.rb
Normal file
7
db/migrate/20240202192231_create_account_credits.rb
Normal file
|
@ -0,0 +1,7 @@
|
|||
class CreateAccountCredits < ActiveRecord::Migration[7.2]
|
||||
def change
|
||||
create_table :account_credits, id: :uuid do |t|
|
||||
t.timestamps
|
||||
end
|
||||
end
|
||||
end
|
7
db/migrate/20240202192238_create_account_investments.rb
Normal file
7
db/migrate/20240202192238_create_account_investments.rb
Normal file
|
@ -0,0 +1,7 @@
|
|||
class CreateAccountInvestments < ActiveRecord::Migration[7.2]
|
||||
def change
|
||||
create_table :account_investments, id: :uuid do |t|
|
||||
t.timestamps
|
||||
end
|
||||
end
|
||||
end
|
7
db/migrate/20240202192312_create_account_properties.rb
Normal file
7
db/migrate/20240202192312_create_account_properties.rb
Normal file
|
@ -0,0 +1,7 @@
|
|||
class CreateAccountProperties < ActiveRecord::Migration[7.2]
|
||||
def change
|
||||
create_table :account_properties, id: :uuid do |t|
|
||||
t.timestamps
|
||||
end
|
||||
end
|
||||
end
|
7
db/migrate/20240202192319_create_account_vehicles.rb
Normal file
7
db/migrate/20240202192319_create_account_vehicles.rb
Normal file
|
@ -0,0 +1,7 @@
|
|||
class CreateAccountVehicles < ActiveRecord::Migration[7.2]
|
||||
def change
|
||||
create_table :account_vehicles, id: :uuid do |t|
|
||||
t.timestamps
|
||||
end
|
||||
end
|
||||
end
|
7
db/migrate/20240202192327_create_account_other_assets.rb
Normal file
7
db/migrate/20240202192327_create_account_other_assets.rb
Normal file
|
@ -0,0 +1,7 @@
|
|||
class CreateAccountOtherAssets < ActiveRecord::Migration[7.2]
|
||||
def change
|
||||
create_table :account_other_assets, id: :uuid do |t|
|
||||
t.timestamps
|
||||
end
|
||||
end
|
||||
end
|
|
@ -0,0 +1,7 @@
|
|||
class CreateAccountOtherLiabilities < ActiveRecord::Migration[7.2]
|
||||
def change
|
||||
create_table :account_other_liabilities, id: :uuid do |t|
|
||||
t.timestamps
|
||||
end
|
||||
end
|
||||
end
|
5
db/migrate/20240203030754_remove_type_from_accounts.rb
Normal file
5
db/migrate/20240203030754_remove_type_from_accounts.rb
Normal file
|
@ -0,0 +1,5 @@
|
|||
class RemoveTypeFromAccounts < ActiveRecord::Migration[7.2]
|
||||
def change
|
||||
remove_column :accounts, :type
|
||||
end
|
||||
end
|
47
db/schema.rb
generated
47
db/schema.rb
generated
|
@ -10,13 +10,52 @@
|
|||
#
|
||||
# It's strongly recommended that you check this file into your version control system.
|
||||
|
||||
ActiveRecord::Schema[7.2].define(version: 2024_02_02_230325) do
|
||||
ActiveRecord::Schema[7.2].define(version: 2024_02_03_030754) do
|
||||
# These are extensions that must be enabled in order to support this database
|
||||
enable_extension "pgcrypto"
|
||||
enable_extension "plpgsql"
|
||||
|
||||
create_table "account_credits", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
|
||||
t.datetime "created_at", null: false
|
||||
t.datetime "updated_at", null: false
|
||||
end
|
||||
|
||||
create_table "account_depositories", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
|
||||
t.datetime "created_at", null: false
|
||||
t.datetime "updated_at", null: false
|
||||
end
|
||||
|
||||
create_table "account_investments", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
|
||||
t.datetime "created_at", null: false
|
||||
t.datetime "updated_at", null: false
|
||||
end
|
||||
|
||||
create_table "account_loans", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
|
||||
t.datetime "created_at", null: false
|
||||
t.datetime "updated_at", null: false
|
||||
end
|
||||
|
||||
create_table "account_other_assets", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
|
||||
t.datetime "created_at", null: false
|
||||
t.datetime "updated_at", null: false
|
||||
end
|
||||
|
||||
create_table "account_other_liabilities", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
|
||||
t.datetime "created_at", null: false
|
||||
t.datetime "updated_at", null: false
|
||||
end
|
||||
|
||||
create_table "account_properties", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
|
||||
t.datetime "created_at", null: false
|
||||
t.datetime "updated_at", null: false
|
||||
end
|
||||
|
||||
create_table "account_vehicles", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
|
||||
t.datetime "created_at", null: false
|
||||
t.datetime "updated_at", null: false
|
||||
end
|
||||
|
||||
create_table "accounts", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
|
||||
t.string "type"
|
||||
t.string "subtype"
|
||||
t.uuid "family_id", null: false
|
||||
t.string "name"
|
||||
|
@ -24,8 +63,10 @@ ActiveRecord::Schema[7.2].define(version: 2024_02_02_230325) do
|
|||
t.string "currency", default: "USD"
|
||||
t.datetime "created_at", null: false
|
||||
t.datetime "updated_at", null: false
|
||||
t.string "accountable_type"
|
||||
t.uuid "accountable_id"
|
||||
t.index ["accountable_type"], name: "index_accounts_on_accountable_type"
|
||||
t.index ["family_id"], name: "index_accounts_on_family_id"
|
||||
t.index ["type"], name: "index_accounts_on_type"
|
||||
end
|
||||
|
||||
create_table "families", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
|
||||
|
|
11
test/fixtures/account/credits.yml
vendored
Normal file
11
test/fixtures/account/credits.yml
vendored
Normal file
|
@ -0,0 +1,11 @@
|
|||
# Read about fixtures at https://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html
|
||||
|
||||
# This model initially had no columns defined. If you add columns to the
|
||||
# model remove the "{}" from the fixture names and add the columns immediately
|
||||
# below each fixture, per the syntax in the comments below
|
||||
#
|
||||
one: {}
|
||||
# column: value
|
||||
#
|
||||
two: {}
|
||||
# column: value
|
11
test/fixtures/account/depositories.yml
vendored
Normal file
11
test/fixtures/account/depositories.yml
vendored
Normal file
|
@ -0,0 +1,11 @@
|
|||
# Read about fixtures at https://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html
|
||||
|
||||
# This model initially had no columns defined. If you add columns to the
|
||||
# model remove the "{}" from the fixture names and add the columns immediately
|
||||
# below each fixture, per the syntax in the comments below
|
||||
#
|
||||
one: {}
|
||||
# column: value
|
||||
#
|
||||
two: {}
|
||||
# column: value
|
11
test/fixtures/account/investments.yml
vendored
Normal file
11
test/fixtures/account/investments.yml
vendored
Normal file
|
@ -0,0 +1,11 @@
|
|||
# Read about fixtures at https://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html
|
||||
|
||||
# This model initially had no columns defined. If you add columns to the
|
||||
# model remove the "{}" from the fixture names and add the columns immediately
|
||||
# below each fixture, per the syntax in the comments below
|
||||
#
|
||||
one: {}
|
||||
# column: value
|
||||
#
|
||||
two: {}
|
||||
# column: value
|
11
test/fixtures/account/loans.yml
vendored
Normal file
11
test/fixtures/account/loans.yml
vendored
Normal file
|
@ -0,0 +1,11 @@
|
|||
# Read about fixtures at https://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html
|
||||
|
||||
# This model initially had no columns defined. If you add columns to the
|
||||
# model remove the "{}" from the fixture names and add the columns immediately
|
||||
# below each fixture, per the syntax in the comments below
|
||||
#
|
||||
one: {}
|
||||
# column: value
|
||||
#
|
||||
two: {}
|
||||
# column: value
|
11
test/fixtures/account/other_assets.yml
vendored
Normal file
11
test/fixtures/account/other_assets.yml
vendored
Normal file
|
@ -0,0 +1,11 @@
|
|||
# Read about fixtures at https://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html
|
||||
|
||||
# This model initially had no columns defined. If you add columns to the
|
||||
# model remove the "{}" from the fixture names and add the columns immediately
|
||||
# below each fixture, per the syntax in the comments below
|
||||
#
|
||||
one: {}
|
||||
# column: value
|
||||
#
|
||||
two: {}
|
||||
# column: value
|
11
test/fixtures/account/other_liabilities.yml
vendored
Normal file
11
test/fixtures/account/other_liabilities.yml
vendored
Normal file
|
@ -0,0 +1,11 @@
|
|||
# Read about fixtures at https://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html
|
||||
|
||||
# This model initially had no columns defined. If you add columns to the
|
||||
# model remove the "{}" from the fixture names and add the columns immediately
|
||||
# below each fixture, per the syntax in the comments below
|
||||
#
|
||||
one: {}
|
||||
# column: value
|
||||
#
|
||||
two: {}
|
||||
# column: value
|
11
test/fixtures/account/properties.yml
vendored
Normal file
11
test/fixtures/account/properties.yml
vendored
Normal file
|
@ -0,0 +1,11 @@
|
|||
# Read about fixtures at https://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html
|
||||
|
||||
# This model initially had no columns defined. If you add columns to the
|
||||
# model remove the "{}" from the fixture names and add the columns immediately
|
||||
# below each fixture, per the syntax in the comments below
|
||||
#
|
||||
one: {}
|
||||
# column: value
|
||||
#
|
||||
two: {}
|
||||
# column: value
|
11
test/fixtures/account/vehicles.yml
vendored
Normal file
11
test/fixtures/account/vehicles.yml
vendored
Normal file
|
@ -0,0 +1,11 @@
|
|||
# Read about fixtures at https://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html
|
||||
|
||||
# This model initially had no columns defined. If you add columns to the
|
||||
# model remove the "{}" from the fixture names and add the columns immediately
|
||||
# below each fixture, per the syntax in the comments below
|
||||
#
|
||||
one: {}
|
||||
# column: value
|
||||
#
|
||||
two: {}
|
||||
# column: value
|
6
test/fixtures/accounts.yml
vendored
6
test/fixtures/accounts.yml
vendored
|
@ -1,13 +1,11 @@
|
|||
# Read about fixtures at https://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html
|
||||
|
||||
one:
|
||||
type:
|
||||
family: one
|
||||
name: MyString
|
||||
balance:
|
||||
balance:
|
||||
|
||||
two:
|
||||
type:
|
||||
family: two
|
||||
name: MyString
|
||||
balance:
|
||||
balance:
|
||||
|
|
7
test/models/account/credit_test.rb
Normal file
7
test/models/account/credit_test.rb
Normal file
|
@ -0,0 +1,7 @@
|
|||
require "test_helper"
|
||||
|
||||
class Account::CreditTest < ActiveSupport::TestCase
|
||||
# test "the truth" do
|
||||
# assert true
|
||||
# end
|
||||
end
|
7
test/models/account/depository_test.rb
Normal file
7
test/models/account/depository_test.rb
Normal file
|
@ -0,0 +1,7 @@
|
|||
require "test_helper"
|
||||
|
||||
class Account::DepositoryTest < ActiveSupport::TestCase
|
||||
# test "the truth" do
|
||||
# assert true
|
||||
# end
|
||||
end
|
7
test/models/account/investment_test.rb
Normal file
7
test/models/account/investment_test.rb
Normal file
|
@ -0,0 +1,7 @@
|
|||
require "test_helper"
|
||||
|
||||
class Account::InvestmentTest < ActiveSupport::TestCase
|
||||
# test "the truth" do
|
||||
# assert true
|
||||
# end
|
||||
end
|
7
test/models/account/loan_test.rb
Normal file
7
test/models/account/loan_test.rb
Normal file
|
@ -0,0 +1,7 @@
|
|||
require "test_helper"
|
||||
|
||||
class Account::LoanTest < ActiveSupport::TestCase
|
||||
# test "the truth" do
|
||||
# assert true
|
||||
# end
|
||||
end
|
7
test/models/account/other_asset_test.rb
Normal file
7
test/models/account/other_asset_test.rb
Normal file
|
@ -0,0 +1,7 @@
|
|||
require "test_helper"
|
||||
|
||||
class Account::OtherAssetTest < ActiveSupport::TestCase
|
||||
# test "the truth" do
|
||||
# assert true
|
||||
# end
|
||||
end
|
7
test/models/account/other_liability_test.rb
Normal file
7
test/models/account/other_liability_test.rb
Normal file
|
@ -0,0 +1,7 @@
|
|||
require "test_helper"
|
||||
|
||||
class Account::OtherLiabilityTest < ActiveSupport::TestCase
|
||||
# test "the truth" do
|
||||
# assert true
|
||||
# end
|
||||
end
|
7
test/models/account/property_test.rb
Normal file
7
test/models/account/property_test.rb
Normal file
|
@ -0,0 +1,7 @@
|
|||
require "test_helper"
|
||||
|
||||
class Account::PropertyTest < ActiveSupport::TestCase
|
||||
# test "the truth" do
|
||||
# assert true
|
||||
# end
|
||||
end
|
7
test/models/account/vehicle_test.rb
Normal file
7
test/models/account/vehicle_test.rb
Normal file
|
@ -0,0 +1,7 @@
|
|||
require "test_helper"
|
||||
|
||||
class Account::VehicleTest < ActiveSupport::TestCase
|
||||
# test "the truth" do
|
||||
# assert true
|
||||
# end
|
||||
end
|
Loading…
Add table
Add a link
Reference in a new issue