From b5686f890a35c167975b02b5bbf2ed7a15b1b326 Mon Sep 17 00:00:00 2001 From: HaimKortovich Date: Wed, 29 Apr 2026 16:56:51 -0500 Subject: [PATCH] add life policy aggregate --- .../aggregates/fire_policy_application.ex | 11 ------ .../aggregates/life_policy_application.ex | 37 +++++++++++++++++++ lib/policy_service/commands/fire_policy.ex | 8 ---- .../controllers/policy_controller.ex | 16 +++++--- lib/policy_service_web/schemas/policy.ex | 9 +++-- 5 files changed, 52 insertions(+), 29 deletions(-) delete mode 100644 lib/policy_service/aggregates/fire_policy_application.ex create mode 100644 lib/policy_service/aggregates/life_policy_application.ex delete mode 100644 lib/policy_service/commands/fire_policy.ex diff --git a/lib/policy_service/aggregates/fire_policy_application.ex b/lib/policy_service/aggregates/fire_policy_application.ex deleted file mode 100644 index 652be12..0000000 --- a/lib/policy_service/aggregates/fire_policy_application.ex +++ /dev/null @@ -1,11 +0,0 @@ -defmodule PolicyService.Aggregates.FirePolicyApplication do - use PolicyService.Aggregates.PolicyApplication, - policy_type: "fire", - commands: PolicyService.Commands.FirePolicy - - def validate_details(%{property_address: addr, property_value: val}) - when is_binary(addr) and byte_size(addr) > 0 and is_number(val) and val > 0, - do: :ok - - def validate_details(_), do: {:error, :invalid_fire_details} -end diff --git a/lib/policy_service/aggregates/life_policy_application.ex b/lib/policy_service/aggregates/life_policy_application.ex new file mode 100644 index 0000000..66b2444 --- /dev/null +++ b/lib/policy_service/aggregates/life_policy_application.ex @@ -0,0 +1,37 @@ +defmodule PolicyService.Aggregates.LifePolicyApplication do + use PolicyService.Aggregates.PolicyApplication, + policy_type: "life", + commands: PolicyService.Commands.LifePolicy + + @valid_coverage_types ~w(banking protection) + + def validate_details(%{ + "coverage_type" => coverage_type, + "coverage_amount" => coverage_amount, + "coverage_years" => coverage_years, + "smoker" => smoker, + "medications" => medications, + "surgeries" => surgeries, + "weight" => weight, + "height" => height + }) + when is_binary(coverage_type) and byte_size(coverage_type) > 0 and + is_number(coverage_amount) and coverage_amount > 0 and + is_integer(coverage_years) and coverage_years > 0 and + is_boolean(smoker) and + is_list(medications) and + is_list(surgeries) and + is_number(weight) and weight > 0 and + is_number(height) and height > 0 do + cond do + coverage_type not in @valid_coverage_types -> {:error, :invalid_coverage_type} + coverage_years > 100 -> {:error, :invalid_coverage_years} + true -> :ok + end + end + + def validate_details(_), do: {:error, :invalid_life_details} + + def validate_insured(%{"type" => "corporate"}), do: {:error, :life_insurance_requires_individual} + def validate_insured(insured), do: super(insured) +end diff --git a/lib/policy_service/commands/fire_policy.ex b/lib/policy_service/commands/fire_policy.ex deleted file mode 100644 index 4e46bae..0000000 --- a/lib/policy_service/commands/fire_policy.ex +++ /dev/null @@ -1,8 +0,0 @@ -defmodule PolicyService.Commands.FirePolicy do - defmodule SubmitPolicyApplication, - do: use(PolicyService.Commands.Policy.SubmitPolicyApplication) - - defmodule RecordProviderQuote, do: use(PolicyService.Commands.Policy.RecordProviderQuote) - defmodule AcceptQuoteAndSolicit, do: use(PolicyService.Commands.Policy.AcceptQuoteAndSolicit) - defmodule RecordPolicyIssued, do: use(PolicyService.Commands.Policy.RecordPolicyIssued) -end diff --git a/lib/policy_service_web/controllers/policy_controller.ex b/lib/policy_service_web/controllers/policy_controller.ex index 507c622..3b86804 100644 --- a/lib/policy_service_web/controllers/policy_controller.ex +++ b/lib/policy_service_web/controllers/policy_controller.ex @@ -300,6 +300,7 @@ defmodule PolicyServiceWeb.PolicyController do "name" => info["name"], "date_of_birth" => dob, "document_id" => info["document_id"], + "gender" => info["gender"], "email" => info["email"], "phone" => info["phone"], "address" => info["address"] @@ -379,7 +380,10 @@ defmodule PolicyServiceWeb.PolicyController do "car_type" => d["car_type"], "chassis_number" => d["chassis_number"], "engine_number" => d["engine_number"], - "rc_limits" => d["rc_limits"], + "rc_limits" => %{ + "bodily_injury" => d["rc_limits"]["bodily_injury"], + "property_damage" => d["rc_limits"]["property_damage"] + }, "market_value" => d["market_value"], "requested_value" => d["requested_value"] }} @@ -395,8 +399,8 @@ defmodule PolicyServiceWeb.PolicyController do "coverage_amount" => d["coverage_amount"], "coverage_years" => d["coverage_years"], "smoker" => d["smoker"], - "medications" => d["medications"], - "surgeries" => d["surgeries"], + "medications" => d["medications"] || [], + "surgeries" => d["surgeries"] || [], "weight" => d["weight"], "height" => d["height"] }} @@ -411,7 +415,7 @@ defmodule PolicyServiceWeb.PolicyController do "location" => d["location"], "property_value" => d["property_value"], "property_use" => d["property_use"], - "security_measures" => d["security_measures"], + "security_measures" => d["security_measures"] || [], "market_value" => d["market_value"] }} end @@ -425,8 +429,8 @@ defmodule PolicyServiceWeb.PolicyController do "location" => d["location"], "contents_value" => d["contents_value"], "property_use" => d["property_use"], - "security_measures" => d["security_measures"], - "high_value_items" => d["high_value_items"] + "security_measures" => d["security_measures"] || [], + "high_value_items" => d["high_value_items"] || [] }} end diff --git a/lib/policy_service_web/schemas/policy.ex b/lib/policy_service_web/schemas/policy.ex index 304a483..9447539 100644 --- a/lib/policy_service_web/schemas/policy.ex +++ b/lib/policy_service_web/schemas/policy.ex @@ -24,12 +24,13 @@ defmodule PolicyServiceWeb.Schemas.Policy do OpenApiSpex.schema(%{ title: "InsuredIndividual", type: :object, - required: [:type, :name, :date_of_birth, :document_id], + required: [:type, :name, :date_of_birth, :document_id, :gender], properties: %{ type: %Schema{type: :string, enum: ["individual"]}, name: %Schema{type: :string, example: "Juan Pérez"}, date_of_birth: %Schema{type: :string, format: :date, example: "1985-06-15"}, document_id: %Schema{type: :string, example: "8-123-456"}, + gender: %Schema{type: :string, enum: ["male", "female"], example: "male"}, email: %Schema{type: :string, format: :email, example: "juan@example.com"}, phone: %Schema{type: :string, example: "+507-1234-5678"}, address: %Schema{type: :string, example: "Calle 50, Panama City"} @@ -220,7 +221,7 @@ defmodule PolicyServiceWeb.Schemas.Policy do OpenApiSpex.schema(%{ title: "LifePolicyDetails", type: :object, - required: [:coverage_type, :coverage_amount, :coverage_years, :smoker, :weight, :height], + required: [:coverage_type, :coverage_amount, :coverage_years, :smoker], properties: %{ coverage_type: %Schema{ type: :string, @@ -229,8 +230,8 @@ defmodule PolicyServiceWeb.Schemas.Policy do coverage_amount: %Schema{type: :number, example: 100_000}, coverage_years: %Schema{type: :integer, example: 10}, smoker: %Schema{type: :boolean, example: false}, - medications: %Schema{type: :array, items: %Schema{type: :string}}, - surgeries: %Schema{type: :array, items: %Schema{type: :string}}, + medications: %Schema{type: :array, items: %Schema{type: :string}, example: ["Aspirin", "Lisinopril"]}, + surgeries: %Schema{type: :array, items: %Schema{type: :string}, example: ["Appendectomy, 2015"]}, weight: %Schema{type: :number, example: 70}, height: %Schema{type: :number, example: 175} }