philomena/lib/philomena/commissions.ex

200 lines
3.8 KiB
Elixir

defmodule Philomena.Commissions do
@moduledoc """
The Commissions context.
"""
import Ecto.Query, warn: false
alias Ecto.Multi
alias Philomena.Repo
alias Philomena.Commissions.Commission
@doc """
Gets a single commission.
Raises `Ecto.NoResultsError` if the Commission does not exist.
## Examples
iex> get_commission!(123)
%Commission{}
iex> get_commission!(456)
** (Ecto.NoResultsError)
"""
def get_commission!(id), do: Repo.get!(Commission, id)
@doc """
Creates a commission.
## Examples
iex> create_commission(%{field: value})
{:ok, %Commission{}}
iex> create_commission(%{field: bad_value})
{:error, %Ecto.Changeset{}}
"""
def create_commission(user, attrs \\ %{}) do
Ecto.build_assoc(user, :commission)
|> Commission.changeset(attrs)
|> Repo.insert()
end
@doc """
Updates a commission.
## Examples
iex> update_commission(commission, %{field: new_value})
{:ok, %Commission{}}
iex> update_commission(commission, %{field: bad_value})
{:error, %Ecto.Changeset{}}
"""
def update_commission(%Commission{} = commission, attrs) do
commission
|> Commission.changeset(attrs)
|> Repo.update()
end
@doc """
Deletes a Commission.
## Examples
iex> delete_commission(commission)
{:ok, %Commission{}}
iex> delete_commission(commission)
{:error, %Ecto.Changeset{}}
"""
def delete_commission(%Commission{} = commission) do
Repo.delete(commission)
end
@doc """
Returns an `%Ecto.Changeset{}` for tracking commission changes.
## Examples
iex> change_commission(commission)
%Ecto.Changeset{source: %Commission{}}
"""
def change_commission(%Commission{} = commission) do
Commission.changeset(commission, %{})
end
alias Philomena.Commissions.Item
@doc """
Gets a single item.
Raises `Ecto.NoResultsError` if the Item does not exist.
## Examples
iex> get_item!(123)
%Item{}
iex> get_item!(456)
** (Ecto.NoResultsError)
"""
def get_item!(id), do: Repo.get!(Item, id)
@doc """
Creates a item.
## Examples
iex> create_item(%{field: value})
{:ok, %Item{}}
iex> create_item(%{field: bad_value})
{:error, %Ecto.Changeset{}}
"""
def create_item(commission, attrs \\ %{}) do
changeset =
Ecto.build_assoc(commission, :items)
|> Item.changeset(attrs)
update =
Commission
|> where(id: ^commission.id)
|> update(inc: [commission_items_count: 1])
Multi.new()
|> Multi.insert(:item, changeset)
|> Multi.update_all(:commission, update, [])
|> Repo.transaction()
|> case do
{:error, :item, changeset, _} ->
{:error, changeset}
result ->
result
end
end
@doc """
Updates a item.
## Examples
iex> update_item(item, %{field: new_value})
{:ok, %Item{}}
iex> update_item(item, %{field: bad_value})
{:error, %Ecto.Changeset{}}
"""
def update_item(%Item{} = item, attrs) do
item
|> Item.changeset(attrs)
|> Repo.update()
end
@doc """
Deletes a Item.
## Examples
iex> delete_item(item)
{:ok, %Item{}}
iex> delete_item(item)
{:error, %Ecto.Changeset{}}
"""
def delete_item(%Item{} = item) do
update =
Commission
|> where(id: ^item.commission_id)
|> update(inc: [commission_items_count: -1])
Multi.new()
|> Multi.delete(:item, item)
|> Multi.update_all(:commission, update, [])
|> Repo.transaction()
end
@doc """
Returns an `%Ecto.Changeset{}` for tracking item changes.
## Examples
iex> change_item(item)
%Ecto.Changeset{source: %Item{}}
"""
def change_item(%Item{} = item) do
Item.changeset(item, %{})
end
end