defmodule CustomerService.Projectors.Customer do use Commanded.Projections.Ecto, application: CustomerService.CommandedApp, repo: CustomerService.Repo, name: "CustomerService.Projetors.Customer", consistency: :strong alias CustomerService.Events alias CustomerService.Projections.Customer project(%Events.CustomerCreated{} = event, fn multi -> Ecto.Multi.insert(multi, :customer, %Customer{ id: event.id, customer_type: "individual", first_name: event.first_name, last_name: event.last_name, birth_date: parse_date(event.birth_date), gender: event.gender, email: event.email, phone: event.phone, address: event.address, document_id: event.document_id }) end) defp parse_date(nil), do: nil defp parse_date(%Date{} = d), do: d defp parse_date(str) when is_binary(str) do case Date.from_iso8601(str) do {:ok, d} -> d _ -> nil end end project(%Events.CorporateCustomerCreated{} = e, _meta, fn multi -> Ecto.Multi.insert(multi, :customer, %Customer{ id: e.id, customer_type: "corporate", legal_name: e.legal_name, commercial_name: e.commercial_name, ruc: e.ruc, legal_rep_name: e.legal_rep_name, legal_rep_document_id: e.legal_rep_document_id, email: e.email, phone: e.phone, address: e.address }) end) end