defmodule ArcadiaCloudWeb.QuoteController do @moduledoc """ Pricing quotes. A tenant hits this before provisioning to see what a plan + addons would cost, optionally with projected usage to preview likely overage. Body: plan_code — required addons — optional list of addon codes projected_usage — optional map resource_kind => qty starts_on — optional ISO date; if set, returns prorated first-invoice figures """ use ArcadiaCloudWeb, :controller alias ArcadiaCloud.{Catalog, Quoting} def create(conn, params) do plan = params["plan_code"] && Catalog.get_plan_by_code(params["plan_code"]) version = plan && Catalog.active_version(plan) cond do is_nil(version) -> conn |> put_status(:not_found) |> json(%{error: "plan_or_version_not_found"}) true -> addons = Catalog.get_addons(params["addons"] || []) opts = [] |> put_opt(:usage, params["projected_usage"]) |> put_opt(:starts_on, parse_date(params["starts_on"])) quote = Quoting.quote(version, addons, opts) json(conn, %{quote: quote, plan_code: plan.code}) end end defp put_opt(opts, _key, nil), do: opts defp put_opt(opts, key, value), do: Keyword.put(opts, key, value) defp parse_date(nil), do: nil defp parse_date(""), do: nil defp parse_date(s) do case Date.from_iso8601(s) do {:ok, d} -> d _ -> nil end end end