Skip to content

Commit 6dc48e9

Browse files
Create budget categories
1 parent 4e49a88 commit 6dc48e9

File tree

7 files changed

+235
-2
lines changed

7 files changed

+235
-2
lines changed
+104
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
defmodule BudgetTracker.BudgetCategories do
2+
@moduledoc """
3+
The BudgetCategories context.
4+
"""
5+
6+
import Ecto.Query, warn: false
7+
alias BudgetTracker.Repo
8+
9+
alias BudgetTracker.BudgetCategories.BudgetCategory
10+
11+
@doc """
12+
Returns the list of budget_categories.
13+
14+
## Examples
15+
16+
iex> list_budget_categories()
17+
[%BudgetCategory{}, ...]
18+
19+
"""
20+
def list_budget_categories do
21+
Repo.all(BudgetCategory)
22+
end
23+
24+
@doc """
25+
Gets a single budget_category.
26+
27+
Raises `Ecto.NoResultsError` if the Budget category does not exist.
28+
29+
## Examples
30+
31+
iex> get_budget_category!(123)
32+
%BudgetCategory{}
33+
34+
iex> get_budget_category!(456)
35+
** (Ecto.NoResultsError)
36+
37+
"""
38+
def get_budget_category!(id), do: Repo.get!(BudgetCategory, id)
39+
40+
@doc """
41+
Creates a budget_category.
42+
43+
## Examples
44+
45+
iex> create_budget_category(%{field: value})
46+
{:ok, %BudgetCategory{}}
47+
48+
iex> create_budget_category(%{field: bad_value})
49+
{:error, %Ecto.Changeset{}}
50+
51+
"""
52+
def create_budget_category(attrs \\ %{}) do
53+
%BudgetCategory{}
54+
|> BudgetCategory.changeset(attrs)
55+
|> Repo.insert()
56+
end
57+
58+
@doc """
59+
Updates a budget_category.
60+
61+
## Examples
62+
63+
iex> update_budget_category(budget_category, %{field: new_value})
64+
{:ok, %BudgetCategory{}}
65+
66+
iex> update_budget_category(budget_category, %{field: bad_value})
67+
{:error, %Ecto.Changeset{}}
68+
69+
"""
70+
def update_budget_category(%BudgetCategory{} = budget_category, attrs) do
71+
budget_category
72+
|> BudgetCategory.changeset(attrs)
73+
|> Repo.update()
74+
end
75+
76+
@doc """
77+
Deletes a budget_category.
78+
79+
## Examples
80+
81+
iex> delete_budget_category(budget_category)
82+
{:ok, %BudgetCategory{}}
83+
84+
iex> delete_budget_category(budget_category)
85+
{:error, %Ecto.Changeset{}}
86+
87+
"""
88+
def delete_budget_category(%BudgetCategory{} = budget_category) do
89+
Repo.delete(budget_category)
90+
end
91+
92+
@doc """
93+
Returns an `%Ecto.Changeset{}` for tracking budget_category changes.
94+
95+
## Examples
96+
97+
iex> change_budget_category(budget_category)
98+
%Ecto.Changeset{data: %BudgetCategory{}}
99+
100+
"""
101+
def change_budget_category(%BudgetCategory{} = budget_category, attrs \\ %{}) do
102+
BudgetCategory.changeset(budget_category, attrs)
103+
end
104+
end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
defmodule BudgetTracker.BudgetCategories.BudgetCategory do
2+
use Ecto.Schema
3+
import Ecto.Changeset
4+
5+
alias BudgetTracker.{
6+
BudgetPlans.BudgetPlan,
7+
Currencies.Currency,
8+
OperationCategories.OperationCategory
9+
}
10+
11+
@primary_key {:id, :binary_id, autogenerate: true}
12+
@foreign_key_type :binary_id
13+
schema "budget_categories" do
14+
field :limit, :float
15+
belongs_to :budget_plan, BudgetPlan
16+
belongs_to :operation_category, OperationCategory
17+
belongs_to :currency, Currency
18+
19+
timestamps(type: :utc_datetime)
20+
end
21+
22+
@doc false
23+
def changeset(budget_category, attrs) do
24+
budget_category
25+
|> cast(attrs, [:limit])
26+
|> validate_required([:limit])
27+
end
28+
end

lib/budget_tracker/budget_plans/budget_plan.ex

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,17 @@
11
defmodule BudgetTracker.BudgetPlans.BudgetPlan do
2-
alias BudgetTracker.Accounts.User
32
use Ecto.Schema
43
import Ecto.Changeset
54

5+
alias BudgetTracker.{Accounts.User, BudgetCategories.BudgetCategory}
6+
67
@primary_key {:id, :binary_id, autogenerate: true}
78
@foreign_key_type :binary_id
89
schema "budget_plans" do
910
field :description, :string
1011
field :started_form, :naive_datetime
1112
field :duration_in_days, :integer
1213
belongs_to :users, User
14+
has_many :budget_categories, BudgetCategory
1315

1416
timestamps(type: :utc_datetime)
1517
end

lib/budget_tracker/operation_categories/operation_category.ex

+2-1
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,15 @@ defmodule BudgetTracker.OperationCategories.OperationCategory do
44
"""
55
use Ecto.Schema
66
import Ecto.Changeset
7-
alias BudgetTracker.Operations.Operation
7+
alias BudgetTracker.{Operations.Operation, BudgetCategories.BudgetCategory}
88

99
@primary_key {:id, :binary_id, autogenerate: true}
1010
@foreign_key_type :binary_id
1111
schema "operation_categories" do
1212
field :title, :string
1313
field :purpose, Ecto.Enum, values: [:primary, :secondary, :not_mandatory]
1414
has_many :operations, Operation
15+
has_many :budget_categories, BudgetCategory
1516

1617
timestamps(type: :utc_datetime)
1718
end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
defmodule BudgetTracker.Repo.Migrations.CreateBudgetCategories do
2+
use Ecto.Migration
3+
4+
def change do
5+
create table(:budget_categories, primary_key: false) do
6+
add :id, :binary_id, primary_key: true
7+
add :limit, :float
8+
add :budget_plan_id, references(:budget_plans, on_delete: :nothing, type: :binary_id)
9+
add :category_id, references(:operation_categories, on_delete: :nothing, type: :binary_id)
10+
add :currency, references(:currencies, on_delete: :nothing, type: :binary_id)
11+
12+
timestamps(type: :utc_datetime)
13+
end
14+
15+
create index(:budget_categories, [:budget_plan_id])
16+
create index(:budget_categories, [:category_id])
17+
create index(:budget_categories, [:currency])
18+
end
19+
end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
defmodule BudgetTracker.BudgetCategoriesTest do
2+
use BudgetTracker.DataCase
3+
4+
alias BudgetTracker.BudgetCategories
5+
6+
describe "budget_categories" do
7+
alias BudgetTracker.BudgetCategories.BudgetCategory
8+
9+
import BudgetTracker.BudgetCategoriesFixtures
10+
11+
@invalid_attrs %{limit: nil}
12+
13+
test "list_budget_categories/0 returns all budget_categories" do
14+
budget_category = budget_category_fixture()
15+
assert BudgetCategories.list_budget_categories() == [budget_category]
16+
end
17+
18+
test "get_budget_category!/1 returns the budget_category with given id" do
19+
budget_category = budget_category_fixture()
20+
assert BudgetCategories.get_budget_category!(budget_category.id) == budget_category
21+
end
22+
23+
test "create_budget_category/1 with valid data creates a budget_category" do
24+
valid_attrs = %{limit: 120.5}
25+
26+
assert {:ok, %BudgetCategory{} = budget_category} = BudgetCategories.create_budget_category(valid_attrs)
27+
assert budget_category.limit == 120.5
28+
end
29+
30+
test "create_budget_category/1 with invalid data returns error changeset" do
31+
assert {:error, %Ecto.Changeset{}} = BudgetCategories.create_budget_category(@invalid_attrs)
32+
end
33+
34+
test "update_budget_category/2 with valid data updates the budget_category" do
35+
budget_category = budget_category_fixture()
36+
update_attrs = %{limit: 456.7}
37+
38+
assert {:ok, %BudgetCategory{} = budget_category} = BudgetCategories.update_budget_category(budget_category, update_attrs)
39+
assert budget_category.limit == 456.7
40+
end
41+
42+
test "update_budget_category/2 with invalid data returns error changeset" do
43+
budget_category = budget_category_fixture()
44+
assert {:error, %Ecto.Changeset{}} = BudgetCategories.update_budget_category(budget_category, @invalid_attrs)
45+
assert budget_category == BudgetCategories.get_budget_category!(budget_category.id)
46+
end
47+
48+
test "delete_budget_category/1 deletes the budget_category" do
49+
budget_category = budget_category_fixture()
50+
assert {:ok, %BudgetCategory{}} = BudgetCategories.delete_budget_category(budget_category)
51+
assert_raise Ecto.NoResultsError, fn -> BudgetCategories.get_budget_category!(budget_category.id) end
52+
end
53+
54+
test "change_budget_category/1 returns a budget_category changeset" do
55+
budget_category = budget_category_fixture()
56+
assert %Ecto.Changeset{} = BudgetCategories.change_budget_category(budget_category)
57+
end
58+
end
59+
end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
defmodule BudgetTracker.BudgetCategoriesFixtures do
2+
@moduledoc """
3+
This module defines test helpers for creating
4+
entities via the `BudgetTracker.BudgetCategories` context.
5+
"""
6+
7+
@doc """
8+
Generate a budget_category.
9+
"""
10+
def budget_category_fixture(attrs \\ %{}) do
11+
{:ok, budget_category} =
12+
attrs
13+
|> Enum.into(%{
14+
limit: 120.5
15+
})
16+
|> BudgetTracker.BudgetCategories.create_budget_category()
17+
18+
budget_category
19+
end
20+
end

0 commit comments

Comments
 (0)