forked from shibao/cannery
		
	improve Ammo.get_grouped_packs_count
This commit is contained in:
		@@ -573,114 +573,103 @@ defmodule Cannery.Ammo do
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  defp get_packs_count_container_id(query, _nil), do: query
 | 
					  defp get_packs_count_container_id(query, _nil), do: query
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @type get_grouped_packs_count_opt ::
 | 
				
			||||||
 | 
					          {:group_by, atom()}
 | 
				
			||||||
 | 
					          | {:containers, [Container.t()] | nil}
 | 
				
			||||||
 | 
					          | {:types, [Type.t()] | nil}
 | 
				
			||||||
 | 
					          | {:show_used, :only_used | boolean() | nil}
 | 
				
			||||||
 | 
					  @type get_grouped_packs_counts_opts :: [get_grouped_packs_count_opt()]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  @doc """
 | 
					  @doc """
 | 
				
			||||||
  Returns the count of packs for multiple types.
 | 
					  Returns the count of packs for multiple types.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  ## Examples
 | 
					  ## Examples
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      iex> get_packs_count_for_types(
 | 
					      iex> get_grouped_packs_count(
 | 
				
			||||||
      ...>   [%Type{id: 123, user_id: 456}],
 | 
					      ...>   %User{id: 456},
 | 
				
			||||||
      ...>   %User{id: 456}
 | 
					      ...>   group_by: :type_id,
 | 
				
			||||||
 | 
					      ...>   types: [%Type{id: 123, user_id: 456}]
 | 
				
			||||||
      ...> )
 | 
					      ...> )
 | 
				
			||||||
      3
 | 
					      3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      iex> get_packs_count_for_types(
 | 
					      iex> get_grouped_packs_count(
 | 
				
			||||||
      ...>   [%Type{id: 123, user_id: 456}],
 | 
					 | 
				
			||||||
      ...>   %User{id: 456},
 | 
					      ...>   %User{id: 456},
 | 
				
			||||||
      ...>   true
 | 
					      ...>   group_by: :type_id,
 | 
				
			||||||
 | 
					      ...>   types: [%Type{id: 123, user_id: 456}],
 | 
				
			||||||
 | 
					      ...>   show_used: true
 | 
				
			||||||
      ...> )
 | 
					      ...> )
 | 
				
			||||||
      5
 | 
					      5
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  """
 | 
					      iex> get_grouped_packs_count(
 | 
				
			||||||
  @spec get_packs_count_for_types([Type.t()], User.t()) ::
 | 
					      ...>   %User{id: 456},
 | 
				
			||||||
          %{optional(Type.id()) => non_neg_integer()}
 | 
					      ...>   group_by: :type_id,
 | 
				
			||||||
  @spec get_packs_count_for_types([Type.t()], User.t(), show_used :: boolean()) ::
 | 
					      ...>   types: [%Type{id: 123, user_id: 456}],
 | 
				
			||||||
          %{optional(Type.id()) => non_neg_integer()}
 | 
					      ...>   show_used: :only_used
 | 
				
			||||||
  def get_packs_count_for_types(types, %User{id: user_id}, show_used \\ false) do
 | 
					      ...> )
 | 
				
			||||||
    type_ids =
 | 
					      2
 | 
				
			||||||
      types
 | 
					 | 
				
			||||||
      |> Enum.map(fn %Type{id: type_id, user_id: ^user_id} -> type_id end)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      iex> get_grouped_packs_count(
 | 
				
			||||||
 | 
					      ...>   %User{id: 456},
 | 
				
			||||||
 | 
					      ...>   group_by: :container_id,
 | 
				
			||||||
 | 
					      ...>   containers: [%Container{id: 123, user_id: 456}]
 | 
				
			||||||
 | 
					      ...> )
 | 
				
			||||||
 | 
					      7
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  """
 | 
				
			||||||
 | 
					  @spec get_grouped_packs_count(User.t(), get_grouped_packs_counts_opts()) ::
 | 
				
			||||||
 | 
					          %{optional(Type.id() | Container.id()) => non_neg_integer()}
 | 
				
			||||||
 | 
					  def get_grouped_packs_count(%User{id: user_id}, opts) do
 | 
				
			||||||
    from(p in Pack,
 | 
					    from(p in Pack,
 | 
				
			||||||
      as: :p,
 | 
					      as: :p,
 | 
				
			||||||
      where: p.user_id == ^user_id,
 | 
					      where: p.user_id == ^user_id
 | 
				
			||||||
      where: p.type_id in ^type_ids,
 | 
					 | 
				
			||||||
      group_by: p.type_id,
 | 
					 | 
				
			||||||
      select: {p.type_id, count(p.id)}
 | 
					 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
    |> get_packs_count_for_types_maybe_show_used(show_used)
 | 
					    |> get_grouped_packs_count_group_by(Keyword.fetch!(opts, :group_by))
 | 
				
			||||||
 | 
					    |> get_grouped_packs_count_filter_ids(
 | 
				
			||||||
 | 
					      Keyword.fetch!(opts, :group_by),
 | 
				
			||||||
 | 
					      Keyword.get(opts, :types)
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    |> get_grouped_packs_count_filter_ids(
 | 
				
			||||||
 | 
					      Keyword.fetch!(opts, :group_by),
 | 
				
			||||||
 | 
					      Keyword.get(opts, :containers)
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    |> get_grouped_packs_count_show_used(Keyword.get(opts, :show_used))
 | 
				
			||||||
    |> Repo.all()
 | 
					    |> Repo.all()
 | 
				
			||||||
    |> Map.new()
 | 
					    |> Map.new()
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  @spec get_packs_count_for_types_maybe_show_used(Queryable.t(), show_used :: boolean()) ::
 | 
					  @spec get_grouped_packs_count_group_by(Queryable.t(), :type_id | :container_id) :: Queryable.t()
 | 
				
			||||||
          Queryable.t()
 | 
					  defp get_grouped_packs_count_group_by(query, group_key) when group_key |> is_atom() do
 | 
				
			||||||
  defp get_packs_count_for_types_maybe_show_used(query, true), do: query
 | 
					    query
 | 
				
			||||||
 | 
					    |> group_by([p: p], field(p, ^group_key))
 | 
				
			||||||
 | 
					    |> select([p: p], {field(p, ^group_key), count(p.id)})
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  defp get_packs_count_for_types_maybe_show_used(query, _false) do
 | 
					  @spec get_grouped_packs_count_filter_ids(
 | 
				
			||||||
 | 
					          Queryable.t(),
 | 
				
			||||||
 | 
					          :type_id | :container_id,
 | 
				
			||||||
 | 
					          [Type.t()] | [Container.t()] | nil
 | 
				
			||||||
 | 
					        ) :: Queryable.t()
 | 
				
			||||||
 | 
					  defp get_grouped_packs_count_filter_ids(query, group_key, items) when items |> is_list() do
 | 
				
			||||||
 | 
					    item_ids = items |> Enum.map(fn %{id: id} -> id end)
 | 
				
			||||||
 | 
					    query |> where([p: p], field(p, ^group_key) in ^item_ids)
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  defp get_grouped_packs_count_filter_ids(query, _filter_key, _nil), do: query
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @spec get_grouped_packs_count_show_used(
 | 
				
			||||||
 | 
					          Queryable.t(),
 | 
				
			||||||
 | 
					          show_used :: :only_used | boolean() | nil
 | 
				
			||||||
 | 
					        ) :: Queryable.t()
 | 
				
			||||||
 | 
					  defp get_grouped_packs_count_show_used(query, true), do: query
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  defp get_grouped_packs_count_show_used(query, :only_used) do
 | 
				
			||||||
 | 
					    query |> where([p: p], p.count == 0)
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  defp get_grouped_packs_count_show_used(query, _false) do
 | 
				
			||||||
    query |> where([p: p], not (p.count == 0))
 | 
					    query |> where([p: p], not (p.count == 0))
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  @doc """
 | 
					 | 
				
			||||||
  Returns the count of used packs for multiple types.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  ## Examples
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      iex> get_used_packs_count_for_types(
 | 
					 | 
				
			||||||
      ...>   [%Type{id: 123, user_id: 456}],
 | 
					 | 
				
			||||||
      ...>   %User{id: 456}
 | 
					 | 
				
			||||||
      ...> )
 | 
					 | 
				
			||||||
      %{123 => 3}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  """
 | 
					 | 
				
			||||||
  @spec get_used_packs_count_for_types([Type.t()], User.t()) ::
 | 
					 | 
				
			||||||
          %{optional(Type.id()) => non_neg_integer()}
 | 
					 | 
				
			||||||
  def get_used_packs_count_for_types(types, %User{id: user_id}) do
 | 
					 | 
				
			||||||
    type_ids =
 | 
					 | 
				
			||||||
      types
 | 
					 | 
				
			||||||
      |> Enum.map(fn %Type{id: type_id, user_id: ^user_id} -> type_id end)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    Repo.all(
 | 
					 | 
				
			||||||
      from p in Pack,
 | 
					 | 
				
			||||||
        where: p.user_id == ^user_id,
 | 
					 | 
				
			||||||
        where: p.type_id in ^type_ids,
 | 
					 | 
				
			||||||
        where: p.count == 0,
 | 
					 | 
				
			||||||
        group_by: p.type_id,
 | 
					 | 
				
			||||||
        select: {p.type_id, count(p.id)}
 | 
					 | 
				
			||||||
    )
 | 
					 | 
				
			||||||
    |> Map.new()
 | 
					 | 
				
			||||||
  end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  @doc """
 | 
					 | 
				
			||||||
  Returns number of ammo packs in multiple containers.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  ## Examples
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      iex> get_packs_count_for_containers(
 | 
					 | 
				
			||||||
      ...>   [%Container{id: 123, user_id: 456}],
 | 
					 | 
				
			||||||
      ...>   %User{id: 456}
 | 
					 | 
				
			||||||
      ...> )
 | 
					 | 
				
			||||||
      %{123 => 3}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  """
 | 
					 | 
				
			||||||
  @spec get_packs_count_for_containers([Container.t()], User.t()) :: %{
 | 
					 | 
				
			||||||
          Container.id() => non_neg_integer()
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
  def get_packs_count_for_containers(containers, %User{id: user_id}) do
 | 
					 | 
				
			||||||
    container_ids =
 | 
					 | 
				
			||||||
      containers
 | 
					 | 
				
			||||||
      |> Enum.map(fn %Container{id: container_id, user_id: ^user_id} -> container_id end)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    Repo.all(
 | 
					 | 
				
			||||||
      from p in Pack,
 | 
					 | 
				
			||||||
        where: p.container_id in ^container_ids,
 | 
					 | 
				
			||||||
        where: p.count > 0,
 | 
					 | 
				
			||||||
        group_by: p.container_id,
 | 
					 | 
				
			||||||
        select: {p.container_id, count(p.id)}
 | 
					 | 
				
			||||||
    )
 | 
					 | 
				
			||||||
    |> Map.new()
 | 
					 | 
				
			||||||
  end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  @doc """
 | 
					  @doc """
 | 
				
			||||||
  Returns number of rounds in a container.
 | 
					  Returns number of rounds in a container.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -71,7 +71,8 @@ defmodule CanneryWeb.Components.ContainerTableComponent do
 | 
				
			|||||||
      current_user: current_user,
 | 
					      current_user: current_user,
 | 
				
			||||||
      tag_actions: tag_actions,
 | 
					      tag_actions: tag_actions,
 | 
				
			||||||
      actions: actions,
 | 
					      actions: actions,
 | 
				
			||||||
      pack_count: Ammo.get_packs_count_for_containers(containers, current_user),
 | 
					      pack_count:
 | 
				
			||||||
 | 
					        Ammo.get_grouped_packs_count(current_user, containers: containers, group_by: :container_id),
 | 
				
			||||||
      round_count: Ammo.get_round_count_for_containers(containers, current_user)
 | 
					      round_count: Ammo.get_round_count_for_containers(containers, current_user)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -152,7 +152,7 @@ defmodule CanneryWeb.Components.TypeTableComponent do
 | 
				
			|||||||
      |> TableComponent.maybe_compose_columns(%{label: gettext("Name"), key: :name, type: :name})
 | 
					      |> TableComponent.maybe_compose_columns(%{label: gettext("Name"), key: :name, type: :name})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    round_counts = types |> Ammo.get_round_count_for_types(current_user)
 | 
					    round_counts = types |> Ammo.get_round_count_for_types(current_user)
 | 
				
			||||||
    packs_count = types |> Ammo.get_packs_count_for_types(current_user)
 | 
					    packs_count = Ammo.get_grouped_packs_count(current_user, types: types, group_by: :type_id)
 | 
				
			||||||
    average_costs = types |> Ammo.get_average_cost_for_types(current_user)
 | 
					    average_costs = types |> Ammo.get_average_cost_for_types(current_user)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    [used_counts, historical_round_counts, historical_pack_counts, used_pack_counts] =
 | 
					    [used_counts, historical_round_counts, historical_pack_counts, used_pack_counts] =
 | 
				
			||||||
@@ -160,8 +160,16 @@ defmodule CanneryWeb.Components.TypeTableComponent do
 | 
				
			|||||||
        [
 | 
					        [
 | 
				
			||||||
          types |> ActivityLog.get_used_count_for_types(current_user),
 | 
					          types |> ActivityLog.get_used_count_for_types(current_user),
 | 
				
			||||||
          types |> Ammo.get_historical_count_for_types(current_user),
 | 
					          types |> Ammo.get_historical_count_for_types(current_user),
 | 
				
			||||||
          types |> Ammo.get_packs_count_for_types(current_user, true),
 | 
					          Ammo.get_grouped_packs_count(current_user,
 | 
				
			||||||
          types |> Ammo.get_used_packs_count_for_types(current_user)
 | 
					            types: types,
 | 
				
			||||||
 | 
					            group_by: :type_id,
 | 
				
			||||||
 | 
					            show_used: true
 | 
				
			||||||
 | 
					          ),
 | 
				
			||||||
 | 
					          Ammo.get_grouped_packs_count(current_user,
 | 
				
			||||||
 | 
					            types: types,
 | 
				
			||||||
 | 
					            group_by: :type_id,
 | 
				
			||||||
 | 
					            show_used: :only_used
 | 
				
			||||||
 | 
					          )
 | 
				
			||||||
        ]
 | 
					        ]
 | 
				
			||||||
      else
 | 
					      else
 | 
				
			||||||
        [nil, nil, nil, nil]
 | 
					        [nil, nil, nil, nil]
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,9 +6,10 @@ defmodule CanneryWeb.ExportController do
 | 
				
			|||||||
    types = Ammo.list_types(current_user)
 | 
					    types = Ammo.list_types(current_user)
 | 
				
			||||||
    used_counts = types |> ActivityLog.get_used_count_for_types(current_user)
 | 
					    used_counts = types |> ActivityLog.get_used_count_for_types(current_user)
 | 
				
			||||||
    round_counts = types |> Ammo.get_round_count_for_types(current_user)
 | 
					    round_counts = types |> Ammo.get_round_count_for_types(current_user)
 | 
				
			||||||
    pack_counts = types |> Ammo.get_packs_count_for_types(current_user)
 | 
					    pack_counts = Ammo.get_grouped_packs_count(current_user, types: types, group_by: :type_id)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    total_pack_counts = types |> Ammo.get_packs_count_for_types(current_user, true)
 | 
					    total_pack_counts =
 | 
				
			||||||
 | 
					      Ammo.get_grouped_packs_count(current_user, types: types, group_by: :type_id, show_used: true)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    average_costs = types |> Ammo.get_average_cost_for_types(current_user)
 | 
					    average_costs = types |> Ammo.get_average_cost_for_types(current_user)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								mix.exs
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								mix.exs
									
									
									
									
									
								
							@@ -4,7 +4,7 @@ defmodule Cannery.MixProject do
 | 
				
			|||||||
  def project do
 | 
					  def project do
 | 
				
			||||||
    [
 | 
					    [
 | 
				
			||||||
      app: :cannery,
 | 
					      app: :cannery,
 | 
				
			||||||
      version: "0.9.3",
 | 
					      version: "0.9.4",
 | 
				
			||||||
      elixir: "1.14.4",
 | 
					      elixir: "1.14.4",
 | 
				
			||||||
      elixirc_paths: elixirc_paths(Mix.env()),
 | 
					      elixirc_paths: elixirc_paths(Mix.env()),
 | 
				
			||||||
      start_permanent: Mix.env() == :prod,
 | 
					      start_permanent: Mix.env() == :prod,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -502,7 +502,7 @@ msgstr "Schießkladde"
 | 
				
			|||||||
#: lib/cannery_web/components/core_components/pack_card.html.heex:47
 | 
					#: lib/cannery_web/components/core_components/pack_card.html.heex:47
 | 
				
			||||||
#: lib/cannery_web/components/pack_table_component.ex:181
 | 
					#: lib/cannery_web/components/pack_table_component.ex:181
 | 
				
			||||||
#: lib/cannery_web/components/pack_table_component.ex:264
 | 
					#: lib/cannery_web/components/pack_table_component.ex:264
 | 
				
			||||||
#: lib/cannery_web/components/type_table_component.ex:265
 | 
					#: lib/cannery_web/components/type_table_component.ex:273
 | 
				
			||||||
#: lib/cannery_web/live/pack_live/show.html.heex:37
 | 
					#: lib/cannery_web/live/pack_live/show.html.heex:37
 | 
				
			||||||
#: lib/cannery_web/live/pack_live/show.html.heex:42
 | 
					#: lib/cannery_web/live/pack_live/show.html.heex:42
 | 
				
			||||||
#: lib/cannery_web/live/type_live/show.html.heex:150
 | 
					#: lib/cannery_web/live/type_live/show.html.heex:150
 | 
				
			||||||
@@ -594,7 +594,7 @@ msgstr "Patronen:"
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#: lib/cannery_web/components/pack_table_component.ex:178
 | 
					#: lib/cannery_web/components/pack_table_component.ex:178
 | 
				
			||||||
#: lib/cannery_web/components/pack_table_component.ex:260
 | 
					#: lib/cannery_web/components/pack_table_component.ex:260
 | 
				
			||||||
#: lib/cannery_web/components/type_table_component.ex:264
 | 
					#: lib/cannery_web/components/type_table_component.ex:272
 | 
				
			||||||
#: lib/cannery_web/live/type_live/show.html.heex:154
 | 
					#: lib/cannery_web/live/type_live/show.html.heex:154
 | 
				
			||||||
#, elixir-autogen, elixir-format
 | 
					#, elixir-autogen, elixir-format
 | 
				
			||||||
msgid "No cost information"
 | 
					msgid "No cost information"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -170,7 +170,7 @@ msgstr ""
 | 
				
			|||||||
"Ungültige Nummer an Kopien. Muss zwischen 1 and %{max} liegen. War "
 | 
					"Ungültige Nummer an Kopien. Muss zwischen 1 and %{max} liegen. War "
 | 
				
			||||||
"%{multiplier}"
 | 
					"%{multiplier}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: lib/cannery/ammo.ex:990
 | 
					#: lib/cannery/ammo.ex:979
 | 
				
			||||||
#, elixir-autogen, elixir-format
 | 
					#, elixir-autogen, elixir-format
 | 
				
			||||||
msgid "Invalid multiplier"
 | 
					msgid "Invalid multiplier"
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -496,7 +496,7 @@ msgstr ""
 | 
				
			|||||||
#: lib/cannery_web/components/core_components/pack_card.html.heex:47
 | 
					#: lib/cannery_web/components/core_components/pack_card.html.heex:47
 | 
				
			||||||
#: lib/cannery_web/components/pack_table_component.ex:181
 | 
					#: lib/cannery_web/components/pack_table_component.ex:181
 | 
				
			||||||
#: lib/cannery_web/components/pack_table_component.ex:264
 | 
					#: lib/cannery_web/components/pack_table_component.ex:264
 | 
				
			||||||
#: lib/cannery_web/components/type_table_component.ex:265
 | 
					#: lib/cannery_web/components/type_table_component.ex:273
 | 
				
			||||||
#: lib/cannery_web/live/pack_live/show.html.heex:37
 | 
					#: lib/cannery_web/live/pack_live/show.html.heex:37
 | 
				
			||||||
#: lib/cannery_web/live/pack_live/show.html.heex:42
 | 
					#: lib/cannery_web/live/pack_live/show.html.heex:42
 | 
				
			||||||
#: lib/cannery_web/live/type_live/show.html.heex:150
 | 
					#: lib/cannery_web/live/type_live/show.html.heex:150
 | 
				
			||||||
@@ -588,7 +588,7 @@ msgstr ""
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#: lib/cannery_web/components/pack_table_component.ex:178
 | 
					#: lib/cannery_web/components/pack_table_component.ex:178
 | 
				
			||||||
#: lib/cannery_web/components/pack_table_component.ex:260
 | 
					#: lib/cannery_web/components/pack_table_component.ex:260
 | 
				
			||||||
#: lib/cannery_web/components/type_table_component.ex:264
 | 
					#: lib/cannery_web/components/type_table_component.ex:272
 | 
				
			||||||
#: lib/cannery_web/live/type_live/show.html.heex:154
 | 
					#: lib/cannery_web/live/type_live/show.html.heex:154
 | 
				
			||||||
#, elixir-autogen, elixir-format
 | 
					#, elixir-autogen, elixir-format
 | 
				
			||||||
msgid "No cost information"
 | 
					msgid "No cost information"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -496,7 +496,7 @@ msgstr ""
 | 
				
			|||||||
#: lib/cannery_web/components/core_components/pack_card.html.heex:47
 | 
					#: lib/cannery_web/components/core_components/pack_card.html.heex:47
 | 
				
			||||||
#: lib/cannery_web/components/pack_table_component.ex:181
 | 
					#: lib/cannery_web/components/pack_table_component.ex:181
 | 
				
			||||||
#: lib/cannery_web/components/pack_table_component.ex:264
 | 
					#: lib/cannery_web/components/pack_table_component.ex:264
 | 
				
			||||||
#: lib/cannery_web/components/type_table_component.ex:265
 | 
					#: lib/cannery_web/components/type_table_component.ex:273
 | 
				
			||||||
#: lib/cannery_web/live/pack_live/show.html.heex:37
 | 
					#: lib/cannery_web/live/pack_live/show.html.heex:37
 | 
				
			||||||
#: lib/cannery_web/live/pack_live/show.html.heex:42
 | 
					#: lib/cannery_web/live/pack_live/show.html.heex:42
 | 
				
			||||||
#: lib/cannery_web/live/type_live/show.html.heex:150
 | 
					#: lib/cannery_web/live/type_live/show.html.heex:150
 | 
				
			||||||
@@ -588,7 +588,7 @@ msgstr ""
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#: lib/cannery_web/components/pack_table_component.ex:178
 | 
					#: lib/cannery_web/components/pack_table_component.ex:178
 | 
				
			||||||
#: lib/cannery_web/components/pack_table_component.ex:260
 | 
					#: lib/cannery_web/components/pack_table_component.ex:260
 | 
				
			||||||
#: lib/cannery_web/components/type_table_component.ex:264
 | 
					#: lib/cannery_web/components/type_table_component.ex:272
 | 
				
			||||||
#: lib/cannery_web/live/type_live/show.html.heex:154
 | 
					#: lib/cannery_web/live/type_live/show.html.heex:154
 | 
				
			||||||
#, elixir-autogen, elixir-format
 | 
					#, elixir-autogen, elixir-format
 | 
				
			||||||
msgid "No cost information"
 | 
					msgid "No cost information"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -153,7 +153,7 @@ msgstr ""
 | 
				
			|||||||
msgid "Invalid number of copies, must be between 1 and %{max}. Was %{multiplier}"
 | 
					msgid "Invalid number of copies, must be between 1 and %{max}. Was %{multiplier}"
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: lib/cannery/ammo.ex:990
 | 
					#: lib/cannery/ammo.ex:979
 | 
				
			||||||
#, elixir-autogen, elixir-format
 | 
					#, elixir-autogen, elixir-format
 | 
				
			||||||
msgid "Invalid multiplier"
 | 
					msgid "Invalid multiplier"
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -152,7 +152,7 @@ msgstr ""
 | 
				
			|||||||
msgid "Invalid number of copies, must be between 1 and %{max}. Was %{multiplier}"
 | 
					msgid "Invalid number of copies, must be between 1 and %{max}. Was %{multiplier}"
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: lib/cannery/ammo.ex:990
 | 
					#: lib/cannery/ammo.ex:979
 | 
				
			||||||
#, elixir-autogen, elixir-format
 | 
					#, elixir-autogen, elixir-format
 | 
				
			||||||
msgid "Invalid multiplier"
 | 
					msgid "Invalid multiplier"
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -503,7 +503,7 @@ msgstr "Registro de tiros"
 | 
				
			|||||||
#: lib/cannery_web/components/core_components/pack_card.html.heex:47
 | 
					#: lib/cannery_web/components/core_components/pack_card.html.heex:47
 | 
				
			||||||
#: lib/cannery_web/components/pack_table_component.ex:181
 | 
					#: lib/cannery_web/components/pack_table_component.ex:181
 | 
				
			||||||
#: lib/cannery_web/components/pack_table_component.ex:264
 | 
					#: lib/cannery_web/components/pack_table_component.ex:264
 | 
				
			||||||
#: lib/cannery_web/components/type_table_component.ex:265
 | 
					#: lib/cannery_web/components/type_table_component.ex:273
 | 
				
			||||||
#: lib/cannery_web/live/pack_live/show.html.heex:37
 | 
					#: lib/cannery_web/live/pack_live/show.html.heex:37
 | 
				
			||||||
#: lib/cannery_web/live/pack_live/show.html.heex:42
 | 
					#: lib/cannery_web/live/pack_live/show.html.heex:42
 | 
				
			||||||
#: lib/cannery_web/live/type_live/show.html.heex:150
 | 
					#: lib/cannery_web/live/type_live/show.html.heex:150
 | 
				
			||||||
@@ -595,7 +595,7 @@ msgstr "Balas:"
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#: lib/cannery_web/components/pack_table_component.ex:178
 | 
					#: lib/cannery_web/components/pack_table_component.ex:178
 | 
				
			||||||
#: lib/cannery_web/components/pack_table_component.ex:260
 | 
					#: lib/cannery_web/components/pack_table_component.ex:260
 | 
				
			||||||
#: lib/cannery_web/components/type_table_component.ex:264
 | 
					#: lib/cannery_web/components/type_table_component.ex:272
 | 
				
			||||||
#: lib/cannery_web/live/type_live/show.html.heex:154
 | 
					#: lib/cannery_web/live/type_live/show.html.heex:154
 | 
				
			||||||
#, elixir-autogen, elixir-format
 | 
					#, elixir-autogen, elixir-format
 | 
				
			||||||
msgid "No cost information"
 | 
					msgid "No cost information"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -168,7 +168,7 @@ msgstr "No se ha podido procesar el número de copias"
 | 
				
			|||||||
msgid "Invalid number of copies, must be between 1 and %{max}. Was %{multiplier}"
 | 
					msgid "Invalid number of copies, must be between 1 and %{max}. Was %{multiplier}"
 | 
				
			||||||
msgstr "Número inválido de copias, debe ser entre 1 y %{max}. Fue %{multiplier"
 | 
					msgstr "Número inválido de copias, debe ser entre 1 y %{max}. Fue %{multiplier"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: lib/cannery/ammo.ex:990
 | 
					#: lib/cannery/ammo.ex:979
 | 
				
			||||||
#, elixir-autogen, elixir-format
 | 
					#, elixir-autogen, elixir-format
 | 
				
			||||||
msgid "Invalid multiplier"
 | 
					msgid "Invalid multiplier"
 | 
				
			||||||
msgstr "Multiplicador inválido"
 | 
					msgstr "Multiplicador inválido"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -504,7 +504,7 @@ msgstr "Évènements de tir"
 | 
				
			|||||||
#: lib/cannery_web/components/core_components/pack_card.html.heex:47
 | 
					#: lib/cannery_web/components/core_components/pack_card.html.heex:47
 | 
				
			||||||
#: lib/cannery_web/components/pack_table_component.ex:181
 | 
					#: lib/cannery_web/components/pack_table_component.ex:181
 | 
				
			||||||
#: lib/cannery_web/components/pack_table_component.ex:264
 | 
					#: lib/cannery_web/components/pack_table_component.ex:264
 | 
				
			||||||
#: lib/cannery_web/components/type_table_component.ex:265
 | 
					#: lib/cannery_web/components/type_table_component.ex:273
 | 
				
			||||||
#: lib/cannery_web/live/pack_live/show.html.heex:37
 | 
					#: lib/cannery_web/live/pack_live/show.html.heex:37
 | 
				
			||||||
#: lib/cannery_web/live/pack_live/show.html.heex:42
 | 
					#: lib/cannery_web/live/pack_live/show.html.heex:42
 | 
				
			||||||
#: lib/cannery_web/live/type_live/show.html.heex:150
 | 
					#: lib/cannery_web/live/type_live/show.html.heex:150
 | 
				
			||||||
@@ -596,7 +596,7 @@ msgstr "Cartouches :"
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#: lib/cannery_web/components/pack_table_component.ex:178
 | 
					#: lib/cannery_web/components/pack_table_component.ex:178
 | 
				
			||||||
#: lib/cannery_web/components/pack_table_component.ex:260
 | 
					#: lib/cannery_web/components/pack_table_component.ex:260
 | 
				
			||||||
#: lib/cannery_web/components/type_table_component.ex:264
 | 
					#: lib/cannery_web/components/type_table_component.ex:272
 | 
				
			||||||
#: lib/cannery_web/live/type_live/show.html.heex:154
 | 
					#: lib/cannery_web/live/type_live/show.html.heex:154
 | 
				
			||||||
#, elixir-autogen, elixir-format
 | 
					#, elixir-autogen, elixir-format
 | 
				
			||||||
msgid "No cost information"
 | 
					msgid "No cost information"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -169,7 +169,7 @@ msgstr "Impossible d'analyser le nombre de copies"
 | 
				
			|||||||
msgid "Invalid number of copies, must be between 1 and %{max}. Was %{multiplier}"
 | 
					msgid "Invalid number of copies, must be between 1 and %{max}. Was %{multiplier}"
 | 
				
			||||||
msgstr "Nombre de copies invalide, doit être 1 et %{max}. Été %{multiplier}"
 | 
					msgstr "Nombre de copies invalide, doit être 1 et %{max}. Été %{multiplier}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: lib/cannery/ammo.ex:990
 | 
					#: lib/cannery/ammo.ex:979
 | 
				
			||||||
#, elixir-autogen, elixir-format
 | 
					#, elixir-autogen, elixir-format
 | 
				
			||||||
msgid "Invalid multiplier"
 | 
					msgid "Invalid multiplier"
 | 
				
			||||||
msgstr "Multiplicateur invalide"
 | 
					msgstr "Multiplicateur invalide"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -498,7 +498,7 @@ msgstr ""
 | 
				
			|||||||
#: lib/cannery_web/components/core_components/pack_card.html.heex:47
 | 
					#: lib/cannery_web/components/core_components/pack_card.html.heex:47
 | 
				
			||||||
#: lib/cannery_web/components/pack_table_component.ex:181
 | 
					#: lib/cannery_web/components/pack_table_component.ex:181
 | 
				
			||||||
#: lib/cannery_web/components/pack_table_component.ex:264
 | 
					#: lib/cannery_web/components/pack_table_component.ex:264
 | 
				
			||||||
#: lib/cannery_web/components/type_table_component.ex:265
 | 
					#: lib/cannery_web/components/type_table_component.ex:273
 | 
				
			||||||
#: lib/cannery_web/live/pack_live/show.html.heex:37
 | 
					#: lib/cannery_web/live/pack_live/show.html.heex:37
 | 
				
			||||||
#: lib/cannery_web/live/pack_live/show.html.heex:42
 | 
					#: lib/cannery_web/live/pack_live/show.html.heex:42
 | 
				
			||||||
#: lib/cannery_web/live/type_live/show.html.heex:150
 | 
					#: lib/cannery_web/live/type_live/show.html.heex:150
 | 
				
			||||||
@@ -590,7 +590,7 @@ msgstr ""
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#: lib/cannery_web/components/pack_table_component.ex:178
 | 
					#: lib/cannery_web/components/pack_table_component.ex:178
 | 
				
			||||||
#: lib/cannery_web/components/pack_table_component.ex:260
 | 
					#: lib/cannery_web/components/pack_table_component.ex:260
 | 
				
			||||||
#: lib/cannery_web/components/type_table_component.ex:264
 | 
					#: lib/cannery_web/components/type_table_component.ex:272
 | 
				
			||||||
#: lib/cannery_web/live/type_live/show.html.heex:154
 | 
					#: lib/cannery_web/live/type_live/show.html.heex:154
 | 
				
			||||||
#, elixir-autogen, elixir-format
 | 
					#, elixir-autogen, elixir-format
 | 
				
			||||||
msgid "No cost information"
 | 
					msgid "No cost information"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -168,7 +168,7 @@ msgstr ""
 | 
				
			|||||||
msgid "Invalid number of copies, must be between 1 and %{max}. Was %{multiplier}"
 | 
					msgid "Invalid number of copies, must be between 1 and %{max}. Was %{multiplier}"
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: lib/cannery/ammo.ex:990
 | 
					#: lib/cannery/ammo.ex:979
 | 
				
			||||||
#, elixir-autogen, elixir-format
 | 
					#, elixir-autogen, elixir-format
 | 
				
			||||||
msgid "Invalid multiplier"
 | 
					msgid "Invalid multiplier"
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -490,28 +490,39 @@ defmodule Cannery.AmmoTest do
 | 
				
			|||||||
      assert 2 = Ammo.get_packs_count(current_user, type_id: type.id, show_used: :only_used)
 | 
					      assert 2 = Ammo.get_packs_count(current_user, type_id: type.id, show_used: :only_used)
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    test "get_used_packs_count_for_types/2 gets accurate total ammo counts for types",
 | 
					    test "get_grouped_packs_count/2 gets accurate total ammo counts for types",
 | 
				
			||||||
         %{
 | 
					         %{
 | 
				
			||||||
           type: %{id: type_id} = type,
 | 
					           type: %{id: type_id} = type,
 | 
				
			||||||
           current_user: current_user,
 | 
					           current_user: current_user,
 | 
				
			||||||
           container: container
 | 
					           container: container
 | 
				
			||||||
         } do
 | 
					         } do
 | 
				
			||||||
      # testing empty type
 | 
					      # testing empty type
 | 
				
			||||||
      assert %{} == [type] |> Ammo.get_used_packs_count_for_types(current_user)
 | 
					      assert %{} ==
 | 
				
			||||||
 | 
					               Ammo.get_grouped_packs_count(current_user,
 | 
				
			||||||
 | 
					                 types: [type],
 | 
				
			||||||
 | 
					                 group_by: :type_id,
 | 
				
			||||||
 | 
					                 show_used: :only_used
 | 
				
			||||||
 | 
					               )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      # testing two empty types
 | 
					      # testing two empty types
 | 
				
			||||||
      %{id: another_type_id} = another_type = type_fixture(current_user)
 | 
					      %{id: another_type_id} = another_type = type_fixture(current_user)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      assert %{} ==
 | 
					      assert %{} ==
 | 
				
			||||||
               [type, another_type]
 | 
					               Ammo.get_grouped_packs_count(current_user,
 | 
				
			||||||
               |> Ammo.get_used_packs_count_for_types(current_user)
 | 
					                 types: [type, another_type],
 | 
				
			||||||
 | 
					                 group_by: :type_id,
 | 
				
			||||||
 | 
					                 show_used: :only_used
 | 
				
			||||||
 | 
					               )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      # testing type with pack
 | 
					      # testing type with pack
 | 
				
			||||||
      {1, [first_pack]} = pack_fixture(%{count: 1}, type, container, current_user)
 | 
					      {1, [first_pack]} = pack_fixture(%{count: 1}, type, container, current_user)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      assert %{} ==
 | 
					      assert %{} ==
 | 
				
			||||||
               [type, another_type]
 | 
					               Ammo.get_grouped_packs_count(current_user,
 | 
				
			||||||
               |> Ammo.get_used_packs_count_for_types(current_user)
 | 
					                 types: [type, another_type],
 | 
				
			||||||
 | 
					                 group_by: :type_id,
 | 
				
			||||||
 | 
					                 show_used: :only_used
 | 
				
			||||||
 | 
					               )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      # testing type with used pack
 | 
					      # testing type with used pack
 | 
				
			||||||
      {1, [another_pack]} = pack_fixture(%{count: 50}, another_type, container, current_user)
 | 
					      {1, [another_pack]} = pack_fixture(%{count: 50}, another_type, container, current_user)
 | 
				
			||||||
@@ -519,14 +530,22 @@ defmodule Cannery.AmmoTest do
 | 
				
			|||||||
      shot_record_fixture(%{count: 50}, current_user, another_pack)
 | 
					      shot_record_fixture(%{count: 50}, current_user, another_pack)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      assert %{another_type_id => 1} ==
 | 
					      assert %{another_type_id => 1} ==
 | 
				
			||||||
               [type, another_type]
 | 
					               Ammo.get_grouped_packs_count(current_user,
 | 
				
			||||||
               |> Ammo.get_used_packs_count_for_types(current_user)
 | 
					                 types: [type, another_type],
 | 
				
			||||||
 | 
					                 group_by: :type_id,
 | 
				
			||||||
 | 
					                 show_used: :only_used
 | 
				
			||||||
 | 
					               )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      # testing two types with zero and one used packs
 | 
					      # testing two types with zero and one used packs
 | 
				
			||||||
      {1, [pack]} = pack_fixture(%{count: 50}, type, container, current_user)
 | 
					      {1, [pack]} = pack_fixture(%{count: 50}, type, container, current_user)
 | 
				
			||||||
      shot_record_fixture(%{count: 50}, current_user, pack)
 | 
					      shot_record_fixture(%{count: 50}, current_user, pack)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      used_counts = [type, another_type] |> Ammo.get_used_packs_count_for_types(current_user)
 | 
					      used_counts =
 | 
				
			||||||
 | 
					        Ammo.get_grouped_packs_count(current_user,
 | 
				
			||||||
 | 
					          types: [type, another_type],
 | 
				
			||||||
 | 
					          group_by: :type_id,
 | 
				
			||||||
 | 
					          show_used: :only_used
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      assert %{^type_id => 1} = used_counts
 | 
					      assert %{^type_id => 1} = used_counts
 | 
				
			||||||
      assert %{^another_type_id => 1} = used_counts
 | 
					      assert %{^another_type_id => 1} = used_counts
 | 
				
			||||||
@@ -534,7 +553,12 @@ defmodule Cannery.AmmoTest do
 | 
				
			|||||||
      # testing two type with one and two used packs
 | 
					      # testing two type with one and two used packs
 | 
				
			||||||
      shot_record_fixture(%{count: 1}, current_user, first_pack)
 | 
					      shot_record_fixture(%{count: 1}, current_user, first_pack)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      used_counts = [type, another_type] |> Ammo.get_used_packs_count_for_types(current_user)
 | 
					      used_counts =
 | 
				
			||||||
 | 
					        Ammo.get_grouped_packs_count(current_user,
 | 
				
			||||||
 | 
					          types: [type, another_type],
 | 
				
			||||||
 | 
					          group_by: :type_id,
 | 
				
			||||||
 | 
					          show_used: :only_used
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      assert %{^type_id => 2} = used_counts
 | 
					      assert %{^type_id => 2} = used_counts
 | 
				
			||||||
      assert %{^another_type_id => 1} = used_counts
 | 
					      assert %{^another_type_id => 1} = used_counts
 | 
				
			||||||
@@ -557,7 +581,7 @@ defmodule Cannery.AmmoTest do
 | 
				
			|||||||
      assert 25 = Ammo.get_packs_count(current_user, container_id: container.id)
 | 
					      assert 25 = Ammo.get_packs_count(current_user, container_id: container.id)
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    test "get_packs_count_for_containers/2 gets accurate ammo count for containers", %{
 | 
					    test "get_grouped_packs_count/2 gets accurate ammo count for containers", %{
 | 
				
			||||||
      type: type,
 | 
					      type: type,
 | 
				
			||||||
      current_user: current_user,
 | 
					      current_user: current_user,
 | 
				
			||||||
      container: %{id: container_id} = container
 | 
					      container: %{id: container_id} = container
 | 
				
			||||||
@@ -569,8 +593,10 @@ defmodule Cannery.AmmoTest do
 | 
				
			|||||||
      {1, [_first_pack]} = pack_fixture(%{count: 5}, type, another_container, current_user)
 | 
					      {1, [_first_pack]} = pack_fixture(%{count: 5}, type, another_container, current_user)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      packs_count =
 | 
					      packs_count =
 | 
				
			||||||
        [container, another_container]
 | 
					        Ammo.get_grouped_packs_count(current_user,
 | 
				
			||||||
        |> Ammo.get_packs_count_for_containers(current_user)
 | 
					          containers: [container, another_container],
 | 
				
			||||||
 | 
					          group_by: :container_id
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      assert %{^container_id => 1} = packs_count
 | 
					      assert %{^container_id => 1} = packs_count
 | 
				
			||||||
      assert %{^another_container_id => 1} = packs_count
 | 
					      assert %{^another_container_id => 1} = packs_count
 | 
				
			||||||
@@ -578,8 +604,10 @@ defmodule Cannery.AmmoTest do
 | 
				
			|||||||
      {25, _packs} = pack_fixture(%{count: 5}, 25, type, container, current_user)
 | 
					      {25, _packs} = pack_fixture(%{count: 5}, 25, type, container, current_user)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      packs_count =
 | 
					      packs_count =
 | 
				
			||||||
        [container, another_container]
 | 
					        Ammo.get_grouped_packs_count(current_user,
 | 
				
			||||||
        |> Ammo.get_packs_count_for_containers(current_user)
 | 
					          containers: [container, another_container],
 | 
				
			||||||
 | 
					          group_by: :container_id
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      assert %{^container_id => 26} = packs_count
 | 
					      assert %{^container_id => 26} = packs_count
 | 
				
			||||||
      assert %{^another_container_id => 1} = packs_count
 | 
					      assert %{^another_container_id => 1} = packs_count
 | 
				
			||||||
@@ -587,8 +615,10 @@ defmodule Cannery.AmmoTest do
 | 
				
			|||||||
      shot_record_fixture(%{count: 1}, current_user, first_pack)
 | 
					      shot_record_fixture(%{count: 1}, current_user, first_pack)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      packs_count =
 | 
					      packs_count =
 | 
				
			||||||
        [container, another_container]
 | 
					        Ammo.get_grouped_packs_count(current_user,
 | 
				
			||||||
        |> Ammo.get_packs_count_for_containers(current_user)
 | 
					          containers: [container, another_container],
 | 
				
			||||||
 | 
					          group_by: :container_id
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      assert %{^container_id => 26} = packs_count
 | 
					      assert %{^container_id => 26} = packs_count
 | 
				
			||||||
      assert %{^another_container_id => 1} = packs_count
 | 
					      assert %{^another_container_id => 1} = packs_count
 | 
				
			||||||
@@ -596,8 +626,10 @@ defmodule Cannery.AmmoTest do
 | 
				
			|||||||
      shot_record_fixture(%{count: 4}, current_user, first_pack)
 | 
					      shot_record_fixture(%{count: 4}, current_user, first_pack)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      packs_count =
 | 
					      packs_count =
 | 
				
			||||||
        [container, another_container]
 | 
					        Ammo.get_grouped_packs_count(current_user,
 | 
				
			||||||
        |> Ammo.get_packs_count_for_containers(current_user)
 | 
					          containers: [container, another_container],
 | 
				
			||||||
 | 
					          group_by: :container_id
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      assert %{^container_id => 25} = packs_count
 | 
					      assert %{^container_id => 25} = packs_count
 | 
				
			||||||
      assert %{^another_container_id => 1} = packs_count
 | 
					      assert %{^another_container_id => 1} = packs_count
 | 
				
			||||||
@@ -888,30 +920,34 @@ defmodule Cannery.AmmoTest do
 | 
				
			|||||||
      assert 6 = Ammo.get_packs_count(current_user, type_id: type.id)
 | 
					      assert 6 = Ammo.get_packs_count(current_user, type_id: type.id)
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    test "get_packs_count_for_types/2 returns counts of packs for types", %{
 | 
					    test "get_grouped_packs_count/2 returns counts of packs for types", %{
 | 
				
			||||||
      type: %{id: type_id} = type,
 | 
					      type: %{id: type_id} = type,
 | 
				
			||||||
      container: container,
 | 
					      container: container,
 | 
				
			||||||
      current_user: current_user
 | 
					      current_user: current_user
 | 
				
			||||||
    } do
 | 
					    } do
 | 
				
			||||||
      assert %{type_id => 1} ==
 | 
					      assert %{type_id => 1} ==
 | 
				
			||||||
               [type] |> Ammo.get_packs_count_for_types(current_user)
 | 
					               Ammo.get_grouped_packs_count(current_user, types: [type], group_by: :type_id)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      %{id: another_type_id} = another_type = type_fixture(current_user)
 | 
					      %{id: another_type_id} = another_type = type_fixture(current_user)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      assert %{type_id => 1} ==
 | 
					      assert %{type_id => 1} ==
 | 
				
			||||||
               [type, another_type]
 | 
					               Ammo.get_grouped_packs_count(current_user,
 | 
				
			||||||
               |> Ammo.get_packs_count_for_types(current_user)
 | 
					                 types: [type, another_type],
 | 
				
			||||||
 | 
					                 group_by: :type_id
 | 
				
			||||||
 | 
					               )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      {1, [_pack]} = pack_fixture(another_type, container, current_user)
 | 
					      {1, [_pack]} = pack_fixture(another_type, container, current_user)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      packs_count = [type, another_type] |> Ammo.get_packs_count_for_types(current_user)
 | 
					      packs_count =
 | 
				
			||||||
 | 
					        Ammo.get_grouped_packs_count(current_user, types: [type, another_type], group_by: :type_id)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      assert %{^type_id => 1} = packs_count
 | 
					      assert %{^type_id => 1} = packs_count
 | 
				
			||||||
      assert %{^another_type_id => 1} = packs_count
 | 
					      assert %{^another_type_id => 1} = packs_count
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      {5, _packs} = pack_fixture(%{}, 5, type, container, current_user)
 | 
					      {5, _packs} = pack_fixture(%{}, 5, type, container, current_user)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      packs_count = [type, another_type] |> Ammo.get_packs_count_for_types(current_user)
 | 
					      packs_count =
 | 
				
			||||||
 | 
					        Ammo.get_grouped_packs_count(current_user, types: [type, another_type], group_by: :type_id)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      assert %{^type_id => 6} = packs_count
 | 
					      assert %{^type_id => 6} = packs_count
 | 
				
			||||||
      assert %{^another_type_id => 1} = packs_count
 | 
					      assert %{^another_type_id => 1} = packs_count
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user