commit 5b2198fa0d3f498c692b44e15c439d26f2d9c4f2
parent 30d1b242f5caacb00d87968cb2cf0e355941c62f
Author: Alberto Lerda <30939098+albertolerda@users.noreply.github.com>
Date: Wed, 7 Dec 2022 12:06:51 +0100
Merge pull request #37 from interfacerproject/alberto/stefano-dpp
Zenflows.VF.EcomicResource: DPP of stefano
Diffstat:
6 files changed, 127 insertions(+), 0 deletions(-)
diff --git a/src/zenflows/vf/economic_event.ex b/src/zenflows/vf/economic_event.ex
@@ -64,6 +64,24 @@ alias Zenflows.VF.{
previous_event: nil | EconomicEvent.t(),
}
+@derive {Jason.Encoder, only: ~w[
+ id
+ action_id
+ resource_classified_as
+ resource_quantity_has_numerical_value
+ effort_quantity_has_numerical_value
+ has_beginning has_end has_point_in_time
+ note agreed_in
+ input_of_id output_of_id
+ provider_id receiver_id
+ resource_inventoried_as_id to_resource_inventoried_as_id
+ resource_conforms_to_id
+ resource_quantity_has_unit_id effort_quantity_has_unit_id
+ to_location_id at_location_id
+ realization_of_id
+ triggered_by_id
+ previous_event_id
+]a}
schema "vf_economic_event" do
field :action_id, Action.ID
field :action, :map, virtual: true
diff --git a/src/zenflows/vf/economic_resource.ex b/src/zenflows/vf/economic_resource.ex
@@ -67,6 +67,18 @@ alias Zenflows.VF.{
previous_event: nil | EconomicEvent.t(),
}
+@derive {Jason.Encoder, only: ~w[
+ id
+ name note tracking_identifier classified_as state_id okhv
+ repo version licensor license metadata
+ accounting_quantity_has_numerical_value
+ accounting_quantity_has_unit_id
+ onhand_quantity_has_numerical_value
+ onhand_quantity_has_unit_id
+ conforms_to_id primary_accountable_id custodian_id
+ stage_id current_location_id lot_id contained_in_id
+ unit_of_effort_id previous_event_id
+]a}
schema "vf_economic_resource" do
field :name, :string
field :note, :string
diff --git a/src/zenflows/vf/economic_resource/domain.ex b/src/zenflows/vf/economic_resource/domain.ex
@@ -272,4 +272,87 @@ def multi_delete(m, key \\ multi_key(), id) do
|> multi_one("#{key}.one", id)
|> Multi.delete(key, &Map.fetch!(&1, "#{key}.one"))
end
+
+@max_depth 100000000
+
+@spec trace_dpp_er_before(EconomicResource.t(), MapSet.t(), integer()) :: {MapSet.t(), map()}
+def trace_dpp_er_before(_item, visited, depth) when depth >= @max_depth do
+ {visited, %{}}
+end
+def trace_dpp_er_before(item = %EconomicResource{}, visited, depth) do
+ a_dpp_item = %{node: item}
+ {visited2, children} = EconomicResource.Domain.previous(item) |> Enum.reduce({visited, []},
+ fn ee, {visited, children} ->
+ if MapSet.member?(visited, {ee.__struct__, ee.id}) do
+ {visited, children}
+ else
+ {visited2, child} = trace_dpp_ee_before(ee, visited, depth+1)
+ {MapSet.put(visited2, {ee.__struct__, ee.id}), [ child | children ]}
+ end
+ end
+ )
+ {visited2, Map.put(a_dpp_item, :children, children)}
+end
+
+@spec trace_dpp_ee_before_recurse(
+ EconomicEvent.t() | EconomicResource.t() | Process.t(),
+ MapSet.t(), pos_integer() ) :: {MapSet.t(), map()}
+def trace_dpp_ee_before_recurse(item = %EconomicResource{}, visited, depth) do
+ trace_dpp_er_before(item, visited, depth)
+end
+def trace_dpp_ee_before_recurse(item = %EconomicEvent{}, visited, depth) do
+ trace_dpp_ee_before(item, visited, depth)
+end
+def trace_dpp_ee_before_recurse(item = %Process{}, visited, depth) do
+ trace_dpp_pr_before(item, MapSet.put(visited, {item.__struct__, item.id}), depth)
+end
+
+@spec trace_dpp_ee_before(EconomicEvent.t(), MapSet.t(), pos_integer()) :: {MapSet.t(), map()}
+def trace_dpp_ee_before(_item, visited, depth) when depth >= @max_depth do
+ {visited, %{}}
+end
+def trace_dpp_ee_before(item = %EconomicEvent{}, visited, depth) do
+ a_dpp_item = %{node: item}
+ pr_item = EconomicEvent.Domain.previous(item)
+ if pr_item == nil do
+ {visited, Map.put(a_dpp_item, :children, [])}
+ else
+ {visited2, children} = [pr_item] |> Enum.reduce({visited, []},
+ fn pf, {visited, children} ->
+ if MapSet.member?(visited, {pf.__struct__, pf.id}) do
+ {visited, children}
+ else
+ {visited2, child} = trace_dpp_ee_before_recurse(pf, visited, depth+1)
+ { MapSet.put(visited2, {pf.__struct__, pf.id}), [ child | children ]}
+ end
+ end
+ )
+ {visited2, Map.put(a_dpp_item, :children, children)}
+ end
+end
+
+@spec trace_dpp_pr_before(Process.t(), MapSet.t(), integer()) :: {MapSet.t(), map()}
+def trace_dpp_pr_before(_item, visited, depth) when depth >= @max_depth do
+ {visited, %{}}
+end
+def trace_dpp_pr_before(item, visited, depth) do
+ a_dpp_item = %{node: item}
+ {visited2, children} = Process.Domain.previous(item) |> Enum.reduce({visited, []},
+ fn ee, {visited, children} ->
+ if MapSet.member?(visited, ee.id) do
+ {visited, children}
+ else
+ {visited2, child} = trace_dpp_ee_before(ee, visited, depth+1)
+ {MapSet.put(visited2, ee.id), [ child | children ]}
+ end
+ end
+ )
+ {visited2, Map.put(a_dpp_item, :children, children)}
+end
+
+@spec trace_dpp(EconomicResource.t(), Page.t()) :: map()
+def trace_dpp(item, _page \\ Page.new()) do
+ {_, dpp} = trace_dpp_er_before(item, MapSet.new(), 0)
+ dpp
+end
end
diff --git a/src/zenflows/vf/economic_resource/resolv.ex b/src/zenflows/vf/economic_resource/resolv.ex
@@ -117,4 +117,8 @@ end
def trace(eco_res, _, _) do
{:ok, Domain.trace(eco_res)}
end
+
+def trace_dpp(eco_res, _, _) do
+ {:ok, Domain.trace_dpp(eco_res)}
+end
end
diff --git a/src/zenflows/vf/economic_resource/type.ex b/src/zenflows/vf/economic_resource/type.ex
@@ -183,6 +183,8 @@ object :economic_resource do
field :trace, list_of(non_null(:track_trace_item)),
resolve: &Resolv.trace/3
+
+ field :trace_dpp, non_null(:json), resolve: &Resolv.trace_dpp/3
end
input_object :economic_resource_create_params do
diff --git a/src/zenflows/vf/process.ex b/src/zenflows/vf/process.ex
@@ -45,6 +45,14 @@ alias Zenflows.VF.{
nested_in: Scenario.t() | nil,
}
+@derive {Jason.Encoder, only: ~w[
+ id
+ name note
+ has_beginning has_end
+ finished deletable
+ classified_as
+ based_on_id planned_within_id
+]a}
schema "vf_process" do
field :name, :string
field :note, :string