zf

zenflows testing
git clone https://s.sonu.ch/~srfsh/zf.git
Log | Files | Refs | Submodules | README | LICENSE

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:
Msrc/zenflows/vf/economic_event.ex | 18++++++++++++++++++
Msrc/zenflows/vf/economic_resource.ex | 12++++++++++++
Msrc/zenflows/vf/economic_resource/domain.ex | 83+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/zenflows/vf/economic_resource/resolv.ex | 4++++
Msrc/zenflows/vf/economic_resource/type.ex | 2++
Msrc/zenflows/vf/process.ex | 8++++++++
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