defmodule ProviderServiceWeb.Schemas.Provider do alias OpenApiSpex.Schema defmodule PaginationMeta do require OpenApiSpex OpenApiSpex.schema(%{ title: "PaginationMeta", type: :object, properties: %{ total_count: %Schema{type: :integer}, total_pages: %Schema{type: :integer}, current_page: %Schema{type: :integer}, page_size: %Schema{type: :integer}, has_next: %Schema{type: :boolean}, has_prev: %Schema{type: :boolean} } }) end defmodule Template do require OpenApiSpex OpenApiSpex.schema(%{ title: "Template", type: :object, properties: %{ template_id: %Schema{type: :string, format: :uuid}, policy_type: %Schema{type: :string}, client_type: %Schema{type: :string, enum: ["natural", "juridico"]}, document_url: %Schema{type: :string}, active: %Schema{type: :boolean} } }) end defmodule RegisterProvider do require OpenApiSpex OpenApiSpex.schema(%{ title: "RegisterProvider", type: :object, required: [:provider_id, :name], properties: %{ provider_id: %Schema{ type: :string, pattern: "^[a-zA-Z0-9]+$", description: "Alphanumeric ID for the provider" }, name: %Schema{type: :string, example: "Seguros ABC"}, email: %Schema{type: :string, format: :email}, phone: %Schema{type: :string}, contact_name: %Schema{type: :string}, ruc: %Schema{type: :string}, address: %Schema{type: :string} } }) end defmodule UpdateProvider do require OpenApiSpex OpenApiSpex.schema(%{ title: "UpdateProvider", type: :object, properties: %{ name: %Schema{type: :string}, email: %Schema{type: :string, format: :email}, phone: %Schema{type: :string}, contact_name: %Schema{type: :string}, ruc: %Schema{type: :string}, address: %Schema{type: :string} } }) end defmodule UploadTemplateRequest do require OpenApiSpex OpenApiSpex.schema(%{ title: "UploadTemplateRequest", type: :object, required: [:document_url, :policy_type, :client_type], properties: %{ document_url: %Schema{ type: :string, description: "URL to the uploaded document" }, policy_type: %Schema{ type: :string, description: "Policy type this template applies to" }, client_type: %Schema{ type: :string, enum: ["natural", "juridico"], description: "Client type this template applies to" } } }) end defmodule UploadTemplateResponse do require OpenApiSpex OpenApiSpex.schema(%{ title: "UploadTemplateResponse", type: :object, properties: %{ template_id: %Schema{type: :string, format: :uuid}, document_url: %Schema{type: :string} } }) end # templates: %{ policy_type => %{ client_type => [Template] } } # default_templates: %{ policy_type => %{ client_type => template_id } } defmodule ClientTypeTemplates do require OpenApiSpex OpenApiSpex.schema(%{ title: "ClientTypeTemplates", type: :object, description: "Map of client_type (natural | juridico) to list of templates", properties: %{ natural: %Schema{type: :array, items: Template, nullable: true}, juridico: %Schema{type: :array, items: Template, nullable: true} } }) end defmodule ClientTypeDefaults do require OpenApiSpex OpenApiSpex.schema(%{ title: "ClientTypeDefaults", type: :object, description: "Map of client_type (natural | juridico) to default template_id", properties: %{ natural: %Schema{type: :string, format: :uuid, nullable: true}, juridico: %Schema{type: :string, format: :uuid, nullable: true} } }) end defmodule ProviderData do require OpenApiSpex OpenApiSpex.schema(%{ title: "ProviderData", type: :object, properties: %{ provider_id: %Schema{type: :string, format: :uuid}, name: %Schema{type: :string}, email: %Schema{type: :string}, phone: %Schema{type: :string}, contact_name: %Schema{type: :string}, ruc: %Schema{type: :string}, address: %Schema{type: :string}, active: %Schema{type: :boolean}, templates: %Schema{ type: :object, description: "Map of policy_type to client_type map of templates", additionalProperties: ClientTypeTemplates }, default_templates: %Schema{ type: :object, description: "Map of policy_type to client_type to default template_id", additionalProperties: ClientTypeDefaults } } }) end defmodule ProviderResponse do require OpenApiSpex OpenApiSpex.schema(%{ title: "ProviderResponse", type: :object, properties: %{ data: ProviderData } }) end defmodule ProviderListResponse do require OpenApiSpex OpenApiSpex.schema(%{ title: "ProviderListResponse", type: :object, properties: %{ data: %Schema{type: :array, items: ProviderData}, meta: PaginationMeta } }) end end