From 8f04bbdb9df9b19bbdfd3636f19e7f27eeb84ce4 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Tue, 8 Sep 2026 16:40:20 +0000 Subject: [PATCH 1/3] chore: sync repo --- .fern/metadata.json | 16 - .fernignore | 5 +- .github/workflows/ci.yml | 135 +- .github/workflows/publish-gem.yml | 37 + .github/workflows/release-doctor.yml | 22 + .gitignore | 10 + .release-please-manifest.json | 3 + .rubocop.yml | 300 +- .ruby-version | 1 + .solargraph.yml | 11 + .stats.yml | 4 + .yardopts | 6 + CHANGELOG.md | 169 + CONTRIBUTING.md | 139 +- Gemfile | 31 +- Gemfile.custom | 14 - Gemfile.lock | 228 + README.md | 276 +- Rakefile | 177 +- Steepfile | 15 + VitableConnect.gemspec | 48 - bin/check-release-environment | 21 + bin/publish-gem | 9 + custom.gemspec.rb | 16 - examples/.keep | 4 + lib/VitableConnect.rb | 268 -- lib/VitableConnect/auth/client.rb | 52 - .../auth/types/issue_access_token_request.rb | 13 - lib/VitableConnect/client.rb | 67 - lib/VitableConnect/employees/client.rb | 161 - .../employees/types/get_employees_request.rb | 11 - .../list_enrollments_employees_request.rb | 15 - .../types/patched_update_employee_request.rb | 27 - lib/VitableConnect/employers/client.rb | 904 ---- .../employers/types/census_sync_request.rb | 13 - .../types/create_employer_request.rb | 23 - ...oll_integration_email_employers_request.rb | 11 - ...get_benefit_plan_year_employers_request.rb | 13 - .../employers/types/get_employers_request.rb | 11 - .../types/get_hris_employers_request.rb | 11 - .../get_invoice_pdf_employers_request.rb | 13 - ..._payroll_access_setup_employers_request.rb | 11 - ...plan_year_enrollments_employers_request.rb | 21 - ...st_benefit_plan_years_employers_request.rb | 11 - .../types/list_employees_employers_request.rb | 19 - .../employers/types/list_employers_request.rb | 25 - .../types/list_invoices_employers_request.rb | 15 - ..._deduction_statements_employers_request.rb | 15 - .../submit_payroll_access_setup_request.rb | 57 - .../types/update_employer_request.rb | 19 - .../types/update_employer_settings_request.rb | 13 - lib/VitableConnect/enrollments/client.rb | 152 - .../types/get_enrollments_request.rb | 11 - .../types/reissue_enrollment_request.rb | 17 - .../types/terminate_enrollment_request.rb | 17 - lib/VitableConnect/environment.rb | 9 - lib/VitableConnect/errors/api_error.rb | 8 - lib/VitableConnect/errors/client_error.rb | 17 - lib/VitableConnect/errors/redirect_error.rb | 8 - lib/VitableConnect/errors/response_error.rb | 42 - lib/VitableConnect/errors/server_error.rb | 11 - lib/VitableConnect/errors/timeout_error.rb | 8 - lib/VitableConnect/groups/client.rb | 199 - lib/VitableConnect/groups/members/client.rb | 21 - .../groups/members/sync/client.rb | 122 - .../members/sync/types/get_sync_request.rb | 17 - .../sync/types/group_member_sync_request.rb | 17 - .../groups/types/create_group_request.rb | 13 - .../groups/types/get_groups_request.rb | 11 - .../groups/types/list_groups_request.rb | 13 - .../types/patched_update_group_request.rb | 15 - .../internal/errors/constraint_error.rb | 10 - .../internal/errors/type_error.rb | 10 - .../internal/http/base_request.rb | 51 - .../internal/http/raw_client.rb | 265 -- .../iterators/cursor_item_iterator.rb | 28 - .../iterators/cursor_page_iterator.rb | 63 - .../internal/iterators/item_iterator.rb | 65 - .../iterators/offset_item_iterator.rb | 30 - .../iterators/offset_page_iterator.rb | 103 - lib/VitableConnect/internal/json/request.rb | 41 - .../internal/json/serializable.rb | 25 - .../internal/multipart/multipart_encoder.rb | 141 - .../internal/multipart/multipart_form_data.rb | 78 - .../multipart/multipart_form_data_part.rb | 51 - .../internal/multipart/multipart_request.rb | 40 - lib/VitableConnect/internal/types/array.rb | 47 - lib/VitableConnect/internal/types/boolean.rb | 34 - lib/VitableConnect/internal/types/enum.rb | 56 - lib/VitableConnect/internal/types/hash.rb | 36 - lib/VitableConnect/internal/types/model.rb | 208 - .../internal/types/model/field.rb | 38 - lib/VitableConnect/internal/types/type.rb | 35 - lib/VitableConnect/internal/types/union.rb | 161 - lib/VitableConnect/internal/types/unknown.rb | 15 - lib/VitableConnect/internal/types/utils.rb | 116 - lib/VitableConnect/members/client.rb | 385 -- .../types/get_household_members_request.rb | 11 - .../members/types/get_members_request.rb | 11 - .../types/list_dependents_members_request.rb | 11 - .../types/list_employments_members_request.rb | 11 - .../types/list_enrollments_members_request.rb | 11 - .../types/list_id_cards_members_request.rb | 11 - .../members/types/list_members_request.rb | 15 - ..._qualifying_life_events_members_request.rb | 17 - lib/VitableConnect/organizations/client.rb | 92 - .../types/create_organization_request.rb | 13 - lib/VitableConnect/plans/client.rb | 69 - .../plans/types/list_plans_request.rb | 13 - lib/VitableConnect/types/access_method.rb | 12 - .../types/access_token_response.rb | 15 - .../types/additional_access_method.rb | 12 - lib/VitableConnect/types/address.rb | 22 - lib/VitableConnect/types/address_request.rb | 17 - lib/VitableConnect/types/benefit_family.rb | 16 - .../types/benefit_family_param_item.rb | 16 - .../types/benefit_lifecycle_stage_item.rb | 15 - .../types/benefit_plan_network.rb | 29 - .../types/benefit_plan_year_detail.rb | 52 - .../types/benefit_plan_year_id.rb | 23 - .../types/benefit_plan_year_list.rb | 47 - lib/VitableConnect/types/benefit_status.rb | 14 - lib/VitableConnect/types/benefit_summary.rb | 15 - lib/VitableConnect/types/bound_entity.rb | 11 - .../types/bound_entity_response.rb | 11 - lib/VitableConnect/types/bound_entity_type.rb | 12 - lib/VitableConnect/types/card_type.rb | 14 - lib/VitableConnect/types/category.rb | 14 - .../types/census_sync_detail_response.rb | 10 - .../census_sync_employee_address_request.rb | 17 - .../types/census_sync_employee_request.rb | 27 - .../types/census_sync_response.rb | 11 - .../types/classification_correction_source.rb | 12 - lib/VitableConnect/types/compensation_type.rb | 12 - .../types/contribution_class_compensation.rb | 13 - .../types/contribution_class_employment.rb | 15 - .../types/contribution_class_location.rb | 12 - .../types/contribution_range.rb | 11 - .../types/contribution_strategy.rb | 13 - lib/VitableConnect/types/contribution_tier.rb | 26 - lib/VitableConnect/types/coverage_tier.rb | 15 - .../types/create_organization_request_type.rb | 16 - lib/VitableConnect/types/created_after.rb | 23 - lib/VitableConnect/types/created_before.rb | 23 - lib/VitableConnect/types/deduction_detail.rb | 21 - .../types/deduction_frequency.rb | 14 - .../types/digital_benefit_card.rb | 36 - .../types/election_status_item.rb | 14 - .../types/eligibility_policy.rb | 17 - .../types/eligibility_policy_rule.rb | 15 - .../eligibility_rule_compensation_type.rb | 13 - .../types/eligibility_rule_employee_class.rb | 17 - .../types/eligible_geographical_location.rb | 11 - .../eligible_geographical_location_type.rb | 12 - lib/VitableConnect/types/employee.rb | 53 - lib/VitableConnect/types/employee_address.rb | 17 - .../types/employee_address_input.rb | 19 - lib/VitableConnect/types/employee_class.rb | 16 - lib/VitableConnect/types/employee_id.rb | 23 - .../types/employee_list_response.rb | 12 - lib/VitableConnect/types/employee_response.rb | 10 - lib/VitableConnect/types/employee_search.rb | 23 - lib/VitableConnect/types/employee_status.rb | 12 - lib/VitableConnect/types/employer.rb | 34 - lib/VitableConnect/types/employer_address.rb | 18 - .../types/employer_address_input.rb | 17 - .../types/employer_benefit_lifecycle_stage.rb | 11 - .../employer_benefit_plan_year_response.rb | 10 - ...ployer_benefit_plan_years_list_response.rb | 9 - lib/VitableConnect/types/employer_contact.rb | 12 - lib/VitableConnect/types/employer_hris.rb | 9 - .../types/employer_hris_response.rb | 10 - .../types/employer_hris_status.rb | 13 - lib/VitableConnect/types/employer_id.rb | 23 - .../types/employer_invoice_pdf.rb | 9 - .../types/employer_invoice_pdf_response.rb | 10 - .../types/employer_invoices_list_response.rb | 12 - ...yroll_deduction_statement_list_response.rb | 12 - lib/VitableConnect/types/employer_response.rb | 10 - lib/VitableConnect/types/employer_search.rb | 23 - lib/VitableConnect/types/employer_settings.rb | 9 - .../types/employer_settings_response.rb | 10 - lib/VitableConnect/types/enrollment.rb | 34 - lib/VitableConnect/types/enrollment_detail.rb | 39 - lib/VitableConnect/types/enrollment_id.rb | 23 - .../types/enrollment_list_response.rb | 12 - lib/VitableConnect/types/enrollment_rate.rb | 13 - .../types/enrollment_rate_summary.rb | 13 - .../types/enrollment_response.rb | 10 - lib/VitableConnect/types/enrollment_status.rb | 14 - lib/VitableConnect/types/error_response.rb | 17 - lib/VitableConnect/types/event_id.rb | 23 - lib/VitableConnect/types/event_name.rb | 21 - lib/VitableConnect/types/gender.rb | 15 - lib/VitableConnect/types/grant_type.rb | 11 - lib/VitableConnect/types/group.rb | 19 - lib/VitableConnect/types/group_id.rb | 23 - .../types/group_list_response.rb | 12 - .../group_member_sync_detail_response.rb | 10 - .../types/group_member_sync_failure.rb | 13 - .../types/group_member_sync_member_request.rb | 23 - .../types/group_member_sync_request_detail.rb | 17 - ...oup_member_sync_request_detail_response.rb | 10 - .../types/group_member_sync_response.rb | 13 - .../types/group_member_sync_results.rb | 13 - lib/VitableConnect/types/group_response.rb | 10 - lib/VitableConnect/types/household_member.rb | 22 - .../types/household_member_relationship.rb | 14 - .../types/household_member_type.rb | 13 - .../types/household_members_response.rb | 10 - lib/VitableConnect/types/hris_connection.rb | 17 - lib/VitableConnect/types/hris_status_item.rb | 15 - .../types/ichra_contribution_class.rb | 29 - lib/VitableConnect/types/idp_provider.rb | 12 - lib/VitableConnect/types/include_cancelled.rb | 23 - lib/VitableConnect/types/invoice.rb | 15 - lib/VitableConnect/types/invoice_id.rb | 23 - .../types/invoices_cursor_pagination.rb | 9 - lib/VitableConnect/types/limit.rb | 23 - .../list_webhook_event_deliveries_response.rb | 9 - lib/VitableConnect/types/marital_status.rb | 12 - lib/VitableConnect/types/member.rb | 42 - lib/VitableConnect/types/member_address.rb | 17 - .../types/member_dependents_response.rb | 10 - .../member_digital_benefit_cards_response.rb | 10 - .../types/member_employments_response.rb | 10 - lib/VitableConnect/types/member_enrollment.rb | 58 - .../types/member_enrollments_response.rb | 10 - lib/VitableConnect/types/member_id.rb | 23 - .../types/member_legal_dependent.rb | 24 - lib/VitableConnect/types/member_list_item.rb | 20 - .../types/member_list_response.rb | 12 - .../types/member_qualifying_life_event.rb | 19 - ...ber_qualifying_life_event_list_response.rb | 12 - lib/VitableConnect/types/member_response.rb | 10 - lib/VitableConnect/types/member_search.rb | 23 - lib/VitableConnect/types/member_status.rb | 12 - .../types/missing_employee_resolution.rb | 12 - lib/VitableConnect/types/name_suffix.rb | 17 - lib/VitableConnect/types/offset.rb | 23 - lib/VitableConnect/types/operation.rb | 12 - lib/VitableConnect/types/organization.rb | 19 - .../types/organization_employer.rb | 44 - .../organization_employer_list_response.rb | 12 - .../types/organization_hris_provider.rb | 11 - .../organization_hris_providers_response.rb | 10 - lib/VitableConnect/types/organization_type.rb | 16 - .../types/organizations_list_response.rb | 12 - lib/VitableConnect/types/page.rb | 23 - lib/VitableConnect/types/pagination.rb | 16 - .../types/payroll_access_setup_status.rb | 11 - .../payroll_access_setup_status_response.rb | 10 - .../types/payroll_deduction_statement.rb | 29 - .../types/payroll_integration_email.rb | 9 - .../payroll_integration_email_response.rb | 10 - lib/VitableConnect/types/plan.rb | 11 - .../types/plan_list_response.rb | 12 - .../types/plan_year_enrollment.rb | 35 - .../plan_year_enrollment_election_status.rb | 14 - .../plan_year_enrollment_list_response.rb | 12 - .../plan_year_enrollment_policy_status.rb | 14 - .../types/preferred_language.rb | 16 - lib/VitableConnect/types/product_code.rb | 25 - .../types/qualifying_life_event_status.rb | 13 - .../types/qualifying_life_event_type.rb | 31 - .../types/reissue_enrollment.rb | 9 - .../types/reissue_enrollment_response.rb | 10 - lib/VitableConnect/types/relationship.rb | 12 - .../types/remaining_employee_action.rb | 12 - lib/VitableConnect/types/request_id.rb | 23 - lib/VitableConnect/types/resource_id.rb | 23 - lib/VitableConnect/types/resource_type.rb | 16 - lib/VitableConnect/types/search.rb | 23 - lib/VitableConnect/types/sex_at_birth.rb | 14 - lib/VitableConnect/types/state.rb | 72 - lib/VitableConnect/types/status.rb | 13 - .../types/tax_classification.rb | 13 - lib/VitableConnect/types/termination_rule.rb | 12 - .../types/update_employer_address_input.rb | 17 - lib/VitableConnect/types/waiting_period.rb | 13 - lib/VitableConnect/types/webhook_delivery.rb | 25 - lib/VitableConnect/types/webhook_event.rb | 19 - .../types/webhook_event_list_response.rb | 12 - .../types/webhook_event_response.rb | 10 - lib/VitableConnect/webhook_events/client.rb | 156 - .../types/get_webhook_events_request.rb | 11 - .../list_deliveries_webhook_events_request.rb | 11 - .../types/list_webhook_events_request.rb | 23 - lib/vitable_connect.rb | 158 +- lib/vitable_connect/client.rb | 153 + lib/vitable_connect/errors.rb | 228 + lib/vitable_connect/file_part.rb | 58 + lib/vitable_connect/internal.rb | 20 + .../internal/page_number_page.rb | 113 + .../internal/transport/base_client.rb | 603 +++ .../transport/pooled_net_requester.rb | 210 + lib/vitable_connect/internal/type/array_of.rb | 168 + .../internal/type/base_model.rb | 534 +++ .../internal/type/base_page.rb | 55 + lib/vitable_connect/internal/type/boolean.rb | 77 + .../internal/type/converter.rb | 327 ++ lib/vitable_connect/internal/type/enum.rb | 156 + .../internal/type/file_input.rb | 111 + lib/vitable_connect/internal/type/hash_of.rb | 188 + .../internal/type/request_parameters.rb | 42 + lib/vitable_connect/internal/type/union.rb | 245 ++ lib/vitable_connect/internal/type/unknown.rb | 81 + lib/vitable_connect/internal/util.rb | 966 +++++ lib/vitable_connect/models.rb | 156 + .../models/auth_issue_access_token_params.rb | 82 + .../auth_issue_access_token_response.rb | 84 + lib/vitable_connect/models/employee.rb | 378 ++ lib/vitable_connect/models/employee_class.rb | 25 + .../employee_list_enrollments_params.rb | 38 + .../models/employee_retrieve_params.rb | 22 + .../models/employee_retrieve_response.rb | 18 + .../models/employee_update_params.rb | 185 + .../models/employee_update_response.rb | 18 + lib/vitable_connect/models/employer.rb | 189 + .../models/employer_create_params.rb | 115 + ...ensure_payroll_integration_email_params.rb | 22 + ...sure_payroll_integration_email_response.rb | 29 + ...st_benefit_plan_year_enrollments_params.rb | 80 + ..._benefit_plan_year_enrollments_response.rb | 178 + ...employer_list_benefit_plan_years_params.rb | 22 + ...ployer_list_benefit_plan_years_response.rb | 301 ++ .../models/employer_list_employees_params.rb | 65 + .../employer_list_hris_providers_params.rb | 14 + .../employer_list_hris_providers_response.rb | 43 + .../models/employer_list_invoices_params.rb | 38 + .../models/employer_list_invoices_response.rb | 77 + .../models/employer_list_params.rb | 145 + ...ist_payroll_deduction_statements_params.rb | 38 + ...t_payroll_deduction_statements_response.rb | 113 + .../models/employer_list_response.rb | 294 ++ .../models/employer_response.rb | 19 + ...loyer_retrieve_benefit_plan_year_params.rb | 30 + ...yer_retrieve_benefit_plan_year_response.rb | 850 ++++ .../models/employer_retrieve_hris_params.rb | 22 + .../models/employer_retrieve_hris_response.rb | 80 + .../employer_retrieve_invoice_pdf_params.rb | 30 + .../employer_retrieve_invoice_pdf_response.rb | 30 + .../models/employer_retrieve_params.rb | 22 + ...er_retrieve_payroll_access_setup_params.rb | 22 + ..._retrieve_payroll_access_setup_response.rb | 35 + .../employer_submit_census_sync_params.rb | 375 ++ .../employer_submit_census_sync_response.rb | 35 + ...oyer_submit_payroll_access_setup_params.rb | 267 ++ ...er_submit_payroll_access_setup_response.rb | 35 + .../models/employer_update_params.rb | 99 + .../models/employer_update_settings_params.rb | 52 + .../employer_update_settings_response.rb | 56 + lib/vitable_connect/models/enrollment.rb | 236 ++ .../models/enrollment_reissue_params.rb | 50 + .../models/enrollment_reissue_response.rb | 30 + .../models/enrollment_retrieve_params.rb | 22 + .../models/enrollment_retrieve_response.rb | 273 ++ .../models/enrollment_status.rb | 21 + .../models/enrollment_terminate_params.rb | 50 + lib/vitable_connect/models/group.rb | 57 + .../models/group_create_params.rb | 26 + .../models/group_list_params.rb | 30 + lib/vitable_connect/models/group_response.rb | 18 + .../models/group_retrieve_params.rb | 22 + .../models/group_update_params.rb | 36 + .../groups/members/sync_retrieve_params.rb | 33 + .../groups/members/sync_retrieve_response.rb | 128 + .../groups/members/sync_submit_params.rb | 121 + .../groups/members/sync_submit_response.rb | 45 + .../models/member_list_dependents_params.rb | 22 + .../models/member_list_dependents_response.rb | 132 + .../models/member_list_employments_params.rb | 22 + .../member_list_employments_response.rb | 18 + .../models/member_list_enrollments_params.rb | 22 + .../member_list_enrollments_response.rb | 362 ++ .../models/member_list_id_cards_params.rb | 22 + .../models/member_list_id_cards_response.rb | 368 ++ .../models/member_list_params.rb | 42 + ...mber_list_qualifying_life_events_params.rb | 58 + ...er_list_qualifying_life_events_response.rb | 154 + .../models/member_list_response.rb | 306 ++ .../member_retrieve_household_params.rb | 22 + .../member_retrieve_household_response.rb | 128 + .../models/member_retrieve_params.rb | 22 + .../models/member_retrieve_response.rb | 552 +++ .../models/organization_create_params.rb | 57 + .../models/organization_create_response.rb | 104 + .../models/organization_list_params.rb | 14 + .../models/organization_list_response.rb | 128 + lib/vitable_connect/models/pagination.rb | 42 + .../models/plan_list_params.rb | 30 + .../models/plan_list_response.rb | 22 + lib/vitable_connect/models/webhook_event.rb | 62 + .../webhook_event_list_deliveries_params.rb | 20 + .../webhook_event_list_deliveries_response.rb | 92 + .../models/webhook_event_list_params.rb | 135 + .../models/webhook_event_retrieve_params.rb | 20 + .../models/webhook_event_retrieve_response.rb | 18 + lib/vitable_connect/request_options.rb | 78 + lib/vitable_connect/resources/auth.rb | 41 + lib/vitable_connect/resources/employees.rb | 111 + lib/vitable_connect/resources/employers.rb | 590 +++ lib/vitable_connect/resources/enrollments.rb | 111 + lib/vitable_connect/resources/groups.rb | 114 + .../resources/groups/members.rb | 20 + .../resources/groups/members/sync.rb | 74 + lib/vitable_connect/resources/members.rb | 246 ++ .../resources/organizations.rb | 66 + lib/vitable_connect/resources/plans.rb | 41 + .../resources/webhook_events.rb | 95 + .../version.rb | 2 +- manifest.yaml | 17 + rbi/vitable_connect/client.rbi | 106 + rbi/vitable_connect/errors.rbi | 205 + rbi/vitable_connect/file_part.rbi | 37 + rbi/vitable_connect/internal.rbi | 18 + .../internal/page_number_page.rbi | 49 + .../internal/transport/base_client.rbi | 310 ++ .../transport/pooled_net_requester.rbi | 84 + .../internal/type/array_of.rbi | 108 + .../internal/type/base_model.rbi | 314 ++ .../internal/type/base_page.rbi | 43 + rbi/vitable_connect/internal/type/boolean.rbi | 58 + .../internal/type/converter.rbi | 225 + rbi/vitable_connect/internal/type/enum.rbi | 82 + .../internal/type/file_input.rbi | 59 + rbi/vitable_connect/internal/type/hash_of.rbi | 108 + .../internal/type/request_parameters.rbi | 31 + rbi/vitable_connect/internal/type/union.rbi | 130 + rbi/vitable_connect/internal/type/unknown.rbi | 58 + rbi/vitable_connect/internal/util.rbi | 515 +++ rbi/vitable_connect/models.rbi | 134 + .../models/auth_issue_access_token_params.rbi | 195 + .../auth_issue_access_token_response.rbi | 174 + rbi/vitable_connect/models/employee.rbi | 551 +++ rbi/vitable_connect/models/employee_class.rbi | 38 + .../employee_list_enrollments_params.rbi | 68 + .../models/employee_retrieve_params.rbi | 46 + .../models/employee_retrieve_response.rbi | 32 + .../models/employee_update_params.rbi | 323 ++ .../models/employee_update_response.rbi | 32 + rbi/vitable_connect/models/employer.rbi | 255 ++ .../models/employer_create_params.rbi | 169 + ...nsure_payroll_integration_email_params.rbi | 46 + ...ure_payroll_integration_email_response.rbi | 72 + ...t_benefit_plan_year_enrollments_params.rbi | 165 + ...benefit_plan_year_enrollments_response.rbi | 286 ++ ...mployer_list_benefit_plan_years_params.rbi | 46 + ...loyer_list_benefit_plan_years_response.rbi | 539 +++ .../models/employer_list_employees_params.rbi | 138 + .../employer_list_hris_providers_params.rbi | 32 + .../employer_list_hris_providers_response.rbi | 86 + .../models/employer_list_invoices_params.rbi | 65 + .../employer_list_invoices_response.rbi | 151 + .../models/employer_list_params.rbi | 352 ++ ...st_payroll_deduction_statements_params.rbi | 68 + ..._payroll_deduction_statements_response.rbi | 169 + .../models/employer_list_response.rbi | 440 ++ .../models/employer_response.rbi | 36 + ...oyer_retrieve_benefit_plan_year_params.rbi | 54 + ...er_retrieve_benefit_plan_year_response.rbi | 1650 ++++++++ .../models/employer_retrieve_hris_params.rbi | 46 + .../employer_retrieve_hris_response.rbi | 171 + .../employer_retrieve_invoice_pdf_params.rbi | 54 + ...employer_retrieve_invoice_pdf_response.rbi | 76 + .../models/employer_retrieve_params.rbi | 46 + ...r_retrieve_payroll_access_setup_params.rbi | 46 + ...retrieve_payroll_access_setup_response.rbi | 83 + .../employer_submit_census_sync_params.rbi | 821 ++++ .../employer_submit_census_sync_response.rbi | 76 + ...yer_submit_payroll_access_setup_params.rbi | 441 ++ ...r_submit_payroll_access_setup_response.rbi | 83 + .../models/employer_update_params.rbi | 155 + .../employer_update_settings_params.rbi | 114 + .../employer_update_settings_response.rbi | 147 + rbi/vitable_connect/models/enrollment.rbi | 402 ++ .../models/enrollment_reissue_params.rbi | 72 + .../models/enrollment_reissue_response.rbi | 67 + .../models/enrollment_retrieve_params.rbi | 46 + .../models/enrollment_retrieve_response.rbi | 487 +++ .../models/enrollment_status.rbi | 32 + .../models/enrollment_terminate_params.rbi | 72 + rbi/vitable_connect/models/group.rbi | 77 + .../models/group_create_params.rbi | 46 + .../models/group_list_params.rbi | 60 + rbi/vitable_connect/models/group_response.rbi | 32 + .../models/group_retrieve_params.rbi | 43 + .../models/group_update_params.rbi | 58 + .../groups/members/sync_retrieve_params.rbi | 56 + .../groups/members/sync_retrieve_response.rbi | 282 ++ .../groups/members/sync_submit_params.rbi | 214 + .../groups/members/sync_submit_response.rbi | 92 + .../models/member_list_dependents_params.rbi | 43 + .../member_list_dependents_response.rbi | 249 ++ .../models/member_list_employments_params.rbi | 43 + .../member_list_employments_response.rbi | 31 + .../models/member_list_enrollments_params.rbi | 43 + .../member_list_enrollments_response.rbi | 635 +++ .../models/member_list_id_cards_params.rbi | 43 + .../models/member_list_id_cards_response.rbi | 624 +++ .../models/member_list_params.rbi | 73 + ...ber_list_qualifying_life_events_params.rbi | 132 + ...r_list_qualifying_life_events_response.rbi | 331 ++ .../models/member_list_response.rbi | 690 +++ .../member_retrieve_household_params.rbi | 43 + .../member_retrieve_household_response.rbi | 251 ++ .../models/member_retrieve_params.rbi | 43 + .../models/member_retrieve_response.rbi | 1230 ++++++ .../models/organization_create_params.rbi | 127 + .../models/organization_create_response.rbi | 212 + .../models/organization_list_params.rbi | 32 + .../models/organization_list_response.rbi | 266 ++ rbi/vitable_connect/models/pagination.rbi | 62 + .../models/plan_list_params.rbi | 60 + .../models/plan_list_response.rbi | 29 + rbi/vitable_connect/models/webhook_event.rbi | 81 + .../webhook_event_list_deliveries_params.rbi | 38 + ...webhook_event_list_deliveries_response.rbi | 147 + .../models/webhook_event_list_params.rbi | 307 ++ .../models/webhook_event_retrieve_params.rbi | 38 + .../webhook_event_retrieve_response.rbi | 34 + rbi/vitable_connect/request_options.rbi | 61 + rbi/vitable_connect/resources/auth.rbi | 36 + rbi/vitable_connect/resources/employees.rbi | 110 + rbi/vitable_connect/resources/employers.rbi | 524 +++ rbi/vitable_connect/resources/enrollments.rbi | 89 + rbi/vitable_connect/resources/groups.rbi | 79 + .../resources/groups/members.rbi | 17 + .../resources/groups/members/sync.rbi | 62 + rbi/vitable_connect/resources/members.rbi | 200 + .../resources/organizations.rbi | 48 + rbi/vitable_connect/resources/plans.rbi | 34 + .../resources/webhook_events.rbi | 84 + rbi/vitable_connect/version.rbi | 5 + reference.md | 3722 ----------------- release-please-config.json | 70 + scripts/bootstrap | 24 + scripts/fast-format | 18 + scripts/format | 9 + scripts/lint | 9 + scripts/test | 10 + scripts/utils/upload-artifact.sh | 113 + sig/vitable_connect/client.rbs | 52 + sig/vitable_connect/errors.rbs | 117 + sig/vitable_connect/file_part.rbs | 21 + sig/vitable_connect/internal.rbs | 10 + .../internal/page_number_page.rbs | 28 + .../internal/transport/base_client.rbs | 135 + .../transport/pooled_net_requester.rbs | 48 + .../internal/type/array_of.rbs | 48 + .../internal/type/base_model.rbs | 104 + .../internal/type/base_page.rbs | 24 + sig/vitable_connect/internal/type/boolean.rbs | 26 + .../internal/type/converter.rbs | 79 + sig/vitable_connect/internal/type/enum.rbs | 32 + .../internal/type/file_input.rbs | 25 + sig/vitable_connect/internal/type/hash_of.rbs | 48 + .../internal/type/request_parameters.rbs | 20 + sig/vitable_connect/internal/type/union.rbs | 52 + sig/vitable_connect/internal/type/unknown.rbs | 26 + sig/vitable_connect/internal/util.rbs | 199 + sig/vitable_connect/models.rbs | 109 + .../models/auth_issue_access_token_params.rbs | 74 + .../auth_issue_access_token_response.rbs | 68 + sig/vitable_connect/models/employee.rbs | 261 ++ sig/vitable_connect/models/employee_class.rbs | 24 + .../employee_list_enrollments_params.rbs | 36 + .../models/employee_retrieve_params.rbs | 24 + .../models/employee_retrieve_response.rbs | 13 + .../models/employee_update_params.rbs | 140 + .../models/employee_update_response.rbs | 13 + sig/vitable_connect/models/employer.rbs | 129 + .../models/employer_create_params.rbs | 93 + ...nsure_payroll_integration_email_params.rbs | 24 + ...ure_payroll_integration_email_response.rbs | 30 + ...t_benefit_plan_year_enrollments_params.rbs | 74 + ...benefit_plan_year_enrollments_response.rbs | 115 + ...mployer_list_benefit_plan_years_params.rbs | 24 + ...loyer_list_benefit_plan_years_response.rbs | 197 + .../models/employer_list_employees_params.rbs | 67 + .../employer_list_hris_providers_params.rbs | 15 + .../employer_list_hris_providers_response.rbs | 32 + .../models/employer_list_invoices_params.rbs | 34 + .../employer_list_invoices_response.rbs | 62 + .../models/employer_list_params.rbs | 125 + ...st_payroll_deduction_statements_params.rbs | 36 + ..._payroll_deduction_statements_response.rbs | 73 + .../models/employer_list_response.rbs | 190 + .../models/employer_response.rbs | 13 + ...oyer_retrieve_benefit_plan_year_params.rbs | 28 + ...er_retrieve_benefit_plan_year_response.rbs | 559 +++ .../models/employer_retrieve_hris_params.rbs | 24 + .../employer_retrieve_hris_response.rbs | 72 + .../employer_retrieve_invoice_pdf_params.rbs | 28 + ...employer_retrieve_invoice_pdf_response.rbs | 28 + .../models/employer_retrieve_params.rbs | 24 + ...r_retrieve_payroll_access_setup_params.rbs | 24 + ...retrieve_payroll_access_setup_response.rbs | 32 + .../employer_submit_census_sync_params.rbs | 274 ++ .../employer_submit_census_sync_response.rbs | 30 + ...yer_submit_payroll_access_setup_params.rbs | 198 + ...r_submit_payroll_access_setup_response.rbs | 32 + .../models/employer_update_params.rbs | 83 + .../employer_update_settings_params.rbs | 44 + .../employer_update_settings_response.rbs | 48 + sig/vitable_connect/models/enrollment.rbs | 164 + .../models/enrollment_reissue_params.rbs | 41 + .../models/enrollment_reissue_response.rbs | 28 + .../models/enrollment_retrieve_params.rbs | 24 + .../models/enrollment_retrieve_response.rbs | 184 + .../models/enrollment_status.rbs | 16 + .../models/enrollment_terminate_params.rbs | 41 + sig/vitable_connect/models/group.rbs | 45 + .../models/group_create_params.rbs | 28 + .../models/group_list_params.rbs | 32 + sig/vitable_connect/models/group_response.rbs | 13 + .../models/group_retrieve_params.rbs | 23 + .../models/group_update_params.rbs | 32 + .../groups/members/sync_retrieve_params.rbs | 32 + .../groups/members/sync_retrieve_response.rbs | 126 + .../groups/members/sync_submit_params.rbs | 124 + .../groups/members/sync_submit_response.rbs | 47 + .../models/member_list_dependents_params.rbs | 23 + .../member_list_dependents_response.rbs | 96 + .../models/member_list_employments_params.rbs | 23 + .../member_list_employments_response.rbs | 14 + .../models/member_list_enrollments_params.rbs | 23 + .../member_list_enrollments_response.rbs | 239 ++ .../models/member_list_id_cards_params.rbs | 23 + .../models/member_list_id_cards_response.rbs | 256 ++ .../models/member_list_params.rbs | 38 + ...ber_list_qualifying_life_events_params.rbs | 61 + ...r_list_qualifying_life_events_response.rbs | 108 + .../models/member_list_response.rbs | 215 + .../member_retrieve_household_params.rbs | 23 + .../member_retrieve_household_response.rbs | 92 + .../models/member_retrieve_params.rbs | 23 + .../models/member_retrieve_response.rbs | 370 ++ .../models/organization_create_params.rbs | 52 + .../models/organization_create_response.rbs | 77 + .../models/organization_list_params.rbs | 15 + .../models/organization_list_response.rbs | 99 + sig/vitable_connect/models/pagination.rbs | 30 + .../models/plan_list_params.rbs | 32 + .../models/plan_list_response.rbs | 15 + sig/vitable_connect/models/webhook_event.rbs | 45 + .../webhook_event_list_deliveries_params.rbs | 23 + ...webhook_event_list_deliveries_response.rbs | 77 + .../models/webhook_event_list_params.rbs | 126 + .../models/webhook_event_retrieve_params.rbs | 23 + .../webhook_event_retrieve_response.rbs | 14 + sig/vitable_connect/request_options.rbs | 36 + sig/vitable_connect/resources/auth.rbs | 13 + sig/vitable_connect/resources/employees.rbs | 32 + sig/vitable_connect/resources/employers.rbs | 153 + sig/vitable_connect/resources/enrollments.rbs | 28 + sig/vitable_connect/resources/groups.rbs | 33 + .../resources/groups/members.rbs | 11 + .../resources/groups/members/sync.rbs | 23 + sig/vitable_connect/resources/members.rbs | 52 + .../resources/organizations.rbs | 17 + sig/vitable_connect/resources/plans.rbs | 13 + .../resources/webhook_events.rbs | 28 + sig/vitable_connect/version.rbs | 3 + sorbet/config | 2 + sorbet/rbi/.gitignore | 2 + test/custom.test.rb | 15 - test/test_helper.rb | 3 - test/unit/internal/http/test_raw_client.rb | 195 - .../iterators/test_cursor_item_iterator.rb | 192 - .../iterators/test_offset_item_iterator.rb | 150 - test/unit/internal/types/test_array.rb | 37 - test/unit/internal/types/test_boolean.rb | 35 - test/unit/internal/types/test_enum.rb | 42 - test/unit/internal/types/test_hash.rb | 50 - test/unit/internal/types/test_model.rb | 154 - test/unit/internal/types/test_union.rb | 62 - test/unit/internal/types/test_utils.rb | 212 - test/vitable_connect/client_test.rb | 332 ++ test/vitable_connect/file_part_test.rb | 13 + .../internal/sorbet_runtime_support_test.rb | 52 + .../internal/type/base_model_test.rb | 727 ++++ test/vitable_connect/internal/util_test.rb | 678 +++ test/vitable_connect/resource_namespaces.rb | 15 + test/vitable_connect/resources/auth_test.rb | 24 + .../resources/employees_test.rb | 72 + .../resources/employers_test.rb | 412 ++ .../resources/enrollments_test.rb | 47 + .../resources/groups/members/sync_test.rb | 55 + .../resources/groups/members_test.rb | 6 + test/vitable_connect/resources/groups_test.rb | 81 + .../vitable_connect/resources/members_test.rb | 157 + .../resources/organizations_test.rb | 43 + test/vitable_connect/resources/plans_test.rb | 29 + .../resources/webhook_events_test.rb | 65 + test/vitable_connect/test_helper.rb | 87 + vitable_connect.gemspec | 29 + 697 files changed, 48676 insertions(+), 13538 deletions(-) delete mode 100644 .fern/metadata.json create mode 100644 .github/workflows/publish-gem.yml create mode 100644 .github/workflows/release-doctor.yml create mode 100644 .release-please-manifest.json create mode 100644 .ruby-version create mode 100644 .solargraph.yml create mode 100644 .stats.yml create mode 100644 .yardopts create mode 100644 CHANGELOG.md delete mode 100644 Gemfile.custom create mode 100644 Gemfile.lock create mode 100644 Steepfile delete mode 100644 VitableConnect.gemspec create mode 100644 bin/check-release-environment create mode 100644 bin/publish-gem delete mode 100644 custom.gemspec.rb create mode 100644 examples/.keep delete mode 100644 lib/VitableConnect.rb delete mode 100644 lib/VitableConnect/auth/client.rb delete mode 100644 lib/VitableConnect/auth/types/issue_access_token_request.rb delete mode 100644 lib/VitableConnect/client.rb delete mode 100644 lib/VitableConnect/employees/client.rb delete mode 100644 lib/VitableConnect/employees/types/get_employees_request.rb delete mode 100644 lib/VitableConnect/employees/types/list_enrollments_employees_request.rb delete mode 100644 lib/VitableConnect/employees/types/patched_update_employee_request.rb delete mode 100644 lib/VitableConnect/employers/client.rb delete mode 100644 lib/VitableConnect/employers/types/census_sync_request.rb delete mode 100644 lib/VitableConnect/employers/types/create_employer_request.rb delete mode 100644 lib/VitableConnect/employers/types/ensure_payroll_integration_email_employers_request.rb delete mode 100644 lib/VitableConnect/employers/types/get_benefit_plan_year_employers_request.rb delete mode 100644 lib/VitableConnect/employers/types/get_employers_request.rb delete mode 100644 lib/VitableConnect/employers/types/get_hris_employers_request.rb delete mode 100644 lib/VitableConnect/employers/types/get_invoice_pdf_employers_request.rb delete mode 100644 lib/VitableConnect/employers/types/get_payroll_access_setup_employers_request.rb delete mode 100644 lib/VitableConnect/employers/types/list_benefit_plan_year_enrollments_employers_request.rb delete mode 100644 lib/VitableConnect/employers/types/list_benefit_plan_years_employers_request.rb delete mode 100644 lib/VitableConnect/employers/types/list_employees_employers_request.rb delete mode 100644 lib/VitableConnect/employers/types/list_employers_request.rb delete mode 100644 lib/VitableConnect/employers/types/list_invoices_employers_request.rb delete mode 100644 lib/VitableConnect/employers/types/list_payroll_deduction_statements_employers_request.rb delete mode 100644 lib/VitableConnect/employers/types/submit_payroll_access_setup_request.rb delete mode 100644 lib/VitableConnect/employers/types/update_employer_request.rb delete mode 100644 lib/VitableConnect/employers/types/update_employer_settings_request.rb delete mode 100644 lib/VitableConnect/enrollments/client.rb delete mode 100644 lib/VitableConnect/enrollments/types/get_enrollments_request.rb delete mode 100644 lib/VitableConnect/enrollments/types/reissue_enrollment_request.rb delete mode 100644 lib/VitableConnect/enrollments/types/terminate_enrollment_request.rb delete mode 100644 lib/VitableConnect/environment.rb delete mode 100644 lib/VitableConnect/errors/api_error.rb delete mode 100644 lib/VitableConnect/errors/client_error.rb delete mode 100644 lib/VitableConnect/errors/redirect_error.rb delete mode 100644 lib/VitableConnect/errors/response_error.rb delete mode 100644 lib/VitableConnect/errors/server_error.rb delete mode 100644 lib/VitableConnect/errors/timeout_error.rb delete mode 100644 lib/VitableConnect/groups/client.rb delete mode 100644 lib/VitableConnect/groups/members/client.rb delete mode 100644 lib/VitableConnect/groups/members/sync/client.rb delete mode 100644 lib/VitableConnect/groups/members/sync/types/get_sync_request.rb delete mode 100644 lib/VitableConnect/groups/members/sync/types/group_member_sync_request.rb delete mode 100644 lib/VitableConnect/groups/types/create_group_request.rb delete mode 100644 lib/VitableConnect/groups/types/get_groups_request.rb delete mode 100644 lib/VitableConnect/groups/types/list_groups_request.rb delete mode 100644 lib/VitableConnect/groups/types/patched_update_group_request.rb delete mode 100644 lib/VitableConnect/internal/errors/constraint_error.rb delete mode 100644 lib/VitableConnect/internal/errors/type_error.rb delete mode 100644 lib/VitableConnect/internal/http/base_request.rb delete mode 100644 lib/VitableConnect/internal/http/raw_client.rb delete mode 100644 lib/VitableConnect/internal/iterators/cursor_item_iterator.rb delete mode 100644 lib/VitableConnect/internal/iterators/cursor_page_iterator.rb delete mode 100644 lib/VitableConnect/internal/iterators/item_iterator.rb delete mode 100644 lib/VitableConnect/internal/iterators/offset_item_iterator.rb delete mode 100644 lib/VitableConnect/internal/iterators/offset_page_iterator.rb delete mode 100644 lib/VitableConnect/internal/json/request.rb delete mode 100644 lib/VitableConnect/internal/json/serializable.rb delete mode 100644 lib/VitableConnect/internal/multipart/multipart_encoder.rb delete mode 100644 lib/VitableConnect/internal/multipart/multipart_form_data.rb delete mode 100644 lib/VitableConnect/internal/multipart/multipart_form_data_part.rb delete mode 100644 lib/VitableConnect/internal/multipart/multipart_request.rb delete mode 100644 lib/VitableConnect/internal/types/array.rb delete mode 100644 lib/VitableConnect/internal/types/boolean.rb delete mode 100644 lib/VitableConnect/internal/types/enum.rb delete mode 100644 lib/VitableConnect/internal/types/hash.rb delete mode 100644 lib/VitableConnect/internal/types/model.rb delete mode 100644 lib/VitableConnect/internal/types/model/field.rb delete mode 100644 lib/VitableConnect/internal/types/type.rb delete mode 100644 lib/VitableConnect/internal/types/union.rb delete mode 100644 lib/VitableConnect/internal/types/unknown.rb delete mode 100644 lib/VitableConnect/internal/types/utils.rb delete mode 100644 lib/VitableConnect/members/client.rb delete mode 100644 lib/VitableConnect/members/types/get_household_members_request.rb delete mode 100644 lib/VitableConnect/members/types/get_members_request.rb delete mode 100644 lib/VitableConnect/members/types/list_dependents_members_request.rb delete mode 100644 lib/VitableConnect/members/types/list_employments_members_request.rb delete mode 100644 lib/VitableConnect/members/types/list_enrollments_members_request.rb delete mode 100644 lib/VitableConnect/members/types/list_id_cards_members_request.rb delete mode 100644 lib/VitableConnect/members/types/list_members_request.rb delete mode 100644 lib/VitableConnect/members/types/list_qualifying_life_events_members_request.rb delete mode 100644 lib/VitableConnect/organizations/client.rb delete mode 100644 lib/VitableConnect/organizations/types/create_organization_request.rb delete mode 100644 lib/VitableConnect/plans/client.rb delete mode 100644 lib/VitableConnect/plans/types/list_plans_request.rb delete mode 100644 lib/VitableConnect/types/access_method.rb delete mode 100644 lib/VitableConnect/types/access_token_response.rb delete mode 100644 lib/VitableConnect/types/additional_access_method.rb delete mode 100644 lib/VitableConnect/types/address.rb delete mode 100644 lib/VitableConnect/types/address_request.rb delete mode 100644 lib/VitableConnect/types/benefit_family.rb delete mode 100644 lib/VitableConnect/types/benefit_family_param_item.rb delete mode 100644 lib/VitableConnect/types/benefit_lifecycle_stage_item.rb delete mode 100644 lib/VitableConnect/types/benefit_plan_network.rb delete mode 100644 lib/VitableConnect/types/benefit_plan_year_detail.rb delete mode 100644 lib/VitableConnect/types/benefit_plan_year_id.rb delete mode 100644 lib/VitableConnect/types/benefit_plan_year_list.rb delete mode 100644 lib/VitableConnect/types/benefit_status.rb delete mode 100644 lib/VitableConnect/types/benefit_summary.rb delete mode 100644 lib/VitableConnect/types/bound_entity.rb delete mode 100644 lib/VitableConnect/types/bound_entity_response.rb delete mode 100644 lib/VitableConnect/types/bound_entity_type.rb delete mode 100644 lib/VitableConnect/types/card_type.rb delete mode 100644 lib/VitableConnect/types/category.rb delete mode 100644 lib/VitableConnect/types/census_sync_detail_response.rb delete mode 100644 lib/VitableConnect/types/census_sync_employee_address_request.rb delete mode 100644 lib/VitableConnect/types/census_sync_employee_request.rb delete mode 100644 lib/VitableConnect/types/census_sync_response.rb delete mode 100644 lib/VitableConnect/types/classification_correction_source.rb delete mode 100644 lib/VitableConnect/types/compensation_type.rb delete mode 100644 lib/VitableConnect/types/contribution_class_compensation.rb delete mode 100644 lib/VitableConnect/types/contribution_class_employment.rb delete mode 100644 lib/VitableConnect/types/contribution_class_location.rb delete mode 100644 lib/VitableConnect/types/contribution_range.rb delete mode 100644 lib/VitableConnect/types/contribution_strategy.rb delete mode 100644 lib/VitableConnect/types/contribution_tier.rb delete mode 100644 lib/VitableConnect/types/coverage_tier.rb delete mode 100644 lib/VitableConnect/types/create_organization_request_type.rb delete mode 100644 lib/VitableConnect/types/created_after.rb delete mode 100644 lib/VitableConnect/types/created_before.rb delete mode 100644 lib/VitableConnect/types/deduction_detail.rb delete mode 100644 lib/VitableConnect/types/deduction_frequency.rb delete mode 100644 lib/VitableConnect/types/digital_benefit_card.rb delete mode 100644 lib/VitableConnect/types/election_status_item.rb delete mode 100644 lib/VitableConnect/types/eligibility_policy.rb delete mode 100644 lib/VitableConnect/types/eligibility_policy_rule.rb delete mode 100644 lib/VitableConnect/types/eligibility_rule_compensation_type.rb delete mode 100644 lib/VitableConnect/types/eligibility_rule_employee_class.rb delete mode 100644 lib/VitableConnect/types/eligible_geographical_location.rb delete mode 100644 lib/VitableConnect/types/eligible_geographical_location_type.rb delete mode 100644 lib/VitableConnect/types/employee.rb delete mode 100644 lib/VitableConnect/types/employee_address.rb delete mode 100644 lib/VitableConnect/types/employee_address_input.rb delete mode 100644 lib/VitableConnect/types/employee_class.rb delete mode 100644 lib/VitableConnect/types/employee_id.rb delete mode 100644 lib/VitableConnect/types/employee_list_response.rb delete mode 100644 lib/VitableConnect/types/employee_response.rb delete mode 100644 lib/VitableConnect/types/employee_search.rb delete mode 100644 lib/VitableConnect/types/employee_status.rb delete mode 100644 lib/VitableConnect/types/employer.rb delete mode 100644 lib/VitableConnect/types/employer_address.rb delete mode 100644 lib/VitableConnect/types/employer_address_input.rb delete mode 100644 lib/VitableConnect/types/employer_benefit_lifecycle_stage.rb delete mode 100644 lib/VitableConnect/types/employer_benefit_plan_year_response.rb delete mode 100644 lib/VitableConnect/types/employer_benefit_plan_years_list_response.rb delete mode 100644 lib/VitableConnect/types/employer_contact.rb delete mode 100644 lib/VitableConnect/types/employer_hris.rb delete mode 100644 lib/VitableConnect/types/employer_hris_response.rb delete mode 100644 lib/VitableConnect/types/employer_hris_status.rb delete mode 100644 lib/VitableConnect/types/employer_id.rb delete mode 100644 lib/VitableConnect/types/employer_invoice_pdf.rb delete mode 100644 lib/VitableConnect/types/employer_invoice_pdf_response.rb delete mode 100644 lib/VitableConnect/types/employer_invoices_list_response.rb delete mode 100644 lib/VitableConnect/types/employer_payroll_deduction_statement_list_response.rb delete mode 100644 lib/VitableConnect/types/employer_response.rb delete mode 100644 lib/VitableConnect/types/employer_search.rb delete mode 100644 lib/VitableConnect/types/employer_settings.rb delete mode 100644 lib/VitableConnect/types/employer_settings_response.rb delete mode 100644 lib/VitableConnect/types/enrollment.rb delete mode 100644 lib/VitableConnect/types/enrollment_detail.rb delete mode 100644 lib/VitableConnect/types/enrollment_id.rb delete mode 100644 lib/VitableConnect/types/enrollment_list_response.rb delete mode 100644 lib/VitableConnect/types/enrollment_rate.rb delete mode 100644 lib/VitableConnect/types/enrollment_rate_summary.rb delete mode 100644 lib/VitableConnect/types/enrollment_response.rb delete mode 100644 lib/VitableConnect/types/enrollment_status.rb delete mode 100644 lib/VitableConnect/types/error_response.rb delete mode 100644 lib/VitableConnect/types/event_id.rb delete mode 100644 lib/VitableConnect/types/event_name.rb delete mode 100644 lib/VitableConnect/types/gender.rb delete mode 100644 lib/VitableConnect/types/grant_type.rb delete mode 100644 lib/VitableConnect/types/group.rb delete mode 100644 lib/VitableConnect/types/group_id.rb delete mode 100644 lib/VitableConnect/types/group_list_response.rb delete mode 100644 lib/VitableConnect/types/group_member_sync_detail_response.rb delete mode 100644 lib/VitableConnect/types/group_member_sync_failure.rb delete mode 100644 lib/VitableConnect/types/group_member_sync_member_request.rb delete mode 100644 lib/VitableConnect/types/group_member_sync_request_detail.rb delete mode 100644 lib/VitableConnect/types/group_member_sync_request_detail_response.rb delete mode 100644 lib/VitableConnect/types/group_member_sync_response.rb delete mode 100644 lib/VitableConnect/types/group_member_sync_results.rb delete mode 100644 lib/VitableConnect/types/group_response.rb delete mode 100644 lib/VitableConnect/types/household_member.rb delete mode 100644 lib/VitableConnect/types/household_member_relationship.rb delete mode 100644 lib/VitableConnect/types/household_member_type.rb delete mode 100644 lib/VitableConnect/types/household_members_response.rb delete mode 100644 lib/VitableConnect/types/hris_connection.rb delete mode 100644 lib/VitableConnect/types/hris_status_item.rb delete mode 100644 lib/VitableConnect/types/ichra_contribution_class.rb delete mode 100644 lib/VitableConnect/types/idp_provider.rb delete mode 100644 lib/VitableConnect/types/include_cancelled.rb delete mode 100644 lib/VitableConnect/types/invoice.rb delete mode 100644 lib/VitableConnect/types/invoice_id.rb delete mode 100644 lib/VitableConnect/types/invoices_cursor_pagination.rb delete mode 100644 lib/VitableConnect/types/limit.rb delete mode 100644 lib/VitableConnect/types/list_webhook_event_deliveries_response.rb delete mode 100644 lib/VitableConnect/types/marital_status.rb delete mode 100644 lib/VitableConnect/types/member.rb delete mode 100644 lib/VitableConnect/types/member_address.rb delete mode 100644 lib/VitableConnect/types/member_dependents_response.rb delete mode 100644 lib/VitableConnect/types/member_digital_benefit_cards_response.rb delete mode 100644 lib/VitableConnect/types/member_employments_response.rb delete mode 100644 lib/VitableConnect/types/member_enrollment.rb delete mode 100644 lib/VitableConnect/types/member_enrollments_response.rb delete mode 100644 lib/VitableConnect/types/member_id.rb delete mode 100644 lib/VitableConnect/types/member_legal_dependent.rb delete mode 100644 lib/VitableConnect/types/member_list_item.rb delete mode 100644 lib/VitableConnect/types/member_list_response.rb delete mode 100644 lib/VitableConnect/types/member_qualifying_life_event.rb delete mode 100644 lib/VitableConnect/types/member_qualifying_life_event_list_response.rb delete mode 100644 lib/VitableConnect/types/member_response.rb delete mode 100644 lib/VitableConnect/types/member_search.rb delete mode 100644 lib/VitableConnect/types/member_status.rb delete mode 100644 lib/VitableConnect/types/missing_employee_resolution.rb delete mode 100644 lib/VitableConnect/types/name_suffix.rb delete mode 100644 lib/VitableConnect/types/offset.rb delete mode 100644 lib/VitableConnect/types/operation.rb delete mode 100644 lib/VitableConnect/types/organization.rb delete mode 100644 lib/VitableConnect/types/organization_employer.rb delete mode 100644 lib/VitableConnect/types/organization_employer_list_response.rb delete mode 100644 lib/VitableConnect/types/organization_hris_provider.rb delete mode 100644 lib/VitableConnect/types/organization_hris_providers_response.rb delete mode 100644 lib/VitableConnect/types/organization_type.rb delete mode 100644 lib/VitableConnect/types/organizations_list_response.rb delete mode 100644 lib/VitableConnect/types/page.rb delete mode 100644 lib/VitableConnect/types/pagination.rb delete mode 100644 lib/VitableConnect/types/payroll_access_setup_status.rb delete mode 100644 lib/VitableConnect/types/payroll_access_setup_status_response.rb delete mode 100644 lib/VitableConnect/types/payroll_deduction_statement.rb delete mode 100644 lib/VitableConnect/types/payroll_integration_email.rb delete mode 100644 lib/VitableConnect/types/payroll_integration_email_response.rb delete mode 100644 lib/VitableConnect/types/plan.rb delete mode 100644 lib/VitableConnect/types/plan_list_response.rb delete mode 100644 lib/VitableConnect/types/plan_year_enrollment.rb delete mode 100644 lib/VitableConnect/types/plan_year_enrollment_election_status.rb delete mode 100644 lib/VitableConnect/types/plan_year_enrollment_list_response.rb delete mode 100644 lib/VitableConnect/types/plan_year_enrollment_policy_status.rb delete mode 100644 lib/VitableConnect/types/preferred_language.rb delete mode 100644 lib/VitableConnect/types/product_code.rb delete mode 100644 lib/VitableConnect/types/qualifying_life_event_status.rb delete mode 100644 lib/VitableConnect/types/qualifying_life_event_type.rb delete mode 100644 lib/VitableConnect/types/reissue_enrollment.rb delete mode 100644 lib/VitableConnect/types/reissue_enrollment_response.rb delete mode 100644 lib/VitableConnect/types/relationship.rb delete mode 100644 lib/VitableConnect/types/remaining_employee_action.rb delete mode 100644 lib/VitableConnect/types/request_id.rb delete mode 100644 lib/VitableConnect/types/resource_id.rb delete mode 100644 lib/VitableConnect/types/resource_type.rb delete mode 100644 lib/VitableConnect/types/search.rb delete mode 100644 lib/VitableConnect/types/sex_at_birth.rb delete mode 100644 lib/VitableConnect/types/state.rb delete mode 100644 lib/VitableConnect/types/status.rb delete mode 100644 lib/VitableConnect/types/tax_classification.rb delete mode 100644 lib/VitableConnect/types/termination_rule.rb delete mode 100644 lib/VitableConnect/types/update_employer_address_input.rb delete mode 100644 lib/VitableConnect/types/waiting_period.rb delete mode 100644 lib/VitableConnect/types/webhook_delivery.rb delete mode 100644 lib/VitableConnect/types/webhook_event.rb delete mode 100644 lib/VitableConnect/types/webhook_event_list_response.rb delete mode 100644 lib/VitableConnect/types/webhook_event_response.rb delete mode 100644 lib/VitableConnect/webhook_events/client.rb delete mode 100644 lib/VitableConnect/webhook_events/types/get_webhook_events_request.rb delete mode 100644 lib/VitableConnect/webhook_events/types/list_deliveries_webhook_events_request.rb delete mode 100644 lib/VitableConnect/webhook_events/types/list_webhook_events_request.rb create mode 100644 lib/vitable_connect/client.rb create mode 100644 lib/vitable_connect/errors.rb create mode 100644 lib/vitable_connect/file_part.rb create mode 100644 lib/vitable_connect/internal.rb create mode 100644 lib/vitable_connect/internal/page_number_page.rb create mode 100644 lib/vitable_connect/internal/transport/base_client.rb create mode 100644 lib/vitable_connect/internal/transport/pooled_net_requester.rb create mode 100644 lib/vitable_connect/internal/type/array_of.rb create mode 100644 lib/vitable_connect/internal/type/base_model.rb create mode 100644 lib/vitable_connect/internal/type/base_page.rb create mode 100644 lib/vitable_connect/internal/type/boolean.rb create mode 100644 lib/vitable_connect/internal/type/converter.rb create mode 100644 lib/vitable_connect/internal/type/enum.rb create mode 100644 lib/vitable_connect/internal/type/file_input.rb create mode 100644 lib/vitable_connect/internal/type/hash_of.rb create mode 100644 lib/vitable_connect/internal/type/request_parameters.rb create mode 100644 lib/vitable_connect/internal/type/union.rb create mode 100644 lib/vitable_connect/internal/type/unknown.rb create mode 100644 lib/vitable_connect/internal/util.rb create mode 100644 lib/vitable_connect/models.rb create mode 100644 lib/vitable_connect/models/auth_issue_access_token_params.rb create mode 100644 lib/vitable_connect/models/auth_issue_access_token_response.rb create mode 100644 lib/vitable_connect/models/employee.rb create mode 100644 lib/vitable_connect/models/employee_class.rb create mode 100644 lib/vitable_connect/models/employee_list_enrollments_params.rb create mode 100644 lib/vitable_connect/models/employee_retrieve_params.rb create mode 100644 lib/vitable_connect/models/employee_retrieve_response.rb create mode 100644 lib/vitable_connect/models/employee_update_params.rb create mode 100644 lib/vitable_connect/models/employee_update_response.rb create mode 100644 lib/vitable_connect/models/employer.rb create mode 100644 lib/vitable_connect/models/employer_create_params.rb create mode 100644 lib/vitable_connect/models/employer_ensure_payroll_integration_email_params.rb create mode 100644 lib/vitable_connect/models/employer_ensure_payroll_integration_email_response.rb create mode 100644 lib/vitable_connect/models/employer_list_benefit_plan_year_enrollments_params.rb create mode 100644 lib/vitable_connect/models/employer_list_benefit_plan_year_enrollments_response.rb create mode 100644 lib/vitable_connect/models/employer_list_benefit_plan_years_params.rb create mode 100644 lib/vitable_connect/models/employer_list_benefit_plan_years_response.rb create mode 100644 lib/vitable_connect/models/employer_list_employees_params.rb create mode 100644 lib/vitable_connect/models/employer_list_hris_providers_params.rb create mode 100644 lib/vitable_connect/models/employer_list_hris_providers_response.rb create mode 100644 lib/vitable_connect/models/employer_list_invoices_params.rb create mode 100644 lib/vitable_connect/models/employer_list_invoices_response.rb create mode 100644 lib/vitable_connect/models/employer_list_params.rb create mode 100644 lib/vitable_connect/models/employer_list_payroll_deduction_statements_params.rb create mode 100644 lib/vitable_connect/models/employer_list_payroll_deduction_statements_response.rb create mode 100644 lib/vitable_connect/models/employer_list_response.rb create mode 100644 lib/vitable_connect/models/employer_response.rb create mode 100644 lib/vitable_connect/models/employer_retrieve_benefit_plan_year_params.rb create mode 100644 lib/vitable_connect/models/employer_retrieve_benefit_plan_year_response.rb create mode 100644 lib/vitable_connect/models/employer_retrieve_hris_params.rb create mode 100644 lib/vitable_connect/models/employer_retrieve_hris_response.rb create mode 100644 lib/vitable_connect/models/employer_retrieve_invoice_pdf_params.rb create mode 100644 lib/vitable_connect/models/employer_retrieve_invoice_pdf_response.rb create mode 100644 lib/vitable_connect/models/employer_retrieve_params.rb create mode 100644 lib/vitable_connect/models/employer_retrieve_payroll_access_setup_params.rb create mode 100644 lib/vitable_connect/models/employer_retrieve_payroll_access_setup_response.rb create mode 100644 lib/vitable_connect/models/employer_submit_census_sync_params.rb create mode 100644 lib/vitable_connect/models/employer_submit_census_sync_response.rb create mode 100644 lib/vitable_connect/models/employer_submit_payroll_access_setup_params.rb create mode 100644 lib/vitable_connect/models/employer_submit_payroll_access_setup_response.rb create mode 100644 lib/vitable_connect/models/employer_update_params.rb create mode 100644 lib/vitable_connect/models/employer_update_settings_params.rb create mode 100644 lib/vitable_connect/models/employer_update_settings_response.rb create mode 100644 lib/vitable_connect/models/enrollment.rb create mode 100644 lib/vitable_connect/models/enrollment_reissue_params.rb create mode 100644 lib/vitable_connect/models/enrollment_reissue_response.rb create mode 100644 lib/vitable_connect/models/enrollment_retrieve_params.rb create mode 100644 lib/vitable_connect/models/enrollment_retrieve_response.rb create mode 100644 lib/vitable_connect/models/enrollment_status.rb create mode 100644 lib/vitable_connect/models/enrollment_terminate_params.rb create mode 100644 lib/vitable_connect/models/group.rb create mode 100644 lib/vitable_connect/models/group_create_params.rb create mode 100644 lib/vitable_connect/models/group_list_params.rb create mode 100644 lib/vitable_connect/models/group_response.rb create mode 100644 lib/vitable_connect/models/group_retrieve_params.rb create mode 100644 lib/vitable_connect/models/group_update_params.rb create mode 100644 lib/vitable_connect/models/groups/members/sync_retrieve_params.rb create mode 100644 lib/vitable_connect/models/groups/members/sync_retrieve_response.rb create mode 100644 lib/vitable_connect/models/groups/members/sync_submit_params.rb create mode 100644 lib/vitable_connect/models/groups/members/sync_submit_response.rb create mode 100644 lib/vitable_connect/models/member_list_dependents_params.rb create mode 100644 lib/vitable_connect/models/member_list_dependents_response.rb create mode 100644 lib/vitable_connect/models/member_list_employments_params.rb create mode 100644 lib/vitable_connect/models/member_list_employments_response.rb create mode 100644 lib/vitable_connect/models/member_list_enrollments_params.rb create mode 100644 lib/vitable_connect/models/member_list_enrollments_response.rb create mode 100644 lib/vitable_connect/models/member_list_id_cards_params.rb create mode 100644 lib/vitable_connect/models/member_list_id_cards_response.rb create mode 100644 lib/vitable_connect/models/member_list_params.rb create mode 100644 lib/vitable_connect/models/member_list_qualifying_life_events_params.rb create mode 100644 lib/vitable_connect/models/member_list_qualifying_life_events_response.rb create mode 100644 lib/vitable_connect/models/member_list_response.rb create mode 100644 lib/vitable_connect/models/member_retrieve_household_params.rb create mode 100644 lib/vitable_connect/models/member_retrieve_household_response.rb create mode 100644 lib/vitable_connect/models/member_retrieve_params.rb create mode 100644 lib/vitable_connect/models/member_retrieve_response.rb create mode 100644 lib/vitable_connect/models/organization_create_params.rb create mode 100644 lib/vitable_connect/models/organization_create_response.rb create mode 100644 lib/vitable_connect/models/organization_list_params.rb create mode 100644 lib/vitable_connect/models/organization_list_response.rb create mode 100644 lib/vitable_connect/models/pagination.rb create mode 100644 lib/vitable_connect/models/plan_list_params.rb create mode 100644 lib/vitable_connect/models/plan_list_response.rb create mode 100644 lib/vitable_connect/models/webhook_event.rb create mode 100644 lib/vitable_connect/models/webhook_event_list_deliveries_params.rb create mode 100644 lib/vitable_connect/models/webhook_event_list_deliveries_response.rb create mode 100644 lib/vitable_connect/models/webhook_event_list_params.rb create mode 100644 lib/vitable_connect/models/webhook_event_retrieve_params.rb create mode 100644 lib/vitable_connect/models/webhook_event_retrieve_response.rb create mode 100644 lib/vitable_connect/request_options.rb create mode 100644 lib/vitable_connect/resources/auth.rb create mode 100644 lib/vitable_connect/resources/employees.rb create mode 100644 lib/vitable_connect/resources/employers.rb create mode 100644 lib/vitable_connect/resources/enrollments.rb create mode 100644 lib/vitable_connect/resources/groups.rb create mode 100644 lib/vitable_connect/resources/groups/members.rb create mode 100644 lib/vitable_connect/resources/groups/members/sync.rb create mode 100644 lib/vitable_connect/resources/members.rb create mode 100644 lib/vitable_connect/resources/organizations.rb create mode 100644 lib/vitable_connect/resources/plans.rb create mode 100644 lib/vitable_connect/resources/webhook_events.rb rename lib/{VitableConnect => vitable_connect}/version.rb (74%) create mode 100644 manifest.yaml create mode 100644 rbi/vitable_connect/client.rbi create mode 100644 rbi/vitable_connect/errors.rbi create mode 100644 rbi/vitable_connect/file_part.rbi create mode 100644 rbi/vitable_connect/internal.rbi create mode 100644 rbi/vitable_connect/internal/page_number_page.rbi create mode 100644 rbi/vitable_connect/internal/transport/base_client.rbi create mode 100644 rbi/vitable_connect/internal/transport/pooled_net_requester.rbi create mode 100644 rbi/vitable_connect/internal/type/array_of.rbi create mode 100644 rbi/vitable_connect/internal/type/base_model.rbi create mode 100644 rbi/vitable_connect/internal/type/base_page.rbi create mode 100644 rbi/vitable_connect/internal/type/boolean.rbi create mode 100644 rbi/vitable_connect/internal/type/converter.rbi create mode 100644 rbi/vitable_connect/internal/type/enum.rbi create mode 100644 rbi/vitable_connect/internal/type/file_input.rbi create mode 100644 rbi/vitable_connect/internal/type/hash_of.rbi create mode 100644 rbi/vitable_connect/internal/type/request_parameters.rbi create mode 100644 rbi/vitable_connect/internal/type/union.rbi create mode 100644 rbi/vitable_connect/internal/type/unknown.rbi create mode 100644 rbi/vitable_connect/internal/util.rbi create mode 100644 rbi/vitable_connect/models.rbi create mode 100644 rbi/vitable_connect/models/auth_issue_access_token_params.rbi create mode 100644 rbi/vitable_connect/models/auth_issue_access_token_response.rbi create mode 100644 rbi/vitable_connect/models/employee.rbi create mode 100644 rbi/vitable_connect/models/employee_class.rbi create mode 100644 rbi/vitable_connect/models/employee_list_enrollments_params.rbi create mode 100644 rbi/vitable_connect/models/employee_retrieve_params.rbi create mode 100644 rbi/vitable_connect/models/employee_retrieve_response.rbi create mode 100644 rbi/vitable_connect/models/employee_update_params.rbi create mode 100644 rbi/vitable_connect/models/employee_update_response.rbi create mode 100644 rbi/vitable_connect/models/employer.rbi create mode 100644 rbi/vitable_connect/models/employer_create_params.rbi create mode 100644 rbi/vitable_connect/models/employer_ensure_payroll_integration_email_params.rbi create mode 100644 rbi/vitable_connect/models/employer_ensure_payroll_integration_email_response.rbi create mode 100644 rbi/vitable_connect/models/employer_list_benefit_plan_year_enrollments_params.rbi create mode 100644 rbi/vitable_connect/models/employer_list_benefit_plan_year_enrollments_response.rbi create mode 100644 rbi/vitable_connect/models/employer_list_benefit_plan_years_params.rbi create mode 100644 rbi/vitable_connect/models/employer_list_benefit_plan_years_response.rbi create mode 100644 rbi/vitable_connect/models/employer_list_employees_params.rbi create mode 100644 rbi/vitable_connect/models/employer_list_hris_providers_params.rbi create mode 100644 rbi/vitable_connect/models/employer_list_hris_providers_response.rbi create mode 100644 rbi/vitable_connect/models/employer_list_invoices_params.rbi create mode 100644 rbi/vitable_connect/models/employer_list_invoices_response.rbi create mode 100644 rbi/vitable_connect/models/employer_list_params.rbi create mode 100644 rbi/vitable_connect/models/employer_list_payroll_deduction_statements_params.rbi create mode 100644 rbi/vitable_connect/models/employer_list_payroll_deduction_statements_response.rbi create mode 100644 rbi/vitable_connect/models/employer_list_response.rbi create mode 100644 rbi/vitable_connect/models/employer_response.rbi create mode 100644 rbi/vitable_connect/models/employer_retrieve_benefit_plan_year_params.rbi create mode 100644 rbi/vitable_connect/models/employer_retrieve_benefit_plan_year_response.rbi create mode 100644 rbi/vitable_connect/models/employer_retrieve_hris_params.rbi create mode 100644 rbi/vitable_connect/models/employer_retrieve_hris_response.rbi create mode 100644 rbi/vitable_connect/models/employer_retrieve_invoice_pdf_params.rbi create mode 100644 rbi/vitable_connect/models/employer_retrieve_invoice_pdf_response.rbi create mode 100644 rbi/vitable_connect/models/employer_retrieve_params.rbi create mode 100644 rbi/vitable_connect/models/employer_retrieve_payroll_access_setup_params.rbi create mode 100644 rbi/vitable_connect/models/employer_retrieve_payroll_access_setup_response.rbi create mode 100644 rbi/vitable_connect/models/employer_submit_census_sync_params.rbi create mode 100644 rbi/vitable_connect/models/employer_submit_census_sync_response.rbi create mode 100644 rbi/vitable_connect/models/employer_submit_payroll_access_setup_params.rbi create mode 100644 rbi/vitable_connect/models/employer_submit_payroll_access_setup_response.rbi create mode 100644 rbi/vitable_connect/models/employer_update_params.rbi create mode 100644 rbi/vitable_connect/models/employer_update_settings_params.rbi create mode 100644 rbi/vitable_connect/models/employer_update_settings_response.rbi create mode 100644 rbi/vitable_connect/models/enrollment.rbi create mode 100644 rbi/vitable_connect/models/enrollment_reissue_params.rbi create mode 100644 rbi/vitable_connect/models/enrollment_reissue_response.rbi create mode 100644 rbi/vitable_connect/models/enrollment_retrieve_params.rbi create mode 100644 rbi/vitable_connect/models/enrollment_retrieve_response.rbi create mode 100644 rbi/vitable_connect/models/enrollment_status.rbi create mode 100644 rbi/vitable_connect/models/enrollment_terminate_params.rbi create mode 100644 rbi/vitable_connect/models/group.rbi create mode 100644 rbi/vitable_connect/models/group_create_params.rbi create mode 100644 rbi/vitable_connect/models/group_list_params.rbi create mode 100644 rbi/vitable_connect/models/group_response.rbi create mode 100644 rbi/vitable_connect/models/group_retrieve_params.rbi create mode 100644 rbi/vitable_connect/models/group_update_params.rbi create mode 100644 rbi/vitable_connect/models/groups/members/sync_retrieve_params.rbi create mode 100644 rbi/vitable_connect/models/groups/members/sync_retrieve_response.rbi create mode 100644 rbi/vitable_connect/models/groups/members/sync_submit_params.rbi create mode 100644 rbi/vitable_connect/models/groups/members/sync_submit_response.rbi create mode 100644 rbi/vitable_connect/models/member_list_dependents_params.rbi create mode 100644 rbi/vitable_connect/models/member_list_dependents_response.rbi create mode 100644 rbi/vitable_connect/models/member_list_employments_params.rbi create mode 100644 rbi/vitable_connect/models/member_list_employments_response.rbi create mode 100644 rbi/vitable_connect/models/member_list_enrollments_params.rbi create mode 100644 rbi/vitable_connect/models/member_list_enrollments_response.rbi create mode 100644 rbi/vitable_connect/models/member_list_id_cards_params.rbi create mode 100644 rbi/vitable_connect/models/member_list_id_cards_response.rbi create mode 100644 rbi/vitable_connect/models/member_list_params.rbi create mode 100644 rbi/vitable_connect/models/member_list_qualifying_life_events_params.rbi create mode 100644 rbi/vitable_connect/models/member_list_qualifying_life_events_response.rbi create mode 100644 rbi/vitable_connect/models/member_list_response.rbi create mode 100644 rbi/vitable_connect/models/member_retrieve_household_params.rbi create mode 100644 rbi/vitable_connect/models/member_retrieve_household_response.rbi create mode 100644 rbi/vitable_connect/models/member_retrieve_params.rbi create mode 100644 rbi/vitable_connect/models/member_retrieve_response.rbi create mode 100644 rbi/vitable_connect/models/organization_create_params.rbi create mode 100644 rbi/vitable_connect/models/organization_create_response.rbi create mode 100644 rbi/vitable_connect/models/organization_list_params.rbi create mode 100644 rbi/vitable_connect/models/organization_list_response.rbi create mode 100644 rbi/vitable_connect/models/pagination.rbi create mode 100644 rbi/vitable_connect/models/plan_list_params.rbi create mode 100644 rbi/vitable_connect/models/plan_list_response.rbi create mode 100644 rbi/vitable_connect/models/webhook_event.rbi create mode 100644 rbi/vitable_connect/models/webhook_event_list_deliveries_params.rbi create mode 100644 rbi/vitable_connect/models/webhook_event_list_deliveries_response.rbi create mode 100644 rbi/vitable_connect/models/webhook_event_list_params.rbi create mode 100644 rbi/vitable_connect/models/webhook_event_retrieve_params.rbi create mode 100644 rbi/vitable_connect/models/webhook_event_retrieve_response.rbi create mode 100644 rbi/vitable_connect/request_options.rbi create mode 100644 rbi/vitable_connect/resources/auth.rbi create mode 100644 rbi/vitable_connect/resources/employees.rbi create mode 100644 rbi/vitable_connect/resources/employers.rbi create mode 100644 rbi/vitable_connect/resources/enrollments.rbi create mode 100644 rbi/vitable_connect/resources/groups.rbi create mode 100644 rbi/vitable_connect/resources/groups/members.rbi create mode 100644 rbi/vitable_connect/resources/groups/members/sync.rbi create mode 100644 rbi/vitable_connect/resources/members.rbi create mode 100644 rbi/vitable_connect/resources/organizations.rbi create mode 100644 rbi/vitable_connect/resources/plans.rbi create mode 100644 rbi/vitable_connect/resources/webhook_events.rbi create mode 100644 rbi/vitable_connect/version.rbi delete mode 100644 reference.md create mode 100644 release-please-config.json create mode 100755 scripts/bootstrap create mode 100755 scripts/fast-format create mode 100755 scripts/format create mode 100755 scripts/lint create mode 100755 scripts/test create mode 100755 scripts/utils/upload-artifact.sh create mode 100644 sig/vitable_connect/client.rbs create mode 100644 sig/vitable_connect/errors.rbs create mode 100644 sig/vitable_connect/file_part.rbs create mode 100644 sig/vitable_connect/internal.rbs create mode 100644 sig/vitable_connect/internal/page_number_page.rbs create mode 100644 sig/vitable_connect/internal/transport/base_client.rbs create mode 100644 sig/vitable_connect/internal/transport/pooled_net_requester.rbs create mode 100644 sig/vitable_connect/internal/type/array_of.rbs create mode 100644 sig/vitable_connect/internal/type/base_model.rbs create mode 100644 sig/vitable_connect/internal/type/base_page.rbs create mode 100644 sig/vitable_connect/internal/type/boolean.rbs create mode 100644 sig/vitable_connect/internal/type/converter.rbs create mode 100644 sig/vitable_connect/internal/type/enum.rbs create mode 100644 sig/vitable_connect/internal/type/file_input.rbs create mode 100644 sig/vitable_connect/internal/type/hash_of.rbs create mode 100644 sig/vitable_connect/internal/type/request_parameters.rbs create mode 100644 sig/vitable_connect/internal/type/union.rbs create mode 100644 sig/vitable_connect/internal/type/unknown.rbs create mode 100644 sig/vitable_connect/internal/util.rbs create mode 100644 sig/vitable_connect/models.rbs create mode 100644 sig/vitable_connect/models/auth_issue_access_token_params.rbs create mode 100644 sig/vitable_connect/models/auth_issue_access_token_response.rbs create mode 100644 sig/vitable_connect/models/employee.rbs create mode 100644 sig/vitable_connect/models/employee_class.rbs create mode 100644 sig/vitable_connect/models/employee_list_enrollments_params.rbs create mode 100644 sig/vitable_connect/models/employee_retrieve_params.rbs create mode 100644 sig/vitable_connect/models/employee_retrieve_response.rbs create mode 100644 sig/vitable_connect/models/employee_update_params.rbs create mode 100644 sig/vitable_connect/models/employee_update_response.rbs create mode 100644 sig/vitable_connect/models/employer.rbs create mode 100644 sig/vitable_connect/models/employer_create_params.rbs create mode 100644 sig/vitable_connect/models/employer_ensure_payroll_integration_email_params.rbs create mode 100644 sig/vitable_connect/models/employer_ensure_payroll_integration_email_response.rbs create mode 100644 sig/vitable_connect/models/employer_list_benefit_plan_year_enrollments_params.rbs create mode 100644 sig/vitable_connect/models/employer_list_benefit_plan_year_enrollments_response.rbs create mode 100644 sig/vitable_connect/models/employer_list_benefit_plan_years_params.rbs create mode 100644 sig/vitable_connect/models/employer_list_benefit_plan_years_response.rbs create mode 100644 sig/vitable_connect/models/employer_list_employees_params.rbs create mode 100644 sig/vitable_connect/models/employer_list_hris_providers_params.rbs create mode 100644 sig/vitable_connect/models/employer_list_hris_providers_response.rbs create mode 100644 sig/vitable_connect/models/employer_list_invoices_params.rbs create mode 100644 sig/vitable_connect/models/employer_list_invoices_response.rbs create mode 100644 sig/vitable_connect/models/employer_list_params.rbs create mode 100644 sig/vitable_connect/models/employer_list_payroll_deduction_statements_params.rbs create mode 100644 sig/vitable_connect/models/employer_list_payroll_deduction_statements_response.rbs create mode 100644 sig/vitable_connect/models/employer_list_response.rbs create mode 100644 sig/vitable_connect/models/employer_response.rbs create mode 100644 sig/vitable_connect/models/employer_retrieve_benefit_plan_year_params.rbs create mode 100644 sig/vitable_connect/models/employer_retrieve_benefit_plan_year_response.rbs create mode 100644 sig/vitable_connect/models/employer_retrieve_hris_params.rbs create mode 100644 sig/vitable_connect/models/employer_retrieve_hris_response.rbs create mode 100644 sig/vitable_connect/models/employer_retrieve_invoice_pdf_params.rbs create mode 100644 sig/vitable_connect/models/employer_retrieve_invoice_pdf_response.rbs create mode 100644 sig/vitable_connect/models/employer_retrieve_params.rbs create mode 100644 sig/vitable_connect/models/employer_retrieve_payroll_access_setup_params.rbs create mode 100644 sig/vitable_connect/models/employer_retrieve_payroll_access_setup_response.rbs create mode 100644 sig/vitable_connect/models/employer_submit_census_sync_params.rbs create mode 100644 sig/vitable_connect/models/employer_submit_census_sync_response.rbs create mode 100644 sig/vitable_connect/models/employer_submit_payroll_access_setup_params.rbs create mode 100644 sig/vitable_connect/models/employer_submit_payroll_access_setup_response.rbs create mode 100644 sig/vitable_connect/models/employer_update_params.rbs create mode 100644 sig/vitable_connect/models/employer_update_settings_params.rbs create mode 100644 sig/vitable_connect/models/employer_update_settings_response.rbs create mode 100644 sig/vitable_connect/models/enrollment.rbs create mode 100644 sig/vitable_connect/models/enrollment_reissue_params.rbs create mode 100644 sig/vitable_connect/models/enrollment_reissue_response.rbs create mode 100644 sig/vitable_connect/models/enrollment_retrieve_params.rbs create mode 100644 sig/vitable_connect/models/enrollment_retrieve_response.rbs create mode 100644 sig/vitable_connect/models/enrollment_status.rbs create mode 100644 sig/vitable_connect/models/enrollment_terminate_params.rbs create mode 100644 sig/vitable_connect/models/group.rbs create mode 100644 sig/vitable_connect/models/group_create_params.rbs create mode 100644 sig/vitable_connect/models/group_list_params.rbs create mode 100644 sig/vitable_connect/models/group_response.rbs create mode 100644 sig/vitable_connect/models/group_retrieve_params.rbs create mode 100644 sig/vitable_connect/models/group_update_params.rbs create mode 100644 sig/vitable_connect/models/groups/members/sync_retrieve_params.rbs create mode 100644 sig/vitable_connect/models/groups/members/sync_retrieve_response.rbs create mode 100644 sig/vitable_connect/models/groups/members/sync_submit_params.rbs create mode 100644 sig/vitable_connect/models/groups/members/sync_submit_response.rbs create mode 100644 sig/vitable_connect/models/member_list_dependents_params.rbs create mode 100644 sig/vitable_connect/models/member_list_dependents_response.rbs create mode 100644 sig/vitable_connect/models/member_list_employments_params.rbs create mode 100644 sig/vitable_connect/models/member_list_employments_response.rbs create mode 100644 sig/vitable_connect/models/member_list_enrollments_params.rbs create mode 100644 sig/vitable_connect/models/member_list_enrollments_response.rbs create mode 100644 sig/vitable_connect/models/member_list_id_cards_params.rbs create mode 100644 sig/vitable_connect/models/member_list_id_cards_response.rbs create mode 100644 sig/vitable_connect/models/member_list_params.rbs create mode 100644 sig/vitable_connect/models/member_list_qualifying_life_events_params.rbs create mode 100644 sig/vitable_connect/models/member_list_qualifying_life_events_response.rbs create mode 100644 sig/vitable_connect/models/member_list_response.rbs create mode 100644 sig/vitable_connect/models/member_retrieve_household_params.rbs create mode 100644 sig/vitable_connect/models/member_retrieve_household_response.rbs create mode 100644 sig/vitable_connect/models/member_retrieve_params.rbs create mode 100644 sig/vitable_connect/models/member_retrieve_response.rbs create mode 100644 sig/vitable_connect/models/organization_create_params.rbs create mode 100644 sig/vitable_connect/models/organization_create_response.rbs create mode 100644 sig/vitable_connect/models/organization_list_params.rbs create mode 100644 sig/vitable_connect/models/organization_list_response.rbs create mode 100644 sig/vitable_connect/models/pagination.rbs create mode 100644 sig/vitable_connect/models/plan_list_params.rbs create mode 100644 sig/vitable_connect/models/plan_list_response.rbs create mode 100644 sig/vitable_connect/models/webhook_event.rbs create mode 100644 sig/vitable_connect/models/webhook_event_list_deliveries_params.rbs create mode 100644 sig/vitable_connect/models/webhook_event_list_deliveries_response.rbs create mode 100644 sig/vitable_connect/models/webhook_event_list_params.rbs create mode 100644 sig/vitable_connect/models/webhook_event_retrieve_params.rbs create mode 100644 sig/vitable_connect/models/webhook_event_retrieve_response.rbs create mode 100644 sig/vitable_connect/request_options.rbs create mode 100644 sig/vitable_connect/resources/auth.rbs create mode 100644 sig/vitable_connect/resources/employees.rbs create mode 100644 sig/vitable_connect/resources/employers.rbs create mode 100644 sig/vitable_connect/resources/enrollments.rbs create mode 100644 sig/vitable_connect/resources/groups.rbs create mode 100644 sig/vitable_connect/resources/groups/members.rbs create mode 100644 sig/vitable_connect/resources/groups/members/sync.rbs create mode 100644 sig/vitable_connect/resources/members.rbs create mode 100644 sig/vitable_connect/resources/organizations.rbs create mode 100644 sig/vitable_connect/resources/plans.rbs create mode 100644 sig/vitable_connect/resources/webhook_events.rbs create mode 100644 sig/vitable_connect/version.rbs create mode 100644 sorbet/config create mode 100644 sorbet/rbi/.gitignore delete mode 100644 test/custom.test.rb delete mode 100644 test/test_helper.rb delete mode 100644 test/unit/internal/http/test_raw_client.rb delete mode 100644 test/unit/internal/iterators/test_cursor_item_iterator.rb delete mode 100644 test/unit/internal/iterators/test_offset_item_iterator.rb delete mode 100644 test/unit/internal/types/test_array.rb delete mode 100644 test/unit/internal/types/test_boolean.rb delete mode 100644 test/unit/internal/types/test_enum.rb delete mode 100644 test/unit/internal/types/test_hash.rb delete mode 100644 test/unit/internal/types/test_model.rb delete mode 100644 test/unit/internal/types/test_union.rb delete mode 100644 test/unit/internal/types/test_utils.rb create mode 100644 test/vitable_connect/client_test.rb create mode 100644 test/vitable_connect/file_part_test.rb create mode 100644 test/vitable_connect/internal/sorbet_runtime_support_test.rb create mode 100644 test/vitable_connect/internal/type/base_model_test.rb create mode 100644 test/vitable_connect/internal/util_test.rb create mode 100644 test/vitable_connect/resource_namespaces.rb create mode 100644 test/vitable_connect/resources/auth_test.rb create mode 100644 test/vitable_connect/resources/employees_test.rb create mode 100644 test/vitable_connect/resources/employers_test.rb create mode 100644 test/vitable_connect/resources/enrollments_test.rb create mode 100644 test/vitable_connect/resources/groups/members/sync_test.rb create mode 100644 test/vitable_connect/resources/groups/members_test.rb create mode 100644 test/vitable_connect/resources/groups_test.rb create mode 100644 test/vitable_connect/resources/members_test.rb create mode 100644 test/vitable_connect/resources/organizations_test.rb create mode 100644 test/vitable_connect/resources/plans_test.rb create mode 100644 test/vitable_connect/resources/webhook_events_test.rb create mode 100644 test/vitable_connect/test_helper.rb create mode 100644 vitable_connect.gemspec diff --git a/.fern/metadata.json b/.fern/metadata.json deleted file mode 100644 index f35d037..0000000 --- a/.fern/metadata.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "cliVersion": "5.112.1", - "generatorName": "fernapi/fern-ruby-sdk", - "generatorVersion": "1.24.0", - "generatorConfig": { - "moduleName": "VitableConnect", - "offsetSemantics": "page-index", - "respectAuthSchemeNames": true - }, - "originGitCommit": "c81f2000d5ca2d89b44dee19a4889b48e7fcc732", - "originGitCommitIsDirty": false, - "invokedBy": "ci", - "requestedVersion": "1.0.0", - "ciProvider": "github", - "sdkVersion": "1.0.0" -} \ No newline at end of file diff --git a/.fernignore b/.fernignore index 0c178b8..74a7e48 100644 --- a/.fernignore +++ b/.fernignore @@ -1,7 +1,4 @@ # Files Fern must not overwrite or delete when regenerating this repo. LICENSE SECURITY.md -# Patched: excludes Fern's own entrypoint from Naming/FileName (generator bug). -.rubocop.yml -# Compatibility shim for the pre-1.0 require path. -lib/vitable_connect.rb +.github/workflows/publish-gem.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 72178ea..f132a4b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,75 +1,88 @@ -name: ci - -on: [push, pull_request] - -concurrency: - group: ${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: false +name: CI +on: + push: + branches: + - '**' + - '!integrated/**' + - '!stl-preview-head/**' + - '!stl-preview-base/**' + - '!generated' + - '!codegen/**' + - 'codegen/stl/**' + pull_request: + branches-ignore: + - 'stl-preview-head/**' + - 'stl-preview-base/**' jobs: - lint: - runs-on: ubuntu-latest - + build: + timeout-minutes: 10 + name: build + permissions: + contents: read + id-token: write + runs-on: ${{ startsWith(github.repository, 'stainless-sdks/') && 'depot-ubuntu-24.04' || 'ubuntu-latest' }} + if: |- + github.repository == 'stainless-sdks/vitable-connect-ruby' && + (github.event_name == 'push' || github.event.pull_request.head.repo.fork) && (github.event_name != 'push' || github.event.head_commit.message != 'codegen metadata') steps: - - name: Checkout repo - uses: actions/checkout@v4 - + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Set up Ruby - uses: ruby/setup-ruby@v1 + uses: ruby/setup-ruby@c4e5b1316158f92e3d49443a9d58b31d25ac0f8f # v1.306.0 with: - ruby-version: "3.3" - - - name: Install dependencies - run: bundle install - - - name: Run Rubocop - run: bundle exec rubocop - - test: - runs-on: ubuntu-latest + bundler-cache: false + - run: |- + bundle install + + - name: Get GitHub OIDC Token + if: |- + github.repository == 'stainless-sdks/vitable-connect-ruby' && + !startsWith(github.ref, 'refs/heads/stl/') + id: github-oidc + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0 + with: + script: core.setOutput('github_token', await core.getIDToken()); + + - name: Build and upload gem artifacts + if: |- + github.repository == 'stainless-sdks/vitable-connect-ruby' && + !startsWith(github.ref, 'refs/heads/stl/') + env: + URL: https://pkg.stainless.com/s + AUTH: ${{ steps.github-oidc.outputs.github_token }} + SHA: ${{ github.sha }} + PACKAGE_NAME: vitable_connect + run: ./scripts/utils/upload-artifact.sh + lint: + timeout-minutes: 10 + name: lint + runs-on: ${{ startsWith(github.repository, 'stainless-sdks/') && 'depot-ubuntu-24.04' || 'ubuntu-latest' }} + if: github.event_name == 'push' || github.event.pull_request.head.repo.fork steps: - - name: Checkout repo - uses: actions/checkout@v4 - + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Set up Ruby - uses: ruby/setup-ruby@v1 + uses: ruby/setup-ruby@c4e5b1316158f92e3d49443a9d58b31d25ac0f8f # v1.306.0 with: - ruby-version: "3.3" - - - name: Install dependencies - run: bundle install - - - name: Run Tests - run: bundle exec rake test - - publish: - name: Publish to RubyGems.org - runs-on: ubuntu-latest - needs: [lint, test] - if: github.event_name == 'push' && contains(github.ref, 'refs/tags/') - - permissions: - id-token: write - contents: write + bundler-cache: false + - run: |- + bundle install + - name: Run lints + run: ./scripts/lint + test: + timeout-minutes: 10 + name: test + runs-on: ${{ startsWith(github.repository, 'stainless-sdks/') && 'depot-ubuntu-24.04' || 'ubuntu-latest' }} + if: github.event_name == 'push' || github.event.pull_request.head.repo.fork steps: - - name: Checkout repo - uses: actions/checkout@v4 - + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Set up Ruby - uses: ruby/setup-ruby@v1 + uses: ruby/setup-ruby@c4e5b1316158f92e3d49443a9d58b31d25ac0f8f # v1.306.0 with: - ruby-version: "3.3" - - - name: Install dependencies - run: bundle install - - - name: Configure RubyGems credentials - uses: rubygems/configure-rubygems-credentials@v1.0.0 - - - name: Build gem - run: bundle exec rake build + bundler-cache: false + - run: |- + bundle install - - name: Push gem to RubyGems - run: gem push pkg/*.gem + - name: Run tests + run: ./scripts/test diff --git a/.github/workflows/publish-gem.yml b/.github/workflows/publish-gem.yml new file mode 100644 index 0000000..8465130 --- /dev/null +++ b/.github/workflows/publish-gem.yml @@ -0,0 +1,37 @@ +# Publishes the Fern-generated SDK to RubyGems.org via OIDC trusted publishing +# (the gem trusts this repo + workflow file; no token). Triggered when a +# GitHub release is published, or manually to re-publish after a failure. +# +# This file is listed in .fernignore so Fern regeneration preserves it. +name: Publish Gem +on: + workflow_dispatch: + + release: + types: [published] + +jobs: + publish: + name: publish + # Keep in sync with the RubyGems trusted publisher registration, which + # pins this environment name. + environment: prod + runs-on: ubuntu-latest + permissions: + contents: read + id-token: write + + steps: + - uses: actions/checkout@v5 + + - name: Set up Ruby + uses: ruby/setup-ruby@v1 + with: + ruby-version: "3.2" + bundler-cache: false + + # Builds the gemspec and pushes via RubyGems trusted publishing. + - name: Publish to RubyGems.org + uses: rubygems/release-gem@v1 + with: + await-release: false diff --git a/.github/workflows/release-doctor.yml b/.github/workflows/release-doctor.yml new file mode 100644 index 0000000..71db6fd --- /dev/null +++ b/.github/workflows/release-doctor.yml @@ -0,0 +1,22 @@ +name: Release Doctor +on: + pull_request: + branches: + - main + workflow_dispatch: + +jobs: + release_doctor: + name: release doctor + runs-on: ubuntu-latest + if: github.repository == 'Vitable-Inc/vitable-connect-ruby' && (github.event_name == 'push' || github.event_name == 'workflow_dispatch' || startsWith(github.head_ref, 'release-please') || github.head_ref == 'next') + + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + + - name: Check release environment + run: | + bash ./bin/check-release-environment + env: + RUBYGEMS_HOST: ${{ secrets.VITABLE_CONNECT_RUBYGEMS_HOST || secrets.RUBYGEMS_HOST }} + GEM_HOST_API_KEY: ${{ secrets.VITABLE_CONNECT_GEM_HOST_API_KEY || secrets.GEM_HOST_API_KEY }} diff --git a/.gitignore b/.gitignore index c111b33..fc9eb28 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,11 @@ *.gem +.idea/ +.ignore +.prism.log +.stdy.log +.ruby-lsp/ +.yardoc/ +bin/tapioca +Brewfile.lock.json +doc/ +sorbet/tapioca/* diff --git a/.release-please-manifest.json b/.release-please-manifest.json new file mode 100644 index 0000000..4208b5c --- /dev/null +++ b/.release-please-manifest.json @@ -0,0 +1,3 @@ +{ + ".": "0.6.0" +} \ No newline at end of file diff --git a/.rubocop.yml b/.rubocop.yml index 85b6b0b..de270e4 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -1,110 +1,296 @@ -plugins: - - rubocop-minitest - +# yaml-language-server: $schema=https://www.rubyschema.org/rubocop.json +--- +# Explicitly disable pending cops for now. This is the default behaviour but +# this avoids a large warning every time we run it. +# Stop RuboCop nagging about rubocop-rake. +# Ensure that RuboCop validates according to the lowest version of Ruby that we support. AllCops: - TargetRubyVersion: 3.3 + Exclude: + - "bin/*" NewCops: enable + SuggestExtensions: false + TargetRubyVersion: 3.2 -Style/StringLiterals: - EnforcedStyle: double_quotes - -Style/StringLiteralsInInterpolation: - EnforcedStyle: double_quotes +# Whether MFA is required or not should be left to the token configuration. +Gemspec/RequireMFA: + Enabled: false -Style/AccessModifierDeclarations: +# Don't require this extra line break, it can be excessive. +Layout/EmptyLineAfterGuardClause: Enabled: false -Lint/ConstantDefinitionInBlock: +# Don't leave complex assignment values hanging off to the right. +Layout/EndAlignment: + EnforcedStyleAlignWith: variable + +Layout/FirstArrayElementLineBreak: + Enabled: true + +Layout/FirstHashElementLineBreak: + Enabled: true + +Layout/FirstMethodArgumentLineBreak: + Enabled: true + +Layout/FirstMethodParameterLineBreak: + Enabled: true + +# Set a reasonable line length; rely on other cops to correct long lines. +Layout/LineLength: + AllowedPatterns: + - "^\\s*#.*$" + - ^require(_relative)? + - "VitableConnect::Internal::Type::BaseModel$" + - "^\\s*[A-Z0-9_]+ = :" + - "VitableConnect::(Models|Resources|Test)::" + Max: 110 + +Layout/MultilineArrayLineBreaks: + Enabled: true + +# Start the assignment on the same line variable is mentioned. +Layout/MultilineAssignmentLayout: + EnforcedStyle: same_line + +Layout/MultilineHashKeyLineBreaks: + Enabled: true + +Layout/MultilineMethodArgumentLineBreaks: + Enabled: true + +Layout/MultilineMethodParameterLineBreaks: + Enabled: true + +# Prefer compact hash literals. +Layout/SpaceInsideHashLiteralBraces: + EnforcedStyle: no_space + Exclude: + - "**/*.rbi" + +Lint/BooleanSymbol: Enabled: false +# This option occasionally mangles identifier names +Lint/DeprecatedConstants: + Exclude: + - "**/*.rbi" + +# We use pattern assertion in tests to ensure correctness. +Lint/DuplicateMatchPattern: + Exclude: + - "test/**/*" + +# Fairly useful in tests for pattern assertions. +Lint/EmptyInPattern: + Exclude: + - "test/**/*" + +Lint/MissingCopEnableDirective: + Exclude: + - "examples/**/*.rb" + +Lint/MissingSuper: + Exclude: + - "**/*.rbi" + +Lint/SymbolConversion: + Exclude: + - "**/*.rbi" + +# Disabled for safety reasons, this option changes code semantics. +Lint/UnusedMethodArgument: + AutoCorrect: false + +# This option is prone to causing accidental bugs. +Lint/UselessAssignment: + AutoCorrect: false + Exclude: + - "examples/**/*.rb" + Metrics/AbcSize: Enabled: false Metrics/BlockLength: - Enabled: false + AllowedPatterns: + - assert_pattern + - type_alias + - define_sorbet_constant! + Exclude: + - "**/*.rbi" Metrics/ClassLength: Enabled: false +Metrics/CollectionLiteralLength: + Exclude: + - "test/**/*" + +Metrics/CyclomaticComplexity: + Enabled: false + Metrics/MethodLength: Enabled: false +Metrics/ModuleLength: + Enabled: false + Metrics/ParameterLists: Enabled: false Metrics/PerceivedComplexity: Enabled: false -Metrics/CyclomaticComplexity: +Naming/AccessorMethodName: Enabled: false -Metrics/ModuleLength: +# Need to preserve block identifier for documentation. +Naming/BlockForwarding: Enabled: false -Layout/LineLength: +# Underscores are generally useful for disambiguation. +Naming/ClassAndModuleCamelCase: Enabled: false +Naming/MethodParameterName: + Enabled: false + +Naming/PredicatePrefix: + Exclude: + - "**/*.rbi" + Naming/VariableNumber: - EnforcedStyle: normalcase - Severity: warning + Enabled: false +# Nothing wrong with inline private methods. +Style/AccessModifierDeclarations: + Enabled: false + +Style/AccessorGrouping: + Exclude: + - "**/*.rbi" + +# Behaviour of alias_method is more predictable. +Style/Alias: + EnforcedStyle: prefer_alias_method + +# And/or have confusing precedence, avoid them. +Style/AndOr: + EnforcedStyle: always + +Style/ArgumentsForwarding: + Enabled: false + +Style/BisectedAttrAccessor: + Exclude: + - "**/*.rbi" + +# We prefer nested modules in lib/, but are currently using compact style for tests. +Style/ClassAndModuleChildren: + Exclude: + - "test/**/*" + +Style/CommentAnnotation: + Enabled: false + +# We should go back and add these docs, but ignore for now. Style/Documentation: Enabled: false +# Allow explicit empty elses, for clarity. +Style/EmptyElse: + Enabled: false + +Style/EmptyMethod: + Exclude: + - "**/*.rbi" + +# We commonly use ENV['KEY'], it's OK. +Style/FetchEnvVar: + Enabled: false + +# Just to be safe, ensure nobody is mutating our internal strings. +Style/FrozenStringLiteralComment: + EnforcedStyle: always + Exclude: + - "**/*.rbi" + +# Nothing wrong with clear if statements. +Style/IfUnlessModifier: + Enabled: false + +# Rubocop is pretty bad about mangling single line lambdas. Style/Lambda: - EnforcedStyle: literal + Enabled: false -Minitest/MultipleAssertions: +# Prefer consistency in method calling syntax. +Style/MethodCallWithArgsParentheses: + AllowedMethods: + - raise + Enabled: true + Exclude: + - "**/*.gemspec" + +Style/MultilineBlockChain: Enabled: false -Minitest/UselessAssertion: +# Perfectly fine. +Style/MultipleComparison: Enabled: false -# Dynamic snippets are code samples for documentation, not standalone Ruby files. -Style/FrozenStringLiteralComment: +Style/MutableConstant: Exclude: - - "dynamic-snippets/**/*" + - "**/*.rbi" + +# Not all parameters should be named. +Style/NumberedParameters: + Enabled: false + +Style/NumberedParametersLimit: + Max: 2 -# Indent hash elements 2 spaces from the start of the enclosing line rather than -# aligning with the preceding paren or bracket. Generated code nests hashes inside -# arrays and method calls; the "consistent" style is more readable there. -Layout/FirstHashElementIndentation: - EnforcedStyle: consistent +# Reasonable to use brackets for errors with long messages. +Style/RaiseArgs: + Enabled: false + +# Be explicit about `RuntimeError`s. +Style/RedundantException: + Enabled: false + +Style/RedundantInitialize: Exclude: - - "dynamic-snippets/**/*" + - "**/*.rbi" -# Match Layout/FirstHashElementIndentation: indent the first argument 2 spaces -# from the start of the method call's line, regardless of parenthesis position. -# Dynamic snippets are code samples, not standalone Ruby files; exclude them to -# keep this config symmetric with Layout/FirstHashElementIndentation above. -Layout/FirstArgumentIndentation: - EnforcedStyle: consistent +Style/RedundantParentheses: Exclude: - - "dynamic-snippets/**/*" + - "**/*.rbi" -# The generator emits non-idiomatic class names (e.g. Get_With_Query, JSON_) -# derived from IR type names whose wire form contains underscores or digits. -# Rubocop never auto-corrected these (naming cops have no autocorrecter), so -# disabling the cop keeps CI green without changing customer output. Fixing at -# source would rename public types across every existing SDK and therefore -# requires a ruby-v2 major-version bump with a generator migration. -Naming/ClassAndModuleCamelCase: +# Prefer slashes for regex literals. +Style/RegexpLiteral: + EnforcedStyle: slashes + +# Allow explicit ifs, especially for imperative use. +Style/SafeNavigation: Enabled: false -# Integer literals are emitted unformatted (e.g. 1000000, not 1_000_000). -# Rubocop has an autocorrecter for this cop, but the only caller of integer -# emission is the dynamic-snippets path, which feeds customer-facing surfaces: -# (1) snippet markdown in reference docs, (2) dynamic-snippets/*.rb sample -# files. Neither is rubocop-gated (markdown isn't Ruby, dynamic-snippets/**/* -# is excluded above), so formatting integers there would change docs/dashboard -# output without any rubocop benefit. Disabling the cop keeps integers raw -# everywhere and avoids customer-visible diffs. -Style/NumericLiterals: +Style/SignalException: + Exclude: + - Rakefile + - "**/*.rake" + +# We use these sparingly, where we anticipate future branches for the +# inner conditional. +Style/SoleNestedConditional: Enabled: false -# Fern names the gem entrypoint after moduleName (lib/VitableConnect.rb), and -# its own generated config flags that as non-snake_case. Excluded until the -# generator is fixed; reported to Fern. -Naming/FileName: +# Prefer double quotes so that interpolation can be easily added. +Style/StringLiterals: + EnforcedStyle: double_quotes + +# Prefer explicit symbols for clarity; you can search for `:the_symbol`. +Style/SymbolArray: + EnforcedStyle: brackets + +# This option makes examples harder to read for ruby novices. +Style/SymbolProc: Exclude: - - "lib/VitableConnect.rb" + - "examples/**/*.rb" diff --git a/.ruby-version b/.ruby-version new file mode 100644 index 0000000..944880f --- /dev/null +++ b/.ruby-version @@ -0,0 +1 @@ +3.2.0 diff --git a/.solargraph.yml b/.solargraph.yml new file mode 100644 index 0000000..ef59130 --- /dev/null +++ b/.solargraph.yml @@ -0,0 +1,11 @@ +--- +max_files: 0 +include: + - '*.gemspec' + - 'Rakefile' + - 'examples/**/*.rb' + - 'lib/**/*.rb' + - 'test/vitable_connect/resource_namespaces.rb' + - 'test/vitable_connect/test_helper.rb' +exclude: + - 'rbi/**/*' diff --git a/.stats.yml b/.stats.yml new file mode 100644 index 0000000..19c28af --- /dev/null +++ b/.stats.yml @@ -0,0 +1,4 @@ +configured_endpoints: 45 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/vitable/vitable-connect-c3a225d6201981c24180c285dd0d8a6ed97544f9e4e6a734130ead4231063f5e.yml +openapi_spec_hash: 05748169a4747ace4fcb717d9c87458c +config_hash: 0b4d62a9a1e0cc71998bcfc3d15c4db7 diff --git a/.yardopts b/.yardopts new file mode 100644 index 0000000..84c12f2 --- /dev/null +++ b/.yardopts @@ -0,0 +1,6 @@ +--type-name-tag generic:Generic +--default-return void +--markup markdown +--markup-provider redcarpet +--exclude /rbi +--exclude /sig diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..2b8a2c2 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,169 @@ +# Changelog + +## 0.6.0 (2026-08-20) + +Full Changelog: [v0.5.0...v0.6.0](https://github.com/Vitable-Inc/vitable-connect-ruby/compare/v0.5.0...v0.6.0) + +### Features + +* **api:** api update ([a8fa255](https://github.com/Vitable-Inc/vitable-connect-ruby/commit/a8fa25571fcc0dfffd2cea62c700c7612837ab0e)) +* **api:** api update ([8ea65ec](https://github.com/Vitable-Inc/vitable-connect-ruby/commit/8ea65ec4ca7cbd824bd8f84757de396be2f2d763)) +* **api:** api update ([e4c0d55](https://github.com/Vitable-Inc/vitable-connect-ruby/commit/e4c0d55037684ff1728c169be424b135470b6a20)) +* **api:** api update ([1313a69](https://github.com/Vitable-Inc/vitable-connect-ruby/commit/1313a69bae839b3507b9c0d99208b7a4a8fb8be3)) +* **api:** api update ([b7c3059](https://github.com/Vitable-Inc/vitable-connect-ruby/commit/b7c3059ddbbf2e0ebb11c45d4666b8e7b15b8cf0)) +* **api:** api update ([1541690](https://github.com/Vitable-Inc/vitable-connect-ruby/commit/1541690e7b4417b0f96fef30ca1cfb3bf501c8a0)) +* **api:** api update ([3cbc2db](https://github.com/Vitable-Inc/vitable-connect-ruby/commit/3cbc2db1c901083f82bcf2cc5033548850a7b7ef)) +* **api:** api update ([87cb259](https://github.com/Vitable-Inc/vitable-connect-ruby/commit/87cb259ac824d9f3132bdbae4cc126113c76f104)) +* **api:** api update ([59ec0e4](https://github.com/Vitable-Inc/vitable-connect-ruby/commit/59ec0e49fcaf2073d7aa8d23f30fa4f66da2dc06)) +* **api:** api update ([d27c533](https://github.com/Vitable-Inc/vitable-connect-ruby/commit/d27c533ad620cce795687476e75da6c6ca58c981)) +* **api:** api update ([9977677](https://github.com/Vitable-Inc/vitable-connect-ruby/commit/99776776cfdda16a6c1d747411f593e6a6604a93)) +* **api:** configure all public v1 endpoints and drop dangling Type model ref ([266eb2d](https://github.com/Vitable-Inc/vitable-connect-ruby/commit/266eb2dbb74bd7691dde067954b6cabb52feece0)) +* **api:** removed benefit policies from api reference ([a030ce5](https://github.com/Vitable-Inc/vitable-connect-ruby/commit/a030ce509786dee1f6c331bd0d74914caaf79b16)) +* **stlc:** configurable CI runner and private-production-repo support in workflow templates ([432db79](https://github.com/Vitable-Inc/vitable-connect-ruby/commit/432db791d9bb609ce1f65cbbe338e41254edf038)) + + +### Bug Fixes + +* **client:** bind IdentityProviderBearer to an identity_token client option ([d6fa230](https://github.com/Vitable-Inc/vitable-connect-ruby/commit/d6fa230a5b7b4e97e6dde37fd4bc078b1cb7b4a4)) + + +### Chores + +* **internal:** bound formatter parallelism to CPU count ([fa81169](https://github.com/Vitable-Inc/vitable-connect-ruby/commit/fa811693161dee1bc144df4db95258ca4755ed51)) + + +### Refactors + +* **api:** drop the IdP session endpoints from the SDK surface ([30a9c2e](https://github.com/Vitable-Inc/vitable-connect-ruby/commit/30a9c2e3724bed64bf808615943e43e7324de9c5)) + +## 0.5.0 (2026-06-18) + +Full Changelog: [v0.4.0...v0.5.0](https://github.com/Vitable-Inc/vitable-connect-ruby/compare/v0.4.0...v0.5.0) + +### Features + +* **api:** api update ([a8bcdc8](https://github.com/Vitable-Inc/vitable-connect-ruby/commit/a8bcdc81db4619608b5119a9077ae3b56e441e5c)) +* **api:** api update ([b94afbd](https://github.com/Vitable-Inc/vitable-connect-ruby/commit/b94afbd4992d43ed37036930d0697416b8698946)) +* **api:** api update ([f3374eb](https://github.com/Vitable-Inc/vitable-connect-ruby/commit/f3374eb5c25f3da5c2511fa2b89b049b8fdffbba)) +* **api:** api update ([4c48eb5](https://github.com/Vitable-Inc/vitable-connect-ruby/commit/4c48eb5ebb5f4d939c0604656806fbab0498fabe)) + + +### Bug Fixes + +* **client:** send content-type header for requests with an omitted optional body ([c2bffd5](https://github.com/Vitable-Inc/vitable-connect-ruby/commit/c2bffd51607ee207814ebca6d6774bfd276d2254)) + +## 0.4.0 (2026-05-15) + +Full Changelog: [v0.3.0...v0.4.0](https://github.com/Vitable-Inc/vitable-connect-ruby/compare/v0.3.0...v0.4.0) + +### Features + +* **api:** api update ([5891ffa](https://github.com/Vitable-Inc/vitable-connect-ruby/commit/5891ffad3ab9bd4ece9a1e2c17e66a07ff30a228)) +* **api:** api update ([62eabe5](https://github.com/Vitable-Inc/vitable-connect-ruby/commit/62eabe5767331aa848e6abaf1a229ee068fc299b)) +* **api:** manual updates ([ca33b4f](https://github.com/Vitable-Inc/vitable-connect-ruby/commit/ca33b4fd801e497a4237e7d69bf557857be075d3)) +* support setting headers via env ([707a5d3](https://github.com/Vitable-Inc/vitable-connect-ruby/commit/707a5d38e79b1e64ed132653910fec8a5a5bf125)) + + +### Bug Fixes + +* **client:** elide content type header on requests without body ([8427bb0](https://github.com/Vitable-Inc/vitable-connect-ruby/commit/8427bb0aefea63b6d8b594cfcb400f8cff2c2b86)) + + +### Chores + +* **internal:** more robust bootstrap script ([921ddac](https://github.com/Vitable-Inc/vitable-connect-ruby/commit/921ddac9d3073aeb1fdb7292d413eedfdaf5aa4c)) + +## 0.3.0 (2026-04-17) + +Full Changelog: [v0.2.2...v0.3.0](https://github.com/Vitable-Inc/vitable-connect-ruby/compare/v0.2.2...v0.3.0) + +### Features + +* **api:** api update ([f0f95aa](https://github.com/Vitable-Inc/vitable-connect-ruby/commit/f0f95aad70b337a6bf9b73b671ffbeb3f082f8d2)) + + +### Bug Fixes + +* multipart encoding for file arrays ([89441e1](https://github.com/Vitable-Inc/vitable-connect-ruby/commit/89441e17106f9dcdb74cfb1a0ec5e59a8d2030f5)) + +## 0.2.2 (2026-04-03) + +Full Changelog: [v0.2.1...v0.2.2](https://github.com/Vitable-Inc/vitable-connect-ruby/compare/v0.2.1...v0.2.2) + +### Bug Fixes + +* align path encoding with RFC 3986 section 3.3 ([8dffaa7](https://github.com/Vitable-Inc/vitable-connect-ruby/commit/8dffaa70c9a25f8c03eab999b3bcfb3eb0b151b8)) +* variable name typo ([0c72698](https://github.com/Vitable-Inc/vitable-connect-ruby/commit/0c7269861dfb77cc7b901b63229b420122751cbb)) + +## 0.2.2 (2026-04-01) + +Full Changelog: [v0.2.1...v0.2.2](https://github.com/Vitable-Inc/vitable-connect-ruby/compare/v0.2.1...v0.2.2) + +### Bug Fixes + +* align path encoding with RFC 3986 section 3.3 ([8dffaa7](https://github.com/Vitable-Inc/vitable-connect-ruby/commit/8dffaa70c9a25f8c03eab999b3bcfb3eb0b151b8)) +* variable name typo ([0c72698](https://github.com/Vitable-Inc/vitable-connect-ruby/commit/0c7269861dfb77cc7b901b63229b420122751cbb)) + +## 0.2.1 (2026-03-28) + +Full Changelog: [v0.2.0...v0.2.1](https://github.com/Vitable-Inc/vitable-connect-ruby/compare/v0.2.0...v0.2.1) + +### Bug Fixes + +* **internal:** correct multipart form field name encoding ([f7a59c7](https://github.com/Vitable-Inc/vitable-connect-ruby/commit/f7a59c7c92beba61c6b100dc2addbd21caec3fe2)) + + +### Chores + +* **ci:** support opting out of skipping builds on metadata-only commits ([03e02f9](https://github.com/Vitable-Inc/vitable-connect-ruby/commit/03e02f904a0e295fc0649474366d2b13ac5cc891)) + +## 0.2.0 (2026-03-25) + +Full Changelog: [v0.1.0...v0.2.0](https://github.com/Vitable-Inc/vitable-connect-ruby/compare/v0.1.0...v0.2.0) + +### Features + +* **api:** api update ([f919311](https://github.com/Vitable-Inc/vitable-connect-ruby/commit/f91931100038a62655c5e06eaa86271babc56d7a)) + + +### Chores + +* **ci:** skip lint on metadata-only changes ([f190ebf](https://github.com/Vitable-Inc/vitable-connect-ruby/commit/f190ebfc6a6fb2885813ca931618c615b815d9c5)) + +## 0.1.0 (2026-03-24) + +Full Changelog: [v0.0.1...v0.1.0](https://github.com/Vitable-Inc/vitable-connect-ruby/compare/v0.0.1...v0.1.0) + +### Features + +* **api:** api update ([827a13a](https://github.com/Vitable-Inc/vitable-connect-ruby/commit/827a13abe88115458aa59f133c130e606b3afa93)) +* **api:** api update ([1cb2f40](https://github.com/Vitable-Inc/vitable-connect-ruby/commit/1cb2f403fec39a30b3e88baae6705768a04d91a2)) +* **api:** manual updates ([7ab2cca](https://github.com/Vitable-Inc/vitable-connect-ruby/commit/7ab2cca14ded6d972020f7d7cb5b548226bdfaa2)) +* **api:** manual updates ([b5d84b3](https://github.com/Vitable-Inc/vitable-connect-ruby/commit/b5d84b3281351c0812a283359af29614f10a37bc)) +* **api:** manual updates ([4112807](https://github.com/Vitable-Inc/vitable-connect-ruby/commit/411280760708e521c4e839bb99d987255e822190)) +* **api:** manual updates ([3f0e8d2](https://github.com/Vitable-Inc/vitable-connect-ruby/commit/3f0e8d2f1ad97489e1223f7ecc8ea4d53176cbac)) +* **api:** manual updates ([3725ee2](https://github.com/Vitable-Inc/vitable-connect-ruby/commit/3725ee2ff330723d7db354d2af67a04b4be79689)) +* **api:** manual updates ([b32c0a8](https://github.com/Vitable-Inc/vitable-connect-ruby/commit/b32c0a8ca6b08e57c16c08803091ee4bd8fec197)) +* **api:** manual updates for 0.0.1 ([70717d4](https://github.com/Vitable-Inc/vitable-connect-ruby/commit/70717d45c51ee0182197b3bd4927cbe941b4e97d)) + + +### Bug Fixes + +* calling `break` out of streams should be instantaneous ([272f56c](https://github.com/Vitable-Inc/vitable-connect-ruby/commit/272f56cfbdc3afbc1be5fa2da5e0d319c226ca31)) +* issue where json.parse errors when receiving HTTP 204 with nobody ([2963616](https://github.com/Vitable-Inc/vitable-connect-ruby/commit/2963616266b8a3270dbeaca9fc92d4262fa62bba)) +* properly mock time in ruby ci tests ([538449e](https://github.com/Vitable-Inc/vitable-connect-ruby/commit/538449eb15a4824387f38450faede9e1b6f27654)) + + +### Chores + +* **ci:** add build step ([d29963c](https://github.com/Vitable-Inc/vitable-connect-ruby/commit/d29963c7fa7db675253a0cd9d50dbb31f333e76d)) +* **ci:** skip uploading artifacts on stainless-internal branches ([622b750](https://github.com/Vitable-Inc/vitable-connect-ruby/commit/622b75012ff9163651f822dec45724cb0aff100a)) +* configure new SDK language ([f6f5e6d](https://github.com/Vitable-Inc/vitable-connect-ruby/commit/f6f5e6ddceb0184f3386b5d1149bf9126ba11d14)) +* **internal:** codegen related update ([7e979b6](https://github.com/Vitable-Inc/vitable-connect-ruby/commit/7e979b64abd445eb49b4b00ca5c5ffc7f4417571)) +* **internal:** codegen related update ([6f45271](https://github.com/Vitable-Inc/vitable-connect-ruby/commit/6f45271cab4d4a7d440e7fa416d8097b53854509)) +* **internal:** codegen related update ([9a1c31a](https://github.com/Vitable-Inc/vitable-connect-ruby/commit/9a1c31a842d559bafa36fea005f570214cc1ae6f)) +* **internal:** remove mock server code ([acd303f](https://github.com/Vitable-Inc/vitable-connect-ruby/commit/acd303fed97b9e4fa22f3d3a00577b004b918a7b)) +* **internal:** tweak CI branches ([f15f247](https://github.com/Vitable-Inc/vitable-connect-ruby/commit/f15f2470c09af516a803e66b2bb1b2f852815129)) +* **internal:** update gitignore ([1794df6](https://github.com/Vitable-Inc/vitable-connect-ruby/commit/1794df6179afcb62f7c6df4e9e549a54fac57dcd)) +* update mock server docs ([26dd24b](https://github.com/Vitable-Inc/vitable-connect-ruby/commit/26dd24b659cfcc7fd0c154090ef650724a07388a)) +* update SDK settings ([5413b0a](https://github.com/Vitable-Inc/vitable-connect-ruby/commit/5413b0abb491b9ba0337df43a95241aa74d2cfd3)) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 95c10ea..f85809f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,120 +1,119 @@ -# Contributing +## Setting up the environment -Thanks for your interest in contributing to this SDK! This document provides guidelines for contributing to the project. +This repository contains a `.ruby-version` file, which should work with either [rbenv](https://github.com/rbenv/rbenv) or [asdf](https://github.com/asdf-vm/asdf) with the [ruby plugin](https://github.com/asdf-vm/asdf-ruby). -## Getting Started +Please follow the instructions for your preferred version manager to install the Ruby version specified in the `.ruby-version` file. -### Prerequisites +To set up the repository, run: -- Ruby 3.0+ -- Bundler +```bash +$ ./scripts/bootstrap +``` -### Installation +This will install all the required dependencies. -Install the project dependencies: +## Modifying/Adding code -```bash -bundle install -``` +Most of the SDK is generated code. Modifications to code will be persisted between generations, but may result in merge conflicts between manual patches and changes from the generator. The generator will never modify the contents of `lib/vitable_connect/helpers/` and `examples/` directory. -### Building +## Adding and running examples -Build the gem: +All files in the `examples/` directory are not modified by the generator and can be freely edited or added to. -```bash -gem build *.gemspec -``` +```ruby +#!/usr/bin/env ruby +# frozen_string_literal: true -### Testing +require_relative "../lib/vitable_connect" -Run the test suite: +# ... +``` ```bash -bundle exec rspec +$ chmod +x './examples/.rb' + +# run the example against your api +$ ruby './examples/.rb' ``` -### Linting and Formatting +## Using the repository from source -Check code style: +If you’d like to use the repository from source, you can either install from git or reference a cloned repository: -```bash -bundle exec rubocop +To install via git in your `Gemfile`: + +```ruby +gem "vitable-connect", git: "https://github.com/Vitable-Inc/vitable-connect-ruby" ``` -Fix code style issues: +Alternatively, reference local copy of the repo: ```bash -bundle exec rubocop -a +$ git clone -- 'https://github.com/Vitable-Inc/vitable-connect-ruby' '' ``` -## About Generated Code +```ruby +gem "vitable-connect", path: "" +``` -**Important**: Most files in this SDK are automatically generated by [Fern](https://buildwithfern.com) from the API definition. Direct modifications to generated files will be overwritten the next time the SDK is generated. +## Running commands -### Generated Files +Running `rake` by itself will show all runnable commands. -The following directories contain generated code: -- `lib/` - API client classes and types -- Most Ruby files in the project +```bash +$ bundle exec rake +``` -### How to Customize +## Running tests -If you need to customize the SDK, you have two options: +```bash +$ bundle exec rake test +``` -#### Option 1: Use `.fernignore` +## Linting and formatting -For custom code that should persist across SDK regenerations: +This repository uses [rubocop](https://github.com/rubocop/rubocop) for linting and formatting of `*.rb` files; And [syntax_tree](https://github.com/ruby-syntax-tree/syntax_tree) is used for formatting of both `*.rbi` and `*.rbs` files. -1. Create a `.fernignore` file in the project root -2. Add file patterns for files you want to preserve (similar to `.gitignore` syntax) -3. Add your custom code to those files +There are two separate type checkers supported by this library: [sorbet](https://github.com/sorbet/sorbet) and [steep](https://github.com/soutaro/steep) are used for verifying `*.rbi` and `*.rbs` files respectively. -Files listed in `.fernignore` will not be overwritten when the SDK is regenerated. +To lint and typecheck: -For more information, see the [Fern documentation on custom code](https://buildwithfern.com/learn/sdks/overview/custom-code). +```bash +$ bundle exec rake lint +``` -#### Option 2: Contribute to the Generator +To format and fix all lint issues automatically: -If you want to change how code is generated for all users of this SDK: +```bash +$ bundle exec rake format +``` -1. The Ruby SDK generator lives in the [Fern repository](https://github.com/fern-api/fern) -2. Generator code is located at `generators/ruby-v2/` -3. Follow the [Fern contributing guidelines](https://github.com/fern-api/fern/blob/main/CONTRIBUTING.md) -4. Submit a pull request with your changes to the generator +## Editor Support -This approach is best for: -- Bug fixes in generated code -- New features that would benefit all users -- Improvements to code generation patterns +### Ruby LSP -## Making Changes +[Ruby LSP](https://github.com/Shopify/ruby-lsp) has quite good support for go to definition, but not auto-completion. -### Workflow +This can be installed along side Solargraph. -1. Create a new branch for your changes -2. Make your modifications -3. Run tests to ensure nothing breaks: `bundle exec rspec` -4. Run linting: `bundle exec rubocop` -5. Build the gem: `gem build *.gemspec` -6. Commit your changes with a clear commit message -7. Push your branch and create a pull request +### Solargraph -### Commit Messages +[Solargraph](https://solargraph.org) has quite good support for auto-completion, but not go to definition. -Write clear, descriptive commit messages that explain what changed and why. +This can be installed along side Ruby LSP. -### Code Style +### Sorbet -This project uses RuboCop for code formatting. Run `bundle exec rubocop` before committing to ensure your code meets the project's style guidelines. +[Sorbet](https://sorbet.org) should mostly work out of the box when editing this library directly. However, there are a some caveats due to the colocation of `*.rb` and `*.rbi` files in the same project. These issues should not otherwise manifest when this library is used as a dependency. -## Questions or Issues? +1. For go to definition usages, sorbet might get confused and may not always navigate to the correct location. -If you have questions or run into issues: +2. For each generic type in `*.rbi` files, a spurious "Duplicate type member" error is present. -1. Check the [Fern documentation](https://buildwithfern.com) -2. Search existing [GitHub issues](https://github.com/fern-api/fern/issues) -3. Open a new issue if your question hasn't been addressed +## Documentation Preview -## License +To preview the documentation, run: -By contributing to this project, you agree that your contributions will be licensed under the same license as the project. +```bash +$ bundle exec rake docs:preview [PORT=8808] +``` diff --git a/Gemfile b/Gemfile index 16877f8..1be178c 100644 --- a/Gemfile +++ b/Gemfile @@ -4,16 +4,29 @@ source "https://rubygems.org" gemspec -group :test, :development do - gem "minitest", "~> 5.16" +group :development do + gem "rake" + gem "rbs" + gem "rubocop" + gem "sorbet" + gem "steep" + gem "syntax_tree" + gem "syntax_tree-rbs", github: "ruby-syntax-tree/syntax_tree-rbs", branch: "main" + gem "tapioca" +end + +group :development, :test do + gem "async" + gem "minitest" + gem "minitest-focus" + gem "minitest-hooks" + gem "minitest-proveit" gem "minitest-rg" - gem "pry" - gem "rake", "~> 13.0" - gem "rubocop", "~> 1.21" - gem "rubocop-minitest" gem "webmock" end -# Load custom Gemfile configuration if it exists -custom_gemfile = File.join(__dir__, "Gemfile.custom") -eval_gemfile(custom_gemfile) if File.exist?(custom_gemfile) +group :development, :docs do + gem "redcarpet" + gem "webrick" + gem "yard" +end diff --git a/Gemfile.custom b/Gemfile.custom deleted file mode 100644 index 6e90109..0000000 --- a/Gemfile.custom +++ /dev/null @@ -1,14 +0,0 @@ -# frozen_string_literal: true - -# Custom Gemfile configuration file -# This file is automatically loaded by the main Gemfile. You can add custom gems, -# groups, or other Gemfile configurations here. If you do make changes to this file, -# you will need to add it to the .fernignore file to prevent your changes from being -# overwritten by the generator. - -# Example usage: -# group :test, :development do -# gem 'custom-gem', '~> 2.0' -# end - -# Add your custom gem dependencies here diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 0000000..2346c80 --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,228 @@ +GIT + remote: https://github.com/ruby-syntax-tree/syntax_tree-rbs.git + revision: f94bc3060682ffbd126e4d5086ffedc89073d626 + branch: main + specs: + syntax_tree-rbs (1.0.0) + prettier_print + rbs + syntax_tree (>= 2.0.1) + +PATH + remote: . + specs: + vitable-connect (0.6.0) + cgi + connection_pool + +GEM + remote: https://rubygems.org/ + specs: + activesupport (8.1.1) + base64 + bigdecimal + concurrent-ruby (~> 1.0, >= 1.3.1) + connection_pool (>= 2.2.5) + drb + i18n (>= 1.6, < 2) + json + logger (>= 1.4.2) + minitest (>= 5.1) + securerandom (>= 0.3) + tzinfo (~> 2.0, >= 2.0.5) + uri (>= 0.13.1) + addressable (2.8.7) + public_suffix (>= 2.0.2, < 7.0) + ast (2.4.3) + async (2.34.0) + console (~> 1.29) + fiber-annotation + io-event (~> 1.11) + metrics (~> 0.12) + traces (~> 0.18) + base64 (0.3.0) + benchmark (0.5.0) + bigdecimal (3.3.1) + cgi (0.5.1) + concurrent-ruby (1.3.5) + connection_pool (2.5.4) + console (1.34.2) + fiber-annotation + fiber-local (~> 1.1) + json + crack (1.0.1) + bigdecimal + rexml + csv (3.3.5) + drb (2.2.3) + erubi (1.13.1) + ffi (1.17.2-aarch64-linux-gnu) + ffi (1.17.2-aarch64-linux-musl) + ffi (1.17.2-arm64-darwin) + ffi (1.17.2-x86_64-darwin) + ffi (1.17.2-x86_64-linux-gnu) + ffi (1.17.2-x86_64-linux-musl) + fiber-annotation (0.2.0) + fiber-local (1.1.0) + fiber-storage + fiber-storage (1.0.1) + fileutils (1.8.0) + hashdiff (1.2.1) + i18n (1.14.7) + concurrent-ruby (~> 1.0) + io-event (1.11.2) + json (2.15.2) + language_server-protocol (3.17.0.5) + lint_roller (1.1.0) + listen (3.9.0) + rb-fsevent (~> 0.10, >= 0.10.3) + rb-inotify (~> 0.9, >= 0.9.10) + logger (1.7.0) + metrics (0.15.0) + minitest (5.26.0) + minitest-focus (1.4.0) + minitest (>= 4, < 6) + minitest-hooks (1.5.2) + minitest (> 5.3) + minitest-proveit (1.0.0) + minitest (> 5, < 7) + minitest-rg (5.3.0) + minitest (~> 5.0) + mutex_m (0.3.0) + netrc (0.11.0) + parallel (1.27.0) + parser (3.3.10.0) + ast (~> 2.4.1) + racc + prettier_print (1.2.1) + prism (1.6.0) + public_suffix (6.0.2) + racc (1.8.1) + rainbow (3.1.1) + rake (13.3.1) + rb-fsevent (0.11.2) + rb-inotify (0.11.1) + ffi (~> 1.0) + rbi (0.3.7) + prism (~> 1.0) + rbs (>= 3.4.4) + rbs (3.9.5) + logger + redcarpet (3.6.1) + regexp_parser (2.11.3) + rexml (3.4.4) + rubocop (1.81.7) + json (~> 2.3) + language_server-protocol (~> 3.17.0.2) + lint_roller (~> 1.1.0) + parallel (~> 1.10) + parser (>= 3.3.0.2) + rainbow (>= 2.2.2, < 4.0) + regexp_parser (>= 2.9.3, < 3.0) + rubocop-ast (>= 1.47.1, < 2.0) + ruby-progressbar (~> 1.7) + unicode-display_width (>= 2.4.0, < 4.0) + rubocop-ast (1.47.1) + parser (>= 3.3.7.2) + prism (~> 1.4) + ruby-progressbar (1.13.0) + securerandom (0.4.1) + sorbet (0.6.12690) + sorbet-static (= 0.6.12690) + sorbet-runtime (0.6.12690) + sorbet-static (0.6.12690-aarch64-linux) + sorbet-static (0.6.12690-universal-darwin) + sorbet-static (0.6.12690-x86_64-linux) + sorbet-static-and-runtime (0.6.12690) + sorbet (= 0.6.12690) + sorbet-runtime (= 0.6.12690) + spoom (1.6.3) + erubi (>= 1.10.0) + prism (>= 0.28.0) + rbi (>= 0.3.3) + rexml (>= 3.2.6) + sorbet-static-and-runtime (>= 0.5.10187) + thor (>= 0.19.2) + steep (1.10.0) + activesupport (>= 5.1) + concurrent-ruby (>= 1.1.10) + csv (>= 3.0.9) + fileutils (>= 1.1.0) + json (>= 2.1.0) + language_server-protocol (>= 3.17.0.4, < 4.0) + listen (~> 3.0) + logger (>= 1.3.0) + mutex_m (>= 0.3.0) + parser (>= 3.1) + rainbow (>= 2.2.2, < 4.0) + rbs (~> 3.9) + securerandom (>= 0.1) + strscan (>= 1.0.0) + terminal-table (>= 2, < 5) + uri (>= 0.12.0) + strscan (3.1.5) + syntax_tree (6.3.0) + prettier_print (>= 1.2.0) + tapioca (0.16.11) + benchmark + bundler (>= 2.2.25) + netrc (>= 0.11.0) + parallel (>= 1.21.0) + rbi (~> 0.2) + sorbet-static-and-runtime (>= 0.5.11087) + spoom (>= 1.2.0) + thor (>= 1.2.0) + yard-sorbet + terminal-table (4.0.0) + unicode-display_width (>= 1.1.1, < 4) + thor (1.4.0) + traces (0.18.2) + tzinfo (2.0.6) + concurrent-ruby (~> 1.0) + unicode-display_width (3.2.0) + unicode-emoji (~> 4.1) + unicode-emoji (4.1.0) + uri (1.1.0) + webmock (3.26.1) + addressable (>= 2.8.0) + crack (>= 0.3.2) + hashdiff (>= 0.4.0, < 2.0.0) + webrick (1.9.1) + yard (0.9.37) + yard-sorbet (0.9.0) + sorbet-runtime + yard + +PLATFORMS + aarch64-linux + aarch64-linux-gnu + aarch64-linux-musl + arm64-darwin + universal-darwin + x86_64-darwin + x86_64-linux-gnu + x86_64-linux-musl + +DEPENDENCIES + async + minitest + minitest-focus + minitest-hooks + minitest-proveit + minitest-rg + rake + rbs + redcarpet + rubocop + sorbet + steep + syntax_tree + syntax_tree-rbs! + tapioca + vitable-connect! + webmock + webrick + yard + +BUNDLED WITH + 2.4.1 diff --git a/README.md b/README.md index 755099c..15f565a 100644 --- a/README.md +++ b/README.md @@ -1,28 +1,8 @@ -# Vitable Connect Ruby Library - -[![fern shield](https://img.shields.io/badge/%F0%9F%8C%BF-Built%20with%20Fern-brightgreen)](https://buildwithfern.com?utm_source=github&utm_medium=github&utm_campaign=readme&utm_source=https%3A%2F%2Fgithub.com%2FVitable-Inc%2Fvitable-connect-ruby) -[![Gem Version](https://badge.fury.io/rb/vitable-connect.svg)](https://badge.fury.io/rb/vitable-connect) - -The Vitable Ruby library provides convenient access to the Vitable APIs from Ruby. - -## Table of Contents - -- [Documentation](#documentation) -- [Installation](#installation) -- [Reference](#reference) -- [Usage](#usage) -- [Advanced Concepts](#advanced-concepts) -- [Sorbet](#sorbet) -- [Versioning](#versioning) -- [Requirements](#requirements) -- [Environments](#environments) -- [Errors](#errors) -- [Advanced](#advanced) - - [Retries](#retries) - - [Timeouts](#timeouts) - - [Additional Headers](#additional-headers) - - [Additional Query Parameters](#additional-query-parameters) -- [Contributing](#contributing) +# Vitable Connect Ruby API library + +The Vitable Connect Ruby library provides convenient access to the Vitable Connect REST API from any Ruby 3.2.0+ application. It ships with comprehensive types & docstrings in Yard, RBS, and RBI – [see below](https://github.com/Vitable-Inc/vitable-connect-ruby#Sorbet) for usage with Sorbet. The standard library's `net/http` is used as the HTTP transport, with connection pooling via the `connection_pool` gem. + +It is generated with [Stainless](https://www.stainless.com/). ## Documentation @@ -42,22 +22,123 @@ gem "vitable-connect", "~> 0.6.0" -## Reference +## Usage -A full reference for this library is available [here](https://github.com/Vitable-Inc/vitable-connect-ruby/blob/HEAD/./reference.md). +```ruby +require "bundler/setup" +require "vitable_connect" -## Usage +vitable_connect = VitableConnect::Client.new( + api_key: ENV["VITABLE_CONNECT_API_KEY"], # This is the default and can be omitted + environment: "environment_1" # defaults to "production" +) + +response = vitable_connect.auth.issue_access_token(grant_type: "client_credentials") + +puts(response.access_token) +``` + +### Pagination + +List methods in the Vitable Connect API are paginated. + +This library provides auto-paginating iterators with each list response, so you do not have to request successive pages manually: + +```ruby +page = vitable_connect.employees.list_enrollments + +# Fetch single item from page. +employee = page.data[0] +puts(employee.id) + +# Automatically fetches more pages as needed. +page.auto_paging_each do |employee| + puts(employee.id) +end +``` + +Alternatively, you can use the `#next_page?` and `#next_page` methods for more granular control working with pages. + +```ruby +if page.next_page? + new_page = page.next_page + puts(new_page.data[0].id) +end +``` + +### Handling errors + +When the library is unable to connect to the API, or if the API returns a non-success status code (i.e., 4xx or 5xx response), a subclass of `VitableConnect::Errors::APIError` will be thrown: + +```ruby +begin + auth = vitable_connect.auth.issue_access_token(grant_type: "client_credentials") +rescue VitableConnect::Errors::APIConnectionError => e + puts("The server could not be reached") + puts(e.cause) # an underlying Exception, likely raised within `net/http` +rescue VitableConnect::Errors::RateLimitError => e + puts("A 429 status code was received; we should back off a bit.") +rescue VitableConnect::Errors::APIStatusError => e + puts("Another non-200-range status code was received") + puts(e.status) +end +``` + +Error codes are as follows: + +| Cause | Error Type | +| ---------------- | -------------------------- | +| HTTP 400 | `BadRequestError` | +| HTTP 401 | `AuthenticationError` | +| HTTP 403 | `PermissionDeniedError` | +| HTTP 404 | `NotFoundError` | +| HTTP 409 | `ConflictError` | +| HTTP 422 | `UnprocessableEntityError` | +| HTTP 429 | `RateLimitError` | +| HTTP >= 500 | `InternalServerError` | +| Other HTTP error | `APIStatusError` | +| Timeout | `APITimeoutError` | +| Network error | `APIConnectionError` | + +### Retries + +Certain errors will be automatically retried 2 times by default, with a short exponential backoff. -Instantiate and use the client with the following: +Connection errors (for example, due to a network connectivity problem), 408 Request Timeout, 409 Conflict, 429 Rate Limit, >=500 Internal errors, and timeouts will all be retried by default. + +You can use the `max_retries` option to configure or disable this: ```ruby -require "vitableconnect" +# Configure the default for all requests: +vitable_connect = VitableConnect::Client.new( + max_retries: 0 # default is 2 +) + +# Or, configure per-request: +vitable_connect.auth.issue_access_token( + grant_type: "client_credentials", + request_options: {max_retries: 5} +) +``` + +### Timeouts -client = VitableConnect::Client.new(api_key: "") +By default, requests will time out after 60 seconds. You can use the timeout option to configure or disable this: -client.auth.issue_access_token(grant_type: "client_credentials") +```ruby +# Configure the default for all requests: +vitable_connect = VitableConnect::Client.new( + timeout: nil # default is 60 +) + +# Or, configure per-request: +vitable_connect.auth.issue_access_token(grant_type: "client_credentials", request_options: {timeout: 5}) ``` +On timeout, `VitableConnect::Errors::APITimeoutError` is raised. + +Note that requests that time out are retried by default. + ## Advanced concepts ### BaseModel @@ -181,135 +262,6 @@ This package considers improvements to the (non-runtime) `*.rbi` and `*.rbs` typ Ruby 3.2.0 or higher. -## Environments - -This SDK allows you to configure different environments or custom URLs for API requests. You can either use the predefined environments or specify your own custom URL. -### Environments -```ruby -require "VitableConnect" - -VitableConnect = VitableConnect::Client.new( - base_url: VitableConnect::Environment::PRODUCTION -) -``` - -### Custom URL -```ruby -require "VitableConnect" - -client = VitableConnect::Client.new( - base_url: "https://example.com" -) -``` - -## Errors - -Failed API calls will raise errors that can be rescued from granularly. - -```ruby -require "VitableConnect" - -client = VitableConnect::Client.new( - base_url: "https://example.com" -) - -begin - result = client.auth.issue_access_token -rescue VitableConnect::Errors::TimeoutError - puts "API didn't respond before our timeout elapsed" -rescue VitableConnect::Errors::ServiceUnavailableError - puts "API returned status 503, is probably overloaded, try again later" -rescue VitableConnect::Errors::ServerError - puts "API returned some other 5xx status, this is probably a bug" -rescue VitableConnect::Errors::ResponseError => e - puts "API returned an unexpected status other than 5xx: #{e.code} #{e.message}" -rescue VitableConnect::Errors::ApiError => e - puts "Some other error occurred when calling the API: #{e.message}" -end -``` - -## Advanced - -### Retries - -The SDK is instrumented with automatic retries. A request will be retried as long as the request is deemed -retryable and the number of retry attempts has not grown larger than the configured retry limit (default: 2). - -A request is deemed retryable when any of the following HTTP status codes is returned: - -- [408](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/408) (Timeout) -- [429](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429) (Too Many Requests) -- [5XX](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status#server_error_responses) (Internal Server Error) - -The `retryStatusCodes` configuration controls which [5XX](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status#server_error_responses) status codes are retried: - -- `legacy` (default): Retries `408`, `429`, `500`, `502`, `503`, `504`, `521`, `522`, `524` -- `recommended`: Retries `408`, `429`, `502`, `503`, `504` only (excludes `500 Internal Server Error` to avoid retrying non-idempotent failures) - -Use the `max_retries` option to configure this behavior. - -```ruby -require "VitableConnect" - -client = VitableConnect::Client.new( - base_url: "https://example.com", - max_retries: 3 # Configure max retries (default is 2) -) -``` - -### Timeouts - -The SDK defaults to a 60 second timeout. Use the `timeout` option to configure this behavior. - -```ruby -require "VitableConnect" - -response = client.auth.issue_access_token( - ..., - timeout: 30 # 30 second timeout -) -``` - -### Additional Headers - -If you would like to send additional headers as part of the request, use the `additional_headers` request option. - -```ruby -require "VitableConnect" - -response = client.auth.issue_access_token( - ..., - request_options: { - additional_headers: { - "X-Custom-Header" => "custom-value" - } - } -) -``` - -### Additional Query Parameters - -If you would like to send additional query parameters as part of the request, use the `additional_query_parameters` request option. - -```ruby -require "VitableConnect" - -response = client.auth.issue_access_token( - ..., - request_options: { - additional_query_parameters: { - "custom_param" => "custom-value" - } - } -) -``` - ## Contributing -While we value open-source contributions to this SDK, this library is generated programmatically. -Additions made directly to this library would have to be moved over to our generation code, -otherwise they would be overwritten upon the next generated release. Feel free to open a PR as -a proof of concept, but know that we will not be able to merge it as-is. We suggest opening -an issue first to discuss with us! - -On the other hand, contributions to the README are always very welcome! +See [the contributing documentation](https://github.com/Vitable-Inc/vitable-connect-ruby/tree/main/CONTRIBUTING.md). diff --git a/Rakefile b/Rakefile index 9bdd4a6..d1e2bd0 100644 --- a/Rakefile +++ b/Rakefile @@ -1,20 +1,177 @@ # frozen_string_literal: true -require "bundler/gem_tasks" +require "etc" +require "pathname" +require "securerandom" +require "shellwords" + require "minitest/test_task" +require "rake/clean" +require "rubocop/rake_task" -Minitest::TestTask.create +tapioca = "sorbet/tapioca" +examples = "examples" +ignore_file = ".ignore" -require "rubocop/rake_task" +FILES_ENV = "FORMAT_FILE" + +CLEAN.push(*%w[.idea/ .ruby-lsp/ .yardoc/ doc/], *FileList["*.gem"], ignore_file) + +CLOBBER.push(*%w[sorbet/rbi/annotations/ sorbet/rbi/gems/], tapioca) + +multitask(:default) do + sh(*%w[rake --tasks]) +end + +desc("Preview docs; use `PORT=` to change the port") +multitask(:"docs:preview") do + sh(*%w[yard server --reload --quiet --bind [::] --port], ENV.fetch("PORT", "8808")) +end + +desc("Run test suites; use `TEST=path/to/test.rb` to run a specific test file") +multitask(:test) do + rb = + FileList[ENV.fetch("TEST", "./test/**/*_test.rb")] + .map { "require_relative(#{_1.dump});" } + .join + + ruby(*%w[-w -e], rb, verbose: false) { fail unless _1 } +end -RuboCop::RakeTask.new +# Cap parallelism at the CPU count. `--max-procs=0` spawns one process per +# 300-file batch with no upper bound; on large SDKs (thousands of files) that +# oversubscribes CPUs and stacks up rubocop processes, exhausting memory and +# slowing CI to the point of timing out. +xargs = %W[xargs --no-run-if-empty --null --max-procs=#{Etc.nprocessors} --max-args=300 --] +ruby_opt = {"RUBYOPT" => [ENV["RUBYOPT"], "--encoding=UTF-8"].compact.join(" ")} -task default: %i[test] +filtered = ->(ext, dirs) do + if ENV.key?(FILES_ENV) + %w[sed -E -n -e] << "/\\.#{ext}$/p" << "--" << ENV.fetch(FILES_ENV) + else + (%w[find] + dirs + %w[-type f -and -name]) << "*.#{ext}" << "-print0" + end +end + +desc("Lint `*.rb(i)`") +multitask(:"lint:rubocop") do + find = %w[find ./lib ./test ./rbi ./examples -type f -and ( -name *.rb -or -name *.rbi ) -print0] + + rubocop = %w[rubocop] + rubocop += %w[--format github] if ENV.key?("CI") + + # some lines cannot be shortened + rubocop += %w[--except Lint/RedundantCopDisableDirective,Layout/LineLength] + + lint = xargs + rubocop + sh("#{find.shelljoin} | #{lint.shelljoin}") +end + +norm_lines = %w[tr -- \n \0].shelljoin + +desc("Format `*.rb`") +multitask(:"format:rb") do + # while `syntax_tree` is much faster than `rubocop`, `rubocop` is the only formatter with full syntax support + files = filtered["rb", %w[./lib ./test ./examples]] + fmt = xargs + %w[rubocop --fail-level F --autocorrect --format simple --] + sh("#{files.shelljoin} | #{norm_lines} | #{fmt.shelljoin}") +end + +desc("Format `*.rbi`") +multitask(:"format:rbi") do + files = filtered["rbi", %w[./rbi]] + fmt = xargs + %w[stree write --] + sh(ruby_opt, "#{files.shelljoin} | #{norm_lines} | #{fmt.shelljoin}") +end -task lint: %i[rubocop] +desc("Format `*.rbs`") +multitask(:"format:rbs") do + files = filtered["rbs", %w[./sig]] + inplace = /darwin|bsd/ =~ RUBY_PLATFORM ? ["-i", ""] : %w[-i] + uuid = SecureRandom.uuid + + # `syntax_tree` has trouble with `rbs`'s class & module aliases + + sed_bin = /darwin/ =~ RUBY_PLATFORM ? "/usr/bin/sed" : "sed" + sed = xargs + [sed_bin, "-E", *inplace, "-e"] + # annotate unprocessable aliases with a unique comment + pre = sed + ["s/(class|module) ([^ ]+) = (.+$)/# \\1 #{uuid}\\n\\2: \\3/", "--"] + fmt = xargs + %w[stree write --plugin=rbs --] + # remove the unique comment and unprocessable aliases to type aliases + subst = <<~SED + s/# (class|module) #{uuid}/\\1/ + t l1 + b + + : l1 + N + s/\\n *([^:]+): (.+)$/ \\1 = \\2/ + SED + # for each line: + # 1. try transform the unique comment into `class | module`, if successful, branch to label `l1`. + # 2. at label `l1`, join previously annotated line with `class | module` information. + pst = sed + [subst, "--"] + + success = false + + # transform class aliases to type aliases, which syntax tree has no trouble with + sh("#{files.shelljoin} | #{norm_lines} | #{pre.shelljoin}") + # run syntax tree to format `*.rbs` files + sh(ruby_opt, "#{files.shelljoin} | #{norm_lines} | #{fmt.shelljoin}") do + success = _1 + end + # transform type aliases back to class aliases + sh("#{files.shelljoin} | #{norm_lines} | #{pst.shelljoin}") + + # always run post-processing to remove comment marker + fail unless success +end + +desc("Format everything") +multitask(format: [:"format:rb", :"format:rbi", :"format:rbs"]) + +desc("Typecheck `*.rbs`") +multitask(:"typecheck:steep") do + sh(*%w[steep check]) +end + +directory(examples) + +desc("Typecheck `*.rbi`") +multitask("typecheck:sorbet": examples) do + sh(*%w[srb typecheck --dir], examples) +end + +directory(tapioca) do + sh(*%w[tapioca init]) +end + +desc("Typecheck everything") +multitask(typecheck: [:"typecheck:steep", :"typecheck:sorbet"]) + +desc("Lint and typecheck") +multitask(lint: [:"lint:rubocop", :typecheck]) + +desc("Build yard docs") +multitask(:"build:docs") do + sh(*%w[yard]) +end + +desc("Build ruby gem") +multitask(:"build:gem") do + # optimizing for grepping through the gem bundle: many tools honour `.ignore` files, including VSCode + # + # both `rbi` and `sig` directories are navigable by their respective tool chains and therefore can be ignored by tools such as `rg` + Pathname(ignore_file).write(<<~GLOB) + rbi/* + sig/* + GLOB + + sh(*%w[gem build -- vitable_connect.gemspec]) + rm_rf(ignore_file) +end -# Run only the custom test file -Minitest::TestTask.create(:customtest) do |t| - t.libs << "test" - t.test_globs = ["test/custom.test.rb"] +desc("Release ruby gem") +multitask(release: [:"build:gem"]) do + sh(*%w[gem push], *FileList["*.gem"]) end diff --git a/Steepfile b/Steepfile new file mode 100644 index 0000000..528b48c --- /dev/null +++ b/Steepfile @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +require "yaml" + +target(:lib) do + configure_code_diagnostics(Steep::Diagnostic::Ruby.strict) + + signature("sig") + + YAML.safe_load_file("./manifest.yaml", symbolize_names: true) => {dependencies:} + # currently these libraries lack the `*.rbs` annotations required by `steep` + stdlibs = dependencies - %w[English etc net/http rbconfig set stringio] + + stdlibs.each { library(_1) } +end diff --git a/VitableConnect.gemspec b/VitableConnect.gemspec deleted file mode 100644 index 945cd53..0000000 --- a/VitableConnect.gemspec +++ /dev/null @@ -1,48 +0,0 @@ -# frozen_string_literal: true - -require_relative "lib/VitableConnect/version" -require_relative "custom.gemspec" - -# NOTE: A handful of these fields are required as part of the Ruby specification. -# You can change them here or overwrite them in the custom gemspec file. -Gem::Specification.new do |spec| - spec.name = "vitable-connect" - spec.authors = ["VitableConnect"] - spec.version = VitableConnect::VERSION - spec.summary = "Ruby client library for the VitableConnect API" - spec.description = "The VitableConnect Ruby library provides convenient access to the VitableConnect API from Ruby." - spec.required_ruby_version = ">= 3.3.0" - spec.metadata["rubygems_mfa_required"] = "true" - - # Specify which files should be added to the gem when it is released. - # The `git ls-files -z` loads the files in the RubyGem that have been added into git. - # When the gem is built outside a git checkout (e.g. generated output), fall back to - # globbing the filesystem. - gemspec = File.basename(__FILE__) - tracked_files = begin - IO.popen(%w[git ls-files -z], chdir: __dir__, err: IO::NULL) do |ls| - ls.readlines("\x0", chomp: true) - end - rescue SystemCallError - [] - end || [] - if tracked_files.empty? - tracked_files = Dir.chdir(__dir__) do - Dir.glob("{lib,exe,sig}/**/*", File::FNM_DOTMATCH).select { |f| File.file?(f) } + - Dir.glob("*").select { |f| File.file?(f) } - end - end - spec.files = tracked_files.reject do |f| - (f == gemspec) || - f.start_with?(*%w[bin/ test/ spec/ features/ .git appveyor Gemfile]) - end - spec.bindir = "exe" - spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) } - spec.require_paths = ["lib"] - # For more information and examples about making a new gem, check out our - # guide at: https://bundler.io/guides/creating_gem.html - - # Load custom gemspec configuration if it exists - custom_gemspec_file = File.join(__dir__, "custom.gemspec.rb") - add_custom_gemspec_data(spec) if File.exist?(custom_gemspec_file) -end diff --git a/bin/check-release-environment b/bin/check-release-environment new file mode 100644 index 0000000..c05436e --- /dev/null +++ b/bin/check-release-environment @@ -0,0 +1,21 @@ +#!/usr/bin/env bash + +errors=() + +if [ -z "${GEM_HOST_API_KEY}" ]; then + errors+=("The GEM_HOST_API_KEY secret has not been set. Please set it in either this repository's secrets or your organization secrets") +fi + +lenErrors=${#errors[@]} + +if [[ lenErrors -gt 0 ]]; then + echo -e "Found the following errors in the release environment:\n" + + for error in "${errors[@]}"; do + echo -e "- $error\n" + done + + exit 1 +fi + +echo "The environment is ready to push releases!" diff --git a/bin/publish-gem b/bin/publish-gem new file mode 100644 index 0000000..8444af2 --- /dev/null +++ b/bin/publish-gem @@ -0,0 +1,9 @@ +#!/usr/bin/env bash + +set -Eeuo pipefail + +cd -- "$(dirname -- "$0")/.." + +bundle +find . -maxdepth 1 -type f -name "*.gem" -delete +rake release \ No newline at end of file diff --git a/custom.gemspec.rb b/custom.gemspec.rb deleted file mode 100644 index d701c1a..0000000 --- a/custom.gemspec.rb +++ /dev/null @@ -1,16 +0,0 @@ -# frozen_string_literal: true - -# Custom gemspec configuration file -# This file is automatically loaded by the main gemspec file. The 'spec' variable is available -# in this context from the main gemspec file. You can modify this file to add custom metadata, -# dependencies, or other gemspec configurations. If you do make changes to this file, you will -# need to add it to the .fernignore file to prevent your changes from being overwritten. - -def add_custom_gemspec_data(spec) - # Example custom configurations (uncomment and modify as needed) - - # spec.authors = ["Your name"] - # spec.email = ["your.email@example.com"] - # spec.homepage = "https://github.com/your-org/vitableconnect-ruby" - # spec.license = "Your license" -end diff --git a/examples/.keep b/examples/.keep new file mode 100644 index 0000000..d8c73e9 --- /dev/null +++ b/examples/.keep @@ -0,0 +1,4 @@ +File generated from our OpenAPI spec by Stainless. + +This directory can be used to store example files demonstrating usage of this SDK. +It is ignored by Stainless code generation and its content (other than this keep file) won't be touched. \ No newline at end of file diff --git a/lib/VitableConnect.rb b/lib/VitableConnect.rb deleted file mode 100644 index cf99c50..0000000 --- a/lib/VitableConnect.rb +++ /dev/null @@ -1,268 +0,0 @@ -# frozen_string_literal: true - -require "json" -require "net/http" -require "securerandom" - -require_relative "VitableConnect/internal/json/serializable" -require_relative "VitableConnect/internal/types/type" -require_relative "VitableConnect/internal/types/utils" -require_relative "VitableConnect/internal/types/union" -require_relative "VitableConnect/internal/errors/constraint_error" -require_relative "VitableConnect/internal/errors/type_error" -require_relative "VitableConnect/internal/http/base_request" -require_relative "VitableConnect/internal/json/request" -require_relative "VitableConnect/internal/http/raw_client" -require_relative "VitableConnect/internal/multipart/multipart_encoder" -require_relative "VitableConnect/internal/multipart/multipart_form_data_part" -require_relative "VitableConnect/internal/multipart/multipart_form_data" -require_relative "VitableConnect/internal/multipart/multipart_request" -require_relative "VitableConnect/internal/types/model/field" -require_relative "VitableConnect/internal/types/model" -require_relative "VitableConnect/internal/types/array" -require_relative "VitableConnect/internal/types/boolean" -require_relative "VitableConnect/internal/types/enum" -require_relative "VitableConnect/internal/types/hash" -require_relative "VitableConnect/internal/types/unknown" -require_relative "VitableConnect/errors/api_error" -require_relative "VitableConnect/errors/response_error" -require_relative "VitableConnect/errors/client_error" -require_relative "VitableConnect/errors/redirect_error" -require_relative "VitableConnect/errors/server_error" -require_relative "VitableConnect/errors/timeout_error" -require_relative "VitableConnect/internal/iterators/item_iterator" -require_relative "VitableConnect/internal/iterators/cursor_item_iterator" -require_relative "VitableConnect/internal/iterators/offset_item_iterator" -require_relative "VitableConnect/internal/iterators/cursor_page_iterator" -require_relative "VitableConnect/internal/iterators/offset_page_iterator" -require_relative "VitableConnect/types/benefit_family_param_item" -require_relative "VitableConnect/types/benefit_lifecycle_stage_item" -require_relative "VitableConnect/types/hris_status_item" -require_relative "VitableConnect/types/election_status_item" -require_relative "VitableConnect/types/access_method" -require_relative "VitableConnect/types/bound_entity_type" -require_relative "VitableConnect/types/bound_entity_response" -require_relative "VitableConnect/types/access_token_response" -require_relative "VitableConnect/types/additional_access_method" -require_relative "VitableConnect/types/address" -require_relative "VitableConnect/types/address_request" -require_relative "VitableConnect/types/benefit_family" -require_relative "VitableConnect/types/benefit_plan_network" -require_relative "VitableConnect/types/benefit_status" -require_relative "VitableConnect/types/contribution_class_compensation" -require_relative "VitableConnect/types/contribution_class_employment" -require_relative "VitableConnect/types/contribution_class_location" -require_relative "VitableConnect/types/coverage_tier" -require_relative "VitableConnect/types/eligibility_rule_compensation_type" -require_relative "VitableConnect/types/eligibility_rule_employee_class" -require_relative "VitableConnect/types/termination_rule" -require_relative "VitableConnect/types/waiting_period" -require_relative "VitableConnect/types/contribution_range" -require_relative "VitableConnect/types/contribution_tier" -require_relative "VitableConnect/types/ichra_contribution_class" -require_relative "VitableConnect/types/contribution_strategy" -require_relative "VitableConnect/types/eligible_geographical_location_type" -require_relative "VitableConnect/types/eligible_geographical_location" -require_relative "VitableConnect/types/eligibility_policy_rule" -require_relative "VitableConnect/types/eligibility_policy" -require_relative "VitableConnect/types/enrollment_rate" -require_relative "VitableConnect/types/benefit_plan_year_detail" -require_relative "VitableConnect/types/benefit_plan_year_list" -require_relative "VitableConnect/types/category" -require_relative "VitableConnect/types/product_code" -require_relative "VitableConnect/types/benefit_summary" -require_relative "VitableConnect/types/bound_entity" -require_relative "VitableConnect/types/card_type" -require_relative "VitableConnect/types/census_sync_response" -require_relative "VitableConnect/types/census_sync_detail_response" -require_relative "VitableConnect/types/state" -require_relative "VitableConnect/types/census_sync_employee_address_request" -require_relative "VitableConnect/types/compensation_type" -require_relative "VitableConnect/types/employee_class" -require_relative "VitableConnect/types/census_sync_employee_request" -require_relative "VitableConnect/types/classification_correction_source" -require_relative "VitableConnect/types/create_organization_request_type" -require_relative "VitableConnect/types/deduction_frequency" -require_relative "VitableConnect/types/tax_classification" -require_relative "VitableConnect/types/deduction_detail" -require_relative "VitableConnect/types/digital_benefit_card" -require_relative "VitableConnect/types/employee_address" -require_relative "VitableConnect/types/employee_status" -require_relative "VitableConnect/types/employee" -require_relative "VitableConnect/types/employee_address_input" -require_relative "VitableConnect/types/pagination" -require_relative "VitableConnect/types/employee_list_response" -require_relative "VitableConnect/types/employee_response" -require_relative "VitableConnect/types/employer_address" -require_relative "VitableConnect/types/employer_contact" -require_relative "VitableConnect/types/employer" -require_relative "VitableConnect/types/employer_address_input" -require_relative "VitableConnect/types/employer_benefit_plan_year_response" -require_relative "VitableConnect/types/employer_benefit_plan_years_list_response" -require_relative "VitableConnect/types/hris_connection" -require_relative "VitableConnect/types/employer_hris" -require_relative "VitableConnect/types/employer_hris_response" -require_relative "VitableConnect/types/employer_invoice_pdf" -require_relative "VitableConnect/types/employer_invoice_pdf_response" -require_relative "VitableConnect/types/invoice" -require_relative "VitableConnect/types/invoices_cursor_pagination" -require_relative "VitableConnect/types/employer_invoices_list_response" -require_relative "VitableConnect/types/payroll_deduction_statement" -require_relative "VitableConnect/types/employer_payroll_deduction_statement_list_response" -require_relative "VitableConnect/types/employer_response" -require_relative "VitableConnect/types/employer_settings" -require_relative "VitableConnect/types/employer_settings_response" -require_relative "VitableConnect/types/enrollment_status" -require_relative "VitableConnect/types/enrollment" -require_relative "VitableConnect/types/enrollment_detail" -require_relative "VitableConnect/types/enrollment_list_response" -require_relative "VitableConnect/types/enrollment_response" -require_relative "VitableConnect/types/error_response" -require_relative "VitableConnect/types/gender" -require_relative "VitableConnect/types/grant_type" -require_relative "VitableConnect/types/group" -require_relative "VitableConnect/types/group_list_response" -require_relative "VitableConnect/types/group_member_sync_response" -require_relative "VitableConnect/types/group_member_sync_detail_response" -require_relative "VitableConnect/types/operation" -require_relative "VitableConnect/types/group_member_sync_failure" -require_relative "VitableConnect/types/group_member_sync_member_request" -require_relative "VitableConnect/types/group_member_sync_results" -require_relative "VitableConnect/types/group_member_sync_request_detail" -require_relative "VitableConnect/types/group_member_sync_request_detail_response" -require_relative "VitableConnect/types/group_response" -require_relative "VitableConnect/types/household_member_relationship" -require_relative "VitableConnect/types/household_member_type" -require_relative "VitableConnect/types/household_member" -require_relative "VitableConnect/types/household_members_response" -require_relative "VitableConnect/types/idp_provider" -require_relative "VitableConnect/types/webhook_delivery" -require_relative "VitableConnect/types/list_webhook_event_deliveries_response" -require_relative "VitableConnect/types/marital_status" -require_relative "VitableConnect/types/member_address" -require_relative "VitableConnect/types/member_status" -require_relative "VitableConnect/types/name_suffix" -require_relative "VitableConnect/types/preferred_language" -require_relative "VitableConnect/types/sex_at_birth" -require_relative "VitableConnect/types/member" -require_relative "VitableConnect/types/relationship" -require_relative "VitableConnect/types/member_legal_dependent" -require_relative "VitableConnect/types/member_dependents_response" -require_relative "VitableConnect/types/member_digital_benefit_cards_response" -require_relative "VitableConnect/types/member_employments_response" -require_relative "VitableConnect/types/plan_year_enrollment_election_status" -require_relative "VitableConnect/types/plan_year_enrollment_policy_status" -require_relative "VitableConnect/types/member_enrollment" -require_relative "VitableConnect/types/member_enrollments_response" -require_relative "VitableConnect/types/member_list_item" -require_relative "VitableConnect/types/member_list_response" -require_relative "VitableConnect/types/qualifying_life_event_status" -require_relative "VitableConnect/types/qualifying_life_event_type" -require_relative "VitableConnect/types/member_qualifying_life_event" -require_relative "VitableConnect/types/member_qualifying_life_event_list_response" -require_relative "VitableConnect/types/member_response" -require_relative "VitableConnect/types/missing_employee_resolution" -require_relative "VitableConnect/types/organization_type" -require_relative "VitableConnect/types/organization" -require_relative "VitableConnect/types/employer_benefit_lifecycle_stage" -require_relative "VitableConnect/types/enrollment_rate_summary" -require_relative "VitableConnect/types/employer_hris_status" -require_relative "VitableConnect/types/organization_employer" -require_relative "VitableConnect/types/organization_employer_list_response" -require_relative "VitableConnect/types/organization_hris_provider" -require_relative "VitableConnect/types/organization_hris_providers_response" -require_relative "VitableConnect/types/organizations_list_response" -require_relative "VitableConnect/types/payroll_access_setup_status" -require_relative "VitableConnect/types/payroll_access_setup_status_response" -require_relative "VitableConnect/types/payroll_integration_email" -require_relative "VitableConnect/types/payroll_integration_email_response" -require_relative "VitableConnect/types/plan" -require_relative "VitableConnect/types/plan_list_response" -require_relative "VitableConnect/types/plan_year_enrollment" -require_relative "VitableConnect/types/plan_year_enrollment_list_response" -require_relative "VitableConnect/types/reissue_enrollment" -require_relative "VitableConnect/types/reissue_enrollment_response" -require_relative "VitableConnect/types/remaining_employee_action" -require_relative "VitableConnect/types/update_employer_address_input" -require_relative "VitableConnect/types/webhook_event" -require_relative "VitableConnect/types/webhook_event_list_response" -require_relative "VitableConnect/types/webhook_event_response" -require_relative "VitableConnect/types/employee_id" -require_relative "VitableConnect/types/limit" -require_relative "VitableConnect/types/page" -require_relative "VitableConnect/types/include_cancelled" -require_relative "VitableConnect/types/search" -require_relative "VitableConnect/types/employer_id" -require_relative "VitableConnect/types/benefit_plan_year_id" -require_relative "VitableConnect/types/employer_search" -require_relative "VitableConnect/types/employee_search" -require_relative "VitableConnect/types/offset" -require_relative "VitableConnect/types/invoice_id" -require_relative "VitableConnect/types/enrollment_id" -require_relative "VitableConnect/types/group_id" -require_relative "VitableConnect/types/request_id" -require_relative "VitableConnect/types/member_id" -require_relative "VitableConnect/types/status" -require_relative "VitableConnect/types/created_after" -require_relative "VitableConnect/types/created_before" -require_relative "VitableConnect/types/event_name" -require_relative "VitableConnect/types/resource_id" -require_relative "VitableConnect/types/resource_type" -require_relative "VitableConnect/types/event_id" -require_relative "VitableConnect/types/member_search" -require_relative "VitableConnect/client" -require_relative "VitableConnect/auth/client" -require_relative "VitableConnect/auth/types/issue_access_token_request" -require_relative "VitableConnect/employees/client" -require_relative "VitableConnect/employees/types/get_employees_request" -require_relative "VitableConnect/employees/types/patched_update_employee_request" -require_relative "VitableConnect/employees/types/list_enrollments_employees_request" -require_relative "VitableConnect/employers/client" -require_relative "VitableConnect/employers/types/list_employers_request" -require_relative "VitableConnect/employers/types/create_employer_request" -require_relative "VitableConnect/employers/types/get_employers_request" -require_relative "VitableConnect/employers/types/update_employer_request" -require_relative "VitableConnect/employers/types/list_benefit_plan_years_employers_request" -require_relative "VitableConnect/employers/types/get_benefit_plan_year_employers_request" -require_relative "VitableConnect/employers/types/list_benefit_plan_year_enrollments_employers_request" -require_relative "VitableConnect/employers/types/census_sync_request" -require_relative "VitableConnect/employers/types/list_employees_employers_request" -require_relative "VitableConnect/employers/types/get_hris_employers_request" -require_relative "VitableConnect/employers/types/list_invoices_employers_request" -require_relative "VitableConnect/employers/types/get_invoice_pdf_employers_request" -require_relative "VitableConnect/employers/types/get_payroll_access_setup_employers_request" -require_relative "VitableConnect/employers/types/submit_payroll_access_setup_request" -require_relative "VitableConnect/employers/types/list_payroll_deduction_statements_employers_request" -require_relative "VitableConnect/employers/types/ensure_payroll_integration_email_employers_request" -require_relative "VitableConnect/employers/types/update_employer_settings_request" -require_relative "VitableConnect/enrollments/client" -require_relative "VitableConnect/enrollments/types/get_enrollments_request" -require_relative "VitableConnect/enrollments/types/reissue_enrollment_request" -require_relative "VitableConnect/enrollments/types/terminate_enrollment_request" -require_relative "VitableConnect/groups/client" -require_relative "VitableConnect/groups/types/list_groups_request" -require_relative "VitableConnect/groups/types/create_group_request" -require_relative "VitableConnect/groups/types/get_groups_request" -require_relative "VitableConnect/groups/types/patched_update_group_request" -require_relative "VitableConnect/members/client" -require_relative "VitableConnect/members/types/get_members_request" -require_relative "VitableConnect/members/types/list_dependents_members_request" -require_relative "VitableConnect/members/types/list_employments_members_request" -require_relative "VitableConnect/members/types/list_enrollments_members_request" -require_relative "VitableConnect/members/types/get_household_members_request" -require_relative "VitableConnect/members/types/list_id_cards_members_request" -require_relative "VitableConnect/members/types/list_qualifying_life_events_members_request" -require_relative "VitableConnect/members/types/list_members_request" -require_relative "VitableConnect/organizations/client" -require_relative "VitableConnect/organizations/types/create_organization_request" -require_relative "VitableConnect/plans/client" -require_relative "VitableConnect/plans/types/list_plans_request" -require_relative "VitableConnect/webhook_events/client" -require_relative "VitableConnect/webhook_events/types/list_webhook_events_request" -require_relative "VitableConnect/webhook_events/types/get_webhook_events_request" -require_relative "VitableConnect/webhook_events/types/list_deliveries_webhook_events_request" -require_relative "VitableConnect/groups/members/client" -require_relative "VitableConnect/groups/members/sync/client" -require_relative "VitableConnect/groups/members/sync/types/group_member_sync_request" -require_relative "VitableConnect/groups/members/sync/types/get_sync_request" -require_relative "VitableConnect/environment" diff --git a/lib/VitableConnect/auth/client.rb b/lib/VitableConnect/auth/client.rb deleted file mode 100644 index a0af304..0000000 --- a/lib/VitableConnect/auth/client.rb +++ /dev/null @@ -1,52 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Auth - class Client - # @param client [VitableConnect::Internal::Http::RawClient] - # - # @return [void] - def initialize(client:) - @client = client - end - - # Issues a short-lived access token from the authenticated API key. Access tokens can optionally be bound to a - # specific employer or employee for scoped access. Tokens expire after 15 minutes. - # - # @param request_options [Hash] - # @param params [VitableConnect::Auth::Types::IssueAccessTokenRequest] - # @option request_options [String] :base_url - # @option request_options [Hash{String => Object}] :additional_headers - # @option request_options [Hash{String => Object}] :additional_query_parameters - # @option request_options [Hash{String => Object}] :additional_body_parameters - # @option request_options [Integer] :timeout_in_seconds - # - # @example - # client.auth.issue_access_token(grant_type: "client_credentials") - # - # @return [VitableConnect::Types::AccessTokenResponse] - def issue_access_token(request_options: {}, **params) - params = VitableConnect::Internal::Types::Utils.normalize_keys(params) - request = VitableConnect::Internal::JSON::Request.new( - base_url: request_options[:base_url], - method: "POST", - path: "v1/auth/access-tokens", - body: VitableConnect::Auth::Types::IssueAccessTokenRequest.new(params).to_h, - request_options: request_options - ) - begin - response = @client.send(request) - rescue Net::HTTPRequestTimeout - raise VitableConnect::Errors::TimeoutError - end - code = response.code.to_i - if code.between?(200, 299) - VitableConnect::Types::AccessTokenResponse.load(response.body) - else - error_class = VitableConnect::Errors::ResponseError.subclass_for_code(code) - raise error_class.new(response.body, code: code) - end - end - end - end -end diff --git a/lib/VitableConnect/auth/types/issue_access_token_request.rb b/lib/VitableConnect/auth/types/issue_access_token_request.rb deleted file mode 100644 index f06652a..0000000 --- a/lib/VitableConnect/auth/types/issue_access_token_request.rb +++ /dev/null @@ -1,13 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Auth - module Types - class IssueAccessTokenRequest < Internal::Types::Model - field :grant_type, -> { VitableConnect::Types::GrantType }, optional: false, nullable: false - - field :bound_entity, -> { VitableConnect::Types::BoundEntity }, optional: true, nullable: false - end - end - end -end diff --git a/lib/VitableConnect/client.rb b/lib/VitableConnect/client.rb deleted file mode 100644 index 854f4cc..0000000 --- a/lib/VitableConnect/client.rb +++ /dev/null @@ -1,67 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - class Client - # @param base_url [String, nil] - # @param api_key [String] - # @param max_retries [Integer] - # - # @return [void] - def initialize(base_url: nil, api_key: ENV.fetch("VITABLE_CONNECT_API_KEY", nil), max_retries: 2) - @raw_client = VitableConnect::Internal::Http::RawClient.new( - base_url: base_url || VitableConnect::Environment::PRODUCTION, - headers: { - "User-Agent" => "vitable-connect/1.0.0", - "X-Fern-Language" => "Ruby", - Authorization: "Bearer #{api_key}" - }, - max_retries: max_retries - ) - end - - # @return [VitableConnect::Auth::Client] - def auth - @auth ||= VitableConnect::Auth::Client.new(client: @raw_client) - end - - # @return [VitableConnect::Employees::Client] - def employees - @employees ||= VitableConnect::Employees::Client.new(client: @raw_client) - end - - # @return [VitableConnect::Employers::Client] - def employers - @employers ||= VitableConnect::Employers::Client.new(client: @raw_client) - end - - # @return [VitableConnect::Enrollments::Client] - def enrollments - @enrollments ||= VitableConnect::Enrollments::Client.new(client: @raw_client) - end - - # @return [VitableConnect::Groups::Client] - def groups - @groups ||= VitableConnect::Groups::Client.new(client: @raw_client) - end - - # @return [VitableConnect::Members::Client] - def members - @members ||= VitableConnect::Members::Client.new(client: @raw_client) - end - - # @return [VitableConnect::Organizations::Client] - def organizations - @organizations ||= VitableConnect::Organizations::Client.new(client: @raw_client) - end - - # @return [VitableConnect::Plans::Client] - def plans - @plans ||= VitableConnect::Plans::Client.new(client: @raw_client) - end - - # @return [VitableConnect::WebhookEvents::Client] - def webhook_events - @webhook_events ||= VitableConnect::WebhookEvents::Client.new(client: @raw_client) - end - end -end diff --git a/lib/VitableConnect/employees/client.rb b/lib/VitableConnect/employees/client.rb deleted file mode 100644 index 7fdda8c..0000000 --- a/lib/VitableConnect/employees/client.rb +++ /dev/null @@ -1,161 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Employees - class Client - # @param client [VitableConnect::Internal::Http::RawClient] - # - # @return [void] - def initialize(client:) - @client = client - end - - # Retrieves detailed information for a specific employee by ID. Returns employee details including personal - # information, employment status, classification and compensation-type effective dates, compensation type, and - # payroll deductions from the most recent statement period. Deductions reflect a snapshot of the current period - # and are replaced when a new statement is generated. - # - # @param request_options [Hash] - # @param params [Hash] - # @option request_options [String] :base_url - # @option request_options [Hash{String => Object}] :additional_headers - # @option request_options [Hash{String => Object}] :additional_query_parameters - # @option request_options [Hash{String => Object}] :additional_body_parameters - # @option request_options [Integer] :timeout_in_seconds - # @option params [VitableConnect::Types::EmployeeID] :employee_id - # - # @example - # client.employees.get(employee_id: "empl_abc123def456") - # - # @return [VitableConnect::Types::EmployeeResponse] - def get(request_options: {}, **params) - params = VitableConnect::Internal::Types::Utils.normalize_keys(params) - request = VitableConnect::Internal::JSON::Request.new( - base_url: request_options[:base_url], - method: "GET", - path: "v1/employees/#{URI.encode_uri_component(params[:employee_id].to_s)}", - request_options: request_options - ) - begin - response = @client.send(request) - rescue Net::HTTPRequestTimeout - raise VitableConnect::Errors::TimeoutError - end - code = response.code.to_i - if code.between?(200, 299) - VitableConnect::Types::EmployeeResponse.load(response.body) - else - error_class = VitableConnect::Errors::ResponseError.subclass_for_code(code) - raise error_class.new(response.body, code: code) - end - end - - # Updates employee personal, contact, address, and employment fields. This endpoint currently supports email, - # phone, gender, address, employee_class, start_date, and compensation_type. effective_date is required and - # applies to employee_class and compensation_type when those fields are included in the request. - # - # @param request_options [Hash] - # @param params [VitableConnect::Employees::Types::PatchedUpdateEmployeeRequest] - # @option request_options [String] :base_url - # @option request_options [Hash{String => Object}] :additional_headers - # @option request_options [Hash{String => Object}] :additional_query_parameters - # @option request_options [Hash{String => Object}] :additional_body_parameters - # @option request_options [Integer] :timeout_in_seconds - # @option params [VitableConnect::Types::EmployeeID] :employee_id - # - # @example - # client.employees.update( - # employee_id: "empl_abc123def456", - # employee_class: "Full Time", - # start_date: "2023-01-15", - # compensation_type: "Salary", - # effective_date: "2023-03-01" - # ) - # - # @return [VitableConnect::Types::EmployeeResponse] - def update(request_options: {}, **params) - params = VitableConnect::Internal::Types::Utils.normalize_keys(params) - request_data = VitableConnect::Employees::Types::PatchedUpdateEmployeeRequest.new(params).to_h - non_body_param_names = %w[employee_id] - body = request_data.except(*non_body_param_names) - - request = VitableConnect::Internal::JSON::Request.new( - base_url: request_options[:base_url], - method: "PATCH", - path: "v1/employees/#{URI.encode_uri_component(params[:employee_id].to_s)}", - body: body, - request_options: request_options - ) - begin - response = @client.send(request) - rescue Net::HTTPRequestTimeout - raise VitableConnect::Errors::TimeoutError - end - code = response.code.to_i - if code.between?(200, 299) - VitableConnect::Types::EmployeeResponse.load(response.body) - else - error_class = VitableConnect::Errors::ResponseError.subclass_for_code(code) - raise error_class.new(response.body, code: code) - end - end - - # Retrieves a paginated list of benefit enrollments for an employee. - # - # @param request_options [Hash] - # @param params [Hash] - # @option request_options [String] :base_url - # @option request_options [Hash{String => Object}] :additional_headers - # @option request_options [Hash{String => Object}] :additional_query_parameters - # @option request_options [Hash{String => Object}] :additional_body_parameters - # @option request_options [Integer] :timeout_in_seconds - # @option params [VitableConnect::Types::EmployeeID] :employee_id - # @option params [Integer, nil] :limit - # @option params [Integer, nil] :page - # - # @example - # client.employees.list_enrollments( - # employee_id: "empl_abc123def456", - # limit: 20, - # page: 1 - # ) - # - # @return [VitableConnect::Types::EnrollmentListResponse] - def list_enrollments(request_options: {}, **params) - params = VitableConnect::Internal::Types::Utils.normalize_keys(params) - query_params = {} - query_params["limit"] = params[:limit] if params.key?(:limit) - query_params["page"] = params[:page] if params.key?(:page) - - VitableConnect::Internal::OffsetItemIterator.new( - initial_page: query_params["page"], - item_field: :data, - has_next_field: nil, - step: false - ) do |next_page| - query_params["page"] = next_page - request = VitableConnect::Internal::JSON::Request.new( - base_url: request_options[:base_url], - method: "GET", - path: "v1/employees/#{URI.encode_uri_component(params[:employee_id].to_s)}/enrollments", - query: query_params, - request_options: request_options - ) - begin - response = @client.send(request) - rescue Net::HTTPRequestTimeout - raise VitableConnect::Errors::TimeoutError - end - code = response.code.to_i - if code.between?(200, 299) - parsed_response = VitableConnect::Types::EnrollmentListResponse.load(response.body) - [parsed_response, response] - else - error_class = VitableConnect::Errors::ResponseError.subclass_for_code(code) - raise error_class.new(response.body, code: code) - end - end - end - end - end -end diff --git a/lib/VitableConnect/employees/types/get_employees_request.rb b/lib/VitableConnect/employees/types/get_employees_request.rb deleted file mode 100644 index f9ea5b1..0000000 --- a/lib/VitableConnect/employees/types/get_employees_request.rb +++ /dev/null @@ -1,11 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Employees - module Types - class GetEmployeesRequest < Internal::Types::Model - field :employee_id, -> { String }, optional: false, nullable: false - end - end - end -end diff --git a/lib/VitableConnect/employees/types/list_enrollments_employees_request.rb b/lib/VitableConnect/employees/types/list_enrollments_employees_request.rb deleted file mode 100644 index f16ecca..0000000 --- a/lib/VitableConnect/employees/types/list_enrollments_employees_request.rb +++ /dev/null @@ -1,15 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Employees - module Types - class ListEnrollmentsEmployeesRequest < Internal::Types::Model - field :employee_id, -> { String }, optional: false, nullable: false - - field :limit, -> { Integer }, optional: true, nullable: false - - field :page, -> { Integer }, optional: true, nullable: false - end - end - end -end diff --git a/lib/VitableConnect/employees/types/patched_update_employee_request.rb b/lib/VitableConnect/employees/types/patched_update_employee_request.rb deleted file mode 100644 index 7433876..0000000 --- a/lib/VitableConnect/employees/types/patched_update_employee_request.rb +++ /dev/null @@ -1,27 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Employees - module Types - class PatchedUpdateEmployeeRequest < Internal::Types::Model - field :employee_id, -> { String }, optional: false, nullable: false - - field :email, -> { String }, optional: true, nullable: false - - field :phone, -> { String }, optional: true, nullable: false - - field :gender, -> { VitableConnect::Types::Gender }, optional: true, nullable: false - - field :address, -> { VitableConnect::Types::EmployeeAddressInput }, optional: true, nullable: false - - field :employee_class, -> { VitableConnect::Types::EmployeeClass }, optional: true, nullable: false - - field :start_date, -> { String }, optional: true, nullable: false - - field :compensation_type, -> { VitableConnect::Types::CompensationType }, optional: true, nullable: false - - field :effective_date, -> { String }, optional: false, nullable: false - end - end - end -end diff --git a/lib/VitableConnect/employers/client.rb b/lib/VitableConnect/employers/client.rb deleted file mode 100644 index 18a7ffa..0000000 --- a/lib/VitableConnect/employers/client.rb +++ /dev/null @@ -1,904 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Employers - class Client - # @param client [VitableConnect::Internal::Http::RawClient] - # - # @return [void] - def initialize(client:) - @client = client - end - - # Returns the caller's employer book — every employer with its computed columns (enrollment-rate summary, - # benefit-family tags, HRIS connection, benefit-lifecycle stage) merged with the employer's flat CRM fields (legal - # name, EIN, contact, address, timestamps). The book is derived from the authenticated principal: one - # organization's employers, or every organization's for a caller whose reach is not a single organization. - # Supports search by display name, legal name, or exact EIN, employer id or contact email, - # benefit-family/lifecycle/HRIS filters, and page/limit pagination. - # - # @param request_options [Hash] - # @param params [Hash] - # @option request_options [String] :base_url - # @option request_options [Hash{String => Object}] :additional_headers - # @option request_options [Hash{String => Object}] :additional_query_parameters - # @option request_options [Hash{String => Object}] :additional_body_parameters - # @option request_options [Integer] :timeout_in_seconds - # @option params [VitableConnect::Types::BenefitFamilyParamItem, nil] :benefit_family - # @option params [VitableConnect::Types::BenefitLifecycleStageItem, nil] :benefit_lifecycle_stage - # @option params [String, nil] :hris_provider - # @option params [VitableConnect::Types::HrisStatusItem, nil] :hris_status - # @option params [Boolean, nil] :include_cancelled - # @option params [Integer, nil] :limit - # @option params [Integer, nil] :page - # @option params [String, nil] :search - # - # @example - # client.employers.list( - # limit: 20, - # page: 1 - # ) - # - # @return [VitableConnect::Types::OrganizationEmployerListResponse] - def list(request_options: {}, **params) - params = VitableConnect::Internal::Types::Utils.normalize_keys(params) - query_params = {} - query_params["benefit_family"] = params[:benefit_family] if params.key?(:benefit_family) - query_params["benefit_lifecycle_stage"] = params[:benefit_lifecycle_stage] if params.key?(:benefit_lifecycle_stage) - query_params["hris_provider"] = params[:hris_provider] if params.key?(:hris_provider) - query_params["hris_status"] = params[:hris_status] if params.key?(:hris_status) - query_params["include_cancelled"] = params[:include_cancelled] if params.key?(:include_cancelled) - query_params["limit"] = params[:limit] if params.key?(:limit) - query_params["page"] = params[:page] if params.key?(:page) - query_params["search"] = params[:search] if params.key?(:search) - - VitableConnect::Internal::OffsetItemIterator.new( - initial_page: query_params["page"], - item_field: :data, - has_next_field: nil, - step: false - ) do |next_page| - query_params["page"] = next_page - request = VitableConnect::Internal::JSON::Request.new( - base_url: request_options[:base_url], - method: "GET", - path: "v1/employers", - query: query_params, - request_options: request_options - ) - begin - response = @client.send(request) - rescue Net::HTTPRequestTimeout - raise VitableConnect::Errors::TimeoutError - end - code = response.code.to_i - if code.between?(200, 299) - parsed_response = VitableConnect::Types::OrganizationEmployerListResponse.load(response.body) - [parsed_response, response] - else - error_class = VitableConnect::Errors::ResponseError.subclass_for_code(code) - raise error_class.new(response.body, code: code) - end - end - end - - # Creates a new employer for the authenticated organization. Requires employer name, legal name, EIN, email, and - # address information. Returns the created employer with its assigned ID. - # - # @param request_options [Hash] - # @param params [VitableConnect::Employers::Types::CreateEmployerRequest] - # @option request_options [String] :base_url - # @option request_options [Hash{String => Object}] :additional_headers - # @option request_options [Hash{String => Object}] :additional_query_parameters - # @option request_options [Hash{String => Object}] :additional_body_parameters - # @option request_options [Integer] :timeout_in_seconds - # - # @example - # client.employers.create( - # name: "NewCo Industries", - # legal_name: "NewCo Industries LLC", - # ein: "12-3456789", - # email: "hr@newco.com", - # address: { - # address_line1: "789 Business Blvd", - # address_line2: "Floor 5", - # city: "Seattle", - # state: "WA", - # zipcode: "98101" - # }, - # phone_number: "2065550100", - # reference_id: "partner-emp-001" - # ) - # - # @return [VitableConnect::Types::EmployerResponse] - def create(request_options: {}, **params) - params = VitableConnect::Internal::Types::Utils.normalize_keys(params) - request = VitableConnect::Internal::JSON::Request.new( - base_url: request_options[:base_url], - method: "POST", - path: "v1/employers", - body: VitableConnect::Employers::Types::CreateEmployerRequest.new(params).to_h, - request_options: request_options - ) - begin - response = @client.send(request) - rescue Net::HTTPRequestTimeout - raise VitableConnect::Errors::TimeoutError - end - code = response.code.to_i - if code.between?(200, 299) - VitableConnect::Types::EmployerResponse.load(response.body) - else - error_class = VitableConnect::Errors::ResponseError.subclass_for_code(code) - raise error_class.new(response.body, code: code) - end - end - - # Retrieves detailed information for a specific employer by ID. The employer must belong to the authenticated - # organization. - # - # @param request_options [Hash] - # @param params [Hash] - # @option request_options [String] :base_url - # @option request_options [Hash{String => Object}] :additional_headers - # @option request_options [Hash{String => Object}] :additional_query_parameters - # @option request_options [Hash{String => Object}] :additional_body_parameters - # @option request_options [Integer] :timeout_in_seconds - # @option params [VitableConnect::Types::EmployerID] :employer_id - # - # @example - # client.employers.get(employer_id: "empr_abc123def456") - # - # @return [VitableConnect::Types::EmployerResponse] - def get(request_options: {}, **params) - params = VitableConnect::Internal::Types::Utils.normalize_keys(params) - request = VitableConnect::Internal::JSON::Request.new( - base_url: request_options[:base_url], - method: "GET", - path: "v1/employers/#{URI.encode_uri_component(params[:employer_id].to_s)}", - request_options: request_options - ) - begin - response = @client.send(request) - rescue Net::HTTPRequestTimeout - raise VitableConnect::Errors::TimeoutError - end - code = response.code.to_i - if code.between?(200, 299) - VitableConnect::Types::EmployerResponse.load(response.body) - else - error_class = VitableConnect::Errors::ResponseError.subclass_for_code(code) - raise error_class.new(response.body, code: code) - end - end - - # Updates an existing employer. All fields are optional — only provided fields are updated. PO Box addresses are - # rejected. - # - # @param request_options [Hash] - # @param params [VitableConnect::Employers::Types::UpdateEmployerRequest] - # @option request_options [String] :base_url - # @option request_options [Hash{String => Object}] :additional_headers - # @option request_options [Hash{String => Object}] :additional_query_parameters - # @option request_options [Hash{String => Object}] :additional_body_parameters - # @option request_options [Integer] :timeout_in_seconds - # @option params [VitableConnect::Types::EmployerID] :employer_id - # - # @example - # client.employers.update(employer_id: "empr_abc123def456") - # - # @return [VitableConnect::Types::EmployerResponse] - def update(request_options: {}, **params) - params = VitableConnect::Internal::Types::Utils.normalize_keys(params) - request_data = VitableConnect::Employers::Types::UpdateEmployerRequest.new(params).to_h - non_body_param_names = %w[employer_id] - body = request_data.except(*non_body_param_names) - - request = VitableConnect::Internal::JSON::Request.new( - base_url: request_options[:base_url], - method: "PUT", - path: "v1/employers/#{URI.encode_uri_component(params[:employer_id].to_s)}", - body: body, - request_options: request_options - ) - begin - response = @client.send(request) - rescue Net::HTTPRequestTimeout - raise VitableConnect::Errors::TimeoutError - end - code = response.code.to_i - if code.between?(200, 299) - VitableConnect::Types::EmployerResponse.load(response.body) - else - error_class = VitableConnect::Errors::ResponseError.subclass_for_code(code) - raise error_class.new(response.body, code: code) - end - end - - # Returns the employer's benefit plan years (all years, or one when `year` is given), each with its benefits, - # offered states, benefit families, and the year-level enrollment roll-up. The caller must be authorized for the - # employer; an unknown or unauthorized employer returns 404. - # - # @param request_options [Hash] - # @param params [Hash] - # @option request_options [String] :base_url - # @option request_options [Hash{String => Object}] :additional_headers - # @option request_options [Hash{String => Object}] :additional_query_parameters - # @option request_options [Hash{String => Object}] :additional_body_parameters - # @option request_options [Integer] :timeout_in_seconds - # @option params [VitableConnect::Types::EmployerID] :employer_id - # - # @example - # client.employers.list_benefit_plan_years(employer_id: "empr_abc123def456") - # - # @return [VitableConnect::Types::EmployerBenefitPlanYearsListResponse] - def list_benefit_plan_years(request_options: {}, **params) - params = VitableConnect::Internal::Types::Utils.normalize_keys(params) - request = VitableConnect::Internal::JSON::Request.new( - base_url: request_options[:base_url], - method: "GET", - path: "v1/employers/#{URI.encode_uri_component(params[:employer_id].to_s)}/benefit-plan-years", - request_options: request_options - ) - begin - response = @client.send(request) - rescue Net::HTTPRequestTimeout - raise VitableConnect::Errors::TimeoutError - end - code = response.code.to_i - if code.between?(200, 299) - VitableConnect::Types::EmployerBenefitPlanYearsListResponse.load(response.body) - else - error_class = VitableConnect::Errors::ResponseError.subclass_for_code(code) - raise error_class.new(response.body, code: code) - end - end - - # Returns one benefit plan year in full — its benefit details plus the per-benefit enrollment rate and SPD link — - # addressed by its `benefit_plan_year_id`. The caller must be authorized for the employer; an unknown or - # unauthorized plan year returns 404. - # - # @param request_options [Hash] - # @param params [Hash] - # @option request_options [String] :base_url - # @option request_options [Hash{String => Object}] :additional_headers - # @option request_options [Hash{String => Object}] :additional_query_parameters - # @option request_options [Hash{String => Object}] :additional_body_parameters - # @option request_options [Integer] :timeout_in_seconds - # @option params [VitableConnect::Types::EmployerID] :employer_id - # @option params [VitableConnect::Types::BenefitPlanYearID] :benefit_plan_year_id - # - # @example - # client.employers.get_benefit_plan_year( - # employer_id: "empr_abc123def456", - # benefit_plan_year_id: "plyr_abc123def456" - # ) - # - # @return [VitableConnect::Types::EmployerBenefitPlanYearResponse] - def get_benefit_plan_year(request_options: {}, **params) - params = VitableConnect::Internal::Types::Utils.normalize_keys(params) - request = VitableConnect::Internal::JSON::Request.new( - base_url: request_options[:base_url], - method: "GET", - path: "v1/employers/#{URI.encode_uri_component(params[:employer_id].to_s)}/benefit-plan-years/#{URI.encode_uri_component(params[:benefit_plan_year_id].to_s)}", - request_options: request_options - ) - begin - response = @client.send(request) - rescue Net::HTTPRequestTimeout - raise VitableConnect::Errors::TimeoutError - end - code = response.code.to_i - if code.between?(200, 299) - VitableConnect::Types::EmployerBenefitPlanYearResponse.load(response.body) - else - error_class = VitableConnect::Errors::ResponseError.subclass_for_code(code) - raise error_class.new(response.body, code: code) - end - end - - # Returns a paginated list of every member with an enrollment in one of an employer's plan years, any election - # status: what they elected, where their coverage stands, dependent count, carrier, plan, tier, and the plan's - # total monthly cost. The caller must be authorized for the employer `empr_<...>`; an unknown or unauthorized - # employer, or an unknown plan year `plyr_<...>`, returns 404. - # - # @param request_options [Hash] - # @param params [Hash] - # @option request_options [String] :base_url - # @option request_options [Hash{String => Object}] :additional_headers - # @option request_options [Hash{String => Object}] :additional_query_parameters - # @option request_options [Hash{String => Object}] :additional_body_parameters - # @option request_options [Integer] :timeout_in_seconds - # @option params [VitableConnect::Types::EmployerID] :employer_id - # @option params [VitableConnect::Types::BenefitPlanYearID] :benefit_plan_year_id - # @option params [VitableConnect::Types::ElectionStatusItem, nil] :election_status - # @option params [Integer, nil] :limit - # @option params [Integer, nil] :page - # @option params [String, nil] :search - # - # @example - # client.employers.list_benefit_plan_year_enrollments( - # employer_id: "empr_abc123def456", - # benefit_plan_year_id: "plyr_abc123def456", - # limit: 20, - # page: 1 - # ) - # - # @return [VitableConnect::Types::PlanYearEnrollmentListResponse] - def list_benefit_plan_year_enrollments(request_options: {}, **params) - params = VitableConnect::Internal::Types::Utils.normalize_keys(params) - query_params = {} - query_params["election_status"] = params[:election_status] if params.key?(:election_status) - query_params["limit"] = params[:limit] if params.key?(:limit) - query_params["page"] = params[:page] if params.key?(:page) - query_params["search"] = params[:search] if params.key?(:search) - - VitableConnect::Internal::OffsetItemIterator.new( - initial_page: query_params["page"], - item_field: :data, - has_next_field: nil, - step: false - ) do |next_page| - query_params["page"] = next_page - request = VitableConnect::Internal::JSON::Request.new( - base_url: request_options[:base_url], - method: "GET", - path: "v1/employers/#{URI.encode_uri_component(params[:employer_id].to_s)}/benefit-plan-years/#{URI.encode_uri_component(params[:benefit_plan_year_id].to_s)}/enrollments", - query: query_params, - request_options: request_options - ) - begin - response = @client.send(request) - rescue Net::HTTPRequestTimeout - raise VitableConnect::Errors::TimeoutError - end - code = response.code.to_i - if code.between?(200, 299) - parsed_response = VitableConnect::Types::PlanYearEnrollmentListResponse.load(response.body) - [parsed_response, response] - else - error_class = VitableConnect::Errors::ResponseError.subclass_for_code(code) - raise error_class.new(response.body, code: code) - end - end - end - - # Submits a census sync payload for the specified employer. The employees in the payload will be queued for - # processing. Returns an accepted response with the timestamp of acceptance. - # - # @param request_options [Hash] - # @param params [VitableConnect::Employers::Types::CensusSyncRequest] - # @option request_options [String] :base_url - # @option request_options [Hash{String => Object}] :additional_headers - # @option request_options [Hash{String => Object}] :additional_query_parameters - # @option request_options [Hash{String => Object}] :additional_body_parameters - # @option request_options [Integer] :timeout_in_seconds - # @option params [VitableConnect::Types::EmployerID] :employer_id - # - # @example - # client.employers.submit_census_sync( - # employer_id: "empr_abc123def456", - # employees: [{ - # reference_id: "EMP-001", - # first_name: "Jane", - # last_name: "Doe", - # date_of_birth: "1990-05-15", - # email: "jane.doe@acme.com", - # phone: "4155550100", - # address: { - # address_line1: "123 Main Street", - # address_line2: "Apt 4B", - # city: "San Francisco", - # state: "CA", - # zipcode: "94102" - # }, - # start_date: "2024-01-15", - # employee_class: "Full Time", - # compensation_type: "Salary" - # }, { - # first_name: "John", - # last_name: "Smith", - # date_of_birth: "1985-11-20", - # email: "john.smith@acme.com", - # phone: "4155550101", - # start_date: "2024-03-01", - # employee_class: "Part Time", - # compensation_type: "Hourly" - # }] - # ) - # - # @return [VitableConnect::Types::CensusSyncDetailResponse] - def submit_census_sync(request_options: {}, **params) - params = VitableConnect::Internal::Types::Utils.normalize_keys(params) - request_data = VitableConnect::Employers::Types::CensusSyncRequest.new(params).to_h - non_body_param_names = %w[employer_id] - body = request_data.except(*non_body_param_names) - - request = VitableConnect::Internal::JSON::Request.new( - base_url: request_options[:base_url], - method: "POST", - path: "v1/employers/#{URI.encode_uri_component(params[:employer_id].to_s)}/census-sync", - body: body, - request_options: request_options - ) - begin - response = @client.send(request) - rescue Net::HTTPRequestTimeout - raise VitableConnect::Errors::TimeoutError - end - code = response.code.to_i - if code.between?(200, 299) - VitableConnect::Types::CensusSyncDetailResponse.load(response.body) - else - error_class = VitableConnect::Errors::ResponseError.subclass_for_code(code) - raise error_class.new(response.body, code: code) - end - end - - # Retrieves a paginated list of employees for a specific employer. The caller must be authorized for the employer; - # an unknown or unauthorized employer returns 404. Results are paginated using page and limit parameters and can - # be narrowed with a case-insensitive `search` (first name, last name, or email) and an `employment_status` filter - # (active or terminated). Each employee includes payroll deductions from the most recent statement period. When a - # new deduction statement is generated, previous period deductions are replaced. - # - # @param request_options [Hash] - # @param params [Hash] - # @option request_options [String] :base_url - # @option request_options [Hash{String => Object}] :additional_headers - # @option request_options [Hash{String => Object}] :additional_query_parameters - # @option request_options [Hash{String => Object}] :additional_body_parameters - # @option request_options [Integer] :timeout_in_seconds - # @option params [VitableConnect::Types::EmployerID] :employer_id - # @option params [VitableConnect::Types::EmployeeStatus, nil] :employment_status - # @option params [Integer, nil] :limit - # @option params [Integer, nil] :page - # @option params [String, nil] :search - # - # @example - # client.employers.list_employees( - # employer_id: "empr_abc123def456", - # limit: 20, - # page: 1, - # search: "jane" - # ) - # - # @return [VitableConnect::Types::EmployeeListResponse] - def list_employees(request_options: {}, **params) - params = VitableConnect::Internal::Types::Utils.normalize_keys(params) - query_params = {} - query_params["employment_status"] = params[:employment_status] if params.key?(:employment_status) - query_params["limit"] = params[:limit] if params.key?(:limit) - query_params["page"] = params[:page] if params.key?(:page) - query_params["search"] = params[:search] if params.key?(:search) - - VitableConnect::Internal::OffsetItemIterator.new( - initial_page: query_params["page"], - item_field: :data, - has_next_field: nil, - step: false - ) do |next_page| - query_params["page"] = next_page - request = VitableConnect::Internal::JSON::Request.new( - base_url: request_options[:base_url], - method: "GET", - path: "v1/employers/#{URI.encode_uri_component(params[:employer_id].to_s)}/employees", - query: query_params, - request_options: request_options - ) - begin - response = @client.send(request) - rescue Net::HTTPRequestTimeout - raise VitableConnect::Errors::TimeoutError - end - code = response.code.to_i - if code.between?(200, 299) - parsed_response = VitableConnect::Types::EmployeeListResponse.load(response.body) - [parsed_response, response] - else - error_class = VitableConnect::Errors::ResponseError.subclass_for_code(code) - raise error_class.new(response.body, code: code) - end - end - end - - # Returns the employer's HRIS connection — provider, status, last sync, and synced row count — or null when the - # employer has no integration. The caller must be authorized for the employer; an unknown or unauthorized employer - # returns 404. - # - # @param request_options [Hash] - # @param params [Hash] - # @option request_options [String] :base_url - # @option request_options [Hash{String => Object}] :additional_headers - # @option request_options [Hash{String => Object}] :additional_query_parameters - # @option request_options [Hash{String => Object}] :additional_body_parameters - # @option request_options [Integer] :timeout_in_seconds - # @option params [VitableConnect::Types::EmployerID] :employer_id - # - # @example - # client.employers.get_hris(employer_id: "empr_abc123def456") - # - # @return [VitableConnect::Types::EmployerHrisResponse] - def get_hris(request_options: {}, **params) - params = VitableConnect::Internal::Types::Utils.normalize_keys(params) - request = VitableConnect::Internal::JSON::Request.new( - base_url: request_options[:base_url], - method: "GET", - path: "v1/employers/#{URI.encode_uri_component(params[:employer_id].to_s)}/hris", - request_options: request_options - ) - begin - response = @client.send(request) - rescue Net::HTTPRequestTimeout - raise VitableConnect::Errors::TimeoutError - end - code = response.code.to_i - if code.between?(200, 299) - VitableConnect::Types::EmployerHrisResponse.load(response.body) - else - error_class = VitableConnect::Errors::ResponseError.subclass_for_code(code) - raise error_class.new(response.body, code: code) - end - end - - # Returns a cursor-paginated page of the employer's billing invoices, newest first. Pass the `next_offset` from a - # previous page as `offset` to fetch the next page. The caller must be authorized for the employer; an unknown or - # unauthorized employer returns 404. - # - # @param request_options [Hash] - # @param params [Hash] - # @option request_options [String] :base_url - # @option request_options [Hash{String => Object}] :additional_headers - # @option request_options [Hash{String => Object}] :additional_query_parameters - # @option request_options [Hash{String => Object}] :additional_body_parameters - # @option request_options [Integer] :timeout_in_seconds - # @option params [VitableConnect::Types::EmployerID] :employer_id - # @option params [Integer, nil] :limit - # @option params [String, nil] :offset - # - # @example - # client.employers.list_invoices( - # employer_id: "empr_abc123def456", - # limit: 20 - # ) - # - # @return [VitableConnect::Types::EmployerInvoicesListResponse] - def list_invoices(request_options: {}, **params) - params = VitableConnect::Internal::Types::Utils.normalize_keys(params) - query_params = {} - query_params["limit"] = params[:limit] if params.key?(:limit) - query_params["offset"] = params[:offset] if params.key?(:offset) - - request = VitableConnect::Internal::JSON::Request.new( - base_url: request_options[:base_url], - method: "GET", - path: "v1/employers/#{URI.encode_uri_component(params[:employer_id].to_s)}/invoices", - query: query_params, - request_options: request_options - ) - begin - response = @client.send(request) - rescue Net::HTTPRequestTimeout - raise VitableConnect::Errors::TimeoutError - end - code = response.code.to_i - if code.between?(200, 299) - VitableConnect::Types::EmployerInvoicesListResponse.load(response.body) - else - error_class = VitableConnect::Errors::ResponseError.subclass_for_code(code) - raise error_class.new(response.body, code: code) - end - end - - # Returns the time-limited PDF download link for a single invoice belonging to the employer's billing customer. - # `invoice_id` is the external Chargebee id (not a prefixed UUID). The caller must be authorized for the employer; - # an unknown or unauthorized employer or invoice returns 404. - # - # @param request_options [Hash] - # @param params [Hash] - # @option request_options [String] :base_url - # @option request_options [Hash{String => Object}] :additional_headers - # @option request_options [Hash{String => Object}] :additional_query_parameters - # @option request_options [Hash{String => Object}] :additional_body_parameters - # @option request_options [Integer] :timeout_in_seconds - # @option params [VitableConnect::Types::EmployerID] :employer_id - # @option params [VitableConnect::Types::InvoiceID] :invoice_id - # - # @example - # client.employers.get_invoice_pdf( - # employer_id: "empr_abc123def456", - # invoice_id: "INV-00042" - # ) - # - # @return [VitableConnect::Types::EmployerInvoicePdfResponse] - def get_invoice_pdf(request_options: {}, **params) - params = VitableConnect::Internal::Types::Utils.normalize_keys(params) - request = VitableConnect::Internal::JSON::Request.new( - base_url: request_options[:base_url], - method: "GET", - path: "v1/employers/#{URI.encode_uri_component(params[:employer_id].to_s)}/invoices/#{URI.encode_uri_component(params[:invoice_id].to_s)}/pdf", - request_options: request_options - ) - begin - response = @client.send(request) - rescue Net::HTTPRequestTimeout - raise VitableConnect::Errors::TimeoutError - end - code = response.code.to_i - if code.between?(200, 299) - VitableConnect::Types::EmployerInvoicePdfResponse.load(response.body) - else - error_class = VitableConnect::Errors::ResponseError.subclass_for_code(code) - raise error_class.new(response.body, code: code) - end - end - - # Return whether the employer has submitted payroll access setup. - # - # @param request_options [Hash] - # @param params [Hash] - # @option request_options [String] :base_url - # @option request_options [Hash{String => Object}] :additional_headers - # @option request_options [Hash{String => Object}] :additional_query_parameters - # @option request_options [Hash{String => Object}] :additional_body_parameters - # @option request_options [Integer] :timeout_in_seconds - # @option params [VitableConnect::Types::EmployerID] :employer_id - # - # @example - # client.employers.get_payroll_access_setup(employer_id: "empr_abc123def456") - # - # @return [VitableConnect::Types::PayrollAccessSetupStatusResponse] - def get_payroll_access_setup(request_options: {}, **params) - params = VitableConnect::Internal::Types::Utils.normalize_keys(params) - request = VitableConnect::Internal::JSON::Request.new( - base_url: request_options[:base_url], - method: "GET", - path: "v1/employers/#{URI.encode_uri_component(params[:employer_id].to_s)}/payroll-access-setup", - request_options: request_options - ) - begin - response = @client.send(request) - rescue Net::HTTPRequestTimeout - raise VitableConnect::Errors::TimeoutError - end - code = response.code.to_i - if code.between?(200, 299) - VitableConnect::Types::PayrollAccessSetupStatusResponse.load(response.body) - else - error_class = VitableConnect::Errors::ResponseError.subclass_for_code(code) - raise error_class.new(response.body, code: code) - end - end - - # Submit the employer's payroll access setup answers. - # - # @param request_options [Hash] - # @param params [VitableConnect::Employers::Types::SubmitPayrollAccessSetupRequest] - # @option request_options [String] :base_url - # @option request_options [Hash{String => Object}] :additional_headers - # @option request_options [Hash{String => Object}] :additional_query_parameters - # @option request_options [Hash{String => Object}] :additional_body_parameters - # @option request_options [Integer] :timeout_in_seconds - # @option params [VitableConnect::Types::EmployerID] :employer_id - # - # @example - # client.employers.submit_payroll_access_setup( - # employer_id: "empr_abc123def456", - # employees_in_payroll_acknowledged: true, - # payroll_data_impacts_eligibility_acknowledged: true, - # classifications_accurate: true, - # all_benefit_eligible_employees_present: true, - # is_controlled_group: true, - # access_method: "SELF_SETUP", - # has_additional_payroll_system: true - # ) - # - # @return [VitableConnect::Types::PayrollAccessSetupStatusResponse] - def submit_payroll_access_setup(request_options: {}, **params) - params = VitableConnect::Internal::Types::Utils.normalize_keys(params) - request_data = VitableConnect::Employers::Types::SubmitPayrollAccessSetupRequest.new(params).to_h - non_body_param_names = %w[employer_id] - body = request_data.except(*non_body_param_names) - - request = VitableConnect::Internal::JSON::Request.new( - base_url: request_options[:base_url], - method: "PUT", - path: "v1/employers/#{URI.encode_uri_component(params[:employer_id].to_s)}/payroll-access-setup", - body: body, - request_options: request_options - ) - begin - response = @client.send(request) - rescue Net::HTTPRequestTimeout - raise VitableConnect::Errors::TimeoutError - end - code = response.code.to_i - if code.between?(200, 299) - VitableConnect::Types::PayrollAccessSetupStatusResponse.load(response.body) - else - error_class = VitableConnect::Errors::ResponseError.subclass_for_code(code) - raise error_class.new(response.body, code: code) - end - end - - # Returns a paginated list of the employer's payroll-deduction statements, newest period first, each with its - # period, generation date, distinct employee count, total deduction, change-file link, and deduction frequency. - # Statements superseded by a later correction are excluded. The caller must be authorized for the employer; an - # unknown or unauthorized employer returns 404. - # - # @param request_options [Hash] - # @param params [Hash] - # @option request_options [String] :base_url - # @option request_options [Hash{String => Object}] :additional_headers - # @option request_options [Hash{String => Object}] :additional_query_parameters - # @option request_options [Hash{String => Object}] :additional_body_parameters - # @option request_options [Integer] :timeout_in_seconds - # @option params [VitableConnect::Types::EmployerID] :employer_id - # @option params [Integer, nil] :limit - # @option params [Integer, nil] :page - # - # @example - # client.employers.list_payroll_deduction_statements( - # employer_id: "empr_abc123def456", - # limit: 20, - # page: 1 - # ) - # - # @return [VitableConnect::Types::EmployerPayrollDeductionStatementListResponse] - def list_payroll_deduction_statements(request_options: {}, **params) - params = VitableConnect::Internal::Types::Utils.normalize_keys(params) - query_params = {} - query_params["limit"] = params[:limit] if params.key?(:limit) - query_params["page"] = params[:page] if params.key?(:page) - - VitableConnect::Internal::OffsetItemIterator.new( - initial_page: query_params["page"], - item_field: :data, - has_next_field: nil, - step: false - ) do |next_page| - query_params["page"] = next_page - request = VitableConnect::Internal::JSON::Request.new( - base_url: request_options[:base_url], - method: "GET", - path: "v1/employers/#{URI.encode_uri_component(params[:employer_id].to_s)}/payroll-deduction-statements", - query: query_params, - request_options: request_options - ) - begin - response = @client.send(request) - rescue Net::HTTPRequestTimeout - raise VitableConnect::Errors::TimeoutError - end - code = response.code.to_i - if code.between?(200, 299) - parsed_response = VitableConnect::Types::EmployerPayrollDeductionStatementListResponse.load(response.body) - [parsed_response, response] - else - error_class = VitableConnect::Errors::ResponseError.subclass_for_code(code) - raise error_class.new(response.body, code: code) - end - end - end - - # Provision and return the employer's payroll integration email. - # - # @param request_options [Hash] - # @param params [Hash] - # @option request_options [String] :base_url - # @option request_options [Hash{String => Object}] :additional_headers - # @option request_options [Hash{String => Object}] :additional_query_parameters - # @option request_options [Hash{String => Object}] :additional_body_parameters - # @option request_options [Integer] :timeout_in_seconds - # @option params [VitableConnect::Types::EmployerID] :employer_id - # - # @example - # client.employers.ensure_payroll_integration_email(employer_id: "empr_abc123def456") - # - # @return [VitableConnect::Types::PayrollIntegrationEmailResponse] - def ensure_payroll_integration_email(request_options: {}, **params) - params = VitableConnect::Internal::Types::Utils.normalize_keys(params) - request = VitableConnect::Internal::JSON::Request.new( - base_url: request_options[:base_url], - method: "PUT", - path: "v1/employers/#{URI.encode_uri_component(params[:employer_id].to_s)}/payroll-integration-email", - request_options: request_options - ) - begin - response = @client.send(request) - rescue Net::HTTPRequestTimeout - raise VitableConnect::Errors::TimeoutError - end - code = response.code.to_i - if code.between?(200, 299) - VitableConnect::Types::PayrollIntegrationEmailResponse.load(response.body) - else - error_class = VitableConnect::Errors::ResponseError.subclass_for_code(code) - raise error_class.new(response.body, code: code) - end - end - - # Updates configuration settings for a specific employer. The employer must belong to the authenticated - # organization. - # - # @param request_options [Hash] - # @param params [VitableConnect::Employers::Types::UpdateEmployerSettingsRequest] - # @option request_options [String] :base_url - # @option request_options [Hash{String => Object}] :additional_headers - # @option request_options [Hash{String => Object}] :additional_query_parameters - # @option request_options [Hash{String => Object}] :additional_body_parameters - # @option request_options [Integer] :timeout_in_seconds - # @option params [VitableConnect::Types::EmployerID] :employer_id - # - # @example - # client.employers.update_settings( - # employer_id: "empr_abc123def456", - # pay_frequency: "bi_weekly" - # ) - # - # @return [VitableConnect::Types::EmployerSettingsResponse] - def update_settings(request_options: {}, **params) - params = VitableConnect::Internal::Types::Utils.normalize_keys(params) - request_data = VitableConnect::Employers::Types::UpdateEmployerSettingsRequest.new(params).to_h - non_body_param_names = %w[employer_id] - body = request_data.except(*non_body_param_names) - - request = VitableConnect::Internal::JSON::Request.new( - base_url: request_options[:base_url], - method: "PUT", - path: "v1/employers/#{URI.encode_uri_component(params[:employer_id].to_s)}/settings", - body: body, - request_options: request_options - ) - begin - response = @client.send(request) - rescue Net::HTTPRequestTimeout - raise VitableConnect::Errors::TimeoutError - end - code = response.code.to_i - if code.between?(200, 299) - VitableConnect::Types::EmployerSettingsResponse.load(response.body) - else - error_class = VitableConnect::Errors::ResponseError.subclass_for_code(code) - raise error_class.new(response.body, code: code) - end - end - - # Returns the distinct HRIS/payroll providers across the same book `GET /v1/employers` returns, sorted for - # display. Use these as the values for the employers list's `hris_provider` filter — filter on `provider`, show - # `provider_label`. The stored providers are free text, so they cannot be enumerated in advance. - # - # @param request_options [Hash] - # @param _params [Hash] - # @option request_options [String] :base_url - # @option request_options [Hash{String => Object}] :additional_headers - # @option request_options [Hash{String => Object}] :additional_query_parameters - # @option request_options [Hash{String => Object}] :additional_body_parameters - # @option request_options [Integer] :timeout_in_seconds - # - # @example - # client.employers.list_hris_providers - # - # @return [VitableConnect::Types::OrganizationHrisProvidersResponse] - def list_hris_providers(request_options: {}, **_params) - request = VitableConnect::Internal::JSON::Request.new( - base_url: request_options[:base_url], - method: "GET", - path: "v1/employers/hris-providers", - request_options: request_options - ) - begin - response = @client.send(request) - rescue Net::HTTPRequestTimeout - raise VitableConnect::Errors::TimeoutError - end - code = response.code.to_i - if code.between?(200, 299) - VitableConnect::Types::OrganizationHrisProvidersResponse.load(response.body) - else - error_class = VitableConnect::Errors::ResponseError.subclass_for_code(code) - raise error_class.new(response.body, code: code) - end - end - end - end -end diff --git a/lib/VitableConnect/employers/types/census_sync_request.rb b/lib/VitableConnect/employers/types/census_sync_request.rb deleted file mode 100644 index 1f33be7..0000000 --- a/lib/VitableConnect/employers/types/census_sync_request.rb +++ /dev/null @@ -1,13 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Employers - module Types - class CensusSyncRequest < Internal::Types::Model - field :employer_id, -> { String }, optional: false, nullable: false - - field :employees, -> { Internal::Types::Array[VitableConnect::Types::CensusSyncEmployeeRequest] }, optional: false, nullable: false - end - end - end -end diff --git a/lib/VitableConnect/employers/types/create_employer_request.rb b/lib/VitableConnect/employers/types/create_employer_request.rb deleted file mode 100644 index 9c2eb91..0000000 --- a/lib/VitableConnect/employers/types/create_employer_request.rb +++ /dev/null @@ -1,23 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Employers - module Types - class CreateEmployerRequest < Internal::Types::Model - field :name, -> { String }, optional: false, nullable: false - - field :legal_name, -> { String }, optional: false, nullable: false - - field :ein, -> { String }, optional: false, nullable: false - - field :email, -> { String }, optional: false, nullable: false - - field :address, -> { VitableConnect::Types::EmployerAddressInput }, optional: false, nullable: false - - field :phone_number, -> { String }, optional: true, nullable: false - - field :reference_id, -> { String }, optional: true, nullable: false - end - end - end -end diff --git a/lib/VitableConnect/employers/types/ensure_payroll_integration_email_employers_request.rb b/lib/VitableConnect/employers/types/ensure_payroll_integration_email_employers_request.rb deleted file mode 100644 index 0ce7fa0..0000000 --- a/lib/VitableConnect/employers/types/ensure_payroll_integration_email_employers_request.rb +++ /dev/null @@ -1,11 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Employers - module Types - class EnsurePayrollIntegrationEmailEmployersRequest < Internal::Types::Model - field :employer_id, -> { String }, optional: false, nullable: false - end - end - end -end diff --git a/lib/VitableConnect/employers/types/get_benefit_plan_year_employers_request.rb b/lib/VitableConnect/employers/types/get_benefit_plan_year_employers_request.rb deleted file mode 100644 index c524f96..0000000 --- a/lib/VitableConnect/employers/types/get_benefit_plan_year_employers_request.rb +++ /dev/null @@ -1,13 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Employers - module Types - class GetBenefitPlanYearEmployersRequest < Internal::Types::Model - field :employer_id, -> { String }, optional: false, nullable: false - - field :benefit_plan_year_id, -> { String }, optional: false, nullable: false - end - end - end -end diff --git a/lib/VitableConnect/employers/types/get_employers_request.rb b/lib/VitableConnect/employers/types/get_employers_request.rb deleted file mode 100644 index 63afd2f..0000000 --- a/lib/VitableConnect/employers/types/get_employers_request.rb +++ /dev/null @@ -1,11 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Employers - module Types - class GetEmployersRequest < Internal::Types::Model - field :employer_id, -> { String }, optional: false, nullable: false - end - end - end -end diff --git a/lib/VitableConnect/employers/types/get_hris_employers_request.rb b/lib/VitableConnect/employers/types/get_hris_employers_request.rb deleted file mode 100644 index d94ff00..0000000 --- a/lib/VitableConnect/employers/types/get_hris_employers_request.rb +++ /dev/null @@ -1,11 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Employers - module Types - class GetHrisEmployersRequest < Internal::Types::Model - field :employer_id, -> { String }, optional: false, nullable: false - end - end - end -end diff --git a/lib/VitableConnect/employers/types/get_invoice_pdf_employers_request.rb b/lib/VitableConnect/employers/types/get_invoice_pdf_employers_request.rb deleted file mode 100644 index 0e393b3..0000000 --- a/lib/VitableConnect/employers/types/get_invoice_pdf_employers_request.rb +++ /dev/null @@ -1,13 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Employers - module Types - class GetInvoicePdfEmployersRequest < Internal::Types::Model - field :employer_id, -> { String }, optional: false, nullable: false - - field :invoice_id, -> { String }, optional: false, nullable: false - end - end - end -end diff --git a/lib/VitableConnect/employers/types/get_payroll_access_setup_employers_request.rb b/lib/VitableConnect/employers/types/get_payroll_access_setup_employers_request.rb deleted file mode 100644 index d7ba0f8..0000000 --- a/lib/VitableConnect/employers/types/get_payroll_access_setup_employers_request.rb +++ /dev/null @@ -1,11 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Employers - module Types - class GetPayrollAccessSetupEmployersRequest < Internal::Types::Model - field :employer_id, -> { String }, optional: false, nullable: false - end - end - end -end diff --git a/lib/VitableConnect/employers/types/list_benefit_plan_year_enrollments_employers_request.rb b/lib/VitableConnect/employers/types/list_benefit_plan_year_enrollments_employers_request.rb deleted file mode 100644 index 575309b..0000000 --- a/lib/VitableConnect/employers/types/list_benefit_plan_year_enrollments_employers_request.rb +++ /dev/null @@ -1,21 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Employers - module Types - class ListBenefitPlanYearEnrollmentsEmployersRequest < Internal::Types::Model - field :employer_id, -> { String }, optional: false, nullable: false - - field :benefit_plan_year_id, -> { String }, optional: false, nullable: false - - field :election_status, -> { VitableConnect::Types::ElectionStatusItem }, optional: true, nullable: false - - field :limit, -> { Integer }, optional: true, nullable: false - - field :page, -> { Integer }, optional: true, nullable: false - - field :search, -> { String }, optional: true, nullable: false - end - end - end -end diff --git a/lib/VitableConnect/employers/types/list_benefit_plan_years_employers_request.rb b/lib/VitableConnect/employers/types/list_benefit_plan_years_employers_request.rb deleted file mode 100644 index 3158015..0000000 --- a/lib/VitableConnect/employers/types/list_benefit_plan_years_employers_request.rb +++ /dev/null @@ -1,11 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Employers - module Types - class ListBenefitPlanYearsEmployersRequest < Internal::Types::Model - field :employer_id, -> { String }, optional: false, nullable: false - end - end - end -end diff --git a/lib/VitableConnect/employers/types/list_employees_employers_request.rb b/lib/VitableConnect/employers/types/list_employees_employers_request.rb deleted file mode 100644 index 67685ac..0000000 --- a/lib/VitableConnect/employers/types/list_employees_employers_request.rb +++ /dev/null @@ -1,19 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Employers - module Types - class ListEmployeesEmployersRequest < Internal::Types::Model - field :employer_id, -> { String }, optional: false, nullable: false - - field :employment_status, -> { VitableConnect::Types::EmployeeStatus }, optional: true, nullable: false - - field :limit, -> { Integer }, optional: true, nullable: false - - field :page, -> { Integer }, optional: true, nullable: false - - field :search, -> { String }, optional: true, nullable: false - end - end - end -end diff --git a/lib/VitableConnect/employers/types/list_employers_request.rb b/lib/VitableConnect/employers/types/list_employers_request.rb deleted file mode 100644 index f80c181..0000000 --- a/lib/VitableConnect/employers/types/list_employers_request.rb +++ /dev/null @@ -1,25 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Employers - module Types - class ListEmployersRequest < Internal::Types::Model - field :benefit_family, -> { VitableConnect::Types::BenefitFamilyParamItem }, optional: true, nullable: false - - field :benefit_lifecycle_stage, -> { VitableConnect::Types::BenefitLifecycleStageItem }, optional: true, nullable: false - - field :hris_provider, -> { String }, optional: true, nullable: false - - field :hris_status, -> { VitableConnect::Types::HrisStatusItem }, optional: true, nullable: false - - field :include_cancelled, -> { Internal::Types::Boolean }, optional: true, nullable: false - - field :limit, -> { Integer }, optional: true, nullable: false - - field :page, -> { Integer }, optional: true, nullable: false - - field :search, -> { String }, optional: true, nullable: false - end - end - end -end diff --git a/lib/VitableConnect/employers/types/list_invoices_employers_request.rb b/lib/VitableConnect/employers/types/list_invoices_employers_request.rb deleted file mode 100644 index 84db107..0000000 --- a/lib/VitableConnect/employers/types/list_invoices_employers_request.rb +++ /dev/null @@ -1,15 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Employers - module Types - class ListInvoicesEmployersRequest < Internal::Types::Model - field :employer_id, -> { String }, optional: false, nullable: false - - field :limit, -> { Integer }, optional: true, nullable: false - - field :offset, -> { String }, optional: true, nullable: false - end - end - end -end diff --git a/lib/VitableConnect/employers/types/list_payroll_deduction_statements_employers_request.rb b/lib/VitableConnect/employers/types/list_payroll_deduction_statements_employers_request.rb deleted file mode 100644 index 4e9cb84..0000000 --- a/lib/VitableConnect/employers/types/list_payroll_deduction_statements_employers_request.rb +++ /dev/null @@ -1,15 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Employers - module Types - class ListPayrollDeductionStatementsEmployersRequest < Internal::Types::Model - field :employer_id, -> { String }, optional: false, nullable: false - - field :limit, -> { Integer }, optional: true, nullable: false - - field :page, -> { Integer }, optional: true, nullable: false - end - end - end -end diff --git a/lib/VitableConnect/employers/types/submit_payroll_access_setup_request.rb b/lib/VitableConnect/employers/types/submit_payroll_access_setup_request.rb deleted file mode 100644 index 4a84d05..0000000 --- a/lib/VitableConnect/employers/types/submit_payroll_access_setup_request.rb +++ /dev/null @@ -1,57 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Employers - module Types - class SubmitPayrollAccessSetupRequest < Internal::Types::Model - field :employer_id, -> { String }, optional: false, nullable: false - - field :employees_in_payroll_acknowledged, -> { Internal::Types::Boolean }, optional: false, nullable: false - - field :payroll_data_impacts_eligibility_acknowledged, -> { Internal::Types::Boolean }, optional: false, nullable: false - - field :classifications_accurate, -> { Internal::Types::Boolean }, optional: false, nullable: false - - field :classification_correction_source, -> { VitableConnect::Types::ClassificationCorrectionSource }, optional: true, nullable: false - - field :misclassified_employee_names, -> { Internal::Types::Array[String] }, optional: true, nullable: false - - field :remaining_employee_action, -> { VitableConnect::Types::RemainingEmployeeAction }, optional: true, nullable: false - - field :all_benefit_eligible_employees_present, -> { Internal::Types::Boolean }, optional: false, nullable: false - - field :missing_employee_resolution, -> { VitableConnect::Types::MissingEmployeeResolution }, optional: true, nullable: false - - field :is_controlled_group, -> { Internal::Types::Boolean }, optional: false, nullable: false - - field :same_payroll_covers_other_eins, -> { Internal::Types::Boolean }, optional: true, nullable: false - - field :access_method, -> { VitableConnect::Types::AccessMethod }, optional: false, nullable: false - - field :login_url, -> { String }, optional: true, nullable: false - - field :username, -> { String }, optional: true, nullable: false - - field :phone, -> { String }, optional: true, nullable: false - - field :password, -> { String }, optional: true, nullable: false - - field :integration_confirmed, -> { Internal::Types::Boolean }, optional: true, nullable: false - - field :has_additional_payroll_system, -> { Internal::Types::Boolean }, optional: false, nullable: false - - field :additional_access_method, -> { VitableConnect::Types::AdditionalAccessMethod }, optional: true, nullable: false - - field :additional_login_url, -> { String }, optional: true, nullable: false - - field :additional_username, -> { String }, optional: true, nullable: false - - field :additional_phone, -> { String }, optional: true, nullable: false - - field :additional_password, -> { String }, optional: true, nullable: false - - field :additional_integration_confirmed, -> { Internal::Types::Boolean }, optional: true, nullable: false - end - end - end -end diff --git a/lib/VitableConnect/employers/types/update_employer_request.rb b/lib/VitableConnect/employers/types/update_employer_request.rb deleted file mode 100644 index b18af9d..0000000 --- a/lib/VitableConnect/employers/types/update_employer_request.rb +++ /dev/null @@ -1,19 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Employers - module Types - class UpdateEmployerRequest < Internal::Types::Model - field :employer_id, -> { String }, optional: false, nullable: false - - field :name, -> { String }, optional: true, nullable: false - - field :legal_name, -> { String }, optional: true, nullable: false - - field :address, -> { VitableConnect::Types::UpdateEmployerAddressInput }, optional: true, nullable: false - - field :active, -> { Internal::Types::Boolean }, optional: true, nullable: false - end - end - end -end diff --git a/lib/VitableConnect/employers/types/update_employer_settings_request.rb b/lib/VitableConnect/employers/types/update_employer_settings_request.rb deleted file mode 100644 index aef18d1..0000000 --- a/lib/VitableConnect/employers/types/update_employer_settings_request.rb +++ /dev/null @@ -1,13 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Employers - module Types - class UpdateEmployerSettingsRequest < Internal::Types::Model - field :employer_id, -> { String }, optional: false, nullable: false - - field :pay_frequency, -> { VitableConnect::Types::DeductionFrequency }, optional: false, nullable: false - end - end - end -end diff --git a/lib/VitableConnect/enrollments/client.rb b/lib/VitableConnect/enrollments/client.rb deleted file mode 100644 index 0613226..0000000 --- a/lib/VitableConnect/enrollments/client.rb +++ /dev/null @@ -1,152 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Enrollments - class Client - # @param client [VitableConnect::Internal::Http::RawClient] - # - # @return [void] - def initialize(client:) - @client = client - end - - # Retrieves a single enrollment: the employee and employer it belongs to, the benefit product, its status, the - # coverage period, the employee payroll deduction and employer contribution, and the enrolled plan's Summary of - # Benefits and Coverage document when one is on file. An enrollment the caller cannot reach is indistinguishable - # from one that does not exist. - # - # @param request_options [Hash] - # @param params [Hash] - # @option request_options [String] :base_url - # @option request_options [Hash{String => Object}] :additional_headers - # @option request_options [Hash{String => Object}] :additional_query_parameters - # @option request_options [Hash{String => Object}] :additional_body_parameters - # @option request_options [Integer] :timeout_in_seconds - # @option params [VitableConnect::Types::EnrollmentID] :enrollment_id - # - # @example - # client.enrollments.get(enrollment_id: "enrl_AAAAAAAAAAAAAAAAAAAAAQ") - # - # @return [VitableConnect::Types::EnrollmentResponse] - def get(request_options: {}, **params) - params = VitableConnect::Internal::Types::Utils.normalize_keys(params) - request = VitableConnect::Internal::JSON::Request.new( - base_url: request_options[:base_url], - method: "GET", - path: "v1/enrollments/#{URI.encode_uri_component(params[:enrollment_id].to_s)}", - request_options: request_options - ) - begin - response = @client.send(request) - rescue Net::HTTPRequestTimeout - raise VitableConnect::Errors::TimeoutError - end - code = response.code.to_i - if code.between?(200, 299) - VitableConnect::Types::EnrollmentResponse.load(response.body) - else - error_class = VitableConnect::Errors::ResponseError.subclass_for_code(code) - raise error_class.new(response.body, code: code) - end - end - - # Closes the targeted enrollment and creates a new unanswered enrollment for the same member and plan year. VPC - # never requires a qualifying life event; other products require an accepted, member-owned event outside open - # enrollment. User-backed callers must provide a reason; it is optional for organization API-key callers. Tenant - # mismatches return a non-disclosing 404 before the request body is validated. - # - # @param request_options [Hash] - # @param params [VitableConnect::Enrollments::Types::ReissueEnrollmentRequest] - # @option request_options [String] :base_url - # @option request_options [Hash{String => Object}] :additional_headers - # @option request_options [Hash{String => Object}] :additional_query_parameters - # @option request_options [Hash{String => Object}] :additional_body_parameters - # @option request_options [Integer] :timeout_in_seconds - # @option params [VitableConnect::Types::EnrollmentID] :enrollment_id - # - # @example - # client.enrollments.reissue( - # enrollment_id: "enrl_AAAAAAAAAAAAAAAAAAAAAQ", - # reason: "Member needs a new election after a qualifying event.", - # ticket_number: "BPT-1234", - # qualifying_life_event_id: "qle_AAAAAAAAAAAAAAAAAAAAAQ" - # ) - # - # @return [VitableConnect::Types::ReissueEnrollmentResponse] - def reissue(request_options: {}, **params) - params = VitableConnect::Internal::Types::Utils.normalize_keys(params) - request_data = VitableConnect::Enrollments::Types::ReissueEnrollmentRequest.new(params).to_h - non_body_param_names = %w[enrollment_id] - body = request_data.except(*non_body_param_names) - - request = VitableConnect::Internal::JSON::Request.new( - base_url: request_options[:base_url], - method: "POST", - path: "v1/enrollments/#{URI.encode_uri_component(params[:enrollment_id].to_s)}/reissue", - body: body, - request_options: request_options - ) - begin - response = @client.send(request) - rescue Net::HTTPRequestTimeout - raise VitableConnect::Errors::TimeoutError - end - code = response.code.to_i - if code.between?(200, 299) - VitableConnect::Types::ReissueEnrollmentResponse.load(response.body) - else - error_class = VitableConnect::Errors::ResponseError.subclass_for_code(code) - raise error_class.new(response.body, code: code) - end - end - - # Terminates enrolled coverage immediately. An accepted qualifying life event owned by the enrollment member is - # required unless the plan is VPC or ICHRA. User-backed callers must provide a reason; it is optional for - # organization API-key callers. API keys may act across the caller organization's book. Tenant mismatches return - # the same non-disclosing 404 before the request body is validated. - # - # @param request_options [Hash] - # @param params [VitableConnect::Enrollments::Types::TerminateEnrollmentRequest] - # @option request_options [String] :base_url - # @option request_options [Hash{String => Object}] :additional_headers - # @option request_options [Hash{String => Object}] :additional_query_parameters - # @option request_options [Hash{String => Object}] :additional_body_parameters - # @option request_options [Integer] :timeout_in_seconds - # @option params [VitableConnect::Types::EnrollmentID] :enrollment_id - # - # @example - # client.enrollments.terminate( - # enrollment_id: "enrl_AAAAAAAAAAAAAAAAAAAAAQ", - # reason: "Member requested coverage termination after a qualifying event.", - # ticket_number: "BPT-1234", - # qualifying_life_event_id: "qle_AAAAAAAAAAAAAAAAAAAAAQ" - # ) - # - # @return [untyped] - def terminate(request_options: {}, **params) - params = VitableConnect::Internal::Types::Utils.normalize_keys(params) - request_data = VitableConnect::Enrollments::Types::TerminateEnrollmentRequest.new(params).to_h - non_body_param_names = %w[enrollment_id] - body = request_data.except(*non_body_param_names) - - request = VitableConnect::Internal::JSON::Request.new( - base_url: request_options[:base_url], - method: "POST", - path: "v1/enrollments/#{URI.encode_uri_component(params[:enrollment_id].to_s)}/terminate", - body: body, - request_options: request_options - ) - begin - response = @client.send(request) - rescue Net::HTTPRequestTimeout - raise VitableConnect::Errors::TimeoutError - end - code = response.code.to_i - return if code.between?(200, 299) - - error_class = VitableConnect::Errors::ResponseError.subclass_for_code(code) - raise error_class.new(response.body, code: code) - end - end - end -end diff --git a/lib/VitableConnect/enrollments/types/get_enrollments_request.rb b/lib/VitableConnect/enrollments/types/get_enrollments_request.rb deleted file mode 100644 index 22162a7..0000000 --- a/lib/VitableConnect/enrollments/types/get_enrollments_request.rb +++ /dev/null @@ -1,11 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Enrollments - module Types - class GetEnrollmentsRequest < Internal::Types::Model - field :enrollment_id, -> { String }, optional: false, nullable: false - end - end - end -end diff --git a/lib/VitableConnect/enrollments/types/reissue_enrollment_request.rb b/lib/VitableConnect/enrollments/types/reissue_enrollment_request.rb deleted file mode 100644 index 0677f4c..0000000 --- a/lib/VitableConnect/enrollments/types/reissue_enrollment_request.rb +++ /dev/null @@ -1,17 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Enrollments - module Types - class ReissueEnrollmentRequest < Internal::Types::Model - field :enrollment_id, -> { String }, optional: false, nullable: false - - field :reason, -> { String }, optional: true, nullable: false - - field :ticket_number, -> { String }, optional: true, nullable: false - - field :qualifying_life_event_id, -> { String }, optional: true, nullable: false - end - end - end -end diff --git a/lib/VitableConnect/enrollments/types/terminate_enrollment_request.rb b/lib/VitableConnect/enrollments/types/terminate_enrollment_request.rb deleted file mode 100644 index 275f472..0000000 --- a/lib/VitableConnect/enrollments/types/terminate_enrollment_request.rb +++ /dev/null @@ -1,17 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Enrollments - module Types - class TerminateEnrollmentRequest < Internal::Types::Model - field :enrollment_id, -> { String }, optional: false, nullable: false - - field :reason, -> { String }, optional: true, nullable: false - - field :ticket_number, -> { String }, optional: true, nullable: false - - field :qualifying_life_event_id, -> { String }, optional: true, nullable: false - end - end - end -end diff --git a/lib/VitableConnect/environment.rb b/lib/VitableConnect/environment.rb deleted file mode 100644 index 3716009..0000000 --- a/lib/VitableConnect/environment.rb +++ /dev/null @@ -1,9 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - class Environment - PRODUCTION = "https://api.vitablehealth.com" - - UAT = "https://api.uat.vitablehealth.com" - end -end diff --git a/lib/VitableConnect/errors/api_error.rb b/lib/VitableConnect/errors/api_error.rb deleted file mode 100644 index 4ab2201..0000000 --- a/lib/VitableConnect/errors/api_error.rb +++ /dev/null @@ -1,8 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Errors - class ApiError < StandardError - end - end -end diff --git a/lib/VitableConnect/errors/client_error.rb b/lib/VitableConnect/errors/client_error.rb deleted file mode 100644 index 02ab957..0000000 --- a/lib/VitableConnect/errors/client_error.rb +++ /dev/null @@ -1,17 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Errors - class ClientError < ResponseError - end - - class UnauthorizedError < ClientError - end - - class ForbiddenError < ClientError - end - - class NotFoundError < ClientError - end - end -end diff --git a/lib/VitableConnect/errors/redirect_error.rb b/lib/VitableConnect/errors/redirect_error.rb deleted file mode 100644 index ff7a2ef..0000000 --- a/lib/VitableConnect/errors/redirect_error.rb +++ /dev/null @@ -1,8 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Errors - class RedirectError < ResponseError - end - end -end diff --git a/lib/VitableConnect/errors/response_error.rb b/lib/VitableConnect/errors/response_error.rb deleted file mode 100644 index a84e131..0000000 --- a/lib/VitableConnect/errors/response_error.rb +++ /dev/null @@ -1,42 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Errors - class ResponseError < ApiError - attr_reader :code - - def initialize(msg, code:) - @code = code - super(msg) - end - - def inspect - "#<#{self.class.name} @code=#{code} @body=#{message}>" - end - - # Returns the most appropriate error class for the given code. - # - # @return [Class] - def self.subclass_for_code(code) - case code - when 300..399 - RedirectError - when 401 - UnauthorizedError - when 403 - ForbiddenError - when 404 - NotFoundError - when 400..499 - ClientError - when 503 - ServiceUnavailableError - when 500..599 - ServerError - else - ResponseError - end - end - end - end -end diff --git a/lib/VitableConnect/errors/server_error.rb b/lib/VitableConnect/errors/server_error.rb deleted file mode 100644 index 50ca779..0000000 --- a/lib/VitableConnect/errors/server_error.rb +++ /dev/null @@ -1,11 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Errors - class ServerError < ResponseError - end - - class ServiceUnavailableError < ApiError - end - end -end diff --git a/lib/VitableConnect/errors/timeout_error.rb b/lib/VitableConnect/errors/timeout_error.rb deleted file mode 100644 index 550d7dd..0000000 --- a/lib/VitableConnect/errors/timeout_error.rb +++ /dev/null @@ -1,8 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Errors - class TimeoutError < ApiError - end - end -end diff --git a/lib/VitableConnect/groups/client.rb b/lib/VitableConnect/groups/client.rb deleted file mode 100644 index 765fb7c..0000000 --- a/lib/VitableConnect/groups/client.rb +++ /dev/null @@ -1,199 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Groups - class Client - # @param client [VitableConnect::Internal::Http::RawClient] - # - # @return [void] - def initialize(client:) - @client = client - end - - # Returns a paginated list of groups belonging to the authenticated organization. - # - # @param request_options [Hash] - # @param params [Hash] - # @option request_options [String] :base_url - # @option request_options [Hash{String => Object}] :additional_headers - # @option request_options [Hash{String => Object}] :additional_query_parameters - # @option request_options [Hash{String => Object}] :additional_body_parameters - # @option request_options [Integer] :timeout_in_seconds - # @option params [Integer, nil] :limit - # @option params [Integer, nil] :page - # - # @example - # client.groups.list( - # limit: 20, - # page: 1 - # ) - # - # @return [VitableConnect::Types::GroupListResponse] - def list(request_options: {}, **params) - params = VitableConnect::Internal::Types::Utils.normalize_keys(params) - query_params = {} - query_params["limit"] = params[:limit] if params.key?(:limit) - query_params["page"] = params[:page] if params.key?(:page) - - VitableConnect::Internal::OffsetItemIterator.new( - initial_page: query_params["page"], - item_field: :data, - has_next_field: nil, - step: false - ) do |next_page| - query_params["page"] = next_page - request = VitableConnect::Internal::JSON::Request.new( - base_url: request_options[:base_url], - method: "GET", - path: "v1/groups", - query: query_params, - request_options: request_options - ) - begin - response = @client.send(request) - rescue Net::HTTPRequestTimeout - raise VitableConnect::Errors::TimeoutError - end - code = response.code.to_i - if code.between?(200, 299) - parsed_response = VitableConnect::Types::GroupListResponse.load(response.body) - [parsed_response, response] - else - error_class = VitableConnect::Errors::ResponseError.subclass_for_code(code) - raise error_class.new(response.body, code: code) - end - end - end - - # Creates a new group scoped to the authenticated organization. - # - # @param request_options [Hash] - # @param params [VitableConnect::Groups::Types::CreateGroupRequest] - # @option request_options [String] :base_url - # @option request_options [Hash{String => Object}] :additional_headers - # @option request_options [Hash{String => Object}] :additional_query_parameters - # @option request_options [Hash{String => Object}] :additional_body_parameters - # @option request_options [Integer] :timeout_in_seconds - # - # @example - # client.groups.create( - # name: "Tier 1", - # external_reference_id: "mol_seg_001" - # ) - # - # @return [VitableConnect::Types::GroupResponse] - def create(request_options: {}, **params) - params = VitableConnect::Internal::Types::Utils.normalize_keys(params) - request = VitableConnect::Internal::JSON::Request.new( - base_url: request_options[:base_url], - method: "POST", - path: "v1/groups", - body: VitableConnect::Groups::Types::CreateGroupRequest.new(params).to_h, - request_options: request_options - ) - begin - response = @client.send(request) - rescue Net::HTTPRequestTimeout - raise VitableConnect::Errors::TimeoutError - end - code = response.code.to_i - if code.between?(200, 299) - VitableConnect::Types::GroupResponse.load(response.body) - else - error_class = VitableConnect::Errors::ResponseError.subclass_for_code(code) - raise error_class.new(response.body, code: code) - end - end - - # Retrieves a single group by its prefixed ID. Returns 404 if the group does not belong to the authenticated - # organization. - # - # @param request_options [Hash] - # @param params [Hash] - # @option request_options [String] :base_url - # @option request_options [Hash{String => Object}] :additional_headers - # @option request_options [Hash{String => Object}] :additional_query_parameters - # @option request_options [Hash{String => Object}] :additional_body_parameters - # @option request_options [Integer] :timeout_in_seconds - # @option params [VitableConnect::Types::GroupID] :group_id - # - # @example - # client.groups.get(group_id: "grp_abc123def456") - # - # @return [VitableConnect::Types::GroupResponse] - def get(request_options: {}, **params) - params = VitableConnect::Internal::Types::Utils.normalize_keys(params) - request = VitableConnect::Internal::JSON::Request.new( - base_url: request_options[:base_url], - method: "GET", - path: "v1/groups/#{URI.encode_uri_component(params[:group_id].to_s)}", - request_options: request_options - ) - begin - response = @client.send(request) - rescue Net::HTTPRequestTimeout - raise VitableConnect::Errors::TimeoutError - end - code = response.code.to_i - if code.between?(200, 299) - VitableConnect::Types::GroupResponse.load(response.body) - else - error_class = VitableConnect::Errors::ResponseError.subclass_for_code(code) - raise error_class.new(response.body, code: code) - end - end - - # Partially updates a group's name or external reference ID. Returns 404 if the group does not belong to the - # authenticated organization. - # - # @param request_options [Hash] - # @param params [VitableConnect::Groups::Types::PatchedUpdateGroupRequest] - # @option request_options [String] :base_url - # @option request_options [Hash{String => Object}] :additional_headers - # @option request_options [Hash{String => Object}] :additional_query_parameters - # @option request_options [Hash{String => Object}] :additional_body_parameters - # @option request_options [Integer] :timeout_in_seconds - # @option params [VitableConnect::Types::GroupID] :group_id - # - # @example - # client.groups.update( - # group_id: "grp_abc123def456", - # name: "Tier 1 (renamed)", - # external_reference_id: "mol_seg_001_v2" - # ) - # - # @return [VitableConnect::Types::GroupResponse] - def update(request_options: {}, **params) - params = VitableConnect::Internal::Types::Utils.normalize_keys(params) - request_data = VitableConnect::Groups::Types::PatchedUpdateGroupRequest.new(params).to_h - non_body_param_names = %w[group_id] - body = request_data.except(*non_body_param_names) - - request = VitableConnect::Internal::JSON::Request.new( - base_url: request_options[:base_url], - method: "PATCH", - path: "v1/groups/#{URI.encode_uri_component(params[:group_id].to_s)}", - body: body, - request_options: request_options - ) - begin - response = @client.send(request) - rescue Net::HTTPRequestTimeout - raise VitableConnect::Errors::TimeoutError - end - code = response.code.to_i - if code.between?(200, 299) - VitableConnect::Types::GroupResponse.load(response.body) - else - error_class = VitableConnect::Errors::ResponseError.subclass_for_code(code) - raise error_class.new(response.body, code: code) - end - end - - # @return [VitableConnect::Members::Client] - def members - @members ||= VitableConnect::Groups::Members::Client.new(client: @client) - end - end - end -end diff --git a/lib/VitableConnect/groups/members/client.rb b/lib/VitableConnect/groups/members/client.rb deleted file mode 100644 index f962453..0000000 --- a/lib/VitableConnect/groups/members/client.rb +++ /dev/null @@ -1,21 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Groups - module Members - class Client - # @param client [VitableConnect::Internal::Http::RawClient] - # - # @return [void] - def initialize(client:) - @client = client - end - - # @return [VitableConnect::Sync::Client] - def sync - @sync ||= VitableConnect::Groups::Members::Sync::Client.new(client: @client) - end - end - end - end -end diff --git a/lib/VitableConnect/groups/members/sync/client.rb b/lib/VitableConnect/groups/members/sync/client.rb deleted file mode 100644 index 5d35373..0000000 --- a/lib/VitableConnect/groups/members/sync/client.rb +++ /dev/null @@ -1,122 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Groups - module Members - module Sync - class Client - # @param client [VitableConnect::Internal::Http::RawClient] - # - # @return [void] - def initialize(client:) - @client = client - end - - # Submits a member sync payload for the specified group. Members in the payload will be queued for processing - # asynchronously. Returns HTTP 202 with the batch ID and acceptance timestamp. - # - # @param request_options [Hash] - # @param params [VitableConnect::Groups::Members::Sync::Types::GroupMemberSyncRequest] - # @option request_options [String] :base_url - # @option request_options [Hash{String => Object}] :additional_headers - # @option request_options [Hash{String => Object}] :additional_query_parameters - # @option request_options [Hash{String => Object}] :additional_body_parameters - # @option request_options [Integer] :timeout_in_seconds - # @option params [VitableConnect::Types::GroupID] :group_id - # - # @example - # client.groups.members.sync.submit( - # group_id: "grp_abc123def456", - # members: [{ - # reference_id: "EMP-001", - # first_name: "Jane", - # last_name: "Doe", - # date_of_birth: "1990-05-15", - # phone: "4155550100", - # plan_id: "pln_abc123def456", - # address: { - # address_line1: "123 Main Street", - # address_line2: "Apt 4B", - # city: "San Francisco", - # state: "CA", - # zipcode: "94102" - # }, - # email: "jane.doe@acme.com" - # }] - # ) - # - # @return [VitableConnect::Types::GroupMemberSyncDetailResponse] - def submit(request_options: {}, **params) - params = VitableConnect::Internal::Types::Utils.normalize_keys(params) - request_data = VitableConnect::Groups::Members::Sync::Types::GroupMemberSyncRequest.new(params).to_h - non_body_param_names = %w[group_id] - body = request_data.except(*non_body_param_names) - - request = VitableConnect::Internal::JSON::Request.new( - base_url: request_options[:base_url], - method: "POST", - path: "v1/groups/#{URI.encode_uri_component(params[:group_id].to_s)}/members/sync", - body: body, - request_options: request_options - ) - begin - response = @client.send(request) - rescue Net::HTTPRequestTimeout - raise VitableConnect::Errors::TimeoutError - end - code = response.code.to_i - if code.between?(200, 299) - VitableConnect::Types::GroupMemberSyncDetailResponse.load(response.body) - else - error_class = VitableConnect::Errors::ResponseError.subclass_for_code(code) - raise error_class.new(response.body, code: code) - end - end - - # Retrieves a previously-submitted group member sync request by its `grpmsr_` ID. Returns the acceptance - # timestamp, completion timestamp (if processing has finished), and the per-member `results` once available. - # While processing is in flight, `completed_at` and `results` are `null`. - # - # @param request_options [Hash] - # @param params [Hash] - # @option request_options [String] :base_url - # @option request_options [Hash{String => Object}] :additional_headers - # @option request_options [Hash{String => Object}] :additional_query_parameters - # @option request_options [Hash{String => Object}] :additional_body_parameters - # @option request_options [Integer] :timeout_in_seconds - # @option params [VitableConnect::Types::GroupID] :group_id - # @option params [VitableConnect::Types::RequestID] :request_id - # - # @example - # client.groups.members.sync.get( - # group_id: "grp_abc123def456", - # request_id: "request_id" - # ) - # - # @return [VitableConnect::Types::GroupMemberSyncRequestDetailResponse] - def get(request_options: {}, **params) - params = VitableConnect::Internal::Types::Utils.normalize_keys(params) - request = VitableConnect::Internal::JSON::Request.new( - base_url: request_options[:base_url], - method: "GET", - path: "v1/groups/#{URI.encode_uri_component(params[:group_id].to_s)}/members/sync/#{URI.encode_uri_component(params[:request_id].to_s)}", - request_options: request_options - ) - begin - response = @client.send(request) - rescue Net::HTTPRequestTimeout - raise VitableConnect::Errors::TimeoutError - end - code = response.code.to_i - if code.between?(200, 299) - VitableConnect::Types::GroupMemberSyncRequestDetailResponse.load(response.body) - else - error_class = VitableConnect::Errors::ResponseError.subclass_for_code(code) - raise error_class.new(response.body, code: code) - end - end - end - end - end - end -end diff --git a/lib/VitableConnect/groups/members/sync/types/get_sync_request.rb b/lib/VitableConnect/groups/members/sync/types/get_sync_request.rb deleted file mode 100644 index f07bae5..0000000 --- a/lib/VitableConnect/groups/members/sync/types/get_sync_request.rb +++ /dev/null @@ -1,17 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Groups - module Members - module Sync - module Types - class GetSyncRequest < Internal::Types::Model - field :group_id, -> { String }, optional: false, nullable: false - - field :request_id, -> { String }, optional: false, nullable: false - end - end - end - end - end -end diff --git a/lib/VitableConnect/groups/members/sync/types/group_member_sync_request.rb b/lib/VitableConnect/groups/members/sync/types/group_member_sync_request.rb deleted file mode 100644 index 001bd69..0000000 --- a/lib/VitableConnect/groups/members/sync/types/group_member_sync_request.rb +++ /dev/null @@ -1,17 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Groups - module Members - module Sync - module Types - class GroupMemberSyncRequest < Internal::Types::Model - field :group_id, -> { String }, optional: false, nullable: false - - field :members, -> { Internal::Types::Array[VitableConnect::Types::GroupMemberSyncMemberRequest] }, optional: false, nullable: false - end - end - end - end - end -end diff --git a/lib/VitableConnect/groups/types/create_group_request.rb b/lib/VitableConnect/groups/types/create_group_request.rb deleted file mode 100644 index af5b460..0000000 --- a/lib/VitableConnect/groups/types/create_group_request.rb +++ /dev/null @@ -1,13 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Groups - module Types - class CreateGroupRequest < Internal::Types::Model - field :name, -> { String }, optional: false, nullable: false - - field :external_reference_id, -> { String }, optional: false, nullable: false - end - end - end -end diff --git a/lib/VitableConnect/groups/types/get_groups_request.rb b/lib/VitableConnect/groups/types/get_groups_request.rb deleted file mode 100644 index 296d7f5..0000000 --- a/lib/VitableConnect/groups/types/get_groups_request.rb +++ /dev/null @@ -1,11 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Groups - module Types - class GetGroupsRequest < Internal::Types::Model - field :group_id, -> { String }, optional: false, nullable: false - end - end - end -end diff --git a/lib/VitableConnect/groups/types/list_groups_request.rb b/lib/VitableConnect/groups/types/list_groups_request.rb deleted file mode 100644 index 03f2718..0000000 --- a/lib/VitableConnect/groups/types/list_groups_request.rb +++ /dev/null @@ -1,13 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Groups - module Types - class ListGroupsRequest < Internal::Types::Model - field :limit, -> { Integer }, optional: true, nullable: false - - field :page, -> { Integer }, optional: true, nullable: false - end - end - end -end diff --git a/lib/VitableConnect/groups/types/patched_update_group_request.rb b/lib/VitableConnect/groups/types/patched_update_group_request.rb deleted file mode 100644 index d67808b..0000000 --- a/lib/VitableConnect/groups/types/patched_update_group_request.rb +++ /dev/null @@ -1,15 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Groups - module Types - class PatchedUpdateGroupRequest < Internal::Types::Model - field :group_id, -> { String }, optional: false, nullable: false - - field :name, -> { String }, optional: true, nullable: false - - field :external_reference_id, -> { String }, optional: true, nullable: false - end - end - end -end diff --git a/lib/VitableConnect/internal/errors/constraint_error.rb b/lib/VitableConnect/internal/errors/constraint_error.rb deleted file mode 100644 index 086c69f..0000000 --- a/lib/VitableConnect/internal/errors/constraint_error.rb +++ /dev/null @@ -1,10 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Internal - module Errors - class ConstraintError < StandardError - end - end - end -end diff --git a/lib/VitableConnect/internal/errors/type_error.rb b/lib/VitableConnect/internal/errors/type_error.rb deleted file mode 100644 index acfc7fe..0000000 --- a/lib/VitableConnect/internal/errors/type_error.rb +++ /dev/null @@ -1,10 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Internal - module Errors - class TypeError < StandardError - end - end - end -end diff --git a/lib/VitableConnect/internal/http/base_request.rb b/lib/VitableConnect/internal/http/base_request.rb deleted file mode 100644 index b22052c..0000000 --- a/lib/VitableConnect/internal/http/base_request.rb +++ /dev/null @@ -1,51 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Internal - module Http - # @api private - class BaseRequest - attr_reader :base_url, :path, :method, :headers, :query, :request_options - - # @param base_url [String] The base URL for the request - # @param path [String] The path for the request - # @param method [String] The HTTP method for the request (:get, :post, etc.) - # @param headers [Hash] Additional headers for the request (optional) - # @param query [Hash] Query parameters for the request (optional) - # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}, nil] - def initialize(base_url:, path:, method:, headers: {}, query: {}, request_options: {}) - @base_url = base_url - @path = path - @method = method - @headers = headers - @query = query - @request_options = request_options - end - - # @return [Hash] The query parameters merged with additional query parameters from request options. - def encode_query - additional_query = @request_options&.dig(:additional_query_parameters) || @request_options&.dig("additional_query_parameters") || {} - @query.merge(additional_query) - end - - # Child classes should implement: - # - encode_headers: Returns the encoded HTTP request headers. - # - encode_body: Returns the encoded HTTP request body. - - private - - # Merges additional_headers from request_options into sdk_headers, filtering out - # any keys that collide with SDK-set or client-protected headers (case-insensitive). - # @param sdk_headers [Hash] Headers set by the SDK for this request type. - # @param protected_keys [Array] Additional header keys that must not be overridden. - # @return [Hash] The merged headers. - def merge_additional_headers(sdk_headers, protected_keys: []) - additional_headers = @request_options&.dig(:additional_headers) || @request_options&.dig("additional_headers") || {} - all_protected = (sdk_headers.keys + protected_keys).to_set { |k| k.to_s.downcase } - filtered = additional_headers.reject { |key, _| all_protected.include?(key.to_s.downcase) } - sdk_headers.merge(filtered) - end - end - end - end -end diff --git a/lib/VitableConnect/internal/http/raw_client.rb b/lib/VitableConnect/internal/http/raw_client.rb deleted file mode 100644 index df4aa41..0000000 --- a/lib/VitableConnect/internal/http/raw_client.rb +++ /dev/null @@ -1,265 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Internal - module Http - # @api private - class RawClient - # Default HTTP status codes that trigger a retry - RETRYABLE_STATUSES = [408, 429, 500, 502, 503, 504, 521, 522, 524].freeze - # Initial delay between retries in seconds - INITIAL_RETRY_DELAY = 0.5 - # Maximum delay between retries in seconds - MAX_RETRY_DELAY = 60.0 - # Jitter factor for randomizing retry delays (20%) - JITTER_FACTOR = 0.2 - - # @return [String] The base URL for requests - attr_reader :base_url - - # @param base_url [String] The base url for the request. - # @param max_retries [Integer] The number of times to retry a failed request, defaults to 2. - # @param timeout [Float] The timeout for the request, defaults to 60.0 seconds. - # @param headers [Hash] The headers for the request. - # @param overridable_headers [Array] The names of the client-level headers a request - # may replace via `additional_headers`. Holds the API's global headers; SDK metadata and - # auth headers are absent from it and so stay protected. - # @param auth_provider [Object, nil] An optional auth provider responding to - # `auth_headers`. When present its headers are resolved on every request so - # token-based schemes (e.g. OAuth) can refresh an expired token mid-session. - def initialize(base_url:, max_retries: 2, timeout: 60.0, headers: {}, overridable_headers: [], auth_provider: nil) - @base_url = base_url - @max_retries = max_retries - @timeout = timeout - @auth_provider = auth_provider - @default_headers = { - "X-Fern-Language": "Ruby", - "X-Fern-SDK-Name": "vitableconnect", - "X-Fern-SDK-Version": "0.0.1" - }.merge(headers) - @overridable_headers = overridable_headers.to_set { |name| name.to_s.downcase } - end - - # @param request [VitableConnect::Internal::Http::BaseRequest] The HTTP request. - # @return [HTTP::Response] The HTTP response. - def send(request) - url = build_url(request) - # Resolve auth headers once per request (not per retry) so token-based - # providers refresh at most once here; static providers are cheap. - auth_headers = resolve_auth_headers - attempt = 0 - response = nil - - loop do - http_request = build_http_request( - url:, - method: request.method, - headers: request.encode_headers(protected_keys: protected_header_keys + auth_headers.keys), - body: request.encode_body, - auth_headers: auth_headers - ) - - conn = connect(url) - conn.open_timeout = @timeout - conn.read_timeout = @timeout - conn.write_timeout = @timeout - conn.continue_timeout = @timeout - - response = conn.request(http_request) - - break unless should_retry?(response, attempt) - - delay = retry_delay(response, attempt) - sleep(delay) - attempt += 1 - end - - response - end - - # The client-level header names that `additional_headers` must not replace: every default - # header except the API's global headers, which are overridable per request. - # @return [Array] The protected header names. - def protected_header_keys - return @default_headers.keys if @overridable_headers.empty? - - @default_headers.keys.reject { |name| @overridable_headers.include?(name.to_s.downcase) } - end - - # Determines if a request should be retried based on the response status code. - # @param response [Net::HTTPResponse] The HTTP response. - # @param attempt [Integer] The current retry attempt (0-indexed). - # @return [Boolean] Whether the request should be retried. - def should_retry?(response, attempt) - return false if attempt >= @max_retries - - status = response.code.to_i - RETRYABLE_STATUSES.include?(status) - end - - # Calculates the delay before the next retry attempt using exponential backoff with jitter. - # Respects Retry-After header if present. - # @param response [Net::HTTPResponse] The HTTP response. - # @param attempt [Integer] The current retry attempt (0-indexed). - # @return [Float] The delay in seconds before the next retry. - def retry_delay(response, attempt) - # Check for Retry-After header (can be seconds or HTTP date) - retry_after = response["Retry-After"] - if retry_after - delay = parse_retry_after(retry_after) - return [delay, MAX_RETRY_DELAY].min if delay&.positive? - end - - # Exponential backoff with jitter: base_delay * 2^attempt - base_delay = INITIAL_RETRY_DELAY * (2**attempt) - add_jitter([base_delay, MAX_RETRY_DELAY].min) - end - - # Parses the Retry-After header value. - # @param value [String] The Retry-After header value (seconds or HTTP date). - # @return [Float, nil] The delay in seconds, or nil if parsing fails. - def parse_retry_after(value) - # Try parsing as integer (seconds) - seconds = Integer(value, exception: false) - return seconds.to_f if seconds - - # Try parsing as HTTP date - begin - retry_time = Time.httpdate(value) - delay = retry_time - Time.now - delay.positive? ? delay : nil - rescue ArgumentError - nil - end - end - - # Adds random jitter to a delay value. - # @param delay [Float] The base delay in seconds. - # @return [Float] The delay with jitter applied. - def add_jitter(delay) - jitter = delay * JITTER_FACTOR * (rand - 0.5) * 2 - [delay + jitter, 0].max - end - - LOCALHOST_HOSTS = %w[localhost 127.0.0.1 [::1]].freeze - - # @param request [VitableConnect::Internal::Http::BaseRequest] The HTTP request. - # @return [URI::Generic] The URL. - def build_url(request) - encoded_query = request.encode_query - - # If the path is already an absolute URL, use it directly - if request.path.start_with?("http://", "https://") - url = request.path - url = "#{url}?#{encode_query(encoded_query)}" if encoded_query&.any? - parsed = URI.parse(url) - validate_https!(parsed) - return parsed - end - - path = request.path.start_with?("/") ? request.path[1..] : request.path - base = request.base_url || @base_url - url = "#{base.chomp("/")}/#{path}" - url = "#{url}?#{encode_query(encoded_query)}" if encoded_query&.any? - parsed = URI.parse(url) - validate_https!(parsed) - parsed - end - - # Raises if the URL uses http:// for a non-localhost host, which would - # send authentication credentials in plaintext. - # @param url [URI::Generic] The parsed URL. - def validate_https!(url) - return if url.scheme != "http" - return if LOCALHOST_HOSTS.include?(url.host) - - raise ArgumentError, - "Refusing to send request to non-HTTPS URL: #{url}. " \ - "HTTP is only allowed for localhost. Use HTTPS or pass a localhost URL." - end - - # Resolves the auth headers to send with the next request. Delegates to the - # configured auth provider (if any) on every call so that token-based - # providers (e.g. OAuth client-credentials) can refresh an expired token - # before the request is sent. Returns an empty hash when no provider is set, - # which keeps the api-key / basic / bearer / no-auth paths unchanged. - # @return [Hash] The auth headers for the current request. - def resolve_auth_headers - return {} if @auth_provider.nil? - - @auth_provider.auth_headers - end - - # @param url [URI::Generic] The url to the resource. - # @param method [String] The HTTP method to use. - # @param headers [Hash] The headers for the request. - # @param body [String, nil] The body for the request. - # @param auth_headers [Hash] The auth headers resolved for this request. These - # take precedence over the static default headers but not over per-request - # headers, mirroring the previous baked-header precedence. - # @return [HTTP::Request] The HTTP request. - def build_http_request(url:, method:, headers: {}, body: nil, auth_headers: {}) - request = Net::HTTPGenericRequest.new( - method, - !body.nil?, - method != "HEAD", - url - ) - - request_headers = @default_headers.merge(auth_headers).merge(headers) - request_headers.each { |name, value| request[name] = value } - request.body = body if body - - # Net::HTTP disables its transparent gzip/deflate decoding as soon as an - # Accept-Encoding header is set explicitly on the request. Re-enable it so - # that compressed response bodies are still inflated. - request.extend(DecodeContent) if request_headers.keys.any? { |name| name.to_s.casecmp("accept-encoding").zero? } - - request - end - - # Keeps Net::HTTP's transparent gzip/deflate response decoding enabled - # even when an Accept-Encoding header is set explicitly on the request. - # @api private - module DecodeContent - def decode_content # rubocop:disable Naming/PredicateMethod - true - end - end - - # @param query [Hash] The query for the request. - # @return [String, nil] The encoded query. - def encode_query(query) - query.to_h.empty? ? nil : URI.encode_www_form(query) - end - - # @param url [URI::Generic] The url to connect to. - # @return [Net::HTTP] The HTTP connection. - def connect(url) - is_https = (url.scheme == "https") - - port = if url.port - url.port - elsif is_https - Net::HTTP.https_default_port - else - Net::HTTP.http_default_port - end - - http = Net::HTTP.new(url.host, port) - http.use_ssl = is_https - http.verify_mode = OpenSSL::SSL::VERIFY_PEER if is_https - # NOTE: We handle retries at the application level with HTTP status code awareness, - # so we set max_retries to 0 to disable Net::HTTP's built-in network-level retries. - http.max_retries = 0 - http - end - - # @return [String] - def inspect - "#<#{self.class.name}:0x#{object_id.to_s(16)} @base_url=#{@base_url.inspect}>" - end - end - end - end -end diff --git a/lib/VitableConnect/internal/iterators/cursor_item_iterator.rb b/lib/VitableConnect/internal/iterators/cursor_item_iterator.rb deleted file mode 100644 index 835c0ac..0000000 --- a/lib/VitableConnect/internal/iterators/cursor_item_iterator.rb +++ /dev/null @@ -1,28 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Internal - class CursorItemIterator < ItemIterator - # Instantiates a CursorItemIterator, an Enumerable class which wraps calls to a cursor-based paginated API and yields individual items from it. - # - # @param initial_cursor [String] The initial cursor to use when iterating, if any. - # @param cursor_field [Symbol] The field in API responses to extract the next cursor from. - # @param item_field [Symbol] The field in API responses to extract the items to iterate over. - # @param block [Proc] A block which is responsible for receiving a cursor to use and returning the given page from the API. - # @return [VitableConnect::Internal::CursorItemIterator] - def initialize(initial_cursor:, cursor_field:, item_field:, &) - super() - @item_field = item_field - @page_iterator = CursorPageIterator.new(initial_cursor:, cursor_field:, &) - @page = nil - end - - # Returns the CursorPageIterator mediating access to the underlying API. - # - # @return [VitableConnect::Internal::CursorPageIterator] - def pages - @page_iterator - end - end - end -end diff --git a/lib/VitableConnect/internal/iterators/cursor_page_iterator.rb b/lib/VitableConnect/internal/iterators/cursor_page_iterator.rb deleted file mode 100644 index f36ea5c..0000000 --- a/lib/VitableConnect/internal/iterators/cursor_page_iterator.rb +++ /dev/null @@ -1,63 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Internal - class CursorPageIterator - include Enumerable - - # The raw HTTP response from the most recent page response. - # @return [Net::HTTPResponse, nil] - attr_reader :http_response - - # Instantiates a CursorPageIterator, an Enumerable class which wraps calls to a cursor-based paginated API and yields pages of items. - # - # @param initial_cursor [String] The initial cursor to use when iterating, if any. - # @param cursor_field [Symbol] The name of the field in API responses to extract the next cursor from. - # @param block [Proc] A block which is responsible for receiving a cursor to use and returning the given page from the API. - # The block should return a two-element array: [parsed_page, raw_http_response]. - # @return [VitableConnect::Internal::CursorPageIterator] - def initialize(initial_cursor:, cursor_field:, &block) - @need_initial_load = initial_cursor.nil? - @cursor = initial_cursor - @cursor_field = cursor_field - @get_next_page = block - @http_response = nil - end - - # Iterates over each page returned by the API. - # - # @param block [Proc] The block which each retrieved page is yielded to. - # @return [NilClass] - def each(&block) - while (page = next_page) - block.call(page) - end - end - - # Whether another page will be available from the API. - # - # @return [Boolean] - def next? - @need_initial_load || !@cursor.nil? - end - - # Retrieves the next page from the API. - # - # @return [Object, nil] - def next_page - return if !@need_initial_load && @cursor.nil? - - @need_initial_load = false - result = @get_next_page.call(@cursor) - if result.is_a?(Array) - fetched_page, raw_response = result - @http_response = raw_response - else - fetched_page = result - end - @cursor = fetched_page.send(@cursor_field) - fetched_page - end - end - end -end diff --git a/lib/VitableConnect/internal/iterators/item_iterator.rb b/lib/VitableConnect/internal/iterators/item_iterator.rb deleted file mode 100644 index 7e980ce..0000000 --- a/lib/VitableConnect/internal/iterators/item_iterator.rb +++ /dev/null @@ -1,65 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Internal - class ItemIterator - include Enumerable - - # The raw HTTP response from the most recent page response. - # @return [Net::HTTPResponse, nil] - def http_response - @page_iterator&.http_response - end - - # Iterates over each item returned by the API. - # - # @param block [Proc] The block which each retrieved item is yielded to. - # @return [NilClass] - def each(&block) - while (item = next_element) - block.call(item) - end - end - - # Whether another item will be available from the API. - # - # @return [Boolean] - def next? - load_next_page if @page.nil? - return false if @page.nil? - - return true if any_items_in_cached_page? - - load_next_page - any_items_in_cached_page? - end - - # Retrieves the next item from the API. - def next_element - item = next_item_from_cached_page - return item if item - - load_next_page - next_item_from_cached_page - end - - private - - def next_item_from_cached_page - return unless @page - - @page.send(@item_field).shift - end - - def any_items_in_cached_page? - return false unless @page - - !@page.send(@item_field).empty? - end - - def load_next_page - @page = @page_iterator.next_page - end - end - end -end diff --git a/lib/VitableConnect/internal/iterators/offset_item_iterator.rb b/lib/VitableConnect/internal/iterators/offset_item_iterator.rb deleted file mode 100644 index 3ff6e18..0000000 --- a/lib/VitableConnect/internal/iterators/offset_item_iterator.rb +++ /dev/null @@ -1,30 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Internal - class OffsetItemIterator < ItemIterator - # Instantiates an OffsetItemIterator, an Enumerable class which wraps calls to an offset-based paginated API and yields the individual items from it. - # - # @param initial_page [Integer] The initial page or offset to start from when iterating. - # @param item_field [Symbol] The name of the field in API responses to extract the items to iterate over. - # @param has_next_field [Symbol] The name of the field in API responses containing a boolean of whether another page exists. - # @param step [Boolean] If true, treats the page number as a true offset (i.e. increments the page number by the number of items returned from each call rather than just 1) - # @param block [Proc] A block which is responsible for receiving a page number to use and returning the given page from the API. - # - # @return [VitableConnect::Internal::OffsetItemIterator] - def initialize(initial_page:, item_field:, has_next_field:, step:, &) - super() - @item_field = item_field - @page_iterator = OffsetPageIterator.new(initial_page:, item_field:, has_next_field:, step:, &) - @page = nil - end - - # Returns the OffsetPageIterator that is mediating access to the underlying API. - # - # @return [VitableConnect::Internal::OffsetPageIterator] - def pages - @page_iterator - end - end - end -end diff --git a/lib/VitableConnect/internal/iterators/offset_page_iterator.rb b/lib/VitableConnect/internal/iterators/offset_page_iterator.rb deleted file mode 100644 index acb8815..0000000 --- a/lib/VitableConnect/internal/iterators/offset_page_iterator.rb +++ /dev/null @@ -1,103 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Internal - class OffsetPageIterator - include Enumerable - - # The raw HTTP response from the most recent page response. - # @return [Net::HTTPResponse, nil] - attr_reader :http_response - - # Instantiates an OffsetPageIterator, an Enumerable class which wraps calls to an offset-based paginated API and yields pages of items from it. - # - # @param initial_page [Integer] The initial page to use when iterating, if any. - # @param item_field [Symbol] The field to pull the list of items to iterate over. - # @param has_next_field [Symbol] The field to pull the boolean of whether a next page exists from, if any. - # @param step [Boolean] If true, treats the page number as a true offset (i.e. increments the page number by the number of items returned from each call rather than just 1) - # @param block [Proc] A block which is responsible for receiving a page number to use and returning the given page from the API. - # The block should return a two-element array: [parsed_page, raw_http_response]. - # @return [VitableConnect::Internal::OffsetPageIterator] - def initialize(initial_page:, item_field:, has_next_field:, step:, &block) - @page_number = initial_page || (step ? 0 : 1) - @item_field = item_field - @has_next_field = has_next_field - @step = step - @get_next_page = block - - # A cache of whether the API has another page, if it gives us that information... - @next_page = nil - # ...or the actual next page, preloaded, if it doesn't. - @has_next_page = nil - - @http_response = nil - end - - # Iterates over each page returned by the API. - # - # @param block [Proc] The block which each retrieved page is yielded to. - # @return [NilClass] - def each(&block) - while (page = next_page) - block.call(page) - end - end - - # Whether another page will be available from the API. - # - # @return [Boolean] - def next? - return @has_next_page unless @has_next_page.nil? - return true if @next_page - - fetched_page = fetch_page(@page_number) - fetched_page_items = fetched_page&.send(@item_field) - if fetched_page_items.nil? || fetched_page_items.empty? - @has_next_page = false - else - @next_page = fetched_page - true - end - end - - # Returns the next page from the API. - def next_page - return nil if @page_number.nil? - - if @next_page - this_page = @next_page - @next_page = nil - else - this_page = fetch_page(@page_number) - end - - @has_next_page = this_page&.send(@has_next_field) if @has_next_field - - items = this_page.send(@item_field) - if items.nil? || items.empty? - @page_number = nil - return nil - elsif @step - @page_number += items.length - else - @page_number += 1 - end - - this_page - end - - private - - def fetch_page(page_number) - result = @get_next_page.call(page_number) - if result.is_a?(Array) - fetched_page, raw_response = result - @http_response = raw_response - fetched_page - else - result - end - end - end - end -end diff --git a/lib/VitableConnect/internal/json/request.rb b/lib/VitableConnect/internal/json/request.rb deleted file mode 100644 index eab7c21..0000000 --- a/lib/VitableConnect/internal/json/request.rb +++ /dev/null @@ -1,41 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Internal - module JSON - # @api private - class Request < VitableConnect::Internal::Http::BaseRequest - attr_reader :body - - # @param base_url [String] The base URL for the request - # @param path [String] The path for the request - # @param method [Symbol] The HTTP method for the request (:get, :post, etc.) - # @param headers [Hash] Additional headers for the request (optional) - # @param query [Hash] Query parameters for the request (optional) - # @param body [Object, nil] The JSON request body (optional) - # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}, nil] - def initialize(base_url:, path:, method:, headers: {}, query: {}, body: nil, request_options: {}) - super(base_url:, path:, method:, headers:, query:, request_options:) - - @body = body - end - - # @return [Hash] The encoded HTTP request headers. - # @param protected_keys [Array] Header keys set by the SDK client (e.g. auth, metadata) - # that must not be overridden by additional_headers from request_options. - def encode_headers(protected_keys: []) - sdk_headers = { - "Content-Type" => "application/json", - "Accept" => "application/json" - }.merge(@headers) - merge_additional_headers(sdk_headers, protected_keys:) - end - - # @return [String, nil] The encoded HTTP request body. - def encode_body - @body.nil? ? nil : ::JSON.generate(@body) - end - end - end - end -end diff --git a/lib/VitableConnect/internal/json/serializable.rb b/lib/VitableConnect/internal/json/serializable.rb deleted file mode 100644 index 272ffe2..0000000 --- a/lib/VitableConnect/internal/json/serializable.rb +++ /dev/null @@ -1,25 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Internal - module JSON - module Serializable - # Loads data from JSON into its deserialized form - # - # @param str [String] Raw JSON to load into an object - # @return [Object] - def load(str) - raise NotImplementedError - end - - # Dumps data from its deserialized form into JSON - # - # @param value [Object] The deserialized value - # @return [String] - def dump(value) - raise NotImplementedError - end - end - end - end -end diff --git a/lib/VitableConnect/internal/multipart/multipart_encoder.rb b/lib/VitableConnect/internal/multipart/multipart_encoder.rb deleted file mode 100644 index 14b9204..0000000 --- a/lib/VitableConnect/internal/multipart/multipart_encoder.rb +++ /dev/null @@ -1,141 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Internal - module Multipart - # Encodes parameters into a `multipart/form-data` payload as described by RFC - # 2388: - # - # https://tools.ietf.org/html/rfc2388 - # - # This is most useful for transferring file-like objects. - # - # Parameters should be added with `#encode`. When ready, use `#body` to get - # the encoded result and `#content_type` to get the value that should be - # placed in the `Content-Type` header of a subsequent request (which includes - # a boundary value). - # - # This abstraction is heavily inspired by Stripe's multipart/form-data implementation, - # which can be found here: - # - # https://github.com/stripe/stripe-ruby/blob/ca00b676f04ac421cf5cb5ff0325f243651677b6/lib/stripe/multipart_encoder.rb#L18 - # - # @api private - class Encoder - CONTENT_TYPE = "multipart/form-data" - CRLF = "\r\n" - - attr_reader :boundary, :body - - def initialize - # Chose the same number of random bytes that Go uses in its standard - # library implementation. Easily enough entropy to ensure that it won't - # be present in a file we're sending. - @boundary = SecureRandom.hex(30) - - @body = String.new - @closed = false - @first_field = true - end - - # Gets the content type string including the boundary. - # - # @return [String] The content type with boundary - def content_type - "#{CONTENT_TYPE}; boundary=#{@boundary}" - end - - # Encode the given FormData object into a multipart/form-data payload. - # - # @param form_data [FormData] The form data to encode - # @return [String] The encoded body. - def encode(form_data) - return "" if form_data.parts.empty? - - form_data.parts.each do |part| - write_part(part) - end - close - - @body - end - - # Writes a FormDataPart to the encoder. - # - # @param part [FormDataPart] The part to write - # @return [nil] - def write_part(part) - raise "Cannot write to closed encoder" if @closed - - write_field( - name: part.name, - data: part.contents, - filename: part.filename, - headers: part.headers - ) - - nil - end - - # Writes a field to the encoder. - # - # @param name [String] The field name - # @param data [String] The field data - # @param filename [String, nil] Optional filename - # @param headers [Hash, nil] Optional additional headers - # @return [nil] - def write_field(name:, data:, filename: nil, headers: nil) - raise "Cannot write to closed encoder" if @closed - - if @first_field - @first_field = false - else - @body << CRLF - end - - @body << "--#{@boundary}#{CRLF}" - @body << %(Content-Disposition: form-data; name="#{escape(name.to_s)}") - @body << %(; filename="#{escape(filename)}") if filename - @body << CRLF - - if headers - headers.each do |key, value| - @body << "#{key}: #{value}#{CRLF}" - end - elsif filename - # Default content type for files. - @body << "Content-Type: application/octet-stream#{CRLF}" - end - - @body << CRLF - @body << data.to_s - - nil - end - - # Finalizes the encoder by writing the final boundary. - # - # @return [nil] - def close - raise "Encoder already closed" if @closed - - @body << CRLF - @body << "--#{@boundary}--" - @closed = true - - nil - end - - private - - # Escapes quotes for use in header values and replaces line breaks with spaces. - # - # @param str [String] The string to escape - # @return [String] The escaped string - def escape(str) - str.to_s.gsub('"', "%22").tr("\n", " ").tr("\r", " ") - end - end - end - end -end diff --git a/lib/VitableConnect/internal/multipart/multipart_form_data.rb b/lib/VitableConnect/internal/multipart/multipart_form_data.rb deleted file mode 100644 index 0ab2e36..0000000 --- a/lib/VitableConnect/internal/multipart/multipart_form_data.rb +++ /dev/null @@ -1,78 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Internal - module Multipart - # @api private - class FormData - # @return [Array] The parts in this multipart form data. - attr_reader :parts - - # @return [Encoder] The encoder for this multipart form data. - private attr_reader :encoder - - def initialize - @encoder = Encoder.new - @parts = [] - end - - # Adds a new part to the multipart form data. - # - # @param name [String] The name of the form field - # @param value [String, Integer, Float, Boolean, #read] The value of the field - # @param content_type [String, nil] Optional content type - # @return [self] Returns self for chaining - def add(name:, value:, content_type: nil) - headers = content_type ? { "Content-Type" => content_type } : nil - add_part(FormDataPart.new(name:, value:, headers:)) - end - - # Adds a file to the multipart form data. - # - # @param name [String] The name of the form field - # @param file [#read] The file or readable object - # @param filename [String, nil] Optional filename (defaults to basename of path for File objects) - # @param content_type [String, nil] Optional content type (e.g. "image/png") - # @return [self] Returns self for chaining - def add_file(name:, file:, filename: nil, content_type: nil) - headers = content_type ? { "Content-Type" => content_type } : nil - filename ||= filename_for(file) - add_part(FormDataPart.new(name:, value: file, filename:, headers:)) - end - - # Adds a pre-created part to the multipart form data. - # - # @param part [FormDataPart] The part to add - # @return [self] Returns self for chaining - def add_part(part) - @parts << part - self - end - - # Gets the content type string including the boundary. - # - # @return [String] The content type with boundary. - def content_type - @encoder.content_type - end - - # Encode the multipart form data into a multipart/form-data payload. - # - # @return [String] The encoded body. - def encode - @encoder.encode(self) - end - - private - - def filename_for(file) - if file.is_a?(::File) || file.respond_to?(:path) - ::File.basename(file.path) - elsif file.respond_to?(:name) - file.name - end - end - end - end - end -end diff --git a/lib/VitableConnect/internal/multipart/multipart_form_data_part.rb b/lib/VitableConnect/internal/multipart/multipart_form_data_part.rb deleted file mode 100644 index a503adc..0000000 --- a/lib/VitableConnect/internal/multipart/multipart_form_data_part.rb +++ /dev/null @@ -1,51 +0,0 @@ -# frozen_string_literal: true - -require "securerandom" - -module VitableConnect - module Internal - module Multipart - # @api private - class FormDataPart - attr_reader :name, :contents, :filename, :headers - - # @param name [String] The name of the form field - # @param value [String, Integer, Float, Boolean, File, #read] The value of the field - # @param filename [String, nil] Optional filename for file uploads - # @param headers [Hash, nil] Optional additional headers - def initialize(name:, value:, filename: nil, headers: nil) - @name = name - @contents = convert_to_content(value) - @filename = filename - @headers = headers - end - - # Converts the part to a hash suitable for serialization. - # - # @return [Hash] A hash representation of the part - def to_hash - result = { - name: @name, - contents: @contents - } - result[:filename] = @filename if @filename - result[:headers] = @headers if @headers - result - end - - private - - # Converts various types of values to a content representation - # @param value [String, Integer, Float, Boolean, #read] The value to convert - # @return [String] The string representation of the value - def convert_to_content(value) - if value.respond_to?(:read) - value.read - else - value.to_s - end - end - end - end - end -end diff --git a/lib/VitableConnect/internal/multipart/multipart_request.rb b/lib/VitableConnect/internal/multipart/multipart_request.rb deleted file mode 100644 index 2eebde5..0000000 --- a/lib/VitableConnect/internal/multipart/multipart_request.rb +++ /dev/null @@ -1,40 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Internal - module Multipart - # @api private - class Request < VitableConnect::Internal::Http::BaseRequest - attr_reader :body - - # @param base_url [String] The base URL for the request - # @param path [String] The path for the request - # @param method [Symbol] The HTTP method for the request (:get, :post, etc.) - # @param headers [Hash] Additional headers for the request (optional) - # @param query [Hash] Query parameters for the request (optional) - # @param body [MultipartFormData, nil] The multipart form data for the request (optional) - # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}, nil] - def initialize(base_url:, path:, method:, headers: {}, query: {}, body: nil, request_options: {}) - super(base_url:, path:, method:, headers:, query:, request_options:) - - @body = body - end - - # @return [Hash] The encoded HTTP request headers. - # @param protected_keys [Array] Header keys set by the SDK client (e.g. auth, metadata) - # that must not be overridden by additional_headers from request_options. - def encode_headers(protected_keys: []) - sdk_headers = { - "Content-Type" => @body.content_type - }.merge(@headers) - merge_additional_headers(sdk_headers, protected_keys:) - end - - # @return [String, nil] The encoded HTTP request body. - def encode_body - @body&.encode - end - end - end - end -end diff --git a/lib/VitableConnect/internal/types/array.rb b/lib/VitableConnect/internal/types/array.rb deleted file mode 100644 index 9ec80e9..0000000 --- a/lib/VitableConnect/internal/types/array.rb +++ /dev/null @@ -1,47 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Internal - module Types - # An array of a specific type - class Array - include VitableConnect::Internal::Types::Type - - attr_reader :type - - class << self - # Instantiates a new `Array` of a given type - # - # @param type [Object] The member type of this array - # - # @return [VitableConnect::Internal::Types::Array] - def [](type) - new(type) - end - end - - # @api private - def initialize(type) - @type = type - end - - # Coerces a value into this array - # - # @param value [Object] - # @option strict [Boolean] - # @return [::Array] - def coerce(value, strict: strict?) - unless value.is_a?(::Array) - raise Errors::TypeError, "cannot coerce `#{value.class}` to Array<#{type}>" if strict - - return value - end - - value.map do |element| - Utils.coerce(type, element, strict: strict) - end - end - end - end - end -end diff --git a/lib/VitableConnect/internal/types/boolean.rb b/lib/VitableConnect/internal/types/boolean.rb deleted file mode 100644 index 70c1e0b..0000000 --- a/lib/VitableConnect/internal/types/boolean.rb +++ /dev/null @@ -1,34 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Internal - module Types - module Boolean - extend VitableConnect::Internal::Types::Union - - member TrueClass - member FalseClass - - # Overrides the base coercion method for enums to allow integer and string values to become booleans - # - # @param value [Object] - # @option strict [Boolean] - # @return [Object] - def self.coerce(value, strict: strict?) - case value - when TrueClass, FalseClass - return value - when Integer - return value == 1 - when String - return %w[1 true].include?(value) - end - - raise Errors::TypeError, "cannot coerce `#{value.class}` to Boolean" if strict - - value - end - end - end - end -end diff --git a/lib/VitableConnect/internal/types/enum.rb b/lib/VitableConnect/internal/types/enum.rb deleted file mode 100644 index 9453178..0000000 --- a/lib/VitableConnect/internal/types/enum.rb +++ /dev/null @@ -1,56 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Internal - module Types - # Module for defining enums - module Enum - include Type - - # @api private - # - # @return [Array] - def values - @values ||= constants.map { |c| const_get(c) } - end - - # @api private - def finalize! - values - end - - # @api private - def strict? - @strict ||= false - end - - # @api private - def strict! - @strict = true - end - - def coerce(value, strict: strict?) - coerced_value = Utils.coerce(Symbol, value) - - return coerced_value if values.include?(coerced_value) - - raise Errors::TypeError, "`#{value}` not in enum #{self}" if strict - - value - end - - # Parse JSON string and coerce to the enum value - # - # @param str [String] JSON string to parse - # @return [String] The enum value - def load(str) - coerce(::JSON.parse(str)) - end - - def inspect - "#{name}[#{values.join(", ")}]" - end - end - end - end -end diff --git a/lib/VitableConnect/internal/types/hash.rb b/lib/VitableConnect/internal/types/hash.rb deleted file mode 100644 index bfa4c19..0000000 --- a/lib/VitableConnect/internal/types/hash.rb +++ /dev/null @@ -1,36 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Internal - module Types - class Hash - include Type - - attr_reader :key_type, :value_type - - class << self - def [](key_type, value_type) - new(key_type, value_type) - end - end - - def initialize(key_type, value_type) - @key_type = key_type - @value_type = value_type - end - - def coerce(value, strict: strict?) - unless value.is_a?(::Hash) - raise Errors::TypeError, "not hash" if strict - - return value - end - - value.to_h do |k, v| - [Utils.coerce(key_type, k, strict: strict), Utils.coerce(value_type, v, strict: strict)] - end - end - end - end - end -end diff --git a/lib/VitableConnect/internal/types/model.rb b/lib/VitableConnect/internal/types/model.rb deleted file mode 100644 index 7c45845..0000000 --- a/lib/VitableConnect/internal/types/model.rb +++ /dev/null @@ -1,208 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Internal - module Types - # @abstract - # - # An abstract model that all data objects will inherit from - class Model - include Type - - class << self - # The defined fields for this model - # - # @api private - # - # @return [Hash] - def fields - @fields ||= if self < VitableConnect::Internal::Types::Model - superclass.fields.dup - else - {} - end - end - - # Any extra fields that have been created from instantiation - # - # @api private - # - # @return [Hash] - def extra_fields - @extra_fields ||= {} - end - - # Define a new field on this model - # - # @param name [Symbol] The name of the field - # @param type [Class] Type of the field - # @option optional [Boolean] If it is an optional field - # @option nullable [Boolean] If it is a nullable field - # @option api_name [Symbol, String] Name in the API of this field. When serializing/deserializing, will use - # this field name - # @return [void] - def field(name, type, optional: false, nullable: false, api_name: nil, default: nil) - add_field_definition(name: name, type: type, optional: optional, nullable: nullable, api_name: api_name, - default: default) - - define_accessor(name) - define_setter(name) - end - - # Define a new literal for this model - # - # @param name [Symbol] - # @param value [Object] - # @option api_name [Symbol, String] - # @return [void] - def literal(name, value, api_name: nil) - add_field_definition(name: name, type: value.class, optional: false, nullable: false, api_name: api_name, - value: value) - - define_accessor(name) - end - - # Adds a new field definition into the class's fields registry - # - # @api private - # - # @param name [Symbol] - # @param type [Class] - # @option optional [Boolean] - # @return [void] - private def add_field_definition(name:, type:, optional:, nullable:, api_name:, default: nil, value: nil) - fields[name.to_sym] = - Field.new(name: name, type: type, optional: optional, nullable: nullable, api_name: api_name, - value: value, default: default) - end - - # Adds a new field definition into the class's extra fields registry - # - # @api private - # - # @param name [Symbol] - # @param type [Class] - # @option required [Boolean] - # @option optional [Boolean] - # @return [void] - def add_extra_field_definition(name:, type:) - return if extra_fields.key?(name.to_sym) - - extra_fields[name.to_sym] = Field.new(name: name, type: type, optional: true, nullable: false) - - define_accessor(name) - define_setter(name) - end - - # @api private - private def define_accessor(name) - method_name = name.to_sym - - define_method(method_name) do - @data[name] - end - end - - # @api private - private def define_setter(name) - method_name = :"#{name}=" - - define_method(method_name) do |val| - @data[name] = val - end - end - - def coerce(value, strict: (respond_to?(:strict?) ? strict? : false)) # rubocop:disable Lint/UnusedMethodArgument - return value if value.is_a?(self) - - return value unless value.is_a?(::Hash) - - new(value) - end - - def load(str) - coerce(::JSON.parse(str, symbolize_names: true)) - end - - def ===(instance) - instance.class.ancestors.include?(self) - end - end - - # Creates a new instance of this model - # TODO: Should all this logic be in `#coerce` instead? - # - # @param values [Hash] - # @option strict [Boolean] - # @return [self] - def initialize(values = {}) - @data = {} - - values = Utils.symbolize_keys(values.dup) - - self.class.fields.each do |field_name, field| - value = values.delete(field.api_name.to_sym) || values.delete(field.api_name) || values.delete(field_name) - - field_value = value || (if field.literal? - field.value - elsif field.default - field.default - end) - - @data[field_name] = Utils.coerce(field.type, field_value) - end - - # Any remaining values in the input become extra fields - values.each do |name, value| - self.class.add_extra_field_definition(name: name, type: value.class) - - @data[name.to_sym] = value - end - end - - def to_h - result = self.class.fields.merge(self.class.extra_fields).each_with_object({}) do |(name, field), acc| - # If there is a value present in the data, use that value - # If there is a `nil` value present in the data, and it is optional but NOT nullable, exclude key altogether - # If there is a `nil` value present in the data, and it is optional and nullable, use the nil value - - value = @data[name] - - next if value.nil? && field.optional && !field.nullable - - if value.is_a?(::Array) - value = value.map { |item| item.respond_to?(:to_h) ? item.to_h : item } - elsif value.respond_to?(:to_h) - value = value.to_h - end - - acc[field.api_name] = value - end - - # Inject union discriminant if this instance was coerced from a discriminated union - # and the discriminant key is not already present in the result - discriminant_key = instance_variable_get(:@_fern_union_discriminant_key) - discriminant_value = instance_variable_get(:@_fern_union_discriminant_value) - result[discriminant_key] = discriminant_value if discriminant_key && discriminant_value && !result.key?(discriminant_key) - - result - end - - def ==(other) - self.class == other.class && to_h == other.to_h - end - - # @return [String] - def inspect - attrs = @data.map do |name, value| - field = self.class.fields[name] || self.class.extra_fields[name] - display_value = field&.sensitive? ? "[REDACTED]" : value.inspect - "#{name}=#{display_value}" - end - - "#<#{self.class.name}:0x#{object_id&.to_s(16)} #{attrs.join(" ")}>" - end - end - end - end -end diff --git a/lib/VitableConnect/internal/types/model/field.rb b/lib/VitableConnect/internal/types/model/field.rb deleted file mode 100644 index b0ca343..0000000 --- a/lib/VitableConnect/internal/types/model/field.rb +++ /dev/null @@ -1,38 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Internal - module Types - class Model - # Definition of a field on a model - class Field - SENSITIVE_FIELD_NAMES = %i[ - password secret token api_key apikey access_token refresh_token - client_secret client_id credential bearer authorization - ].freeze - - attr_reader :name, :type, :optional, :nullable, :api_name, :value, :default - - def initialize(name:, type:, optional: false, nullable: false, api_name: nil, value: nil, default: nil) - @name = name.to_sym - @type = type - @optional = optional - @nullable = nullable - @api_name = api_name || name.to_s - @value = value - @default = default - end - - def literal? - !value.nil? - end - - def sensitive? - SENSITIVE_FIELD_NAMES.include?(@name) || - SENSITIVE_FIELD_NAMES.any? { |sensitive| @name.to_s.include?(sensitive.to_s) } - end - end - end - end - end -end diff --git a/lib/VitableConnect/internal/types/type.rb b/lib/VitableConnect/internal/types/type.rb deleted file mode 100644 index a2359d9..0000000 --- a/lib/VitableConnect/internal/types/type.rb +++ /dev/null @@ -1,35 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Internal - module Types - # @abstract - module Type - include VitableConnect::Internal::JSON::Serializable - - # Coerces a value to this type - # - # @param value [unknown] - # @option strict [Boolean] If we should strictly coerce this value - def coerce(value, strict: strict?) - raise NotImplementedError - end - - # Returns if strictness is on for this type, defaults to `false` - # - # @return [Boolean] - def strict? - @strict ||= false - end - - # Enable strictness by default for this type - # - # @return [void] - def strict! - @strict = true - self - end - end - end - end -end diff --git a/lib/VitableConnect/internal/types/union.rb b/lib/VitableConnect/internal/types/union.rb deleted file mode 100644 index aaabcc9..0000000 --- a/lib/VitableConnect/internal/types/union.rb +++ /dev/null @@ -1,161 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Internal - module Types - # Define a union between two types - module Union - include VitableConnect::Internal::Types::Type - - def members - @members ||= [] - end - - # Add a member to this union - # - # @param type [Object] - # @option key [Symbol, String] - # @return [void] - def member(type, key: nil) - members.push([key, Utils.wrap_type(type)]) - self - end - - def type_member?(type) - members.any? { |_key, type_fn| type == type_fn.call } - end - - # Set the discriminant for this union - # - # @param key [Symbol, String] - # @return [void] - def discriminant(key) - @discriminant = key - end - - # @api private - private def discriminated? - !@discriminant.nil? - end - - # Check if value matches a type, handling type wrapper instances - # (Internal::Types::Hash and Internal::Types::Array instances) - # - # @param value [Object] - # @param member_type [Object] - # @return [Boolean] - private def type_matches?(value, member_type) - case member_type - when VitableConnect::Internal::Types::Hash - value.is_a?(::Hash) - when VitableConnect::Internal::Types::Array - value.is_a?(::Array) - when Class, Module - value.is_a?(member_type) - else - false - end - end - - # Resolves the type of a value to be one of the members - # - # @param value [Object] - # @return [Class] - private def resolve_member(value) - if discriminated? && value.is_a?(::Hash) - # Try both symbol and string keys for the discriminant - discriminant_value = value.fetch(@discriminant, nil) || value.fetch(@discriminant.to_s, nil) - - return if discriminant_value.nil? - - # Convert to string for consistent comparison - discriminant_str = discriminant_value.to_s - - # First try exact match - members_hash = members.to_h - result = members_hash[discriminant_str]&.call - return result if result - - # Try case-insensitive match as fallback - discriminant_lower = discriminant_str.downcase - matching_keys = members_hash.keys.select { |k| k.to_s.downcase == discriminant_lower } - - # Only use case-insensitive match if exactly one key matches (avoid ambiguity) - return members_hash[matching_keys.first]&.call if matching_keys.length == 1 - - nil - else - # First try exact type matching - result = members.find do |_key, mem| - member_type = Utils.unwrap_type(mem) - type_matches?(value, member_type) - end&.last&.call - - return result if result - - # For Hash values, try to coerce into Model member types - if value.is_a?(::Hash) - members.find do |_key, mem| - member_type = Utils.unwrap_type(mem) - # Check if member_type is a Model class - next unless member_type.is_a?(Class) && member_type <= Model - - # Try to coerce the hash into this model type with strict mode - begin - candidate = Utils.coerce(member_type, value, strict: true) - - # Validate that all required (non-optional) fields are present - # This ensures undiscriminated unions properly distinguish between member types - member_type.fields.each do |field_name, field| - raise Errors::TypeError, "Required field `#{field_name}` missing for union member #{member_type.name}" if candidate.instance_variable_get(:@data)[field_name].nil? && !field.optional - end - - true - rescue Errors::TypeError - false - end - end&.last&.call - end - end - end - - def coerce(value, strict: strict?) - type = resolve_member(value) - - unless type - return value unless strict - - if discriminated? - raise Errors::TypeError, - "value of type `#{value.class}` not member of union #{self}" - end - - raise Errors::TypeError, "could not resolve to member of union #{self}" - end - - coerced = Utils.coerce(type, value, strict: strict) - - # For discriminated unions, store the discriminant info on the coerced instance - # so it can be injected back during serialization (to_h) - if discriminated? && value.is_a?(::Hash) && coerced.is_a?(Model) - discriminant_value = value.fetch(@discriminant, nil) || value.fetch(@discriminant.to_s, nil) - if discriminant_value - coerced.instance_variable_set(:@_fern_union_discriminant_key, @discriminant.to_s) - coerced.instance_variable_set(:@_fern_union_discriminant_value, discriminant_value) - end - end - - coerced - end - - # Parse JSON string and coerce to the correct union member type - # - # @param str [String] JSON string to parse - # @return [Object] Coerced value matching a union member - def load(str) - coerce(::JSON.parse(str, symbolize_names: true)) - end - end - end - end -end diff --git a/lib/VitableConnect/internal/types/unknown.rb b/lib/VitableConnect/internal/types/unknown.rb deleted file mode 100644 index e49cd81..0000000 --- a/lib/VitableConnect/internal/types/unknown.rb +++ /dev/null @@ -1,15 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Internal - module Types - module Unknown - include VitableConnect::Internal::Types::Type - - def coerce(value) - value - end - end - end - end -end diff --git a/lib/VitableConnect/internal/types/utils.rb b/lib/VitableConnect/internal/types/utils.rb deleted file mode 100644 index d7e3f19..0000000 --- a/lib/VitableConnect/internal/types/utils.rb +++ /dev/null @@ -1,116 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Internal - module Types - # Utilities for dealing with and checking types - module Utils - # Wraps a type into a type function - # - # @param type [Proc, Object] - # @return [Proc] - def self.wrap_type(type) - case type - when Proc - type - else - -> { type } - end - end - - # Resolves a type or type function into a type - # - # @param type [Proc, Object] - # @return [Object] - def self.unwrap_type(type) - type.is_a?(Proc) ? type.call : type - end - - def self.coerce(target, value, strict: false) - type = unwrap_type(target) - - case type - in Array - case value - when ::Array - return type.coerce(value, strict: strict) - when Set, ::Hash - return coerce(type, value.to_a) - end - in Hash - case value - when ::Hash - return type.coerce(value, strict: strict) - when ::Array - return coerce(type, value.to_h) - end - in ->(t) { t <= NilClass } - return nil - in ->(t) { t <= String } - case value - when String, Symbol, Numeric, TrueClass, FalseClass - return value.to_s - end - in ->(t) { t <= Symbol } - case value - when Symbol, String - return value.to_sym - end - in ->(t) { t <= Integer } - case value - when Numeric, String, Time - return value.to_i - end - in ->(t) { t <= Float } - case value - when Numeric, Time, String - return value.to_f - end - in ->(t) { t <= Model } - case value - when type - return value - when ::Hash - return type.coerce(value, strict: strict) - end - in Module - case type - in ->(t) { - t.singleton_class.included_modules.include?(Enum) || - t.singleton_class.included_modules.include?(Union) - } - return type.coerce(value, strict: strict) - else - value # rubocop:disable Lint/Void - end - else - value # rubocop:disable Lint/Void - end - - raise Errors::TypeError, "cannot coerce value of type `#{value.class}` to `#{target}`" if strict - - value - end - - def self.symbolize_keys(hash) - hash.transform_keys(&:to_sym) - end - - # Converts camelCase keys to snake_case symbols - # This allows SDK methods to accept both snake_case and camelCase keys - # e.g., { refundMethod: ... } becomes { refund_method: ... } - # - # @param hash [Hash] - # @return [Hash] - def self.normalize_keys(hash) - hash.transform_keys do |key| - key_str = key.to_s - # Convert camelCase to snake_case - snake_case = key_str.gsub(/([a-z\d])([A-Z])/, '\1_\2').downcase - snake_case.to_sym - end - end - end - end - end -end diff --git a/lib/VitableConnect/members/client.rb b/lib/VitableConnect/members/client.rb deleted file mode 100644 index d31e924..0000000 --- a/lib/VitableConnect/members/client.rb +++ /dev/null @@ -1,385 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Members - class Client - # @param client [VitableConnect::Internal::Http::RawClient] - # - # @return [void] - def initialize(client:) - @client = client - end - - # Retrieves a member's profile by ID — identity, demographics, address, contact details, tobacco status, and - # profile status. Access is scoped to the authenticated principal; a member not visible to the caller returns a - # 404. - # - # @param request_options [Hash] - # @param params [Hash] - # @option request_options [String] :base_url - # @option request_options [Hash{String => Object}] :additional_headers - # @option request_options [Hash{String => Object}] :additional_query_parameters - # @option request_options [Hash{String => Object}] :additional_body_parameters - # @option request_options [Integer] :timeout_in_seconds - # @option params [VitableConnect::Types::MemberID] :member_id - # - # @example - # client.members.get(member_id: "mbr_abc123def456") - # - # @return [VitableConnect::Types::MemberResponse] - def get(request_options: {}, **params) - params = VitableConnect::Internal::Types::Utils.normalize_keys(params) - request = VitableConnect::Internal::JSON::Request.new( - base_url: request_options[:base_url], - method: "GET", - path: "v1/members/#{URI.encode_uri_component(params[:member_id].to_s)}", - request_options: request_options - ) - begin - response = @client.send(request) - rescue Net::HTTPRequestTimeout - raise VitableConnect::Errors::TimeoutError - end - code = response.code.to_i - if code.between?(200, 299) - VitableConnect::Types::MemberResponse.load(response.body) - else - error_class = VitableConnect::Errors::ResponseError.subclass_for_code(code) - raise error_class.new(response.body, code: code) - end - end - - # Lists a member's active legal dependents — name, relationship, date of birth, age, and sex at birth. Access is - # scoped to the authenticated principal; a member not visible to the caller returns a 404. - # - # @param request_options [Hash] - # @param params [Hash] - # @option request_options [String] :base_url - # @option request_options [Hash{String => Object}] :additional_headers - # @option request_options [Hash{String => Object}] :additional_query_parameters - # @option request_options [Hash{String => Object}] :additional_body_parameters - # @option request_options [Integer] :timeout_in_seconds - # @option params [VitableConnect::Types::MemberID] :member_id - # - # @example - # client.members.list_dependents(member_id: "mbr_abc123def456") - # - # @return [VitableConnect::Types::MemberDependentsResponse] - def list_dependents(request_options: {}, **params) - params = VitableConnect::Internal::Types::Utils.normalize_keys(params) - request = VitableConnect::Internal::JSON::Request.new( - base_url: request_options[:base_url], - method: "GET", - path: "v1/members/#{URI.encode_uri_component(params[:member_id].to_s)}/dependents", - request_options: request_options - ) - begin - response = @client.send(request) - rescue Net::HTTPRequestTimeout - raise VitableConnect::Errors::TimeoutError - end - code = response.code.to_i - if code.between?(200, 299) - VitableConnect::Types::MemberDependentsResponse.load(response.body) - else - error_class = VitableConnect::Errors::ResponseError.subclass_for_code(code) - raise error_class.new(response.body, code: code) - end - end - - # Lists a member's employment across every employer — the same employee record shape as the employer's employees - # list, plus the employer name. For an organization caller the rows are scoped to companies in that organization's - # book; a member (self/household) or Vitable Admin sees all employments. A member not visible to the caller - # returns a 404. - # - # @param request_options [Hash] - # @param params [Hash] - # @option request_options [String] :base_url - # @option request_options [Hash{String => Object}] :additional_headers - # @option request_options [Hash{String => Object}] :additional_query_parameters - # @option request_options [Hash{String => Object}] :additional_body_parameters - # @option request_options [Integer] :timeout_in_seconds - # @option params [VitableConnect::Types::MemberID] :member_id - # - # @example - # client.members.list_employments(member_id: "mbr_abc123def456") - # - # @return [VitableConnect::Types::MemberEmploymentsResponse] - def list_employments(request_options: {}, **params) - params = VitableConnect::Internal::Types::Utils.normalize_keys(params) - request = VitableConnect::Internal::JSON::Request.new( - base_url: request_options[:base_url], - method: "GET", - path: "v1/members/#{URI.encode_uri_component(params[:member_id].to_s)}/employments", - request_options: request_options - ) - begin - response = @client.send(request) - rescue Net::HTTPRequestTimeout - raise VitableConnect::Errors::TimeoutError - end - code = response.code.to_i - if code.between?(200, 299) - VitableConnect::Types::MemberEmploymentsResponse.load(response.body) - else - error_class = VitableConnect::Errors::ResponseError.subclass_for_code(code) - raise error_class.new(response.body, code: code) - end - end - - # Lists a member's benefit enrollments across every employer — benefit type and product, employer, carrier, plan, - # tier, employee deduction, employer contribution and total premium, the individual enrollment coverage boundary - # (`coverage_end`), the separate pre-effective cancellation boundary (`cancelled_date`), and the distinct benefit - # plan-year boundary (`plan_year_coverage_end`) used to determine whether the plan year itself has ended, the date - # the enrollment record was created (`issued_date`, the value Ops labels Issued on, reported for every row - # whatever the member answered), the window the member could answer in -- which never opens before the enrollment - # was issued, so a row issued mid-open-enrollment starts its window on its issue date -- whether a qualifying life - # event would currently be required for reissue under the product/open-enrollment rule, enrollment/open-enrollment - # window, and two statuses: `election_status` (what the member answered) and `policy_status` (what became of their - # coverage, null unless they enrolled). Every row includes a stable enrollment ID and the exact employer and - # benefit plan-year IDs used to fetch that row's plan-year detail. The full list is returned across all states so - # the client derives active plans (effective and upcoming) and the enrollment history from those per-row statuses. - # For an organization caller the rows are scoped to companies in that organization's book; a member - # (self/household) or Vitable Admin sees all enrollments. A member not visible to the caller returns a 404. - # - # @param request_options [Hash] - # @param params [Hash] - # @option request_options [String] :base_url - # @option request_options [Hash{String => Object}] :additional_headers - # @option request_options [Hash{String => Object}] :additional_query_parameters - # @option request_options [Hash{String => Object}] :additional_body_parameters - # @option request_options [Integer] :timeout_in_seconds - # @option params [VitableConnect::Types::MemberID] :member_id - # - # @example - # client.members.list_enrollments(member_id: "mbr_abc123def456") - # - # @return [VitableConnect::Types::MemberEnrollmentsResponse] - def list_enrollments(request_options: {}, **params) - params = VitableConnect::Internal::Types::Utils.normalize_keys(params) - request = VitableConnect::Internal::JSON::Request.new( - base_url: request_options[:base_url], - method: "GET", - path: "v1/members/#{URI.encode_uri_component(params[:member_id].to_s)}/enrollments", - request_options: request_options - ) - begin - response = @client.send(request) - rescue Net::HTTPRequestTimeout - raise VitableConnect::Errors::TimeoutError - end - code = response.code.to_i - if code.between?(200, 299) - VitableConnect::Types::MemberEnrollmentsResponse.load(response.body) - else - error_class = VitableConnect::Errors::ResponseError.subclass_for_code(code) - raise error_class.new(response.body, code: code) - end - end - - # Lists a member's household as a per-participant table — the account holder plus each active household member, - # with name, relationship, member type, date of birth, and household-admin flag. Access is scoped to the - # authenticated principal; a member not visible to the caller (or with no household) returns a 404. - # - # @param request_options [Hash] - # @param params [Hash] - # @option request_options [String] :base_url - # @option request_options [Hash{String => Object}] :additional_headers - # @option request_options [Hash{String => Object}] :additional_query_parameters - # @option request_options [Hash{String => Object}] :additional_body_parameters - # @option request_options [Integer] :timeout_in_seconds - # @option params [VitableConnect::Types::MemberID] :member_id - # - # @example - # client.members.get_household(member_id: "mbr_abc123def456") - # - # @return [VitableConnect::Types::HouseholdMembersResponse] - def get_household(request_options: {}, **params) - params = VitableConnect::Internal::Types::Utils.normalize_keys(params) - request = VitableConnect::Internal::JSON::Request.new( - base_url: request_options[:base_url], - method: "GET", - path: "v1/members/#{URI.encode_uri_component(params[:member_id].to_s)}/household", - request_options: request_options - ) - begin - response = @client.send(request) - rescue Net::HTTPRequestTimeout - raise VitableConnect::Errors::TimeoutError - end - code = response.code.to_i - if code.between?(200, 299) - VitableConnect::Types::HouseholdMembersResponse.load(response.body) - else - error_class = VitableConnect::Errors::ResponseError.subclass_for_code(code) - raise error_class.new(response.body, code: code) - end - end - - # Lists a member's benefit ID cards — card type (medical, dental, vision, or rx), employer, plan, provider - # network, claims payer, carrier contact details, and the disclaimers printed on the card. Medical, dental and - # vision cards come from the member's active digital benefit cards; the rx card from the member's Ventegra - # pharmacy benefit (omitted when the member has no free-medication coverage), which carries no plan, network, or - # carrier details. Access is scoped to the authenticated principal, and an organization caller sees only cards - # from employers in its book; a member not visible to the caller returns a 404. - # - # @param request_options [Hash] - # @param params [Hash] - # @option request_options [String] :base_url - # @option request_options [Hash{String => Object}] :additional_headers - # @option request_options [Hash{String => Object}] :additional_query_parameters - # @option request_options [Hash{String => Object}] :additional_body_parameters - # @option request_options [Integer] :timeout_in_seconds - # @option params [VitableConnect::Types::MemberID] :member_id - # - # @example - # client.members.list_id_cards(member_id: "mbr_abc123def456") - # - # @return [VitableConnect::Types::MemberDigitalBenefitCardsResponse] - def list_id_cards(request_options: {}, **params) - params = VitableConnect::Internal::Types::Utils.normalize_keys(params) - request = VitableConnect::Internal::JSON::Request.new( - base_url: request_options[:base_url], - method: "GET", - path: "v1/members/#{URI.encode_uri_component(params[:member_id].to_s)}/id-cards", - request_options: request_options - ) - begin - response = @client.send(request) - rescue Net::HTTPRequestTimeout - raise VitableConnect::Errors::TimeoutError - end - code = response.code.to_i - if code.between?(200, 299) - VitableConnect::Types::MemberDigitalBenefitCardsResponse.load(response.body) - else - error_class = VitableConnect::Errors::ResponseError.subclass_for_code(code) - raise error_class.new(response.body, code: code) - end - end - - # Lists a member's qualifying life events, including events already used for another enrollment. Returns all - # statuses by default; pass the status query param to filter to one (e.g. approved). Events are ordered newest - # submission first with stable paging. Custom text is present only when submitted and is otherwise null. A member - # not visible to the caller returns a 404. API keys and unbound access tokens have organization-wide access. - # Employer-bound tokens require employment at the bound employer, and employee-bound tokens require the exact - # employee-member relationship. Organization or scope mismatches return a 404 before pagination is validated. - # - # @param request_options [Hash] - # @param params [Hash] - # @option request_options [String] :base_url - # @option request_options [Hash{String => Object}] :additional_headers - # @option request_options [Hash{String => Object}] :additional_query_parameters - # @option request_options [Hash{String => Object}] :additional_body_parameters - # @option request_options [Integer] :timeout_in_seconds - # @option params [VitableConnect::Types::MemberID] :member_id - # @option params [Integer, nil] :limit - # @option params [Integer, nil] :page - # @option params [VitableConnect::Types::Status, nil] :status - # - # @example - # client.members.list_qualifying_life_events( - # member_id: "mbr_abc123def456", - # limit: 20, - # page: 1 - # ) - # - # @return [VitableConnect::Types::MemberQualifyingLifeEventListResponse] - def list_qualifying_life_events(request_options: {}, **params) - params = VitableConnect::Internal::Types::Utils.normalize_keys(params) - query_params = {} - query_params["limit"] = params[:limit] if params.key?(:limit) - query_params["page"] = params[:page] if params.key?(:page) - query_params["status"] = params[:status] if params.key?(:status) - - VitableConnect::Internal::OffsetItemIterator.new( - initial_page: query_params["page"], - item_field: :data, - has_next_field: nil, - step: false - ) do |next_page| - query_params["page"] = next_page - request = VitableConnect::Internal::JSON::Request.new( - base_url: request_options[:base_url], - method: "GET", - path: "v1/members/#{URI.encode_uri_component(params[:member_id].to_s)}/qualifying-life-events", - query: query_params, - request_options: request_options - ) - begin - response = @client.send(request) - rescue Net::HTTPRequestTimeout - raise VitableConnect::Errors::TimeoutError - end - code = response.code.to_i - if code.between?(200, 299) - parsed_response = VitableConnect::Types::MemberQualifyingLifeEventListResponse.load(response.body) - [parsed_response, response] - else - error_class = VitableConnect::Errors::ResponseError.subclass_for_code(code) - raise error_class.new(response.body, code: code) - end - end - end - - # Retrieves a paginated list of the members in the authenticated organization's book — identity, contact details, - # and address. The book covers members reached through an employer in the organization's book as well as members - # of a group it owns. Supports free-text search (name, email, phone number, or exact member id). - # - # @param request_options [Hash] - # @param params [Hash] - # @option request_options [String] :base_url - # @option request_options [Hash{String => Object}] :additional_headers - # @option request_options [Hash{String => Object}] :additional_query_parameters - # @option request_options [Hash{String => Object}] :additional_body_parameters - # @option request_options [Integer] :timeout_in_seconds - # @option params [Integer, nil] :limit - # @option params [Integer, nil] :page - # @option params [String, nil] :search - # - # @example - # client.members.list( - # limit: 20, - # page: 1 - # ) - # - # @return [VitableConnect::Types::MemberListResponse] - def list(request_options: {}, **params) - params = VitableConnect::Internal::Types::Utils.normalize_keys(params) - query_params = {} - query_params["limit"] = params[:limit] if params.key?(:limit) - query_params["page"] = params[:page] if params.key?(:page) - query_params["search"] = params[:search] if params.key?(:search) - - VitableConnect::Internal::OffsetItemIterator.new( - initial_page: query_params["page"], - item_field: :data, - has_next_field: nil, - step: false - ) do |next_page| - query_params["page"] = next_page - request = VitableConnect::Internal::JSON::Request.new( - base_url: request_options[:base_url], - method: "GET", - path: "v2/members", - query: query_params, - request_options: request_options - ) - begin - response = @client.send(request) - rescue Net::HTTPRequestTimeout - raise VitableConnect::Errors::TimeoutError - end - code = response.code.to_i - if code.between?(200, 299) - parsed_response = VitableConnect::Types::MemberListResponse.load(response.body) - [parsed_response, response] - else - error_class = VitableConnect::Errors::ResponseError.subclass_for_code(code) - raise error_class.new(response.body, code: code) - end - end - end - end - end -end diff --git a/lib/VitableConnect/members/types/get_household_members_request.rb b/lib/VitableConnect/members/types/get_household_members_request.rb deleted file mode 100644 index caed76c..0000000 --- a/lib/VitableConnect/members/types/get_household_members_request.rb +++ /dev/null @@ -1,11 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Members - module Types - class GetHouseholdMembersRequest < Internal::Types::Model - field :member_id, -> { String }, optional: false, nullable: false - end - end - end -end diff --git a/lib/VitableConnect/members/types/get_members_request.rb b/lib/VitableConnect/members/types/get_members_request.rb deleted file mode 100644 index e6edf89..0000000 --- a/lib/VitableConnect/members/types/get_members_request.rb +++ /dev/null @@ -1,11 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Members - module Types - class GetMembersRequest < Internal::Types::Model - field :member_id, -> { String }, optional: false, nullable: false - end - end - end -end diff --git a/lib/VitableConnect/members/types/list_dependents_members_request.rb b/lib/VitableConnect/members/types/list_dependents_members_request.rb deleted file mode 100644 index 9aee3fa..0000000 --- a/lib/VitableConnect/members/types/list_dependents_members_request.rb +++ /dev/null @@ -1,11 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Members - module Types - class ListDependentsMembersRequest < Internal::Types::Model - field :member_id, -> { String }, optional: false, nullable: false - end - end - end -end diff --git a/lib/VitableConnect/members/types/list_employments_members_request.rb b/lib/VitableConnect/members/types/list_employments_members_request.rb deleted file mode 100644 index b531cac..0000000 --- a/lib/VitableConnect/members/types/list_employments_members_request.rb +++ /dev/null @@ -1,11 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Members - module Types - class ListEmploymentsMembersRequest < Internal::Types::Model - field :member_id, -> { String }, optional: false, nullable: false - end - end - end -end diff --git a/lib/VitableConnect/members/types/list_enrollments_members_request.rb b/lib/VitableConnect/members/types/list_enrollments_members_request.rb deleted file mode 100644 index 98af428..0000000 --- a/lib/VitableConnect/members/types/list_enrollments_members_request.rb +++ /dev/null @@ -1,11 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Members - module Types - class ListEnrollmentsMembersRequest < Internal::Types::Model - field :member_id, -> { String }, optional: false, nullable: false - end - end - end -end diff --git a/lib/VitableConnect/members/types/list_id_cards_members_request.rb b/lib/VitableConnect/members/types/list_id_cards_members_request.rb deleted file mode 100644 index 65a7883..0000000 --- a/lib/VitableConnect/members/types/list_id_cards_members_request.rb +++ /dev/null @@ -1,11 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Members - module Types - class ListIDCardsMembersRequest < Internal::Types::Model - field :member_id, -> { String }, optional: false, nullable: false - end - end - end -end diff --git a/lib/VitableConnect/members/types/list_members_request.rb b/lib/VitableConnect/members/types/list_members_request.rb deleted file mode 100644 index b40f2bf..0000000 --- a/lib/VitableConnect/members/types/list_members_request.rb +++ /dev/null @@ -1,15 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Members - module Types - class ListMembersRequest < Internal::Types::Model - field :limit, -> { Integer }, optional: true, nullable: false - - field :page, -> { Integer }, optional: true, nullable: false - - field :search, -> { String }, optional: true, nullable: false - end - end - end -end diff --git a/lib/VitableConnect/members/types/list_qualifying_life_events_members_request.rb b/lib/VitableConnect/members/types/list_qualifying_life_events_members_request.rb deleted file mode 100644 index b8b637a..0000000 --- a/lib/VitableConnect/members/types/list_qualifying_life_events_members_request.rb +++ /dev/null @@ -1,17 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Members - module Types - class ListQualifyingLifeEventsMembersRequest < Internal::Types::Model - field :member_id, -> { String }, optional: false, nullable: false - - field :limit, -> { Integer }, optional: true, nullable: false - - field :page, -> { Integer }, optional: true, nullable: false - - field :status, -> { VitableConnect::Types::Status }, optional: true, nullable: false - end - end - end -end diff --git a/lib/VitableConnect/organizations/client.rb b/lib/VitableConnect/organizations/client.rb deleted file mode 100644 index 7f3981e..0000000 --- a/lib/VitableConnect/organizations/client.rb +++ /dev/null @@ -1,92 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Organizations - class Client - # @param client [VitableConnect::Internal::Http::RawClient] - # - # @return [void] - def initialize(client:) - @client = client - end - - # Lists the organizations the authenticated caller is an active member of (paginated). Returns an empty list when - # the caller belongs to no organizations. - # - # @param request_options [Hash] - # @param _params [Hash] - # @option request_options [String] :base_url - # @option request_options [Hash{String => Object}] :additional_headers - # @option request_options [Hash{String => Object}] :additional_query_parameters - # @option request_options [Hash{String => Object}] :additional_body_parameters - # @option request_options [Integer] :timeout_in_seconds - # - # @example - # client.organizations.list - # - # @return [VitableConnect::Types::OrganizationsListResponse] - def list(request_options: {}, **_params) - request = VitableConnect::Internal::JSON::Request.new( - base_url: request_options[:base_url], - method: "GET", - path: "v1/organizations", - request_options: request_options - ) - begin - response = @client.send(request) - rescue Net::HTTPRequestTimeout - raise VitableConnect::Errors::TimeoutError - end - code = response.code.to_i - if code.between?(200, 299) - VitableConnect::Types::OrganizationsListResponse.load(response.body) - else - error_class = VitableConnect::Errors::ResponseError.subclass_for_code(code) - raise error_class.new(response.body, code: code) - end - end - - # Onboards the authenticated user's partner Organization: creates the local Organization + the creator's admin - # membership atomically, then mirrors it to WorkOS (creates the WorkOS org and binds the creator as admin). 409 - # `organization_already_exists` when the user already has an organization (v0: one organization per user). - # - # @param request_options [Hash] - # @param params [VitableConnect::Organizations::Types::CreateOrganizationRequest] - # @option request_options [String] :base_url - # @option request_options [Hash{String => Object}] :additional_headers - # @option request_options [Hash{String => Object}] :additional_query_parameters - # @option request_options [Hash{String => Object}] :additional_body_parameters - # @option request_options [Integer] :timeout_in_seconds - # - # @example - # client.organizations.create( - # name: "Acme Brokerage", - # type: "BROKERAGE" - # ) - # - # @return [VitableConnect::Types::Organization] - def create(request_options: {}, **params) - params = VitableConnect::Internal::Types::Utils.normalize_keys(params) - request = VitableConnect::Internal::JSON::Request.new( - base_url: request_options[:base_url], - method: "POST", - path: "v1/organizations", - body: VitableConnect::Organizations::Types::CreateOrganizationRequest.new(params).to_h, - request_options: request_options - ) - begin - response = @client.send(request) - rescue Net::HTTPRequestTimeout - raise VitableConnect::Errors::TimeoutError - end - code = response.code.to_i - if code.between?(200, 299) - VitableConnect::Types::Organization.load(response.body) - else - error_class = VitableConnect::Errors::ResponseError.subclass_for_code(code) - raise error_class.new(response.body, code: code) - end - end - end - end -end diff --git a/lib/VitableConnect/organizations/types/create_organization_request.rb b/lib/VitableConnect/organizations/types/create_organization_request.rb deleted file mode 100644 index b9029c6..0000000 --- a/lib/VitableConnect/organizations/types/create_organization_request.rb +++ /dev/null @@ -1,13 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Organizations - module Types - class CreateOrganizationRequest < Internal::Types::Model - field :name, -> { String }, optional: false, nullable: false - - field :type, -> { VitableConnect::Types::CreateOrganizationRequestType }, optional: true, nullable: false - end - end - end -end diff --git a/lib/VitableConnect/plans/client.rb b/lib/VitableConnect/plans/client.rb deleted file mode 100644 index 74420ac..0000000 --- a/lib/VitableConnect/plans/client.rb +++ /dev/null @@ -1,69 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Plans - class Client - # @param client [VitableConnect::Internal::Http::RawClient] - # - # @return [void] - def initialize(client:) - @client = client - end - - # Returns a paginated list of benefit plans linked to the authenticated organization. - # - # @param request_options [Hash] - # @param params [Hash] - # @option request_options [String] :base_url - # @option request_options [Hash{String => Object}] :additional_headers - # @option request_options [Hash{String => Object}] :additional_query_parameters - # @option request_options [Hash{String => Object}] :additional_body_parameters - # @option request_options [Integer] :timeout_in_seconds - # @option params [Integer, nil] :limit - # @option params [Integer, nil] :page - # - # @example - # client.plans.list( - # limit: 20, - # page: 1 - # ) - # - # @return [VitableConnect::Types::PlanListResponse] - def list(request_options: {}, **params) - params = VitableConnect::Internal::Types::Utils.normalize_keys(params) - query_params = {} - query_params["limit"] = params[:limit] if params.key?(:limit) - query_params["page"] = params[:page] if params.key?(:page) - - VitableConnect::Internal::OffsetItemIterator.new( - initial_page: query_params["page"], - item_field: :data, - has_next_field: nil, - step: false - ) do |next_page| - query_params["page"] = next_page - request = VitableConnect::Internal::JSON::Request.new( - base_url: request_options[:base_url], - method: "GET", - path: "v1/plans", - query: query_params, - request_options: request_options - ) - begin - response = @client.send(request) - rescue Net::HTTPRequestTimeout - raise VitableConnect::Errors::TimeoutError - end - code = response.code.to_i - if code.between?(200, 299) - parsed_response = VitableConnect::Types::PlanListResponse.load(response.body) - [parsed_response, response] - else - error_class = VitableConnect::Errors::ResponseError.subclass_for_code(code) - raise error_class.new(response.body, code: code) - end - end - end - end - end -end diff --git a/lib/VitableConnect/plans/types/list_plans_request.rb b/lib/VitableConnect/plans/types/list_plans_request.rb deleted file mode 100644 index 84fa791..0000000 --- a/lib/VitableConnect/plans/types/list_plans_request.rb +++ /dev/null @@ -1,13 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Plans - module Types - class ListPlansRequest < Internal::Types::Model - field :limit, -> { Integer }, optional: true, nullable: false - - field :page, -> { Integer }, optional: true, nullable: false - end - end - end -end diff --git a/lib/VitableConnect/types/access_method.rb b/lib/VitableConnect/types/access_method.rb deleted file mode 100644 index 05d49f3..0000000 --- a/lib/VitableConnect/types/access_method.rb +++ /dev/null @@ -1,12 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - module AccessMethod - extend VitableConnect::Internal::Types::Enum - - SELF_SETUP = "SELF_SETUP" - NEEDS_HELP = "NEEDS_HELP" - end - end -end diff --git a/lib/VitableConnect/types/access_token_response.rb b/lib/VitableConnect/types/access_token_response.rb deleted file mode 100644 index 5d32139..0000000 --- a/lib/VitableConnect/types/access_token_response.rb +++ /dev/null @@ -1,15 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - class AccessTokenResponse < Internal::Types::Model - field :access_token, -> { String }, optional: false, nullable: false - - field :token_type, -> { String }, optional: false, nullable: false - - field :expires_in, -> { Integer }, optional: false, nullable: false - - field :bound_entity, -> { VitableConnect::Types::BoundEntityResponse }, optional: true, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/additional_access_method.rb b/lib/VitableConnect/types/additional_access_method.rb deleted file mode 100644 index 654e6ae..0000000 --- a/lib/VitableConnect/types/additional_access_method.rb +++ /dev/null @@ -1,12 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - module AdditionalAccessMethod - extend VitableConnect::Internal::Types::Enum - - SELF_SETUP = "SELF_SETUP" - NEEDS_HELP = "NEEDS_HELP" - end - end -end diff --git a/lib/VitableConnect/types/address.rb b/lib/VitableConnect/types/address.rb deleted file mode 100644 index 036b5c0..0000000 --- a/lib/VitableConnect/types/address.rb +++ /dev/null @@ -1,22 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - # Shared read serializer for a postal address on public API responses. - # - # One definition for the address block every public resource emits (employer, employee, …), so the - # 5-field shape isn't hand-rolled per endpoint. Read-only: it renders an already-built address - # value object (e.g. ``AddressDVO``) whose attributes map 1:1 to these fields. - class Address < Internal::Types::Model - field :address_line1, -> { String }, optional: false, nullable: false, api_name: "address_line_1" - - field :address_line2, -> { String }, optional: false, nullable: true, api_name: "address_line_2" - - field :city, -> { String }, optional: false, nullable: false - - field :state, -> { String }, optional: false, nullable: false - - field :zipcode, -> { String }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/address_request.rb b/lib/VitableConnect/types/address_request.rb deleted file mode 100644 index b55177b..0000000 --- a/lib/VitableConnect/types/address_request.rb +++ /dev/null @@ -1,17 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - class AddressRequest < Internal::Types::Model - field :address_line1, -> { String }, optional: false, nullable: false, api_name: "address_line_1" - - field :address_line2, -> { String }, optional: true, nullable: false, api_name: "address_line_2" - - field :city, -> { String }, optional: false, nullable: false - - field :state, -> { String }, optional: false, nullable: false - - field :zipcode, -> { String }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/benefit_family.rb b/lib/VitableConnect/types/benefit_family.rb deleted file mode 100644 index 800ec91..0000000 --- a/lib/VitableConnect/types/benefit_family.rb +++ /dev/null @@ -1,16 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - module BenefitFamily - extend VitableConnect::Internal::Types::Enum - - MEC = "mec" - MVP = "mvp" - ICHRA = "ichra" - VPC = "vpc" - DENTAL = "dental" - VISION = "vision" - end - end -end diff --git a/lib/VitableConnect/types/benefit_family_param_item.rb b/lib/VitableConnect/types/benefit_family_param_item.rb deleted file mode 100644 index 2d0490d..0000000 --- a/lib/VitableConnect/types/benefit_family_param_item.rb +++ /dev/null @@ -1,16 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - module BenefitFamilyParamItem - extend VitableConnect::Internal::Types::Enum - - MEC = "mec" - MVP = "mvp" - ICHRA = "ichra" - VPC = "vpc" - DENTAL = "dental" - VISION = "vision" - end - end -end diff --git a/lib/VitableConnect/types/benefit_lifecycle_stage_item.rb b/lib/VitableConnect/types/benefit_lifecycle_stage_item.rb deleted file mode 100644 index 606e0a7..0000000 --- a/lib/VitableConnect/types/benefit_lifecycle_stage_item.rb +++ /dev/null @@ -1,15 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - module BenefitLifecycleStageItem - extend VitableConnect::Internal::Types::Enum - - OPEN_ENROLLMENT = "open_enrollment" - RENEWAL = "renewal" - ACTIVE = "active" - ONBOARDING = "onboarding" - CANCELLED = "cancelled" - end - end -end diff --git a/lib/VitableConnect/types/benefit_plan_network.rb b/lib/VitableConnect/types/benefit_plan_network.rb deleted file mode 100644 index 921460f..0000000 --- a/lib/VitableConnect/types/benefit_plan_network.rb +++ /dev/null @@ -1,29 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - class BenefitPlanNetwork < Internal::Types::Model - field :id, -> { String }, optional: true, nullable: false - - field :name, -> { String }, optional: false, nullable: false - - field :logo, -> { String }, optional: false, nullable: true - - field :address, -> { VitableConnect::Types::Address }, optional: false, nullable: false - - field :edi, -> { String }, optional: true, nullable: false - - field :website, -> { String }, optional: false, nullable: false - - field :phone, -> { String }, optional: false, nullable: false - - field :member_website, -> { String }, optional: true, nullable: false - - field :member_phone, -> { String }, optional: false, nullable: true - - field :provider_website, -> { String }, optional: true, nullable: false - - field :provider_phone, -> { String }, optional: false, nullable: true - end - end -end diff --git a/lib/VitableConnect/types/benefit_plan_year_detail.rb b/lib/VitableConnect/types/benefit_plan_year_detail.rb deleted file mode 100644 index d0cab53..0000000 --- a/lib/VitableConnect/types/benefit_plan_year_detail.rb +++ /dev/null @@ -1,52 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - # One plan year, detail view. - # - # Standalone (no shared base) so the exact detail payload is readable in one place; the list - # serializer is a separate class even where fields overlap. Detail carries the SPD link and omits - # the list-only ``is_current`` flag. - class BenefitPlanYearDetail < Internal::Types::Model - field :benefit_plan_year_id, -> { String }, optional: false, nullable: false - - field :benefit_id, -> { String }, optional: false, nullable: false - - field :year, -> { Integer }, optional: false, nullable: false - - field :family, -> { VitableConnect::Types::BenefitFamily }, optional: false, nullable: false - - field :product_name, -> { String }, optional: false, nullable: false - - field :carrier, -> { String }, optional: false, nullable: true - - field :network_names, -> { Internal::Types::Array[String] }, optional: false, nullable: false - - field :premium_in_cents, -> { Integer }, optional: false, nullable: true - - field :employee_contribution, -> { VitableConnect::Types::ContributionRange }, optional: false, nullable: true - - field :employer_contribution, -> { VitableConnect::Types::ContributionRange }, optional: false, nullable: true - - field :status, -> { VitableConnect::Types::BenefitStatus }, optional: false, nullable: false - - field :coverage_start, -> { String }, optional: false, nullable: false - - field :coverage_end, -> { String }, optional: false, nullable: true - - field :open_enrollment_start, -> { String }, optional: false, nullable: false - - field :open_enrollment_end, -> { String }, optional: false, nullable: true - - field :offered_states, -> { Internal::Types::Array[String] }, optional: false, nullable: false - - field :enrollment_rate, -> { VitableConnect::Types::EnrollmentRate }, optional: false, nullable: false - - field :spd_file_url, -> { String }, optional: false, nullable: true - - field :contribution_strategy, -> { VitableConnect::Types::ContributionStrategy }, optional: false, nullable: false - - field :eligibility_policy, -> { VitableConnect::Types::EligibilityPolicy }, optional: false, nullable: true - end - end -end diff --git a/lib/VitableConnect/types/benefit_plan_year_id.rb b/lib/VitableConnect/types/benefit_plan_year_id.rb deleted file mode 100644 index d978f33..0000000 --- a/lib/VitableConnect/types/benefit_plan_year_id.rb +++ /dev/null @@ -1,23 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - module BenefitPlanYearID - # BenefitPlanYearID is an alias for String - - # @option str [String] - # - # @return [untyped] - def self.load(str) - ::JSON.parse(str) - end - - # @option value [untyped] - # - # @return [String] - def self.dump(value) - ::JSON.generate(value) - end - end - end -end diff --git a/lib/VitableConnect/types/benefit_plan_year_list.rb b/lib/VitableConnect/types/benefit_plan_year_list.rb deleted file mode 100644 index 530ec8e..0000000 --- a/lib/VitableConnect/types/benefit_plan_year_list.rb +++ /dev/null @@ -1,47 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - # One plan year, list view. - # - # Standalone (no shared base) so the exact list payload is readable in one place; the detail - # serializer is a separate class even where fields overlap. - class BenefitPlanYearList < Internal::Types::Model - field :benefit_plan_year_id, -> { String }, optional: false, nullable: false - - field :benefit_id, -> { String }, optional: false, nullable: false - - field :year, -> { Integer }, optional: false, nullable: false - - field :family, -> { VitableConnect::Types::BenefitFamily }, optional: false, nullable: false - - field :product_name, -> { String }, optional: false, nullable: false - - field :carrier, -> { String }, optional: false, nullable: true - - field :network_names, -> { Internal::Types::Array[String] }, optional: false, nullable: false - - field :premium_in_cents, -> { Integer }, optional: false, nullable: true - - field :employee_contribution, -> { VitableConnect::Types::ContributionRange }, optional: false, nullable: true - - field :employer_contribution, -> { VitableConnect::Types::ContributionRange }, optional: false, nullable: true - - field :status, -> { VitableConnect::Types::BenefitStatus }, optional: false, nullable: false - - field :coverage_start, -> { String }, optional: false, nullable: false - - field :coverage_end, -> { String }, optional: false, nullable: true - - field :open_enrollment_start, -> { String }, optional: false, nullable: false - - field :open_enrollment_end, -> { String }, optional: false, nullable: true - - field :offered_states, -> { Internal::Types::Array[String] }, optional: false, nullable: false - - field :is_current, -> { Internal::Types::Boolean }, optional: false, nullable: false - - field :enrollment_rate, -> { VitableConnect::Types::EnrollmentRate }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/benefit_status.rb b/lib/VitableConnect/types/benefit_status.rb deleted file mode 100644 index a3b2f51..0000000 --- a/lib/VitableConnect/types/benefit_status.rb +++ /dev/null @@ -1,14 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - module BenefitStatus - extend VitableConnect::Internal::Types::Enum - - ACTIVE = "active" - UPCOMING = "upcoming" - OPEN_ENROLLMENT = "open_enrollment" - INACTIVE = "inactive" - end - end -end diff --git a/lib/VitableConnect/types/benefit_summary.rb b/lib/VitableConnect/types/benefit_summary.rb deleted file mode 100644 index 51985f4..0000000 --- a/lib/VitableConnect/types/benefit_summary.rb +++ /dev/null @@ -1,15 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - class BenefitSummary < Internal::Types::Model - field :id, -> { String }, optional: false, nullable: false - - field :name, -> { String }, optional: false, nullable: false - - field :product_code, -> { VitableConnect::Types::ProductCode }, optional: false, nullable: false - - field :category, -> { VitableConnect::Types::Category }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/bound_entity.rb b/lib/VitableConnect/types/bound_entity.rb deleted file mode 100644 index 2700481..0000000 --- a/lib/VitableConnect/types/bound_entity.rb +++ /dev/null @@ -1,11 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - class BoundEntity < Internal::Types::Model - field :id, -> { String }, optional: false, nullable: false - - field :type, -> { VitableConnect::Types::BoundEntityType }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/bound_entity_response.rb b/lib/VitableConnect/types/bound_entity_response.rb deleted file mode 100644 index 6d485e0..0000000 --- a/lib/VitableConnect/types/bound_entity_response.rb +++ /dev/null @@ -1,11 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - class BoundEntityResponse < Internal::Types::Model - field :id, -> { String }, optional: false, nullable: false - - field :type, -> { VitableConnect::Types::BoundEntityType }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/bound_entity_type.rb b/lib/VitableConnect/types/bound_entity_type.rb deleted file mode 100644 index 8f919e2..0000000 --- a/lib/VitableConnect/types/bound_entity_type.rb +++ /dev/null @@ -1,12 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - module BoundEntityType - extend VitableConnect::Internal::Types::Enum - - EMPLOYER = "employer" - EMPLOYEE = "employee" - end - end -end diff --git a/lib/VitableConnect/types/card_type.rb b/lib/VitableConnect/types/card_type.rb deleted file mode 100644 index d8c55f9..0000000 --- a/lib/VitableConnect/types/card_type.rb +++ /dev/null @@ -1,14 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - module CardType - extend VitableConnect::Internal::Types::Enum - - MEDICAL = "medical" - DENTAL = "dental" - VISION = "vision" - RX = "rx" - end - end -end diff --git a/lib/VitableConnect/types/category.rb b/lib/VitableConnect/types/category.rb deleted file mode 100644 index 1053d5c..0000000 --- a/lib/VitableConnect/types/category.rb +++ /dev/null @@ -1,14 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - module Category - extend VitableConnect::Internal::Types::Enum - - MEDICAL = "Medical" - DENTAL = "Dental" - VISION = "Vision" - HOSPITAL = "Hospital" - end - end -end diff --git a/lib/VitableConnect/types/census_sync_detail_response.rb b/lib/VitableConnect/types/census_sync_detail_response.rb deleted file mode 100644 index 52a424f..0000000 --- a/lib/VitableConnect/types/census_sync_detail_response.rb +++ /dev/null @@ -1,10 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - # Response containing a single census sync detail resource. - class CensusSyncDetailResponse < Internal::Types::Model - field :data, -> { VitableConnect::Types::CensusSyncResponse }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/census_sync_employee_address_request.rb b/lib/VitableConnect/types/census_sync_employee_address_request.rb deleted file mode 100644 index 7fb3547..0000000 --- a/lib/VitableConnect/types/census_sync_employee_address_request.rb +++ /dev/null @@ -1,17 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - class CensusSyncEmployeeAddressRequest < Internal::Types::Model - field :address_line1, -> { String }, optional: false, nullable: false, api_name: "address_line_1" - - field :address_line2, -> { String }, optional: true, nullable: false, api_name: "address_line_2" - - field :city, -> { String }, optional: false, nullable: false - - field :state, -> { VitableConnect::Types::State }, optional: false, nullable: false - - field :zipcode, -> { String }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/census_sync_employee_request.rb b/lib/VitableConnect/types/census_sync_employee_request.rb deleted file mode 100644 index 496885f..0000000 --- a/lib/VitableConnect/types/census_sync_employee_request.rb +++ /dev/null @@ -1,27 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - class CensusSyncEmployeeRequest < Internal::Types::Model - field :reference_id, -> { String }, optional: true, nullable: false - - field :first_name, -> { String }, optional: false, nullable: false - - field :last_name, -> { String }, optional: false, nullable: false - - field :date_of_birth, -> { String }, optional: false, nullable: false - - field :email, -> { String }, optional: false, nullable: false - - field :phone, -> { String }, optional: true, nullable: false - - field :address, -> { VitableConnect::Types::CensusSyncEmployeeAddressRequest }, optional: true, nullable: false - - field :start_date, -> { String }, optional: true, nullable: false - - field :employee_class, -> { VitableConnect::Types::EmployeeClass }, optional: true, nullable: false - - field :compensation_type, -> { VitableConnect::Types::CompensationType }, optional: true, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/census_sync_response.rb b/lib/VitableConnect/types/census_sync_response.rb deleted file mode 100644 index a08f994..0000000 --- a/lib/VitableConnect/types/census_sync_response.rb +++ /dev/null @@ -1,11 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - class CensusSyncResponse < Internal::Types::Model - field :employer_id, -> { String }, optional: false, nullable: false - - field :accepted_at, -> { String }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/classification_correction_source.rb b/lib/VitableConnect/types/classification_correction_source.rb deleted file mode 100644 index d358b9e..0000000 --- a/lib/VitableConnect/types/classification_correction_source.rb +++ /dev/null @@ -1,12 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - module ClassificationCorrectionSource - extend VitableConnect::Internal::Types::Enum - - ENTER_NAMES = "ENTER_NAMES" - EMAIL_LIST = "EMAIL_LIST" - end - end -end diff --git a/lib/VitableConnect/types/compensation_type.rb b/lib/VitableConnect/types/compensation_type.rb deleted file mode 100644 index 0a13316..0000000 --- a/lib/VitableConnect/types/compensation_type.rb +++ /dev/null @@ -1,12 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - module CompensationType - extend VitableConnect::Internal::Types::Enum - - SALARY = "Salary" - HOURLY = "Hourly" - end - end -end diff --git a/lib/VitableConnect/types/contribution_class_compensation.rb b/lib/VitableConnect/types/contribution_class_compensation.rb deleted file mode 100644 index 6ae39d4..0000000 --- a/lib/VitableConnect/types/contribution_class_compensation.rb +++ /dev/null @@ -1,13 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - module ContributionClassCompensation - extend VitableConnect::Internal::Types::Enum - - UNSPECIFIED = "Unspecified" - SALARY = "Salary" - HOURLY = "Hourly" - end - end -end diff --git a/lib/VitableConnect/types/contribution_class_employment.rb b/lib/VitableConnect/types/contribution_class_employment.rb deleted file mode 100644 index fb79519..0000000 --- a/lib/VitableConnect/types/contribution_class_employment.rb +++ /dev/null @@ -1,15 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - module ContributionClassEmployment - extend VitableConnect::Internal::Types::Enum - - UNSPECIFIED = "Unspecified" - FULL_TIME = "Full Time" - PART_TIME = "Part Time" - TEMPORARY = "Temporary" - SEASONAL = "Seasonal" - end - end -end diff --git a/lib/VitableConnect/types/contribution_class_location.rb b/lib/VitableConnect/types/contribution_class_location.rb deleted file mode 100644 index ff183b2..0000000 --- a/lib/VitableConnect/types/contribution_class_location.rb +++ /dev/null @@ -1,12 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - module ContributionClassLocation - extend VitableConnect::Internal::Types::Enum - - UNSPECIFIED = "Unspecified" - STATE = "State" - end - end -end diff --git a/lib/VitableConnect/types/contribution_range.rb b/lib/VitableConnect/types/contribution_range.rb deleted file mode 100644 index ee347ab..0000000 --- a/lib/VitableConnect/types/contribution_range.rb +++ /dev/null @@ -1,11 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - class ContributionRange < Internal::Types::Model - field :min_cents, -> { Integer }, optional: false, nullable: false - - field :max_cents, -> { Integer }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/contribution_strategy.rb b/lib/VitableConnect/types/contribution_strategy.rb deleted file mode 100644 index 7797076..0000000 --- a/lib/VitableConnect/types/contribution_strategy.rb +++ /dev/null @@ -1,13 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - # How the plan year prices contributions: exactly one collection is populated, determined by the - # plan year's ``family`` (ICHRA vs tier-priced). - class ContributionStrategy < Internal::Types::Model - field :ichra_contribution_classes, -> { Internal::Types::Array[VitableConnect::Types::IchraContributionClass] }, optional: false, nullable: false - - field :contribution_tiers, -> { Internal::Types::Array[VitableConnect::Types::ContributionTier] }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/contribution_tier.rb b/lib/VitableConnect/types/contribution_tier.rb deleted file mode 100644 index 0c6c5e9..0000000 --- a/lib/VitableConnect/types/contribution_tier.rb +++ /dev/null @@ -1,26 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - # One non-ICHRA coverage tier, mirroring the internal configuration ``CompanyBenefitPlanTierCostDTO`` - # minus the tier-cost id, ``pepm`` and ``pepm_per_dependent``; ``benefit_plan_id`` is the prefixed - # ``bpln_*`` form rather than a raw UUID. - class ContributionTier < Internal::Types::Model - field :benefit_plan_id, -> { String }, optional: false, nullable: false - - field :benefit_plan_name, -> { String }, optional: false, nullable: false - - field :benefit_plan_tier_name, -> { String }, optional: false, nullable: false - - field :coverage_tier, -> { VitableConnect::Types::CoverageTier }, optional: false, nullable: false - - field :cost, -> { Integer }, optional: false, nullable: false - - field :cost_per_dependent, -> { Integer }, optional: false, nullable: false - - field :dependents_required_in, -> { Internal::Types::Boolean }, optional: false, nullable: false - - field :spouse_required_in, -> { Internal::Types::Boolean }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/coverage_tier.rb b/lib/VitableConnect/types/coverage_tier.rb deleted file mode 100644 index e3522a6..0000000 --- a/lib/VitableConnect/types/coverage_tier.rb +++ /dev/null @@ -1,15 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - module CoverageTier - extend VitableConnect::Internal::Types::Enum - - UNSPECIFIED = "Unspecified" - EE = "EE" - ES = "ES" - EC = "EC" - EF = "EF" - end - end -end diff --git a/lib/VitableConnect/types/create_organization_request_type.rb b/lib/VitableConnect/types/create_organization_request_type.rb deleted file mode 100644 index 6b4fd57..0000000 --- a/lib/VitableConnect/types/create_organization_request_type.rb +++ /dev/null @@ -1,16 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - module CreateOrganizationRequestType - extend VitableConnect::Internal::Types::Enum - - BROKERAGE = "BROKERAGE" - TPA = "TPA" - GENERAL_AGENT = "GENERAL_AGENT" - CHANNEL_PARTNER = "CHANNEL_PARTNER" - CONSULTING_FIRM = "CONSULTING_FIRM" - API_PLATFORM = "API_PLATFORM" - end - end -end diff --git a/lib/VitableConnect/types/created_after.rb b/lib/VitableConnect/types/created_after.rb deleted file mode 100644 index 2a21e74..0000000 --- a/lib/VitableConnect/types/created_after.rb +++ /dev/null @@ -1,23 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - module CreatedAfter - # CreatedAfter is an alias for String - - # @option str [String] - # - # @return [untyped] - def self.load(str) - ::JSON.parse(str) - end - - # @option value [untyped] - # - # @return [String] - def self.dump(value) - ::JSON.generate(value) - end - end - end -end diff --git a/lib/VitableConnect/types/created_before.rb b/lib/VitableConnect/types/created_before.rb deleted file mode 100644 index ed9347f..0000000 --- a/lib/VitableConnect/types/created_before.rb +++ /dev/null @@ -1,23 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - module CreatedBefore - # CreatedBefore is an alias for String - - # @option str [String] - # - # @return [untyped] - def self.load(str) - ::JSON.parse(str) - end - - # @option value [untyped] - # - # @return [String] - def self.dump(value) - ::JSON.generate(value) - end - end - end -end diff --git a/lib/VitableConnect/types/deduction_detail.rb b/lib/VitableConnect/types/deduction_detail.rb deleted file mode 100644 index 691214a..0000000 --- a/lib/VitableConnect/types/deduction_detail.rb +++ /dev/null @@ -1,21 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - class DeductionDetail < Internal::Types::Model - field :deduction_category, -> { String }, optional: false, nullable: true - - field :deduction_amount_in_cents, -> { Integer }, optional: false, nullable: false - - field :tax_classification, -> { VitableConnect::Types::TaxClassification }, optional: false, nullable: false - - field :frequency, -> { VitableConnect::Types::DeductionFrequency }, optional: false, nullable: false - - field :benefit_name, -> { String }, optional: false, nullable: false - - field :period_start_date, -> { String }, optional: false, nullable: false - - field :period_end_date, -> { String }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/deduction_frequency.rb b/lib/VitableConnect/types/deduction_frequency.rb deleted file mode 100644 index 83cfe22..0000000 --- a/lib/VitableConnect/types/deduction_frequency.rb +++ /dev/null @@ -1,14 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - module DeductionFrequency - extend VitableConnect::Internal::Types::Enum - - WEEKLY = "weekly" - BI_WEEKLY = "bi_weekly" - SEMI_MONTHLY = "semi_monthly" - MONTHLY = "monthly" - end - end -end diff --git a/lib/VitableConnect/types/digital_benefit_card.rb b/lib/VitableConnect/types/digital_benefit_card.rb deleted file mode 100644 index 55ddc3f..0000000 --- a/lib/VitableConnect/types/digital_benefit_card.rb +++ /dev/null @@ -1,36 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - # Wire serializer for :class:`DigitalBenefitCardDTO` (one benefit ID card). - class DigitalBenefitCard < Internal::Types::Model - field :card_type, -> { VitableConnect::Types::CardType }, optional: false, nullable: false - - field :group_id, -> { String }, optional: false, nullable: false - - field :group_member_id, -> { String }, optional: false, nullable: false - - field :member_name, -> { String }, optional: false, nullable: false - - field :employer_name, -> { String }, optional: true, nullable: false - - field :plan_name, -> { String }, optional: true, nullable: false - - field :benefit_code, -> { VitableConnect::Types::ProductCode }, optional: true, nullable: false - - field :network, -> { VitableConnect::Types::BenefitPlanNetwork }, optional: true, nullable: false - - field :claims_payer_display_name, -> { String }, optional: true, nullable: false - - field :carrier_phone, -> { String }, optional: true, nullable: false - - field :carrier_website, -> { String }, optional: true, nullable: false - - field :plan_disclaimer, -> { String }, optional: true, nullable: false - - field :general_disclaimer, -> { String }, optional: true, nullable: false - - field :nsa_table, -> { Internal::Types::Array[Internal::Types::Array[String]] }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/election_status_item.rb b/lib/VitableConnect/types/election_status_item.rb deleted file mode 100644 index 603ee8e..0000000 --- a/lib/VitableConnect/types/election_status_item.rb +++ /dev/null @@ -1,14 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - module ElectionStatusItem - extend VitableConnect::Internal::Types::Enum - - ENROLLED = "Enrolled" - EXPIRED = "Expired" - PENDING = "Pending" - WAIVED = "Waived" - end - end -end diff --git a/lib/VitableConnect/types/eligibility_policy.rb b/lib/VitableConnect/types/eligibility_policy.rb deleted file mode 100644 index 720716f..0000000 --- a/lib/VitableConnect/types/eligibility_policy.rb +++ /dev/null @@ -1,17 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - # The plan year's active eligibility policy. Mirrors the internal ``PlanYearEligibilityPolicyDTO`` - # but exposes only the public subset (no raw ids, ``active_in``, or timestamps). - class EligibilityPolicy < Internal::Types::Model - field :waiting_period, -> { VitableConnect::Types::WaitingPeriod }, optional: false, nullable: true - - field :termination_rule, -> { VitableConnect::Types::TerminationRule }, optional: false, nullable: false - - field :termination_n_months, -> { Integer }, optional: false, nullable: true - - field :rules, -> { Internal::Types::Array[VitableConnect::Types::EligibilityPolicyRule] }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/eligibility_policy_rule.rb b/lib/VitableConnect/types/eligibility_policy_rule.rb deleted file mode 100644 index 0c9e2f8..0000000 --- a/lib/VitableConnect/types/eligibility_policy_rule.rb +++ /dev/null @@ -1,15 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - # One eligibility rule — the workforce slice it makes eligible. Mirrors the internal - # ``PlanYearEligibilityPolicyRuleDTO`` minus the raw ids and timestamps. - class EligibilityPolicyRule < Internal::Types::Model - field :employee_class, -> { VitableConnect::Types::EligibilityRuleEmployeeClass }, optional: false, nullable: false - - field :compensation_type, -> { VitableConnect::Types::EligibilityRuleCompensationType }, optional: false, nullable: false - - field :eligible_geographical_location, -> { VitableConnect::Types::EligibleGeographicalLocation }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/eligibility_rule_compensation_type.rb b/lib/VitableConnect/types/eligibility_rule_compensation_type.rb deleted file mode 100644 index a5c365a..0000000 --- a/lib/VitableConnect/types/eligibility_rule_compensation_type.rb +++ /dev/null @@ -1,13 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - module EligibilityRuleCompensationType - extend VitableConnect::Internal::Types::Enum - - SALARY = "Salary" - HOURLY = "Hourly" - ALL = "All" - end - end -end diff --git a/lib/VitableConnect/types/eligibility_rule_employee_class.rb b/lib/VitableConnect/types/eligibility_rule_employee_class.rb deleted file mode 100644 index 5d877ce..0000000 --- a/lib/VitableConnect/types/eligibility_rule_employee_class.rb +++ /dev/null @@ -1,17 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - module EligibilityRuleEmployeeClass - extend VitableConnect::Internal::Types::Enum - - FULL_TIME = "Full Time" - PART_TIME = "Part Time" - TEMPORARY = "Temporary" - INTERN = "Intern" - SEASONAL = "Seasonal" - INDIVIDUAL_CONTRACTOR = "Individual Contractor" - ALL = "All" - end - end -end diff --git a/lib/VitableConnect/types/eligible_geographical_location.rb b/lib/VitableConnect/types/eligible_geographical_location.rb deleted file mode 100644 index 911dcc1..0000000 --- a/lib/VitableConnect/types/eligible_geographical_location.rb +++ /dev/null @@ -1,11 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - class EligibleGeographicalLocation < Internal::Types::Model - field :type, -> { VitableConnect::Types::EligibleGeographicalLocationType }, optional: false, nullable: false - - field :state_codes, -> { Internal::Types::Array[String] }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/eligible_geographical_location_type.rb b/lib/VitableConnect/types/eligible_geographical_location_type.rb deleted file mode 100644 index 12a6bfc..0000000 --- a/lib/VitableConnect/types/eligible_geographical_location_type.rb +++ /dev/null @@ -1,12 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - module EligibleGeographicalLocationType - extend VitableConnect::Internal::Types::Enum - - ALL = "All" - STATE_CODES = "StateCodes" - end - end -end diff --git a/lib/VitableConnect/types/employee.rb b/lib/VitableConnect/types/employee.rb deleted file mode 100644 index d04689d..0000000 --- a/lib/VitableConnect/types/employee.rb +++ /dev/null @@ -1,53 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - class Employee < Internal::Types::Model - field :id, -> { String }, optional: true, nullable: false - - field :member_id, -> { String }, optional: true, nullable: false - - field :employer_id, -> { String }, optional: true, nullable: false - - field :reference_id, -> { String }, optional: true, nullable: false - - field :employer_name, -> { String }, optional: true, nullable: false - - field :first_name, -> { String }, optional: false, nullable: false - - field :last_name, -> { String }, optional: false, nullable: false - - field :suffix, -> { String }, optional: true, nullable: false - - field :email, -> { String }, optional: false, nullable: false - - field :date_of_birth, -> { String }, optional: false, nullable: false - - field :gender, -> { String }, optional: true, nullable: false - - field :phone, -> { String }, optional: true, nullable: false - - field :employee_class, -> { VitableConnect::Types::EmployeeClass }, optional: false, nullable: false - - field :status, -> { VitableConnect::Types::EmployeeStatus }, optional: true, nullable: false - - field :start_date, -> { String }, optional: true, nullable: false - - field :classification_effective_date, -> { String }, optional: true, nullable: false - - field :compensation_type, -> { VitableConnect::Types::CompensationType }, optional: true, nullable: false - - field :compensation_type_effective_date, -> { String }, optional: true, nullable: false - - field :termination_date, -> { String }, optional: true, nullable: false - - field :address, -> { VitableConnect::Types::EmployeeAddress }, optional: true, nullable: false - - field :deductions, -> { Internal::Types::Array[VitableConnect::Types::DeductionDetail] }, optional: false, nullable: false - - field :created_at, -> { String }, optional: false, nullable: false - - field :updated_at, -> { String }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/employee_address.rb b/lib/VitableConnect/types/employee_address.rb deleted file mode 100644 index 737a16a..0000000 --- a/lib/VitableConnect/types/employee_address.rb +++ /dev/null @@ -1,17 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - class EmployeeAddress < Internal::Types::Model - field :address_line1, -> { String }, optional: false, nullable: false, api_name: "address_line_1" - - field :address_line2, -> { String }, optional: true, nullable: false, api_name: "address_line_2" - - field :city, -> { String }, optional: false, nullable: false - - field :state, -> { String }, optional: false, nullable: false - - field :zipcode, -> { String }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/employee_address_input.rb b/lib/VitableConnect/types/employee_address_input.rb deleted file mode 100644 index e4c2ba2..0000000 --- a/lib/VitableConnect/types/employee_address_input.rb +++ /dev/null @@ -1,19 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - class EmployeeAddressInput < Internal::Types::Model - field :street1, -> { String }, optional: false, nullable: false, api_name: "street_1" - - field :street2, -> { String }, optional: true, nullable: false, api_name: "street_2" - - field :city, -> { String }, optional: false, nullable: false - - field :state, -> { String }, optional: false, nullable: false - - field :zip_code, -> { String }, optional: false, nullable: false - - field :country, -> { String }, optional: true, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/employee_class.rb b/lib/VitableConnect/types/employee_class.rb deleted file mode 100644 index db39291..0000000 --- a/lib/VitableConnect/types/employee_class.rb +++ /dev/null @@ -1,16 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - module EmployeeClass - extend VitableConnect::Internal::Types::Enum - - FULL_TIME = "Full Time" - PART_TIME = "Part Time" - TEMPORARY = "Temporary" - INTERN = "Intern" - SEASONAL = "Seasonal" - INDIVIDUAL_CONTRACTOR = "Individual Contractor" - end - end -end diff --git a/lib/VitableConnect/types/employee_id.rb b/lib/VitableConnect/types/employee_id.rb deleted file mode 100644 index 7547c7f..0000000 --- a/lib/VitableConnect/types/employee_id.rb +++ /dev/null @@ -1,23 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - module EmployeeID - # EmployeeID is an alias for String - - # @option str [String] - # - # @return [untyped] - def self.load(str) - ::JSON.parse(str) - end - - # @option value [untyped] - # - # @return [String] - def self.dump(value) - ::JSON.generate(value) - end - end - end -end diff --git a/lib/VitableConnect/types/employee_list_response.rb b/lib/VitableConnect/types/employee_list_response.rb deleted file mode 100644 index 9a33c5d..0000000 --- a/lib/VitableConnect/types/employee_list_response.rb +++ /dev/null @@ -1,12 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - # Paginated list response containing employee resources. - class EmployeeListResponse < Internal::Types::Model - field :data, -> { Internal::Types::Array[VitableConnect::Types::Employee] }, optional: false, nullable: false - - field :pagination, -> { VitableConnect::Types::Pagination }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/employee_response.rb b/lib/VitableConnect/types/employee_response.rb deleted file mode 100644 index 2c6a9ff..0000000 --- a/lib/VitableConnect/types/employee_response.rb +++ /dev/null @@ -1,10 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - # Response containing a single employee resource. - class EmployeeResponse < Internal::Types::Model - field :data, -> { VitableConnect::Types::Employee }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/employee_search.rb b/lib/VitableConnect/types/employee_search.rb deleted file mode 100644 index 5ce2690..0000000 --- a/lib/VitableConnect/types/employee_search.rb +++ /dev/null @@ -1,23 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - module EmployeeSearch - # EmployeeSearch is an alias for String - - # @option str [String] - # - # @return [untyped] - def self.load(str) - ::JSON.parse(str) - end - - # @option value [untyped] - # - # @return [String] - def self.dump(value) - ::JSON.generate(value) - end - end - end -end diff --git a/lib/VitableConnect/types/employee_status.rb b/lib/VitableConnect/types/employee_status.rb deleted file mode 100644 index 38639e0..0000000 --- a/lib/VitableConnect/types/employee_status.rb +++ /dev/null @@ -1,12 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - module EmployeeStatus - extend VitableConnect::Internal::Types::Enum - - ACTIVE = "active" - TERMINATED = "terminated" - end - end -end diff --git a/lib/VitableConnect/types/employer.rb b/lib/VitableConnect/types/employer.rb deleted file mode 100644 index adf850b..0000000 --- a/lib/VitableConnect/types/employer.rb +++ /dev/null @@ -1,34 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - # Serializer for Employer entity in public API responses. - class Employer < Internal::Types::Model - field :id, -> { String }, optional: true, nullable: false - - field :organization_id, -> { String }, optional: true, nullable: false - - field :name, -> { String }, optional: false, nullable: false - - field :legal_name, -> { String }, optional: false, nullable: false - - field :ein, -> { String }, optional: true, nullable: false - - field :reference_id, -> { String }, optional: true, nullable: false - - field :email, -> { String }, optional: true, nullable: false - - field :phone_number, -> { String }, optional: true, nullable: false - - field :active, -> { Internal::Types::Boolean }, optional: false, nullable: false - - field :address, -> { VitableConnect::Types::EmployerAddress }, optional: false, nullable: false - - field :contact, -> { VitableConnect::Types::EmployerContact }, optional: true, nullable: false - - field :created_at, -> { String }, optional: false, nullable: false - - field :updated_at, -> { String }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/employer_address.rb b/lib/VitableConnect/types/employer_address.rb deleted file mode 100644 index 28cf15f..0000000 --- a/lib/VitableConnect/types/employer_address.rb +++ /dev/null @@ -1,18 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - # Nested address within EmployerSerializer. - class EmployerAddress < Internal::Types::Model - field :address_line1, -> { String }, optional: false, nullable: false, api_name: "address_line_1" - - field :address_line2, -> { String }, optional: true, nullable: false, api_name: "address_line_2" - - field :city, -> { String }, optional: false, nullable: false - - field :state, -> { String }, optional: false, nullable: false - - field :zipcode, -> { String }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/employer_address_input.rb b/lib/VitableConnect/types/employer_address_input.rb deleted file mode 100644 index 5f98c84..0000000 --- a/lib/VitableConnect/types/employer_address_input.rb +++ /dev/null @@ -1,17 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - class EmployerAddressInput < Internal::Types::Model - field :address_line1, -> { String }, optional: false, nullable: false, api_name: "address_line_1" - - field :address_line2, -> { String }, optional: true, nullable: false, api_name: "address_line_2" - - field :city, -> { String }, optional: false, nullable: false - - field :state, -> { String }, optional: false, nullable: false - - field :zipcode, -> { String }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/employer_benefit_lifecycle_stage.rb b/lib/VitableConnect/types/employer_benefit_lifecycle_stage.rb deleted file mode 100644 index febd3f3..0000000 --- a/lib/VitableConnect/types/employer_benefit_lifecycle_stage.rb +++ /dev/null @@ -1,11 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - class EmployerBenefitLifecycleStage < Internal::Types::Model - field :stage, -> { String }, optional: false, nullable: false - - field :as_of_date, -> { String }, optional: false, nullable: true - end - end -end diff --git a/lib/VitableConnect/types/employer_benefit_plan_year_response.rb b/lib/VitableConnect/types/employer_benefit_plan_year_response.rb deleted file mode 100644 index bf88665..0000000 --- a/lib/VitableConnect/types/employer_benefit_plan_year_response.rb +++ /dev/null @@ -1,10 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - # Response containing a single employer benefit plan year resource. - class EmployerBenefitPlanYearResponse < Internal::Types::Model - field :data, -> { VitableConnect::Types::BenefitPlanYearDetail }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/employer_benefit_plan_years_list_response.rb b/lib/VitableConnect/types/employer_benefit_plan_years_list_response.rb deleted file mode 100644 index 36fc965..0000000 --- a/lib/VitableConnect/types/employer_benefit_plan_years_list_response.rb +++ /dev/null @@ -1,9 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - class EmployerBenefitPlanYearsListResponse < Internal::Types::Model - field :data, -> { Internal::Types::Array[VitableConnect::Types::BenefitPlanYearList] }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/employer_contact.rb b/lib/VitableConnect/types/employer_contact.rb deleted file mode 100644 index 13804cb..0000000 --- a/lib/VitableConnect/types/employer_contact.rb +++ /dev/null @@ -1,12 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - # Primary company-admin contact (email + phone; company admins have no person name). - class EmployerContact < Internal::Types::Model - field :email, -> { String }, optional: false, nullable: true - - field :phone, -> { String }, optional: false, nullable: true - end - end -end diff --git a/lib/VitableConnect/types/employer_hris.rb b/lib/VitableConnect/types/employer_hris.rb deleted file mode 100644 index 62d5545..0000000 --- a/lib/VitableConnect/types/employer_hris.rb +++ /dev/null @@ -1,9 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - class EmployerHris < Internal::Types::Model - field :hris, -> { VitableConnect::Types::HrisConnection }, optional: false, nullable: true - end - end -end diff --git a/lib/VitableConnect/types/employer_hris_response.rb b/lib/VitableConnect/types/employer_hris_response.rb deleted file mode 100644 index 561cea5..0000000 --- a/lib/VitableConnect/types/employer_hris_response.rb +++ /dev/null @@ -1,10 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - # Response containing a single employer hris resource. - class EmployerHrisResponse < Internal::Types::Model - field :data, -> { VitableConnect::Types::EmployerHris }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/employer_hris_status.rb b/lib/VitableConnect/types/employer_hris_status.rb deleted file mode 100644 index 3043f1d..0000000 --- a/lib/VitableConnect/types/employer_hris_status.rb +++ /dev/null @@ -1,13 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - class EmployerHrisStatus < Internal::Types::Model - field :provider, -> { String }, optional: false, nullable: false - - field :provider_label, -> { String }, optional: false, nullable: false - - field :status, -> { String }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/employer_id.rb b/lib/VitableConnect/types/employer_id.rb deleted file mode 100644 index a393497..0000000 --- a/lib/VitableConnect/types/employer_id.rb +++ /dev/null @@ -1,23 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - module EmployerID - # EmployerID is an alias for String - - # @option str [String] - # - # @return [untyped] - def self.load(str) - ::JSON.parse(str) - end - - # @option value [untyped] - # - # @return [String] - def self.dump(value) - ::JSON.generate(value) - end - end - end -end diff --git a/lib/VitableConnect/types/employer_invoice_pdf.rb b/lib/VitableConnect/types/employer_invoice_pdf.rb deleted file mode 100644 index 44bdc87..0000000 --- a/lib/VitableConnect/types/employer_invoice_pdf.rb +++ /dev/null @@ -1,9 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - class EmployerInvoicePdf < Internal::Types::Model - field :download_url, -> { String }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/employer_invoice_pdf_response.rb b/lib/VitableConnect/types/employer_invoice_pdf_response.rb deleted file mode 100644 index 1637904..0000000 --- a/lib/VitableConnect/types/employer_invoice_pdf_response.rb +++ /dev/null @@ -1,10 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - # Response containing a single employer invoice pdf resource. - class EmployerInvoicePdfResponse < Internal::Types::Model - field :data, -> { VitableConnect::Types::EmployerInvoicePdf }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/employer_invoices_list_response.rb b/lib/VitableConnect/types/employer_invoices_list_response.rb deleted file mode 100644 index e833b44..0000000 --- a/lib/VitableConnect/types/employer_invoices_list_response.rb +++ /dev/null @@ -1,12 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - # Cursor-paginated invoices envelope: ``{ "data": [...], "pagination": { "next_offset": ... } }``. - class EmployerInvoicesListResponse < Internal::Types::Model - field :data, -> { Internal::Types::Array[VitableConnect::Types::Invoice] }, optional: false, nullable: false - - field :pagination, -> { VitableConnect::Types::InvoicesCursorPagination }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/employer_payroll_deduction_statement_list_response.rb b/lib/VitableConnect/types/employer_payroll_deduction_statement_list_response.rb deleted file mode 100644 index eabe233..0000000 --- a/lib/VitableConnect/types/employer_payroll_deduction_statement_list_response.rb +++ /dev/null @@ -1,12 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - # Paginated list response containing employer payroll deduction statement resources. - class EmployerPayrollDeductionStatementListResponse < Internal::Types::Model - field :data, -> { Internal::Types::Array[VitableConnect::Types::PayrollDeductionStatement] }, optional: false, nullable: false - - field :pagination, -> { VitableConnect::Types::Pagination }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/employer_response.rb b/lib/VitableConnect/types/employer_response.rb deleted file mode 100644 index d63c080..0000000 --- a/lib/VitableConnect/types/employer_response.rb +++ /dev/null @@ -1,10 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - # Response containing a single employer resource. - class EmployerResponse < Internal::Types::Model - field :data, -> { VitableConnect::Types::Employer }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/employer_search.rb b/lib/VitableConnect/types/employer_search.rb deleted file mode 100644 index 965cc2d..0000000 --- a/lib/VitableConnect/types/employer_search.rb +++ /dev/null @@ -1,23 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - module EmployerSearch - # EmployerSearch is an alias for String - - # @option str [String] - # - # @return [untyped] - def self.load(str) - ::JSON.parse(str) - end - - # @option value [untyped] - # - # @return [String] - def self.dump(value) - ::JSON.generate(value) - end - end - end -end diff --git a/lib/VitableConnect/types/employer_settings.rb b/lib/VitableConnect/types/employer_settings.rb deleted file mode 100644 index 4adc08b..0000000 --- a/lib/VitableConnect/types/employer_settings.rb +++ /dev/null @@ -1,9 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - class EmployerSettings < Internal::Types::Model - field :pay_frequency, -> { VitableConnect::Types::DeductionFrequency }, optional: false, nullable: true - end - end -end diff --git a/lib/VitableConnect/types/employer_settings_response.rb b/lib/VitableConnect/types/employer_settings_response.rb deleted file mode 100644 index 1923ad8..0000000 --- a/lib/VitableConnect/types/employer_settings_response.rb +++ /dev/null @@ -1,10 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - # Response containing a single employer settings resource. - class EmployerSettingsResponse < Internal::Types::Model - field :data, -> { VitableConnect::Types::EmployerSettings }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/enrollment.rb b/lib/VitableConnect/types/enrollment.rb deleted file mode 100644 index a7788f0..0000000 --- a/lib/VitableConnect/types/enrollment.rb +++ /dev/null @@ -1,34 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - # One enrollment as it appears in a list row. - class Enrollment < Internal::Types::Model - field :id, -> { String }, optional: false, nullable: false - - field :employee_id, -> { String }, optional: false, nullable: false - - field :employer_id, -> { String }, optional: false, nullable: false - - field :benefit, -> { VitableConnect::Types::BenefitSummary }, optional: false, nullable: false - - field :status, -> { VitableConnect::Types::EnrollmentStatus }, optional: false, nullable: false - - field :coverage_start, -> { String }, optional: false, nullable: false - - field :coverage_end, -> { String }, optional: false, nullable: true - - field :employee_deduction_in_cents, -> { Integer }, optional: false, nullable: true - - field :employer_contribution_in_cents, -> { Integer }, optional: false, nullable: true - - field :answered_at, -> { String }, optional: false, nullable: true - - field :terminated_at, -> { String }, optional: false, nullable: true - - field :created_at, -> { String }, optional: false, nullable: false - - field :updated_at, -> { String }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/enrollment_detail.rb b/lib/VitableConnect/types/enrollment_detail.rb deleted file mode 100644 index 9ba4f78..0000000 --- a/lib/VitableConnect/types/enrollment_detail.rb +++ /dev/null @@ -1,39 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - # A single enrollment, including the enrolled plan's documents. - # - # The plan documents are resolved one enrollment at a time and are therefore not part of the - # list row. - class EnrollmentDetail < Internal::Types::Model - field :id, -> { String }, optional: false, nullable: false - - field :employee_id, -> { String }, optional: false, nullable: false - - field :employer_id, -> { String }, optional: false, nullable: false - - field :benefit, -> { VitableConnect::Types::BenefitSummary }, optional: false, nullable: false - - field :status, -> { VitableConnect::Types::EnrollmentStatus }, optional: false, nullable: false - - field :coverage_start, -> { String }, optional: false, nullable: false - - field :coverage_end, -> { String }, optional: false, nullable: true - - field :employee_deduction_in_cents, -> { Integer }, optional: false, nullable: true - - field :employer_contribution_in_cents, -> { Integer }, optional: false, nullable: true - - field :answered_at, -> { String }, optional: false, nullable: true - - field :terminated_at, -> { String }, optional: false, nullable: true - - field :created_at, -> { String }, optional: false, nullable: false - - field :updated_at, -> { String }, optional: false, nullable: false - - field :sbc_url, -> { String }, optional: true, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/enrollment_id.rb b/lib/VitableConnect/types/enrollment_id.rb deleted file mode 100644 index 4ed1f68..0000000 --- a/lib/VitableConnect/types/enrollment_id.rb +++ /dev/null @@ -1,23 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - module EnrollmentID - # EnrollmentID is an alias for String - - # @option str [String] - # - # @return [untyped] - def self.load(str) - ::JSON.parse(str) - end - - # @option value [untyped] - # - # @return [String] - def self.dump(value) - ::JSON.generate(value) - end - end - end -end diff --git a/lib/VitableConnect/types/enrollment_list_response.rb b/lib/VitableConnect/types/enrollment_list_response.rb deleted file mode 100644 index 2aa6123..0000000 --- a/lib/VitableConnect/types/enrollment_list_response.rb +++ /dev/null @@ -1,12 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - # Paginated list response containing enrollment resources. - class EnrollmentListResponse < Internal::Types::Model - field :data, -> { Internal::Types::Array[VitableConnect::Types::Enrollment] }, optional: false, nullable: false - - field :pagination, -> { VitableConnect::Types::Pagination }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/enrollment_rate.rb b/lib/VitableConnect/types/enrollment_rate.rb deleted file mode 100644 index 92b687c..0000000 --- a/lib/VitableConnect/types/enrollment_rate.rb +++ /dev/null @@ -1,13 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - class EnrollmentRate < Internal::Types::Model - field :eligible, -> { Integer }, optional: false, nullable: false - - field :enrolled, -> { Integer }, optional: false, nullable: false - - field :percentage, -> { Integer }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/enrollment_rate_summary.rb b/lib/VitableConnect/types/enrollment_rate_summary.rb deleted file mode 100644 index b0bdce5..0000000 --- a/lib/VitableConnect/types/enrollment_rate_summary.rb +++ /dev/null @@ -1,13 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - class EnrollmentRateSummary < Internal::Types::Model - field :eligible, -> { Integer }, optional: false, nullable: false - - field :enrolled, -> { Integer }, optional: false, nullable: false - - field :percentage, -> { Integer }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/enrollment_response.rb b/lib/VitableConnect/types/enrollment_response.rb deleted file mode 100644 index 650b85e..0000000 --- a/lib/VitableConnect/types/enrollment_response.rb +++ /dev/null @@ -1,10 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - # Response containing a single enrollment resource. - class EnrollmentResponse < Internal::Types::Model - field :data, -> { VitableConnect::Types::EnrollmentDetail }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/enrollment_status.rb b/lib/VitableConnect/types/enrollment_status.rb deleted file mode 100644 index 8467eb4..0000000 --- a/lib/VitableConnect/types/enrollment_status.rb +++ /dev/null @@ -1,14 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - module EnrollmentStatus - extend VitableConnect::Internal::Types::Enum - - PENDING = "pending" - ENROLLED = "enrolled" - WAIVED = "waived" - INACTIVE = "inactive" - end - end -end diff --git a/lib/VitableConnect/types/error_response.rb b/lib/VitableConnect/types/error_response.rb deleted file mode 100644 index 8e18323..0000000 --- a/lib/VitableConnect/types/error_response.rb +++ /dev/null @@ -1,17 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - class ErrorResponse < Internal::Types::Model - field :timestamp, -> { String }, optional: false, nullable: false - - field :message, -> { String }, optional: false, nullable: false - - field :error, -> { String }, optional: false, nullable: false - - field :app_error_code, -> { String }, optional: true, nullable: false - - field :trace_id, -> { String }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/event_id.rb b/lib/VitableConnect/types/event_id.rb deleted file mode 100644 index 29cdf0a..0000000 --- a/lib/VitableConnect/types/event_id.rb +++ /dev/null @@ -1,23 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - module EventID - # EventID is an alias for String - - # @option str [String] - # - # @return [untyped] - def self.load(str) - ::JSON.parse(str) - end - - # @option value [untyped] - # - # @return [String] - def self.dump(value) - ::JSON.generate(value) - end - end - end -end diff --git a/lib/VitableConnect/types/event_name.rb b/lib/VitableConnect/types/event_name.rb deleted file mode 100644 index 3e6db11..0000000 --- a/lib/VitableConnect/types/event_name.rb +++ /dev/null @@ -1,21 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - module EventName - extend VitableConnect::Internal::Types::Enum - - ENROLLMENT_ACCEPTED = "enrollment.accepted" - ENROLLMENT_TERMINATED = "enrollment.terminated" - ENROLLMENT_TERMINATION_RESCHEDULED = "enrollment.termination_rescheduled" - ENROLLMENT_ELECTED = "enrollment.elected" - ENROLLMENT_GRANTED = "enrollment.granted" - ENROLLMENT_WAIVED = "enrollment.waived" - ENROLLMENT_STARTED = "enrollment.started" - EMPLOYEE_ELIGIBILITY_GRANTED = "employee.eligibility_granted" - EMPLOYEE_ELIGIBILITY_TERMINATED = "employee.eligibility_terminated" - EMPLOYEE_DEACTIVATED = "employee.deactivated" - EMPLOYEE_DEDUCTION_CREATED = "employee.deduction_created" - end - end -end diff --git a/lib/VitableConnect/types/gender.rb b/lib/VitableConnect/types/gender.rb deleted file mode 100644 index 8981907..0000000 --- a/lib/VitableConnect/types/gender.rb +++ /dev/null @@ -1,15 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - module Gender - extend VitableConnect::Internal::Types::Enum - - MALE = "Male" - FEMALE = "Female" - TRANSGENDER = "Transgender" - NON_BINARY = "Non-binary" - PREFER_NOT_TO_RESPOND = "Prefer not to respond" - end - end -end diff --git a/lib/VitableConnect/types/grant_type.rb b/lib/VitableConnect/types/grant_type.rb deleted file mode 100644 index 7444518..0000000 --- a/lib/VitableConnect/types/grant_type.rb +++ /dev/null @@ -1,11 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - module GrantType - extend VitableConnect::Internal::Types::Enum - - CLIENT_CREDENTIALS = "client_credentials" - end - end -end diff --git a/lib/VitableConnect/types/group.rb b/lib/VitableConnect/types/group.rb deleted file mode 100644 index ea87068..0000000 --- a/lib/VitableConnect/types/group.rb +++ /dev/null @@ -1,19 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - class Group < Internal::Types::Model - field :id, -> { String }, optional: false, nullable: false - - field :organization_id, -> { String }, optional: false, nullable: false - - field :name, -> { String }, optional: false, nullable: false - - field :external_reference_id, -> { String }, optional: false, nullable: false - - field :created_at, -> { String }, optional: false, nullable: true - - field :updated_at, -> { String }, optional: false, nullable: true - end - end -end diff --git a/lib/VitableConnect/types/group_id.rb b/lib/VitableConnect/types/group_id.rb deleted file mode 100644 index bf2bf5a..0000000 --- a/lib/VitableConnect/types/group_id.rb +++ /dev/null @@ -1,23 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - module GroupID - # GroupID is an alias for String - - # @option str [String] - # - # @return [untyped] - def self.load(str) - ::JSON.parse(str) - end - - # @option value [untyped] - # - # @return [String] - def self.dump(value) - ::JSON.generate(value) - end - end - end -end diff --git a/lib/VitableConnect/types/group_list_response.rb b/lib/VitableConnect/types/group_list_response.rb deleted file mode 100644 index d7bbb81..0000000 --- a/lib/VitableConnect/types/group_list_response.rb +++ /dev/null @@ -1,12 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - # Paginated list response containing group resources. - class GroupListResponse < Internal::Types::Model - field :data, -> { Internal::Types::Array[VitableConnect::Types::Group] }, optional: false, nullable: false - - field :pagination, -> { VitableConnect::Types::Pagination }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/group_member_sync_detail_response.rb b/lib/VitableConnect/types/group_member_sync_detail_response.rb deleted file mode 100644 index 69a69f9..0000000 --- a/lib/VitableConnect/types/group_member_sync_detail_response.rb +++ /dev/null @@ -1,10 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - # Response containing a single group member sync detail resource. - class GroupMemberSyncDetailResponse < Internal::Types::Model - field :data, -> { VitableConnect::Types::GroupMemberSyncResponse }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/group_member_sync_failure.rb b/lib/VitableConnect/types/group_member_sync_failure.rb deleted file mode 100644 index a8c81d5..0000000 --- a/lib/VitableConnect/types/group_member_sync_failure.rb +++ /dev/null @@ -1,13 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - class GroupMemberSyncFailure < Internal::Types::Model - field :reference_id, -> { String }, optional: false, nullable: false - - field :operation, -> { VitableConnect::Types::Operation }, optional: false, nullable: false - - field :reason, -> { String }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/group_member_sync_member_request.rb b/lib/VitableConnect/types/group_member_sync_member_request.rb deleted file mode 100644 index a40e569..0000000 --- a/lib/VitableConnect/types/group_member_sync_member_request.rb +++ /dev/null @@ -1,23 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - class GroupMemberSyncMemberRequest < Internal::Types::Model - field :reference_id, -> { String }, optional: false, nullable: false - - field :first_name, -> { String }, optional: false, nullable: false - - field :last_name, -> { String }, optional: false, nullable: false - - field :date_of_birth, -> { String }, optional: false, nullable: false - - field :phone, -> { String }, optional: true, nullable: false - - field :plan_id, -> { String }, optional: false, nullable: false - - field :address, -> { VitableConnect::Types::AddressRequest }, optional: false, nullable: false - - field :email, -> { String }, optional: true, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/group_member_sync_request_detail.rb b/lib/VitableConnect/types/group_member_sync_request_detail.rb deleted file mode 100644 index dbbdc52..0000000 --- a/lib/VitableConnect/types/group_member_sync_request_detail.rb +++ /dev/null @@ -1,17 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - class GroupMemberSyncRequestDetail < Internal::Types::Model - field :request_id, -> { String }, optional: false, nullable: false - - field :group_id, -> { String }, optional: false, nullable: false - - field :accepted_at, -> { String }, optional: false, nullable: false - - field :completed_at, -> { String }, optional: false, nullable: true - - field :results, -> { VitableConnect::Types::GroupMemberSyncResults }, optional: false, nullable: true - end - end -end diff --git a/lib/VitableConnect/types/group_member_sync_request_detail_response.rb b/lib/VitableConnect/types/group_member_sync_request_detail_response.rb deleted file mode 100644 index ce1c5ac..0000000 --- a/lib/VitableConnect/types/group_member_sync_request_detail_response.rb +++ /dev/null @@ -1,10 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - # Response containing a single group member sync request detail resource. - class GroupMemberSyncRequestDetailResponse < Internal::Types::Model - field :data, -> { VitableConnect::Types::GroupMemberSyncRequestDetail }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/group_member_sync_response.rb b/lib/VitableConnect/types/group_member_sync_response.rb deleted file mode 100644 index ff650c0..0000000 --- a/lib/VitableConnect/types/group_member_sync_response.rb +++ /dev/null @@ -1,13 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - class GroupMemberSyncResponse < Internal::Types::Model - field :request_id, -> { String }, optional: false, nullable: false - - field :group_id, -> { String }, optional: false, nullable: false - - field :accepted_at, -> { String }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/group_member_sync_results.rb b/lib/VitableConnect/types/group_member_sync_results.rb deleted file mode 100644 index 6b32fca..0000000 --- a/lib/VitableConnect/types/group_member_sync_results.rb +++ /dev/null @@ -1,13 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - class GroupMemberSyncResults < Internal::Types::Model - field :added_group_member_ids, -> { Internal::Types::Array[String] }, optional: false, nullable: false - - field :removed_group_member_ids, -> { Internal::Types::Array[String] }, optional: false, nullable: false - - field :failures, -> { Internal::Types::Array[VitableConnect::Types::GroupMemberSyncFailure] }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/group_response.rb b/lib/VitableConnect/types/group_response.rb deleted file mode 100644 index b7160b1..0000000 --- a/lib/VitableConnect/types/group_response.rb +++ /dev/null @@ -1,10 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - # Response containing a single group resource. - class GroupResponse < Internal::Types::Model - field :data, -> { VitableConnect::Types::Group }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/household_member.rb b/lib/VitableConnect/types/household_member.rb deleted file mode 100644 index 8acdfef..0000000 --- a/lib/VitableConnect/types/household_member.rb +++ /dev/null @@ -1,22 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - # Wire serializer for :class:`HouseholdMemberDTO` (one household participant). - class HouseholdMember < Internal::Types::Model - field :member_id, -> { String }, optional: true, nullable: false - - field :first_name, -> { String }, optional: false, nullable: false - - field :last_name, -> { String }, optional: false, nullable: false - - field :relationship, -> { VitableConnect::Types::HouseholdMemberRelationship }, optional: true, nullable: false - - field :member_type, -> { VitableConnect::Types::HouseholdMemberType }, optional: false, nullable: false - - field :date_of_birth, -> { String }, optional: false, nullable: false - - field :household_admin_in, -> { Internal::Types::Boolean }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/household_member_relationship.rb b/lib/VitableConnect/types/household_member_relationship.rb deleted file mode 100644 index c469cd9..0000000 --- a/lib/VitableConnect/types/household_member_relationship.rb +++ /dev/null @@ -1,14 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - module HouseholdMemberRelationship - extend VitableConnect::Internal::Types::Enum - - CHILD = "Child" - SPOUSE = "Spouse" - ROOMMATE = "Roommate" - OTHER = "Other" - end - end -end diff --git a/lib/VitableConnect/types/household_member_type.rb b/lib/VitableConnect/types/household_member_type.rb deleted file mode 100644 index 93e314f..0000000 --- a/lib/VitableConnect/types/household_member_type.rb +++ /dev/null @@ -1,13 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - module HouseholdMemberType - extend VitableConnect::Internal::Types::Enum - - ACCOUNT_HOLDER = "Account Holder" - DEPENDENT = "Dependent" - INACTIVE = "Inactive" - end - end -end diff --git a/lib/VitableConnect/types/household_members_response.rb b/lib/VitableConnect/types/household_members_response.rb deleted file mode 100644 index 602e7fc..0000000 --- a/lib/VitableConnect/types/household_members_response.rb +++ /dev/null @@ -1,10 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - # Unpaginated ``{"data": [...]}`` list of the members of a member's household. - class HouseholdMembersResponse < Internal::Types::Model - field :data, -> { Internal::Types::Array[VitableConnect::Types::HouseholdMember] }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/hris_connection.rb b/lib/VitableConnect/types/hris_connection.rb deleted file mode 100644 index b2eaadf..0000000 --- a/lib/VitableConnect/types/hris_connection.rb +++ /dev/null @@ -1,17 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - class HrisConnection < Internal::Types::Model - field :provider, -> { String }, optional: false, nullable: false - - field :provider_label, -> { String }, optional: false, nullable: false - - field :status, -> { String }, optional: false, nullable: false - - field :last_sync_on, -> { String }, optional: false, nullable: true - - field :synced_row_count, -> { Integer }, optional: false, nullable: true - end - end -end diff --git a/lib/VitableConnect/types/hris_status_item.rb b/lib/VitableConnect/types/hris_status_item.rb deleted file mode 100644 index 751a909..0000000 --- a/lib/VitableConnect/types/hris_status_item.rb +++ /dev/null @@ -1,15 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - module HrisStatusItem - extend VitableConnect::Internal::Types::Enum - - PENDING = "Pending" - ACTIVE = "Active" - INACTIVE = "Inactive" - PAUSED = "Paused" - TERMINATED = "Terminated" - end - end -end diff --git a/lib/VitableConnect/types/ichra_contribution_class.rb b/lib/VitableConnect/types/ichra_contribution_class.rb deleted file mode 100644 index 57ad2f6..0000000 --- a/lib/VitableConnect/types/ichra_contribution_class.rb +++ /dev/null @@ -1,29 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - # One ICHRA contribution class, mirroring the internal configuration endpoint's - # ``IchraContributionClassConfigurationEntitySerializer`` field-for-field. Two deliberate - # differences for the public surface: the identifier is the opaque prefixed ``iccl_*`` form rather - # than a raw UUID, and the matcher choices come from the domain enums rather than the model's. - class IchraContributionClass < Internal::Types::Model - field :contribution_class_id, -> { String }, optional: false, nullable: false - - field :amount_in_cents, -> { Integer }, optional: false, nullable: false - - field :employment, -> { VitableConnect::Types::ContributionClassEmployment }, optional: false, nullable: false - - field :compensation, -> { VitableConnect::Types::ContributionClassCompensation }, optional: false, nullable: false - - field :location, -> { VitableConnect::Types::ContributionClassLocation }, optional: false, nullable: false - - field :location_value, -> { String }, optional: false, nullable: true - - field :family_status, -> { VitableConnect::Types::CoverageTier }, optional: false, nullable: false - - field :min_age, -> { Integer }, optional: false, nullable: true - - field :max_age, -> { Integer }, optional: false, nullable: true - end - end -end diff --git a/lib/VitableConnect/types/idp_provider.rb b/lib/VitableConnect/types/idp_provider.rb deleted file mode 100644 index 4eb8853..0000000 --- a/lib/VitableConnect/types/idp_provider.rb +++ /dev/null @@ -1,12 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - module IdpProvider - extend VitableConnect::Internal::Types::Enum - - WORKOS = "workos" - VITABLE = "vitable" - end - end -end diff --git a/lib/VitableConnect/types/include_cancelled.rb b/lib/VitableConnect/types/include_cancelled.rb deleted file mode 100644 index 3397130..0000000 --- a/lib/VitableConnect/types/include_cancelled.rb +++ /dev/null @@ -1,23 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - module IncludeCancelled - # IncludeCancelled is an alias for Boolean - - # @option str [String] - # - # @return [untyped] - def self.load(str) - ::JSON.parse(str) - end - - # @option value [untyped] - # - # @return [String] - def self.dump(value) - ::JSON.generate(value) - end - end - end -end diff --git a/lib/VitableConnect/types/invoice.rb b/lib/VitableConnect/types/invoice.rb deleted file mode 100644 index 6b0b2d8..0000000 --- a/lib/VitableConnect/types/invoice.rb +++ /dev/null @@ -1,15 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - class Invoice < Internal::Types::Model - field :invoice_id, -> { String }, optional: false, nullable: false - - field :period, -> { String }, optional: false, nullable: true - - field :total, -> { Integer }, optional: false, nullable: true - - field :status, -> { String }, optional: false, nullable: true - end - end -end diff --git a/lib/VitableConnect/types/invoice_id.rb b/lib/VitableConnect/types/invoice_id.rb deleted file mode 100644 index 04676f3..0000000 --- a/lib/VitableConnect/types/invoice_id.rb +++ /dev/null @@ -1,23 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - module InvoiceID - # InvoiceID is an alias for String - - # @option str [String] - # - # @return [untyped] - def self.load(str) - ::JSON.parse(str) - end - - # @option value [untyped] - # - # @return [String] - def self.dump(value) - ::JSON.generate(value) - end - end - end -end diff --git a/lib/VitableConnect/types/invoices_cursor_pagination.rb b/lib/VitableConnect/types/invoices_cursor_pagination.rb deleted file mode 100644 index 34b4834..0000000 --- a/lib/VitableConnect/types/invoices_cursor_pagination.rb +++ /dev/null @@ -1,9 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - class InvoicesCursorPagination < Internal::Types::Model - field :next_offset, -> { String }, optional: false, nullable: true - end - end -end diff --git a/lib/VitableConnect/types/limit.rb b/lib/VitableConnect/types/limit.rb deleted file mode 100644 index 1bb554a..0000000 --- a/lib/VitableConnect/types/limit.rb +++ /dev/null @@ -1,23 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - module Limit - # Limit is an alias for Integer - - # @option str [String] - # - # @return [untyped] - def self.load(str) - ::JSON.parse(str) - end - - # @option value [untyped] - # - # @return [String] - def self.dump(value) - ::JSON.generate(value) - end - end - end -end diff --git a/lib/VitableConnect/types/list_webhook_event_deliveries_response.rb b/lib/VitableConnect/types/list_webhook_event_deliveries_response.rb deleted file mode 100644 index dacc157..0000000 --- a/lib/VitableConnect/types/list_webhook_event_deliveries_response.rb +++ /dev/null @@ -1,9 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - class ListWebhookEventDeliveriesResponse < Internal::Types::Model - field :data, -> { Internal::Types::Array[VitableConnect::Types::WebhookDelivery] }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/marital_status.rb b/lib/VitableConnect/types/marital_status.rb deleted file mode 100644 index 70f8ff6..0000000 --- a/lib/VitableConnect/types/marital_status.rb +++ /dev/null @@ -1,12 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - module MaritalStatus - extend VitableConnect::Internal::Types::Enum - - SINGLE = "Single" - MARRIED = "Married" - end - end -end diff --git a/lib/VitableConnect/types/member.rb b/lib/VitableConnect/types/member.rb deleted file mode 100644 index 4becfc4..0000000 --- a/lib/VitableConnect/types/member.rb +++ /dev/null @@ -1,42 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - # A member's profile: identity, contact details, address, demographics, and onboarding status. - class Member < Internal::Types::Model - field :id, -> { String }, optional: true, nullable: false - - field :first_name, -> { String }, optional: false, nullable: false - - field :last_name, -> { String }, optional: false, nullable: false - - field :email, -> { String }, optional: true, nullable: false - - field :phone, -> { String }, optional: true, nullable: false - - field :address, -> { VitableConnect::Types::MemberAddress }, optional: true, nullable: false - - field :name, -> { String }, optional: true, nullable: false - - field :middle_name, -> { String }, optional: true, nullable: false - - field :suffix, -> { VitableConnect::Types::NameSuffix }, optional: true, nullable: false - - field :date_of_birth, -> { String }, optional: false, nullable: false - - field :age, -> { Integer }, optional: false, nullable: false - - field :sex_at_birth, -> { VitableConnect::Types::SexAtBirth }, optional: true, nullable: false - - field :gender, -> { VitableConnect::Types::Gender }, optional: true, nullable: false - - field :preferred_language, -> { VitableConnect::Types::PreferredLanguage }, optional: true, nullable: false - - field :tobacco_status, -> { Internal::Types::Boolean }, optional: true, nullable: false - - field :marital_status, -> { VitableConnect::Types::MaritalStatus }, optional: true, nullable: false - - field :status, -> { VitableConnect::Types::MemberStatus }, optional: true, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/member_address.rb b/lib/VitableConnect/types/member_address.rb deleted file mode 100644 index 8524ddc..0000000 --- a/lib/VitableConnect/types/member_address.rb +++ /dev/null @@ -1,17 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - class MemberAddress < Internal::Types::Model - field :address_line1, -> { String }, optional: false, nullable: false, api_name: "address_line_1" - - field :address_line2, -> { String }, optional: true, nullable: false, api_name: "address_line_2" - - field :city, -> { String }, optional: false, nullable: false - - field :state, -> { VitableConnect::Types::State }, optional: false, nullable: false - - field :zipcode, -> { String }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/member_dependents_response.rb b/lib/VitableConnect/types/member_dependents_response.rb deleted file mode 100644 index 9542b42..0000000 --- a/lib/VitableConnect/types/member_dependents_response.rb +++ /dev/null @@ -1,10 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - # Unpaginated ``{"data": [...]}`` list of member dependents. - class MemberDependentsResponse < Internal::Types::Model - field :data, -> { Internal::Types::Array[VitableConnect::Types::MemberLegalDependent] }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/member_digital_benefit_cards_response.rb b/lib/VitableConnect/types/member_digital_benefit_cards_response.rb deleted file mode 100644 index d5bd68e..0000000 --- a/lib/VitableConnect/types/member_digital_benefit_cards_response.rb +++ /dev/null @@ -1,10 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - # Unpaginated ``{"data": [...]}`` list of member digital benefit cards. - class MemberDigitalBenefitCardsResponse < Internal::Types::Model - field :data, -> { Internal::Types::Array[VitableConnect::Types::DigitalBenefitCard] }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/member_employments_response.rb b/lib/VitableConnect/types/member_employments_response.rb deleted file mode 100644 index b6c7f2f..0000000 --- a/lib/VitableConnect/types/member_employments_response.rb +++ /dev/null @@ -1,10 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - # Unpaginated ``{"data": [...]}`` list of member employments. - class MemberEmploymentsResponse < Internal::Types::Model - field :data, -> { Internal::Types::Array[VitableConnect::Types::Employee] }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/member_enrollment.rb b/lib/VitableConnect/types/member_enrollment.rb deleted file mode 100644 index 5030db7..0000000 --- a/lib/VitableConnect/types/member_enrollment.rb +++ /dev/null @@ -1,58 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - # Wire serializer for :class:`MemberEnrollmentDTO` (one benefit enrollment row). - class MemberEnrollment < Internal::Types::Model - field :id, -> { String }, optional: false, nullable: false - - field :employer_id, -> { String }, optional: false, nullable: false - - field :benefit_plan_year_id, -> { String }, optional: false, nullable: false - - field :benefit_type, -> { VitableConnect::Types::Category }, optional: false, nullable: false - - field :product_code, -> { VitableConnect::Types::ProductCode }, optional: false, nullable: false - - field :requires_qle_for_reissue, -> { Internal::Types::Boolean }, optional: false, nullable: false - - field :product_name, -> { String }, optional: false, nullable: false - - field :employer_name, -> { String }, optional: false, nullable: false - - field :carrier_name, -> { String }, optional: true, nullable: false - - field :plan_name, -> { String }, optional: true, nullable: false - - field :tier_name, -> { String }, optional: true, nullable: false - - field :employee_deduction_in_cents, -> { Integer }, optional: true, nullable: false - - field :employer_contribution_in_cents, -> { Integer }, optional: true, nullable: false - - field :premium_in_cents, -> { Integer }, optional: true, nullable: false - - field :coverage_start, -> { String }, optional: true, nullable: false - - field :coverage_end, -> { String }, optional: true, nullable: false - - field :cancelled_date, -> { String }, optional: false, nullable: true - - field :plan_year_coverage_end, -> { String }, optional: false, nullable: true - - field :issued_date, -> { String }, optional: false, nullable: false - - field :enrollment_window_start, -> { String }, optional: false, nullable: false - - field :enrollment_window_end, -> { String }, optional: true, nullable: false - - field :election_status, -> { VitableConnect::Types::PlanYearEnrollmentElectionStatus }, optional: false, nullable: false - - field :policy_status, -> { VitableConnect::Types::PlanYearEnrollmentPolicyStatus }, optional: false, nullable: true - - field :in_last_month_of_coverage, -> { Internal::Types::Boolean }, optional: false, nullable: false - - field :is_within_enrollment_window, -> { Internal::Types::Boolean }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/member_enrollments_response.rb b/lib/VitableConnect/types/member_enrollments_response.rb deleted file mode 100644 index 3f3f5fc..0000000 --- a/lib/VitableConnect/types/member_enrollments_response.rb +++ /dev/null @@ -1,10 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - # Unpaginated ``{"data": [...]}`` list of member enrollments. - class MemberEnrollmentsResponse < Internal::Types::Model - field :data, -> { Internal::Types::Array[VitableConnect::Types::MemberEnrollment] }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/member_id.rb b/lib/VitableConnect/types/member_id.rb deleted file mode 100644 index 2d8d3d7..0000000 --- a/lib/VitableConnect/types/member_id.rb +++ /dev/null @@ -1,23 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - module MemberID - # MemberID is an alias for String - - # @option str [String] - # - # @return [untyped] - def self.load(str) - ::JSON.parse(str) - end - - # @option value [untyped] - # - # @return [String] - def self.dump(value) - ::JSON.generate(value) - end - end - end -end diff --git a/lib/VitableConnect/types/member_legal_dependent.rb b/lib/VitableConnect/types/member_legal_dependent.rb deleted file mode 100644 index 38fce09..0000000 --- a/lib/VitableConnect/types/member_legal_dependent.rb +++ /dev/null @@ -1,24 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - # Wire serializer for :class:`MemberLegalDependentDTO` (one legal-dependent row). - class MemberLegalDependent < Internal::Types::Model - field :member_id, -> { String }, optional: true, nullable: false - - field :primary_member_id, -> { String }, optional: true, nullable: false - - field :first_name, -> { String }, optional: false, nullable: false - - field :last_name, -> { String }, optional: false, nullable: false - - field :relationship, -> { VitableConnect::Types::Relationship }, optional: false, nullable: false - - field :date_of_birth, -> { String }, optional: false, nullable: false - - field :age, -> { Integer }, optional: false, nullable: false - - field :sex_at_birth, -> { VitableConnect::Types::SexAtBirth }, optional: true, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/member_list_item.rb b/lib/VitableConnect/types/member_list_item.rb deleted file mode 100644 index 92fabdc..0000000 --- a/lib/VitableConnect/types/member_list_item.rb +++ /dev/null @@ -1,20 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - # A member in the organization's directory: identity, contact details, address, and join date. - class MemberListItem < Internal::Types::Model - field :id, -> { String }, optional: true, nullable: false - - field :first_name, -> { String }, optional: false, nullable: false - - field :last_name, -> { String }, optional: false, nullable: false - - field :email, -> { String }, optional: true, nullable: false - - field :phone, -> { String }, optional: true, nullable: false - - field :address, -> { VitableConnect::Types::MemberAddress }, optional: true, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/member_list_response.rb b/lib/VitableConnect/types/member_list_response.rb deleted file mode 100644 index be47baa..0000000 --- a/lib/VitableConnect/types/member_list_response.rb +++ /dev/null @@ -1,12 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - # Paginated list response containing member resources. - class MemberListResponse < Internal::Types::Model - field :data, -> { Internal::Types::Array[VitableConnect::Types::MemberListItem] }, optional: false, nullable: false - - field :pagination, -> { VitableConnect::Types::Pagination }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/member_qualifying_life_event.rb b/lib/VitableConnect/types/member_qualifying_life_event.rb deleted file mode 100644 index 5c7c474..0000000 --- a/lib/VitableConnect/types/member_qualifying_life_event.rb +++ /dev/null @@ -1,19 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - class MemberQualifyingLifeEvent < Internal::Types::Model - field :id, -> { String }, optional: false, nullable: false - - field :event_type, -> { VitableConnect::Types::QualifyingLifeEventType }, optional: false, nullable: false - - field :event_type_label, -> { String }, optional: false, nullable: false - - field :other_event, -> { String }, optional: false, nullable: true - - field :status, -> { VitableConnect::Types::QualifyingLifeEventStatus }, optional: false, nullable: false - - field :submitted_at, -> { String }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/member_qualifying_life_event_list_response.rb b/lib/VitableConnect/types/member_qualifying_life_event_list_response.rb deleted file mode 100644 index b37fc8b..0000000 --- a/lib/VitableConnect/types/member_qualifying_life_event_list_response.rb +++ /dev/null @@ -1,12 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - # Paginated list response containing member qualifying life event resources. - class MemberQualifyingLifeEventListResponse < Internal::Types::Model - field :data, -> { Internal::Types::Array[VitableConnect::Types::MemberQualifyingLifeEvent] }, optional: false, nullable: false - - field :pagination, -> { VitableConnect::Types::Pagination }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/member_response.rb b/lib/VitableConnect/types/member_response.rb deleted file mode 100644 index c690541..0000000 --- a/lib/VitableConnect/types/member_response.rb +++ /dev/null @@ -1,10 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - # Response containing a single member resource. - class MemberResponse < Internal::Types::Model - field :data, -> { VitableConnect::Types::Member }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/member_search.rb b/lib/VitableConnect/types/member_search.rb deleted file mode 100644 index 12b3da0..0000000 --- a/lib/VitableConnect/types/member_search.rb +++ /dev/null @@ -1,23 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - module MemberSearch - # MemberSearch is an alias for String - - # @option str [String] - # - # @return [untyped] - def self.load(str) - ::JSON.parse(str) - end - - # @option value [untyped] - # - # @return [String] - def self.dump(value) - ::JSON.generate(value) - end - end - end -end diff --git a/lib/VitableConnect/types/member_status.rb b/lib/VitableConnect/types/member_status.rb deleted file mode 100644 index f0411fb..0000000 --- a/lib/VitableConnect/types/member_status.rb +++ /dev/null @@ -1,12 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - module MemberStatus - extend VitableConnect::Internal::Types::Enum - - ONBOARDED = "onboarded" - PENDING_ONBOARDING = "pending_onboarding" - end - end -end diff --git a/lib/VitableConnect/types/missing_employee_resolution.rb b/lib/VitableConnect/types/missing_employee_resolution.rb deleted file mode 100644 index 17e8dd1..0000000 --- a/lib/VitableConnect/types/missing_employee_resolution.rb +++ /dev/null @@ -1,12 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - module MissingEmployeeResolution - extend VitableConnect::Internal::Types::Enum - - EMAIL_CENSUS = "EMAIL_CENSUS" - SECOND_SYSTEM_ACCESS = "SECOND_SYSTEM_ACCESS" - end - end -end diff --git a/lib/VitableConnect/types/name_suffix.rb b/lib/VitableConnect/types/name_suffix.rb deleted file mode 100644 index f3692f9..0000000 --- a/lib/VitableConnect/types/name_suffix.rb +++ /dev/null @@ -1,17 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - module NameSuffix - extend VitableConnect::Internal::Types::Enum - - SR = "Sr" - JR = "Jr" - I = "I" - II = "II" - III = "III" - IV = "IV" - V = "V" - end - end -end diff --git a/lib/VitableConnect/types/offset.rb b/lib/VitableConnect/types/offset.rb deleted file mode 100644 index 77f04a6..0000000 --- a/lib/VitableConnect/types/offset.rb +++ /dev/null @@ -1,23 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - module Offset - # Offset is an alias for Object - - # @option str [String] - # - # @return [untyped] - def self.load(str) - ::JSON.parse(str) - end - - # @option value [untyped] - # - # @return [String] - def self.dump(value) - ::JSON.generate(value) - end - end - end -end diff --git a/lib/VitableConnect/types/operation.rb b/lib/VitableConnect/types/operation.rb deleted file mode 100644 index f3a5c26..0000000 --- a/lib/VitableConnect/types/operation.rb +++ /dev/null @@ -1,12 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - module Operation - extend VitableConnect::Internal::Types::Enum - - ADD = "add" - REMOVE = "remove" - end - end -end diff --git a/lib/VitableConnect/types/organization.rb b/lib/VitableConnect/types/organization.rb deleted file mode 100644 index 8f8647a..0000000 --- a/lib/VitableConnect/types/organization.rb +++ /dev/null @@ -1,19 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - class Organization < Internal::Types::Model - field :id, -> { String }, optional: false, nullable: false - - field :name, -> { String }, optional: false, nullable: false - - field :type, -> { VitableConnect::Types::OrganizationType }, optional: false, nullable: true - - field :idp_org_id, -> { String }, optional: false, nullable: true - - field :idp_provider, -> { VitableConnect::Types::IdpProvider }, optional: false, nullable: true - - field :super_in, -> { Internal::Types::Boolean }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/organization_employer.rb b/lib/VitableConnect/types/organization_employer.rb deleted file mode 100644 index b9cb3be..0000000 --- a/lib/VitableConnect/types/organization_employer.rb +++ /dev/null @@ -1,44 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - # One employer row of the organization's book (list projection). - # - # Carries the enriched/computed columns (enrollment roll-up, benefit-family tags, HRIS connection, - # benefit-lifecycle stage) alongside the flat CRM fields of the underlying employer (legal name, - # EIN, contact, address, timestamps) for parity with the legacy ``Employer`` contract. - class OrganizationEmployer < Internal::Types::Model - field :employer_id, -> { String }, optional: false, nullable: false - - field :organization_id, -> { String }, optional: false, nullable: true - - field :reference_id, -> { String }, optional: false, nullable: true - - field :name, -> { String }, optional: false, nullable: false - - field :legal_name, -> { String }, optional: false, nullable: true - - field :ein, -> { String }, optional: false, nullable: true - - field :email, -> { String }, optional: false, nullable: true - - field :phone_number, -> { String }, optional: false, nullable: true - - field :active, -> { Internal::Types::Boolean }, optional: false, nullable: false - - field :address, -> { VitableConnect::Types::Address }, optional: false, nullable: false - - field :created_at, -> { String }, optional: false, nullable: false - - field :updated_at, -> { String }, optional: false, nullable: false - - field :enrollment_rate_summary, -> { VitableConnect::Types::EnrollmentRateSummary }, optional: false, nullable: false - - field :benefit_families, -> { Internal::Types::Array[String] }, optional: false, nullable: false - - field :hris_status, -> { VitableConnect::Types::EmployerHrisStatus }, optional: false, nullable: true - - field :benefit_lifecycle_stage, -> { VitableConnect::Types::EmployerBenefitLifecycleStage }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/organization_employer_list_response.rb b/lib/VitableConnect/types/organization_employer_list_response.rb deleted file mode 100644 index f8fe9d8..0000000 --- a/lib/VitableConnect/types/organization_employer_list_response.rb +++ /dev/null @@ -1,12 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - # Paginated list response containing organization employer resources. - class OrganizationEmployerListResponse < Internal::Types::Model - field :data, -> { Internal::Types::Array[VitableConnect::Types::OrganizationEmployer] }, optional: false, nullable: false - - field :pagination, -> { VitableConnect::Types::Pagination }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/organization_hris_provider.rb b/lib/VitableConnect/types/organization_hris_provider.rb deleted file mode 100644 index 47a965d..0000000 --- a/lib/VitableConnect/types/organization_hris_provider.rb +++ /dev/null @@ -1,11 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - class OrganizationHrisProvider < Internal::Types::Model - field :provider, -> { String }, optional: false, nullable: false - - field :provider_label, -> { String }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/organization_hris_providers_response.rb b/lib/VitableConnect/types/organization_hris_providers_response.rb deleted file mode 100644 index 93cb0db..0000000 --- a/lib/VitableConnect/types/organization_hris_providers_response.rb +++ /dev/null @@ -1,10 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - # Unpaginated ``{"data": [...]}`` list of organization hris providers. - class OrganizationHrisProvidersResponse < Internal::Types::Model - field :data, -> { Internal::Types::Array[VitableConnect::Types::OrganizationHrisProvider] }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/organization_type.rb b/lib/VitableConnect/types/organization_type.rb deleted file mode 100644 index d4e5cd7..0000000 --- a/lib/VitableConnect/types/organization_type.rb +++ /dev/null @@ -1,16 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - module OrganizationType - extend VitableConnect::Internal::Types::Enum - - BROKERAGE = "BROKERAGE" - TPA = "TPA" - GENERAL_AGENT = "GENERAL_AGENT" - CHANNEL_PARTNER = "CHANNEL_PARTNER" - CONSULTING_FIRM = "CONSULTING_FIRM" - API_PLATFORM = "API_PLATFORM" - end - end -end diff --git a/lib/VitableConnect/types/organizations_list_response.rb b/lib/VitableConnect/types/organizations_list_response.rb deleted file mode 100644 index 7fd2268..0000000 --- a/lib/VitableConnect/types/organizations_list_response.rb +++ /dev/null @@ -1,12 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - # Envelope for the caller's organization memberships (paginated). - class OrganizationsListResponse < Internal::Types::Model - field :organizations, -> { Internal::Types::Array[VitableConnect::Types::Organization] }, optional: false, nullable: false - - field :total, -> { Integer }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/page.rb b/lib/VitableConnect/types/page.rb deleted file mode 100644 index c7a46ba..0000000 --- a/lib/VitableConnect/types/page.rb +++ /dev/null @@ -1,23 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - module Page - # Page is an alias for Integer - - # @option str [String] - # - # @return [untyped] - def self.load(str) - ::JSON.parse(str) - end - - # @option value [untyped] - # - # @return [String] - def self.dump(value) - ::JSON.generate(value) - end - end - end -end diff --git a/lib/VitableConnect/types/pagination.rb b/lib/VitableConnect/types/pagination.rb deleted file mode 100644 index b5c4f25..0000000 --- a/lib/VitableConnect/types/pagination.rb +++ /dev/null @@ -1,16 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - # Pagination metadata for list responses. - class Pagination < Internal::Types::Model - field :page, -> { Integer }, optional: false, nullable: false - - field :limit, -> { Integer }, optional: false, nullable: false - - field :total, -> { Integer }, optional: false, nullable: false - - field :total_pages, -> { Integer }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/payroll_access_setup_status.rb b/lib/VitableConnect/types/payroll_access_setup_status.rb deleted file mode 100644 index ef07b3f..0000000 --- a/lib/VitableConnect/types/payroll_access_setup_status.rb +++ /dev/null @@ -1,11 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - class PayrollAccessSetupStatus < Internal::Types::Model - field :completed, -> { Internal::Types::Boolean }, optional: false, nullable: false - - field :submitted_at, -> { String }, optional: false, nullable: true - end - end -end diff --git a/lib/VitableConnect/types/payroll_access_setup_status_response.rb b/lib/VitableConnect/types/payroll_access_setup_status_response.rb deleted file mode 100644 index 4623840..0000000 --- a/lib/VitableConnect/types/payroll_access_setup_status_response.rb +++ /dev/null @@ -1,10 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - # Response containing a single payroll access setup status resource. - class PayrollAccessSetupStatusResponse < Internal::Types::Model - field :data, -> { VitableConnect::Types::PayrollAccessSetupStatus }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/payroll_deduction_statement.rb b/lib/VitableConnect/types/payroll_deduction_statement.rb deleted file mode 100644 index d0aa9ee..0000000 --- a/lib/VitableConnect/types/payroll_deduction_statement.rb +++ /dev/null @@ -1,29 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - # One payroll-deduction statement row. - # - # Reads a :class:`PayrollDeductionStatementDTO` by attribute: the ``statement_id`` character field renders the - # prefixed id via ``str()``, and the date/datetime fields emit ISO-8601 strings. - class PayrollDeductionStatement < Internal::Types::Model - field :statement_id, -> { String }, optional: false, nullable: false - - field :period_start, -> { String }, optional: false, nullable: false - - field :period_end, -> { String }, optional: false, nullable: false - - field :run_date, -> { String }, optional: false, nullable: false - - field :employee_count, -> { Integer }, optional: false, nullable: false - - field :total_deduction_cents, -> { Integer }, optional: false, nullable: false - - field :csv_file_url, -> { String }, optional: false, nullable: true - - field :deduction_frequency, -> { VitableConnect::Types::DeductionFrequency }, optional: false, nullable: false - - field :deduction_frequency_label, -> { String }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/payroll_integration_email.rb b/lib/VitableConnect/types/payroll_integration_email.rb deleted file mode 100644 index 027cdfc..0000000 --- a/lib/VitableConnect/types/payroll_integration_email.rb +++ /dev/null @@ -1,9 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - class PayrollIntegrationEmail < Internal::Types::Model - field :integration_email, -> { String }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/payroll_integration_email_response.rb b/lib/VitableConnect/types/payroll_integration_email_response.rb deleted file mode 100644 index 3a2d282..0000000 --- a/lib/VitableConnect/types/payroll_integration_email_response.rb +++ /dev/null @@ -1,10 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - # Response containing a single payroll integration email resource. - class PayrollIntegrationEmailResponse < Internal::Types::Model - field :data, -> { VitableConnect::Types::PayrollIntegrationEmail }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/plan.rb b/lib/VitableConnect/types/plan.rb deleted file mode 100644 index ad4fd88..0000000 --- a/lib/VitableConnect/types/plan.rb +++ /dev/null @@ -1,11 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - class Plan < Internal::Types::Model - field :id, -> { String }, optional: false, nullable: false - - field :name, -> { String }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/plan_list_response.rb b/lib/VitableConnect/types/plan_list_response.rb deleted file mode 100644 index 96dbf2e..0000000 --- a/lib/VitableConnect/types/plan_list_response.rb +++ /dev/null @@ -1,12 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - # Paginated list response containing plan resources. - class PlanListResponse < Internal::Types::Model - field :data, -> { Internal::Types::Array[VitableConnect::Types::Plan] }, optional: false, nullable: false - - field :pagination, -> { VitableConnect::Types::Pagination }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/plan_year_enrollment.rb b/lib/VitableConnect/types/plan_year_enrollment.rb deleted file mode 100644 index f5a9ee4..0000000 --- a/lib/VitableConnect/types/plan_year_enrollment.rb +++ /dev/null @@ -1,35 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - class PlanYearEnrollment < Internal::Types::Model - field :member_id, -> { String }, optional: false, nullable: false - - field :employee_id, -> { String }, optional: false, nullable: false - - field :employee_external_reference_id, -> { String }, optional: false, nullable: true - - field :member_first_name, -> { String }, optional: false, nullable: false - - field :member_last_name, -> { String }, optional: false, nullable: false - - field :election_status, -> { VitableConnect::Types::PlanYearEnrollmentElectionStatus }, optional: false, nullable: false - - field :policy_status, -> { VitableConnect::Types::PlanYearEnrollmentPolicyStatus }, optional: false, nullable: true - - field :dependent_count, -> { Integer }, optional: false, nullable: false - - field :carrier, -> { String }, optional: false, nullable: true - - field :plan, -> { String }, optional: false, nullable: true - - field :tier, -> { String }, optional: false, nullable: true - - field :premium_in_cents, -> { Integer }, optional: false, nullable: true - - field :employer_contribution_in_cents, -> { Integer }, optional: false, nullable: true - - field :employee_deduction_in_cents, -> { Integer }, optional: false, nullable: true - end - end -end diff --git a/lib/VitableConnect/types/plan_year_enrollment_election_status.rb b/lib/VitableConnect/types/plan_year_enrollment_election_status.rb deleted file mode 100644 index 1f152de..0000000 --- a/lib/VitableConnect/types/plan_year_enrollment_election_status.rb +++ /dev/null @@ -1,14 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - module PlanYearEnrollmentElectionStatus - extend VitableConnect::Internal::Types::Enum - - ENROLLED = "Enrolled" - WAIVED = "Waived" - PENDING = "Pending" - EXPIRED = "Expired" - end - end -end diff --git a/lib/VitableConnect/types/plan_year_enrollment_list_response.rb b/lib/VitableConnect/types/plan_year_enrollment_list_response.rb deleted file mode 100644 index bf81cc4..0000000 --- a/lib/VitableConnect/types/plan_year_enrollment_list_response.rb +++ /dev/null @@ -1,12 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - # Paginated list response containing plan year enrollment resources. - class PlanYearEnrollmentListResponse < Internal::Types::Model - field :data, -> { Internal::Types::Array[VitableConnect::Types::PlanYearEnrollment] }, optional: false, nullable: false - - field :pagination, -> { VitableConnect::Types::Pagination }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/plan_year_enrollment_policy_status.rb b/lib/VitableConnect/types/plan_year_enrollment_policy_status.rb deleted file mode 100644 index 458acb7..0000000 --- a/lib/VitableConnect/types/plan_year_enrollment_policy_status.rb +++ /dev/null @@ -1,14 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - module PlanYearEnrollmentPolicyStatus - extend VitableConnect::Internal::Types::Enum - - COVERAGE_UPCOMING = "Coverage Upcoming" - COVERAGE_EFFECTIVE = "Coverage Effective" - COVERAGE_ENDED = "Coverage Ended" - CANCELLED = "Cancelled" - end - end -end diff --git a/lib/VitableConnect/types/preferred_language.rb b/lib/VitableConnect/types/preferred_language.rb deleted file mode 100644 index 6ceb4c0..0000000 --- a/lib/VitableConnect/types/preferred_language.rb +++ /dev/null @@ -1,16 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - module PreferredLanguage - extend VitableConnect::Internal::Types::Enum - - EN = "en" - ES = "es" - ZH = "zh" - RU = "ru" - SW = "sw" - TH = "th" - end - end -end diff --git a/lib/VitableConnect/types/product_code.rb b/lib/VitableConnect/types/product_code.rb deleted file mode 100644 index b85ea9b..0000000 --- a/lib/VitableConnect/types/product_code.rb +++ /dev/null @@ -1,25 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - module ProductCode - extend VitableConnect::Internal::Types::Enum - - EBA = "EBA" - VPC = "VPC" - VPC_CORE = "VPC_CORE" - MEC = "MEC" - MEC2 = "MEC2" - MEC_PLUS = "MEC_PLUS" - MVP = "MVP" - MVP2 = "MVP2" - MVPSL = "MVPSL" - MVPSL2 = "MVPSL2" - VD = "VD" - VV = "VV" - ICHRA = "ICHRA" - ICHRA_PREMIUM_PLUS = "ICHRA_PREMIUM_PLUS" - ICHRA_REIMBURSEMENT_ONLY = "ICHRA_REIMBURSEMENT_ONLY" - end - end -end diff --git a/lib/VitableConnect/types/qualifying_life_event_status.rb b/lib/VitableConnect/types/qualifying_life_event_status.rb deleted file mode 100644 index 7487c42..0000000 --- a/lib/VitableConnect/types/qualifying_life_event_status.rb +++ /dev/null @@ -1,13 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - module QualifyingLifeEventStatus - extend VitableConnect::Internal::Types::Enum - - PENDING = "pending" - APPROVED = "approved" - DENIED = "denied" - end - end -end diff --git a/lib/VitableConnect/types/qualifying_life_event_type.rb b/lib/VitableConnect/types/qualifying_life_event_type.rb deleted file mode 100644 index 4ca5c0e..0000000 --- a/lib/VitableConnect/types/qualifying_life_event_type.rb +++ /dev/null @@ -1,31 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - module QualifyingLifeEventType - extend VitableConnect::Internal::Types::Enum - - LOST_JOB_BASED_COVERAGE = "lost_job_based_coverage" - AGED_OFF_PARENT_PLAN = "aged_off_parent_plan" - LOST_MEDICAID_CHIP_MEDICARE = "lost_medicaid_chip_medicare" - LOST_DECERTIFIED_INDIVIDUAL_PLAN = "lost_decertified_individual_plan" - MARRIED = "married" - DIVORCED = "divorced" - HAD_BABY = "had_baby" - ADOPTED_CHILD = "adopted_child" - FOSTER_CARE_PLACEMENT = "foster_care_placement" - DEATH_OF_SPOUSE_OR_DEPENDENT = "death_of_spouse_or_dependent" - COURT_ORDERED = "court_ordered" - MOVED_TO_NEW_COVERAGE_AREA = "moved_to_new_coverage_area" - MOVED_TO_US = "moved_to_us" - MOVED_TO_OR_FROM_SCHOOL_HOUSING = "moved_to_or_from_school_housing" - MOVED_TO_OR_FROM_SEASONAL_WORK_HOUSING = "moved_to_or_from_seasonal_work_housing" - BECAME_US_CITIZEN = "became_us_citizen" - LEFT_INCARCERATION = "left_incarceration" - GAINED_TRIBAL_STATUS = "gained_tribal_status" - STARTED_OR_ENDED_AMERICORPS_SERVICE = "started_or_ended_americorps_service" - NEW_CHILD = "new_child" - OTHER = "other" - end - end -end diff --git a/lib/VitableConnect/types/reissue_enrollment.rb b/lib/VitableConnect/types/reissue_enrollment.rb deleted file mode 100644 index 895df3b..0000000 --- a/lib/VitableConnect/types/reissue_enrollment.rb +++ /dev/null @@ -1,9 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - class ReissueEnrollment < Internal::Types::Model - field :enrollment_id, -> { String }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/reissue_enrollment_response.rb b/lib/VitableConnect/types/reissue_enrollment_response.rb deleted file mode 100644 index 763d074..0000000 --- a/lib/VitableConnect/types/reissue_enrollment_response.rb +++ /dev/null @@ -1,10 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - # Response containing a single reissue enrollment resource. - class ReissueEnrollmentResponse < Internal::Types::Model - field :data, -> { VitableConnect::Types::ReissueEnrollment }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/relationship.rb b/lib/VitableConnect/types/relationship.rb deleted file mode 100644 index f3aca3b..0000000 --- a/lib/VitableConnect/types/relationship.rb +++ /dev/null @@ -1,12 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - module Relationship - extend VitableConnect::Internal::Types::Enum - - SPOUSE = "Spouse" - CHILD = "Child" - end - end -end diff --git a/lib/VitableConnect/types/remaining_employee_action.rb b/lib/VitableConnect/types/remaining_employee_action.rb deleted file mode 100644 index a37a66a..0000000 --- a/lib/VitableConnect/types/remaining_employee_action.rb +++ /dev/null @@ -1,12 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - module RemainingEmployeeAction - extend VitableConnect::Internal::Types::Enum - - VITABLE_UPDATE = "VITABLE_UPDATE" - EMPLOYER_UPDATE = "EMPLOYER_UPDATE" - end - end -end diff --git a/lib/VitableConnect/types/request_id.rb b/lib/VitableConnect/types/request_id.rb deleted file mode 100644 index 651cbf5..0000000 --- a/lib/VitableConnect/types/request_id.rb +++ /dev/null @@ -1,23 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - module RequestID - # RequestID is an alias for String - - # @option str [String] - # - # @return [untyped] - def self.load(str) - ::JSON.parse(str) - end - - # @option value [untyped] - # - # @return [String] - def self.dump(value) - ::JSON.generate(value) - end - end - end -end diff --git a/lib/VitableConnect/types/resource_id.rb b/lib/VitableConnect/types/resource_id.rb deleted file mode 100644 index b5dfe96..0000000 --- a/lib/VitableConnect/types/resource_id.rb +++ /dev/null @@ -1,23 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - module ResourceID - # ResourceID is an alias for String - - # @option str [String] - # - # @return [untyped] - def self.load(str) - ::JSON.parse(str) - end - - # @option value [untyped] - # - # @return [String] - def self.dump(value) - ::JSON.generate(value) - end - end - end -end diff --git a/lib/VitableConnect/types/resource_type.rb b/lib/VitableConnect/types/resource_type.rb deleted file mode 100644 index d4dbfe3..0000000 --- a/lib/VitableConnect/types/resource_type.rb +++ /dev/null @@ -1,16 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - module ResourceType - extend VitableConnect::Internal::Types::Enum - - ENROLLMENT = "enrollment" - EMPLOYEE = "employee" - EMPLOYER = "employer" - DEPENDENT = "dependent" - PLAN_YEAR = "plan_year" - PAYROLL_DEDUCTION = "payroll_deduction" - end - end -end diff --git a/lib/VitableConnect/types/search.rb b/lib/VitableConnect/types/search.rb deleted file mode 100644 index abdb9f0..0000000 --- a/lib/VitableConnect/types/search.rb +++ /dev/null @@ -1,23 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - module Search - # Search is an alias for Object - - # @option str [String] - # - # @return [untyped] - def self.load(str) - ::JSON.parse(str) - end - - # @option value [untyped] - # - # @return [String] - def self.dump(value) - ::JSON.generate(value) - end - end - end -end diff --git a/lib/VitableConnect/types/sex_at_birth.rb b/lib/VitableConnect/types/sex_at_birth.rb deleted file mode 100644 index f3055e4..0000000 --- a/lib/VitableConnect/types/sex_at_birth.rb +++ /dev/null @@ -1,14 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - module SexAtBirth - extend VitableConnect::Internal::Types::Enum - - MALE = "Male" - FEMALE = "Female" - OTHER = "Other" - UNKNOWN = "Unknown" - end - end -end diff --git a/lib/VitableConnect/types/state.rb b/lib/VitableConnect/types/state.rb deleted file mode 100644 index dd18b38..0000000 --- a/lib/VitableConnect/types/state.rb +++ /dev/null @@ -1,72 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - module State - extend VitableConnect::Internal::Types::Enum - - AL = "AL" - AK = "AK" - AZ = "AZ" - AR = "AR" - CA = "CA" - CO = "CO" - CT = "CT" - DC = "DC" - DE = "DE" - FL = "FL" - GA = "GA" - HI = "HI" - ID = "ID" - IL = "IL" - IN = "IN" - IA = "IA" - KS = "KS" - KY = "KY" - LA = "LA" - ME = "ME" - MD = "MD" - MA = "MA" - MI = "MI" - MN = "MN" - MS = "MS" - MO = "MO" - MT = "MT" - NE = "NE" - NV = "NV" - NH = "NH" - NJ = "NJ" - NM = "NM" - NY = "NY" - NC = "NC" - ND = "ND" - OH = "OH" - OK = "OK" - OR = "OR" - PA = "PA" - RI = "RI" - SC = "SC" - SD = "SD" - TN = "TN" - TX = "TX" - UT = "UT" - VT = "VT" - VA = "VA" - WA = "WA" - WI = "WI" - WV = "WV" - WY = "WY" - PR = "PR" - GU = "GU" - AS = "AS" - VI = "VI" - MP = "MP" - MH = "MH" - PW = "PW" - FM = "FM" - AE = "AE" - AA = "AA" - AP = "AP" - end - end -end diff --git a/lib/VitableConnect/types/status.rb b/lib/VitableConnect/types/status.rb deleted file mode 100644 index afad0e5..0000000 --- a/lib/VitableConnect/types/status.rb +++ /dev/null @@ -1,13 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - module Status - extend VitableConnect::Internal::Types::Enum - - APPROVED = "approved" - DENIED = "denied" - PENDING = "pending" - end - end -end diff --git a/lib/VitableConnect/types/tax_classification.rb b/lib/VitableConnect/types/tax_classification.rb deleted file mode 100644 index 963c476..0000000 --- a/lib/VitableConnect/types/tax_classification.rb +++ /dev/null @@ -1,13 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - module TaxClassification - extend VitableConnect::Internal::Types::Enum - - UNKNOWN = "Unknown" - PRE_TAX = "Pre-tax" - POST_TAX = "Post-tax" - end - end -end diff --git a/lib/VitableConnect/types/termination_rule.rb b/lib/VitableConnect/types/termination_rule.rb deleted file mode 100644 index 8537279..0000000 --- a/lib/VitableConnect/types/termination_rule.rb +++ /dev/null @@ -1,12 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - module TerminationRule - extend VitableConnect::Internal::Types::Enum - - END_OF_N_MONTHS = "END_OF_N_MONTHS" - END_OF_PLAN_YEAR = "END_OF_PLAN_YEAR" - end - end -end diff --git a/lib/VitableConnect/types/update_employer_address_input.rb b/lib/VitableConnect/types/update_employer_address_input.rb deleted file mode 100644 index 2b8a938..0000000 --- a/lib/VitableConnect/types/update_employer_address_input.rb +++ /dev/null @@ -1,17 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - class UpdateEmployerAddressInput < Internal::Types::Model - field :address_line1, -> { String }, optional: false, nullable: false, api_name: "address_line_1" - - field :address_line2, -> { String }, optional: true, nullable: false, api_name: "address_line_2" - - field :city, -> { String }, optional: false, nullable: false - - field :state, -> { String }, optional: false, nullable: false - - field :zipcode, -> { String }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/waiting_period.rb b/lib/VitableConnect/types/waiting_period.rb deleted file mode 100644 index c4016e0..0000000 --- a/lib/VitableConnect/types/waiting_period.rb +++ /dev/null @@ -1,13 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - module WaitingPeriod - extend VitableConnect::Internal::Types::Enum - - FIRST_OF_FOLLOWING_MONTH = "FIRST_OF_FOLLOWING_MONTH" - THIRTY_DAYS = "THIRTY_DAYS" - SIXTY_DAYS = "SIXTY_DAYS" - end - end -end diff --git a/lib/VitableConnect/types/webhook_delivery.rb b/lib/VitableConnect/types/webhook_delivery.rb deleted file mode 100644 index 2ccd2b2..0000000 --- a/lib/VitableConnect/types/webhook_delivery.rb +++ /dev/null @@ -1,25 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - class WebhookDelivery < Internal::Types::Model - field :id, -> { String }, optional: false, nullable: false - - field :webhook_event_id, -> { String }, optional: false, nullable: false - - field :subscription_id, -> { String }, optional: false, nullable: false - - field :status, -> { String }, optional: false, nullable: false - - field :started_at, -> { String }, optional: false, nullable: true - - field :delivered_at, -> { String }, optional: false, nullable: true - - field :failed_at, -> { String }, optional: false, nullable: true - - field :failure_reason, -> { String }, optional: false, nullable: false - - field :created_at, -> { String }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/webhook_event.rb b/lib/VitableConnect/types/webhook_event.rb deleted file mode 100644 index f4b0fbe..0000000 --- a/lib/VitableConnect/types/webhook_event.rb +++ /dev/null @@ -1,19 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - class WebhookEvent < Internal::Types::Model - field :id, -> { String }, optional: false, nullable: false - - field :organization_id, -> { String }, optional: false, nullable: false - - field :event_name, -> { String }, optional: false, nullable: false - - field :resource_type, -> { String }, optional: false, nullable: false - - field :resource_id, -> { String }, optional: false, nullable: false - - field :created_at, -> { String }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/webhook_event_list_response.rb b/lib/VitableConnect/types/webhook_event_list_response.rb deleted file mode 100644 index 87f77a6..0000000 --- a/lib/VitableConnect/types/webhook_event_list_response.rb +++ /dev/null @@ -1,12 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - # Paginated list response containing webhook event resources. - class WebhookEventListResponse < Internal::Types::Model - field :data, -> { Internal::Types::Array[VitableConnect::Types::WebhookEvent] }, optional: false, nullable: false - - field :pagination, -> { VitableConnect::Types::Pagination }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/types/webhook_event_response.rb b/lib/VitableConnect/types/webhook_event_response.rb deleted file mode 100644 index 50b6544..0000000 --- a/lib/VitableConnect/types/webhook_event_response.rb +++ /dev/null @@ -1,10 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module Types - # Response containing a single webhook event resource. - class WebhookEventResponse < Internal::Types::Model - field :data, -> { VitableConnect::Types::WebhookEvent }, optional: false, nullable: false - end - end -end diff --git a/lib/VitableConnect/webhook_events/client.rb b/lib/VitableConnect/webhook_events/client.rb deleted file mode 100644 index a549c61..0000000 --- a/lib/VitableConnect/webhook_events/client.rb +++ /dev/null @@ -1,156 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module WebhookEvents - class Client - # @param client [VitableConnect::Internal::Http::RawClient] - # - # @return [void] - def initialize(client:) - @client = client - end - - # Retrieves a paginated list of webhook events for the authenticated organization. Supports filtering by event - # name, resource type, resource ID, and date range. - # - # @param request_options [Hash] - # @param params [Hash] - # @option request_options [String] :base_url - # @option request_options [Hash{String => Object}] :additional_headers - # @option request_options [Hash{String => Object}] :additional_query_parameters - # @option request_options [Hash{String => Object}] :additional_body_parameters - # @option request_options [Integer] :timeout_in_seconds - # @option params [String, nil] :created_after - # @option params [String, nil] :created_before - # @option params [VitableConnect::Types::EventName, nil] :event_name - # @option params [Integer, nil] :limit - # @option params [Integer, nil] :page - # @option params [String, nil] :resource_id - # @option params [VitableConnect::Types::ResourceType, nil] :resource_type - # - # @example - # client.webhook_events.list( - # limit: 20, - # page: 1 - # ) - # - # @return [VitableConnect::Types::WebhookEventListResponse] - def list(request_options: {}, **params) - params = VitableConnect::Internal::Types::Utils.normalize_keys(params) - query_params = {} - query_params["created_after"] = params[:created_after] if params.key?(:created_after) - query_params["created_before"] = params[:created_before] if params.key?(:created_before) - query_params["event_name"] = params[:event_name] if params.key?(:event_name) - query_params["limit"] = params[:limit] if params.key?(:limit) - query_params["page"] = params[:page] if params.key?(:page) - query_params["resource_id"] = params[:resource_id] if params.key?(:resource_id) - query_params["resource_type"] = params[:resource_type] if params.key?(:resource_type) - - VitableConnect::Internal::OffsetItemIterator.new( - initial_page: query_params["page"], - item_field: :data, - has_next_field: nil, - step: false - ) do |next_page| - query_params["page"] = next_page - request = VitableConnect::Internal::JSON::Request.new( - base_url: request_options[:base_url], - method: "GET", - path: "v1/webhook-events", - query: query_params, - request_options: request_options - ) - begin - response = @client.send(request) - rescue Net::HTTPRequestTimeout - raise VitableConnect::Errors::TimeoutError - end - code = response.code.to_i - if code.between?(200, 299) - parsed_response = VitableConnect::Types::WebhookEventListResponse.load(response.body) - [parsed_response, response] - else - error_class = VitableConnect::Errors::ResponseError.subclass_for_code(code) - raise error_class.new(response.body, code: code) - end - end - end - - # Retrieves a single webhook event by its prefixed ID. Returns 404 if the event does not exist or belongs to a - # different organization. - # - # @param request_options [Hash] - # @param params [Hash] - # @option request_options [String] :base_url - # @option request_options [Hash{String => Object}] :additional_headers - # @option request_options [Hash{String => Object}] :additional_query_parameters - # @option request_options [Hash{String => Object}] :additional_body_parameters - # @option request_options [Integer] :timeout_in_seconds - # @option params [VitableConnect::Types::EventID] :event_id - # - # @example - # client.webhook_events.get(event_id: "event_id") - # - # @return [VitableConnect::Types::WebhookEventResponse] - def get(request_options: {}, **params) - params = VitableConnect::Internal::Types::Utils.normalize_keys(params) - request = VitableConnect::Internal::JSON::Request.new( - base_url: request_options[:base_url], - method: "GET", - path: "v1/webhook-events/#{URI.encode_uri_component(params[:event_id].to_s)}", - request_options: request_options - ) - begin - response = @client.send(request) - rescue Net::HTTPRequestTimeout - raise VitableConnect::Errors::TimeoutError - end - code = response.code.to_i - if code.between?(200, 299) - VitableConnect::Types::WebhookEventResponse.load(response.body) - else - error_class = VitableConnect::Errors::ResponseError.subclass_for_code(code) - raise error_class.new(response.body, code: code) - end - end - - # Retrieves all delivery attempts for a webhook event. Returns up to 100 deliveries. Each delivery includes a - # computed status field (Pending, In Progress, Delivered, or Failed). - # - # @param request_options [Hash] - # @param params [Hash] - # @option request_options [String] :base_url - # @option request_options [Hash{String => Object}] :additional_headers - # @option request_options [Hash{String => Object}] :additional_query_parameters - # @option request_options [Hash{String => Object}] :additional_body_parameters - # @option request_options [Integer] :timeout_in_seconds - # @option params [VitableConnect::Types::EventID] :event_id - # - # @example - # client.webhook_events.list_deliveries(event_id: "event_id") - # - # @return [VitableConnect::Types::ListWebhookEventDeliveriesResponse] - def list_deliveries(request_options: {}, **params) - params = VitableConnect::Internal::Types::Utils.normalize_keys(params) - request = VitableConnect::Internal::JSON::Request.new( - base_url: request_options[:base_url], - method: "GET", - path: "v1/webhook-events/#{URI.encode_uri_component(params[:event_id].to_s)}/deliveries", - request_options: request_options - ) - begin - response = @client.send(request) - rescue Net::HTTPRequestTimeout - raise VitableConnect::Errors::TimeoutError - end - code = response.code.to_i - if code.between?(200, 299) - VitableConnect::Types::ListWebhookEventDeliveriesResponse.load(response.body) - else - error_class = VitableConnect::Errors::ResponseError.subclass_for_code(code) - raise error_class.new(response.body, code: code) - end - end - end - end -end diff --git a/lib/VitableConnect/webhook_events/types/get_webhook_events_request.rb b/lib/VitableConnect/webhook_events/types/get_webhook_events_request.rb deleted file mode 100644 index 76689df..0000000 --- a/lib/VitableConnect/webhook_events/types/get_webhook_events_request.rb +++ /dev/null @@ -1,11 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module WebhookEvents - module Types - class GetWebhookEventsRequest < Internal::Types::Model - field :event_id, -> { String }, optional: false, nullable: false - end - end - end -end diff --git a/lib/VitableConnect/webhook_events/types/list_deliveries_webhook_events_request.rb b/lib/VitableConnect/webhook_events/types/list_deliveries_webhook_events_request.rb deleted file mode 100644 index 8663294..0000000 --- a/lib/VitableConnect/webhook_events/types/list_deliveries_webhook_events_request.rb +++ /dev/null @@ -1,11 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module WebhookEvents - module Types - class ListDeliveriesWebhookEventsRequest < Internal::Types::Model - field :event_id, -> { String }, optional: false, nullable: false - end - end - end -end diff --git a/lib/VitableConnect/webhook_events/types/list_webhook_events_request.rb b/lib/VitableConnect/webhook_events/types/list_webhook_events_request.rb deleted file mode 100644 index 3dba7e6..0000000 --- a/lib/VitableConnect/webhook_events/types/list_webhook_events_request.rb +++ /dev/null @@ -1,23 +0,0 @@ -# frozen_string_literal: true - -module VitableConnect - module WebhookEvents - module Types - class ListWebhookEventsRequest < Internal::Types::Model - field :created_after, -> { String }, optional: true, nullable: false - - field :created_before, -> { String }, optional: true, nullable: false - - field :event_name, -> { VitableConnect::Types::EventName }, optional: true, nullable: false - - field :limit, -> { Integer }, optional: true, nullable: false - - field :page, -> { Integer }, optional: true, nullable: false - - field :resource_id, -> { String }, optional: true, nullable: false - - field :resource_type, -> { VitableConnect::Types::ResourceType }, optional: true, nullable: false - end - end - end -end diff --git a/lib/vitable_connect.rb b/lib/vitable_connect.rb index ffd6a46..0b67879 100644 --- a/lib/vitable_connect.rb +++ b/lib/vitable_connect.rb @@ -1,6 +1,156 @@ # frozen_string_literal: true -# Compatibility shim: the pre-1.0 gem (Stainless-generated) was loaded with -# `require "vitable_connect"`. The Fern-generated entrypoint is -# "VitableConnect"; keep the old require path working across the migration. -require_relative "VitableConnect" +# Standard libraries. +# rubocop:disable Lint/RedundantRequireStatement +require "English" +require "base64" +require "cgi" +require "date" +require "erb" +require "etc" +require "json" +require "net/http" +require "openssl" +require "pathname" +require "rbconfig" +require "securerandom" +require "set" +require "stringio" +require "time" +require "uri" +# rubocop:enable Lint/RedundantRequireStatement + +# We already ship the preferred sorbet manifests in the package itself. +# `tapioca` currently does not offer us a way to opt out of unnecessary compilation. +if Object.const_defined?(:Tapioca) && + caller.chain([$PROGRAM_NAME]).chain(ARGV).any?(/tapioca/) && + ARGV.none?(/dsl/) + return +end + +# Gems. +require "connection_pool" + +# Package files. +require_relative "vitable_connect/version" +require_relative "vitable_connect/internal/util" +require_relative "vitable_connect/internal/type/converter" +require_relative "vitable_connect/internal/type/unknown" +require_relative "vitable_connect/internal/type/boolean" +require_relative "vitable_connect/internal/type/file_input" +require_relative "vitable_connect/internal/type/enum" +require_relative "vitable_connect/internal/type/union" +require_relative "vitable_connect/internal/type/array_of" +require_relative "vitable_connect/internal/type/hash_of" +require_relative "vitable_connect/internal/type/base_model" +require_relative "vitable_connect/internal/type/base_page" +require_relative "vitable_connect/internal/type/request_parameters" +require_relative "vitable_connect/internal" +require_relative "vitable_connect/request_options" +require_relative "vitable_connect/file_part" +require_relative "vitable_connect/errors" +require_relative "vitable_connect/internal/transport/base_client" +require_relative "vitable_connect/internal/transport/pooled_net_requester" +require_relative "vitable_connect/client" +require_relative "vitable_connect/internal/page_number_page" +require_relative "vitable_connect/models/auth_issue_access_token_params" +require_relative "vitable_connect/models/auth_issue_access_token_response" +require_relative "vitable_connect/models/employee" +require_relative "vitable_connect/models/employee_class" +require_relative "vitable_connect/models/employee_list_enrollments_params" +require_relative "vitable_connect/models/employee_retrieve_params" +require_relative "vitable_connect/models/employee_retrieve_response" +require_relative "vitable_connect/models/employee_update_params" +require_relative "vitable_connect/models/employee_update_response" +require_relative "vitable_connect/models/employer" +require_relative "vitable_connect/models/employer_create_params" +require_relative "vitable_connect/models/employer_ensure_payroll_integration_email_params" +require_relative "vitable_connect/models/employer_ensure_payroll_integration_email_response" +require_relative "vitable_connect/models/employer_list_benefit_plan_year_enrollments_params" +require_relative "vitable_connect/models/employer_list_benefit_plan_year_enrollments_response" +require_relative "vitable_connect/models/employer_list_benefit_plan_years_params" +require_relative "vitable_connect/models/employer_list_benefit_plan_years_response" +require_relative "vitable_connect/models/employer_list_employees_params" +require_relative "vitable_connect/models/employer_list_hris_providers_params" +require_relative "vitable_connect/models/employer_list_hris_providers_response" +require_relative "vitable_connect/models/employer_list_invoices_params" +require_relative "vitable_connect/models/employer_list_invoices_response" +require_relative "vitable_connect/models/employer_list_params" +require_relative "vitable_connect/models/employer_list_payroll_deduction_statements_params" +require_relative "vitable_connect/models/employer_list_payroll_deduction_statements_response" +require_relative "vitable_connect/models/employer_list_response" +require_relative "vitable_connect/models/employer_response" +require_relative "vitable_connect/models/employer_retrieve_benefit_plan_year_params" +require_relative "vitable_connect/models/employer_retrieve_benefit_plan_year_response" +require_relative "vitable_connect/models/employer_retrieve_hris_params" +require_relative "vitable_connect/models/employer_retrieve_hris_response" +require_relative "vitable_connect/models/employer_retrieve_invoice_pdf_params" +require_relative "vitable_connect/models/employer_retrieve_invoice_pdf_response" +require_relative "vitable_connect/models/employer_retrieve_params" +require_relative "vitable_connect/models/employer_retrieve_payroll_access_setup_params" +require_relative "vitable_connect/models/employer_retrieve_payroll_access_setup_response" +require_relative "vitable_connect/models/employer_submit_census_sync_params" +require_relative "vitable_connect/models/employer_submit_census_sync_response" +require_relative "vitable_connect/models/employer_submit_payroll_access_setup_params" +require_relative "vitable_connect/models/employer_submit_payroll_access_setup_response" +require_relative "vitable_connect/models/employer_update_params" +require_relative "vitable_connect/models/employer_update_settings_params" +require_relative "vitable_connect/models/employer_update_settings_response" +require_relative "vitable_connect/models/enrollment" +require_relative "vitable_connect/models/enrollment_reissue_params" +require_relative "vitable_connect/models/enrollment_reissue_response" +require_relative "vitable_connect/models/enrollment_retrieve_params" +require_relative "vitable_connect/models/enrollment_retrieve_response" +require_relative "vitable_connect/models/enrollment_status" +require_relative "vitable_connect/models/enrollment_terminate_params" +require_relative "vitable_connect/models/group" +require_relative "vitable_connect/models/group_create_params" +require_relative "vitable_connect/models/group_list_params" +require_relative "vitable_connect/models/group_response" +require_relative "vitable_connect/models/group_retrieve_params" +require_relative "vitable_connect/models/groups/members/sync_retrieve_params" +require_relative "vitable_connect/models/groups/members/sync_retrieve_response" +require_relative "vitable_connect/models/groups/members/sync_submit_params" +require_relative "vitable_connect/models/groups/members/sync_submit_response" +require_relative "vitable_connect/models/group_update_params" +require_relative "vitable_connect/models/member_list_dependents_params" +require_relative "vitable_connect/models/member_list_dependents_response" +require_relative "vitable_connect/models/member_list_employments_params" +require_relative "vitable_connect/models/member_list_employments_response" +require_relative "vitable_connect/models/member_list_enrollments_params" +require_relative "vitable_connect/models/member_list_enrollments_response" +require_relative "vitable_connect/models/member_list_id_cards_params" +require_relative "vitable_connect/models/member_list_id_cards_response" +require_relative "vitable_connect/models/member_list_params" +require_relative "vitable_connect/models/member_list_qualifying_life_events_params" +require_relative "vitable_connect/models/member_list_qualifying_life_events_response" +require_relative "vitable_connect/models/member_list_response" +require_relative "vitable_connect/models/member_retrieve_household_params" +require_relative "vitable_connect/models/member_retrieve_household_response" +require_relative "vitable_connect/models/member_retrieve_params" +require_relative "vitable_connect/models/member_retrieve_response" +require_relative "vitable_connect/models/organization_create_params" +require_relative "vitable_connect/models/organization_create_response" +require_relative "vitable_connect/models/organization_list_params" +require_relative "vitable_connect/models/organization_list_response" +require_relative "vitable_connect/models/pagination" +require_relative "vitable_connect/models/plan_list_params" +require_relative "vitable_connect/models/plan_list_response" +require_relative "vitable_connect/models/webhook_event" +require_relative "vitable_connect/models/webhook_event_list_deliveries_params" +require_relative "vitable_connect/models/webhook_event_list_deliveries_response" +require_relative "vitable_connect/models/webhook_event_list_params" +require_relative "vitable_connect/models/webhook_event_retrieve_params" +require_relative "vitable_connect/models/webhook_event_retrieve_response" +require_relative "vitable_connect/models" +require_relative "vitable_connect/resources/auth" +require_relative "vitable_connect/resources/employees" +require_relative "vitable_connect/resources/employers" +require_relative "vitable_connect/resources/enrollments" +require_relative "vitable_connect/resources/groups" +require_relative "vitable_connect/resources/groups/members" +require_relative "vitable_connect/resources/groups/members/sync" +require_relative "vitable_connect/resources/members" +require_relative "vitable_connect/resources/organizations" +require_relative "vitable_connect/resources/plans" +require_relative "vitable_connect/resources/webhook_events" diff --git a/lib/vitable_connect/client.rb b/lib/vitable_connect/client.rb new file mode 100644 index 0000000..027e729 --- /dev/null +++ b/lib/vitable_connect/client.rb @@ -0,0 +1,153 @@ +# frozen_string_literal: true + +module VitableConnect + class Client < VitableConnect::Internal::Transport::BaseClient + # Default max number of retries to attempt after a failed retryable request. + DEFAULT_MAX_RETRIES = 2 + + # Default per-request timeout. + DEFAULT_TIMEOUT_IN_SECONDS = 60.0 + + # Default initial retry delay in seconds. + # Overall delay is calculated using exponential backoff + jitter. + DEFAULT_INITIAL_RETRY_DELAY = 0.5 + + # Default max retry delay in seconds. + DEFAULT_MAX_RETRY_DELAY = 8.0 + + # rubocop:disable Style/MutableConstant + # @type [Hash{Symbol=>String}] + ENVIRONMENTS = + {production: "https://api.vitablehealth.com", environment_1: "https://api.uat.vitablehealth.com"} + # rubocop:enable Style/MutableConstant + + # API Key or Access Token authentication using Bearer token in Authorization + # header. API keys use the vit*apk* prefix, access tokens use the vit*at* prefix. + # @return [String] + attr_reader :api_key + + # Issue short-lived access tokens for scoped API access + # @return [VitableConnect::Resources::Auth] + attr_reader :auth + + # @return [VitableConnect::Resources::Employees] + attr_reader :employees + + # @return [VitableConnect::Resources::Employers] + attr_reader :employers + + # Manage benefit enrollments and elections for employees + # @return [VitableConnect::Resources::Enrollments] + attr_reader :enrollments + + # @return [VitableConnect::Resources::WebhookEvents] + attr_reader :webhook_events + + # @return [VitableConnect::Resources::Groups] + attr_reader :groups + + # Browse the members covered across your book and read a member's profile + # @return [VitableConnect::Resources::Members] + attr_reader :members + + # @return [VitableConnect::Resources::Organizations] + attr_reader :organizations + + # @return [VitableConnect::Resources::Plans] + attr_reader :plans + + # @api private + # + # @param security [Hash{Symbol=>Boolean}] + # + # @return [Hash{String=>String}] + private def auth_headers(security:) + {api_key_auth:}.slice(*security.keys).values.reduce({}, :merge) + end + + # @api private + # + # @return [Hash{String=>String}] + private def api_key_auth + return {} if @api_key.nil? + + {"authorization" => "Bearer #{@api_key}"} + end + + # Creates and returns a new client for interacting with the API. + # + # @param api_key [String, nil] API Key or Access Token authentication using Bearer token in Authorization + # header. API keys use the vit*apk* prefix, access tokens use the vit*at* prefix. + # Defaults to `ENV["VITABLE_CONNECT_API_KEY"]` + # + # @param environment [:production, :environment_1, nil] Specifies the environment to use for the API. + # + # Each environment maps to a different base URL: + # + # - `production` corresponds to `https://api.vitablehealth.com` + # - `environment_1` corresponds to `https://api.uat.vitablehealth.com` + # + # @param base_url [String, nil] Override the default base URL for the API, e.g., + # `"https://api.example.com/v2/"`. Defaults to `ENV["VITABLE_CONNECT_BASE_URL"]` + # + # @param max_retries [Integer] Max number of retries to attempt after a failed retryable request. + # + # @param timeout [Float] + # + # @param initial_retry_delay [Float] + # + # @param max_retry_delay [Float] + def initialize( + api_key: ENV["VITABLE_CONNECT_API_KEY"], + environment: nil, + base_url: ENV["VITABLE_CONNECT_BASE_URL"], + max_retries: self.class::DEFAULT_MAX_RETRIES, + timeout: self.class::DEFAULT_TIMEOUT_IN_SECONDS, + initial_retry_delay: self.class::DEFAULT_INITIAL_RETRY_DELAY, + max_retry_delay: self.class::DEFAULT_MAX_RETRY_DELAY + ) + base_url ||= VitableConnect::Client::ENVIRONMENTS.fetch(environment&.to_sym || :production) do + message = "environment must be one of #{VitableConnect::Client::ENVIRONMENTS.keys}, got #{environment}" + raise ArgumentError.new(message) + end + + if api_key.nil? + raise ArgumentError.new("api_key is required, and can be set via environ: \"VITABLE_CONNECT_API_KEY\"") + end + + headers = {} + custom_headers_env = ENV["VITABLE_CONNECT_CUSTOM_HEADERS"] + unless custom_headers_env.nil? + parsed = {} + custom_headers_env.split("\n").each do |line| + colon = line.index(":") + unless colon.nil? + parsed[line[0...colon].strip] = line[(colon + 1)..].strip + end + end + headers = parsed.merge(headers) + end + + @api_key = api_key.to_s + + super( + base_url: base_url, + timeout: timeout, + max_retries: max_retries, + initial_retry_delay: initial_retry_delay, + max_retry_delay: max_retry_delay, + headers: headers + ) + + @auth = VitableConnect::Resources::Auth.new(client: self) + @employees = VitableConnect::Resources::Employees.new(client: self) + @employers = VitableConnect::Resources::Employers.new(client: self) + @enrollments = VitableConnect::Resources::Enrollments.new(client: self) + @webhook_events = VitableConnect::Resources::WebhookEvents.new(client: self) + @groups = VitableConnect::Resources::Groups.new(client: self) + @members = VitableConnect::Resources::Members.new(client: self) + @organizations = VitableConnect::Resources::Organizations.new(client: self) + @plans = VitableConnect::Resources::Plans.new(client: self) + end + end +end diff --git a/lib/vitable_connect/errors.rb b/lib/vitable_connect/errors.rb new file mode 100644 index 0000000..2d3d50d --- /dev/null +++ b/lib/vitable_connect/errors.rb @@ -0,0 +1,228 @@ +# frozen_string_literal: true + +module VitableConnect + module Errors + class Error < StandardError + # @!attribute cause + # + # @return [StandardError, nil] + end + + class ConversionError < VitableConnect::Errors::Error + # @return [StandardError, nil] + def cause = @cause.nil? ? super : @cause + + # @api private + # + # @param on [Class] + # @param method [Symbol] + # @param target [Object] + # @param value [Object] + # @param cause [StandardError, nil] + def initialize(on:, method:, target:, value:, cause: nil) + cls = on.name.split("::").last + + message = [ + "Failed to parse #{cls}.#{method} from #{value.class} to #{target.inspect}.", + "To get the unparsed API response, use #{cls}[#{method.inspect}].", + cause && "Cause: #{cause.message}" + ].filter(&:itself).join(" ") + + @cause = cause + super(message) + end + end + + class APIError < VitableConnect::Errors::Error + # @return [URI::Generic] + attr_accessor :url + + # @return [Integer, nil] + attr_accessor :status + + # @return [Hash{String=>String}, nil] + attr_accessor :headers + + # @return [Object, nil] + attr_accessor :body + + # @api private + # + # @param url [URI::Generic] + # @param status [Integer, nil] + # @param headers [Hash{String=>String}, nil] + # @param body [Object, nil] + # @param request [nil] + # @param response [nil] + # @param message [String, nil] + def initialize(url:, status: nil, headers: nil, body: nil, request: nil, response: nil, message: nil) + @url = url + @status = status + @headers = headers + @body = body + @request = request + @response = response + super(message) + end + end + + class APIConnectionError < VitableConnect::Errors::APIError + # @!attribute status + # + # @return [nil] + + # @!attribute body + # + # @return [nil] + + # @api private + # + # @param url [URI::Generic] + # @param status [nil] + # @param headers [Hash{String=>String}, nil] + # @param body [nil] + # @param request [nil] + # @param response [nil] + # @param message [String, nil] + def initialize( + url:, + status: nil, + headers: nil, + body: nil, + request: nil, + response: nil, + message: "Connection error." + ) + super + end + end + + class APITimeoutError < VitableConnect::Errors::APIConnectionError + # @api private + # + # @param url [URI::Generic] + # @param status [nil] + # @param headers [Hash{String=>String}, nil] + # @param body [nil] + # @param request [nil] + # @param response [nil] + # @param message [String, nil] + def initialize( + url:, + status: nil, + headers: nil, + body: nil, + request: nil, + response: nil, + message: "Request timed out." + ) + super + end + end + + class APIStatusError < VitableConnect::Errors::APIError + # @api private + # + # @param url [URI::Generic] + # @param status [Integer] + # @param headers [Hash{String=>String}, nil] + # @param body [Object, nil] + # @param request [nil] + # @param response [nil] + # @param message [String, nil] + # + # @return [self] + def self.for(url:, status:, headers:, body:, request:, response:, message: nil) + kwargs = + { + url: url, + status: status, + headers: headers, + body: body, + request: request, + response: response, + message: message + } + + case status + in 400 + VitableConnect::Errors::BadRequestError.new(**kwargs) + in 401 + VitableConnect::Errors::AuthenticationError.new(**kwargs) + in 403 + VitableConnect::Errors::PermissionDeniedError.new(**kwargs) + in 404 + VitableConnect::Errors::NotFoundError.new(**kwargs) + in 409 + VitableConnect::Errors::ConflictError.new(**kwargs) + in 422 + VitableConnect::Errors::UnprocessableEntityError.new(**kwargs) + in 429 + VitableConnect::Errors::RateLimitError.new(**kwargs) + in (500..) + VitableConnect::Errors::InternalServerError.new(**kwargs) + else + VitableConnect::Errors::APIStatusError.new(**kwargs) + end + end + + # @!parse + # # @return [Integer] + # attr_accessor :status + + # @api private + # + # @param url [URI::Generic] + # @param status [Integer] + # @param headers [Hash{String=>String}, nil] + # @param body [Object, nil] + # @param request [nil] + # @param response [nil] + # @param message [String, nil] + def initialize(url:, status:, headers:, body:, request:, response:, message: nil) + message ||= {url: url.to_s, status: status, body: body} + super( + url: url, + status: status, + headers: headers, + body: body, + request: request, + response: response, + message: message&.to_s + ) + end + end + + class BadRequestError < VitableConnect::Errors::APIStatusError + HTTP_STATUS = 400 + end + + class AuthenticationError < VitableConnect::Errors::APIStatusError + HTTP_STATUS = 401 + end + + class PermissionDeniedError < VitableConnect::Errors::APIStatusError + HTTP_STATUS = 403 + end + + class NotFoundError < VitableConnect::Errors::APIStatusError + HTTP_STATUS = 404 + end + + class ConflictError < VitableConnect::Errors::APIStatusError + HTTP_STATUS = 409 + end + + class UnprocessableEntityError < VitableConnect::Errors::APIStatusError + HTTP_STATUS = 422 + end + + class RateLimitError < VitableConnect::Errors::APIStatusError + HTTP_STATUS = 429 + end + + class InternalServerError < VitableConnect::Errors::APIStatusError + HTTP_STATUS = (500..) + end + end +end diff --git a/lib/vitable_connect/file_part.rb b/lib/vitable_connect/file_part.rb new file mode 100644 index 0000000..3576f43 --- /dev/null +++ b/lib/vitable_connect/file_part.rb @@ -0,0 +1,58 @@ +# frozen_string_literal: true + +module VitableConnect + class FilePart + # @return [Pathname, StringIO, IO, String] + attr_reader :content + + # @return [String, nil] + attr_reader :content_type + + # @return [String, nil] + attr_reader :filename + + # @api private + # + # @return [String] + private def read + case content + in Pathname + content.read(binmode: true) + in StringIO + content.string + in IO + content.read + in String + content + end + end + + # @param a [Object] + # + # @return [String] + def to_json(*a) = read.to_json(*a) + + # @param a [Object] + # + # @return [String] + def to_yaml(*a) = read.to_yaml(*a) + + # @param content [Pathname, StringIO, IO, String] + # @param filename [Pathname, String, nil] + # @param content_type [String, nil] + def initialize(content, filename: nil, content_type: nil) + @content_type = content_type + @filename = + case [filename, (@content = content)] + in [String | Pathname, _] + ::File.basename(filename) + in [nil, Pathname] + content.basename.to_path + in [nil, IO] + content.to_path + else + filename + end + end + end +end diff --git a/lib/vitable_connect/internal.rb b/lib/vitable_connect/internal.rb new file mode 100644 index 0000000..91ef8e5 --- /dev/null +++ b/lib/vitable_connect/internal.rb @@ -0,0 +1,20 @@ +# frozen_string_literal: true + +module VitableConnect + module Internal + extend VitableConnect::Internal::Util::SorbetRuntimeSupport + + OMIT = + Object.new.tap do + _1.define_singleton_method(:inspect) { "#<#{VitableConnect::Internal}::OMIT>" } + end + .freeze + + define_sorbet_constant!(:AnyHash) do + T.type_alias { T::Hash[Symbol, T.anything] } + end + define_sorbet_constant!(:FileInput) do + T.type_alias { T.any(Pathname, StringIO, IO, String, VitableConnect::FilePart) } + end + end +end diff --git a/lib/vitable_connect/internal/page_number_page.rb b/lib/vitable_connect/internal/page_number_page.rb new file mode 100644 index 0000000..45bf504 --- /dev/null +++ b/lib/vitable_connect/internal/page_number_page.rb @@ -0,0 +1,113 @@ +# frozen_string_literal: true + +module VitableConnect + module Internal + # @generic Elem + # + # @example + # if page_number_page.has_next? + # page_number_page = page_number_page.next_page + # end + # + # @example + # page_number_page.auto_paging_each do |employee| + # puts(employee) + # end + class PageNumberPage + include VitableConnect::Internal::Type::BasePage + + # @return [Array>, nil] + attr_accessor :data + + # @return [Pagination] + attr_accessor :pagination + + # @return [Boolean] + def next_page? + !data.to_a.empty? && (pagination&.page.nil? || pagination&.total_pages.nil? || (pagination&.page&.< pagination&.total_pages)) + end + + # @raise [VitableConnect::HTTP::Error] + # @return [self] + def next_page + unless next_page? + message = "No more pages available. Please check #next_page? before calling ##{__method__}" + raise RuntimeError.new(message) + end + + req = VitableConnect::Internal::Util.deep_merge( + @req, + {query: {page: (pagination&.page || 1).to_i.succ}} + ) + @client.request(req) + end + + # @param blk [Proc] + # + # @yieldparam [generic] + def auto_paging_each(&blk) + unless block_given? + raise ArgumentError.new("A block must be given to ##{__method__}") + end + + page = self + loop do + page.data&.each(&blk) + + break unless page.next_page? + page = page.next_page + end + end + + # @api private + # + # @param client [VitableConnect::Internal::Transport::BaseClient] + # @param req [Hash{Symbol=>Object}] + # @param headers [Hash{String=>String}] + # @param page_data [Hash{Symbol=>Object}] + def initialize(client:, req:, headers:, page_data:) + super + + case page_data + in {data: Array => data} + @data = data.map { VitableConnect::Internal::Type::Converter.coerce(@model, _1) } + else + end + case page_data + in {pagination: Hash | nil => pagination} + @pagination = + VitableConnect::Internal::Type::Converter.coerce( + VitableConnect::Internal::PageNumberPage::Pagination, + pagination + ) + else + end + end + + # @api private + # + # @return [String] + def inspect + model = VitableConnect::Internal::Type::Converter.inspect(@model, depth: 1) + + "#<#{self.class}[#{model}]:0x#{object_id.to_s(16)}>" + end + + class Pagination < VitableConnect::Internal::Type::BaseModel + # @!attribute page + # + # @return [Integer, nil] + optional :page, Integer + + # @!attribute total_pages + # + # @return [Integer, nil] + optional :total_pages, Integer + + # @!method initialize(page: nil, total_pages: nil) + # @param page [Integer] + # @param total_pages [Integer] + end + end + end +end diff --git a/lib/vitable_connect/internal/transport/base_client.rb b/lib/vitable_connect/internal/transport/base_client.rb new file mode 100644 index 0000000..a89c59e --- /dev/null +++ b/lib/vitable_connect/internal/transport/base_client.rb @@ -0,0 +1,603 @@ +# frozen_string_literal: true + +module VitableConnect + module Internal + module Transport + # @api private + # + # @abstract + class BaseClient + extend VitableConnect::Internal::Util::SorbetRuntimeSupport + + # from whatwg fetch spec + MAX_REDIRECTS = 20 + + # rubocop:disable Style/MutableConstant + PLATFORM_HEADERS = + { + "x-stainless-arch" => VitableConnect::Internal::Util.arch, + "x-stainless-lang" => "ruby", + "x-stainless-os" => VitableConnect::Internal::Util.os, + "x-stainless-package-version" => VitableConnect::VERSION, + "x-stainless-runtime" => ::RUBY_ENGINE, + "x-stainless-runtime-version" => ::RUBY_ENGINE_VERSION + } + # rubocop:enable Style/MutableConstant + + class << self + # @api private + # + # @param req [Hash{Symbol=>Object}] + # + # @raise [ArgumentError] + def validate!(req) + keys = [ + :method, + :path, + :query, + :headers, + :body, + :unwrap, + :page, + :stream, + :model, + :security, + :options + ] + case req + in Hash + req.each_key do |k| + unless keys.include?(k) + raise ArgumentError.new("Request `req` keys must be one of #{keys}, got #{k.inspect}") + end + end + else + raise ArgumentError.new("Request `req` must be a Hash or RequestOptions, got #{req.inspect}") + end + end + + # @api private + # + # @param status [Integer] + # @param headers [Hash{String=>String}] + # + # @return [Boolean] + def should_retry?(status, headers:) + coerced = VitableConnect::Internal::Util.coerce_boolean(headers["x-should-retry"]) + case [coerced, status] + in [true | false, _] + coerced + in [_, 408 | 409 | 429 | (500..)] + # retry on: + # 408: timeouts + # 409: locks + # 429: rate limits + # 500+: unknown errors + true + else + false + end + end + + # @api private + # + # @param request [Hash{Symbol=>Object}] . + # + # @option request [Symbol] :method + # + # @option request [URI::Generic] :url + # + # @option request [Hash{String=>String}] :headers + # + # @option request [Object] :body + # + # @option request [Integer] :max_retries + # + # @option request [Float] :timeout + # + # @param status [Integer] + # + # @param response_headers [Hash{String=>String}] + # + # @return [Hash{Symbol=>Object}] + def follow_redirect(request, status:, response_headers:) + method, url, headers = request.fetch_values(:method, :url, :headers) + location = + Kernel.then do + URI.join(url, response_headers["location"]) + rescue ArgumentError + message = "Server responded with status #{status} but no valid location header." + raise VitableConnect::Errors::APIConnectionError.new( + url: url, + response: response_headers, + message: message + ) + end + + request = {**request, url: location} + + case [url.scheme, location.scheme] + in ["https", "http"] + message = "Tried to redirect to a insecure URL" + raise VitableConnect::Errors::APIConnectionError.new( + url: url, + response: response_headers, + message: message + ) + else + nil + end + + # from whatwg fetch spec + case [status, method] + in [301 | 302, :post] | [303, _] + drop = %w[content-encoding content-language content-length content-location content-type] + request = { + **request, + method: method == :head ? :head : :get, + headers: headers.except(*drop), + body: nil + } + else + end + + # from undici + if VitableConnect::Internal::Util.uri_origin(url) != VitableConnect::Internal::Util.uri_origin(location) + drop = %w[authorization cookie host proxy-authorization] + request = {**request, headers: request.fetch(:headers).except(*drop)} + end + + request + end + + # @api private + # + # @param status [Integer, VitableConnect::Errors::APIConnectionError] + # @param stream [Enumerable, nil] + def reap_connection!(status, stream:) + case status + in (..199) | (300..499) + stream&.each { next } + in VitableConnect::Errors::APIConnectionError | (500..) + VitableConnect::Internal::Util.close_fused!(stream) + else + end + end + end + + # @return [URI::Generic] + attr_reader :base_url + + # @return [Float] + attr_reader :timeout + + # @return [Integer] + attr_reader :max_retries + + # @return [Float] + attr_reader :initial_retry_delay + + # @return [Float] + attr_reader :max_retry_delay + + # @return [Hash{String=>String}] + attr_reader :headers + + # @return [String, nil] + attr_reader :idempotency_header + + # @api private + # @return [VitableConnect::Internal::Transport::PooledNetRequester] + attr_reader :requester + + # @api private + # + # @param base_url [String] + # @param timeout [Float] + # @param max_retries [Integer] + # @param initial_retry_delay [Float] + # @param max_retry_delay [Float] + # @param headers [Hash{String=>String, Integer, Array, nil}] + # @param idempotency_header [String, nil] + def initialize( + base_url:, + timeout: 0.0, + max_retries: 0, + initial_retry_delay: 0.0, + max_retry_delay: 0.0, + headers: {}, + idempotency_header: nil + ) + @requester = VitableConnect::Internal::Transport::PooledNetRequester.new + @headers = VitableConnect::Internal::Util.normalized_headers( + self.class::PLATFORM_HEADERS, + { + "accept" => "application/json", + "content-type" => "application/json", + "user-agent" => user_agent + }, + headers + ) + @base_url_components = VitableConnect::Internal::Util.parse_uri(base_url) + @base_url = VitableConnect::Internal::Util.unparse_uri(@base_url_components) + @idempotency_header = idempotency_header&.to_s&.downcase + @timeout = timeout + @max_retries = max_retries + @initial_retry_delay = initial_retry_delay + @max_retry_delay = max_retry_delay + end + + # @api private + # + # @return [Hash{String=>String}] + private def auth_headers = {} + + # @api private + # + # @return [String] + private def user_agent = "#{self.class.name}/Ruby #{VitableConnect::VERSION}" + + # @api private + # + # @return [String] + private def generate_idempotency_key = "stainless-ruby-retry-#{SecureRandom.uuid}" + + # @api private + # + # @param req [Hash{Symbol=>Object}] . + # + # @option req [Symbol] :method + # + # @option req [String, Array] :path + # + # @option req [Hash{String=>Array, String, nil}, nil] :query + # + # @option req [Hash{String=>String, Integer, Array, nil}, nil] :headers + # + # @option req [Object, nil] :body + # + # @option req [Symbol, Integer, Array, Proc, nil] :unwrap + # + # @option req [Class, nil] :page + # + # @option req [Class, nil] :stream + # + # @option req [VitableConnect::Internal::Type::Converter, Class, nil] :model + # + # @option req [Hash{Symbol=>Boolean}, nil] :security + # + # @param opts [Hash{Symbol=>Object}] . + # + # @option opts [String, nil] :idempotency_key + # + # @option opts [Hash{String=>Array, String, nil}, nil] :extra_query + # + # @option opts [Hash{String=>String, nil}, nil] :extra_headers + # + # @option opts [Object, nil] :extra_body + # + # @option opts [Integer, nil] :max_retries + # + # @option opts [Float, nil] :timeout + # + # @return [Hash{Symbol=>Object}] + private def build_request(req, opts) + method, uninterpolated_path = req.fetch_values(:method, :path) + + path = VitableConnect::Internal::Util.interpolate_path(uninterpolated_path) + + query = VitableConnect::Internal::Util.deep_merge(req[:query].to_h, opts[:extra_query].to_h) + + headers = VitableConnect::Internal::Util.normalized_headers( + @headers, + auth_headers( + security: req.fetch( + :security, {api_key_auth: true} + ) + ), + req[:headers].to_h, + opts[:extra_headers].to_h + ) + + if @idempotency_header && + !headers.key?(@idempotency_header) && + (!Net::HTTP::IDEMPOTENT_METHODS_.include?(method.to_s.upcase) || opts.key?(:idempotency_key)) + headers[@idempotency_header] = opts.fetch(:idempotency_key) { generate_idempotency_key } + end + + unless headers.key?("x-stainless-retry-count") + headers["x-stainless-retry-count"] = "0" + end + + timeout = opts.fetch(:timeout, @timeout).to_f.clamp(0..) + unless headers.key?("x-stainless-timeout") || timeout.zero? + headers["x-stainless-timeout"] = timeout.to_s + end + + headers.reject! { |_, v| v.to_s.empty? } + + body = + case method + in :get | :head | :options | :trace + nil + else + VitableConnect::Internal::Util.deep_merge(*[req[:body], opts[:extra_body]].compact) + end + + # Generated methods always pass `req[:body]` for operations that define a + # request body, so only elide the content-type header when the operation + # has no body at all, not when an optional body param was omitted. + headers.delete("content-type") if body.nil? && !req.key?(:body) + + url = VitableConnect::Internal::Util.join_parsed_uri( + @base_url_components, + {**req, path: path, query: query} + ) + headers, encoded = VitableConnect::Internal::Util.encode_content(headers, body) + { + method: method, + url: url, + headers: headers, + body: encoded, + max_retries: opts.fetch(:max_retries, @max_retries), + timeout: timeout + } + end + + # @api private + # + # @param headers [Hash{String=>String}] + # @param retry_count [Integer] + # + # @return [Float] + private def retry_delay(headers, retry_count:) + # Non-standard extension + span = Float(headers["retry-after-ms"], exception: false)&.then { _1 / 1000 } + return span if span + + retry_header = headers["retry-after"] + return span if (span = Float(retry_header, exception: false)) + + span = retry_header&.then do + Time.httpdate(_1) - Time.now + rescue ArgumentError + nil + end + return span if span + + scale = retry_count**2 + jitter = 1 - (0.25 * rand) + (@initial_retry_delay * scale * jitter).clamp(0, @max_retry_delay) + end + + # @api private + # + # @param request [Hash{Symbol=>Object}] . + # + # @option request [Symbol] :method + # + # @option request [URI::Generic] :url + # + # @option request [Hash{String=>String}] :headers + # + # @option request [Object] :body + # + # @option request [Integer] :max_retries + # + # @option request [Float] :timeout + # + # @param redirect_count [Integer] + # + # @param retry_count [Integer] + # + # @param send_retry_header [Boolean] + # + # @raise [VitableConnect::Errors::APIError] + # @return [Array(Integer, Net::HTTPResponse, Enumerable)] + def send_request(request, redirect_count:, retry_count:, send_retry_header:) + url, headers, max_retries, timeout = request.fetch_values(:url, :headers, :max_retries, :timeout) + input = {**request.except(:timeout), deadline: VitableConnect::Internal::Util.monotonic_secs + timeout} + + if send_retry_header + headers["x-stainless-retry-count"] = retry_count.to_s + end + + begin + status, response, stream = @requester.execute(input) + rescue VitableConnect::Errors::APIConnectionError => e + status = e + end + headers = VitableConnect::Internal::Util.normalized_headers(response&.each_header&.to_h) + + case status + in ..299 + [status, response, stream] + in 300..399 if redirect_count >= self.class::MAX_REDIRECTS + self.class.reap_connection!(status, stream: stream) + + message = "Failed to complete the request within #{self.class::MAX_REDIRECTS} redirects." + raise VitableConnect::Errors::APIConnectionError.new( + url: url, + response: response, + message: message + ) + in 300..399 + self.class.reap_connection!(status, stream: stream) + + request = self.class.follow_redirect(request, status: status, response_headers: headers) + send_request( + request, + redirect_count: redirect_count + 1, + retry_count: retry_count, + send_retry_header: send_retry_header + ) + in VitableConnect::Errors::APIConnectionError if retry_count >= max_retries + raise status + in (400..) if retry_count >= max_retries || !self.class.should_retry?(status, headers: headers) + decoded = Kernel.then do + VitableConnect::Internal::Util.decode_content(headers, stream: stream, suppress_error: true) + ensure + self.class.reap_connection!(status, stream: stream) + end + + raise VitableConnect::Errors::APIStatusError.for( + url: url, + status: status, + headers: headers, + body: decoded, + request: nil, + response: response + ) + in (400..) | VitableConnect::Errors::APIConnectionError + self.class.reap_connection!(status, stream: stream) + + delay = retry_delay(response || {}, retry_count: retry_count) + sleep(delay) + + send_request( + request, + redirect_count: redirect_count, + retry_count: retry_count + 1, + send_retry_header: send_retry_header + ) + end + end + + # Execute the request specified by `req`. This is the method that all resource + # methods call into. + # + # @overload request(method, path, query: {}, headers: {}, body: nil, unwrap: nil, page: nil, stream: nil, model: VitableConnect::Internal::Type::Unknown, security: {api_key_auth: true}, options: {}) + # + # @param method [Symbol] + # + # @param path [String, Array] + # + # @param query [Hash{String=>Array, String, nil}, nil] + # + # @param headers [Hash{String=>String, Integer, Array, nil}, nil] + # + # @param body [Object, nil] + # + # @param unwrap [Symbol, Integer, Array, Proc, nil] + # + # @param page [Class, nil] + # + # @param stream [Class, nil] + # + # @param model [VitableConnect::Internal::Type::Converter, Class, nil] + # + # @param security [Hash{Symbol=>Boolean}, nil] + # + # @param options [VitableConnect::RequestOptions, Hash{Symbol=>Object}, nil] . + # + # @option options [String, nil] :idempotency_key + # + # @option options [Hash{String=>Array, String, nil}, nil] :extra_query + # + # @option options [Hash{String=>String, nil}, nil] :extra_headers + # + # @option options [Object, nil] :extra_body + # + # @option options [Integer, nil] :max_retries + # + # @option options [Float, nil] :timeout + # + # @raise [VitableConnect::Errors::APIError] + # @return [Object] + def request(req) + self.class.validate!(req) + model = req.fetch(:model) { VitableConnect::Internal::Type::Unknown } + opts = req[:options].to_h + unwrap = req[:unwrap] + VitableConnect::RequestOptions.validate!(opts) + request = build_request(req.except(:options), opts) + url = request.fetch(:url) + + # Don't send the current retry count in the headers if the caller modified the header defaults. + send_retry_header = request.fetch(:headers)["x-stainless-retry-count"] == "0" + status, response, stream = send_request( + request, + redirect_count: 0, + retry_count: 0, + send_retry_header: send_retry_header + ) + + headers = VitableConnect::Internal::Util.normalized_headers(response.each_header.to_h) + decoded = VitableConnect::Internal::Util.decode_content(headers, stream: stream) + case req + in {stream: Class => st} + st.new( + model: model, + url: url, + status: status, + headers: headers, + response: response, + unwrap: unwrap, + stream: decoded + ) + in {page: Class => page} + page.new(client: self, req: req, headers: headers, page_data: decoded) + else + unwrapped = VitableConnect::Internal::Util.dig(decoded, unwrap) + VitableConnect::Internal::Type::Converter.coerce(model, unwrapped) + end + end + + # @api private + # + # @return [String] + def inspect + # rubocop:disable Layout/LineLength + "#<#{self.class.name}:0x#{object_id.to_s(16)} base_url=#{@base_url} max_retries=#{@max_retries} timeout=#{@timeout}>" + # rubocop:enable Layout/LineLength + end + + define_sorbet_constant!(:RequestComponents) do + T.type_alias do + { + method: Symbol, + path: T.any(String, T::Array[String]), + query: T.nilable(T::Hash[String, T.nilable(T.any(T::Array[String], String))]), + headers: T.nilable( + T::Hash[String, + T.nilable( + T.any( + String, + Integer, + T::Array[T.nilable(T.any(String, Integer))] + ) + )] + ), + body: T.nilable(T.anything), + unwrap: T.nilable( + T.any( + Symbol, + Integer, + T::Array[T.any(Symbol, Integer)], + T.proc.params(arg0: T.anything).returns(T.anything) + ) + ), + page: T.nilable(T::Class[VitableConnect::Internal::Type::BasePage[VitableConnect::Internal::Type::BaseModel]]), + stream: T.nilable(T::Class[T.anything]), + model: T.nilable(VitableConnect::Internal::Type::Converter::Input), + security: T.nilable({api_key_auth: T::Boolean}), + options: T.nilable(VitableConnect::RequestOptions::OrHash) + } + end + end + define_sorbet_constant!(:RequestInput) do + T.type_alias do + { + method: Symbol, + url: URI::Generic, + headers: T::Hash[String, String], + body: T.anything, + max_retries: Integer, + timeout: Float + } + end + end + end + end + end +end diff --git a/lib/vitable_connect/internal/transport/pooled_net_requester.rb b/lib/vitable_connect/internal/transport/pooled_net_requester.rb new file mode 100644 index 0000000..8e09cfc --- /dev/null +++ b/lib/vitable_connect/internal/transport/pooled_net_requester.rb @@ -0,0 +1,210 @@ +# frozen_string_literal: true + +module VitableConnect + module Internal + module Transport + # @api private + class PooledNetRequester + extend VitableConnect::Internal::Util::SorbetRuntimeSupport + + # from the golang stdlib + # https://github.com/golang/go/blob/c8eced8580028328fde7c03cbfcb720ce15b2358/src/net/http/transport.go#L49 + KEEP_ALIVE_TIMEOUT = 30 + + DEFAULT_MAX_CONNECTIONS = [Etc.nprocessors, 99].max + + class << self + # @api private + # + # @param cert_store [OpenSSL::X509::Store] + # @param url [URI::Generic] + # + # @return [Net::HTTP] + def connect(cert_store:, url:) + port = + case [url.port, url.scheme] + in [Integer, _] + url.port + in [nil, "http" | "ws"] + Net::HTTP.http_default_port + in [nil, "https" | "wss"] + Net::HTTP.https_default_port + end + + Net::HTTP.new(url.host, port).tap do + _1.use_ssl = %w[https wss].include?(url.scheme) + _1.max_retries = 0 + + (_1.cert_store = cert_store) if _1.use_ssl? + end + end + + # @api private + # + # @param conn [Net::HTTP] + # @param deadline [Float] + def calibrate_socket_timeout(conn, deadline) + timeout = deadline - VitableConnect::Internal::Util.monotonic_secs + conn.open_timeout = conn.read_timeout = conn.write_timeout = conn.continue_timeout = timeout + end + + # @api private + # + # @param request [Hash{Symbol=>Object}] . + # + # @option request [Symbol] :method + # + # @option request [URI::Generic] :url + # + # @option request [Hash{String=>String}] :headers + # + # @param blk [Proc] + # + # @yieldparam [String] + # @return [Array(Net::HTTPGenericRequest, Proc)] + def build_request(request, &blk) + method, url, headers, body = request.fetch_values(:method, :url, :headers, :body) + req = Net::HTTPGenericRequest.new( + method.to_s.upcase, + !body.nil?, + method != :head, + URI(url.to_s) # ensure we construct a URI class of the right scheme + ) + + headers.each { req[_1] = _2 } + + case body + in nil + req["content-length"] ||= 0 unless req["transfer-encoding"] + in String + req["content-length"] ||= body.bytesize.to_s unless req["transfer-encoding"] + req.body_stream = VitableConnect::Internal::Util::ReadIOAdapter.new(body, &blk) + in StringIO + req["content-length"] ||= body.size.to_s unless req["transfer-encoding"] + req.body_stream = VitableConnect::Internal::Util::ReadIOAdapter.new(body, &blk) + in Pathname | IO | Enumerator + req["transfer-encoding"] ||= "chunked" unless req["content-length"] + req.body_stream = VitableConnect::Internal::Util::ReadIOAdapter.new(body, &blk) + end + + [req, req.body_stream&.method(:close)] + end + end + + # @api private + # + # @param url [URI::Generic] + # @param deadline [Float] + # @param blk [Proc] + # + # @raise [Timeout::Error] + # @yieldparam [Net::HTTP] + private def with_pool(url, deadline:, &blk) + origin = VitableConnect::Internal::Util.uri_origin(url) + timeout = deadline - VitableConnect::Internal::Util.monotonic_secs + pool = + @mutex.synchronize do + @pools[origin] ||= ConnectionPool.new(size: @size) do + self.class.connect(cert_store: @cert_store, url: url) + end + end + + pool.with(timeout: timeout, &blk) + end + + # @api private + # + # @param request [Hash{Symbol=>Object}] . + # + # @option request [Symbol] :method + # + # @option request [URI::Generic] :url + # + # @option request [Hash{String=>String}] :headers + # + # @option request [Object] :body + # + # @option request [Float] :deadline + # + # @return [Array(Integer, Net::HTTPResponse, Enumerable)] + def execute(request) + url, deadline = request.fetch_values(:url, :deadline) + + req = nil + finished = false + + # rubocop:disable Metrics/BlockLength + enum = Enumerator.new do |y| + next if finished + + with_pool(url, deadline: deadline) do |conn| + eof = false + closing = nil + ::Thread.handle_interrupt(Object => :never) do + ::Thread.handle_interrupt(Object => :immediate) do + req, closing = self.class.build_request(request) do + self.class.calibrate_socket_timeout(conn, deadline) + end + + self.class.calibrate_socket_timeout(conn, deadline) + unless conn.started? + conn.keep_alive_timeout = self.class::KEEP_ALIVE_TIMEOUT + conn.start + end + + self.class.calibrate_socket_timeout(conn, deadline) + ::Kernel.catch(:jump) do + conn.request(req) do |rsp| + y << [req, rsp] + ::Kernel.throw(:jump) if finished + + rsp.read_body do |bytes| + y << bytes.force_encoding(Encoding::BINARY) + ::Kernel.throw(:jump) if finished + + self.class.calibrate_socket_timeout(conn, deadline) + end + eof = true + end + end + end + ensure + begin + conn.finish if !eof && conn&.started? + ensure + closing&.call + end + end + end + rescue Timeout::Error + raise VitableConnect::Errors::APITimeoutError.new(url: url, request: req) + rescue StandardError + raise VitableConnect::Errors::APIConnectionError.new(url: url, request: req) + end + # rubocop:enable Metrics/BlockLength + + _, response = enum.next + body = VitableConnect::Internal::Util.fused_enum(enum, external: true) do + finished = true + loop { enum.next } + end + [Integer(response.code), response, body] + end + + # @api private + # + # @param size [Integer] + def initialize(size: self.class::DEFAULT_MAX_CONNECTIONS) + @mutex = Mutex.new + @size = size + @cert_store = OpenSSL::X509::Store.new.tap(&:set_default_paths) + @pools = {} + end + + define_sorbet_constant!(:Request) do + T.type_alias { {method: Symbol, url: URI::Generic, headers: T::Hash[String, String], body: T.anything, deadline: Float} } + end + end + end + end +end diff --git a/lib/vitable_connect/internal/type/array_of.rb b/lib/vitable_connect/internal/type/array_of.rb new file mode 100644 index 0000000..c1e62c7 --- /dev/null +++ b/lib/vitable_connect/internal/type/array_of.rb @@ -0,0 +1,168 @@ +# frozen_string_literal: true + +module VitableConnect + module Internal + module Type + # @api private + # + # @abstract + # + # @generic Elem + # + # Array of items of a given type. + class ArrayOf + include VitableConnect::Internal::Type::Converter + include VitableConnect::Internal::Util::SorbetRuntimeSupport + + private_class_method :new + + # @overload [](type_info, spec = {}) + # + # @param type_info [Hash{Symbol=>Object}, Proc, VitableConnect::Internal::Type::Converter, Class] + # + # @param spec [Hash{Symbol=>Object}] . + # + # @option spec [NilClass, TrueClass, FalseClass, Integer, Float, Symbol] :const + # + # @option spec [Proc] :enum + # + # @option spec [Proc] :union + # + # @option spec [Boolean] :"nil?" + # + # @return [self] + def self.[](...) = new(...) + + # @api public + # + # @param other [Object] + # + # @return [Boolean] + def ===(other) = other.is_a?(Array) && other.all?(item_type) + + # @api public + # + # @param other [Object] + # + # @return [Boolean] + def ==(other) + # rubocop:disable Layout/LineLength + other.is_a?(VitableConnect::Internal::Type::ArrayOf) && other.nilable? == nilable? && other.item_type == item_type + # rubocop:enable Layout/LineLength + end + + # @api public + # + # @return [Integer] + def hash = [self.class, item_type].hash + + # @api private + # + # @param value [Array, Object] + # + # @param state [Hash{Symbol=>Object}] . + # + # @option state [Boolean] :translate_names + # + # @option state [Boolean] :strictness + # + # @option state [Hash{Symbol=>Object}] :exactness + # + # @option state [Class] :error + # + # @option state [Integer] :branched + # + # @return [Array, Object] + def coerce(value, state:) + exactness = state.fetch(:exactness) + + unless value.is_a?(Array) + exactness[:no] += 1 + state[:error] = TypeError.new("#{value.class} can't be coerced into #{Array}") + return value + end + + target = item_type + exactness[:yes] += 1 + value + .map do |item| + case [nilable?, item] + in [true, nil] + exactness[:yes] += 1 + nil + else + VitableConnect::Internal::Type::Converter.coerce(target, item, state: state) + end + end + end + + # @api private + # + # @param value [Array, Object] + # + # @param state [Hash{Symbol=>Object}] . + # + # @option state [Boolean] :can_retry + # + # @return [Array, Object] + def dump(value, state:) + target = item_type + if value.is_a?(Array) + value.map do + VitableConnect::Internal::Type::Converter.dump(target, _1, state: state) + end + else + super + end + end + + # @api private + # + # @return [Object] + def to_sorbet_type + T::Array[VitableConnect::Internal::Util::SorbetRuntimeSupport.to_sorbet_type(item_type)] + end + + # @api private + # + # @return [generic] + protected def item_type = @item_type_fn.call + + # @api private + # + # @return [Boolean] + protected def nilable? = @nilable + + # @api private + # + # @param type_info [Hash{Symbol=>Object}, Proc, VitableConnect::Internal::Type::Converter, Class] + # + # @param spec [Hash{Symbol=>Object}] . + # + # @option spec [NilClass, TrueClass, FalseClass, Integer, Float, Symbol] :const + # + # @option spec [Proc] :enum + # + # @option spec [Proc] :union + # + # @option spec [Boolean] :"nil?" + def initialize(type_info, spec = {}) + @item_type_fn = VitableConnect::Internal::Type::Converter.type_info(type_info || spec) + @meta = VitableConnect::Internal::Type::Converter.meta_info(type_info, spec) + @nilable = spec.fetch(:nil?, false) + end + + # @api private + # + # @param depth [Integer] + # + # @return [String] + def inspect(depth: 0) + items = VitableConnect::Internal::Type::Converter.inspect(item_type, depth: depth.succ) + + "#{self.class}[#{[items, nilable? ? 'nil' : nil].compact.join(' | ')}]" + end + end + end + end +end diff --git a/lib/vitable_connect/internal/type/base_model.rb b/lib/vitable_connect/internal/type/base_model.rb new file mode 100644 index 0000000..edc2ab3 --- /dev/null +++ b/lib/vitable_connect/internal/type/base_model.rb @@ -0,0 +1,534 @@ +# frozen_string_literal: true + +module VitableConnect + module Internal + module Type + # @abstract + class BaseModel + extend VitableConnect::Internal::Type::Converter + extend VitableConnect::Internal::Util::SorbetRuntimeSupport + + class << self + # @api private + # + # Assumes superclass fields are totally defined before fields are accessed / + # defined on subclasses. + # + # @param child [Class] + def inherited(child) + super + child.known_fields.replace(known_fields.dup) + end + + # @api private + # + # @return [Hash{Symbol=>Hash{Symbol=>Object}}] + def known_fields = @known_fields ||= {} + + # @api private + # + # @return [Hash{Symbol=>Hash{Symbol=>Object}}] + def fields + known_fields.transform_values do |field| + {**field.except(:type_fn), type: field.fetch(:type_fn).call} + end + end + + # @api private + # + # @param name_sym [Symbol] + # + # @param required [Boolean] + # + # @param type_info [Hash{Symbol=>Object}, Proc, VitableConnect::Internal::Type::Converter, Class] + # + # @param spec [Hash{Symbol=>Object}] . + # + # @option spec [NilClass, TrueClass, FalseClass, Integer, Float, Symbol] :const + # + # @option spec [Proc] :enum + # + # @option spec [Proc] :union + # + # @option spec [Boolean] :"nil?" + private def add_field(name_sym, required:, type_info:, spec:) + meta = VitableConnect::Internal::Type::Converter.meta_info(type_info, spec) + type_fn, info = + case type_info + in Proc | VitableConnect::Internal::Type::Converter | Class + [VitableConnect::Internal::Type::Converter.type_info({**spec, union: type_info}), spec] + in Hash + [VitableConnect::Internal::Type::Converter.type_info(type_info), type_info] + end + + setter = :"#{name_sym}=" + api_name = info.fetch(:api_name, name_sym) + nilable = info.fetch(:nil?, false) + const = required && !nilable ? info.fetch(:const, VitableConnect::Internal::OMIT) : VitableConnect::Internal::OMIT + + [name_sym, setter].each { undef_method(_1) } if known_fields.key?(name_sym) + + known_fields[name_sym] = + { + mode: @mode, + api_name: api_name, + required: required, + nilable: nilable, + const: const, + type_fn: type_fn, + meta: meta + } + + define_method(setter) do |value| + target = type_fn.call + state = VitableConnect::Internal::Type::Converter.new_coerce_state(translate_names: false) + coerced = VitableConnect::Internal::Type::Converter.coerce(target, value, state: state) + status = @coerced.store(name_sym, state.fetch(:error) || true) + stored = + case [target, status] + in [VitableConnect::Internal::Type::Converter | Symbol, true] + coerced + else + value + end + @data.store(name_sym, stored) + end + + # rubocop:disable Style/CaseEquality + # rubocop:disable Metrics/BlockLength + define_method(name_sym) do + target = type_fn.call + + case @coerced[name_sym] + in true | false if VitableConnect::Internal::Type::Converter === target + @data.fetch(name_sym) + in ::StandardError => e + raise VitableConnect::Errors::ConversionError.new( + on: self.class, + method: __method__, + target: target, + value: @data.fetch(name_sym), + cause: e + ) + else + Kernel.then do + value = @data.fetch(name_sym) { const == VitableConnect::Internal::OMIT ? nil : const } + state = VitableConnect::Internal::Type::Converter.new_coerce_state(translate_names: false) + if (nilable || !required) && value.nil? + nil + else + VitableConnect::Internal::Type::Converter.coerce( + target, value, state: state + ) + end + rescue StandardError => e + raise VitableConnect::Errors::ConversionError.new( + on: self.class, + method: __method__, + target: target, + value: value, + cause: e + ) + end + end + end + # rubocop:enable Metrics/BlockLength + # rubocop:enable Style/CaseEquality + end + + # @api private + # + # @param name_sym [Symbol] + # + # @param type_info [Hash{Symbol=>Object}, Proc, VitableConnect::Internal::Type::Converter, Class] + # + # @param spec [Hash{Symbol=>Object}] . + # + # @option spec [NilClass, TrueClass, FalseClass, Integer, Float, Symbol] :const + # + # @option spec [Proc] :enum + # + # @option spec [Proc] :union + # + # @option spec [Boolean] :"nil?" + def required(name_sym, type_info, spec = {}) + add_field(name_sym, required: true, type_info: type_info, spec: spec) + end + + # @api private + # + # @param name_sym [Symbol] + # + # @param type_info [Hash{Symbol=>Object}, Proc, VitableConnect::Internal::Type::Converter, Class] + # + # @param spec [Hash{Symbol=>Object}] . + # + # @option spec [NilClass, TrueClass, FalseClass, Integer, Float, Symbol] :const + # + # @option spec [Proc] :enum + # + # @option spec [Proc] :union + # + # @option spec [Boolean] :"nil?" + def optional(name_sym, type_info, spec = {}) + add_field(name_sym, required: false, type_info: type_info, spec: spec) + end + + # @api private + # + # `request_only` attributes not excluded from `.#coerce` when receiving responses + # even if well behaved servers should not send them + # + # @param blk [Proc] + private def request_only(&blk) + @mode = :dump + blk.call + ensure + @mode = nil + end + + # @api private + # + # `response_only` attributes are omitted from `.#dump` when making requests + # + # @param blk [Proc] + private def response_only(&blk) + @mode = :coerce + blk.call + ensure + @mode = nil + end + + # @api public + # + # @param other [Object] + # + # @return [Boolean] + def ==(other) + other.is_a?(Class) && other <= VitableConnect::Internal::Type::BaseModel && other.fields == fields + end + + # @api public + # + # @return [Integer] + def hash = fields.hash + end + + # @api public + # + # @param other [Object] + # + # @return [Boolean] + def ==(other) = self.class == other.class && @data == other.to_h + + # @api public + # + # @return [Integer] + def hash = [self.class, @data].hash + + class << self + # @api private + # + # @param value [VitableConnect::Internal::Type::BaseModel, Hash{Object=>Object}, Object] + # + # @param state [Hash{Symbol=>Object}] . + # + # @option state [Boolean] :translate_names + # + # @option state [Boolean] :strictness + # + # @option state [Hash{Symbol=>Object}] :exactness + # + # @option state [Class] :error + # + # @option state [Integer] :branched + # + # @return [self, Object] + def coerce(value, state:) + exactness = state.fetch(:exactness) + + if value.is_a?(self) + exactness[:yes] += 1 + return value + end + + unless (val = VitableConnect::Internal::Util.coerce_hash(value)).is_a?(Hash) + exactness[:no] += 1 + state[:error] = TypeError.new("#{value.class} can't be coerced into #{Hash}") + return value + end + exactness[:yes] += 1 + + keys = val.keys.to_set + instance = new + data = instance.to_h + status = instance.instance_variable_get(:@coerced) + + # rubocop:disable Metrics/BlockLength + fields.each do |name, field| + mode, required, target = field.fetch_values(:mode, :required, :type) + api_name, nilable, const = field.fetch_values(:api_name, :nilable, :const) + src_name = state.fetch(:translate_names) ? api_name : name + + unless val.key?(src_name) + if required && mode != :dump && const == VitableConnect::Internal::OMIT + exactness[nilable ? :maybe : :no] += 1 + else + exactness[:yes] += 1 + end + next + end + + item = val.fetch(src_name) + keys.delete(src_name) + + state[:error] = nil + converted = + if item.nil? && (nilable || !required) + exactness[nilable ? :yes : :maybe] += 1 + nil + else + coerced = VitableConnect::Internal::Type::Converter.coerce(target, item, state: state) + case target + in VitableConnect::Internal::Type::Converter | Symbol + coerced + else + item + end + end + + status.store(name, state.fetch(:error) || true) + data.store(name, converted) + end + # rubocop:enable Metrics/BlockLength + + keys.each { data.store(_1, val.fetch(_1)) } + instance + end + + # @api private + # + # @param value [self, Object] + # + # @param state [Hash{Symbol=>Object}] . + # + # @option state [Boolean] :can_retry + # + # @return [Hash{Object=>Object}, Object] + def dump(value, state:) + unless (coerced = VitableConnect::Internal::Util.coerce_hash(value)).is_a?(Hash) + return super + end + + acc = {} + + coerced.each do |key, val| + name = key.is_a?(String) ? key.to_sym : key + case (field = known_fields[name]) + in nil + acc.store(name, super(val, state: state)) + else + api_name, mode, type_fn = field.fetch_values(:api_name, :mode, :type_fn) + case mode + in :coerce + next + else + target = type_fn.call + acc.store( + api_name, + VitableConnect::Internal::Type::Converter.dump(target, val, state: state) + ) + end + end + end + + known_fields.each_value do |field| + api_name, mode, const = field.fetch_values(:api_name, :mode, :const) + next if mode == :coerce || acc.key?(api_name) || const == VitableConnect::Internal::OMIT + acc.store(api_name, const) + end + + acc + end + + # @api private + # + # @return [Object] + def to_sorbet_type + self + end + end + + class << self + # @api private + # + # @param model [VitableConnect::Internal::Type::BaseModel] + # @param convert [Boolean] + # + # @return [Hash{Symbol=>Object}] + def recursively_to_h(model, convert:) + rec = ->(x) do + case x + in VitableConnect::Internal::Type::BaseModel + if convert + fields = x.class.known_fields + x.to_h.to_h do |key, val| + [key, rec.call(fields.key?(key) ? x.public_send(key) : val)] + rescue VitableConnect::Errors::ConversionError + [key, rec.call(val)] + end + else + rec.call(x.to_h) + end + in Hash + x.transform_values(&rec) + in Array + x.map(&rec) + else + x + end + end + rec.call(model) + end + end + + # @api public + # + # Returns the raw value associated with the given key, if found. Otherwise, nil is + # returned. + # + # It is valid to lookup keys that are not in the API spec, for example to access + # undocumented features. This method does not parse response data into + # higher-level types. Lookup by anything other than a Symbol is an ArgumentError. + # + # @param key [Symbol] + # + # @return [Object, nil] + def [](key) + unless key.instance_of?(Symbol) + raise ArgumentError.new("Expected symbol key for lookup, got #{key.inspect}") + end + + @data[key] + end + + # @api public + # + # Returns a Hash of the data underlying this object. O(1) + # + # Keys are Symbols and values are the raw values from the response. The return + # value indicates which values were ever set on the object. i.e. there will be a + # key in this hash if they ever were, even if the set value was nil. + # + # This method is not recursive. The returned value is shared by the object, so it + # should not be mutated. + # + # @return [Hash{Symbol=>Object}] + def to_h = @data + + alias_method :to_hash, :to_h + + # @api public + # + # In addition to the behaviour of `#to_h`, this method will recursively call + # `#to_h` on nested models. + # + # @return [Hash{Symbol=>Object}] + def deep_to_h = self.class.recursively_to_h(@data, convert: false) + + # @param keys [Array, nil] + # + # @return [Hash{Symbol=>Object}] + # + # @example + # # `auth_issue_access_token_response` is a `VitableConnect::Models::AuthIssueAccessTokenResponse` + # auth_issue_access_token_response => { + # access_token: access_token, + # expires_in: expires_in, + # token_type: token_type + # } + def deconstruct_keys(keys) + (keys || self.class.known_fields.keys) + .filter_map do |k| + unless self.class.known_fields.key?(k) + next + end + + [k, public_send(k)] + end + .to_h + end + + # @api public + # + # @param a [Object] + # + # @return [String] + def to_json(*a) = VitableConnect::Internal::Type::Converter.dump(self.class, self).to_json(*a) + + # @api public + # + # @param a [Object] + # + # @return [String] + def to_yaml(*a) = VitableConnect::Internal::Type::Converter.dump(self.class, self).to_yaml(*a) + + # Create a new instance of a model. + # + # @param data [Hash{Symbol=>Object}, self] + def initialize(data = {}) + @data = {} + @coerced = {} + VitableConnect::Internal::Util.coerce_hash!(data).each do + if self.class.known_fields.key?(_1) + public_send(:"#{_1}=", _2) + else + @data.store(_1, _2) + @coerced.store(_1, false) + end + end + end + + class << self + # @api private + # + # @param depth [Integer] + # + # @return [String] + def inspect(depth: 0) + return super() if depth.positive? + + depth = depth.succ + deferred = fields.transform_values do |field| + type, required, nilable = field.fetch_values(:type, :required, :nilable) + inspected = [ + VitableConnect::Internal::Type::Converter.inspect(type, depth: depth), + !required || nilable ? "nil" : nil + ].compact.join(" | ") + -> { inspected }.tap { _1.define_singleton_method(:inspect) { call } } + end + + "#{name}[#{deferred.inspect}]" + end + end + + # @api public + # + # @return [String] + def to_s = deep_to_h.to_s + + # @api private + # + # @return [String] + def inspect + converted = self.class.recursively_to_h(self, convert: true) + "#<#{self.class}:0x#{object_id.to_s(16)} #{converted}>" + end + + define_sorbet_constant!(:KnownField) do + T.type_alias { {mode: T.nilable(Symbol), required: T::Boolean, nilable: T::Boolean} } + end + end + end + end +end diff --git a/lib/vitable_connect/internal/type/base_page.rb b/lib/vitable_connect/internal/type/base_page.rb new file mode 100644 index 0000000..226da5a --- /dev/null +++ b/lib/vitable_connect/internal/type/base_page.rb @@ -0,0 +1,55 @@ +# frozen_string_literal: true + +module VitableConnect + module Internal + module Type + # @api private + # + # @generic Elem + # + # This module provides a base implementation for paginated responses in the SDK. + module BasePage + # rubocop:disable Lint/UnusedMethodArgument + + # @api public + # + # @return [Boolean] + def next_page? = (raise NotImplementedError) + + # @api public + # + # @raise [VitableConnect::Errors::APIError] + # @return [self] + def next_page = (raise NotImplementedError) + + # @api public + # + # @param blk [Proc] + # + # @yieldparam [generic] + # @return [void] + def auto_paging_each(&blk) = (raise NotImplementedError) + + # @return [Enumerable>] + def to_enum = super(:auto_paging_each) + + alias_method :enum_for, :to_enum + + # @api private + # + # @param client [VitableConnect::Internal::Transport::BaseClient] + # @param req [Hash{Symbol=>Object}] + # @param headers [Hash{String=>String}] + # @param page_data [Object] + def initialize(client:, req:, headers:, page_data:) + @client = client + @req = req + @model = req.fetch(:model) + super() + end + + # rubocop:enable Lint/UnusedMethodArgument + end + end + end +end diff --git a/lib/vitable_connect/internal/type/boolean.rb b/lib/vitable_connect/internal/type/boolean.rb new file mode 100644 index 0000000..4075c45 --- /dev/null +++ b/lib/vitable_connect/internal/type/boolean.rb @@ -0,0 +1,77 @@ +# frozen_string_literal: true + +module VitableConnect + module Internal + module Type + # @api private + # + # @abstract + # + # Ruby has no Boolean class; this is something for models to refer to. + class Boolean + extend VitableConnect::Internal::Type::Converter + extend VitableConnect::Internal::Util::SorbetRuntimeSupport + + private_class_method :new + + # @api public + # + # @param other [Object] + # + # @return [Boolean] + def self.===(other) = other == true || other == false + + # @api public + # + # @param other [Object] + # + # @return [Boolean] + def self.==(other) = other.is_a?(Class) && other <= VitableConnect::Internal::Type::Boolean + + class << self + # @api private + # + # Coerce value to Boolean if possible, otherwise return the original value. + # + # @param value [Boolean, Object] + # + # @param state [Hash{Symbol=>Object}] . + # + # @option state [Boolean] :translate_names + # + # @option state [Boolean] :strictness + # + # @option state [Hash{Symbol=>Object}] :exactness + # + # @option state [Class] :error + # + # @option state [Integer] :branched + # + # @return [Boolean, Object] + def coerce(value, state:) + state.fetch(:exactness)[value == true || value == false ? :yes : :no] += 1 + value + end + + # @!method dump(value, state:) + # @api private + # + # @param value [Boolean, Object] + # + # @param state [Hash{Symbol=>Object}] . + # + # @option state [Boolean] :can_retry + # + # @return [Boolean, Object] + + # @api private + # + # @return [Object] + def to_sorbet_type + T::Boolean + end + end + end + end + end +end diff --git a/lib/vitable_connect/internal/type/converter.rb b/lib/vitable_connect/internal/type/converter.rb new file mode 100644 index 0000000..98f05e3 --- /dev/null +++ b/lib/vitable_connect/internal/type/converter.rb @@ -0,0 +1,327 @@ +# frozen_string_literal: true + +module VitableConnect + module Internal + module Type + # @api private + module Converter + extend VitableConnect::Internal::Util::SorbetRuntimeSupport + + # rubocop:disable Lint/UnusedMethodArgument + + # @api private + # + # @param value [Object] + # + # @param state [Hash{Symbol=>Object}] . + # + # @option state [Boolean] :translate_names + # + # @option state [Boolean] :strictness + # + # @option state [Hash{Symbol=>Object}] :exactness + # + # @option state [Class] :error + # + # @option state [Integer] :branched + # + # @return [Object] + def coerce(value, state:) = (raise NotImplementedError) + + # @api private + # + # @param value [Object] + # + # @param state [Hash{Symbol=>Object}] . + # + # @option state [Boolean] :can_retry + # + # @return [Object] + def dump(value, state:) + case value + in Array + value.map { VitableConnect::Internal::Type::Unknown.dump(_1, state: state) } + in Hash + value.transform_values { VitableConnect::Internal::Type::Unknown.dump(_1, state: state) } + in VitableConnect::Internal::Type::BaseModel + value.class.dump(value, state: state) + in StringIO + value.string + in Pathname | IO + state[:can_retry] = false if value.is_a?(IO) + VitableConnect::FilePart.new(value) + in VitableConnect::FilePart + state[:can_retry] = false if value.content.is_a?(IO) + value + else + value + end + end + + # @api private + # + # @param depth [Integer] + # + # @return [String] + def inspect(depth: 0) + super() + end + + # rubocop:enable Lint/UnusedMethodArgument + + class << self + # @api private + # + # @param spec [Hash{Symbol=>Object}, Proc, VitableConnect::Internal::Type::Converter, Class] . + # + # @option spec [NilClass, TrueClass, FalseClass, Integer, Float, Symbol] :const + # + # @option spec [Proc] :enum + # + # @option spec [Proc] :union + # + # @option spec [Boolean] :"nil?" + # + # @return [Proc] + def type_info(spec) + case spec + in Proc + spec + in Hash + type_info(spec.slice(:const, :enum, :union).first&.last) + in true | false + -> { VitableConnect::Internal::Type::Boolean } + in VitableConnect::Internal::Type::Converter | Class | Symbol + -> { spec } + in NilClass | Integer | Float + -> { spec.class } + end + end + + # @api private + # + # @param type_info [Hash{Symbol=>Object}, Proc, VitableConnect::Internal::Type::Converter, Class] . + # + # @option type_info [NilClass, TrueClass, FalseClass, Integer, Float, Symbol] :const + # + # @option type_info [Proc] :enum + # + # @option type_info [Proc] :union + # + # @option type_info [Boolean] :"nil?" + # + # @param spec [Hash{Symbol=>Object}, Proc, VitableConnect::Internal::Type::Converter, Class] . + # + # @option spec [NilClass, TrueClass, FalseClass, Integer, Float, Symbol] :const + # + # @option spec [Proc] :enum + # + # @option spec [Proc] :union + # + # @option spec [Boolean] :"nil?" + # + # @return [Hash{Symbol=>Object}] + def meta_info(type_info, spec) + [spec, type_info].grep(Hash).first.to_h.except(:const, :enum, :union, :nil?) + end + + # @api private + # + # @param translate_names [Boolean] + # + # @return [Hash{Symbol=>Object}] + def new_coerce_state(translate_names: true) + { + translate_names: translate_names, + strictness: true, + exactness: {yes: 0, no: 0, maybe: 0}, + error: nil, + branched: 0 + } + end + + # @api private + # + # Based on `target`, transform `value` into `target`, to the extent possible: + # + # 1. if the given `value` conforms to `target` already, return the given `value` + # 2. if it's possible and safe to convert the given `value` to `target`, then the + # converted value + # 3. otherwise, the given `value` unaltered + # + # The coercion process is subject to improvement between minor release versions. + # See https://docs.pydantic.dev/latest/concepts/unions/#smart-mode + # + # @param target [VitableConnect::Internal::Type::Converter, Class] + # + # @param value [Object] + # + # @param state [Hash{Symbol=>Object}] The `strictness` is one of `true`, `false`. This informs the coercion strategy + # when we have to decide between multiple possible conversion targets: + # + # - `true`: the conversion must be exact, with minimum coercion. + # - `false`: the conversion can be approximate, with some coercion. + # + # The `exactness` is `Hash` with keys being one of `yes`, `no`, or `maybe`. For + # any given conversion attempt, the exactness will be updated based on how closely + # the value recursively matches the target type: + # + # - `yes`: the value can be converted to the target type with minimum coercion. + # - `maybe`: the value can be converted to the target type with some reasonable + # coercion. + # - `no`: the value cannot be converted to the target type. + # + # See implementation below for more details. + # + # @option state [Boolean] :translate_names + # + # @option state [Boolean] :strictness + # + # @option state [Hash{Symbol=>Object}] :exactness + # + # @option state [Class] :error + # + # @option state [Integer] :branched + # + # @return [Object] + def coerce(target, value, state: VitableConnect::Internal::Type::Converter.new_coerce_state) + # rubocop:disable Metrics/BlockNesting + exactness = state.fetch(:exactness) + + case target + in VitableConnect::Internal::Type::Converter + return target.coerce(value, state: state) + in Class + if value.is_a?(target) + exactness[:yes] += 1 + return value + end + + case target + in -> { _1 <= NilClass } + exactness[value.nil? ? :yes : :maybe] += 1 + return nil + in -> { _1 <= Integer } + case value + in Integer + exactness[:yes] += 1 + return value + else + Kernel.then do + return Integer(value).tap { exactness[:maybe] += 1 } + rescue ArgumentError, TypeError => e + state[:error] = e + end + end + in -> { _1 <= Float } + if value.is_a?(Numeric) + exactness[:yes] += 1 + return Float(value) + else + Kernel.then do + return Float(value).tap { exactness[:maybe] += 1 } + rescue ArgumentError, TypeError => e + state[:error] = e + end + end + in -> { _1 <= String } + case value + in String | Symbol | Numeric + exactness[value.is_a?(Numeric) ? :maybe : :yes] += 1 + return value.to_s + in StringIO + exactness[:yes] += 1 + return value.string + else + state[:error] = TypeError.new("#{value.class} can't be coerced into #{String}") + end + in -> { _1 <= Date || _1 <= Time } + Kernel.then do + return target.parse(value).tap { exactness[:yes] += 1 } + rescue ArgumentError, TypeError => e + state[:error] = e + end + in -> { _1 <= StringIO } if value.is_a?(String) + exactness[:yes] += 1 + return StringIO.new(value.b) + else + end + in Symbol + case value + in Symbol | String + if value.to_sym == target + exactness[:yes] += 1 + return target + else + exactness[:maybe] += 1 + return value + end + else + message = "cannot convert non-matching #{value.class} into #{target.inspect}" + state[:error] = ArgumentError.new(message) + end + else + end + + exactness[:no] += 1 + value + # rubocop:enable Metrics/BlockNesting + end + + # @api private + # + # @param target [VitableConnect::Internal::Type::Converter, Class] + # + # @param value [Object] + # + # @param state [Hash{Symbol=>Object}] . + # + # @option state [Boolean] :can_retry + # + # @return [Object] + def dump(target, value, state: {can_retry: true}) + case target + in VitableConnect::Internal::Type::Converter + target.dump(value, state: state) + else + VitableConnect::Internal::Type::Unknown.dump(value, state: state) + end + end + + # @api private + # + # @param target [Object] + # @param depth [Integer] + # + # @return [String] + def inspect(target, depth:) + case target + in VitableConnect::Internal::Type::Converter + target.inspect(depth: depth.succ) + else + target.inspect + end + end + end + + define_sorbet_constant!(:Input) do + T.type_alias { T.any(VitableConnect::Internal::Type::Converter, T::Class[T.anything]) } + end + define_sorbet_constant!(:CoerceState) do + T.type_alias do + { + translate_names: T::Boolean, + strictness: T::Boolean, + exactness: {yes: Integer, no: Integer, maybe: Integer}, + error: T::Class[StandardError], + branched: Integer + } + end + end + define_sorbet_constant!(:DumpState) do + T.type_alias { {can_retry: T::Boolean} } + end + end + end + end +end diff --git a/lib/vitable_connect/internal/type/enum.rb b/lib/vitable_connect/internal/type/enum.rb new file mode 100644 index 0000000..3f1e23f --- /dev/null +++ b/lib/vitable_connect/internal/type/enum.rb @@ -0,0 +1,156 @@ +# frozen_string_literal: true + +module VitableConnect + module Internal + module Type + # @api private + # + # A value from among a specified list of options. OpenAPI enum values map to Ruby + # values in the SDK as follows: + # + # 1. boolean => true | false + # 2. integer => Integer + # 3. float => Float + # 4. string => Symbol + # + # We can therefore convert string values to Symbols, but can't convert other + # values safely. + # + # @example + # # `employee_class` is a `VitableConnect::EmployeeClass` + # case employee_class + # when VitableConnect::EmployeeClass::FULL_TIME + # # ... + # when VitableConnect::EmployeeClass::PART_TIME + # # ... + # when VitableConnect::EmployeeClass::TEMPORARY + # # ... + # else + # puts(employee_class) + # end + # + # @example + # case employee_class + # in :"Full Time" + # # ... + # in :"Part Time" + # # ... + # in :Temporary + # # ... + # else + # puts(employee_class) + # end + module Enum + include VitableConnect::Internal::Type::Converter + include VitableConnect::Internal::Util::SorbetRuntimeSupport + + # All of the valid Symbol values for this enum. + # + # @return [Array] + def values = constants.map { const_get(_1) } + + # @api public + # + # @param other [Object] + # + # @return [Boolean] + def ===(other) = values.include?(other) + + # @api public + # + # @param other [Object] + # + # @return [Boolean] + def ==(other) + # rubocop:disable Style/CaseEquality + VitableConnect::Internal::Type::Enum === other && other.values.to_set == values.to_set + # rubocop:enable Style/CaseEquality + end + + # @api public + # + # @return [Integer] + def hash = values.to_set.hash + + # @api private + # + # Unlike with primitives, `Enum` additionally validates that the value is a member + # of the enum. + # + # @param value [String, Symbol, Object] + # + # @param state [Hash{Symbol=>Object}] . + # + # @option state [Boolean] :translate_names + # + # @option state [Boolean] :strictness + # + # @option state [Hash{Symbol=>Object}] :exactness + # + # @option state [Class] :error + # + # @option state [Integer] :branched + # + # @return [Symbol, Object] + def coerce(value, state:) + exactness = state.fetch(:exactness) + val = value.is_a?(String) ? value.to_sym : value + + if values.include?(val) + exactness[:yes] += 1 + val + elsif values.first&.class == val.class + exactness[:maybe] += 1 + value + else + exactness[:no] += 1 + state[:error] = TypeError.new("#{value.class} can't be coerced into #{self}") + value + end + end + + # @!method dump(value, state:) + # @api private + # + # @param value [Symbol, Object] + # + # @param state [Hash{Symbol=>Object}] . + # + # @option state [Boolean] :can_retry + # + # @return [Symbol, Object] + + # @api private + # + # @return [Object] + def to_sorbet_type + types = values.map { VitableConnect::Internal::Util::SorbetRuntimeSupport.to_sorbet_type(_1) }.uniq + case types + in [] + T.noreturn + in [type] + type + else + T.any(*types) + end + end + + # @api private + # + # @param depth [Integer] + # + # @return [String] + def inspect(depth: 0) + if depth.positive? + return is_a?(Module) ? super() : self.class.name + end + + members = values.map { VitableConnect::Internal::Type::Converter.inspect(_1, depth: depth.succ) } + prefix = is_a?(Module) ? name : self.class.name + + "#{prefix}[#{members.join(' | ')}]" + end + end + end + end +end diff --git a/lib/vitable_connect/internal/type/file_input.rb b/lib/vitable_connect/internal/type/file_input.rb new file mode 100644 index 0000000..05dcc66 --- /dev/null +++ b/lib/vitable_connect/internal/type/file_input.rb @@ -0,0 +1,111 @@ +# frozen_string_literal: true + +module VitableConnect + module Internal + module Type + # @api private + # + # @abstract + # + # Either `Pathname` or `StringIO`, or `IO`, or + # `VitableConnect::Internal::Type::FileInput`. + # + # Note: when `IO` is used, all retries are disabled, since many IO` streams are + # not rewindable. + class FileInput + extend VitableConnect::Internal::Type::Converter + + private_class_method :new + + # @api public + # + # @param other [Object] + # + # @return [Boolean] + def self.===(other) + case other + in Pathname | StringIO | IO | String | VitableConnect::FilePart + true + else + false + end + end + + # @api public + # + # @param other [Object] + # + # @return [Boolean] + def self.==(other) = other.is_a?(Class) && other <= VitableConnect::Internal::Type::FileInput + + class << self + # @api private + # + # @param value [StringIO, String, Object] + # + # @param state [Hash{Symbol=>Object}] . + # + # @option state [Boolean] :translate_names + # + # @option state [Boolean] :strictness + # + # @option state [Hash{Symbol=>Object}] :exactness + # + # @option state [Class] :error + # + # @option state [Integer] :branched + # + # @return [StringIO, Object] + def coerce(value, state:) + exactness = state.fetch(:exactness) + case value + in String + exactness[:yes] += 1 + StringIO.new(value) + in StringIO + exactness[:yes] += 1 + value + else + state[:error] = TypeError.new("#{value.class} can't be coerced into #{StringIO}") + exactness[:no] += 1 + value + end + end + + # @api private + # + # @param value [Pathname, StringIO, IO, String, Object] + # + # @param state [Hash{Symbol=>Object}] . + # + # @option state [Boolean] :can_retry + # + # @return [Pathname, StringIO, IO, String, Object] + def dump(value, state:) + case value + in StringIO | String + # https://datatracker.ietf.org/doc/html/rfc7578#section-4.2 + # while not required, a filename is recommended, and in practice many servers do expect this + VitableConnect::FilePart.new(value, filename: "upload") + in IO + state[:can_retry] = false + value.to_path.nil? ? VitableConnect::FilePart.new(value, filename: "upload") : value + in VitableConnect::FilePart if value.content.is_a?(IO) + state[:can_retry] = false + value + else + value + end + end + + # @api private + # + # @return [Object] + def to_sorbet_type + T.any(Pathname, StringIO, IO, String, VitableConnect::FilePart) + end + end + end + end + end +end diff --git a/lib/vitable_connect/internal/type/hash_of.rb b/lib/vitable_connect/internal/type/hash_of.rb new file mode 100644 index 0000000..bdde253 --- /dev/null +++ b/lib/vitable_connect/internal/type/hash_of.rb @@ -0,0 +1,188 @@ +# frozen_string_literal: true + +module VitableConnect + module Internal + module Type + # @api private + # + # @abstract + # + # @generic Elem + # + # Hash of items of a given type. + class HashOf + include VitableConnect::Internal::Type::Converter + include VitableConnect::Internal::Util::SorbetRuntimeSupport + + private_class_method :new + + # @overload [](type_info, spec = {}) + # + # @param type_info [Hash{Symbol=>Object}, Proc, VitableConnect::Internal::Type::Converter, Class] + # + # @param spec [Hash{Symbol=>Object}] . + # + # @option spec [NilClass, TrueClass, FalseClass, Integer, Float, Symbol] :const + # + # @option spec [Proc] :enum + # + # @option spec [Proc] :union + # + # @option spec [Boolean] :"nil?" + # + # @return [self] + def self.[](...) = new(...) + + # @api public + # + # @param other [Object] + # + # @return [Boolean] + def ===(other) + type = item_type + case other + in Hash + other.all? do |key, val| + case [key, val] + in [Symbol | String, ^type] + true + else + false + end + end + else + false + end + end + + # @api public + # + # @param other [Object] + # + # @return [Boolean] + def ==(other) + # rubocop:disable Layout/LineLength + other.is_a?(VitableConnect::Internal::Type::HashOf) && other.nilable? == nilable? && other.item_type == item_type + # rubocop:enable Layout/LineLength + end + + # @api public + # + # @return [Integer] + def hash = [self.class, item_type].hash + + # @api private + # + # @param value [Hash{Object=>Object}, Object] + # + # @param state [Hash{Symbol=>Object}] . + # + # @option state [Boolean] :translate_names + # + # @option state [Boolean] :strictness + # + # @option state [Hash{Symbol=>Object}] :exactness + # + # @option state [Class] :error + # + # @option state [Integer] :branched + # + # @return [Hash{Symbol=>Object}, Object] + def coerce(value, state:) + exactness = state.fetch(:exactness) + + unless value.is_a?(Hash) + exactness[:no] += 1 + state[:error] = TypeError.new("#{value.class} can't be coerced into #{Hash}") + return value + end + + target = item_type + exactness[:yes] += 1 + value + .to_h do |key, val| + k = key.is_a?(String) ? key.to_sym : key + v = + case [nilable?, val] + in [true, nil] + exactness[:yes] += 1 + nil + else + VitableConnect::Internal::Type::Converter.coerce(target, val, state: state) + end + + exactness[:no] += 1 unless k.is_a?(Symbol) + [k, v] + end + end + + # @api private + # + # @param value [Hash{Object=>Object}, Object] + # + # @param state [Hash{Symbol=>Object}] . + # + # @option state [Boolean] :can_retry + # + # @return [Hash{Symbol=>Object}, Object] + def dump(value, state:) + target = item_type + if value.is_a?(Hash) + value.transform_values do + VitableConnect::Internal::Type::Converter.dump(target, _1, state: state) + end + else + super + end + end + + # @api private + # + # @return [Object] + def to_sorbet_type + T::Hash[VitableConnect::Internal::Util::SorbetRuntimeSupport.to_sorbet_type(item_type)] + end + + # @api private + # + # @return [generic] + protected def item_type = @item_type_fn.call + + # @api private + # + # @return [Boolean] + protected def nilable? = @nilable + + # @api private + # + # @param type_info [Hash{Symbol=>Object}, Proc, VitableConnect::Internal::Type::Converter, Class] + # + # @param spec [Hash{Symbol=>Object}] . + # + # @option spec [NilClass, TrueClass, FalseClass, Integer, Float, Symbol] :const + # + # @option spec [Proc] :enum + # + # @option spec [Proc] :union + # + # @option spec [Boolean] :"nil?" + def initialize(type_info, spec = {}) + @item_type_fn = VitableConnect::Internal::Type::Converter.type_info(type_info || spec) + @meta = VitableConnect::Internal::Type::Converter.meta_info(type_info, spec) + @nilable = spec.fetch(:nil?, false) + end + + # @api private + # + # @param depth [Integer] + # + # @return [String] + def inspect(depth: 0) + items = VitableConnect::Internal::Type::Converter.inspect(item_type, depth: depth.succ) + + "#{self.class}[#{[items, nilable? ? 'nil' : nil].compact.join(' | ')}]" + end + end + end + end +end diff --git a/lib/vitable_connect/internal/type/request_parameters.rb b/lib/vitable_connect/internal/type/request_parameters.rb new file mode 100644 index 0000000..5b0aacc --- /dev/null +++ b/lib/vitable_connect/internal/type/request_parameters.rb @@ -0,0 +1,42 @@ +# frozen_string_literal: true + +module VitableConnect + module Internal + module Type + # @api private + module RequestParameters + # @!attribute request_options + # Options to specify HTTP behaviour for this request. + # + # @return [VitableConnect::RequestOptions, Hash{Symbol=>Object}] + + # @param mod [Module] + def self.included(mod) + raise ArgumentError.new(mod) unless mod <= VitableConnect::Internal::Type::BaseModel + + mod.optional(:request_options, VitableConnect::RequestOptions) + end + + # @api private + module Converter + # @api private + # + # @param params [Object] + # + # @return [Array(Object, Hash{Symbol=>Object})] + def dump_request(params) + state = {can_retry: true} + case (dumped = dump(params, state: state)) + in Hash + options = VitableConnect::Internal::Util.coerce_hash!(dumped[:request_options]).to_h + request_options = state.fetch(:can_retry) ? options : {**options, max_retries: 0} + [dumped.except(:request_options), request_options] + else + [dumped, nil] + end + end + end + end + end + end +end diff --git a/lib/vitable_connect/internal/type/union.rb b/lib/vitable_connect/internal/type/union.rb new file mode 100644 index 0000000..508f107 --- /dev/null +++ b/lib/vitable_connect/internal/type/union.rb @@ -0,0 +1,245 @@ +# frozen_string_literal: true + +module VitableConnect + module Internal + module Type + # @api private + module Union + include VitableConnect::Internal::Type::Converter + include VitableConnect::Internal::Util::SorbetRuntimeSupport + + # @api private + # + # All of the specified variant info for this union. + # + # @return [ArrayObject})>] + private def known_variants = (@known_variants ||= []) + + # @api private + # + # @return [ArrayObject})>] + protected def derefed_variants + known_variants.map { |key, variant_fn, meta| [key, variant_fn.call, meta] } + end + + # All of the specified variants for this union. + # + # @return [Array] + def variants = derefed_variants.map { _2 } + + # @api private + # + # @param property [Symbol] + private def discriminator(property) + case property + in Symbol + @discriminator = property + end + end + + # @api private + # + # @param key [Symbol, Hash{Symbol=>Object}, Proc, VitableConnect::Internal::Type::Converter, Class] + # + # @param spec [Hash{Symbol=>Object}, Proc, VitableConnect::Internal::Type::Converter, Class] . + # + # @option spec [NilClass, TrueClass, FalseClass, Integer, Float, Symbol] :const + # + # @option spec [Proc] :enum + # + # @option spec [Proc] :union + # + # @option spec [Boolean] :"nil?" + private def variant(key, spec = nil) + meta = VitableConnect::Internal::Type::Converter.meta_info(nil, spec) + variant_info = + case key + in Symbol + [key, VitableConnect::Internal::Type::Converter.type_info(spec), meta] + in Proc | VitableConnect::Internal::Type::Converter | Class | Hash + [nil, VitableConnect::Internal::Type::Converter.type_info(key), meta] + end + + known_variants << variant_info + end + + # @api private + # + # @param value [Object] + # + # @return [VitableConnect::Internal::Type::Converter, Class, nil] + private def resolve_variant(value) + case [@discriminator, value] + in [_, VitableConnect::Internal::Type::BaseModel] + value.class + in [Symbol, Hash] + key = value.fetch(@discriminator) do + value.fetch(@discriminator.to_s, VitableConnect::Internal::OMIT) + end + + return nil if key == VitableConnect::Internal::OMIT + + key = key.to_sym if key.is_a?(String) + _, found = known_variants.find { |k,| k == key } + found&.call + else + nil + end + end + + # rubocop:disable Style/HashEachMethods + # rubocop:disable Style/CaseEquality + + # @api public + # + # @param other [Object] + # + # @return [Boolean] + def ===(other) + known_variants.any? do |_, variant_fn| + variant_fn.call === other + end + end + + # @api public + # + # @param other [Object] + # + # @return [Boolean] + def ==(other) + VitableConnect::Internal::Type::Union === other && other.derefed_variants == derefed_variants + end + + # @api public + # + # @return [Integer] + def hash = variants.hash + + # @api private + # + # Tries to efficiently coerce the given value to one of the known variants. + # + # If the value cannot match any of the known variants, the coercion is considered + # non-viable and returns the original value. + # + # @param value [Object] + # + # @param state [Hash{Symbol=>Object}] . + # + # @option state [Boolean] :translate_names + # + # @option state [Boolean] :strictness + # + # @option state [Hash{Symbol=>Object}] :exactness + # + # @option state [Class] :error + # + # @option state [Integer] :branched + # + # @return [Object] + def coerce(value, state:) + if (target = resolve_variant(value)) + return VitableConnect::Internal::Type::Converter.coerce(target, value, state: state) + end + + strictness = state.fetch(:strictness) + exactness = state.fetch(:exactness) + + alternatives = [] + known_variants.each do |_, variant_fn| + target = variant_fn.call + exact = state[:exactness] = {yes: 0, no: 0, maybe: 0} + state[:branched] += 1 + + coerced = VitableConnect::Internal::Type::Converter.coerce(target, value, state: state) + yes, no, maybe = exact.values + if (no + maybe).zero? || (!strictness && yes.positive?) + exact.each { exactness[_1] += _2 } + state[:exactness] = exactness + return coerced + elsif maybe.positive? + alternatives << [[-yes, -maybe, no], exact, coerced] + end + end + + case alternatives.sort_by!(&:first) + in [] + exactness[:no] += 1 + state[:error] = ArgumentError.new("no matching variant for #{value.inspect}") + value + in [[_, exact, coerced], *] + exact.each { exactness[_1] += _2 } + coerced + end + .tap { state[:exactness] = exactness } + ensure + state[:strictness] = strictness + end + + # @api private + # + # @param value [Object] + # + # @param state [Hash{Symbol=>Object}] . + # + # @option state [Boolean] :can_retry + # + # @return [Object] + def dump(value, state:) + if (target = resolve_variant(value)) + return VitableConnect::Internal::Type::Converter.dump(target, value, state: state) + end + + known_variants.each do + target = _2.call + if target === value + return VitableConnect::Internal::Type::Converter.dump( + target, + value, + state: state + ) + end + end + + super + end + + # @api private + # + # @return [Object] + def to_sorbet_type + types = variants.map do + VitableConnect::Internal::Util::SorbetRuntimeSupport.to_sorbet_type(_1) + end.uniq + case types + in [] + T.noreturn + in [type] + type + else + T.any(*types) + end + end + + # rubocop:enable Style/CaseEquality + # rubocop:enable Style/HashEachMethods + + # @api private + # + # @param depth [Integer] + # + # @return [String] + def inspect(depth: 0) + if depth.positive? + return is_a?(Module) ? super() : self.class.name + end + + members = variants.map { VitableConnect::Internal::Type::Converter.inspect(_1, depth: depth.succ) } + prefix = is_a?(Module) ? name : self.class.name + + "#{prefix}[#{members.join(' | ')}]" + end + end + end + end +end diff --git a/lib/vitable_connect/internal/type/unknown.rb b/lib/vitable_connect/internal/type/unknown.rb new file mode 100644 index 0000000..2d4aecc --- /dev/null +++ b/lib/vitable_connect/internal/type/unknown.rb @@ -0,0 +1,81 @@ +# frozen_string_literal: true + +module VitableConnect + module Internal + module Type + # @api private + # + # @abstract + # + # When we don't know what to expect for the value. + class Unknown + extend VitableConnect::Internal::Type::Converter + extend VitableConnect::Internal::Util::SorbetRuntimeSupport + + # rubocop:disable Lint/UnusedMethodArgument + + private_class_method :new + + # @api public + # + # @param other [Object] + # + # @return [Boolean] + def self.===(other) = true + + # @api public + # + # @param other [Object] + # + # @return [Boolean] + def self.==(other) = other.is_a?(Class) && other <= VitableConnect::Internal::Type::Unknown + + class << self + # @api private + # + # No coercion needed for Unknown type. + # + # @param value [Object] + # + # @param state [Hash{Symbol=>Object}] . + # + # @option state [Boolean] :translate_names + # + # @option state [Boolean] :strictness + # + # @option state [Hash{Symbol=>Object}] :exactness + # + # @option state [Class] :error + # + # @option state [Integer] :branched + # + # @return [Object] + def coerce(value, state:) + state.fetch(:exactness)[:yes] += 1 + value + end + + # @!method dump(value, state:) + # @api private + # + # @param value [Object] + # + # @param state [Hash{Symbol=>Object}] . + # + # @option state [Boolean] :can_retry + # + # @return [Object] + + # @api private + # + # @return [Object] + def to_sorbet_type + T.anything + end + end + + # rubocop:enable Lint/UnusedMethodArgument + end + end + end +end diff --git a/lib/vitable_connect/internal/util.rb b/lib/vitable_connect/internal/util.rb new file mode 100644 index 0000000..0e10b7b --- /dev/null +++ b/lib/vitable_connect/internal/util.rb @@ -0,0 +1,966 @@ +# frozen_string_literal: true + +module VitableConnect + module Internal + # @api private + module Util + # @api private + # + # @return [Float] + def self.monotonic_secs = Process.clock_gettime(Process::CLOCK_MONOTONIC) + + # @api private + # + # @param ns [Module, Class] + # + # @return [Enumerable] + def self.walk_namespaces(ns) + ns.constants(false).lazy.flat_map do + case (c = ns.const_get(_1, false)) + in Module | Class + walk_namespaces(c) + else + [] + end + end + .chain([ns]) + end + + class << self + # @api private + # + # @return [String] + def arch + case (arch = RbConfig::CONFIG["arch"])&.downcase + in nil + "unknown" + in /aarch64|arm64/ + "arm64" + in /x86_64/ + "x64" + in /arm/ + "arm" + else + "other:#{arch}" + end + end + + # @api private + # + # @return [String] + def os + case (host = RbConfig::CONFIG["host_os"])&.downcase + in nil + "Unknown" + in /linux/ + "Linux" + in /darwin/ + "MacOS" + in /freebsd/ + "FreeBSD" + in /openbsd/ + "OpenBSD" + in /mswin|mingw|cygwin|ucrt/ + "Windows" + else + "Other:#{host}" + end + end + end + + class << self + # @api private + # + # @param input [Object] + # + # @return [Boolean] + def primitive?(input) + case input + in true | false | Numeric | Symbol | String + true + else + false + end + end + + # @api private + # + # @param input [String, Boolean] + # + # @return [Boolean, Object] + def coerce_boolean(input) + case input.is_a?(String) ? input.downcase : input + in "true" + true + in "false" + false + else + input + end + end + + # @api private + # + # @param input [String, Boolean] + # + # @raise [ArgumentError] + # @return [Boolean, nil] + def coerce_boolean!(input) + case coerce_boolean(input) + in true | false | nil => coerced + coerced + else + raise ArgumentError.new("Unable to coerce #{input.inspect} into boolean value") + end + end + + # @api private + # + # @param input [String, Integer] + # + # @return [Integer, Object] + def coerce_integer(input) + Integer(input, exception: false) || input + end + + # @api private + # + # @param input [String, Integer, Float] + # + # @return [Float, Object] + def coerce_float(input) + Float(input, exception: false) || input + end + + # @api private + # + # @param input [Object] + # + # @return [Hash{Object=>Object}, Object] + def coerce_hash(input) + case input + in NilClass | Array | Set | Enumerator | StringIO | IO + input + else + input.respond_to?(:to_h) ? input.to_h : input + end + end + + # @api private + # + # @param input [Object] + # + # @raise [ArgumentError] + # @return [Hash{Object=>Object}, nil] + def coerce_hash!(input) + case coerce_hash(input) + in Hash | nil => coerced + coerced + else + message = "Expected a #{Hash} or #{VitableConnect::Internal::Type::BaseModel}, got #{input.inspect}" + raise ArgumentError.new(message) + end + end + end + + class << self + # @api private + # + # @param lhs [Object] + # @param rhs [Object] + # @param concat [Boolean] + # + # @return [Object] + private def deep_merge_lr(lhs, rhs, concat: false) + case [lhs, rhs, concat] + in [Hash, Hash, _] + lhs.merge(rhs) { deep_merge_lr(_2, _3, concat: concat) } + in [Array, Array, true] + lhs.concat(rhs) + else + rhs + end + end + + # @api private + # + # Recursively merge one hash with another. If the values at a given key are not + # both hashes, just take the new value. + # + # @param values [Array] + # + # @param sentinel [Object, nil] the value to return if no values are provided. + # + # @param concat [Boolean] whether to merge sequences by concatenation. + # + # @return [Object] + def deep_merge(*values, sentinel: nil, concat: false) + case values + in [value, *values] + values.reduce(value) do |acc, val| + deep_merge_lr(acc, val, concat: concat) + end + else + sentinel + end + end + + # @api private + # + # @param data [Hash{Symbol=>Object}, Array, Object] + # @param pick [Symbol, Integer, Array, Proc, nil] + # @param blk [Proc, nil] + # + # @return [Object, nil] + def dig(data, pick, &blk) + case [data, pick] + in [_, nil] + data + in [Hash, Symbol] | [Array, Integer] + data.fetch(pick) { blk&.call } + in [Hash | Array, Array] + pick.reduce(data) do |acc, key| + case acc + in Hash if acc.key?(key) + acc.fetch(key) + in Array if key.is_a?(Integer) && key < acc.length + acc[key] + else + return blk&.call + end + end + in [_, Proc] + pick.call(data) + else + blk&.call + end + end + end + + # @type [Regexp] + # + # https://www.rfc-editor.org/rfc/rfc3986.html#section-3.3 + RFC_3986_NOT_PCHARS = /[^A-Za-z0-9\-._~!$&'()*+,;=:@]+/ + + class << self + # @api private + # + # @param uri [URI::Generic] + # + # @return [String] + def uri_origin(uri) + "#{uri.scheme}://#{uri.host}#{":#{uri.port}" unless uri.port == uri.default_port}" + end + + # @api private + # + # @param path [String, Integer] + # + # @return [String] + def encode_path(path) + path.to_s.gsub(VitableConnect::Internal::Util::RFC_3986_NOT_PCHARS) { ERB::Util.url_encode(_1) } + end + + # @api private + # + # @param path [String, Array] + # + # @return [String] + def interpolate_path(path) + case path + in String + path + in [] + "" + in [String => p, *interpolations] + encoded = interpolations.map { encode_path(_1) } + format(p, *encoded) + end + end + end + + class << self + # @api private + # + # @param query [String, nil] + # + # @return [Hash{String=>Array}] + def decode_query(query) + CGI.parse(query.to_s) + end + + # @api private + # + # @param query [Hash{String=>Array, String, nil}, nil] + # + # @return [String, nil] + def encode_query(query) + query.to_h.empty? ? nil : URI.encode_www_form(query) + end + end + + class << self + # @api private + # + # @param url [URI::Generic, String] + # + # @return [Hash{Symbol=>String, Integer, nil}] + def parse_uri(url) + parsed = URI::Generic.component.zip(URI.split(url)).to_h + {**parsed, query: decode_query(parsed.fetch(:query))} + end + + # @api private + # + # @param parsed [Hash{Symbol=>String, Integer, nil}] . + # + # @option parsed [String, nil] :scheme + # + # @option parsed [String, nil] :host + # + # @option parsed [Integer, nil] :port + # + # @option parsed [String, nil] :path + # + # @option parsed [Hash{String=>Array}] :query + # + # @return [URI::Generic] + def unparse_uri(parsed) + URI::Generic.build(**parsed, query: encode_query(parsed.fetch(:query))) + end + + # @api private + # + # @param lhs [Hash{Symbol=>String, Integer, nil}] . + # + # @option lhs [String, nil] :scheme + # + # @option lhs [String, nil] :host + # + # @option lhs [Integer, nil] :port + # + # @option lhs [String, nil] :path + # + # @option lhs [Hash{String=>Array}] :query + # + # @param rhs [Hash{Symbol=>String, Integer, nil}] . + # + # @option rhs [String, nil] :scheme + # + # @option rhs [String, nil] :host + # + # @option rhs [Integer, nil] :port + # + # @option rhs [String, nil] :path + # + # @option rhs [Hash{String=>Array}] :query + # + # @return [URI::Generic] + def join_parsed_uri(lhs, rhs) + base_path, base_query = lhs.fetch_values(:path, :query) + slashed = base_path.end_with?("/") ? base_path : "#{base_path}/" + + merged = {**parse_uri(rhs.fetch(:path)), **rhs.except(:path, :query)} + parsed_path, parsed_query = merged.fetch_values(:path, :query) + override = URI::Generic.build(**merged.slice(:scheme, :host, :port), path: parsed_path) + + joined = URI.join(URI::Generic.build(lhs.except(:path, :query)), slashed, override) + query = deep_merge( + joined.path == base_path ? base_query : {}, + parsed_query, + rhs[:query].to_h, + concat: true + ) + + joined.query = encode_query(query) + joined + end + end + + class << self + # @api private + # + # @param headers [Hash{String=>String, Integer, Array, nil}] + # + # @return [Hash{String=>String}] + def normalized_headers(*headers) + {}.merge(*headers.compact).to_h do |key, val| + value = + case val + in Array + val.filter_map { _1&.to_s&.strip }.join(", ") + else + val&.to_s&.strip + end + [key.downcase, value] + end + end + end + + # @api private + # + # An adapter that satisfies the IO interface required by `::IO.copy_stream` + class ReadIOAdapter + # @api private + # + # @return [Boolean, nil] + def close? = @closing + + # @api private + def close + case @stream + in Enumerator + VitableConnect::Internal::Util.close_fused!(@stream) + in IO if close? + @stream.close + else + end + end + + # @api private + # + # @param max_len [Integer, nil] + # + # @return [String] + private def read_enum(max_len) + case max_len + in nil + @stream.to_a.join + in Integer + @buf << @stream.next while @buf.length < max_len + @buf.slice!(..max_len) + end + rescue StopIteration + @stream = nil + @buf.slice!(0..) + end + + # @api private + # + # @param max_len [Integer, nil] + # @param out_string [String, nil] + # + # @return [String, nil] + def read(max_len = nil, out_string = nil) + case @stream + in nil + nil + in IO | StringIO + @stream.read(max_len, out_string) + in Enumerator + read = read_enum(max_len) + case out_string + in String + out_string.replace(read) + in nil + read + end + end + .tap(&@blk) + end + + # @api private + # + # @param src [String, Pathname, StringIO, Enumerable] + # @param blk [Proc] + # + # @yieldparam [String] + def initialize(src, &blk) + @stream = + case src + in String + StringIO.new(src) + in Pathname + @closing = true + src.open(binmode: true) + else + src + end + @buf = String.new + @blk = blk + end + end + + class << self + # @param blk [Proc] + # + # @yieldparam [Enumerator::Yielder] + # @return [Enumerable] + def writable_enum(&blk) + Enumerator.new do |y| + y.define_singleton_method(:write) do + self << _1.dup + _1.bytesize + end + + blk.call(y) + end + end + end + + # @type [Regexp] + JSON_CONTENT = %r{^application/(?:[a-zA-Z0-9.-]+\+)?json(?!l)} + # @type [Regexp] + JSONL_CONTENT = %r{^application/(:?x-(?:n|l)djson)|(:?(?:x-)?jsonl)} + + class << self + # @api private + # + # @param query [Hash{Symbol=>Object}] + # + # @return [Hash{Symbol=>Object}] + def encode_query_params(query) + out = {} + query.each { write_query_param_element!(out, _1, _2) } + out + end + + # @api private + # + # @param collection [Hash{Symbol=>Object}] + # @param key [String] + # @param element [Object] + # + # @return [nil] + private def write_query_param_element!(collection, key, element) + case element + in Hash + element.each do |name, value| + write_query_param_element!(collection, "#{key}[#{name}]", value) + end + in Array + collection[key] = element.map(&:to_s).join(",") + else + collection[key] = element.to_s + end + end + + # @api private + # + # @param y [Enumerator::Yielder] + # @param val [Object] + # @param closing [Array] + # @param content_type [String, nil] + private def write_multipart_content(y, val:, closing:, content_type: nil) + content_line = "Content-Type: %s\r\n\r\n" + + case val + in VitableConnect::FilePart + return write_multipart_content( + y, + val: val.content, + closing: closing, + content_type: val.content_type + ) + in Pathname + y << format(content_line, content_type || "application/octet-stream") + io = val.open(binmode: true) + closing << io.method(:close) + IO.copy_stream(io, y) + in IO + y << format(content_line, content_type || "application/octet-stream") + IO.copy_stream(val, y) + in StringIO + y << format(content_line, content_type || "application/octet-stream") + y << val.string + in -> { primitive?(_1) } + y << format(content_line, content_type || "text/plain") + y << val.to_s + else + y << format(content_line, content_type || "application/json") + y << JSON.generate(val) + end + y << "\r\n" + end + + # @api private + # + # @param y [Enumerator::Yielder] + # @param boundary [String] + # @param key [Symbol, String] + # @param val [Object] + # @param closing [Array] + private def write_multipart_chunk(y, boundary:, key:, val:, closing:) + y << "--#{boundary}\r\n" + y << "Content-Disposition: form-data" + + unless key.nil? + y << "; name=\"#{key}\"" + end + + case val + in VitableConnect::FilePart unless val.filename.nil? + filename = encode_path(val.filename) + y << "; filename=\"#{filename}\"" + in Pathname | IO + filename = encode_path(::File.basename(val.to_path)) + y << "; filename=\"#{filename}\"" + else + end + y << "\r\n" + + write_multipart_content(y, val: val, closing: closing) + end + + # @api private + # + # https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.1.md#special-considerations-for-multipart-content + # + # @param body [Object] + # + # @return [Array(String, Enumerable)] + private def encode_multipart_streaming(body) + # rubocop:disable Style/CaseEquality + # RFC 1521 Section 7.2.1 says we should have 70 char maximum for boundary length + boundary = SecureRandom.urlsafe_base64(46) + + closing = [] + strio = writable_enum do |y| + case body + in Hash + body.each do |key, val| + case val + in Array if val.all? { primitive?(_1) || VitableConnect::Internal::Type::FileInput === _1 } + val.each do |v| + write_multipart_chunk(y, boundary: boundary, key: key, val: v, closing: closing) + end + else + write_multipart_chunk(y, boundary: boundary, key: key, val: val, closing: closing) + end + end + else + write_multipart_chunk(y, boundary: boundary, key: nil, val: body, closing: closing) + end + y << "--#{boundary}--\r\n" + end + + fused_io = fused_enum(strio) { closing.each(&:call) } + [boundary, fused_io] + # rubocop:enable Style/CaseEquality + end + + # @api private + # + # @param headers [Hash{String=>String}] + # @param body [Object] + # + # @return [Object] + def encode_content(headers, body) + # rubocop:disable Style/CaseEquality + # rubocop:disable Layout/LineLength + content_type = headers["content-type"] + case [content_type, body] + in [VitableConnect::Internal::Util::JSON_CONTENT, Hash | Array | -> { primitive?(_1) }] + [headers, JSON.generate(body)] + in [VitableConnect::Internal::Util::JSONL_CONTENT, Enumerable] unless VitableConnect::Internal::Type::FileInput === body + [headers, body.lazy.map { JSON.generate(_1) }] + in [%r{^multipart/form-data}, Hash | VitableConnect::Internal::Type::FileInput] + boundary, strio = encode_multipart_streaming(body) + headers = {**headers, "content-type" => "#{content_type}; boundary=#{boundary}"} + [headers, strio] + in [_, Symbol | Numeric] + [headers, body.to_s] + in [_, StringIO] + [headers, body.string] + in [_, VitableConnect::FilePart] + [headers, body.content] + else + [headers, body] + end + # rubocop:enable Layout/LineLength + # rubocop:enable Style/CaseEquality + end + + # @api private + # + # https://www.iana.org/assignments/character-sets/character-sets.xhtml + # + # @param content_type [String] + # @param text [String] + def force_charset!(content_type, text:) + charset = /charset=([^;\s]+)/.match(content_type)&.captures&.first + + return unless charset + + begin + encoding = Encoding.find(charset) + text.force_encoding(encoding) + rescue ArgumentError + nil + end + end + + # @api private + # + # Assumes each chunk in stream has `Encoding::BINARY`. + # + # @param headers [Hash{String=>String}] + # @param stream [Enumerable] + # @param suppress_error [Boolean] + # + # @raise [JSON::ParserError] + # @return [Object] + def decode_content(headers, stream:, suppress_error: false) + case (content_type = headers["content-type"]) + in VitableConnect::Internal::Util::JSON_CONTENT + return nil if (json = stream.to_a.join).empty? + + begin + JSON.parse(json, symbolize_names: true) + rescue JSON::ParserError => e + raise e unless suppress_error + json + end + in VitableConnect::Internal::Util::JSONL_CONTENT + lines = decode_lines(stream) + chain_fused(lines) do |y| + lines.each do + next if _1.empty? + + y << JSON.parse(_1, symbolize_names: true) + end + end + in %r{^text/event-stream} + lines = decode_lines(stream) + decode_sse(lines) + else + text = stream.to_a.join + force_charset!(content_type, text: text) + StringIO.new(text) + end + end + end + + class << self + # @api private + # + # https://doc.rust-lang.org/std/iter/trait.FusedIterator.html + # + # @param enum [Enumerable] + # @param external [Boolean] + # @param close [Proc] + # + # @return [Enumerable] + def fused_enum(enum, external: false, &close) + fused = false + iter = Enumerator.new do |y| + next if fused + + fused = true + if external + loop { y << enum.next } + else + enum.each(&y) + end + ensure + close&.call + close = nil + end + + iter.define_singleton_method(:rewind) do + fused = true + self + end + iter + end + + # @api private + # + # @param enum [Enumerable, nil] + def close_fused!(enum) + return unless enum.is_a?(Enumerator) + + # rubocop:disable Lint/UnreachableLoop + enum.rewind.each { break } + # rubocop:enable Lint/UnreachableLoop + end + + # @api private + # + # @param enum [Enumerable, nil] + # @param blk [Proc] + # + # @yieldparam [Enumerator::Yielder] + # @return [Enumerable] + def chain_fused(enum, &blk) + iter = Enumerator.new { blk.call(_1) } + fused_enum(iter) { close_fused!(enum) } + end + end + + class << self + # @api private + # + # Assumes Strings have been forced into having `Encoding::BINARY`. + # + # This decoder is responsible for reassembling lines split across multiple + # fragments. + # + # @param enum [Enumerable] + # + # @return [Enumerable] + def decode_lines(enum) + re = /(\r\n|\r|\n)/ + buffer = String.new + cr_seen = nil + + chain_fused(enum) do |y| + enum.each do |row| + offset = buffer.bytesize + buffer << row + while (match = re.match(buffer, cr_seen&.to_i || offset)) + case [match.captures.first, cr_seen] + in ["\r", nil] + cr_seen = match.end(1) + next + in ["\r" | "\r\n", Integer] + y << buffer.slice!(..(cr_seen.pred)) + else + y << buffer.slice!(..(match.end(1).pred)) + end + offset = 0 + cr_seen = nil + end + end + + y << buffer.slice!(..(cr_seen.pred)) unless cr_seen.nil? + y << buffer unless buffer.empty? + end + end + + # @api private + # + # https://html.spec.whatwg.org/multipage/server-sent-events.html#parsing-an-event-stream + # + # Assumes that `lines` has been decoded with `#decode_lines`. + # + # @param lines [Enumerable] + # + # @return [EnumerableObject}>] + def decode_sse(lines) + # rubocop:disable Metrics/BlockLength + chain_fused(lines) do |y| + blank = {event: nil, data: nil, id: nil, retry: nil} + current = {} + + lines.each do |line| + case line.sub(/\R$/, "") + in "" + next if current.empty? + y << {**blank, **current} + current = {} + in /^:/ + next + in /^([^:]+):\s?(.*)$/ + field, value = Regexp.last_match.captures + case field + in "event" + current.merge!(event: value) + in "data" + (current[:data] ||= String.new) << (value << "\n") + in "id" unless value.include?("\0") + current.merge!(id: value) + in "retry" if /^\d+$/ =~ value + current.merge!(retry: Integer(value)) + else + end + else + end + end + # rubocop:enable Metrics/BlockLength + + y << {**blank, **current} unless current.empty? + end + end + end + + # @api private + module SorbetRuntimeSupport + class MissingSorbetRuntimeError < ::RuntimeError + end + + # @api private + # + # @return [Hash{Symbol=>Object}] + private def sorbet_runtime_constants = @sorbet_runtime_constants ||= {} + + # @api private + # + # @param name [Symbol] + def const_missing(name) + super unless sorbet_runtime_constants.key?(name) + + unless Object.const_defined?(:T) + message = "Trying to access a Sorbet constant #{name.inspect} without `sorbet-runtime`." + raise MissingSorbetRuntimeError.new(message) + end + + sorbet_runtime_constants.fetch(name).call + end + + # @api private + # + # @param name [Symbol] + # + # @return [Boolean] + def sorbet_constant_defined?(name) = sorbet_runtime_constants.key?(name) + + # @api private + # + # @param name [Symbol] + # @param blk [Proc] + def define_sorbet_constant!(name, &blk) = sorbet_runtime_constants.store(name, blk) + + # @api private + # + # @return [Object] + def to_sorbet_type = raise NotImplementedError + + class << self + # @api private + # + # @param type [VitableConnect::Internal::Util::SorbetRuntimeSupport, Object] + # + # @return [Object] + def to_sorbet_type(type) + case type + in VitableConnect::Internal::Util::SorbetRuntimeSupport + type.to_sorbet_type + in Class | Module + type + in true | false + T::Boolean + else + type.class + end + end + end + end + + extend VitableConnect::Internal::Util::SorbetRuntimeSupport + + define_sorbet_constant!(:ParsedUri) do + T.type_alias do + { + scheme: T.nilable(String), + host: T.nilable(String), + port: T.nilable(Integer), + path: T.nilable(String), + query: T::Hash[String, T::Array[String]] + } + end + end + + define_sorbet_constant!(:ServerSentEvent) do + T.type_alias do + { + event: T.nilable(String), + data: T.nilable(String), + id: T.nilable(String), + retry: T.nilable(Integer) + } + end + end + end + end +end diff --git a/lib/vitable_connect/models.rb b/lib/vitable_connect/models.rb new file mode 100644 index 0000000..9e2511d --- /dev/null +++ b/lib/vitable_connect/models.rb @@ -0,0 +1,156 @@ +# frozen_string_literal: true + +module VitableConnect + [ + VitableConnect::Internal::Type::BaseModel, + *VitableConnect::Internal::Type::BaseModel.subclasses + ].each do |cls| + cls.define_sorbet_constant!(:OrHash) { T.type_alias { T.any(cls, VitableConnect::Internal::AnyHash) } } + end + + VitableConnect::Internal::Util.walk_namespaces(VitableConnect::Models).each do |mod| + case mod + in VitableConnect::Internal::Type::Enum | VitableConnect::Internal::Type::Union + mod.constants.each do |name| + case mod.const_get(name) + in true | false + mod.define_sorbet_constant!(:TaggedBoolean) { T.type_alias { T::Boolean } } + mod.define_sorbet_constant!(:OrBoolean) { T.type_alias { T::Boolean } } + in Integer + mod.define_sorbet_constant!(:TaggedInteger) { T.type_alias { Integer } } + mod.define_sorbet_constant!(:OrInteger) { T.type_alias { Integer } } + in Float + mod.define_sorbet_constant!(:TaggedFloat) { T.type_alias { Float } } + mod.define_sorbet_constant!(:OrFloat) { T.type_alias { Float } } + in Symbol + mod.define_sorbet_constant!(:TaggedSymbol) { T.type_alias { Symbol } } + mod.define_sorbet_constant!(:OrSymbol) { T.type_alias { T.any(Symbol, String) } } + else + end + end + else + end + end + + VitableConnect::Internal::Util.walk_namespaces(VitableConnect::Models) + .lazy + .grep(VitableConnect::Internal::Type::Union) + .each do |mod| + const = :Variants + next if mod.sorbet_constant_defined?(const) + + mod.define_sorbet_constant!(const) { T.type_alias { mod.to_sorbet_type } } + end + + AuthIssueAccessTokenParams = VitableConnect::Models::AuthIssueAccessTokenParams + + Employee = VitableConnect::Models::Employee + + EmployeeClass = VitableConnect::Models::EmployeeClass + + EmployeeListEnrollmentsParams = VitableConnect::Models::EmployeeListEnrollmentsParams + + EmployeeRetrieveParams = VitableConnect::Models::EmployeeRetrieveParams + + EmployeeUpdateParams = VitableConnect::Models::EmployeeUpdateParams + + Employer = VitableConnect::Models::Employer + + EmployerCreateParams = VitableConnect::Models::EmployerCreateParams + + EmployerEnsurePayrollIntegrationEmailParams = + VitableConnect::Models::EmployerEnsurePayrollIntegrationEmailParams + + EmployerListBenefitPlanYearEnrollmentsParams = + VitableConnect::Models::EmployerListBenefitPlanYearEnrollmentsParams + + EmployerListBenefitPlanYearsParams = VitableConnect::Models::EmployerListBenefitPlanYearsParams + + EmployerListEmployeesParams = VitableConnect::Models::EmployerListEmployeesParams + + EmployerListHRISProvidersParams = VitableConnect::Models::EmployerListHRISProvidersParams + + EmployerListInvoicesParams = VitableConnect::Models::EmployerListInvoicesParams + + EmployerListParams = VitableConnect::Models::EmployerListParams + + EmployerListPayrollDeductionStatementsParams = + VitableConnect::Models::EmployerListPayrollDeductionStatementsParams + + EmployerResponse = VitableConnect::Models::EmployerResponse + + EmployerRetrieveBenefitPlanYearParams = VitableConnect::Models::EmployerRetrieveBenefitPlanYearParams + + EmployerRetrieveHRISParams = VitableConnect::Models::EmployerRetrieveHRISParams + + EmployerRetrieveInvoicePdfParams = VitableConnect::Models::EmployerRetrieveInvoicePdfParams + + EmployerRetrieveParams = VitableConnect::Models::EmployerRetrieveParams + + EmployerRetrievePayrollAccessSetupParams = + VitableConnect::Models::EmployerRetrievePayrollAccessSetupParams + + EmployerSubmitCensusSyncParams = VitableConnect::Models::EmployerSubmitCensusSyncParams + + EmployerSubmitPayrollAccessSetupParams = VitableConnect::Models::EmployerSubmitPayrollAccessSetupParams + + EmployerUpdateParams = VitableConnect::Models::EmployerUpdateParams + + EmployerUpdateSettingsParams = VitableConnect::Models::EmployerUpdateSettingsParams + + Enrollment = VitableConnect::Models::Enrollment + + EnrollmentReissueParams = VitableConnect::Models::EnrollmentReissueParams + + EnrollmentRetrieveParams = VitableConnect::Models::EnrollmentRetrieveParams + + EnrollmentStatus = VitableConnect::Models::EnrollmentStatus + + EnrollmentTerminateParams = VitableConnect::Models::EnrollmentTerminateParams + + Group = VitableConnect::Models::Group + + GroupCreateParams = VitableConnect::Models::GroupCreateParams + + GroupListParams = VitableConnect::Models::GroupListParams + + GroupResponse = VitableConnect::Models::GroupResponse + + GroupRetrieveParams = VitableConnect::Models::GroupRetrieveParams + + Groups = VitableConnect::Models::Groups + + GroupUpdateParams = VitableConnect::Models::GroupUpdateParams + + MemberListDependentsParams = VitableConnect::Models::MemberListDependentsParams + + MemberListEmploymentsParams = VitableConnect::Models::MemberListEmploymentsParams + + MemberListEnrollmentsParams = VitableConnect::Models::MemberListEnrollmentsParams + + MemberListIDCardsParams = VitableConnect::Models::MemberListIDCardsParams + + MemberListParams = VitableConnect::Models::MemberListParams + + MemberListQualifyingLifeEventsParams = VitableConnect::Models::MemberListQualifyingLifeEventsParams + + MemberRetrieveHouseholdParams = VitableConnect::Models::MemberRetrieveHouseholdParams + + MemberRetrieveParams = VitableConnect::Models::MemberRetrieveParams + + OrganizationCreateParams = VitableConnect::Models::OrganizationCreateParams + + OrganizationListParams = VitableConnect::Models::OrganizationListParams + + Pagination = VitableConnect::Models::Pagination + + PlanListParams = VitableConnect::Models::PlanListParams + + WebhookEvent = VitableConnect::Models::WebhookEvent + + WebhookEventListDeliveriesParams = VitableConnect::Models::WebhookEventListDeliveriesParams + + WebhookEventListParams = VitableConnect::Models::WebhookEventListParams + + WebhookEventRetrieveParams = VitableConnect::Models::WebhookEventRetrieveParams +end diff --git a/lib/vitable_connect/models/auth_issue_access_token_params.rb b/lib/vitable_connect/models/auth_issue_access_token_params.rb new file mode 100644 index 0000000..249647b --- /dev/null +++ b/lib/vitable_connect/models/auth_issue_access_token_params.rb @@ -0,0 +1,82 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # @see VitableConnect::Resources::Auth#issue_access_token + class AuthIssueAccessTokenParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + # @!attribute grant_type + # - `client_credentials` - client_credentials + # + # @return [Symbol, VitableConnect::Models::AuthIssueAccessTokenParams::GrantType] + required :grant_type, enum: -> { VitableConnect::AuthIssueAccessTokenParams::GrantType } + + # @!attribute bound_entity + # Optional entity to bind the token to for scoped access + # + # @return [VitableConnect::Models::AuthIssueAccessTokenParams::BoundEntity, nil] + optional :bound_entity, -> { VitableConnect::AuthIssueAccessTokenParams::BoundEntity }, nil?: true + + # @!method initialize(grant_type:, bound_entity: nil, request_options: {}) + # @param grant_type [Symbol, VitableConnect::Models::AuthIssueAccessTokenParams::GrantType] - `client_credentials` - client_credentials + # + # @param bound_entity [VitableConnect::Models::AuthIssueAccessTokenParams::BoundEntity, nil] Optional entity to bind the token to for scoped access + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}] + + # - `client_credentials` - client_credentials + module GrantType + extend VitableConnect::Internal::Type::Enum + + CLIENT_CREDENTIALS = :client_credentials + + # @!method self.values + # @return [Array] + end + + class BoundEntity < VitableConnect::Internal::Type::BaseModel + # @!attribute id + # Prefixed entity ID to bind the token to (empr*\* for employer, empl*\* for + # employee) + # + # @return [String] + required :id, String + + # @!attribute type + # - `employer` - employer + # - `employee` - employee + # + # @return [Symbol, VitableConnect::Models::AuthIssueAccessTokenParams::BoundEntity::Type] + required :type, enum: -> { VitableConnect::AuthIssueAccessTokenParams::BoundEntity::Type } + + # @!method initialize(id:, type:) + # Some parameter documentations has been truncated, see + # {VitableConnect::Models::AuthIssueAccessTokenParams::BoundEntity} for more + # details. + # + # Optional entity to bind the token to for scoped access + # + # @param id [String] Prefixed entity ID to bind the token to (empr*\* for employer, empl*\* for + # employe + # + # @param type [Symbol, VitableConnect::Models::AuthIssueAccessTokenParams::BoundEntity::Type] - `employer` - employer + + # - `employer` - employer + # - `employee` - employee + # + # @see VitableConnect::Models::AuthIssueAccessTokenParams::BoundEntity#type + module Type + extend VitableConnect::Internal::Type::Enum + + EMPLOYER = :employer + EMPLOYEE = :employee + + # @!method self.values + # @return [Array] + end + end + end + end +end diff --git a/lib/vitable_connect/models/auth_issue_access_token_response.rb b/lib/vitable_connect/models/auth_issue_access_token_response.rb new file mode 100644 index 0000000..b164032 --- /dev/null +++ b/lib/vitable_connect/models/auth_issue_access_token_response.rb @@ -0,0 +1,84 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # @see VitableConnect::Resources::Auth#issue_access_token + class AuthIssueAccessTokenResponse < VitableConnect::Internal::Type::BaseModel + # @!attribute access_token + # The issued access token (vit*at*\*) + # + # @return [String] + required :access_token, String + + # @!attribute expires_in + # Token lifetime in seconds + # + # @return [Integer] + required :expires_in, Integer + + # @!attribute token_type + # Token type, always 'Bearer' + # + # @return [String] + required :token_type, String + + # @!attribute bound_entity + # Entity the token is bound to, if any + # + # @return [VitableConnect::Models::AuthIssueAccessTokenResponse::BoundEntity, nil] + optional :bound_entity, + -> { VitableConnect::Models::AuthIssueAccessTokenResponse::BoundEntity }, + nil?: true + + # @!method initialize(access_token:, expires_in:, token_type:, bound_entity: nil) + # @param access_token [String] The issued access token (vit*at*\*) + # + # @param expires_in [Integer] Token lifetime in seconds + # + # @param token_type [String] Token type, always 'Bearer' + # + # @param bound_entity [VitableConnect::Models::AuthIssueAccessTokenResponse::BoundEntity, nil] Entity the token is bound to, if any + + # @see VitableConnect::Models::AuthIssueAccessTokenResponse#bound_entity + class BoundEntity < VitableConnect::Internal::Type::BaseModel + # @!attribute id + # Prefixed entity ID the token is bound to (empr*\* or empl*\*) + # + # @return [String] + required :id, String + + # @!attribute type + # - `employer` - employer + # - `employee` - employee + # + # @return [Symbol, VitableConnect::Models::AuthIssueAccessTokenResponse::BoundEntity::Type] + required :type, enum: -> { VitableConnect::Models::AuthIssueAccessTokenResponse::BoundEntity::Type } + + # @!method initialize(id:, type:) + # Some parameter documentations has been truncated, see + # {VitableConnect::Models::AuthIssueAccessTokenResponse::BoundEntity} for more + # details. + # + # Entity the token is bound to, if any + # + # @param id [String] Prefixed entity ID the token is bound to (empr*\* or empl*\*) + # + # @param type [Symbol, VitableConnect::Models::AuthIssueAccessTokenResponse::BoundEntity::Type] - `employer` - employer + + # - `employer` - employer + # - `employee` - employee + # + # @see VitableConnect::Models::AuthIssueAccessTokenResponse::BoundEntity#type + module Type + extend VitableConnect::Internal::Type::Enum + + EMPLOYER = :employer + EMPLOYEE = :employee + + # @!method self.values + # @return [Array] + end + end + end + end +end diff --git a/lib/vitable_connect/models/employee.rb b/lib/vitable_connect/models/employee.rb new file mode 100644 index 0000000..b8c065c --- /dev/null +++ b/lib/vitable_connect/models/employee.rb @@ -0,0 +1,378 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + class Employee < VitableConnect::Internal::Type::BaseModel + # @!attribute created_at + # Timestamp when the employee was created + # + # @return [Time] + required :created_at, Time + + # @!attribute date_of_birth + # Date of birth (YYYY-MM-DD) + # + # @return [Date] + required :date_of_birth, Date + + # @!attribute deductions + # Payroll deductions from the most recent statement period. Replaced when a new + # statement is generated. + # + # @return [Array] + required :deductions, -> { VitableConnect::Internal::Type::ArrayOf[VitableConnect::Employee::Deduction] } + + # @!attribute email + # Email address + # + # @return [String] + required :email, String + + # @!attribute employee_class + # - `Full Time` - Full Time + # - `Part Time` - Part Time + # - `Temporary` - Temporary + # - `Intern` - Intern + # - `Seasonal` - Seasonal + # - `Individual Contractor` - Individual Contractor + # + # @return [Symbol, VitableConnect::Models::EmployeeClass] + required :employee_class, enum: -> { VitableConnect::EmployeeClass } + + # @!attribute first_name + # Employee's legal first name + # + # @return [String] + required :first_name, String + + # @!attribute last_name + # Employee's legal last name + # + # @return [String] + required :last_name, String + + # @!attribute updated_at + # Timestamp when the employee was last updated + # + # @return [Time] + required :updated_at, Time + + # @!attribute address + # Employee's residential address + # + # @return [VitableConnect::Models::Employee::Address, nil] + optional :address, -> { VitableConnect::Employee::Address }, nil?: true + + # @!attribute employer_name + # Name of the employer this employment is with + # + # @return [String, nil] + optional :employer_name, String, nil?: true + + # @!attribute gender + # Gender identity, if provided + # + # @return [String, nil] + optional :gender, String, nil?: true + + # @!attribute reference_id + # Partner-assigned reference ID for the employee + # + # @return [String, nil] + optional :reference_id, String, nil?: true + + # @!attribute suffix + # Name suffix (e.g., Jr., Sr., III) + # + # @return [String, nil] + optional :suffix, String, nil?: true + + # @!attribute termination_date + # Employee's termination date, if terminated + # + # @return [Date, nil] + optional :termination_date, Date, nil?: true + + response_only do + # @!attribute id + # Unique employee identifier with 'empl\_' prefix + # + # @return [String] + required :id, String + + # @!attribute classification_effective_date + # Date the employee's current classification took effect + # + # @return [Date] + required :classification_effective_date, Date + + # @!attribute compensation_type + # - `Salary` - Salary + # - `Hourly` - Hourly + # + # @return [Symbol, VitableConnect::Models::Employee::CompensationType, nil] + required :compensation_type, enum: -> { VitableConnect::Employee::CompensationType }, nil?: true + + # @!attribute compensation_type_effective_date + # Date the employee's current compensation type took effect + # + # @return [Date] + required :compensation_type_effective_date, Date + + # @!attribute employer_id + # Unique identifier of the employer this employment is with (empr\_\*) + # + # @return [String] + required :employer_id, String + + # @!attribute member_id + # Unique member identifier with 'mbr\_' prefix + # + # @return [String] + required :member_id, String + + # @!attribute phone + # Phone number (10-digit US domestic string) + # + # @return [String, nil] + required :phone, String, nil?: true + + # @!attribute start_date + # Employee's start date with the employer + # + # @return [Date] + required :start_date, Date + + # @!attribute status + # Employee status (active or terminated) + # + # @return [Symbol, VitableConnect::Models::Employee::Status] + required :status, enum: -> { VitableConnect::Employee::Status } + end + + # @!method initialize(id:, classification_effective_date:, compensation_type:, compensation_type_effective_date:, created_at:, date_of_birth:, deductions:, email:, employee_class:, employer_id:, first_name:, last_name:, member_id:, phone:, start_date:, status:, updated_at:, address: nil, employer_name: nil, gender: nil, reference_id: nil, suffix: nil, termination_date: nil) + # Some parameter documentations has been truncated, see + # {VitableConnect::Models::Employee} for more details. + # + # @param id [String] Unique employee identifier with 'empl\_' prefix + # + # @param classification_effective_date [Date] Date the employee's current classification took effect + # + # @param compensation_type [Symbol, VitableConnect::Models::Employee::CompensationType, nil] - `Salary` - Salary + # + # @param compensation_type_effective_date [Date] Date the employee's current compensation type took effect + # + # @param created_at [Time] Timestamp when the employee was created + # + # @param date_of_birth [Date] Date of birth (YYYY-MM-DD) + # + # @param deductions [Array] Payroll deductions from the most recent statement period. Replaced when a new st + # + # @param email [String] Email address + # + # @param employee_class [Symbol, VitableConnect::Models::EmployeeClass] - `Full Time` - Full Time + # + # @param employer_id [String] Unique identifier of the employer this employment is with (empr\_\*) + # + # @param first_name [String] Employee's legal first name + # + # @param last_name [String] Employee's legal last name + # + # @param member_id [String] Unique member identifier with 'mbr\_' prefix + # + # @param phone [String, nil] Phone number (10-digit US domestic string) + # + # @param start_date [Date] Employee's start date with the employer + # + # @param status [Symbol, VitableConnect::Models::Employee::Status] Employee status (active or terminated) + # + # @param updated_at [Time] Timestamp when the employee was last updated + # + # @param address [VitableConnect::Models::Employee::Address, nil] Employee's residential address + # + # @param employer_name [String, nil] Name of the employer this employment is with + # + # @param gender [String, nil] Gender identity, if provided + # + # @param reference_id [String, nil] Partner-assigned reference ID for the employee + # + # @param suffix [String, nil] Name suffix (e.g., Jr., Sr., III) + # + # @param termination_date [Date, nil] Employee's termination date, if terminated + + # - `Salary` - Salary + # - `Hourly` - Hourly + # + # @see VitableConnect::Models::Employee#compensation_type + module CompensationType + extend VitableConnect::Internal::Type::Enum + + SALARY = :Salary + HOURLY = :Hourly + + # @!method self.values + # @return [Array] + end + + class Deduction < VitableConnect::Internal::Type::BaseModel + # @!attribute benefit_name + # Name of the benefit plan + # + # @return [String] + required :benefit_name, String + + # @!attribute deduction_amount_in_cents + # Employee deduction amount in cents + # + # @return [Integer] + required :deduction_amount_in_cents, Integer + + # @!attribute deduction_category + # Deduction category (reserved for future use) + # + # @return [String, nil] + required :deduction_category, String, nil?: true + + # @!attribute frequency + # - `weekly` - Weekly + # - `bi_weekly` - Bi Weekly + # - `semi_monthly` - Semi Monthly + # - `monthly` - Monthly + # + # @return [Symbol, VitableConnect::Models::Employee::Deduction::Frequency] + required :frequency, enum: -> { VitableConnect::Employee::Deduction::Frequency } + + # @!attribute period_end_date + # Period end date (YYYY-MM-DD) + # + # @return [Date] + required :period_end_date, Date + + # @!attribute period_start_date + # Period start date (YYYY-MM-DD) + # + # @return [Date] + required :period_start_date, Date + + # @!attribute tax_classification + # - `Unknown` - Unknown + # - `Pre-tax` - Pre Tax + # - `Post-tax` - Post Tax + # + # @return [Symbol, VitableConnect::Models::Employee::Deduction::TaxClassification] + required :tax_classification, enum: -> { VitableConnect::Employee::Deduction::TaxClassification } + + # @!method initialize(benefit_name:, deduction_amount_in_cents:, deduction_category:, frequency:, period_end_date:, period_start_date:, tax_classification:) + # Some parameter documentations has been truncated, see + # {VitableConnect::Models::Employee::Deduction} for more details. + # + # @param benefit_name [String] Name of the benefit plan + # + # @param deduction_amount_in_cents [Integer] Employee deduction amount in cents + # + # @param deduction_category [String, nil] Deduction category (reserved for future use) + # + # @param frequency [Symbol, VitableConnect::Models::Employee::Deduction::Frequency] - `weekly` - Weekly + # + # @param period_end_date [Date] Period end date (YYYY-MM-DD) + # + # @param period_start_date [Date] Period start date (YYYY-MM-DD) + # + # @param tax_classification [Symbol, VitableConnect::Models::Employee::Deduction::TaxClassification] - `Unknown` - Unknown + + # - `weekly` - Weekly + # - `bi_weekly` - Bi Weekly + # - `semi_monthly` - Semi Monthly + # - `monthly` - Monthly + # + # @see VitableConnect::Models::Employee::Deduction#frequency + module Frequency + extend VitableConnect::Internal::Type::Enum + + WEEKLY = :weekly + BI_WEEKLY = :bi_weekly + SEMI_MONTHLY = :semi_monthly + MONTHLY = :monthly + + # @!method self.values + # @return [Array] + end + + # - `Unknown` - Unknown + # - `Pre-tax` - Pre Tax + # - `Post-tax` - Post Tax + # + # @see VitableConnect::Models::Employee::Deduction#tax_classification + module TaxClassification + extend VitableConnect::Internal::Type::Enum + + UNKNOWN = :Unknown + PRE_TAX = :"Pre-tax" + POST_TAX = :"Post-tax" + + # @!method self.values + # @return [Array] + end + end + + # Employee status (active or terminated) + # + # @see VitableConnect::Models::Employee#status + module Status + extend VitableConnect::Internal::Type::Enum + + ACTIVE = :active + TERMINATED = :terminated + + # @!method self.values + # @return [Array] + end + + # @see VitableConnect::Models::Employee#address + class Address < VitableConnect::Internal::Type::BaseModel + # @!attribute address_line_1 + # Primary street address + # + # @return [String] + required :address_line_1, String + + # @!attribute city + # City name + # + # @return [String] + required :city, String + + # @!attribute state + # Two-letter state code (e.g., CA, NY) + # + # @return [String] + required :state, String + + # @!attribute zipcode + # ZIP code (5 or 9 digit) + # + # @return [String] + required :zipcode, String + + # @!attribute address_line_2 + # Secondary street address (apt, suite, etc.) + # + # @return [String, nil] + optional :address_line_2, String, nil?: true + + # @!method initialize(address_line_1:, city:, state:, zipcode:, address_line_2: nil) + # Employee's residential address + # + # @param address_line_1 [String] Primary street address + # + # @param city [String] City name + # + # @param state [String] Two-letter state code (e.g., CA, NY) + # + # @param zipcode [String] ZIP code (5 or 9 digit) + # + # @param address_line_2 [String, nil] Secondary street address (apt, suite, etc.) + end + end + end +end diff --git a/lib/vitable_connect/models/employee_class.rb b/lib/vitable_connect/models/employee_class.rb new file mode 100644 index 0000000..d4e8604 --- /dev/null +++ b/lib/vitable_connect/models/employee_class.rb @@ -0,0 +1,25 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # - `Full Time` - Full Time + # - `Part Time` - Part Time + # - `Temporary` - Temporary + # - `Intern` - Intern + # - `Seasonal` - Seasonal + # - `Individual Contractor` - Individual Contractor + module EmployeeClass + extend VitableConnect::Internal::Type::Enum + + FULL_TIME = :"Full Time" + PART_TIME = :"Part Time" + TEMPORARY = :Temporary + INTERN = :Intern + SEASONAL = :Seasonal + INDIVIDUAL_CONTRACTOR = :"Individual Contractor" + + # @!method self.values + # @return [Array] + end + end +end diff --git a/lib/vitable_connect/models/employee_list_enrollments_params.rb b/lib/vitable_connect/models/employee_list_enrollments_params.rb new file mode 100644 index 0000000..f21ec96 --- /dev/null +++ b/lib/vitable_connect/models/employee_list_enrollments_params.rb @@ -0,0 +1,38 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # @see VitableConnect::Resources::Employees#list_enrollments + class EmployeeListEnrollmentsParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + # @!attribute employee_id + # Unique employee identifier (empl\_\*) + # + # @return [String] + required :employee_id, String + + # @!attribute limit + # Items per page (default: 20, max: 100) + # + # @return [Integer, nil] + optional :limit, Integer + + # @!attribute page + # Page number (default: 1) + # + # @return [Integer, nil] + optional :page, Integer + + # @!method initialize(employee_id:, limit: nil, page: nil, request_options: {}) + # @param employee_id [String] Unique employee identifier (empl\_\*) + # + # @param limit [Integer] Items per page (default: 20, max: 100) + # + # @param page [Integer] Page number (default: 1) + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}] + end + end +end diff --git a/lib/vitable_connect/models/employee_retrieve_params.rb b/lib/vitable_connect/models/employee_retrieve_params.rb new file mode 100644 index 0000000..1df5407 --- /dev/null +++ b/lib/vitable_connect/models/employee_retrieve_params.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # @see VitableConnect::Resources::Employees#retrieve + class EmployeeRetrieveParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + # @!attribute employee_id + # Unique employee identifier (empl\_\*) + # + # @return [String] + required :employee_id, String + + # @!method initialize(employee_id:, request_options: {}) + # @param employee_id [String] Unique employee identifier (empl\_\*) + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}] + end + end +end diff --git a/lib/vitable_connect/models/employee_retrieve_response.rb b/lib/vitable_connect/models/employee_retrieve_response.rb new file mode 100644 index 0000000..c7ec524 --- /dev/null +++ b/lib/vitable_connect/models/employee_retrieve_response.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # @see VitableConnect::Resources::Employees#retrieve + class EmployeeRetrieveResponse < VitableConnect::Internal::Type::BaseModel + # @!attribute data + # + # @return [VitableConnect::Models::Employee] + required :data, -> { VitableConnect::Employee } + + # @!method initialize(data:) + # Response containing a single employee resource. + # + # @param data [VitableConnect::Models::Employee] + end + end +end diff --git a/lib/vitable_connect/models/employee_update_params.rb b/lib/vitable_connect/models/employee_update_params.rb new file mode 100644 index 0000000..bdebd0b --- /dev/null +++ b/lib/vitable_connect/models/employee_update_params.rb @@ -0,0 +1,185 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # @see VitableConnect::Resources::Employees#update + class EmployeeUpdateParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + # @!attribute employee_id + # Unique employee identifier (empl\_\*) + # + # @return [String] + required :employee_id, String + + # @!attribute effective_date + # Past or present date applied to each tracked employment field included in this + # request + # + # @return [Date] + required :effective_date, Date + + # @!attribute address + # Employee's residential address + # + # @return [VitableConnect::Models::EmployeeUpdateParams::Address, nil] + optional :address, -> { VitableConnect::EmployeeUpdateParams::Address }, nil?: true + + # @!attribute compensation_type + # - `Salary` - Salary + # - `Hourly` - Hourly + # + # @return [Symbol, VitableConnect::Models::EmployeeUpdateParams::CompensationType, nil] + optional :compensation_type, + enum: -> { VitableConnect::EmployeeUpdateParams::CompensationType }, + nil?: true + + # @!attribute email + # Email address + # + # @return [String, nil] + optional :email, String, nil?: true + + # @!attribute employee_class + # - `Full Time` - Full Time + # - `Part Time` - Part Time + # - `Temporary` - Temporary + # - `Intern` - Intern + # - `Seasonal` - Seasonal + # - `Individual Contractor` - Individual Contractor + # + # @return [Symbol, VitableConnect::Models::EmployeeClass, nil] + optional :employee_class, enum: -> { VitableConnect::EmployeeClass }, nil?: true + + # @!attribute gender + # - `Male` - Male + # - `Female` - Female + # - `Transgender` - Transgender + # - `Non-binary` - Non Binary + # - `Prefer not to respond` - Prefer Not To Respond + # + # @return [Symbol, VitableConnect::Models::EmployeeUpdateParams::Gender, nil] + optional :gender, enum: -> { VitableConnect::EmployeeUpdateParams::Gender }, nil?: true + + # @!attribute phone + # Phone number + # + # @return [String, nil] + optional :phone, String, nil?: true + + # @!attribute start_date + # Employment start date + # + # @return [Date, nil] + optional :start_date, Date, nil?: true + + # @!method initialize(employee_id:, effective_date:, address: nil, compensation_type: nil, email: nil, employee_class: nil, gender: nil, phone: nil, start_date: nil, request_options: {}) + # Some parameter documentations has been truncated, see + # {VitableConnect::Models::EmployeeUpdateParams} for more details. + # + # @param employee_id [String] Unique employee identifier (empl\_\*) + # + # @param effective_date [Date] Past or present date applied to each tracked employment field included in this r + # + # @param address [VitableConnect::Models::EmployeeUpdateParams::Address, nil] Employee's residential address + # + # @param compensation_type [Symbol, VitableConnect::Models::EmployeeUpdateParams::CompensationType, nil] - `Salary` - Salary + # + # @param email [String, nil] Email address + # + # @param employee_class [Symbol, VitableConnect::Models::EmployeeClass, nil] - `Full Time` - Full Time + # + # @param gender [Symbol, VitableConnect::Models::EmployeeUpdateParams::Gender, nil] - `Male` - Male + # + # @param phone [String, nil] Phone number + # + # @param start_date [Date, nil] Employment start date + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}] + + class Address < VitableConnect::Internal::Type::BaseModel + # @!attribute city + # City name + # + # @return [String] + required :city, String + + # @!attribute state + # Two-letter state code + # + # @return [String] + required :state, String + + # @!attribute street_1 + # Primary street address + # + # @return [String] + required :street_1, String + + # @!attribute zip_code + # ZIP code + # + # @return [String] + required :zip_code, String + + # @!attribute country + # Country code + # + # @return [String, nil] + optional :country, String + + # @!attribute street_2 + # Secondary street address + # + # @return [String, nil] + optional :street_2, String, nil?: true + + # @!method initialize(city:, state:, street_1:, zip_code:, country: nil, street_2: nil) + # Employee's residential address + # + # @param city [String] City name + # + # @param state [String] Two-letter state code + # + # @param street_1 [String] Primary street address + # + # @param zip_code [String] ZIP code + # + # @param country [String] Country code + # + # @param street_2 [String, nil] Secondary street address + end + + # - `Salary` - Salary + # - `Hourly` - Hourly + module CompensationType + extend VitableConnect::Internal::Type::Enum + + SALARY = :Salary + HOURLY = :Hourly + + # @!method self.values + # @return [Array] + end + + # - `Male` - Male + # - `Female` - Female + # - `Transgender` - Transgender + # - `Non-binary` - Non Binary + # - `Prefer not to respond` - Prefer Not To Respond + module Gender + extend VitableConnect::Internal::Type::Enum + + MALE = :Male + FEMALE = :Female + TRANSGENDER = :Transgender + NON_BINARY = :"Non-binary" + PREFER_NOT_TO_RESPOND = :"Prefer not to respond" + + # @!method self.values + # @return [Array] + end + end + end +end diff --git a/lib/vitable_connect/models/employee_update_response.rb b/lib/vitable_connect/models/employee_update_response.rb new file mode 100644 index 0000000..306d853 --- /dev/null +++ b/lib/vitable_connect/models/employee_update_response.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # @see VitableConnect::Resources::Employees#update + class EmployeeUpdateResponse < VitableConnect::Internal::Type::BaseModel + # @!attribute data + # + # @return [VitableConnect::Models::Employee] + required :data, -> { VitableConnect::Employee } + + # @!method initialize(data:) + # Response containing a single employee resource. + # + # @param data [VitableConnect::Models::Employee] + end + end +end diff --git a/lib/vitable_connect/models/employer.rb b/lib/vitable_connect/models/employer.rb new file mode 100644 index 0000000..d1271c4 --- /dev/null +++ b/lib/vitable_connect/models/employer.rb @@ -0,0 +1,189 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + class Employer < VitableConnect::Internal::Type::BaseModel + # @!attribute active + # Whether the employer is currently active in the system + # + # @return [Boolean] + required :active, VitableConnect::Internal::Type::Boolean + + # @!attribute address + # Nested address within EmployerSerializer. + # + # @return [VitableConnect::Models::Employer::Address] + required :address, -> { VitableConnect::Employer::Address } + + # @!attribute created_at + # Timestamp when the employer was created + # + # @return [Time] + required :created_at, Time + + # @!attribute legal_name + # Legal business name for compliance and tax purposes + # + # @return [String] + required :legal_name, String + + # @!attribute name + # Display name of the employer + # + # @return [String] + required :name, String + + # @!attribute updated_at + # Timestamp when the employer was last updated + # + # @return [Time] + required :updated_at, Time + + # @!attribute email + # Email address for billing and communications + # + # @return [String, nil] + optional :email, String, nil?: true + + # @!attribute phone_number + # Employer phone number (E.164 format recommended) + # + # @return [String, nil] + optional :phone_number, String, nil?: true + + # @!attribute reference_id + # Partner-assigned reference ID for the employer + # + # @return [String, nil] + optional :reference_id, String, nil?: true + + response_only do + # @!attribute id + # Unique employer identifier with 'empr\_' prefix + # + # @return [String] + required :id, String + + # @!attribute contact + # Primary company-admin contact (email + phone; company admins have no person + # name). + # + # @return [VitableConnect::Models::Employer::Contact, nil] + required :contact, -> { VitableConnect::Employer::Contact }, nil?: true + + # @!attribute ein + # Employer Identification Number (format: XX-XXXXXXX) + # + # @return [String, nil] + required :ein, String, nil?: true + + # @!attribute organization_id + # ID of the parent organization (org\_\*) + # + # @return [String, nil] + required :organization_id, String, nil?: true + end + + # @!method initialize(id:, active:, address:, contact:, created_at:, ein:, legal_name:, name:, organization_id:, updated_at:, email: nil, phone_number: nil, reference_id: nil) + # Some parameter documentations has been truncated, see + # {VitableConnect::Models::Employer} for more details. + # + # Serializer for Employer entity in public API responses. + # + # @param id [String] Unique employer identifier with 'empr\_' prefix + # + # @param active [Boolean] Whether the employer is currently active in the system + # + # @param address [VitableConnect::Models::Employer::Address] Nested address within EmployerSerializer. + # + # @param contact [VitableConnect::Models::Employer::Contact, nil] Primary company-admin contact (email + phone; company admins have no person name + # + # @param created_at [Time] Timestamp when the employer was created + # + # @param ein [String, nil] Employer Identification Number (format: XX-XXXXXXX) + # + # @param legal_name [String] Legal business name for compliance and tax purposes + # + # @param name [String] Display name of the employer + # + # @param organization_id [String, nil] ID of the parent organization (org\_\*) + # + # @param updated_at [Time] Timestamp when the employer was last updated + # + # @param email [String, nil] Email address for billing and communications + # + # @param phone_number [String, nil] Employer phone number (E.164 format recommended) + # + # @param reference_id [String, nil] Partner-assigned reference ID for the employer + + # @see VitableConnect::Models::Employer#address + class Address < VitableConnect::Internal::Type::BaseModel + # @!attribute address_line_1 + # Primary street address + # + # @return [String] + required :address_line_1, String + + # @!attribute city + # City name + # + # @return [String] + required :city, String + + # @!attribute state + # Two-letter state code (e.g., CA, NY) + # + # @return [String] + required :state, String + + # @!attribute zipcode + # ZIP code (5 or 9 digit) + # + # @return [String] + required :zipcode, String + + # @!attribute address_line_2 + # Secondary street address (apt, suite, etc.) + # + # @return [String, nil] + optional :address_line_2, String, nil?: true + + # @!method initialize(address_line_1:, city:, state:, zipcode:, address_line_2: nil) + # Nested address within EmployerSerializer. + # + # @param address_line_1 [String] Primary street address + # + # @param city [String] City name + # + # @param state [String] Two-letter state code (e.g., CA, NY) + # + # @param zipcode [String] ZIP code (5 or 9 digit) + # + # @param address_line_2 [String, nil] Secondary street address (apt, suite, etc.) + end + + # @see VitableConnect::Models::Employer#contact + class Contact < VitableConnect::Internal::Type::BaseModel + # @!attribute email + # Primary contact email + # + # @return [String, nil] + required :email, String, nil?: true + + # @!attribute phone + # Primary contact phone, or null + # + # @return [String, nil] + required :phone, String, nil?: true + + # @!method initialize(email:, phone:) + # Primary company-admin contact (email + phone; company admins have no person + # name). + # + # @param email [String, nil] Primary contact email + # + # @param phone [String, nil] Primary contact phone, or null + end + end + end +end diff --git a/lib/vitable_connect/models/employer_create_params.rb b/lib/vitable_connect/models/employer_create_params.rb new file mode 100644 index 0000000..6f75ee8 --- /dev/null +++ b/lib/vitable_connect/models/employer_create_params.rb @@ -0,0 +1,115 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # @see VitableConnect::Resources::Employers#create + class EmployerCreateParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + # @!attribute address + # Employer address + # + # @return [VitableConnect::Models::EmployerCreateParams::Address] + required :address, -> { VitableConnect::EmployerCreateParams::Address } + + # @!attribute ein + # Employer Identification Number (format: XX-XXXXXXX) + # + # @return [String] + required :ein, String + + # @!attribute email + # Email address for billing and communications + # + # @return [String] + required :email, String + + # @!attribute legal_name + # Legal business name + # + # @return [String] + required :legal_name, String + + # @!attribute name + # Employer display name + # + # @return [String] + required :name, String + + # @!attribute phone_number + # Employer phone number (10-digit US format, e.g. 5551234567) + # + # @return [String, nil] + optional :phone_number, String, nil?: true + + # @!attribute reference_id + # External reference ID for this employer + # + # @return [String, nil] + optional :reference_id, String, nil?: true + + # @!method initialize(address:, ein:, email:, legal_name:, name:, phone_number: nil, reference_id: nil, request_options: {}) + # @param address [VitableConnect::Models::EmployerCreateParams::Address] Employer address + # + # @param ein [String] Employer Identification Number (format: XX-XXXXXXX) + # + # @param email [String] Email address for billing and communications + # + # @param legal_name [String] Legal business name + # + # @param name [String] Employer display name + # + # @param phone_number [String, nil] Employer phone number (10-digit US format, e.g. 5551234567) + # + # @param reference_id [String, nil] External reference ID for this employer + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}] + + class Address < VitableConnect::Internal::Type::BaseModel + # @!attribute address_line_1 + # Primary street address + # + # @return [String] + required :address_line_1, String + + # @!attribute city + # City name + # + # @return [String] + required :city, String + + # @!attribute state + # Two-letter state code + # + # @return [String] + required :state, String + + # @!attribute zipcode + # ZIP code + # + # @return [String] + required :zipcode, String + + # @!attribute address_line_2 + # Secondary street address + # + # @return [String, nil] + optional :address_line_2, String, nil?: true + + # @!method initialize(address_line_1:, city:, state:, zipcode:, address_line_2: nil) + # Employer address + # + # @param address_line_1 [String] Primary street address + # + # @param city [String] City name + # + # @param state [String] Two-letter state code + # + # @param zipcode [String] ZIP code + # + # @param address_line_2 [String, nil] Secondary street address + end + end + end +end diff --git a/lib/vitable_connect/models/employer_ensure_payroll_integration_email_params.rb b/lib/vitable_connect/models/employer_ensure_payroll_integration_email_params.rb new file mode 100644 index 0000000..9881680 --- /dev/null +++ b/lib/vitable_connect/models/employer_ensure_payroll_integration_email_params.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # @see VitableConnect::Resources::Employers#ensure_payroll_integration_email + class EmployerEnsurePayrollIntegrationEmailParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + # @!attribute employer_id + # Unique employer identifier (empr\_\*) + # + # @return [String] + required :employer_id, String + + # @!method initialize(employer_id:, request_options: {}) + # @param employer_id [String] Unique employer identifier (empr\_\*) + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}] + end + end +end diff --git a/lib/vitable_connect/models/employer_ensure_payroll_integration_email_response.rb b/lib/vitable_connect/models/employer_ensure_payroll_integration_email_response.rb new file mode 100644 index 0000000..b42a69e --- /dev/null +++ b/lib/vitable_connect/models/employer_ensure_payroll_integration_email_response.rb @@ -0,0 +1,29 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # @see VitableConnect::Resources::Employers#ensure_payroll_integration_email + class EmployerEnsurePayrollIntegrationEmailResponse < VitableConnect::Internal::Type::BaseModel + # @!attribute data + # + # @return [VitableConnect::Models::EmployerEnsurePayrollIntegrationEmailResponse::Data] + required :data, -> { VitableConnect::Models::EmployerEnsurePayrollIntegrationEmailResponse::Data } + + # @!method initialize(data:) + # Response containing a single payroll integration email resource. + # + # @param data [VitableConnect::Models::EmployerEnsurePayrollIntegrationEmailResponse::Data] + + # @see VitableConnect::Models::EmployerEnsurePayrollIntegrationEmailResponse#data + class Data < VitableConnect::Internal::Type::BaseModel + # @!attribute integration_email + # + # @return [String] + required :integration_email, String + + # @!method initialize(integration_email:) + # @param integration_email [String] + end + end + end +end diff --git a/lib/vitable_connect/models/employer_list_benefit_plan_year_enrollments_params.rb b/lib/vitable_connect/models/employer_list_benefit_plan_year_enrollments_params.rb new file mode 100644 index 0000000..a291456 --- /dev/null +++ b/lib/vitable_connect/models/employer_list_benefit_plan_year_enrollments_params.rb @@ -0,0 +1,80 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # @see VitableConnect::Resources::Employers#list_benefit_plan_year_enrollments + class EmployerListBenefitPlanYearEnrollmentsParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + # @!attribute employer_id + # Unique employer identifier (empr\_\*) + # + # @return [String] + required :employer_id, String + + # @!attribute benefit_plan_year_id + # Unique benefit-plan-year identifier (plyr\_\*). + # + # @return [String] + required :benefit_plan_year_id, String + + # @!attribute election_status + # Filter by election status. Repeat the parameter to match several. + # + # @return [Array, nil] + optional :election_status, + -> { VitableConnect::Internal::Type::ArrayOf[enum: VitableConnect::EmployerListBenefitPlanYearEnrollmentsParams::ElectionStatus] } + + # @!attribute limit + # Items per page (default: 20, max: 100) + # + # @return [Integer, nil] + optional :limit, Integer + + # @!attribute page + # Page number (default: 1) + # + # @return [Integer, nil] + optional :page, Integer + + # @!attribute search + # Case-insensitive search. Matches member name partially, and the `member_id` + # exactly — either your own reference id or the prefixed `grpmbr_<...>` id. + # + # @return [String, nil] + optional :search, String + + # @!method initialize(employer_id:, benefit_plan_year_id:, election_status: nil, limit: nil, page: nil, search: nil, request_options: {}) + # Some parameter documentations has been truncated, see + # {VitableConnect::Models::EmployerListBenefitPlanYearEnrollmentsParams} for more + # details. + # + # @param employer_id [String] Unique employer identifier (empr\_\*) + # + # @param benefit_plan_year_id [String] Unique benefit-plan-year identifier (plyr\_\*). + # + # @param election_status [Array] Filter by election status. Repeat the parameter to match several. + # + # @param limit [Integer] Items per page (default: 20, max: 100) + # + # @param page [Integer] Page number (default: 1) + # + # @param search [String] Case-insensitive search. Matches member name partially, and the `member_id` exac + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}] + + module ElectionStatus + extend VitableConnect::Internal::Type::Enum + + ENROLLED = :Enrolled + EXPIRED = :Expired + PENDING = :Pending + WAIVED = :Waived + + # @!method self.values + # @return [Array] + end + end + end +end diff --git a/lib/vitable_connect/models/employer_list_benefit_plan_year_enrollments_response.rb b/lib/vitable_connect/models/employer_list_benefit_plan_year_enrollments_response.rb new file mode 100644 index 0000000..8df3b0b --- /dev/null +++ b/lib/vitable_connect/models/employer_list_benefit_plan_year_enrollments_response.rb @@ -0,0 +1,178 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # @see VitableConnect::Resources::Employers#list_benefit_plan_year_enrollments + class EmployerListBenefitPlanYearEnrollmentsResponse < VitableConnect::Internal::Type::BaseModel + # @!attribute carrier + # The carrier for this enrollment: the individual-market carrier for an ICHRA + # plan, otherwise the benefit's own. Null when the benefit has no carrier. + # + # @return [String, nil] + required :carrier, String, nil?: true + + # @!attribute dependent_count + # Dependents covered under this enrollment today. Counts the same dependents + # `premium_in_cents` is priced for, so a dependent whose termination is dated in + # the future still counts. + # + # @return [Integer] + required :dependent_count, Integer + + # @!attribute election_status + # - `Enrolled` - Enrolled + # - `Waived` - Waived + # - `Pending` - Pending + # - `Expired` - Expired + # + # @return [Symbol, VitableConnect::Models::EmployerListBenefitPlanYearEnrollmentsResponse::ElectionStatus] + required :election_status, + enum: -> { VitableConnect::Models::EmployerListBenefitPlanYearEnrollmentsResponse::ElectionStatus } + + # @!attribute employee_deduction_in_cents + # What the employee is deducted monthly, in cents: `premium_in_cents` less + # `employer_contribution_in_cents`, floored at zero. Null when unanswered/waived. + # + # @return [Integer, nil] + required :employee_deduction_in_cents, Integer, nil?: true + + # @!attribute employee_external_reference_id + # Your own reference id for this employee, as you supplied it. Null when you have + # not set one. + # + # @return [String, nil] + required :employee_external_reference_id, String, nil?: true + + # @!attribute employee_id + # Our id for this person's employment with this employer (`empl_<...>`). A person + # who leaves and is rehired has two. + # + # @return [String] + required :employee_id, String + + # @!attribute employer_contribution_in_cents + # The employer's monthly share of `premium_in_cents`, in cents. Null when + # unanswered/waived. + # + # @return [Integer, nil] + required :employer_contribution_in_cents, Integer, nil?: true + + # @!attribute member_first_name + # The member's first name. + # + # @return [String] + required :member_first_name, String + + # @!attribute member_id + # Our id for the person (`mbr_<...>`). Stable across every employer they work for. + # + # @return [String] + required :member_id, String + + # @!attribute member_last_name + # The member's last name. + # + # @return [String] + required :member_last_name, String + + # @!attribute plan + # Chosen plan name, or null when unanswered/waived. + # + # @return [String, nil] + required :plan, String, nil?: true + + # @!attribute policy_status + # - `Coverage Upcoming` - Coverage Upcoming + # - `Coverage Effective` - Coverage Effective + # - `Coverage Ended` - Coverage Ended + # - `Cancelled` - Cancelled + # + # @return [Symbol, VitableConnect::Models::EmployerListBenefitPlanYearEnrollmentsResponse::PolicyStatus, nil] + required :policy_status, + enum: -> { VitableConnect::Models::EmployerListBenefitPlanYearEnrollmentsResponse::PolicyStatus }, + nil?: true + + # @!attribute premium_in_cents + # Monthly premium in cents for the chosen plan, dependents included. The plan's + # own cost, not the employer's share of it. Null when unanswered/waived. + # + # @return [Integer, nil] + required :premium_in_cents, Integer, nil?: true + + # @!attribute tier + # Chosen coverage tier, or null when unanswered/waived. + # + # @return [String, nil] + required :tier, String, nil?: true + + # @!method initialize(carrier:, dependent_count:, election_status:, employee_deduction_in_cents:, employee_external_reference_id:, employee_id:, employer_contribution_in_cents:, member_first_name:, member_id:, member_last_name:, plan:, policy_status:, premium_in_cents:, tier:) + # Some parameter documentations has been truncated, see + # {VitableConnect::Models::EmployerListBenefitPlanYearEnrollmentsResponse} for + # more details. + # + # @param carrier [String, nil] The carrier for this enrollment: the individual-market carrier for an ICHRA plan + # + # @param dependent_count [Integer] Dependents covered under this enrollment today. Counts the same dependents `prem + # + # @param election_status [Symbol, VitableConnect::Models::EmployerListBenefitPlanYearEnrollmentsResponse::ElectionStatus] - `Enrolled` - Enrolled + # + # @param employee_deduction_in_cents [Integer, nil] What the employee is deducted monthly, in cents: `premium_in_cents` less `employ + # + # @param employee_external_reference_id [String, nil] Your own reference id for this employee, as you supplied it. Null when you have + # + # @param employee_id [String] Our id for this person's employment with this employer (`empl_<...>`). A person + # + # @param employer_contribution_in_cents [Integer, nil] The employer's monthly share of `premium_in_cents`, in cents. Null when unanswer + # + # @param member_first_name [String] The member's first name. + # + # @param member_id [String] Our id for the person (`mbr_<...>`). Stable across every employer they work for. + # + # @param member_last_name [String] The member's last name. + # + # @param plan [String, nil] Chosen plan name, or null when unanswered/waived. + # + # @param policy_status [Symbol, VitableConnect::Models::EmployerListBenefitPlanYearEnrollmentsResponse::PolicyStatus, nil] - `Coverage Upcoming` - Coverage Upcoming + # + # @param premium_in_cents [Integer, nil] Monthly premium in cents for the chosen plan, dependents included. The plan's ow + # + # @param tier [String, nil] Chosen coverage tier, or null when unanswered/waived. + + # - `Enrolled` - Enrolled + # - `Waived` - Waived + # - `Pending` - Pending + # - `Expired` - Expired + # + # @see VitableConnect::Models::EmployerListBenefitPlanYearEnrollmentsResponse#election_status + module ElectionStatus + extend VitableConnect::Internal::Type::Enum + + ENROLLED = :Enrolled + WAIVED = :Waived + PENDING = :Pending + EXPIRED = :Expired + + # @!method self.values + # @return [Array] + end + + # - `Coverage Upcoming` - Coverage Upcoming + # - `Coverage Effective` - Coverage Effective + # - `Coverage Ended` - Coverage Ended + # - `Cancelled` - Cancelled + # + # @see VitableConnect::Models::EmployerListBenefitPlanYearEnrollmentsResponse#policy_status + module PolicyStatus + extend VitableConnect::Internal::Type::Enum + + COVERAGE_UPCOMING = :"Coverage Upcoming" + COVERAGE_EFFECTIVE = :"Coverage Effective" + COVERAGE_ENDED = :"Coverage Ended" + CANCELLED = :Cancelled + + # @!method self.values + # @return [Array] + end + end + end +end diff --git a/lib/vitable_connect/models/employer_list_benefit_plan_years_params.rb b/lib/vitable_connect/models/employer_list_benefit_plan_years_params.rb new file mode 100644 index 0000000..75a3abd --- /dev/null +++ b/lib/vitable_connect/models/employer_list_benefit_plan_years_params.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # @see VitableConnect::Resources::Employers#list_benefit_plan_years + class EmployerListBenefitPlanYearsParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + # @!attribute employer_id + # Unique employer identifier (empr\_\*) + # + # @return [String] + required :employer_id, String + + # @!method initialize(employer_id:, request_options: {}) + # @param employer_id [String] Unique employer identifier (empr\_\*) + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}] + end + end +end diff --git a/lib/vitable_connect/models/employer_list_benefit_plan_years_response.rb b/lib/vitable_connect/models/employer_list_benefit_plan_years_response.rb new file mode 100644 index 0000000..2183de0 --- /dev/null +++ b/lib/vitable_connect/models/employer_list_benefit_plan_years_response.rb @@ -0,0 +1,301 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # @see VitableConnect::Resources::Employers#list_benefit_plan_years + class EmployerListBenefitPlanYearsResponse < VitableConnect::Internal::Type::BaseModel + # @!attribute data + # + # @return [Array] + required :data, + -> { VitableConnect::Internal::Type::ArrayOf[VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data] } + + # @!method initialize(data:) + # @param data [Array] + + class Data < VitableConnect::Internal::Type::BaseModel + # @!attribute benefit_id + # Prefixed benefit identifier (`bprd_*`). + # + # @return [String] + required :benefit_id, String + + # @!attribute benefit_plan_year_id + # Prefixed plan-year identifier (`plyr_*`). + # + # @return [String] + required :benefit_plan_year_id, String + + # @!attribute carrier + # Carrier name, or null (e.g. ICHRA). + # + # @return [String, nil] + required :carrier, String, nil?: true + + # @!attribute coverage_end + # Coverage end. + # + # @return [Date, nil] + required :coverage_end, Date, nil?: true + + # @!attribute coverage_start + # Coverage start. + # + # @return [Date] + required :coverage_start, Date + + # @!attribute employee_contribution + # Employee contribution range. + # + # @return [VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data::EmployeeContribution, nil] + required :employee_contribution, + -> { VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data::EmployeeContribution }, + nil?: true + + # @!attribute employer_contribution + # Employer contribution range. + # + # @return [VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data::EmployerContribution, nil] + required :employer_contribution, + -> { VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data::EmployerContribution }, + nil?: true + + # @!attribute enrollment_rate + # Enrolled/eligible rate for this plan year. + # + # @return [VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data::EnrollmentRate] + required :enrollment_rate, + -> { VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data::EnrollmentRate } + + # @!attribute family + # - `mec` - Mec + # - `mvp` - Mvp + # - `ichra` - Ichra + # - `vpc` - Vpc + # - `dental` - Dental + # - `vision` - Vision + # + # @return [Symbol, VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data::Family] + required :family, enum: -> { VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data::Family } + + # @!attribute is_current + # Whether this is the current plan year. + # + # @return [Boolean] + required :is_current, VitableConnect::Internal::Type::Boolean + + # @!attribute network_names + # Displayed networks: ["multi"] for ICHRA, otherwise the plan year's distinct + # network names. + # + # @return [Array] + required :network_names, VitableConnect::Internal::Type::ArrayOf[String] + + # @!attribute offered_states + # Distinct offered state codes. + # + # @return [Array] + required :offered_states, VitableConnect::Internal::Type::ArrayOf[String] + + # @!attribute open_enrollment_end + # Open-enrollment end. + # + # @return [Date, nil] + required :open_enrollment_end, Date, nil?: true + + # @!attribute open_enrollment_start + # Open-enrollment start. + # + # @return [Date] + required :open_enrollment_start, Date + + # @!attribute premium_in_cents + # Monthly premium in cents; only for an ICHRA benefit with effective coverage. + # + # @return [Integer, nil] + required :premium_in_cents, Integer, nil?: true + + # @!attribute product_name + # Benefit/product display name. + # + # @return [String] + required :product_name, String + + # @!attribute status + # - `active` - Active + # - `upcoming` - Upcoming + # - `open_enrollment` - Open Enrollment + # - `inactive` - Inactive + # + # @return [Symbol, VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data::Status] + required :status, enum: -> { VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data::Status } + + # @!attribute year + # Calendar coverage year. + # + # @return [Integer] + required :year, Integer + + # @!method initialize(benefit_id:, benefit_plan_year_id:, carrier:, coverage_end:, coverage_start:, employee_contribution:, employer_contribution:, enrollment_rate:, family:, is_current:, network_names:, offered_states:, open_enrollment_end:, open_enrollment_start:, premium_in_cents:, product_name:, status:, year:) + # Some parameter documentations has been truncated, see + # {VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data} for more + # details. + # + # One plan year, list view. + # + # Standalone (no shared base) so the exact list payload is readable in one place; + # the detail serializer is a separate class even where fields overlap. + # + # @param benefit_id [String] Prefixed benefit identifier (`bprd_*`). + # + # @param benefit_plan_year_id [String] Prefixed plan-year identifier (`plyr_*`). + # + # @param carrier [String, nil] Carrier name, or null (e.g. ICHRA). + # + # @param coverage_end [Date, nil] Coverage end. + # + # @param coverage_start [Date] Coverage start. + # + # @param employee_contribution [VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data::EmployeeContribution, nil] Employee contribution range. + # + # @param employer_contribution [VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data::EmployerContribution, nil] Employer contribution range. + # + # @param enrollment_rate [VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data::EnrollmentRate] Enrolled/eligible rate for this plan year. + # + # @param family [Symbol, VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data::Family] - `mec` - Mec + # + # @param is_current [Boolean] Whether this is the current plan year. + # + # @param network_names [Array] Displayed networks: ["multi"] for ICHRA, otherwise the plan year's distinct netw + # + # @param offered_states [Array] Distinct offered state codes. + # + # @param open_enrollment_end [Date, nil] Open-enrollment end. + # + # @param open_enrollment_start [Date] Open-enrollment start. + # + # @param premium_in_cents [Integer, nil] Monthly premium in cents; only for an ICHRA benefit with effective coverage. + # + # @param product_name [String] Benefit/product display name. + # + # @param status [Symbol, VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data::Status] - `active` - Active + # + # @param year [Integer] Calendar coverage year. + + # @see VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data#employee_contribution + class EmployeeContribution < VitableConnect::Internal::Type::BaseModel + # @!attribute max_cents + # Highest per-tier contribution in cents. + # + # @return [Integer] + required :max_cents, Integer + + # @!attribute min_cents + # Lowest per-tier contribution in cents. + # + # @return [Integer] + required :min_cents, Integer + + # @!method initialize(max_cents:, min_cents:) + # Employee contribution range. + # + # @param max_cents [Integer] Highest per-tier contribution in cents. + # + # @param min_cents [Integer] Lowest per-tier contribution in cents. + end + + # @see VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data#employer_contribution + class EmployerContribution < VitableConnect::Internal::Type::BaseModel + # @!attribute max_cents + # Highest per-tier contribution in cents. + # + # @return [Integer] + required :max_cents, Integer + + # @!attribute min_cents + # Lowest per-tier contribution in cents. + # + # @return [Integer] + required :min_cents, Integer + + # @!method initialize(max_cents:, min_cents:) + # Employer contribution range. + # + # @param max_cents [Integer] Highest per-tier contribution in cents. + # + # @param min_cents [Integer] Lowest per-tier contribution in cents. + end + + # @see VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data#enrollment_rate + class EnrollmentRate < VitableConnect::Internal::Type::BaseModel + # @!attribute eligible + # Employees eligible for this plan year. + # + # @return [Integer] + required :eligible, Integer + + # @!attribute enrolled + # Employees enrolled in this plan year. + # + # @return [Integer] + required :enrolled, Integer + + # @!attribute percentage + # `enrolled / eligible` whole-number percent (0 when none). + # + # @return [Integer] + required :percentage, Integer + + # @!method initialize(eligible:, enrolled:, percentage:) + # Enrolled/eligible rate for this plan year. + # + # @param eligible [Integer] Employees eligible for this plan year. + # + # @param enrolled [Integer] Employees enrolled in this plan year. + # + # @param percentage [Integer] `enrolled / eligible` whole-number percent (0 when none). + end + + # - `mec` - Mec + # - `mvp` - Mvp + # - `ichra` - Ichra + # - `vpc` - Vpc + # - `dental` - Dental + # - `vision` - Vision + # + # @see VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data#family + module Family + extend VitableConnect::Internal::Type::Enum + + MEC = :mec + MVP = :mvp + ICHRA = :ichra + VPC = :vpc + DENTAL = :dental + VISION = :vision + + # @!method self.values + # @return [Array] + end + + # - `active` - Active + # - `upcoming` - Upcoming + # - `open_enrollment` - Open Enrollment + # - `inactive` - Inactive + # + # @see VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data#status + module Status + extend VitableConnect::Internal::Type::Enum + + ACTIVE = :active + UPCOMING = :upcoming + OPEN_ENROLLMENT = :open_enrollment + INACTIVE = :inactive + + # @!method self.values + # @return [Array] + end + end + end + end +end diff --git a/lib/vitable_connect/models/employer_list_employees_params.rb b/lib/vitable_connect/models/employer_list_employees_params.rb new file mode 100644 index 0000000..1664d86 --- /dev/null +++ b/lib/vitable_connect/models/employer_list_employees_params.rb @@ -0,0 +1,65 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # @see VitableConnect::Resources::Employers#list_employees + class EmployerListEmployeesParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + # @!attribute employer_id + # Unique employer identifier (empr\_\*) + # + # @return [String] + required :employer_id, String + + # @!attribute employment_status + # Filter by employment status (active or terminated) + # + # @return [Symbol, VitableConnect::Models::EmployerListEmployeesParams::EmploymentStatus, nil] + optional :employment_status, enum: -> { VitableConnect::EmployerListEmployeesParams::EmploymentStatus } + + # @!attribute limit + # Items per page (default: 20, max: 100) + # + # @return [Integer, nil] + optional :limit, Integer + + # @!attribute page + # Page number (default: 1) + # + # @return [Integer, nil] + optional :page, Integer + + # @!attribute search + # Case-insensitive search across employee first name, last name, and email + # + # @return [String, nil] + optional :search, String + + # @!method initialize(employer_id:, employment_status: nil, limit: nil, page: nil, search: nil, request_options: {}) + # @param employer_id [String] Unique employer identifier (empr\_\*) + # + # @param employment_status [Symbol, VitableConnect::Models::EmployerListEmployeesParams::EmploymentStatus] Filter by employment status (active or terminated) + # + # @param limit [Integer] Items per page (default: 20, max: 100) + # + # @param page [Integer] Page number (default: 1) + # + # @param search [String] Case-insensitive search across employee first name, last name, and email + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}] + + # Filter by employment status (active or terminated) + module EmploymentStatus + extend VitableConnect::Internal::Type::Enum + + ACTIVE = :active + TERMINATED = :terminated + + # @!method self.values + # @return [Array] + end + end + end +end diff --git a/lib/vitable_connect/models/employer_list_hris_providers_params.rb b/lib/vitable_connect/models/employer_list_hris_providers_params.rb new file mode 100644 index 0000000..34aa73a --- /dev/null +++ b/lib/vitable_connect/models/employer_list_hris_providers_params.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # @see VitableConnect::Resources::Employers#list_hris_providers + class EmployerListHRISProvidersParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + # @!method initialize(request_options: {}) + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}] + end + end +end diff --git a/lib/vitable_connect/models/employer_list_hris_providers_response.rb b/lib/vitable_connect/models/employer_list_hris_providers_response.rb new file mode 100644 index 0000000..330f1e9 --- /dev/null +++ b/lib/vitable_connect/models/employer_list_hris_providers_response.rb @@ -0,0 +1,43 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # @see VitableConnect::Resources::Employers#list_hris_providers + class EmployerListHRISProvidersResponse < VitableConnect::Internal::Type::BaseModel + # @!attribute data + # + # @return [Array] + required :data, + -> { VitableConnect::Internal::Type::ArrayOf[VitableConnect::Models::EmployerListHRISProvidersResponse::Data] } + + # @!method initialize(data:) + # Unpaginated `{"data": [...]}` list of organization hris providers. + # + # @param data [Array] + + class Data < VitableConnect::Internal::Type::BaseModel + # @!attribute provider + # HRIS/payroll provider id, as stored on the connection (e.g. `adp_run`). Filter + # with this. + # + # @return [String] + required :provider, String + + # @!attribute provider_label + # Display name of that provider (e.g. `ADP Run`). + # + # @return [String] + required :provider_label, String + + # @!method initialize(provider:, provider_label:) + # Some parameter documentations has been truncated, see + # {VitableConnect::Models::EmployerListHRISProvidersResponse::Data} for more + # details. + # + # @param provider [String] HRIS/payroll provider id, as stored on the connection (e.g. `adp_run`). Filter w + # + # @param provider_label [String] Display name of that provider (e.g. `ADP Run`). + end + end + end +end diff --git a/lib/vitable_connect/models/employer_list_invoices_params.rb b/lib/vitable_connect/models/employer_list_invoices_params.rb new file mode 100644 index 0000000..09c24e9 --- /dev/null +++ b/lib/vitable_connect/models/employer_list_invoices_params.rb @@ -0,0 +1,38 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # @see VitableConnect::Resources::Employers#list_invoices + class EmployerListInvoicesParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + # @!attribute employer_id + # Unique employer identifier (empr\_\*) + # + # @return [String] + required :employer_id, String + + # @!attribute limit + # Maximum number of invoices per page + # + # @return [Integer, nil] + optional :limit, Integer + + # @!attribute offset + # Opaque cursor from a previous page's next_offset + # + # @return [String, nil] + optional :offset, String, nil?: true + + # @!method initialize(employer_id:, limit: nil, offset: nil, request_options: {}) + # @param employer_id [String] Unique employer identifier (empr\_\*) + # + # @param limit [Integer] Maximum number of invoices per page + # + # @param offset [String, nil] Opaque cursor from a previous page's next_offset + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}] + end + end +end diff --git a/lib/vitable_connect/models/employer_list_invoices_response.rb b/lib/vitable_connect/models/employer_list_invoices_response.rb new file mode 100644 index 0000000..2e8128f --- /dev/null +++ b/lib/vitable_connect/models/employer_list_invoices_response.rb @@ -0,0 +1,77 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # @see VitableConnect::Resources::Employers#list_invoices + class EmployerListInvoicesResponse < VitableConnect::Internal::Type::BaseModel + # @!attribute data + # + # @return [Array] + required :data, + -> { VitableConnect::Internal::Type::ArrayOf[VitableConnect::Models::EmployerListInvoicesResponse::Data] } + + # @!attribute pagination + # + # @return [VitableConnect::Models::EmployerListInvoicesResponse::Pagination] + required :pagination, -> { VitableConnect::Models::EmployerListInvoicesResponse::Pagination } + + # @!method initialize(data:, pagination:) + # Cursor-paginated invoices envelope: + # `{ "data": [...], "pagination": { "next_offset": ... } }`. + # + # @param data [Array] + # @param pagination [VitableConnect::Models::EmployerListInvoicesResponse::Pagination] + + class Data < VitableConnect::Internal::Type::BaseModel + # @!attribute invoice_id + # Chargebee invoice id (external id, not a prefixed UUID). + # + # @return [String] + required :invoice_id, String + + # @!attribute period + # Invoice date as an ISO string, or null. + # + # @return [String, nil] + required :period, String, nil?: true + + # @!attribute status + # Chargebee invoice status (e.g. `paid`), or null. + # + # @return [String, nil] + required :status, String, nil?: true + + # @!attribute total + # Invoice total in dollars, or null. + # + # @return [Float, nil] + required :total, Float, nil?: true + + # @!method initialize(invoice_id:, period:, status:, total:) + # @param invoice_id [String] Chargebee invoice id (external id, not a prefixed UUID). + # + # @param period [String, nil] Invoice date as an ISO string, or null. + # + # @param status [String, nil] Chargebee invoice status (e.g. `paid`), or null. + # + # @param total [Float, nil] Invoice total in dollars, or null. + end + + # @see VitableConnect::Models::EmployerListInvoicesResponse#pagination + class Pagination < VitableConnect::Internal::Type::BaseModel + # @!attribute next_offset + # Opaque JSON-encoded cursor for the next page; null when there are no more pages. + # + # @return [String, nil] + required :next_offset, String, nil?: true + + # @!method initialize(next_offset:) + # Some parameter documentations has been truncated, see + # {VitableConnect::Models::EmployerListInvoicesResponse::Pagination} for more + # details. + # + # @param next_offset [String, nil] Opaque JSON-encoded cursor for the next page; null when there are no more pages. + end + end + end +end diff --git a/lib/vitable_connect/models/employer_list_params.rb b/lib/vitable_connect/models/employer_list_params.rb new file mode 100644 index 0000000..4dc51dc --- /dev/null +++ b/lib/vitable_connect/models/employer_list_params.rb @@ -0,0 +1,145 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # @see VitableConnect::Resources::Employers#list + class EmployerListParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + # @!attribute benefit_family + # Filter to employers with at least one active benefit in these families. + # + # @return [Array, nil] + optional :benefit_family, + -> { VitableConnect::Internal::Type::ArrayOf[enum: VitableConnect::EmployerListParams::BenefitFamily] } + + # @!attribute benefit_lifecycle_stage + # Filter to employers in one of these computed benefit-lifecycle stages. + # + # @return [Array, nil] + optional :benefit_lifecycle_stage, + -> { VitableConnect::Internal::Type::ArrayOf[enum: VitableConnect::EmployerListParams::BenefitLifecycleStage] } + + # @!attribute hris_provider + # Filter to employers whose HRIS connection is with one of these payroll providers + # (e.g. `ADP RUN`). Matched case-insensitively; free text, so read the available + # values from the HRIS-providers endpoint rather than assuming a fixed set. + # + # @return [Array, nil] + optional :hris_provider, VitableConnect::Internal::Type::ArrayOf[String] + + # @!attribute hris_status + # Filter to employers whose HRIS connection is in one of these statuses. + # + # @return [Array, nil] + optional :hris_status, + -> { VitableConnect::Internal::Type::ArrayOf[enum: VitableConnect::EmployerListParams::HRISStatus] } + + # @!attribute include_cancelled + # Include cancelled employers (hidden by default unless their stage is explicitly + # requested). + # + # @return [Boolean, nil] + optional :include_cancelled, VitableConnect::Internal::Type::Boolean + + # @!attribute limit + # Items per page. + # + # @return [Integer, nil] + optional :limit, Integer + + # @!attribute page + # Page number. + # + # @return [Integer, nil] + optional :page, Integer + + # @!attribute search + # Employer filter. Matches the display name or the legal name case-insensitively + # as a substring, or one of these exactly: the EIN (with or without its dash), the + # employer id, or the contact email of one of the employer's non-disabled admins. + # + # @return [String, nil] + optional :search, String, nil?: true + + # @!method initialize(benefit_family: nil, benefit_lifecycle_stage: nil, hris_provider: nil, hris_status: nil, include_cancelled: nil, limit: nil, page: nil, search: nil, request_options: {}) + # Some parameter documentations has been truncated, see + # {VitableConnect::Models::EmployerListParams} for more details. + # + # @param benefit_family [Array] Filter to employers with at least one active benefit in these families. + # + # @param benefit_lifecycle_stage [Array] Filter to employers in one of these computed benefit-lifecycle stages. + # + # @param hris_provider [Array] Filter to employers whose HRIS connection is with one of these payroll providers + # + # @param hris_status [Array] Filter to employers whose HRIS connection is in one of these statuses. + # + # @param include_cancelled [Boolean] Include cancelled employers (hidden by default unless their stage is explicitly + # + # @param limit [Integer] Items per page. + # + # @param page [Integer] Page number. + # + # @param search [String, nil] Employer filter. Matches the display name or the legal name case-insensitively a + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}] + + # - `mec` - mec + # - `mvp` - mvp + # - `ichra` - ichra + # - `vpc` - vpc + # - `dental` - dental + # - `vision` - vision + module BenefitFamily + extend VitableConnect::Internal::Type::Enum + + MEC = :mec + MVP = :mvp + ICHRA = :ichra + VPC = :vpc + DENTAL = :dental + VISION = :vision + + # @!method self.values + # @return [Array] + end + + # - `open_enrollment` - open_enrollment + # - `renewal` - renewal + # - `active` - active + # - `onboarding` - onboarding + # - `cancelled` - cancelled + module BenefitLifecycleStage + extend VitableConnect::Internal::Type::Enum + + OPEN_ENROLLMENT = :open_enrollment + RENEWAL = :renewal + ACTIVE = :active + ONBOARDING = :onboarding + CANCELLED = :cancelled + + # @!method self.values + # @return [Array] + end + + # - `Pending` - Pending + # - `Active` - Active + # - `Inactive` - Inactive + # - `Paused` - Paused + # - `Terminated` - Terminated + module HRISStatus + extend VitableConnect::Internal::Type::Enum + + PENDING = :Pending + ACTIVE = :Active + INACTIVE = :Inactive + PAUSED = :Paused + TERMINATED = :Terminated + + # @!method self.values + # @return [Array] + end + end + end +end diff --git a/lib/vitable_connect/models/employer_list_payroll_deduction_statements_params.rb b/lib/vitable_connect/models/employer_list_payroll_deduction_statements_params.rb new file mode 100644 index 0000000..e21c7fe --- /dev/null +++ b/lib/vitable_connect/models/employer_list_payroll_deduction_statements_params.rb @@ -0,0 +1,38 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # @see VitableConnect::Resources::Employers#list_payroll_deduction_statements + class EmployerListPayrollDeductionStatementsParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + # @!attribute employer_id + # Unique employer identifier (empr\_\*) + # + # @return [String] + required :employer_id, String + + # @!attribute limit + # Maximum number of statements per page + # + # @return [Integer, nil] + optional :limit, Integer + + # @!attribute page + # Page number to retrieve (starts at 1) + # + # @return [Integer, nil] + optional :page, Integer + + # @!method initialize(employer_id:, limit: nil, page: nil, request_options: {}) + # @param employer_id [String] Unique employer identifier (empr\_\*) + # + # @param limit [Integer] Maximum number of statements per page + # + # @param page [Integer] Page number to retrieve (starts at 1) + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}] + end + end +end diff --git a/lib/vitable_connect/models/employer_list_payroll_deduction_statements_response.rb b/lib/vitable_connect/models/employer_list_payroll_deduction_statements_response.rb new file mode 100644 index 0000000..b4afa2f --- /dev/null +++ b/lib/vitable_connect/models/employer_list_payroll_deduction_statements_response.rb @@ -0,0 +1,113 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # @see VitableConnect::Resources::Employers#list_payroll_deduction_statements + class EmployerListPayrollDeductionStatementsResponse < VitableConnect::Internal::Type::BaseModel + # @!attribute csv_file_url + # Download link for the change CSV, or null. + # + # @return [String, nil] + required :csv_file_url, String, nil?: true + + # @!attribute deduction_frequency + # - `weekly` - Weekly + # - `bi_weekly` - Bi Weekly + # - `semi_monthly` - Semi Monthly + # - `monthly` - Monthly + # + # @return [Symbol, VitableConnect::Models::EmployerListPayrollDeductionStatementsResponse::DeductionFrequency] + required :deduction_frequency, + enum: -> { VitableConnect::Models::EmployerListPayrollDeductionStatementsResponse::DeductionFrequency } + + # @!attribute deduction_frequency_label + # Human-readable deduction frequency (e.g. `Monthly`). + # + # @return [String] + required :deduction_frequency_label, String + + # @!attribute employee_count + # Distinct employees covered by the statement's entries. + # + # @return [Integer] + required :employee_count, Integer + + # @!attribute period_end + # Deduction period end date. + # + # @return [Date] + required :period_end, Date + + # @!attribute period_start + # Deduction period start date. + # + # @return [Date] + required :period_start, Date + + # @!attribute run_date + # When the statement was generated. + # + # @return [Time] + required :run_date, Time + + # @!attribute statement_id + # Prefixed payroll-deduction-statement identifier (`pstmt_`). + # + # @return [String] + required :statement_id, String + + # @!attribute total_deduction_cents + # Total payroll deduction for the period, in cents. + # + # @return [Integer] + required :total_deduction_cents, Integer + + # @!method initialize(csv_file_url:, deduction_frequency:, deduction_frequency_label:, employee_count:, period_end:, period_start:, run_date:, statement_id:, total_deduction_cents:) + # Some parameter documentations has been truncated, see + # {VitableConnect::Models::EmployerListPayrollDeductionStatementsResponse} for + # more details. + # + # One payroll-deduction statement row. + # + # Reads a :class:`PayrollDeductionStatementDTO` by attribute: the `statement_id` + # character field renders the prefixed id via `str()`, and the date/datetime + # fields emit ISO-8601 strings. + # + # @param csv_file_url [String, nil] Download link for the change CSV, or null. + # + # @param deduction_frequency [Symbol, VitableConnect::Models::EmployerListPayrollDeductionStatementsResponse::DeductionFrequency] - `weekly` - Weekly + # + # @param deduction_frequency_label [String] Human-readable deduction frequency (e.g. `Monthly`). + # + # @param employee_count [Integer] Distinct employees covered by the statement's entries. + # + # @param period_end [Date] Deduction period end date. + # + # @param period_start [Date] Deduction period start date. + # + # @param run_date [Time] When the statement was generated. + # + # @param statement_id [String] Prefixed payroll-deduction-statement identifier (`pstmt_`). + # + # @param total_deduction_cents [Integer] Total payroll deduction for the period, in cents. + + # - `weekly` - Weekly + # - `bi_weekly` - Bi Weekly + # - `semi_monthly` - Semi Monthly + # - `monthly` - Monthly + # + # @see VitableConnect::Models::EmployerListPayrollDeductionStatementsResponse#deduction_frequency + module DeductionFrequency + extend VitableConnect::Internal::Type::Enum + + WEEKLY = :weekly + BI_WEEKLY = :bi_weekly + SEMI_MONTHLY = :semi_monthly + MONTHLY = :monthly + + # @!method self.values + # @return [Array] + end + end + end +end diff --git a/lib/vitable_connect/models/employer_list_response.rb b/lib/vitable_connect/models/employer_list_response.rb new file mode 100644 index 0000000..414ee77 --- /dev/null +++ b/lib/vitable_connect/models/employer_list_response.rb @@ -0,0 +1,294 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # @see VitableConnect::Resources::Employers#list + class EmployerListResponse < VitableConnect::Internal::Type::BaseModel + # @!attribute active + # Whether the employer is currently active in the system. + # + # @return [Boolean] + required :active, VitableConnect::Internal::Type::Boolean + + # @!attribute address + # Shared read serializer for a postal address on public API responses. + # + # One definition for the address block every public resource emits (employer, + # employee, …), so the 5-field shape isn't hand-rolled per endpoint. Read-only: it + # renders an already-built address value object (e.g. `AddressDVO`) whose + # attributes map 1:1 to these fields. + # + # @return [VitableConnect::Models::EmployerListResponse::Address] + required :address, -> { VitableConnect::Models::EmployerListResponse::Address } + + # @!attribute benefit_families + # Distinct benefit-family tags across the employer's active benefits (e.g. `MEC`, + # `ICHRA`, `VPC`). + # + # @return [Array] + required :benefit_families, VitableConnect::Internal::Type::ArrayOf[String] + + # @!attribute benefit_lifecycle_stage + # + # @return [VitableConnect::Models::EmployerListResponse::BenefitLifecycleStage] + required :benefit_lifecycle_stage, + -> { VitableConnect::Models::EmployerListResponse::BenefitLifecycleStage } + + # @!attribute created_at + # Timestamp when the employer was created. + # + # @return [Time] + required :created_at, Time + + # @!attribute ein + # Employer Identification Number (masked in responses). + # + # @return [String, nil] + required :ein, String, nil?: true + + # @!attribute email + # Email address for billing and communications. + # + # @return [String, nil] + required :email, String, nil?: true + + # @!attribute employer_id + # Prefixed employer identifier (`empr_`). + # + # @return [String] + required :employer_id, String + + # @!attribute enrollment_rate_summary + # Enrolled/eligible employees roll-up. + # + # @return [VitableConnect::Models::EmployerListResponse::EnrollmentRateSummary] + required :enrollment_rate_summary, + -> { VitableConnect::Models::EmployerListResponse::EnrollmentRateSummary } + + # @!attribute hris_status + # HRIS connection, or null when the employer has none. + # + # @return [VitableConnect::Models::EmployerListResponse::HRISStatus, nil] + required :hris_status, -> { VitableConnect::Models::EmployerListResponse::HRISStatus }, nil?: true + + # @!attribute legal_name + # Legal business name for compliance and tax purposes. + # + # @return [String, nil] + required :legal_name, String, nil?: true + + # @!attribute name + # Employer name. + # + # @return [String] + required :name, String + + # @!attribute organization_id + # ID of the parent organization (`org_*`), or null when unknown. + # + # @return [String, nil] + required :organization_id, String, nil?: true + + # @!attribute phone_number + # Employer phone number. + # + # @return [String, nil] + required :phone_number, String, nil?: true + + # @!attribute reference_id + # The organization's own reference id for this employer, or null when none was + # assigned. + # + # @return [String, nil] + required :reference_id, String, nil?: true + + # @!attribute updated_at + # Timestamp when the employer was last updated. + # + # @return [Time] + required :updated_at, Time + + # @!method initialize(active:, address:, benefit_families:, benefit_lifecycle_stage:, created_at:, ein:, email:, employer_id:, enrollment_rate_summary:, hris_status:, legal_name:, name:, organization_id:, phone_number:, reference_id:, updated_at:) + # Some parameter documentations has been truncated, see + # {VitableConnect::Models::EmployerListResponse} for more details. + # + # One employer row of the organization's book (list projection). + # + # Carries the enriched/computed columns (enrollment roll-up, benefit-family tags, + # HRIS connection, benefit-lifecycle stage) alongside the flat CRM fields of the + # underlying employer (legal name, EIN, contact, address, timestamps) for parity + # with the legacy `Employer` contract. + # + # @param active [Boolean] Whether the employer is currently active in the system. + # + # @param address [VitableConnect::Models::EmployerListResponse::Address] Shared read serializer for a postal address on public API responses. + # + # @param benefit_families [Array] Distinct benefit-family tags across the employer's active benefits (e.g. `MEC`, + # + # @param benefit_lifecycle_stage [VitableConnect::Models::EmployerListResponse::BenefitLifecycleStage] + # + # @param created_at [Time] Timestamp when the employer was created. + # + # @param ein [String, nil] Employer Identification Number (masked in responses). + # + # @param email [String, nil] Email address for billing and communications. + # + # @param employer_id [String] Prefixed employer identifier (`empr_`). + # + # @param enrollment_rate_summary [VitableConnect::Models::EmployerListResponse::EnrollmentRateSummary] Enrolled/eligible employees roll-up. + # + # @param hris_status [VitableConnect::Models::EmployerListResponse::HRISStatus, nil] HRIS connection, or null when the employer has none. + # + # @param legal_name [String, nil] Legal business name for compliance and tax purposes. + # + # @param name [String] Employer name. + # + # @param organization_id [String, nil] ID of the parent organization (`org_*`), or null when unknown. + # + # @param phone_number [String, nil] Employer phone number. + # + # @param reference_id [String, nil] The organization's own reference id for this employer, or null when none was ass + # + # @param updated_at [Time] Timestamp when the employer was last updated. + + # @see VitableConnect::Models::EmployerListResponse#address + class Address < VitableConnect::Internal::Type::BaseModel + # @!attribute address_line_1 + # Primary street address. + # + # @return [String] + required :address_line_1, String + + # @!attribute address_line_2 + # Secondary street address (apt, suite, etc.). + # + # @return [String, nil] + required :address_line_2, String, nil?: true + + # @!attribute city + # City name. + # + # @return [String] + required :city, String + + # @!attribute state + # Two-letter state code (e.g. `CA`, `NY`). + # + # @return [String] + required :state, String + + # @!attribute zipcode + # ZIP code (5 or 9 digit). + # + # @return [String] + required :zipcode, String + + # @!method initialize(address_line_1:, address_line_2:, city:, state:, zipcode:) + # Shared read serializer for a postal address on public API responses. + # + # One definition for the address block every public resource emits (employer, + # employee, …), so the 5-field shape isn't hand-rolled per endpoint. Read-only: it + # renders an already-built address value object (e.g. `AddressDVO`) whose + # attributes map 1:1 to these fields. + # + # @param address_line_1 [String] Primary street address. + # + # @param address_line_2 [String, nil] Secondary street address (apt, suite, etc.). + # + # @param city [String] City name. + # + # @param state [String] Two-letter state code (e.g. `CA`, `NY`). + # + # @param zipcode [String] ZIP code (5 or 9 digit). + end + + # @see VitableConnect::Models::EmployerListResponse#benefit_lifecycle_stage + class BenefitLifecycleStage < VitableConnect::Internal::Type::BaseModel + # @!attribute as_of_date + # Anchor date for the stage (e.g. renewal date); null when not applicable. + # + # @return [Date, nil] + required :as_of_date, Date, nil?: true + + # @!attribute stage + # Computed employer benefit-lifecycle stage: `open_enrollment`, `renewal`, + # `active`, `onboarding`, or `cancelled`. + # + # @return [String] + required :stage, String + + # @!method initialize(as_of_date:, stage:) + # Some parameter documentations has been truncated, see + # {VitableConnect::Models::EmployerListResponse::BenefitLifecycleStage} for more + # details. + # + # @param as_of_date [Date, nil] Anchor date for the stage (e.g. renewal date); null when not applicable. + # + # @param stage [String] Computed employer benefit-lifecycle stage: `open_enrollment`, `renewal`, `active + end + + # @see VitableConnect::Models::EmployerListResponse#enrollment_rate_summary + class EnrollmentRateSummary < VitableConnect::Internal::Type::BaseModel + # @!attribute eligible + # Employees eligible for at least one active benefit. + # + # @return [Integer] + required :eligible, Integer + + # @!attribute enrolled + # Employees enrolled in at least one active benefit. + # + # @return [Integer] + required :enrolled, Integer + + # @!attribute percentage + # `enrolled / eligible` as a whole-number percent (0 when none eligible). + # + # @return [Integer] + required :percentage, Integer + + # @!method initialize(eligible:, enrolled:, percentage:) + # Enrolled/eligible employees roll-up. + # + # @param eligible [Integer] Employees eligible for at least one active benefit. + # + # @param enrolled [Integer] Employees enrolled in at least one active benefit. + # + # @param percentage [Integer] `enrolled / eligible` as a whole-number percent (0 when none eligible). + end + + # @see VitableConnect::Models::EmployerListResponse#hris_status + class HRISStatus < VitableConnect::Internal::Type::BaseModel + # @!attribute provider + # Id of the HRIS/payroll provider the employer is connected to (e.g. `paylocity`). + # + # @return [String] + required :provider, String + + # @!attribute provider_label + # Display name of that provider (e.g. `Paylocity`). + # + # @return [String] + required :provider_label, String + + # @!attribute status + # Connection status reported by the integration. + # + # @return [String] + required :status, String + + # @!method initialize(provider:, provider_label:, status:) + # Some parameter documentations has been truncated, see + # {VitableConnect::Models::EmployerListResponse::HRISStatus} for more details. + # + # HRIS connection, or null when the employer has none. + # + # @param provider [String] Id of the HRIS/payroll provider the employer is connected to (e.g. `paylocity`). + # + # @param provider_label [String] Display name of that provider (e.g. `Paylocity`). + # + # @param status [String] Connection status reported by the integration. + end + end + end +end diff --git a/lib/vitable_connect/models/employer_response.rb b/lib/vitable_connect/models/employer_response.rb new file mode 100644 index 0000000..1ee3790 --- /dev/null +++ b/lib/vitable_connect/models/employer_response.rb @@ -0,0 +1,19 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # @see VitableConnect::Resources::Employers#create + class EmployerResponse < VitableConnect::Internal::Type::BaseModel + # @!attribute data + # Serializer for Employer entity in public API responses. + # + # @return [VitableConnect::Models::Employer] + required :data, -> { VitableConnect::Employer } + + # @!method initialize(data:) + # Response containing a single employer resource. + # + # @param data [VitableConnect::Models::Employer] Serializer for Employer entity in public API responses. + end + end +end diff --git a/lib/vitable_connect/models/employer_retrieve_benefit_plan_year_params.rb b/lib/vitable_connect/models/employer_retrieve_benefit_plan_year_params.rb new file mode 100644 index 0000000..74fbaae --- /dev/null +++ b/lib/vitable_connect/models/employer_retrieve_benefit_plan_year_params.rb @@ -0,0 +1,30 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # @see VitableConnect::Resources::Employers#retrieve_benefit_plan_year + class EmployerRetrieveBenefitPlanYearParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + # @!attribute employer_id + # Unique employer identifier (empr\_\*) + # + # @return [String] + required :employer_id, String + + # @!attribute benefit_plan_year_id + # Unique benefit-plan-year identifier (plyr\_\*). + # + # @return [String] + required :benefit_plan_year_id, String + + # @!method initialize(employer_id:, benefit_plan_year_id:, request_options: {}) + # @param employer_id [String] Unique employer identifier (empr\_\*) + # + # @param benefit_plan_year_id [String] Unique benefit-plan-year identifier (plyr\_\*). + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}] + end + end +end diff --git a/lib/vitable_connect/models/employer_retrieve_benefit_plan_year_response.rb b/lib/vitable_connect/models/employer_retrieve_benefit_plan_year_response.rb new file mode 100644 index 0000000..de6e208 --- /dev/null +++ b/lib/vitable_connect/models/employer_retrieve_benefit_plan_year_response.rb @@ -0,0 +1,850 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # @see VitableConnect::Resources::Employers#retrieve_benefit_plan_year + class EmployerRetrieveBenefitPlanYearResponse < VitableConnect::Internal::Type::BaseModel + # @!attribute data + # One plan year, detail view. + # + # Standalone (no shared base) so the exact detail payload is readable in one + # place; the list serializer is a separate class even where fields overlap. Detail + # carries the SPD link and omits the list-only `is_current` flag. + # + # @return [VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data] + required :data, -> { VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data } + + # @!method initialize(data:) + # Some parameter documentations has been truncated, see + # {VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse} for more + # details. + # + # Response containing a single employer benefit plan year resource. + # + # @param data [VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data] One plan year, detail view. + + # @see VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse#data + class Data < VitableConnect::Internal::Type::BaseModel + # @!attribute benefit_id + # Prefixed benefit identifier (`bprd_*`). + # + # @return [String] + required :benefit_id, String + + # @!attribute benefit_plan_year_id + # Prefixed plan-year identifier (`plyr_*`). + # + # @return [String] + required :benefit_plan_year_id, String + + # @!attribute carrier + # Carrier name, or null (e.g. ICHRA). + # + # @return [String, nil] + required :carrier, String, nil?: true + + # @!attribute contribution_strategy + # How the plan year prices contributions: exactly one collection is populated, + # determined by the plan year's `family` (ICHRA vs tier-priced). + # + # @return [VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy] + required :contribution_strategy, + -> { VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy } + + # @!attribute coverage_end + # Coverage end. + # + # @return [Date, nil] + required :coverage_end, Date, nil?: true + + # @!attribute coverage_start + # Coverage start. + # + # @return [Date] + required :coverage_start, Date + + # @!attribute eligibility_policy + # The plan year's active eligibility policy. Mirrors the internal + # `PlanYearEligibilityPolicyDTO` but exposes only the public subset (no raw ids, + # `active_in`, or timestamps). + # + # @return [VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy, nil] + required :eligibility_policy, + -> { VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy }, + nil?: true + + # @!attribute employee_contribution + # Employee contribution range. + # + # @return [VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EmployeeContribution, nil] + required :employee_contribution, + -> { VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EmployeeContribution }, + nil?: true + + # @!attribute employer_contribution + # Employer contribution range. + # + # @return [VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EmployerContribution, nil] + required :employer_contribution, + -> { VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EmployerContribution }, + nil?: true + + # @!attribute enrollment_rate + # Enrolled/eligible rate for this plan year. + # + # @return [VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EnrollmentRate] + required :enrollment_rate, + -> { VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EnrollmentRate } + + # @!attribute family + # - `mec` - Mec + # - `mvp` - Mvp + # - `ichra` - Ichra + # - `vpc` - Vpc + # - `dental` - Dental + # - `vision` - Vision + # + # @return [Symbol, VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::Family] + required :family, + enum: -> { VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::Family } + + # @!attribute network_names + # Displayed networks: ["multi"] for ICHRA, otherwise the plan year's distinct + # network names. + # + # @return [Array] + required :network_names, VitableConnect::Internal::Type::ArrayOf[String] + + # @!attribute offered_states + # Distinct offered state codes. + # + # @return [Array] + required :offered_states, VitableConnect::Internal::Type::ArrayOf[String] + + # @!attribute open_enrollment_end + # Open-enrollment end. + # + # @return [Date, nil] + required :open_enrollment_end, Date, nil?: true + + # @!attribute open_enrollment_start + # Open-enrollment start. + # + # @return [Date] + required :open_enrollment_start, Date + + # @!attribute premium_in_cents + # Monthly premium in cents; only for an ICHRA benefit with effective coverage. + # + # @return [Integer, nil] + required :premium_in_cents, Integer, nil?: true + + # @!attribute product_name + # Benefit/product display name. + # + # @return [String] + required :product_name, String + + # @!attribute spd_file_url + # Summary Plan Description (SPD) link, or null. + # + # @return [String, nil] + required :spd_file_url, String, nil?: true + + # @!attribute status + # - `active` - Active + # - `upcoming` - Upcoming + # - `open_enrollment` - Open Enrollment + # - `inactive` - Inactive + # + # @return [Symbol, VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::Status] + required :status, + enum: -> { VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::Status } + + # @!attribute year + # Calendar coverage year. + # + # @return [Integer] + required :year, Integer + + # @!method initialize(benefit_id:, benefit_plan_year_id:, carrier:, contribution_strategy:, coverage_end:, coverage_start:, eligibility_policy:, employee_contribution:, employer_contribution:, enrollment_rate:, family:, network_names:, offered_states:, open_enrollment_end:, open_enrollment_start:, premium_in_cents:, product_name:, spd_file_url:, status:, year:) + # Some parameter documentations has been truncated, see + # {VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data} for more + # details. + # + # One plan year, detail view. + # + # Standalone (no shared base) so the exact detail payload is readable in one + # place; the list serializer is a separate class even where fields overlap. Detail + # carries the SPD link and omits the list-only `is_current` flag. + # + # @param benefit_id [String] Prefixed benefit identifier (`bprd_*`). + # + # @param benefit_plan_year_id [String] Prefixed plan-year identifier (`plyr_*`). + # + # @param carrier [String, nil] Carrier name, or null (e.g. ICHRA). + # + # @param contribution_strategy [VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy] How the plan year prices contributions: exactly one collection is populated, det + # + # @param coverage_end [Date, nil] Coverage end. + # + # @param coverage_start [Date] Coverage start. + # + # @param eligibility_policy [VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy, nil] The plan year's active eligibility policy. Mirrors the internal ``PlanYearEligib + # + # @param employee_contribution [VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EmployeeContribution, nil] Employee contribution range. + # + # @param employer_contribution [VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EmployerContribution, nil] Employer contribution range. + # + # @param enrollment_rate [VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EnrollmentRate] Enrolled/eligible rate for this plan year. + # + # @param family [Symbol, VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::Family] - `mec` - Mec + # + # @param network_names [Array] Displayed networks: ["multi"] for ICHRA, otherwise the plan year's distinct netw + # + # @param offered_states [Array] Distinct offered state codes. + # + # @param open_enrollment_end [Date, nil] Open-enrollment end. + # + # @param open_enrollment_start [Date] Open-enrollment start. + # + # @param premium_in_cents [Integer, nil] Monthly premium in cents; only for an ICHRA benefit with effective coverage. + # + # @param product_name [String] Benefit/product display name. + # + # @param spd_file_url [String, nil] Summary Plan Description (SPD) link, or null. + # + # @param status [Symbol, VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::Status] - `active` - Active + # + # @param year [Integer] Calendar coverage year. + + # @see VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data#contribution_strategy + class ContributionStrategy < VitableConnect::Internal::Type::BaseModel + # @!attribute contribution_tiers + # Coverage tiers and their costs; empty for ICHRA benefits. + # + # @return [Array] + required :contribution_tiers, + -> do + VitableConnect::Internal::Type::ArrayOf[ + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::ContributionTier + ] + end + + # @!attribute ichra_contribution_classes + # ICHRA contribution classes; empty for tier-priced benefits. + # + # @return [Array] + required :ichra_contribution_classes, + -> do + VitableConnect::Internal::Type::ArrayOf[ + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass + ] + end + + # @!method initialize(contribution_tiers:, ichra_contribution_classes:) + # How the plan year prices contributions: exactly one collection is populated, + # determined by the plan year's `family` (ICHRA vs tier-priced). + # + # @param contribution_tiers [Array] Coverage tiers and their costs; empty for ICHRA benefits. + # + # @param ichra_contribution_classes [Array] ICHRA contribution classes; empty for tier-priced benefits. + + class ContributionTier < VitableConnect::Internal::Type::BaseModel + # @!attribute benefit_plan_id + # Prefixed benefit-plan identifier (`bpln_*`). + # + # @return [String] + required :benefit_plan_id, String + + # @!attribute benefit_plan_name + # Benefit plan name. + # + # @return [String] + required :benefit_plan_name, String + + # @!attribute benefit_plan_tier_name + # Coverage-tier name. + # + # @return [String] + required :benefit_plan_tier_name, String + + # @!attribute cost + # Monthly employee deduction in cents. + # + # @return [Integer] + required :cost, Integer + + # @!attribute cost_per_dependent + # Monthly employee deduction per dependent, in cents. + # + # @return [Integer] + required :cost_per_dependent, Integer + + # @!attribute coverage_tier + # - `Unspecified` - Unspecified + # - `EE` - EE + # - `ES` - ES + # - `EC` - EC + # - `EF` - EF + # + # @return [Symbol, VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::ContributionTier::CoverageTier] + required :coverage_tier, + enum: -> { VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::ContributionTier::CoverageTier } + + # @!attribute dependents_required_in + # Whether dependents are required for this tier. + # + # @return [Boolean] + required :dependents_required_in, VitableConnect::Internal::Type::Boolean + + # @!attribute spouse_required_in + # Whether a spouse is required for this tier. + # + # @return [Boolean] + required :spouse_required_in, VitableConnect::Internal::Type::Boolean + + # @!method initialize(benefit_plan_id:, benefit_plan_name:, benefit_plan_tier_name:, cost:, cost_per_dependent:, coverage_tier:, dependents_required_in:, spouse_required_in:) + # Some parameter documentations has been truncated, see + # {VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::ContributionTier} + # for more details. + # + # One non-ICHRA coverage tier, mirroring the internal configuration + # `CompanyBenefitPlanTierCostDTO` minus the tier-cost id, `pepm` and + # `pepm_per_dependent`; `benefit_plan_id` is the prefixed `bpln_*` form rather + # than a raw UUID. + # + # @param benefit_plan_id [String] Prefixed benefit-plan identifier (`bpln_*`). + # + # @param benefit_plan_name [String] Benefit plan name. + # + # @param benefit_plan_tier_name [String] Coverage-tier name. + # + # @param cost [Integer] Monthly employee deduction in cents. + # + # @param cost_per_dependent [Integer] Monthly employee deduction per dependent, in cents. + # + # @param coverage_tier [Symbol, VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::ContributionTier::CoverageTier] - `Unspecified` - Unspecified + # + # @param dependents_required_in [Boolean] Whether dependents are required for this tier. + # + # @param spouse_required_in [Boolean] Whether a spouse is required for this tier. + + # - `Unspecified` - Unspecified + # - `EE` - EE + # - `ES` - ES + # - `EC` - EC + # - `EF` - EF + # + # @see VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::ContributionTier#coverage_tier + module CoverageTier + extend VitableConnect::Internal::Type::Enum + + UNSPECIFIED = :Unspecified + EE = :EE + ES = :ES + EC = :EC + EF = :EF + + # @!method self.values + # @return [Array] + end + end + + class IchraContributionClass < VitableConnect::Internal::Type::BaseModel + # @!attribute amount_in_cents + # Monthly allowance in cents. + # + # @return [Integer] + required :amount_in_cents, Integer + + # @!attribute compensation + # - `Unspecified` - Unspecified + # - `Salary` - Salary + # - `Hourly` - Hourly + # + # @return [Symbol, VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass::Compensation] + required :compensation, + enum: -> { VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass::Compensation } + + # @!attribute contribution_class_id + # Prefixed contribution-class identifier (`iccl_*`). + # + # @return [String] + required :contribution_class_id, String + + # @!attribute employment + # - `Unspecified` - Unspecified + # - `Full Time` - Full Time + # - `Part Time` - Part Time + # - `Temporary` - Temporary + # - `Seasonal` - Seasonal + # + # @return [Symbol, VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass::Employment] + required :employment, + enum: -> { VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass::Employment } + + # @!attribute family_status + # - `Unspecified` - Unspecified + # - `EE` - EE + # - `ES` - ES + # - `EC` - EC + # - `EF` - EF + # + # @return [Symbol, VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass::FamilyStatus] + required :family_status, + enum: -> { VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass::FamilyStatus } + + # @!attribute location + # - `Unspecified` - Unspecified + # - `State` - State + # + # @return [Symbol, VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass::Location] + required :location, + enum: -> { VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass::Location } + + # @!attribute location_value + # Location matcher value (CSV of state codes), or null. + # + # @return [String, nil] + required :location_value, String, nil?: true + + # @!attribute max_age + # Age-band upper bound, or null. + # + # @return [Integer, nil] + required :max_age, Integer, nil?: true + + # @!attribute min_age + # Age-band lower bound, or null. + # + # @return [Integer, nil] + required :min_age, Integer, nil?: true + + # @!method initialize(amount_in_cents:, compensation:, contribution_class_id:, employment:, family_status:, location:, location_value:, max_age:, min_age:) + # Some parameter documentations has been truncated, see + # {VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass} + # for more details. + # + # One ICHRA contribution class, mirroring the internal configuration endpoint's + # `IchraContributionClassConfigurationEntitySerializer` field-for-field. Two + # deliberate differences for the public surface: the identifier is the opaque + # prefixed `iccl_*` form rather than a raw UUID, and the matcher choices come from + # the domain enums rather than the model's. + # + # @param amount_in_cents [Integer] Monthly allowance in cents. + # + # @param compensation [Symbol, VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass::Compensation] - `Unspecified` - Unspecified + # + # @param contribution_class_id [String] Prefixed contribution-class identifier (`iccl_*`). + # + # @param employment [Symbol, VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass::Employment] - `Unspecified` - Unspecified + # + # @param family_status [Symbol, VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass::FamilyStatus] - `Unspecified` - Unspecified + # + # @param location [Symbol, VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass::Location] - `Unspecified` - Unspecified + # + # @param location_value [String, nil] Location matcher value (CSV of state codes), or null. + # + # @param max_age [Integer, nil] Age-band upper bound, or null. + # + # @param min_age [Integer, nil] Age-band lower bound, or null. + + # - `Unspecified` - Unspecified + # - `Salary` - Salary + # - `Hourly` - Hourly + # + # @see VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass#compensation + module Compensation + extend VitableConnect::Internal::Type::Enum + + UNSPECIFIED = :Unspecified + SALARY = :Salary + HOURLY = :Hourly + + # @!method self.values + # @return [Array] + end + + # - `Unspecified` - Unspecified + # - `Full Time` - Full Time + # - `Part Time` - Part Time + # - `Temporary` - Temporary + # - `Seasonal` - Seasonal + # + # @see VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass#employment + module Employment + extend VitableConnect::Internal::Type::Enum + + UNSPECIFIED = :Unspecified + FULL_TIME = :"Full Time" + PART_TIME = :"Part Time" + TEMPORARY = :Temporary + SEASONAL = :Seasonal + + # @!method self.values + # @return [Array] + end + + # - `Unspecified` - Unspecified + # - `EE` - EE + # - `ES` - ES + # - `EC` - EC + # - `EF` - EF + # + # @see VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass#family_status + module FamilyStatus + extend VitableConnect::Internal::Type::Enum + + UNSPECIFIED = :Unspecified + EE = :EE + ES = :ES + EC = :EC + EF = :EF + + # @!method self.values + # @return [Array] + end + + # - `Unspecified` - Unspecified + # - `State` - State + # + # @see VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass#location + module Location + extend VitableConnect::Internal::Type::Enum + + UNSPECIFIED = :Unspecified + STATE = :State + + # @!method self.values + # @return [Array] + end + end + end + + # @see VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data#eligibility_policy + class EligibilityPolicy < VitableConnect::Internal::Type::BaseModel + # @!attribute rules + # Eligibility rules; never empty for a valid policy. + # + # @return [Array] + required :rules, + -> { VitableConnect::Internal::Type::ArrayOf[VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::Rule] } + + # @!attribute termination_n_months + # Months of continued coverage; set only when `termination_rule` is + # `END_OF_N_MONTHS`. + # + # @return [Integer, nil] + required :termination_n_months, Integer, nil?: true + + # @!attribute termination_rule + # - `END_OF_N_MONTHS` - End Of N Months + # - `END_OF_PLAN_YEAR` - End Of Plan Year + # + # @return [Symbol, VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::TerminationRule] + required :termination_rule, + enum: -> { VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::TerminationRule } + + # @!attribute waiting_period + # - `FIRST_OF_FOLLOWING_MONTH` - First Of Following Month + # - `THIRTY_DAYS` - Thirty Days + # - `SIXTY_DAYS` - Sixty Days + # + # @return [Symbol, VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::WaitingPeriod, nil] + required :waiting_period, + enum: -> { VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::WaitingPeriod }, + nil?: true + + # @!method initialize(rules:, termination_n_months:, termination_rule:, waiting_period:) + # Some parameter documentations has been truncated, see + # {VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy} + # for more details. + # + # The plan year's active eligibility policy. Mirrors the internal + # `PlanYearEligibilityPolicyDTO` but exposes only the public subset (no raw ids, + # `active_in`, or timestamps). + # + # @param rules [Array] Eligibility rules; never empty for a valid policy. + # + # @param termination_n_months [Integer, nil] Months of continued coverage; set only when `termination_rule` is `END_OF_N_MONT + # + # @param termination_rule [Symbol, VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::TerminationRule] - `END_OF_N_MONTHS` - End Of N Months + # + # @param waiting_period [Symbol, VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::WaitingPeriod, nil] - `FIRST_OF_FOLLOWING_MONTH` - First Of Following Month + + class Rule < VitableConnect::Internal::Type::BaseModel + # @!attribute compensation_type + # - `Salary` - Salary + # - `Hourly` - Hourly + # - `All` - All + # + # @return [Symbol, VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::Rule::CompensationType] + required :compensation_type, + enum: -> { VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::Rule::CompensationType } + + # @!attribute eligible_geographical_location + # Geographic matcher. + # + # @return [VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::Rule::EligibleGeographicalLocation] + required :eligible_geographical_location, + -> { VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::Rule::EligibleGeographicalLocation } + + # @!attribute employee_class + # - `Full Time` - Full Time + # - `Part Time` - Part Time + # - `Temporary` - Temporary + # - `Intern` - Intern + # - `Seasonal` - Seasonal + # - `Individual Contractor` - Individual Contractor + # - `All` - All + # + # @return [Symbol, VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::Rule::EmployeeClass] + required :employee_class, + enum: -> { VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::Rule::EmployeeClass } + + # @!method initialize(compensation_type:, eligible_geographical_location:, employee_class:) + # Some parameter documentations has been truncated, see + # {VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::Rule} + # for more details. + # + # One eligibility rule — the workforce slice it makes eligible. Mirrors the + # internal `PlanYearEligibilityPolicyRuleDTO` minus the raw ids and timestamps. + # + # @param compensation_type [Symbol, VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::Rule::CompensationType] - `Salary` - Salary + # + # @param eligible_geographical_location [VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::Rule::EligibleGeographicalLocation] Geographic matcher. + # + # @param employee_class [Symbol, VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::Rule::EmployeeClass] - `Full Time` - Full Time + + # - `Salary` - Salary + # - `Hourly` - Hourly + # - `All` - All + # + # @see VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::Rule#compensation_type + module CompensationType + extend VitableConnect::Internal::Type::Enum + + SALARY = :Salary + HOURLY = :Hourly + ALL = :All + + # @!method self.values + # @return [Array] + end + + # @see VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::Rule#eligible_geographical_location + class EligibleGeographicalLocation < VitableConnect::Internal::Type::BaseModel + # @!attribute state_codes + # States the rule is restricted to; empty when `type` is `All`. + # + # @return [Array] + required :state_codes, VitableConnect::Internal::Type::ArrayOf[String] + + # @!attribute type + # - `All` - All + # - `StateCodes` - State Codes + # + # @return [Symbol, VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::Rule::EligibleGeographicalLocation::Type] + required :type, + enum: -> { VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::Rule::EligibleGeographicalLocation::Type } + + # @!method initialize(state_codes:, type:) + # Some parameter documentations has been truncated, see + # {VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::Rule::EligibleGeographicalLocation} + # for more details. + # + # Geographic matcher. + # + # @param state_codes [Array] States the rule is restricted to; empty when `type` is `All`. + # + # @param type [Symbol, VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::Rule::EligibleGeographicalLocation::Type] - `All` - All + + # - `All` - All + # - `StateCodes` - State Codes + # + # @see VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::Rule::EligibleGeographicalLocation#type + module Type + extend VitableConnect::Internal::Type::Enum + + ALL = :All + STATE_CODES = :StateCodes + + # @!method self.values + # @return [Array] + end + end + + # - `Full Time` - Full Time + # - `Part Time` - Part Time + # - `Temporary` - Temporary + # - `Intern` - Intern + # - `Seasonal` - Seasonal + # - `Individual Contractor` - Individual Contractor + # - `All` - All + # + # @see VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::Rule#employee_class + module EmployeeClass + extend VitableConnect::Internal::Type::Enum + + FULL_TIME = :"Full Time" + PART_TIME = :"Part Time" + TEMPORARY = :Temporary + INTERN = :Intern + SEASONAL = :Seasonal + INDIVIDUAL_CONTRACTOR = :"Individual Contractor" + ALL = :All + + # @!method self.values + # @return [Array] + end + end + + # - `END_OF_N_MONTHS` - End Of N Months + # - `END_OF_PLAN_YEAR` - End Of Plan Year + # + # @see VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy#termination_rule + module TerminationRule + extend VitableConnect::Internal::Type::Enum + + END_OF_N_MONTHS = :END_OF_N_MONTHS + END_OF_PLAN_YEAR = :END_OF_PLAN_YEAR + + # @!method self.values + # @return [Array] + end + + # - `FIRST_OF_FOLLOWING_MONTH` - First Of Following Month + # - `THIRTY_DAYS` - Thirty Days + # - `SIXTY_DAYS` - Sixty Days + # + # @see VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy#waiting_period + module WaitingPeriod + extend VitableConnect::Internal::Type::Enum + + FIRST_OF_FOLLOWING_MONTH = :FIRST_OF_FOLLOWING_MONTH + THIRTY_DAYS = :THIRTY_DAYS + SIXTY_DAYS = :SIXTY_DAYS + + # @!method self.values + # @return [Array] + end + end + + # @see VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data#employee_contribution + class EmployeeContribution < VitableConnect::Internal::Type::BaseModel + # @!attribute max_cents + # Highest per-tier contribution in cents. + # + # @return [Integer] + required :max_cents, Integer + + # @!attribute min_cents + # Lowest per-tier contribution in cents. + # + # @return [Integer] + required :min_cents, Integer + + # @!method initialize(max_cents:, min_cents:) + # Employee contribution range. + # + # @param max_cents [Integer] Highest per-tier contribution in cents. + # + # @param min_cents [Integer] Lowest per-tier contribution in cents. + end + + # @see VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data#employer_contribution + class EmployerContribution < VitableConnect::Internal::Type::BaseModel + # @!attribute max_cents + # Highest per-tier contribution in cents. + # + # @return [Integer] + required :max_cents, Integer + + # @!attribute min_cents + # Lowest per-tier contribution in cents. + # + # @return [Integer] + required :min_cents, Integer + + # @!method initialize(max_cents:, min_cents:) + # Employer contribution range. + # + # @param max_cents [Integer] Highest per-tier contribution in cents. + # + # @param min_cents [Integer] Lowest per-tier contribution in cents. + end + + # @see VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data#enrollment_rate + class EnrollmentRate < VitableConnect::Internal::Type::BaseModel + # @!attribute eligible + # Employees eligible for this plan year. + # + # @return [Integer] + required :eligible, Integer + + # @!attribute enrolled + # Employees enrolled in this plan year. + # + # @return [Integer] + required :enrolled, Integer + + # @!attribute percentage + # `enrolled / eligible` whole-number percent (0 when none). + # + # @return [Integer] + required :percentage, Integer + + # @!method initialize(eligible:, enrolled:, percentage:) + # Enrolled/eligible rate for this plan year. + # + # @param eligible [Integer] Employees eligible for this plan year. + # + # @param enrolled [Integer] Employees enrolled in this plan year. + # + # @param percentage [Integer] `enrolled / eligible` whole-number percent (0 when none). + end + + # - `mec` - Mec + # - `mvp` - Mvp + # - `ichra` - Ichra + # - `vpc` - Vpc + # - `dental` - Dental + # - `vision` - Vision + # + # @see VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data#family + module Family + extend VitableConnect::Internal::Type::Enum + + MEC = :mec + MVP = :mvp + ICHRA = :ichra + VPC = :vpc + DENTAL = :dental + VISION = :vision + + # @!method self.values + # @return [Array] + end + + # - `active` - Active + # - `upcoming` - Upcoming + # - `open_enrollment` - Open Enrollment + # - `inactive` - Inactive + # + # @see VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data#status + module Status + extend VitableConnect::Internal::Type::Enum + + ACTIVE = :active + UPCOMING = :upcoming + OPEN_ENROLLMENT = :open_enrollment + INACTIVE = :inactive + + # @!method self.values + # @return [Array] + end + end + end + end +end diff --git a/lib/vitable_connect/models/employer_retrieve_hris_params.rb b/lib/vitable_connect/models/employer_retrieve_hris_params.rb new file mode 100644 index 0000000..fd52db3 --- /dev/null +++ b/lib/vitable_connect/models/employer_retrieve_hris_params.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # @see VitableConnect::Resources::Employers#retrieve_hris + class EmployerRetrieveHRISParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + # @!attribute employer_id + # Unique employer identifier (empr\_\*) + # + # @return [String] + required :employer_id, String + + # @!method initialize(employer_id:, request_options: {}) + # @param employer_id [String] Unique employer identifier (empr\_\*) + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}] + end + end +end diff --git a/lib/vitable_connect/models/employer_retrieve_hris_response.rb b/lib/vitable_connect/models/employer_retrieve_hris_response.rb new file mode 100644 index 0000000..213b960 --- /dev/null +++ b/lib/vitable_connect/models/employer_retrieve_hris_response.rb @@ -0,0 +1,80 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # @see VitableConnect::Resources::Employers#retrieve_hris + class EmployerRetrieveHRISResponse < VitableConnect::Internal::Type::BaseModel + # @!attribute data + # + # @return [VitableConnect::Models::EmployerRetrieveHRISResponse::Data] + required :data, -> { VitableConnect::Models::EmployerRetrieveHRISResponse::Data } + + # @!method initialize(data:) + # Response containing a single employer hris resource. + # + # @param data [VitableConnect::Models::EmployerRetrieveHRISResponse::Data] + + # @see VitableConnect::Models::EmployerRetrieveHRISResponse#data + class Data < VitableConnect::Internal::Type::BaseModel + # @!attribute hris + # HRIS connection details, or null when the employer has no integration. + # + # @return [VitableConnect::Models::EmployerRetrieveHRISResponse::Data::HRIS, nil] + required :hris, -> { VitableConnect::Models::EmployerRetrieveHRISResponse::Data::HRIS }, nil?: true + + # @!method initialize(hris:) + # @param hris [VitableConnect::Models::EmployerRetrieveHRISResponse::Data::HRIS, nil] HRIS connection details, or null when the employer has no integration. + + # @see VitableConnect::Models::EmployerRetrieveHRISResponse::Data#hris + class HRIS < VitableConnect::Internal::Type::BaseModel + # @!attribute last_sync_on + # When the last sync completed, or null when none has. + # + # @return [Time, nil] + required :last_sync_on, Time, nil?: true + + # @!attribute provider + # Id of the HRIS/payroll provider the employer is connected to (e.g. `paylocity`). + # + # @return [String] + required :provider, String + + # @!attribute provider_label + # Display name of that provider (e.g. `Paylocity`). + # + # @return [String] + required :provider_label, String + + # @!attribute status + # Connection status reported by the integration. + # + # @return [String] + required :status, String + + # @!attribute synced_row_count + # Rows in the latest completed sync, or null when none has. + # + # @return [Integer, nil] + required :synced_row_count, Integer, nil?: true + + # @!method initialize(last_sync_on:, provider:, provider_label:, status:, synced_row_count:) + # Some parameter documentations has been truncated, see + # {VitableConnect::Models::EmployerRetrieveHRISResponse::Data::HRIS} for more + # details. + # + # HRIS connection details, or null when the employer has no integration. + # + # @param last_sync_on [Time, nil] When the last sync completed, or null when none has. + # + # @param provider [String] Id of the HRIS/payroll provider the employer is connected to (e.g. `paylocity`). + # + # @param provider_label [String] Display name of that provider (e.g. `Paylocity`). + # + # @param status [String] Connection status reported by the integration. + # + # @param synced_row_count [Integer, nil] Rows in the latest completed sync, or null when none has. + end + end + end + end +end diff --git a/lib/vitable_connect/models/employer_retrieve_invoice_pdf_params.rb b/lib/vitable_connect/models/employer_retrieve_invoice_pdf_params.rb new file mode 100644 index 0000000..34085ea --- /dev/null +++ b/lib/vitable_connect/models/employer_retrieve_invoice_pdf_params.rb @@ -0,0 +1,30 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # @see VitableConnect::Resources::Employers#retrieve_invoice_pdf + class EmployerRetrieveInvoicePdfParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + # @!attribute employer_id + # Unique employer identifier (empr\_\*) + # + # @return [String] + required :employer_id, String + + # @!attribute invoice_id + # External Chargebee invoice id (not a prefixed UUID). + # + # @return [String] + required :invoice_id, String + + # @!method initialize(employer_id:, invoice_id:, request_options: {}) + # @param employer_id [String] Unique employer identifier (empr\_\*) + # + # @param invoice_id [String] External Chargebee invoice id (not a prefixed UUID). + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}] + end + end +end diff --git a/lib/vitable_connect/models/employer_retrieve_invoice_pdf_response.rb b/lib/vitable_connect/models/employer_retrieve_invoice_pdf_response.rb new file mode 100644 index 0000000..90261f5 --- /dev/null +++ b/lib/vitable_connect/models/employer_retrieve_invoice_pdf_response.rb @@ -0,0 +1,30 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # @see VitableConnect::Resources::Employers#retrieve_invoice_pdf + class EmployerRetrieveInvoicePdfResponse < VitableConnect::Internal::Type::BaseModel + # @!attribute data + # + # @return [VitableConnect::Models::EmployerRetrieveInvoicePdfResponse::Data] + required :data, -> { VitableConnect::Models::EmployerRetrieveInvoicePdfResponse::Data } + + # @!method initialize(data:) + # Response containing a single employer invoice pdf resource. + # + # @param data [VitableConnect::Models::EmployerRetrieveInvoicePdfResponse::Data] + + # @see VitableConnect::Models::EmployerRetrieveInvoicePdfResponse#data + class Data < VitableConnect::Internal::Type::BaseModel + # @!attribute download_url + # Time-limited Chargebee PDF download link for the invoice. + # + # @return [String] + required :download_url, String + + # @!method initialize(download_url:) + # @param download_url [String] Time-limited Chargebee PDF download link for the invoice. + end + end + end +end diff --git a/lib/vitable_connect/models/employer_retrieve_params.rb b/lib/vitable_connect/models/employer_retrieve_params.rb new file mode 100644 index 0000000..24b8f11 --- /dev/null +++ b/lib/vitable_connect/models/employer_retrieve_params.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # @see VitableConnect::Resources::Employers#retrieve + class EmployerRetrieveParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + # @!attribute employer_id + # Unique employer identifier (empr\_\*) + # + # @return [String] + required :employer_id, String + + # @!method initialize(employer_id:, request_options: {}) + # @param employer_id [String] Unique employer identifier (empr\_\*) + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}] + end + end +end diff --git a/lib/vitable_connect/models/employer_retrieve_payroll_access_setup_params.rb b/lib/vitable_connect/models/employer_retrieve_payroll_access_setup_params.rb new file mode 100644 index 0000000..4f8e786 --- /dev/null +++ b/lib/vitable_connect/models/employer_retrieve_payroll_access_setup_params.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # @see VitableConnect::Resources::Employers#retrieve_payroll_access_setup + class EmployerRetrievePayrollAccessSetupParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + # @!attribute employer_id + # Unique employer identifier (empr\_\*) + # + # @return [String] + required :employer_id, String + + # @!method initialize(employer_id:, request_options: {}) + # @param employer_id [String] Unique employer identifier (empr\_\*) + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}] + end + end +end diff --git a/lib/vitable_connect/models/employer_retrieve_payroll_access_setup_response.rb b/lib/vitable_connect/models/employer_retrieve_payroll_access_setup_response.rb new file mode 100644 index 0000000..a2288d4 --- /dev/null +++ b/lib/vitable_connect/models/employer_retrieve_payroll_access_setup_response.rb @@ -0,0 +1,35 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # @see VitableConnect::Resources::Employers#retrieve_payroll_access_setup + class EmployerRetrievePayrollAccessSetupResponse < VitableConnect::Internal::Type::BaseModel + # @!attribute data + # + # @return [VitableConnect::Models::EmployerRetrievePayrollAccessSetupResponse::Data] + required :data, -> { VitableConnect::Models::EmployerRetrievePayrollAccessSetupResponse::Data } + + # @!method initialize(data:) + # Response containing a single payroll access setup status resource. + # + # @param data [VitableConnect::Models::EmployerRetrievePayrollAccessSetupResponse::Data] + + # @see VitableConnect::Models::EmployerRetrievePayrollAccessSetupResponse#data + class Data < VitableConnect::Internal::Type::BaseModel + # @!attribute completed + # + # @return [Boolean] + required :completed, VitableConnect::Internal::Type::Boolean + + # @!attribute submitted_at + # + # @return [Time, nil] + required :submitted_at, Time, nil?: true + + # @!method initialize(completed:, submitted_at:) + # @param completed [Boolean] + # @param submitted_at [Time, nil] + end + end + end +end diff --git a/lib/vitable_connect/models/employer_submit_census_sync_params.rb b/lib/vitable_connect/models/employer_submit_census_sync_params.rb new file mode 100644 index 0000000..f30b737 --- /dev/null +++ b/lib/vitable_connect/models/employer_submit_census_sync_params.rb @@ -0,0 +1,375 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # @see VitableConnect::Resources::Employers#submit_census_sync + class EmployerSubmitCensusSyncParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + # @!attribute employer_id + # Unique employer identifier (empr\_\*) + # + # @return [String] + required :employer_id, String + + # @!attribute employees + # + # @return [Array] + required :employees, + -> { VitableConnect::Internal::Type::ArrayOf[VitableConnect::EmployerSubmitCensusSyncParams::Employee] } + + # @!method initialize(employer_id:, employees:, request_options: {}) + # @param employer_id [String] Unique employer identifier (empr\_\*) + # + # @param employees [Array] + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}] + + class Employee < VitableConnect::Internal::Type::BaseModel + # @!attribute date_of_birth + # + # @return [Date] + required :date_of_birth, Date + + # @!attribute email + # + # @return [String] + required :email, String + + # @!attribute first_name + # + # @return [String] + required :first_name, String + + # @!attribute last_name + # + # @return [String] + required :last_name, String + + # @!attribute address + # + # @return [VitableConnect::Models::EmployerSubmitCensusSyncParams::Employee::Address, nil] + optional :address, + -> { + VitableConnect::EmployerSubmitCensusSyncParams::Employee::Address + }, + nil?: true + + # @!attribute compensation_type + # - `Salary` - Salary + # - `Hourly` - Hourly + # + # @return [Symbol, VitableConnect::Models::EmployerSubmitCensusSyncParams::Employee::CompensationType, nil] + optional :compensation_type, + enum: -> { VitableConnect::EmployerSubmitCensusSyncParams::Employee::CompensationType }, + nil?: true + + # @!attribute employee_class + # - `Full Time` - Full Time + # - `Part Time` - Part Time + # - `Temporary` - Temporary + # - `Intern` - Intern + # - `Seasonal` - Seasonal + # - `Individual Contractor` - Individual Contractor + # + # @return [Symbol, VitableConnect::Models::EmployeeClass, nil] + optional :employee_class, enum: -> { VitableConnect::EmployeeClass }, nil?: true + + # @!attribute phone + # Phone number + # + # @return [String, nil] + optional :phone, String, nil?: true + + # @!attribute reference_id + # + # @return [String, nil] + optional :reference_id, String, nil?: true + + # @!attribute start_date + # + # @return [Date, nil] + optional :start_date, Date, nil?: true + + # @!method initialize(date_of_birth:, email:, first_name:, last_name:, address: nil, compensation_type: nil, employee_class: nil, phone: nil, reference_id: nil, start_date: nil) + # Some parameter documentations has been truncated, see + # {VitableConnect::Models::EmployerSubmitCensusSyncParams::Employee} for more + # details. + # + # @param date_of_birth [Date] + # + # @param email [String] + # + # @param first_name [String] + # + # @param last_name [String] + # + # @param address [VitableConnect::Models::EmployerSubmitCensusSyncParams::Employee::Address, nil] + # + # @param compensation_type [Symbol, VitableConnect::Models::EmployerSubmitCensusSyncParams::Employee::CompensationType, nil] - `Salary` - Salary + # + # @param employee_class [Symbol, VitableConnect::Models::EmployeeClass, nil] - `Full Time` - Full Time + # + # @param phone [String, nil] Phone number + # + # @param reference_id [String, nil] + # + # @param start_date [Date, nil] + + # @see VitableConnect::Models::EmployerSubmitCensusSyncParams::Employee#address + class Address < VitableConnect::Internal::Type::BaseModel + # @!attribute address_line_1 + # + # @return [String] + required :address_line_1, String + + # @!attribute city + # + # @return [String] + required :city, String + + # @!attribute state + # - `AL` - AL + # - `AK` - AK + # - `AZ` - AZ + # - `AR` - AR + # - `CA` - CA + # - `CO` - CO + # - `CT` - CT + # - `DC` - DC + # - `DE` - DE + # - `FL` - FL + # - `GA` - GA + # - `HI` - HI + # - `ID` - ID + # - `IL` - IL + # - `IN` - IN + # - `IA` - IA + # - `KS` - KS + # - `KY` - KY + # - `LA` - LA + # - `ME` - ME + # - `MD` - MD + # - `MA` - MA + # - `MI` - MI + # - `MN` - MN + # - `MS` - MS + # - `MO` - MO + # - `MT` - MT + # - `NE` - NE + # - `NV` - NV + # - `NH` - NH + # - `NJ` - NJ + # - `NM` - NM + # - `NY` - NY + # - `NC` - NC + # - `ND` - ND + # - `OH` - OH + # - `OK` - OK + # - `OR` - OR + # - `PA` - PA + # - `RI` - RI + # - `SC` - SC + # - `SD` - SD + # - `TN` - TN + # - `TX` - TX + # - `UT` - UT + # - `VT` - VT + # - `VA` - VA + # - `WA` - WA + # - `WI` - WI + # - `WV` - WV + # - `WY` - WY + # - `PR` - PR + # - `GU` - GU + # - `AS` - AS + # - `VI` - VI + # - `MP` - MP + # - `MH` - MH + # - `PW` - PW + # - `FM` - FM + # - `AE` - AE + # - `AA` - AA + # - `AP` - AP + # + # @return [Symbol, VitableConnect::Models::EmployerSubmitCensusSyncParams::Employee::Address::State] + required :state, enum: -> { VitableConnect::EmployerSubmitCensusSyncParams::Employee::Address::State } + + # @!attribute zipcode + # + # @return [String] + required :zipcode, String + + # @!attribute address_line_2 + # + # @return [String, nil] + optional :address_line_2, String, nil?: true + + # @!method initialize(address_line_1:, city:, state:, zipcode:, address_line_2: nil) + # Some parameter documentations has been truncated, see + # {VitableConnect::Models::EmployerSubmitCensusSyncParams::Employee::Address} for + # more details. + # + # @param address_line_1 [String] + # + # @param city [String] + # + # @param state [Symbol, VitableConnect::Models::EmployerSubmitCensusSyncParams::Employee::Address::State] - `AL` - AL + # + # @param zipcode [String] + # + # @param address_line_2 [String, nil] + + # - `AL` - AL + # - `AK` - AK + # - `AZ` - AZ + # - `AR` - AR + # - `CA` - CA + # - `CO` - CO + # - `CT` - CT + # - `DC` - DC + # - `DE` - DE + # - `FL` - FL + # - `GA` - GA + # - `HI` - HI + # - `ID` - ID + # - `IL` - IL + # - `IN` - IN + # - `IA` - IA + # - `KS` - KS + # - `KY` - KY + # - `LA` - LA + # - `ME` - ME + # - `MD` - MD + # - `MA` - MA + # - `MI` - MI + # - `MN` - MN + # - `MS` - MS + # - `MO` - MO + # - `MT` - MT + # - `NE` - NE + # - `NV` - NV + # - `NH` - NH + # - `NJ` - NJ + # - `NM` - NM + # - `NY` - NY + # - `NC` - NC + # - `ND` - ND + # - `OH` - OH + # - `OK` - OK + # - `OR` - OR + # - `PA` - PA + # - `RI` - RI + # - `SC` - SC + # - `SD` - SD + # - `TN` - TN + # - `TX` - TX + # - `UT` - UT + # - `VT` - VT + # - `VA` - VA + # - `WA` - WA + # - `WI` - WI + # - `WV` - WV + # - `WY` - WY + # - `PR` - PR + # - `GU` - GU + # - `AS` - AS + # - `VI` - VI + # - `MP` - MP + # - `MH` - MH + # - `PW` - PW + # - `FM` - FM + # - `AE` - AE + # - `AA` - AA + # - `AP` - AP + # + # @see VitableConnect::Models::EmployerSubmitCensusSyncParams::Employee::Address#state + module State + extend VitableConnect::Internal::Type::Enum + + AL = :AL + AK = :AK + AZ = :AZ + AR = :AR + CA = :CA + CO = :CO + CT = :CT + DC = :DC + DE = :DE + FL = :FL + GA = :GA + HI = :HI + ID = :ID + IL = :IL + IN = :IN + IA = :IA + KS = :KS + KY = :KY + LA = :LA + ME = :ME + MD = :MD + MA = :MA + MI = :MI + MN = :MN + MS = :MS + MO = :MO + MT = :MT + NE = :NE + NV = :NV + NH = :NH + NJ = :NJ + NM = :NM + NY = :NY + NC = :NC + ND = :ND + OH = :OH + OK = :OK + OR = :OR + PA = :PA + RI = :RI + SC = :SC + SD = :SD + TN = :TN + TX = :TX + UT = :UT + VT = :VT + VA = :VA + WA = :WA + WI = :WI + WV = :WV + WY = :WY + PR = :PR + GU = :GU + AS = :AS + VI = :VI + MP = :MP + MH = :MH + PW = :PW + FM = :FM + AE = :AE + AA = :AA + AP = :AP + + # @!method self.values + # @return [Array] + end + end + + # - `Salary` - Salary + # - `Hourly` - Hourly + # + # @see VitableConnect::Models::EmployerSubmitCensusSyncParams::Employee#compensation_type + module CompensationType + extend VitableConnect::Internal::Type::Enum + + SALARY = :Salary + HOURLY = :Hourly + + # @!method self.values + # @return [Array] + end + end + end + end +end diff --git a/lib/vitable_connect/models/employer_submit_census_sync_response.rb b/lib/vitable_connect/models/employer_submit_census_sync_response.rb new file mode 100644 index 0000000..2f51072 --- /dev/null +++ b/lib/vitable_connect/models/employer_submit_census_sync_response.rb @@ -0,0 +1,35 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # @see VitableConnect::Resources::Employers#submit_census_sync + class EmployerSubmitCensusSyncResponse < VitableConnect::Internal::Type::BaseModel + # @!attribute data + # + # @return [VitableConnect::Models::EmployerSubmitCensusSyncResponse::Data] + required :data, -> { VitableConnect::Models::EmployerSubmitCensusSyncResponse::Data } + + # @!method initialize(data:) + # Response containing a single census sync detail resource. + # + # @param data [VitableConnect::Models::EmployerSubmitCensusSyncResponse::Data] + + # @see VitableConnect::Models::EmployerSubmitCensusSyncResponse#data + class Data < VitableConnect::Internal::Type::BaseModel + # @!attribute accepted_at + # + # @return [Time] + required :accepted_at, Time + + # @!attribute employer_id + # + # @return [String] + required :employer_id, String + + # @!method initialize(accepted_at:, employer_id:) + # @param accepted_at [Time] + # @param employer_id [String] + end + end + end +end diff --git a/lib/vitable_connect/models/employer_submit_payroll_access_setup_params.rb b/lib/vitable_connect/models/employer_submit_payroll_access_setup_params.rb new file mode 100644 index 0000000..8c7ef67 --- /dev/null +++ b/lib/vitable_connect/models/employer_submit_payroll_access_setup_params.rb @@ -0,0 +1,267 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # @see VitableConnect::Resources::Employers#submit_payroll_access_setup + class EmployerSubmitPayrollAccessSetupParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + # @!attribute employer_id + # Unique employer identifier (empr\_\*) + # + # @return [String] + required :employer_id, String + + # @!attribute access_method + # - `SELF_SETUP` - SELF_SETUP + # - `NEEDS_HELP` - NEEDS_HELP + # + # @return [Symbol, VitableConnect::Models::EmployerSubmitPayrollAccessSetupParams::AccessMethod] + required :access_method, enum: -> { VitableConnect::EmployerSubmitPayrollAccessSetupParams::AccessMethod } + + # @!attribute all_benefit_eligible_employees_present + # + # @return [Boolean] + required :all_benefit_eligible_employees_present, VitableConnect::Internal::Type::Boolean + + # @!attribute classifications_accurate + # + # @return [Boolean] + required :classifications_accurate, VitableConnect::Internal::Type::Boolean + + # @!attribute employees_in_payroll_acknowledged + # + # @return [Boolean] + required :employees_in_payroll_acknowledged, VitableConnect::Internal::Type::Boolean + + # @!attribute has_additional_payroll_system + # + # @return [Boolean] + required :has_additional_payroll_system, VitableConnect::Internal::Type::Boolean + + # @!attribute is_controlled_group + # + # @return [Boolean] + required :is_controlled_group, VitableConnect::Internal::Type::Boolean + + # @!attribute payroll_data_impacts_eligibility_acknowledged + # + # @return [Boolean] + required :payroll_data_impacts_eligibility_acknowledged, VitableConnect::Internal::Type::Boolean + + # @!attribute additional_access_method + # - `SELF_SETUP` - SELF_SETUP + # - `NEEDS_HELP` - NEEDS_HELP + # + # @return [Symbol, VitableConnect::Models::EmployerSubmitPayrollAccessSetupParams::AdditionalAccessMethod, nil] + optional :additional_access_method, + enum: -> { VitableConnect::EmployerSubmitPayrollAccessSetupParams::AdditionalAccessMethod }, + nil?: true + + # @!attribute additional_integration_confirmed + # + # @return [Boolean, nil] + optional :additional_integration_confirmed, VitableConnect::Internal::Type::Boolean, nil?: true + + # @!attribute additional_login_url + # + # @return [String, nil] + optional :additional_login_url, String, nil?: true + + # @!attribute additional_password + # + # @return [String, nil] + optional :additional_password, String, nil?: true + + # @!attribute additional_phone + # + # @return [String, nil] + optional :additional_phone, String, nil?: true + + # @!attribute additional_username + # + # @return [String, nil] + optional :additional_username, String, nil?: true + + # @!attribute classification_correction_source + # - `ENTER_NAMES` - ENTER_NAMES + # - `EMAIL_LIST` - EMAIL_LIST + # + # @return [Symbol, VitableConnect::Models::EmployerSubmitPayrollAccessSetupParams::ClassificationCorrectionSource, nil] + optional :classification_correction_source, + enum: -> { + VitableConnect::EmployerSubmitPayrollAccessSetupParams::ClassificationCorrectionSource + }, + nil?: true + + # @!attribute integration_confirmed + # + # @return [Boolean, nil] + optional :integration_confirmed, VitableConnect::Internal::Type::Boolean, nil?: true + + # @!attribute login_url + # + # @return [String, nil] + optional :login_url, String, nil?: true + + # @!attribute misclassified_employee_names + # + # @return [Array, nil] + optional :misclassified_employee_names, VitableConnect::Internal::Type::ArrayOf[String] + + # @!attribute missing_employee_resolution + # - `EMAIL_CENSUS` - EMAIL_CENSUS + # - `SECOND_SYSTEM_ACCESS` - SECOND_SYSTEM_ACCESS + # + # @return [Symbol, VitableConnect::Models::EmployerSubmitPayrollAccessSetupParams::MissingEmployeeResolution, nil] + optional :missing_employee_resolution, + enum: -> { VitableConnect::EmployerSubmitPayrollAccessSetupParams::MissingEmployeeResolution }, + nil?: true + + # @!attribute password + # + # @return [String, nil] + optional :password, String, nil?: true + + # @!attribute phone + # + # @return [String, nil] + optional :phone, String, nil?: true + + # @!attribute remaining_employee_action + # - `VITABLE_UPDATE` - VITABLE_UPDATE + # - `EMPLOYER_UPDATE` - EMPLOYER_UPDATE + # + # @return [Symbol, VitableConnect::Models::EmployerSubmitPayrollAccessSetupParams::RemainingEmployeeAction, nil] + optional :remaining_employee_action, + enum: -> { VitableConnect::EmployerSubmitPayrollAccessSetupParams::RemainingEmployeeAction }, + nil?: true + + # @!attribute same_payroll_covers_other_eins + # + # @return [Boolean, nil] + optional :same_payroll_covers_other_eins, VitableConnect::Internal::Type::Boolean, nil?: true + + # @!attribute username + # + # @return [String, nil] + optional :username, String, nil?: true + + # @!method initialize(employer_id:, access_method:, all_benefit_eligible_employees_present:, classifications_accurate:, employees_in_payroll_acknowledged:, has_additional_payroll_system:, is_controlled_group:, payroll_data_impacts_eligibility_acknowledged:, additional_access_method: nil, additional_integration_confirmed: nil, additional_login_url: nil, additional_password: nil, additional_phone: nil, additional_username: nil, classification_correction_source: nil, integration_confirmed: nil, login_url: nil, misclassified_employee_names: nil, missing_employee_resolution: nil, password: nil, phone: nil, remaining_employee_action: nil, same_payroll_covers_other_eins: nil, username: nil, request_options: {}) + # Some parameter documentations has been truncated, see + # {VitableConnect::Models::EmployerSubmitPayrollAccessSetupParams} for more + # details. + # + # @param employer_id [String] Unique employer identifier (empr\_\*) + # + # @param access_method [Symbol, VitableConnect::Models::EmployerSubmitPayrollAccessSetupParams::AccessMethod] - `SELF_SETUP` - SELF_SETUP + # + # @param all_benefit_eligible_employees_present [Boolean] + # + # @param classifications_accurate [Boolean] + # + # @param employees_in_payroll_acknowledged [Boolean] + # + # @param has_additional_payroll_system [Boolean] + # + # @param is_controlled_group [Boolean] + # + # @param payroll_data_impacts_eligibility_acknowledged [Boolean] + # + # @param additional_access_method [Symbol, VitableConnect::Models::EmployerSubmitPayrollAccessSetupParams::AdditionalAccessMethod, nil] - `SELF_SETUP` - SELF_SETUP + # + # @param additional_integration_confirmed [Boolean, nil] + # + # @param additional_login_url [String, nil] + # + # @param additional_password [String, nil] + # + # @param additional_phone [String, nil] + # + # @param additional_username [String, nil] + # + # @param classification_correction_source [Symbol, VitableConnect::Models::EmployerSubmitPayrollAccessSetupParams::ClassificationCorrectionSource, nil] - `ENTER_NAMES` - ENTER_NAMES + # + # @param integration_confirmed [Boolean, nil] + # + # @param login_url [String, nil] + # + # @param misclassified_employee_names [Array] + # + # @param missing_employee_resolution [Symbol, VitableConnect::Models::EmployerSubmitPayrollAccessSetupParams::MissingEmployeeResolution, nil] - `EMAIL_CENSUS` - EMAIL_CENSUS + # + # @param password [String, nil] + # + # @param phone [String, nil] + # + # @param remaining_employee_action [Symbol, VitableConnect::Models::EmployerSubmitPayrollAccessSetupParams::RemainingEmployeeAction, nil] - `VITABLE_UPDATE` - VITABLE_UPDATE + # + # @param same_payroll_covers_other_eins [Boolean, nil] + # + # @param username [String, nil] + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}] + + # - `SELF_SETUP` - SELF_SETUP + # - `NEEDS_HELP` - NEEDS_HELP + module AccessMethod + extend VitableConnect::Internal::Type::Enum + + SELF_SETUP = :SELF_SETUP + NEEDS_HELP = :NEEDS_HELP + + # @!method self.values + # @return [Array] + end + + # - `SELF_SETUP` - SELF_SETUP + # - `NEEDS_HELP` - NEEDS_HELP + module AdditionalAccessMethod + extend VitableConnect::Internal::Type::Enum + + SELF_SETUP = :SELF_SETUP + NEEDS_HELP = :NEEDS_HELP + + # @!method self.values + # @return [Array] + end + + # - `ENTER_NAMES` - ENTER_NAMES + # - `EMAIL_LIST` - EMAIL_LIST + module ClassificationCorrectionSource + extend VitableConnect::Internal::Type::Enum + + ENTER_NAMES = :ENTER_NAMES + EMAIL_LIST = :EMAIL_LIST + + # @!method self.values + # @return [Array] + end + + # - `EMAIL_CENSUS` - EMAIL_CENSUS + # - `SECOND_SYSTEM_ACCESS` - SECOND_SYSTEM_ACCESS + module MissingEmployeeResolution + extend VitableConnect::Internal::Type::Enum + + EMAIL_CENSUS = :EMAIL_CENSUS + SECOND_SYSTEM_ACCESS = :SECOND_SYSTEM_ACCESS + + # @!method self.values + # @return [Array] + end + + # - `VITABLE_UPDATE` - VITABLE_UPDATE + # - `EMPLOYER_UPDATE` - EMPLOYER_UPDATE + module RemainingEmployeeAction + extend VitableConnect::Internal::Type::Enum + + VITABLE_UPDATE = :VITABLE_UPDATE + EMPLOYER_UPDATE = :EMPLOYER_UPDATE + + # @!method self.values + # @return [Array] + end + end + end +end diff --git a/lib/vitable_connect/models/employer_submit_payroll_access_setup_response.rb b/lib/vitable_connect/models/employer_submit_payroll_access_setup_response.rb new file mode 100644 index 0000000..fab3224 --- /dev/null +++ b/lib/vitable_connect/models/employer_submit_payroll_access_setup_response.rb @@ -0,0 +1,35 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # @see VitableConnect::Resources::Employers#submit_payroll_access_setup + class EmployerSubmitPayrollAccessSetupResponse < VitableConnect::Internal::Type::BaseModel + # @!attribute data + # + # @return [VitableConnect::Models::EmployerSubmitPayrollAccessSetupResponse::Data] + required :data, -> { VitableConnect::Models::EmployerSubmitPayrollAccessSetupResponse::Data } + + # @!method initialize(data:) + # Response containing a single payroll access setup status resource. + # + # @param data [VitableConnect::Models::EmployerSubmitPayrollAccessSetupResponse::Data] + + # @see VitableConnect::Models::EmployerSubmitPayrollAccessSetupResponse#data + class Data < VitableConnect::Internal::Type::BaseModel + # @!attribute completed + # + # @return [Boolean] + required :completed, VitableConnect::Internal::Type::Boolean + + # @!attribute submitted_at + # + # @return [Time, nil] + required :submitted_at, Time, nil?: true + + # @!method initialize(completed:, submitted_at:) + # @param completed [Boolean] + # @param submitted_at [Time, nil] + end + end + end +end diff --git a/lib/vitable_connect/models/employer_update_params.rb b/lib/vitable_connect/models/employer_update_params.rb new file mode 100644 index 0000000..c504b83 --- /dev/null +++ b/lib/vitable_connect/models/employer_update_params.rb @@ -0,0 +1,99 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # @see VitableConnect::Resources::Employers#update + class EmployerUpdateParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + # @!attribute employer_id + # Unique employer identifier (empr\_\*) + # + # @return [String] + required :employer_id, String + + # @!attribute active + # Whether the employer is active + # + # @return [Boolean, nil] + optional :active, VitableConnect::Internal::Type::Boolean, nil?: true + + # @!attribute address + # Employer address + # + # @return [VitableConnect::Models::EmployerUpdateParams::Address, nil] + optional :address, -> { VitableConnect::EmployerUpdateParams::Address }, nil?: true + + # @!attribute legal_name + # Legal business name + # + # @return [String, nil] + optional :legal_name, String, nil?: true + + # @!attribute name + # Employer display name + # + # @return [String, nil] + optional :name, String, nil?: true + + # @!method initialize(employer_id:, active: nil, address: nil, legal_name: nil, name: nil, request_options: {}) + # @param employer_id [String] Unique employer identifier (empr\_\*) + # + # @param active [Boolean, nil] Whether the employer is active + # + # @param address [VitableConnect::Models::EmployerUpdateParams::Address, nil] Employer address + # + # @param legal_name [String, nil] Legal business name + # + # @param name [String, nil] Employer display name + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}] + + class Address < VitableConnect::Internal::Type::BaseModel + # @!attribute address_line_1 + # Primary street address + # + # @return [String] + required :address_line_1, String + + # @!attribute city + # City name + # + # @return [String] + required :city, String + + # @!attribute state + # Two-letter state code + # + # @return [String] + required :state, String + + # @!attribute zipcode + # ZIP code + # + # @return [String] + required :zipcode, String + + # @!attribute address_line_2 + # Secondary street address + # + # @return [String, nil] + optional :address_line_2, String, nil?: true + + # @!method initialize(address_line_1:, city:, state:, zipcode:, address_line_2: nil) + # Employer address + # + # @param address_line_1 [String] Primary street address + # + # @param city [String] City name + # + # @param state [String] Two-letter state code + # + # @param zipcode [String] ZIP code + # + # @param address_line_2 [String, nil] Secondary street address + end + end + end +end diff --git a/lib/vitable_connect/models/employer_update_settings_params.rb b/lib/vitable_connect/models/employer_update_settings_params.rb new file mode 100644 index 0000000..c545939 --- /dev/null +++ b/lib/vitable_connect/models/employer_update_settings_params.rb @@ -0,0 +1,52 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # @see VitableConnect::Resources::Employers#update_settings + class EmployerUpdateSettingsParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + # @!attribute employer_id + # Unique employer identifier (empr\_\*) + # + # @return [String] + required :employer_id, String + + # @!attribute pay_frequency + # - `weekly` - Weekly + # - `bi_weekly` - Bi Weekly + # - `semi_monthly` - Semi Monthly + # - `monthly` - Monthly + # + # @return [Symbol, VitableConnect::Models::EmployerUpdateSettingsParams::PayFrequency] + required :pay_frequency, enum: -> { VitableConnect::EmployerUpdateSettingsParams::PayFrequency } + + # @!method initialize(employer_id:, pay_frequency:, request_options: {}) + # Some parameter documentations has been truncated, see + # {VitableConnect::Models::EmployerUpdateSettingsParams} for more details. + # + # @param employer_id [String] Unique employer identifier (empr\_\*) + # + # @param pay_frequency [Symbol, VitableConnect::Models::EmployerUpdateSettingsParams::PayFrequency] - `weekly` - Weekly + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}] + + # - `weekly` - Weekly + # - `bi_weekly` - Bi Weekly + # - `semi_monthly` - Semi Monthly + # - `monthly` - Monthly + module PayFrequency + extend VitableConnect::Internal::Type::Enum + + WEEKLY = :weekly + BI_WEEKLY = :bi_weekly + SEMI_MONTHLY = :semi_monthly + MONTHLY = :monthly + + # @!method self.values + # @return [Array] + end + end + end +end diff --git a/lib/vitable_connect/models/employer_update_settings_response.rb b/lib/vitable_connect/models/employer_update_settings_response.rb new file mode 100644 index 0000000..5cbfc11 --- /dev/null +++ b/lib/vitable_connect/models/employer_update_settings_response.rb @@ -0,0 +1,56 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # @see VitableConnect::Resources::Employers#update_settings + class EmployerUpdateSettingsResponse < VitableConnect::Internal::Type::BaseModel + # @!attribute data + # + # @return [VitableConnect::Models::EmployerUpdateSettingsResponse::Data] + required :data, -> { VitableConnect::Models::EmployerUpdateSettingsResponse::Data } + + # @!method initialize(data:) + # Response containing a single employer settings resource. + # + # @param data [VitableConnect::Models::EmployerUpdateSettingsResponse::Data] + + # @see VitableConnect::Models::EmployerUpdateSettingsResponse#data + class Data < VitableConnect::Internal::Type::BaseModel + # @!attribute pay_frequency + # - `weekly` - Weekly + # - `bi_weekly` - Bi Weekly + # - `semi_monthly` - Semi Monthly + # - `monthly` - Monthly + # + # @return [Symbol, VitableConnect::Models::EmployerUpdateSettingsResponse::Data::PayFrequency, nil] + required :pay_frequency, + enum: -> { VitableConnect::Models::EmployerUpdateSettingsResponse::Data::PayFrequency }, + nil?: true + + # @!method initialize(pay_frequency:) + # Some parameter documentations has been truncated, see + # {VitableConnect::Models::EmployerUpdateSettingsResponse::Data} for more details. + # + # @param pay_frequency [Symbol, VitableConnect::Models::EmployerUpdateSettingsResponse::Data::PayFrequency, nil] - `weekly` - Weekly + + # - `weekly` - Weekly + # - `bi_weekly` - Bi Weekly + # - `semi_monthly` - Semi Monthly + # - `monthly` - Monthly + # + # @see VitableConnect::Models::EmployerUpdateSettingsResponse::Data#pay_frequency + module PayFrequency + extend VitableConnect::Internal::Type::Enum + + WEEKLY = :weekly + BI_WEEKLY = :bi_weekly + SEMI_MONTHLY = :semi_monthly + MONTHLY = :monthly + + # @!method self.values + # @return [Array] + end + end + end + end +end diff --git a/lib/vitable_connect/models/enrollment.rb b/lib/vitable_connect/models/enrollment.rb new file mode 100644 index 0000000..767ce22 --- /dev/null +++ b/lib/vitable_connect/models/enrollment.rb @@ -0,0 +1,236 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + class Enrollment < VitableConnect::Internal::Type::BaseModel + # @!attribute id + # Unique enrollment identifier (enrl\_\*) + # + # @return [String] + required :id, String + + # @!attribute answered_at + # When the employee enrolled or waived + # + # @return [Time, nil] + required :answered_at, Time, nil?: true + + # @!attribute benefit + # Nested benefit product summary + # + # @return [VitableConnect::Models::Enrollment::Benefit] + required :benefit, -> { VitableConnect::Enrollment::Benefit } + + # @!attribute coverage_end + # Coverage period end date + # + # @return [Date, nil] + required :coverage_end, Date, nil?: true + + # @!attribute coverage_start + # Coverage period start date + # + # @return [Date] + required :coverage_start, Date + + # @!attribute created_at + # When the enrollment was created + # + # @return [Time] + required :created_at, Time + + # @!attribute employee_deduction_in_cents + # Employee monthly payroll deduction in cents + # + # @return [Integer, nil] + required :employee_deduction_in_cents, Integer, nil?: true + + # @!attribute employee_id + # Employee ID (empl\_\*) + # + # @return [String] + required :employee_id, String + + # @!attribute employer_contribution_in_cents + # Employer monthly contribution in cents + # + # @return [Integer, nil] + required :employer_contribution_in_cents, Integer, nil?: true + + # @!attribute employer_id + # Employer ID (empr\_\*) + # + # @return [String] + required :employer_id, String + + # @!attribute status + # - `pending` - Pending + # - `enrolled` - Enrolled + # - `waived` - Waived + # - `inactive` - Inactive + # + # @return [Symbol, VitableConnect::Models::EnrollmentStatus] + required :status, enum: -> { VitableConnect::EnrollmentStatus } + + # @!attribute terminated_at + # When coverage was terminated + # + # @return [Time, nil] + required :terminated_at, Time, nil?: true + + # @!attribute updated_at + # When the enrollment was last updated + # + # @return [Time] + required :updated_at, Time + + # @!method initialize(id:, answered_at:, benefit:, coverage_end:, coverage_start:, created_at:, employee_deduction_in_cents:, employee_id:, employer_contribution_in_cents:, employer_id:, status:, terminated_at:, updated_at:) + # Some parameter documentations has been truncated, see + # {VitableConnect::Models::Enrollment} for more details. + # + # One enrollment as it appears in a list row. + # + # @param id [String] Unique enrollment identifier (enrl\_\*) + # + # @param answered_at [Time, nil] When the employee enrolled or waived + # + # @param benefit [VitableConnect::Models::Enrollment::Benefit] Nested benefit product summary + # + # @param coverage_end [Date, nil] Coverage period end date + # + # @param coverage_start [Date] Coverage period start date + # + # @param created_at [Time] When the enrollment was created + # + # @param employee_deduction_in_cents [Integer, nil] Employee monthly payroll deduction in cents + # + # @param employee_id [String] Employee ID (empl\_\*) + # + # @param employer_contribution_in_cents [Integer, nil] Employer monthly contribution in cents + # + # @param employer_id [String] Employer ID (empr\_\*) + # + # @param status [Symbol, VitableConnect::Models::EnrollmentStatus] - `pending` - Pending + # + # @param terminated_at [Time, nil] When coverage was terminated + # + # @param updated_at [Time] When the enrollment was last updated + + # @see VitableConnect::Models::Enrollment#benefit + class Benefit < VitableConnect::Internal::Type::BaseModel + # @!attribute id + # Benefit product ID (bprd\_\*) + # + # @return [String] + required :id, String + + # @!attribute category + # - `Medical` - Medical + # - `Dental` - Dental + # - `Vision` - Vision + # - `Hospital` - Hospital + # + # @return [Symbol, VitableConnect::Models::Enrollment::Benefit::Category] + required :category, enum: -> { VitableConnect::Enrollment::Benefit::Category } + + # @!attribute name + # Display name of the benefit product + # + # @return [String] + required :name, String + + # @!attribute product_code + # - `EBA` - Eba Mec + # - `VPC` - Vpc Enhanced + # - `VPC_CORE` - Vpc Core + # - `MEC` - Vpc Mec + # - `MEC2` - Mec2 + # - `MEC_PLUS` - Mec Plus + # - `MVP` - Mvp + # - `MVP2` - Mvp2 + # - `MVPSL` - Mvpsl + # - `MVPSL2` - Mvpsl2 + # - `VD` - Dental + # - `VV` - Vision + # - `ICHRA` - Ichra + # - `ICHRA_PREMIUM_PLUS` - Ichra Premium Plus + # - `ICHRA_REIMBURSEMENT_ONLY` - Ichra Reimbursement Only + # + # @return [Symbol, VitableConnect::Models::Enrollment::Benefit::ProductCode] + required :product_code, enum: -> { VitableConnect::Enrollment::Benefit::ProductCode } + + # @!method initialize(id:, category:, name:, product_code:) + # Some parameter documentations has been truncated, see + # {VitableConnect::Models::Enrollment::Benefit} for more details. + # + # Nested benefit product summary + # + # @param id [String] Benefit product ID (bprd\_\*) + # + # @param category [Symbol, VitableConnect::Models::Enrollment::Benefit::Category] - `Medical` - Medical + # + # @param name [String] Display name of the benefit product + # + # @param product_code [Symbol, VitableConnect::Models::Enrollment::Benefit::ProductCode] - `EBA` - Eba Mec + + # - `Medical` - Medical + # - `Dental` - Dental + # - `Vision` - Vision + # - `Hospital` - Hospital + # + # @see VitableConnect::Models::Enrollment::Benefit#category + module Category + extend VitableConnect::Internal::Type::Enum + + MEDICAL = :Medical + DENTAL = :Dental + VISION = :Vision + HOSPITAL = :Hospital + + # @!method self.values + # @return [Array] + end + + # - `EBA` - Eba Mec + # - `VPC` - Vpc Enhanced + # - `VPC_CORE` - Vpc Core + # - `MEC` - Vpc Mec + # - `MEC2` - Mec2 + # - `MEC_PLUS` - Mec Plus + # - `MVP` - Mvp + # - `MVP2` - Mvp2 + # - `MVPSL` - Mvpsl + # - `MVPSL2` - Mvpsl2 + # - `VD` - Dental + # - `VV` - Vision + # - `ICHRA` - Ichra + # - `ICHRA_PREMIUM_PLUS` - Ichra Premium Plus + # - `ICHRA_REIMBURSEMENT_ONLY` - Ichra Reimbursement Only + # + # @see VitableConnect::Models::Enrollment::Benefit#product_code + module ProductCode + extend VitableConnect::Internal::Type::Enum + + EBA = :EBA + VPC = :VPC + VPC_CORE = :VPC_CORE + MEC = :MEC + MEC2 = :MEC2 + MEC_PLUS = :MEC_PLUS + MVP = :MVP + MVP2 = :MVP2 + MVPSL = :MVPSL + MVPSL2 = :MVPSL2 + VD = :VD + VV = :VV + ICHRA = :ICHRA + ICHRA_PREMIUM_PLUS = :ICHRA_PREMIUM_PLUS + ICHRA_REIMBURSEMENT_ONLY = :ICHRA_REIMBURSEMENT_ONLY + + # @!method self.values + # @return [Array] + end + end + end + end +end diff --git a/lib/vitable_connect/models/enrollment_reissue_params.rb b/lib/vitable_connect/models/enrollment_reissue_params.rb new file mode 100644 index 0000000..d5cc23f --- /dev/null +++ b/lib/vitable_connect/models/enrollment_reissue_params.rb @@ -0,0 +1,50 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # @see VitableConnect::Resources::Enrollments#reissue + class EnrollmentReissueParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + # @!attribute enrollment_id + # Unique enrollment identifier (enrl\_\*) + # + # @return [String] + required :enrollment_id, String + + # @!attribute qualifying_life_event_id + # Accepted member qualifying life event identifier (qle\_\*) + # + # @return [String, nil] + optional :qualifying_life_event_id, String, nil?: true + + # @!attribute reason + # Audit reason for the reissue; required for user-backed callers and optional for + # long-lived organization API-key callers + # + # @return [String, nil] + optional :reason, String, nil?: true + + # @!attribute ticket_number + # Optional support or operational ticket number + # + # @return [String, nil] + optional :ticket_number, String, nil?: true + + # @!method initialize(enrollment_id:, qualifying_life_event_id: nil, reason: nil, ticket_number: nil, request_options: {}) + # Some parameter documentations has been truncated, see + # {VitableConnect::Models::EnrollmentReissueParams} for more details. + # + # @param enrollment_id [String] Unique enrollment identifier (enrl\_\*) + # + # @param qualifying_life_event_id [String, nil] Accepted member qualifying life event identifier (qle\_\*) + # + # @param reason [String, nil] Audit reason for the reissue; required for user-backed callers and optional for + # + # @param ticket_number [String, nil] Optional support or operational ticket number + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}] + end + end +end diff --git a/lib/vitable_connect/models/enrollment_reissue_response.rb b/lib/vitable_connect/models/enrollment_reissue_response.rb new file mode 100644 index 0000000..8c32867 --- /dev/null +++ b/lib/vitable_connect/models/enrollment_reissue_response.rb @@ -0,0 +1,30 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # @see VitableConnect::Resources::Enrollments#reissue + class EnrollmentReissueResponse < VitableConnect::Internal::Type::BaseModel + # @!attribute data + # + # @return [VitableConnect::Models::EnrollmentReissueResponse::Data] + required :data, -> { VitableConnect::Models::EnrollmentReissueResponse::Data } + + # @!method initialize(data:) + # Response containing a single reissue enrollment resource. + # + # @param data [VitableConnect::Models::EnrollmentReissueResponse::Data] + + # @see VitableConnect::Models::EnrollmentReissueResponse#data + class Data < VitableConnect::Internal::Type::BaseModel + # @!attribute enrollment_id + # Opaque identifier for the new unanswered enrollment + # + # @return [String] + required :enrollment_id, String + + # @!method initialize(enrollment_id:) + # @param enrollment_id [String] Opaque identifier for the new unanswered enrollment + end + end + end +end diff --git a/lib/vitable_connect/models/enrollment_retrieve_params.rb b/lib/vitable_connect/models/enrollment_retrieve_params.rb new file mode 100644 index 0000000..8619417 --- /dev/null +++ b/lib/vitable_connect/models/enrollment_retrieve_params.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # @see VitableConnect::Resources::Enrollments#retrieve + class EnrollmentRetrieveParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + # @!attribute enrollment_id + # Unique enrollment identifier (enrl\_\*) + # + # @return [String] + required :enrollment_id, String + + # @!method initialize(enrollment_id:, request_options: {}) + # @param enrollment_id [String] Unique enrollment identifier (enrl\_\*) + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}] + end + end +end diff --git a/lib/vitable_connect/models/enrollment_retrieve_response.rb b/lib/vitable_connect/models/enrollment_retrieve_response.rb new file mode 100644 index 0000000..091686e --- /dev/null +++ b/lib/vitable_connect/models/enrollment_retrieve_response.rb @@ -0,0 +1,273 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # @see VitableConnect::Resources::Enrollments#retrieve + class EnrollmentRetrieveResponse < VitableConnect::Internal::Type::BaseModel + # @!attribute data + # A single enrollment, including the enrolled plan's documents. + # + # The plan documents are resolved one enrollment at a time and are therefore not + # part of the list row. + # + # @return [VitableConnect::Models::EnrollmentRetrieveResponse::Data] + required :data, -> { VitableConnect::Models::EnrollmentRetrieveResponse::Data } + + # @!method initialize(data:) + # Some parameter documentations has been truncated, see + # {VitableConnect::Models::EnrollmentRetrieveResponse} for more details. + # + # Response containing a single enrollment resource. + # + # @param data [VitableConnect::Models::EnrollmentRetrieveResponse::Data] A single enrollment, including the enrolled plan's documents. + + # @see VitableConnect::Models::EnrollmentRetrieveResponse#data + class Data < VitableConnect::Internal::Type::BaseModel + # @!attribute id + # Unique enrollment identifier (enrl\_\*) + # + # @return [String] + required :id, String + + # @!attribute answered_at + # When the employee enrolled or waived + # + # @return [Time, nil] + required :answered_at, Time, nil?: true + + # @!attribute benefit + # Nested benefit product summary + # + # @return [VitableConnect::Models::EnrollmentRetrieveResponse::Data::Benefit] + required :benefit, -> { VitableConnect::Models::EnrollmentRetrieveResponse::Data::Benefit } + + # @!attribute coverage_end + # Coverage period end date + # + # @return [Date, nil] + required :coverage_end, Date, nil?: true + + # @!attribute coverage_start + # Coverage period start date + # + # @return [Date] + required :coverage_start, Date + + # @!attribute created_at + # When the enrollment was created + # + # @return [Time] + required :created_at, Time + + # @!attribute employee_deduction_in_cents + # Employee monthly payroll deduction in cents + # + # @return [Integer, nil] + required :employee_deduction_in_cents, Integer, nil?: true + + # @!attribute employee_id + # Employee ID (empl\_\*) + # + # @return [String] + required :employee_id, String + + # @!attribute employer_contribution_in_cents + # Employer monthly contribution in cents + # + # @return [Integer, nil] + required :employer_contribution_in_cents, Integer, nil?: true + + # @!attribute employer_id + # Employer ID (empr\_\*) + # + # @return [String] + required :employer_id, String + + # @!attribute status + # - `pending` - Pending + # - `enrolled` - Enrolled + # - `waived` - Waived + # - `inactive` - Inactive + # + # @return [Symbol, VitableConnect::Models::EnrollmentStatus] + required :status, enum: -> { VitableConnect::EnrollmentStatus } + + # @!attribute terminated_at + # When coverage was terminated + # + # @return [Time, nil] + required :terminated_at, Time, nil?: true + + # @!attribute updated_at + # When the enrollment was last updated + # + # @return [Time] + required :updated_at, Time + + # @!attribute sbc_url + # Summary of Benefits and Coverage (SBC) document URL for the enrolled plan; null + # when not on file. Only individual (ICHRA) plans carry an SBC — group plans have + # no SBC on record and always resolve to null. + # + # @return [String, nil] + optional :sbc_url, String, nil?: true + + # @!method initialize(id:, answered_at:, benefit:, coverage_end:, coverage_start:, created_at:, employee_deduction_in_cents:, employee_id:, employer_contribution_in_cents:, employer_id:, status:, terminated_at:, updated_at:, sbc_url: nil) + # Some parameter documentations has been truncated, see + # {VitableConnect::Models::EnrollmentRetrieveResponse::Data} for more details. + # + # A single enrollment, including the enrolled plan's documents. + # + # The plan documents are resolved one enrollment at a time and are therefore not + # part of the list row. + # + # @param id [String] Unique enrollment identifier (enrl\_\*) + # + # @param answered_at [Time, nil] When the employee enrolled or waived + # + # @param benefit [VitableConnect::Models::EnrollmentRetrieveResponse::Data::Benefit] Nested benefit product summary + # + # @param coverage_end [Date, nil] Coverage period end date + # + # @param coverage_start [Date] Coverage period start date + # + # @param created_at [Time] When the enrollment was created + # + # @param employee_deduction_in_cents [Integer, nil] Employee monthly payroll deduction in cents + # + # @param employee_id [String] Employee ID (empl\_\*) + # + # @param employer_contribution_in_cents [Integer, nil] Employer monthly contribution in cents + # + # @param employer_id [String] Employer ID (empr\_\*) + # + # @param status [Symbol, VitableConnect::Models::EnrollmentStatus] - `pending` - Pending + # + # @param terminated_at [Time, nil] When coverage was terminated + # + # @param updated_at [Time] When the enrollment was last updated + # + # @param sbc_url [String, nil] Summary of Benefits and Coverage (SBC) document URL for the enrolled plan; null + + # @see VitableConnect::Models::EnrollmentRetrieveResponse::Data#benefit + class Benefit < VitableConnect::Internal::Type::BaseModel + # @!attribute id + # Benefit product ID (bprd\_\*) + # + # @return [String] + required :id, String + + # @!attribute category + # - `Medical` - Medical + # - `Dental` - Dental + # - `Vision` - Vision + # - `Hospital` - Hospital + # + # @return [Symbol, VitableConnect::Models::EnrollmentRetrieveResponse::Data::Benefit::Category] + required :category, + enum: -> { VitableConnect::Models::EnrollmentRetrieveResponse::Data::Benefit::Category } + + # @!attribute name + # Display name of the benefit product + # + # @return [String] + required :name, String + + # @!attribute product_code + # - `EBA` - Eba Mec + # - `VPC` - Vpc Enhanced + # - `VPC_CORE` - Vpc Core + # - `MEC` - Vpc Mec + # - `MEC2` - Mec2 + # - `MEC_PLUS` - Mec Plus + # - `MVP` - Mvp + # - `MVP2` - Mvp2 + # - `MVPSL` - Mvpsl + # - `MVPSL2` - Mvpsl2 + # - `VD` - Dental + # - `VV` - Vision + # - `ICHRA` - Ichra + # - `ICHRA_PREMIUM_PLUS` - Ichra Premium Plus + # - `ICHRA_REIMBURSEMENT_ONLY` - Ichra Reimbursement Only + # + # @return [Symbol, VitableConnect::Models::EnrollmentRetrieveResponse::Data::Benefit::ProductCode] + required :product_code, + enum: -> { VitableConnect::Models::EnrollmentRetrieveResponse::Data::Benefit::ProductCode } + + # @!method initialize(id:, category:, name:, product_code:) + # Some parameter documentations has been truncated, see + # {VitableConnect::Models::EnrollmentRetrieveResponse::Data::Benefit} for more + # details. + # + # Nested benefit product summary + # + # @param id [String] Benefit product ID (bprd\_\*) + # + # @param category [Symbol, VitableConnect::Models::EnrollmentRetrieveResponse::Data::Benefit::Category] - `Medical` - Medical + # + # @param name [String] Display name of the benefit product + # + # @param product_code [Symbol, VitableConnect::Models::EnrollmentRetrieveResponse::Data::Benefit::ProductCode] - `EBA` - Eba Mec + + # - `Medical` - Medical + # - `Dental` - Dental + # - `Vision` - Vision + # - `Hospital` - Hospital + # + # @see VitableConnect::Models::EnrollmentRetrieveResponse::Data::Benefit#category + module Category + extend VitableConnect::Internal::Type::Enum + + MEDICAL = :Medical + DENTAL = :Dental + VISION = :Vision + HOSPITAL = :Hospital + + # @!method self.values + # @return [Array] + end + + # - `EBA` - Eba Mec + # - `VPC` - Vpc Enhanced + # - `VPC_CORE` - Vpc Core + # - `MEC` - Vpc Mec + # - `MEC2` - Mec2 + # - `MEC_PLUS` - Mec Plus + # - `MVP` - Mvp + # - `MVP2` - Mvp2 + # - `MVPSL` - Mvpsl + # - `MVPSL2` - Mvpsl2 + # - `VD` - Dental + # - `VV` - Vision + # - `ICHRA` - Ichra + # - `ICHRA_PREMIUM_PLUS` - Ichra Premium Plus + # - `ICHRA_REIMBURSEMENT_ONLY` - Ichra Reimbursement Only + # + # @see VitableConnect::Models::EnrollmentRetrieveResponse::Data::Benefit#product_code + module ProductCode + extend VitableConnect::Internal::Type::Enum + + EBA = :EBA + VPC = :VPC + VPC_CORE = :VPC_CORE + MEC = :MEC + MEC2 = :MEC2 + MEC_PLUS = :MEC_PLUS + MVP = :MVP + MVP2 = :MVP2 + MVPSL = :MVPSL + MVPSL2 = :MVPSL2 + VD = :VD + VV = :VV + ICHRA = :ICHRA + ICHRA_PREMIUM_PLUS = :ICHRA_PREMIUM_PLUS + ICHRA_REIMBURSEMENT_ONLY = :ICHRA_REIMBURSEMENT_ONLY + + # @!method self.values + # @return [Array] + end + end + end + end + end +end diff --git a/lib/vitable_connect/models/enrollment_status.rb b/lib/vitable_connect/models/enrollment_status.rb new file mode 100644 index 0000000..daa43ed --- /dev/null +++ b/lib/vitable_connect/models/enrollment_status.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # - `pending` - Pending + # - `enrolled` - Enrolled + # - `waived` - Waived + # - `inactive` - Inactive + module EnrollmentStatus + extend VitableConnect::Internal::Type::Enum + + PENDING = :pending + ENROLLED = :enrolled + WAIVED = :waived + INACTIVE = :inactive + + # @!method self.values + # @return [Array] + end + end +end diff --git a/lib/vitable_connect/models/enrollment_terminate_params.rb b/lib/vitable_connect/models/enrollment_terminate_params.rb new file mode 100644 index 0000000..1d4b7c5 --- /dev/null +++ b/lib/vitable_connect/models/enrollment_terminate_params.rb @@ -0,0 +1,50 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # @see VitableConnect::Resources::Enrollments#terminate + class EnrollmentTerminateParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + # @!attribute enrollment_id + # Unique enrollment identifier (enrl\_\*) + # + # @return [String] + required :enrollment_id, String + + # @!attribute qualifying_life_event_id + # Accepted member qualifying life event identifier (qle\_\*) + # + # @return [String, nil] + optional :qualifying_life_event_id, String, nil?: true + + # @!attribute reason + # Audit reason for the termination; required for user-backed callers and optional + # for long-lived organization API-key callers + # + # @return [String, nil] + optional :reason, String, nil?: true + + # @!attribute ticket_number + # Optional support or operational ticket number + # + # @return [String, nil] + optional :ticket_number, String, nil?: true + + # @!method initialize(enrollment_id:, qualifying_life_event_id: nil, reason: nil, ticket_number: nil, request_options: {}) + # Some parameter documentations has been truncated, see + # {VitableConnect::Models::EnrollmentTerminateParams} for more details. + # + # @param enrollment_id [String] Unique enrollment identifier (enrl\_\*) + # + # @param qualifying_life_event_id [String, nil] Accepted member qualifying life event identifier (qle\_\*) + # + # @param reason [String, nil] Audit reason for the termination; required for user-backed callers and optional + # + # @param ticket_number [String, nil] Optional support or operational ticket number + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}] + end + end +end diff --git a/lib/vitable_connect/models/group.rb b/lib/vitable_connect/models/group.rb new file mode 100644 index 0000000..95ccbba --- /dev/null +++ b/lib/vitable_connect/models/group.rb @@ -0,0 +1,57 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # @see VitableConnect::Resources::Groups#list + class Group < VitableConnect::Internal::Type::BaseModel + # @!attribute id + # Prefixed group identifier (`grp_`). + # + # @return [String] + required :id, String + + # @!attribute created_at + # Group creation timestamp (ISO 8601, UTC). + # + # @return [Time, nil] + required :created_at, Time, nil?: true + + # @!attribute external_reference_id + # Stable identifier for this group in the integrator's own system. + # + # @return [String] + required :external_reference_id, String + + # @!attribute name + # Human-readable group name. + # + # @return [String] + required :name, String + + # @!attribute organization_id + # Prefixed organization identifier (`org_`). + # + # @return [String] + required :organization_id, String + + # @!attribute updated_at + # Last-update timestamp (ISO 8601, UTC). + # + # @return [Time, nil] + required :updated_at, Time, nil?: true + + # @!method initialize(id:, created_at:, external_reference_id:, name:, organization_id:, updated_at:) + # @param id [String] Prefixed group identifier (`grp_`). + # + # @param created_at [Time, nil] Group creation timestamp (ISO 8601, UTC). + # + # @param external_reference_id [String] Stable identifier for this group in the integrator's own system. + # + # @param name [String] Human-readable group name. + # + # @param organization_id [String] Prefixed organization identifier (`org_`). + # + # @param updated_at [Time, nil] Last-update timestamp (ISO 8601, UTC). + end + end +end diff --git a/lib/vitable_connect/models/group_create_params.rb b/lib/vitable_connect/models/group_create_params.rb new file mode 100644 index 0000000..88b7240 --- /dev/null +++ b/lib/vitable_connect/models/group_create_params.rb @@ -0,0 +1,26 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # @see VitableConnect::Resources::Groups#create + class GroupCreateParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + # @!attribute external_reference_id + # + # @return [String] + required :external_reference_id, String + + # @!attribute name + # + # @return [String] + required :name, String + + # @!method initialize(external_reference_id:, name:, request_options: {}) + # @param external_reference_id [String] + # @param name [String] + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}] + end + end +end diff --git a/lib/vitable_connect/models/group_list_params.rb b/lib/vitable_connect/models/group_list_params.rb new file mode 100644 index 0000000..feb1a11 --- /dev/null +++ b/lib/vitable_connect/models/group_list_params.rb @@ -0,0 +1,30 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # @see VitableConnect::Resources::Groups#list + class GroupListParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + # @!attribute limit + # Items per page (default: 20, max: 100) + # + # @return [Integer, nil] + optional :limit, Integer + + # @!attribute page + # Page number (default: 1) + # + # @return [Integer, nil] + optional :page, Integer + + # @!method initialize(limit: nil, page: nil, request_options: {}) + # @param limit [Integer] Items per page (default: 20, max: 100) + # + # @param page [Integer] Page number (default: 1) + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}] + end + end +end diff --git a/lib/vitable_connect/models/group_response.rb b/lib/vitable_connect/models/group_response.rb new file mode 100644 index 0000000..b367720 --- /dev/null +++ b/lib/vitable_connect/models/group_response.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # @see VitableConnect::Resources::Groups#create + class GroupResponse < VitableConnect::Internal::Type::BaseModel + # @!attribute data + # + # @return [VitableConnect::Models::Group] + required :data, -> { VitableConnect::Group } + + # @!method initialize(data:) + # Response containing a single group resource. + # + # @param data [VitableConnect::Models::Group] + end + end +end diff --git a/lib/vitable_connect/models/group_retrieve_params.rb b/lib/vitable_connect/models/group_retrieve_params.rb new file mode 100644 index 0000000..99fb0a7 --- /dev/null +++ b/lib/vitable_connect/models/group_retrieve_params.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # @see VitableConnect::Resources::Groups#retrieve + class GroupRetrieveParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + # @!attribute group_id + # Unique group identifier (grp\_\*) + # + # @return [String] + required :group_id, String + + # @!method initialize(group_id:, request_options: {}) + # @param group_id [String] Unique group identifier (grp\_\*) + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}] + end + end +end diff --git a/lib/vitable_connect/models/group_update_params.rb b/lib/vitable_connect/models/group_update_params.rb new file mode 100644 index 0000000..a62c687 --- /dev/null +++ b/lib/vitable_connect/models/group_update_params.rb @@ -0,0 +1,36 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # @see VitableConnect::Resources::Groups#update + class GroupUpdateParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + # @!attribute group_id + # Unique group identifier (grp\_\*) + # + # @return [String] + required :group_id, String + + # @!attribute external_reference_id + # + # @return [String, nil] + optional :external_reference_id, String, nil?: true + + # @!attribute name + # + # @return [String, nil] + optional :name, String, nil?: true + + # @!method initialize(group_id:, external_reference_id: nil, name: nil, request_options: {}) + # @param group_id [String] Unique group identifier (grp\_\*) + # + # @param external_reference_id [String, nil] + # + # @param name [String, nil] + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}] + end + end +end diff --git a/lib/vitable_connect/models/groups/members/sync_retrieve_params.rb b/lib/vitable_connect/models/groups/members/sync_retrieve_params.rb new file mode 100644 index 0000000..38354e5 --- /dev/null +++ b/lib/vitable_connect/models/groups/members/sync_retrieve_params.rb @@ -0,0 +1,33 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + module Groups + module Members + # @see VitableConnect::Resources::Groups::Members::Sync#retrieve + class SyncRetrieveParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + # @!attribute group_id + # Unique group identifier (grp\_\*) + # + # @return [String] + required :group_id, String + + # @!attribute request_id + # + # @return [String] + required :request_id, String + + # @!method initialize(group_id:, request_id:, request_options: {}) + # @param group_id [String] Unique group identifier (grp\_\*) + # + # @param request_id [String] + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}] + end + end + end + end +end diff --git a/lib/vitable_connect/models/groups/members/sync_retrieve_response.rb b/lib/vitable_connect/models/groups/members/sync_retrieve_response.rb new file mode 100644 index 0000000..27c5628 --- /dev/null +++ b/lib/vitable_connect/models/groups/members/sync_retrieve_response.rb @@ -0,0 +1,128 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + module Groups + module Members + # @see VitableConnect::Resources::Groups::Members::Sync#retrieve + class SyncRetrieveResponse < VitableConnect::Internal::Type::BaseModel + # @!attribute data + # + # @return [VitableConnect::Models::Groups::Members::SyncRetrieveResponse::Data] + required :data, -> { VitableConnect::Models::Groups::Members::SyncRetrieveResponse::Data } + + # @!method initialize(data:) + # Response containing a single group member sync request detail resource. + # + # @param data [VitableConnect::Models::Groups::Members::SyncRetrieveResponse::Data] + + # @see VitableConnect::Models::Groups::Members::SyncRetrieveResponse#data + class Data < VitableConnect::Internal::Type::BaseModel + # @!attribute accepted_at + # + # @return [Time] + required :accepted_at, Time + + # @!attribute completed_at + # + # @return [Time, nil] + required :completed_at, Time, nil?: true + + # @!attribute group_id + # + # @return [String] + required :group_id, String + + # @!attribute request_id + # + # @return [String] + required :request_id, String + + # @!attribute results + # + # @return [VitableConnect::Models::Groups::Members::SyncRetrieveResponse::Data::Results, nil] + required :results, + -> { VitableConnect::Models::Groups::Members::SyncRetrieveResponse::Data::Results }, + nil?: true + + # @!method initialize(accepted_at:, completed_at:, group_id:, request_id:, results:) + # @param accepted_at [Time] + # @param completed_at [Time, nil] + # @param group_id [String] + # @param request_id [String] + # @param results [VitableConnect::Models::Groups::Members::SyncRetrieveResponse::Data::Results, nil] + + # @see VitableConnect::Models::Groups::Members::SyncRetrieveResponse::Data#results + class Results < VitableConnect::Internal::Type::BaseModel + # @!attribute added_group_member_ids + # + # @return [Array] + required :added_group_member_ids, VitableConnect::Internal::Type::ArrayOf[String] + + # @!attribute failures + # + # @return [Array] + required :failures, + -> { VitableConnect::Internal::Type::ArrayOf[VitableConnect::Models::Groups::Members::SyncRetrieveResponse::Data::Results::Failure] } + + # @!attribute removed_group_member_ids + # + # @return [Array] + required :removed_group_member_ids, VitableConnect::Internal::Type::ArrayOf[String] + + # @!method initialize(added_group_member_ids:, failures:, removed_group_member_ids:) + # @param added_group_member_ids [Array] + # @param failures [Array] + # @param removed_group_member_ids [Array] + + class Failure < VitableConnect::Internal::Type::BaseModel + # @!attribute operation + # - `add` - add + # - `remove` - remove + # + # @return [Symbol, VitableConnect::Models::Groups::Members::SyncRetrieveResponse::Data::Results::Failure::Operation] + required :operation, + enum: -> { VitableConnect::Models::Groups::Members::SyncRetrieveResponse::Data::Results::Failure::Operation } + + # @!attribute reason + # + # @return [String] + required :reason, String + + # @!attribute reference_id + # + # @return [String] + required :reference_id, String + + # @!method initialize(operation:, reason:, reference_id:) + # Some parameter documentations has been truncated, see + # {VitableConnect::Models::Groups::Members::SyncRetrieveResponse::Data::Results::Failure} + # for more details. + # + # @param operation [Symbol, VitableConnect::Models::Groups::Members::SyncRetrieveResponse::Data::Results::Failure::Operation] - `add` - add + # + # @param reason [String] + # + # @param reference_id [String] + + # - `add` - add + # - `remove` - remove + # + # @see VitableConnect::Models::Groups::Members::SyncRetrieveResponse::Data::Results::Failure#operation + module Operation + extend VitableConnect::Internal::Type::Enum + + ADD = :add + REMOVE = :remove + + # @!method self.values + # @return [Array] + end + end + end + end + end + end + end + end +end diff --git a/lib/vitable_connect/models/groups/members/sync_submit_params.rb b/lib/vitable_connect/models/groups/members/sync_submit_params.rb new file mode 100644 index 0000000..40abac0 --- /dev/null +++ b/lib/vitable_connect/models/groups/members/sync_submit_params.rb @@ -0,0 +1,121 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + module Groups + module Members + # @see VitableConnect::Resources::Groups::Members::Sync#submit + class SyncSubmitParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + # @!attribute group_id + # Unique group identifier (grp\_\*) + # + # @return [String] + required :group_id, String + + # @!attribute members + # + # @return [Array] + required :members, + -> { VitableConnect::Internal::Type::ArrayOf[VitableConnect::Groups::Members::SyncSubmitParams::Member] } + + # @!method initialize(group_id:, members:, request_options: {}) + # @param group_id [String] Unique group identifier (grp\_\*) + # + # @param members [Array] + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}] + + class Member < VitableConnect::Internal::Type::BaseModel + # @!attribute address + # + # @return [VitableConnect::Models::Groups::Members::SyncSubmitParams::Member::Address] + required :address, -> { VitableConnect::Groups::Members::SyncSubmitParams::Member::Address } + + # @!attribute date_of_birth + # + # @return [Date] + required :date_of_birth, Date + + # @!attribute first_name + # + # @return [String] + required :first_name, String + + # @!attribute last_name + # + # @return [String] + required :last_name, String + + # @!attribute plan_id + # + # @return [String] + required :plan_id, String + + # @!attribute reference_id + # + # @return [String] + required :reference_id, String + + # @!attribute email + # + # @return [String, nil] + optional :email, String, nil?: true + + # @!attribute phone + # + # @return [String, nil] + optional :phone, String, nil?: true + + # @!method initialize(address:, date_of_birth:, first_name:, last_name:, plan_id:, reference_id:, email: nil, phone: nil) + # @param address [VitableConnect::Models::Groups::Members::SyncSubmitParams::Member::Address] + # @param date_of_birth [Date] + # @param first_name [String] + # @param last_name [String] + # @param plan_id [String] + # @param reference_id [String] + # @param email [String, nil] + # @param phone [String, nil] + + # @see VitableConnect::Models::Groups::Members::SyncSubmitParams::Member#address + class Address < VitableConnect::Internal::Type::BaseModel + # @!attribute address_line_1 + # + # @return [String] + required :address_line_1, String + + # @!attribute city + # + # @return [String] + required :city, String + + # @!attribute state + # + # @return [String] + required :state, String + + # @!attribute zipcode + # + # @return [String] + required :zipcode, String + + # @!attribute address_line_2 + # + # @return [String, nil] + optional :address_line_2, String, nil?: true + + # @!method initialize(address_line_1:, city:, state:, zipcode:, address_line_2: nil) + # @param address_line_1 [String] + # @param city [String] + # @param state [String] + # @param zipcode [String] + # @param address_line_2 [String, nil] + end + end + end + end + end + end +end diff --git a/lib/vitable_connect/models/groups/members/sync_submit_response.rb b/lib/vitable_connect/models/groups/members/sync_submit_response.rb new file mode 100644 index 0000000..a8b8b96 --- /dev/null +++ b/lib/vitable_connect/models/groups/members/sync_submit_response.rb @@ -0,0 +1,45 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + module Groups + module Members + # @see VitableConnect::Resources::Groups::Members::Sync#submit + class SyncSubmitResponse < VitableConnect::Internal::Type::BaseModel + # @!attribute data + # + # @return [VitableConnect::Models::Groups::Members::SyncSubmitResponse::Data] + required :data, -> { VitableConnect::Models::Groups::Members::SyncSubmitResponse::Data } + + # @!method initialize(data:) + # Response containing a single group member sync detail resource. + # + # @param data [VitableConnect::Models::Groups::Members::SyncSubmitResponse::Data] + + # @see VitableConnect::Models::Groups::Members::SyncSubmitResponse#data + class Data < VitableConnect::Internal::Type::BaseModel + # @!attribute accepted_at + # + # @return [Time] + required :accepted_at, Time + + # @!attribute group_id + # + # @return [String] + required :group_id, String + + # @!attribute request_id + # + # @return [String] + required :request_id, String + + # @!method initialize(accepted_at:, group_id:, request_id:) + # @param accepted_at [Time] + # @param group_id [String] + # @param request_id [String] + end + end + end + end + end +end diff --git a/lib/vitable_connect/models/member_list_dependents_params.rb b/lib/vitable_connect/models/member_list_dependents_params.rb new file mode 100644 index 0000000..900bbd2 --- /dev/null +++ b/lib/vitable_connect/models/member_list_dependents_params.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # @see VitableConnect::Resources::Members#list_dependents + class MemberListDependentsParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + # @!attribute member_id + # Unique member identifier (mbr\_\*) + # + # @return [String] + required :member_id, String + + # @!method initialize(member_id:, request_options: {}) + # @param member_id [String] Unique member identifier (mbr\_\*) + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}] + end + end +end diff --git a/lib/vitable_connect/models/member_list_dependents_response.rb b/lib/vitable_connect/models/member_list_dependents_response.rb new file mode 100644 index 0000000..076fc6f --- /dev/null +++ b/lib/vitable_connect/models/member_list_dependents_response.rb @@ -0,0 +1,132 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # @see VitableConnect::Resources::Members#list_dependents + class MemberListDependentsResponse < VitableConnect::Internal::Type::BaseModel + # @!attribute data + # + # @return [Array] + required :data, + -> { VitableConnect::Internal::Type::ArrayOf[VitableConnect::Models::MemberListDependentsResponse::Data] } + + # @!method initialize(data:) + # Unpaginated `{"data": [...]}` list of member dependents. + # + # @param data [Array] + + class Data < VitableConnect::Internal::Type::BaseModel + # @!attribute age + # Dependent's age in years, derived from date of birth + # + # @return [Integer] + required :age, Integer + + # @!attribute date_of_birth + # Date of birth (YYYY-MM-DD) + # + # @return [Date] + required :date_of_birth, Date + + # @!attribute first_name + # Dependent's first name + # + # @return [String] + required :first_name, String + + # @!attribute last_name + # Dependent's last name + # + # @return [String] + required :last_name, String + + # @!attribute relationship + # - `Spouse` - Spouse + # - `Child` - Child + # + # @return [Symbol, VitableConnect::Models::MemberListDependentsResponse::Data::Relationship] + required :relationship, + enum: -> { VitableConnect::Models::MemberListDependentsResponse::Data::Relationship } + + # @!attribute sex_at_birth + # - `Male` - Male + # - `Female` - Female + # - `Other` - Other + # - `Unknown` - Unknown + # + # @return [Symbol, VitableConnect::Models::MemberListDependentsResponse::Data::SexAtBirth, nil] + optional :sex_at_birth, + enum: -> { VitableConnect::Models::MemberListDependentsResponse::Data::SexAtBirth }, + nil?: true + + response_only do + # @!attribute member_id + # The dependent's own member identifier with 'mbr\_' prefix + # + # @return [String] + required :member_id, String + + # @!attribute primary_member_id + # The primary member's identifier with 'mbr\_' prefix + # + # @return [String] + required :primary_member_id, String + end + + # @!method initialize(age:, date_of_birth:, first_name:, last_name:, member_id:, primary_member_id:, relationship:, sex_at_birth: nil) + # Some parameter documentations has been truncated, see + # {VitableConnect::Models::MemberListDependentsResponse::Data} for more details. + # + # Wire serializer for :class:`MemberLegalDependentDTO` (one legal-dependent row). + # + # @param age [Integer] Dependent's age in years, derived from date of birth + # + # @param date_of_birth [Date] Date of birth (YYYY-MM-DD) + # + # @param first_name [String] Dependent's first name + # + # @param last_name [String] Dependent's last name + # + # @param member_id [String] The dependent's own member identifier with 'mbr\_' prefix + # + # @param primary_member_id [String] The primary member's identifier with 'mbr\_' prefix + # + # @param relationship [Symbol, VitableConnect::Models::MemberListDependentsResponse::Data::Relationship] - `Spouse` - Spouse + # + # @param sex_at_birth [Symbol, VitableConnect::Models::MemberListDependentsResponse::Data::SexAtBirth, nil] - `Male` - Male + + # - `Spouse` - Spouse + # - `Child` - Child + # + # @see VitableConnect::Models::MemberListDependentsResponse::Data#relationship + module Relationship + extend VitableConnect::Internal::Type::Enum + + SPOUSE = :Spouse + CHILD = :Child + + # @!method self.values + # @return [Array] + end + + # - `Male` - Male + # - `Female` - Female + # - `Other` - Other + # - `Unknown` - Unknown + # + # @see VitableConnect::Models::MemberListDependentsResponse::Data#sex_at_birth + module SexAtBirth + extend VitableConnect::Internal::Type::Enum + + MALE = :Male + FEMALE = :Female + OTHER = :Other + UNKNOWN = :Unknown + + # @!method self.values + # @return [Array] + end + end + end + end +end diff --git a/lib/vitable_connect/models/member_list_employments_params.rb b/lib/vitable_connect/models/member_list_employments_params.rb new file mode 100644 index 0000000..a748c73 --- /dev/null +++ b/lib/vitable_connect/models/member_list_employments_params.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # @see VitableConnect::Resources::Members#list_employments + class MemberListEmploymentsParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + # @!attribute member_id + # Unique member identifier (mbr\_\*) + # + # @return [String] + required :member_id, String + + # @!method initialize(member_id:, request_options: {}) + # @param member_id [String] Unique member identifier (mbr\_\*) + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}] + end + end +end diff --git a/lib/vitable_connect/models/member_list_employments_response.rb b/lib/vitable_connect/models/member_list_employments_response.rb new file mode 100644 index 0000000..afbdf23 --- /dev/null +++ b/lib/vitable_connect/models/member_list_employments_response.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # @see VitableConnect::Resources::Members#list_employments + class MemberListEmploymentsResponse < VitableConnect::Internal::Type::BaseModel + # @!attribute data + # + # @return [Array] + required :data, -> { VitableConnect::Internal::Type::ArrayOf[VitableConnect::Employee] } + + # @!method initialize(data:) + # Unpaginated `{"data": [...]}` list of member employments. + # + # @param data [Array] + end + end +end diff --git a/lib/vitable_connect/models/member_list_enrollments_params.rb b/lib/vitable_connect/models/member_list_enrollments_params.rb new file mode 100644 index 0000000..a69961d --- /dev/null +++ b/lib/vitable_connect/models/member_list_enrollments_params.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # @see VitableConnect::Resources::Members#list_enrollments + class MemberListEnrollmentsParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + # @!attribute member_id + # Unique member identifier (mbr\_\*) + # + # @return [String] + required :member_id, String + + # @!method initialize(member_id:, request_options: {}) + # @param member_id [String] Unique member identifier (mbr\_\*) + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}] + end + end +end diff --git a/lib/vitable_connect/models/member_list_enrollments_response.rb b/lib/vitable_connect/models/member_list_enrollments_response.rb new file mode 100644 index 0000000..1ccb9fd --- /dev/null +++ b/lib/vitable_connect/models/member_list_enrollments_response.rb @@ -0,0 +1,362 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # @see VitableConnect::Resources::Members#list_enrollments + class MemberListEnrollmentsResponse < VitableConnect::Internal::Type::BaseModel + # @!attribute data + # + # @return [Array] + required :data, + -> { VitableConnect::Internal::Type::ArrayOf[VitableConnect::Models::MemberListEnrollmentsResponse::Data] } + + # @!method initialize(data:) + # Unpaginated `{"data": [...]}` list of member enrollments. + # + # @param data [Array] + + class Data < VitableConnect::Internal::Type::BaseModel + # @!attribute id + # Opaque, stable enrollment identifier used to target enrollment actions + # + # @return [String] + required :id, String + + # @!attribute benefit_plan_year_id + # Exact benefit plan-year identifier for this enrollment + # + # @return [String] + required :benefit_plan_year_id, String + + # @!attribute benefit_type + # - `Medical` - Medical + # - `Dental` - Dental + # - `Vision` - Vision + # - `Hospital` - Hospital + # + # @return [Symbol, VitableConnect::Models::MemberListEnrollmentsResponse::Data::BenefitType] + required :benefit_type, + enum: -> { VitableConnect::Models::MemberListEnrollmentsResponse::Data::BenefitType } + + # @!attribute cancelled_date + # Earliest applicable coverage boundary (YYYY-MM-DD) when coverage was cancelled + # before its effective start; null unless the enrollment was cancelled + # + # @return [Date, nil] + required :cancelled_date, Date, nil?: true + + # @!attribute election_status + # - `Enrolled` - Enrolled + # - `Waived` - Waived + # - `Pending` - Pending + # - `Expired` - Expired + # + # @return [Symbol, VitableConnect::Models::MemberListEnrollmentsResponse::Data::ElectionStatus] + required :election_status, + enum: -> { VitableConnect::Models::MemberListEnrollmentsResponse::Data::ElectionStatus } + + # @!attribute employer_id + # Exact employer identifier for this enrollment + # + # @return [String] + required :employer_id, String + + # @!attribute employer_name + # Name of the employer the enrollment is through + # + # @return [String] + required :employer_name, String + + # @!attribute enrollment_window_start + # First date the member could answer this enrollment (YYYY-MM-DD). Open + # enrollment's start date for a row issued before open enrollment opened, + # otherwise the date the row was issued -- an enrollment is never answerable + # before it exists, so this is never earlier than `issued_date`. + # + # @return [Date] + required :enrollment_window_start, Date + + # @!attribute in_last_month_of_coverage + # True when today falls in the final month of the plan-year coverage window; + # drives end-of-coverage enrollment actions on the client. + # + # @return [Boolean] + required :in_last_month_of_coverage, VitableConnect::Internal::Type::Boolean + + # @!attribute is_within_enrollment_window + # True when today falls inside the enrollment window this member has to answer in; + # drives enrollment-action availability on the client. + # + # @return [Boolean] + required :is_within_enrollment_window, VitableConnect::Internal::Type::Boolean + + # @!attribute issued_date + # Date the enrollment record was created (YYYY-MM-DD), the value Ops labels Issued + # on. Present on every row whatever the member answered, and distinct from + # `coverage_start`. It equals `enrollment_window_start` for a row issued once its + # open enrollment had already opened, and precedes it for a row issued ahead of + # open enrollment. + # + # @return [Date] + required :issued_date, Date + + # @!attribute plan_year_coverage_end + # Benefit plan-year coverage end date (YYYY-MM-DD), distinct from this + # enrollment's coverage_end; null when the plan year is open-ended + # + # @return [Date, nil] + required :plan_year_coverage_end, Date, nil?: true + + # @!attribute policy_status + # - `Coverage Upcoming` - Coverage Upcoming + # - `Coverage Effective` - Coverage Effective + # - `Coverage Ended` - Coverage Ended + # - `Cancelled` - Cancelled + # + # @return [Symbol, VitableConnect::Models::MemberListEnrollmentsResponse::Data::PolicyStatus, nil] + required :policy_status, + enum: -> { VitableConnect::Models::MemberListEnrollmentsResponse::Data::PolicyStatus }, + nil?: true + + # @!attribute product_code + # - `EBA` - Eba Mec + # - `VPC` - Vpc Enhanced + # - `VPC_CORE` - Vpc Core + # - `MEC` - Vpc Mec + # - `MEC2` - Mec2 + # - `MEC_PLUS` - Mec Plus + # - `MVP` - Mvp + # - `MVP2` - Mvp2 + # - `MVPSL` - Mvpsl + # - `MVPSL2` - Mvpsl2 + # - `VD` - Dental + # - `VV` - Vision + # - `ICHRA` - Ichra + # - `ICHRA_PREMIUM_PLUS` - Ichra Premium Plus + # - `ICHRA_REIMBURSEMENT_ONLY` - Ichra Reimbursement Only + # + # @return [Symbol, VitableConnect::Models::MemberListEnrollmentsResponse::Data::ProductCode] + required :product_code, + enum: -> { VitableConnect::Models::MemberListEnrollmentsResponse::Data::ProductCode } + + # @!attribute product_name + # Display name of the benefit product + # + # @return [String] + required :product_name, String + + # @!attribute requires_qle_for_reissue + # Whether a qualifying life event would be required to reissue this enrollment + # under the product and open-enrollment rule at the time this list was read + # + # @return [Boolean] + required :requires_qle_for_reissue, VitableConnect::Internal::Type::Boolean + + # @!attribute carrier_name + # Insurance carrier name; null when no active carrier period is resolvable + # + # @return [String, nil] + optional :carrier_name, String, nil?: true + + # @!attribute coverage_end + # Coverage window end date (YYYY-MM-DD); null while coverage is open-ended + # + # @return [Date, nil] + optional :coverage_end, Date, nil?: true + + # @!attribute coverage_start + # Coverage window start date (YYYY-MM-DD) + # + # @return [Date, nil] + optional :coverage_start, Date, nil?: true + + # @!attribute employee_deduction_in_cents + # Employee monthly payroll deduction in cents; null unless the row is an election + # + # @return [Integer, nil] + optional :employee_deduction_in_cents, Integer, nil?: true + + # @!attribute employer_contribution_in_cents + # Employer monthly contribution in cents; null unless the row is an election + # + # @return [Integer, nil] + optional :employer_contribution_in_cents, Integer, nil?: true + + # @!attribute enrollment_window_end + # Enrollment / open-enrollment window end date (YYYY-MM-DD); null when open-ended + # + # @return [Date, nil] + optional :enrollment_window_end, Date, nil?: true + + # @!attribute plan_name + # Chosen benefit plan name; null unless the row is an election + # + # @return [String, nil] + optional :plan_name, String, nil?: true + + # @!attribute premium_in_cents + # Total monthly plan premium in cents; null unless the row is an election + # + # @return [Integer, nil] + optional :premium_in_cents, Integer, nil?: true + + # @!attribute tier_name + # Chosen benefit plan tier name (e.g., Employee Only); null unless the row is an + # election + # + # @return [String, nil] + optional :tier_name, String, nil?: true + + # @!method initialize(id:, benefit_plan_year_id:, benefit_type:, cancelled_date:, election_status:, employer_id:, employer_name:, enrollment_window_start:, in_last_month_of_coverage:, is_within_enrollment_window:, issued_date:, plan_year_coverage_end:, policy_status:, product_code:, product_name:, requires_qle_for_reissue:, carrier_name: nil, coverage_end: nil, coverage_start: nil, employee_deduction_in_cents: nil, employer_contribution_in_cents: nil, enrollment_window_end: nil, plan_name: nil, premium_in_cents: nil, tier_name: nil) + # Some parameter documentations has been truncated, see + # {VitableConnect::Models::MemberListEnrollmentsResponse::Data} for more details. + # + # Wire serializer for :class:`MemberEnrollmentDTO` (one benefit enrollment row). + # + # @param id [String] Opaque, stable enrollment identifier used to target enrollment actions + # + # @param benefit_plan_year_id [String] Exact benefit plan-year identifier for this enrollment + # + # @param benefit_type [Symbol, VitableConnect::Models::MemberListEnrollmentsResponse::Data::BenefitType] - `Medical` - Medical + # + # @param cancelled_date [Date, nil] Earliest applicable coverage boundary (YYYY-MM-DD) when coverage was cancelled b + # + # @param election_status [Symbol, VitableConnect::Models::MemberListEnrollmentsResponse::Data::ElectionStatus] - `Enrolled` - Enrolled + # + # @param employer_id [String] Exact employer identifier for this enrollment + # + # @param employer_name [String] Name of the employer the enrollment is through + # + # @param enrollment_window_start [Date] First date the member could answer this enrollment (YYYY-MM-DD). Open enrollment + # + # @param in_last_month_of_coverage [Boolean] True when today falls in the final month of the plan-year coverage window; drive + # + # @param is_within_enrollment_window [Boolean] True when today falls inside the enrollment window this member has to answer in; + # + # @param issued_date [Date] Date the enrollment record was created (YYYY-MM-DD), the value Ops labels Issued + # + # @param plan_year_coverage_end [Date, nil] Benefit plan-year coverage end date (YYYY-MM-DD), distinct from this enrollment' + # + # @param policy_status [Symbol, VitableConnect::Models::MemberListEnrollmentsResponse::Data::PolicyStatus, nil] - `Coverage Upcoming` - Coverage Upcoming + # + # @param product_code [Symbol, VitableConnect::Models::MemberListEnrollmentsResponse::Data::ProductCode] - `EBA` - Eba Mec + # + # @param product_name [String] Display name of the benefit product + # + # @param requires_qle_for_reissue [Boolean] Whether a qualifying life event would be required to reissue this enrollment und + # + # @param carrier_name [String, nil] Insurance carrier name; null when no active carrier period is resolvable + # + # @param coverage_end [Date, nil] Coverage window end date (YYYY-MM-DD); null while coverage is open-ended + # + # @param coverage_start [Date, nil] Coverage window start date (YYYY-MM-DD) + # + # @param employee_deduction_in_cents [Integer, nil] Employee monthly payroll deduction in cents; null unless the row is an election + # + # @param employer_contribution_in_cents [Integer, nil] Employer monthly contribution in cents; null unless the row is an election + # + # @param enrollment_window_end [Date, nil] Enrollment / open-enrollment window end date (YYYY-MM-DD); null when open-ended + # + # @param plan_name [String, nil] Chosen benefit plan name; null unless the row is an election + # + # @param premium_in_cents [Integer, nil] Total monthly plan premium in cents; null unless the row is an election + # + # @param tier_name [String, nil] Chosen benefit plan tier name (e.g., Employee Only); null unless the row is an e + + # - `Medical` - Medical + # - `Dental` - Dental + # - `Vision` - Vision + # - `Hospital` - Hospital + # + # @see VitableConnect::Models::MemberListEnrollmentsResponse::Data#benefit_type + module BenefitType + extend VitableConnect::Internal::Type::Enum + + MEDICAL = :Medical + DENTAL = :Dental + VISION = :Vision + HOSPITAL = :Hospital + + # @!method self.values + # @return [Array] + end + + # - `Enrolled` - Enrolled + # - `Waived` - Waived + # - `Pending` - Pending + # - `Expired` - Expired + # + # @see VitableConnect::Models::MemberListEnrollmentsResponse::Data#election_status + module ElectionStatus + extend VitableConnect::Internal::Type::Enum + + ENROLLED = :Enrolled + WAIVED = :Waived + PENDING = :Pending + EXPIRED = :Expired + + # @!method self.values + # @return [Array] + end + + # - `Coverage Upcoming` - Coverage Upcoming + # - `Coverage Effective` - Coverage Effective + # - `Coverage Ended` - Coverage Ended + # - `Cancelled` - Cancelled + # + # @see VitableConnect::Models::MemberListEnrollmentsResponse::Data#policy_status + module PolicyStatus + extend VitableConnect::Internal::Type::Enum + + COVERAGE_UPCOMING = :"Coverage Upcoming" + COVERAGE_EFFECTIVE = :"Coverage Effective" + COVERAGE_ENDED = :"Coverage Ended" + CANCELLED = :Cancelled + + # @!method self.values + # @return [Array] + end + + # - `EBA` - Eba Mec + # - `VPC` - Vpc Enhanced + # - `VPC_CORE` - Vpc Core + # - `MEC` - Vpc Mec + # - `MEC2` - Mec2 + # - `MEC_PLUS` - Mec Plus + # - `MVP` - Mvp + # - `MVP2` - Mvp2 + # - `MVPSL` - Mvpsl + # - `MVPSL2` - Mvpsl2 + # - `VD` - Dental + # - `VV` - Vision + # - `ICHRA` - Ichra + # - `ICHRA_PREMIUM_PLUS` - Ichra Premium Plus + # - `ICHRA_REIMBURSEMENT_ONLY` - Ichra Reimbursement Only + # + # @see VitableConnect::Models::MemberListEnrollmentsResponse::Data#product_code + module ProductCode + extend VitableConnect::Internal::Type::Enum + + EBA = :EBA + VPC = :VPC + VPC_CORE = :VPC_CORE + MEC = :MEC + MEC2 = :MEC2 + MEC_PLUS = :MEC_PLUS + MVP = :MVP + MVP2 = :MVP2 + MVPSL = :MVPSL + MVPSL2 = :MVPSL2 + VD = :VD + VV = :VV + ICHRA = :ICHRA + ICHRA_PREMIUM_PLUS = :ICHRA_PREMIUM_PLUS + ICHRA_REIMBURSEMENT_ONLY = :ICHRA_REIMBURSEMENT_ONLY + + # @!method self.values + # @return [Array] + end + end + end + end +end diff --git a/lib/vitable_connect/models/member_list_id_cards_params.rb b/lib/vitable_connect/models/member_list_id_cards_params.rb new file mode 100644 index 0000000..61613f6 --- /dev/null +++ b/lib/vitable_connect/models/member_list_id_cards_params.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # @see VitableConnect::Resources::Members#list_id_cards + class MemberListIDCardsParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + # @!attribute member_id + # Unique member identifier (mbr\_\*) + # + # @return [String] + required :member_id, String + + # @!method initialize(member_id:, request_options: {}) + # @param member_id [String] Unique member identifier (mbr\_\*) + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}] + end + end +end diff --git a/lib/vitable_connect/models/member_list_id_cards_response.rb b/lib/vitable_connect/models/member_list_id_cards_response.rb new file mode 100644 index 0000000..78b12fb --- /dev/null +++ b/lib/vitable_connect/models/member_list_id_cards_response.rb @@ -0,0 +1,368 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # @see VitableConnect::Resources::Members#list_id_cards + class MemberListIDCardsResponse < VitableConnect::Internal::Type::BaseModel + # @!attribute data + # + # @return [Array] + required :data, + -> { VitableConnect::Internal::Type::ArrayOf[VitableConnect::Models::MemberListIDCardsResponse::Data] } + + # @!method initialize(data:) + # Unpaginated `{"data": [...]}` list of member digital benefit cards. + # + # @param data [Array] + + class Data < VitableConnect::Internal::Type::BaseModel + # @!attribute card_type + # - `medical` - medical + # - `dental` - dental + # - `vision` - vision + # - `rx` - rx + # + # @return [Symbol, VitableConnect::Models::MemberListIDCardsResponse::Data::CardType] + required :card_type, enum: -> { VitableConnect::Models::MemberListIDCardsResponse::Data::CardType } + + # @!attribute group_id + # Group number printed on the card (the rx group id for an rx card) + # + # @return [String] + required :group_id, String + + # @!attribute group_member_id + # Member id printed on the card (the Ventegra cardholder id for an rx card) + # + # @return [String] + required :group_member_id, String + + # @!attribute member_name + # Name of the member the card is issued to + # + # @return [String] + required :member_name, String + + # @!attribute nsa_table + # No Surprises Act cost-sharing table rendered on the card; empty for an rx card + # + # @return [Array>] + required :nsa_table, + VitableConnect::Internal::Type::ArrayOf[VitableConnect::Internal::Type::ArrayOf[String]] + + # @!attribute benefit_code + # - `EBA` - Eba Mec + # - `VPC` - Vpc Enhanced + # - `VPC_CORE` - Vpc Core + # - `MEC` - Vpc Mec + # - `MEC2` - Mec2 + # - `MEC_PLUS` - Mec Plus + # - `MVP` - Mvp + # - `MVP2` - Mvp2 + # - `MVPSL` - Mvpsl + # - `MVPSL2` - Mvpsl2 + # - `VD` - Dental + # - `VV` - Vision + # - `ICHRA` - Ichra + # - `ICHRA_PREMIUM_PLUS` - Ichra Premium Plus + # - `ICHRA_REIMBURSEMENT_ONLY` - Ichra Reimbursement Only + # + # @return [Symbol, VitableConnect::Models::MemberListIDCardsResponse::Data::BenefitCode, nil] + optional :benefit_code, + enum: -> { VitableConnect::Models::MemberListIDCardsResponse::Data::BenefitCode }, + nil?: true + + # @!attribute carrier_phone + # Carrier phone number on the card; null for an rx card + # + # @return [String, nil] + optional :carrier_phone, String, nil?: true + + # @!attribute carrier_website + # Carrier website on the card; null for an rx card + # + # @return [String, nil] + optional :carrier_website, String, nil?: true + + # @!attribute claims_payer_display_name + # Claims payer shown on the card + # + # @return [String, nil] + optional :claims_payer_display_name, String, nil?: true + + # @!attribute employer_name + # Employer the card's coverage is through; null for an rx card without group info + # + # @return [String, nil] + optional :employer_name, String, nil?: true + + # @!attribute general_disclaimer + # General disclaimer text; null for an rx card + # + # @return [String, nil] + optional :general_disclaimer, String, nil?: true + + # @!attribute network + # Provider network shown on the card; null for an rx card + # + # @return [VitableConnect::Models::MemberListIDCardsResponse::Data::Network, nil] + optional :network, -> { VitableConnect::Models::MemberListIDCardsResponse::Data::Network }, nil?: true + + # @!attribute plan_disclaimer + # Plan-specific disclaimer text; null for an rx card + # + # @return [String, nil] + optional :plan_disclaimer, String, nil?: true + + # @!attribute plan_name + # Benefit plan name on the card; null for a consumer-membership rx card + # + # @return [String, nil] + optional :plan_name, String, nil?: true + + # @!method initialize(card_type:, group_id:, group_member_id:, member_name:, nsa_table:, benefit_code: nil, carrier_phone: nil, carrier_website: nil, claims_payer_display_name: nil, employer_name: nil, general_disclaimer: nil, network: nil, plan_disclaimer: nil, plan_name: nil) + # Some parameter documentations has been truncated, see + # {VitableConnect::Models::MemberListIDCardsResponse::Data} for more details. + # + # Wire serializer for :class:`DigitalBenefitCardDTO` (one benefit ID card). + # + # @param card_type [Symbol, VitableConnect::Models::MemberListIDCardsResponse::Data::CardType] - `medical` - medical + # + # @param group_id [String] Group number printed on the card (the rx group id for an rx card) + # + # @param group_member_id [String] Member id printed on the card (the Ventegra cardholder id for an rx card) + # + # @param member_name [String] Name of the member the card is issued to + # + # @param nsa_table [Array>] No Surprises Act cost-sharing table rendered on the card; empty for an rx card + # + # @param benefit_code [Symbol, VitableConnect::Models::MemberListIDCardsResponse::Data::BenefitCode, nil] - `EBA` - Eba Mec + # + # @param carrier_phone [String, nil] Carrier phone number on the card; null for an rx card + # + # @param carrier_website [String, nil] Carrier website on the card; null for an rx card + # + # @param claims_payer_display_name [String, nil] Claims payer shown on the card + # + # @param employer_name [String, nil] Employer the card's coverage is through; null for an rx card without group info + # + # @param general_disclaimer [String, nil] General disclaimer text; null for an rx card + # + # @param network [VitableConnect::Models::MemberListIDCardsResponse::Data::Network, nil] Provider network shown on the card; null for an rx card + # + # @param plan_disclaimer [String, nil] Plan-specific disclaimer text; null for an rx card + # + # @param plan_name [String, nil] Benefit plan name on the card; null for a consumer-membership rx card + + # - `medical` - medical + # - `dental` - dental + # - `vision` - vision + # - `rx` - rx + # + # @see VitableConnect::Models::MemberListIDCardsResponse::Data#card_type + module CardType + extend VitableConnect::Internal::Type::Enum + + MEDICAL = :medical + DENTAL = :dental + VISION = :vision + RX = :rx + + # @!method self.values + # @return [Array] + end + + # - `EBA` - Eba Mec + # - `VPC` - Vpc Enhanced + # - `VPC_CORE` - Vpc Core + # - `MEC` - Vpc Mec + # - `MEC2` - Mec2 + # - `MEC_PLUS` - Mec Plus + # - `MVP` - Mvp + # - `MVP2` - Mvp2 + # - `MVPSL` - Mvpsl + # - `MVPSL2` - Mvpsl2 + # - `VD` - Dental + # - `VV` - Vision + # - `ICHRA` - Ichra + # - `ICHRA_PREMIUM_PLUS` - Ichra Premium Plus + # - `ICHRA_REIMBURSEMENT_ONLY` - Ichra Reimbursement Only + # + # @see VitableConnect::Models::MemberListIDCardsResponse::Data#benefit_code + module BenefitCode + extend VitableConnect::Internal::Type::Enum + + EBA = :EBA + VPC = :VPC + VPC_CORE = :VPC_CORE + MEC = :MEC + MEC2 = :MEC2 + MEC_PLUS = :MEC_PLUS + MVP = :MVP + MVP2 = :MVP2 + MVPSL = :MVPSL + MVPSL2 = :MVPSL2 + VD = :VD + VV = :VV + ICHRA = :ICHRA + ICHRA_PREMIUM_PLUS = :ICHRA_PREMIUM_PLUS + ICHRA_REIMBURSEMENT_ONLY = :ICHRA_REIMBURSEMENT_ONLY + + # @!method self.values + # @return [Array] + end + + # @see VitableConnect::Models::MemberListIDCardsResponse::Data#network + class Network < VitableConnect::Internal::Type::BaseModel + # @!attribute address + # Shared read serializer for a postal address on public API responses. + # + # One definition for the address block every public resource emits (employer, + # employee, …), so the 5-field shape isn't hand-rolled per endpoint. Read-only: it + # renders an already-built address value object (e.g. `AddressDVO`) whose + # attributes map 1:1 to these fields. + # + # @return [VitableConnect::Models::MemberListIDCardsResponse::Data::Network::Address] + required :address, -> { VitableConnect::Models::MemberListIDCardsResponse::Data::Network::Address } + + # @!attribute logo + # + # @return [String, nil] + required :logo, String, nil?: true + + # @!attribute member_phone + # + # @return [String, nil] + required :member_phone, String, nil?: true + + # @!attribute name + # Name of the network + # + # @return [String] + required :name, String + + # @!attribute phone + # + # @return [String] + required :phone, String + + # @!attribute provider_phone + # + # @return [String, nil] + required :provider_phone, String, nil?: true + + # @!attribute website + # Website of the network + # + # @return [String] + required :website, String + + # @!attribute edi + # Network's EDI + # + # @return [String, nil] + optional :edi, String, nil?: true + + # @!attribute member_website + # Website for members + # + # @return [String, nil] + optional :member_website, String, nil?: true + + # @!attribute provider_website + # Website for providers + # + # @return [String, nil] + optional :provider_website, String, nil?: true + + response_only do + # @!attribute id + # + # @return [String] + required :id, String + end + + # @!method initialize(id:, address:, logo:, member_phone:, name:, phone:, provider_phone:, website:, edi: nil, member_website: nil, provider_website: nil) + # Some parameter documentations has been truncated, see + # {VitableConnect::Models::MemberListIDCardsResponse::Data::Network} for more + # details. + # + # Provider network shown on the card; null for an rx card + # + # @param id [String] + # + # @param address [VitableConnect::Models::MemberListIDCardsResponse::Data::Network::Address] Shared read serializer for a postal address on public API responses. + # + # @param logo [String, nil] + # + # @param member_phone [String, nil] + # + # @param name [String] Name of the network + # + # @param phone [String] + # + # @param provider_phone [String, nil] + # + # @param website [String] Website of the network + # + # @param edi [String, nil] Network's EDI + # + # @param member_website [String, nil] Website for members + # + # @param provider_website [String, nil] Website for providers + + # @see VitableConnect::Models::MemberListIDCardsResponse::Data::Network#address + class Address < VitableConnect::Internal::Type::BaseModel + # @!attribute address_line_1 + # Primary street address. + # + # @return [String] + required :address_line_1, String + + # @!attribute address_line_2 + # Secondary street address (apt, suite, etc.). + # + # @return [String, nil] + required :address_line_2, String, nil?: true + + # @!attribute city + # City name. + # + # @return [String] + required :city, String + + # @!attribute state + # Two-letter state code (e.g. `CA`, `NY`). + # + # @return [String] + required :state, String + + # @!attribute zipcode + # ZIP code (5 or 9 digit). + # + # @return [String] + required :zipcode, String + + # @!method initialize(address_line_1:, address_line_2:, city:, state:, zipcode:) + # Shared read serializer for a postal address on public API responses. + # + # One definition for the address block every public resource emits (employer, + # employee, …), so the 5-field shape isn't hand-rolled per endpoint. Read-only: it + # renders an already-built address value object (e.g. `AddressDVO`) whose + # attributes map 1:1 to these fields. + # + # @param address_line_1 [String] Primary street address. + # + # @param address_line_2 [String, nil] Secondary street address (apt, suite, etc.). + # + # @param city [String] City name. + # + # @param state [String] Two-letter state code (e.g. `CA`, `NY`). + # + # @param zipcode [String] ZIP code (5 or 9 digit). + end + end + end + end + end +end diff --git a/lib/vitable_connect/models/member_list_params.rb b/lib/vitable_connect/models/member_list_params.rb new file mode 100644 index 0000000..6bb24fb --- /dev/null +++ b/lib/vitable_connect/models/member_list_params.rb @@ -0,0 +1,42 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # @see VitableConnect::Resources::Members#list + class MemberListParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + # @!attribute limit + # Items per page (default: 20, max: 100) + # + # @return [Integer, nil] + optional :limit, Integer + + # @!attribute page + # Page number (default: 1) + # + # @return [Integer, nil] + optional :page, Integer + + # @!attribute search + # Case-insensitive search across member name, email, and phone number; exact match + # on member id (prefixed or raw uuid) + # + # @return [String, nil] + optional :search, String + + # @!method initialize(limit: nil, page: nil, search: nil, request_options: {}) + # Some parameter documentations has been truncated, see + # {VitableConnect::Models::MemberListParams} for more details. + # + # @param limit [Integer] Items per page (default: 20, max: 100) + # + # @param page [Integer] Page number (default: 1) + # + # @param search [String] Case-insensitive search across member name, email, and phone number; exact match + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}] + end + end +end diff --git a/lib/vitable_connect/models/member_list_qualifying_life_events_params.rb b/lib/vitable_connect/models/member_list_qualifying_life_events_params.rb new file mode 100644 index 0000000..c1e0e55 --- /dev/null +++ b/lib/vitable_connect/models/member_list_qualifying_life_events_params.rb @@ -0,0 +1,58 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # @see VitableConnect::Resources::Members#list_qualifying_life_events + class MemberListQualifyingLifeEventsParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + # @!attribute member_id + # Unique member identifier (mbr\_\*) + # + # @return [String] + required :member_id, String + + # @!attribute limit + # Items per page (default: 20, max: 100) + # + # @return [Integer, nil] + optional :limit, Integer + + # @!attribute page + # Page number (default: 1) + # + # @return [Integer, nil] + optional :page, Integer + + # @!attribute status + # Optional. Filter to a single QLE status; omit to return all statuses. + # + # @return [Symbol, VitableConnect::Models::MemberListQualifyingLifeEventsParams::Status, nil] + optional :status, enum: -> { VitableConnect::MemberListQualifyingLifeEventsParams::Status } + + # @!method initialize(member_id:, limit: nil, page: nil, status: nil, request_options: {}) + # @param member_id [String] Unique member identifier (mbr\_\*) + # + # @param limit [Integer] Items per page (default: 20, max: 100) + # + # @param page [Integer] Page number (default: 1) + # + # @param status [Symbol, VitableConnect::Models::MemberListQualifyingLifeEventsParams::Status] Optional. Filter to a single QLE status; omit to return all statuses. + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}] + + # Optional. Filter to a single QLE status; omit to return all statuses. + module Status + extend VitableConnect::Internal::Type::Enum + + APPROVED = :approved + DENIED = :denied + PENDING = :pending + + # @!method self.values + # @return [Array] + end + end + end +end diff --git a/lib/vitable_connect/models/member_list_qualifying_life_events_response.rb b/lib/vitable_connect/models/member_list_qualifying_life_events_response.rb new file mode 100644 index 0000000..4c3561b --- /dev/null +++ b/lib/vitable_connect/models/member_list_qualifying_life_events_response.rb @@ -0,0 +1,154 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # @see VitableConnect::Resources::Members#list_qualifying_life_events + class MemberListQualifyingLifeEventsResponse < VitableConnect::Internal::Type::BaseModel + # @!attribute id + # Opaque qualifying life event identifier + # + # @return [String] + required :id, String + + # @!attribute event_type + # - `lost_job_based_coverage` - lost_job_based_coverage + # - `aged_off_parent_plan` - aged_off_parent_plan + # - `lost_medicaid_chip_medicare` - lost_medicaid_chip_medicare + # - `lost_decertified_individual_plan` - lost_decertified_individual_plan + # - `married` - married + # - `divorced` - divorced + # - `had_baby` - had_baby + # - `adopted_child` - adopted_child + # - `foster_care_placement` - foster_care_placement + # - `death_of_spouse_or_dependent` - death_of_spouse_or_dependent + # - `court_ordered` - court_ordered + # - `moved_to_new_coverage_area` - moved_to_new_coverage_area + # - `moved_to_us` - moved_to_us + # - `moved_to_or_from_school_housing` - moved_to_or_from_school_housing + # - `moved_to_or_from_seasonal_work_housing` - + # moved_to_or_from_seasonal_work_housing + # - `became_us_citizen` - became_us_citizen + # - `left_incarceration` - left_incarceration + # - `gained_tribal_status` - gained_tribal_status + # - `started_or_ended_americorps_service` - started_or_ended_americorps_service + # - `new_child` - new_child + # - `other` - other + # + # @return [Symbol, VitableConnect::Models::MemberListQualifyingLifeEventsResponse::EventType] + required :event_type, + enum: -> { VitableConnect::Models::MemberListQualifyingLifeEventsResponse::EventType } + + # @!attribute event_type_label + # Human-readable label for event_type + # + # @return [String] + required :event_type_label, String + + # @!attribute other_event + # Custom event description when event_type is Other; otherwise normally null + # + # @return [String, nil] + required :other_event, String, nil?: true + + # @!attribute status + # - `pending` - Pending + # - `approved` - Approved + # - `denied` - Denied + # + # @return [Symbol, VitableConnect::Models::MemberListQualifyingLifeEventsResponse::Status] + required :status, enum: -> { VitableConnect::Models::MemberListQualifyingLifeEventsResponse::Status } + + # @!attribute submitted_at + # When the member submitted the event + # + # @return [Time] + required :submitted_at, Time + + # @!method initialize(id:, event_type:, event_type_label:, other_event:, status:, submitted_at:) + # Some parameter documentations has been truncated, see + # {VitableConnect::Models::MemberListQualifyingLifeEventsResponse} for more + # details. + # + # @param id [String] Opaque qualifying life event identifier + # + # @param event_type [Symbol, VitableConnect::Models::MemberListQualifyingLifeEventsResponse::EventType] - `lost_job_based_coverage` - lost_job_based_coverage + # + # @param event_type_label [String] Human-readable label for event_type + # + # @param other_event [String, nil] Custom event description when event_type is Other; otherwise normally null + # + # @param status [Symbol, VitableConnect::Models::MemberListQualifyingLifeEventsResponse::Status] - `pending` - Pending + # + # @param submitted_at [Time] When the member submitted the event + + # - `lost_job_based_coverage` - lost_job_based_coverage + # - `aged_off_parent_plan` - aged_off_parent_plan + # - `lost_medicaid_chip_medicare` - lost_medicaid_chip_medicare + # - `lost_decertified_individual_plan` - lost_decertified_individual_plan + # - `married` - married + # - `divorced` - divorced + # - `had_baby` - had_baby + # - `adopted_child` - adopted_child + # - `foster_care_placement` - foster_care_placement + # - `death_of_spouse_or_dependent` - death_of_spouse_or_dependent + # - `court_ordered` - court_ordered + # - `moved_to_new_coverage_area` - moved_to_new_coverage_area + # - `moved_to_us` - moved_to_us + # - `moved_to_or_from_school_housing` - moved_to_or_from_school_housing + # - `moved_to_or_from_seasonal_work_housing` - + # moved_to_or_from_seasonal_work_housing + # - `became_us_citizen` - became_us_citizen + # - `left_incarceration` - left_incarceration + # - `gained_tribal_status` - gained_tribal_status + # - `started_or_ended_americorps_service` - started_or_ended_americorps_service + # - `new_child` - new_child + # - `other` - other + # + # @see VitableConnect::Models::MemberListQualifyingLifeEventsResponse#event_type + module EventType + extend VitableConnect::Internal::Type::Enum + + LOST_JOB_BASED_COVERAGE = :lost_job_based_coverage + AGED_OFF_PARENT_PLAN = :aged_off_parent_plan + LOST_MEDICAID_CHIP_MEDICARE = :lost_medicaid_chip_medicare + LOST_DECERTIFIED_INDIVIDUAL_PLAN = :lost_decertified_individual_plan + MARRIED = :married + DIVORCED = :divorced + HAD_BABY = :had_baby + ADOPTED_CHILD = :adopted_child + FOSTER_CARE_PLACEMENT = :foster_care_placement + DEATH_OF_SPOUSE_OR_DEPENDENT = :death_of_spouse_or_dependent + COURT_ORDERED = :court_ordered + MOVED_TO_NEW_COVERAGE_AREA = :moved_to_new_coverage_area + MOVED_TO_US = :moved_to_us + MOVED_TO_OR_FROM_SCHOOL_HOUSING = :moved_to_or_from_school_housing + MOVED_TO_OR_FROM_SEASONAL_WORK_HOUSING = :moved_to_or_from_seasonal_work_housing + BECAME_US_CITIZEN = :became_us_citizen + LEFT_INCARCERATION = :left_incarceration + GAINED_TRIBAL_STATUS = :gained_tribal_status + STARTED_OR_ENDED_AMERICORPS_SERVICE = :started_or_ended_americorps_service + NEW_CHILD = :new_child + OTHER = :other + + # @!method self.values + # @return [Array] + end + + # - `pending` - Pending + # - `approved` - Approved + # - `denied` - Denied + # + # @see VitableConnect::Models::MemberListQualifyingLifeEventsResponse#status + module Status + extend VitableConnect::Internal::Type::Enum + + PENDING = :pending + APPROVED = :approved + DENIED = :denied + + # @!method self.values + # @return [Array] + end + end + end +end diff --git a/lib/vitable_connect/models/member_list_response.rb b/lib/vitable_connect/models/member_list_response.rb new file mode 100644 index 0000000..e874d32 --- /dev/null +++ b/lib/vitable_connect/models/member_list_response.rb @@ -0,0 +1,306 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # @see VitableConnect::Resources::Members#list + class MemberListResponse < VitableConnect::Internal::Type::BaseModel + # @!attribute first_name + # Member's legal first name + # + # @return [String] + required :first_name, String + + # @!attribute last_name + # Member's legal last name + # + # @return [String] + required :last_name, String + + # @!attribute address + # Member's residential address + # + # @return [VitableConnect::Models::MemberListResponse::Address, nil] + optional :address, -> { VitableConnect::Models::MemberListResponse::Address }, nil?: true + + # @!attribute email + # Email address + # + # @return [String, nil] + optional :email, String, nil?: true + + # @!attribute phone + # Phone number (10-digit US domestic string) + # + # @return [String, nil] + optional :phone, String, nil?: true + + response_only do + # @!attribute id + # Unique member identifier with 'mbr\_' prefix + # + # @return [String] + required :id, String + end + + # @!method initialize(id:, first_name:, last_name:, address: nil, email: nil, phone: nil) + # A member in the organization's directory: identity, contact details, address, + # and join date. + # + # @param id [String] Unique member identifier with 'mbr\_' prefix + # + # @param first_name [String] Member's legal first name + # + # @param last_name [String] Member's legal last name + # + # @param address [VitableConnect::Models::MemberListResponse::Address, nil] Member's residential address + # + # @param email [String, nil] Email address + # + # @param phone [String, nil] Phone number (10-digit US domestic string) + + # @see VitableConnect::Models::MemberListResponse#address + class Address < VitableConnect::Internal::Type::BaseModel + # @!attribute address_line_1 + # Primary street address + # + # @return [String] + required :address_line_1, String + + # @!attribute city + # City name + # + # @return [String] + required :city, String + + # @!attribute state + # - `AL` - AL + # - `AK` - AK + # - `AZ` - AZ + # - `AR` - AR + # - `CA` - CA + # - `CO` - CO + # - `CT` - CT + # - `DC` - DC + # - `DE` - DE + # - `FL` - FL + # - `GA` - GA + # - `HI` - HI + # - `ID` - ID + # - `IL` - IL + # - `IN` - IN + # - `IA` - IA + # - `KS` - KS + # - `KY` - KY + # - `LA` - LA + # - `ME` - ME + # - `MD` - MD + # - `MA` - MA + # - `MI` - MI + # - `MN` - MN + # - `MS` - MS + # - `MO` - MO + # - `MT` - MT + # - `NE` - NE + # - `NV` - NV + # - `NH` - NH + # - `NJ` - NJ + # - `NM` - NM + # - `NY` - NY + # - `NC` - NC + # - `ND` - ND + # - `OH` - OH + # - `OK` - OK + # - `OR` - OR + # - `PA` - PA + # - `RI` - RI + # - `SC` - SC + # - `SD` - SD + # - `TN` - TN + # - `TX` - TX + # - `UT` - UT + # - `VT` - VT + # - `VA` - VA + # - `WA` - WA + # - `WI` - WI + # - `WV` - WV + # - `WY` - WY + # - `PR` - PR + # - `GU` - GU + # - `AS` - AS + # - `VI` - VI + # - `MP` - MP + # - `MH` - MH + # - `PW` - PW + # - `FM` - FM + # - `AE` - AE + # - `AA` - AA + # - `AP` - AP + # + # @return [Symbol, VitableConnect::Models::MemberListResponse::Address::State] + required :state, enum: -> { VitableConnect::Models::MemberListResponse::Address::State } + + # @!attribute zipcode + # ZIP code (5 or 9 digit) + # + # @return [String] + required :zipcode, String + + # @!attribute address_line_2 + # Secondary street address (apt, suite, etc.) + # + # @return [String, nil] + optional :address_line_2, String, nil?: true + + # @!method initialize(address_line_1:, city:, state:, zipcode:, address_line_2: nil) + # Some parameter documentations has been truncated, see + # {VitableConnect::Models::MemberListResponse::Address} for more details. + # + # Member's residential address + # + # @param address_line_1 [String] Primary street address + # + # @param city [String] City name + # + # @param state [Symbol, VitableConnect::Models::MemberListResponse::Address::State] - `AL` - AL + # + # @param zipcode [String] ZIP code (5 or 9 digit) + # + # @param address_line_2 [String, nil] Secondary street address (apt, suite, etc.) + + # - `AL` - AL + # - `AK` - AK + # - `AZ` - AZ + # - `AR` - AR + # - `CA` - CA + # - `CO` - CO + # - `CT` - CT + # - `DC` - DC + # - `DE` - DE + # - `FL` - FL + # - `GA` - GA + # - `HI` - HI + # - `ID` - ID + # - `IL` - IL + # - `IN` - IN + # - `IA` - IA + # - `KS` - KS + # - `KY` - KY + # - `LA` - LA + # - `ME` - ME + # - `MD` - MD + # - `MA` - MA + # - `MI` - MI + # - `MN` - MN + # - `MS` - MS + # - `MO` - MO + # - `MT` - MT + # - `NE` - NE + # - `NV` - NV + # - `NH` - NH + # - `NJ` - NJ + # - `NM` - NM + # - `NY` - NY + # - `NC` - NC + # - `ND` - ND + # - `OH` - OH + # - `OK` - OK + # - `OR` - OR + # - `PA` - PA + # - `RI` - RI + # - `SC` - SC + # - `SD` - SD + # - `TN` - TN + # - `TX` - TX + # - `UT` - UT + # - `VT` - VT + # - `VA` - VA + # - `WA` - WA + # - `WI` - WI + # - `WV` - WV + # - `WY` - WY + # - `PR` - PR + # - `GU` - GU + # - `AS` - AS + # - `VI` - VI + # - `MP` - MP + # - `MH` - MH + # - `PW` - PW + # - `FM` - FM + # - `AE` - AE + # - `AA` - AA + # - `AP` - AP + # + # @see VitableConnect::Models::MemberListResponse::Address#state + module State + extend VitableConnect::Internal::Type::Enum + + AL = :AL + AK = :AK + AZ = :AZ + AR = :AR + CA = :CA + CO = :CO + CT = :CT + DC = :DC + DE = :DE + FL = :FL + GA = :GA + HI = :HI + ID = :ID + IL = :IL + IN = :IN + IA = :IA + KS = :KS + KY = :KY + LA = :LA + ME = :ME + MD = :MD + MA = :MA + MI = :MI + MN = :MN + MS = :MS + MO = :MO + MT = :MT + NE = :NE + NV = :NV + NH = :NH + NJ = :NJ + NM = :NM + NY = :NY + NC = :NC + ND = :ND + OH = :OH + OK = :OK + OR = :OR + PA = :PA + RI = :RI + SC = :SC + SD = :SD + TN = :TN + TX = :TX + UT = :UT + VT = :VT + VA = :VA + WA = :WA + WI = :WI + WV = :WV + WY = :WY + PR = :PR + GU = :GU + AS = :AS + VI = :VI + MP = :MP + MH = :MH + PW = :PW + FM = :FM + AE = :AE + AA = :AA + AP = :AP + + # @!method self.values + # @return [Array] + end + end + end + end +end diff --git a/lib/vitable_connect/models/member_retrieve_household_params.rb b/lib/vitable_connect/models/member_retrieve_household_params.rb new file mode 100644 index 0000000..d4718a2 --- /dev/null +++ b/lib/vitable_connect/models/member_retrieve_household_params.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # @see VitableConnect::Resources::Members#retrieve_household + class MemberRetrieveHouseholdParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + # @!attribute member_id + # Unique member identifier (mbr\_\*) + # + # @return [String] + required :member_id, String + + # @!method initialize(member_id:, request_options: {}) + # @param member_id [String] Unique member identifier (mbr\_\*) + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}] + end + end +end diff --git a/lib/vitable_connect/models/member_retrieve_household_response.rb b/lib/vitable_connect/models/member_retrieve_household_response.rb new file mode 100644 index 0000000..9806824 --- /dev/null +++ b/lib/vitable_connect/models/member_retrieve_household_response.rb @@ -0,0 +1,128 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # @see VitableConnect::Resources::Members#retrieve_household + class MemberRetrieveHouseholdResponse < VitableConnect::Internal::Type::BaseModel + # @!attribute data + # + # @return [Array] + required :data, + -> { VitableConnect::Internal::Type::ArrayOf[VitableConnect::Models::MemberRetrieveHouseholdResponse::Data] } + + # @!method initialize(data:) + # Unpaginated `{"data": [...]}` list of the members of a member's household. + # + # @param data [Array] + + class Data < VitableConnect::Internal::Type::BaseModel + # @!attribute date_of_birth + # Date of birth (YYYY-MM-DD) + # + # @return [Date] + required :date_of_birth, Date + + # @!attribute first_name + # Household member's first name + # + # @return [String] + required :first_name, String + + # @!attribute household_admin_in + # Whether this participant is a household admin (the account holder always is) + # + # @return [Boolean] + required :household_admin_in, VitableConnect::Internal::Type::Boolean + + # @!attribute last_name + # Household member's last name + # + # @return [String] + required :last_name, String + + # @!attribute member_type + # - `Account Holder` - Account Holder + # - `Dependent` - Dependent + # - `Inactive` - Inactive + # + # @return [Symbol, VitableConnect::Models::MemberRetrieveHouseholdResponse::Data::MemberType] + required :member_type, + enum: -> { VitableConnect::Models::MemberRetrieveHouseholdResponse::Data::MemberType } + + # @!attribute relationship + # - `Child` - Child + # - `Spouse` - Spouse + # - `Roommate` - Roommate + # - `Other` - Other + # + # @return [Symbol, VitableConnect::Models::MemberRetrieveHouseholdResponse::Data::Relationship, nil] + optional :relationship, + enum: -> { VitableConnect::Models::MemberRetrieveHouseholdResponse::Data::Relationship }, + nil?: true + + response_only do + # @!attribute member_id + # Member identifier with 'mbr\_' prefix + # + # @return [String] + required :member_id, String + end + + # @!method initialize(date_of_birth:, first_name:, household_admin_in:, last_name:, member_id:, member_type:, relationship: nil) + # Some parameter documentations has been truncated, see + # {VitableConnect::Models::MemberRetrieveHouseholdResponse::Data} for more + # details. + # + # Wire serializer for :class:`HouseholdMemberDTO` (one household participant). + # + # @param date_of_birth [Date] Date of birth (YYYY-MM-DD) + # + # @param first_name [String] Household member's first name + # + # @param household_admin_in [Boolean] Whether this participant is a household admin (the account holder always is) + # + # @param last_name [String] Household member's last name + # + # @param member_id [String] Member identifier with 'mbr\_' prefix + # + # @param member_type [Symbol, VitableConnect::Models::MemberRetrieveHouseholdResponse::Data::MemberType] - `Account Holder` - Account Holder + # + # @param relationship [Symbol, VitableConnect::Models::MemberRetrieveHouseholdResponse::Data::Relationship, nil] - `Child` - Child + + # - `Account Holder` - Account Holder + # - `Dependent` - Dependent + # - `Inactive` - Inactive + # + # @see VitableConnect::Models::MemberRetrieveHouseholdResponse::Data#member_type + module MemberType + extend VitableConnect::Internal::Type::Enum + + ACCOUNT_HOLDER = :"Account Holder" + DEPENDENT = :Dependent + INACTIVE = :Inactive + + # @!method self.values + # @return [Array] + end + + # - `Child` - Child + # - `Spouse` - Spouse + # - `Roommate` - Roommate + # - `Other` - Other + # + # @see VitableConnect::Models::MemberRetrieveHouseholdResponse::Data#relationship + module Relationship + extend VitableConnect::Internal::Type::Enum + + CHILD = :Child + SPOUSE = :Spouse + ROOMMATE = :Roommate + OTHER = :Other + + # @!method self.values + # @return [Array] + end + end + end + end +end diff --git a/lib/vitable_connect/models/member_retrieve_params.rb b/lib/vitable_connect/models/member_retrieve_params.rb new file mode 100644 index 0000000..cdabcf1 --- /dev/null +++ b/lib/vitable_connect/models/member_retrieve_params.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # @see VitableConnect::Resources::Members#retrieve + class MemberRetrieveParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + # @!attribute member_id + # Unique member identifier (mbr\_\*) + # + # @return [String] + required :member_id, String + + # @!method initialize(member_id:, request_options: {}) + # @param member_id [String] Unique member identifier (mbr\_\*) + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}] + end + end +end diff --git a/lib/vitable_connect/models/member_retrieve_response.rb b/lib/vitable_connect/models/member_retrieve_response.rb new file mode 100644 index 0000000..f5d364b --- /dev/null +++ b/lib/vitable_connect/models/member_retrieve_response.rb @@ -0,0 +1,552 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # @see VitableConnect::Resources::Members#retrieve + class MemberRetrieveResponse < VitableConnect::Internal::Type::BaseModel + # @!attribute data + # A member's profile: identity, contact details, address, demographics, and + # onboarding status. + # + # @return [VitableConnect::Models::MemberRetrieveResponse::Data] + required :data, -> { VitableConnect::Models::MemberRetrieveResponse::Data } + + # @!method initialize(data:) + # Some parameter documentations has been truncated, see + # {VitableConnect::Models::MemberRetrieveResponse} for more details. + # + # Response containing a single member resource. + # + # @param data [VitableConnect::Models::MemberRetrieveResponse::Data] A member's profile: identity, contact details, address, demographics, and onboar + + # @see VitableConnect::Models::MemberRetrieveResponse#data + class Data < VitableConnect::Internal::Type::BaseModel + # @!attribute age + # Member's age in years, derived from date of birth + # + # @return [Integer] + required :age, Integer + + # @!attribute date_of_birth + # Date of birth (YYYY-MM-DD) + # + # @return [Date] + required :date_of_birth, Date + + # @!attribute first_name + # Member's legal first name + # + # @return [String] + required :first_name, String + + # @!attribute last_name + # Member's legal last name + # + # @return [String] + required :last_name, String + + # @!attribute address + # Member's residential address + # + # @return [VitableConnect::Models::MemberRetrieveResponse::Data::Address, nil] + optional :address, -> { VitableConnect::Models::MemberRetrieveResponse::Data::Address }, nil?: true + + # @!attribute email + # Email address + # + # @return [String, nil] + optional :email, String, nil?: true + + # @!attribute gender + # - `Male` - Male + # - `Female` - Female + # - `Transgender` - Transgender + # - `Non-binary` - Non Binary + # - `Prefer not to respond` - Prefer Not To Respond + # + # @return [Symbol, VitableConnect::Models::MemberRetrieveResponse::Data::Gender, nil] + optional :gender, enum: -> { VitableConnect::Models::MemberRetrieveResponse::Data::Gender }, nil?: true + + # @!attribute marital_status + # - `Single` - Single + # - `Married` - Married + # + # @return [Symbol, VitableConnect::Models::MemberRetrieveResponse::Data::MaritalStatus, nil] + optional :marital_status, + enum: -> { VitableConnect::Models::MemberRetrieveResponse::Data::MaritalStatus }, + nil?: true + + # @!attribute middle_name + # Member's legal middle name + # + # @return [String, nil] + optional :middle_name, String, nil?: true + + # @!attribute phone + # Phone number (10-digit US domestic string) + # + # @return [String, nil] + optional :phone, String, nil?: true + + # @!attribute preferred_language + # - `en` - English + # - `es` - Spanish + # - `zh` - Chinese + # - `ru` - Russian + # - `sw` - Swahili + # - `th` - Thai + # + # @return [Symbol, VitableConnect::Models::MemberRetrieveResponse::Data::PreferredLanguage, nil] + optional :preferred_language, + enum: -> { VitableConnect::Models::MemberRetrieveResponse::Data::PreferredLanguage }, + nil?: true + + # @!attribute sex_at_birth + # - `Male` - Male + # - `Female` - Female + # - `Other` - Other + # - `Unknown` - Unknown + # + # @return [Symbol, VitableConnect::Models::MemberRetrieveResponse::Data::SexAtBirth, nil] + optional :sex_at_birth, + enum: -> { VitableConnect::Models::MemberRetrieveResponse::Data::SexAtBirth }, + nil?: true + + # @!attribute suffix + # - `Sr` - Sr + # - `Jr` - Jr + # - `I` - I + # - `II` - II + # - `III` - III + # - `IV` - IV + # - `V` - V + # + # @return [Symbol, VitableConnect::Models::MemberRetrieveResponse::Data::Suffix, nil] + optional :suffix, enum: -> { VitableConnect::Models::MemberRetrieveResponse::Data::Suffix }, nil?: true + + # @!attribute tobacco_status + # Whether the member uses tobacco, if known + # + # @return [Boolean, nil] + optional :tobacco_status, VitableConnect::Internal::Type::Boolean, nil?: true + + response_only do + # @!attribute id + # Unique member identifier with 'mbr\_' prefix + # + # @return [String] + required :id, String + + # @!attribute name + # Member's full legal name + # + # @return [String] + required :name, String + + # @!attribute status + # Member profile status (onboarded or pending onboarding) + # + # @return [Symbol, VitableConnect::Models::MemberRetrieveResponse::Data::Status] + required :status, enum: -> { VitableConnect::Models::MemberRetrieveResponse::Data::Status } + end + + # @!method initialize(id:, age:, date_of_birth:, first_name:, last_name:, name:, status:, address: nil, email: nil, gender: nil, marital_status: nil, middle_name: nil, phone: nil, preferred_language: nil, sex_at_birth: nil, suffix: nil, tobacco_status: nil) + # Some parameter documentations has been truncated, see + # {VitableConnect::Models::MemberRetrieveResponse::Data} for more details. + # + # A member's profile: identity, contact details, address, demographics, and + # onboarding status. + # + # @param id [String] Unique member identifier with 'mbr\_' prefix + # + # @param age [Integer] Member's age in years, derived from date of birth + # + # @param date_of_birth [Date] Date of birth (YYYY-MM-DD) + # + # @param first_name [String] Member's legal first name + # + # @param last_name [String] Member's legal last name + # + # @param name [String] Member's full legal name + # + # @param status [Symbol, VitableConnect::Models::MemberRetrieveResponse::Data::Status] Member profile status (onboarded or pending onboarding) + # + # @param address [VitableConnect::Models::MemberRetrieveResponse::Data::Address, nil] Member's residential address + # + # @param email [String, nil] Email address + # + # @param gender [Symbol, VitableConnect::Models::MemberRetrieveResponse::Data::Gender, nil] - `Male` - Male + # + # @param marital_status [Symbol, VitableConnect::Models::MemberRetrieveResponse::Data::MaritalStatus, nil] - `Single` - Single + # + # @param middle_name [String, nil] Member's legal middle name + # + # @param phone [String, nil] Phone number (10-digit US domestic string) + # + # @param preferred_language [Symbol, VitableConnect::Models::MemberRetrieveResponse::Data::PreferredLanguage, nil] - `en` - English + # + # @param sex_at_birth [Symbol, VitableConnect::Models::MemberRetrieveResponse::Data::SexAtBirth, nil] - `Male` - Male + # + # @param suffix [Symbol, VitableConnect::Models::MemberRetrieveResponse::Data::Suffix, nil] - `Sr` - Sr + # + # @param tobacco_status [Boolean, nil] Whether the member uses tobacco, if known + + # Member profile status (onboarded or pending onboarding) + # + # @see VitableConnect::Models::MemberRetrieveResponse::Data#status + module Status + extend VitableConnect::Internal::Type::Enum + + ONBOARDED = :onboarded + PENDING_ONBOARDING = :pending_onboarding + + # @!method self.values + # @return [Array] + end + + # @see VitableConnect::Models::MemberRetrieveResponse::Data#address + class Address < VitableConnect::Internal::Type::BaseModel + # @!attribute address_line_1 + # Primary street address + # + # @return [String] + required :address_line_1, String + + # @!attribute city + # City name + # + # @return [String] + required :city, String + + # @!attribute state + # - `AL` - AL + # - `AK` - AK + # - `AZ` - AZ + # - `AR` - AR + # - `CA` - CA + # - `CO` - CO + # - `CT` - CT + # - `DC` - DC + # - `DE` - DE + # - `FL` - FL + # - `GA` - GA + # - `HI` - HI + # - `ID` - ID + # - `IL` - IL + # - `IN` - IN + # - `IA` - IA + # - `KS` - KS + # - `KY` - KY + # - `LA` - LA + # - `ME` - ME + # - `MD` - MD + # - `MA` - MA + # - `MI` - MI + # - `MN` - MN + # - `MS` - MS + # - `MO` - MO + # - `MT` - MT + # - `NE` - NE + # - `NV` - NV + # - `NH` - NH + # - `NJ` - NJ + # - `NM` - NM + # - `NY` - NY + # - `NC` - NC + # - `ND` - ND + # - `OH` - OH + # - `OK` - OK + # - `OR` - OR + # - `PA` - PA + # - `RI` - RI + # - `SC` - SC + # - `SD` - SD + # - `TN` - TN + # - `TX` - TX + # - `UT` - UT + # - `VT` - VT + # - `VA` - VA + # - `WA` - WA + # - `WI` - WI + # - `WV` - WV + # - `WY` - WY + # - `PR` - PR + # - `GU` - GU + # - `AS` - AS + # - `VI` - VI + # - `MP` - MP + # - `MH` - MH + # - `PW` - PW + # - `FM` - FM + # - `AE` - AE + # - `AA` - AA + # - `AP` - AP + # + # @return [Symbol, VitableConnect::Models::MemberRetrieveResponse::Data::Address::State] + required :state, enum: -> { VitableConnect::Models::MemberRetrieveResponse::Data::Address::State } + + # @!attribute zipcode + # ZIP code (5 or 9 digit) + # + # @return [String] + required :zipcode, String + + # @!attribute address_line_2 + # Secondary street address (apt, suite, etc.) + # + # @return [String, nil] + optional :address_line_2, String, nil?: true + + # @!method initialize(address_line_1:, city:, state:, zipcode:, address_line_2: nil) + # Some parameter documentations has been truncated, see + # {VitableConnect::Models::MemberRetrieveResponse::Data::Address} for more + # details. + # + # Member's residential address + # + # @param address_line_1 [String] Primary street address + # + # @param city [String] City name + # + # @param state [Symbol, VitableConnect::Models::MemberRetrieveResponse::Data::Address::State] - `AL` - AL + # + # @param zipcode [String] ZIP code (5 or 9 digit) + # + # @param address_line_2 [String, nil] Secondary street address (apt, suite, etc.) + + # - `AL` - AL + # - `AK` - AK + # - `AZ` - AZ + # - `AR` - AR + # - `CA` - CA + # - `CO` - CO + # - `CT` - CT + # - `DC` - DC + # - `DE` - DE + # - `FL` - FL + # - `GA` - GA + # - `HI` - HI + # - `ID` - ID + # - `IL` - IL + # - `IN` - IN + # - `IA` - IA + # - `KS` - KS + # - `KY` - KY + # - `LA` - LA + # - `ME` - ME + # - `MD` - MD + # - `MA` - MA + # - `MI` - MI + # - `MN` - MN + # - `MS` - MS + # - `MO` - MO + # - `MT` - MT + # - `NE` - NE + # - `NV` - NV + # - `NH` - NH + # - `NJ` - NJ + # - `NM` - NM + # - `NY` - NY + # - `NC` - NC + # - `ND` - ND + # - `OH` - OH + # - `OK` - OK + # - `OR` - OR + # - `PA` - PA + # - `RI` - RI + # - `SC` - SC + # - `SD` - SD + # - `TN` - TN + # - `TX` - TX + # - `UT` - UT + # - `VT` - VT + # - `VA` - VA + # - `WA` - WA + # - `WI` - WI + # - `WV` - WV + # - `WY` - WY + # - `PR` - PR + # - `GU` - GU + # - `AS` - AS + # - `VI` - VI + # - `MP` - MP + # - `MH` - MH + # - `PW` - PW + # - `FM` - FM + # - `AE` - AE + # - `AA` - AA + # - `AP` - AP + # + # @see VitableConnect::Models::MemberRetrieveResponse::Data::Address#state + module State + extend VitableConnect::Internal::Type::Enum + + AL = :AL + AK = :AK + AZ = :AZ + AR = :AR + CA = :CA + CO = :CO + CT = :CT + DC = :DC + DE = :DE + FL = :FL + GA = :GA + HI = :HI + ID = :ID + IL = :IL + IN = :IN + IA = :IA + KS = :KS + KY = :KY + LA = :LA + ME = :ME + MD = :MD + MA = :MA + MI = :MI + MN = :MN + MS = :MS + MO = :MO + MT = :MT + NE = :NE + NV = :NV + NH = :NH + NJ = :NJ + NM = :NM + NY = :NY + NC = :NC + ND = :ND + OH = :OH + OK = :OK + OR = :OR + PA = :PA + RI = :RI + SC = :SC + SD = :SD + TN = :TN + TX = :TX + UT = :UT + VT = :VT + VA = :VA + WA = :WA + WI = :WI + WV = :WV + WY = :WY + PR = :PR + GU = :GU + AS = :AS + VI = :VI + MP = :MP + MH = :MH + PW = :PW + FM = :FM + AE = :AE + AA = :AA + AP = :AP + + # @!method self.values + # @return [Array] + end + end + + # - `Male` - Male + # - `Female` - Female + # - `Transgender` - Transgender + # - `Non-binary` - Non Binary + # - `Prefer not to respond` - Prefer Not To Respond + # + # @see VitableConnect::Models::MemberRetrieveResponse::Data#gender + module Gender + extend VitableConnect::Internal::Type::Enum + + MALE = :Male + FEMALE = :Female + TRANSGENDER = :Transgender + NON_BINARY = :"Non-binary" + PREFER_NOT_TO_RESPOND = :"Prefer not to respond" + + # @!method self.values + # @return [Array] + end + + # - `Single` - Single + # - `Married` - Married + # + # @see VitableConnect::Models::MemberRetrieveResponse::Data#marital_status + module MaritalStatus + extend VitableConnect::Internal::Type::Enum + + SINGLE = :Single + MARRIED = :Married + + # @!method self.values + # @return [Array] + end + + # - `en` - English + # - `es` - Spanish + # - `zh` - Chinese + # - `ru` - Russian + # - `sw` - Swahili + # - `th` - Thai + # + # @see VitableConnect::Models::MemberRetrieveResponse::Data#preferred_language + module PreferredLanguage + extend VitableConnect::Internal::Type::Enum + + EN = :en + ES = :es + ZH = :zh + RU = :ru + SW = :sw + TH = :th + + # @!method self.values + # @return [Array] + end + + # - `Male` - Male + # - `Female` - Female + # - `Other` - Other + # - `Unknown` - Unknown + # + # @see VitableConnect::Models::MemberRetrieveResponse::Data#sex_at_birth + module SexAtBirth + extend VitableConnect::Internal::Type::Enum + + MALE = :Male + FEMALE = :Female + OTHER = :Other + UNKNOWN = :Unknown + + # @!method self.values + # @return [Array] + end + + # - `Sr` - Sr + # - `Jr` - Jr + # - `I` - I + # - `II` - II + # - `III` - III + # - `IV` - IV + # - `V` - V + # + # @see VitableConnect::Models::MemberRetrieveResponse::Data#suffix + module Suffix + extend VitableConnect::Internal::Type::Enum + + SR = :Sr + JR = :Jr + I = :I + II = :II + III = :III + IV = :IV + V = :V + + # @!method self.values + # @return [Array] + end + end + end + end +end diff --git a/lib/vitable_connect/models/organization_create_params.rb b/lib/vitable_connect/models/organization_create_params.rb new file mode 100644 index 0000000..824a1f5 --- /dev/null +++ b/lib/vitable_connect/models/organization_create_params.rb @@ -0,0 +1,57 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # @see VitableConnect::Resources::Organizations#create + class OrganizationCreateParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + # @!attribute name + # + # @return [String] + required :name, String + + # @!attribute type + # - `BROKERAGE` - BROKERAGE + # - `TPA` - TPA + # - `GENERAL_AGENT` - GENERAL_AGENT + # - `CHANNEL_PARTNER` - CHANNEL_PARTNER + # - `CONSULTING_FIRM` - CONSULTING_FIRM + # - `API_PLATFORM` - API_PLATFORM + # + # @return [Symbol, VitableConnect::Models::OrganizationCreateParams::Type, nil] + optional :type, enum: -> { VitableConnect::OrganizationCreateParams::Type }, nil?: true + + # @!method initialize(name:, type: nil, request_options: {}) + # Some parameter documentations has been truncated, see + # {VitableConnect::Models::OrganizationCreateParams} for more details. + # + # @param name [String] + # + # @param type [Symbol, VitableConnect::Models::OrganizationCreateParams::Type, nil] - `BROKERAGE` - BROKERAGE + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}] + + # - `BROKERAGE` - BROKERAGE + # - `TPA` - TPA + # - `GENERAL_AGENT` - GENERAL_AGENT + # - `CHANNEL_PARTNER` - CHANNEL_PARTNER + # - `CONSULTING_FIRM` - CONSULTING_FIRM + # - `API_PLATFORM` - API_PLATFORM + module Type + extend VitableConnect::Internal::Type::Enum + + BROKERAGE = :BROKERAGE + TPA = :TPA + GENERAL_AGENT = :GENERAL_AGENT + CHANNEL_PARTNER = :CHANNEL_PARTNER + CONSULTING_FIRM = :CONSULTING_FIRM + API_PLATFORM = :API_PLATFORM + + # @!method self.values + # @return [Array] + end + end + end +end diff --git a/lib/vitable_connect/models/organization_create_response.rb b/lib/vitable_connect/models/organization_create_response.rb new file mode 100644 index 0000000..3720a70 --- /dev/null +++ b/lib/vitable_connect/models/organization_create_response.rb @@ -0,0 +1,104 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # @see VitableConnect::Resources::Organizations#create + class OrganizationCreateResponse < VitableConnect::Internal::Type::BaseModel + # @!attribute id + # Prefixed organization identifier (`org_`). + # + # @return [String] + required :id, String + + # @!attribute idp_org_id + # IdP-issued tenant id (WorkOS org id). + # + # @return [String, nil] + required :idp_org_id, String, nil?: true + + # @!attribute idp_provider + # - `workos` - WorkOS + # - `vitable` - Vitable + # + # @return [Symbol, VitableConnect::Models::OrganizationCreateResponse::IdpProvider, nil] + required :idp_provider, + enum: -> { VitableConnect::Models::OrganizationCreateResponse::IdpProvider }, + nil?: true + + # @!attribute name + # Human-readable organization name. + # + # @return [String] + required :name, String + + # @!attribute super_in + # Whether this organization reads across every organization. + # + # @return [Boolean] + required :super_in, VitableConnect::Internal::Type::Boolean + + # @!attribute type + # - `BROKERAGE` - Brokerage + # - `TPA` - TPA + # - `GENERAL_AGENT` - General Agent + # - `CHANNEL_PARTNER` - Channel Partner + # - `CONSULTING_FIRM` - Consulting Firm + # - `API_PLATFORM` - API Platform + # + # @return [Symbol, VitableConnect::Models::OrganizationCreateResponse::Type, nil] + required :type, enum: -> { VitableConnect::Models::OrganizationCreateResponse::Type }, nil?: true + + # @!method initialize(id:, idp_org_id:, idp_provider:, name:, super_in:, type:) + # Some parameter documentations has been truncated, see + # {VitableConnect::Models::OrganizationCreateResponse} for more details. + # + # @param id [String] Prefixed organization identifier (`org_`). + # + # @param idp_org_id [String, nil] IdP-issued tenant id (WorkOS org id). + # + # @param idp_provider [Symbol, VitableConnect::Models::OrganizationCreateResponse::IdpProvider, nil] - `workos` - WorkOS + # + # @param name [String] Human-readable organization name. + # + # @param super_in [Boolean] Whether this organization reads across every organization. + # + # @param type [Symbol, VitableConnect::Models::OrganizationCreateResponse::Type, nil] - `BROKERAGE` - Brokerage + + # - `workos` - WorkOS + # - `vitable` - Vitable + # + # @see VitableConnect::Models::OrganizationCreateResponse#idp_provider + module IdpProvider + extend VitableConnect::Internal::Type::Enum + + WORKOS = :workos + VITABLE = :vitable + + # @!method self.values + # @return [Array] + end + + # - `BROKERAGE` - Brokerage + # - `TPA` - TPA + # - `GENERAL_AGENT` - General Agent + # - `CHANNEL_PARTNER` - Channel Partner + # - `CONSULTING_FIRM` - Consulting Firm + # - `API_PLATFORM` - API Platform + # + # @see VitableConnect::Models::OrganizationCreateResponse#type + module Type + extend VitableConnect::Internal::Type::Enum + + BROKERAGE = :BROKERAGE + TPA = :TPA + GENERAL_AGENT = :GENERAL_AGENT + CHANNEL_PARTNER = :CHANNEL_PARTNER + CONSULTING_FIRM = :CONSULTING_FIRM + API_PLATFORM = :API_PLATFORM + + # @!method self.values + # @return [Array] + end + end + end +end diff --git a/lib/vitable_connect/models/organization_list_params.rb b/lib/vitable_connect/models/organization_list_params.rb new file mode 100644 index 0000000..e3e2689 --- /dev/null +++ b/lib/vitable_connect/models/organization_list_params.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # @see VitableConnect::Resources::Organizations#list + class OrganizationListParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + # @!method initialize(request_options: {}) + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}] + end + end +end diff --git a/lib/vitable_connect/models/organization_list_response.rb b/lib/vitable_connect/models/organization_list_response.rb new file mode 100644 index 0000000..3db52c3 --- /dev/null +++ b/lib/vitable_connect/models/organization_list_response.rb @@ -0,0 +1,128 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # @see VitableConnect::Resources::Organizations#list + class OrganizationListResponse < VitableConnect::Internal::Type::BaseModel + # @!attribute organizations + # + # @return [Array] + required :organizations, + -> { VitableConnect::Internal::Type::ArrayOf[VitableConnect::Models::OrganizationListResponse::Organization] } + + # @!attribute total + # Total number of organizations the caller belongs to. + # + # @return [Integer] + required :total, Integer + + # @!method initialize(organizations:, total:) + # Envelope for the caller's organization memberships (paginated). + # + # @param organizations [Array] + # + # @param total [Integer] Total number of organizations the caller belongs to. + + class Organization < VitableConnect::Internal::Type::BaseModel + # @!attribute id + # Prefixed organization identifier (`org_`). + # + # @return [String] + required :id, String + + # @!attribute idp_org_id + # IdP-issued tenant id (WorkOS org id). + # + # @return [String, nil] + required :idp_org_id, String, nil?: true + + # @!attribute idp_provider + # - `workos` - WorkOS + # - `vitable` - Vitable + # + # @return [Symbol, VitableConnect::Models::OrganizationListResponse::Organization::IdpProvider, nil] + required :idp_provider, + enum: -> { VitableConnect::Models::OrganizationListResponse::Organization::IdpProvider }, + nil?: true + + # @!attribute name + # Human-readable organization name. + # + # @return [String] + required :name, String + + # @!attribute super_in + # Whether this organization reads across every organization. + # + # @return [Boolean] + required :super_in, VitableConnect::Internal::Type::Boolean + + # @!attribute type + # - `BROKERAGE` - Brokerage + # - `TPA` - TPA + # - `GENERAL_AGENT` - General Agent + # - `CHANNEL_PARTNER` - Channel Partner + # - `CONSULTING_FIRM` - Consulting Firm + # - `API_PLATFORM` - API Platform + # + # @return [Symbol, VitableConnect::Models::OrganizationListResponse::Organization::Type, nil] + required :type, + enum: -> { VitableConnect::Models::OrganizationListResponse::Organization::Type }, + nil?: true + + # @!method initialize(id:, idp_org_id:, idp_provider:, name:, super_in:, type:) + # Some parameter documentations has been truncated, see + # {VitableConnect::Models::OrganizationListResponse::Organization} for more + # details. + # + # @param id [String] Prefixed organization identifier (`org_`). + # + # @param idp_org_id [String, nil] IdP-issued tenant id (WorkOS org id). + # + # @param idp_provider [Symbol, VitableConnect::Models::OrganizationListResponse::Organization::IdpProvider, nil] - `workos` - WorkOS + # + # @param name [String] Human-readable organization name. + # + # @param super_in [Boolean] Whether this organization reads across every organization. + # + # @param type [Symbol, VitableConnect::Models::OrganizationListResponse::Organization::Type, nil] - `BROKERAGE` - Brokerage + + # - `workos` - WorkOS + # - `vitable` - Vitable + # + # @see VitableConnect::Models::OrganizationListResponse::Organization#idp_provider + module IdpProvider + extend VitableConnect::Internal::Type::Enum + + WORKOS = :workos + VITABLE = :vitable + + # @!method self.values + # @return [Array] + end + + # - `BROKERAGE` - Brokerage + # - `TPA` - TPA + # - `GENERAL_AGENT` - General Agent + # - `CHANNEL_PARTNER` - Channel Partner + # - `CONSULTING_FIRM` - Consulting Firm + # - `API_PLATFORM` - API Platform + # + # @see VitableConnect::Models::OrganizationListResponse::Organization#type + module Type + extend VitableConnect::Internal::Type::Enum + + BROKERAGE = :BROKERAGE + TPA = :TPA + GENERAL_AGENT = :GENERAL_AGENT + CHANNEL_PARTNER = :CHANNEL_PARTNER + CONSULTING_FIRM = :CONSULTING_FIRM + API_PLATFORM = :API_PLATFORM + + # @!method self.values + # @return [Array] + end + end + end + end +end diff --git a/lib/vitable_connect/models/pagination.rb b/lib/vitable_connect/models/pagination.rb new file mode 100644 index 0000000..9c96af3 --- /dev/null +++ b/lib/vitable_connect/models/pagination.rb @@ -0,0 +1,42 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + class Pagination < VitableConnect::Internal::Type::BaseModel + # @!attribute limit + # Items per page + # + # @return [Integer] + required :limit, Integer + + # @!attribute page + # Current page number + # + # @return [Integer] + required :page, Integer + + # @!attribute total + # Total number of items + # + # @return [Integer] + required :total, Integer + + # @!attribute total_pages + # Total number of pages + # + # @return [Integer] + required :total_pages, Integer + + # @!method initialize(limit:, page:, total:, total_pages:) + # Pagination metadata for list responses. + # + # @param limit [Integer] Items per page + # + # @param page [Integer] Current page number + # + # @param total [Integer] Total number of items + # + # @param total_pages [Integer] Total number of pages + end + end +end diff --git a/lib/vitable_connect/models/plan_list_params.rb b/lib/vitable_connect/models/plan_list_params.rb new file mode 100644 index 0000000..6e055fd --- /dev/null +++ b/lib/vitable_connect/models/plan_list_params.rb @@ -0,0 +1,30 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # @see VitableConnect::Resources::Plans#list + class PlanListParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + # @!attribute limit + # Items per page (default: 20, max: 100) + # + # @return [Integer, nil] + optional :limit, Integer + + # @!attribute page + # Page number (default: 1) + # + # @return [Integer, nil] + optional :page, Integer + + # @!method initialize(limit: nil, page: nil, request_options: {}) + # @param limit [Integer] Items per page (default: 20, max: 100) + # + # @param page [Integer] Page number (default: 1) + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}] + end + end +end diff --git a/lib/vitable_connect/models/plan_list_response.rb b/lib/vitable_connect/models/plan_list_response.rb new file mode 100644 index 0000000..1dae0e6 --- /dev/null +++ b/lib/vitable_connect/models/plan_list_response.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # @see VitableConnect::Resources::Plans#list + class PlanListResponse < VitableConnect::Internal::Type::BaseModel + # @!attribute id + # + # @return [String] + required :id, String + + # @!attribute name + # + # @return [String] + required :name, String + + # @!method initialize(id:, name:) + # @param id [String] + # @param name [String] + end + end +end diff --git a/lib/vitable_connect/models/webhook_event.rb b/lib/vitable_connect/models/webhook_event.rb new file mode 100644 index 0000000..20b97e3 --- /dev/null +++ b/lib/vitable_connect/models/webhook_event.rb @@ -0,0 +1,62 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # @see VitableConnect::Resources::WebhookEvents#list + class WebhookEvent < VitableConnect::Internal::Type::BaseModel + # @!attribute id + # Prefixed unique identifier for this webhook event (e.g., `wevt_...`). + # + # @return [String] + required :id, String + + # @!attribute created_at + # When the event occurred, in UTC. + # + # @return [Time] + required :created_at, Time + + # @!attribute event_name + # The event type, formatted as `{resource}.{action}` (e.g., + # `enrollment.accepted`). + # + # @return [String] + required :event_name, String + + # @!attribute organization_id + # The organization this event belongs to. + # + # @return [String] + required :organization_id, String + + # @!attribute resource_id + # Prefixed ID of the affected resource. Use this to fetch the current state from + # the API. + # + # @return [String] + required :resource_id, String + + # @!attribute resource_type + # The type of resource affected (e.g., `enrollment`, `employee`). + # + # @return [String] + required :resource_type, String + + # @!method initialize(id:, created_at:, event_name:, organization_id:, resource_id:, resource_type:) + # Some parameter documentations has been truncated, see + # {VitableConnect::Models::WebhookEvent} for more details. + # + # @param id [String] Prefixed unique identifier for this webhook event (e.g., `wevt_...`). + # + # @param created_at [Time] When the event occurred, in UTC. + # + # @param event_name [String] The event type, formatted as `{resource}.{action}` (e.g., `enrollment.accepted`) + # + # @param organization_id [String] The organization this event belongs to. + # + # @param resource_id [String] Prefixed ID of the affected resource. Use this to fetch the current state from t + # + # @param resource_type [String] The type of resource affected (e.g., `enrollment`, `employee`). + end + end +end diff --git a/lib/vitable_connect/models/webhook_event_list_deliveries_params.rb b/lib/vitable_connect/models/webhook_event_list_deliveries_params.rb new file mode 100644 index 0000000..b5ae092 --- /dev/null +++ b/lib/vitable_connect/models/webhook_event_list_deliveries_params.rb @@ -0,0 +1,20 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # @see VitableConnect::Resources::WebhookEvents#list_deliveries + class WebhookEventListDeliveriesParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + # @!attribute event_id + # + # @return [String] + required :event_id, String + + # @!method initialize(event_id:, request_options: {}) + # @param event_id [String] + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}] + end + end +end diff --git a/lib/vitable_connect/models/webhook_event_list_deliveries_response.rb b/lib/vitable_connect/models/webhook_event_list_deliveries_response.rb new file mode 100644 index 0000000..21a9f92 --- /dev/null +++ b/lib/vitable_connect/models/webhook_event_list_deliveries_response.rb @@ -0,0 +1,92 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # @see VitableConnect::Resources::WebhookEvents#list_deliveries + class WebhookEventListDeliveriesResponse < VitableConnect::Internal::Type::BaseModel + # @!attribute data + # + # @return [Array] + required :data, + -> { VitableConnect::Internal::Type::ArrayOf[VitableConnect::Models::WebhookEventListDeliveriesResponse::Data] } + + # @!method initialize(data:) + # @param data [Array] + + class Data < VitableConnect::Internal::Type::BaseModel + # @!attribute id + # Prefixed unique identifier for this delivery (e.g., `wdlv_...`). + # + # @return [String] + required :id, String + + # @!attribute created_at + # When this delivery record was created, in UTC. + # + # @return [Time] + required :created_at, Time + + # @!attribute delivered_at + # When the delivery was successfully received, in UTC. + # + # @return [Time, nil] + required :delivered_at, Time, nil?: true + + # @!attribute failed_at + # When the delivery was marked as permanently failed, in UTC. + # + # @return [Time, nil] + required :failed_at, Time, nil?: true + + # @!attribute failure_reason + # Reason for failure, if applicable. + # + # @return [String] + required :failure_reason, String + + # @!attribute started_at + # When the delivery attempt started, in UTC. + # + # @return [Time, nil] + required :started_at, Time, nil?: true + + # @!attribute status + # Current delivery status: Pending, In Progress, Delivered, or Failed. + # + # @return [String] + required :status, String + + # @!attribute subscription_id + # The webhook subscription this delivery was sent to. + # + # @return [String] + required :subscription_id, String + + # @!attribute webhook_event_id + # The webhook event this delivery belongs to. + # + # @return [String] + required :webhook_event_id, String + + # @!method initialize(id:, created_at:, delivered_at:, failed_at:, failure_reason:, started_at:, status:, subscription_id:, webhook_event_id:) + # @param id [String] Prefixed unique identifier for this delivery (e.g., `wdlv_...`). + # + # @param created_at [Time] When this delivery record was created, in UTC. + # + # @param delivered_at [Time, nil] When the delivery was successfully received, in UTC. + # + # @param failed_at [Time, nil] When the delivery was marked as permanently failed, in UTC. + # + # @param failure_reason [String] Reason for failure, if applicable. + # + # @param started_at [Time, nil] When the delivery attempt started, in UTC. + # + # @param status [String] Current delivery status: Pending, In Progress, Delivered, or Failed. + # + # @param subscription_id [String] The webhook subscription this delivery was sent to. + # + # @param webhook_event_id [String] The webhook event this delivery belongs to. + end + end + end +end diff --git a/lib/vitable_connect/models/webhook_event_list_params.rb b/lib/vitable_connect/models/webhook_event_list_params.rb new file mode 100644 index 0000000..6baa0f5 --- /dev/null +++ b/lib/vitable_connect/models/webhook_event_list_params.rb @@ -0,0 +1,135 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # @see VitableConnect::Resources::WebhookEvents#list + class WebhookEventListParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + # @!attribute created_after + # + # @return [Time, nil] + optional :created_after, Time + + # @!attribute created_before + # + # @return [Time, nil] + optional :created_before, Time + + # @!attribute event_name + # - `enrollment.accepted` - Enrollment Accepted + # - `enrollment.terminated` - Enrollment Terminated + # - `enrollment.termination_rescheduled` - Enrollment Termination Rescheduled + # - `enrollment.elected` - Enrollment Elected + # - `enrollment.granted` - Enrollment Granted + # - `enrollment.waived` - Enrollment Waived + # - `enrollment.started` - Enrollment Started + # - `employee.eligibility_granted` - Employee Eligibility Granted + # - `employee.eligibility_terminated` - Employee Eligibility Terminated + # - `employee.deactivated` - Employee Deactivated + # - `employee.deduction_created` - Employee Deduction Created + # + # @return [Symbol, VitableConnect::Models::WebhookEventListParams::EventName, nil] + optional :event_name, enum: -> { VitableConnect::WebhookEventListParams::EventName } + + # @!attribute limit + # Items per page (default: 20, max: 100) + # + # @return [Integer, nil] + optional :limit, Integer + + # @!attribute page + # Page number (default: 1) + # + # @return [Integer, nil] + optional :page, Integer + + # @!attribute resource_id + # + # @return [String, nil] + optional :resource_id, String + + # @!attribute resource_type + # - `enrollment` - Enrollment + # - `employee` - Employee + # - `employer` - Employer + # - `dependent` - Dependent + # - `plan_year` - Plan Year + # - `payroll_deduction` - Payroll Deduction + # + # @return [Symbol, VitableConnect::Models::WebhookEventListParams::ResourceType, nil] + optional :resource_type, enum: -> { VitableConnect::WebhookEventListParams::ResourceType } + + # @!method initialize(created_after: nil, created_before: nil, event_name: nil, limit: nil, page: nil, resource_id: nil, resource_type: nil, request_options: {}) + # Some parameter documentations has been truncated, see + # {VitableConnect::Models::WebhookEventListParams} for more details. + # + # @param created_after [Time] + # + # @param created_before [Time] + # + # @param event_name [Symbol, VitableConnect::Models::WebhookEventListParams::EventName] - `enrollment.accepted` - Enrollment Accepted + # + # @param limit [Integer] Items per page (default: 20, max: 100) + # + # @param page [Integer] Page number (default: 1) + # + # @param resource_id [String] + # + # @param resource_type [Symbol, VitableConnect::Models::WebhookEventListParams::ResourceType] - `enrollment` - Enrollment + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}] + + # - `enrollment.accepted` - Enrollment Accepted + # - `enrollment.terminated` - Enrollment Terminated + # - `enrollment.termination_rescheduled` - Enrollment Termination Rescheduled + # - `enrollment.elected` - Enrollment Elected + # - `enrollment.granted` - Enrollment Granted + # - `enrollment.waived` - Enrollment Waived + # - `enrollment.started` - Enrollment Started + # - `employee.eligibility_granted` - Employee Eligibility Granted + # - `employee.eligibility_terminated` - Employee Eligibility Terminated + # - `employee.deactivated` - Employee Deactivated + # - `employee.deduction_created` - Employee Deduction Created + module EventName + extend VitableConnect::Internal::Type::Enum + + ENROLLMENT_ACCEPTED = :"enrollment.accepted" + ENROLLMENT_TERMINATED = :"enrollment.terminated" + ENROLLMENT_TERMINATION_RESCHEDULED = :"enrollment.termination_rescheduled" + ENROLLMENT_ELECTED = :"enrollment.elected" + ENROLLMENT_GRANTED = :"enrollment.granted" + ENROLLMENT_WAIVED = :"enrollment.waived" + ENROLLMENT_STARTED = :"enrollment.started" + EMPLOYEE_ELIGIBILITY_GRANTED = :"employee.eligibility_granted" + EMPLOYEE_ELIGIBILITY_TERMINATED = :"employee.eligibility_terminated" + EMPLOYEE_DEACTIVATED = :"employee.deactivated" + EMPLOYEE_DEDUCTION_CREATED = :"employee.deduction_created" + + # @!method self.values + # @return [Array] + end + + # - `enrollment` - Enrollment + # - `employee` - Employee + # - `employer` - Employer + # - `dependent` - Dependent + # - `plan_year` - Plan Year + # - `payroll_deduction` - Payroll Deduction + module ResourceType + extend VitableConnect::Internal::Type::Enum + + ENROLLMENT = :enrollment + EMPLOYEE = :employee + EMPLOYER = :employer + DEPENDENT = :dependent + PLAN_YEAR = :plan_year + PAYROLL_DEDUCTION = :payroll_deduction + + # @!method self.values + # @return [Array] + end + end + end +end diff --git a/lib/vitable_connect/models/webhook_event_retrieve_params.rb b/lib/vitable_connect/models/webhook_event_retrieve_params.rb new file mode 100644 index 0000000..a4cadd3 --- /dev/null +++ b/lib/vitable_connect/models/webhook_event_retrieve_params.rb @@ -0,0 +1,20 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # @see VitableConnect::Resources::WebhookEvents#retrieve + class WebhookEventRetrieveParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + # @!attribute event_id + # + # @return [String] + required :event_id, String + + # @!method initialize(event_id:, request_options: {}) + # @param event_id [String] + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}] + end + end +end diff --git a/lib/vitable_connect/models/webhook_event_retrieve_response.rb b/lib/vitable_connect/models/webhook_event_retrieve_response.rb new file mode 100644 index 0000000..2a7d996 --- /dev/null +++ b/lib/vitable_connect/models/webhook_event_retrieve_response.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +module VitableConnect + module Models + # @see VitableConnect::Resources::WebhookEvents#retrieve + class WebhookEventRetrieveResponse < VitableConnect::Internal::Type::BaseModel + # @!attribute data + # + # @return [VitableConnect::Models::WebhookEvent] + required :data, -> { VitableConnect::WebhookEvent } + + # @!method initialize(data:) + # Response containing a single webhook event resource. + # + # @param data [VitableConnect::Models::WebhookEvent] + end + end +end diff --git a/lib/vitable_connect/request_options.rb b/lib/vitable_connect/request_options.rb new file mode 100644 index 0000000..a685263 --- /dev/null +++ b/lib/vitable_connect/request_options.rb @@ -0,0 +1,78 @@ +# frozen_string_literal: true + +module VitableConnect + # Specify HTTP behaviour to use for a specific request. These options supplement + # or override those provided at the client level. + # + # When making a request, you can pass an actual {RequestOptions} instance, or + # simply pass a Hash with symbol keys matching the attributes on this class. + class RequestOptions < VitableConnect::Internal::Type::BaseModel + # @api private + # + # @param opts [VitableConnect::RequestOptions, Hash{Symbol=>Object}] + # + # @raise [ArgumentError] + def self.validate!(opts) + case opts + in VitableConnect::RequestOptions | Hash + opts.to_h.each_key do |k| + unless fields.include?(k) + raise ArgumentError.new("Request `opts` keys must be one of #{fields.keys}, got #{k.inspect}") + end + end + else + raise ArgumentError.new("Request `opts` must be a Hash or RequestOptions, got #{opts.inspect}") + end + end + + # @!attribute idempotency_key + # Idempotency key to send with request and all associated retries. Will only be + # sent for write requests. + # + # @return [String, nil] + optional :idempotency_key, String + + # @!attribute extra_query + # Extra query params to send with the request. These are `.merge`’d into any + # `query` given at the client level. + # + # @return [Hash{String=>Array, String, nil}, nil] + optional :extra_query, + VitableConnect::Internal::Type::HashOf[VitableConnect::Internal::Type::ArrayOf[String]] + + # @!attribute extra_headers + # Extra headers to send with the request. These are `.merged`’d into any + # `extra_headers` given at the client level. + # + # @return [Hash{String=>String, nil}, nil] + optional :extra_headers, VitableConnect::Internal::Type::HashOf[String, nil?: true] + + # @!attribute extra_body + # Extra data to send with the request. These are deep merged into any data + # generated as part of the normal request. + # + # @return [Object, nil] + optional :extra_body, VitableConnect::Internal::Type::HashOf[VitableConnect::Internal::Type::Unknown] + + # @!attribute max_retries + # Maximum number of retries to attempt after a failed initial request. + # + # @return [Integer, nil] + optional :max_retries, Integer + + # @!attribute timeout + # Request timeout in seconds. + # + # @return [Float, nil] + optional :timeout, Float + + # @!method initialize(values = {}) + # Returns a new instance of RequestOptions. + # + # @param values [Hash{Symbol=>Object}] + + define_sorbet_constant!(:OrHash) do + T.type_alias { T.any(VitableConnect::RequestOptions, VitableConnect::Internal::AnyHash) } + end + end +end diff --git a/lib/vitable_connect/resources/auth.rb b/lib/vitable_connect/resources/auth.rb new file mode 100644 index 0000000..dfd2e49 --- /dev/null +++ b/lib/vitable_connect/resources/auth.rb @@ -0,0 +1,41 @@ +# frozen_string_literal: true + +module VitableConnect + module Resources + # Issue short-lived access tokens for scoped API access + class Auth + # Issues a short-lived access token from the authenticated API key. Access tokens + # can optionally be bound to a specific employer or employee for scoped access. + # Tokens expire after 15 minutes. + # + # @overload issue_access_token(grant_type:, bound_entity: nil, request_options: {}) + # + # @param grant_type [Symbol, VitableConnect::Models::AuthIssueAccessTokenParams::GrantType] - `client_credentials` - client_credentials + # + # @param bound_entity [VitableConnect::Models::AuthIssueAccessTokenParams::BoundEntity, nil] Optional entity to bind the token to for scoped access + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}, nil] + # + # @return [VitableConnect::Models::AuthIssueAccessTokenResponse] + # + # @see VitableConnect::Models::AuthIssueAccessTokenParams + def issue_access_token(params) + parsed, options = VitableConnect::AuthIssueAccessTokenParams.dump_request(params) + @client.request( + method: :post, + path: "v1/auth/access-tokens", + body: parsed, + model: VitableConnect::Models::AuthIssueAccessTokenResponse, + options: options + ) + end + + # @api private + # + # @param client [VitableConnect::Client] + def initialize(client:) + @client = client + end + end + end +end diff --git a/lib/vitable_connect/resources/employees.rb b/lib/vitable_connect/resources/employees.rb new file mode 100644 index 0000000..e16409d --- /dev/null +++ b/lib/vitable_connect/resources/employees.rb @@ -0,0 +1,111 @@ +# frozen_string_literal: true + +module VitableConnect + module Resources + class Employees + # Retrieves detailed information for a specific employee by ID. Returns employee + # details including personal information, employment status, classification and + # compensation-type effective dates, compensation type, and payroll deductions + # from the most recent statement period. Deductions reflect a snapshot of the + # current period and are replaced when a new statement is generated. + # + # @overload retrieve(employee_id, request_options: {}) + # + # @param employee_id [String] Unique employee identifier (empl\_\*) + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}, nil] + # + # @return [VitableConnect::Models::EmployeeRetrieveResponse] + # + # @see VitableConnect::Models::EmployeeRetrieveParams + def retrieve(employee_id, params = {}) + @client.request( + method: :get, + path: ["v1/employees/%1$s", employee_id], + model: VitableConnect::Models::EmployeeRetrieveResponse, + options: params[:request_options] + ) + end + + # Some parameter documentations has been truncated, see + # {VitableConnect::Models::EmployeeUpdateParams} for more details. + # + # Updates employee personal, contact, address, and employment fields. This + # endpoint currently supports email, phone, gender, address, employee_class, + # start_date, and compensation_type. effective_date is required and applies to + # employee_class and compensation_type when those fields are included in the + # request. + # + # @overload update(employee_id, effective_date:, address: nil, compensation_type: nil, email: nil, employee_class: nil, gender: nil, phone: nil, start_date: nil, request_options: {}) + # + # @param employee_id [String] Unique employee identifier (empl\_\*) + # + # @param effective_date [Date] Past or present date applied to each tracked employment field included in this r + # + # @param address [VitableConnect::Models::EmployeeUpdateParams::Address, nil] Employee's residential address + # + # @param compensation_type [Symbol, VitableConnect::Models::EmployeeUpdateParams::CompensationType, nil] - `Salary` - Salary + # + # @param email [String, nil] Email address + # + # @param employee_class [Symbol, VitableConnect::Models::EmployeeClass, nil] - `Full Time` - Full Time + # + # @param gender [Symbol, VitableConnect::Models::EmployeeUpdateParams::Gender, nil] - `Male` - Male + # + # @param phone [String, nil] Phone number + # + # @param start_date [Date, nil] Employment start date + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}, nil] + # + # @return [VitableConnect::Models::EmployeeUpdateResponse] + # + # @see VitableConnect::Models::EmployeeUpdateParams + def update(employee_id, params) + parsed, options = VitableConnect::EmployeeUpdateParams.dump_request(params) + @client.request( + method: :patch, + path: ["v1/employees/%1$s", employee_id], + body: parsed, + model: VitableConnect::Models::EmployeeUpdateResponse, + options: options + ) + end + + # Retrieves a paginated list of benefit enrollments for an employee. + # + # @overload list_enrollments(employee_id, limit: nil, page: nil, request_options: {}) + # + # @param employee_id [String] Unique employee identifier (empl\_\*) + # + # @param limit [Integer] Items per page (default: 20, max: 100) + # + # @param page [Integer] Page number (default: 1) + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}, nil] + # + # @return [VitableConnect::Internal::PageNumberPage] + # + # @see VitableConnect::Models::EmployeeListEnrollmentsParams + def list_enrollments(employee_id, params = {}) + parsed, options = VitableConnect::EmployeeListEnrollmentsParams.dump_request(params) + query = VitableConnect::Internal::Util.encode_query_params(parsed) + @client.request( + method: :get, + path: ["v1/employees/%1$s/enrollments", employee_id], + query: query, + page: VitableConnect::Internal::PageNumberPage, + model: VitableConnect::Enrollment, + options: options + ) + end + + # @api private + # + # @param client [VitableConnect::Client] + def initialize(client:) + @client = client + end + end + end +end diff --git a/lib/vitable_connect/resources/employers.rb b/lib/vitable_connect/resources/employers.rb new file mode 100644 index 0000000..1835864 --- /dev/null +++ b/lib/vitable_connect/resources/employers.rb @@ -0,0 +1,590 @@ +# frozen_string_literal: true + +module VitableConnect + module Resources + class Employers + # Creates a new employer for the authenticated organization. Requires employer + # name, legal name, EIN, email, and address information. Returns the created + # employer with its assigned ID. + # + # @overload create(address:, ein:, email:, legal_name:, name:, phone_number: nil, reference_id: nil, request_options: {}) + # + # @param address [VitableConnect::Models::EmployerCreateParams::Address] Employer address + # + # @param ein [String] Employer Identification Number (format: XX-XXXXXXX) + # + # @param email [String] Email address for billing and communications + # + # @param legal_name [String] Legal business name + # + # @param name [String] Employer display name + # + # @param phone_number [String, nil] Employer phone number (10-digit US format, e.g. 5551234567) + # + # @param reference_id [String, nil] External reference ID for this employer + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}, nil] + # + # @return [VitableConnect::Models::EmployerResponse] + # + # @see VitableConnect::Models::EmployerCreateParams + def create(params) + parsed, options = VitableConnect::EmployerCreateParams.dump_request(params) + @client.request( + method: :post, + path: "v1/employers", + body: parsed, + model: VitableConnect::EmployerResponse, + options: options + ) + end + + # Retrieves detailed information for a specific employer by ID. The employer must + # belong to the authenticated organization. + # + # @overload retrieve(employer_id, request_options: {}) + # + # @param employer_id [String] Unique employer identifier (empr\_\*) + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}, nil] + # + # @return [VitableConnect::Models::EmployerResponse] + # + # @see VitableConnect::Models::EmployerRetrieveParams + def retrieve(employer_id, params = {}) + @client.request( + method: :get, + path: ["v1/employers/%1$s", employer_id], + model: VitableConnect::EmployerResponse, + options: params[:request_options] + ) + end + + # Updates an existing employer. All fields are optional — only provided fields are + # updated. PO Box addresses are rejected. + # + # @overload update(employer_id, active: nil, address: nil, legal_name: nil, name: nil, request_options: {}) + # + # @param employer_id [String] Unique employer identifier (empr\_\*) + # + # @param active [Boolean, nil] Whether the employer is active + # + # @param address [VitableConnect::Models::EmployerUpdateParams::Address, nil] Employer address + # + # @param legal_name [String, nil] Legal business name + # + # @param name [String, nil] Employer display name + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}, nil] + # + # @return [VitableConnect::Models::EmployerResponse] + # + # @see VitableConnect::Models::EmployerUpdateParams + def update(employer_id, params = {}) + parsed, options = VitableConnect::EmployerUpdateParams.dump_request(params) + @client.request( + method: :put, + path: ["v1/employers/%1$s", employer_id], + body: parsed, + model: VitableConnect::EmployerResponse, + options: options + ) + end + + # Some parameter documentations has been truncated, see + # {VitableConnect::Models::EmployerListParams} for more details. + # + # Returns the caller's employer book — every employer with its computed columns + # (enrollment-rate summary, benefit-family tags, HRIS connection, + # benefit-lifecycle stage) merged with the employer's flat CRM fields (legal name, + # EIN, contact, address, timestamps). The book is derived from the authenticated + # principal: one organization's employers, or every organization's for a caller + # whose reach is not a single organization. Supports search by display name, legal + # name, or exact EIN, employer id or contact email, benefit-family/lifecycle/HRIS + # filters, and page/limit pagination. + # + # @overload list(benefit_family: nil, benefit_lifecycle_stage: nil, hris_provider: nil, hris_status: nil, include_cancelled: nil, limit: nil, page: nil, search: nil, request_options: {}) + # + # @param benefit_family [Array] Filter to employers with at least one active benefit in these families. + # + # @param benefit_lifecycle_stage [Array] Filter to employers in one of these computed benefit-lifecycle stages. + # + # @param hris_provider [Array] Filter to employers whose HRIS connection is with one of these payroll providers + # + # @param hris_status [Array] Filter to employers whose HRIS connection is in one of these statuses. + # + # @param include_cancelled [Boolean] Include cancelled employers (hidden by default unless their stage is explicitly + # + # @param limit [Integer] Items per page. + # + # @param page [Integer] Page number. + # + # @param search [String, nil] Employer filter. Matches the display name or the legal name case-insensitively a + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}, nil] + # + # @return [VitableConnect::Internal::PageNumberPage] + # + # @see VitableConnect::Models::EmployerListParams + def list(params = {}) + parsed, options = VitableConnect::EmployerListParams.dump_request(params) + query = VitableConnect::Internal::Util.encode_query_params(parsed) + @client.request( + method: :get, + path: "v1/employers", + query: query, + page: VitableConnect::Internal::PageNumberPage, + model: VitableConnect::Models::EmployerListResponse, + options: options + ) + end + + # Provision and return the employer's payroll integration email. + # + # @overload ensure_payroll_integration_email(employer_id, request_options: {}) + # + # @param employer_id [String] Unique employer identifier (empr\_\*) + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}, nil] + # + # @return [VitableConnect::Models::EmployerEnsurePayrollIntegrationEmailResponse] + # + # @see VitableConnect::Models::EmployerEnsurePayrollIntegrationEmailParams + def ensure_payroll_integration_email(employer_id, params = {}) + @client.request( + method: :put, + path: ["v1/employers/%1$s/payroll-integration-email", employer_id], + model: VitableConnect::Models::EmployerEnsurePayrollIntegrationEmailResponse, + options: params[:request_options] + ) + end + + # Some parameter documentations has been truncated, see + # {VitableConnect::Models::EmployerListBenefitPlanYearEnrollmentsParams} for more + # details. + # + # Returns a paginated list of every member with an enrollment in one of an + # employer's plan years, any election status: what they elected, where their + # coverage stands, dependent count, carrier, plan, tier, and the plan's total + # monthly cost. The caller must be authorized for the employer `empr_<...>`; an + # unknown or unauthorized employer, or an unknown plan year `plyr_<...>`, + # returns 404. + # + # @overload list_benefit_plan_year_enrollments(benefit_plan_year_id, employer_id:, election_status: nil, limit: nil, page: nil, search: nil, request_options: {}) + # + # @param benefit_plan_year_id [String] Path param: Unique benefit-plan-year identifier (plyr\_\*). + # + # @param employer_id [String] Path param: Unique employer identifier (empr\_\*) + # + # @param election_status [Array] Query param: Filter by election status. Repeat the parameter to match several. + # + # @param limit [Integer] Query param: Items per page (default: 20, max: 100) + # + # @param page [Integer] Query param: Page number (default: 1) + # + # @param search [String] Query param: Case-insensitive search. Matches member name partially, and the `me + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}, nil] + # + # @return [VitableConnect::Internal::PageNumberPage] + # + # @see VitableConnect::Models::EmployerListBenefitPlanYearEnrollmentsParams + def list_benefit_plan_year_enrollments(benefit_plan_year_id, params) + parsed, options = VitableConnect::EmployerListBenefitPlanYearEnrollmentsParams.dump_request(params) + query = VitableConnect::Internal::Util.encode_query_params(parsed) + employer_id = + parsed.delete(:employer_id) do + raise ArgumentError.new("missing required path argument #{_1}") + end + @client.request( + method: :get, + path: ["v1/employers/%1$s/benefit-plan-years/%2$s/enrollments", employer_id, benefit_plan_year_id], + query: query, + page: VitableConnect::Internal::PageNumberPage, + model: VitableConnect::Models::EmployerListBenefitPlanYearEnrollmentsResponse, + options: options + ) + end + + # Returns the employer's benefit plan years (all years, or one when `year` is + # given), each with its benefits, offered states, benefit families, and the + # year-level enrollment roll-up. The caller must be authorized for the employer; + # an unknown or unauthorized employer returns 404. + # + # @overload list_benefit_plan_years(employer_id, request_options: {}) + # + # @param employer_id [String] Unique employer identifier (empr\_\*) + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}, nil] + # + # @return [VitableConnect::Models::EmployerListBenefitPlanYearsResponse] + # + # @see VitableConnect::Models::EmployerListBenefitPlanYearsParams + def list_benefit_plan_years(employer_id, params = {}) + @client.request( + method: :get, + path: ["v1/employers/%1$s/benefit-plan-years", employer_id], + model: VitableConnect::Models::EmployerListBenefitPlanYearsResponse, + options: params[:request_options] + ) + end + + # Retrieves a paginated list of employees for a specific employer. The caller must + # be authorized for the employer; an unknown or unauthorized employer returns 404. + # Results are paginated using page and limit parameters and can be narrowed with a + # case-insensitive `search` (first name, last name, or email) and an + # `employment_status` filter (active or terminated). Each employee includes + # payroll deductions from the most recent statement period. When a new deduction + # statement is generated, previous period deductions are replaced. + # + # @overload list_employees(employer_id, employment_status: nil, limit: nil, page: nil, search: nil, request_options: {}) + # + # @param employer_id [String] Unique employer identifier (empr\_\*) + # + # @param employment_status [Symbol, VitableConnect::Models::EmployerListEmployeesParams::EmploymentStatus] Filter by employment status (active or terminated) + # + # @param limit [Integer] Items per page (default: 20, max: 100) + # + # @param page [Integer] Page number (default: 1) + # + # @param search [String] Case-insensitive search across employee first name, last name, and email + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}, nil] + # + # @return [VitableConnect::Internal::PageNumberPage] + # + # @see VitableConnect::Models::EmployerListEmployeesParams + def list_employees(employer_id, params = {}) + parsed, options = VitableConnect::EmployerListEmployeesParams.dump_request(params) + query = VitableConnect::Internal::Util.encode_query_params(parsed) + @client.request( + method: :get, + path: ["v1/employers/%1$s/employees", employer_id], + query: query, + page: VitableConnect::Internal::PageNumberPage, + model: VitableConnect::Employee, + options: options + ) + end + + # Returns the distinct HRIS/payroll providers across the same book + # `GET /v1/employers` returns, sorted for display. Use these as the values for the + # employers list's `hris_provider` filter — filter on `provider`, show + # `provider_label`. The stored providers are free text, so they cannot be + # enumerated in advance. + # + # @overload list_hris_providers(request_options: {}) + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}, nil] + # + # @return [VitableConnect::Models::EmployerListHRISProvidersResponse] + # + # @see VitableConnect::Models::EmployerListHRISProvidersParams + def list_hris_providers(params = {}) + @client.request( + method: :get, + path: "v1/employers/hris-providers", + model: VitableConnect::Models::EmployerListHRISProvidersResponse, + options: params[:request_options] + ) + end + + # Returns a cursor-paginated page of the employer's billing invoices, newest + # first. Pass the `next_offset` from a previous page as `offset` to fetch the next + # page. The caller must be authorized for the employer; an unknown or unauthorized + # employer returns 404. + # + # @overload list_invoices(employer_id, limit: nil, offset: nil, request_options: {}) + # + # @param employer_id [String] Unique employer identifier (empr\_\*) + # + # @param limit [Integer] Maximum number of invoices per page + # + # @param offset [String, nil] Opaque cursor from a previous page's next_offset + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}, nil] + # + # @return [VitableConnect::Models::EmployerListInvoicesResponse] + # + # @see VitableConnect::Models::EmployerListInvoicesParams + def list_invoices(employer_id, params = {}) + parsed, options = VitableConnect::EmployerListInvoicesParams.dump_request(params) + query = VitableConnect::Internal::Util.encode_query_params(parsed) + @client.request( + method: :get, + path: ["v1/employers/%1$s/invoices", employer_id], + query: query, + model: VitableConnect::Models::EmployerListInvoicesResponse, + options: options + ) + end + + # Returns a paginated list of the employer's payroll-deduction statements, newest + # period first, each with its period, generation date, distinct employee count, + # total deduction, change-file link, and deduction frequency. Statements + # superseded by a later correction are excluded. The caller must be authorized for + # the employer; an unknown or unauthorized employer returns 404. + # + # @overload list_payroll_deduction_statements(employer_id, limit: nil, page: nil, request_options: {}) + # + # @param employer_id [String] Unique employer identifier (empr\_\*) + # + # @param limit [Integer] Maximum number of statements per page + # + # @param page [Integer] Page number to retrieve (starts at 1) + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}, nil] + # + # @return [VitableConnect::Internal::PageNumberPage] + # + # @see VitableConnect::Models::EmployerListPayrollDeductionStatementsParams + def list_payroll_deduction_statements(employer_id, params = {}) + parsed, options = VitableConnect::EmployerListPayrollDeductionStatementsParams.dump_request(params) + query = VitableConnect::Internal::Util.encode_query_params(parsed) + @client.request( + method: :get, + path: ["v1/employers/%1$s/payroll-deduction-statements", employer_id], + query: query, + page: VitableConnect::Internal::PageNumberPage, + model: VitableConnect::Models::EmployerListPayrollDeductionStatementsResponse, + options: options + ) + end + + # Returns one benefit plan year in full — its benefit details plus the per-benefit + # enrollment rate and SPD link — addressed by its `benefit_plan_year_id`. The + # caller must be authorized for the employer; an unknown or unauthorized plan year + # returns 404. + # + # @overload retrieve_benefit_plan_year(benefit_plan_year_id, employer_id:, request_options: {}) + # + # @param benefit_plan_year_id [String] Unique benefit-plan-year identifier (plyr\_\*). + # + # @param employer_id [String] Unique employer identifier (empr\_\*) + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}, nil] + # + # @return [VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse] + # + # @see VitableConnect::Models::EmployerRetrieveBenefitPlanYearParams + def retrieve_benefit_plan_year(benefit_plan_year_id, params) + parsed, options = VitableConnect::EmployerRetrieveBenefitPlanYearParams.dump_request(params) + employer_id = + parsed.delete(:employer_id) do + raise ArgumentError.new("missing required path argument #{_1}") + end + @client.request( + method: :get, + path: ["v1/employers/%1$s/benefit-plan-years/%2$s", employer_id, benefit_plan_year_id], + model: VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse, + options: options + ) + end + + # Returns the employer's HRIS connection — provider, status, last sync, and synced + # row count — or null when the employer has no integration. The caller must be + # authorized for the employer; an unknown or unauthorized employer returns 404. + # + # @overload retrieve_hris(employer_id, request_options: {}) + # + # @param employer_id [String] Unique employer identifier (empr\_\*) + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}, nil] + # + # @return [VitableConnect::Models::EmployerRetrieveHRISResponse] + # + # @see VitableConnect::Models::EmployerRetrieveHRISParams + def retrieve_hris(employer_id, params = {}) + @client.request( + method: :get, + path: ["v1/employers/%1$s/hris", employer_id], + model: VitableConnect::Models::EmployerRetrieveHRISResponse, + options: params[:request_options] + ) + end + + # Returns the time-limited PDF download link for a single invoice belonging to the + # employer's billing customer. `invoice_id` is the external Chargebee id (not a + # prefixed UUID). The caller must be authorized for the employer; an unknown or + # unauthorized employer or invoice returns 404. + # + # @overload retrieve_invoice_pdf(invoice_id, employer_id:, request_options: {}) + # + # @param invoice_id [String] External Chargebee invoice id (not a prefixed UUID). + # + # @param employer_id [String] Unique employer identifier (empr\_\*) + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}, nil] + # + # @return [VitableConnect::Models::EmployerRetrieveInvoicePdfResponse] + # + # @see VitableConnect::Models::EmployerRetrieveInvoicePdfParams + def retrieve_invoice_pdf(invoice_id, params) + parsed, options = VitableConnect::EmployerRetrieveInvoicePdfParams.dump_request(params) + employer_id = + parsed.delete(:employer_id) do + raise ArgumentError.new("missing required path argument #{_1}") + end + @client.request( + method: :get, + path: ["v1/employers/%1$s/invoices/%2$s/pdf", employer_id, invoice_id], + model: VitableConnect::Models::EmployerRetrieveInvoicePdfResponse, + options: options + ) + end + + # Return whether the employer has submitted payroll access setup. + # + # @overload retrieve_payroll_access_setup(employer_id, request_options: {}) + # + # @param employer_id [String] Unique employer identifier (empr\_\*) + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}, nil] + # + # @return [VitableConnect::Models::EmployerRetrievePayrollAccessSetupResponse] + # + # @see VitableConnect::Models::EmployerRetrievePayrollAccessSetupParams + def retrieve_payroll_access_setup(employer_id, params = {}) + @client.request( + method: :get, + path: ["v1/employers/%1$s/payroll-access-setup", employer_id], + model: VitableConnect::Models::EmployerRetrievePayrollAccessSetupResponse, + options: params[:request_options] + ) + end + + # Submits a census sync payload for the specified employer. The employees in the + # payload will be queued for processing. Returns an accepted response with the + # timestamp of acceptance. + # + # @overload submit_census_sync(employer_id, employees:, request_options: {}) + # + # @param employer_id [String] Unique employer identifier (empr\_\*) + # + # @param employees [Array] + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}, nil] + # + # @return [VitableConnect::Models::EmployerSubmitCensusSyncResponse] + # + # @see VitableConnect::Models::EmployerSubmitCensusSyncParams + def submit_census_sync(employer_id, params) + parsed, options = VitableConnect::EmployerSubmitCensusSyncParams.dump_request(params) + @client.request( + method: :post, + path: ["v1/employers/%1$s/census-sync", employer_id], + body: parsed, + model: VitableConnect::Models::EmployerSubmitCensusSyncResponse, + options: options + ) + end + + # Some parameter documentations has been truncated, see + # {VitableConnect::Models::EmployerSubmitPayrollAccessSetupParams} for more + # details. + # + # Submit the employer's payroll access setup answers. + # + # @overload submit_payroll_access_setup(employer_id, access_method:, all_benefit_eligible_employees_present:, classifications_accurate:, employees_in_payroll_acknowledged:, has_additional_payroll_system:, is_controlled_group:, payroll_data_impacts_eligibility_acknowledged:, additional_access_method: nil, additional_integration_confirmed: nil, additional_login_url: nil, additional_password: nil, additional_phone: nil, additional_username: nil, classification_correction_source: nil, integration_confirmed: nil, login_url: nil, misclassified_employee_names: nil, missing_employee_resolution: nil, password: nil, phone: nil, remaining_employee_action: nil, same_payroll_covers_other_eins: nil, username: nil, request_options: {}) + # + # @param employer_id [String] Unique employer identifier (empr\_\*) + # + # @param access_method [Symbol, VitableConnect::Models::EmployerSubmitPayrollAccessSetupParams::AccessMethod] - `SELF_SETUP` - SELF_SETUP + # + # @param all_benefit_eligible_employees_present [Boolean] + # + # @param classifications_accurate [Boolean] + # + # @param employees_in_payroll_acknowledged [Boolean] + # + # @param has_additional_payroll_system [Boolean] + # + # @param is_controlled_group [Boolean] + # + # @param payroll_data_impacts_eligibility_acknowledged [Boolean] + # + # @param additional_access_method [Symbol, VitableConnect::Models::EmployerSubmitPayrollAccessSetupParams::AdditionalAccessMethod, nil] - `SELF_SETUP` - SELF_SETUP + # + # @param additional_integration_confirmed [Boolean, nil] + # + # @param additional_login_url [String, nil] + # + # @param additional_password [String, nil] + # + # @param additional_phone [String, nil] + # + # @param additional_username [String, nil] + # + # @param classification_correction_source [Symbol, VitableConnect::Models::EmployerSubmitPayrollAccessSetupParams::ClassificationCorrectionSource, nil] - `ENTER_NAMES` - ENTER_NAMES + # + # @param integration_confirmed [Boolean, nil] + # + # @param login_url [String, nil] + # + # @param misclassified_employee_names [Array] + # + # @param missing_employee_resolution [Symbol, VitableConnect::Models::EmployerSubmitPayrollAccessSetupParams::MissingEmployeeResolution, nil] - `EMAIL_CENSUS` - EMAIL_CENSUS + # + # @param password [String, nil] + # + # @param phone [String, nil] + # + # @param remaining_employee_action [Symbol, VitableConnect::Models::EmployerSubmitPayrollAccessSetupParams::RemainingEmployeeAction, nil] - `VITABLE_UPDATE` - VITABLE_UPDATE + # + # @param same_payroll_covers_other_eins [Boolean, nil] + # + # @param username [String, nil] + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}, nil] + # + # @return [VitableConnect::Models::EmployerSubmitPayrollAccessSetupResponse] + # + # @see VitableConnect::Models::EmployerSubmitPayrollAccessSetupParams + def submit_payroll_access_setup(employer_id, params) + parsed, options = VitableConnect::EmployerSubmitPayrollAccessSetupParams.dump_request(params) + @client.request( + method: :put, + path: ["v1/employers/%1$s/payroll-access-setup", employer_id], + body: parsed, + model: VitableConnect::Models::EmployerSubmitPayrollAccessSetupResponse, + options: options + ) + end + + # Some parameter documentations has been truncated, see + # {VitableConnect::Models::EmployerUpdateSettingsParams} for more details. + # + # Updates configuration settings for a specific employer. The employer must belong + # to the authenticated organization. + # + # @overload update_settings(employer_id, pay_frequency:, request_options: {}) + # + # @param employer_id [String] Unique employer identifier (empr\_\*) + # + # @param pay_frequency [Symbol, VitableConnect::Models::EmployerUpdateSettingsParams::PayFrequency] - `weekly` - Weekly + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}, nil] + # + # @return [VitableConnect::Models::EmployerUpdateSettingsResponse] + # + # @see VitableConnect::Models::EmployerUpdateSettingsParams + def update_settings(employer_id, params) + parsed, options = VitableConnect::EmployerUpdateSettingsParams.dump_request(params) + @client.request( + method: :put, + path: ["v1/employers/%1$s/settings", employer_id], + body: parsed, + model: VitableConnect::Models::EmployerUpdateSettingsResponse, + options: options + ) + end + + # @api private + # + # @param client [VitableConnect::Client] + def initialize(client:) + @client = client + end + end + end +end diff --git a/lib/vitable_connect/resources/enrollments.rb b/lib/vitable_connect/resources/enrollments.rb new file mode 100644 index 0000000..3141ff5 --- /dev/null +++ b/lib/vitable_connect/resources/enrollments.rb @@ -0,0 +1,111 @@ +# frozen_string_literal: true + +module VitableConnect + module Resources + # Manage benefit enrollments and elections for employees + class Enrollments + # Retrieves a single enrollment: the employee and employer it belongs to, the + # benefit product, its status, the coverage period, the employee payroll deduction + # and employer contribution, and the enrolled plan's Summary of Benefits and + # Coverage document when one is on file. An enrollment the caller cannot reach is + # indistinguishable from one that does not exist. + # + # @overload retrieve(enrollment_id, request_options: {}) + # + # @param enrollment_id [String] Unique enrollment identifier (enrl\_\*) + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}, nil] + # + # @return [VitableConnect::Models::EnrollmentRetrieveResponse] + # + # @see VitableConnect::Models::EnrollmentRetrieveParams + def retrieve(enrollment_id, params = {}) + @client.request( + method: :get, + path: ["v1/enrollments/%1$s", enrollment_id], + model: VitableConnect::Models::EnrollmentRetrieveResponse, + options: params[:request_options] + ) + end + + # Some parameter documentations has been truncated, see + # {VitableConnect::Models::EnrollmentReissueParams} for more details. + # + # Closes the targeted enrollment and creates a new unanswered enrollment for the + # same member and plan year. VPC never requires a qualifying life event; other + # products require an accepted, member-owned event outside open enrollment. + # User-backed callers must provide a reason; it is optional for organization + # API-key callers. Tenant mismatches return a non-disclosing 404 before the + # request body is validated. + # + # @overload reissue(enrollment_id, qualifying_life_event_id: nil, reason: nil, ticket_number: nil, request_options: {}) + # + # @param enrollment_id [String] Unique enrollment identifier (enrl\_\*) + # + # @param qualifying_life_event_id [String, nil] Accepted member qualifying life event identifier (qle\_\*) + # + # @param reason [String, nil] Audit reason for the reissue; required for user-backed callers and optional for + # + # @param ticket_number [String, nil] Optional support or operational ticket number + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}, nil] + # + # @return [VitableConnect::Models::EnrollmentReissueResponse] + # + # @see VitableConnect::Models::EnrollmentReissueParams + def reissue(enrollment_id, params = {}) + parsed, options = VitableConnect::EnrollmentReissueParams.dump_request(params) + @client.request( + method: :post, + path: ["v1/enrollments/%1$s/reissue", enrollment_id], + body: parsed, + model: VitableConnect::Models::EnrollmentReissueResponse, + options: options + ) + end + + # Some parameter documentations has been truncated, see + # {VitableConnect::Models::EnrollmentTerminateParams} for more details. + # + # Terminates enrolled coverage immediately. An accepted qualifying life event + # owned by the enrollment member is required unless the plan is VPC or ICHRA. + # User-backed callers must provide a reason; it is optional for organization + # API-key callers. API keys may act across the caller organization's book. Tenant + # mismatches return the same non-disclosing 404 before the request body is + # validated. + # + # @overload terminate(enrollment_id, qualifying_life_event_id: nil, reason: nil, ticket_number: nil, request_options: {}) + # + # @param enrollment_id [String] Unique enrollment identifier (enrl\_\*) + # + # @param qualifying_life_event_id [String, nil] Accepted member qualifying life event identifier (qle\_\*) + # + # @param reason [String, nil] Audit reason for the termination; required for user-backed callers and optional + # + # @param ticket_number [String, nil] Optional support or operational ticket number + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}, nil] + # + # @return [nil] + # + # @see VitableConnect::Models::EnrollmentTerminateParams + def terminate(enrollment_id, params = {}) + parsed, options = VitableConnect::EnrollmentTerminateParams.dump_request(params) + @client.request( + method: :post, + path: ["v1/enrollments/%1$s/terminate", enrollment_id], + body: parsed, + model: NilClass, + options: options + ) + end + + # @api private + # + # @param client [VitableConnect::Client] + def initialize(client:) + @client = client + end + end + end +end diff --git a/lib/vitable_connect/resources/groups.rb b/lib/vitable_connect/resources/groups.rb new file mode 100644 index 0000000..8741c1a --- /dev/null +++ b/lib/vitable_connect/resources/groups.rb @@ -0,0 +1,114 @@ +# frozen_string_literal: true + +module VitableConnect + module Resources + class Groups + # @return [VitableConnect::Resources::Groups::Members] + attr_reader :members + + # Creates a new group scoped to the authenticated organization. + # + # @overload create(external_reference_id:, name:, request_options: {}) + # + # @param external_reference_id [String] + # @param name [String] + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}, nil] + # + # @return [VitableConnect::Models::GroupResponse] + # + # @see VitableConnect::Models::GroupCreateParams + def create(params) + parsed, options = VitableConnect::GroupCreateParams.dump_request(params) + @client.request( + method: :post, + path: "v1/groups", + body: parsed, + model: VitableConnect::GroupResponse, + options: options + ) + end + + # Retrieves a single group by its prefixed ID. Returns 404 if the group does not + # belong to the authenticated organization. + # + # @overload retrieve(group_id, request_options: {}) + # + # @param group_id [String] Unique group identifier (grp\_\*) + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}, nil] + # + # @return [VitableConnect::Models::GroupResponse] + # + # @see VitableConnect::Models::GroupRetrieveParams + def retrieve(group_id, params = {}) + @client.request( + method: :get, + path: ["v1/groups/%1$s", group_id], + model: VitableConnect::GroupResponse, + options: params[:request_options] + ) + end + + # Partially updates a group's name or external reference ID. Returns 404 if the + # group does not belong to the authenticated organization. + # + # @overload update(group_id, external_reference_id: nil, name: nil, request_options: {}) + # + # @param group_id [String] Unique group identifier (grp\_\*) + # + # @param external_reference_id [String, nil] + # + # @param name [String, nil] + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}, nil] + # + # @return [VitableConnect::Models::GroupResponse] + # + # @see VitableConnect::Models::GroupUpdateParams + def update(group_id, params = {}) + parsed, options = VitableConnect::GroupUpdateParams.dump_request(params) + @client.request( + method: :patch, + path: ["v1/groups/%1$s", group_id], + body: parsed, + model: VitableConnect::GroupResponse, + options: options + ) + end + + # Returns a paginated list of groups belonging to the authenticated organization. + # + # @overload list(limit: nil, page: nil, request_options: {}) + # + # @param limit [Integer] Items per page (default: 20, max: 100) + # + # @param page [Integer] Page number (default: 1) + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}, nil] + # + # @return [VitableConnect::Internal::PageNumberPage] + # + # @see VitableConnect::Models::GroupListParams + def list(params = {}) + parsed, options = VitableConnect::GroupListParams.dump_request(params) + query = VitableConnect::Internal::Util.encode_query_params(parsed) + @client.request( + method: :get, + path: "v1/groups", + query: query, + page: VitableConnect::Internal::PageNumberPage, + model: VitableConnect::Group, + options: options + ) + end + + # @api private + # + # @param client [VitableConnect::Client] + def initialize(client:) + @client = client + @members = VitableConnect::Resources::Groups::Members.new(client: client) + end + end + end +end diff --git a/lib/vitable_connect/resources/groups/members.rb b/lib/vitable_connect/resources/groups/members.rb new file mode 100644 index 0000000..1eb7d25 --- /dev/null +++ b/lib/vitable_connect/resources/groups/members.rb @@ -0,0 +1,20 @@ +# frozen_string_literal: true + +module VitableConnect + module Resources + class Groups + class Members + # @return [VitableConnect::Resources::Groups::Members::Sync] + attr_reader :sync + + # @api private + # + # @param client [VitableConnect::Client] + def initialize(client:) + @client = client + @sync = VitableConnect::Resources::Groups::Members::Sync.new(client: client) + end + end + end + end +end diff --git a/lib/vitable_connect/resources/groups/members/sync.rb b/lib/vitable_connect/resources/groups/members/sync.rb new file mode 100644 index 0000000..9c40a5f --- /dev/null +++ b/lib/vitable_connect/resources/groups/members/sync.rb @@ -0,0 +1,74 @@ +# frozen_string_literal: true + +module VitableConnect + module Resources + class Groups + class Members + class Sync + # Retrieves a previously-submitted group member sync request by its `grpmsr_` ID. + # Returns the acceptance timestamp, completion timestamp (if processing has + # finished), and the per-member `results` once available. While processing is in + # flight, `completed_at` and `results` are `null`. + # + # @overload retrieve(request_id, group_id:, request_options: {}) + # + # @param request_id [String] + # + # @param group_id [String] Unique group identifier (grp\_\*) + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}, nil] + # + # @return [VitableConnect::Models::Groups::Members::SyncRetrieveResponse] + # + # @see VitableConnect::Models::Groups::Members::SyncRetrieveParams + def retrieve(request_id, params) + parsed, options = VitableConnect::Groups::Members::SyncRetrieveParams.dump_request(params) + group_id = + parsed.delete(:group_id) do + raise ArgumentError.new("missing required path argument #{_1}") + end + @client.request( + method: :get, + path: ["v1/groups/%1$s/members/sync/%2$s", group_id, request_id], + model: VitableConnect::Models::Groups::Members::SyncRetrieveResponse, + options: options + ) + end + + # Submits a member sync payload for the specified group. Members in the payload + # will be queued for processing asynchronously. Returns HTTP 202 with the batch ID + # and acceptance timestamp. + # + # @overload submit(group_id, members:, request_options: {}) + # + # @param group_id [String] Unique group identifier (grp\_\*) + # + # @param members [Array] + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}, nil] + # + # @return [VitableConnect::Models::Groups::Members::SyncSubmitResponse] + # + # @see VitableConnect::Models::Groups::Members::SyncSubmitParams + def submit(group_id, params) + parsed, options = VitableConnect::Groups::Members::SyncSubmitParams.dump_request(params) + @client.request( + method: :post, + path: ["v1/groups/%1$s/members/sync", group_id], + body: parsed, + model: VitableConnect::Models::Groups::Members::SyncSubmitResponse, + options: options + ) + end + + # @api private + # + # @param client [VitableConnect::Client] + def initialize(client:) + @client = client + end + end + end + end + end +end diff --git a/lib/vitable_connect/resources/members.rb b/lib/vitable_connect/resources/members.rb new file mode 100644 index 0000000..2c2d29b --- /dev/null +++ b/lib/vitable_connect/resources/members.rb @@ -0,0 +1,246 @@ +# frozen_string_literal: true + +module VitableConnect + module Resources + # Browse the members covered across your book and read a member's profile + class Members + # Retrieves a member's profile by ID — identity, demographics, address, contact + # details, tobacco status, and profile status. Access is scoped to the + # authenticated principal; a member not visible to the caller returns a 404. + # + # @overload retrieve(member_id, request_options: {}) + # + # @param member_id [String] Unique member identifier (mbr\_\*) + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}, nil] + # + # @return [VitableConnect::Models::MemberRetrieveResponse] + # + # @see VitableConnect::Models::MemberRetrieveParams + def retrieve(member_id, params = {}) + @client.request( + method: :get, + path: ["v1/members/%1$s", member_id], + model: VitableConnect::Models::MemberRetrieveResponse, + options: params[:request_options] + ) + end + + # Some parameter documentations has been truncated, see + # {VitableConnect::Models::MemberListParams} for more details. + # + # Retrieves a paginated list of the members in the authenticated organization's + # book — identity, contact details, and address. The book covers members reached + # through an employer in the organization's book as well as members of a group it + # owns. Supports free-text search (name, email, phone number, or exact member id). + # + # @overload list(limit: nil, page: nil, search: nil, request_options: {}) + # + # @param limit [Integer] Items per page (default: 20, max: 100) + # + # @param page [Integer] Page number (default: 1) + # + # @param search [String] Case-insensitive search across member name, email, and phone number; exact match + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}, nil] + # + # @return [VitableConnect::Internal::PageNumberPage] + # + # @see VitableConnect::Models::MemberListParams + def list(params = {}) + parsed, options = VitableConnect::MemberListParams.dump_request(params) + query = VitableConnect::Internal::Util.encode_query_params(parsed) + @client.request( + method: :get, + path: "v2/members", + query: query, + page: VitableConnect::Internal::PageNumberPage, + model: VitableConnect::Models::MemberListResponse, + options: options + ) + end + + # Lists a member's active legal dependents — name, relationship, date of birth, + # age, and sex at birth. Access is scoped to the authenticated principal; a member + # not visible to the caller returns a 404. + # + # @overload list_dependents(member_id, request_options: {}) + # + # @param member_id [String] Unique member identifier (mbr\_\*) + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}, nil] + # + # @return [VitableConnect::Models::MemberListDependentsResponse] + # + # @see VitableConnect::Models::MemberListDependentsParams + def list_dependents(member_id, params = {}) + @client.request( + method: :get, + path: ["v1/members/%1$s/dependents", member_id], + model: VitableConnect::Models::MemberListDependentsResponse, + options: params[:request_options] + ) + end + + # Lists a member's employment across every employer — the same employee record + # shape as the employer's employees list, plus the employer name. For an + # organization caller the rows are scoped to companies in that organization's + # book; a member (self/household) or Vitable Admin sees all employments. A member + # not visible to the caller returns a 404. + # + # @overload list_employments(member_id, request_options: {}) + # + # @param member_id [String] Unique member identifier (mbr\_\*) + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}, nil] + # + # @return [VitableConnect::Models::MemberListEmploymentsResponse] + # + # @see VitableConnect::Models::MemberListEmploymentsParams + def list_employments(member_id, params = {}) + @client.request( + method: :get, + path: ["v1/members/%1$s/employments", member_id], + model: VitableConnect::Models::MemberListEmploymentsResponse, + options: params[:request_options] + ) + end + + # Lists a member's benefit enrollments across every employer — benefit type and + # product, employer, carrier, plan, tier, employee deduction, employer + # contribution and total premium, the individual enrollment coverage boundary + # (`coverage_end`), the separate pre-effective cancellation boundary + # (`cancelled_date`), and the distinct benefit plan-year boundary + # (`plan_year_coverage_end`) used to determine whether the plan year itself has + # ended, the date the enrollment record was created (`issued_date`, the value Ops + # labels Issued on, reported for every row whatever the member answered), the + # window the member could answer in -- which never opens before the enrollment was + # issued, so a row issued mid-open-enrollment starts its window on its issue date + # -- whether a qualifying life event would currently be required for reissue under + # the product/open-enrollment rule, enrollment/open-enrollment window, and two + # statuses: `election_status` (what the member answered) and `policy_status` (what + # became of their coverage, null unless they enrolled). Every row includes a + # stable enrollment ID and the exact employer and benefit plan-year IDs used to + # fetch that row's plan-year detail. The full list is returned across all states + # so the client derives active plans (effective and upcoming) and the enrollment + # history from those per-row statuses. For an organization caller the rows are + # scoped to companies in that organization's book; a member (self/household) or + # Vitable Admin sees all enrollments. A member not visible to the caller returns + # a 404. + # + # @overload list_enrollments(member_id, request_options: {}) + # + # @param member_id [String] Unique member identifier (mbr\_\*) + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}, nil] + # + # @return [VitableConnect::Models::MemberListEnrollmentsResponse] + # + # @see VitableConnect::Models::MemberListEnrollmentsParams + def list_enrollments(member_id, params = {}) + @client.request( + method: :get, + path: ["v1/members/%1$s/enrollments", member_id], + model: VitableConnect::Models::MemberListEnrollmentsResponse, + options: params[:request_options] + ) + end + + # Lists a member's benefit ID cards — card type (medical, dental, vision, or rx), + # employer, plan, provider network, claims payer, carrier contact details, and the + # disclaimers printed on the card. Medical, dental and vision cards come from the + # member's active digital benefit cards; the rx card from the member's Ventegra + # pharmacy benefit (omitted when the member has no free-medication coverage), + # which carries no plan, network, or carrier details. Access is scoped to the + # authenticated principal, and an organization caller sees only cards from + # employers in its book; a member not visible to the caller returns a 404. + # + # @overload list_id_cards(member_id, request_options: {}) + # + # @param member_id [String] Unique member identifier (mbr\_\*) + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}, nil] + # + # @return [VitableConnect::Models::MemberListIDCardsResponse] + # + # @see VitableConnect::Models::MemberListIDCardsParams + def list_id_cards(member_id, params = {}) + @client.request( + method: :get, + path: ["v1/members/%1$s/id-cards", member_id], + model: VitableConnect::Models::MemberListIDCardsResponse, + options: params[:request_options] + ) + end + + # Lists a member's qualifying life events, including events already used for + # another enrollment. Returns all statuses by default; pass the status query param + # to filter to one (e.g. approved). Events are ordered newest submission first + # with stable paging. Custom text is present only when submitted and is otherwise + # null. A member not visible to the caller returns a 404. API keys and unbound + # access tokens have organization-wide access. Employer-bound tokens require + # employment at the bound employer, and employee-bound tokens require the exact + # employee-member relationship. Organization or scope mismatches return a 404 + # before pagination is validated. + # + # @overload list_qualifying_life_events(member_id, limit: nil, page: nil, status: nil, request_options: {}) + # + # @param member_id [String] Unique member identifier (mbr\_\*) + # + # @param limit [Integer] Items per page (default: 20, max: 100) + # + # @param page [Integer] Page number (default: 1) + # + # @param status [Symbol, VitableConnect::Models::MemberListQualifyingLifeEventsParams::Status] Optional. Filter to a single QLE status; omit to return all statuses. + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}, nil] + # + # @return [VitableConnect::Internal::PageNumberPage] + # + # @see VitableConnect::Models::MemberListQualifyingLifeEventsParams + def list_qualifying_life_events(member_id, params = {}) + parsed, options = VitableConnect::MemberListQualifyingLifeEventsParams.dump_request(params) + query = VitableConnect::Internal::Util.encode_query_params(parsed) + @client.request( + method: :get, + path: ["v1/members/%1$s/qualifying-life-events", member_id], + query: query, + page: VitableConnect::Internal::PageNumberPage, + model: VitableConnect::Models::MemberListQualifyingLifeEventsResponse, + options: options + ) + end + + # Lists a member's household as a per-participant table — the account holder plus + # each active household member, with name, relationship, member type, date of + # birth, and household-admin flag. Access is scoped to the authenticated + # principal; a member not visible to the caller (or with no household) returns + # a 404. + # + # @overload retrieve_household(member_id, request_options: {}) + # + # @param member_id [String] Unique member identifier (mbr\_\*) + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}, nil] + # + # @return [VitableConnect::Models::MemberRetrieveHouseholdResponse] + # + # @see VitableConnect::Models::MemberRetrieveHouseholdParams + def retrieve_household(member_id, params = {}) + @client.request( + method: :get, + path: ["v1/members/%1$s/household", member_id], + model: VitableConnect::Models::MemberRetrieveHouseholdResponse, + options: params[:request_options] + ) + end + + # @api private + # + # @param client [VitableConnect::Client] + def initialize(client:) + @client = client + end + end + end +end diff --git a/lib/vitable_connect/resources/organizations.rb b/lib/vitable_connect/resources/organizations.rb new file mode 100644 index 0000000..406da04 --- /dev/null +++ b/lib/vitable_connect/resources/organizations.rb @@ -0,0 +1,66 @@ +# frozen_string_literal: true + +module VitableConnect + module Resources + class Organizations + # Some parameter documentations has been truncated, see + # {VitableConnect::Models::OrganizationCreateParams} for more details. + # + # Onboards the authenticated user's partner Organization: creates the local + # Organization + the creator's admin membership atomically, then mirrors it to + # WorkOS (creates the WorkOS org and binds the creator as admin). 409 + # `organization_already_exists` when the user already has an organization (v0: one + # organization per user). + # + # @overload create(name:, type: nil, request_options: {}) + # + # @param name [String] + # + # @param type [Symbol, VitableConnect::Models::OrganizationCreateParams::Type, nil] - `BROKERAGE` - BROKERAGE + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}, nil] + # + # @return [VitableConnect::Models::OrganizationCreateResponse] + # + # @see VitableConnect::Models::OrganizationCreateParams + def create(params) + parsed, options = VitableConnect::OrganizationCreateParams.dump_request(params) + @client.request( + method: :post, + path: "v1/organizations", + body: parsed, + model: VitableConnect::Models::OrganizationCreateResponse, + security: {}, + options: options + ) + end + + # Lists the organizations the authenticated caller is an active member of + # (paginated). Returns an empty list when the caller belongs to no organizations. + # + # @overload list(request_options: {}) + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}, nil] + # + # @return [VitableConnect::Models::OrganizationListResponse] + # + # @see VitableConnect::Models::OrganizationListParams + def list(params = {}) + @client.request( + method: :get, + path: "v1/organizations", + model: VitableConnect::Models::OrganizationListResponse, + security: {}, + options: params[:request_options] + ) + end + + # @api private + # + # @param client [VitableConnect::Client] + def initialize(client:) + @client = client + end + end + end +end diff --git a/lib/vitable_connect/resources/plans.rb b/lib/vitable_connect/resources/plans.rb new file mode 100644 index 0000000..58c2f85 --- /dev/null +++ b/lib/vitable_connect/resources/plans.rb @@ -0,0 +1,41 @@ +# frozen_string_literal: true + +module VitableConnect + module Resources + class Plans + # Returns a paginated list of benefit plans linked to the authenticated + # organization. + # + # @overload list(limit: nil, page: nil, request_options: {}) + # + # @param limit [Integer] Items per page (default: 20, max: 100) + # + # @param page [Integer] Page number (default: 1) + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}, nil] + # + # @return [VitableConnect::Internal::PageNumberPage] + # + # @see VitableConnect::Models::PlanListParams + def list(params = {}) + parsed, options = VitableConnect::PlanListParams.dump_request(params) + query = VitableConnect::Internal::Util.encode_query_params(parsed) + @client.request( + method: :get, + path: "v1/plans", + query: query, + page: VitableConnect::Internal::PageNumberPage, + model: VitableConnect::Models::PlanListResponse, + options: options + ) + end + + # @api private + # + # @param client [VitableConnect::Client] + def initialize(client:) + @client = client + end + end + end +end diff --git a/lib/vitable_connect/resources/webhook_events.rb b/lib/vitable_connect/resources/webhook_events.rb new file mode 100644 index 0000000..fd6d9db --- /dev/null +++ b/lib/vitable_connect/resources/webhook_events.rb @@ -0,0 +1,95 @@ +# frozen_string_literal: true + +module VitableConnect + module Resources + class WebhookEvents + # Retrieves a single webhook event by its prefixed ID. Returns 404 if the event + # does not exist or belongs to a different organization. + # + # @overload retrieve(event_id, request_options: {}) + # + # @param event_id [String] + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}, nil] + # + # @return [VitableConnect::Models::WebhookEventRetrieveResponse] + # + # @see VitableConnect::Models::WebhookEventRetrieveParams + def retrieve(event_id, params = {}) + @client.request( + method: :get, + path: ["v1/webhook-events/%1$s", event_id], + model: VitableConnect::Models::WebhookEventRetrieveResponse, + options: params[:request_options] + ) + end + + # Some parameter documentations has been truncated, see + # {VitableConnect::Models::WebhookEventListParams} for more details. + # + # Retrieves a paginated list of webhook events for the authenticated organization. + # Supports filtering by event name, resource type, resource ID, and date range. + # + # @overload list(created_after: nil, created_before: nil, event_name: nil, limit: nil, page: nil, resource_id: nil, resource_type: nil, request_options: {}) + # + # @param created_after [Time] + # + # @param created_before [Time] + # + # @param event_name [Symbol, VitableConnect::Models::WebhookEventListParams::EventName] - `enrollment.accepted` - Enrollment Accepted + # + # @param limit [Integer] Items per page (default: 20, max: 100) + # + # @param page [Integer] Page number (default: 1) + # + # @param resource_id [String] + # + # @param resource_type [Symbol, VitableConnect::Models::WebhookEventListParams::ResourceType] - `enrollment` - Enrollment + # + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}, nil] + # + # @return [VitableConnect::Internal::PageNumberPage] + # + # @see VitableConnect::Models::WebhookEventListParams + def list(params = {}) + parsed, options = VitableConnect::WebhookEventListParams.dump_request(params) + query = VitableConnect::Internal::Util.encode_query_params(parsed) + @client.request( + method: :get, + path: "v1/webhook-events", + query: query, + page: VitableConnect::Internal::PageNumberPage, + model: VitableConnect::WebhookEvent, + options: options + ) + end + + # Retrieves all delivery attempts for a webhook event. Returns up to 100 + # deliveries. Each delivery includes a computed status field (Pending, In + # Progress, Delivered, or Failed). + # + # @overload list_deliveries(event_id, request_options: {}) + # + # @param event_id [String] + # @param request_options [VitableConnect::RequestOptions, Hash{Symbol=>Object}, nil] + # + # @return [VitableConnect::Models::WebhookEventListDeliveriesResponse] + # + # @see VitableConnect::Models::WebhookEventListDeliveriesParams + def list_deliveries(event_id, params = {}) + @client.request( + method: :get, + path: ["v1/webhook-events/%1$s/deliveries", event_id], + model: VitableConnect::Models::WebhookEventListDeliveriesResponse, + options: params[:request_options] + ) + end + + # @api private + # + # @param client [VitableConnect::Client] + def initialize(client:) + @client = client + end + end + end +end diff --git a/lib/VitableConnect/version.rb b/lib/vitable_connect/version.rb similarity index 74% rename from lib/VitableConnect/version.rb rename to lib/vitable_connect/version.rb index dcb8227..2d069ea 100644 --- a/lib/VitableConnect/version.rb +++ b/lib/vitable_connect/version.rb @@ -1,5 +1,5 @@ # frozen_string_literal: true module VitableConnect - VERSION = "1.0.0" + VERSION = "0.6.0" end diff --git a/manifest.yaml b/manifest.yaml new file mode 100644 index 0000000..a1fd74a --- /dev/null +++ b/manifest.yaml @@ -0,0 +1,17 @@ +dependencies: + - English + - base64 + - cgi + - date + - erb + - etc + - json + - net/http + - openssl + - pathname + - rbconfig + - securerandom + - set + - stringio + - time + - uri diff --git a/rbi/vitable_connect/client.rbi b/rbi/vitable_connect/client.rbi new file mode 100644 index 0000000..13556ed --- /dev/null +++ b/rbi/vitable_connect/client.rbi @@ -0,0 +1,106 @@ +# typed: strong + +module VitableConnect + class Client < VitableConnect::Internal::Transport::BaseClient + DEFAULT_MAX_RETRIES = 2 + + DEFAULT_TIMEOUT_IN_SECONDS = T.let(60.0, Float) + + DEFAULT_INITIAL_RETRY_DELAY = T.let(0.5, Float) + + DEFAULT_MAX_RETRY_DELAY = T.let(8.0, Float) + + ENVIRONMENTS = + T.let( + { + production: "https://api.vitablehealth.com", + environment_1: "https://api.uat.vitablehealth.com" + }, + T::Hash[Symbol, String] + ) + + # API Key or Access Token authentication using Bearer token in Authorization + # header. API keys use the vit*apk* prefix, access tokens use the vit*at* prefix. + sig { returns(String) } + attr_reader :api_key + + # Issue short-lived access tokens for scoped API access + sig { returns(VitableConnect::Resources::Auth) } + attr_reader :auth + + sig { returns(VitableConnect::Resources::Employees) } + attr_reader :employees + + sig { returns(VitableConnect::Resources::Employers) } + attr_reader :employers + + # Manage benefit enrollments and elections for employees + sig { returns(VitableConnect::Resources::Enrollments) } + attr_reader :enrollments + + sig { returns(VitableConnect::Resources::WebhookEvents) } + attr_reader :webhook_events + + sig { returns(VitableConnect::Resources::Groups) } + attr_reader :groups + + # Browse the members covered across your book and read a member's profile + sig { returns(VitableConnect::Resources::Members) } + attr_reader :members + + sig { returns(VitableConnect::Resources::Organizations) } + attr_reader :organizations + + sig { returns(VitableConnect::Resources::Plans) } + attr_reader :plans + + # @api private + sig do + override + .params(security: { api_key_auth: T::Boolean }) + .returns(T::Hash[String, String]) + end + private def auth_headers(security:) + end + + # @api private + sig { returns(T::Hash[String, String]) } + private def api_key_auth + end + + # Creates and returns a new client for interacting with the API. + sig do + params( + api_key: T.nilable(String), + environment: T.nilable(T.any(Symbol, String)), + base_url: T.nilable(String), + max_retries: Integer, + timeout: Float, + initial_retry_delay: Float, + max_retry_delay: Float + ).returns(T.attached_class) + end + def self.new( + # API Key or Access Token authentication using Bearer token in Authorization + # header. API keys use the vit*apk* prefix, access tokens use the vit*at* prefix. + # Defaults to `ENV["VITABLE_CONNECT_API_KEY"]` + api_key: ENV["VITABLE_CONNECT_API_KEY"], + # Specifies the environment to use for the API. + # + # Each environment maps to a different base URL: + # + # - `production` corresponds to `https://api.vitablehealth.com` + # - `environment_1` corresponds to `https://api.uat.vitablehealth.com` + environment: nil, + # Override the default base URL for the API, e.g., + # `"https://api.example.com/v2/"`. Defaults to `ENV["VITABLE_CONNECT_BASE_URL"]` + base_url: ENV["VITABLE_CONNECT_BASE_URL"], + # Max number of retries to attempt after a failed retryable request. + max_retries: VitableConnect::Client::DEFAULT_MAX_RETRIES, + timeout: VitableConnect::Client::DEFAULT_TIMEOUT_IN_SECONDS, + initial_retry_delay: VitableConnect::Client::DEFAULT_INITIAL_RETRY_DELAY, + max_retry_delay: VitableConnect::Client::DEFAULT_MAX_RETRY_DELAY + ) + end + end +end diff --git a/rbi/vitable_connect/errors.rbi b/rbi/vitable_connect/errors.rbi new file mode 100644 index 0000000..b7427e2 --- /dev/null +++ b/rbi/vitable_connect/errors.rbi @@ -0,0 +1,205 @@ +# typed: strong + +module VitableConnect + module Errors + class Error < StandardError + sig { returns(T.nilable(StandardError)) } + attr_accessor :cause + end + + class ConversionError < VitableConnect::Errors::Error + sig { returns(T.nilable(StandardError)) } + def cause + end + + # @api private + sig do + params( + on: T::Class[StandardError], + method: Symbol, + target: T.anything, + value: T.anything, + cause: T.nilable(StandardError) + ).returns(T.attached_class) + end + def self.new(on:, method:, target:, value:, cause: nil) + end + end + + class APIError < VitableConnect::Errors::Error + sig { returns(URI::Generic) } + attr_accessor :url + + sig { returns(T.nilable(Integer)) } + attr_accessor :status + + sig { returns(T.nilable(T::Hash[String, String])) } + attr_accessor :headers + + sig { returns(T.nilable(T.anything)) } + attr_accessor :body + + # @api private + sig do + params( + url: URI::Generic, + status: T.nilable(Integer), + headers: T.nilable(T::Hash[String, String]), + body: T.nilable(Object), + request: NilClass, + response: NilClass, + message: T.nilable(String) + ).returns(T.attached_class) + end + def self.new( + url:, + status: nil, + headers: nil, + body: nil, + request: nil, + response: nil, + message: nil + ) + end + end + + class APIConnectionError < VitableConnect::Errors::APIError + sig { returns(NilClass) } + attr_accessor :status + + sig { returns(NilClass) } + attr_accessor :body + + # @api private + sig do + params( + url: URI::Generic, + status: NilClass, + headers: T.nilable(T::Hash[String, String]), + body: NilClass, + request: NilClass, + response: NilClass, + message: T.nilable(String) + ).returns(T.attached_class) + end + def self.new( + url:, + status: nil, + headers: nil, + body: nil, + request: nil, + response: nil, + message: "Connection error." + ) + end + end + + class APITimeoutError < VitableConnect::Errors::APIConnectionError + # @api private + sig do + params( + url: URI::Generic, + status: NilClass, + headers: T.nilable(T::Hash[String, String]), + body: NilClass, + request: NilClass, + response: NilClass, + message: T.nilable(String) + ).returns(T.attached_class) + end + def self.new( + url:, + status: nil, + headers: nil, + body: nil, + request: nil, + response: nil, + message: "Request timed out." + ) + end + end + + class APIStatusError < VitableConnect::Errors::APIError + # @api private + sig do + params( + url: URI::Generic, + status: Integer, + headers: T.nilable(T::Hash[String, String]), + body: T.nilable(Object), + request: NilClass, + response: NilClass, + message: T.nilable(String) + ).returns(T.attached_class) + end + def self.for( + url:, + status:, + headers:, + body:, + request:, + response:, + message: nil + ) + end + + sig { returns(Integer) } + attr_accessor :status + + # @api private + sig do + params( + url: URI::Generic, + status: Integer, + headers: T.nilable(T::Hash[String, String]), + body: T.nilable(Object), + request: NilClass, + response: NilClass, + message: T.nilable(String) + ).returns(T.attached_class) + end + def self.new( + url:, + status:, + headers:, + body:, + request:, + response:, + message: nil + ) + end + end + + class BadRequestError < VitableConnect::Errors::APIStatusError + HTTP_STATUS = 400 + end + + class AuthenticationError < VitableConnect::Errors::APIStatusError + HTTP_STATUS = 401 + end + + class PermissionDeniedError < VitableConnect::Errors::APIStatusError + HTTP_STATUS = 403 + end + + class NotFoundError < VitableConnect::Errors::APIStatusError + HTTP_STATUS = 404 + end + + class ConflictError < VitableConnect::Errors::APIStatusError + HTTP_STATUS = 409 + end + + class UnprocessableEntityError < VitableConnect::Errors::APIStatusError + HTTP_STATUS = 422 + end + + class RateLimitError < VitableConnect::Errors::APIStatusError + HTTP_STATUS = 429 + end + + class InternalServerError < VitableConnect::Errors::APIStatusError + HTTP_STATUS = T.let((500..), T::Range[Integer]) + end + end +end diff --git a/rbi/vitable_connect/file_part.rbi b/rbi/vitable_connect/file_part.rbi new file mode 100644 index 0000000..6be4beb --- /dev/null +++ b/rbi/vitable_connect/file_part.rbi @@ -0,0 +1,37 @@ +# typed: strong + +module VitableConnect + class FilePart + sig { returns(T.any(Pathname, StringIO, IO, String)) } + attr_reader :content + + sig { returns(T.nilable(String)) } + attr_reader :content_type + + sig { returns(T.nilable(String)) } + attr_reader :filename + + # @api private + sig { returns(String) } + private def read + end + + sig { params(a: T.anything).returns(String) } + def to_json(*a) + end + + sig { params(a: T.anything).returns(String) } + def to_yaml(*a) + end + + sig do + params( + content: T.any(Pathname, StringIO, IO, String), + filename: T.nilable(T.any(Pathname, String)), + content_type: T.nilable(String) + ).returns(T.attached_class) + end + def self.new(content, filename: nil, content_type: nil) + end + end +end diff --git a/rbi/vitable_connect/internal.rbi b/rbi/vitable_connect/internal.rbi new file mode 100644 index 0000000..04b153b --- /dev/null +++ b/rbi/vitable_connect/internal.rbi @@ -0,0 +1,18 @@ +# typed: strong + +module VitableConnect + module Internal + extend VitableConnect::Internal::Util::SorbetRuntimeSupport + + # Due to the current WIP status of Shapes support in Sorbet, types referencing + # this alias might be refined in the future. + AnyHash = T.type_alias { T::Hash[Symbol, T.anything] } + + FileInput = + T.type_alias do + T.any(Pathname, StringIO, IO, String, VitableConnect::FilePart) + end + + OMIT = T.let(Object.new.freeze, T.anything) + end +end diff --git a/rbi/vitable_connect/internal/page_number_page.rbi b/rbi/vitable_connect/internal/page_number_page.rbi new file mode 100644 index 0000000..487ac7c --- /dev/null +++ b/rbi/vitable_connect/internal/page_number_page.rbi @@ -0,0 +1,49 @@ +# typed: strong + +module VitableConnect + module Internal + class PageNumberPage + include VitableConnect::Internal::Type::BasePage + + Elem = type_member + + sig { returns(T.nilable(T::Array[Elem])) } + attr_accessor :data + + sig { returns(Pagination) } + attr_accessor :pagination + + # @api private + sig { returns(String) } + def inspect + end + + class Pagination < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias { T.any(Pagination, VitableConnect::Internal::AnyHash) } + + sig { returns(T.nilable(Integer)) } + attr_reader :page + + sig { params(page: Integer).void } + attr_writer :page + + sig { returns(T.nilable(Integer)) } + attr_reader :total_pages + + sig { params(total_pages: Integer).void } + attr_writer :total_pages + + sig do + params(page: Integer, total_pages: Integer).returns(T.attached_class) + end + def self.new(page: nil, total_pages: nil) + end + + sig { override.returns({ page: Integer, total_pages: Integer }) } + def to_hash + end + end + end + end +end diff --git a/rbi/vitable_connect/internal/transport/base_client.rbi b/rbi/vitable_connect/internal/transport/base_client.rbi new file mode 100644 index 0000000..67a288a --- /dev/null +++ b/rbi/vitable_connect/internal/transport/base_client.rbi @@ -0,0 +1,310 @@ +# typed: strong + +module VitableConnect + module Internal + module Transport + # @api private + class BaseClient + extend VitableConnect::Internal::Util::SorbetRuntimeSupport + + abstract! + + RequestComponents = + T.type_alias do + { + method: Symbol, + path: T.any(String, T::Array[String]), + query: + T.nilable( + T::Hash[String, T.nilable(T.any(T::Array[String], String))] + ), + headers: + T.nilable( + T::Hash[ + String, + T.nilable( + T.any( + String, + Integer, + T::Array[T.nilable(T.any(String, Integer))] + ) + ) + ] + ), + body: T.nilable(T.anything), + unwrap: + T.nilable( + T.any( + Symbol, + Integer, + T::Array[T.any(Symbol, Integer)], + T.proc.params(arg0: T.anything).returns(T.anything) + ) + ), + page: + T.nilable( + T::Class[ + VitableConnect::Internal::Type::BasePage[ + VitableConnect::Internal::Type::BaseModel + ] + ] + ), + stream: T.nilable(T::Class[T.anything]), + model: + T.nilable(VitableConnect::Internal::Type::Converter::Input), + security: T.nilable({ api_key_auth: T::Boolean }), + options: T.nilable(VitableConnect::RequestOptions::OrHash) + } + end + + RequestInput = + T.type_alias do + { + method: Symbol, + url: URI::Generic, + headers: T::Hash[String, String], + body: T.anything, + max_retries: Integer, + timeout: Float + } + end + + # from whatwg fetch spec + MAX_REDIRECTS = 20 + + PLATFORM_HEADERS = T::Hash[String, String] + + class << self + # @api private + sig do + params( + req: + VitableConnect::Internal::Transport::BaseClient::RequestComponents + ).void + end + def validate!(req) + end + + # @api private + sig do + params(status: Integer, headers: T::Hash[String, String]).returns( + T::Boolean + ) + end + def should_retry?(status, headers:) + end + + # @api private + sig do + params( + request: + VitableConnect::Internal::Transport::BaseClient::RequestInput, + status: Integer, + response_headers: T::Hash[String, String] + ).returns( + VitableConnect::Internal::Transport::BaseClient::RequestInput + ) + end + def follow_redirect(request, status:, response_headers:) + end + + # @api private + sig do + params( + status: + T.any(Integer, VitableConnect::Errors::APIConnectionError), + stream: T.nilable(T::Enumerable[String]) + ).void + end + def reap_connection!(status, stream:) + end + end + + sig { returns(URI::Generic) } + attr_reader :base_url + + sig { returns(Float) } + attr_reader :timeout + + sig { returns(Integer) } + attr_reader :max_retries + + sig { returns(Float) } + attr_reader :initial_retry_delay + + sig { returns(Float) } + attr_reader :max_retry_delay + + sig { returns(T::Hash[String, String]) } + attr_reader :headers + + sig { returns(T.nilable(String)) } + attr_reader :idempotency_header + + # @api private + sig { returns(VitableConnect::Internal::Transport::PooledNetRequester) } + attr_reader :requester + + # @api private + sig do + params( + base_url: String, + timeout: Float, + max_retries: Integer, + initial_retry_delay: Float, + max_retry_delay: Float, + headers: + T::Hash[ + String, + T.nilable( + T.any( + String, + Integer, + T::Array[T.nilable(T.any(String, Integer))] + ) + ) + ], + idempotency_header: T.nilable(String) + ).returns(T.attached_class) + end + def self.new( + base_url:, + timeout: 0.0, + max_retries: 0, + initial_retry_delay: 0.0, + max_retry_delay: 0.0, + headers: {}, + idempotency_header: nil + ) + end + + # @api private + sig { overridable.returns(T::Hash[String, String]) } + private def auth_headers + end + + # @api private + sig { returns(String) } + private def user_agent + end + + # @api private + sig { returns(String) } + private def generate_idempotency_key + end + + # @api private + sig do + overridable + .params( + req: + VitableConnect::Internal::Transport::BaseClient::RequestComponents, + opts: VitableConnect::Internal::AnyHash + ) + .returns( + VitableConnect::Internal::Transport::BaseClient::RequestInput + ) + end + private def build_request(req, opts) + end + + # @api private + sig do + params( + headers: T::Hash[String, String], + retry_count: Integer + ).returns(Float) + end + private def retry_delay(headers, retry_count:) + end + + # @api private + sig do + params( + request: + VitableConnect::Internal::Transport::BaseClient::RequestInput, + redirect_count: Integer, + retry_count: Integer, + send_retry_header: T::Boolean + ).returns([Integer, Net::HTTPResponse, T::Enumerable[String]]) + end + def send_request( + request, + redirect_count:, + retry_count:, + send_retry_header: + ) + end + + # Execute the request specified by `req`. This is the method that all resource + # methods call into. + # + # @overload request(method, path, query: {}, headers: {}, body: nil, unwrap: nil, page: nil, stream: nil, model: VitableConnect::Internal::Type::Unknown, security: {api_key_auth: true}, options: {}) + sig do + params( + method: Symbol, + path: T.any(String, T::Array[String]), + query: + T.nilable( + T::Hash[String, T.nilable(T.any(T::Array[String], String))] + ), + headers: + T.nilable( + T::Hash[ + String, + T.nilable( + T.any( + String, + Integer, + T::Array[T.nilable(T.any(String, Integer))] + ) + ) + ] + ), + body: T.nilable(T.anything), + unwrap: + T.nilable( + T.any( + Symbol, + Integer, + T::Array[T.any(Symbol, Integer)], + T.proc.params(arg0: T.anything).returns(T.anything) + ) + ), + page: + T.nilable( + T::Class[ + VitableConnect::Internal::Type::BasePage[ + VitableConnect::Internal::Type::BaseModel + ] + ] + ), + stream: T.nilable(T::Class[T.anything]), + model: T.nilable(VitableConnect::Internal::Type::Converter::Input), + security: T.nilable({ api_key_auth: T::Boolean }), + options: T.nilable(VitableConnect::RequestOptions::OrHash) + ).returns(T.anything) + end + def request( + method, + path, + query: {}, + headers: {}, + body: nil, + unwrap: nil, + page: nil, + stream: nil, + model: VitableConnect::Internal::Type::Unknown, + security: { api_key_auth: true }, + options: {} + ) + end + + # @api private + sig { returns(String) } + def inspect + end + end + end + end +end diff --git a/rbi/vitable_connect/internal/transport/pooled_net_requester.rbi b/rbi/vitable_connect/internal/transport/pooled_net_requester.rbi new file mode 100644 index 0000000..ec83c1f --- /dev/null +++ b/rbi/vitable_connect/internal/transport/pooled_net_requester.rbi @@ -0,0 +1,84 @@ +# typed: strong + +module VitableConnect + module Internal + module Transport + # @api private + class PooledNetRequester + extend VitableConnect::Internal::Util::SorbetRuntimeSupport + + Request = + T.type_alias do + { + method: Symbol, + url: URI::Generic, + headers: T::Hash[String, String], + body: T.anything, + deadline: Float + } + end + + # from the golang stdlib + # https://github.com/golang/go/blob/c8eced8580028328fde7c03cbfcb720ce15b2358/src/net/http/transport.go#L49 + KEEP_ALIVE_TIMEOUT = 30 + + DEFAULT_MAX_CONNECTIONS = T.let(T.unsafe(nil), Integer) + + class << self + # @api private + sig do + params(cert_store: OpenSSL::X509::Store, url: URI::Generic).returns( + Net::HTTP + ) + end + def connect(cert_store:, url:) + end + + # @api private + sig { params(conn: Net::HTTP, deadline: Float).void } + def calibrate_socket_timeout(conn, deadline) + end + + # @api private + sig do + params( + request: + VitableConnect::Internal::Transport::PooledNetRequester::Request, + blk: T.proc.params(arg0: String).void + ).returns([Net::HTTPGenericRequest, T.proc.void]) + end + def build_request(request, &blk) + end + end + + # @api private + sig do + params( + url: URI::Generic, + deadline: Float, + blk: T.proc.params(arg0: Net::HTTP).void + ).void + end + private def with_pool(url, deadline:, &blk) + end + + # @api private + sig do + params( + request: + VitableConnect::Internal::Transport::PooledNetRequester::Request + ).returns([Integer, Net::HTTPResponse, T::Enumerable[String]]) + end + def execute(request) + end + + # @api private + sig { params(size: Integer).returns(T.attached_class) } + def self.new( + size: VitableConnect::Internal::Transport::PooledNetRequester::DEFAULT_MAX_CONNECTIONS + ) + end + end + end + end +end diff --git a/rbi/vitable_connect/internal/type/array_of.rbi b/rbi/vitable_connect/internal/type/array_of.rbi new file mode 100644 index 0000000..e219f5c --- /dev/null +++ b/rbi/vitable_connect/internal/type/array_of.rbi @@ -0,0 +1,108 @@ +# typed: strong + +module VitableConnect + module Internal + module Type + # @api private + # + # Array of items of a given type. + class ArrayOf + include VitableConnect::Internal::Type::Converter + include VitableConnect::Internal::Util::SorbetRuntimeSupport + + abstract! + + Elem = type_member(:out) + + sig do + params( + type_info: + T.any( + VitableConnect::Internal::AnyHash, + T.proc.returns( + VitableConnect::Internal::Type::Converter::Input + ), + VitableConnect::Internal::Type::Converter::Input + ), + spec: VitableConnect::Internal::AnyHash + ).returns(T.attached_class) + end + def self.[](type_info, spec = {}) + end + + sig { params(other: T.anything).returns(T::Boolean) } + def ===(other) + end + + sig { params(other: T.anything).returns(T::Boolean) } + def ==(other) + end + + sig { returns(Integer) } + def hash + end + + # @api private + sig do + override + .params( + value: T.any(T::Array[T.anything], T.anything), + state: VitableConnect::Internal::Type::Converter::CoerceState + ) + .returns(T.any(T::Array[T.anything], T.anything)) + end + def coerce(value, state:) + end + + # @api private + sig do + override + .params( + value: T.any(T::Array[T.anything], T.anything), + state: VitableConnect::Internal::Type::Converter::DumpState + ) + .returns(T.any(T::Array[T.anything], T.anything)) + end + def dump(value, state:) + end + + # @api private + sig { returns(T.anything) } + def to_sorbet_type + end + + # @api private + sig { returns(Elem) } + protected def item_type + end + + # @api private + sig { returns(T::Boolean) } + protected def nilable? + end + + # @api private + sig do + params( + type_info: + T.any( + VitableConnect::Internal::AnyHash, + T.proc.returns( + VitableConnect::Internal::Type::Converter::Input + ), + VitableConnect::Internal::Type::Converter::Input + ), + spec: VitableConnect::Internal::AnyHash + ).void + end + def initialize(type_info, spec = {}) + end + + # @api private + sig { params(depth: Integer).returns(String) } + def inspect(depth: 0) + end + end + end + end +end diff --git a/rbi/vitable_connect/internal/type/base_model.rbi b/rbi/vitable_connect/internal/type/base_model.rbi new file mode 100644 index 0000000..a83d96d --- /dev/null +++ b/rbi/vitable_connect/internal/type/base_model.rbi @@ -0,0 +1,314 @@ +# typed: strong + +module VitableConnect + module Internal + module Type + class BaseModel + extend VitableConnect::Internal::Type::Converter + extend VitableConnect::Internal::Util::SorbetRuntimeSupport + + abstract! + + KnownField = + T.type_alias do + { + mode: T.nilable(Symbol), + required: T::Boolean, + nilable: T::Boolean + } + end + + OrHash = + T.type_alias do + T.any( + VitableConnect::Internal::Type::BaseModel, + VitableConnect::Internal::AnyHash + ) + end + + class << self + # @api private + # + # Assumes superclass fields are totally defined before fields are accessed / + # defined on subclasses. + sig { params(child: VitableConnect::Internal::Type::BaseModel).void } + def inherited(child) + end + + # @api private + sig do + returns( + T::Hash[ + Symbol, + T.all( + VitableConnect::Internal::Type::BaseModel::KnownField, + { + type_fn: + T.proc.returns( + VitableConnect::Internal::Type::Converter::Input + ) + } + ) + ] + ) + end + def known_fields + end + + # @api private + sig do + returns( + T::Hash[ + Symbol, + T.all( + VitableConnect::Internal::Type::BaseModel::KnownField, + { type: VitableConnect::Internal::Type::Converter::Input } + ) + ] + ) + end + def fields + end + + # @api private + sig do + params( + name_sym: Symbol, + required: T::Boolean, + type_info: + T.any( + { + const: + T.nilable( + T.any(NilClass, T::Boolean, Integer, Float, Symbol) + ), + enum: + T.nilable( + T.proc.returns( + VitableConnect::Internal::Type::Converter::Input + ) + ), + union: + T.nilable( + T.proc.returns( + VitableConnect::Internal::Type::Converter::Input + ) + ), + api_name: Symbol, + nil?: T::Boolean + }, + T.proc.returns( + VitableConnect::Internal::Type::Converter::Input + ), + VitableConnect::Internal::Type::Converter::Input + ), + spec: VitableConnect::Internal::AnyHash + ).void + end + private def add_field(name_sym, required:, type_info:, spec:) + end + + # @api private + sig do + params( + name_sym: Symbol, + type_info: + T.any( + VitableConnect::Internal::AnyHash, + T.proc.returns( + VitableConnect::Internal::Type::Converter::Input + ), + VitableConnect::Internal::Type::Converter::Input + ), + spec: VitableConnect::Internal::AnyHash + ).void + end + def required(name_sym, type_info, spec = {}) + end + + # @api private + sig do + params( + name_sym: Symbol, + type_info: + T.any( + VitableConnect::Internal::AnyHash, + T.proc.returns( + VitableConnect::Internal::Type::Converter::Input + ), + VitableConnect::Internal::Type::Converter::Input + ), + spec: VitableConnect::Internal::AnyHash + ).void + end + def optional(name_sym, type_info, spec = {}) + end + + # @api private + # + # `request_only` attributes not excluded from `.#coerce` when receiving responses + # even if well behaved servers should not send them + sig { params(blk: T.proc.void).void } + private def request_only(&blk) + end + + # @api private + # + # `response_only` attributes are omitted from `.#dump` when making requests + sig { params(blk: T.proc.void).void } + private def response_only(&blk) + end + + sig { params(other: T.anything).returns(T::Boolean) } + def ==(other) + end + + sig { returns(Integer) } + def hash + end + end + + sig { params(other: T.anything).returns(T::Boolean) } + def ==(other) + end + + sig { returns(Integer) } + def hash + end + + class << self + # @api private + sig do + override + .params( + value: + T.any( + VitableConnect::Internal::Type::BaseModel, + T::Hash[T.anything, T.anything], + T.anything + ), + state: VitableConnect::Internal::Type::Converter::CoerceState + ) + .returns(T.any(T.attached_class, T.anything)) + end + def coerce(value, state:) + end + + # @api private + sig do + override + .params( + value: T.any(T.attached_class, T.anything), + state: VitableConnect::Internal::Type::Converter::DumpState + ) + .returns(T.any(T::Hash[T.anything, T.anything], T.anything)) + end + def dump(value, state:) + end + + # @api private + sig { returns(T.anything) } + def to_sorbet_type + end + end + + class << self + # @api private + sig do + params( + model: VitableConnect::Internal::Type::BaseModel, + convert: T::Boolean + ).returns(VitableConnect::Internal::AnyHash) + end + def recursively_to_h(model, convert:) + end + end + + # Returns the raw value associated with the given key, if found. Otherwise, nil is + # returned. + # + # It is valid to lookup keys that are not in the API spec, for example to access + # undocumented features. This method does not parse response data into + # higher-level types. Lookup by anything other than a Symbol is an ArgumentError. + sig { params(key: Symbol).returns(T.nilable(T.anything)) } + def [](key) + end + + # Returns a Hash of the data underlying this object. O(1) + # + # Keys are Symbols and values are the raw values from the response. The return + # value indicates which values were ever set on the object. i.e. there will be a + # key in this hash if they ever were, even if the set value was nil. + # + # This method is not recursive. The returned value is shared by the object, so it + # should not be mutated. + sig { overridable.returns(VitableConnect::Internal::AnyHash) } + def to_h + end + + # Returns a Hash of the data underlying this object. O(1) + # + # Keys are Symbols and values are the raw values from the response. The return + # value indicates which values were ever set on the object. i.e. there will be a + # key in this hash if they ever were, even if the set value was nil. + # + # This method is not recursive. The returned value is shared by the object, so it + # should not be mutated. + sig { overridable.returns(VitableConnect::Internal::AnyHash) } + def to_hash + end + + # In addition to the behaviour of `#to_h`, this method will recursively call + # `#to_h` on nested models. + sig { overridable.returns(VitableConnect::Internal::AnyHash) } + def deep_to_h + end + + sig do + params(keys: T.nilable(T::Array[Symbol])).returns( + VitableConnect::Internal::AnyHash + ) + end + def deconstruct_keys(keys) + end + + sig { params(a: T.anything).returns(String) } + def to_json(*a) + end + + sig { params(a: T.anything).returns(String) } + def to_yaml(*a) + end + + # Create a new instance of a model. + sig do + params( + data: + T.any( + T::Hash[Symbol, T.anything], + VitableConnect::Internal::Type::BaseModel + ) + ).returns(T.attached_class) + end + def self.new(data = {}) + end + + class << self + # @api private + sig { params(depth: Integer).returns(String) } + def inspect(depth: 0) + end + end + + sig { returns(String) } + def to_s + end + + # @api private + sig { returns(String) } + def inspect + end + end + end + end +end diff --git a/rbi/vitable_connect/internal/type/base_page.rbi b/rbi/vitable_connect/internal/type/base_page.rbi new file mode 100644 index 0000000..c1db9b2 --- /dev/null +++ b/rbi/vitable_connect/internal/type/base_page.rbi @@ -0,0 +1,43 @@ +# typed: strong + +module VitableConnect + module Internal + module Type + # @api private + # + # This module provides a base implementation for paginated responses in the SDK. + module BasePage + Elem = type_member(:out) + + sig { overridable.returns(T::Boolean) } + def next_page? + end + + sig { overridable.returns(T.self_type) } + def next_page + end + + sig { overridable.params(blk: T.proc.params(arg0: Elem).void).void } + def auto_paging_each(&blk) + end + + sig { returns(T::Enumerable[Elem]) } + def to_enum + end + + # @api private + sig do + params( + client: VitableConnect::Internal::Transport::BaseClient, + req: + VitableConnect::Internal::Transport::BaseClient::RequestComponents, + headers: T::Hash[String, String], + page_data: T.anything + ).void + end + def initialize(client:, req:, headers:, page_data:) + end + end + end + end +end diff --git a/rbi/vitable_connect/internal/type/boolean.rbi b/rbi/vitable_connect/internal/type/boolean.rbi new file mode 100644 index 0000000..80ac269 --- /dev/null +++ b/rbi/vitable_connect/internal/type/boolean.rbi @@ -0,0 +1,58 @@ +# typed: strong + +module VitableConnect + module Internal + module Type + # @api private + # + # Ruby has no Boolean class; this is something for models to refer to. + class Boolean + extend VitableConnect::Internal::Type::Converter + extend VitableConnect::Internal::Util::SorbetRuntimeSupport + + abstract! + + sig { params(other: T.anything).returns(T::Boolean) } + def self.===(other) + end + + sig { params(other: T.anything).returns(T::Boolean) } + def self.==(other) + end + + class << self + # @api private + # + # Coerce value to Boolean if possible, otherwise return the original value. + sig do + override + .params( + value: T.any(T::Boolean, T.anything), + state: VitableConnect::Internal::Type::Converter::CoerceState + ) + .returns(T.any(T::Boolean, T.anything)) + end + def coerce(value, state:) + end + + # @api private + sig do + override + .params( + value: T.any(T::Boolean, T.anything), + state: VitableConnect::Internal::Type::Converter::DumpState + ) + .returns(T.any(T::Boolean, T.anything)) + end + def dump(value, state:) + end + + # @api private + sig { returns(T.anything) } + def to_sorbet_type + end + end + end + end + end +end diff --git a/rbi/vitable_connect/internal/type/converter.rbi b/rbi/vitable_connect/internal/type/converter.rbi new file mode 100644 index 0000000..fc8a075 --- /dev/null +++ b/rbi/vitable_connect/internal/type/converter.rbi @@ -0,0 +1,225 @@ +# typed: strong + +module VitableConnect + module Internal + module Type + # @api private + module Converter + extend VitableConnect::Internal::Util::SorbetRuntimeSupport + + Input = + T.type_alias do + T.any( + VitableConnect::Internal::Type::Converter, + T::Class[T.anything] + ) + end + + CoerceState = + T.type_alias do + { + translate_names: T::Boolean, + strictness: T::Boolean, + exactness: { + yes: Integer, + no: Integer, + maybe: Integer + }, + error: T::Class[StandardError], + branched: Integer + } + end + + DumpState = T.type_alias { { can_retry: T::Boolean } } + + # @api private + sig do + overridable + .params( + value: T.anything, + state: VitableConnect::Internal::Type::Converter::CoerceState + ) + .returns(T.anything) + end + def coerce(value, state:) + end + + # @api private + sig do + overridable + .params( + value: T.anything, + state: VitableConnect::Internal::Type::Converter::DumpState + ) + .returns(T.anything) + end + def dump(value, state:) + end + + # @api private + sig { params(depth: Integer).returns(String) } + def inspect(depth: 0) + end + + class << self + # @api private + sig do + params( + spec: + T.any( + { + const: + T.nilable( + T.any(NilClass, T::Boolean, Integer, Float, Symbol) + ), + enum: + T.nilable( + T.proc.returns( + VitableConnect::Internal::Type::Converter::Input + ) + ), + union: + T.nilable( + T.proc.returns( + VitableConnect::Internal::Type::Converter::Input + ) + ) + }, + T.proc.returns( + VitableConnect::Internal::Type::Converter::Input + ), + VitableConnect::Internal::Type::Converter::Input + ) + ).returns(T.proc.returns(T.anything)) + end + def self.type_info(spec) + end + + # @api private + sig do + params( + type_info: + T.any( + { + const: + T.nilable( + T.any(NilClass, T::Boolean, Integer, Float, Symbol) + ), + enum: + T.nilable( + T.proc.returns( + VitableConnect::Internal::Type::Converter::Input + ) + ), + union: + T.nilable( + T.proc.returns( + VitableConnect::Internal::Type::Converter::Input + ) + ) + }, + T.proc.returns( + VitableConnect::Internal::Type::Converter::Input + ), + VitableConnect::Internal::Type::Converter::Input + ), + spec: + T.any( + { + const: + T.nilable( + T.any(NilClass, T::Boolean, Integer, Float, Symbol) + ), + enum: + T.nilable( + T.proc.returns( + VitableConnect::Internal::Type::Converter::Input + ) + ), + union: + T.nilable( + T.proc.returns( + VitableConnect::Internal::Type::Converter::Input + ) + ) + }, + T.proc.returns( + VitableConnect::Internal::Type::Converter::Input + ), + VitableConnect::Internal::Type::Converter::Input + ) + ).returns(VitableConnect::Internal::AnyHash) + end + def self.meta_info(type_info, spec) + end + + # @api private + sig do + params(translate_names: T::Boolean).returns( + VitableConnect::Internal::Type::Converter::CoerceState + ) + end + def self.new_coerce_state(translate_names: true) + end + + # @api private + # + # Based on `target`, transform `value` into `target`, to the extent possible: + # + # 1. if the given `value` conforms to `target` already, return the given `value` + # 2. if it's possible and safe to convert the given `value` to `target`, then the + # converted value + # 3. otherwise, the given `value` unaltered + # + # The coercion process is subject to improvement between minor release versions. + # See https://docs.pydantic.dev/latest/concepts/unions/#smart-mode + sig do + params( + target: VitableConnect::Internal::Type::Converter::Input, + value: T.anything, + state: VitableConnect::Internal::Type::Converter::CoerceState + ).returns(T.anything) + end + def self.coerce( + target, + value, + # The `strictness` is one of `true`, `false`. This informs the coercion strategy + # when we have to decide between multiple possible conversion targets: + # + # - `true`: the conversion must be exact, with minimum coercion. + # - `false`: the conversion can be approximate, with some coercion. + # + # The `exactness` is `Hash` with keys being one of `yes`, `no`, or `maybe`. For + # any given conversion attempt, the exactness will be updated based on how closely + # the value recursively matches the target type: + # + # - `yes`: the value can be converted to the target type with minimum coercion. + # - `maybe`: the value can be converted to the target type with some reasonable + # coercion. + # - `no`: the value cannot be converted to the target type. + # + # See implementation below for more details. + state: VitableConnect::Internal::Type::Converter.new_coerce_state + ) + end + + # @api private + sig do + params( + target: VitableConnect::Internal::Type::Converter::Input, + value: T.anything, + state: VitableConnect::Internal::Type::Converter::DumpState + ).returns(T.anything) + end + def self.dump(target, value, state: { can_retry: true }) + end + + # @api private + sig { params(target: T.anything, depth: Integer).returns(String) } + def self.inspect(target, depth:) + end + end + end + end + end +end diff --git a/rbi/vitable_connect/internal/type/enum.rbi b/rbi/vitable_connect/internal/type/enum.rbi new file mode 100644 index 0000000..9fd546b --- /dev/null +++ b/rbi/vitable_connect/internal/type/enum.rbi @@ -0,0 +1,82 @@ +# typed: strong + +module VitableConnect + module Internal + module Type + # @api private + # + # A value from among a specified list of options. OpenAPI enum values map to Ruby + # values in the SDK as follows: + # + # 1. boolean => true | false + # 2. integer => Integer + # 3. float => Float + # 4. string => Symbol + # + # We can therefore convert string values to Symbols, but can't convert other + # values safely. + module Enum + include VitableConnect::Internal::Type::Converter + include VitableConnect::Internal::Util::SorbetRuntimeSupport + + # All of the valid Symbol values for this enum. + sig do + overridable.returns( + T::Array[T.any(NilClass, T::Boolean, Integer, Float, Symbol)] + ) + end + def values + end + + sig { params(other: T.anything).returns(T::Boolean) } + def ===(other) + end + + sig { params(other: T.anything).returns(T::Boolean) } + def ==(other) + end + + sig { returns(Integer) } + def hash + end + + # @api private + # + # Unlike with primitives, `Enum` additionally validates that the value is a member + # of the enum. + sig do + override + .params( + value: T.any(String, Symbol, T.anything), + state: VitableConnect::Internal::Type::Converter::CoerceState + ) + .returns(T.any(Symbol, T.anything)) + end + def coerce(value, state:) + end + + # @api private + sig do + override + .params( + value: T.any(Symbol, T.anything), + state: VitableConnect::Internal::Type::Converter::DumpState + ) + .returns(T.any(Symbol, T.anything)) + end + def dump(value, state:) + end + + # @api private + sig { returns(T.anything) } + def to_sorbet_type + end + + # @api private + sig { params(depth: Integer).returns(String) } + def inspect(depth: 0) + end + end + end + end +end diff --git a/rbi/vitable_connect/internal/type/file_input.rbi b/rbi/vitable_connect/internal/type/file_input.rbi new file mode 100644 index 0000000..5675b10 --- /dev/null +++ b/rbi/vitable_connect/internal/type/file_input.rbi @@ -0,0 +1,59 @@ +# typed: strong + +module VitableConnect + module Internal + module Type + # @api private + # + # Either `Pathname` or `StringIO`, or `IO`, or + # `VitableConnect::Internal::Type::FileInput`. + # + # Note: when `IO` is used, all retries are disabled, since many IO` streams are + # not rewindable. + class FileInput + extend VitableConnect::Internal::Type::Converter + + abstract! + + sig { params(other: T.anything).returns(T::Boolean) } + def self.===(other) + end + + sig { params(other: T.anything).returns(T::Boolean) } + def self.==(other) + end + + class << self + # @api private + sig do + override + .params( + value: T.any(StringIO, String, T.anything), + state: VitableConnect::Internal::Type::Converter::CoerceState + ) + .returns(T.any(StringIO, T.anything)) + end + def coerce(value, state:) + end + + # @api private + sig do + override + .params( + value: T.any(Pathname, StringIO, IO, String, T.anything), + state: VitableConnect::Internal::Type::Converter::DumpState + ) + .returns(T.any(Pathname, StringIO, IO, String, T.anything)) + end + def dump(value, state:) + end + + # @api private + sig { returns(T.anything) } + def to_sorbet_type + end + end + end + end + end +end diff --git a/rbi/vitable_connect/internal/type/hash_of.rbi b/rbi/vitable_connect/internal/type/hash_of.rbi new file mode 100644 index 0000000..4aa1c76 --- /dev/null +++ b/rbi/vitable_connect/internal/type/hash_of.rbi @@ -0,0 +1,108 @@ +# typed: strong + +module VitableConnect + module Internal + module Type + # @api private + # + # Hash of items of a given type. + class HashOf + include VitableConnect::Internal::Type::Converter + include VitableConnect::Internal::Util::SorbetRuntimeSupport + + abstract! + + Elem = type_member(:out) + + sig do + params( + type_info: + T.any( + VitableConnect::Internal::AnyHash, + T.proc.returns( + VitableConnect::Internal::Type::Converter::Input + ), + VitableConnect::Internal::Type::Converter::Input + ), + spec: VitableConnect::Internal::AnyHash + ).returns(T.attached_class) + end + def self.[](type_info, spec = {}) + end + + sig { params(other: T.anything).returns(T::Boolean) } + def ===(other) + end + + sig { params(other: T.anything).returns(T::Boolean) } + def ==(other) + end + + sig { returns(Integer) } + def hash + end + + # @api private + sig do + override + .params( + value: T.any(T::Hash[T.anything, T.anything], T.anything), + state: VitableConnect::Internal::Type::Converter::CoerceState + ) + .returns(T.any(VitableConnect::Internal::AnyHash, T.anything)) + end + def coerce(value, state:) + end + + # @api private + sig do + override + .params( + value: T.any(T::Hash[T.anything, T.anything], T.anything), + state: VitableConnect::Internal::Type::Converter::DumpState + ) + .returns(T.any(VitableConnect::Internal::AnyHash, T.anything)) + end + def dump(value, state:) + end + + # @api private + sig { returns(T.anything) } + def to_sorbet_type + end + + # @api private + sig { returns(Elem) } + protected def item_type + end + + # @api private + sig { returns(T::Boolean) } + protected def nilable? + end + + # @api private + sig do + params( + type_info: + T.any( + VitableConnect::Internal::AnyHash, + T.proc.returns( + VitableConnect::Internal::Type::Converter::Input + ), + VitableConnect::Internal::Type::Converter::Input + ), + spec: VitableConnect::Internal::AnyHash + ).void + end + def initialize(type_info, spec = {}) + end + + # @api private + sig { params(depth: Integer).returns(String) } + def inspect(depth: 0) + end + end + end + end +end diff --git a/rbi/vitable_connect/internal/type/request_parameters.rbi b/rbi/vitable_connect/internal/type/request_parameters.rbi new file mode 100644 index 0000000..fda76ec --- /dev/null +++ b/rbi/vitable_connect/internal/type/request_parameters.rbi @@ -0,0 +1,31 @@ +# typed: strong + +module VitableConnect + module Internal + module Type + # @api private + module RequestParameters + # Options to specify HTTP behaviour for this request. + sig { returns(VitableConnect::RequestOptions) } + attr_reader :request_options + + sig do + params(request_options: VitableConnect::RequestOptions::OrHash).void + end + attr_writer :request_options + + # @api private + module Converter + # @api private + sig do + params(params: T.anything).returns( + [T.anything, VitableConnect::Internal::AnyHash] + ) + end + def dump_request(params) + end + end + end + end + end +end diff --git a/rbi/vitable_connect/internal/type/union.rbi b/rbi/vitable_connect/internal/type/union.rbi new file mode 100644 index 0000000..3955de4 --- /dev/null +++ b/rbi/vitable_connect/internal/type/union.rbi @@ -0,0 +1,130 @@ +# typed: strong + +module VitableConnect + module Internal + module Type + # @api private + module Union + include VitableConnect::Internal::Type::Converter + include VitableConnect::Internal::Util::SorbetRuntimeSupport + + # @api private + # + # All of the specified variant info for this union. + sig do + returns( + T::Array[ + [ + T.nilable(Symbol), + T.proc.returns( + VitableConnect::Internal::Type::Converter::Input + ), + VitableConnect::Internal::AnyHash + ] + ] + ) + end + private def known_variants + end + + # @api private + sig do + returns( + T::Array[ + [T.nilable(Symbol), T.anything, VitableConnect::Internal::AnyHash] + ] + ) + end + protected def derefed_variants + end + + # All of the specified variants for this union. + sig { overridable.returns(T::Array[T.anything]) } + def variants + end + + # @api private + sig { params(property: Symbol).void } + private def discriminator(property) + end + + # @api private + sig do + params( + key: + T.any( + Symbol, + VitableConnect::Internal::AnyHash, + T.proc.returns(T.anything), + T.anything + ), + spec: + T.any( + VitableConnect::Internal::AnyHash, + T.proc.returns(T.anything), + T.anything + ) + ).void + end + private def variant(key, spec = nil) + end + + # @api private + sig { params(value: T.anything).returns(T.nilable(T.anything)) } + private def resolve_variant(value) + end + + sig { params(other: T.anything).returns(T::Boolean) } + def ===(other) + end + + sig { params(other: T.anything).returns(T::Boolean) } + def ==(other) + end + + sig { returns(Integer) } + def hash + end + + # @api private + # + # Tries to efficiently coerce the given value to one of the known variants. + # + # If the value cannot match any of the known variants, the coercion is considered + # non-viable and returns the original value. + sig do + override + .params( + value: T.anything, + state: VitableConnect::Internal::Type::Converter::CoerceState + ) + .returns(T.anything) + end + def coerce(value, state:) + end + + # @api private + sig do + override + .params( + value: T.anything, + state: VitableConnect::Internal::Type::Converter::DumpState + ) + .returns(T.anything) + end + def dump(value, state:) + end + + # @api private + sig { returns(T.anything) } + def to_sorbet_type + end + + # @api private + sig { params(depth: Integer).returns(String) } + def inspect(depth: 0) + end + end + end + end +end diff --git a/rbi/vitable_connect/internal/type/unknown.rbi b/rbi/vitable_connect/internal/type/unknown.rbi new file mode 100644 index 0000000..c9470e5 --- /dev/null +++ b/rbi/vitable_connect/internal/type/unknown.rbi @@ -0,0 +1,58 @@ +# typed: strong + +module VitableConnect + module Internal + module Type + # @api private + # + # When we don't know what to expect for the value. + class Unknown + extend VitableConnect::Internal::Type::Converter + extend VitableConnect::Internal::Util::SorbetRuntimeSupport + + abstract! + + sig { params(other: T.anything).returns(T::Boolean) } + def self.===(other) + end + + sig { params(other: T.anything).returns(T::Boolean) } + def self.==(other) + end + + class << self + # @api private + # + # No coercion needed for Unknown type. + sig do + override + .params( + value: T.anything, + state: VitableConnect::Internal::Type::Converter::CoerceState + ) + .returns(T.anything) + end + def coerce(value, state:) + end + + # @api private + sig do + override + .params( + value: T.anything, + state: VitableConnect::Internal::Type::Converter::DumpState + ) + .returns(T.anything) + end + def dump(value, state:) + end + + # @api private + sig { returns(T.anything) } + def to_sorbet_type + end + end + end + end + end +end diff --git a/rbi/vitable_connect/internal/util.rbi b/rbi/vitable_connect/internal/util.rbi new file mode 100644 index 0000000..7418171 --- /dev/null +++ b/rbi/vitable_connect/internal/util.rbi @@ -0,0 +1,515 @@ +# typed: strong + +module VitableConnect + module Internal + # @api private + module Util + extend VitableConnect::Internal::Util::SorbetRuntimeSupport + + # @api private + sig { returns(Float) } + def self.monotonic_secs + end + + # @api private + sig do + params(ns: T.any(Module, T::Class[T.anything])).returns( + T::Enumerable[T.any(Module, T::Class[T.anything])] + ) + end + def self.walk_namespaces(ns) + end + + class << self + # @api private + sig { returns(String) } + def arch + end + + # @api private + sig { returns(String) } + def os + end + end + + class << self + # @api private + sig { params(input: T.anything).returns(T::Boolean) } + def primitive?(input) + end + + # @api private + sig do + params(input: T.any(String, T::Boolean)).returns( + T.any(T::Boolean, T.anything) + ) + end + def coerce_boolean(input) + end + + # @api private + sig do + params(input: T.any(String, T::Boolean)).returns( + T.nilable(T::Boolean) + ) + end + def coerce_boolean!(input) + end + + # @api private + sig do + params(input: T.any(String, Integer)).returns( + T.any(Integer, T.anything) + ) + end + def coerce_integer(input) + end + + # @api private + sig do + params(input: T.any(String, Integer, Float)).returns( + T.any(Float, T.anything) + ) + end + def coerce_float(input) + end + + # @api private + sig do + params(input: T.anything).returns( + T.any(T::Hash[T.anything, T.anything], T.anything) + ) + end + def coerce_hash(input) + end + + # @api private + sig do + params(input: T.anything).returns( + T.nilable(T::Hash[T.anything, T.anything]) + ) + end + def coerce_hash!(input) + end + end + + class << self + # @api private + sig do + params(lhs: T.anything, rhs: T.anything, concat: T::Boolean).returns( + T.anything + ) + end + private def deep_merge_lr(lhs, rhs, concat: false) + end + + # @api private + # + # Recursively merge one hash with another. If the values at a given key are not + # both hashes, just take the new value. + sig do + params( + values: T::Array[T.anything], + sentinel: T.nilable(T.anything), + concat: T::Boolean + ).returns(T.anything) + end + def deep_merge( + *values, + # the value to return if no values are provided. + sentinel: nil, + # whether to merge sequences by concatenation. + concat: false + ) + end + + # @api private + sig do + params( + data: + T.any( + VitableConnect::Internal::AnyHash, + T::Array[T.anything], + T.anything + ), + pick: + T.nilable( + T.any( + Symbol, + Integer, + T::Array[T.any(Symbol, Integer)], + T.proc.params(arg0: T.anything).returns(T.anything) + ) + ), + blk: T.nilable(T.proc.returns(T.anything)) + ).returns(T.nilable(T.anything)) + end + def dig(data, pick, &blk) + end + end + + # https://www.rfc-editor.org/rfc/rfc3986.html#section-3.3 + RFC_3986_NOT_PCHARS = T.let(/[^A-Za-z0-9\-._~!$&'()*+,;=:@]+/, Regexp) + + class << self + # @api private + sig { params(uri: URI::Generic).returns(String) } + def uri_origin(uri) + end + + # @api private + sig { params(path: T.any(String, Integer)).returns(String) } + def encode_path(path) + end + + # @api private + sig { params(path: T.any(String, T::Array[String])).returns(String) } + def interpolate_path(path) + end + end + + class << self + # @api private + sig do + params(query: T.nilable(String)).returns( + T::Hash[String, T::Array[String]] + ) + end + def decode_query(query) + end + + # @api private + sig do + params( + query: + T.nilable( + T::Hash[String, T.nilable(T.any(T::Array[String], String))] + ) + ).returns(T.nilable(String)) + end + def encode_query(query) + end + end + + ParsedUri = + T.type_alias do + { + scheme: T.nilable(String), + host: T.nilable(String), + port: T.nilable(Integer), + path: T.nilable(String), + query: T::Hash[String, T::Array[String]] + } + end + + class << self + # @api private + sig do + params(url: T.any(URI::Generic, String)).returns( + VitableConnect::Internal::Util::ParsedUri + ) + end + def parse_uri(url) + end + + # @api private + sig do + params(parsed: VitableConnect::Internal::Util::ParsedUri).returns( + URI::Generic + ) + end + def unparse_uri(parsed) + end + + # @api private + sig do + params( + lhs: VitableConnect::Internal::Util::ParsedUri, + rhs: VitableConnect::Internal::Util::ParsedUri + ).returns(URI::Generic) + end + def join_parsed_uri(lhs, rhs) + end + end + + class << self + # @api private + sig do + params( + headers: + T::Hash[ + String, + T.nilable( + T.any( + String, + Integer, + T::Array[T.nilable(T.any(String, Integer))] + ) + ) + ] + ).returns(T::Hash[String, String]) + end + def normalized_headers(*headers) + end + end + + # @api private + # + # An adapter that satisfies the IO interface required by `::IO.copy_stream` + class ReadIOAdapter + # @api private + sig { returns(T.nilable(T::Boolean)) } + def close? + end + + # @api private + sig { void } + def close + end + + # @api private + sig { params(max_len: T.nilable(Integer)).returns(String) } + private def read_enum(max_len) + end + + # @api private + sig do + params( + max_len: T.nilable(Integer), + out_string: T.nilable(String) + ).returns(T.nilable(String)) + end + def read(max_len = nil, out_string = nil) + end + + # @api private + sig do + params( + src: T.any(String, Pathname, StringIO, T::Enumerable[String]), + blk: T.proc.params(arg0: String).void + ).returns(T.attached_class) + end + def self.new(src, &blk) + end + end + + class << self + sig do + params(blk: T.proc.params(y: Enumerator::Yielder).void).returns( + T::Enumerable[String] + ) + end + def writable_enum(&blk) + end + end + + JSON_CONTENT = + T.let(%r{^application/(?:[a-zA-Z0-9.-]+\+)?json(?!l)}, Regexp) + JSONL_CONTENT = + T.let(%r{^application/(:?x-(?:n|l)djson)|(:?(?:x-)?jsonl)}, Regexp) + + class << self + # @api private + sig do + params(query: VitableConnect::Internal::AnyHash).returns( + VitableConnect::Internal::AnyHash + ) + end + def encode_query_params(query) + end + + # @api private + sig do + params( + collection: VitableConnect::Internal::AnyHash, + key: String, + element: T.anything + ).void + end + private def write_query_param_element!(collection, key, element) + end + + # @api private + sig do + params( + y: Enumerator::Yielder, + val: T.anything, + closing: T::Array[T.proc.void], + content_type: T.nilable(String) + ).void + end + private def write_multipart_content( + y, + val:, + closing:, + content_type: nil + ) + end + + # @api private + sig do + params( + y: Enumerator::Yielder, + boundary: String, + key: T.any(Symbol, String), + val: T.anything, + closing: T::Array[T.proc.void] + ).void + end + private def write_multipart_chunk(y, boundary:, key:, val:, closing:) + end + + # @api private + # + # https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.1.md#special-considerations-for-multipart-content + sig do + params(body: T.anything).returns([String, T::Enumerable[String]]) + end + private def encode_multipart_streaming(body) + end + + # @api private + sig do + params(headers: T::Hash[String, String], body: T.anything).returns( + T.anything + ) + end + def encode_content(headers, body) + end + + # @api private + # + # https://www.iana.org/assignments/character-sets/character-sets.xhtml + sig { params(content_type: String, text: String).void } + def force_charset!(content_type, text:) + end + + # @api private + # + # Assumes each chunk in stream has `Encoding::BINARY`. + sig do + params( + headers: T::Hash[String, String], + stream: T::Enumerable[String], + suppress_error: T::Boolean + ).returns(T.anything) + end + def decode_content(headers, stream:, suppress_error: false) + end + end + + class << self + # @api private + # + # https://doc.rust-lang.org/std/iter/trait.FusedIterator.html + sig do + params( + enum: T::Enumerable[T.anything], + external: T::Boolean, + close: T.proc.void + ).returns(T::Enumerable[T.anything]) + end + def fused_enum(enum, external: false, &close) + end + + # @api private + sig { params(enum: T.nilable(T::Enumerable[T.anything])).void } + def close_fused!(enum) + end + + # @api private + sig do + params( + enum: T.nilable(T::Enumerable[T.anything]), + blk: T.proc.params(arg0: Enumerator::Yielder).void + ).returns(T::Enumerable[T.anything]) + end + def chain_fused(enum, &blk) + end + end + + ServerSentEvent = + T.type_alias do + { + event: T.nilable(String), + data: T.nilable(String), + id: T.nilable(String), + retry: T.nilable(Integer) + } + end + + class << self + # @api private + # + # Assumes Strings have been forced into having `Encoding::BINARY`. + # + # This decoder is responsible for reassembling lines split across multiple + # fragments. + sig do + params(enum: T::Enumerable[String]).returns(T::Enumerable[String]) + end + def decode_lines(enum) + end + + # @api private + # + # https://html.spec.whatwg.org/multipage/server-sent-events.html#parsing-an-event-stream + # + # Assumes that `lines` has been decoded with `#decode_lines`. + sig do + params(lines: T::Enumerable[String]).returns( + T::Enumerable[VitableConnect::Internal::Util::ServerSentEvent] + ) + end + def decode_sse(lines) + end + end + + # @api private + module SorbetRuntimeSupport + class MissingSorbetRuntimeError < ::RuntimeError + end + + # @api private + sig { returns(T::Hash[Symbol, T.anything]) } + private def sorbet_runtime_constants + end + + # @api private + sig { params(name: Symbol).void } + def const_missing(name) + end + + # @api private + sig { params(name: Symbol).returns(T::Boolean) } + def sorbet_constant_defined?(name) + end + + # @api private + sig { params(name: Symbol, blk: T.proc.returns(T.anything)).void } + def define_sorbet_constant!(name, &blk) + end + + # @api private + sig { returns(T.anything) } + def to_sorbet_type + end + + class << self + # @api private + sig do + params( + type: + T.any( + VitableConnect::Internal::Util::SorbetRuntimeSupport, + T.anything + ) + ).returns(T.anything) + end + def to_sorbet_type(type) + end + end + end + end + end +end diff --git a/rbi/vitable_connect/models.rbi b/rbi/vitable_connect/models.rbi new file mode 100644 index 0000000..4a1add2 --- /dev/null +++ b/rbi/vitable_connect/models.rbi @@ -0,0 +1,134 @@ +# typed: strong + +module VitableConnect + AuthIssueAccessTokenParams = + VitableConnect::Models::AuthIssueAccessTokenParams + + Employee = VitableConnect::Models::Employee + + EmployeeClass = VitableConnect::Models::EmployeeClass + + EmployeeListEnrollmentsParams = + VitableConnect::Models::EmployeeListEnrollmentsParams + + EmployeeRetrieveParams = VitableConnect::Models::EmployeeRetrieveParams + + EmployeeUpdateParams = VitableConnect::Models::EmployeeUpdateParams + + Employer = VitableConnect::Models::Employer + + EmployerCreateParams = VitableConnect::Models::EmployerCreateParams + + EmployerEnsurePayrollIntegrationEmailParams = + VitableConnect::Models::EmployerEnsurePayrollIntegrationEmailParams + + EmployerListBenefitPlanYearEnrollmentsParams = + VitableConnect::Models::EmployerListBenefitPlanYearEnrollmentsParams + + EmployerListBenefitPlanYearsParams = + VitableConnect::Models::EmployerListBenefitPlanYearsParams + + EmployerListEmployeesParams = + VitableConnect::Models::EmployerListEmployeesParams + + EmployerListHRISProvidersParams = + VitableConnect::Models::EmployerListHRISProvidersParams + + EmployerListInvoicesParams = + VitableConnect::Models::EmployerListInvoicesParams + + EmployerListParams = VitableConnect::Models::EmployerListParams + + EmployerListPayrollDeductionStatementsParams = + VitableConnect::Models::EmployerListPayrollDeductionStatementsParams + + EmployerResponse = VitableConnect::Models::EmployerResponse + + EmployerRetrieveBenefitPlanYearParams = + VitableConnect::Models::EmployerRetrieveBenefitPlanYearParams + + EmployerRetrieveHRISParams = + VitableConnect::Models::EmployerRetrieveHRISParams + + EmployerRetrieveInvoicePdfParams = + VitableConnect::Models::EmployerRetrieveInvoicePdfParams + + EmployerRetrieveParams = VitableConnect::Models::EmployerRetrieveParams + + EmployerRetrievePayrollAccessSetupParams = + VitableConnect::Models::EmployerRetrievePayrollAccessSetupParams + + EmployerSubmitCensusSyncParams = + VitableConnect::Models::EmployerSubmitCensusSyncParams + + EmployerSubmitPayrollAccessSetupParams = + VitableConnect::Models::EmployerSubmitPayrollAccessSetupParams + + EmployerUpdateParams = VitableConnect::Models::EmployerUpdateParams + + EmployerUpdateSettingsParams = + VitableConnect::Models::EmployerUpdateSettingsParams + + Enrollment = VitableConnect::Models::Enrollment + + EnrollmentReissueParams = VitableConnect::Models::EnrollmentReissueParams + + EnrollmentRetrieveParams = VitableConnect::Models::EnrollmentRetrieveParams + + EnrollmentStatus = VitableConnect::Models::EnrollmentStatus + + EnrollmentTerminateParams = VitableConnect::Models::EnrollmentTerminateParams + + Group = VitableConnect::Models::Group + + GroupCreateParams = VitableConnect::Models::GroupCreateParams + + GroupListParams = VitableConnect::Models::GroupListParams + + GroupResponse = VitableConnect::Models::GroupResponse + + GroupRetrieveParams = VitableConnect::Models::GroupRetrieveParams + + Groups = VitableConnect::Models::Groups + + GroupUpdateParams = VitableConnect::Models::GroupUpdateParams + + MemberListDependentsParams = + VitableConnect::Models::MemberListDependentsParams + + MemberListEmploymentsParams = + VitableConnect::Models::MemberListEmploymentsParams + + MemberListEnrollmentsParams = + VitableConnect::Models::MemberListEnrollmentsParams + + MemberListIDCardsParams = VitableConnect::Models::MemberListIDCardsParams + + MemberListParams = VitableConnect::Models::MemberListParams + + MemberListQualifyingLifeEventsParams = + VitableConnect::Models::MemberListQualifyingLifeEventsParams + + MemberRetrieveHouseholdParams = + VitableConnect::Models::MemberRetrieveHouseholdParams + + MemberRetrieveParams = VitableConnect::Models::MemberRetrieveParams + + OrganizationCreateParams = VitableConnect::Models::OrganizationCreateParams + + OrganizationListParams = VitableConnect::Models::OrganizationListParams + + Pagination = VitableConnect::Models::Pagination + + PlanListParams = VitableConnect::Models::PlanListParams + + WebhookEvent = VitableConnect::Models::WebhookEvent + + WebhookEventListDeliveriesParams = + VitableConnect::Models::WebhookEventListDeliveriesParams + + WebhookEventListParams = VitableConnect::Models::WebhookEventListParams + + WebhookEventRetrieveParams = + VitableConnect::Models::WebhookEventRetrieveParams +end diff --git a/rbi/vitable_connect/models/auth_issue_access_token_params.rbi b/rbi/vitable_connect/models/auth_issue_access_token_params.rbi new file mode 100644 index 0000000..04c52e9 --- /dev/null +++ b/rbi/vitable_connect/models/auth_issue_access_token_params.rbi @@ -0,0 +1,195 @@ +# typed: strong + +module VitableConnect + module Models + class AuthIssueAccessTokenParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + OrHash = + T.type_alias do + T.any( + VitableConnect::AuthIssueAccessTokenParams, + VitableConnect::Internal::AnyHash + ) + end + + # - `client_credentials` - client_credentials + sig do + returns(VitableConnect::AuthIssueAccessTokenParams::GrantType::OrSymbol) + end + attr_accessor :grant_type + + # Optional entity to bind the token to for scoped access + sig do + returns( + T.nilable(VitableConnect::AuthIssueAccessTokenParams::BoundEntity) + ) + end + attr_reader :bound_entity + + sig do + params( + bound_entity: + T.nilable( + VitableConnect::AuthIssueAccessTokenParams::BoundEntity::OrHash + ) + ).void + end + attr_writer :bound_entity + + sig do + params( + grant_type: + VitableConnect::AuthIssueAccessTokenParams::GrantType::OrSymbol, + bound_entity: + T.nilable( + VitableConnect::AuthIssueAccessTokenParams::BoundEntity::OrHash + ), + request_options: VitableConnect::RequestOptions::OrHash + ).returns(T.attached_class) + end + def self.new( + # - `client_credentials` - client_credentials + grant_type:, + # Optional entity to bind the token to for scoped access + bound_entity: nil, + request_options: {} + ) + end + + sig do + override.returns( + { + grant_type: + VitableConnect::AuthIssueAccessTokenParams::GrantType::OrSymbol, + bound_entity: + T.nilable( + VitableConnect::AuthIssueAccessTokenParams::BoundEntity + ), + request_options: VitableConnect::RequestOptions + } + ) + end + def to_hash + end + + # - `client_credentials` - client_credentials + module GrantType + extend VitableConnect::Internal::Type::Enum + + TaggedSymbol = + T.type_alias do + T.all(Symbol, VitableConnect::AuthIssueAccessTokenParams::GrantType) + end + OrSymbol = T.type_alias { T.any(Symbol, String) } + + CLIENT_CREDENTIALS = + T.let( + :client_credentials, + VitableConnect::AuthIssueAccessTokenParams::GrantType::TaggedSymbol + ) + + sig do + override.returns( + T::Array[ + VitableConnect::AuthIssueAccessTokenParams::GrantType::TaggedSymbol + ] + ) + end + def self.values + end + end + + class BoundEntity < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::AuthIssueAccessTokenParams::BoundEntity, + VitableConnect::Internal::AnyHash + ) + end + + # Prefixed entity ID to bind the token to (empr*\* for employer, empl*\* for + # employee) + sig { returns(String) } + attr_accessor :id + + # - `employer` - employer + # - `employee` - employee + sig do + returns( + VitableConnect::AuthIssueAccessTokenParams::BoundEntity::Type::OrSymbol + ) + end + attr_accessor :type + + # Optional entity to bind the token to for scoped access + sig do + params( + id: String, + type: + VitableConnect::AuthIssueAccessTokenParams::BoundEntity::Type::OrSymbol + ).returns(T.attached_class) + end + def self.new( + # Prefixed entity ID to bind the token to (empr*\* for employer, empl*\* for + # employee) + id:, + # - `employer` - employer + # - `employee` - employee + type: + ) + end + + sig do + override.returns( + { + id: String, + type: + VitableConnect::AuthIssueAccessTokenParams::BoundEntity::Type::OrSymbol + } + ) + end + def to_hash + end + + # - `employer` - employer + # - `employee` - employee + module Type + extend VitableConnect::Internal::Type::Enum + + TaggedSymbol = + T.type_alias do + T.all( + Symbol, + VitableConnect::AuthIssueAccessTokenParams::BoundEntity::Type + ) + end + OrSymbol = T.type_alias { T.any(Symbol, String) } + + EMPLOYER = + T.let( + :employer, + VitableConnect::AuthIssueAccessTokenParams::BoundEntity::Type::TaggedSymbol + ) + EMPLOYEE = + T.let( + :employee, + VitableConnect::AuthIssueAccessTokenParams::BoundEntity::Type::TaggedSymbol + ) + + sig do + override.returns( + T::Array[ + VitableConnect::AuthIssueAccessTokenParams::BoundEntity::Type::TaggedSymbol + ] + ) + end + def self.values + end + end + end + end + end +end diff --git a/rbi/vitable_connect/models/auth_issue_access_token_response.rbi b/rbi/vitable_connect/models/auth_issue_access_token_response.rbi new file mode 100644 index 0000000..95143b8 --- /dev/null +++ b/rbi/vitable_connect/models/auth_issue_access_token_response.rbi @@ -0,0 +1,174 @@ +# typed: strong + +module VitableConnect + module Models + class AuthIssueAccessTokenResponse < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::AuthIssueAccessTokenResponse, + VitableConnect::Internal::AnyHash + ) + end + + # The issued access token (vit*at*\*) + sig { returns(String) } + attr_accessor :access_token + + # Token lifetime in seconds + sig { returns(Integer) } + attr_accessor :expires_in + + # Token type, always 'Bearer' + sig { returns(String) } + attr_accessor :token_type + + # Entity the token is bound to, if any + sig do + returns( + T.nilable( + VitableConnect::Models::AuthIssueAccessTokenResponse::BoundEntity + ) + ) + end + attr_reader :bound_entity + + sig do + params( + bound_entity: + T.nilable( + VitableConnect::Models::AuthIssueAccessTokenResponse::BoundEntity::OrHash + ) + ).void + end + attr_writer :bound_entity + + sig do + params( + access_token: String, + expires_in: Integer, + token_type: String, + bound_entity: + T.nilable( + VitableConnect::Models::AuthIssueAccessTokenResponse::BoundEntity::OrHash + ) + ).returns(T.attached_class) + end + def self.new( + # The issued access token (vit*at*\*) + access_token:, + # Token lifetime in seconds + expires_in:, + # Token type, always 'Bearer' + token_type:, + # Entity the token is bound to, if any + bound_entity: nil + ) + end + + sig do + override.returns( + { + access_token: String, + expires_in: Integer, + token_type: String, + bound_entity: + T.nilable( + VitableConnect::Models::AuthIssueAccessTokenResponse::BoundEntity + ) + } + ) + end + def to_hash + end + + class BoundEntity < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::AuthIssueAccessTokenResponse::BoundEntity, + VitableConnect::Internal::AnyHash + ) + end + + # Prefixed entity ID the token is bound to (empr*\* or empl*\*) + sig { returns(String) } + attr_accessor :id + + # - `employer` - employer + # - `employee` - employee + sig do + returns( + VitableConnect::Models::AuthIssueAccessTokenResponse::BoundEntity::Type::TaggedSymbol + ) + end + attr_accessor :type + + # Entity the token is bound to, if any + sig do + params( + id: String, + type: + VitableConnect::Models::AuthIssueAccessTokenResponse::BoundEntity::Type::OrSymbol + ).returns(T.attached_class) + end + def self.new( + # Prefixed entity ID the token is bound to (empr*\* or empl*\*) + id:, + # - `employer` - employer + # - `employee` - employee + type: + ) + end + + sig do + override.returns( + { + id: String, + type: + VitableConnect::Models::AuthIssueAccessTokenResponse::BoundEntity::Type::TaggedSymbol + } + ) + end + def to_hash + end + + # - `employer` - employer + # - `employee` - employee + module Type + extend VitableConnect::Internal::Type::Enum + + TaggedSymbol = + T.type_alias do + T.all( + Symbol, + VitableConnect::Models::AuthIssueAccessTokenResponse::BoundEntity::Type + ) + end + OrSymbol = T.type_alias { T.any(Symbol, String) } + + EMPLOYER = + T.let( + :employer, + VitableConnect::Models::AuthIssueAccessTokenResponse::BoundEntity::Type::TaggedSymbol + ) + EMPLOYEE = + T.let( + :employee, + VitableConnect::Models::AuthIssueAccessTokenResponse::BoundEntity::Type::TaggedSymbol + ) + + sig do + override.returns( + T::Array[ + VitableConnect::Models::AuthIssueAccessTokenResponse::BoundEntity::Type::TaggedSymbol + ] + ) + end + def self.values + end + end + end + end + end +end diff --git a/rbi/vitable_connect/models/employee.rbi b/rbi/vitable_connect/models/employee.rbi new file mode 100644 index 0000000..924887c --- /dev/null +++ b/rbi/vitable_connect/models/employee.rbi @@ -0,0 +1,551 @@ +# typed: strong + +module VitableConnect + module Models + class Employee < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any(VitableConnect::Employee, VitableConnect::Internal::AnyHash) + end + + # Timestamp when the employee was created + sig { returns(Time) } + attr_accessor :created_at + + # Date of birth (YYYY-MM-DD) + sig { returns(Date) } + attr_accessor :date_of_birth + + # Payroll deductions from the most recent statement period. Replaced when a new + # statement is generated. + sig { returns(T::Array[VitableConnect::Employee::Deduction]) } + attr_accessor :deductions + + # Email address + sig { returns(String) } + attr_accessor :email + + # - `Full Time` - Full Time + # - `Part Time` - Part Time + # - `Temporary` - Temporary + # - `Intern` - Intern + # - `Seasonal` - Seasonal + # - `Individual Contractor` - Individual Contractor + sig { returns(VitableConnect::EmployeeClass::TaggedSymbol) } + attr_accessor :employee_class + + # Employee's legal first name + sig { returns(String) } + attr_accessor :first_name + + # Employee's legal last name + sig { returns(String) } + attr_accessor :last_name + + # Timestamp when the employee was last updated + sig { returns(Time) } + attr_accessor :updated_at + + # Employee's residential address + sig { returns(T.nilable(VitableConnect::Employee::Address)) } + attr_reader :address + + sig do + params( + address: T.nilable(VitableConnect::Employee::Address::OrHash) + ).void + end + attr_writer :address + + # Name of the employer this employment is with + sig { returns(T.nilable(String)) } + attr_accessor :employer_name + + # Gender identity, if provided + sig { returns(T.nilable(String)) } + attr_accessor :gender + + # Partner-assigned reference ID for the employee + sig { returns(T.nilable(String)) } + attr_accessor :reference_id + + # Name suffix (e.g., Jr., Sr., III) + sig { returns(T.nilable(String)) } + attr_accessor :suffix + + # Employee's termination date, if terminated + sig { returns(T.nilable(Date)) } + attr_accessor :termination_date + + # Unique employee identifier with 'empl\_' prefix + sig { returns(String) } + attr_accessor :id + + # Date the employee's current classification took effect + sig { returns(Date) } + attr_accessor :classification_effective_date + + # - `Salary` - Salary + # - `Hourly` - Hourly + sig do + returns( + T.nilable(VitableConnect::Employee::CompensationType::TaggedSymbol) + ) + end + attr_accessor :compensation_type + + # Date the employee's current compensation type took effect + sig { returns(Date) } + attr_accessor :compensation_type_effective_date + + # Unique identifier of the employer this employment is with (empr\_\*) + sig { returns(String) } + attr_accessor :employer_id + + # Unique member identifier with 'mbr\_' prefix + sig { returns(String) } + attr_accessor :member_id + + # Phone number (10-digit US domestic string) + sig { returns(T.nilable(String)) } + attr_accessor :phone + + # Employee's start date with the employer + sig { returns(Date) } + attr_accessor :start_date + + # Employee status (active or terminated) + sig { returns(VitableConnect::Employee::Status::TaggedSymbol) } + attr_accessor :status + + sig do + params( + id: String, + classification_effective_date: Date, + compensation_type: + T.nilable(VitableConnect::Employee::CompensationType::OrSymbol), + compensation_type_effective_date: Date, + created_at: Time, + date_of_birth: Date, + deductions: T::Array[VitableConnect::Employee::Deduction::OrHash], + email: String, + employee_class: VitableConnect::EmployeeClass::OrSymbol, + employer_id: String, + first_name: String, + last_name: String, + member_id: String, + phone: T.nilable(String), + start_date: Date, + status: VitableConnect::Employee::Status::OrSymbol, + updated_at: Time, + address: T.nilable(VitableConnect::Employee::Address::OrHash), + employer_name: T.nilable(String), + gender: T.nilable(String), + reference_id: T.nilable(String), + suffix: T.nilable(String), + termination_date: T.nilable(Date) + ).returns(T.attached_class) + end + def self.new( + # Unique employee identifier with 'empl\_' prefix + id:, + # Date the employee's current classification took effect + classification_effective_date:, + # - `Salary` - Salary + # - `Hourly` - Hourly + compensation_type:, + # Date the employee's current compensation type took effect + compensation_type_effective_date:, + # Timestamp when the employee was created + created_at:, + # Date of birth (YYYY-MM-DD) + date_of_birth:, + # Payroll deductions from the most recent statement period. Replaced when a new + # statement is generated. + deductions:, + # Email address + email:, + # - `Full Time` - Full Time + # - `Part Time` - Part Time + # - `Temporary` - Temporary + # - `Intern` - Intern + # - `Seasonal` - Seasonal + # - `Individual Contractor` - Individual Contractor + employee_class:, + # Unique identifier of the employer this employment is with (empr\_\*) + employer_id:, + # Employee's legal first name + first_name:, + # Employee's legal last name + last_name:, + # Unique member identifier with 'mbr\_' prefix + member_id:, + # Phone number (10-digit US domestic string) + phone:, + # Employee's start date with the employer + start_date:, + # Employee status (active or terminated) + status:, + # Timestamp when the employee was last updated + updated_at:, + # Employee's residential address + address: nil, + # Name of the employer this employment is with + employer_name: nil, + # Gender identity, if provided + gender: nil, + # Partner-assigned reference ID for the employee + reference_id: nil, + # Name suffix (e.g., Jr., Sr., III) + suffix: nil, + # Employee's termination date, if terminated + termination_date: nil + ) + end + + sig do + override.returns( + { + id: String, + classification_effective_date: Date, + compensation_type: + T.nilable( + VitableConnect::Employee::CompensationType::TaggedSymbol + ), + compensation_type_effective_date: Date, + created_at: Time, + date_of_birth: Date, + deductions: T::Array[VitableConnect::Employee::Deduction], + email: String, + employee_class: VitableConnect::EmployeeClass::TaggedSymbol, + employer_id: String, + first_name: String, + last_name: String, + member_id: String, + phone: T.nilable(String), + start_date: Date, + status: VitableConnect::Employee::Status::TaggedSymbol, + updated_at: Time, + address: T.nilable(VitableConnect::Employee::Address), + employer_name: T.nilable(String), + gender: T.nilable(String), + reference_id: T.nilable(String), + suffix: T.nilable(String), + termination_date: T.nilable(Date) + } + ) + end + def to_hash + end + + # - `Salary` - Salary + # - `Hourly` - Hourly + module CompensationType + extend VitableConnect::Internal::Type::Enum + + TaggedSymbol = + T.type_alias do + T.all(Symbol, VitableConnect::Employee::CompensationType) + end + OrSymbol = T.type_alias { T.any(Symbol, String) } + + SALARY = + T.let( + :Salary, + VitableConnect::Employee::CompensationType::TaggedSymbol + ) + HOURLY = + T.let( + :Hourly, + VitableConnect::Employee::CompensationType::TaggedSymbol + ) + + sig do + override.returns( + T::Array[VitableConnect::Employee::CompensationType::TaggedSymbol] + ) + end + def self.values + end + end + + class Deduction < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Employee::Deduction, + VitableConnect::Internal::AnyHash + ) + end + + # Name of the benefit plan + sig { returns(String) } + attr_accessor :benefit_name + + # Employee deduction amount in cents + sig { returns(Integer) } + attr_accessor :deduction_amount_in_cents + + # Deduction category (reserved for future use) + sig { returns(T.nilable(String)) } + attr_accessor :deduction_category + + # - `weekly` - Weekly + # - `bi_weekly` - Bi Weekly + # - `semi_monthly` - Semi Monthly + # - `monthly` - Monthly + sig do + returns(VitableConnect::Employee::Deduction::Frequency::TaggedSymbol) + end + attr_accessor :frequency + + # Period end date (YYYY-MM-DD) + sig { returns(Date) } + attr_accessor :period_end_date + + # Period start date (YYYY-MM-DD) + sig { returns(Date) } + attr_accessor :period_start_date + + # - `Unknown` - Unknown + # - `Pre-tax` - Pre Tax + # - `Post-tax` - Post Tax + sig do + returns( + VitableConnect::Employee::Deduction::TaxClassification::TaggedSymbol + ) + end + attr_accessor :tax_classification + + sig do + params( + benefit_name: String, + deduction_amount_in_cents: Integer, + deduction_category: T.nilable(String), + frequency: VitableConnect::Employee::Deduction::Frequency::OrSymbol, + period_end_date: Date, + period_start_date: Date, + tax_classification: + VitableConnect::Employee::Deduction::TaxClassification::OrSymbol + ).returns(T.attached_class) + end + def self.new( + # Name of the benefit plan + benefit_name:, + # Employee deduction amount in cents + deduction_amount_in_cents:, + # Deduction category (reserved for future use) + deduction_category:, + # - `weekly` - Weekly + # - `bi_weekly` - Bi Weekly + # - `semi_monthly` - Semi Monthly + # - `monthly` - Monthly + frequency:, + # Period end date (YYYY-MM-DD) + period_end_date:, + # Period start date (YYYY-MM-DD) + period_start_date:, + # - `Unknown` - Unknown + # - `Pre-tax` - Pre Tax + # - `Post-tax` - Post Tax + tax_classification: + ) + end + + sig do + override.returns( + { + benefit_name: String, + deduction_amount_in_cents: Integer, + deduction_category: T.nilable(String), + frequency: + VitableConnect::Employee::Deduction::Frequency::TaggedSymbol, + period_end_date: Date, + period_start_date: Date, + tax_classification: + VitableConnect::Employee::Deduction::TaxClassification::TaggedSymbol + } + ) + end + def to_hash + end + + # - `weekly` - Weekly + # - `bi_weekly` - Bi Weekly + # - `semi_monthly` - Semi Monthly + # - `monthly` - Monthly + module Frequency + extend VitableConnect::Internal::Type::Enum + + TaggedSymbol = + T.type_alias do + T.all(Symbol, VitableConnect::Employee::Deduction::Frequency) + end + OrSymbol = T.type_alias { T.any(Symbol, String) } + + WEEKLY = + T.let( + :weekly, + VitableConnect::Employee::Deduction::Frequency::TaggedSymbol + ) + BI_WEEKLY = + T.let( + :bi_weekly, + VitableConnect::Employee::Deduction::Frequency::TaggedSymbol + ) + SEMI_MONTHLY = + T.let( + :semi_monthly, + VitableConnect::Employee::Deduction::Frequency::TaggedSymbol + ) + MONTHLY = + T.let( + :monthly, + VitableConnect::Employee::Deduction::Frequency::TaggedSymbol + ) + + sig do + override.returns( + T::Array[ + VitableConnect::Employee::Deduction::Frequency::TaggedSymbol + ] + ) + end + def self.values + end + end + + # - `Unknown` - Unknown + # - `Pre-tax` - Pre Tax + # - `Post-tax` - Post Tax + module TaxClassification + extend VitableConnect::Internal::Type::Enum + + TaggedSymbol = + T.type_alias do + T.all( + Symbol, + VitableConnect::Employee::Deduction::TaxClassification + ) + end + OrSymbol = T.type_alias { T.any(Symbol, String) } + + UNKNOWN = + T.let( + :Unknown, + VitableConnect::Employee::Deduction::TaxClassification::TaggedSymbol + ) + PRE_TAX = + T.let( + :"Pre-tax", + VitableConnect::Employee::Deduction::TaxClassification::TaggedSymbol + ) + POST_TAX = + T.let( + :"Post-tax", + VitableConnect::Employee::Deduction::TaxClassification::TaggedSymbol + ) + + sig do + override.returns( + T::Array[ + VitableConnect::Employee::Deduction::TaxClassification::TaggedSymbol + ] + ) + end + def self.values + end + end + end + + # Employee status (active or terminated) + module Status + extend VitableConnect::Internal::Type::Enum + + TaggedSymbol = + T.type_alias { T.all(Symbol, VitableConnect::Employee::Status) } + OrSymbol = T.type_alias { T.any(Symbol, String) } + + ACTIVE = T.let(:active, VitableConnect::Employee::Status::TaggedSymbol) + TERMINATED = + T.let(:terminated, VitableConnect::Employee::Status::TaggedSymbol) + + sig do + override.returns( + T::Array[VitableConnect::Employee::Status::TaggedSymbol] + ) + end + def self.values + end + end + + class Address < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Employee::Address, + VitableConnect::Internal::AnyHash + ) + end + + # Primary street address + sig { returns(String) } + attr_accessor :address_line_1 + + # City name + sig { returns(String) } + attr_accessor :city + + # Two-letter state code (e.g., CA, NY) + sig { returns(String) } + attr_accessor :state + + # ZIP code (5 or 9 digit) + sig { returns(String) } + attr_accessor :zipcode + + # Secondary street address (apt, suite, etc.) + sig { returns(T.nilable(String)) } + attr_accessor :address_line_2 + + # Employee's residential address + sig do + params( + address_line_1: String, + city: String, + state: String, + zipcode: String, + address_line_2: T.nilable(String) + ).returns(T.attached_class) + end + def self.new( + # Primary street address + address_line_1:, + # City name + city:, + # Two-letter state code (e.g., CA, NY) + state:, + # ZIP code (5 or 9 digit) + zipcode:, + # Secondary street address (apt, suite, etc.) + address_line_2: nil + ) + end + + sig do + override.returns( + { + address_line_1: String, + city: String, + state: String, + zipcode: String, + address_line_2: T.nilable(String) + } + ) + end + def to_hash + end + end + end + end +end diff --git a/rbi/vitable_connect/models/employee_class.rbi b/rbi/vitable_connect/models/employee_class.rbi new file mode 100644 index 0000000..3ce10ad --- /dev/null +++ b/rbi/vitable_connect/models/employee_class.rbi @@ -0,0 +1,38 @@ +# typed: strong + +module VitableConnect + module Models + # - `Full Time` - Full Time + # - `Part Time` - Part Time + # - `Temporary` - Temporary + # - `Intern` - Intern + # - `Seasonal` - Seasonal + # - `Individual Contractor` - Individual Contractor + module EmployeeClass + extend VitableConnect::Internal::Type::Enum + + TaggedSymbol = + T.type_alias { T.all(Symbol, VitableConnect::EmployeeClass) } + OrSymbol = T.type_alias { T.any(Symbol, String) } + + FULL_TIME = + T.let(:"Full Time", VitableConnect::EmployeeClass::TaggedSymbol) + PART_TIME = + T.let(:"Part Time", VitableConnect::EmployeeClass::TaggedSymbol) + TEMPORARY = T.let(:Temporary, VitableConnect::EmployeeClass::TaggedSymbol) + INTERN = T.let(:Intern, VitableConnect::EmployeeClass::TaggedSymbol) + SEASONAL = T.let(:Seasonal, VitableConnect::EmployeeClass::TaggedSymbol) + INDIVIDUAL_CONTRACTOR = + T.let( + :"Individual Contractor", + VitableConnect::EmployeeClass::TaggedSymbol + ) + + sig do + override.returns(T::Array[VitableConnect::EmployeeClass::TaggedSymbol]) + end + def self.values + end + end + end +end diff --git a/rbi/vitable_connect/models/employee_list_enrollments_params.rbi b/rbi/vitable_connect/models/employee_list_enrollments_params.rbi new file mode 100644 index 0000000..bc28f32 --- /dev/null +++ b/rbi/vitable_connect/models/employee_list_enrollments_params.rbi @@ -0,0 +1,68 @@ +# typed: strong + +module VitableConnect + module Models + class EmployeeListEnrollmentsParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + OrHash = + T.type_alias do + T.any( + VitableConnect::EmployeeListEnrollmentsParams, + VitableConnect::Internal::AnyHash + ) + end + + # Unique employee identifier (empl\_\*) + sig { returns(String) } + attr_accessor :employee_id + + # Items per page (default: 20, max: 100) + sig { returns(T.nilable(Integer)) } + attr_reader :limit + + sig { params(limit: Integer).void } + attr_writer :limit + + # Page number (default: 1) + sig { returns(T.nilable(Integer)) } + attr_reader :page + + sig { params(page: Integer).void } + attr_writer :page + + sig do + params( + employee_id: String, + limit: Integer, + page: Integer, + request_options: VitableConnect::RequestOptions::OrHash + ).returns(T.attached_class) + end + def self.new( + # Unique employee identifier (empl\_\*) + employee_id:, + # Items per page (default: 20, max: 100) + limit: nil, + # Page number (default: 1) + page: nil, + request_options: {} + ) + end + + sig do + override.returns( + { + employee_id: String, + limit: Integer, + page: Integer, + request_options: VitableConnect::RequestOptions + } + ) + end + def to_hash + end + end + end +end diff --git a/rbi/vitable_connect/models/employee_retrieve_params.rbi b/rbi/vitable_connect/models/employee_retrieve_params.rbi new file mode 100644 index 0000000..3469af0 --- /dev/null +++ b/rbi/vitable_connect/models/employee_retrieve_params.rbi @@ -0,0 +1,46 @@ +# typed: strong + +module VitableConnect + module Models + class EmployeeRetrieveParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + OrHash = + T.type_alias do + T.any( + VitableConnect::EmployeeRetrieveParams, + VitableConnect::Internal::AnyHash + ) + end + + # Unique employee identifier (empl\_\*) + sig { returns(String) } + attr_accessor :employee_id + + sig do + params( + employee_id: String, + request_options: VitableConnect::RequestOptions::OrHash + ).returns(T.attached_class) + end + def self.new( + # Unique employee identifier (empl\_\*) + employee_id:, + request_options: {} + ) + end + + sig do + override.returns( + { + employee_id: String, + request_options: VitableConnect::RequestOptions + } + ) + end + def to_hash + end + end + end +end diff --git a/rbi/vitable_connect/models/employee_retrieve_response.rbi b/rbi/vitable_connect/models/employee_retrieve_response.rbi new file mode 100644 index 0000000..bdf9497 --- /dev/null +++ b/rbi/vitable_connect/models/employee_retrieve_response.rbi @@ -0,0 +1,32 @@ +# typed: strong + +module VitableConnect + module Models + class EmployeeRetrieveResponse < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::EmployeeRetrieveResponse, + VitableConnect::Internal::AnyHash + ) + end + + sig { returns(VitableConnect::Employee) } + attr_reader :data + + sig { params(data: VitableConnect::Employee::OrHash).void } + attr_writer :data + + # Response containing a single employee resource. + sig do + params(data: VitableConnect::Employee::OrHash).returns(T.attached_class) + end + def self.new(data:) + end + + sig { override.returns({ data: VitableConnect::Employee }) } + def to_hash + end + end + end +end diff --git a/rbi/vitable_connect/models/employee_update_params.rbi b/rbi/vitable_connect/models/employee_update_params.rbi new file mode 100644 index 0000000..895b092 --- /dev/null +++ b/rbi/vitable_connect/models/employee_update_params.rbi @@ -0,0 +1,323 @@ +# typed: strong + +module VitableConnect + module Models + class EmployeeUpdateParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + OrHash = + T.type_alias do + T.any( + VitableConnect::EmployeeUpdateParams, + VitableConnect::Internal::AnyHash + ) + end + + # Unique employee identifier (empl\_\*) + sig { returns(String) } + attr_accessor :employee_id + + # Past or present date applied to each tracked employment field included in this + # request + sig { returns(Date) } + attr_accessor :effective_date + + # Employee's residential address + sig { returns(T.nilable(VitableConnect::EmployeeUpdateParams::Address)) } + attr_reader :address + + sig do + params( + address: + T.nilable(VitableConnect::EmployeeUpdateParams::Address::OrHash) + ).void + end + attr_writer :address + + # - `Salary` - Salary + # - `Hourly` - Hourly + sig do + returns( + T.nilable( + VitableConnect::EmployeeUpdateParams::CompensationType::OrSymbol + ) + ) + end + attr_accessor :compensation_type + + # Email address + sig { returns(T.nilable(String)) } + attr_accessor :email + + # - `Full Time` - Full Time + # - `Part Time` - Part Time + # - `Temporary` - Temporary + # - `Intern` - Intern + # - `Seasonal` - Seasonal + # - `Individual Contractor` - Individual Contractor + sig { returns(T.nilable(VitableConnect::EmployeeClass::OrSymbol)) } + attr_accessor :employee_class + + # - `Male` - Male + # - `Female` - Female + # - `Transgender` - Transgender + # - `Non-binary` - Non Binary + # - `Prefer not to respond` - Prefer Not To Respond + sig do + returns( + T.nilable(VitableConnect::EmployeeUpdateParams::Gender::OrSymbol) + ) + end + attr_accessor :gender + + # Phone number + sig { returns(T.nilable(String)) } + attr_accessor :phone + + # Employment start date + sig { returns(T.nilable(Date)) } + attr_accessor :start_date + + sig do + params( + employee_id: String, + effective_date: Date, + address: + T.nilable(VitableConnect::EmployeeUpdateParams::Address::OrHash), + compensation_type: + T.nilable( + VitableConnect::EmployeeUpdateParams::CompensationType::OrSymbol + ), + email: T.nilable(String), + employee_class: T.nilable(VitableConnect::EmployeeClass::OrSymbol), + gender: + T.nilable(VitableConnect::EmployeeUpdateParams::Gender::OrSymbol), + phone: T.nilable(String), + start_date: T.nilable(Date), + request_options: VitableConnect::RequestOptions::OrHash + ).returns(T.attached_class) + end + def self.new( + # Unique employee identifier (empl\_\*) + employee_id:, + # Past or present date applied to each tracked employment field included in this + # request + effective_date:, + # Employee's residential address + address: nil, + # - `Salary` - Salary + # - `Hourly` - Hourly + compensation_type: nil, + # Email address + email: nil, + # - `Full Time` - Full Time + # - `Part Time` - Part Time + # - `Temporary` - Temporary + # - `Intern` - Intern + # - `Seasonal` - Seasonal + # - `Individual Contractor` - Individual Contractor + employee_class: nil, + # - `Male` - Male + # - `Female` - Female + # - `Transgender` - Transgender + # - `Non-binary` - Non Binary + # - `Prefer not to respond` - Prefer Not To Respond + gender: nil, + # Phone number + phone: nil, + # Employment start date + start_date: nil, + request_options: {} + ) + end + + sig do + override.returns( + { + employee_id: String, + effective_date: Date, + address: T.nilable(VitableConnect::EmployeeUpdateParams::Address), + compensation_type: + T.nilable( + VitableConnect::EmployeeUpdateParams::CompensationType::OrSymbol + ), + email: T.nilable(String), + employee_class: T.nilable(VitableConnect::EmployeeClass::OrSymbol), + gender: + T.nilable(VitableConnect::EmployeeUpdateParams::Gender::OrSymbol), + phone: T.nilable(String), + start_date: T.nilable(Date), + request_options: VitableConnect::RequestOptions + } + ) + end + def to_hash + end + + class Address < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::EmployeeUpdateParams::Address, + VitableConnect::Internal::AnyHash + ) + end + + # City name + sig { returns(String) } + attr_accessor :city + + # Two-letter state code + sig { returns(String) } + attr_accessor :state + + # Primary street address + sig { returns(String) } + attr_accessor :street_1 + + # ZIP code + sig { returns(String) } + attr_accessor :zip_code + + # Country code + sig { returns(T.nilable(String)) } + attr_reader :country + + sig { params(country: String).void } + attr_writer :country + + # Secondary street address + sig { returns(T.nilable(String)) } + attr_accessor :street_2 + + # Employee's residential address + sig do + params( + city: String, + state: String, + street_1: String, + zip_code: String, + country: String, + street_2: T.nilable(String) + ).returns(T.attached_class) + end + def self.new( + # City name + city:, + # Two-letter state code + state:, + # Primary street address + street_1:, + # ZIP code + zip_code:, + # Country code + country: nil, + # Secondary street address + street_2: nil + ) + end + + sig do + override.returns( + { + city: String, + state: String, + street_1: String, + zip_code: String, + country: String, + street_2: T.nilable(String) + } + ) + end + def to_hash + end + end + + # - `Salary` - Salary + # - `Hourly` - Hourly + module CompensationType + extend VitableConnect::Internal::Type::Enum + + TaggedSymbol = + T.type_alias do + T.all( + Symbol, + VitableConnect::EmployeeUpdateParams::CompensationType + ) + end + OrSymbol = T.type_alias { T.any(Symbol, String) } + + SALARY = + T.let( + :Salary, + VitableConnect::EmployeeUpdateParams::CompensationType::TaggedSymbol + ) + HOURLY = + T.let( + :Hourly, + VitableConnect::EmployeeUpdateParams::CompensationType::TaggedSymbol + ) + + sig do + override.returns( + T::Array[ + VitableConnect::EmployeeUpdateParams::CompensationType::TaggedSymbol + ] + ) + end + def self.values + end + end + + # - `Male` - Male + # - `Female` - Female + # - `Transgender` - Transgender + # - `Non-binary` - Non Binary + # - `Prefer not to respond` - Prefer Not To Respond + module Gender + extend VitableConnect::Internal::Type::Enum + + TaggedSymbol = + T.type_alias do + T.all(Symbol, VitableConnect::EmployeeUpdateParams::Gender) + end + OrSymbol = T.type_alias { T.any(Symbol, String) } + + MALE = + T.let( + :Male, + VitableConnect::EmployeeUpdateParams::Gender::TaggedSymbol + ) + FEMALE = + T.let( + :Female, + VitableConnect::EmployeeUpdateParams::Gender::TaggedSymbol + ) + TRANSGENDER = + T.let( + :Transgender, + VitableConnect::EmployeeUpdateParams::Gender::TaggedSymbol + ) + NON_BINARY = + T.let( + :"Non-binary", + VitableConnect::EmployeeUpdateParams::Gender::TaggedSymbol + ) + PREFER_NOT_TO_RESPOND = + T.let( + :"Prefer not to respond", + VitableConnect::EmployeeUpdateParams::Gender::TaggedSymbol + ) + + sig do + override.returns( + T::Array[VitableConnect::EmployeeUpdateParams::Gender::TaggedSymbol] + ) + end + def self.values + end + end + end + end +end diff --git a/rbi/vitable_connect/models/employee_update_response.rbi b/rbi/vitable_connect/models/employee_update_response.rbi new file mode 100644 index 0000000..b0476ac --- /dev/null +++ b/rbi/vitable_connect/models/employee_update_response.rbi @@ -0,0 +1,32 @@ +# typed: strong + +module VitableConnect + module Models + class EmployeeUpdateResponse < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::EmployeeUpdateResponse, + VitableConnect::Internal::AnyHash + ) + end + + sig { returns(VitableConnect::Employee) } + attr_reader :data + + sig { params(data: VitableConnect::Employee::OrHash).void } + attr_writer :data + + # Response containing a single employee resource. + sig do + params(data: VitableConnect::Employee::OrHash).returns(T.attached_class) + end + def self.new(data:) + end + + sig { override.returns({ data: VitableConnect::Employee }) } + def to_hash + end + end + end +end diff --git a/rbi/vitable_connect/models/employer.rbi b/rbi/vitable_connect/models/employer.rbi new file mode 100644 index 0000000..ceb0216 --- /dev/null +++ b/rbi/vitable_connect/models/employer.rbi @@ -0,0 +1,255 @@ +# typed: strong + +module VitableConnect + module Models + class Employer < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any(VitableConnect::Employer, VitableConnect::Internal::AnyHash) + end + + # Whether the employer is currently active in the system + sig { returns(T::Boolean) } + attr_accessor :active + + # Nested address within EmployerSerializer. + sig { returns(VitableConnect::Employer::Address) } + attr_reader :address + + sig { params(address: VitableConnect::Employer::Address::OrHash).void } + attr_writer :address + + # Timestamp when the employer was created + sig { returns(Time) } + attr_accessor :created_at + + # Legal business name for compliance and tax purposes + sig { returns(String) } + attr_accessor :legal_name + + # Display name of the employer + sig { returns(String) } + attr_accessor :name + + # Timestamp when the employer was last updated + sig { returns(Time) } + attr_accessor :updated_at + + # Email address for billing and communications + sig { returns(T.nilable(String)) } + attr_accessor :email + + # Employer phone number (E.164 format recommended) + sig { returns(T.nilable(String)) } + attr_accessor :phone_number + + # Partner-assigned reference ID for the employer + sig { returns(T.nilable(String)) } + attr_accessor :reference_id + + # Unique employer identifier with 'empr\_' prefix + sig { returns(String) } + attr_accessor :id + + # Primary company-admin contact (email + phone; company admins have no person + # name). + sig { returns(T.nilable(VitableConnect::Employer::Contact)) } + attr_reader :contact + + sig do + params( + contact: T.nilable(VitableConnect::Employer::Contact::OrHash) + ).void + end + attr_writer :contact + + # Employer Identification Number (format: XX-XXXXXXX) + sig { returns(T.nilable(String)) } + attr_accessor :ein + + # ID of the parent organization (org\_\*) + sig { returns(T.nilable(String)) } + attr_accessor :organization_id + + # Serializer for Employer entity in public API responses. + sig do + params( + id: String, + active: T::Boolean, + address: VitableConnect::Employer::Address::OrHash, + contact: T.nilable(VitableConnect::Employer::Contact::OrHash), + created_at: Time, + ein: T.nilable(String), + legal_name: String, + name: String, + organization_id: T.nilable(String), + updated_at: Time, + email: T.nilable(String), + phone_number: T.nilable(String), + reference_id: T.nilable(String) + ).returns(T.attached_class) + end + def self.new( + # Unique employer identifier with 'empr\_' prefix + id:, + # Whether the employer is currently active in the system + active:, + # Nested address within EmployerSerializer. + address:, + # Primary company-admin contact (email + phone; company admins have no person + # name). + contact:, + # Timestamp when the employer was created + created_at:, + # Employer Identification Number (format: XX-XXXXXXX) + ein:, + # Legal business name for compliance and tax purposes + legal_name:, + # Display name of the employer + name:, + # ID of the parent organization (org\_\*) + organization_id:, + # Timestamp when the employer was last updated + updated_at:, + # Email address for billing and communications + email: nil, + # Employer phone number (E.164 format recommended) + phone_number: nil, + # Partner-assigned reference ID for the employer + reference_id: nil + ) + end + + sig do + override.returns( + { + id: String, + active: T::Boolean, + address: VitableConnect::Employer::Address, + contact: T.nilable(VitableConnect::Employer::Contact), + created_at: Time, + ein: T.nilable(String), + legal_name: String, + name: String, + organization_id: T.nilable(String), + updated_at: Time, + email: T.nilable(String), + phone_number: T.nilable(String), + reference_id: T.nilable(String) + } + ) + end + def to_hash + end + + class Address < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Employer::Address, + VitableConnect::Internal::AnyHash + ) + end + + # Primary street address + sig { returns(String) } + attr_accessor :address_line_1 + + # City name + sig { returns(String) } + attr_accessor :city + + # Two-letter state code (e.g., CA, NY) + sig { returns(String) } + attr_accessor :state + + # ZIP code (5 or 9 digit) + sig { returns(String) } + attr_accessor :zipcode + + # Secondary street address (apt, suite, etc.) + sig { returns(T.nilable(String)) } + attr_accessor :address_line_2 + + # Nested address within EmployerSerializer. + sig do + params( + address_line_1: String, + city: String, + state: String, + zipcode: String, + address_line_2: T.nilable(String) + ).returns(T.attached_class) + end + def self.new( + # Primary street address + address_line_1:, + # City name + city:, + # Two-letter state code (e.g., CA, NY) + state:, + # ZIP code (5 or 9 digit) + zipcode:, + # Secondary street address (apt, suite, etc.) + address_line_2: nil + ) + end + + sig do + override.returns( + { + address_line_1: String, + city: String, + state: String, + zipcode: String, + address_line_2: T.nilable(String) + } + ) + end + def to_hash + end + end + + class Contact < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Employer::Contact, + VitableConnect::Internal::AnyHash + ) + end + + # Primary contact email + sig { returns(T.nilable(String)) } + attr_accessor :email + + # Primary contact phone, or null + sig { returns(T.nilable(String)) } + attr_accessor :phone + + # Primary company-admin contact (email + phone; company admins have no person + # name). + sig do + params(email: T.nilable(String), phone: T.nilable(String)).returns( + T.attached_class + ) + end + def self.new( + # Primary contact email + email:, + # Primary contact phone, or null + phone: + ) + end + + sig do + override.returns( + { email: T.nilable(String), phone: T.nilable(String) } + ) + end + def to_hash + end + end + end + end +end diff --git a/rbi/vitable_connect/models/employer_create_params.rbi b/rbi/vitable_connect/models/employer_create_params.rbi new file mode 100644 index 0000000..512de3a --- /dev/null +++ b/rbi/vitable_connect/models/employer_create_params.rbi @@ -0,0 +1,169 @@ +# typed: strong + +module VitableConnect + module Models + class EmployerCreateParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + OrHash = + T.type_alias do + T.any( + VitableConnect::EmployerCreateParams, + VitableConnect::Internal::AnyHash + ) + end + + # Employer address + sig { returns(VitableConnect::EmployerCreateParams::Address) } + attr_reader :address + + sig do + params( + address: VitableConnect::EmployerCreateParams::Address::OrHash + ).void + end + attr_writer :address + + # Employer Identification Number (format: XX-XXXXXXX) + sig { returns(String) } + attr_accessor :ein + + # Email address for billing and communications + sig { returns(String) } + attr_accessor :email + + # Legal business name + sig { returns(String) } + attr_accessor :legal_name + + # Employer display name + sig { returns(String) } + attr_accessor :name + + # Employer phone number (10-digit US format, e.g. 5551234567) + sig { returns(T.nilable(String)) } + attr_accessor :phone_number + + # External reference ID for this employer + sig { returns(T.nilable(String)) } + attr_accessor :reference_id + + sig do + params( + address: VitableConnect::EmployerCreateParams::Address::OrHash, + ein: String, + email: String, + legal_name: String, + name: String, + phone_number: T.nilable(String), + reference_id: T.nilable(String), + request_options: VitableConnect::RequestOptions::OrHash + ).returns(T.attached_class) + end + def self.new( + # Employer address + address:, + # Employer Identification Number (format: XX-XXXXXXX) + ein:, + # Email address for billing and communications + email:, + # Legal business name + legal_name:, + # Employer display name + name:, + # Employer phone number (10-digit US format, e.g. 5551234567) + phone_number: nil, + # External reference ID for this employer + reference_id: nil, + request_options: {} + ) + end + + sig do + override.returns( + { + address: VitableConnect::EmployerCreateParams::Address, + ein: String, + email: String, + legal_name: String, + name: String, + phone_number: T.nilable(String), + reference_id: T.nilable(String), + request_options: VitableConnect::RequestOptions + } + ) + end + def to_hash + end + + class Address < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::EmployerCreateParams::Address, + VitableConnect::Internal::AnyHash + ) + end + + # Primary street address + sig { returns(String) } + attr_accessor :address_line_1 + + # City name + sig { returns(String) } + attr_accessor :city + + # Two-letter state code + sig { returns(String) } + attr_accessor :state + + # ZIP code + sig { returns(String) } + attr_accessor :zipcode + + # Secondary street address + sig { returns(T.nilable(String)) } + attr_accessor :address_line_2 + + # Employer address + sig do + params( + address_line_1: String, + city: String, + state: String, + zipcode: String, + address_line_2: T.nilable(String) + ).returns(T.attached_class) + end + def self.new( + # Primary street address + address_line_1:, + # City name + city:, + # Two-letter state code + state:, + # ZIP code + zipcode:, + # Secondary street address + address_line_2: nil + ) + end + + sig do + override.returns( + { + address_line_1: String, + city: String, + state: String, + zipcode: String, + address_line_2: T.nilable(String) + } + ) + end + def to_hash + end + end + end + end +end diff --git a/rbi/vitable_connect/models/employer_ensure_payroll_integration_email_params.rbi b/rbi/vitable_connect/models/employer_ensure_payroll_integration_email_params.rbi new file mode 100644 index 0000000..6199024 --- /dev/null +++ b/rbi/vitable_connect/models/employer_ensure_payroll_integration_email_params.rbi @@ -0,0 +1,46 @@ +# typed: strong + +module VitableConnect + module Models + class EmployerEnsurePayrollIntegrationEmailParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + OrHash = + T.type_alias do + T.any( + VitableConnect::EmployerEnsurePayrollIntegrationEmailParams, + VitableConnect::Internal::AnyHash + ) + end + + # Unique employer identifier (empr\_\*) + sig { returns(String) } + attr_accessor :employer_id + + sig do + params( + employer_id: String, + request_options: VitableConnect::RequestOptions::OrHash + ).returns(T.attached_class) + end + def self.new( + # Unique employer identifier (empr\_\*) + employer_id:, + request_options: {} + ) + end + + sig do + override.returns( + { + employer_id: String, + request_options: VitableConnect::RequestOptions + } + ) + end + def to_hash + end + end + end +end diff --git a/rbi/vitable_connect/models/employer_ensure_payroll_integration_email_response.rbi b/rbi/vitable_connect/models/employer_ensure_payroll_integration_email_response.rbi new file mode 100644 index 0000000..48d2703 --- /dev/null +++ b/rbi/vitable_connect/models/employer_ensure_payroll_integration_email_response.rbi @@ -0,0 +1,72 @@ +# typed: strong + +module VitableConnect + module Models + class EmployerEnsurePayrollIntegrationEmailResponse < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::EmployerEnsurePayrollIntegrationEmailResponse, + VitableConnect::Internal::AnyHash + ) + end + + sig do + returns( + VitableConnect::Models::EmployerEnsurePayrollIntegrationEmailResponse::Data + ) + end + attr_reader :data + + sig do + params( + data: + VitableConnect::Models::EmployerEnsurePayrollIntegrationEmailResponse::Data::OrHash + ).void + end + attr_writer :data + + # Response containing a single payroll integration email resource. + sig do + params( + data: + VitableConnect::Models::EmployerEnsurePayrollIntegrationEmailResponse::Data::OrHash + ).returns(T.attached_class) + end + def self.new(data:) + end + + sig do + override.returns( + { + data: + VitableConnect::Models::EmployerEnsurePayrollIntegrationEmailResponse::Data + } + ) + end + def to_hash + end + + class Data < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::EmployerEnsurePayrollIntegrationEmailResponse::Data, + VitableConnect::Internal::AnyHash + ) + end + + sig { returns(String) } + attr_accessor :integration_email + + sig { params(integration_email: String).returns(T.attached_class) } + def self.new(integration_email:) + end + + sig { override.returns({ integration_email: String }) } + def to_hash + end + end + end + end +end diff --git a/rbi/vitable_connect/models/employer_list_benefit_plan_year_enrollments_params.rbi b/rbi/vitable_connect/models/employer_list_benefit_plan_year_enrollments_params.rbi new file mode 100644 index 0000000..249e7b9 --- /dev/null +++ b/rbi/vitable_connect/models/employer_list_benefit_plan_year_enrollments_params.rbi @@ -0,0 +1,165 @@ +# typed: strong + +module VitableConnect + module Models + class EmployerListBenefitPlanYearEnrollmentsParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + OrHash = + T.type_alias do + T.any( + VitableConnect::EmployerListBenefitPlanYearEnrollmentsParams, + VitableConnect::Internal::AnyHash + ) + end + + # Unique employer identifier (empr\_\*) + sig { returns(String) } + attr_accessor :employer_id + + # Unique benefit-plan-year identifier (plyr\_\*). + sig { returns(String) } + attr_accessor :benefit_plan_year_id + + # Filter by election status. Repeat the parameter to match several. + sig do + returns( + T.nilable( + T::Array[ + VitableConnect::EmployerListBenefitPlanYearEnrollmentsParams::ElectionStatus::OrSymbol + ] + ) + ) + end + attr_reader :election_status + + sig do + params( + election_status: + T::Array[ + VitableConnect::EmployerListBenefitPlanYearEnrollmentsParams::ElectionStatus::OrSymbol + ] + ).void + end + attr_writer :election_status + + # Items per page (default: 20, max: 100) + sig { returns(T.nilable(Integer)) } + attr_reader :limit + + sig { params(limit: Integer).void } + attr_writer :limit + + # Page number (default: 1) + sig { returns(T.nilable(Integer)) } + attr_reader :page + + sig { params(page: Integer).void } + attr_writer :page + + # Case-insensitive search. Matches member name partially, and the `member_id` + # exactly — either your own reference id or the prefixed `grpmbr_<...>` id. + sig { returns(T.nilable(String)) } + attr_reader :search + + sig { params(search: String).void } + attr_writer :search + + sig do + params( + employer_id: String, + benefit_plan_year_id: String, + election_status: + T::Array[ + VitableConnect::EmployerListBenefitPlanYearEnrollmentsParams::ElectionStatus::OrSymbol + ], + limit: Integer, + page: Integer, + search: String, + request_options: VitableConnect::RequestOptions::OrHash + ).returns(T.attached_class) + end + def self.new( + # Unique employer identifier (empr\_\*) + employer_id:, + # Unique benefit-plan-year identifier (plyr\_\*). + benefit_plan_year_id:, + # Filter by election status. Repeat the parameter to match several. + election_status: nil, + # Items per page (default: 20, max: 100) + limit: nil, + # Page number (default: 1) + page: nil, + # Case-insensitive search. Matches member name partially, and the `member_id` + # exactly — either your own reference id or the prefixed `grpmbr_<...>` id. + search: nil, + request_options: {} + ) + end + + sig do + override.returns( + { + employer_id: String, + benefit_plan_year_id: String, + election_status: + T::Array[ + VitableConnect::EmployerListBenefitPlanYearEnrollmentsParams::ElectionStatus::OrSymbol + ], + limit: Integer, + page: Integer, + search: String, + request_options: VitableConnect::RequestOptions + } + ) + end + def to_hash + end + + module ElectionStatus + extend VitableConnect::Internal::Type::Enum + + TaggedSymbol = + T.type_alias do + T.all( + Symbol, + VitableConnect::EmployerListBenefitPlanYearEnrollmentsParams::ElectionStatus + ) + end + OrSymbol = T.type_alias { T.any(Symbol, String) } + + ENROLLED = + T.let( + :Enrolled, + VitableConnect::EmployerListBenefitPlanYearEnrollmentsParams::ElectionStatus::TaggedSymbol + ) + EXPIRED = + T.let( + :Expired, + VitableConnect::EmployerListBenefitPlanYearEnrollmentsParams::ElectionStatus::TaggedSymbol + ) + PENDING = + T.let( + :Pending, + VitableConnect::EmployerListBenefitPlanYearEnrollmentsParams::ElectionStatus::TaggedSymbol + ) + WAIVED = + T.let( + :Waived, + VitableConnect::EmployerListBenefitPlanYearEnrollmentsParams::ElectionStatus::TaggedSymbol + ) + + sig do + override.returns( + T::Array[ + VitableConnect::EmployerListBenefitPlanYearEnrollmentsParams::ElectionStatus::TaggedSymbol + ] + ) + end + def self.values + end + end + end + end +end diff --git a/rbi/vitable_connect/models/employer_list_benefit_plan_year_enrollments_response.rbi b/rbi/vitable_connect/models/employer_list_benefit_plan_year_enrollments_response.rbi new file mode 100644 index 0000000..4fb9a3f --- /dev/null +++ b/rbi/vitable_connect/models/employer_list_benefit_plan_year_enrollments_response.rbi @@ -0,0 +1,286 @@ +# typed: strong + +module VitableConnect + module Models + class EmployerListBenefitPlanYearEnrollmentsResponse < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::EmployerListBenefitPlanYearEnrollmentsResponse, + VitableConnect::Internal::AnyHash + ) + end + + # The carrier for this enrollment: the individual-market carrier for an ICHRA + # plan, otherwise the benefit's own. Null when the benefit has no carrier. + sig { returns(T.nilable(String)) } + attr_accessor :carrier + + # Dependents covered under this enrollment today. Counts the same dependents + # `premium_in_cents` is priced for, so a dependent whose termination is dated in + # the future still counts. + sig { returns(Integer) } + attr_accessor :dependent_count + + # - `Enrolled` - Enrolled + # - `Waived` - Waived + # - `Pending` - Pending + # - `Expired` - Expired + sig do + returns( + VitableConnect::Models::EmployerListBenefitPlanYearEnrollmentsResponse::ElectionStatus::TaggedSymbol + ) + end + attr_accessor :election_status + + # What the employee is deducted monthly, in cents: `premium_in_cents` less + # `employer_contribution_in_cents`, floored at zero. Null when unanswered/waived. + sig { returns(T.nilable(Integer)) } + attr_accessor :employee_deduction_in_cents + + # Your own reference id for this employee, as you supplied it. Null when you have + # not set one. + sig { returns(T.nilable(String)) } + attr_accessor :employee_external_reference_id + + # Our id for this person's employment with this employer (`empl_<...>`). A person + # who leaves and is rehired has two. + sig { returns(String) } + attr_accessor :employee_id + + # The employer's monthly share of `premium_in_cents`, in cents. Null when + # unanswered/waived. + sig { returns(T.nilable(Integer)) } + attr_accessor :employer_contribution_in_cents + + # The member's first name. + sig { returns(String) } + attr_accessor :member_first_name + + # Our id for the person (`mbr_<...>`). Stable across every employer they work for. + sig { returns(String) } + attr_accessor :member_id + + # The member's last name. + sig { returns(String) } + attr_accessor :member_last_name + + # Chosen plan name, or null when unanswered/waived. + sig { returns(T.nilable(String)) } + attr_accessor :plan + + # - `Coverage Upcoming` - Coverage Upcoming + # - `Coverage Effective` - Coverage Effective + # - `Coverage Ended` - Coverage Ended + # - `Cancelled` - Cancelled + sig do + returns( + T.nilable( + VitableConnect::Models::EmployerListBenefitPlanYearEnrollmentsResponse::PolicyStatus::TaggedSymbol + ) + ) + end + attr_accessor :policy_status + + # Monthly premium in cents for the chosen plan, dependents included. The plan's + # own cost, not the employer's share of it. Null when unanswered/waived. + sig { returns(T.nilable(Integer)) } + attr_accessor :premium_in_cents + + # Chosen coverage tier, or null when unanswered/waived. + sig { returns(T.nilable(String)) } + attr_accessor :tier + + sig do + params( + carrier: T.nilable(String), + dependent_count: Integer, + election_status: + VitableConnect::Models::EmployerListBenefitPlanYearEnrollmentsResponse::ElectionStatus::OrSymbol, + employee_deduction_in_cents: T.nilable(Integer), + employee_external_reference_id: T.nilable(String), + employee_id: String, + employer_contribution_in_cents: T.nilable(Integer), + member_first_name: String, + member_id: String, + member_last_name: String, + plan: T.nilable(String), + policy_status: + T.nilable( + VitableConnect::Models::EmployerListBenefitPlanYearEnrollmentsResponse::PolicyStatus::OrSymbol + ), + premium_in_cents: T.nilable(Integer), + tier: T.nilable(String) + ).returns(T.attached_class) + end + def self.new( + # The carrier for this enrollment: the individual-market carrier for an ICHRA + # plan, otherwise the benefit's own. Null when the benefit has no carrier. + carrier:, + # Dependents covered under this enrollment today. Counts the same dependents + # `premium_in_cents` is priced for, so a dependent whose termination is dated in + # the future still counts. + dependent_count:, + # - `Enrolled` - Enrolled + # - `Waived` - Waived + # - `Pending` - Pending + # - `Expired` - Expired + election_status:, + # What the employee is deducted monthly, in cents: `premium_in_cents` less + # `employer_contribution_in_cents`, floored at zero. Null when unanswered/waived. + employee_deduction_in_cents:, + # Your own reference id for this employee, as you supplied it. Null when you have + # not set one. + employee_external_reference_id:, + # Our id for this person's employment with this employer (`empl_<...>`). A person + # who leaves and is rehired has two. + employee_id:, + # The employer's monthly share of `premium_in_cents`, in cents. Null when + # unanswered/waived. + employer_contribution_in_cents:, + # The member's first name. + member_first_name:, + # Our id for the person (`mbr_<...>`). Stable across every employer they work for. + member_id:, + # The member's last name. + member_last_name:, + # Chosen plan name, or null when unanswered/waived. + plan:, + # - `Coverage Upcoming` - Coverage Upcoming + # - `Coverage Effective` - Coverage Effective + # - `Coverage Ended` - Coverage Ended + # - `Cancelled` - Cancelled + policy_status:, + # Monthly premium in cents for the chosen plan, dependents included. The plan's + # own cost, not the employer's share of it. Null when unanswered/waived. + premium_in_cents:, + # Chosen coverage tier, or null when unanswered/waived. + tier: + ) + end + + sig do + override.returns( + { + carrier: T.nilable(String), + dependent_count: Integer, + election_status: + VitableConnect::Models::EmployerListBenefitPlanYearEnrollmentsResponse::ElectionStatus::TaggedSymbol, + employee_deduction_in_cents: T.nilable(Integer), + employee_external_reference_id: T.nilable(String), + employee_id: String, + employer_contribution_in_cents: T.nilable(Integer), + member_first_name: String, + member_id: String, + member_last_name: String, + plan: T.nilable(String), + policy_status: + T.nilable( + VitableConnect::Models::EmployerListBenefitPlanYearEnrollmentsResponse::PolicyStatus::TaggedSymbol + ), + premium_in_cents: T.nilable(Integer), + tier: T.nilable(String) + } + ) + end + def to_hash + end + + # - `Enrolled` - Enrolled + # - `Waived` - Waived + # - `Pending` - Pending + # - `Expired` - Expired + module ElectionStatus + extend VitableConnect::Internal::Type::Enum + + TaggedSymbol = + T.type_alias do + T.all( + Symbol, + VitableConnect::Models::EmployerListBenefitPlanYearEnrollmentsResponse::ElectionStatus + ) + end + OrSymbol = T.type_alias { T.any(Symbol, String) } + + ENROLLED = + T.let( + :Enrolled, + VitableConnect::Models::EmployerListBenefitPlanYearEnrollmentsResponse::ElectionStatus::TaggedSymbol + ) + WAIVED = + T.let( + :Waived, + VitableConnect::Models::EmployerListBenefitPlanYearEnrollmentsResponse::ElectionStatus::TaggedSymbol + ) + PENDING = + T.let( + :Pending, + VitableConnect::Models::EmployerListBenefitPlanYearEnrollmentsResponse::ElectionStatus::TaggedSymbol + ) + EXPIRED = + T.let( + :Expired, + VitableConnect::Models::EmployerListBenefitPlanYearEnrollmentsResponse::ElectionStatus::TaggedSymbol + ) + + sig do + override.returns( + T::Array[ + VitableConnect::Models::EmployerListBenefitPlanYearEnrollmentsResponse::ElectionStatus::TaggedSymbol + ] + ) + end + def self.values + end + end + + # - `Coverage Upcoming` - Coverage Upcoming + # - `Coverage Effective` - Coverage Effective + # - `Coverage Ended` - Coverage Ended + # - `Cancelled` - Cancelled + module PolicyStatus + extend VitableConnect::Internal::Type::Enum + + TaggedSymbol = + T.type_alias do + T.all( + Symbol, + VitableConnect::Models::EmployerListBenefitPlanYearEnrollmentsResponse::PolicyStatus + ) + end + OrSymbol = T.type_alias { T.any(Symbol, String) } + + COVERAGE_UPCOMING = + T.let( + :"Coverage Upcoming", + VitableConnect::Models::EmployerListBenefitPlanYearEnrollmentsResponse::PolicyStatus::TaggedSymbol + ) + COVERAGE_EFFECTIVE = + T.let( + :"Coverage Effective", + VitableConnect::Models::EmployerListBenefitPlanYearEnrollmentsResponse::PolicyStatus::TaggedSymbol + ) + COVERAGE_ENDED = + T.let( + :"Coverage Ended", + VitableConnect::Models::EmployerListBenefitPlanYearEnrollmentsResponse::PolicyStatus::TaggedSymbol + ) + CANCELLED = + T.let( + :Cancelled, + VitableConnect::Models::EmployerListBenefitPlanYearEnrollmentsResponse::PolicyStatus::TaggedSymbol + ) + + sig do + override.returns( + T::Array[ + VitableConnect::Models::EmployerListBenefitPlanYearEnrollmentsResponse::PolicyStatus::TaggedSymbol + ] + ) + end + def self.values + end + end + end + end +end diff --git a/rbi/vitable_connect/models/employer_list_benefit_plan_years_params.rbi b/rbi/vitable_connect/models/employer_list_benefit_plan_years_params.rbi new file mode 100644 index 0000000..f0bcb26 --- /dev/null +++ b/rbi/vitable_connect/models/employer_list_benefit_plan_years_params.rbi @@ -0,0 +1,46 @@ +# typed: strong + +module VitableConnect + module Models + class EmployerListBenefitPlanYearsParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + OrHash = + T.type_alias do + T.any( + VitableConnect::EmployerListBenefitPlanYearsParams, + VitableConnect::Internal::AnyHash + ) + end + + # Unique employer identifier (empr\_\*) + sig { returns(String) } + attr_accessor :employer_id + + sig do + params( + employer_id: String, + request_options: VitableConnect::RequestOptions::OrHash + ).returns(T.attached_class) + end + def self.new( + # Unique employer identifier (empr\_\*) + employer_id:, + request_options: {} + ) + end + + sig do + override.returns( + { + employer_id: String, + request_options: VitableConnect::RequestOptions + } + ) + end + def to_hash + end + end + end +end diff --git a/rbi/vitable_connect/models/employer_list_benefit_plan_years_response.rbi b/rbi/vitable_connect/models/employer_list_benefit_plan_years_response.rbi new file mode 100644 index 0000000..72c8a9f --- /dev/null +++ b/rbi/vitable_connect/models/employer_list_benefit_plan_years_response.rbi @@ -0,0 +1,539 @@ +# typed: strong + +module VitableConnect + module Models + class EmployerListBenefitPlanYearsResponse < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::EmployerListBenefitPlanYearsResponse, + VitableConnect::Internal::AnyHash + ) + end + + sig do + returns( + T::Array[ + VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data + ] + ) + end + attr_accessor :data + + sig do + params( + data: + T::Array[ + VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data::OrHash + ] + ).returns(T.attached_class) + end + def self.new(data:) + end + + sig do + override.returns( + { + data: + T::Array[ + VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data + ] + } + ) + end + def to_hash + end + + class Data < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data, + VitableConnect::Internal::AnyHash + ) + end + + # Prefixed benefit identifier (`bprd_*`). + sig { returns(String) } + attr_accessor :benefit_id + + # Prefixed plan-year identifier (`plyr_*`). + sig { returns(String) } + attr_accessor :benefit_plan_year_id + + # Carrier name, or null (e.g. ICHRA). + sig { returns(T.nilable(String)) } + attr_accessor :carrier + + # Coverage end. + sig { returns(T.nilable(Date)) } + attr_accessor :coverage_end + + # Coverage start. + sig { returns(Date) } + attr_accessor :coverage_start + + # Employee contribution range. + sig do + returns( + T.nilable( + VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data::EmployeeContribution + ) + ) + end + attr_reader :employee_contribution + + sig do + params( + employee_contribution: + T.nilable( + VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data::EmployeeContribution::OrHash + ) + ).void + end + attr_writer :employee_contribution + + # Employer contribution range. + sig do + returns( + T.nilable( + VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data::EmployerContribution + ) + ) + end + attr_reader :employer_contribution + + sig do + params( + employer_contribution: + T.nilable( + VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data::EmployerContribution::OrHash + ) + ).void + end + attr_writer :employer_contribution + + # Enrolled/eligible rate for this plan year. + sig do + returns( + VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data::EnrollmentRate + ) + end + attr_reader :enrollment_rate + + sig do + params( + enrollment_rate: + VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data::EnrollmentRate::OrHash + ).void + end + attr_writer :enrollment_rate + + # - `mec` - Mec + # - `mvp` - Mvp + # - `ichra` - Ichra + # - `vpc` - Vpc + # - `dental` - Dental + # - `vision` - Vision + sig do + returns( + VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data::Family::TaggedSymbol + ) + end + attr_accessor :family + + # Whether this is the current plan year. + sig { returns(T::Boolean) } + attr_accessor :is_current + + # Displayed networks: ["multi"] for ICHRA, otherwise the plan year's distinct + # network names. + sig { returns(T::Array[String]) } + attr_accessor :network_names + + # Distinct offered state codes. + sig { returns(T::Array[String]) } + attr_accessor :offered_states + + # Open-enrollment end. + sig { returns(T.nilable(Date)) } + attr_accessor :open_enrollment_end + + # Open-enrollment start. + sig { returns(Date) } + attr_accessor :open_enrollment_start + + # Monthly premium in cents; only for an ICHRA benefit with effective coverage. + sig { returns(T.nilable(Integer)) } + attr_accessor :premium_in_cents + + # Benefit/product display name. + sig { returns(String) } + attr_accessor :product_name + + # - `active` - Active + # - `upcoming` - Upcoming + # - `open_enrollment` - Open Enrollment + # - `inactive` - Inactive + sig do + returns( + VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data::Status::TaggedSymbol + ) + end + attr_accessor :status + + # Calendar coverage year. + sig { returns(Integer) } + attr_accessor :year + + # One plan year, list view. + # + # Standalone (no shared base) so the exact list payload is readable in one place; + # the detail serializer is a separate class even where fields overlap. + sig do + params( + benefit_id: String, + benefit_plan_year_id: String, + carrier: T.nilable(String), + coverage_end: T.nilable(Date), + coverage_start: Date, + employee_contribution: + T.nilable( + VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data::EmployeeContribution::OrHash + ), + employer_contribution: + T.nilable( + VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data::EmployerContribution::OrHash + ), + enrollment_rate: + VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data::EnrollmentRate::OrHash, + family: + VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data::Family::OrSymbol, + is_current: T::Boolean, + network_names: T::Array[String], + offered_states: T::Array[String], + open_enrollment_end: T.nilable(Date), + open_enrollment_start: Date, + premium_in_cents: T.nilable(Integer), + product_name: String, + status: + VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data::Status::OrSymbol, + year: Integer + ).returns(T.attached_class) + end + def self.new( + # Prefixed benefit identifier (`bprd_*`). + benefit_id:, + # Prefixed plan-year identifier (`plyr_*`). + benefit_plan_year_id:, + # Carrier name, or null (e.g. ICHRA). + carrier:, + # Coverage end. + coverage_end:, + # Coverage start. + coverage_start:, + # Employee contribution range. + employee_contribution:, + # Employer contribution range. + employer_contribution:, + # Enrolled/eligible rate for this plan year. + enrollment_rate:, + # - `mec` - Mec + # - `mvp` - Mvp + # - `ichra` - Ichra + # - `vpc` - Vpc + # - `dental` - Dental + # - `vision` - Vision + family:, + # Whether this is the current plan year. + is_current:, + # Displayed networks: ["multi"] for ICHRA, otherwise the plan year's distinct + # network names. + network_names:, + # Distinct offered state codes. + offered_states:, + # Open-enrollment end. + open_enrollment_end:, + # Open-enrollment start. + open_enrollment_start:, + # Monthly premium in cents; only for an ICHRA benefit with effective coverage. + premium_in_cents:, + # Benefit/product display name. + product_name:, + # - `active` - Active + # - `upcoming` - Upcoming + # - `open_enrollment` - Open Enrollment + # - `inactive` - Inactive + status:, + # Calendar coverage year. + year: + ) + end + + sig do + override.returns( + { + benefit_id: String, + benefit_plan_year_id: String, + carrier: T.nilable(String), + coverage_end: T.nilable(Date), + coverage_start: Date, + employee_contribution: + T.nilable( + VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data::EmployeeContribution + ), + employer_contribution: + T.nilable( + VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data::EmployerContribution + ), + enrollment_rate: + VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data::EnrollmentRate, + family: + VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data::Family::TaggedSymbol, + is_current: T::Boolean, + network_names: T::Array[String], + offered_states: T::Array[String], + open_enrollment_end: T.nilable(Date), + open_enrollment_start: Date, + premium_in_cents: T.nilable(Integer), + product_name: String, + status: + VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data::Status::TaggedSymbol, + year: Integer + } + ) + end + def to_hash + end + + class EmployeeContribution < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data::EmployeeContribution, + VitableConnect::Internal::AnyHash + ) + end + + # Highest per-tier contribution in cents. + sig { returns(Integer) } + attr_accessor :max_cents + + # Lowest per-tier contribution in cents. + sig { returns(Integer) } + attr_accessor :min_cents + + # Employee contribution range. + sig do + params(max_cents: Integer, min_cents: Integer).returns( + T.attached_class + ) + end + def self.new( + # Highest per-tier contribution in cents. + max_cents:, + # Lowest per-tier contribution in cents. + min_cents: + ) + end + + sig { override.returns({ max_cents: Integer, min_cents: Integer }) } + def to_hash + end + end + + class EmployerContribution < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data::EmployerContribution, + VitableConnect::Internal::AnyHash + ) + end + + # Highest per-tier contribution in cents. + sig { returns(Integer) } + attr_accessor :max_cents + + # Lowest per-tier contribution in cents. + sig { returns(Integer) } + attr_accessor :min_cents + + # Employer contribution range. + sig do + params(max_cents: Integer, min_cents: Integer).returns( + T.attached_class + ) + end + def self.new( + # Highest per-tier contribution in cents. + max_cents:, + # Lowest per-tier contribution in cents. + min_cents: + ) + end + + sig { override.returns({ max_cents: Integer, min_cents: Integer }) } + def to_hash + end + end + + class EnrollmentRate < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data::EnrollmentRate, + VitableConnect::Internal::AnyHash + ) + end + + # Employees eligible for this plan year. + sig { returns(Integer) } + attr_accessor :eligible + + # Employees enrolled in this plan year. + sig { returns(Integer) } + attr_accessor :enrolled + + # `enrolled / eligible` whole-number percent (0 when none). + sig { returns(Integer) } + attr_accessor :percentage + + # Enrolled/eligible rate for this plan year. + sig do + params( + eligible: Integer, + enrolled: Integer, + percentage: Integer + ).returns(T.attached_class) + end + def self.new( + # Employees eligible for this plan year. + eligible:, + # Employees enrolled in this plan year. + enrolled:, + # `enrolled / eligible` whole-number percent (0 when none). + percentage: + ) + end + + sig do + override.returns( + { eligible: Integer, enrolled: Integer, percentage: Integer } + ) + end + def to_hash + end + end + + # - `mec` - Mec + # - `mvp` - Mvp + # - `ichra` - Ichra + # - `vpc` - Vpc + # - `dental` - Dental + # - `vision` - Vision + module Family + extend VitableConnect::Internal::Type::Enum + + TaggedSymbol = + T.type_alias do + T.all( + Symbol, + VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data::Family + ) + end + OrSymbol = T.type_alias { T.any(Symbol, String) } + + MEC = + T.let( + :mec, + VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data::Family::TaggedSymbol + ) + MVP = + T.let( + :mvp, + VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data::Family::TaggedSymbol + ) + ICHRA = + T.let( + :ichra, + VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data::Family::TaggedSymbol + ) + VPC = + T.let( + :vpc, + VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data::Family::TaggedSymbol + ) + DENTAL = + T.let( + :dental, + VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data::Family::TaggedSymbol + ) + VISION = + T.let( + :vision, + VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data::Family::TaggedSymbol + ) + + sig do + override.returns( + T::Array[ + VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data::Family::TaggedSymbol + ] + ) + end + def self.values + end + end + + # - `active` - Active + # - `upcoming` - Upcoming + # - `open_enrollment` - Open Enrollment + # - `inactive` - Inactive + module Status + extend VitableConnect::Internal::Type::Enum + + TaggedSymbol = + T.type_alias do + T.all( + Symbol, + VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data::Status + ) + end + OrSymbol = T.type_alias { T.any(Symbol, String) } + + ACTIVE = + T.let( + :active, + VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data::Status::TaggedSymbol + ) + UPCOMING = + T.let( + :upcoming, + VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data::Status::TaggedSymbol + ) + OPEN_ENROLLMENT = + T.let( + :open_enrollment, + VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data::Status::TaggedSymbol + ) + INACTIVE = + T.let( + :inactive, + VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data::Status::TaggedSymbol + ) + + sig do + override.returns( + T::Array[ + VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data::Status::TaggedSymbol + ] + ) + end + def self.values + end + end + end + end + end +end diff --git a/rbi/vitable_connect/models/employer_list_employees_params.rbi b/rbi/vitable_connect/models/employer_list_employees_params.rbi new file mode 100644 index 0000000..3078418 --- /dev/null +++ b/rbi/vitable_connect/models/employer_list_employees_params.rbi @@ -0,0 +1,138 @@ +# typed: strong + +module VitableConnect + module Models + class EmployerListEmployeesParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + OrHash = + T.type_alias do + T.any( + VitableConnect::EmployerListEmployeesParams, + VitableConnect::Internal::AnyHash + ) + end + + # Unique employer identifier (empr\_\*) + sig { returns(String) } + attr_accessor :employer_id + + # Filter by employment status (active or terminated) + sig do + returns( + T.nilable( + VitableConnect::EmployerListEmployeesParams::EmploymentStatus::OrSymbol + ) + ) + end + attr_reader :employment_status + + sig do + params( + employment_status: + VitableConnect::EmployerListEmployeesParams::EmploymentStatus::OrSymbol + ).void + end + attr_writer :employment_status + + # Items per page (default: 20, max: 100) + sig { returns(T.nilable(Integer)) } + attr_reader :limit + + sig { params(limit: Integer).void } + attr_writer :limit + + # Page number (default: 1) + sig { returns(T.nilable(Integer)) } + attr_reader :page + + sig { params(page: Integer).void } + attr_writer :page + + # Case-insensitive search across employee first name, last name, and email + sig { returns(T.nilable(String)) } + attr_reader :search + + sig { params(search: String).void } + attr_writer :search + + sig do + params( + employer_id: String, + employment_status: + VitableConnect::EmployerListEmployeesParams::EmploymentStatus::OrSymbol, + limit: Integer, + page: Integer, + search: String, + request_options: VitableConnect::RequestOptions::OrHash + ).returns(T.attached_class) + end + def self.new( + # Unique employer identifier (empr\_\*) + employer_id:, + # Filter by employment status (active or terminated) + employment_status: nil, + # Items per page (default: 20, max: 100) + limit: nil, + # Page number (default: 1) + page: nil, + # Case-insensitive search across employee first name, last name, and email + search: nil, + request_options: {} + ) + end + + sig do + override.returns( + { + employer_id: String, + employment_status: + VitableConnect::EmployerListEmployeesParams::EmploymentStatus::OrSymbol, + limit: Integer, + page: Integer, + search: String, + request_options: VitableConnect::RequestOptions + } + ) + end + def to_hash + end + + # Filter by employment status (active or terminated) + module EmploymentStatus + extend VitableConnect::Internal::Type::Enum + + TaggedSymbol = + T.type_alias do + T.all( + Symbol, + VitableConnect::EmployerListEmployeesParams::EmploymentStatus + ) + end + OrSymbol = T.type_alias { T.any(Symbol, String) } + + ACTIVE = + T.let( + :active, + VitableConnect::EmployerListEmployeesParams::EmploymentStatus::TaggedSymbol + ) + TERMINATED = + T.let( + :terminated, + VitableConnect::EmployerListEmployeesParams::EmploymentStatus::TaggedSymbol + ) + + sig do + override.returns( + T::Array[ + VitableConnect::EmployerListEmployeesParams::EmploymentStatus::TaggedSymbol + ] + ) + end + def self.values + end + end + end + end +end diff --git a/rbi/vitable_connect/models/employer_list_hris_providers_params.rbi b/rbi/vitable_connect/models/employer_list_hris_providers_params.rbi new file mode 100644 index 0000000..b04bc93 --- /dev/null +++ b/rbi/vitable_connect/models/employer_list_hris_providers_params.rbi @@ -0,0 +1,32 @@ +# typed: strong + +module VitableConnect + module Models + class EmployerListHRISProvidersParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + OrHash = + T.type_alias do + T.any( + VitableConnect::EmployerListHRISProvidersParams, + VitableConnect::Internal::AnyHash + ) + end + + sig do + params(request_options: VitableConnect::RequestOptions::OrHash).returns( + T.attached_class + ) + end + def self.new(request_options: {}) + end + + sig do + override.returns({ request_options: VitableConnect::RequestOptions }) + end + def to_hash + end + end + end +end diff --git a/rbi/vitable_connect/models/employer_list_hris_providers_response.rbi b/rbi/vitable_connect/models/employer_list_hris_providers_response.rbi new file mode 100644 index 0000000..9c7b87a --- /dev/null +++ b/rbi/vitable_connect/models/employer_list_hris_providers_response.rbi @@ -0,0 +1,86 @@ +# typed: strong + +module VitableConnect + module Models + class EmployerListHRISProvidersResponse < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::EmployerListHRISProvidersResponse, + VitableConnect::Internal::AnyHash + ) + end + + sig do + returns( + T::Array[ + VitableConnect::Models::EmployerListHRISProvidersResponse::Data + ] + ) + end + attr_accessor :data + + # Unpaginated `{"data": [...]}` list of organization hris providers. + sig do + params( + data: + T::Array[ + VitableConnect::Models::EmployerListHRISProvidersResponse::Data::OrHash + ] + ).returns(T.attached_class) + end + def self.new(data:) + end + + sig do + override.returns( + { + data: + T::Array[ + VitableConnect::Models::EmployerListHRISProvidersResponse::Data + ] + } + ) + end + def to_hash + end + + class Data < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::EmployerListHRISProvidersResponse::Data, + VitableConnect::Internal::AnyHash + ) + end + + # HRIS/payroll provider id, as stored on the connection (e.g. `adp_run`). Filter + # with this. + sig { returns(String) } + attr_accessor :provider + + # Display name of that provider (e.g. `ADP Run`). + sig { returns(String) } + attr_accessor :provider_label + + sig do + params(provider: String, provider_label: String).returns( + T.attached_class + ) + end + def self.new( + # HRIS/payroll provider id, as stored on the connection (e.g. `adp_run`). Filter + # with this. + provider:, + # Display name of that provider (e.g. `ADP Run`). + provider_label: + ) + end + + sig { override.returns({ provider: String, provider_label: String }) } + def to_hash + end + end + end + end +end diff --git a/rbi/vitable_connect/models/employer_list_invoices_params.rbi b/rbi/vitable_connect/models/employer_list_invoices_params.rbi new file mode 100644 index 0000000..259c289 --- /dev/null +++ b/rbi/vitable_connect/models/employer_list_invoices_params.rbi @@ -0,0 +1,65 @@ +# typed: strong + +module VitableConnect + module Models + class EmployerListInvoicesParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + OrHash = + T.type_alias do + T.any( + VitableConnect::EmployerListInvoicesParams, + VitableConnect::Internal::AnyHash + ) + end + + # Unique employer identifier (empr\_\*) + sig { returns(String) } + attr_accessor :employer_id + + # Maximum number of invoices per page + sig { returns(T.nilable(Integer)) } + attr_reader :limit + + sig { params(limit: Integer).void } + attr_writer :limit + + # Opaque cursor from a previous page's next_offset + sig { returns(T.nilable(String)) } + attr_accessor :offset + + sig do + params( + employer_id: String, + limit: Integer, + offset: T.nilable(String), + request_options: VitableConnect::RequestOptions::OrHash + ).returns(T.attached_class) + end + def self.new( + # Unique employer identifier (empr\_\*) + employer_id:, + # Maximum number of invoices per page + limit: nil, + # Opaque cursor from a previous page's next_offset + offset: nil, + request_options: {} + ) + end + + sig do + override.returns( + { + employer_id: String, + limit: Integer, + offset: T.nilable(String), + request_options: VitableConnect::RequestOptions + } + ) + end + def to_hash + end + end + end +end diff --git a/rbi/vitable_connect/models/employer_list_invoices_response.rbi b/rbi/vitable_connect/models/employer_list_invoices_response.rbi new file mode 100644 index 0000000..6cd0e02 --- /dev/null +++ b/rbi/vitable_connect/models/employer_list_invoices_response.rbi @@ -0,0 +1,151 @@ +# typed: strong + +module VitableConnect + module Models + class EmployerListInvoicesResponse < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::EmployerListInvoicesResponse, + VitableConnect::Internal::AnyHash + ) + end + + sig do + returns( + T::Array[VitableConnect::Models::EmployerListInvoicesResponse::Data] + ) + end + attr_accessor :data + + sig do + returns( + VitableConnect::Models::EmployerListInvoicesResponse::Pagination + ) + end + attr_reader :pagination + + sig do + params( + pagination: + VitableConnect::Models::EmployerListInvoicesResponse::Pagination::OrHash + ).void + end + attr_writer :pagination + + # Cursor-paginated invoices envelope: + # `{ "data": [...], "pagination": { "next_offset": ... } }`. + sig do + params( + data: + T::Array[ + VitableConnect::Models::EmployerListInvoicesResponse::Data::OrHash + ], + pagination: + VitableConnect::Models::EmployerListInvoicesResponse::Pagination::OrHash + ).returns(T.attached_class) + end + def self.new(data:, pagination:) + end + + sig do + override.returns( + { + data: + T::Array[ + VitableConnect::Models::EmployerListInvoicesResponse::Data + ], + pagination: + VitableConnect::Models::EmployerListInvoicesResponse::Pagination + } + ) + end + def to_hash + end + + class Data < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::EmployerListInvoicesResponse::Data, + VitableConnect::Internal::AnyHash + ) + end + + # Chargebee invoice id (external id, not a prefixed UUID). + sig { returns(String) } + attr_accessor :invoice_id + + # Invoice date as an ISO string, or null. + sig { returns(T.nilable(String)) } + attr_accessor :period + + # Chargebee invoice status (e.g. `paid`), or null. + sig { returns(T.nilable(String)) } + attr_accessor :status + + # Invoice total in dollars, or null. + sig { returns(T.nilable(Float)) } + attr_accessor :total + + sig do + params( + invoice_id: String, + period: T.nilable(String), + status: T.nilable(String), + total: T.nilable(Float) + ).returns(T.attached_class) + end + def self.new( + # Chargebee invoice id (external id, not a prefixed UUID). + invoice_id:, + # Invoice date as an ISO string, or null. + period:, + # Chargebee invoice status (e.g. `paid`), or null. + status:, + # Invoice total in dollars, or null. + total: + ) + end + + sig do + override.returns( + { + invoice_id: String, + period: T.nilable(String), + status: T.nilable(String), + total: T.nilable(Float) + } + ) + end + def to_hash + end + end + + class Pagination < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::EmployerListInvoicesResponse::Pagination, + VitableConnect::Internal::AnyHash + ) + end + + # Opaque JSON-encoded cursor for the next page; null when there are no more pages. + sig { returns(T.nilable(String)) } + attr_accessor :next_offset + + sig { params(next_offset: T.nilable(String)).returns(T.attached_class) } + def self.new( + # Opaque JSON-encoded cursor for the next page; null when there are no more pages. + next_offset: + ) + end + + sig { override.returns({ next_offset: T.nilable(String) }) } + def to_hash + end + end + end + end +end diff --git a/rbi/vitable_connect/models/employer_list_params.rbi b/rbi/vitable_connect/models/employer_list_params.rbi new file mode 100644 index 0000000..b17d838 --- /dev/null +++ b/rbi/vitable_connect/models/employer_list_params.rbi @@ -0,0 +1,352 @@ +# typed: strong + +module VitableConnect + module Models + class EmployerListParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + OrHash = + T.type_alias do + T.any( + VitableConnect::EmployerListParams, + VitableConnect::Internal::AnyHash + ) + end + + # Filter to employers with at least one active benefit in these families. + sig do + returns( + T.nilable( + T::Array[ + VitableConnect::EmployerListParams::BenefitFamily::OrSymbol + ] + ) + ) + end + attr_reader :benefit_family + + sig do + params( + benefit_family: + T::Array[ + VitableConnect::EmployerListParams::BenefitFamily::OrSymbol + ] + ).void + end + attr_writer :benefit_family + + # Filter to employers in one of these computed benefit-lifecycle stages. + sig do + returns( + T.nilable( + T::Array[ + VitableConnect::EmployerListParams::BenefitLifecycleStage::OrSymbol + ] + ) + ) + end + attr_reader :benefit_lifecycle_stage + + sig do + params( + benefit_lifecycle_stage: + T::Array[ + VitableConnect::EmployerListParams::BenefitLifecycleStage::OrSymbol + ] + ).void + end + attr_writer :benefit_lifecycle_stage + + # Filter to employers whose HRIS connection is with one of these payroll providers + # (e.g. `ADP RUN`). Matched case-insensitively; free text, so read the available + # values from the HRIS-providers endpoint rather than assuming a fixed set. + sig { returns(T.nilable(T::Array[String])) } + attr_reader :hris_provider + + sig { params(hris_provider: T::Array[String]).void } + attr_writer :hris_provider + + # Filter to employers whose HRIS connection is in one of these statuses. + sig do + returns( + T.nilable( + T::Array[VitableConnect::EmployerListParams::HRISStatus::OrSymbol] + ) + ) + end + attr_reader :hris_status + + sig do + params( + hris_status: + T::Array[VitableConnect::EmployerListParams::HRISStatus::OrSymbol] + ).void + end + attr_writer :hris_status + + # Include cancelled employers (hidden by default unless their stage is explicitly + # requested). + sig { returns(T.nilable(T::Boolean)) } + attr_reader :include_cancelled + + sig { params(include_cancelled: T::Boolean).void } + attr_writer :include_cancelled + + # Items per page. + sig { returns(T.nilable(Integer)) } + attr_reader :limit + + sig { params(limit: Integer).void } + attr_writer :limit + + # Page number. + sig { returns(T.nilable(Integer)) } + attr_reader :page + + sig { params(page: Integer).void } + attr_writer :page + + # Employer filter. Matches the display name or the legal name case-insensitively + # as a substring, or one of these exactly: the EIN (with or without its dash), the + # employer id, or the contact email of one of the employer's non-disabled admins. + sig { returns(T.nilable(String)) } + attr_accessor :search + + sig do + params( + benefit_family: + T::Array[ + VitableConnect::EmployerListParams::BenefitFamily::OrSymbol + ], + benefit_lifecycle_stage: + T::Array[ + VitableConnect::EmployerListParams::BenefitLifecycleStage::OrSymbol + ], + hris_provider: T::Array[String], + hris_status: + T::Array[VitableConnect::EmployerListParams::HRISStatus::OrSymbol], + include_cancelled: T::Boolean, + limit: Integer, + page: Integer, + search: T.nilable(String), + request_options: VitableConnect::RequestOptions::OrHash + ).returns(T.attached_class) + end + def self.new( + # Filter to employers with at least one active benefit in these families. + benefit_family: nil, + # Filter to employers in one of these computed benefit-lifecycle stages. + benefit_lifecycle_stage: nil, + # Filter to employers whose HRIS connection is with one of these payroll providers + # (e.g. `ADP RUN`). Matched case-insensitively; free text, so read the available + # values from the HRIS-providers endpoint rather than assuming a fixed set. + hris_provider: nil, + # Filter to employers whose HRIS connection is in one of these statuses. + hris_status: nil, + # Include cancelled employers (hidden by default unless their stage is explicitly + # requested). + include_cancelled: nil, + # Items per page. + limit: nil, + # Page number. + page: nil, + # Employer filter. Matches the display name or the legal name case-insensitively + # as a substring, or one of these exactly: the EIN (with or without its dash), the + # employer id, or the contact email of one of the employer's non-disabled admins. + search: nil, + request_options: {} + ) + end + + sig do + override.returns( + { + benefit_family: + T::Array[ + VitableConnect::EmployerListParams::BenefitFamily::OrSymbol + ], + benefit_lifecycle_stage: + T::Array[ + VitableConnect::EmployerListParams::BenefitLifecycleStage::OrSymbol + ], + hris_provider: T::Array[String], + hris_status: + T::Array[ + VitableConnect::EmployerListParams::HRISStatus::OrSymbol + ], + include_cancelled: T::Boolean, + limit: Integer, + page: Integer, + search: T.nilable(String), + request_options: VitableConnect::RequestOptions + } + ) + end + def to_hash + end + + # - `mec` - mec + # - `mvp` - mvp + # - `ichra` - ichra + # - `vpc` - vpc + # - `dental` - dental + # - `vision` - vision + module BenefitFamily + extend VitableConnect::Internal::Type::Enum + + TaggedSymbol = + T.type_alias do + T.all(Symbol, VitableConnect::EmployerListParams::BenefitFamily) + end + OrSymbol = T.type_alias { T.any(Symbol, String) } + + MEC = + T.let( + :mec, + VitableConnect::EmployerListParams::BenefitFamily::TaggedSymbol + ) + MVP = + T.let( + :mvp, + VitableConnect::EmployerListParams::BenefitFamily::TaggedSymbol + ) + ICHRA = + T.let( + :ichra, + VitableConnect::EmployerListParams::BenefitFamily::TaggedSymbol + ) + VPC = + T.let( + :vpc, + VitableConnect::EmployerListParams::BenefitFamily::TaggedSymbol + ) + DENTAL = + T.let( + :dental, + VitableConnect::EmployerListParams::BenefitFamily::TaggedSymbol + ) + VISION = + T.let( + :vision, + VitableConnect::EmployerListParams::BenefitFamily::TaggedSymbol + ) + + sig do + override.returns( + T::Array[ + VitableConnect::EmployerListParams::BenefitFamily::TaggedSymbol + ] + ) + end + def self.values + end + end + + # - `open_enrollment` - open_enrollment + # - `renewal` - renewal + # - `active` - active + # - `onboarding` - onboarding + # - `cancelled` - cancelled + module BenefitLifecycleStage + extend VitableConnect::Internal::Type::Enum + + TaggedSymbol = + T.type_alias do + T.all( + Symbol, + VitableConnect::EmployerListParams::BenefitLifecycleStage + ) + end + OrSymbol = T.type_alias { T.any(Symbol, String) } + + OPEN_ENROLLMENT = + T.let( + :open_enrollment, + VitableConnect::EmployerListParams::BenefitLifecycleStage::TaggedSymbol + ) + RENEWAL = + T.let( + :renewal, + VitableConnect::EmployerListParams::BenefitLifecycleStage::TaggedSymbol + ) + ACTIVE = + T.let( + :active, + VitableConnect::EmployerListParams::BenefitLifecycleStage::TaggedSymbol + ) + ONBOARDING = + T.let( + :onboarding, + VitableConnect::EmployerListParams::BenefitLifecycleStage::TaggedSymbol + ) + CANCELLED = + T.let( + :cancelled, + VitableConnect::EmployerListParams::BenefitLifecycleStage::TaggedSymbol + ) + + sig do + override.returns( + T::Array[ + VitableConnect::EmployerListParams::BenefitLifecycleStage::TaggedSymbol + ] + ) + end + def self.values + end + end + + # - `Pending` - Pending + # - `Active` - Active + # - `Inactive` - Inactive + # - `Paused` - Paused + # - `Terminated` - Terminated + module HRISStatus + extend VitableConnect::Internal::Type::Enum + + TaggedSymbol = + T.type_alias do + T.all(Symbol, VitableConnect::EmployerListParams::HRISStatus) + end + OrSymbol = T.type_alias { T.any(Symbol, String) } + + PENDING = + T.let( + :Pending, + VitableConnect::EmployerListParams::HRISStatus::TaggedSymbol + ) + ACTIVE = + T.let( + :Active, + VitableConnect::EmployerListParams::HRISStatus::TaggedSymbol + ) + INACTIVE = + T.let( + :Inactive, + VitableConnect::EmployerListParams::HRISStatus::TaggedSymbol + ) + PAUSED = + T.let( + :Paused, + VitableConnect::EmployerListParams::HRISStatus::TaggedSymbol + ) + TERMINATED = + T.let( + :Terminated, + VitableConnect::EmployerListParams::HRISStatus::TaggedSymbol + ) + + sig do + override.returns( + T::Array[ + VitableConnect::EmployerListParams::HRISStatus::TaggedSymbol + ] + ) + end + def self.values + end + end + end + end +end diff --git a/rbi/vitable_connect/models/employer_list_payroll_deduction_statements_params.rbi b/rbi/vitable_connect/models/employer_list_payroll_deduction_statements_params.rbi new file mode 100644 index 0000000..8817efe --- /dev/null +++ b/rbi/vitable_connect/models/employer_list_payroll_deduction_statements_params.rbi @@ -0,0 +1,68 @@ +# typed: strong + +module VitableConnect + module Models + class EmployerListPayrollDeductionStatementsParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + OrHash = + T.type_alias do + T.any( + VitableConnect::EmployerListPayrollDeductionStatementsParams, + VitableConnect::Internal::AnyHash + ) + end + + # Unique employer identifier (empr\_\*) + sig { returns(String) } + attr_accessor :employer_id + + # Maximum number of statements per page + sig { returns(T.nilable(Integer)) } + attr_reader :limit + + sig { params(limit: Integer).void } + attr_writer :limit + + # Page number to retrieve (starts at 1) + sig { returns(T.nilable(Integer)) } + attr_reader :page + + sig { params(page: Integer).void } + attr_writer :page + + sig do + params( + employer_id: String, + limit: Integer, + page: Integer, + request_options: VitableConnect::RequestOptions::OrHash + ).returns(T.attached_class) + end + def self.new( + # Unique employer identifier (empr\_\*) + employer_id:, + # Maximum number of statements per page + limit: nil, + # Page number to retrieve (starts at 1) + page: nil, + request_options: {} + ) + end + + sig do + override.returns( + { + employer_id: String, + limit: Integer, + page: Integer, + request_options: VitableConnect::RequestOptions + } + ) + end + def to_hash + end + end + end +end diff --git a/rbi/vitable_connect/models/employer_list_payroll_deduction_statements_response.rbi b/rbi/vitable_connect/models/employer_list_payroll_deduction_statements_response.rbi new file mode 100644 index 0000000..0d2f019 --- /dev/null +++ b/rbi/vitable_connect/models/employer_list_payroll_deduction_statements_response.rbi @@ -0,0 +1,169 @@ +# typed: strong + +module VitableConnect + module Models + class EmployerListPayrollDeductionStatementsResponse < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::EmployerListPayrollDeductionStatementsResponse, + VitableConnect::Internal::AnyHash + ) + end + + # Download link for the change CSV, or null. + sig { returns(T.nilable(String)) } + attr_accessor :csv_file_url + + # - `weekly` - Weekly + # - `bi_weekly` - Bi Weekly + # - `semi_monthly` - Semi Monthly + # - `monthly` - Monthly + sig do + returns( + VitableConnect::Models::EmployerListPayrollDeductionStatementsResponse::DeductionFrequency::TaggedSymbol + ) + end + attr_accessor :deduction_frequency + + # Human-readable deduction frequency (e.g. `Monthly`). + sig { returns(String) } + attr_accessor :deduction_frequency_label + + # Distinct employees covered by the statement's entries. + sig { returns(Integer) } + attr_accessor :employee_count + + # Deduction period end date. + sig { returns(Date) } + attr_accessor :period_end + + # Deduction period start date. + sig { returns(Date) } + attr_accessor :period_start + + # When the statement was generated. + sig { returns(Time) } + attr_accessor :run_date + + # Prefixed payroll-deduction-statement identifier (`pstmt_`). + sig { returns(String) } + attr_accessor :statement_id + + # Total payroll deduction for the period, in cents. + sig { returns(Integer) } + attr_accessor :total_deduction_cents + + # One payroll-deduction statement row. + # + # Reads a :class:`PayrollDeductionStatementDTO` by attribute: the `statement_id` + # character field renders the prefixed id via `str()`, and the date/datetime + # fields emit ISO-8601 strings. + sig do + params( + csv_file_url: T.nilable(String), + deduction_frequency: + VitableConnect::Models::EmployerListPayrollDeductionStatementsResponse::DeductionFrequency::OrSymbol, + deduction_frequency_label: String, + employee_count: Integer, + period_end: Date, + period_start: Date, + run_date: Time, + statement_id: String, + total_deduction_cents: Integer + ).returns(T.attached_class) + end + def self.new( + # Download link for the change CSV, or null. + csv_file_url:, + # - `weekly` - Weekly + # - `bi_weekly` - Bi Weekly + # - `semi_monthly` - Semi Monthly + # - `monthly` - Monthly + deduction_frequency:, + # Human-readable deduction frequency (e.g. `Monthly`). + deduction_frequency_label:, + # Distinct employees covered by the statement's entries. + employee_count:, + # Deduction period end date. + period_end:, + # Deduction period start date. + period_start:, + # When the statement was generated. + run_date:, + # Prefixed payroll-deduction-statement identifier (`pstmt_`). + statement_id:, + # Total payroll deduction for the period, in cents. + total_deduction_cents: + ) + end + + sig do + override.returns( + { + csv_file_url: T.nilable(String), + deduction_frequency: + VitableConnect::Models::EmployerListPayrollDeductionStatementsResponse::DeductionFrequency::TaggedSymbol, + deduction_frequency_label: String, + employee_count: Integer, + period_end: Date, + period_start: Date, + run_date: Time, + statement_id: String, + total_deduction_cents: Integer + } + ) + end + def to_hash + end + + # - `weekly` - Weekly + # - `bi_weekly` - Bi Weekly + # - `semi_monthly` - Semi Monthly + # - `monthly` - Monthly + module DeductionFrequency + extend VitableConnect::Internal::Type::Enum + + TaggedSymbol = + T.type_alias do + T.all( + Symbol, + VitableConnect::Models::EmployerListPayrollDeductionStatementsResponse::DeductionFrequency + ) + end + OrSymbol = T.type_alias { T.any(Symbol, String) } + + WEEKLY = + T.let( + :weekly, + VitableConnect::Models::EmployerListPayrollDeductionStatementsResponse::DeductionFrequency::TaggedSymbol + ) + BI_WEEKLY = + T.let( + :bi_weekly, + VitableConnect::Models::EmployerListPayrollDeductionStatementsResponse::DeductionFrequency::TaggedSymbol + ) + SEMI_MONTHLY = + T.let( + :semi_monthly, + VitableConnect::Models::EmployerListPayrollDeductionStatementsResponse::DeductionFrequency::TaggedSymbol + ) + MONTHLY = + T.let( + :monthly, + VitableConnect::Models::EmployerListPayrollDeductionStatementsResponse::DeductionFrequency::TaggedSymbol + ) + + sig do + override.returns( + T::Array[ + VitableConnect::Models::EmployerListPayrollDeductionStatementsResponse::DeductionFrequency::TaggedSymbol + ] + ) + end + def self.values + end + end + end + end +end diff --git a/rbi/vitable_connect/models/employer_list_response.rbi b/rbi/vitable_connect/models/employer_list_response.rbi new file mode 100644 index 0000000..ce7b0af --- /dev/null +++ b/rbi/vitable_connect/models/employer_list_response.rbi @@ -0,0 +1,440 @@ +# typed: strong + +module VitableConnect + module Models + class EmployerListResponse < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::EmployerListResponse, + VitableConnect::Internal::AnyHash + ) + end + + # Whether the employer is currently active in the system. + sig { returns(T::Boolean) } + attr_accessor :active + + # Shared read serializer for a postal address on public API responses. + # + # One definition for the address block every public resource emits (employer, + # employee, …), so the 5-field shape isn't hand-rolled per endpoint. Read-only: it + # renders an already-built address value object (e.g. `AddressDVO`) whose + # attributes map 1:1 to these fields. + sig { returns(VitableConnect::Models::EmployerListResponse::Address) } + attr_reader :address + + sig do + params( + address: VitableConnect::Models::EmployerListResponse::Address::OrHash + ).void + end + attr_writer :address + + # Distinct benefit-family tags across the employer's active benefits (e.g. `MEC`, + # `ICHRA`, `VPC`). + sig { returns(T::Array[String]) } + attr_accessor :benefit_families + + sig do + returns( + VitableConnect::Models::EmployerListResponse::BenefitLifecycleStage + ) + end + attr_reader :benefit_lifecycle_stage + + sig do + params( + benefit_lifecycle_stage: + VitableConnect::Models::EmployerListResponse::BenefitLifecycleStage::OrHash + ).void + end + attr_writer :benefit_lifecycle_stage + + # Timestamp when the employer was created. + sig { returns(Time) } + attr_accessor :created_at + + # Employer Identification Number (masked in responses). + sig { returns(T.nilable(String)) } + attr_accessor :ein + + # Email address for billing and communications. + sig { returns(T.nilable(String)) } + attr_accessor :email + + # Prefixed employer identifier (`empr_`). + sig { returns(String) } + attr_accessor :employer_id + + # Enrolled/eligible employees roll-up. + sig do + returns( + VitableConnect::Models::EmployerListResponse::EnrollmentRateSummary + ) + end + attr_reader :enrollment_rate_summary + + sig do + params( + enrollment_rate_summary: + VitableConnect::Models::EmployerListResponse::EnrollmentRateSummary::OrHash + ).void + end + attr_writer :enrollment_rate_summary + + # HRIS connection, or null when the employer has none. + sig do + returns( + T.nilable(VitableConnect::Models::EmployerListResponse::HRISStatus) + ) + end + attr_reader :hris_status + + sig do + params( + hris_status: + T.nilable( + VitableConnect::Models::EmployerListResponse::HRISStatus::OrHash + ) + ).void + end + attr_writer :hris_status + + # Legal business name for compliance and tax purposes. + sig { returns(T.nilable(String)) } + attr_accessor :legal_name + + # Employer name. + sig { returns(String) } + attr_accessor :name + + # ID of the parent organization (`org_*`), or null when unknown. + sig { returns(T.nilable(String)) } + attr_accessor :organization_id + + # Employer phone number. + sig { returns(T.nilable(String)) } + attr_accessor :phone_number + + # The organization's own reference id for this employer, or null when none was + # assigned. + sig { returns(T.nilable(String)) } + attr_accessor :reference_id + + # Timestamp when the employer was last updated. + sig { returns(Time) } + attr_accessor :updated_at + + # One employer row of the organization's book (list projection). + # + # Carries the enriched/computed columns (enrollment roll-up, benefit-family tags, + # HRIS connection, benefit-lifecycle stage) alongside the flat CRM fields of the + # underlying employer (legal name, EIN, contact, address, timestamps) for parity + # with the legacy `Employer` contract. + sig do + params( + active: T::Boolean, + address: + VitableConnect::Models::EmployerListResponse::Address::OrHash, + benefit_families: T::Array[String], + benefit_lifecycle_stage: + VitableConnect::Models::EmployerListResponse::BenefitLifecycleStage::OrHash, + created_at: Time, + ein: T.nilable(String), + email: T.nilable(String), + employer_id: String, + enrollment_rate_summary: + VitableConnect::Models::EmployerListResponse::EnrollmentRateSummary::OrHash, + hris_status: + T.nilable( + VitableConnect::Models::EmployerListResponse::HRISStatus::OrHash + ), + legal_name: T.nilable(String), + name: String, + organization_id: T.nilable(String), + phone_number: T.nilable(String), + reference_id: T.nilable(String), + updated_at: Time + ).returns(T.attached_class) + end + def self.new( + # Whether the employer is currently active in the system. + active:, + # Shared read serializer for a postal address on public API responses. + # + # One definition for the address block every public resource emits (employer, + # employee, …), so the 5-field shape isn't hand-rolled per endpoint. Read-only: it + # renders an already-built address value object (e.g. `AddressDVO`) whose + # attributes map 1:1 to these fields. + address:, + # Distinct benefit-family tags across the employer's active benefits (e.g. `MEC`, + # `ICHRA`, `VPC`). + benefit_families:, + benefit_lifecycle_stage:, + # Timestamp when the employer was created. + created_at:, + # Employer Identification Number (masked in responses). + ein:, + # Email address for billing and communications. + email:, + # Prefixed employer identifier (`empr_`). + employer_id:, + # Enrolled/eligible employees roll-up. + enrollment_rate_summary:, + # HRIS connection, or null when the employer has none. + hris_status:, + # Legal business name for compliance and tax purposes. + legal_name:, + # Employer name. + name:, + # ID of the parent organization (`org_*`), or null when unknown. + organization_id:, + # Employer phone number. + phone_number:, + # The organization's own reference id for this employer, or null when none was + # assigned. + reference_id:, + # Timestamp when the employer was last updated. + updated_at: + ) + end + + sig do + override.returns( + { + active: T::Boolean, + address: VitableConnect::Models::EmployerListResponse::Address, + benefit_families: T::Array[String], + benefit_lifecycle_stage: + VitableConnect::Models::EmployerListResponse::BenefitLifecycleStage, + created_at: Time, + ein: T.nilable(String), + email: T.nilable(String), + employer_id: String, + enrollment_rate_summary: + VitableConnect::Models::EmployerListResponse::EnrollmentRateSummary, + hris_status: + T.nilable( + VitableConnect::Models::EmployerListResponse::HRISStatus + ), + legal_name: T.nilable(String), + name: String, + organization_id: T.nilable(String), + phone_number: T.nilable(String), + reference_id: T.nilable(String), + updated_at: Time + } + ) + end + def to_hash + end + + class Address < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::EmployerListResponse::Address, + VitableConnect::Internal::AnyHash + ) + end + + # Primary street address. + sig { returns(String) } + attr_accessor :address_line_1 + + # Secondary street address (apt, suite, etc.). + sig { returns(T.nilable(String)) } + attr_accessor :address_line_2 + + # City name. + sig { returns(String) } + attr_accessor :city + + # Two-letter state code (e.g. `CA`, `NY`). + sig { returns(String) } + attr_accessor :state + + # ZIP code (5 or 9 digit). + sig { returns(String) } + attr_accessor :zipcode + + # Shared read serializer for a postal address on public API responses. + # + # One definition for the address block every public resource emits (employer, + # employee, …), so the 5-field shape isn't hand-rolled per endpoint. Read-only: it + # renders an already-built address value object (e.g. `AddressDVO`) whose + # attributes map 1:1 to these fields. + sig do + params( + address_line_1: String, + address_line_2: T.nilable(String), + city: String, + state: String, + zipcode: String + ).returns(T.attached_class) + end + def self.new( + # Primary street address. + address_line_1:, + # Secondary street address (apt, suite, etc.). + address_line_2:, + # City name. + city:, + # Two-letter state code (e.g. `CA`, `NY`). + state:, + # ZIP code (5 or 9 digit). + zipcode: + ) + end + + sig do + override.returns( + { + address_line_1: String, + address_line_2: T.nilable(String), + city: String, + state: String, + zipcode: String + } + ) + end + def to_hash + end + end + + class BenefitLifecycleStage < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::EmployerListResponse::BenefitLifecycleStage, + VitableConnect::Internal::AnyHash + ) + end + + # Anchor date for the stage (e.g. renewal date); null when not applicable. + sig { returns(T.nilable(Date)) } + attr_accessor :as_of_date + + # Computed employer benefit-lifecycle stage: `open_enrollment`, `renewal`, + # `active`, `onboarding`, or `cancelled`. + sig { returns(String) } + attr_accessor :stage + + sig do + params(as_of_date: T.nilable(Date), stage: String).returns( + T.attached_class + ) + end + def self.new( + # Anchor date for the stage (e.g. renewal date); null when not applicable. + as_of_date:, + # Computed employer benefit-lifecycle stage: `open_enrollment`, `renewal`, + # `active`, `onboarding`, or `cancelled`. + stage: + ) + end + + sig { override.returns({ as_of_date: T.nilable(Date), stage: String }) } + def to_hash + end + end + + class EnrollmentRateSummary < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::EmployerListResponse::EnrollmentRateSummary, + VitableConnect::Internal::AnyHash + ) + end + + # Employees eligible for at least one active benefit. + sig { returns(Integer) } + attr_accessor :eligible + + # Employees enrolled in at least one active benefit. + sig { returns(Integer) } + attr_accessor :enrolled + + # `enrolled / eligible` as a whole-number percent (0 when none eligible). + sig { returns(Integer) } + attr_accessor :percentage + + # Enrolled/eligible employees roll-up. + sig do + params( + eligible: Integer, + enrolled: Integer, + percentage: Integer + ).returns(T.attached_class) + end + def self.new( + # Employees eligible for at least one active benefit. + eligible:, + # Employees enrolled in at least one active benefit. + enrolled:, + # `enrolled / eligible` as a whole-number percent (0 when none eligible). + percentage: + ) + end + + sig do + override.returns( + { eligible: Integer, enrolled: Integer, percentage: Integer } + ) + end + def to_hash + end + end + + class HRISStatus < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::EmployerListResponse::HRISStatus, + VitableConnect::Internal::AnyHash + ) + end + + # Id of the HRIS/payroll provider the employer is connected to (e.g. `paylocity`). + sig { returns(String) } + attr_accessor :provider + + # Display name of that provider (e.g. `Paylocity`). + sig { returns(String) } + attr_accessor :provider_label + + # Connection status reported by the integration. + sig { returns(String) } + attr_accessor :status + + # HRIS connection, or null when the employer has none. + sig do + params( + provider: String, + provider_label: String, + status: String + ).returns(T.attached_class) + end + def self.new( + # Id of the HRIS/payroll provider the employer is connected to (e.g. `paylocity`). + provider:, + # Display name of that provider (e.g. `Paylocity`). + provider_label:, + # Connection status reported by the integration. + status: + ) + end + + sig do + override.returns( + { provider: String, provider_label: String, status: String } + ) + end + def to_hash + end + end + end + end +end diff --git a/rbi/vitable_connect/models/employer_response.rbi b/rbi/vitable_connect/models/employer_response.rbi new file mode 100644 index 0000000..8d4fd74 --- /dev/null +++ b/rbi/vitable_connect/models/employer_response.rbi @@ -0,0 +1,36 @@ +# typed: strong + +module VitableConnect + module Models + class EmployerResponse < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::EmployerResponse, + VitableConnect::Internal::AnyHash + ) + end + + # Serializer for Employer entity in public API responses. + sig { returns(VitableConnect::Employer) } + attr_reader :data + + sig { params(data: VitableConnect::Employer::OrHash).void } + attr_writer :data + + # Response containing a single employer resource. + sig do + params(data: VitableConnect::Employer::OrHash).returns(T.attached_class) + end + def self.new( + # Serializer for Employer entity in public API responses. + data: + ) + end + + sig { override.returns({ data: VitableConnect::Employer }) } + def to_hash + end + end + end +end diff --git a/rbi/vitable_connect/models/employer_retrieve_benefit_plan_year_params.rbi b/rbi/vitable_connect/models/employer_retrieve_benefit_plan_year_params.rbi new file mode 100644 index 0000000..6793e93 --- /dev/null +++ b/rbi/vitable_connect/models/employer_retrieve_benefit_plan_year_params.rbi @@ -0,0 +1,54 @@ +# typed: strong + +module VitableConnect + module Models + class EmployerRetrieveBenefitPlanYearParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + OrHash = + T.type_alias do + T.any( + VitableConnect::EmployerRetrieveBenefitPlanYearParams, + VitableConnect::Internal::AnyHash + ) + end + + # Unique employer identifier (empr\_\*) + sig { returns(String) } + attr_accessor :employer_id + + # Unique benefit-plan-year identifier (plyr\_\*). + sig { returns(String) } + attr_accessor :benefit_plan_year_id + + sig do + params( + employer_id: String, + benefit_plan_year_id: String, + request_options: VitableConnect::RequestOptions::OrHash + ).returns(T.attached_class) + end + def self.new( + # Unique employer identifier (empr\_\*) + employer_id:, + # Unique benefit-plan-year identifier (plyr\_\*). + benefit_plan_year_id:, + request_options: {} + ) + end + + sig do + override.returns( + { + employer_id: String, + benefit_plan_year_id: String, + request_options: VitableConnect::RequestOptions + } + ) + end + def to_hash + end + end + end +end diff --git a/rbi/vitable_connect/models/employer_retrieve_benefit_plan_year_response.rbi b/rbi/vitable_connect/models/employer_retrieve_benefit_plan_year_response.rbi new file mode 100644 index 0000000..a5ddafb --- /dev/null +++ b/rbi/vitable_connect/models/employer_retrieve_benefit_plan_year_response.rbi @@ -0,0 +1,1650 @@ +# typed: strong + +module VitableConnect + module Models + class EmployerRetrieveBenefitPlanYearResponse < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse, + VitableConnect::Internal::AnyHash + ) + end + + # One plan year, detail view. + # + # Standalone (no shared base) so the exact detail payload is readable in one + # place; the list serializer is a separate class even where fields overlap. Detail + # carries the SPD link and omits the list-only `is_current` flag. + sig do + returns( + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data + ) + end + attr_reader :data + + sig do + params( + data: + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::OrHash + ).void + end + attr_writer :data + + # Response containing a single employer benefit plan year resource. + sig do + params( + data: + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::OrHash + ).returns(T.attached_class) + end + def self.new( + # One plan year, detail view. + # + # Standalone (no shared base) so the exact detail payload is readable in one + # place; the list serializer is a separate class even where fields overlap. Detail + # carries the SPD link and omits the list-only `is_current` flag. + data: + ) + end + + sig do + override.returns( + { + data: + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data + } + ) + end + def to_hash + end + + class Data < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data, + VitableConnect::Internal::AnyHash + ) + end + + # Prefixed benefit identifier (`bprd_*`). + sig { returns(String) } + attr_accessor :benefit_id + + # Prefixed plan-year identifier (`plyr_*`). + sig { returns(String) } + attr_accessor :benefit_plan_year_id + + # Carrier name, or null (e.g. ICHRA). + sig { returns(T.nilable(String)) } + attr_accessor :carrier + + # How the plan year prices contributions: exactly one collection is populated, + # determined by the plan year's `family` (ICHRA vs tier-priced). + sig do + returns( + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy + ) + end + attr_reader :contribution_strategy + + sig do + params( + contribution_strategy: + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::OrHash + ).void + end + attr_writer :contribution_strategy + + # Coverage end. + sig { returns(T.nilable(Date)) } + attr_accessor :coverage_end + + # Coverage start. + sig { returns(Date) } + attr_accessor :coverage_start + + # The plan year's active eligibility policy. Mirrors the internal + # `PlanYearEligibilityPolicyDTO` but exposes only the public subset (no raw ids, + # `active_in`, or timestamps). + sig do + returns( + T.nilable( + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy + ) + ) + end + attr_reader :eligibility_policy + + sig do + params( + eligibility_policy: + T.nilable( + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::OrHash + ) + ).void + end + attr_writer :eligibility_policy + + # Employee contribution range. + sig do + returns( + T.nilable( + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EmployeeContribution + ) + ) + end + attr_reader :employee_contribution + + sig do + params( + employee_contribution: + T.nilable( + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EmployeeContribution::OrHash + ) + ).void + end + attr_writer :employee_contribution + + # Employer contribution range. + sig do + returns( + T.nilable( + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EmployerContribution + ) + ) + end + attr_reader :employer_contribution + + sig do + params( + employer_contribution: + T.nilable( + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EmployerContribution::OrHash + ) + ).void + end + attr_writer :employer_contribution + + # Enrolled/eligible rate for this plan year. + sig do + returns( + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EnrollmentRate + ) + end + attr_reader :enrollment_rate + + sig do + params( + enrollment_rate: + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EnrollmentRate::OrHash + ).void + end + attr_writer :enrollment_rate + + # - `mec` - Mec + # - `mvp` - Mvp + # - `ichra` - Ichra + # - `vpc` - Vpc + # - `dental` - Dental + # - `vision` - Vision + sig do + returns( + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::Family::TaggedSymbol + ) + end + attr_accessor :family + + # Displayed networks: ["multi"] for ICHRA, otherwise the plan year's distinct + # network names. + sig { returns(T::Array[String]) } + attr_accessor :network_names + + # Distinct offered state codes. + sig { returns(T::Array[String]) } + attr_accessor :offered_states + + # Open-enrollment end. + sig { returns(T.nilable(Date)) } + attr_accessor :open_enrollment_end + + # Open-enrollment start. + sig { returns(Date) } + attr_accessor :open_enrollment_start + + # Monthly premium in cents; only for an ICHRA benefit with effective coverage. + sig { returns(T.nilable(Integer)) } + attr_accessor :premium_in_cents + + # Benefit/product display name. + sig { returns(String) } + attr_accessor :product_name + + # Summary Plan Description (SPD) link, or null. + sig { returns(T.nilable(String)) } + attr_accessor :spd_file_url + + # - `active` - Active + # - `upcoming` - Upcoming + # - `open_enrollment` - Open Enrollment + # - `inactive` - Inactive + sig do + returns( + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::Status::TaggedSymbol + ) + end + attr_accessor :status + + # Calendar coverage year. + sig { returns(Integer) } + attr_accessor :year + + # One plan year, detail view. + # + # Standalone (no shared base) so the exact detail payload is readable in one + # place; the list serializer is a separate class even where fields overlap. Detail + # carries the SPD link and omits the list-only `is_current` flag. + sig do + params( + benefit_id: String, + benefit_plan_year_id: String, + carrier: T.nilable(String), + contribution_strategy: + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::OrHash, + coverage_end: T.nilable(Date), + coverage_start: Date, + eligibility_policy: + T.nilable( + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::OrHash + ), + employee_contribution: + T.nilable( + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EmployeeContribution::OrHash + ), + employer_contribution: + T.nilable( + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EmployerContribution::OrHash + ), + enrollment_rate: + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EnrollmentRate::OrHash, + family: + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::Family::OrSymbol, + network_names: T::Array[String], + offered_states: T::Array[String], + open_enrollment_end: T.nilable(Date), + open_enrollment_start: Date, + premium_in_cents: T.nilable(Integer), + product_name: String, + spd_file_url: T.nilable(String), + status: + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::Status::OrSymbol, + year: Integer + ).returns(T.attached_class) + end + def self.new( + # Prefixed benefit identifier (`bprd_*`). + benefit_id:, + # Prefixed plan-year identifier (`plyr_*`). + benefit_plan_year_id:, + # Carrier name, or null (e.g. ICHRA). + carrier:, + # How the plan year prices contributions: exactly one collection is populated, + # determined by the plan year's `family` (ICHRA vs tier-priced). + contribution_strategy:, + # Coverage end. + coverage_end:, + # Coverage start. + coverage_start:, + # The plan year's active eligibility policy. Mirrors the internal + # `PlanYearEligibilityPolicyDTO` but exposes only the public subset (no raw ids, + # `active_in`, or timestamps). + eligibility_policy:, + # Employee contribution range. + employee_contribution:, + # Employer contribution range. + employer_contribution:, + # Enrolled/eligible rate for this plan year. + enrollment_rate:, + # - `mec` - Mec + # - `mvp` - Mvp + # - `ichra` - Ichra + # - `vpc` - Vpc + # - `dental` - Dental + # - `vision` - Vision + family:, + # Displayed networks: ["multi"] for ICHRA, otherwise the plan year's distinct + # network names. + network_names:, + # Distinct offered state codes. + offered_states:, + # Open-enrollment end. + open_enrollment_end:, + # Open-enrollment start. + open_enrollment_start:, + # Monthly premium in cents; only for an ICHRA benefit with effective coverage. + premium_in_cents:, + # Benefit/product display name. + product_name:, + # Summary Plan Description (SPD) link, or null. + spd_file_url:, + # - `active` - Active + # - `upcoming` - Upcoming + # - `open_enrollment` - Open Enrollment + # - `inactive` - Inactive + status:, + # Calendar coverage year. + year: + ) + end + + sig do + override.returns( + { + benefit_id: String, + benefit_plan_year_id: String, + carrier: T.nilable(String), + contribution_strategy: + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy, + coverage_end: T.nilable(Date), + coverage_start: Date, + eligibility_policy: + T.nilable( + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy + ), + employee_contribution: + T.nilable( + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EmployeeContribution + ), + employer_contribution: + T.nilable( + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EmployerContribution + ), + enrollment_rate: + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EnrollmentRate, + family: + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::Family::TaggedSymbol, + network_names: T::Array[String], + offered_states: T::Array[String], + open_enrollment_end: T.nilable(Date), + open_enrollment_start: Date, + premium_in_cents: T.nilable(Integer), + product_name: String, + spd_file_url: T.nilable(String), + status: + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::Status::TaggedSymbol, + year: Integer + } + ) + end + def to_hash + end + + class ContributionStrategy < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy, + VitableConnect::Internal::AnyHash + ) + end + + # Coverage tiers and their costs; empty for ICHRA benefits. + sig do + returns( + T::Array[ + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::ContributionTier + ] + ) + end + attr_accessor :contribution_tiers + + # ICHRA contribution classes; empty for tier-priced benefits. + sig do + returns( + T::Array[ + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass + ] + ) + end + attr_accessor :ichra_contribution_classes + + # How the plan year prices contributions: exactly one collection is populated, + # determined by the plan year's `family` (ICHRA vs tier-priced). + sig do + params( + contribution_tiers: + T::Array[ + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::ContributionTier::OrHash + ], + ichra_contribution_classes: + T::Array[ + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass::OrHash + ] + ).returns(T.attached_class) + end + def self.new( + # Coverage tiers and their costs; empty for ICHRA benefits. + contribution_tiers:, + # ICHRA contribution classes; empty for tier-priced benefits. + ichra_contribution_classes: + ) + end + + sig do + override.returns( + { + contribution_tiers: + T::Array[ + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::ContributionTier + ], + ichra_contribution_classes: + T::Array[ + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass + ] + } + ) + end + def to_hash + end + + class ContributionTier < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::ContributionTier, + VitableConnect::Internal::AnyHash + ) + end + + # Prefixed benefit-plan identifier (`bpln_*`). + sig { returns(String) } + attr_accessor :benefit_plan_id + + # Benefit plan name. + sig { returns(String) } + attr_accessor :benefit_plan_name + + # Coverage-tier name. + sig { returns(String) } + attr_accessor :benefit_plan_tier_name + + # Monthly employee deduction in cents. + sig { returns(Integer) } + attr_accessor :cost + + # Monthly employee deduction per dependent, in cents. + sig { returns(Integer) } + attr_accessor :cost_per_dependent + + # - `Unspecified` - Unspecified + # - `EE` - EE + # - `ES` - ES + # - `EC` - EC + # - `EF` - EF + sig do + returns( + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::ContributionTier::CoverageTier::TaggedSymbol + ) + end + attr_accessor :coverage_tier + + # Whether dependents are required for this tier. + sig { returns(T::Boolean) } + attr_accessor :dependents_required_in + + # Whether a spouse is required for this tier. + sig { returns(T::Boolean) } + attr_accessor :spouse_required_in + + # One non-ICHRA coverage tier, mirroring the internal configuration + # `CompanyBenefitPlanTierCostDTO` minus the tier-cost id, `pepm` and + # `pepm_per_dependent`; `benefit_plan_id` is the prefixed `bpln_*` form rather + # than a raw UUID. + sig do + params( + benefit_plan_id: String, + benefit_plan_name: String, + benefit_plan_tier_name: String, + cost: Integer, + cost_per_dependent: Integer, + coverage_tier: + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::ContributionTier::CoverageTier::OrSymbol, + dependents_required_in: T::Boolean, + spouse_required_in: T::Boolean + ).returns(T.attached_class) + end + def self.new( + # Prefixed benefit-plan identifier (`bpln_*`). + benefit_plan_id:, + # Benefit plan name. + benefit_plan_name:, + # Coverage-tier name. + benefit_plan_tier_name:, + # Monthly employee deduction in cents. + cost:, + # Monthly employee deduction per dependent, in cents. + cost_per_dependent:, + # - `Unspecified` - Unspecified + # - `EE` - EE + # - `ES` - ES + # - `EC` - EC + # - `EF` - EF + coverage_tier:, + # Whether dependents are required for this tier. + dependents_required_in:, + # Whether a spouse is required for this tier. + spouse_required_in: + ) + end + + sig do + override.returns( + { + benefit_plan_id: String, + benefit_plan_name: String, + benefit_plan_tier_name: String, + cost: Integer, + cost_per_dependent: Integer, + coverage_tier: + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::ContributionTier::CoverageTier::TaggedSymbol, + dependents_required_in: T::Boolean, + spouse_required_in: T::Boolean + } + ) + end + def to_hash + end + + # - `Unspecified` - Unspecified + # - `EE` - EE + # - `ES` - ES + # - `EC` - EC + # - `EF` - EF + module CoverageTier + extend VitableConnect::Internal::Type::Enum + + TaggedSymbol = + T.type_alias do + T.all( + Symbol, + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::ContributionTier::CoverageTier + ) + end + OrSymbol = T.type_alias { T.any(Symbol, String) } + + UNSPECIFIED = + T.let( + :Unspecified, + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::ContributionTier::CoverageTier::TaggedSymbol + ) + EE = + T.let( + :EE, + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::ContributionTier::CoverageTier::TaggedSymbol + ) + ES = + T.let( + :ES, + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::ContributionTier::CoverageTier::TaggedSymbol + ) + EC = + T.let( + :EC, + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::ContributionTier::CoverageTier::TaggedSymbol + ) + EF = + T.let( + :EF, + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::ContributionTier::CoverageTier::TaggedSymbol + ) + + sig do + override.returns( + T::Array[ + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::ContributionTier::CoverageTier::TaggedSymbol + ] + ) + end + def self.values + end + end + end + + class IchraContributionClass < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass, + VitableConnect::Internal::AnyHash + ) + end + + # Monthly allowance in cents. + sig { returns(Integer) } + attr_accessor :amount_in_cents + + # - `Unspecified` - Unspecified + # - `Salary` - Salary + # - `Hourly` - Hourly + sig do + returns( + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass::Compensation::TaggedSymbol + ) + end + attr_accessor :compensation + + # Prefixed contribution-class identifier (`iccl_*`). + sig { returns(String) } + attr_accessor :contribution_class_id + + # - `Unspecified` - Unspecified + # - `Full Time` - Full Time + # - `Part Time` - Part Time + # - `Temporary` - Temporary + # - `Seasonal` - Seasonal + sig do + returns( + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass::Employment::TaggedSymbol + ) + end + attr_accessor :employment + + # - `Unspecified` - Unspecified + # - `EE` - EE + # - `ES` - ES + # - `EC` - EC + # - `EF` - EF + sig do + returns( + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass::FamilyStatus::TaggedSymbol + ) + end + attr_accessor :family_status + + # - `Unspecified` - Unspecified + # - `State` - State + sig do + returns( + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass::Location::TaggedSymbol + ) + end + attr_accessor :location + + # Location matcher value (CSV of state codes), or null. + sig { returns(T.nilable(String)) } + attr_accessor :location_value + + # Age-band upper bound, or null. + sig { returns(T.nilable(Integer)) } + attr_accessor :max_age + + # Age-band lower bound, or null. + sig { returns(T.nilable(Integer)) } + attr_accessor :min_age + + # One ICHRA contribution class, mirroring the internal configuration endpoint's + # `IchraContributionClassConfigurationEntitySerializer` field-for-field. Two + # deliberate differences for the public surface: the identifier is the opaque + # prefixed `iccl_*` form rather than a raw UUID, and the matcher choices come from + # the domain enums rather than the model's. + sig do + params( + amount_in_cents: Integer, + compensation: + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass::Compensation::OrSymbol, + contribution_class_id: String, + employment: + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass::Employment::OrSymbol, + family_status: + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass::FamilyStatus::OrSymbol, + location: + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass::Location::OrSymbol, + location_value: T.nilable(String), + max_age: T.nilable(Integer), + min_age: T.nilable(Integer) + ).returns(T.attached_class) + end + def self.new( + # Monthly allowance in cents. + amount_in_cents:, + # - `Unspecified` - Unspecified + # - `Salary` - Salary + # - `Hourly` - Hourly + compensation:, + # Prefixed contribution-class identifier (`iccl_*`). + contribution_class_id:, + # - `Unspecified` - Unspecified + # - `Full Time` - Full Time + # - `Part Time` - Part Time + # - `Temporary` - Temporary + # - `Seasonal` - Seasonal + employment:, + # - `Unspecified` - Unspecified + # - `EE` - EE + # - `ES` - ES + # - `EC` - EC + # - `EF` - EF + family_status:, + # - `Unspecified` - Unspecified + # - `State` - State + location:, + # Location matcher value (CSV of state codes), or null. + location_value:, + # Age-band upper bound, or null. + max_age:, + # Age-band lower bound, or null. + min_age: + ) + end + + sig do + override.returns( + { + amount_in_cents: Integer, + compensation: + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass::Compensation::TaggedSymbol, + contribution_class_id: String, + employment: + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass::Employment::TaggedSymbol, + family_status: + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass::FamilyStatus::TaggedSymbol, + location: + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass::Location::TaggedSymbol, + location_value: T.nilable(String), + max_age: T.nilable(Integer), + min_age: T.nilable(Integer) + } + ) + end + def to_hash + end + + # - `Unspecified` - Unspecified + # - `Salary` - Salary + # - `Hourly` - Hourly + module Compensation + extend VitableConnect::Internal::Type::Enum + + TaggedSymbol = + T.type_alias do + T.all( + Symbol, + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass::Compensation + ) + end + OrSymbol = T.type_alias { T.any(Symbol, String) } + + UNSPECIFIED = + T.let( + :Unspecified, + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass::Compensation::TaggedSymbol + ) + SALARY = + T.let( + :Salary, + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass::Compensation::TaggedSymbol + ) + HOURLY = + T.let( + :Hourly, + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass::Compensation::TaggedSymbol + ) + + sig do + override.returns( + T::Array[ + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass::Compensation::TaggedSymbol + ] + ) + end + def self.values + end + end + + # - `Unspecified` - Unspecified + # - `Full Time` - Full Time + # - `Part Time` - Part Time + # - `Temporary` - Temporary + # - `Seasonal` - Seasonal + module Employment + extend VitableConnect::Internal::Type::Enum + + TaggedSymbol = + T.type_alias do + T.all( + Symbol, + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass::Employment + ) + end + OrSymbol = T.type_alias { T.any(Symbol, String) } + + UNSPECIFIED = + T.let( + :Unspecified, + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass::Employment::TaggedSymbol + ) + FULL_TIME = + T.let( + :"Full Time", + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass::Employment::TaggedSymbol + ) + PART_TIME = + T.let( + :"Part Time", + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass::Employment::TaggedSymbol + ) + TEMPORARY = + T.let( + :Temporary, + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass::Employment::TaggedSymbol + ) + SEASONAL = + T.let( + :Seasonal, + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass::Employment::TaggedSymbol + ) + + sig do + override.returns( + T::Array[ + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass::Employment::TaggedSymbol + ] + ) + end + def self.values + end + end + + # - `Unspecified` - Unspecified + # - `EE` - EE + # - `ES` - ES + # - `EC` - EC + # - `EF` - EF + module FamilyStatus + extend VitableConnect::Internal::Type::Enum + + TaggedSymbol = + T.type_alias do + T.all( + Symbol, + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass::FamilyStatus + ) + end + OrSymbol = T.type_alias { T.any(Symbol, String) } + + UNSPECIFIED = + T.let( + :Unspecified, + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass::FamilyStatus::TaggedSymbol + ) + EE = + T.let( + :EE, + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass::FamilyStatus::TaggedSymbol + ) + ES = + T.let( + :ES, + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass::FamilyStatus::TaggedSymbol + ) + EC = + T.let( + :EC, + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass::FamilyStatus::TaggedSymbol + ) + EF = + T.let( + :EF, + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass::FamilyStatus::TaggedSymbol + ) + + sig do + override.returns( + T::Array[ + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass::FamilyStatus::TaggedSymbol + ] + ) + end + def self.values + end + end + + # - `Unspecified` - Unspecified + # - `State` - State + module Location + extend VitableConnect::Internal::Type::Enum + + TaggedSymbol = + T.type_alias do + T.all( + Symbol, + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass::Location + ) + end + OrSymbol = T.type_alias { T.any(Symbol, String) } + + UNSPECIFIED = + T.let( + :Unspecified, + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass::Location::TaggedSymbol + ) + STATE = + T.let( + :State, + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass::Location::TaggedSymbol + ) + + sig do + override.returns( + T::Array[ + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass::Location::TaggedSymbol + ] + ) + end + def self.values + end + end + end + end + + class EligibilityPolicy < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy, + VitableConnect::Internal::AnyHash + ) + end + + # Eligibility rules; never empty for a valid policy. + sig do + returns( + T::Array[ + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::Rule + ] + ) + end + attr_accessor :rules + + # Months of continued coverage; set only when `termination_rule` is + # `END_OF_N_MONTHS`. + sig { returns(T.nilable(Integer)) } + attr_accessor :termination_n_months + + # - `END_OF_N_MONTHS` - End Of N Months + # - `END_OF_PLAN_YEAR` - End Of Plan Year + sig do + returns( + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::TerminationRule::TaggedSymbol + ) + end + attr_accessor :termination_rule + + # - `FIRST_OF_FOLLOWING_MONTH` - First Of Following Month + # - `THIRTY_DAYS` - Thirty Days + # - `SIXTY_DAYS` - Sixty Days + sig do + returns( + T.nilable( + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::WaitingPeriod::TaggedSymbol + ) + ) + end + attr_accessor :waiting_period + + # The plan year's active eligibility policy. Mirrors the internal + # `PlanYearEligibilityPolicyDTO` but exposes only the public subset (no raw ids, + # `active_in`, or timestamps). + sig do + params( + rules: + T::Array[ + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::Rule::OrHash + ], + termination_n_months: T.nilable(Integer), + termination_rule: + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::TerminationRule::OrSymbol, + waiting_period: + T.nilable( + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::WaitingPeriod::OrSymbol + ) + ).returns(T.attached_class) + end + def self.new( + # Eligibility rules; never empty for a valid policy. + rules:, + # Months of continued coverage; set only when `termination_rule` is + # `END_OF_N_MONTHS`. + termination_n_months:, + # - `END_OF_N_MONTHS` - End Of N Months + # - `END_OF_PLAN_YEAR` - End Of Plan Year + termination_rule:, + # - `FIRST_OF_FOLLOWING_MONTH` - First Of Following Month + # - `THIRTY_DAYS` - Thirty Days + # - `SIXTY_DAYS` - Sixty Days + waiting_period: + ) + end + + sig do + override.returns( + { + rules: + T::Array[ + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::Rule + ], + termination_n_months: T.nilable(Integer), + termination_rule: + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::TerminationRule::TaggedSymbol, + waiting_period: + T.nilable( + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::WaitingPeriod::TaggedSymbol + ) + } + ) + end + def to_hash + end + + class Rule < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::Rule, + VitableConnect::Internal::AnyHash + ) + end + + # - `Salary` - Salary + # - `Hourly` - Hourly + # - `All` - All + sig do + returns( + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::Rule::CompensationType::TaggedSymbol + ) + end + attr_accessor :compensation_type + + # Geographic matcher. + sig do + returns( + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::Rule::EligibleGeographicalLocation + ) + end + attr_reader :eligible_geographical_location + + sig do + params( + eligible_geographical_location: + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::Rule::EligibleGeographicalLocation::OrHash + ).void + end + attr_writer :eligible_geographical_location + + # - `Full Time` - Full Time + # - `Part Time` - Part Time + # - `Temporary` - Temporary + # - `Intern` - Intern + # - `Seasonal` - Seasonal + # - `Individual Contractor` - Individual Contractor + # - `All` - All + sig do + returns( + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::Rule::EmployeeClass::TaggedSymbol + ) + end + attr_accessor :employee_class + + # One eligibility rule — the workforce slice it makes eligible. Mirrors the + # internal `PlanYearEligibilityPolicyRuleDTO` minus the raw ids and timestamps. + sig do + params( + compensation_type: + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::Rule::CompensationType::OrSymbol, + eligible_geographical_location: + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::Rule::EligibleGeographicalLocation::OrHash, + employee_class: + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::Rule::EmployeeClass::OrSymbol + ).returns(T.attached_class) + end + def self.new( + # - `Salary` - Salary + # - `Hourly` - Hourly + # - `All` - All + compensation_type:, + # Geographic matcher. + eligible_geographical_location:, + # - `Full Time` - Full Time + # - `Part Time` - Part Time + # - `Temporary` - Temporary + # - `Intern` - Intern + # - `Seasonal` - Seasonal + # - `Individual Contractor` - Individual Contractor + # - `All` - All + employee_class: + ) + end + + sig do + override.returns( + { + compensation_type: + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::Rule::CompensationType::TaggedSymbol, + eligible_geographical_location: + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::Rule::EligibleGeographicalLocation, + employee_class: + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::Rule::EmployeeClass::TaggedSymbol + } + ) + end + def to_hash + end + + # - `Salary` - Salary + # - `Hourly` - Hourly + # - `All` - All + module CompensationType + extend VitableConnect::Internal::Type::Enum + + TaggedSymbol = + T.type_alias do + T.all( + Symbol, + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::Rule::CompensationType + ) + end + OrSymbol = T.type_alias { T.any(Symbol, String) } + + SALARY = + T.let( + :Salary, + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::Rule::CompensationType::TaggedSymbol + ) + HOURLY = + T.let( + :Hourly, + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::Rule::CompensationType::TaggedSymbol + ) + ALL = + T.let( + :All, + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::Rule::CompensationType::TaggedSymbol + ) + + sig do + override.returns( + T::Array[ + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::Rule::CompensationType::TaggedSymbol + ] + ) + end + def self.values + end + end + + class EligibleGeographicalLocation < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::Rule::EligibleGeographicalLocation, + VitableConnect::Internal::AnyHash + ) + end + + # States the rule is restricted to; empty when `type` is `All`. + sig { returns(T::Array[String]) } + attr_accessor :state_codes + + # - `All` - All + # - `StateCodes` - State Codes + sig do + returns( + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::Rule::EligibleGeographicalLocation::Type::TaggedSymbol + ) + end + attr_accessor :type + + # Geographic matcher. + sig do + params( + state_codes: T::Array[String], + type: + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::Rule::EligibleGeographicalLocation::Type::OrSymbol + ).returns(T.attached_class) + end + def self.new( + # States the rule is restricted to; empty when `type` is `All`. + state_codes:, + # - `All` - All + # - `StateCodes` - State Codes + type: + ) + end + + sig do + override.returns( + { + state_codes: T::Array[String], + type: + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::Rule::EligibleGeographicalLocation::Type::TaggedSymbol + } + ) + end + def to_hash + end + + # - `All` - All + # - `StateCodes` - State Codes + module Type + extend VitableConnect::Internal::Type::Enum + + TaggedSymbol = + T.type_alias do + T.all( + Symbol, + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::Rule::EligibleGeographicalLocation::Type + ) + end + OrSymbol = T.type_alias { T.any(Symbol, String) } + + ALL = + T.let( + :All, + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::Rule::EligibleGeographicalLocation::Type::TaggedSymbol + ) + STATE_CODES = + T.let( + :StateCodes, + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::Rule::EligibleGeographicalLocation::Type::TaggedSymbol + ) + + sig do + override.returns( + T::Array[ + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::Rule::EligibleGeographicalLocation::Type::TaggedSymbol + ] + ) + end + def self.values + end + end + end + + # - `Full Time` - Full Time + # - `Part Time` - Part Time + # - `Temporary` - Temporary + # - `Intern` - Intern + # - `Seasonal` - Seasonal + # - `Individual Contractor` - Individual Contractor + # - `All` - All + module EmployeeClass + extend VitableConnect::Internal::Type::Enum + + TaggedSymbol = + T.type_alias do + T.all( + Symbol, + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::Rule::EmployeeClass + ) + end + OrSymbol = T.type_alias { T.any(Symbol, String) } + + FULL_TIME = + T.let( + :"Full Time", + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::Rule::EmployeeClass::TaggedSymbol + ) + PART_TIME = + T.let( + :"Part Time", + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::Rule::EmployeeClass::TaggedSymbol + ) + TEMPORARY = + T.let( + :Temporary, + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::Rule::EmployeeClass::TaggedSymbol + ) + INTERN = + T.let( + :Intern, + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::Rule::EmployeeClass::TaggedSymbol + ) + SEASONAL = + T.let( + :Seasonal, + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::Rule::EmployeeClass::TaggedSymbol + ) + INDIVIDUAL_CONTRACTOR = + T.let( + :"Individual Contractor", + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::Rule::EmployeeClass::TaggedSymbol + ) + ALL = + T.let( + :All, + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::Rule::EmployeeClass::TaggedSymbol + ) + + sig do + override.returns( + T::Array[ + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::Rule::EmployeeClass::TaggedSymbol + ] + ) + end + def self.values + end + end + end + + # - `END_OF_N_MONTHS` - End Of N Months + # - `END_OF_PLAN_YEAR` - End Of Plan Year + module TerminationRule + extend VitableConnect::Internal::Type::Enum + + TaggedSymbol = + T.type_alias do + T.all( + Symbol, + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::TerminationRule + ) + end + OrSymbol = T.type_alias { T.any(Symbol, String) } + + END_OF_N_MONTHS = + T.let( + :END_OF_N_MONTHS, + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::TerminationRule::TaggedSymbol + ) + END_OF_PLAN_YEAR = + T.let( + :END_OF_PLAN_YEAR, + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::TerminationRule::TaggedSymbol + ) + + sig do + override.returns( + T::Array[ + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::TerminationRule::TaggedSymbol + ] + ) + end + def self.values + end + end + + # - `FIRST_OF_FOLLOWING_MONTH` - First Of Following Month + # - `THIRTY_DAYS` - Thirty Days + # - `SIXTY_DAYS` - Sixty Days + module WaitingPeriod + extend VitableConnect::Internal::Type::Enum + + TaggedSymbol = + T.type_alias do + T.all( + Symbol, + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::WaitingPeriod + ) + end + OrSymbol = T.type_alias { T.any(Symbol, String) } + + FIRST_OF_FOLLOWING_MONTH = + T.let( + :FIRST_OF_FOLLOWING_MONTH, + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::WaitingPeriod::TaggedSymbol + ) + THIRTY_DAYS = + T.let( + :THIRTY_DAYS, + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::WaitingPeriod::TaggedSymbol + ) + SIXTY_DAYS = + T.let( + :SIXTY_DAYS, + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::WaitingPeriod::TaggedSymbol + ) + + sig do + override.returns( + T::Array[ + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::WaitingPeriod::TaggedSymbol + ] + ) + end + def self.values + end + end + end + + class EmployeeContribution < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EmployeeContribution, + VitableConnect::Internal::AnyHash + ) + end + + # Highest per-tier contribution in cents. + sig { returns(Integer) } + attr_accessor :max_cents + + # Lowest per-tier contribution in cents. + sig { returns(Integer) } + attr_accessor :min_cents + + # Employee contribution range. + sig do + params(max_cents: Integer, min_cents: Integer).returns( + T.attached_class + ) + end + def self.new( + # Highest per-tier contribution in cents. + max_cents:, + # Lowest per-tier contribution in cents. + min_cents: + ) + end + + sig { override.returns({ max_cents: Integer, min_cents: Integer }) } + def to_hash + end + end + + class EmployerContribution < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EmployerContribution, + VitableConnect::Internal::AnyHash + ) + end + + # Highest per-tier contribution in cents. + sig { returns(Integer) } + attr_accessor :max_cents + + # Lowest per-tier contribution in cents. + sig { returns(Integer) } + attr_accessor :min_cents + + # Employer contribution range. + sig do + params(max_cents: Integer, min_cents: Integer).returns( + T.attached_class + ) + end + def self.new( + # Highest per-tier contribution in cents. + max_cents:, + # Lowest per-tier contribution in cents. + min_cents: + ) + end + + sig { override.returns({ max_cents: Integer, min_cents: Integer }) } + def to_hash + end + end + + class EnrollmentRate < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EnrollmentRate, + VitableConnect::Internal::AnyHash + ) + end + + # Employees eligible for this plan year. + sig { returns(Integer) } + attr_accessor :eligible + + # Employees enrolled in this plan year. + sig { returns(Integer) } + attr_accessor :enrolled + + # `enrolled / eligible` whole-number percent (0 when none). + sig { returns(Integer) } + attr_accessor :percentage + + # Enrolled/eligible rate for this plan year. + sig do + params( + eligible: Integer, + enrolled: Integer, + percentage: Integer + ).returns(T.attached_class) + end + def self.new( + # Employees eligible for this plan year. + eligible:, + # Employees enrolled in this plan year. + enrolled:, + # `enrolled / eligible` whole-number percent (0 when none). + percentage: + ) + end + + sig do + override.returns( + { eligible: Integer, enrolled: Integer, percentage: Integer } + ) + end + def to_hash + end + end + + # - `mec` - Mec + # - `mvp` - Mvp + # - `ichra` - Ichra + # - `vpc` - Vpc + # - `dental` - Dental + # - `vision` - Vision + module Family + extend VitableConnect::Internal::Type::Enum + + TaggedSymbol = + T.type_alias do + T.all( + Symbol, + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::Family + ) + end + OrSymbol = T.type_alias { T.any(Symbol, String) } + + MEC = + T.let( + :mec, + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::Family::TaggedSymbol + ) + MVP = + T.let( + :mvp, + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::Family::TaggedSymbol + ) + ICHRA = + T.let( + :ichra, + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::Family::TaggedSymbol + ) + VPC = + T.let( + :vpc, + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::Family::TaggedSymbol + ) + DENTAL = + T.let( + :dental, + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::Family::TaggedSymbol + ) + VISION = + T.let( + :vision, + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::Family::TaggedSymbol + ) + + sig do + override.returns( + T::Array[ + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::Family::TaggedSymbol + ] + ) + end + def self.values + end + end + + # - `active` - Active + # - `upcoming` - Upcoming + # - `open_enrollment` - Open Enrollment + # - `inactive` - Inactive + module Status + extend VitableConnect::Internal::Type::Enum + + TaggedSymbol = + T.type_alias do + T.all( + Symbol, + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::Status + ) + end + OrSymbol = T.type_alias { T.any(Symbol, String) } + + ACTIVE = + T.let( + :active, + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::Status::TaggedSymbol + ) + UPCOMING = + T.let( + :upcoming, + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::Status::TaggedSymbol + ) + OPEN_ENROLLMENT = + T.let( + :open_enrollment, + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::Status::TaggedSymbol + ) + INACTIVE = + T.let( + :inactive, + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::Status::TaggedSymbol + ) + + sig do + override.returns( + T::Array[ + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::Status::TaggedSymbol + ] + ) + end + def self.values + end + end + end + end + end +end diff --git a/rbi/vitable_connect/models/employer_retrieve_hris_params.rbi b/rbi/vitable_connect/models/employer_retrieve_hris_params.rbi new file mode 100644 index 0000000..7488b0d --- /dev/null +++ b/rbi/vitable_connect/models/employer_retrieve_hris_params.rbi @@ -0,0 +1,46 @@ +# typed: strong + +module VitableConnect + module Models + class EmployerRetrieveHRISParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + OrHash = + T.type_alias do + T.any( + VitableConnect::EmployerRetrieveHRISParams, + VitableConnect::Internal::AnyHash + ) + end + + # Unique employer identifier (empr\_\*) + sig { returns(String) } + attr_accessor :employer_id + + sig do + params( + employer_id: String, + request_options: VitableConnect::RequestOptions::OrHash + ).returns(T.attached_class) + end + def self.new( + # Unique employer identifier (empr\_\*) + employer_id:, + request_options: {} + ) + end + + sig do + override.returns( + { + employer_id: String, + request_options: VitableConnect::RequestOptions + } + ) + end + def to_hash + end + end + end +end diff --git a/rbi/vitable_connect/models/employer_retrieve_hris_response.rbi b/rbi/vitable_connect/models/employer_retrieve_hris_response.rbi new file mode 100644 index 0000000..be915b2 --- /dev/null +++ b/rbi/vitable_connect/models/employer_retrieve_hris_response.rbi @@ -0,0 +1,171 @@ +# typed: strong + +module VitableConnect + module Models + class EmployerRetrieveHRISResponse < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::EmployerRetrieveHRISResponse, + VitableConnect::Internal::AnyHash + ) + end + + sig do + returns(VitableConnect::Models::EmployerRetrieveHRISResponse::Data) + end + attr_reader :data + + sig do + params( + data: + VitableConnect::Models::EmployerRetrieveHRISResponse::Data::OrHash + ).void + end + attr_writer :data + + # Response containing a single employer hris resource. + sig do + params( + data: + VitableConnect::Models::EmployerRetrieveHRISResponse::Data::OrHash + ).returns(T.attached_class) + end + def self.new(data:) + end + + sig do + override.returns( + { data: VitableConnect::Models::EmployerRetrieveHRISResponse::Data } + ) + end + def to_hash + end + + class Data < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::EmployerRetrieveHRISResponse::Data, + VitableConnect::Internal::AnyHash + ) + end + + # HRIS connection details, or null when the employer has no integration. + sig do + returns( + T.nilable( + VitableConnect::Models::EmployerRetrieveHRISResponse::Data::HRIS + ) + ) + end + attr_reader :hris + + sig do + params( + hris: + T.nilable( + VitableConnect::Models::EmployerRetrieveHRISResponse::Data::HRIS::OrHash + ) + ).void + end + attr_writer :hris + + sig do + params( + hris: + T.nilable( + VitableConnect::Models::EmployerRetrieveHRISResponse::Data::HRIS::OrHash + ) + ).returns(T.attached_class) + end + def self.new( + # HRIS connection details, or null when the employer has no integration. + hris: + ) + end + + sig do + override.returns( + { + hris: + T.nilable( + VitableConnect::Models::EmployerRetrieveHRISResponse::Data::HRIS + ) + } + ) + end + def to_hash + end + + class HRIS < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::EmployerRetrieveHRISResponse::Data::HRIS, + VitableConnect::Internal::AnyHash + ) + end + + # When the last sync completed, or null when none has. + sig { returns(T.nilable(Time)) } + attr_accessor :last_sync_on + + # Id of the HRIS/payroll provider the employer is connected to (e.g. `paylocity`). + sig { returns(String) } + attr_accessor :provider + + # Display name of that provider (e.g. `Paylocity`). + sig { returns(String) } + attr_accessor :provider_label + + # Connection status reported by the integration. + sig { returns(String) } + attr_accessor :status + + # Rows in the latest completed sync, or null when none has. + sig { returns(T.nilable(Integer)) } + attr_accessor :synced_row_count + + # HRIS connection details, or null when the employer has no integration. + sig do + params( + last_sync_on: T.nilable(Time), + provider: String, + provider_label: String, + status: String, + synced_row_count: T.nilable(Integer) + ).returns(T.attached_class) + end + def self.new( + # When the last sync completed, or null when none has. + last_sync_on:, + # Id of the HRIS/payroll provider the employer is connected to (e.g. `paylocity`). + provider:, + # Display name of that provider (e.g. `Paylocity`). + provider_label:, + # Connection status reported by the integration. + status:, + # Rows in the latest completed sync, or null when none has. + synced_row_count: + ) + end + + sig do + override.returns( + { + last_sync_on: T.nilable(Time), + provider: String, + provider_label: String, + status: String, + synced_row_count: T.nilable(Integer) + } + ) + end + def to_hash + end + end + end + end + end +end diff --git a/rbi/vitable_connect/models/employer_retrieve_invoice_pdf_params.rbi b/rbi/vitable_connect/models/employer_retrieve_invoice_pdf_params.rbi new file mode 100644 index 0000000..6de211e --- /dev/null +++ b/rbi/vitable_connect/models/employer_retrieve_invoice_pdf_params.rbi @@ -0,0 +1,54 @@ +# typed: strong + +module VitableConnect + module Models + class EmployerRetrieveInvoicePdfParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + OrHash = + T.type_alias do + T.any( + VitableConnect::EmployerRetrieveInvoicePdfParams, + VitableConnect::Internal::AnyHash + ) + end + + # Unique employer identifier (empr\_\*) + sig { returns(String) } + attr_accessor :employer_id + + # External Chargebee invoice id (not a prefixed UUID). + sig { returns(String) } + attr_accessor :invoice_id + + sig do + params( + employer_id: String, + invoice_id: String, + request_options: VitableConnect::RequestOptions::OrHash + ).returns(T.attached_class) + end + def self.new( + # Unique employer identifier (empr\_\*) + employer_id:, + # External Chargebee invoice id (not a prefixed UUID). + invoice_id:, + request_options: {} + ) + end + + sig do + override.returns( + { + employer_id: String, + invoice_id: String, + request_options: VitableConnect::RequestOptions + } + ) + end + def to_hash + end + end + end +end diff --git a/rbi/vitable_connect/models/employer_retrieve_invoice_pdf_response.rbi b/rbi/vitable_connect/models/employer_retrieve_invoice_pdf_response.rbi new file mode 100644 index 0000000..5bfd864 --- /dev/null +++ b/rbi/vitable_connect/models/employer_retrieve_invoice_pdf_response.rbi @@ -0,0 +1,76 @@ +# typed: strong + +module VitableConnect + module Models + class EmployerRetrieveInvoicePdfResponse < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::EmployerRetrieveInvoicePdfResponse, + VitableConnect::Internal::AnyHash + ) + end + + sig do + returns( + VitableConnect::Models::EmployerRetrieveInvoicePdfResponse::Data + ) + end + attr_reader :data + + sig do + params( + data: + VitableConnect::Models::EmployerRetrieveInvoicePdfResponse::Data::OrHash + ).void + end + attr_writer :data + + # Response containing a single employer invoice pdf resource. + sig do + params( + data: + VitableConnect::Models::EmployerRetrieveInvoicePdfResponse::Data::OrHash + ).returns(T.attached_class) + end + def self.new(data:) + end + + sig do + override.returns( + { + data: + VitableConnect::Models::EmployerRetrieveInvoicePdfResponse::Data + } + ) + end + def to_hash + end + + class Data < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::EmployerRetrieveInvoicePdfResponse::Data, + VitableConnect::Internal::AnyHash + ) + end + + # Time-limited Chargebee PDF download link for the invoice. + sig { returns(String) } + attr_accessor :download_url + + sig { params(download_url: String).returns(T.attached_class) } + def self.new( + # Time-limited Chargebee PDF download link for the invoice. + download_url: + ) + end + + sig { override.returns({ download_url: String }) } + def to_hash + end + end + end + end +end diff --git a/rbi/vitable_connect/models/employer_retrieve_params.rbi b/rbi/vitable_connect/models/employer_retrieve_params.rbi new file mode 100644 index 0000000..86b5b17 --- /dev/null +++ b/rbi/vitable_connect/models/employer_retrieve_params.rbi @@ -0,0 +1,46 @@ +# typed: strong + +module VitableConnect + module Models + class EmployerRetrieveParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + OrHash = + T.type_alias do + T.any( + VitableConnect::EmployerRetrieveParams, + VitableConnect::Internal::AnyHash + ) + end + + # Unique employer identifier (empr\_\*) + sig { returns(String) } + attr_accessor :employer_id + + sig do + params( + employer_id: String, + request_options: VitableConnect::RequestOptions::OrHash + ).returns(T.attached_class) + end + def self.new( + # Unique employer identifier (empr\_\*) + employer_id:, + request_options: {} + ) + end + + sig do + override.returns( + { + employer_id: String, + request_options: VitableConnect::RequestOptions + } + ) + end + def to_hash + end + end + end +end diff --git a/rbi/vitable_connect/models/employer_retrieve_payroll_access_setup_params.rbi b/rbi/vitable_connect/models/employer_retrieve_payroll_access_setup_params.rbi new file mode 100644 index 0000000..96b58b3 --- /dev/null +++ b/rbi/vitable_connect/models/employer_retrieve_payroll_access_setup_params.rbi @@ -0,0 +1,46 @@ +# typed: strong + +module VitableConnect + module Models + class EmployerRetrievePayrollAccessSetupParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + OrHash = + T.type_alias do + T.any( + VitableConnect::EmployerRetrievePayrollAccessSetupParams, + VitableConnect::Internal::AnyHash + ) + end + + # Unique employer identifier (empr\_\*) + sig { returns(String) } + attr_accessor :employer_id + + sig do + params( + employer_id: String, + request_options: VitableConnect::RequestOptions::OrHash + ).returns(T.attached_class) + end + def self.new( + # Unique employer identifier (empr\_\*) + employer_id:, + request_options: {} + ) + end + + sig do + override.returns( + { + employer_id: String, + request_options: VitableConnect::RequestOptions + } + ) + end + def to_hash + end + end + end +end diff --git a/rbi/vitable_connect/models/employer_retrieve_payroll_access_setup_response.rbi b/rbi/vitable_connect/models/employer_retrieve_payroll_access_setup_response.rbi new file mode 100644 index 0000000..4809505 --- /dev/null +++ b/rbi/vitable_connect/models/employer_retrieve_payroll_access_setup_response.rbi @@ -0,0 +1,83 @@ +# typed: strong + +module VitableConnect + module Models + class EmployerRetrievePayrollAccessSetupResponse < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::EmployerRetrievePayrollAccessSetupResponse, + VitableConnect::Internal::AnyHash + ) + end + + sig do + returns( + VitableConnect::Models::EmployerRetrievePayrollAccessSetupResponse::Data + ) + end + attr_reader :data + + sig do + params( + data: + VitableConnect::Models::EmployerRetrievePayrollAccessSetupResponse::Data::OrHash + ).void + end + attr_writer :data + + # Response containing a single payroll access setup status resource. + sig do + params( + data: + VitableConnect::Models::EmployerRetrievePayrollAccessSetupResponse::Data::OrHash + ).returns(T.attached_class) + end + def self.new(data:) + end + + sig do + override.returns( + { + data: + VitableConnect::Models::EmployerRetrievePayrollAccessSetupResponse::Data + } + ) + end + def to_hash + end + + class Data < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::EmployerRetrievePayrollAccessSetupResponse::Data, + VitableConnect::Internal::AnyHash + ) + end + + sig { returns(T::Boolean) } + attr_accessor :completed + + sig { returns(T.nilable(Time)) } + attr_accessor :submitted_at + + sig do + params(completed: T::Boolean, submitted_at: T.nilable(Time)).returns( + T.attached_class + ) + end + def self.new(completed:, submitted_at:) + end + + sig do + override.returns( + { completed: T::Boolean, submitted_at: T.nilable(Time) } + ) + end + def to_hash + end + end + end + end +end diff --git a/rbi/vitable_connect/models/employer_submit_census_sync_params.rbi b/rbi/vitable_connect/models/employer_submit_census_sync_params.rbi new file mode 100644 index 0000000..9889b71 --- /dev/null +++ b/rbi/vitable_connect/models/employer_submit_census_sync_params.rbi @@ -0,0 +1,821 @@ +# typed: strong + +module VitableConnect + module Models + class EmployerSubmitCensusSyncParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + OrHash = + T.type_alias do + T.any( + VitableConnect::EmployerSubmitCensusSyncParams, + VitableConnect::Internal::AnyHash + ) + end + + # Unique employer identifier (empr\_\*) + sig { returns(String) } + attr_accessor :employer_id + + sig do + returns( + T::Array[VitableConnect::EmployerSubmitCensusSyncParams::Employee] + ) + end + attr_accessor :employees + + sig do + params( + employer_id: String, + employees: + T::Array[ + VitableConnect::EmployerSubmitCensusSyncParams::Employee::OrHash + ], + request_options: VitableConnect::RequestOptions::OrHash + ).returns(T.attached_class) + end + def self.new( + # Unique employer identifier (empr\_\*) + employer_id:, + employees:, + request_options: {} + ) + end + + sig do + override.returns( + { + employer_id: String, + employees: + T::Array[ + VitableConnect::EmployerSubmitCensusSyncParams::Employee + ], + request_options: VitableConnect::RequestOptions + } + ) + end + def to_hash + end + + class Employee < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::EmployerSubmitCensusSyncParams::Employee, + VitableConnect::Internal::AnyHash + ) + end + + sig { returns(Date) } + attr_accessor :date_of_birth + + sig { returns(String) } + attr_accessor :email + + sig { returns(String) } + attr_accessor :first_name + + sig { returns(String) } + attr_accessor :last_name + + sig do + returns( + T.nilable( + VitableConnect::EmployerSubmitCensusSyncParams::Employee::Address + ) + ) + end + attr_reader :address + + sig do + params( + address: + T.nilable( + VitableConnect::EmployerSubmitCensusSyncParams::Employee::Address::OrHash + ) + ).void + end + attr_writer :address + + # - `Salary` - Salary + # - `Hourly` - Hourly + sig do + returns( + T.nilable( + VitableConnect::EmployerSubmitCensusSyncParams::Employee::CompensationType::OrSymbol + ) + ) + end + attr_accessor :compensation_type + + # - `Full Time` - Full Time + # - `Part Time` - Part Time + # - `Temporary` - Temporary + # - `Intern` - Intern + # - `Seasonal` - Seasonal + # - `Individual Contractor` - Individual Contractor + sig { returns(T.nilable(VitableConnect::EmployeeClass::OrSymbol)) } + attr_accessor :employee_class + + # Phone number + sig { returns(T.nilable(String)) } + attr_accessor :phone + + sig { returns(T.nilable(String)) } + attr_accessor :reference_id + + sig { returns(T.nilable(Date)) } + attr_accessor :start_date + + sig do + params( + date_of_birth: Date, + email: String, + first_name: String, + last_name: String, + address: + T.nilable( + VitableConnect::EmployerSubmitCensusSyncParams::Employee::Address::OrHash + ), + compensation_type: + T.nilable( + VitableConnect::EmployerSubmitCensusSyncParams::Employee::CompensationType::OrSymbol + ), + employee_class: T.nilable(VitableConnect::EmployeeClass::OrSymbol), + phone: T.nilable(String), + reference_id: T.nilable(String), + start_date: T.nilable(Date) + ).returns(T.attached_class) + end + def self.new( + date_of_birth:, + email:, + first_name:, + last_name:, + address: nil, + # - `Salary` - Salary + # - `Hourly` - Hourly + compensation_type: nil, + # - `Full Time` - Full Time + # - `Part Time` - Part Time + # - `Temporary` - Temporary + # - `Intern` - Intern + # - `Seasonal` - Seasonal + # - `Individual Contractor` - Individual Contractor + employee_class: nil, + # Phone number + phone: nil, + reference_id: nil, + start_date: nil + ) + end + + sig do + override.returns( + { + date_of_birth: Date, + email: String, + first_name: String, + last_name: String, + address: + T.nilable( + VitableConnect::EmployerSubmitCensusSyncParams::Employee::Address + ), + compensation_type: + T.nilable( + VitableConnect::EmployerSubmitCensusSyncParams::Employee::CompensationType::OrSymbol + ), + employee_class: + T.nilable(VitableConnect::EmployeeClass::OrSymbol), + phone: T.nilable(String), + reference_id: T.nilable(String), + start_date: T.nilable(Date) + } + ) + end + def to_hash + end + + class Address < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::EmployerSubmitCensusSyncParams::Employee::Address, + VitableConnect::Internal::AnyHash + ) + end + + sig { returns(String) } + attr_accessor :address_line_1 + + sig { returns(String) } + attr_accessor :city + + # - `AL` - AL + # - `AK` - AK + # - `AZ` - AZ + # - `AR` - AR + # - `CA` - CA + # - `CO` - CO + # - `CT` - CT + # - `DC` - DC + # - `DE` - DE + # - `FL` - FL + # - `GA` - GA + # - `HI` - HI + # - `ID` - ID + # - `IL` - IL + # - `IN` - IN + # - `IA` - IA + # - `KS` - KS + # - `KY` - KY + # - `LA` - LA + # - `ME` - ME + # - `MD` - MD + # - `MA` - MA + # - `MI` - MI + # - `MN` - MN + # - `MS` - MS + # - `MO` - MO + # - `MT` - MT + # - `NE` - NE + # - `NV` - NV + # - `NH` - NH + # - `NJ` - NJ + # - `NM` - NM + # - `NY` - NY + # - `NC` - NC + # - `ND` - ND + # - `OH` - OH + # - `OK` - OK + # - `OR` - OR + # - `PA` - PA + # - `RI` - RI + # - `SC` - SC + # - `SD` - SD + # - `TN` - TN + # - `TX` - TX + # - `UT` - UT + # - `VT` - VT + # - `VA` - VA + # - `WA` - WA + # - `WI` - WI + # - `WV` - WV + # - `WY` - WY + # - `PR` - PR + # - `GU` - GU + # - `AS` - AS + # - `VI` - VI + # - `MP` - MP + # - `MH` - MH + # - `PW` - PW + # - `FM` - FM + # - `AE` - AE + # - `AA` - AA + # - `AP` - AP + sig do + returns( + VitableConnect::EmployerSubmitCensusSyncParams::Employee::Address::State::OrSymbol + ) + end + attr_accessor :state + + sig { returns(String) } + attr_accessor :zipcode + + sig { returns(T.nilable(String)) } + attr_accessor :address_line_2 + + sig do + params( + address_line_1: String, + city: String, + state: + VitableConnect::EmployerSubmitCensusSyncParams::Employee::Address::State::OrSymbol, + zipcode: String, + address_line_2: T.nilable(String) + ).returns(T.attached_class) + end + def self.new( + address_line_1:, + city:, + # - `AL` - AL + # - `AK` - AK + # - `AZ` - AZ + # - `AR` - AR + # - `CA` - CA + # - `CO` - CO + # - `CT` - CT + # - `DC` - DC + # - `DE` - DE + # - `FL` - FL + # - `GA` - GA + # - `HI` - HI + # - `ID` - ID + # - `IL` - IL + # - `IN` - IN + # - `IA` - IA + # - `KS` - KS + # - `KY` - KY + # - `LA` - LA + # - `ME` - ME + # - `MD` - MD + # - `MA` - MA + # - `MI` - MI + # - `MN` - MN + # - `MS` - MS + # - `MO` - MO + # - `MT` - MT + # - `NE` - NE + # - `NV` - NV + # - `NH` - NH + # - `NJ` - NJ + # - `NM` - NM + # - `NY` - NY + # - `NC` - NC + # - `ND` - ND + # - `OH` - OH + # - `OK` - OK + # - `OR` - OR + # - `PA` - PA + # - `RI` - RI + # - `SC` - SC + # - `SD` - SD + # - `TN` - TN + # - `TX` - TX + # - `UT` - UT + # - `VT` - VT + # - `VA` - VA + # - `WA` - WA + # - `WI` - WI + # - `WV` - WV + # - `WY` - WY + # - `PR` - PR + # - `GU` - GU + # - `AS` - AS + # - `VI` - VI + # - `MP` - MP + # - `MH` - MH + # - `PW` - PW + # - `FM` - FM + # - `AE` - AE + # - `AA` - AA + # - `AP` - AP + state:, + zipcode:, + address_line_2: nil + ) + end + + sig do + override.returns( + { + address_line_1: String, + city: String, + state: + VitableConnect::EmployerSubmitCensusSyncParams::Employee::Address::State::OrSymbol, + zipcode: String, + address_line_2: T.nilable(String) + } + ) + end + def to_hash + end + + # - `AL` - AL + # - `AK` - AK + # - `AZ` - AZ + # - `AR` - AR + # - `CA` - CA + # - `CO` - CO + # - `CT` - CT + # - `DC` - DC + # - `DE` - DE + # - `FL` - FL + # - `GA` - GA + # - `HI` - HI + # - `ID` - ID + # - `IL` - IL + # - `IN` - IN + # - `IA` - IA + # - `KS` - KS + # - `KY` - KY + # - `LA` - LA + # - `ME` - ME + # - `MD` - MD + # - `MA` - MA + # - `MI` - MI + # - `MN` - MN + # - `MS` - MS + # - `MO` - MO + # - `MT` - MT + # - `NE` - NE + # - `NV` - NV + # - `NH` - NH + # - `NJ` - NJ + # - `NM` - NM + # - `NY` - NY + # - `NC` - NC + # - `ND` - ND + # - `OH` - OH + # - `OK` - OK + # - `OR` - OR + # - `PA` - PA + # - `RI` - RI + # - `SC` - SC + # - `SD` - SD + # - `TN` - TN + # - `TX` - TX + # - `UT` - UT + # - `VT` - VT + # - `VA` - VA + # - `WA` - WA + # - `WI` - WI + # - `WV` - WV + # - `WY` - WY + # - `PR` - PR + # - `GU` - GU + # - `AS` - AS + # - `VI` - VI + # - `MP` - MP + # - `MH` - MH + # - `PW` - PW + # - `FM` - FM + # - `AE` - AE + # - `AA` - AA + # - `AP` - AP + module State + extend VitableConnect::Internal::Type::Enum + + TaggedSymbol = + T.type_alias do + T.all( + Symbol, + VitableConnect::EmployerSubmitCensusSyncParams::Employee::Address::State + ) + end + OrSymbol = T.type_alias { T.any(Symbol, String) } + + AL = + T.let( + :AL, + VitableConnect::EmployerSubmitCensusSyncParams::Employee::Address::State::TaggedSymbol + ) + AK = + T.let( + :AK, + VitableConnect::EmployerSubmitCensusSyncParams::Employee::Address::State::TaggedSymbol + ) + AZ = + T.let( + :AZ, + VitableConnect::EmployerSubmitCensusSyncParams::Employee::Address::State::TaggedSymbol + ) + AR = + T.let( + :AR, + VitableConnect::EmployerSubmitCensusSyncParams::Employee::Address::State::TaggedSymbol + ) + CA = + T.let( + :CA, + VitableConnect::EmployerSubmitCensusSyncParams::Employee::Address::State::TaggedSymbol + ) + CO = + T.let( + :CO, + VitableConnect::EmployerSubmitCensusSyncParams::Employee::Address::State::TaggedSymbol + ) + CT = + T.let( + :CT, + VitableConnect::EmployerSubmitCensusSyncParams::Employee::Address::State::TaggedSymbol + ) + DC = + T.let( + :DC, + VitableConnect::EmployerSubmitCensusSyncParams::Employee::Address::State::TaggedSymbol + ) + DE = + T.let( + :DE, + VitableConnect::EmployerSubmitCensusSyncParams::Employee::Address::State::TaggedSymbol + ) + FL = + T.let( + :FL, + VitableConnect::EmployerSubmitCensusSyncParams::Employee::Address::State::TaggedSymbol + ) + GA = + T.let( + :GA, + VitableConnect::EmployerSubmitCensusSyncParams::Employee::Address::State::TaggedSymbol + ) + HI = + T.let( + :HI, + VitableConnect::EmployerSubmitCensusSyncParams::Employee::Address::State::TaggedSymbol + ) + ID = + T.let( + :ID, + VitableConnect::EmployerSubmitCensusSyncParams::Employee::Address::State::TaggedSymbol + ) + IL = + T.let( + :IL, + VitableConnect::EmployerSubmitCensusSyncParams::Employee::Address::State::TaggedSymbol + ) + IN = + T.let( + :IN, + VitableConnect::EmployerSubmitCensusSyncParams::Employee::Address::State::TaggedSymbol + ) + IA = + T.let( + :IA, + VitableConnect::EmployerSubmitCensusSyncParams::Employee::Address::State::TaggedSymbol + ) + KS = + T.let( + :KS, + VitableConnect::EmployerSubmitCensusSyncParams::Employee::Address::State::TaggedSymbol + ) + KY = + T.let( + :KY, + VitableConnect::EmployerSubmitCensusSyncParams::Employee::Address::State::TaggedSymbol + ) + LA = + T.let( + :LA, + VitableConnect::EmployerSubmitCensusSyncParams::Employee::Address::State::TaggedSymbol + ) + ME = + T.let( + :ME, + VitableConnect::EmployerSubmitCensusSyncParams::Employee::Address::State::TaggedSymbol + ) + MD = + T.let( + :MD, + VitableConnect::EmployerSubmitCensusSyncParams::Employee::Address::State::TaggedSymbol + ) + MA = + T.let( + :MA, + VitableConnect::EmployerSubmitCensusSyncParams::Employee::Address::State::TaggedSymbol + ) + MI = + T.let( + :MI, + VitableConnect::EmployerSubmitCensusSyncParams::Employee::Address::State::TaggedSymbol + ) + MN = + T.let( + :MN, + VitableConnect::EmployerSubmitCensusSyncParams::Employee::Address::State::TaggedSymbol + ) + MS = + T.let( + :MS, + VitableConnect::EmployerSubmitCensusSyncParams::Employee::Address::State::TaggedSymbol + ) + MO = + T.let( + :MO, + VitableConnect::EmployerSubmitCensusSyncParams::Employee::Address::State::TaggedSymbol + ) + MT = + T.let( + :MT, + VitableConnect::EmployerSubmitCensusSyncParams::Employee::Address::State::TaggedSymbol + ) + NE = + T.let( + :NE, + VitableConnect::EmployerSubmitCensusSyncParams::Employee::Address::State::TaggedSymbol + ) + NV = + T.let( + :NV, + VitableConnect::EmployerSubmitCensusSyncParams::Employee::Address::State::TaggedSymbol + ) + NH = + T.let( + :NH, + VitableConnect::EmployerSubmitCensusSyncParams::Employee::Address::State::TaggedSymbol + ) + NJ = + T.let( + :NJ, + VitableConnect::EmployerSubmitCensusSyncParams::Employee::Address::State::TaggedSymbol + ) + NM = + T.let( + :NM, + VitableConnect::EmployerSubmitCensusSyncParams::Employee::Address::State::TaggedSymbol + ) + NY = + T.let( + :NY, + VitableConnect::EmployerSubmitCensusSyncParams::Employee::Address::State::TaggedSymbol + ) + NC = + T.let( + :NC, + VitableConnect::EmployerSubmitCensusSyncParams::Employee::Address::State::TaggedSymbol + ) + ND = + T.let( + :ND, + VitableConnect::EmployerSubmitCensusSyncParams::Employee::Address::State::TaggedSymbol + ) + OH = + T.let( + :OH, + VitableConnect::EmployerSubmitCensusSyncParams::Employee::Address::State::TaggedSymbol + ) + OK = + T.let( + :OK, + VitableConnect::EmployerSubmitCensusSyncParams::Employee::Address::State::TaggedSymbol + ) + OR = + T.let( + :OR, + VitableConnect::EmployerSubmitCensusSyncParams::Employee::Address::State::TaggedSymbol + ) + PA = + T.let( + :PA, + VitableConnect::EmployerSubmitCensusSyncParams::Employee::Address::State::TaggedSymbol + ) + RI = + T.let( + :RI, + VitableConnect::EmployerSubmitCensusSyncParams::Employee::Address::State::TaggedSymbol + ) + SC = + T.let( + :SC, + VitableConnect::EmployerSubmitCensusSyncParams::Employee::Address::State::TaggedSymbol + ) + SD = + T.let( + :SD, + VitableConnect::EmployerSubmitCensusSyncParams::Employee::Address::State::TaggedSymbol + ) + TN = + T.let( + :TN, + VitableConnect::EmployerSubmitCensusSyncParams::Employee::Address::State::TaggedSymbol + ) + TX = + T.let( + :TX, + VitableConnect::EmployerSubmitCensusSyncParams::Employee::Address::State::TaggedSymbol + ) + UT = + T.let( + :UT, + VitableConnect::EmployerSubmitCensusSyncParams::Employee::Address::State::TaggedSymbol + ) + VT = + T.let( + :VT, + VitableConnect::EmployerSubmitCensusSyncParams::Employee::Address::State::TaggedSymbol + ) + VA = + T.let( + :VA, + VitableConnect::EmployerSubmitCensusSyncParams::Employee::Address::State::TaggedSymbol + ) + WA = + T.let( + :WA, + VitableConnect::EmployerSubmitCensusSyncParams::Employee::Address::State::TaggedSymbol + ) + WI = + T.let( + :WI, + VitableConnect::EmployerSubmitCensusSyncParams::Employee::Address::State::TaggedSymbol + ) + WV = + T.let( + :WV, + VitableConnect::EmployerSubmitCensusSyncParams::Employee::Address::State::TaggedSymbol + ) + WY = + T.let( + :WY, + VitableConnect::EmployerSubmitCensusSyncParams::Employee::Address::State::TaggedSymbol + ) + PR = + T.let( + :PR, + VitableConnect::EmployerSubmitCensusSyncParams::Employee::Address::State::TaggedSymbol + ) + GU = + T.let( + :GU, + VitableConnect::EmployerSubmitCensusSyncParams::Employee::Address::State::TaggedSymbol + ) + AS = + T.let( + :AS, + VitableConnect::EmployerSubmitCensusSyncParams::Employee::Address::State::TaggedSymbol + ) + VI = + T.let( + :VI, + VitableConnect::EmployerSubmitCensusSyncParams::Employee::Address::State::TaggedSymbol + ) + MP = + T.let( + :MP, + VitableConnect::EmployerSubmitCensusSyncParams::Employee::Address::State::TaggedSymbol + ) + MH = + T.let( + :MH, + VitableConnect::EmployerSubmitCensusSyncParams::Employee::Address::State::TaggedSymbol + ) + PW = + T.let( + :PW, + VitableConnect::EmployerSubmitCensusSyncParams::Employee::Address::State::TaggedSymbol + ) + FM = + T.let( + :FM, + VitableConnect::EmployerSubmitCensusSyncParams::Employee::Address::State::TaggedSymbol + ) + AE = + T.let( + :AE, + VitableConnect::EmployerSubmitCensusSyncParams::Employee::Address::State::TaggedSymbol + ) + AA = + T.let( + :AA, + VitableConnect::EmployerSubmitCensusSyncParams::Employee::Address::State::TaggedSymbol + ) + AP = + T.let( + :AP, + VitableConnect::EmployerSubmitCensusSyncParams::Employee::Address::State::TaggedSymbol + ) + + sig do + override.returns( + T::Array[ + VitableConnect::EmployerSubmitCensusSyncParams::Employee::Address::State::TaggedSymbol + ] + ) + end + def self.values + end + end + end + + # - `Salary` - Salary + # - `Hourly` - Hourly + module CompensationType + extend VitableConnect::Internal::Type::Enum + + TaggedSymbol = + T.type_alias do + T.all( + Symbol, + VitableConnect::EmployerSubmitCensusSyncParams::Employee::CompensationType + ) + end + OrSymbol = T.type_alias { T.any(Symbol, String) } + + SALARY = + T.let( + :Salary, + VitableConnect::EmployerSubmitCensusSyncParams::Employee::CompensationType::TaggedSymbol + ) + HOURLY = + T.let( + :Hourly, + VitableConnect::EmployerSubmitCensusSyncParams::Employee::CompensationType::TaggedSymbol + ) + + sig do + override.returns( + T::Array[ + VitableConnect::EmployerSubmitCensusSyncParams::Employee::CompensationType::TaggedSymbol + ] + ) + end + def self.values + end + end + end + end + end +end diff --git a/rbi/vitable_connect/models/employer_submit_census_sync_response.rbi b/rbi/vitable_connect/models/employer_submit_census_sync_response.rbi new file mode 100644 index 0000000..fd8e9dd --- /dev/null +++ b/rbi/vitable_connect/models/employer_submit_census_sync_response.rbi @@ -0,0 +1,76 @@ +# typed: strong + +module VitableConnect + module Models + class EmployerSubmitCensusSyncResponse < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::EmployerSubmitCensusSyncResponse, + VitableConnect::Internal::AnyHash + ) + end + + sig do + returns(VitableConnect::Models::EmployerSubmitCensusSyncResponse::Data) + end + attr_reader :data + + sig do + params( + data: + VitableConnect::Models::EmployerSubmitCensusSyncResponse::Data::OrHash + ).void + end + attr_writer :data + + # Response containing a single census sync detail resource. + sig do + params( + data: + VitableConnect::Models::EmployerSubmitCensusSyncResponse::Data::OrHash + ).returns(T.attached_class) + end + def self.new(data:) + end + + sig do + override.returns( + { + data: VitableConnect::Models::EmployerSubmitCensusSyncResponse::Data + } + ) + end + def to_hash + end + + class Data < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::EmployerSubmitCensusSyncResponse::Data, + VitableConnect::Internal::AnyHash + ) + end + + sig { returns(Time) } + attr_accessor :accepted_at + + sig { returns(String) } + attr_accessor :employer_id + + sig do + params(accepted_at: Time, employer_id: String).returns( + T.attached_class + ) + end + def self.new(accepted_at:, employer_id:) + end + + sig { override.returns({ accepted_at: Time, employer_id: String }) } + def to_hash + end + end + end + end +end diff --git a/rbi/vitable_connect/models/employer_submit_payroll_access_setup_params.rbi b/rbi/vitable_connect/models/employer_submit_payroll_access_setup_params.rbi new file mode 100644 index 0000000..f8a87bf --- /dev/null +++ b/rbi/vitable_connect/models/employer_submit_payroll_access_setup_params.rbi @@ -0,0 +1,441 @@ +# typed: strong + +module VitableConnect + module Models + class EmployerSubmitPayrollAccessSetupParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + OrHash = + T.type_alias do + T.any( + VitableConnect::EmployerSubmitPayrollAccessSetupParams, + VitableConnect::Internal::AnyHash + ) + end + + # Unique employer identifier (empr\_\*) + sig { returns(String) } + attr_accessor :employer_id + + # - `SELF_SETUP` - SELF_SETUP + # - `NEEDS_HELP` - NEEDS_HELP + sig do + returns( + VitableConnect::EmployerSubmitPayrollAccessSetupParams::AccessMethod::OrSymbol + ) + end + attr_accessor :access_method + + sig { returns(T::Boolean) } + attr_accessor :all_benefit_eligible_employees_present + + sig { returns(T::Boolean) } + attr_accessor :classifications_accurate + + sig { returns(T::Boolean) } + attr_accessor :employees_in_payroll_acknowledged + + sig { returns(T::Boolean) } + attr_accessor :has_additional_payroll_system + + sig { returns(T::Boolean) } + attr_accessor :is_controlled_group + + sig { returns(T::Boolean) } + attr_accessor :payroll_data_impacts_eligibility_acknowledged + + # - `SELF_SETUP` - SELF_SETUP + # - `NEEDS_HELP` - NEEDS_HELP + sig do + returns( + T.nilable( + VitableConnect::EmployerSubmitPayrollAccessSetupParams::AdditionalAccessMethod::OrSymbol + ) + ) + end + attr_accessor :additional_access_method + + sig { returns(T.nilable(T::Boolean)) } + attr_accessor :additional_integration_confirmed + + sig { returns(T.nilable(String)) } + attr_accessor :additional_login_url + + sig { returns(T.nilable(String)) } + attr_accessor :additional_password + + sig { returns(T.nilable(String)) } + attr_accessor :additional_phone + + sig { returns(T.nilable(String)) } + attr_accessor :additional_username + + # - `ENTER_NAMES` - ENTER_NAMES + # - `EMAIL_LIST` - EMAIL_LIST + sig do + returns( + T.nilable( + VitableConnect::EmployerSubmitPayrollAccessSetupParams::ClassificationCorrectionSource::OrSymbol + ) + ) + end + attr_accessor :classification_correction_source + + sig { returns(T.nilable(T::Boolean)) } + attr_accessor :integration_confirmed + + sig { returns(T.nilable(String)) } + attr_accessor :login_url + + sig { returns(T.nilable(T::Array[String])) } + attr_reader :misclassified_employee_names + + sig { params(misclassified_employee_names: T::Array[String]).void } + attr_writer :misclassified_employee_names + + # - `EMAIL_CENSUS` - EMAIL_CENSUS + # - `SECOND_SYSTEM_ACCESS` - SECOND_SYSTEM_ACCESS + sig do + returns( + T.nilable( + VitableConnect::EmployerSubmitPayrollAccessSetupParams::MissingEmployeeResolution::OrSymbol + ) + ) + end + attr_accessor :missing_employee_resolution + + sig { returns(T.nilable(String)) } + attr_accessor :password + + sig { returns(T.nilable(String)) } + attr_accessor :phone + + # - `VITABLE_UPDATE` - VITABLE_UPDATE + # - `EMPLOYER_UPDATE` - EMPLOYER_UPDATE + sig do + returns( + T.nilable( + VitableConnect::EmployerSubmitPayrollAccessSetupParams::RemainingEmployeeAction::OrSymbol + ) + ) + end + attr_accessor :remaining_employee_action + + sig { returns(T.nilable(T::Boolean)) } + attr_accessor :same_payroll_covers_other_eins + + sig { returns(T.nilable(String)) } + attr_accessor :username + + sig do + params( + employer_id: String, + access_method: + VitableConnect::EmployerSubmitPayrollAccessSetupParams::AccessMethod::OrSymbol, + all_benefit_eligible_employees_present: T::Boolean, + classifications_accurate: T::Boolean, + employees_in_payroll_acknowledged: T::Boolean, + has_additional_payroll_system: T::Boolean, + is_controlled_group: T::Boolean, + payroll_data_impacts_eligibility_acknowledged: T::Boolean, + additional_access_method: + T.nilable( + VitableConnect::EmployerSubmitPayrollAccessSetupParams::AdditionalAccessMethod::OrSymbol + ), + additional_integration_confirmed: T.nilable(T::Boolean), + additional_login_url: T.nilable(String), + additional_password: T.nilable(String), + additional_phone: T.nilable(String), + additional_username: T.nilable(String), + classification_correction_source: + T.nilable( + VitableConnect::EmployerSubmitPayrollAccessSetupParams::ClassificationCorrectionSource::OrSymbol + ), + integration_confirmed: T.nilable(T::Boolean), + login_url: T.nilable(String), + misclassified_employee_names: T::Array[String], + missing_employee_resolution: + T.nilable( + VitableConnect::EmployerSubmitPayrollAccessSetupParams::MissingEmployeeResolution::OrSymbol + ), + password: T.nilable(String), + phone: T.nilable(String), + remaining_employee_action: + T.nilable( + VitableConnect::EmployerSubmitPayrollAccessSetupParams::RemainingEmployeeAction::OrSymbol + ), + same_payroll_covers_other_eins: T.nilable(T::Boolean), + username: T.nilable(String), + request_options: VitableConnect::RequestOptions::OrHash + ).returns(T.attached_class) + end + def self.new( + # Unique employer identifier (empr\_\*) + employer_id:, + # - `SELF_SETUP` - SELF_SETUP + # - `NEEDS_HELP` - NEEDS_HELP + access_method:, + all_benefit_eligible_employees_present:, + classifications_accurate:, + employees_in_payroll_acknowledged:, + has_additional_payroll_system:, + is_controlled_group:, + payroll_data_impacts_eligibility_acknowledged:, + # - `SELF_SETUP` - SELF_SETUP + # - `NEEDS_HELP` - NEEDS_HELP + additional_access_method: nil, + additional_integration_confirmed: nil, + additional_login_url: nil, + additional_password: nil, + additional_phone: nil, + additional_username: nil, + # - `ENTER_NAMES` - ENTER_NAMES + # - `EMAIL_LIST` - EMAIL_LIST + classification_correction_source: nil, + integration_confirmed: nil, + login_url: nil, + misclassified_employee_names: nil, + # - `EMAIL_CENSUS` - EMAIL_CENSUS + # - `SECOND_SYSTEM_ACCESS` - SECOND_SYSTEM_ACCESS + missing_employee_resolution: nil, + password: nil, + phone: nil, + # - `VITABLE_UPDATE` - VITABLE_UPDATE + # - `EMPLOYER_UPDATE` - EMPLOYER_UPDATE + remaining_employee_action: nil, + same_payroll_covers_other_eins: nil, + username: nil, + request_options: {} + ) + end + + sig do + override.returns( + { + employer_id: String, + access_method: + VitableConnect::EmployerSubmitPayrollAccessSetupParams::AccessMethod::OrSymbol, + all_benefit_eligible_employees_present: T::Boolean, + classifications_accurate: T::Boolean, + employees_in_payroll_acknowledged: T::Boolean, + has_additional_payroll_system: T::Boolean, + is_controlled_group: T::Boolean, + payroll_data_impacts_eligibility_acknowledged: T::Boolean, + additional_access_method: + T.nilable( + VitableConnect::EmployerSubmitPayrollAccessSetupParams::AdditionalAccessMethod::OrSymbol + ), + additional_integration_confirmed: T.nilable(T::Boolean), + additional_login_url: T.nilable(String), + additional_password: T.nilable(String), + additional_phone: T.nilable(String), + additional_username: T.nilable(String), + classification_correction_source: + T.nilable( + VitableConnect::EmployerSubmitPayrollAccessSetupParams::ClassificationCorrectionSource::OrSymbol + ), + integration_confirmed: T.nilable(T::Boolean), + login_url: T.nilable(String), + misclassified_employee_names: T::Array[String], + missing_employee_resolution: + T.nilable( + VitableConnect::EmployerSubmitPayrollAccessSetupParams::MissingEmployeeResolution::OrSymbol + ), + password: T.nilable(String), + phone: T.nilable(String), + remaining_employee_action: + T.nilable( + VitableConnect::EmployerSubmitPayrollAccessSetupParams::RemainingEmployeeAction::OrSymbol + ), + same_payroll_covers_other_eins: T.nilable(T::Boolean), + username: T.nilable(String), + request_options: VitableConnect::RequestOptions + } + ) + end + def to_hash + end + + # - `SELF_SETUP` - SELF_SETUP + # - `NEEDS_HELP` - NEEDS_HELP + module AccessMethod + extend VitableConnect::Internal::Type::Enum + + TaggedSymbol = + T.type_alias do + T.all( + Symbol, + VitableConnect::EmployerSubmitPayrollAccessSetupParams::AccessMethod + ) + end + OrSymbol = T.type_alias { T.any(Symbol, String) } + + SELF_SETUP = + T.let( + :SELF_SETUP, + VitableConnect::EmployerSubmitPayrollAccessSetupParams::AccessMethod::TaggedSymbol + ) + NEEDS_HELP = + T.let( + :NEEDS_HELP, + VitableConnect::EmployerSubmitPayrollAccessSetupParams::AccessMethod::TaggedSymbol + ) + + sig do + override.returns( + T::Array[ + VitableConnect::EmployerSubmitPayrollAccessSetupParams::AccessMethod::TaggedSymbol + ] + ) + end + def self.values + end + end + + # - `SELF_SETUP` - SELF_SETUP + # - `NEEDS_HELP` - NEEDS_HELP + module AdditionalAccessMethod + extend VitableConnect::Internal::Type::Enum + + TaggedSymbol = + T.type_alias do + T.all( + Symbol, + VitableConnect::EmployerSubmitPayrollAccessSetupParams::AdditionalAccessMethod + ) + end + OrSymbol = T.type_alias { T.any(Symbol, String) } + + SELF_SETUP = + T.let( + :SELF_SETUP, + VitableConnect::EmployerSubmitPayrollAccessSetupParams::AdditionalAccessMethod::TaggedSymbol + ) + NEEDS_HELP = + T.let( + :NEEDS_HELP, + VitableConnect::EmployerSubmitPayrollAccessSetupParams::AdditionalAccessMethod::TaggedSymbol + ) + + sig do + override.returns( + T::Array[ + VitableConnect::EmployerSubmitPayrollAccessSetupParams::AdditionalAccessMethod::TaggedSymbol + ] + ) + end + def self.values + end + end + + # - `ENTER_NAMES` - ENTER_NAMES + # - `EMAIL_LIST` - EMAIL_LIST + module ClassificationCorrectionSource + extend VitableConnect::Internal::Type::Enum + + TaggedSymbol = + T.type_alias do + T.all( + Symbol, + VitableConnect::EmployerSubmitPayrollAccessSetupParams::ClassificationCorrectionSource + ) + end + OrSymbol = T.type_alias { T.any(Symbol, String) } + + ENTER_NAMES = + T.let( + :ENTER_NAMES, + VitableConnect::EmployerSubmitPayrollAccessSetupParams::ClassificationCorrectionSource::TaggedSymbol + ) + EMAIL_LIST = + T.let( + :EMAIL_LIST, + VitableConnect::EmployerSubmitPayrollAccessSetupParams::ClassificationCorrectionSource::TaggedSymbol + ) + + sig do + override.returns( + T::Array[ + VitableConnect::EmployerSubmitPayrollAccessSetupParams::ClassificationCorrectionSource::TaggedSymbol + ] + ) + end + def self.values + end + end + + # - `EMAIL_CENSUS` - EMAIL_CENSUS + # - `SECOND_SYSTEM_ACCESS` - SECOND_SYSTEM_ACCESS + module MissingEmployeeResolution + extend VitableConnect::Internal::Type::Enum + + TaggedSymbol = + T.type_alias do + T.all( + Symbol, + VitableConnect::EmployerSubmitPayrollAccessSetupParams::MissingEmployeeResolution + ) + end + OrSymbol = T.type_alias { T.any(Symbol, String) } + + EMAIL_CENSUS = + T.let( + :EMAIL_CENSUS, + VitableConnect::EmployerSubmitPayrollAccessSetupParams::MissingEmployeeResolution::TaggedSymbol + ) + SECOND_SYSTEM_ACCESS = + T.let( + :SECOND_SYSTEM_ACCESS, + VitableConnect::EmployerSubmitPayrollAccessSetupParams::MissingEmployeeResolution::TaggedSymbol + ) + + sig do + override.returns( + T::Array[ + VitableConnect::EmployerSubmitPayrollAccessSetupParams::MissingEmployeeResolution::TaggedSymbol + ] + ) + end + def self.values + end + end + + # - `VITABLE_UPDATE` - VITABLE_UPDATE + # - `EMPLOYER_UPDATE` - EMPLOYER_UPDATE + module RemainingEmployeeAction + extend VitableConnect::Internal::Type::Enum + + TaggedSymbol = + T.type_alias do + T.all( + Symbol, + VitableConnect::EmployerSubmitPayrollAccessSetupParams::RemainingEmployeeAction + ) + end + OrSymbol = T.type_alias { T.any(Symbol, String) } + + VITABLE_UPDATE = + T.let( + :VITABLE_UPDATE, + VitableConnect::EmployerSubmitPayrollAccessSetupParams::RemainingEmployeeAction::TaggedSymbol + ) + EMPLOYER_UPDATE = + T.let( + :EMPLOYER_UPDATE, + VitableConnect::EmployerSubmitPayrollAccessSetupParams::RemainingEmployeeAction::TaggedSymbol + ) + + sig do + override.returns( + T::Array[ + VitableConnect::EmployerSubmitPayrollAccessSetupParams::RemainingEmployeeAction::TaggedSymbol + ] + ) + end + def self.values + end + end + end + end +end diff --git a/rbi/vitable_connect/models/employer_submit_payroll_access_setup_response.rbi b/rbi/vitable_connect/models/employer_submit_payroll_access_setup_response.rbi new file mode 100644 index 0000000..7e88251 --- /dev/null +++ b/rbi/vitable_connect/models/employer_submit_payroll_access_setup_response.rbi @@ -0,0 +1,83 @@ +# typed: strong + +module VitableConnect + module Models + class EmployerSubmitPayrollAccessSetupResponse < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::EmployerSubmitPayrollAccessSetupResponse, + VitableConnect::Internal::AnyHash + ) + end + + sig do + returns( + VitableConnect::Models::EmployerSubmitPayrollAccessSetupResponse::Data + ) + end + attr_reader :data + + sig do + params( + data: + VitableConnect::Models::EmployerSubmitPayrollAccessSetupResponse::Data::OrHash + ).void + end + attr_writer :data + + # Response containing a single payroll access setup status resource. + sig do + params( + data: + VitableConnect::Models::EmployerSubmitPayrollAccessSetupResponse::Data::OrHash + ).returns(T.attached_class) + end + def self.new(data:) + end + + sig do + override.returns( + { + data: + VitableConnect::Models::EmployerSubmitPayrollAccessSetupResponse::Data + } + ) + end + def to_hash + end + + class Data < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::EmployerSubmitPayrollAccessSetupResponse::Data, + VitableConnect::Internal::AnyHash + ) + end + + sig { returns(T::Boolean) } + attr_accessor :completed + + sig { returns(T.nilable(Time)) } + attr_accessor :submitted_at + + sig do + params(completed: T::Boolean, submitted_at: T.nilable(Time)).returns( + T.attached_class + ) + end + def self.new(completed:, submitted_at:) + end + + sig do + override.returns( + { completed: T::Boolean, submitted_at: T.nilable(Time) } + ) + end + def to_hash + end + end + end + end +end diff --git a/rbi/vitable_connect/models/employer_update_params.rbi b/rbi/vitable_connect/models/employer_update_params.rbi new file mode 100644 index 0000000..4015f7b --- /dev/null +++ b/rbi/vitable_connect/models/employer_update_params.rbi @@ -0,0 +1,155 @@ +# typed: strong + +module VitableConnect + module Models + class EmployerUpdateParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + OrHash = + T.type_alias do + T.any( + VitableConnect::EmployerUpdateParams, + VitableConnect::Internal::AnyHash + ) + end + + # Unique employer identifier (empr\_\*) + sig { returns(String) } + attr_accessor :employer_id + + # Whether the employer is active + sig { returns(T.nilable(T::Boolean)) } + attr_accessor :active + + # Employer address + sig { returns(T.nilable(VitableConnect::EmployerUpdateParams::Address)) } + attr_reader :address + + sig do + params( + address: + T.nilable(VitableConnect::EmployerUpdateParams::Address::OrHash) + ).void + end + attr_writer :address + + # Legal business name + sig { returns(T.nilable(String)) } + attr_accessor :legal_name + + # Employer display name + sig { returns(T.nilable(String)) } + attr_accessor :name + + sig do + params( + employer_id: String, + active: T.nilable(T::Boolean), + address: + T.nilable(VitableConnect::EmployerUpdateParams::Address::OrHash), + legal_name: T.nilable(String), + name: T.nilable(String), + request_options: VitableConnect::RequestOptions::OrHash + ).returns(T.attached_class) + end + def self.new( + # Unique employer identifier (empr\_\*) + employer_id:, + # Whether the employer is active + active: nil, + # Employer address + address: nil, + # Legal business name + legal_name: nil, + # Employer display name + name: nil, + request_options: {} + ) + end + + sig do + override.returns( + { + employer_id: String, + active: T.nilable(T::Boolean), + address: T.nilable(VitableConnect::EmployerUpdateParams::Address), + legal_name: T.nilable(String), + name: T.nilable(String), + request_options: VitableConnect::RequestOptions + } + ) + end + def to_hash + end + + class Address < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::EmployerUpdateParams::Address, + VitableConnect::Internal::AnyHash + ) + end + + # Primary street address + sig { returns(String) } + attr_accessor :address_line_1 + + # City name + sig { returns(String) } + attr_accessor :city + + # Two-letter state code + sig { returns(String) } + attr_accessor :state + + # ZIP code + sig { returns(String) } + attr_accessor :zipcode + + # Secondary street address + sig { returns(T.nilable(String)) } + attr_accessor :address_line_2 + + # Employer address + sig do + params( + address_line_1: String, + city: String, + state: String, + zipcode: String, + address_line_2: T.nilable(String) + ).returns(T.attached_class) + end + def self.new( + # Primary street address + address_line_1:, + # City name + city:, + # Two-letter state code + state:, + # ZIP code + zipcode:, + # Secondary street address + address_line_2: nil + ) + end + + sig do + override.returns( + { + address_line_1: String, + city: String, + state: String, + zipcode: String, + address_line_2: T.nilable(String) + } + ) + end + def to_hash + end + end + end + end +end diff --git a/rbi/vitable_connect/models/employer_update_settings_params.rbi b/rbi/vitable_connect/models/employer_update_settings_params.rbi new file mode 100644 index 0000000..cdeaccb --- /dev/null +++ b/rbi/vitable_connect/models/employer_update_settings_params.rbi @@ -0,0 +1,114 @@ +# typed: strong + +module VitableConnect + module Models + class EmployerUpdateSettingsParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + OrHash = + T.type_alias do + T.any( + VitableConnect::EmployerUpdateSettingsParams, + VitableConnect::Internal::AnyHash + ) + end + + # Unique employer identifier (empr\_\*) + sig { returns(String) } + attr_accessor :employer_id + + # - `weekly` - Weekly + # - `bi_weekly` - Bi Weekly + # - `semi_monthly` - Semi Monthly + # - `monthly` - Monthly + sig do + returns( + VitableConnect::EmployerUpdateSettingsParams::PayFrequency::OrSymbol + ) + end + attr_accessor :pay_frequency + + sig do + params( + employer_id: String, + pay_frequency: + VitableConnect::EmployerUpdateSettingsParams::PayFrequency::OrSymbol, + request_options: VitableConnect::RequestOptions::OrHash + ).returns(T.attached_class) + end + def self.new( + # Unique employer identifier (empr\_\*) + employer_id:, + # - `weekly` - Weekly + # - `bi_weekly` - Bi Weekly + # - `semi_monthly` - Semi Monthly + # - `monthly` - Monthly + pay_frequency:, + request_options: {} + ) + end + + sig do + override.returns( + { + employer_id: String, + pay_frequency: + VitableConnect::EmployerUpdateSettingsParams::PayFrequency::OrSymbol, + request_options: VitableConnect::RequestOptions + } + ) + end + def to_hash + end + + # - `weekly` - Weekly + # - `bi_weekly` - Bi Weekly + # - `semi_monthly` - Semi Monthly + # - `monthly` - Monthly + module PayFrequency + extend VitableConnect::Internal::Type::Enum + + TaggedSymbol = + T.type_alias do + T.all( + Symbol, + VitableConnect::EmployerUpdateSettingsParams::PayFrequency + ) + end + OrSymbol = T.type_alias { T.any(Symbol, String) } + + WEEKLY = + T.let( + :weekly, + VitableConnect::EmployerUpdateSettingsParams::PayFrequency::TaggedSymbol + ) + BI_WEEKLY = + T.let( + :bi_weekly, + VitableConnect::EmployerUpdateSettingsParams::PayFrequency::TaggedSymbol + ) + SEMI_MONTHLY = + T.let( + :semi_monthly, + VitableConnect::EmployerUpdateSettingsParams::PayFrequency::TaggedSymbol + ) + MONTHLY = + T.let( + :monthly, + VitableConnect::EmployerUpdateSettingsParams::PayFrequency::TaggedSymbol + ) + + sig do + override.returns( + T::Array[ + VitableConnect::EmployerUpdateSettingsParams::PayFrequency::TaggedSymbol + ] + ) + end + def self.values + end + end + end + end +end diff --git a/rbi/vitable_connect/models/employer_update_settings_response.rbi b/rbi/vitable_connect/models/employer_update_settings_response.rbi new file mode 100644 index 0000000..0e49b52 --- /dev/null +++ b/rbi/vitable_connect/models/employer_update_settings_response.rbi @@ -0,0 +1,147 @@ +# typed: strong + +module VitableConnect + module Models + class EmployerUpdateSettingsResponse < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::EmployerUpdateSettingsResponse, + VitableConnect::Internal::AnyHash + ) + end + + sig do + returns(VitableConnect::Models::EmployerUpdateSettingsResponse::Data) + end + attr_reader :data + + sig do + params( + data: + VitableConnect::Models::EmployerUpdateSettingsResponse::Data::OrHash + ).void + end + attr_writer :data + + # Response containing a single employer settings resource. + sig do + params( + data: + VitableConnect::Models::EmployerUpdateSettingsResponse::Data::OrHash + ).returns(T.attached_class) + end + def self.new(data:) + end + + sig do + override.returns( + { data: VitableConnect::Models::EmployerUpdateSettingsResponse::Data } + ) + end + def to_hash + end + + class Data < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::EmployerUpdateSettingsResponse::Data, + VitableConnect::Internal::AnyHash + ) + end + + # - `weekly` - Weekly + # - `bi_weekly` - Bi Weekly + # - `semi_monthly` - Semi Monthly + # - `monthly` - Monthly + sig do + returns( + T.nilable( + VitableConnect::Models::EmployerUpdateSettingsResponse::Data::PayFrequency::TaggedSymbol + ) + ) + end + attr_accessor :pay_frequency + + sig do + params( + pay_frequency: + T.nilable( + VitableConnect::Models::EmployerUpdateSettingsResponse::Data::PayFrequency::OrSymbol + ) + ).returns(T.attached_class) + end + def self.new( + # - `weekly` - Weekly + # - `bi_weekly` - Bi Weekly + # - `semi_monthly` - Semi Monthly + # - `monthly` - Monthly + pay_frequency: + ) + end + + sig do + override.returns( + { + pay_frequency: + T.nilable( + VitableConnect::Models::EmployerUpdateSettingsResponse::Data::PayFrequency::TaggedSymbol + ) + } + ) + end + def to_hash + end + + # - `weekly` - Weekly + # - `bi_weekly` - Bi Weekly + # - `semi_monthly` - Semi Monthly + # - `monthly` - Monthly + module PayFrequency + extend VitableConnect::Internal::Type::Enum + + TaggedSymbol = + T.type_alias do + T.all( + Symbol, + VitableConnect::Models::EmployerUpdateSettingsResponse::Data::PayFrequency + ) + end + OrSymbol = T.type_alias { T.any(Symbol, String) } + + WEEKLY = + T.let( + :weekly, + VitableConnect::Models::EmployerUpdateSettingsResponse::Data::PayFrequency::TaggedSymbol + ) + BI_WEEKLY = + T.let( + :bi_weekly, + VitableConnect::Models::EmployerUpdateSettingsResponse::Data::PayFrequency::TaggedSymbol + ) + SEMI_MONTHLY = + T.let( + :semi_monthly, + VitableConnect::Models::EmployerUpdateSettingsResponse::Data::PayFrequency::TaggedSymbol + ) + MONTHLY = + T.let( + :monthly, + VitableConnect::Models::EmployerUpdateSettingsResponse::Data::PayFrequency::TaggedSymbol + ) + + sig do + override.returns( + T::Array[ + VitableConnect::Models::EmployerUpdateSettingsResponse::Data::PayFrequency::TaggedSymbol + ] + ) + end + def self.values + end + end + end + end + end +end diff --git a/rbi/vitable_connect/models/enrollment.rbi b/rbi/vitable_connect/models/enrollment.rbi new file mode 100644 index 0000000..2e948fa --- /dev/null +++ b/rbi/vitable_connect/models/enrollment.rbi @@ -0,0 +1,402 @@ +# typed: strong + +module VitableConnect + module Models + class Enrollment < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any(VitableConnect::Enrollment, VitableConnect::Internal::AnyHash) + end + + # Unique enrollment identifier (enrl\_\*) + sig { returns(String) } + attr_accessor :id + + # When the employee enrolled or waived + sig { returns(T.nilable(Time)) } + attr_accessor :answered_at + + # Nested benefit product summary + sig { returns(VitableConnect::Enrollment::Benefit) } + attr_reader :benefit + + sig { params(benefit: VitableConnect::Enrollment::Benefit::OrHash).void } + attr_writer :benefit + + # Coverage period end date + sig { returns(T.nilable(Date)) } + attr_accessor :coverage_end + + # Coverage period start date + sig { returns(Date) } + attr_accessor :coverage_start + + # When the enrollment was created + sig { returns(Time) } + attr_accessor :created_at + + # Employee monthly payroll deduction in cents + sig { returns(T.nilable(Integer)) } + attr_accessor :employee_deduction_in_cents + + # Employee ID (empl\_\*) + sig { returns(String) } + attr_accessor :employee_id + + # Employer monthly contribution in cents + sig { returns(T.nilable(Integer)) } + attr_accessor :employer_contribution_in_cents + + # Employer ID (empr\_\*) + sig { returns(String) } + attr_accessor :employer_id + + # - `pending` - Pending + # - `enrolled` - Enrolled + # - `waived` - Waived + # - `inactive` - Inactive + sig { returns(VitableConnect::EnrollmentStatus::TaggedSymbol) } + attr_accessor :status + + # When coverage was terminated + sig { returns(T.nilable(Time)) } + attr_accessor :terminated_at + + # When the enrollment was last updated + sig { returns(Time) } + attr_accessor :updated_at + + # One enrollment as it appears in a list row. + sig do + params( + id: String, + answered_at: T.nilable(Time), + benefit: VitableConnect::Enrollment::Benefit::OrHash, + coverage_end: T.nilable(Date), + coverage_start: Date, + created_at: Time, + employee_deduction_in_cents: T.nilable(Integer), + employee_id: String, + employer_contribution_in_cents: T.nilable(Integer), + employer_id: String, + status: VitableConnect::EnrollmentStatus::OrSymbol, + terminated_at: T.nilable(Time), + updated_at: Time + ).returns(T.attached_class) + end + def self.new( + # Unique enrollment identifier (enrl\_\*) + id:, + # When the employee enrolled or waived + answered_at:, + # Nested benefit product summary + benefit:, + # Coverage period end date + coverage_end:, + # Coverage period start date + coverage_start:, + # When the enrollment was created + created_at:, + # Employee monthly payroll deduction in cents + employee_deduction_in_cents:, + # Employee ID (empl\_\*) + employee_id:, + # Employer monthly contribution in cents + employer_contribution_in_cents:, + # Employer ID (empr\_\*) + employer_id:, + # - `pending` - Pending + # - `enrolled` - Enrolled + # - `waived` - Waived + # - `inactive` - Inactive + status:, + # When coverage was terminated + terminated_at:, + # When the enrollment was last updated + updated_at: + ) + end + + sig do + override.returns( + { + id: String, + answered_at: T.nilable(Time), + benefit: VitableConnect::Enrollment::Benefit, + coverage_end: T.nilable(Date), + coverage_start: Date, + created_at: Time, + employee_deduction_in_cents: T.nilable(Integer), + employee_id: String, + employer_contribution_in_cents: T.nilable(Integer), + employer_id: String, + status: VitableConnect::EnrollmentStatus::TaggedSymbol, + terminated_at: T.nilable(Time), + updated_at: Time + } + ) + end + def to_hash + end + + class Benefit < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Enrollment::Benefit, + VitableConnect::Internal::AnyHash + ) + end + + # Benefit product ID (bprd\_\*) + sig { returns(String) } + attr_accessor :id + + # - `Medical` - Medical + # - `Dental` - Dental + # - `Vision` - Vision + # - `Hospital` - Hospital + sig do + returns(VitableConnect::Enrollment::Benefit::Category::TaggedSymbol) + end + attr_accessor :category + + # Display name of the benefit product + sig { returns(String) } + attr_accessor :name + + # - `EBA` - Eba Mec + # - `VPC` - Vpc Enhanced + # - `VPC_CORE` - Vpc Core + # - `MEC` - Vpc Mec + # - `MEC2` - Mec2 + # - `MEC_PLUS` - Mec Plus + # - `MVP` - Mvp + # - `MVP2` - Mvp2 + # - `MVPSL` - Mvpsl + # - `MVPSL2` - Mvpsl2 + # - `VD` - Dental + # - `VV` - Vision + # - `ICHRA` - Ichra + # - `ICHRA_PREMIUM_PLUS` - Ichra Premium Plus + # - `ICHRA_REIMBURSEMENT_ONLY` - Ichra Reimbursement Only + sig do + returns( + VitableConnect::Enrollment::Benefit::ProductCode::TaggedSymbol + ) + end + attr_accessor :product_code + + # Nested benefit product summary + sig do + params( + id: String, + category: VitableConnect::Enrollment::Benefit::Category::OrSymbol, + name: String, + product_code: + VitableConnect::Enrollment::Benefit::ProductCode::OrSymbol + ).returns(T.attached_class) + end + def self.new( + # Benefit product ID (bprd\_\*) + id:, + # - `Medical` - Medical + # - `Dental` - Dental + # - `Vision` - Vision + # - `Hospital` - Hospital + category:, + # Display name of the benefit product + name:, + # - `EBA` - Eba Mec + # - `VPC` - Vpc Enhanced + # - `VPC_CORE` - Vpc Core + # - `MEC` - Vpc Mec + # - `MEC2` - Mec2 + # - `MEC_PLUS` - Mec Plus + # - `MVP` - Mvp + # - `MVP2` - Mvp2 + # - `MVPSL` - Mvpsl + # - `MVPSL2` - Mvpsl2 + # - `VD` - Dental + # - `VV` - Vision + # - `ICHRA` - Ichra + # - `ICHRA_PREMIUM_PLUS` - Ichra Premium Plus + # - `ICHRA_REIMBURSEMENT_ONLY` - Ichra Reimbursement Only + product_code: + ) + end + + sig do + override.returns( + { + id: String, + category: + VitableConnect::Enrollment::Benefit::Category::TaggedSymbol, + name: String, + product_code: + VitableConnect::Enrollment::Benefit::ProductCode::TaggedSymbol + } + ) + end + def to_hash + end + + # - `Medical` - Medical + # - `Dental` - Dental + # - `Vision` - Vision + # - `Hospital` - Hospital + module Category + extend VitableConnect::Internal::Type::Enum + + TaggedSymbol = + T.type_alias do + T.all(Symbol, VitableConnect::Enrollment::Benefit::Category) + end + OrSymbol = T.type_alias { T.any(Symbol, String) } + + MEDICAL = + T.let( + :Medical, + VitableConnect::Enrollment::Benefit::Category::TaggedSymbol + ) + DENTAL = + T.let( + :Dental, + VitableConnect::Enrollment::Benefit::Category::TaggedSymbol + ) + VISION = + T.let( + :Vision, + VitableConnect::Enrollment::Benefit::Category::TaggedSymbol + ) + HOSPITAL = + T.let( + :Hospital, + VitableConnect::Enrollment::Benefit::Category::TaggedSymbol + ) + + sig do + override.returns( + T::Array[ + VitableConnect::Enrollment::Benefit::Category::TaggedSymbol + ] + ) + end + def self.values + end + end + + # - `EBA` - Eba Mec + # - `VPC` - Vpc Enhanced + # - `VPC_CORE` - Vpc Core + # - `MEC` - Vpc Mec + # - `MEC2` - Mec2 + # - `MEC_PLUS` - Mec Plus + # - `MVP` - Mvp + # - `MVP2` - Mvp2 + # - `MVPSL` - Mvpsl + # - `MVPSL2` - Mvpsl2 + # - `VD` - Dental + # - `VV` - Vision + # - `ICHRA` - Ichra + # - `ICHRA_PREMIUM_PLUS` - Ichra Premium Plus + # - `ICHRA_REIMBURSEMENT_ONLY` - Ichra Reimbursement Only + module ProductCode + extend VitableConnect::Internal::Type::Enum + + TaggedSymbol = + T.type_alias do + T.all(Symbol, VitableConnect::Enrollment::Benefit::ProductCode) + end + OrSymbol = T.type_alias { T.any(Symbol, String) } + + EBA = + T.let( + :EBA, + VitableConnect::Enrollment::Benefit::ProductCode::TaggedSymbol + ) + VPC = + T.let( + :VPC, + VitableConnect::Enrollment::Benefit::ProductCode::TaggedSymbol + ) + VPC_CORE = + T.let( + :VPC_CORE, + VitableConnect::Enrollment::Benefit::ProductCode::TaggedSymbol + ) + MEC = + T.let( + :MEC, + VitableConnect::Enrollment::Benefit::ProductCode::TaggedSymbol + ) + MEC2 = + T.let( + :MEC2, + VitableConnect::Enrollment::Benefit::ProductCode::TaggedSymbol + ) + MEC_PLUS = + T.let( + :MEC_PLUS, + VitableConnect::Enrollment::Benefit::ProductCode::TaggedSymbol + ) + MVP = + T.let( + :MVP, + VitableConnect::Enrollment::Benefit::ProductCode::TaggedSymbol + ) + MVP2 = + T.let( + :MVP2, + VitableConnect::Enrollment::Benefit::ProductCode::TaggedSymbol + ) + MVPSL = + T.let( + :MVPSL, + VitableConnect::Enrollment::Benefit::ProductCode::TaggedSymbol + ) + MVPSL2 = + T.let( + :MVPSL2, + VitableConnect::Enrollment::Benefit::ProductCode::TaggedSymbol + ) + VD = + T.let( + :VD, + VitableConnect::Enrollment::Benefit::ProductCode::TaggedSymbol + ) + VV = + T.let( + :VV, + VitableConnect::Enrollment::Benefit::ProductCode::TaggedSymbol + ) + ICHRA = + T.let( + :ICHRA, + VitableConnect::Enrollment::Benefit::ProductCode::TaggedSymbol + ) + ICHRA_PREMIUM_PLUS = + T.let( + :ICHRA_PREMIUM_PLUS, + VitableConnect::Enrollment::Benefit::ProductCode::TaggedSymbol + ) + ICHRA_REIMBURSEMENT_ONLY = + T.let( + :ICHRA_REIMBURSEMENT_ONLY, + VitableConnect::Enrollment::Benefit::ProductCode::TaggedSymbol + ) + + sig do + override.returns( + T::Array[ + VitableConnect::Enrollment::Benefit::ProductCode::TaggedSymbol + ] + ) + end + def self.values + end + end + end + end + end +end diff --git a/rbi/vitable_connect/models/enrollment_reissue_params.rbi b/rbi/vitable_connect/models/enrollment_reissue_params.rbi new file mode 100644 index 0000000..6128bdb --- /dev/null +++ b/rbi/vitable_connect/models/enrollment_reissue_params.rbi @@ -0,0 +1,72 @@ +# typed: strong + +module VitableConnect + module Models + class EnrollmentReissueParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + OrHash = + T.type_alias do + T.any( + VitableConnect::EnrollmentReissueParams, + VitableConnect::Internal::AnyHash + ) + end + + # Unique enrollment identifier (enrl\_\*) + sig { returns(String) } + attr_accessor :enrollment_id + + # Accepted member qualifying life event identifier (qle\_\*) + sig { returns(T.nilable(String)) } + attr_accessor :qualifying_life_event_id + + # Audit reason for the reissue; required for user-backed callers and optional for + # long-lived organization API-key callers + sig { returns(T.nilable(String)) } + attr_accessor :reason + + # Optional support or operational ticket number + sig { returns(T.nilable(String)) } + attr_accessor :ticket_number + + sig do + params( + enrollment_id: String, + qualifying_life_event_id: T.nilable(String), + reason: T.nilable(String), + ticket_number: T.nilable(String), + request_options: VitableConnect::RequestOptions::OrHash + ).returns(T.attached_class) + end + def self.new( + # Unique enrollment identifier (enrl\_\*) + enrollment_id:, + # Accepted member qualifying life event identifier (qle\_\*) + qualifying_life_event_id: nil, + # Audit reason for the reissue; required for user-backed callers and optional for + # long-lived organization API-key callers + reason: nil, + # Optional support or operational ticket number + ticket_number: nil, + request_options: {} + ) + end + + sig do + override.returns( + { + enrollment_id: String, + qualifying_life_event_id: T.nilable(String), + reason: T.nilable(String), + ticket_number: T.nilable(String), + request_options: VitableConnect::RequestOptions + } + ) + end + def to_hash + end + end + end +end diff --git a/rbi/vitable_connect/models/enrollment_reissue_response.rbi b/rbi/vitable_connect/models/enrollment_reissue_response.rbi new file mode 100644 index 0000000..b86c37d --- /dev/null +++ b/rbi/vitable_connect/models/enrollment_reissue_response.rbi @@ -0,0 +1,67 @@ +# typed: strong + +module VitableConnect + module Models + class EnrollmentReissueResponse < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::EnrollmentReissueResponse, + VitableConnect::Internal::AnyHash + ) + end + + sig { returns(VitableConnect::Models::EnrollmentReissueResponse::Data) } + attr_reader :data + + sig do + params( + data: VitableConnect::Models::EnrollmentReissueResponse::Data::OrHash + ).void + end + attr_writer :data + + # Response containing a single reissue enrollment resource. + sig do + params( + data: VitableConnect::Models::EnrollmentReissueResponse::Data::OrHash + ).returns(T.attached_class) + end + def self.new(data:) + end + + sig do + override.returns( + { data: VitableConnect::Models::EnrollmentReissueResponse::Data } + ) + end + def to_hash + end + + class Data < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::EnrollmentReissueResponse::Data, + VitableConnect::Internal::AnyHash + ) + end + + # Opaque identifier for the new unanswered enrollment + sig { returns(String) } + attr_accessor :enrollment_id + + sig { params(enrollment_id: String).returns(T.attached_class) } + def self.new( + # Opaque identifier for the new unanswered enrollment + enrollment_id: + ) + end + + sig { override.returns({ enrollment_id: String }) } + def to_hash + end + end + end + end +end diff --git a/rbi/vitable_connect/models/enrollment_retrieve_params.rbi b/rbi/vitable_connect/models/enrollment_retrieve_params.rbi new file mode 100644 index 0000000..757efb1 --- /dev/null +++ b/rbi/vitable_connect/models/enrollment_retrieve_params.rbi @@ -0,0 +1,46 @@ +# typed: strong + +module VitableConnect + module Models + class EnrollmentRetrieveParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + OrHash = + T.type_alias do + T.any( + VitableConnect::EnrollmentRetrieveParams, + VitableConnect::Internal::AnyHash + ) + end + + # Unique enrollment identifier (enrl\_\*) + sig { returns(String) } + attr_accessor :enrollment_id + + sig do + params( + enrollment_id: String, + request_options: VitableConnect::RequestOptions::OrHash + ).returns(T.attached_class) + end + def self.new( + # Unique enrollment identifier (enrl\_\*) + enrollment_id:, + request_options: {} + ) + end + + sig do + override.returns( + { + enrollment_id: String, + request_options: VitableConnect::RequestOptions + } + ) + end + def to_hash + end + end + end +end diff --git a/rbi/vitable_connect/models/enrollment_retrieve_response.rbi b/rbi/vitable_connect/models/enrollment_retrieve_response.rbi new file mode 100644 index 0000000..07e058f --- /dev/null +++ b/rbi/vitable_connect/models/enrollment_retrieve_response.rbi @@ -0,0 +1,487 @@ +# typed: strong + +module VitableConnect + module Models + class EnrollmentRetrieveResponse < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::EnrollmentRetrieveResponse, + VitableConnect::Internal::AnyHash + ) + end + + # A single enrollment, including the enrolled plan's documents. + # + # The plan documents are resolved one enrollment at a time and are therefore not + # part of the list row. + sig { returns(VitableConnect::Models::EnrollmentRetrieveResponse::Data) } + attr_reader :data + + sig do + params( + data: VitableConnect::Models::EnrollmentRetrieveResponse::Data::OrHash + ).void + end + attr_writer :data + + # Response containing a single enrollment resource. + sig do + params( + data: VitableConnect::Models::EnrollmentRetrieveResponse::Data::OrHash + ).returns(T.attached_class) + end + def self.new( + # A single enrollment, including the enrolled plan's documents. + # + # The plan documents are resolved one enrollment at a time and are therefore not + # part of the list row. + data: + ) + end + + sig do + override.returns( + { data: VitableConnect::Models::EnrollmentRetrieveResponse::Data } + ) + end + def to_hash + end + + class Data < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::EnrollmentRetrieveResponse::Data, + VitableConnect::Internal::AnyHash + ) + end + + # Unique enrollment identifier (enrl\_\*) + sig { returns(String) } + attr_accessor :id + + # When the employee enrolled or waived + sig { returns(T.nilable(Time)) } + attr_accessor :answered_at + + # Nested benefit product summary + sig do + returns( + VitableConnect::Models::EnrollmentRetrieveResponse::Data::Benefit + ) + end + attr_reader :benefit + + sig do + params( + benefit: + VitableConnect::Models::EnrollmentRetrieveResponse::Data::Benefit::OrHash + ).void + end + attr_writer :benefit + + # Coverage period end date + sig { returns(T.nilable(Date)) } + attr_accessor :coverage_end + + # Coverage period start date + sig { returns(Date) } + attr_accessor :coverage_start + + # When the enrollment was created + sig { returns(Time) } + attr_accessor :created_at + + # Employee monthly payroll deduction in cents + sig { returns(T.nilable(Integer)) } + attr_accessor :employee_deduction_in_cents + + # Employee ID (empl\_\*) + sig { returns(String) } + attr_accessor :employee_id + + # Employer monthly contribution in cents + sig { returns(T.nilable(Integer)) } + attr_accessor :employer_contribution_in_cents + + # Employer ID (empr\_\*) + sig { returns(String) } + attr_accessor :employer_id + + # - `pending` - Pending + # - `enrolled` - Enrolled + # - `waived` - Waived + # - `inactive` - Inactive + sig { returns(VitableConnect::EnrollmentStatus::TaggedSymbol) } + attr_accessor :status + + # When coverage was terminated + sig { returns(T.nilable(Time)) } + attr_accessor :terminated_at + + # When the enrollment was last updated + sig { returns(Time) } + attr_accessor :updated_at + + # Summary of Benefits and Coverage (SBC) document URL for the enrolled plan; null + # when not on file. Only individual (ICHRA) plans carry an SBC — group plans have + # no SBC on record and always resolve to null. + sig { returns(T.nilable(String)) } + attr_accessor :sbc_url + + # A single enrollment, including the enrolled plan's documents. + # + # The plan documents are resolved one enrollment at a time and are therefore not + # part of the list row. + sig do + params( + id: String, + answered_at: T.nilable(Time), + benefit: + VitableConnect::Models::EnrollmentRetrieveResponse::Data::Benefit::OrHash, + coverage_end: T.nilable(Date), + coverage_start: Date, + created_at: Time, + employee_deduction_in_cents: T.nilable(Integer), + employee_id: String, + employer_contribution_in_cents: T.nilable(Integer), + employer_id: String, + status: VitableConnect::EnrollmentStatus::OrSymbol, + terminated_at: T.nilable(Time), + updated_at: Time, + sbc_url: T.nilable(String) + ).returns(T.attached_class) + end + def self.new( + # Unique enrollment identifier (enrl\_\*) + id:, + # When the employee enrolled or waived + answered_at:, + # Nested benefit product summary + benefit:, + # Coverage period end date + coverage_end:, + # Coverage period start date + coverage_start:, + # When the enrollment was created + created_at:, + # Employee monthly payroll deduction in cents + employee_deduction_in_cents:, + # Employee ID (empl\_\*) + employee_id:, + # Employer monthly contribution in cents + employer_contribution_in_cents:, + # Employer ID (empr\_\*) + employer_id:, + # - `pending` - Pending + # - `enrolled` - Enrolled + # - `waived` - Waived + # - `inactive` - Inactive + status:, + # When coverage was terminated + terminated_at:, + # When the enrollment was last updated + updated_at:, + # Summary of Benefits and Coverage (SBC) document URL for the enrolled plan; null + # when not on file. Only individual (ICHRA) plans carry an SBC — group plans have + # no SBC on record and always resolve to null. + sbc_url: nil + ) + end + + sig do + override.returns( + { + id: String, + answered_at: T.nilable(Time), + benefit: + VitableConnect::Models::EnrollmentRetrieveResponse::Data::Benefit, + coverage_end: T.nilable(Date), + coverage_start: Date, + created_at: Time, + employee_deduction_in_cents: T.nilable(Integer), + employee_id: String, + employer_contribution_in_cents: T.nilable(Integer), + employer_id: String, + status: VitableConnect::EnrollmentStatus::TaggedSymbol, + terminated_at: T.nilable(Time), + updated_at: Time, + sbc_url: T.nilable(String) + } + ) + end + def to_hash + end + + class Benefit < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::EnrollmentRetrieveResponse::Data::Benefit, + VitableConnect::Internal::AnyHash + ) + end + + # Benefit product ID (bprd\_\*) + sig { returns(String) } + attr_accessor :id + + # - `Medical` - Medical + # - `Dental` - Dental + # - `Vision` - Vision + # - `Hospital` - Hospital + sig do + returns( + VitableConnect::Models::EnrollmentRetrieveResponse::Data::Benefit::Category::TaggedSymbol + ) + end + attr_accessor :category + + # Display name of the benefit product + sig { returns(String) } + attr_accessor :name + + # - `EBA` - Eba Mec + # - `VPC` - Vpc Enhanced + # - `VPC_CORE` - Vpc Core + # - `MEC` - Vpc Mec + # - `MEC2` - Mec2 + # - `MEC_PLUS` - Mec Plus + # - `MVP` - Mvp + # - `MVP2` - Mvp2 + # - `MVPSL` - Mvpsl + # - `MVPSL2` - Mvpsl2 + # - `VD` - Dental + # - `VV` - Vision + # - `ICHRA` - Ichra + # - `ICHRA_PREMIUM_PLUS` - Ichra Premium Plus + # - `ICHRA_REIMBURSEMENT_ONLY` - Ichra Reimbursement Only + sig do + returns( + VitableConnect::Models::EnrollmentRetrieveResponse::Data::Benefit::ProductCode::TaggedSymbol + ) + end + attr_accessor :product_code + + # Nested benefit product summary + sig do + params( + id: String, + category: + VitableConnect::Models::EnrollmentRetrieveResponse::Data::Benefit::Category::OrSymbol, + name: String, + product_code: + VitableConnect::Models::EnrollmentRetrieveResponse::Data::Benefit::ProductCode::OrSymbol + ).returns(T.attached_class) + end + def self.new( + # Benefit product ID (bprd\_\*) + id:, + # - `Medical` - Medical + # - `Dental` - Dental + # - `Vision` - Vision + # - `Hospital` - Hospital + category:, + # Display name of the benefit product + name:, + # - `EBA` - Eba Mec + # - `VPC` - Vpc Enhanced + # - `VPC_CORE` - Vpc Core + # - `MEC` - Vpc Mec + # - `MEC2` - Mec2 + # - `MEC_PLUS` - Mec Plus + # - `MVP` - Mvp + # - `MVP2` - Mvp2 + # - `MVPSL` - Mvpsl + # - `MVPSL2` - Mvpsl2 + # - `VD` - Dental + # - `VV` - Vision + # - `ICHRA` - Ichra + # - `ICHRA_PREMIUM_PLUS` - Ichra Premium Plus + # - `ICHRA_REIMBURSEMENT_ONLY` - Ichra Reimbursement Only + product_code: + ) + end + + sig do + override.returns( + { + id: String, + category: + VitableConnect::Models::EnrollmentRetrieveResponse::Data::Benefit::Category::TaggedSymbol, + name: String, + product_code: + VitableConnect::Models::EnrollmentRetrieveResponse::Data::Benefit::ProductCode::TaggedSymbol + } + ) + end + def to_hash + end + + # - `Medical` - Medical + # - `Dental` - Dental + # - `Vision` - Vision + # - `Hospital` - Hospital + module Category + extend VitableConnect::Internal::Type::Enum + + TaggedSymbol = + T.type_alias do + T.all( + Symbol, + VitableConnect::Models::EnrollmentRetrieveResponse::Data::Benefit::Category + ) + end + OrSymbol = T.type_alias { T.any(Symbol, String) } + + MEDICAL = + T.let( + :Medical, + VitableConnect::Models::EnrollmentRetrieveResponse::Data::Benefit::Category::TaggedSymbol + ) + DENTAL = + T.let( + :Dental, + VitableConnect::Models::EnrollmentRetrieveResponse::Data::Benefit::Category::TaggedSymbol + ) + VISION = + T.let( + :Vision, + VitableConnect::Models::EnrollmentRetrieveResponse::Data::Benefit::Category::TaggedSymbol + ) + HOSPITAL = + T.let( + :Hospital, + VitableConnect::Models::EnrollmentRetrieveResponse::Data::Benefit::Category::TaggedSymbol + ) + + sig do + override.returns( + T::Array[ + VitableConnect::Models::EnrollmentRetrieveResponse::Data::Benefit::Category::TaggedSymbol + ] + ) + end + def self.values + end + end + + # - `EBA` - Eba Mec + # - `VPC` - Vpc Enhanced + # - `VPC_CORE` - Vpc Core + # - `MEC` - Vpc Mec + # - `MEC2` - Mec2 + # - `MEC_PLUS` - Mec Plus + # - `MVP` - Mvp + # - `MVP2` - Mvp2 + # - `MVPSL` - Mvpsl + # - `MVPSL2` - Mvpsl2 + # - `VD` - Dental + # - `VV` - Vision + # - `ICHRA` - Ichra + # - `ICHRA_PREMIUM_PLUS` - Ichra Premium Plus + # - `ICHRA_REIMBURSEMENT_ONLY` - Ichra Reimbursement Only + module ProductCode + extend VitableConnect::Internal::Type::Enum + + TaggedSymbol = + T.type_alias do + T.all( + Symbol, + VitableConnect::Models::EnrollmentRetrieveResponse::Data::Benefit::ProductCode + ) + end + OrSymbol = T.type_alias { T.any(Symbol, String) } + + EBA = + T.let( + :EBA, + VitableConnect::Models::EnrollmentRetrieveResponse::Data::Benefit::ProductCode::TaggedSymbol + ) + VPC = + T.let( + :VPC, + VitableConnect::Models::EnrollmentRetrieveResponse::Data::Benefit::ProductCode::TaggedSymbol + ) + VPC_CORE = + T.let( + :VPC_CORE, + VitableConnect::Models::EnrollmentRetrieveResponse::Data::Benefit::ProductCode::TaggedSymbol + ) + MEC = + T.let( + :MEC, + VitableConnect::Models::EnrollmentRetrieveResponse::Data::Benefit::ProductCode::TaggedSymbol + ) + MEC2 = + T.let( + :MEC2, + VitableConnect::Models::EnrollmentRetrieveResponse::Data::Benefit::ProductCode::TaggedSymbol + ) + MEC_PLUS = + T.let( + :MEC_PLUS, + VitableConnect::Models::EnrollmentRetrieveResponse::Data::Benefit::ProductCode::TaggedSymbol + ) + MVP = + T.let( + :MVP, + VitableConnect::Models::EnrollmentRetrieveResponse::Data::Benefit::ProductCode::TaggedSymbol + ) + MVP2 = + T.let( + :MVP2, + VitableConnect::Models::EnrollmentRetrieveResponse::Data::Benefit::ProductCode::TaggedSymbol + ) + MVPSL = + T.let( + :MVPSL, + VitableConnect::Models::EnrollmentRetrieveResponse::Data::Benefit::ProductCode::TaggedSymbol + ) + MVPSL2 = + T.let( + :MVPSL2, + VitableConnect::Models::EnrollmentRetrieveResponse::Data::Benefit::ProductCode::TaggedSymbol + ) + VD = + T.let( + :VD, + VitableConnect::Models::EnrollmentRetrieveResponse::Data::Benefit::ProductCode::TaggedSymbol + ) + VV = + T.let( + :VV, + VitableConnect::Models::EnrollmentRetrieveResponse::Data::Benefit::ProductCode::TaggedSymbol + ) + ICHRA = + T.let( + :ICHRA, + VitableConnect::Models::EnrollmentRetrieveResponse::Data::Benefit::ProductCode::TaggedSymbol + ) + ICHRA_PREMIUM_PLUS = + T.let( + :ICHRA_PREMIUM_PLUS, + VitableConnect::Models::EnrollmentRetrieveResponse::Data::Benefit::ProductCode::TaggedSymbol + ) + ICHRA_REIMBURSEMENT_ONLY = + T.let( + :ICHRA_REIMBURSEMENT_ONLY, + VitableConnect::Models::EnrollmentRetrieveResponse::Data::Benefit::ProductCode::TaggedSymbol + ) + + sig do + override.returns( + T::Array[ + VitableConnect::Models::EnrollmentRetrieveResponse::Data::Benefit::ProductCode::TaggedSymbol + ] + ) + end + def self.values + end + end + end + end + end + end +end diff --git a/rbi/vitable_connect/models/enrollment_status.rbi b/rbi/vitable_connect/models/enrollment_status.rbi new file mode 100644 index 0000000..cc01055 --- /dev/null +++ b/rbi/vitable_connect/models/enrollment_status.rbi @@ -0,0 +1,32 @@ +# typed: strong + +module VitableConnect + module Models + # - `pending` - Pending + # - `enrolled` - Enrolled + # - `waived` - Waived + # - `inactive` - Inactive + module EnrollmentStatus + extend VitableConnect::Internal::Type::Enum + + TaggedSymbol = + T.type_alias { T.all(Symbol, VitableConnect::EnrollmentStatus) } + OrSymbol = T.type_alias { T.any(Symbol, String) } + + PENDING = T.let(:pending, VitableConnect::EnrollmentStatus::TaggedSymbol) + ENROLLED = + T.let(:enrolled, VitableConnect::EnrollmentStatus::TaggedSymbol) + WAIVED = T.let(:waived, VitableConnect::EnrollmentStatus::TaggedSymbol) + INACTIVE = + T.let(:inactive, VitableConnect::EnrollmentStatus::TaggedSymbol) + + sig do + override.returns( + T::Array[VitableConnect::EnrollmentStatus::TaggedSymbol] + ) + end + def self.values + end + end + end +end diff --git a/rbi/vitable_connect/models/enrollment_terminate_params.rbi b/rbi/vitable_connect/models/enrollment_terminate_params.rbi new file mode 100644 index 0000000..e681bf1 --- /dev/null +++ b/rbi/vitable_connect/models/enrollment_terminate_params.rbi @@ -0,0 +1,72 @@ +# typed: strong + +module VitableConnect + module Models + class EnrollmentTerminateParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + OrHash = + T.type_alias do + T.any( + VitableConnect::EnrollmentTerminateParams, + VitableConnect::Internal::AnyHash + ) + end + + # Unique enrollment identifier (enrl\_\*) + sig { returns(String) } + attr_accessor :enrollment_id + + # Accepted member qualifying life event identifier (qle\_\*) + sig { returns(T.nilable(String)) } + attr_accessor :qualifying_life_event_id + + # Audit reason for the termination; required for user-backed callers and optional + # for long-lived organization API-key callers + sig { returns(T.nilable(String)) } + attr_accessor :reason + + # Optional support or operational ticket number + sig { returns(T.nilable(String)) } + attr_accessor :ticket_number + + sig do + params( + enrollment_id: String, + qualifying_life_event_id: T.nilable(String), + reason: T.nilable(String), + ticket_number: T.nilable(String), + request_options: VitableConnect::RequestOptions::OrHash + ).returns(T.attached_class) + end + def self.new( + # Unique enrollment identifier (enrl\_\*) + enrollment_id:, + # Accepted member qualifying life event identifier (qle\_\*) + qualifying_life_event_id: nil, + # Audit reason for the termination; required for user-backed callers and optional + # for long-lived organization API-key callers + reason: nil, + # Optional support or operational ticket number + ticket_number: nil, + request_options: {} + ) + end + + sig do + override.returns( + { + enrollment_id: String, + qualifying_life_event_id: T.nilable(String), + reason: T.nilable(String), + ticket_number: T.nilable(String), + request_options: VitableConnect::RequestOptions + } + ) + end + def to_hash + end + end + end +end diff --git a/rbi/vitable_connect/models/group.rbi b/rbi/vitable_connect/models/group.rbi new file mode 100644 index 0000000..959243e --- /dev/null +++ b/rbi/vitable_connect/models/group.rbi @@ -0,0 +1,77 @@ +# typed: strong + +module VitableConnect + module Models + class Group < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any(VitableConnect::Group, VitableConnect::Internal::AnyHash) + end + + # Prefixed group identifier (`grp_`). + sig { returns(String) } + attr_accessor :id + + # Group creation timestamp (ISO 8601, UTC). + sig { returns(T.nilable(Time)) } + attr_accessor :created_at + + # Stable identifier for this group in the integrator's own system. + sig { returns(String) } + attr_accessor :external_reference_id + + # Human-readable group name. + sig { returns(String) } + attr_accessor :name + + # Prefixed organization identifier (`org_`). + sig { returns(String) } + attr_accessor :organization_id + + # Last-update timestamp (ISO 8601, UTC). + sig { returns(T.nilable(Time)) } + attr_accessor :updated_at + + sig do + params( + id: String, + created_at: T.nilable(Time), + external_reference_id: String, + name: String, + organization_id: String, + updated_at: T.nilable(Time) + ).returns(T.attached_class) + end + def self.new( + # Prefixed group identifier (`grp_`). + id:, + # Group creation timestamp (ISO 8601, UTC). + created_at:, + # Stable identifier for this group in the integrator's own system. + external_reference_id:, + # Human-readable group name. + name:, + # Prefixed organization identifier (`org_`). + organization_id:, + # Last-update timestamp (ISO 8601, UTC). + updated_at: + ) + end + + sig do + override.returns( + { + id: String, + created_at: T.nilable(Time), + external_reference_id: String, + name: String, + organization_id: String, + updated_at: T.nilable(Time) + } + ) + end + def to_hash + end + end + end +end diff --git a/rbi/vitable_connect/models/group_create_params.rbi b/rbi/vitable_connect/models/group_create_params.rbi new file mode 100644 index 0000000..7be65bb --- /dev/null +++ b/rbi/vitable_connect/models/group_create_params.rbi @@ -0,0 +1,46 @@ +# typed: strong + +module VitableConnect + module Models + class GroupCreateParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + OrHash = + T.type_alias do + T.any( + VitableConnect::GroupCreateParams, + VitableConnect::Internal::AnyHash + ) + end + + sig { returns(String) } + attr_accessor :external_reference_id + + sig { returns(String) } + attr_accessor :name + + sig do + params( + external_reference_id: String, + name: String, + request_options: VitableConnect::RequestOptions::OrHash + ).returns(T.attached_class) + end + def self.new(external_reference_id:, name:, request_options: {}) + end + + sig do + override.returns( + { + external_reference_id: String, + name: String, + request_options: VitableConnect::RequestOptions + } + ) + end + def to_hash + end + end + end +end diff --git a/rbi/vitable_connect/models/group_list_params.rbi b/rbi/vitable_connect/models/group_list_params.rbi new file mode 100644 index 0000000..3781fe0 --- /dev/null +++ b/rbi/vitable_connect/models/group_list_params.rbi @@ -0,0 +1,60 @@ +# typed: strong + +module VitableConnect + module Models + class GroupListParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + OrHash = + T.type_alias do + T.any( + VitableConnect::GroupListParams, + VitableConnect::Internal::AnyHash + ) + end + + # Items per page (default: 20, max: 100) + sig { returns(T.nilable(Integer)) } + attr_reader :limit + + sig { params(limit: Integer).void } + attr_writer :limit + + # Page number (default: 1) + sig { returns(T.nilable(Integer)) } + attr_reader :page + + sig { params(page: Integer).void } + attr_writer :page + + sig do + params( + limit: Integer, + page: Integer, + request_options: VitableConnect::RequestOptions::OrHash + ).returns(T.attached_class) + end + def self.new( + # Items per page (default: 20, max: 100) + limit: nil, + # Page number (default: 1) + page: nil, + request_options: {} + ) + end + + sig do + override.returns( + { + limit: Integer, + page: Integer, + request_options: VitableConnect::RequestOptions + } + ) + end + def to_hash + end + end + end +end diff --git a/rbi/vitable_connect/models/group_response.rbi b/rbi/vitable_connect/models/group_response.rbi new file mode 100644 index 0000000..9cf7816 --- /dev/null +++ b/rbi/vitable_connect/models/group_response.rbi @@ -0,0 +1,32 @@ +# typed: strong + +module VitableConnect + module Models + class GroupResponse < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::GroupResponse, + VitableConnect::Internal::AnyHash + ) + end + + sig { returns(VitableConnect::Group) } + attr_reader :data + + sig { params(data: VitableConnect::Group::OrHash).void } + attr_writer :data + + # Response containing a single group resource. + sig do + params(data: VitableConnect::Group::OrHash).returns(T.attached_class) + end + def self.new(data:) + end + + sig { override.returns({ data: VitableConnect::Group }) } + def to_hash + end + end + end +end diff --git a/rbi/vitable_connect/models/group_retrieve_params.rbi b/rbi/vitable_connect/models/group_retrieve_params.rbi new file mode 100644 index 0000000..52d970d --- /dev/null +++ b/rbi/vitable_connect/models/group_retrieve_params.rbi @@ -0,0 +1,43 @@ +# typed: strong + +module VitableConnect + module Models + class GroupRetrieveParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + OrHash = + T.type_alias do + T.any( + VitableConnect::GroupRetrieveParams, + VitableConnect::Internal::AnyHash + ) + end + + # Unique group identifier (grp\_\*) + sig { returns(String) } + attr_accessor :group_id + + sig do + params( + group_id: String, + request_options: VitableConnect::RequestOptions::OrHash + ).returns(T.attached_class) + end + def self.new( + # Unique group identifier (grp\_\*) + group_id:, + request_options: {} + ) + end + + sig do + override.returns( + { group_id: String, request_options: VitableConnect::RequestOptions } + ) + end + def to_hash + end + end + end +end diff --git a/rbi/vitable_connect/models/group_update_params.rbi b/rbi/vitable_connect/models/group_update_params.rbi new file mode 100644 index 0000000..0bca9ee --- /dev/null +++ b/rbi/vitable_connect/models/group_update_params.rbi @@ -0,0 +1,58 @@ +# typed: strong + +module VitableConnect + module Models + class GroupUpdateParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + OrHash = + T.type_alias do + T.any( + VitableConnect::GroupUpdateParams, + VitableConnect::Internal::AnyHash + ) + end + + # Unique group identifier (grp\_\*) + sig { returns(String) } + attr_accessor :group_id + + sig { returns(T.nilable(String)) } + attr_accessor :external_reference_id + + sig { returns(T.nilable(String)) } + attr_accessor :name + + sig do + params( + group_id: String, + external_reference_id: T.nilable(String), + name: T.nilable(String), + request_options: VitableConnect::RequestOptions::OrHash + ).returns(T.attached_class) + end + def self.new( + # Unique group identifier (grp\_\*) + group_id:, + external_reference_id: nil, + name: nil, + request_options: {} + ) + end + + sig do + override.returns( + { + group_id: String, + external_reference_id: T.nilable(String), + name: T.nilable(String), + request_options: VitableConnect::RequestOptions + } + ) + end + def to_hash + end + end + end +end diff --git a/rbi/vitable_connect/models/groups/members/sync_retrieve_params.rbi b/rbi/vitable_connect/models/groups/members/sync_retrieve_params.rbi new file mode 100644 index 0000000..8d06d00 --- /dev/null +++ b/rbi/vitable_connect/models/groups/members/sync_retrieve_params.rbi @@ -0,0 +1,56 @@ +# typed: strong + +module VitableConnect + module Models + module Groups + module Members + class SyncRetrieveParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + OrHash = + T.type_alias do + T.any( + VitableConnect::Groups::Members::SyncRetrieveParams, + VitableConnect::Internal::AnyHash + ) + end + + # Unique group identifier (grp\_\*) + sig { returns(String) } + attr_accessor :group_id + + sig { returns(String) } + attr_accessor :request_id + + sig do + params( + group_id: String, + request_id: String, + request_options: VitableConnect::RequestOptions::OrHash + ).returns(T.attached_class) + end + def self.new( + # Unique group identifier (grp\_\*) + group_id:, + request_id:, + request_options: {} + ) + end + + sig do + override.returns( + { + group_id: String, + request_id: String, + request_options: VitableConnect::RequestOptions + } + ) + end + def to_hash + end + end + end + end + end +end diff --git a/rbi/vitable_connect/models/groups/members/sync_retrieve_response.rbi b/rbi/vitable_connect/models/groups/members/sync_retrieve_response.rbi new file mode 100644 index 0000000..3d0dbf6 --- /dev/null +++ b/rbi/vitable_connect/models/groups/members/sync_retrieve_response.rbi @@ -0,0 +1,282 @@ +# typed: strong + +module VitableConnect + module Models + module Groups + module Members + class SyncRetrieveResponse < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::Groups::Members::SyncRetrieveResponse, + VitableConnect::Internal::AnyHash + ) + end + + sig do + returns( + VitableConnect::Models::Groups::Members::SyncRetrieveResponse::Data + ) + end + attr_reader :data + + sig do + params( + data: + VitableConnect::Models::Groups::Members::SyncRetrieveResponse::Data::OrHash + ).void + end + attr_writer :data + + # Response containing a single group member sync request detail resource. + sig do + params( + data: + VitableConnect::Models::Groups::Members::SyncRetrieveResponse::Data::OrHash + ).returns(T.attached_class) + end + def self.new(data:) + end + + sig do + override.returns( + { + data: + VitableConnect::Models::Groups::Members::SyncRetrieveResponse::Data + } + ) + end + def to_hash + end + + class Data < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::Groups::Members::SyncRetrieveResponse::Data, + VitableConnect::Internal::AnyHash + ) + end + + sig { returns(Time) } + attr_accessor :accepted_at + + sig { returns(T.nilable(Time)) } + attr_accessor :completed_at + + sig { returns(String) } + attr_accessor :group_id + + sig { returns(String) } + attr_accessor :request_id + + sig do + returns( + T.nilable( + VitableConnect::Models::Groups::Members::SyncRetrieveResponse::Data::Results + ) + ) + end + attr_reader :results + + sig do + params( + results: + T.nilable( + VitableConnect::Models::Groups::Members::SyncRetrieveResponse::Data::Results::OrHash + ) + ).void + end + attr_writer :results + + sig do + params( + accepted_at: Time, + completed_at: T.nilable(Time), + group_id: String, + request_id: String, + results: + T.nilable( + VitableConnect::Models::Groups::Members::SyncRetrieveResponse::Data::Results::OrHash + ) + ).returns(T.attached_class) + end + def self.new( + accepted_at:, + completed_at:, + group_id:, + request_id:, + results: + ) + end + + sig do + override.returns( + { + accepted_at: Time, + completed_at: T.nilable(Time), + group_id: String, + request_id: String, + results: + T.nilable( + VitableConnect::Models::Groups::Members::SyncRetrieveResponse::Data::Results + ) + } + ) + end + def to_hash + end + + class Results < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::Groups::Members::SyncRetrieveResponse::Data::Results, + VitableConnect::Internal::AnyHash + ) + end + + sig { returns(T::Array[String]) } + attr_accessor :added_group_member_ids + + sig do + returns( + T::Array[ + VitableConnect::Models::Groups::Members::SyncRetrieveResponse::Data::Results::Failure + ] + ) + end + attr_accessor :failures + + sig { returns(T::Array[String]) } + attr_accessor :removed_group_member_ids + + sig do + params( + added_group_member_ids: T::Array[String], + failures: + T::Array[ + VitableConnect::Models::Groups::Members::SyncRetrieveResponse::Data::Results::Failure::OrHash + ], + removed_group_member_ids: T::Array[String] + ).returns(T.attached_class) + end + def self.new( + added_group_member_ids:, + failures:, + removed_group_member_ids: + ) + end + + sig do + override.returns( + { + added_group_member_ids: T::Array[String], + failures: + T::Array[ + VitableConnect::Models::Groups::Members::SyncRetrieveResponse::Data::Results::Failure + ], + removed_group_member_ids: T::Array[String] + } + ) + end + def to_hash + end + + class Failure < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::Groups::Members::SyncRetrieveResponse::Data::Results::Failure, + VitableConnect::Internal::AnyHash + ) + end + + # - `add` - add + # - `remove` - remove + sig do + returns( + VitableConnect::Models::Groups::Members::SyncRetrieveResponse::Data::Results::Failure::Operation::TaggedSymbol + ) + end + attr_accessor :operation + + sig { returns(String) } + attr_accessor :reason + + sig { returns(String) } + attr_accessor :reference_id + + sig do + params( + operation: + VitableConnect::Models::Groups::Members::SyncRetrieveResponse::Data::Results::Failure::Operation::OrSymbol, + reason: String, + reference_id: String + ).returns(T.attached_class) + end + def self.new( + # - `add` - add + # - `remove` - remove + operation:, + reason:, + reference_id: + ) + end + + sig do + override.returns( + { + operation: + VitableConnect::Models::Groups::Members::SyncRetrieveResponse::Data::Results::Failure::Operation::TaggedSymbol, + reason: String, + reference_id: String + } + ) + end + def to_hash + end + + # - `add` - add + # - `remove` - remove + module Operation + extend VitableConnect::Internal::Type::Enum + + TaggedSymbol = + T.type_alias do + T.all( + Symbol, + VitableConnect::Models::Groups::Members::SyncRetrieveResponse::Data::Results::Failure::Operation + ) + end + OrSymbol = T.type_alias { T.any(Symbol, String) } + + ADD = + T.let( + :add, + VitableConnect::Models::Groups::Members::SyncRetrieveResponse::Data::Results::Failure::Operation::TaggedSymbol + ) + REMOVE = + T.let( + :remove, + VitableConnect::Models::Groups::Members::SyncRetrieveResponse::Data::Results::Failure::Operation::TaggedSymbol + ) + + sig do + override.returns( + T::Array[ + VitableConnect::Models::Groups::Members::SyncRetrieveResponse::Data::Results::Failure::Operation::TaggedSymbol + ] + ) + end + def self.values + end + end + end + end + end + end + end + end + end +end diff --git a/rbi/vitable_connect/models/groups/members/sync_submit_params.rbi b/rbi/vitable_connect/models/groups/members/sync_submit_params.rbi new file mode 100644 index 0000000..f73714e --- /dev/null +++ b/rbi/vitable_connect/models/groups/members/sync_submit_params.rbi @@ -0,0 +1,214 @@ +# typed: strong + +module VitableConnect + module Models + module Groups + module Members + class SyncSubmitParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + OrHash = + T.type_alias do + T.any( + VitableConnect::Groups::Members::SyncSubmitParams, + VitableConnect::Internal::AnyHash + ) + end + + # Unique group identifier (grp\_\*) + sig { returns(String) } + attr_accessor :group_id + + sig do + returns( + T::Array[ + VitableConnect::Groups::Members::SyncSubmitParams::Member + ] + ) + end + attr_accessor :members + + sig do + params( + group_id: String, + members: + T::Array[ + VitableConnect::Groups::Members::SyncSubmitParams::Member::OrHash + ], + request_options: VitableConnect::RequestOptions::OrHash + ).returns(T.attached_class) + end + def self.new( + # Unique group identifier (grp\_\*) + group_id:, + members:, + request_options: {} + ) + end + + sig do + override.returns( + { + group_id: String, + members: + T::Array[ + VitableConnect::Groups::Members::SyncSubmitParams::Member + ], + request_options: VitableConnect::RequestOptions + } + ) + end + def to_hash + end + + class Member < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Groups::Members::SyncSubmitParams::Member, + VitableConnect::Internal::AnyHash + ) + end + + sig do + returns( + VitableConnect::Groups::Members::SyncSubmitParams::Member::Address + ) + end + attr_reader :address + + sig do + params( + address: + VitableConnect::Groups::Members::SyncSubmitParams::Member::Address::OrHash + ).void + end + attr_writer :address + + sig { returns(Date) } + attr_accessor :date_of_birth + + sig { returns(String) } + attr_accessor :first_name + + sig { returns(String) } + attr_accessor :last_name + + sig { returns(String) } + attr_accessor :plan_id + + sig { returns(String) } + attr_accessor :reference_id + + sig { returns(T.nilable(String)) } + attr_accessor :email + + sig { returns(T.nilable(String)) } + attr_accessor :phone + + sig do + params( + address: + VitableConnect::Groups::Members::SyncSubmitParams::Member::Address::OrHash, + date_of_birth: Date, + first_name: String, + last_name: String, + plan_id: String, + reference_id: String, + email: T.nilable(String), + phone: T.nilable(String) + ).returns(T.attached_class) + end + def self.new( + address:, + date_of_birth:, + first_name:, + last_name:, + plan_id:, + reference_id:, + email: nil, + phone: nil + ) + end + + sig do + override.returns( + { + address: + VitableConnect::Groups::Members::SyncSubmitParams::Member::Address, + date_of_birth: Date, + first_name: String, + last_name: String, + plan_id: String, + reference_id: String, + email: T.nilable(String), + phone: T.nilable(String) + } + ) + end + def to_hash + end + + class Address < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Groups::Members::SyncSubmitParams::Member::Address, + VitableConnect::Internal::AnyHash + ) + end + + sig { returns(String) } + attr_accessor :address_line_1 + + sig { returns(String) } + attr_accessor :city + + sig { returns(String) } + attr_accessor :state + + sig { returns(String) } + attr_accessor :zipcode + + sig { returns(T.nilable(String)) } + attr_accessor :address_line_2 + + sig do + params( + address_line_1: String, + city: String, + state: String, + zipcode: String, + address_line_2: T.nilable(String) + ).returns(T.attached_class) + end + def self.new( + address_line_1:, + city:, + state:, + zipcode:, + address_line_2: nil + ) + end + + sig do + override.returns( + { + address_line_1: String, + city: String, + state: String, + zipcode: String, + address_line_2: T.nilable(String) + } + ) + end + def to_hash + end + end + end + end + end + end + end +end diff --git a/rbi/vitable_connect/models/groups/members/sync_submit_response.rbi b/rbi/vitable_connect/models/groups/members/sync_submit_response.rbi new file mode 100644 index 0000000..7e35867 --- /dev/null +++ b/rbi/vitable_connect/models/groups/members/sync_submit_response.rbi @@ -0,0 +1,92 @@ +# typed: strong + +module VitableConnect + module Models + module Groups + module Members + class SyncSubmitResponse < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::Groups::Members::SyncSubmitResponse, + VitableConnect::Internal::AnyHash + ) + end + + sig do + returns( + VitableConnect::Models::Groups::Members::SyncSubmitResponse::Data + ) + end + attr_reader :data + + sig do + params( + data: + VitableConnect::Models::Groups::Members::SyncSubmitResponse::Data::OrHash + ).void + end + attr_writer :data + + # Response containing a single group member sync detail resource. + sig do + params( + data: + VitableConnect::Models::Groups::Members::SyncSubmitResponse::Data::OrHash + ).returns(T.attached_class) + end + def self.new(data:) + end + + sig do + override.returns( + { + data: + VitableConnect::Models::Groups::Members::SyncSubmitResponse::Data + } + ) + end + def to_hash + end + + class Data < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::Groups::Members::SyncSubmitResponse::Data, + VitableConnect::Internal::AnyHash + ) + end + + sig { returns(Time) } + attr_accessor :accepted_at + + sig { returns(String) } + attr_accessor :group_id + + sig { returns(String) } + attr_accessor :request_id + + sig do + params( + accepted_at: Time, + group_id: String, + request_id: String + ).returns(T.attached_class) + end + def self.new(accepted_at:, group_id:, request_id:) + end + + sig do + override.returns( + { accepted_at: Time, group_id: String, request_id: String } + ) + end + def to_hash + end + end + end + end + end + end +end diff --git a/rbi/vitable_connect/models/member_list_dependents_params.rbi b/rbi/vitable_connect/models/member_list_dependents_params.rbi new file mode 100644 index 0000000..be17762 --- /dev/null +++ b/rbi/vitable_connect/models/member_list_dependents_params.rbi @@ -0,0 +1,43 @@ +# typed: strong + +module VitableConnect + module Models + class MemberListDependentsParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + OrHash = + T.type_alias do + T.any( + VitableConnect::MemberListDependentsParams, + VitableConnect::Internal::AnyHash + ) + end + + # Unique member identifier (mbr\_\*) + sig { returns(String) } + attr_accessor :member_id + + sig do + params( + member_id: String, + request_options: VitableConnect::RequestOptions::OrHash + ).returns(T.attached_class) + end + def self.new( + # Unique member identifier (mbr\_\*) + member_id:, + request_options: {} + ) + end + + sig do + override.returns( + { member_id: String, request_options: VitableConnect::RequestOptions } + ) + end + def to_hash + end + end + end +end diff --git a/rbi/vitable_connect/models/member_list_dependents_response.rbi b/rbi/vitable_connect/models/member_list_dependents_response.rbi new file mode 100644 index 0000000..e234db3 --- /dev/null +++ b/rbi/vitable_connect/models/member_list_dependents_response.rbi @@ -0,0 +1,249 @@ +# typed: strong + +module VitableConnect + module Models + class MemberListDependentsResponse < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::MemberListDependentsResponse, + VitableConnect::Internal::AnyHash + ) + end + + sig do + returns( + T::Array[VitableConnect::Models::MemberListDependentsResponse::Data] + ) + end + attr_accessor :data + + # Unpaginated `{"data": [...]}` list of member dependents. + sig do + params( + data: + T::Array[ + VitableConnect::Models::MemberListDependentsResponse::Data::OrHash + ] + ).returns(T.attached_class) + end + def self.new(data:) + end + + sig do + override.returns( + { + data: + T::Array[ + VitableConnect::Models::MemberListDependentsResponse::Data + ] + } + ) + end + def to_hash + end + + class Data < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::MemberListDependentsResponse::Data, + VitableConnect::Internal::AnyHash + ) + end + + # Dependent's age in years, derived from date of birth + sig { returns(Integer) } + attr_accessor :age + + # Date of birth (YYYY-MM-DD) + sig { returns(Date) } + attr_accessor :date_of_birth + + # Dependent's first name + sig { returns(String) } + attr_accessor :first_name + + # Dependent's last name + sig { returns(String) } + attr_accessor :last_name + + # - `Spouse` - Spouse + # - `Child` - Child + sig do + returns( + VitableConnect::Models::MemberListDependentsResponse::Data::Relationship::TaggedSymbol + ) + end + attr_accessor :relationship + + # - `Male` - Male + # - `Female` - Female + # - `Other` - Other + # - `Unknown` - Unknown + sig do + returns( + T.nilable( + VitableConnect::Models::MemberListDependentsResponse::Data::SexAtBirth::TaggedSymbol + ) + ) + end + attr_accessor :sex_at_birth + + # The dependent's own member identifier with 'mbr\_' prefix + sig { returns(String) } + attr_accessor :member_id + + # The primary member's identifier with 'mbr\_' prefix + sig { returns(String) } + attr_accessor :primary_member_id + + # Wire serializer for :class:`MemberLegalDependentDTO` (one legal-dependent row). + sig do + params( + age: Integer, + date_of_birth: Date, + first_name: String, + last_name: String, + member_id: String, + primary_member_id: String, + relationship: + VitableConnect::Models::MemberListDependentsResponse::Data::Relationship::OrSymbol, + sex_at_birth: + T.nilable( + VitableConnect::Models::MemberListDependentsResponse::Data::SexAtBirth::OrSymbol + ) + ).returns(T.attached_class) + end + def self.new( + # Dependent's age in years, derived from date of birth + age:, + # Date of birth (YYYY-MM-DD) + date_of_birth:, + # Dependent's first name + first_name:, + # Dependent's last name + last_name:, + # The dependent's own member identifier with 'mbr\_' prefix + member_id:, + # The primary member's identifier with 'mbr\_' prefix + primary_member_id:, + # - `Spouse` - Spouse + # - `Child` - Child + relationship:, + # - `Male` - Male + # - `Female` - Female + # - `Other` - Other + # - `Unknown` - Unknown + sex_at_birth: nil + ) + end + + sig do + override.returns( + { + age: Integer, + date_of_birth: Date, + first_name: String, + last_name: String, + member_id: String, + primary_member_id: String, + relationship: + VitableConnect::Models::MemberListDependentsResponse::Data::Relationship::TaggedSymbol, + sex_at_birth: + T.nilable( + VitableConnect::Models::MemberListDependentsResponse::Data::SexAtBirth::TaggedSymbol + ) + } + ) + end + def to_hash + end + + # - `Spouse` - Spouse + # - `Child` - Child + module Relationship + extend VitableConnect::Internal::Type::Enum + + TaggedSymbol = + T.type_alias do + T.all( + Symbol, + VitableConnect::Models::MemberListDependentsResponse::Data::Relationship + ) + end + OrSymbol = T.type_alias { T.any(Symbol, String) } + + SPOUSE = + T.let( + :Spouse, + VitableConnect::Models::MemberListDependentsResponse::Data::Relationship::TaggedSymbol + ) + CHILD = + T.let( + :Child, + VitableConnect::Models::MemberListDependentsResponse::Data::Relationship::TaggedSymbol + ) + + sig do + override.returns( + T::Array[ + VitableConnect::Models::MemberListDependentsResponse::Data::Relationship::TaggedSymbol + ] + ) + end + def self.values + end + end + + # - `Male` - Male + # - `Female` - Female + # - `Other` - Other + # - `Unknown` - Unknown + module SexAtBirth + extend VitableConnect::Internal::Type::Enum + + TaggedSymbol = + T.type_alias do + T.all( + Symbol, + VitableConnect::Models::MemberListDependentsResponse::Data::SexAtBirth + ) + end + OrSymbol = T.type_alias { T.any(Symbol, String) } + + MALE = + T.let( + :Male, + VitableConnect::Models::MemberListDependentsResponse::Data::SexAtBirth::TaggedSymbol + ) + FEMALE = + T.let( + :Female, + VitableConnect::Models::MemberListDependentsResponse::Data::SexAtBirth::TaggedSymbol + ) + OTHER = + T.let( + :Other, + VitableConnect::Models::MemberListDependentsResponse::Data::SexAtBirth::TaggedSymbol + ) + UNKNOWN = + T.let( + :Unknown, + VitableConnect::Models::MemberListDependentsResponse::Data::SexAtBirth::TaggedSymbol + ) + + sig do + override.returns( + T::Array[ + VitableConnect::Models::MemberListDependentsResponse::Data::SexAtBirth::TaggedSymbol + ] + ) + end + def self.values + end + end + end + end + end +end diff --git a/rbi/vitable_connect/models/member_list_employments_params.rbi b/rbi/vitable_connect/models/member_list_employments_params.rbi new file mode 100644 index 0000000..8de4a96 --- /dev/null +++ b/rbi/vitable_connect/models/member_list_employments_params.rbi @@ -0,0 +1,43 @@ +# typed: strong + +module VitableConnect + module Models + class MemberListEmploymentsParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + OrHash = + T.type_alias do + T.any( + VitableConnect::MemberListEmploymentsParams, + VitableConnect::Internal::AnyHash + ) + end + + # Unique member identifier (mbr\_\*) + sig { returns(String) } + attr_accessor :member_id + + sig do + params( + member_id: String, + request_options: VitableConnect::RequestOptions::OrHash + ).returns(T.attached_class) + end + def self.new( + # Unique member identifier (mbr\_\*) + member_id:, + request_options: {} + ) + end + + sig do + override.returns( + { member_id: String, request_options: VitableConnect::RequestOptions } + ) + end + def to_hash + end + end + end +end diff --git a/rbi/vitable_connect/models/member_list_employments_response.rbi b/rbi/vitable_connect/models/member_list_employments_response.rbi new file mode 100644 index 0000000..40249e1 --- /dev/null +++ b/rbi/vitable_connect/models/member_list_employments_response.rbi @@ -0,0 +1,31 @@ +# typed: strong + +module VitableConnect + module Models + class MemberListEmploymentsResponse < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::MemberListEmploymentsResponse, + VitableConnect::Internal::AnyHash + ) + end + + sig { returns(T::Array[VitableConnect::Employee]) } + attr_accessor :data + + # Unpaginated `{"data": [...]}` list of member employments. + sig do + params(data: T::Array[VitableConnect::Employee::OrHash]).returns( + T.attached_class + ) + end + def self.new(data:) + end + + sig { override.returns({ data: T::Array[VitableConnect::Employee] }) } + def to_hash + end + end + end +end diff --git a/rbi/vitable_connect/models/member_list_enrollments_params.rbi b/rbi/vitable_connect/models/member_list_enrollments_params.rbi new file mode 100644 index 0000000..1375bbe --- /dev/null +++ b/rbi/vitable_connect/models/member_list_enrollments_params.rbi @@ -0,0 +1,43 @@ +# typed: strong + +module VitableConnect + module Models + class MemberListEnrollmentsParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + OrHash = + T.type_alias do + T.any( + VitableConnect::MemberListEnrollmentsParams, + VitableConnect::Internal::AnyHash + ) + end + + # Unique member identifier (mbr\_\*) + sig { returns(String) } + attr_accessor :member_id + + sig do + params( + member_id: String, + request_options: VitableConnect::RequestOptions::OrHash + ).returns(T.attached_class) + end + def self.new( + # Unique member identifier (mbr\_\*) + member_id:, + request_options: {} + ) + end + + sig do + override.returns( + { member_id: String, request_options: VitableConnect::RequestOptions } + ) + end + def to_hash + end + end + end +end diff --git a/rbi/vitable_connect/models/member_list_enrollments_response.rbi b/rbi/vitable_connect/models/member_list_enrollments_response.rbi new file mode 100644 index 0000000..e93bb41 --- /dev/null +++ b/rbi/vitable_connect/models/member_list_enrollments_response.rbi @@ -0,0 +1,635 @@ +# typed: strong + +module VitableConnect + module Models + class MemberListEnrollmentsResponse < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::MemberListEnrollmentsResponse, + VitableConnect::Internal::AnyHash + ) + end + + sig do + returns( + T::Array[VitableConnect::Models::MemberListEnrollmentsResponse::Data] + ) + end + attr_accessor :data + + # Unpaginated `{"data": [...]}` list of member enrollments. + sig do + params( + data: + T::Array[ + VitableConnect::Models::MemberListEnrollmentsResponse::Data::OrHash + ] + ).returns(T.attached_class) + end + def self.new(data:) + end + + sig do + override.returns( + { + data: + T::Array[ + VitableConnect::Models::MemberListEnrollmentsResponse::Data + ] + } + ) + end + def to_hash + end + + class Data < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::MemberListEnrollmentsResponse::Data, + VitableConnect::Internal::AnyHash + ) + end + + # Opaque, stable enrollment identifier used to target enrollment actions + sig { returns(String) } + attr_accessor :id + + # Exact benefit plan-year identifier for this enrollment + sig { returns(String) } + attr_accessor :benefit_plan_year_id + + # - `Medical` - Medical + # - `Dental` - Dental + # - `Vision` - Vision + # - `Hospital` - Hospital + sig do + returns( + VitableConnect::Models::MemberListEnrollmentsResponse::Data::BenefitType::TaggedSymbol + ) + end + attr_accessor :benefit_type + + # Earliest applicable coverage boundary (YYYY-MM-DD) when coverage was cancelled + # before its effective start; null unless the enrollment was cancelled + sig { returns(T.nilable(Date)) } + attr_accessor :cancelled_date + + # - `Enrolled` - Enrolled + # - `Waived` - Waived + # - `Pending` - Pending + # - `Expired` - Expired + sig do + returns( + VitableConnect::Models::MemberListEnrollmentsResponse::Data::ElectionStatus::TaggedSymbol + ) + end + attr_accessor :election_status + + # Exact employer identifier for this enrollment + sig { returns(String) } + attr_accessor :employer_id + + # Name of the employer the enrollment is through + sig { returns(String) } + attr_accessor :employer_name + + # First date the member could answer this enrollment (YYYY-MM-DD). Open + # enrollment's start date for a row issued before open enrollment opened, + # otherwise the date the row was issued -- an enrollment is never answerable + # before it exists, so this is never earlier than `issued_date`. + sig { returns(Date) } + attr_accessor :enrollment_window_start + + # True when today falls in the final month of the plan-year coverage window; + # drives end-of-coverage enrollment actions on the client. + sig { returns(T::Boolean) } + attr_accessor :in_last_month_of_coverage + + # True when today falls inside the enrollment window this member has to answer in; + # drives enrollment-action availability on the client. + sig { returns(T::Boolean) } + attr_accessor :is_within_enrollment_window + + # Date the enrollment record was created (YYYY-MM-DD), the value Ops labels Issued + # on. Present on every row whatever the member answered, and distinct from + # `coverage_start`. It equals `enrollment_window_start` for a row issued once its + # open enrollment had already opened, and precedes it for a row issued ahead of + # open enrollment. + sig { returns(Date) } + attr_accessor :issued_date + + # Benefit plan-year coverage end date (YYYY-MM-DD), distinct from this + # enrollment's coverage_end; null when the plan year is open-ended + sig { returns(T.nilable(Date)) } + attr_accessor :plan_year_coverage_end + + # - `Coverage Upcoming` - Coverage Upcoming + # - `Coverage Effective` - Coverage Effective + # - `Coverage Ended` - Coverage Ended + # - `Cancelled` - Cancelled + sig do + returns( + T.nilable( + VitableConnect::Models::MemberListEnrollmentsResponse::Data::PolicyStatus::TaggedSymbol + ) + ) + end + attr_accessor :policy_status + + # - `EBA` - Eba Mec + # - `VPC` - Vpc Enhanced + # - `VPC_CORE` - Vpc Core + # - `MEC` - Vpc Mec + # - `MEC2` - Mec2 + # - `MEC_PLUS` - Mec Plus + # - `MVP` - Mvp + # - `MVP2` - Mvp2 + # - `MVPSL` - Mvpsl + # - `MVPSL2` - Mvpsl2 + # - `VD` - Dental + # - `VV` - Vision + # - `ICHRA` - Ichra + # - `ICHRA_PREMIUM_PLUS` - Ichra Premium Plus + # - `ICHRA_REIMBURSEMENT_ONLY` - Ichra Reimbursement Only + sig do + returns( + VitableConnect::Models::MemberListEnrollmentsResponse::Data::ProductCode::TaggedSymbol + ) + end + attr_accessor :product_code + + # Display name of the benefit product + sig { returns(String) } + attr_accessor :product_name + + # Whether a qualifying life event would be required to reissue this enrollment + # under the product and open-enrollment rule at the time this list was read + sig { returns(T::Boolean) } + attr_accessor :requires_qle_for_reissue + + # Insurance carrier name; null when no active carrier period is resolvable + sig { returns(T.nilable(String)) } + attr_accessor :carrier_name + + # Coverage window end date (YYYY-MM-DD); null while coverage is open-ended + sig { returns(T.nilable(Date)) } + attr_accessor :coverage_end + + # Coverage window start date (YYYY-MM-DD) + sig { returns(T.nilable(Date)) } + attr_accessor :coverage_start + + # Employee monthly payroll deduction in cents; null unless the row is an election + sig { returns(T.nilable(Integer)) } + attr_accessor :employee_deduction_in_cents + + # Employer monthly contribution in cents; null unless the row is an election + sig { returns(T.nilable(Integer)) } + attr_accessor :employer_contribution_in_cents + + # Enrollment / open-enrollment window end date (YYYY-MM-DD); null when open-ended + sig { returns(T.nilable(Date)) } + attr_accessor :enrollment_window_end + + # Chosen benefit plan name; null unless the row is an election + sig { returns(T.nilable(String)) } + attr_accessor :plan_name + + # Total monthly plan premium in cents; null unless the row is an election + sig { returns(T.nilable(Integer)) } + attr_accessor :premium_in_cents + + # Chosen benefit plan tier name (e.g., Employee Only); null unless the row is an + # election + sig { returns(T.nilable(String)) } + attr_accessor :tier_name + + # Wire serializer for :class:`MemberEnrollmentDTO` (one benefit enrollment row). + sig do + params( + id: String, + benefit_plan_year_id: String, + benefit_type: + VitableConnect::Models::MemberListEnrollmentsResponse::Data::BenefitType::OrSymbol, + cancelled_date: T.nilable(Date), + election_status: + VitableConnect::Models::MemberListEnrollmentsResponse::Data::ElectionStatus::OrSymbol, + employer_id: String, + employer_name: String, + enrollment_window_start: Date, + in_last_month_of_coverage: T::Boolean, + is_within_enrollment_window: T::Boolean, + issued_date: Date, + plan_year_coverage_end: T.nilable(Date), + policy_status: + T.nilable( + VitableConnect::Models::MemberListEnrollmentsResponse::Data::PolicyStatus::OrSymbol + ), + product_code: + VitableConnect::Models::MemberListEnrollmentsResponse::Data::ProductCode::OrSymbol, + product_name: String, + requires_qle_for_reissue: T::Boolean, + carrier_name: T.nilable(String), + coverage_end: T.nilable(Date), + coverage_start: T.nilable(Date), + employee_deduction_in_cents: T.nilable(Integer), + employer_contribution_in_cents: T.nilable(Integer), + enrollment_window_end: T.nilable(Date), + plan_name: T.nilable(String), + premium_in_cents: T.nilable(Integer), + tier_name: T.nilable(String) + ).returns(T.attached_class) + end + def self.new( + # Opaque, stable enrollment identifier used to target enrollment actions + id:, + # Exact benefit plan-year identifier for this enrollment + benefit_plan_year_id:, + # - `Medical` - Medical + # - `Dental` - Dental + # - `Vision` - Vision + # - `Hospital` - Hospital + benefit_type:, + # Earliest applicable coverage boundary (YYYY-MM-DD) when coverage was cancelled + # before its effective start; null unless the enrollment was cancelled + cancelled_date:, + # - `Enrolled` - Enrolled + # - `Waived` - Waived + # - `Pending` - Pending + # - `Expired` - Expired + election_status:, + # Exact employer identifier for this enrollment + employer_id:, + # Name of the employer the enrollment is through + employer_name:, + # First date the member could answer this enrollment (YYYY-MM-DD). Open + # enrollment's start date for a row issued before open enrollment opened, + # otherwise the date the row was issued -- an enrollment is never answerable + # before it exists, so this is never earlier than `issued_date`. + enrollment_window_start:, + # True when today falls in the final month of the plan-year coverage window; + # drives end-of-coverage enrollment actions on the client. + in_last_month_of_coverage:, + # True when today falls inside the enrollment window this member has to answer in; + # drives enrollment-action availability on the client. + is_within_enrollment_window:, + # Date the enrollment record was created (YYYY-MM-DD), the value Ops labels Issued + # on. Present on every row whatever the member answered, and distinct from + # `coverage_start`. It equals `enrollment_window_start` for a row issued once its + # open enrollment had already opened, and precedes it for a row issued ahead of + # open enrollment. + issued_date:, + # Benefit plan-year coverage end date (YYYY-MM-DD), distinct from this + # enrollment's coverage_end; null when the plan year is open-ended + plan_year_coverage_end:, + # - `Coverage Upcoming` - Coverage Upcoming + # - `Coverage Effective` - Coverage Effective + # - `Coverage Ended` - Coverage Ended + # - `Cancelled` - Cancelled + policy_status:, + # - `EBA` - Eba Mec + # - `VPC` - Vpc Enhanced + # - `VPC_CORE` - Vpc Core + # - `MEC` - Vpc Mec + # - `MEC2` - Mec2 + # - `MEC_PLUS` - Mec Plus + # - `MVP` - Mvp + # - `MVP2` - Mvp2 + # - `MVPSL` - Mvpsl + # - `MVPSL2` - Mvpsl2 + # - `VD` - Dental + # - `VV` - Vision + # - `ICHRA` - Ichra + # - `ICHRA_PREMIUM_PLUS` - Ichra Premium Plus + # - `ICHRA_REIMBURSEMENT_ONLY` - Ichra Reimbursement Only + product_code:, + # Display name of the benefit product + product_name:, + # Whether a qualifying life event would be required to reissue this enrollment + # under the product and open-enrollment rule at the time this list was read + requires_qle_for_reissue:, + # Insurance carrier name; null when no active carrier period is resolvable + carrier_name: nil, + # Coverage window end date (YYYY-MM-DD); null while coverage is open-ended + coverage_end: nil, + # Coverage window start date (YYYY-MM-DD) + coverage_start: nil, + # Employee monthly payroll deduction in cents; null unless the row is an election + employee_deduction_in_cents: nil, + # Employer monthly contribution in cents; null unless the row is an election + employer_contribution_in_cents: nil, + # Enrollment / open-enrollment window end date (YYYY-MM-DD); null when open-ended + enrollment_window_end: nil, + # Chosen benefit plan name; null unless the row is an election + plan_name: nil, + # Total monthly plan premium in cents; null unless the row is an election + premium_in_cents: nil, + # Chosen benefit plan tier name (e.g., Employee Only); null unless the row is an + # election + tier_name: nil + ) + end + + sig do + override.returns( + { + id: String, + benefit_plan_year_id: String, + benefit_type: + VitableConnect::Models::MemberListEnrollmentsResponse::Data::BenefitType::TaggedSymbol, + cancelled_date: T.nilable(Date), + election_status: + VitableConnect::Models::MemberListEnrollmentsResponse::Data::ElectionStatus::TaggedSymbol, + employer_id: String, + employer_name: String, + enrollment_window_start: Date, + in_last_month_of_coverage: T::Boolean, + is_within_enrollment_window: T::Boolean, + issued_date: Date, + plan_year_coverage_end: T.nilable(Date), + policy_status: + T.nilable( + VitableConnect::Models::MemberListEnrollmentsResponse::Data::PolicyStatus::TaggedSymbol + ), + product_code: + VitableConnect::Models::MemberListEnrollmentsResponse::Data::ProductCode::TaggedSymbol, + product_name: String, + requires_qle_for_reissue: T::Boolean, + carrier_name: T.nilable(String), + coverage_end: T.nilable(Date), + coverage_start: T.nilable(Date), + employee_deduction_in_cents: T.nilable(Integer), + employer_contribution_in_cents: T.nilable(Integer), + enrollment_window_end: T.nilable(Date), + plan_name: T.nilable(String), + premium_in_cents: T.nilable(Integer), + tier_name: T.nilable(String) + } + ) + end + def to_hash + end + + # - `Medical` - Medical + # - `Dental` - Dental + # - `Vision` - Vision + # - `Hospital` - Hospital + module BenefitType + extend VitableConnect::Internal::Type::Enum + + TaggedSymbol = + T.type_alias do + T.all( + Symbol, + VitableConnect::Models::MemberListEnrollmentsResponse::Data::BenefitType + ) + end + OrSymbol = T.type_alias { T.any(Symbol, String) } + + MEDICAL = + T.let( + :Medical, + VitableConnect::Models::MemberListEnrollmentsResponse::Data::BenefitType::TaggedSymbol + ) + DENTAL = + T.let( + :Dental, + VitableConnect::Models::MemberListEnrollmentsResponse::Data::BenefitType::TaggedSymbol + ) + VISION = + T.let( + :Vision, + VitableConnect::Models::MemberListEnrollmentsResponse::Data::BenefitType::TaggedSymbol + ) + HOSPITAL = + T.let( + :Hospital, + VitableConnect::Models::MemberListEnrollmentsResponse::Data::BenefitType::TaggedSymbol + ) + + sig do + override.returns( + T::Array[ + VitableConnect::Models::MemberListEnrollmentsResponse::Data::BenefitType::TaggedSymbol + ] + ) + end + def self.values + end + end + + # - `Enrolled` - Enrolled + # - `Waived` - Waived + # - `Pending` - Pending + # - `Expired` - Expired + module ElectionStatus + extend VitableConnect::Internal::Type::Enum + + TaggedSymbol = + T.type_alias do + T.all( + Symbol, + VitableConnect::Models::MemberListEnrollmentsResponse::Data::ElectionStatus + ) + end + OrSymbol = T.type_alias { T.any(Symbol, String) } + + ENROLLED = + T.let( + :Enrolled, + VitableConnect::Models::MemberListEnrollmentsResponse::Data::ElectionStatus::TaggedSymbol + ) + WAIVED = + T.let( + :Waived, + VitableConnect::Models::MemberListEnrollmentsResponse::Data::ElectionStatus::TaggedSymbol + ) + PENDING = + T.let( + :Pending, + VitableConnect::Models::MemberListEnrollmentsResponse::Data::ElectionStatus::TaggedSymbol + ) + EXPIRED = + T.let( + :Expired, + VitableConnect::Models::MemberListEnrollmentsResponse::Data::ElectionStatus::TaggedSymbol + ) + + sig do + override.returns( + T::Array[ + VitableConnect::Models::MemberListEnrollmentsResponse::Data::ElectionStatus::TaggedSymbol + ] + ) + end + def self.values + end + end + + # - `Coverage Upcoming` - Coverage Upcoming + # - `Coverage Effective` - Coverage Effective + # - `Coverage Ended` - Coverage Ended + # - `Cancelled` - Cancelled + module PolicyStatus + extend VitableConnect::Internal::Type::Enum + + TaggedSymbol = + T.type_alias do + T.all( + Symbol, + VitableConnect::Models::MemberListEnrollmentsResponse::Data::PolicyStatus + ) + end + OrSymbol = T.type_alias { T.any(Symbol, String) } + + COVERAGE_UPCOMING = + T.let( + :"Coverage Upcoming", + VitableConnect::Models::MemberListEnrollmentsResponse::Data::PolicyStatus::TaggedSymbol + ) + COVERAGE_EFFECTIVE = + T.let( + :"Coverage Effective", + VitableConnect::Models::MemberListEnrollmentsResponse::Data::PolicyStatus::TaggedSymbol + ) + COVERAGE_ENDED = + T.let( + :"Coverage Ended", + VitableConnect::Models::MemberListEnrollmentsResponse::Data::PolicyStatus::TaggedSymbol + ) + CANCELLED = + T.let( + :Cancelled, + VitableConnect::Models::MemberListEnrollmentsResponse::Data::PolicyStatus::TaggedSymbol + ) + + sig do + override.returns( + T::Array[ + VitableConnect::Models::MemberListEnrollmentsResponse::Data::PolicyStatus::TaggedSymbol + ] + ) + end + def self.values + end + end + + # - `EBA` - Eba Mec + # - `VPC` - Vpc Enhanced + # - `VPC_CORE` - Vpc Core + # - `MEC` - Vpc Mec + # - `MEC2` - Mec2 + # - `MEC_PLUS` - Mec Plus + # - `MVP` - Mvp + # - `MVP2` - Mvp2 + # - `MVPSL` - Mvpsl + # - `MVPSL2` - Mvpsl2 + # - `VD` - Dental + # - `VV` - Vision + # - `ICHRA` - Ichra + # - `ICHRA_PREMIUM_PLUS` - Ichra Premium Plus + # - `ICHRA_REIMBURSEMENT_ONLY` - Ichra Reimbursement Only + module ProductCode + extend VitableConnect::Internal::Type::Enum + + TaggedSymbol = + T.type_alias do + T.all( + Symbol, + VitableConnect::Models::MemberListEnrollmentsResponse::Data::ProductCode + ) + end + OrSymbol = T.type_alias { T.any(Symbol, String) } + + EBA = + T.let( + :EBA, + VitableConnect::Models::MemberListEnrollmentsResponse::Data::ProductCode::TaggedSymbol + ) + VPC = + T.let( + :VPC, + VitableConnect::Models::MemberListEnrollmentsResponse::Data::ProductCode::TaggedSymbol + ) + VPC_CORE = + T.let( + :VPC_CORE, + VitableConnect::Models::MemberListEnrollmentsResponse::Data::ProductCode::TaggedSymbol + ) + MEC = + T.let( + :MEC, + VitableConnect::Models::MemberListEnrollmentsResponse::Data::ProductCode::TaggedSymbol + ) + MEC2 = + T.let( + :MEC2, + VitableConnect::Models::MemberListEnrollmentsResponse::Data::ProductCode::TaggedSymbol + ) + MEC_PLUS = + T.let( + :MEC_PLUS, + VitableConnect::Models::MemberListEnrollmentsResponse::Data::ProductCode::TaggedSymbol + ) + MVP = + T.let( + :MVP, + VitableConnect::Models::MemberListEnrollmentsResponse::Data::ProductCode::TaggedSymbol + ) + MVP2 = + T.let( + :MVP2, + VitableConnect::Models::MemberListEnrollmentsResponse::Data::ProductCode::TaggedSymbol + ) + MVPSL = + T.let( + :MVPSL, + VitableConnect::Models::MemberListEnrollmentsResponse::Data::ProductCode::TaggedSymbol + ) + MVPSL2 = + T.let( + :MVPSL2, + VitableConnect::Models::MemberListEnrollmentsResponse::Data::ProductCode::TaggedSymbol + ) + VD = + T.let( + :VD, + VitableConnect::Models::MemberListEnrollmentsResponse::Data::ProductCode::TaggedSymbol + ) + VV = + T.let( + :VV, + VitableConnect::Models::MemberListEnrollmentsResponse::Data::ProductCode::TaggedSymbol + ) + ICHRA = + T.let( + :ICHRA, + VitableConnect::Models::MemberListEnrollmentsResponse::Data::ProductCode::TaggedSymbol + ) + ICHRA_PREMIUM_PLUS = + T.let( + :ICHRA_PREMIUM_PLUS, + VitableConnect::Models::MemberListEnrollmentsResponse::Data::ProductCode::TaggedSymbol + ) + ICHRA_REIMBURSEMENT_ONLY = + T.let( + :ICHRA_REIMBURSEMENT_ONLY, + VitableConnect::Models::MemberListEnrollmentsResponse::Data::ProductCode::TaggedSymbol + ) + + sig do + override.returns( + T::Array[ + VitableConnect::Models::MemberListEnrollmentsResponse::Data::ProductCode::TaggedSymbol + ] + ) + end + def self.values + end + end + end + end + end +end diff --git a/rbi/vitable_connect/models/member_list_id_cards_params.rbi b/rbi/vitable_connect/models/member_list_id_cards_params.rbi new file mode 100644 index 0000000..5fe75c8 --- /dev/null +++ b/rbi/vitable_connect/models/member_list_id_cards_params.rbi @@ -0,0 +1,43 @@ +# typed: strong + +module VitableConnect + module Models + class MemberListIDCardsParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + OrHash = + T.type_alias do + T.any( + VitableConnect::MemberListIDCardsParams, + VitableConnect::Internal::AnyHash + ) + end + + # Unique member identifier (mbr\_\*) + sig { returns(String) } + attr_accessor :member_id + + sig do + params( + member_id: String, + request_options: VitableConnect::RequestOptions::OrHash + ).returns(T.attached_class) + end + def self.new( + # Unique member identifier (mbr\_\*) + member_id:, + request_options: {} + ) + end + + sig do + override.returns( + { member_id: String, request_options: VitableConnect::RequestOptions } + ) + end + def to_hash + end + end + end +end diff --git a/rbi/vitable_connect/models/member_list_id_cards_response.rbi b/rbi/vitable_connect/models/member_list_id_cards_response.rbi new file mode 100644 index 0000000..0f2ab7d --- /dev/null +++ b/rbi/vitable_connect/models/member_list_id_cards_response.rbi @@ -0,0 +1,624 @@ +# typed: strong + +module VitableConnect + module Models + class MemberListIDCardsResponse < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::MemberListIDCardsResponse, + VitableConnect::Internal::AnyHash + ) + end + + sig do + returns( + T::Array[VitableConnect::Models::MemberListIDCardsResponse::Data] + ) + end + attr_accessor :data + + # Unpaginated `{"data": [...]}` list of member digital benefit cards. + sig do + params( + data: + T::Array[ + VitableConnect::Models::MemberListIDCardsResponse::Data::OrHash + ] + ).returns(T.attached_class) + end + def self.new(data:) + end + + sig do + override.returns( + { + data: + T::Array[VitableConnect::Models::MemberListIDCardsResponse::Data] + } + ) + end + def to_hash + end + + class Data < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::MemberListIDCardsResponse::Data, + VitableConnect::Internal::AnyHash + ) + end + + # - `medical` - medical + # - `dental` - dental + # - `vision` - vision + # - `rx` - rx + sig do + returns( + VitableConnect::Models::MemberListIDCardsResponse::Data::CardType::TaggedSymbol + ) + end + attr_accessor :card_type + + # Group number printed on the card (the rx group id for an rx card) + sig { returns(String) } + attr_accessor :group_id + + # Member id printed on the card (the Ventegra cardholder id for an rx card) + sig { returns(String) } + attr_accessor :group_member_id + + # Name of the member the card is issued to + sig { returns(String) } + attr_accessor :member_name + + # No Surprises Act cost-sharing table rendered on the card; empty for an rx card + sig { returns(T::Array[T::Array[String]]) } + attr_accessor :nsa_table + + # - `EBA` - Eba Mec + # - `VPC` - Vpc Enhanced + # - `VPC_CORE` - Vpc Core + # - `MEC` - Vpc Mec + # - `MEC2` - Mec2 + # - `MEC_PLUS` - Mec Plus + # - `MVP` - Mvp + # - `MVP2` - Mvp2 + # - `MVPSL` - Mvpsl + # - `MVPSL2` - Mvpsl2 + # - `VD` - Dental + # - `VV` - Vision + # - `ICHRA` - Ichra + # - `ICHRA_PREMIUM_PLUS` - Ichra Premium Plus + # - `ICHRA_REIMBURSEMENT_ONLY` - Ichra Reimbursement Only + sig do + returns( + T.nilable( + VitableConnect::Models::MemberListIDCardsResponse::Data::BenefitCode::TaggedSymbol + ) + ) + end + attr_accessor :benefit_code + + # Carrier phone number on the card; null for an rx card + sig { returns(T.nilable(String)) } + attr_accessor :carrier_phone + + # Carrier website on the card; null for an rx card + sig { returns(T.nilable(String)) } + attr_accessor :carrier_website + + # Claims payer shown on the card + sig { returns(T.nilable(String)) } + attr_accessor :claims_payer_display_name + + # Employer the card's coverage is through; null for an rx card without group info + sig { returns(T.nilable(String)) } + attr_accessor :employer_name + + # General disclaimer text; null for an rx card + sig { returns(T.nilable(String)) } + attr_accessor :general_disclaimer + + # Provider network shown on the card; null for an rx card + sig do + returns( + T.nilable( + VitableConnect::Models::MemberListIDCardsResponse::Data::Network + ) + ) + end + attr_reader :network + + sig do + params( + network: + T.nilable( + VitableConnect::Models::MemberListIDCardsResponse::Data::Network::OrHash + ) + ).void + end + attr_writer :network + + # Plan-specific disclaimer text; null for an rx card + sig { returns(T.nilable(String)) } + attr_accessor :plan_disclaimer + + # Benefit plan name on the card; null for a consumer-membership rx card + sig { returns(T.nilable(String)) } + attr_accessor :plan_name + + # Wire serializer for :class:`DigitalBenefitCardDTO` (one benefit ID card). + sig do + params( + card_type: + VitableConnect::Models::MemberListIDCardsResponse::Data::CardType::OrSymbol, + group_id: String, + group_member_id: String, + member_name: String, + nsa_table: T::Array[T::Array[String]], + benefit_code: + T.nilable( + VitableConnect::Models::MemberListIDCardsResponse::Data::BenefitCode::OrSymbol + ), + carrier_phone: T.nilable(String), + carrier_website: T.nilable(String), + claims_payer_display_name: T.nilable(String), + employer_name: T.nilable(String), + general_disclaimer: T.nilable(String), + network: + T.nilable( + VitableConnect::Models::MemberListIDCardsResponse::Data::Network::OrHash + ), + plan_disclaimer: T.nilable(String), + plan_name: T.nilable(String) + ).returns(T.attached_class) + end + def self.new( + # - `medical` - medical + # - `dental` - dental + # - `vision` - vision + # - `rx` - rx + card_type:, + # Group number printed on the card (the rx group id for an rx card) + group_id:, + # Member id printed on the card (the Ventegra cardholder id for an rx card) + group_member_id:, + # Name of the member the card is issued to + member_name:, + # No Surprises Act cost-sharing table rendered on the card; empty for an rx card + nsa_table:, + # - `EBA` - Eba Mec + # - `VPC` - Vpc Enhanced + # - `VPC_CORE` - Vpc Core + # - `MEC` - Vpc Mec + # - `MEC2` - Mec2 + # - `MEC_PLUS` - Mec Plus + # - `MVP` - Mvp + # - `MVP2` - Mvp2 + # - `MVPSL` - Mvpsl + # - `MVPSL2` - Mvpsl2 + # - `VD` - Dental + # - `VV` - Vision + # - `ICHRA` - Ichra + # - `ICHRA_PREMIUM_PLUS` - Ichra Premium Plus + # - `ICHRA_REIMBURSEMENT_ONLY` - Ichra Reimbursement Only + benefit_code: nil, + # Carrier phone number on the card; null for an rx card + carrier_phone: nil, + # Carrier website on the card; null for an rx card + carrier_website: nil, + # Claims payer shown on the card + claims_payer_display_name: nil, + # Employer the card's coverage is through; null for an rx card without group info + employer_name: nil, + # General disclaimer text; null for an rx card + general_disclaimer: nil, + # Provider network shown on the card; null for an rx card + network: nil, + # Plan-specific disclaimer text; null for an rx card + plan_disclaimer: nil, + # Benefit plan name on the card; null for a consumer-membership rx card + plan_name: nil + ) + end + + sig do + override.returns( + { + card_type: + VitableConnect::Models::MemberListIDCardsResponse::Data::CardType::TaggedSymbol, + group_id: String, + group_member_id: String, + member_name: String, + nsa_table: T::Array[T::Array[String]], + benefit_code: + T.nilable( + VitableConnect::Models::MemberListIDCardsResponse::Data::BenefitCode::TaggedSymbol + ), + carrier_phone: T.nilable(String), + carrier_website: T.nilable(String), + claims_payer_display_name: T.nilable(String), + employer_name: T.nilable(String), + general_disclaimer: T.nilable(String), + network: + T.nilable( + VitableConnect::Models::MemberListIDCardsResponse::Data::Network + ), + plan_disclaimer: T.nilable(String), + plan_name: T.nilable(String) + } + ) + end + def to_hash + end + + # - `medical` - medical + # - `dental` - dental + # - `vision` - vision + # - `rx` - rx + module CardType + extend VitableConnect::Internal::Type::Enum + + TaggedSymbol = + T.type_alias do + T.all( + Symbol, + VitableConnect::Models::MemberListIDCardsResponse::Data::CardType + ) + end + OrSymbol = T.type_alias { T.any(Symbol, String) } + + MEDICAL = + T.let( + :medical, + VitableConnect::Models::MemberListIDCardsResponse::Data::CardType::TaggedSymbol + ) + DENTAL = + T.let( + :dental, + VitableConnect::Models::MemberListIDCardsResponse::Data::CardType::TaggedSymbol + ) + VISION = + T.let( + :vision, + VitableConnect::Models::MemberListIDCardsResponse::Data::CardType::TaggedSymbol + ) + RX = + T.let( + :rx, + VitableConnect::Models::MemberListIDCardsResponse::Data::CardType::TaggedSymbol + ) + + sig do + override.returns( + T::Array[ + VitableConnect::Models::MemberListIDCardsResponse::Data::CardType::TaggedSymbol + ] + ) + end + def self.values + end + end + + # - `EBA` - Eba Mec + # - `VPC` - Vpc Enhanced + # - `VPC_CORE` - Vpc Core + # - `MEC` - Vpc Mec + # - `MEC2` - Mec2 + # - `MEC_PLUS` - Mec Plus + # - `MVP` - Mvp + # - `MVP2` - Mvp2 + # - `MVPSL` - Mvpsl + # - `MVPSL2` - Mvpsl2 + # - `VD` - Dental + # - `VV` - Vision + # - `ICHRA` - Ichra + # - `ICHRA_PREMIUM_PLUS` - Ichra Premium Plus + # - `ICHRA_REIMBURSEMENT_ONLY` - Ichra Reimbursement Only + module BenefitCode + extend VitableConnect::Internal::Type::Enum + + TaggedSymbol = + T.type_alias do + T.all( + Symbol, + VitableConnect::Models::MemberListIDCardsResponse::Data::BenefitCode + ) + end + OrSymbol = T.type_alias { T.any(Symbol, String) } + + EBA = + T.let( + :EBA, + VitableConnect::Models::MemberListIDCardsResponse::Data::BenefitCode::TaggedSymbol + ) + VPC = + T.let( + :VPC, + VitableConnect::Models::MemberListIDCardsResponse::Data::BenefitCode::TaggedSymbol + ) + VPC_CORE = + T.let( + :VPC_CORE, + VitableConnect::Models::MemberListIDCardsResponse::Data::BenefitCode::TaggedSymbol + ) + MEC = + T.let( + :MEC, + VitableConnect::Models::MemberListIDCardsResponse::Data::BenefitCode::TaggedSymbol + ) + MEC2 = + T.let( + :MEC2, + VitableConnect::Models::MemberListIDCardsResponse::Data::BenefitCode::TaggedSymbol + ) + MEC_PLUS = + T.let( + :MEC_PLUS, + VitableConnect::Models::MemberListIDCardsResponse::Data::BenefitCode::TaggedSymbol + ) + MVP = + T.let( + :MVP, + VitableConnect::Models::MemberListIDCardsResponse::Data::BenefitCode::TaggedSymbol + ) + MVP2 = + T.let( + :MVP2, + VitableConnect::Models::MemberListIDCardsResponse::Data::BenefitCode::TaggedSymbol + ) + MVPSL = + T.let( + :MVPSL, + VitableConnect::Models::MemberListIDCardsResponse::Data::BenefitCode::TaggedSymbol + ) + MVPSL2 = + T.let( + :MVPSL2, + VitableConnect::Models::MemberListIDCardsResponse::Data::BenefitCode::TaggedSymbol + ) + VD = + T.let( + :VD, + VitableConnect::Models::MemberListIDCardsResponse::Data::BenefitCode::TaggedSymbol + ) + VV = + T.let( + :VV, + VitableConnect::Models::MemberListIDCardsResponse::Data::BenefitCode::TaggedSymbol + ) + ICHRA = + T.let( + :ICHRA, + VitableConnect::Models::MemberListIDCardsResponse::Data::BenefitCode::TaggedSymbol + ) + ICHRA_PREMIUM_PLUS = + T.let( + :ICHRA_PREMIUM_PLUS, + VitableConnect::Models::MemberListIDCardsResponse::Data::BenefitCode::TaggedSymbol + ) + ICHRA_REIMBURSEMENT_ONLY = + T.let( + :ICHRA_REIMBURSEMENT_ONLY, + VitableConnect::Models::MemberListIDCardsResponse::Data::BenefitCode::TaggedSymbol + ) + + sig do + override.returns( + T::Array[ + VitableConnect::Models::MemberListIDCardsResponse::Data::BenefitCode::TaggedSymbol + ] + ) + end + def self.values + end + end + + class Network < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::MemberListIDCardsResponse::Data::Network, + VitableConnect::Internal::AnyHash + ) + end + + # Shared read serializer for a postal address on public API responses. + # + # One definition for the address block every public resource emits (employer, + # employee, …), so the 5-field shape isn't hand-rolled per endpoint. Read-only: it + # renders an already-built address value object (e.g. `AddressDVO`) whose + # attributes map 1:1 to these fields. + sig do + returns( + VitableConnect::Models::MemberListIDCardsResponse::Data::Network::Address + ) + end + attr_reader :address + + sig do + params( + address: + VitableConnect::Models::MemberListIDCardsResponse::Data::Network::Address::OrHash + ).void + end + attr_writer :address + + sig { returns(T.nilable(String)) } + attr_accessor :logo + + sig { returns(T.nilable(String)) } + attr_accessor :member_phone + + # Name of the network + sig { returns(String) } + attr_accessor :name + + sig { returns(String) } + attr_accessor :phone + + sig { returns(T.nilable(String)) } + attr_accessor :provider_phone + + # Website of the network + sig { returns(String) } + attr_accessor :website + + # Network's EDI + sig { returns(T.nilable(String)) } + attr_accessor :edi + + # Website for members + sig { returns(T.nilable(String)) } + attr_accessor :member_website + + # Website for providers + sig { returns(T.nilable(String)) } + attr_accessor :provider_website + + sig { returns(String) } + attr_accessor :id + + # Provider network shown on the card; null for an rx card + sig do + params( + id: String, + address: + VitableConnect::Models::MemberListIDCardsResponse::Data::Network::Address::OrHash, + logo: T.nilable(String), + member_phone: T.nilable(String), + name: String, + phone: String, + provider_phone: T.nilable(String), + website: String, + edi: T.nilable(String), + member_website: T.nilable(String), + provider_website: T.nilable(String) + ).returns(T.attached_class) + end + def self.new( + id:, + # Shared read serializer for a postal address on public API responses. + # + # One definition for the address block every public resource emits (employer, + # employee, …), so the 5-field shape isn't hand-rolled per endpoint. Read-only: it + # renders an already-built address value object (e.g. `AddressDVO`) whose + # attributes map 1:1 to these fields. + address:, + logo:, + member_phone:, + # Name of the network + name:, + phone:, + provider_phone:, + # Website of the network + website:, + # Network's EDI + edi: nil, + # Website for members + member_website: nil, + # Website for providers + provider_website: nil + ) + end + + sig do + override.returns( + { + id: String, + address: + VitableConnect::Models::MemberListIDCardsResponse::Data::Network::Address, + logo: T.nilable(String), + member_phone: T.nilable(String), + name: String, + phone: String, + provider_phone: T.nilable(String), + website: String, + edi: T.nilable(String), + member_website: T.nilable(String), + provider_website: T.nilable(String) + } + ) + end + def to_hash + end + + class Address < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::MemberListIDCardsResponse::Data::Network::Address, + VitableConnect::Internal::AnyHash + ) + end + + # Primary street address. + sig { returns(String) } + attr_accessor :address_line_1 + + # Secondary street address (apt, suite, etc.). + sig { returns(T.nilable(String)) } + attr_accessor :address_line_2 + + # City name. + sig { returns(String) } + attr_accessor :city + + # Two-letter state code (e.g. `CA`, `NY`). + sig { returns(String) } + attr_accessor :state + + # ZIP code (5 or 9 digit). + sig { returns(String) } + attr_accessor :zipcode + + # Shared read serializer for a postal address on public API responses. + # + # One definition for the address block every public resource emits (employer, + # employee, …), so the 5-field shape isn't hand-rolled per endpoint. Read-only: it + # renders an already-built address value object (e.g. `AddressDVO`) whose + # attributes map 1:1 to these fields. + sig do + params( + address_line_1: String, + address_line_2: T.nilable(String), + city: String, + state: String, + zipcode: String + ).returns(T.attached_class) + end + def self.new( + # Primary street address. + address_line_1:, + # Secondary street address (apt, suite, etc.). + address_line_2:, + # City name. + city:, + # Two-letter state code (e.g. `CA`, `NY`). + state:, + # ZIP code (5 or 9 digit). + zipcode: + ) + end + + sig do + override.returns( + { + address_line_1: String, + address_line_2: T.nilable(String), + city: String, + state: String, + zipcode: String + } + ) + end + def to_hash + end + end + end + end + end + end +end diff --git a/rbi/vitable_connect/models/member_list_params.rbi b/rbi/vitable_connect/models/member_list_params.rbi new file mode 100644 index 0000000..911224e --- /dev/null +++ b/rbi/vitable_connect/models/member_list_params.rbi @@ -0,0 +1,73 @@ +# typed: strong + +module VitableConnect + module Models + class MemberListParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + OrHash = + T.type_alias do + T.any( + VitableConnect::MemberListParams, + VitableConnect::Internal::AnyHash + ) + end + + # Items per page (default: 20, max: 100) + sig { returns(T.nilable(Integer)) } + attr_reader :limit + + sig { params(limit: Integer).void } + attr_writer :limit + + # Page number (default: 1) + sig { returns(T.nilable(Integer)) } + attr_reader :page + + sig { params(page: Integer).void } + attr_writer :page + + # Case-insensitive search across member name, email, and phone number; exact match + # on member id (prefixed or raw uuid) + sig { returns(T.nilable(String)) } + attr_reader :search + + sig { params(search: String).void } + attr_writer :search + + sig do + params( + limit: Integer, + page: Integer, + search: String, + request_options: VitableConnect::RequestOptions::OrHash + ).returns(T.attached_class) + end + def self.new( + # Items per page (default: 20, max: 100) + limit: nil, + # Page number (default: 1) + page: nil, + # Case-insensitive search across member name, email, and phone number; exact match + # on member id (prefixed or raw uuid) + search: nil, + request_options: {} + ) + end + + sig do + override.returns( + { + limit: Integer, + page: Integer, + search: String, + request_options: VitableConnect::RequestOptions + } + ) + end + def to_hash + end + end + end +end diff --git a/rbi/vitable_connect/models/member_list_qualifying_life_events_params.rbi b/rbi/vitable_connect/models/member_list_qualifying_life_events_params.rbi new file mode 100644 index 0000000..d710464 --- /dev/null +++ b/rbi/vitable_connect/models/member_list_qualifying_life_events_params.rbi @@ -0,0 +1,132 @@ +# typed: strong + +module VitableConnect + module Models + class MemberListQualifyingLifeEventsParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + OrHash = + T.type_alias do + T.any( + VitableConnect::MemberListQualifyingLifeEventsParams, + VitableConnect::Internal::AnyHash + ) + end + + # Unique member identifier (mbr\_\*) + sig { returns(String) } + attr_accessor :member_id + + # Items per page (default: 20, max: 100) + sig { returns(T.nilable(Integer)) } + attr_reader :limit + + sig { params(limit: Integer).void } + attr_writer :limit + + # Page number (default: 1) + sig { returns(T.nilable(Integer)) } + attr_reader :page + + sig { params(page: Integer).void } + attr_writer :page + + # Optional. Filter to a single QLE status; omit to return all statuses. + sig do + returns( + T.nilable( + VitableConnect::MemberListQualifyingLifeEventsParams::Status::OrSymbol + ) + ) + end + attr_reader :status + + sig do + params( + status: + VitableConnect::MemberListQualifyingLifeEventsParams::Status::OrSymbol + ).void + end + attr_writer :status + + sig do + params( + member_id: String, + limit: Integer, + page: Integer, + status: + VitableConnect::MemberListQualifyingLifeEventsParams::Status::OrSymbol, + request_options: VitableConnect::RequestOptions::OrHash + ).returns(T.attached_class) + end + def self.new( + # Unique member identifier (mbr\_\*) + member_id:, + # Items per page (default: 20, max: 100) + limit: nil, + # Page number (default: 1) + page: nil, + # Optional. Filter to a single QLE status; omit to return all statuses. + status: nil, + request_options: {} + ) + end + + sig do + override.returns( + { + member_id: String, + limit: Integer, + page: Integer, + status: + VitableConnect::MemberListQualifyingLifeEventsParams::Status::OrSymbol, + request_options: VitableConnect::RequestOptions + } + ) + end + def to_hash + end + + # Optional. Filter to a single QLE status; omit to return all statuses. + module Status + extend VitableConnect::Internal::Type::Enum + + TaggedSymbol = + T.type_alias do + T.all( + Symbol, + VitableConnect::MemberListQualifyingLifeEventsParams::Status + ) + end + OrSymbol = T.type_alias { T.any(Symbol, String) } + + APPROVED = + T.let( + :approved, + VitableConnect::MemberListQualifyingLifeEventsParams::Status::TaggedSymbol + ) + DENIED = + T.let( + :denied, + VitableConnect::MemberListQualifyingLifeEventsParams::Status::TaggedSymbol + ) + PENDING = + T.let( + :pending, + VitableConnect::MemberListQualifyingLifeEventsParams::Status::TaggedSymbol + ) + + sig do + override.returns( + T::Array[ + VitableConnect::MemberListQualifyingLifeEventsParams::Status::TaggedSymbol + ] + ) + end + def self.values + end + end + end + end +end diff --git a/rbi/vitable_connect/models/member_list_qualifying_life_events_response.rbi b/rbi/vitable_connect/models/member_list_qualifying_life_events_response.rbi new file mode 100644 index 0000000..810c61e --- /dev/null +++ b/rbi/vitable_connect/models/member_list_qualifying_life_events_response.rbi @@ -0,0 +1,331 @@ +# typed: strong + +module VitableConnect + module Models + class MemberListQualifyingLifeEventsResponse < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::MemberListQualifyingLifeEventsResponse, + VitableConnect::Internal::AnyHash + ) + end + + # Opaque qualifying life event identifier + sig { returns(String) } + attr_accessor :id + + # - `lost_job_based_coverage` - lost_job_based_coverage + # - `aged_off_parent_plan` - aged_off_parent_plan + # - `lost_medicaid_chip_medicare` - lost_medicaid_chip_medicare + # - `lost_decertified_individual_plan` - lost_decertified_individual_plan + # - `married` - married + # - `divorced` - divorced + # - `had_baby` - had_baby + # - `adopted_child` - adopted_child + # - `foster_care_placement` - foster_care_placement + # - `death_of_spouse_or_dependent` - death_of_spouse_or_dependent + # - `court_ordered` - court_ordered + # - `moved_to_new_coverage_area` - moved_to_new_coverage_area + # - `moved_to_us` - moved_to_us + # - `moved_to_or_from_school_housing` - moved_to_or_from_school_housing + # - `moved_to_or_from_seasonal_work_housing` - + # moved_to_or_from_seasonal_work_housing + # - `became_us_citizen` - became_us_citizen + # - `left_incarceration` - left_incarceration + # - `gained_tribal_status` - gained_tribal_status + # - `started_or_ended_americorps_service` - started_or_ended_americorps_service + # - `new_child` - new_child + # - `other` - other + sig do + returns( + VitableConnect::Models::MemberListQualifyingLifeEventsResponse::EventType::TaggedSymbol + ) + end + attr_accessor :event_type + + # Human-readable label for event_type + sig { returns(String) } + attr_accessor :event_type_label + + # Custom event description when event_type is Other; otherwise normally null + sig { returns(T.nilable(String)) } + attr_accessor :other_event + + # - `pending` - Pending + # - `approved` - Approved + # - `denied` - Denied + sig do + returns( + VitableConnect::Models::MemberListQualifyingLifeEventsResponse::Status::TaggedSymbol + ) + end + attr_accessor :status + + # When the member submitted the event + sig { returns(Time) } + attr_accessor :submitted_at + + sig do + params( + id: String, + event_type: + VitableConnect::Models::MemberListQualifyingLifeEventsResponse::EventType::OrSymbol, + event_type_label: String, + other_event: T.nilable(String), + status: + VitableConnect::Models::MemberListQualifyingLifeEventsResponse::Status::OrSymbol, + submitted_at: Time + ).returns(T.attached_class) + end + def self.new( + # Opaque qualifying life event identifier + id:, + # - `lost_job_based_coverage` - lost_job_based_coverage + # - `aged_off_parent_plan` - aged_off_parent_plan + # - `lost_medicaid_chip_medicare` - lost_medicaid_chip_medicare + # - `lost_decertified_individual_plan` - lost_decertified_individual_plan + # - `married` - married + # - `divorced` - divorced + # - `had_baby` - had_baby + # - `adopted_child` - adopted_child + # - `foster_care_placement` - foster_care_placement + # - `death_of_spouse_or_dependent` - death_of_spouse_or_dependent + # - `court_ordered` - court_ordered + # - `moved_to_new_coverage_area` - moved_to_new_coverage_area + # - `moved_to_us` - moved_to_us + # - `moved_to_or_from_school_housing` - moved_to_or_from_school_housing + # - `moved_to_or_from_seasonal_work_housing` - + # moved_to_or_from_seasonal_work_housing + # - `became_us_citizen` - became_us_citizen + # - `left_incarceration` - left_incarceration + # - `gained_tribal_status` - gained_tribal_status + # - `started_or_ended_americorps_service` - started_or_ended_americorps_service + # - `new_child` - new_child + # - `other` - other + event_type:, + # Human-readable label for event_type + event_type_label:, + # Custom event description when event_type is Other; otherwise normally null + other_event:, + # - `pending` - Pending + # - `approved` - Approved + # - `denied` - Denied + status:, + # When the member submitted the event + submitted_at: + ) + end + + sig do + override.returns( + { + id: String, + event_type: + VitableConnect::Models::MemberListQualifyingLifeEventsResponse::EventType::TaggedSymbol, + event_type_label: String, + other_event: T.nilable(String), + status: + VitableConnect::Models::MemberListQualifyingLifeEventsResponse::Status::TaggedSymbol, + submitted_at: Time + } + ) + end + def to_hash + end + + # - `lost_job_based_coverage` - lost_job_based_coverage + # - `aged_off_parent_plan` - aged_off_parent_plan + # - `lost_medicaid_chip_medicare` - lost_medicaid_chip_medicare + # - `lost_decertified_individual_plan` - lost_decertified_individual_plan + # - `married` - married + # - `divorced` - divorced + # - `had_baby` - had_baby + # - `adopted_child` - adopted_child + # - `foster_care_placement` - foster_care_placement + # - `death_of_spouse_or_dependent` - death_of_spouse_or_dependent + # - `court_ordered` - court_ordered + # - `moved_to_new_coverage_area` - moved_to_new_coverage_area + # - `moved_to_us` - moved_to_us + # - `moved_to_or_from_school_housing` - moved_to_or_from_school_housing + # - `moved_to_or_from_seasonal_work_housing` - + # moved_to_or_from_seasonal_work_housing + # - `became_us_citizen` - became_us_citizen + # - `left_incarceration` - left_incarceration + # - `gained_tribal_status` - gained_tribal_status + # - `started_or_ended_americorps_service` - started_or_ended_americorps_service + # - `new_child` - new_child + # - `other` - other + module EventType + extend VitableConnect::Internal::Type::Enum + + TaggedSymbol = + T.type_alias do + T.all( + Symbol, + VitableConnect::Models::MemberListQualifyingLifeEventsResponse::EventType + ) + end + OrSymbol = T.type_alias { T.any(Symbol, String) } + + LOST_JOB_BASED_COVERAGE = + T.let( + :lost_job_based_coverage, + VitableConnect::Models::MemberListQualifyingLifeEventsResponse::EventType::TaggedSymbol + ) + AGED_OFF_PARENT_PLAN = + T.let( + :aged_off_parent_plan, + VitableConnect::Models::MemberListQualifyingLifeEventsResponse::EventType::TaggedSymbol + ) + LOST_MEDICAID_CHIP_MEDICARE = + T.let( + :lost_medicaid_chip_medicare, + VitableConnect::Models::MemberListQualifyingLifeEventsResponse::EventType::TaggedSymbol + ) + LOST_DECERTIFIED_INDIVIDUAL_PLAN = + T.let( + :lost_decertified_individual_plan, + VitableConnect::Models::MemberListQualifyingLifeEventsResponse::EventType::TaggedSymbol + ) + MARRIED = + T.let( + :married, + VitableConnect::Models::MemberListQualifyingLifeEventsResponse::EventType::TaggedSymbol + ) + DIVORCED = + T.let( + :divorced, + VitableConnect::Models::MemberListQualifyingLifeEventsResponse::EventType::TaggedSymbol + ) + HAD_BABY = + T.let( + :had_baby, + VitableConnect::Models::MemberListQualifyingLifeEventsResponse::EventType::TaggedSymbol + ) + ADOPTED_CHILD = + T.let( + :adopted_child, + VitableConnect::Models::MemberListQualifyingLifeEventsResponse::EventType::TaggedSymbol + ) + FOSTER_CARE_PLACEMENT = + T.let( + :foster_care_placement, + VitableConnect::Models::MemberListQualifyingLifeEventsResponse::EventType::TaggedSymbol + ) + DEATH_OF_SPOUSE_OR_DEPENDENT = + T.let( + :death_of_spouse_or_dependent, + VitableConnect::Models::MemberListQualifyingLifeEventsResponse::EventType::TaggedSymbol + ) + COURT_ORDERED = + T.let( + :court_ordered, + VitableConnect::Models::MemberListQualifyingLifeEventsResponse::EventType::TaggedSymbol + ) + MOVED_TO_NEW_COVERAGE_AREA = + T.let( + :moved_to_new_coverage_area, + VitableConnect::Models::MemberListQualifyingLifeEventsResponse::EventType::TaggedSymbol + ) + MOVED_TO_US = + T.let( + :moved_to_us, + VitableConnect::Models::MemberListQualifyingLifeEventsResponse::EventType::TaggedSymbol + ) + MOVED_TO_OR_FROM_SCHOOL_HOUSING = + T.let( + :moved_to_or_from_school_housing, + VitableConnect::Models::MemberListQualifyingLifeEventsResponse::EventType::TaggedSymbol + ) + MOVED_TO_OR_FROM_SEASONAL_WORK_HOUSING = + T.let( + :moved_to_or_from_seasonal_work_housing, + VitableConnect::Models::MemberListQualifyingLifeEventsResponse::EventType::TaggedSymbol + ) + BECAME_US_CITIZEN = + T.let( + :became_us_citizen, + VitableConnect::Models::MemberListQualifyingLifeEventsResponse::EventType::TaggedSymbol + ) + LEFT_INCARCERATION = + T.let( + :left_incarceration, + VitableConnect::Models::MemberListQualifyingLifeEventsResponse::EventType::TaggedSymbol + ) + GAINED_TRIBAL_STATUS = + T.let( + :gained_tribal_status, + VitableConnect::Models::MemberListQualifyingLifeEventsResponse::EventType::TaggedSymbol + ) + STARTED_OR_ENDED_AMERICORPS_SERVICE = + T.let( + :started_or_ended_americorps_service, + VitableConnect::Models::MemberListQualifyingLifeEventsResponse::EventType::TaggedSymbol + ) + NEW_CHILD = + T.let( + :new_child, + VitableConnect::Models::MemberListQualifyingLifeEventsResponse::EventType::TaggedSymbol + ) + OTHER = + T.let( + :other, + VitableConnect::Models::MemberListQualifyingLifeEventsResponse::EventType::TaggedSymbol + ) + + sig do + override.returns( + T::Array[ + VitableConnect::Models::MemberListQualifyingLifeEventsResponse::EventType::TaggedSymbol + ] + ) + end + def self.values + end + end + + # - `pending` - Pending + # - `approved` - Approved + # - `denied` - Denied + module Status + extend VitableConnect::Internal::Type::Enum + + TaggedSymbol = + T.type_alias do + T.all( + Symbol, + VitableConnect::Models::MemberListQualifyingLifeEventsResponse::Status + ) + end + OrSymbol = T.type_alias { T.any(Symbol, String) } + + PENDING = + T.let( + :pending, + VitableConnect::Models::MemberListQualifyingLifeEventsResponse::Status::TaggedSymbol + ) + APPROVED = + T.let( + :approved, + VitableConnect::Models::MemberListQualifyingLifeEventsResponse::Status::TaggedSymbol + ) + DENIED = + T.let( + :denied, + VitableConnect::Models::MemberListQualifyingLifeEventsResponse::Status::TaggedSymbol + ) + + sig do + override.returns( + T::Array[ + VitableConnect::Models::MemberListQualifyingLifeEventsResponse::Status::TaggedSymbol + ] + ) + end + def self.values + end + end + end + end +end diff --git a/rbi/vitable_connect/models/member_list_response.rbi b/rbi/vitable_connect/models/member_list_response.rbi new file mode 100644 index 0000000..92afa9d --- /dev/null +++ b/rbi/vitable_connect/models/member_list_response.rbi @@ -0,0 +1,690 @@ +# typed: strong + +module VitableConnect + module Models + class MemberListResponse < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::MemberListResponse, + VitableConnect::Internal::AnyHash + ) + end + + # Member's legal first name + sig { returns(String) } + attr_accessor :first_name + + # Member's legal last name + sig { returns(String) } + attr_accessor :last_name + + # Member's residential address + sig do + returns(T.nilable(VitableConnect::Models::MemberListResponse::Address)) + end + attr_reader :address + + sig do + params( + address: + T.nilable( + VitableConnect::Models::MemberListResponse::Address::OrHash + ) + ).void + end + attr_writer :address + + # Email address + sig { returns(T.nilable(String)) } + attr_accessor :email + + # Phone number (10-digit US domestic string) + sig { returns(T.nilable(String)) } + attr_accessor :phone + + # Unique member identifier with 'mbr\_' prefix + sig { returns(String) } + attr_accessor :id + + # A member in the organization's directory: identity, contact details, address, + # and join date. + sig do + params( + id: String, + first_name: String, + last_name: String, + address: + T.nilable( + VitableConnect::Models::MemberListResponse::Address::OrHash + ), + email: T.nilable(String), + phone: T.nilable(String) + ).returns(T.attached_class) + end + def self.new( + # Unique member identifier with 'mbr\_' prefix + id:, + # Member's legal first name + first_name:, + # Member's legal last name + last_name:, + # Member's residential address + address: nil, + # Email address + email: nil, + # Phone number (10-digit US domestic string) + phone: nil + ) + end + + sig do + override.returns( + { + id: String, + first_name: String, + last_name: String, + address: + T.nilable(VitableConnect::Models::MemberListResponse::Address), + email: T.nilable(String), + phone: T.nilable(String) + } + ) + end + def to_hash + end + + class Address < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::MemberListResponse::Address, + VitableConnect::Internal::AnyHash + ) + end + + # Primary street address + sig { returns(String) } + attr_accessor :address_line_1 + + # City name + sig { returns(String) } + attr_accessor :city + + # - `AL` - AL + # - `AK` - AK + # - `AZ` - AZ + # - `AR` - AR + # - `CA` - CA + # - `CO` - CO + # - `CT` - CT + # - `DC` - DC + # - `DE` - DE + # - `FL` - FL + # - `GA` - GA + # - `HI` - HI + # - `ID` - ID + # - `IL` - IL + # - `IN` - IN + # - `IA` - IA + # - `KS` - KS + # - `KY` - KY + # - `LA` - LA + # - `ME` - ME + # - `MD` - MD + # - `MA` - MA + # - `MI` - MI + # - `MN` - MN + # - `MS` - MS + # - `MO` - MO + # - `MT` - MT + # - `NE` - NE + # - `NV` - NV + # - `NH` - NH + # - `NJ` - NJ + # - `NM` - NM + # - `NY` - NY + # - `NC` - NC + # - `ND` - ND + # - `OH` - OH + # - `OK` - OK + # - `OR` - OR + # - `PA` - PA + # - `RI` - RI + # - `SC` - SC + # - `SD` - SD + # - `TN` - TN + # - `TX` - TX + # - `UT` - UT + # - `VT` - VT + # - `VA` - VA + # - `WA` - WA + # - `WI` - WI + # - `WV` - WV + # - `WY` - WY + # - `PR` - PR + # - `GU` - GU + # - `AS` - AS + # - `VI` - VI + # - `MP` - MP + # - `MH` - MH + # - `PW` - PW + # - `FM` - FM + # - `AE` - AE + # - `AA` - AA + # - `AP` - AP + sig do + returns( + VitableConnect::Models::MemberListResponse::Address::State::TaggedSymbol + ) + end + attr_accessor :state + + # ZIP code (5 or 9 digit) + sig { returns(String) } + attr_accessor :zipcode + + # Secondary street address (apt, suite, etc.) + sig { returns(T.nilable(String)) } + attr_accessor :address_line_2 + + # Member's residential address + sig do + params( + address_line_1: String, + city: String, + state: + VitableConnect::Models::MemberListResponse::Address::State::OrSymbol, + zipcode: String, + address_line_2: T.nilable(String) + ).returns(T.attached_class) + end + def self.new( + # Primary street address + address_line_1:, + # City name + city:, + # - `AL` - AL + # - `AK` - AK + # - `AZ` - AZ + # - `AR` - AR + # - `CA` - CA + # - `CO` - CO + # - `CT` - CT + # - `DC` - DC + # - `DE` - DE + # - `FL` - FL + # - `GA` - GA + # - `HI` - HI + # - `ID` - ID + # - `IL` - IL + # - `IN` - IN + # - `IA` - IA + # - `KS` - KS + # - `KY` - KY + # - `LA` - LA + # - `ME` - ME + # - `MD` - MD + # - `MA` - MA + # - `MI` - MI + # - `MN` - MN + # - `MS` - MS + # - `MO` - MO + # - `MT` - MT + # - `NE` - NE + # - `NV` - NV + # - `NH` - NH + # - `NJ` - NJ + # - `NM` - NM + # - `NY` - NY + # - `NC` - NC + # - `ND` - ND + # - `OH` - OH + # - `OK` - OK + # - `OR` - OR + # - `PA` - PA + # - `RI` - RI + # - `SC` - SC + # - `SD` - SD + # - `TN` - TN + # - `TX` - TX + # - `UT` - UT + # - `VT` - VT + # - `VA` - VA + # - `WA` - WA + # - `WI` - WI + # - `WV` - WV + # - `WY` - WY + # - `PR` - PR + # - `GU` - GU + # - `AS` - AS + # - `VI` - VI + # - `MP` - MP + # - `MH` - MH + # - `PW` - PW + # - `FM` - FM + # - `AE` - AE + # - `AA` - AA + # - `AP` - AP + state:, + # ZIP code (5 or 9 digit) + zipcode:, + # Secondary street address (apt, suite, etc.) + address_line_2: nil + ) + end + + sig do + override.returns( + { + address_line_1: String, + city: String, + state: + VitableConnect::Models::MemberListResponse::Address::State::TaggedSymbol, + zipcode: String, + address_line_2: T.nilable(String) + } + ) + end + def to_hash + end + + # - `AL` - AL + # - `AK` - AK + # - `AZ` - AZ + # - `AR` - AR + # - `CA` - CA + # - `CO` - CO + # - `CT` - CT + # - `DC` - DC + # - `DE` - DE + # - `FL` - FL + # - `GA` - GA + # - `HI` - HI + # - `ID` - ID + # - `IL` - IL + # - `IN` - IN + # - `IA` - IA + # - `KS` - KS + # - `KY` - KY + # - `LA` - LA + # - `ME` - ME + # - `MD` - MD + # - `MA` - MA + # - `MI` - MI + # - `MN` - MN + # - `MS` - MS + # - `MO` - MO + # - `MT` - MT + # - `NE` - NE + # - `NV` - NV + # - `NH` - NH + # - `NJ` - NJ + # - `NM` - NM + # - `NY` - NY + # - `NC` - NC + # - `ND` - ND + # - `OH` - OH + # - `OK` - OK + # - `OR` - OR + # - `PA` - PA + # - `RI` - RI + # - `SC` - SC + # - `SD` - SD + # - `TN` - TN + # - `TX` - TX + # - `UT` - UT + # - `VT` - VT + # - `VA` - VA + # - `WA` - WA + # - `WI` - WI + # - `WV` - WV + # - `WY` - WY + # - `PR` - PR + # - `GU` - GU + # - `AS` - AS + # - `VI` - VI + # - `MP` - MP + # - `MH` - MH + # - `PW` - PW + # - `FM` - FM + # - `AE` - AE + # - `AA` - AA + # - `AP` - AP + module State + extend VitableConnect::Internal::Type::Enum + + TaggedSymbol = + T.type_alias do + T.all( + Symbol, + VitableConnect::Models::MemberListResponse::Address::State + ) + end + OrSymbol = T.type_alias { T.any(Symbol, String) } + + AL = + T.let( + :AL, + VitableConnect::Models::MemberListResponse::Address::State::TaggedSymbol + ) + AK = + T.let( + :AK, + VitableConnect::Models::MemberListResponse::Address::State::TaggedSymbol + ) + AZ = + T.let( + :AZ, + VitableConnect::Models::MemberListResponse::Address::State::TaggedSymbol + ) + AR = + T.let( + :AR, + VitableConnect::Models::MemberListResponse::Address::State::TaggedSymbol + ) + CA = + T.let( + :CA, + VitableConnect::Models::MemberListResponse::Address::State::TaggedSymbol + ) + CO = + T.let( + :CO, + VitableConnect::Models::MemberListResponse::Address::State::TaggedSymbol + ) + CT = + T.let( + :CT, + VitableConnect::Models::MemberListResponse::Address::State::TaggedSymbol + ) + DC = + T.let( + :DC, + VitableConnect::Models::MemberListResponse::Address::State::TaggedSymbol + ) + DE = + T.let( + :DE, + VitableConnect::Models::MemberListResponse::Address::State::TaggedSymbol + ) + FL = + T.let( + :FL, + VitableConnect::Models::MemberListResponse::Address::State::TaggedSymbol + ) + GA = + T.let( + :GA, + VitableConnect::Models::MemberListResponse::Address::State::TaggedSymbol + ) + HI = + T.let( + :HI, + VitableConnect::Models::MemberListResponse::Address::State::TaggedSymbol + ) + ID = + T.let( + :ID, + VitableConnect::Models::MemberListResponse::Address::State::TaggedSymbol + ) + IL = + T.let( + :IL, + VitableConnect::Models::MemberListResponse::Address::State::TaggedSymbol + ) + IN = + T.let( + :IN, + VitableConnect::Models::MemberListResponse::Address::State::TaggedSymbol + ) + IA = + T.let( + :IA, + VitableConnect::Models::MemberListResponse::Address::State::TaggedSymbol + ) + KS = + T.let( + :KS, + VitableConnect::Models::MemberListResponse::Address::State::TaggedSymbol + ) + KY = + T.let( + :KY, + VitableConnect::Models::MemberListResponse::Address::State::TaggedSymbol + ) + LA = + T.let( + :LA, + VitableConnect::Models::MemberListResponse::Address::State::TaggedSymbol + ) + ME = + T.let( + :ME, + VitableConnect::Models::MemberListResponse::Address::State::TaggedSymbol + ) + MD = + T.let( + :MD, + VitableConnect::Models::MemberListResponse::Address::State::TaggedSymbol + ) + MA = + T.let( + :MA, + VitableConnect::Models::MemberListResponse::Address::State::TaggedSymbol + ) + MI = + T.let( + :MI, + VitableConnect::Models::MemberListResponse::Address::State::TaggedSymbol + ) + MN = + T.let( + :MN, + VitableConnect::Models::MemberListResponse::Address::State::TaggedSymbol + ) + MS = + T.let( + :MS, + VitableConnect::Models::MemberListResponse::Address::State::TaggedSymbol + ) + MO = + T.let( + :MO, + VitableConnect::Models::MemberListResponse::Address::State::TaggedSymbol + ) + MT = + T.let( + :MT, + VitableConnect::Models::MemberListResponse::Address::State::TaggedSymbol + ) + NE = + T.let( + :NE, + VitableConnect::Models::MemberListResponse::Address::State::TaggedSymbol + ) + NV = + T.let( + :NV, + VitableConnect::Models::MemberListResponse::Address::State::TaggedSymbol + ) + NH = + T.let( + :NH, + VitableConnect::Models::MemberListResponse::Address::State::TaggedSymbol + ) + NJ = + T.let( + :NJ, + VitableConnect::Models::MemberListResponse::Address::State::TaggedSymbol + ) + NM = + T.let( + :NM, + VitableConnect::Models::MemberListResponse::Address::State::TaggedSymbol + ) + NY = + T.let( + :NY, + VitableConnect::Models::MemberListResponse::Address::State::TaggedSymbol + ) + NC = + T.let( + :NC, + VitableConnect::Models::MemberListResponse::Address::State::TaggedSymbol + ) + ND = + T.let( + :ND, + VitableConnect::Models::MemberListResponse::Address::State::TaggedSymbol + ) + OH = + T.let( + :OH, + VitableConnect::Models::MemberListResponse::Address::State::TaggedSymbol + ) + OK = + T.let( + :OK, + VitableConnect::Models::MemberListResponse::Address::State::TaggedSymbol + ) + OR = + T.let( + :OR, + VitableConnect::Models::MemberListResponse::Address::State::TaggedSymbol + ) + PA = + T.let( + :PA, + VitableConnect::Models::MemberListResponse::Address::State::TaggedSymbol + ) + RI = + T.let( + :RI, + VitableConnect::Models::MemberListResponse::Address::State::TaggedSymbol + ) + SC = + T.let( + :SC, + VitableConnect::Models::MemberListResponse::Address::State::TaggedSymbol + ) + SD = + T.let( + :SD, + VitableConnect::Models::MemberListResponse::Address::State::TaggedSymbol + ) + TN = + T.let( + :TN, + VitableConnect::Models::MemberListResponse::Address::State::TaggedSymbol + ) + TX = + T.let( + :TX, + VitableConnect::Models::MemberListResponse::Address::State::TaggedSymbol + ) + UT = + T.let( + :UT, + VitableConnect::Models::MemberListResponse::Address::State::TaggedSymbol + ) + VT = + T.let( + :VT, + VitableConnect::Models::MemberListResponse::Address::State::TaggedSymbol + ) + VA = + T.let( + :VA, + VitableConnect::Models::MemberListResponse::Address::State::TaggedSymbol + ) + WA = + T.let( + :WA, + VitableConnect::Models::MemberListResponse::Address::State::TaggedSymbol + ) + WI = + T.let( + :WI, + VitableConnect::Models::MemberListResponse::Address::State::TaggedSymbol + ) + WV = + T.let( + :WV, + VitableConnect::Models::MemberListResponse::Address::State::TaggedSymbol + ) + WY = + T.let( + :WY, + VitableConnect::Models::MemberListResponse::Address::State::TaggedSymbol + ) + PR = + T.let( + :PR, + VitableConnect::Models::MemberListResponse::Address::State::TaggedSymbol + ) + GU = + T.let( + :GU, + VitableConnect::Models::MemberListResponse::Address::State::TaggedSymbol + ) + AS = + T.let( + :AS, + VitableConnect::Models::MemberListResponse::Address::State::TaggedSymbol + ) + VI = + T.let( + :VI, + VitableConnect::Models::MemberListResponse::Address::State::TaggedSymbol + ) + MP = + T.let( + :MP, + VitableConnect::Models::MemberListResponse::Address::State::TaggedSymbol + ) + MH = + T.let( + :MH, + VitableConnect::Models::MemberListResponse::Address::State::TaggedSymbol + ) + PW = + T.let( + :PW, + VitableConnect::Models::MemberListResponse::Address::State::TaggedSymbol + ) + FM = + T.let( + :FM, + VitableConnect::Models::MemberListResponse::Address::State::TaggedSymbol + ) + AE = + T.let( + :AE, + VitableConnect::Models::MemberListResponse::Address::State::TaggedSymbol + ) + AA = + T.let( + :AA, + VitableConnect::Models::MemberListResponse::Address::State::TaggedSymbol + ) + AP = + T.let( + :AP, + VitableConnect::Models::MemberListResponse::Address::State::TaggedSymbol + ) + + sig do + override.returns( + T::Array[ + VitableConnect::Models::MemberListResponse::Address::State::TaggedSymbol + ] + ) + end + def self.values + end + end + end + end + end +end diff --git a/rbi/vitable_connect/models/member_retrieve_household_params.rbi b/rbi/vitable_connect/models/member_retrieve_household_params.rbi new file mode 100644 index 0000000..865beff --- /dev/null +++ b/rbi/vitable_connect/models/member_retrieve_household_params.rbi @@ -0,0 +1,43 @@ +# typed: strong + +module VitableConnect + module Models + class MemberRetrieveHouseholdParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + OrHash = + T.type_alias do + T.any( + VitableConnect::MemberRetrieveHouseholdParams, + VitableConnect::Internal::AnyHash + ) + end + + # Unique member identifier (mbr\_\*) + sig { returns(String) } + attr_accessor :member_id + + sig do + params( + member_id: String, + request_options: VitableConnect::RequestOptions::OrHash + ).returns(T.attached_class) + end + def self.new( + # Unique member identifier (mbr\_\*) + member_id:, + request_options: {} + ) + end + + sig do + override.returns( + { member_id: String, request_options: VitableConnect::RequestOptions } + ) + end + def to_hash + end + end + end +end diff --git a/rbi/vitable_connect/models/member_retrieve_household_response.rbi b/rbi/vitable_connect/models/member_retrieve_household_response.rbi new file mode 100644 index 0000000..261a0d0 --- /dev/null +++ b/rbi/vitable_connect/models/member_retrieve_household_response.rbi @@ -0,0 +1,251 @@ +# typed: strong + +module VitableConnect + module Models + class MemberRetrieveHouseholdResponse < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::MemberRetrieveHouseholdResponse, + VitableConnect::Internal::AnyHash + ) + end + + sig do + returns( + T::Array[ + VitableConnect::Models::MemberRetrieveHouseholdResponse::Data + ] + ) + end + attr_accessor :data + + # Unpaginated `{"data": [...]}` list of the members of a member's household. + sig do + params( + data: + T::Array[ + VitableConnect::Models::MemberRetrieveHouseholdResponse::Data::OrHash + ] + ).returns(T.attached_class) + end + def self.new(data:) + end + + sig do + override.returns( + { + data: + T::Array[ + VitableConnect::Models::MemberRetrieveHouseholdResponse::Data + ] + } + ) + end + def to_hash + end + + class Data < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::MemberRetrieveHouseholdResponse::Data, + VitableConnect::Internal::AnyHash + ) + end + + # Date of birth (YYYY-MM-DD) + sig { returns(Date) } + attr_accessor :date_of_birth + + # Household member's first name + sig { returns(String) } + attr_accessor :first_name + + # Whether this participant is a household admin (the account holder always is) + sig { returns(T::Boolean) } + attr_accessor :household_admin_in + + # Household member's last name + sig { returns(String) } + attr_accessor :last_name + + # - `Account Holder` - Account Holder + # - `Dependent` - Dependent + # - `Inactive` - Inactive + sig do + returns( + VitableConnect::Models::MemberRetrieveHouseholdResponse::Data::MemberType::TaggedSymbol + ) + end + attr_accessor :member_type + + # - `Child` - Child + # - `Spouse` - Spouse + # - `Roommate` - Roommate + # - `Other` - Other + sig do + returns( + T.nilable( + VitableConnect::Models::MemberRetrieveHouseholdResponse::Data::Relationship::TaggedSymbol + ) + ) + end + attr_accessor :relationship + + # Member identifier with 'mbr\_' prefix + sig { returns(String) } + attr_accessor :member_id + + # Wire serializer for :class:`HouseholdMemberDTO` (one household participant). + sig do + params( + date_of_birth: Date, + first_name: String, + household_admin_in: T::Boolean, + last_name: String, + member_id: String, + member_type: + VitableConnect::Models::MemberRetrieveHouseholdResponse::Data::MemberType::OrSymbol, + relationship: + T.nilable( + VitableConnect::Models::MemberRetrieveHouseholdResponse::Data::Relationship::OrSymbol + ) + ).returns(T.attached_class) + end + def self.new( + # Date of birth (YYYY-MM-DD) + date_of_birth:, + # Household member's first name + first_name:, + # Whether this participant is a household admin (the account holder always is) + household_admin_in:, + # Household member's last name + last_name:, + # Member identifier with 'mbr\_' prefix + member_id:, + # - `Account Holder` - Account Holder + # - `Dependent` - Dependent + # - `Inactive` - Inactive + member_type:, + # - `Child` - Child + # - `Spouse` - Spouse + # - `Roommate` - Roommate + # - `Other` - Other + relationship: nil + ) + end + + sig do + override.returns( + { + date_of_birth: Date, + first_name: String, + household_admin_in: T::Boolean, + last_name: String, + member_id: String, + member_type: + VitableConnect::Models::MemberRetrieveHouseholdResponse::Data::MemberType::TaggedSymbol, + relationship: + T.nilable( + VitableConnect::Models::MemberRetrieveHouseholdResponse::Data::Relationship::TaggedSymbol + ) + } + ) + end + def to_hash + end + + # - `Account Holder` - Account Holder + # - `Dependent` - Dependent + # - `Inactive` - Inactive + module MemberType + extend VitableConnect::Internal::Type::Enum + + TaggedSymbol = + T.type_alias do + T.all( + Symbol, + VitableConnect::Models::MemberRetrieveHouseholdResponse::Data::MemberType + ) + end + OrSymbol = T.type_alias { T.any(Symbol, String) } + + ACCOUNT_HOLDER = + T.let( + :"Account Holder", + VitableConnect::Models::MemberRetrieveHouseholdResponse::Data::MemberType::TaggedSymbol + ) + DEPENDENT = + T.let( + :Dependent, + VitableConnect::Models::MemberRetrieveHouseholdResponse::Data::MemberType::TaggedSymbol + ) + INACTIVE = + T.let( + :Inactive, + VitableConnect::Models::MemberRetrieveHouseholdResponse::Data::MemberType::TaggedSymbol + ) + + sig do + override.returns( + T::Array[ + VitableConnect::Models::MemberRetrieveHouseholdResponse::Data::MemberType::TaggedSymbol + ] + ) + end + def self.values + end + end + + # - `Child` - Child + # - `Spouse` - Spouse + # - `Roommate` - Roommate + # - `Other` - Other + module Relationship + extend VitableConnect::Internal::Type::Enum + + TaggedSymbol = + T.type_alias do + T.all( + Symbol, + VitableConnect::Models::MemberRetrieveHouseholdResponse::Data::Relationship + ) + end + OrSymbol = T.type_alias { T.any(Symbol, String) } + + CHILD = + T.let( + :Child, + VitableConnect::Models::MemberRetrieveHouseholdResponse::Data::Relationship::TaggedSymbol + ) + SPOUSE = + T.let( + :Spouse, + VitableConnect::Models::MemberRetrieveHouseholdResponse::Data::Relationship::TaggedSymbol + ) + ROOMMATE = + T.let( + :Roommate, + VitableConnect::Models::MemberRetrieveHouseholdResponse::Data::Relationship::TaggedSymbol + ) + OTHER = + T.let( + :Other, + VitableConnect::Models::MemberRetrieveHouseholdResponse::Data::Relationship::TaggedSymbol + ) + + sig do + override.returns( + T::Array[ + VitableConnect::Models::MemberRetrieveHouseholdResponse::Data::Relationship::TaggedSymbol + ] + ) + end + def self.values + end + end + end + end + end +end diff --git a/rbi/vitable_connect/models/member_retrieve_params.rbi b/rbi/vitable_connect/models/member_retrieve_params.rbi new file mode 100644 index 0000000..766dc41 --- /dev/null +++ b/rbi/vitable_connect/models/member_retrieve_params.rbi @@ -0,0 +1,43 @@ +# typed: strong + +module VitableConnect + module Models + class MemberRetrieveParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + OrHash = + T.type_alias do + T.any( + VitableConnect::MemberRetrieveParams, + VitableConnect::Internal::AnyHash + ) + end + + # Unique member identifier (mbr\_\*) + sig { returns(String) } + attr_accessor :member_id + + sig do + params( + member_id: String, + request_options: VitableConnect::RequestOptions::OrHash + ).returns(T.attached_class) + end + def self.new( + # Unique member identifier (mbr\_\*) + member_id:, + request_options: {} + ) + end + + sig do + override.returns( + { member_id: String, request_options: VitableConnect::RequestOptions } + ) + end + def to_hash + end + end + end +end diff --git a/rbi/vitable_connect/models/member_retrieve_response.rbi b/rbi/vitable_connect/models/member_retrieve_response.rbi new file mode 100644 index 0000000..1fa782c --- /dev/null +++ b/rbi/vitable_connect/models/member_retrieve_response.rbi @@ -0,0 +1,1230 @@ +# typed: strong + +module VitableConnect + module Models + class MemberRetrieveResponse < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::MemberRetrieveResponse, + VitableConnect::Internal::AnyHash + ) + end + + # A member's profile: identity, contact details, address, demographics, and + # onboarding status. + sig { returns(VitableConnect::Models::MemberRetrieveResponse::Data) } + attr_reader :data + + sig do + params( + data: VitableConnect::Models::MemberRetrieveResponse::Data::OrHash + ).void + end + attr_writer :data + + # Response containing a single member resource. + sig do + params( + data: VitableConnect::Models::MemberRetrieveResponse::Data::OrHash + ).returns(T.attached_class) + end + def self.new( + # A member's profile: identity, contact details, address, demographics, and + # onboarding status. + data: + ) + end + + sig do + override.returns( + { data: VitableConnect::Models::MemberRetrieveResponse::Data } + ) + end + def to_hash + end + + class Data < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::MemberRetrieveResponse::Data, + VitableConnect::Internal::AnyHash + ) + end + + # Member's age in years, derived from date of birth + sig { returns(Integer) } + attr_accessor :age + + # Date of birth (YYYY-MM-DD) + sig { returns(Date) } + attr_accessor :date_of_birth + + # Member's legal first name + sig { returns(String) } + attr_accessor :first_name + + # Member's legal last name + sig { returns(String) } + attr_accessor :last_name + + # Member's residential address + sig do + returns( + T.nilable( + VitableConnect::Models::MemberRetrieveResponse::Data::Address + ) + ) + end + attr_reader :address + + sig do + params( + address: + T.nilable( + VitableConnect::Models::MemberRetrieveResponse::Data::Address::OrHash + ) + ).void + end + attr_writer :address + + # Email address + sig { returns(T.nilable(String)) } + attr_accessor :email + + # - `Male` - Male + # - `Female` - Female + # - `Transgender` - Transgender + # - `Non-binary` - Non Binary + # - `Prefer not to respond` - Prefer Not To Respond + sig do + returns( + T.nilable( + VitableConnect::Models::MemberRetrieveResponse::Data::Gender::TaggedSymbol + ) + ) + end + attr_accessor :gender + + # - `Single` - Single + # - `Married` - Married + sig do + returns( + T.nilable( + VitableConnect::Models::MemberRetrieveResponse::Data::MaritalStatus::TaggedSymbol + ) + ) + end + attr_accessor :marital_status + + # Member's legal middle name + sig { returns(T.nilable(String)) } + attr_accessor :middle_name + + # Phone number (10-digit US domestic string) + sig { returns(T.nilable(String)) } + attr_accessor :phone + + # - `en` - English + # - `es` - Spanish + # - `zh` - Chinese + # - `ru` - Russian + # - `sw` - Swahili + # - `th` - Thai + sig do + returns( + T.nilable( + VitableConnect::Models::MemberRetrieveResponse::Data::PreferredLanguage::TaggedSymbol + ) + ) + end + attr_accessor :preferred_language + + # - `Male` - Male + # - `Female` - Female + # - `Other` - Other + # - `Unknown` - Unknown + sig do + returns( + T.nilable( + VitableConnect::Models::MemberRetrieveResponse::Data::SexAtBirth::TaggedSymbol + ) + ) + end + attr_accessor :sex_at_birth + + # - `Sr` - Sr + # - `Jr` - Jr + # - `I` - I + # - `II` - II + # - `III` - III + # - `IV` - IV + # - `V` - V + sig do + returns( + T.nilable( + VitableConnect::Models::MemberRetrieveResponse::Data::Suffix::TaggedSymbol + ) + ) + end + attr_accessor :suffix + + # Whether the member uses tobacco, if known + sig { returns(T.nilable(T::Boolean)) } + attr_accessor :tobacco_status + + # Unique member identifier with 'mbr\_' prefix + sig { returns(String) } + attr_accessor :id + + # Member's full legal name + sig { returns(String) } + attr_accessor :name + + # Member profile status (onboarded or pending onboarding) + sig do + returns( + VitableConnect::Models::MemberRetrieveResponse::Data::Status::TaggedSymbol + ) + end + attr_accessor :status + + # A member's profile: identity, contact details, address, demographics, and + # onboarding status. + sig do + params( + id: String, + age: Integer, + date_of_birth: Date, + first_name: String, + last_name: String, + name: String, + status: + VitableConnect::Models::MemberRetrieveResponse::Data::Status::OrSymbol, + address: + T.nilable( + VitableConnect::Models::MemberRetrieveResponse::Data::Address::OrHash + ), + email: T.nilable(String), + gender: + T.nilable( + VitableConnect::Models::MemberRetrieveResponse::Data::Gender::OrSymbol + ), + marital_status: + T.nilable( + VitableConnect::Models::MemberRetrieveResponse::Data::MaritalStatus::OrSymbol + ), + middle_name: T.nilable(String), + phone: T.nilable(String), + preferred_language: + T.nilable( + VitableConnect::Models::MemberRetrieveResponse::Data::PreferredLanguage::OrSymbol + ), + sex_at_birth: + T.nilable( + VitableConnect::Models::MemberRetrieveResponse::Data::SexAtBirth::OrSymbol + ), + suffix: + T.nilable( + VitableConnect::Models::MemberRetrieveResponse::Data::Suffix::OrSymbol + ), + tobacco_status: T.nilable(T::Boolean) + ).returns(T.attached_class) + end + def self.new( + # Unique member identifier with 'mbr\_' prefix + id:, + # Member's age in years, derived from date of birth + age:, + # Date of birth (YYYY-MM-DD) + date_of_birth:, + # Member's legal first name + first_name:, + # Member's legal last name + last_name:, + # Member's full legal name + name:, + # Member profile status (onboarded or pending onboarding) + status:, + # Member's residential address + address: nil, + # Email address + email: nil, + # - `Male` - Male + # - `Female` - Female + # - `Transgender` - Transgender + # - `Non-binary` - Non Binary + # - `Prefer not to respond` - Prefer Not To Respond + gender: nil, + # - `Single` - Single + # - `Married` - Married + marital_status: nil, + # Member's legal middle name + middle_name: nil, + # Phone number (10-digit US domestic string) + phone: nil, + # - `en` - English + # - `es` - Spanish + # - `zh` - Chinese + # - `ru` - Russian + # - `sw` - Swahili + # - `th` - Thai + preferred_language: nil, + # - `Male` - Male + # - `Female` - Female + # - `Other` - Other + # - `Unknown` - Unknown + sex_at_birth: nil, + # - `Sr` - Sr + # - `Jr` - Jr + # - `I` - I + # - `II` - II + # - `III` - III + # - `IV` - IV + # - `V` - V + suffix: nil, + # Whether the member uses tobacco, if known + tobacco_status: nil + ) + end + + sig do + override.returns( + { + id: String, + age: Integer, + date_of_birth: Date, + first_name: String, + last_name: String, + name: String, + status: + VitableConnect::Models::MemberRetrieveResponse::Data::Status::TaggedSymbol, + address: + T.nilable( + VitableConnect::Models::MemberRetrieveResponse::Data::Address + ), + email: T.nilable(String), + gender: + T.nilable( + VitableConnect::Models::MemberRetrieveResponse::Data::Gender::TaggedSymbol + ), + marital_status: + T.nilable( + VitableConnect::Models::MemberRetrieveResponse::Data::MaritalStatus::TaggedSymbol + ), + middle_name: T.nilable(String), + phone: T.nilable(String), + preferred_language: + T.nilable( + VitableConnect::Models::MemberRetrieveResponse::Data::PreferredLanguage::TaggedSymbol + ), + sex_at_birth: + T.nilable( + VitableConnect::Models::MemberRetrieveResponse::Data::SexAtBirth::TaggedSymbol + ), + suffix: + T.nilable( + VitableConnect::Models::MemberRetrieveResponse::Data::Suffix::TaggedSymbol + ), + tobacco_status: T.nilable(T::Boolean) + } + ) + end + def to_hash + end + + # Member profile status (onboarded or pending onboarding) + module Status + extend VitableConnect::Internal::Type::Enum + + TaggedSymbol = + T.type_alias do + T.all( + Symbol, + VitableConnect::Models::MemberRetrieveResponse::Data::Status + ) + end + OrSymbol = T.type_alias { T.any(Symbol, String) } + + ONBOARDED = + T.let( + :onboarded, + VitableConnect::Models::MemberRetrieveResponse::Data::Status::TaggedSymbol + ) + PENDING_ONBOARDING = + T.let( + :pending_onboarding, + VitableConnect::Models::MemberRetrieveResponse::Data::Status::TaggedSymbol + ) + + sig do + override.returns( + T::Array[ + VitableConnect::Models::MemberRetrieveResponse::Data::Status::TaggedSymbol + ] + ) + end + def self.values + end + end + + class Address < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::MemberRetrieveResponse::Data::Address, + VitableConnect::Internal::AnyHash + ) + end + + # Primary street address + sig { returns(String) } + attr_accessor :address_line_1 + + # City name + sig { returns(String) } + attr_accessor :city + + # - `AL` - AL + # - `AK` - AK + # - `AZ` - AZ + # - `AR` - AR + # - `CA` - CA + # - `CO` - CO + # - `CT` - CT + # - `DC` - DC + # - `DE` - DE + # - `FL` - FL + # - `GA` - GA + # - `HI` - HI + # - `ID` - ID + # - `IL` - IL + # - `IN` - IN + # - `IA` - IA + # - `KS` - KS + # - `KY` - KY + # - `LA` - LA + # - `ME` - ME + # - `MD` - MD + # - `MA` - MA + # - `MI` - MI + # - `MN` - MN + # - `MS` - MS + # - `MO` - MO + # - `MT` - MT + # - `NE` - NE + # - `NV` - NV + # - `NH` - NH + # - `NJ` - NJ + # - `NM` - NM + # - `NY` - NY + # - `NC` - NC + # - `ND` - ND + # - `OH` - OH + # - `OK` - OK + # - `OR` - OR + # - `PA` - PA + # - `RI` - RI + # - `SC` - SC + # - `SD` - SD + # - `TN` - TN + # - `TX` - TX + # - `UT` - UT + # - `VT` - VT + # - `VA` - VA + # - `WA` - WA + # - `WI` - WI + # - `WV` - WV + # - `WY` - WY + # - `PR` - PR + # - `GU` - GU + # - `AS` - AS + # - `VI` - VI + # - `MP` - MP + # - `MH` - MH + # - `PW` - PW + # - `FM` - FM + # - `AE` - AE + # - `AA` - AA + # - `AP` - AP + sig do + returns( + VitableConnect::Models::MemberRetrieveResponse::Data::Address::State::TaggedSymbol + ) + end + attr_accessor :state + + # ZIP code (5 or 9 digit) + sig { returns(String) } + attr_accessor :zipcode + + # Secondary street address (apt, suite, etc.) + sig { returns(T.nilable(String)) } + attr_accessor :address_line_2 + + # Member's residential address + sig do + params( + address_line_1: String, + city: String, + state: + VitableConnect::Models::MemberRetrieveResponse::Data::Address::State::OrSymbol, + zipcode: String, + address_line_2: T.nilable(String) + ).returns(T.attached_class) + end + def self.new( + # Primary street address + address_line_1:, + # City name + city:, + # - `AL` - AL + # - `AK` - AK + # - `AZ` - AZ + # - `AR` - AR + # - `CA` - CA + # - `CO` - CO + # - `CT` - CT + # - `DC` - DC + # - `DE` - DE + # - `FL` - FL + # - `GA` - GA + # - `HI` - HI + # - `ID` - ID + # - `IL` - IL + # - `IN` - IN + # - `IA` - IA + # - `KS` - KS + # - `KY` - KY + # - `LA` - LA + # - `ME` - ME + # - `MD` - MD + # - `MA` - MA + # - `MI` - MI + # - `MN` - MN + # - `MS` - MS + # - `MO` - MO + # - `MT` - MT + # - `NE` - NE + # - `NV` - NV + # - `NH` - NH + # - `NJ` - NJ + # - `NM` - NM + # - `NY` - NY + # - `NC` - NC + # - `ND` - ND + # - `OH` - OH + # - `OK` - OK + # - `OR` - OR + # - `PA` - PA + # - `RI` - RI + # - `SC` - SC + # - `SD` - SD + # - `TN` - TN + # - `TX` - TX + # - `UT` - UT + # - `VT` - VT + # - `VA` - VA + # - `WA` - WA + # - `WI` - WI + # - `WV` - WV + # - `WY` - WY + # - `PR` - PR + # - `GU` - GU + # - `AS` - AS + # - `VI` - VI + # - `MP` - MP + # - `MH` - MH + # - `PW` - PW + # - `FM` - FM + # - `AE` - AE + # - `AA` - AA + # - `AP` - AP + state:, + # ZIP code (5 or 9 digit) + zipcode:, + # Secondary street address (apt, suite, etc.) + address_line_2: nil + ) + end + + sig do + override.returns( + { + address_line_1: String, + city: String, + state: + VitableConnect::Models::MemberRetrieveResponse::Data::Address::State::TaggedSymbol, + zipcode: String, + address_line_2: T.nilable(String) + } + ) + end + def to_hash + end + + # - `AL` - AL + # - `AK` - AK + # - `AZ` - AZ + # - `AR` - AR + # - `CA` - CA + # - `CO` - CO + # - `CT` - CT + # - `DC` - DC + # - `DE` - DE + # - `FL` - FL + # - `GA` - GA + # - `HI` - HI + # - `ID` - ID + # - `IL` - IL + # - `IN` - IN + # - `IA` - IA + # - `KS` - KS + # - `KY` - KY + # - `LA` - LA + # - `ME` - ME + # - `MD` - MD + # - `MA` - MA + # - `MI` - MI + # - `MN` - MN + # - `MS` - MS + # - `MO` - MO + # - `MT` - MT + # - `NE` - NE + # - `NV` - NV + # - `NH` - NH + # - `NJ` - NJ + # - `NM` - NM + # - `NY` - NY + # - `NC` - NC + # - `ND` - ND + # - `OH` - OH + # - `OK` - OK + # - `OR` - OR + # - `PA` - PA + # - `RI` - RI + # - `SC` - SC + # - `SD` - SD + # - `TN` - TN + # - `TX` - TX + # - `UT` - UT + # - `VT` - VT + # - `VA` - VA + # - `WA` - WA + # - `WI` - WI + # - `WV` - WV + # - `WY` - WY + # - `PR` - PR + # - `GU` - GU + # - `AS` - AS + # - `VI` - VI + # - `MP` - MP + # - `MH` - MH + # - `PW` - PW + # - `FM` - FM + # - `AE` - AE + # - `AA` - AA + # - `AP` - AP + module State + extend VitableConnect::Internal::Type::Enum + + TaggedSymbol = + T.type_alias do + T.all( + Symbol, + VitableConnect::Models::MemberRetrieveResponse::Data::Address::State + ) + end + OrSymbol = T.type_alias { T.any(Symbol, String) } + + AL = + T.let( + :AL, + VitableConnect::Models::MemberRetrieveResponse::Data::Address::State::TaggedSymbol + ) + AK = + T.let( + :AK, + VitableConnect::Models::MemberRetrieveResponse::Data::Address::State::TaggedSymbol + ) + AZ = + T.let( + :AZ, + VitableConnect::Models::MemberRetrieveResponse::Data::Address::State::TaggedSymbol + ) + AR = + T.let( + :AR, + VitableConnect::Models::MemberRetrieveResponse::Data::Address::State::TaggedSymbol + ) + CA = + T.let( + :CA, + VitableConnect::Models::MemberRetrieveResponse::Data::Address::State::TaggedSymbol + ) + CO = + T.let( + :CO, + VitableConnect::Models::MemberRetrieveResponse::Data::Address::State::TaggedSymbol + ) + CT = + T.let( + :CT, + VitableConnect::Models::MemberRetrieveResponse::Data::Address::State::TaggedSymbol + ) + DC = + T.let( + :DC, + VitableConnect::Models::MemberRetrieveResponse::Data::Address::State::TaggedSymbol + ) + DE = + T.let( + :DE, + VitableConnect::Models::MemberRetrieveResponse::Data::Address::State::TaggedSymbol + ) + FL = + T.let( + :FL, + VitableConnect::Models::MemberRetrieveResponse::Data::Address::State::TaggedSymbol + ) + GA = + T.let( + :GA, + VitableConnect::Models::MemberRetrieveResponse::Data::Address::State::TaggedSymbol + ) + HI = + T.let( + :HI, + VitableConnect::Models::MemberRetrieveResponse::Data::Address::State::TaggedSymbol + ) + ID = + T.let( + :ID, + VitableConnect::Models::MemberRetrieveResponse::Data::Address::State::TaggedSymbol + ) + IL = + T.let( + :IL, + VitableConnect::Models::MemberRetrieveResponse::Data::Address::State::TaggedSymbol + ) + IN = + T.let( + :IN, + VitableConnect::Models::MemberRetrieveResponse::Data::Address::State::TaggedSymbol + ) + IA = + T.let( + :IA, + VitableConnect::Models::MemberRetrieveResponse::Data::Address::State::TaggedSymbol + ) + KS = + T.let( + :KS, + VitableConnect::Models::MemberRetrieveResponse::Data::Address::State::TaggedSymbol + ) + KY = + T.let( + :KY, + VitableConnect::Models::MemberRetrieveResponse::Data::Address::State::TaggedSymbol + ) + LA = + T.let( + :LA, + VitableConnect::Models::MemberRetrieveResponse::Data::Address::State::TaggedSymbol + ) + ME = + T.let( + :ME, + VitableConnect::Models::MemberRetrieveResponse::Data::Address::State::TaggedSymbol + ) + MD = + T.let( + :MD, + VitableConnect::Models::MemberRetrieveResponse::Data::Address::State::TaggedSymbol + ) + MA = + T.let( + :MA, + VitableConnect::Models::MemberRetrieveResponse::Data::Address::State::TaggedSymbol + ) + MI = + T.let( + :MI, + VitableConnect::Models::MemberRetrieveResponse::Data::Address::State::TaggedSymbol + ) + MN = + T.let( + :MN, + VitableConnect::Models::MemberRetrieveResponse::Data::Address::State::TaggedSymbol + ) + MS = + T.let( + :MS, + VitableConnect::Models::MemberRetrieveResponse::Data::Address::State::TaggedSymbol + ) + MO = + T.let( + :MO, + VitableConnect::Models::MemberRetrieveResponse::Data::Address::State::TaggedSymbol + ) + MT = + T.let( + :MT, + VitableConnect::Models::MemberRetrieveResponse::Data::Address::State::TaggedSymbol + ) + NE = + T.let( + :NE, + VitableConnect::Models::MemberRetrieveResponse::Data::Address::State::TaggedSymbol + ) + NV = + T.let( + :NV, + VitableConnect::Models::MemberRetrieveResponse::Data::Address::State::TaggedSymbol + ) + NH = + T.let( + :NH, + VitableConnect::Models::MemberRetrieveResponse::Data::Address::State::TaggedSymbol + ) + NJ = + T.let( + :NJ, + VitableConnect::Models::MemberRetrieveResponse::Data::Address::State::TaggedSymbol + ) + NM = + T.let( + :NM, + VitableConnect::Models::MemberRetrieveResponse::Data::Address::State::TaggedSymbol + ) + NY = + T.let( + :NY, + VitableConnect::Models::MemberRetrieveResponse::Data::Address::State::TaggedSymbol + ) + NC = + T.let( + :NC, + VitableConnect::Models::MemberRetrieveResponse::Data::Address::State::TaggedSymbol + ) + ND = + T.let( + :ND, + VitableConnect::Models::MemberRetrieveResponse::Data::Address::State::TaggedSymbol + ) + OH = + T.let( + :OH, + VitableConnect::Models::MemberRetrieveResponse::Data::Address::State::TaggedSymbol + ) + OK = + T.let( + :OK, + VitableConnect::Models::MemberRetrieveResponse::Data::Address::State::TaggedSymbol + ) + OR = + T.let( + :OR, + VitableConnect::Models::MemberRetrieveResponse::Data::Address::State::TaggedSymbol + ) + PA = + T.let( + :PA, + VitableConnect::Models::MemberRetrieveResponse::Data::Address::State::TaggedSymbol + ) + RI = + T.let( + :RI, + VitableConnect::Models::MemberRetrieveResponse::Data::Address::State::TaggedSymbol + ) + SC = + T.let( + :SC, + VitableConnect::Models::MemberRetrieveResponse::Data::Address::State::TaggedSymbol + ) + SD = + T.let( + :SD, + VitableConnect::Models::MemberRetrieveResponse::Data::Address::State::TaggedSymbol + ) + TN = + T.let( + :TN, + VitableConnect::Models::MemberRetrieveResponse::Data::Address::State::TaggedSymbol + ) + TX = + T.let( + :TX, + VitableConnect::Models::MemberRetrieveResponse::Data::Address::State::TaggedSymbol + ) + UT = + T.let( + :UT, + VitableConnect::Models::MemberRetrieveResponse::Data::Address::State::TaggedSymbol + ) + VT = + T.let( + :VT, + VitableConnect::Models::MemberRetrieveResponse::Data::Address::State::TaggedSymbol + ) + VA = + T.let( + :VA, + VitableConnect::Models::MemberRetrieveResponse::Data::Address::State::TaggedSymbol + ) + WA = + T.let( + :WA, + VitableConnect::Models::MemberRetrieveResponse::Data::Address::State::TaggedSymbol + ) + WI = + T.let( + :WI, + VitableConnect::Models::MemberRetrieveResponse::Data::Address::State::TaggedSymbol + ) + WV = + T.let( + :WV, + VitableConnect::Models::MemberRetrieveResponse::Data::Address::State::TaggedSymbol + ) + WY = + T.let( + :WY, + VitableConnect::Models::MemberRetrieveResponse::Data::Address::State::TaggedSymbol + ) + PR = + T.let( + :PR, + VitableConnect::Models::MemberRetrieveResponse::Data::Address::State::TaggedSymbol + ) + GU = + T.let( + :GU, + VitableConnect::Models::MemberRetrieveResponse::Data::Address::State::TaggedSymbol + ) + AS = + T.let( + :AS, + VitableConnect::Models::MemberRetrieveResponse::Data::Address::State::TaggedSymbol + ) + VI = + T.let( + :VI, + VitableConnect::Models::MemberRetrieveResponse::Data::Address::State::TaggedSymbol + ) + MP = + T.let( + :MP, + VitableConnect::Models::MemberRetrieveResponse::Data::Address::State::TaggedSymbol + ) + MH = + T.let( + :MH, + VitableConnect::Models::MemberRetrieveResponse::Data::Address::State::TaggedSymbol + ) + PW = + T.let( + :PW, + VitableConnect::Models::MemberRetrieveResponse::Data::Address::State::TaggedSymbol + ) + FM = + T.let( + :FM, + VitableConnect::Models::MemberRetrieveResponse::Data::Address::State::TaggedSymbol + ) + AE = + T.let( + :AE, + VitableConnect::Models::MemberRetrieveResponse::Data::Address::State::TaggedSymbol + ) + AA = + T.let( + :AA, + VitableConnect::Models::MemberRetrieveResponse::Data::Address::State::TaggedSymbol + ) + AP = + T.let( + :AP, + VitableConnect::Models::MemberRetrieveResponse::Data::Address::State::TaggedSymbol + ) + + sig do + override.returns( + T::Array[ + VitableConnect::Models::MemberRetrieveResponse::Data::Address::State::TaggedSymbol + ] + ) + end + def self.values + end + end + end + + # - `Male` - Male + # - `Female` - Female + # - `Transgender` - Transgender + # - `Non-binary` - Non Binary + # - `Prefer not to respond` - Prefer Not To Respond + module Gender + extend VitableConnect::Internal::Type::Enum + + TaggedSymbol = + T.type_alias do + T.all( + Symbol, + VitableConnect::Models::MemberRetrieveResponse::Data::Gender + ) + end + OrSymbol = T.type_alias { T.any(Symbol, String) } + + MALE = + T.let( + :Male, + VitableConnect::Models::MemberRetrieveResponse::Data::Gender::TaggedSymbol + ) + FEMALE = + T.let( + :Female, + VitableConnect::Models::MemberRetrieveResponse::Data::Gender::TaggedSymbol + ) + TRANSGENDER = + T.let( + :Transgender, + VitableConnect::Models::MemberRetrieveResponse::Data::Gender::TaggedSymbol + ) + NON_BINARY = + T.let( + :"Non-binary", + VitableConnect::Models::MemberRetrieveResponse::Data::Gender::TaggedSymbol + ) + PREFER_NOT_TO_RESPOND = + T.let( + :"Prefer not to respond", + VitableConnect::Models::MemberRetrieveResponse::Data::Gender::TaggedSymbol + ) + + sig do + override.returns( + T::Array[ + VitableConnect::Models::MemberRetrieveResponse::Data::Gender::TaggedSymbol + ] + ) + end + def self.values + end + end + + # - `Single` - Single + # - `Married` - Married + module MaritalStatus + extend VitableConnect::Internal::Type::Enum + + TaggedSymbol = + T.type_alias do + T.all( + Symbol, + VitableConnect::Models::MemberRetrieveResponse::Data::MaritalStatus + ) + end + OrSymbol = T.type_alias { T.any(Symbol, String) } + + SINGLE = + T.let( + :Single, + VitableConnect::Models::MemberRetrieveResponse::Data::MaritalStatus::TaggedSymbol + ) + MARRIED = + T.let( + :Married, + VitableConnect::Models::MemberRetrieveResponse::Data::MaritalStatus::TaggedSymbol + ) + + sig do + override.returns( + T::Array[ + VitableConnect::Models::MemberRetrieveResponse::Data::MaritalStatus::TaggedSymbol + ] + ) + end + def self.values + end + end + + # - `en` - English + # - `es` - Spanish + # - `zh` - Chinese + # - `ru` - Russian + # - `sw` - Swahili + # - `th` - Thai + module PreferredLanguage + extend VitableConnect::Internal::Type::Enum + + TaggedSymbol = + T.type_alias do + T.all( + Symbol, + VitableConnect::Models::MemberRetrieveResponse::Data::PreferredLanguage + ) + end + OrSymbol = T.type_alias { T.any(Symbol, String) } + + EN = + T.let( + :en, + VitableConnect::Models::MemberRetrieveResponse::Data::PreferredLanguage::TaggedSymbol + ) + ES = + T.let( + :es, + VitableConnect::Models::MemberRetrieveResponse::Data::PreferredLanguage::TaggedSymbol + ) + ZH = + T.let( + :zh, + VitableConnect::Models::MemberRetrieveResponse::Data::PreferredLanguage::TaggedSymbol + ) + RU = + T.let( + :ru, + VitableConnect::Models::MemberRetrieveResponse::Data::PreferredLanguage::TaggedSymbol + ) + SW = + T.let( + :sw, + VitableConnect::Models::MemberRetrieveResponse::Data::PreferredLanguage::TaggedSymbol + ) + TH = + T.let( + :th, + VitableConnect::Models::MemberRetrieveResponse::Data::PreferredLanguage::TaggedSymbol + ) + + sig do + override.returns( + T::Array[ + VitableConnect::Models::MemberRetrieveResponse::Data::PreferredLanguage::TaggedSymbol + ] + ) + end + def self.values + end + end + + # - `Male` - Male + # - `Female` - Female + # - `Other` - Other + # - `Unknown` - Unknown + module SexAtBirth + extend VitableConnect::Internal::Type::Enum + + TaggedSymbol = + T.type_alias do + T.all( + Symbol, + VitableConnect::Models::MemberRetrieveResponse::Data::SexAtBirth + ) + end + OrSymbol = T.type_alias { T.any(Symbol, String) } + + MALE = + T.let( + :Male, + VitableConnect::Models::MemberRetrieveResponse::Data::SexAtBirth::TaggedSymbol + ) + FEMALE = + T.let( + :Female, + VitableConnect::Models::MemberRetrieveResponse::Data::SexAtBirth::TaggedSymbol + ) + OTHER = + T.let( + :Other, + VitableConnect::Models::MemberRetrieveResponse::Data::SexAtBirth::TaggedSymbol + ) + UNKNOWN = + T.let( + :Unknown, + VitableConnect::Models::MemberRetrieveResponse::Data::SexAtBirth::TaggedSymbol + ) + + sig do + override.returns( + T::Array[ + VitableConnect::Models::MemberRetrieveResponse::Data::SexAtBirth::TaggedSymbol + ] + ) + end + def self.values + end + end + + # - `Sr` - Sr + # - `Jr` - Jr + # - `I` - I + # - `II` - II + # - `III` - III + # - `IV` - IV + # - `V` - V + module Suffix + extend VitableConnect::Internal::Type::Enum + + TaggedSymbol = + T.type_alias do + T.all( + Symbol, + VitableConnect::Models::MemberRetrieveResponse::Data::Suffix + ) + end + OrSymbol = T.type_alias { T.any(Symbol, String) } + + SR = + T.let( + :Sr, + VitableConnect::Models::MemberRetrieveResponse::Data::Suffix::TaggedSymbol + ) + JR = + T.let( + :Jr, + VitableConnect::Models::MemberRetrieveResponse::Data::Suffix::TaggedSymbol + ) + I = + T.let( + :I, + VitableConnect::Models::MemberRetrieveResponse::Data::Suffix::TaggedSymbol + ) + II = + T.let( + :II, + VitableConnect::Models::MemberRetrieveResponse::Data::Suffix::TaggedSymbol + ) + III = + T.let( + :III, + VitableConnect::Models::MemberRetrieveResponse::Data::Suffix::TaggedSymbol + ) + IV = + T.let( + :IV, + VitableConnect::Models::MemberRetrieveResponse::Data::Suffix::TaggedSymbol + ) + V = + T.let( + :V, + VitableConnect::Models::MemberRetrieveResponse::Data::Suffix::TaggedSymbol + ) + + sig do + override.returns( + T::Array[ + VitableConnect::Models::MemberRetrieveResponse::Data::Suffix::TaggedSymbol + ] + ) + end + def self.values + end + end + end + end + end +end diff --git a/rbi/vitable_connect/models/organization_create_params.rbi b/rbi/vitable_connect/models/organization_create_params.rbi new file mode 100644 index 0000000..c830d9d --- /dev/null +++ b/rbi/vitable_connect/models/organization_create_params.rbi @@ -0,0 +1,127 @@ +# typed: strong + +module VitableConnect + module Models + class OrganizationCreateParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + OrHash = + T.type_alias do + T.any( + VitableConnect::OrganizationCreateParams, + VitableConnect::Internal::AnyHash + ) + end + + sig { returns(String) } + attr_accessor :name + + # - `BROKERAGE` - BROKERAGE + # - `TPA` - TPA + # - `GENERAL_AGENT` - GENERAL_AGENT + # - `CHANNEL_PARTNER` - CHANNEL_PARTNER + # - `CONSULTING_FIRM` - CONSULTING_FIRM + # - `API_PLATFORM` - API_PLATFORM + sig do + returns( + T.nilable(VitableConnect::OrganizationCreateParams::Type::OrSymbol) + ) + end + attr_accessor :type + + sig do + params( + name: String, + type: + T.nilable(VitableConnect::OrganizationCreateParams::Type::OrSymbol), + request_options: VitableConnect::RequestOptions::OrHash + ).returns(T.attached_class) + end + def self.new( + name:, + # - `BROKERAGE` - BROKERAGE + # - `TPA` - TPA + # - `GENERAL_AGENT` - GENERAL_AGENT + # - `CHANNEL_PARTNER` - CHANNEL_PARTNER + # - `CONSULTING_FIRM` - CONSULTING_FIRM + # - `API_PLATFORM` - API_PLATFORM + type: nil, + request_options: {} + ) + end + + sig do + override.returns( + { + name: String, + type: + T.nilable( + VitableConnect::OrganizationCreateParams::Type::OrSymbol + ), + request_options: VitableConnect::RequestOptions + } + ) + end + def to_hash + end + + # - `BROKERAGE` - BROKERAGE + # - `TPA` - TPA + # - `GENERAL_AGENT` - GENERAL_AGENT + # - `CHANNEL_PARTNER` - CHANNEL_PARTNER + # - `CONSULTING_FIRM` - CONSULTING_FIRM + # - `API_PLATFORM` - API_PLATFORM + module Type + extend VitableConnect::Internal::Type::Enum + + TaggedSymbol = + T.type_alias do + T.all(Symbol, VitableConnect::OrganizationCreateParams::Type) + end + OrSymbol = T.type_alias { T.any(Symbol, String) } + + BROKERAGE = + T.let( + :BROKERAGE, + VitableConnect::OrganizationCreateParams::Type::TaggedSymbol + ) + TPA = + T.let( + :TPA, + VitableConnect::OrganizationCreateParams::Type::TaggedSymbol + ) + GENERAL_AGENT = + T.let( + :GENERAL_AGENT, + VitableConnect::OrganizationCreateParams::Type::TaggedSymbol + ) + CHANNEL_PARTNER = + T.let( + :CHANNEL_PARTNER, + VitableConnect::OrganizationCreateParams::Type::TaggedSymbol + ) + CONSULTING_FIRM = + T.let( + :CONSULTING_FIRM, + VitableConnect::OrganizationCreateParams::Type::TaggedSymbol + ) + API_PLATFORM = + T.let( + :API_PLATFORM, + VitableConnect::OrganizationCreateParams::Type::TaggedSymbol + ) + + sig do + override.returns( + T::Array[ + VitableConnect::OrganizationCreateParams::Type::TaggedSymbol + ] + ) + end + def self.values + end + end + end + end +end diff --git a/rbi/vitable_connect/models/organization_create_response.rbi b/rbi/vitable_connect/models/organization_create_response.rbi new file mode 100644 index 0000000..3596d57 --- /dev/null +++ b/rbi/vitable_connect/models/organization_create_response.rbi @@ -0,0 +1,212 @@ +# typed: strong + +module VitableConnect + module Models + class OrganizationCreateResponse < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::OrganizationCreateResponse, + VitableConnect::Internal::AnyHash + ) + end + + # Prefixed organization identifier (`org_`). + sig { returns(String) } + attr_accessor :id + + # IdP-issued tenant id (WorkOS org id). + sig { returns(T.nilable(String)) } + attr_accessor :idp_org_id + + # - `workos` - WorkOS + # - `vitable` - Vitable + sig do + returns( + T.nilable( + VitableConnect::Models::OrganizationCreateResponse::IdpProvider::TaggedSymbol + ) + ) + end + attr_accessor :idp_provider + + # Human-readable organization name. + sig { returns(String) } + attr_accessor :name + + # Whether this organization reads across every organization. + sig { returns(T::Boolean) } + attr_accessor :super_in + + # - `BROKERAGE` - Brokerage + # - `TPA` - TPA + # - `GENERAL_AGENT` - General Agent + # - `CHANNEL_PARTNER` - Channel Partner + # - `CONSULTING_FIRM` - Consulting Firm + # - `API_PLATFORM` - API Platform + sig do + returns( + T.nilable( + VitableConnect::Models::OrganizationCreateResponse::Type::TaggedSymbol + ) + ) + end + attr_accessor :type + + sig do + params( + id: String, + idp_org_id: T.nilable(String), + idp_provider: + T.nilable( + VitableConnect::Models::OrganizationCreateResponse::IdpProvider::OrSymbol + ), + name: String, + super_in: T::Boolean, + type: + T.nilable( + VitableConnect::Models::OrganizationCreateResponse::Type::OrSymbol + ) + ).returns(T.attached_class) + end + def self.new( + # Prefixed organization identifier (`org_`). + id:, + # IdP-issued tenant id (WorkOS org id). + idp_org_id:, + # - `workos` - WorkOS + # - `vitable` - Vitable + idp_provider:, + # Human-readable organization name. + name:, + # Whether this organization reads across every organization. + super_in:, + # - `BROKERAGE` - Brokerage + # - `TPA` - TPA + # - `GENERAL_AGENT` - General Agent + # - `CHANNEL_PARTNER` - Channel Partner + # - `CONSULTING_FIRM` - Consulting Firm + # - `API_PLATFORM` - API Platform + type: + ) + end + + sig do + override.returns( + { + id: String, + idp_org_id: T.nilable(String), + idp_provider: + T.nilable( + VitableConnect::Models::OrganizationCreateResponse::IdpProvider::TaggedSymbol + ), + name: String, + super_in: T::Boolean, + type: + T.nilable( + VitableConnect::Models::OrganizationCreateResponse::Type::TaggedSymbol + ) + } + ) + end + def to_hash + end + + # - `workos` - WorkOS + # - `vitable` - Vitable + module IdpProvider + extend VitableConnect::Internal::Type::Enum + + TaggedSymbol = + T.type_alias do + T.all( + Symbol, + VitableConnect::Models::OrganizationCreateResponse::IdpProvider + ) + end + OrSymbol = T.type_alias { T.any(Symbol, String) } + + WORKOS = + T.let( + :workos, + VitableConnect::Models::OrganizationCreateResponse::IdpProvider::TaggedSymbol + ) + VITABLE = + T.let( + :vitable, + VitableConnect::Models::OrganizationCreateResponse::IdpProvider::TaggedSymbol + ) + + sig do + override.returns( + T::Array[ + VitableConnect::Models::OrganizationCreateResponse::IdpProvider::TaggedSymbol + ] + ) + end + def self.values + end + end + + # - `BROKERAGE` - Brokerage + # - `TPA` - TPA + # - `GENERAL_AGENT` - General Agent + # - `CHANNEL_PARTNER` - Channel Partner + # - `CONSULTING_FIRM` - Consulting Firm + # - `API_PLATFORM` - API Platform + module Type + extend VitableConnect::Internal::Type::Enum + + TaggedSymbol = + T.type_alias do + T.all( + Symbol, + VitableConnect::Models::OrganizationCreateResponse::Type + ) + end + OrSymbol = T.type_alias { T.any(Symbol, String) } + + BROKERAGE = + T.let( + :BROKERAGE, + VitableConnect::Models::OrganizationCreateResponse::Type::TaggedSymbol + ) + TPA = + T.let( + :TPA, + VitableConnect::Models::OrganizationCreateResponse::Type::TaggedSymbol + ) + GENERAL_AGENT = + T.let( + :GENERAL_AGENT, + VitableConnect::Models::OrganizationCreateResponse::Type::TaggedSymbol + ) + CHANNEL_PARTNER = + T.let( + :CHANNEL_PARTNER, + VitableConnect::Models::OrganizationCreateResponse::Type::TaggedSymbol + ) + CONSULTING_FIRM = + T.let( + :CONSULTING_FIRM, + VitableConnect::Models::OrganizationCreateResponse::Type::TaggedSymbol + ) + API_PLATFORM = + T.let( + :API_PLATFORM, + VitableConnect::Models::OrganizationCreateResponse::Type::TaggedSymbol + ) + + sig do + override.returns( + T::Array[ + VitableConnect::Models::OrganizationCreateResponse::Type::TaggedSymbol + ] + ) + end + def self.values + end + end + end + end +end diff --git a/rbi/vitable_connect/models/organization_list_params.rbi b/rbi/vitable_connect/models/organization_list_params.rbi new file mode 100644 index 0000000..0d87204 --- /dev/null +++ b/rbi/vitable_connect/models/organization_list_params.rbi @@ -0,0 +1,32 @@ +# typed: strong + +module VitableConnect + module Models + class OrganizationListParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + OrHash = + T.type_alias do + T.any( + VitableConnect::OrganizationListParams, + VitableConnect::Internal::AnyHash + ) + end + + sig do + params(request_options: VitableConnect::RequestOptions::OrHash).returns( + T.attached_class + ) + end + def self.new(request_options: {}) + end + + sig do + override.returns({ request_options: VitableConnect::RequestOptions }) + end + def to_hash + end + end + end +end diff --git a/rbi/vitable_connect/models/organization_list_response.rbi b/rbi/vitable_connect/models/organization_list_response.rbi new file mode 100644 index 0000000..ee0afe5 --- /dev/null +++ b/rbi/vitable_connect/models/organization_list_response.rbi @@ -0,0 +1,266 @@ +# typed: strong + +module VitableConnect + module Models + class OrganizationListResponse < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::OrganizationListResponse, + VitableConnect::Internal::AnyHash + ) + end + + sig do + returns( + T::Array[ + VitableConnect::Models::OrganizationListResponse::Organization + ] + ) + end + attr_accessor :organizations + + # Total number of organizations the caller belongs to. + sig { returns(Integer) } + attr_accessor :total + + # Envelope for the caller's organization memberships (paginated). + sig do + params( + organizations: + T::Array[ + VitableConnect::Models::OrganizationListResponse::Organization::OrHash + ], + total: Integer + ).returns(T.attached_class) + end + def self.new( + organizations:, + # Total number of organizations the caller belongs to. + total: + ) + end + + sig do + override.returns( + { + organizations: + T::Array[ + VitableConnect::Models::OrganizationListResponse::Organization + ], + total: Integer + } + ) + end + def to_hash + end + + class Organization < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::OrganizationListResponse::Organization, + VitableConnect::Internal::AnyHash + ) + end + + # Prefixed organization identifier (`org_`). + sig { returns(String) } + attr_accessor :id + + # IdP-issued tenant id (WorkOS org id). + sig { returns(T.nilable(String)) } + attr_accessor :idp_org_id + + # - `workos` - WorkOS + # - `vitable` - Vitable + sig do + returns( + T.nilable( + VitableConnect::Models::OrganizationListResponse::Organization::IdpProvider::TaggedSymbol + ) + ) + end + attr_accessor :idp_provider + + # Human-readable organization name. + sig { returns(String) } + attr_accessor :name + + # Whether this organization reads across every organization. + sig { returns(T::Boolean) } + attr_accessor :super_in + + # - `BROKERAGE` - Brokerage + # - `TPA` - TPA + # - `GENERAL_AGENT` - General Agent + # - `CHANNEL_PARTNER` - Channel Partner + # - `CONSULTING_FIRM` - Consulting Firm + # - `API_PLATFORM` - API Platform + sig do + returns( + T.nilable( + VitableConnect::Models::OrganizationListResponse::Organization::Type::TaggedSymbol + ) + ) + end + attr_accessor :type + + sig do + params( + id: String, + idp_org_id: T.nilable(String), + idp_provider: + T.nilable( + VitableConnect::Models::OrganizationListResponse::Organization::IdpProvider::OrSymbol + ), + name: String, + super_in: T::Boolean, + type: + T.nilable( + VitableConnect::Models::OrganizationListResponse::Organization::Type::OrSymbol + ) + ).returns(T.attached_class) + end + def self.new( + # Prefixed organization identifier (`org_`). + id:, + # IdP-issued tenant id (WorkOS org id). + idp_org_id:, + # - `workos` - WorkOS + # - `vitable` - Vitable + idp_provider:, + # Human-readable organization name. + name:, + # Whether this organization reads across every organization. + super_in:, + # - `BROKERAGE` - Brokerage + # - `TPA` - TPA + # - `GENERAL_AGENT` - General Agent + # - `CHANNEL_PARTNER` - Channel Partner + # - `CONSULTING_FIRM` - Consulting Firm + # - `API_PLATFORM` - API Platform + type: + ) + end + + sig do + override.returns( + { + id: String, + idp_org_id: T.nilable(String), + idp_provider: + T.nilable( + VitableConnect::Models::OrganizationListResponse::Organization::IdpProvider::TaggedSymbol + ), + name: String, + super_in: T::Boolean, + type: + T.nilable( + VitableConnect::Models::OrganizationListResponse::Organization::Type::TaggedSymbol + ) + } + ) + end + def to_hash + end + + # - `workos` - WorkOS + # - `vitable` - Vitable + module IdpProvider + extend VitableConnect::Internal::Type::Enum + + TaggedSymbol = + T.type_alias do + T.all( + Symbol, + VitableConnect::Models::OrganizationListResponse::Organization::IdpProvider + ) + end + OrSymbol = T.type_alias { T.any(Symbol, String) } + + WORKOS = + T.let( + :workos, + VitableConnect::Models::OrganizationListResponse::Organization::IdpProvider::TaggedSymbol + ) + VITABLE = + T.let( + :vitable, + VitableConnect::Models::OrganizationListResponse::Organization::IdpProvider::TaggedSymbol + ) + + sig do + override.returns( + T::Array[ + VitableConnect::Models::OrganizationListResponse::Organization::IdpProvider::TaggedSymbol + ] + ) + end + def self.values + end + end + + # - `BROKERAGE` - Brokerage + # - `TPA` - TPA + # - `GENERAL_AGENT` - General Agent + # - `CHANNEL_PARTNER` - Channel Partner + # - `CONSULTING_FIRM` - Consulting Firm + # - `API_PLATFORM` - API Platform + module Type + extend VitableConnect::Internal::Type::Enum + + TaggedSymbol = + T.type_alias do + T.all( + Symbol, + VitableConnect::Models::OrganizationListResponse::Organization::Type + ) + end + OrSymbol = T.type_alias { T.any(Symbol, String) } + + BROKERAGE = + T.let( + :BROKERAGE, + VitableConnect::Models::OrganizationListResponse::Organization::Type::TaggedSymbol + ) + TPA = + T.let( + :TPA, + VitableConnect::Models::OrganizationListResponse::Organization::Type::TaggedSymbol + ) + GENERAL_AGENT = + T.let( + :GENERAL_AGENT, + VitableConnect::Models::OrganizationListResponse::Organization::Type::TaggedSymbol + ) + CHANNEL_PARTNER = + T.let( + :CHANNEL_PARTNER, + VitableConnect::Models::OrganizationListResponse::Organization::Type::TaggedSymbol + ) + CONSULTING_FIRM = + T.let( + :CONSULTING_FIRM, + VitableConnect::Models::OrganizationListResponse::Organization::Type::TaggedSymbol + ) + API_PLATFORM = + T.let( + :API_PLATFORM, + VitableConnect::Models::OrganizationListResponse::Organization::Type::TaggedSymbol + ) + + sig do + override.returns( + T::Array[ + VitableConnect::Models::OrganizationListResponse::Organization::Type::TaggedSymbol + ] + ) + end + def self.values + end + end + end + end + end +end diff --git a/rbi/vitable_connect/models/pagination.rbi b/rbi/vitable_connect/models/pagination.rbi new file mode 100644 index 0000000..d584d19 --- /dev/null +++ b/rbi/vitable_connect/models/pagination.rbi @@ -0,0 +1,62 @@ +# typed: strong + +module VitableConnect + module Models + class Pagination < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any(VitableConnect::Pagination, VitableConnect::Internal::AnyHash) + end + + # Items per page + sig { returns(Integer) } + attr_accessor :limit + + # Current page number + sig { returns(Integer) } + attr_accessor :page + + # Total number of items + sig { returns(Integer) } + attr_accessor :total + + # Total number of pages + sig { returns(Integer) } + attr_accessor :total_pages + + # Pagination metadata for list responses. + sig do + params( + limit: Integer, + page: Integer, + total: Integer, + total_pages: Integer + ).returns(T.attached_class) + end + def self.new( + # Items per page + limit:, + # Current page number + page:, + # Total number of items + total:, + # Total number of pages + total_pages: + ) + end + + sig do + override.returns( + { + limit: Integer, + page: Integer, + total: Integer, + total_pages: Integer + } + ) + end + def to_hash + end + end + end +end diff --git a/rbi/vitable_connect/models/plan_list_params.rbi b/rbi/vitable_connect/models/plan_list_params.rbi new file mode 100644 index 0000000..53d4791 --- /dev/null +++ b/rbi/vitable_connect/models/plan_list_params.rbi @@ -0,0 +1,60 @@ +# typed: strong + +module VitableConnect + module Models + class PlanListParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + OrHash = + T.type_alias do + T.any( + VitableConnect::PlanListParams, + VitableConnect::Internal::AnyHash + ) + end + + # Items per page (default: 20, max: 100) + sig { returns(T.nilable(Integer)) } + attr_reader :limit + + sig { params(limit: Integer).void } + attr_writer :limit + + # Page number (default: 1) + sig { returns(T.nilable(Integer)) } + attr_reader :page + + sig { params(page: Integer).void } + attr_writer :page + + sig do + params( + limit: Integer, + page: Integer, + request_options: VitableConnect::RequestOptions::OrHash + ).returns(T.attached_class) + end + def self.new( + # Items per page (default: 20, max: 100) + limit: nil, + # Page number (default: 1) + page: nil, + request_options: {} + ) + end + + sig do + override.returns( + { + limit: Integer, + page: Integer, + request_options: VitableConnect::RequestOptions + } + ) + end + def to_hash + end + end + end +end diff --git a/rbi/vitable_connect/models/plan_list_response.rbi b/rbi/vitable_connect/models/plan_list_response.rbi new file mode 100644 index 0000000..bc58fa7 --- /dev/null +++ b/rbi/vitable_connect/models/plan_list_response.rbi @@ -0,0 +1,29 @@ +# typed: strong + +module VitableConnect + module Models + class PlanListResponse < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::PlanListResponse, + VitableConnect::Internal::AnyHash + ) + end + + sig { returns(String) } + attr_accessor :id + + sig { returns(String) } + attr_accessor :name + + sig { params(id: String, name: String).returns(T.attached_class) } + def self.new(id:, name:) + end + + sig { override.returns({ id: String, name: String }) } + def to_hash + end + end + end +end diff --git a/rbi/vitable_connect/models/webhook_event.rbi b/rbi/vitable_connect/models/webhook_event.rbi new file mode 100644 index 0000000..a62b38e --- /dev/null +++ b/rbi/vitable_connect/models/webhook_event.rbi @@ -0,0 +1,81 @@ +# typed: strong + +module VitableConnect + module Models + class WebhookEvent < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any(VitableConnect::WebhookEvent, VitableConnect::Internal::AnyHash) + end + + # Prefixed unique identifier for this webhook event (e.g., `wevt_...`). + sig { returns(String) } + attr_accessor :id + + # When the event occurred, in UTC. + sig { returns(Time) } + attr_accessor :created_at + + # The event type, formatted as `{resource}.{action}` (e.g., + # `enrollment.accepted`). + sig { returns(String) } + attr_accessor :event_name + + # The organization this event belongs to. + sig { returns(String) } + attr_accessor :organization_id + + # Prefixed ID of the affected resource. Use this to fetch the current state from + # the API. + sig { returns(String) } + attr_accessor :resource_id + + # The type of resource affected (e.g., `enrollment`, `employee`). + sig { returns(String) } + attr_accessor :resource_type + + sig do + params( + id: String, + created_at: Time, + event_name: String, + organization_id: String, + resource_id: String, + resource_type: String + ).returns(T.attached_class) + end + def self.new( + # Prefixed unique identifier for this webhook event (e.g., `wevt_...`). + id:, + # When the event occurred, in UTC. + created_at:, + # The event type, formatted as `{resource}.{action}` (e.g., + # `enrollment.accepted`). + event_name:, + # The organization this event belongs to. + organization_id:, + # Prefixed ID of the affected resource. Use this to fetch the current state from + # the API. + resource_id:, + # The type of resource affected (e.g., `enrollment`, `employee`). + resource_type: + ) + end + + sig do + override.returns( + { + id: String, + created_at: Time, + event_name: String, + organization_id: String, + resource_id: String, + resource_type: String + } + ) + end + def to_hash + end + end + end +end diff --git a/rbi/vitable_connect/models/webhook_event_list_deliveries_params.rbi b/rbi/vitable_connect/models/webhook_event_list_deliveries_params.rbi new file mode 100644 index 0000000..b91ff21 --- /dev/null +++ b/rbi/vitable_connect/models/webhook_event_list_deliveries_params.rbi @@ -0,0 +1,38 @@ +# typed: strong + +module VitableConnect + module Models + class WebhookEventListDeliveriesParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + OrHash = + T.type_alias do + T.any( + VitableConnect::WebhookEventListDeliveriesParams, + VitableConnect::Internal::AnyHash + ) + end + + sig { returns(String) } + attr_accessor :event_id + + sig do + params( + event_id: String, + request_options: VitableConnect::RequestOptions::OrHash + ).returns(T.attached_class) + end + def self.new(event_id:, request_options: {}) + end + + sig do + override.returns( + { event_id: String, request_options: VitableConnect::RequestOptions } + ) + end + def to_hash + end + end + end +end diff --git a/rbi/vitable_connect/models/webhook_event_list_deliveries_response.rbi b/rbi/vitable_connect/models/webhook_event_list_deliveries_response.rbi new file mode 100644 index 0000000..7147e6b --- /dev/null +++ b/rbi/vitable_connect/models/webhook_event_list_deliveries_response.rbi @@ -0,0 +1,147 @@ +# typed: strong + +module VitableConnect + module Models + class WebhookEventListDeliveriesResponse < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::WebhookEventListDeliveriesResponse, + VitableConnect::Internal::AnyHash + ) + end + + sig do + returns( + T::Array[ + VitableConnect::Models::WebhookEventListDeliveriesResponse::Data + ] + ) + end + attr_accessor :data + + sig do + params( + data: + T::Array[ + VitableConnect::Models::WebhookEventListDeliveriesResponse::Data::OrHash + ] + ).returns(T.attached_class) + end + def self.new(data:) + end + + sig do + override.returns( + { + data: + T::Array[ + VitableConnect::Models::WebhookEventListDeliveriesResponse::Data + ] + } + ) + end + def to_hash + end + + class Data < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::WebhookEventListDeliveriesResponse::Data, + VitableConnect::Internal::AnyHash + ) + end + + # Prefixed unique identifier for this delivery (e.g., `wdlv_...`). + sig { returns(String) } + attr_accessor :id + + # When this delivery record was created, in UTC. + sig { returns(Time) } + attr_accessor :created_at + + # When the delivery was successfully received, in UTC. + sig { returns(T.nilable(Time)) } + attr_accessor :delivered_at + + # When the delivery was marked as permanently failed, in UTC. + sig { returns(T.nilable(Time)) } + attr_accessor :failed_at + + # Reason for failure, if applicable. + sig { returns(String) } + attr_accessor :failure_reason + + # When the delivery attempt started, in UTC. + sig { returns(T.nilable(Time)) } + attr_accessor :started_at + + # Current delivery status: Pending, In Progress, Delivered, or Failed. + sig { returns(String) } + attr_accessor :status + + # The webhook subscription this delivery was sent to. + sig { returns(String) } + attr_accessor :subscription_id + + # The webhook event this delivery belongs to. + sig { returns(String) } + attr_accessor :webhook_event_id + + sig do + params( + id: String, + created_at: Time, + delivered_at: T.nilable(Time), + failed_at: T.nilable(Time), + failure_reason: String, + started_at: T.nilable(Time), + status: String, + subscription_id: String, + webhook_event_id: String + ).returns(T.attached_class) + end + def self.new( + # Prefixed unique identifier for this delivery (e.g., `wdlv_...`). + id:, + # When this delivery record was created, in UTC. + created_at:, + # When the delivery was successfully received, in UTC. + delivered_at:, + # When the delivery was marked as permanently failed, in UTC. + failed_at:, + # Reason for failure, if applicable. + failure_reason:, + # When the delivery attempt started, in UTC. + started_at:, + # Current delivery status: Pending, In Progress, Delivered, or Failed. + status:, + # The webhook subscription this delivery was sent to. + subscription_id:, + # The webhook event this delivery belongs to. + webhook_event_id: + ) + end + + sig do + override.returns( + { + id: String, + created_at: Time, + delivered_at: T.nilable(Time), + failed_at: T.nilable(Time), + failure_reason: String, + started_at: T.nilable(Time), + status: String, + subscription_id: String, + webhook_event_id: String + } + ) + end + def to_hash + end + end + end + end +end diff --git a/rbi/vitable_connect/models/webhook_event_list_params.rbi b/rbi/vitable_connect/models/webhook_event_list_params.rbi new file mode 100644 index 0000000..ca2f45b --- /dev/null +++ b/rbi/vitable_connect/models/webhook_event_list_params.rbi @@ -0,0 +1,307 @@ +# typed: strong + +module VitableConnect + module Models + class WebhookEventListParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + OrHash = + T.type_alias do + T.any( + VitableConnect::WebhookEventListParams, + VitableConnect::Internal::AnyHash + ) + end + + sig { returns(T.nilable(Time)) } + attr_reader :created_after + + sig { params(created_after: Time).void } + attr_writer :created_after + + sig { returns(T.nilable(Time)) } + attr_reader :created_before + + sig { params(created_before: Time).void } + attr_writer :created_before + + # - `enrollment.accepted` - Enrollment Accepted + # - `enrollment.terminated` - Enrollment Terminated + # - `enrollment.termination_rescheduled` - Enrollment Termination Rescheduled + # - `enrollment.elected` - Enrollment Elected + # - `enrollment.granted` - Enrollment Granted + # - `enrollment.waived` - Enrollment Waived + # - `enrollment.started` - Enrollment Started + # - `employee.eligibility_granted` - Employee Eligibility Granted + # - `employee.eligibility_terminated` - Employee Eligibility Terminated + # - `employee.deactivated` - Employee Deactivated + # - `employee.deduction_created` - Employee Deduction Created + sig do + returns( + T.nilable(VitableConnect::WebhookEventListParams::EventName::OrSymbol) + ) + end + attr_reader :event_name + + sig do + params( + event_name: + VitableConnect::WebhookEventListParams::EventName::OrSymbol + ).void + end + attr_writer :event_name + + # Items per page (default: 20, max: 100) + sig { returns(T.nilable(Integer)) } + attr_reader :limit + + sig { params(limit: Integer).void } + attr_writer :limit + + # Page number (default: 1) + sig { returns(T.nilable(Integer)) } + attr_reader :page + + sig { params(page: Integer).void } + attr_writer :page + + sig { returns(T.nilable(String)) } + attr_reader :resource_id + + sig { params(resource_id: String).void } + attr_writer :resource_id + + # - `enrollment` - Enrollment + # - `employee` - Employee + # - `employer` - Employer + # - `dependent` - Dependent + # - `plan_year` - Plan Year + # - `payroll_deduction` - Payroll Deduction + sig do + returns( + T.nilable( + VitableConnect::WebhookEventListParams::ResourceType::OrSymbol + ) + ) + end + attr_reader :resource_type + + sig do + params( + resource_type: + VitableConnect::WebhookEventListParams::ResourceType::OrSymbol + ).void + end + attr_writer :resource_type + + sig do + params( + created_after: Time, + created_before: Time, + event_name: + VitableConnect::WebhookEventListParams::EventName::OrSymbol, + limit: Integer, + page: Integer, + resource_id: String, + resource_type: + VitableConnect::WebhookEventListParams::ResourceType::OrSymbol, + request_options: VitableConnect::RequestOptions::OrHash + ).returns(T.attached_class) + end + def self.new( + created_after: nil, + created_before: nil, + # - `enrollment.accepted` - Enrollment Accepted + # - `enrollment.terminated` - Enrollment Terminated + # - `enrollment.termination_rescheduled` - Enrollment Termination Rescheduled + # - `enrollment.elected` - Enrollment Elected + # - `enrollment.granted` - Enrollment Granted + # - `enrollment.waived` - Enrollment Waived + # - `enrollment.started` - Enrollment Started + # - `employee.eligibility_granted` - Employee Eligibility Granted + # - `employee.eligibility_terminated` - Employee Eligibility Terminated + # - `employee.deactivated` - Employee Deactivated + # - `employee.deduction_created` - Employee Deduction Created + event_name: nil, + # Items per page (default: 20, max: 100) + limit: nil, + # Page number (default: 1) + page: nil, + resource_id: nil, + # - `enrollment` - Enrollment + # - `employee` - Employee + # - `employer` - Employer + # - `dependent` - Dependent + # - `plan_year` - Plan Year + # - `payroll_deduction` - Payroll Deduction + resource_type: nil, + request_options: {} + ) + end + + sig do + override.returns( + { + created_after: Time, + created_before: Time, + event_name: + VitableConnect::WebhookEventListParams::EventName::OrSymbol, + limit: Integer, + page: Integer, + resource_id: String, + resource_type: + VitableConnect::WebhookEventListParams::ResourceType::OrSymbol, + request_options: VitableConnect::RequestOptions + } + ) + end + def to_hash + end + + # - `enrollment.accepted` - Enrollment Accepted + # - `enrollment.terminated` - Enrollment Terminated + # - `enrollment.termination_rescheduled` - Enrollment Termination Rescheduled + # - `enrollment.elected` - Enrollment Elected + # - `enrollment.granted` - Enrollment Granted + # - `enrollment.waived` - Enrollment Waived + # - `enrollment.started` - Enrollment Started + # - `employee.eligibility_granted` - Employee Eligibility Granted + # - `employee.eligibility_terminated` - Employee Eligibility Terminated + # - `employee.deactivated` - Employee Deactivated + # - `employee.deduction_created` - Employee Deduction Created + module EventName + extend VitableConnect::Internal::Type::Enum + + TaggedSymbol = + T.type_alias do + T.all(Symbol, VitableConnect::WebhookEventListParams::EventName) + end + OrSymbol = T.type_alias { T.any(Symbol, String) } + + ENROLLMENT_ACCEPTED = + T.let( + :"enrollment.accepted", + VitableConnect::WebhookEventListParams::EventName::TaggedSymbol + ) + ENROLLMENT_TERMINATED = + T.let( + :"enrollment.terminated", + VitableConnect::WebhookEventListParams::EventName::TaggedSymbol + ) + ENROLLMENT_TERMINATION_RESCHEDULED = + T.let( + :"enrollment.termination_rescheduled", + VitableConnect::WebhookEventListParams::EventName::TaggedSymbol + ) + ENROLLMENT_ELECTED = + T.let( + :"enrollment.elected", + VitableConnect::WebhookEventListParams::EventName::TaggedSymbol + ) + ENROLLMENT_GRANTED = + T.let( + :"enrollment.granted", + VitableConnect::WebhookEventListParams::EventName::TaggedSymbol + ) + ENROLLMENT_WAIVED = + T.let( + :"enrollment.waived", + VitableConnect::WebhookEventListParams::EventName::TaggedSymbol + ) + ENROLLMENT_STARTED = + T.let( + :"enrollment.started", + VitableConnect::WebhookEventListParams::EventName::TaggedSymbol + ) + EMPLOYEE_ELIGIBILITY_GRANTED = + T.let( + :"employee.eligibility_granted", + VitableConnect::WebhookEventListParams::EventName::TaggedSymbol + ) + EMPLOYEE_ELIGIBILITY_TERMINATED = + T.let( + :"employee.eligibility_terminated", + VitableConnect::WebhookEventListParams::EventName::TaggedSymbol + ) + EMPLOYEE_DEACTIVATED = + T.let( + :"employee.deactivated", + VitableConnect::WebhookEventListParams::EventName::TaggedSymbol + ) + EMPLOYEE_DEDUCTION_CREATED = + T.let( + :"employee.deduction_created", + VitableConnect::WebhookEventListParams::EventName::TaggedSymbol + ) + + sig do + override.returns( + T::Array[ + VitableConnect::WebhookEventListParams::EventName::TaggedSymbol + ] + ) + end + def self.values + end + end + + # - `enrollment` - Enrollment + # - `employee` - Employee + # - `employer` - Employer + # - `dependent` - Dependent + # - `plan_year` - Plan Year + # - `payroll_deduction` - Payroll Deduction + module ResourceType + extend VitableConnect::Internal::Type::Enum + + TaggedSymbol = + T.type_alias do + T.all(Symbol, VitableConnect::WebhookEventListParams::ResourceType) + end + OrSymbol = T.type_alias { T.any(Symbol, String) } + + ENROLLMENT = + T.let( + :enrollment, + VitableConnect::WebhookEventListParams::ResourceType::TaggedSymbol + ) + EMPLOYEE = + T.let( + :employee, + VitableConnect::WebhookEventListParams::ResourceType::TaggedSymbol + ) + EMPLOYER = + T.let( + :employer, + VitableConnect::WebhookEventListParams::ResourceType::TaggedSymbol + ) + DEPENDENT = + T.let( + :dependent, + VitableConnect::WebhookEventListParams::ResourceType::TaggedSymbol + ) + PLAN_YEAR = + T.let( + :plan_year, + VitableConnect::WebhookEventListParams::ResourceType::TaggedSymbol + ) + PAYROLL_DEDUCTION = + T.let( + :payroll_deduction, + VitableConnect::WebhookEventListParams::ResourceType::TaggedSymbol + ) + + sig do + override.returns( + T::Array[ + VitableConnect::WebhookEventListParams::ResourceType::TaggedSymbol + ] + ) + end + def self.values + end + end + end + end +end diff --git a/rbi/vitable_connect/models/webhook_event_retrieve_params.rbi b/rbi/vitable_connect/models/webhook_event_retrieve_params.rbi new file mode 100644 index 0000000..6d1d770 --- /dev/null +++ b/rbi/vitable_connect/models/webhook_event_retrieve_params.rbi @@ -0,0 +1,38 @@ +# typed: strong + +module VitableConnect + module Models + class WebhookEventRetrieveParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + OrHash = + T.type_alias do + T.any( + VitableConnect::WebhookEventRetrieveParams, + VitableConnect::Internal::AnyHash + ) + end + + sig { returns(String) } + attr_accessor :event_id + + sig do + params( + event_id: String, + request_options: VitableConnect::RequestOptions::OrHash + ).returns(T.attached_class) + end + def self.new(event_id:, request_options: {}) + end + + sig do + override.returns( + { event_id: String, request_options: VitableConnect::RequestOptions } + ) + end + def to_hash + end + end + end +end diff --git a/rbi/vitable_connect/models/webhook_event_retrieve_response.rbi b/rbi/vitable_connect/models/webhook_event_retrieve_response.rbi new file mode 100644 index 0000000..c82c72a --- /dev/null +++ b/rbi/vitable_connect/models/webhook_event_retrieve_response.rbi @@ -0,0 +1,34 @@ +# typed: strong + +module VitableConnect + module Models + class WebhookEventRetrieveResponse < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + VitableConnect::Models::WebhookEventRetrieveResponse, + VitableConnect::Internal::AnyHash + ) + end + + sig { returns(VitableConnect::WebhookEvent) } + attr_reader :data + + sig { params(data: VitableConnect::WebhookEvent::OrHash).void } + attr_writer :data + + # Response containing a single webhook event resource. + sig do + params(data: VitableConnect::WebhookEvent::OrHash).returns( + T.attached_class + ) + end + def self.new(data:) + end + + sig { override.returns({ data: VitableConnect::WebhookEvent }) } + def to_hash + end + end + end +end diff --git a/rbi/vitable_connect/request_options.rbi b/rbi/vitable_connect/request_options.rbi new file mode 100644 index 0000000..09c27ee --- /dev/null +++ b/rbi/vitable_connect/request_options.rbi @@ -0,0 +1,61 @@ +# typed: strong + +module VitableConnect + # Specify HTTP behaviour to use for a specific request. These options supplement + # or override those provided at the client level. + # + # When making a request, you can pass an actual {RequestOptions} instance, or + # simply pass a Hash with symbol keys matching the attributes on this class. + class RequestOptions < VitableConnect::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any(VitableConnect::RequestOptions, VitableConnect::Internal::AnyHash) + end + + # @api private + sig { params(opts: VitableConnect::RequestOptions::OrHash).void } + def self.validate!(opts) + end + + # Idempotency key to send with request and all associated retries. Will only be + # sent for write requests. + sig { returns(T.nilable(String)) } + attr_accessor :idempotency_key + + # Extra query params to send with the request. These are `.merge`’d into any + # `query` given at the client level. + sig do + returns( + T.nilable(T::Hash[String, T.nilable(T.any(T::Array[String], String))]) + ) + end + attr_accessor :extra_query + + # Extra headers to send with the request. These are `.merged`’d into any + # `extra_headers` given at the client level. + sig { returns(T.nilable(T::Hash[String, T.nilable(String)])) } + attr_accessor :extra_headers + + # Extra data to send with the request. These are deep merged into any data + # generated as part of the normal request. + sig { returns(T.nilable(T.anything)) } + attr_accessor :extra_body + + # Maximum number of retries to attempt after a failed initial request. + sig { returns(T.nilable(Integer)) } + attr_accessor :max_retries + + # Request timeout in seconds. + sig { returns(T.nilable(Float)) } + attr_accessor :timeout + + # Returns a new instance of RequestOptions. + sig do + params(values: VitableConnect::Internal::AnyHash).returns( + T.attached_class + ) + end + def self.new(values = {}) + end + end +end diff --git a/rbi/vitable_connect/resources/auth.rbi b/rbi/vitable_connect/resources/auth.rbi new file mode 100644 index 0000000..2db215e --- /dev/null +++ b/rbi/vitable_connect/resources/auth.rbi @@ -0,0 +1,36 @@ +# typed: strong + +module VitableConnect + module Resources + # Issue short-lived access tokens for scoped API access + class Auth + # Issues a short-lived access token from the authenticated API key. Access tokens + # can optionally be bound to a specific employer or employee for scoped access. + # Tokens expire after 15 minutes. + sig do + params( + grant_type: + VitableConnect::AuthIssueAccessTokenParams::GrantType::OrSymbol, + bound_entity: + T.nilable( + VitableConnect::AuthIssueAccessTokenParams::BoundEntity::OrHash + ), + request_options: VitableConnect::RequestOptions::OrHash + ).returns(VitableConnect::Models::AuthIssueAccessTokenResponse) + end + def issue_access_token( + # - `client_credentials` - client_credentials + grant_type:, + # Optional entity to bind the token to for scoped access + bound_entity: nil, + request_options: {} + ) + end + + # @api private + sig { params(client: VitableConnect::Client).returns(T.attached_class) } + def self.new(client:) + end + end + end +end diff --git a/rbi/vitable_connect/resources/employees.rbi b/rbi/vitable_connect/resources/employees.rbi new file mode 100644 index 0000000..4418ad8 --- /dev/null +++ b/rbi/vitable_connect/resources/employees.rbi @@ -0,0 +1,110 @@ +# typed: strong + +module VitableConnect + module Resources + class Employees + # Retrieves detailed information for a specific employee by ID. Returns employee + # details including personal information, employment status, classification and + # compensation-type effective dates, compensation type, and payroll deductions + # from the most recent statement period. Deductions reflect a snapshot of the + # current period and are replaced when a new statement is generated. + sig do + params( + employee_id: String, + request_options: VitableConnect::RequestOptions::OrHash + ).returns(VitableConnect::Models::EmployeeRetrieveResponse) + end + def retrieve( + # Unique employee identifier (empl\_\*) + employee_id, + request_options: {} + ) + end + + # Updates employee personal, contact, address, and employment fields. This + # endpoint currently supports email, phone, gender, address, employee_class, + # start_date, and compensation_type. effective_date is required and applies to + # employee_class and compensation_type when those fields are included in the + # request. + sig do + params( + employee_id: String, + effective_date: Date, + address: + T.nilable(VitableConnect::EmployeeUpdateParams::Address::OrHash), + compensation_type: + T.nilable( + VitableConnect::EmployeeUpdateParams::CompensationType::OrSymbol + ), + email: T.nilable(String), + employee_class: T.nilable(VitableConnect::EmployeeClass::OrSymbol), + gender: + T.nilable(VitableConnect::EmployeeUpdateParams::Gender::OrSymbol), + phone: T.nilable(String), + start_date: T.nilable(Date), + request_options: VitableConnect::RequestOptions::OrHash + ).returns(VitableConnect::Models::EmployeeUpdateResponse) + end + def update( + # Unique employee identifier (empl\_\*) + employee_id, + # Past or present date applied to each tracked employment field included in this + # request + effective_date:, + # Employee's residential address + address: nil, + # - `Salary` - Salary + # - `Hourly` - Hourly + compensation_type: nil, + # Email address + email: nil, + # - `Full Time` - Full Time + # - `Part Time` - Part Time + # - `Temporary` - Temporary + # - `Intern` - Intern + # - `Seasonal` - Seasonal + # - `Individual Contractor` - Individual Contractor + employee_class: nil, + # - `Male` - Male + # - `Female` - Female + # - `Transgender` - Transgender + # - `Non-binary` - Non Binary + # - `Prefer not to respond` - Prefer Not To Respond + gender: nil, + # Phone number + phone: nil, + # Employment start date + start_date: nil, + request_options: {} + ) + end + + # Retrieves a paginated list of benefit enrollments for an employee. + sig do + params( + employee_id: String, + limit: Integer, + page: Integer, + request_options: VitableConnect::RequestOptions::OrHash + ).returns( + VitableConnect::Internal::PageNumberPage[VitableConnect::Enrollment] + ) + end + def list_enrollments( + # Unique employee identifier (empl\_\*) + employee_id, + # Items per page (default: 20, max: 100) + limit: nil, + # Page number (default: 1) + page: nil, + request_options: {} + ) + end + + # @api private + sig { params(client: VitableConnect::Client).returns(T.attached_class) } + def self.new(client:) + end + end + end +end diff --git a/rbi/vitable_connect/resources/employers.rbi b/rbi/vitable_connect/resources/employers.rbi new file mode 100644 index 0000000..e78e623 --- /dev/null +++ b/rbi/vitable_connect/resources/employers.rbi @@ -0,0 +1,524 @@ +# typed: strong + +module VitableConnect + module Resources + class Employers + # Creates a new employer for the authenticated organization. Requires employer + # name, legal name, EIN, email, and address information. Returns the created + # employer with its assigned ID. + sig do + params( + address: VitableConnect::EmployerCreateParams::Address::OrHash, + ein: String, + email: String, + legal_name: String, + name: String, + phone_number: T.nilable(String), + reference_id: T.nilable(String), + request_options: VitableConnect::RequestOptions::OrHash + ).returns(VitableConnect::EmployerResponse) + end + def create( + # Employer address + address:, + # Employer Identification Number (format: XX-XXXXXXX) + ein:, + # Email address for billing and communications + email:, + # Legal business name + legal_name:, + # Employer display name + name:, + # Employer phone number (10-digit US format, e.g. 5551234567) + phone_number: nil, + # External reference ID for this employer + reference_id: nil, + request_options: {} + ) + end + + # Retrieves detailed information for a specific employer by ID. The employer must + # belong to the authenticated organization. + sig do + params( + employer_id: String, + request_options: VitableConnect::RequestOptions::OrHash + ).returns(VitableConnect::EmployerResponse) + end + def retrieve( + # Unique employer identifier (empr\_\*) + employer_id, + request_options: {} + ) + end + + # Updates an existing employer. All fields are optional — only provided fields are + # updated. PO Box addresses are rejected. + sig do + params( + employer_id: String, + active: T.nilable(T::Boolean), + address: + T.nilable(VitableConnect::EmployerUpdateParams::Address::OrHash), + legal_name: T.nilable(String), + name: T.nilable(String), + request_options: VitableConnect::RequestOptions::OrHash + ).returns(VitableConnect::EmployerResponse) + end + def update( + # Unique employer identifier (empr\_\*) + employer_id, + # Whether the employer is active + active: nil, + # Employer address + address: nil, + # Legal business name + legal_name: nil, + # Employer display name + name: nil, + request_options: {} + ) + end + + # Returns the caller's employer book — every employer with its computed columns + # (enrollment-rate summary, benefit-family tags, HRIS connection, + # benefit-lifecycle stage) merged with the employer's flat CRM fields (legal name, + # EIN, contact, address, timestamps). The book is derived from the authenticated + # principal: one organization's employers, or every organization's for a caller + # whose reach is not a single organization. Supports search by display name, legal + # name, or exact EIN, employer id or contact email, benefit-family/lifecycle/HRIS + # filters, and page/limit pagination. + sig do + params( + benefit_family: + T::Array[ + VitableConnect::EmployerListParams::BenefitFamily::OrSymbol + ], + benefit_lifecycle_stage: + T::Array[ + VitableConnect::EmployerListParams::BenefitLifecycleStage::OrSymbol + ], + hris_provider: T::Array[String], + hris_status: + T::Array[VitableConnect::EmployerListParams::HRISStatus::OrSymbol], + include_cancelled: T::Boolean, + limit: Integer, + page: Integer, + search: T.nilable(String), + request_options: VitableConnect::RequestOptions::OrHash + ).returns( + VitableConnect::Internal::PageNumberPage[ + VitableConnect::Models::EmployerListResponse + ] + ) + end + def list( + # Filter to employers with at least one active benefit in these families. + benefit_family: nil, + # Filter to employers in one of these computed benefit-lifecycle stages. + benefit_lifecycle_stage: nil, + # Filter to employers whose HRIS connection is with one of these payroll providers + # (e.g. `ADP RUN`). Matched case-insensitively; free text, so read the available + # values from the HRIS-providers endpoint rather than assuming a fixed set. + hris_provider: nil, + # Filter to employers whose HRIS connection is in one of these statuses. + hris_status: nil, + # Include cancelled employers (hidden by default unless their stage is explicitly + # requested). + include_cancelled: nil, + # Items per page. + limit: nil, + # Page number. + page: nil, + # Employer filter. Matches the display name or the legal name case-insensitively + # as a substring, or one of these exactly: the EIN (with or without its dash), the + # employer id, or the contact email of one of the employer's non-disabled admins. + search: nil, + request_options: {} + ) + end + + # Provision and return the employer's payroll integration email. + sig do + params( + employer_id: String, + request_options: VitableConnect::RequestOptions::OrHash + ).returns( + VitableConnect::Models::EmployerEnsurePayrollIntegrationEmailResponse + ) + end + def ensure_payroll_integration_email( + # Unique employer identifier (empr\_\*) + employer_id, + request_options: {} + ) + end + + # Returns a paginated list of every member with an enrollment in one of an + # employer's plan years, any election status: what they elected, where their + # coverage stands, dependent count, carrier, plan, tier, and the plan's total + # monthly cost. The caller must be authorized for the employer `empr_<...>`; an + # unknown or unauthorized employer, or an unknown plan year `plyr_<...>`, + # returns 404. + sig do + params( + benefit_plan_year_id: String, + employer_id: String, + election_status: + T::Array[ + VitableConnect::EmployerListBenefitPlanYearEnrollmentsParams::ElectionStatus::OrSymbol + ], + limit: Integer, + page: Integer, + search: String, + request_options: VitableConnect::RequestOptions::OrHash + ).returns( + VitableConnect::Internal::PageNumberPage[ + VitableConnect::Models::EmployerListBenefitPlanYearEnrollmentsResponse + ] + ) + end + def list_benefit_plan_year_enrollments( + # Path param: Unique benefit-plan-year identifier (plyr\_\*). + benefit_plan_year_id, + # Path param: Unique employer identifier (empr\_\*) + employer_id:, + # Query param: Filter by election status. Repeat the parameter to match several. + election_status: nil, + # Query param: Items per page (default: 20, max: 100) + limit: nil, + # Query param: Page number (default: 1) + page: nil, + # Query param: Case-insensitive search. Matches member name partially, and the + # `member_id` exactly — either your own reference id or the prefixed + # `grpmbr_<...>` id. + search: nil, + request_options: {} + ) + end + + # Returns the employer's benefit plan years (all years, or one when `year` is + # given), each with its benefits, offered states, benefit families, and the + # year-level enrollment roll-up. The caller must be authorized for the employer; + # an unknown or unauthorized employer returns 404. + sig do + params( + employer_id: String, + request_options: VitableConnect::RequestOptions::OrHash + ).returns(VitableConnect::Models::EmployerListBenefitPlanYearsResponse) + end + def list_benefit_plan_years( + # Unique employer identifier (empr\_\*) + employer_id, + request_options: {} + ) + end + + # Retrieves a paginated list of employees for a specific employer. The caller must + # be authorized for the employer; an unknown or unauthorized employer returns 404. + # Results are paginated using page and limit parameters and can be narrowed with a + # case-insensitive `search` (first name, last name, or email) and an + # `employment_status` filter (active or terminated). Each employee includes + # payroll deductions from the most recent statement period. When a new deduction + # statement is generated, previous period deductions are replaced. + sig do + params( + employer_id: String, + employment_status: + VitableConnect::EmployerListEmployeesParams::EmploymentStatus::OrSymbol, + limit: Integer, + page: Integer, + search: String, + request_options: VitableConnect::RequestOptions::OrHash + ).returns( + VitableConnect::Internal::PageNumberPage[VitableConnect::Employee] + ) + end + def list_employees( + # Unique employer identifier (empr\_\*) + employer_id, + # Filter by employment status (active or terminated) + employment_status: nil, + # Items per page (default: 20, max: 100) + limit: nil, + # Page number (default: 1) + page: nil, + # Case-insensitive search across employee first name, last name, and email + search: nil, + request_options: {} + ) + end + + # Returns the distinct HRIS/payroll providers across the same book + # `GET /v1/employers` returns, sorted for display. Use these as the values for the + # employers list's `hris_provider` filter — filter on `provider`, show + # `provider_label`. The stored providers are free text, so they cannot be + # enumerated in advance. + sig do + params(request_options: VitableConnect::RequestOptions::OrHash).returns( + VitableConnect::Models::EmployerListHRISProvidersResponse + ) + end + def list_hris_providers(request_options: {}) + end + + # Returns a cursor-paginated page of the employer's billing invoices, newest + # first. Pass the `next_offset` from a previous page as `offset` to fetch the next + # page. The caller must be authorized for the employer; an unknown or unauthorized + # employer returns 404. + sig do + params( + employer_id: String, + limit: Integer, + offset: T.nilable(String), + request_options: VitableConnect::RequestOptions::OrHash + ).returns(VitableConnect::Models::EmployerListInvoicesResponse) + end + def list_invoices( + # Unique employer identifier (empr\_\*) + employer_id, + # Maximum number of invoices per page + limit: nil, + # Opaque cursor from a previous page's next_offset + offset: nil, + request_options: {} + ) + end + + # Returns a paginated list of the employer's payroll-deduction statements, newest + # period first, each with its period, generation date, distinct employee count, + # total deduction, change-file link, and deduction frequency. Statements + # superseded by a later correction are excluded. The caller must be authorized for + # the employer; an unknown or unauthorized employer returns 404. + sig do + params( + employer_id: String, + limit: Integer, + page: Integer, + request_options: VitableConnect::RequestOptions::OrHash + ).returns( + VitableConnect::Internal::PageNumberPage[ + VitableConnect::Models::EmployerListPayrollDeductionStatementsResponse + ] + ) + end + def list_payroll_deduction_statements( + # Unique employer identifier (empr\_\*) + employer_id, + # Maximum number of statements per page + limit: nil, + # Page number to retrieve (starts at 1) + page: nil, + request_options: {} + ) + end + + # Returns one benefit plan year in full — its benefit details plus the per-benefit + # enrollment rate and SPD link — addressed by its `benefit_plan_year_id`. The + # caller must be authorized for the employer; an unknown or unauthorized plan year + # returns 404. + sig do + params( + benefit_plan_year_id: String, + employer_id: String, + request_options: VitableConnect::RequestOptions::OrHash + ).returns( + VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse + ) + end + def retrieve_benefit_plan_year( + # Unique benefit-plan-year identifier (plyr\_\*). + benefit_plan_year_id, + # Unique employer identifier (empr\_\*) + employer_id:, + request_options: {} + ) + end + + # Returns the employer's HRIS connection — provider, status, last sync, and synced + # row count — or null when the employer has no integration. The caller must be + # authorized for the employer; an unknown or unauthorized employer returns 404. + sig do + params( + employer_id: String, + request_options: VitableConnect::RequestOptions::OrHash + ).returns(VitableConnect::Models::EmployerRetrieveHRISResponse) + end + def retrieve_hris( + # Unique employer identifier (empr\_\*) + employer_id, + request_options: {} + ) + end + + # Returns the time-limited PDF download link for a single invoice belonging to the + # employer's billing customer. `invoice_id` is the external Chargebee id (not a + # prefixed UUID). The caller must be authorized for the employer; an unknown or + # unauthorized employer or invoice returns 404. + sig do + params( + invoice_id: String, + employer_id: String, + request_options: VitableConnect::RequestOptions::OrHash + ).returns(VitableConnect::Models::EmployerRetrieveInvoicePdfResponse) + end + def retrieve_invoice_pdf( + # External Chargebee invoice id (not a prefixed UUID). + invoice_id, + # Unique employer identifier (empr\_\*) + employer_id:, + request_options: {} + ) + end + + # Return whether the employer has submitted payroll access setup. + sig do + params( + employer_id: String, + request_options: VitableConnect::RequestOptions::OrHash + ).returns( + VitableConnect::Models::EmployerRetrievePayrollAccessSetupResponse + ) + end + def retrieve_payroll_access_setup( + # Unique employer identifier (empr\_\*) + employer_id, + request_options: {} + ) + end + + # Submits a census sync payload for the specified employer. The employees in the + # payload will be queued for processing. Returns an accepted response with the + # timestamp of acceptance. + sig do + params( + employer_id: String, + employees: + T::Array[ + VitableConnect::EmployerSubmitCensusSyncParams::Employee::OrHash + ], + request_options: VitableConnect::RequestOptions::OrHash + ).returns(VitableConnect::Models::EmployerSubmitCensusSyncResponse) + end + def submit_census_sync( + # Unique employer identifier (empr\_\*) + employer_id, + employees:, + request_options: {} + ) + end + + # Submit the employer's payroll access setup answers. + sig do + params( + employer_id: String, + access_method: + VitableConnect::EmployerSubmitPayrollAccessSetupParams::AccessMethod::OrSymbol, + all_benefit_eligible_employees_present: T::Boolean, + classifications_accurate: T::Boolean, + employees_in_payroll_acknowledged: T::Boolean, + has_additional_payroll_system: T::Boolean, + is_controlled_group: T::Boolean, + payroll_data_impacts_eligibility_acknowledged: T::Boolean, + additional_access_method: + T.nilable( + VitableConnect::EmployerSubmitPayrollAccessSetupParams::AdditionalAccessMethod::OrSymbol + ), + additional_integration_confirmed: T.nilable(T::Boolean), + additional_login_url: T.nilable(String), + additional_password: T.nilable(String), + additional_phone: T.nilable(String), + additional_username: T.nilable(String), + classification_correction_source: + T.nilable( + VitableConnect::EmployerSubmitPayrollAccessSetupParams::ClassificationCorrectionSource::OrSymbol + ), + integration_confirmed: T.nilable(T::Boolean), + login_url: T.nilable(String), + misclassified_employee_names: T::Array[String], + missing_employee_resolution: + T.nilable( + VitableConnect::EmployerSubmitPayrollAccessSetupParams::MissingEmployeeResolution::OrSymbol + ), + password: T.nilable(String), + phone: T.nilable(String), + remaining_employee_action: + T.nilable( + VitableConnect::EmployerSubmitPayrollAccessSetupParams::RemainingEmployeeAction::OrSymbol + ), + same_payroll_covers_other_eins: T.nilable(T::Boolean), + username: T.nilable(String), + request_options: VitableConnect::RequestOptions::OrHash + ).returns( + VitableConnect::Models::EmployerSubmitPayrollAccessSetupResponse + ) + end + def submit_payroll_access_setup( + # Unique employer identifier (empr\_\*) + employer_id, + # - `SELF_SETUP` - SELF_SETUP + # - `NEEDS_HELP` - NEEDS_HELP + access_method:, + all_benefit_eligible_employees_present:, + classifications_accurate:, + employees_in_payroll_acknowledged:, + has_additional_payroll_system:, + is_controlled_group:, + payroll_data_impacts_eligibility_acknowledged:, + # - `SELF_SETUP` - SELF_SETUP + # - `NEEDS_HELP` - NEEDS_HELP + additional_access_method: nil, + additional_integration_confirmed: nil, + additional_login_url: nil, + additional_password: nil, + additional_phone: nil, + additional_username: nil, + # - `ENTER_NAMES` - ENTER_NAMES + # - `EMAIL_LIST` - EMAIL_LIST + classification_correction_source: nil, + integration_confirmed: nil, + login_url: nil, + misclassified_employee_names: nil, + # - `EMAIL_CENSUS` - EMAIL_CENSUS + # - `SECOND_SYSTEM_ACCESS` - SECOND_SYSTEM_ACCESS + missing_employee_resolution: nil, + password: nil, + phone: nil, + # - `VITABLE_UPDATE` - VITABLE_UPDATE + # - `EMPLOYER_UPDATE` - EMPLOYER_UPDATE + remaining_employee_action: nil, + same_payroll_covers_other_eins: nil, + username: nil, + request_options: {} + ) + end + + # Updates configuration settings for a specific employer. The employer must belong + # to the authenticated organization. + sig do + params( + employer_id: String, + pay_frequency: + VitableConnect::EmployerUpdateSettingsParams::PayFrequency::OrSymbol, + request_options: VitableConnect::RequestOptions::OrHash + ).returns(VitableConnect::Models::EmployerUpdateSettingsResponse) + end + def update_settings( + # Unique employer identifier (empr\_\*) + employer_id, + # - `weekly` - Weekly + # - `bi_weekly` - Bi Weekly + # - `semi_monthly` - Semi Monthly + # - `monthly` - Monthly + pay_frequency:, + request_options: {} + ) + end + + # @api private + sig { params(client: VitableConnect::Client).returns(T.attached_class) } + def self.new(client:) + end + end + end +end diff --git a/rbi/vitable_connect/resources/enrollments.rbi b/rbi/vitable_connect/resources/enrollments.rbi new file mode 100644 index 0000000..b30f72f --- /dev/null +++ b/rbi/vitable_connect/resources/enrollments.rbi @@ -0,0 +1,89 @@ +# typed: strong + +module VitableConnect + module Resources + # Manage benefit enrollments and elections for employees + class Enrollments + # Retrieves a single enrollment: the employee and employer it belongs to, the + # benefit product, its status, the coverage period, the employee payroll deduction + # and employer contribution, and the enrolled plan's Summary of Benefits and + # Coverage document when one is on file. An enrollment the caller cannot reach is + # indistinguishable from one that does not exist. + sig do + params( + enrollment_id: String, + request_options: VitableConnect::RequestOptions::OrHash + ).returns(VitableConnect::Models::EnrollmentRetrieveResponse) + end + def retrieve( + # Unique enrollment identifier (enrl\_\*) + enrollment_id, + request_options: {} + ) + end + + # Closes the targeted enrollment and creates a new unanswered enrollment for the + # same member and plan year. VPC never requires a qualifying life event; other + # products require an accepted, member-owned event outside open enrollment. + # User-backed callers must provide a reason; it is optional for organization + # API-key callers. Tenant mismatches return a non-disclosing 404 before the + # request body is validated. + sig do + params( + enrollment_id: String, + qualifying_life_event_id: T.nilable(String), + reason: T.nilable(String), + ticket_number: T.nilable(String), + request_options: VitableConnect::RequestOptions::OrHash + ).returns(VitableConnect::Models::EnrollmentReissueResponse) + end + def reissue( + # Unique enrollment identifier (enrl\_\*) + enrollment_id, + # Accepted member qualifying life event identifier (qle\_\*) + qualifying_life_event_id: nil, + # Audit reason for the reissue; required for user-backed callers and optional for + # long-lived organization API-key callers + reason: nil, + # Optional support or operational ticket number + ticket_number: nil, + request_options: {} + ) + end + + # Terminates enrolled coverage immediately. An accepted qualifying life event + # owned by the enrollment member is required unless the plan is VPC or ICHRA. + # User-backed callers must provide a reason; it is optional for organization + # API-key callers. API keys may act across the caller organization's book. Tenant + # mismatches return the same non-disclosing 404 before the request body is + # validated. + sig do + params( + enrollment_id: String, + qualifying_life_event_id: T.nilable(String), + reason: T.nilable(String), + ticket_number: T.nilable(String), + request_options: VitableConnect::RequestOptions::OrHash + ).void + end + def terminate( + # Unique enrollment identifier (enrl\_\*) + enrollment_id, + # Accepted member qualifying life event identifier (qle\_\*) + qualifying_life_event_id: nil, + # Audit reason for the termination; required for user-backed callers and optional + # for long-lived organization API-key callers + reason: nil, + # Optional support or operational ticket number + ticket_number: nil, + request_options: {} + ) + end + + # @api private + sig { params(client: VitableConnect::Client).returns(T.attached_class) } + def self.new(client:) + end + end + end +end diff --git a/rbi/vitable_connect/resources/groups.rbi b/rbi/vitable_connect/resources/groups.rbi new file mode 100644 index 0000000..d90b621 --- /dev/null +++ b/rbi/vitable_connect/resources/groups.rbi @@ -0,0 +1,79 @@ +# typed: strong + +module VitableConnect + module Resources + class Groups + sig { returns(VitableConnect::Resources::Groups::Members) } + attr_reader :members + + # Creates a new group scoped to the authenticated organization. + sig do + params( + external_reference_id: String, + name: String, + request_options: VitableConnect::RequestOptions::OrHash + ).returns(VitableConnect::GroupResponse) + end + def create(external_reference_id:, name:, request_options: {}) + end + + # Retrieves a single group by its prefixed ID. Returns 404 if the group does not + # belong to the authenticated organization. + sig do + params( + group_id: String, + request_options: VitableConnect::RequestOptions::OrHash + ).returns(VitableConnect::GroupResponse) + end + def retrieve( + # Unique group identifier (grp\_\*) + group_id, + request_options: {} + ) + end + + # Partially updates a group's name or external reference ID. Returns 404 if the + # group does not belong to the authenticated organization. + sig do + params( + group_id: String, + external_reference_id: T.nilable(String), + name: T.nilable(String), + request_options: VitableConnect::RequestOptions::OrHash + ).returns(VitableConnect::GroupResponse) + end + def update( + # Unique group identifier (grp\_\*) + group_id, + external_reference_id: nil, + name: nil, + request_options: {} + ) + end + + # Returns a paginated list of groups belonging to the authenticated organization. + sig do + params( + limit: Integer, + page: Integer, + request_options: VitableConnect::RequestOptions::OrHash + ).returns( + VitableConnect::Internal::PageNumberPage[VitableConnect::Group] + ) + end + def list( + # Items per page (default: 20, max: 100) + limit: nil, + # Page number (default: 1) + page: nil, + request_options: {} + ) + end + + # @api private + sig { params(client: VitableConnect::Client).returns(T.attached_class) } + def self.new(client:) + end + end + end +end diff --git a/rbi/vitable_connect/resources/groups/members.rbi b/rbi/vitable_connect/resources/groups/members.rbi new file mode 100644 index 0000000..bc9b676 --- /dev/null +++ b/rbi/vitable_connect/resources/groups/members.rbi @@ -0,0 +1,17 @@ +# typed: strong + +module VitableConnect + module Resources + class Groups + class Members + sig { returns(VitableConnect::Resources::Groups::Members::Sync) } + attr_reader :sync + + # @api private + sig { params(client: VitableConnect::Client).returns(T.attached_class) } + def self.new(client:) + end + end + end + end +end diff --git a/rbi/vitable_connect/resources/groups/members/sync.rbi b/rbi/vitable_connect/resources/groups/members/sync.rbi new file mode 100644 index 0000000..1cadb9a --- /dev/null +++ b/rbi/vitable_connect/resources/groups/members/sync.rbi @@ -0,0 +1,62 @@ +# typed: strong + +module VitableConnect + module Resources + class Groups + class Members + class Sync + # Retrieves a previously-submitted group member sync request by its `grpmsr_` ID. + # Returns the acceptance timestamp, completion timestamp (if processing has + # finished), and the per-member `results` once available. While processing is in + # flight, `completed_at` and `results` are `null`. + sig do + params( + request_id: String, + group_id: String, + request_options: VitableConnect::RequestOptions::OrHash + ).returns( + VitableConnect::Models::Groups::Members::SyncRetrieveResponse + ) + end + def retrieve( + request_id, + # Unique group identifier (grp\_\*) + group_id:, + request_options: {} + ) + end + + # Submits a member sync payload for the specified group. Members in the payload + # will be queued for processing asynchronously. Returns HTTP 202 with the batch ID + # and acceptance timestamp. + sig do + params( + group_id: String, + members: + T::Array[ + VitableConnect::Groups::Members::SyncSubmitParams::Member::OrHash + ], + request_options: VitableConnect::RequestOptions::OrHash + ).returns( + VitableConnect::Models::Groups::Members::SyncSubmitResponse + ) + end + def submit( + # Unique group identifier (grp\_\*) + group_id, + members:, + request_options: {} + ) + end + + # @api private + sig do + params(client: VitableConnect::Client).returns(T.attached_class) + end + def self.new(client:) + end + end + end + end + end +end diff --git a/rbi/vitable_connect/resources/members.rbi b/rbi/vitable_connect/resources/members.rbi new file mode 100644 index 0000000..90ac3fd --- /dev/null +++ b/rbi/vitable_connect/resources/members.rbi @@ -0,0 +1,200 @@ +# typed: strong + +module VitableConnect + module Resources + # Browse the members covered across your book and read a member's profile + class Members + # Retrieves a member's profile by ID — identity, demographics, address, contact + # details, tobacco status, and profile status. Access is scoped to the + # authenticated principal; a member not visible to the caller returns a 404. + sig do + params( + member_id: String, + request_options: VitableConnect::RequestOptions::OrHash + ).returns(VitableConnect::Models::MemberRetrieveResponse) + end + def retrieve( + # Unique member identifier (mbr\_\*) + member_id, + request_options: {} + ) + end + + # Retrieves a paginated list of the members in the authenticated organization's + # book — identity, contact details, and address. The book covers members reached + # through an employer in the organization's book as well as members of a group it + # owns. Supports free-text search (name, email, phone number, or exact member id). + sig do + params( + limit: Integer, + page: Integer, + search: String, + request_options: VitableConnect::RequestOptions::OrHash + ).returns( + VitableConnect::Internal::PageNumberPage[ + VitableConnect::Models::MemberListResponse + ] + ) + end + def list( + # Items per page (default: 20, max: 100) + limit: nil, + # Page number (default: 1) + page: nil, + # Case-insensitive search across member name, email, and phone number; exact match + # on member id (prefixed or raw uuid) + search: nil, + request_options: {} + ) + end + + # Lists a member's active legal dependents — name, relationship, date of birth, + # age, and sex at birth. Access is scoped to the authenticated principal; a member + # not visible to the caller returns a 404. + sig do + params( + member_id: String, + request_options: VitableConnect::RequestOptions::OrHash + ).returns(VitableConnect::Models::MemberListDependentsResponse) + end + def list_dependents( + # Unique member identifier (mbr\_\*) + member_id, + request_options: {} + ) + end + + # Lists a member's employment across every employer — the same employee record + # shape as the employer's employees list, plus the employer name. For an + # organization caller the rows are scoped to companies in that organization's + # book; a member (self/household) or Vitable Admin sees all employments. A member + # not visible to the caller returns a 404. + sig do + params( + member_id: String, + request_options: VitableConnect::RequestOptions::OrHash + ).returns(VitableConnect::Models::MemberListEmploymentsResponse) + end + def list_employments( + # Unique member identifier (mbr\_\*) + member_id, + request_options: {} + ) + end + + # Lists a member's benefit enrollments across every employer — benefit type and + # product, employer, carrier, plan, tier, employee deduction, employer + # contribution and total premium, the individual enrollment coverage boundary + # (`coverage_end`), the separate pre-effective cancellation boundary + # (`cancelled_date`), and the distinct benefit plan-year boundary + # (`plan_year_coverage_end`) used to determine whether the plan year itself has + # ended, the date the enrollment record was created (`issued_date`, the value Ops + # labels Issued on, reported for every row whatever the member answered), the + # window the member could answer in -- which never opens before the enrollment was + # issued, so a row issued mid-open-enrollment starts its window on its issue date + # -- whether a qualifying life event would currently be required for reissue under + # the product/open-enrollment rule, enrollment/open-enrollment window, and two + # statuses: `election_status` (what the member answered) and `policy_status` (what + # became of their coverage, null unless they enrolled). Every row includes a + # stable enrollment ID and the exact employer and benefit plan-year IDs used to + # fetch that row's plan-year detail. The full list is returned across all states + # so the client derives active plans (effective and upcoming) and the enrollment + # history from those per-row statuses. For an organization caller the rows are + # scoped to companies in that organization's book; a member (self/household) or + # Vitable Admin sees all enrollments. A member not visible to the caller returns + # a 404. + sig do + params( + member_id: String, + request_options: VitableConnect::RequestOptions::OrHash + ).returns(VitableConnect::Models::MemberListEnrollmentsResponse) + end + def list_enrollments( + # Unique member identifier (mbr\_\*) + member_id, + request_options: {} + ) + end + + # Lists a member's benefit ID cards — card type (medical, dental, vision, or rx), + # employer, plan, provider network, claims payer, carrier contact details, and the + # disclaimers printed on the card. Medical, dental and vision cards come from the + # member's active digital benefit cards; the rx card from the member's Ventegra + # pharmacy benefit (omitted when the member has no free-medication coverage), + # which carries no plan, network, or carrier details. Access is scoped to the + # authenticated principal, and an organization caller sees only cards from + # employers in its book; a member not visible to the caller returns a 404. + sig do + params( + member_id: String, + request_options: VitableConnect::RequestOptions::OrHash + ).returns(VitableConnect::Models::MemberListIDCardsResponse) + end + def list_id_cards( + # Unique member identifier (mbr\_\*) + member_id, + request_options: {} + ) + end + + # Lists a member's qualifying life events, including events already used for + # another enrollment. Returns all statuses by default; pass the status query param + # to filter to one (e.g. approved). Events are ordered newest submission first + # with stable paging. Custom text is present only when submitted and is otherwise + # null. A member not visible to the caller returns a 404. API keys and unbound + # access tokens have organization-wide access. Employer-bound tokens require + # employment at the bound employer, and employee-bound tokens require the exact + # employee-member relationship. Organization or scope mismatches return a 404 + # before pagination is validated. + sig do + params( + member_id: String, + limit: Integer, + page: Integer, + status: + VitableConnect::MemberListQualifyingLifeEventsParams::Status::OrSymbol, + request_options: VitableConnect::RequestOptions::OrHash + ).returns( + VitableConnect::Internal::PageNumberPage[ + VitableConnect::Models::MemberListQualifyingLifeEventsResponse + ] + ) + end + def list_qualifying_life_events( + # Unique member identifier (mbr\_\*) + member_id, + # Items per page (default: 20, max: 100) + limit: nil, + # Page number (default: 1) + page: nil, + # Optional. Filter to a single QLE status; omit to return all statuses. + status: nil, + request_options: {} + ) + end + + # Lists a member's household as a per-participant table — the account holder plus + # each active household member, with name, relationship, member type, date of + # birth, and household-admin flag. Access is scoped to the authenticated + # principal; a member not visible to the caller (or with no household) returns + # a 404. + sig do + params( + member_id: String, + request_options: VitableConnect::RequestOptions::OrHash + ).returns(VitableConnect::Models::MemberRetrieveHouseholdResponse) + end + def retrieve_household( + # Unique member identifier (mbr\_\*) + member_id, + request_options: {} + ) + end + + # @api private + sig { params(client: VitableConnect::Client).returns(T.attached_class) } + def self.new(client:) + end + end + end +end diff --git a/rbi/vitable_connect/resources/organizations.rbi b/rbi/vitable_connect/resources/organizations.rbi new file mode 100644 index 0000000..153f666 --- /dev/null +++ b/rbi/vitable_connect/resources/organizations.rbi @@ -0,0 +1,48 @@ +# typed: strong + +module VitableConnect + module Resources + class Organizations + # Onboards the authenticated user's partner Organization: creates the local + # Organization + the creator's admin membership atomically, then mirrors it to + # WorkOS (creates the WorkOS org and binds the creator as admin). 409 + # `organization_already_exists` when the user already has an organization (v0: one + # organization per user). + sig do + params( + name: String, + type: + T.nilable(VitableConnect::OrganizationCreateParams::Type::OrSymbol), + request_options: VitableConnect::RequestOptions::OrHash + ).returns(VitableConnect::Models::OrganizationCreateResponse) + end + def create( + name:, + # - `BROKERAGE` - BROKERAGE + # - `TPA` - TPA + # - `GENERAL_AGENT` - GENERAL_AGENT + # - `CHANNEL_PARTNER` - CHANNEL_PARTNER + # - `CONSULTING_FIRM` - CONSULTING_FIRM + # - `API_PLATFORM` - API_PLATFORM + type: nil, + request_options: {} + ) + end + + # Lists the organizations the authenticated caller is an active member of + # (paginated). Returns an empty list when the caller belongs to no organizations. + sig do + params(request_options: VitableConnect::RequestOptions::OrHash).returns( + VitableConnect::Models::OrganizationListResponse + ) + end + def list(request_options: {}) + end + + # @api private + sig { params(client: VitableConnect::Client).returns(T.attached_class) } + def self.new(client:) + end + end + end +end diff --git a/rbi/vitable_connect/resources/plans.rbi b/rbi/vitable_connect/resources/plans.rbi new file mode 100644 index 0000000..c3e1156 --- /dev/null +++ b/rbi/vitable_connect/resources/plans.rbi @@ -0,0 +1,34 @@ +# typed: strong + +module VitableConnect + module Resources + class Plans + # Returns a paginated list of benefit plans linked to the authenticated + # organization. + sig do + params( + limit: Integer, + page: Integer, + request_options: VitableConnect::RequestOptions::OrHash + ).returns( + VitableConnect::Internal::PageNumberPage[ + VitableConnect::Models::PlanListResponse + ] + ) + end + def list( + # Items per page (default: 20, max: 100) + limit: nil, + # Page number (default: 1) + page: nil, + request_options: {} + ) + end + + # @api private + sig { params(client: VitableConnect::Client).returns(T.attached_class) } + def self.new(client:) + end + end + end +end diff --git a/rbi/vitable_connect/resources/webhook_events.rbi b/rbi/vitable_connect/resources/webhook_events.rbi new file mode 100644 index 0000000..a5f19fe --- /dev/null +++ b/rbi/vitable_connect/resources/webhook_events.rbi @@ -0,0 +1,84 @@ +# typed: strong + +module VitableConnect + module Resources + class WebhookEvents + # Retrieves a single webhook event by its prefixed ID. Returns 404 if the event + # does not exist or belongs to a different organization. + sig do + params( + event_id: String, + request_options: VitableConnect::RequestOptions::OrHash + ).returns(VitableConnect::Models::WebhookEventRetrieveResponse) + end + def retrieve(event_id, request_options: {}) + end + + # Retrieves a paginated list of webhook events for the authenticated organization. + # Supports filtering by event name, resource type, resource ID, and date range. + sig do + params( + created_after: Time, + created_before: Time, + event_name: + VitableConnect::WebhookEventListParams::EventName::OrSymbol, + limit: Integer, + page: Integer, + resource_id: String, + resource_type: + VitableConnect::WebhookEventListParams::ResourceType::OrSymbol, + request_options: VitableConnect::RequestOptions::OrHash + ).returns( + VitableConnect::Internal::PageNumberPage[VitableConnect::WebhookEvent] + ) + end + def list( + created_after: nil, + created_before: nil, + # - `enrollment.accepted` - Enrollment Accepted + # - `enrollment.terminated` - Enrollment Terminated + # - `enrollment.termination_rescheduled` - Enrollment Termination Rescheduled + # - `enrollment.elected` - Enrollment Elected + # - `enrollment.granted` - Enrollment Granted + # - `enrollment.waived` - Enrollment Waived + # - `enrollment.started` - Enrollment Started + # - `employee.eligibility_granted` - Employee Eligibility Granted + # - `employee.eligibility_terminated` - Employee Eligibility Terminated + # - `employee.deactivated` - Employee Deactivated + # - `employee.deduction_created` - Employee Deduction Created + event_name: nil, + # Items per page (default: 20, max: 100) + limit: nil, + # Page number (default: 1) + page: nil, + resource_id: nil, + # - `enrollment` - Enrollment + # - `employee` - Employee + # - `employer` - Employer + # - `dependent` - Dependent + # - `plan_year` - Plan Year + # - `payroll_deduction` - Payroll Deduction + resource_type: nil, + request_options: {} + ) + end + + # Retrieves all delivery attempts for a webhook event. Returns up to 100 + # deliveries. Each delivery includes a computed status field (Pending, In + # Progress, Delivered, or Failed). + sig do + params( + event_id: String, + request_options: VitableConnect::RequestOptions::OrHash + ).returns(VitableConnect::Models::WebhookEventListDeliveriesResponse) + end + def list_deliveries(event_id, request_options: {}) + end + + # @api private + sig { params(client: VitableConnect::Client).returns(T.attached_class) } + def self.new(client:) + end + end + end +end diff --git a/rbi/vitable_connect/version.rbi b/rbi/vitable_connect/version.rbi new file mode 100644 index 0000000..19903b7 --- /dev/null +++ b/rbi/vitable_connect/version.rbi @@ -0,0 +1,5 @@ +# typed: strong + +module VitableConnect + VERSION = T.let(T.unsafe(nil), String) +end diff --git a/reference.md b/reference.md deleted file mode 100644 index 6e47a63..0000000 --- a/reference.md +++ /dev/null @@ -1,3722 +0,0 @@ -# Reference -## Auth -
client.auth.issue_access_token(request) -> VitableConnect::Types::AccessTokenResponse -
-
- -#### 📝 Description - -
-
- -
-
- -Issues a short-lived access token from the authenticated API key. Access tokens can optionally be bound to a specific employer or employee for scoped access. Tokens expire after 15 minutes. -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```ruby -client.auth.issue_access_token(grant_type: "client_credentials") -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**grant_type:** `VitableConnect::Types::GrantType` - -Token issuance flow. Currently only 'client_credentials' supported. - -* `client_credentials` - client_credentials - -
-
- -
-
- -**bound_entity:** `VitableConnect::Types::BoundEntity` — Optional entity to bind the token to for scoped access - -
-
- -
-
- -**request_options:** `VitableConnect::Auth::RequestOptions` - -
-
-
-
- - -
-
-
- -## Employees -
client.employees.get(employee_id:) -> VitableConnect::Types::EmployeeResponse -
-
- -#### 📝 Description - -
-
- -
-
- -Retrieves detailed information for a specific employee by ID. Returns employee details including personal information, employment status, classification and compensation-type effective dates, compensation type, and payroll deductions from the most recent statement period. Deductions reflect a snapshot of the current period and are replaced when a new statement is generated. -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```ruby -client.employees.get(employee_id: "empl_abc123def456") -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**employee_id:** `String` — Unique employee identifier (empl_*) - -
-
- -
-
- -**request_options:** `VitableConnect::Employees::RequestOptions` - -
-
-
-
- - -
-
-
- -
client.employees.update(employee_id:, request) -> VitableConnect::Types::EmployeeResponse -
-
- -#### 📝 Description - -
-
- -
-
- -Updates employee personal, contact, address, and employment fields. This endpoint currently supports email, phone, gender, address, employee_class, start_date, and compensation_type. effective_date is required and applies to employee_class and compensation_type when those fields are included in the request. -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```ruby -client.employees.update( - employee_id: "empl_abc123def456", - employee_class: "Full Time", - start_date: "2023-01-15", - compensation_type: "Salary", - effective_date: "2023-03-01" -) -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**employee_id:** `String` — Unique employee identifier (empl_*) - -
-
- -
-
- -**email:** `String` — Email address - -
-
- -
-
- -**phone:** `String` — Phone number - -
-
- -
-
- -**gender:** `VitableConnect::Types::Gender` - -Gender identity - -* `Male` - Male -* `Female` - Female -* `Transgender` - Transgender -* `Non-binary` - Non-binary -* `Prefer not to respond` - Prefer not to respond - -
-
- -
-
- -**address:** `VitableConnect::Types::EmployeeAddressInput` — Employee's residential address - -
-
- -
-
- -**employee_class:** `VitableConnect::Types::EmployeeClass` - -Employment classification - -* `Full Time` - Full Time -* `Part Time` - Part Time -* `Temporary` - Temporary -* `Intern` - Intern -* `Seasonal` - Seasonal -* `Individual Contractor` - Individual Contractor - -
-
- -
-
- -**start_date:** `String` — Employment start date - -
-
- -
-
- -**compensation_type:** `VitableConnect::Types::CompensationType` - -Employee compensation type - -* `Salary` - Salary -* `Hourly` - Hourly - -
-
- -
-
- -**effective_date:** `String` — Past or present date applied to each tracked employment field included in this request - -
-
- -
-
- -**request_options:** `VitableConnect::Employees::RequestOptions` - -
-
-
-
- - -
-
-
- -
client.employees.list_enrollments(employee_id:) -> VitableConnect::Types::EnrollmentListResponse -
-
- -#### 📝 Description - -
-
- -
-
- -Retrieves a paginated list of benefit enrollments for an employee. -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```ruby -client.employees.list_enrollments( - employee_id: "empl_abc123def456", - limit: 20, - page: 1 -) -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**employee_id:** `String` — Unique employee identifier (empl_*) - -
-
- -
-
- -**limit:** `Integer` — Items per page (default: 20, max: 100) - -
-
- -
-
- -**page:** `Integer` — Page number (default: 1) - -
-
- -
-
- -**request_options:** `VitableConnect::Employees::RequestOptions` - -
-
-
-
- - -
-
-
- -## Employers -
client.employers.list() -> VitableConnect::Types::OrganizationEmployerListResponse -
-
- -#### 📝 Description - -
-
- -
-
- -Returns the caller's employer book — every employer with its computed columns (enrollment-rate summary, benefit-family tags, HRIS connection, benefit-lifecycle stage) merged with the employer's flat CRM fields (legal name, EIN, contact, address, timestamps). The book is derived from the authenticated principal: one organization's employers, or every organization's for a caller whose reach is not a single organization. Supports search by display name, legal name, or exact EIN, employer id or contact email, benefit-family/lifecycle/HRIS filters, and page/limit pagination. -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```ruby -client.employers.list( - limit: 20, - page: 1 -) -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**benefit_family:** `VitableConnect::Types::BenefitFamilyParamItem` — Filter to employers with at least one active benefit in these families. - -
-
- -
-
- -**benefit_lifecycle_stage:** `VitableConnect::Types::BenefitLifecycleStageItem` — Filter to employers in one of these computed benefit-lifecycle stages. - -
-
- -
-
- -**hris_provider:** `String` — Filter to employers whose HRIS connection is with one of these payroll providers (e.g. `ADP RUN`). Matched case-insensitively; free text, so read the available values from the HRIS-providers endpoint rather than assuming a fixed set. - -
-
- -
-
- -**hris_status:** `VitableConnect::Types::HrisStatusItem` — Filter to employers whose HRIS connection is in one of these statuses. - -
-
- -
-
- -**include_cancelled:** `Internal::Types::Boolean` — Include cancelled employers (hidden by default unless their stage is explicitly requested). - -
-
- -
-
- -**limit:** `Integer` — Items per page. - -
-
- -
-
- -**page:** `Integer` — Page number. - -
-
- -
-
- -**search:** `String` — Employer filter. Matches the display name or the legal name case-insensitively as a substring, or one of these exactly: the EIN (with or without its dash), the employer id, or the contact email of one of the employer's non-disabled admins. - -
-
- -
-
- -**request_options:** `VitableConnect::Employers::RequestOptions` - -
-
-
-
- - -
-
-
- -
client.employers.create(request) -> VitableConnect::Types::EmployerResponse -
-
- -#### 📝 Description - -
-
- -
-
- -Creates a new employer for the authenticated organization. Requires employer name, legal name, EIN, email, and address information. Returns the created employer with its assigned ID. -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```ruby -client.employers.create( - name: "NewCo Industries", - legal_name: "NewCo Industries LLC", - ein: "12-3456789", - email: "hr@newco.com", - address: { - address_line1: "789 Business Blvd", - address_line2: "Floor 5", - city: "Seattle", - state: "WA", - zipcode: "98101" - }, - phone_number: "2065550100", - reference_id: "partner-emp-001" -) -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**name:** `String` — Employer display name - -
-
- -
-
- -**legal_name:** `String` — Legal business name - -
-
- -
-
- -**ein:** `String` — Employer Identification Number (format: XX-XXXXXXX) - -
-
- -
-
- -**email:** `String` — Email address for billing and communications - -
-
- -
-
- -**address:** `VitableConnect::Types::EmployerAddressInput` — Employer address - -
-
- -
-
- -**phone_number:** `String` — Employer phone number (10-digit US format, e.g. 5551234567) - -
-
- -
-
- -**reference_id:** `String` — External reference ID for this employer - -
-
- -
-
- -**request_options:** `VitableConnect::Employers::RequestOptions` - -
-
-
-
- - -
-
-
- -
client.employers.get(employer_id:) -> VitableConnect::Types::EmployerResponse -
-
- -#### 📝 Description - -
-
- -
-
- -Retrieves detailed information for a specific employer by ID. The employer must belong to the authenticated organization. -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```ruby -client.employers.get(employer_id: "empr_abc123def456") -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**employer_id:** `String` — Unique employer identifier (empr_*) - -
-
- -
-
- -**request_options:** `VitableConnect::Employers::RequestOptions` - -
-
-
-
- - -
-
-
- -
client.employers.update(employer_id:, request) -> VitableConnect::Types::EmployerResponse -
-
- -#### 📝 Description - -
-
- -
-
- -Updates an existing employer. All fields are optional — only provided fields are updated. PO Box addresses are rejected. -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```ruby -client.employers.update(employer_id: "empr_abc123def456") -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**employer_id:** `String` — Unique employer identifier (empr_*) - -
-
- -
-
- -**name:** `String` — Employer display name - -
-
- -
-
- -**legal_name:** `String` — Legal business name - -
-
- -
-
- -**address:** `VitableConnect::Types::UpdateEmployerAddressInput` — Employer address - -
-
- -
-
- -**active:** `Internal::Types::Boolean` — Whether the employer is active - -
-
- -
-
- -**request_options:** `VitableConnect::Employers::RequestOptions` - -
-
-
-
- - -
-
-
- -
client.employers.list_benefit_plan_years(employer_id:) -> VitableConnect::Types::EmployerBenefitPlanYearsListResponse -
-
- -#### 📝 Description - -
-
- -
-
- -Returns the employer's benefit plan years (all years, or one when `year` is given), each with its benefits, offered states, benefit families, and the year-level enrollment roll-up. The caller must be authorized for the employer; an unknown or unauthorized employer returns 404. -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```ruby -client.employers.list_benefit_plan_years(employer_id: "empr_abc123def456") -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**employer_id:** `String` — Unique employer identifier (empr_*) - -
-
- -
-
- -**request_options:** `VitableConnect::Employers::RequestOptions` - -
-
-
-
- - -
-
-
- -
client.employers.get_benefit_plan_year(employer_id:, benefit_plan_year_id:) -> VitableConnect::Types::EmployerBenefitPlanYearResponse -
-
- -#### 📝 Description - -
-
- -
-
- -Returns one benefit plan year in full — its benefit details plus the per-benefit enrollment rate and SPD link — addressed by its `benefit_plan_year_id`. The caller must be authorized for the employer; an unknown or unauthorized plan year returns 404. -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```ruby -client.employers.get_benefit_plan_year( - employer_id: "empr_abc123def456", - benefit_plan_year_id: "plyr_abc123def456" -) -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**employer_id:** `String` — Unique employer identifier (empr_*) - -
-
- -
-
- -**benefit_plan_year_id:** `String` — Unique benefit-plan-year identifier (plyr_*). - -
-
- -
-
- -**request_options:** `VitableConnect::Employers::RequestOptions` - -
-
-
-
- - -
-
-
- -
client.employers.list_benefit_plan_year_enrollments(employer_id:, benefit_plan_year_id:) -> VitableConnect::Types::PlanYearEnrollmentListResponse -
-
- -#### 📝 Description - -
-
- -
-
- -Returns a paginated list of every member with an enrollment in one of an employer's plan years, any election status: what they elected, where their coverage stands, dependent count, carrier, plan, tier, and the plan's total monthly cost. The caller must be authorized for the employer `empr_<...>`; an unknown or unauthorized employer, or an unknown plan year `plyr_<...>`, returns 404. -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```ruby -client.employers.list_benefit_plan_year_enrollments( - employer_id: "empr_abc123def456", - benefit_plan_year_id: "plyr_abc123def456", - limit: 20, - page: 1 -) -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**employer_id:** `String` — Unique employer identifier (empr_*). - -
-
- -
-
- -**benefit_plan_year_id:** `String` — Unique benefit-plan-year identifier (plyr_*). - -
-
- -
-
- -**election_status:** `VitableConnect::Types::ElectionStatusItem` — Filter by election status. Repeat the parameter to match several. - -
-
- -
-
- -**limit:** `Integer` — Items per page (default: 20, max: 100) - -
-
- -
-
- -**page:** `Integer` — Page number (default: 1) - -
-
- -
-
- -**search:** `String` — Case-insensitive search. Matches member name partially, and the `member_id` exactly — either your own reference id or the prefixed `grpmbr_<...>` id. - -
-
- -
-
- -**request_options:** `VitableConnect::Employers::RequestOptions` - -
-
-
-
- - -
-
-
- -
client.employers.submit_census_sync(employer_id:, request) -> VitableConnect::Types::CensusSyncDetailResponse -
-
- -#### 📝 Description - -
-
- -
-
- -Submits a census sync payload for the specified employer. The employees in the payload will be queued for processing. Returns an accepted response with the timestamp of acceptance. -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```ruby -client.employers.submit_census_sync( - employer_id: "empr_abc123def456", - employees: [{ - reference_id: "EMP-001", - first_name: "Jane", - last_name: "Doe", - date_of_birth: "1990-05-15", - email: "jane.doe@acme.com", - phone: "4155550100", - address: { - address_line1: "123 Main Street", - address_line2: "Apt 4B", - city: "San Francisco", - state: "CA", - zipcode: "94102" - }, - start_date: "2024-01-15", - employee_class: "Full Time", - compensation_type: "Salary" - }, { - first_name: "John", - last_name: "Smith", - date_of_birth: "1985-11-20", - email: "john.smith@acme.com", - phone: "4155550101", - start_date: "2024-03-01", - employee_class: "Part Time", - compensation_type: "Hourly" - }] -) -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**employer_id:** `String` — Unique employer identifier (empr_*) - -
-
- -
-
- -**employees:** `Internal::Types::Array[VitableConnect::Types::CensusSyncEmployeeRequest]` - -
-
- -
-
- -**request_options:** `VitableConnect::Employers::RequestOptions` - -
-
-
-
- - -
-
-
- -
client.employers.list_employees(employer_id:) -> VitableConnect::Types::EmployeeListResponse -
-
- -#### 📝 Description - -
-
- -
-
- -Retrieves a paginated list of employees for a specific employer. The caller must be authorized for the employer; an unknown or unauthorized employer returns 404. Results are paginated using page and limit parameters and can be narrowed with a case-insensitive `search` (first name, last name, or email) and an `employment_status` filter (active or terminated). Each employee includes payroll deductions from the most recent statement period. When a new deduction statement is generated, previous period deductions are replaced. -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```ruby -client.employers.list_employees( - employer_id: "empr_abc123def456", - limit: 20, - page: 1, - search: "jane" -) -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**employer_id:** `String` — Unique employer identifier (empr_*) - -
-
- -
-
- -**employment_status:** `VitableConnect::Types::EmployeeStatus` — Filter by employment status (active or terminated) - -
-
- -
-
- -**limit:** `Integer` — Items per page (default: 20, max: 100) - -
-
- -
-
- -**page:** `Integer` — Page number (default: 1) - -
-
- -
-
- -**search:** `String` — Case-insensitive search across employee first name, last name, and email - -
-
- -
-
- -**request_options:** `VitableConnect::Employers::RequestOptions` - -
-
-
-
- - -
-
-
- -
client.employers.get_hris(employer_id:) -> VitableConnect::Types::EmployerHrisResponse -
-
- -#### 📝 Description - -
-
- -
-
- -Returns the employer's HRIS connection — provider, status, last sync, and synced row count — or null when the employer has no integration. The caller must be authorized for the employer; an unknown or unauthorized employer returns 404. -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```ruby -client.employers.get_hris(employer_id: "empr_abc123def456") -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**employer_id:** `String` — Unique employer identifier (empr_*) - -
-
- -
-
- -**request_options:** `VitableConnect::Employers::RequestOptions` - -
-
-
-
- - -
-
-
- -
client.employers.list_invoices(employer_id:) -> VitableConnect::Types::EmployerInvoicesListResponse -
-
- -#### 📝 Description - -
-
- -
-
- -Returns a cursor-paginated page of the employer's billing invoices, newest first. Pass the `next_offset` from a previous page as `offset` to fetch the next page. The caller must be authorized for the employer; an unknown or unauthorized employer returns 404. -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```ruby -client.employers.list_invoices( - employer_id: "empr_abc123def456", - limit: 20 -) -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**employer_id:** `String` — Unique employer identifier (empr_*) - -
-
- -
-
- -**limit:** `Integer` — Maximum number of invoices per page - -
-
- -
-
- -**offset:** `String` — Opaque cursor from a previous page's next_offset - -
-
- -
-
- -**request_options:** `VitableConnect::Employers::RequestOptions` - -
-
-
-
- - -
-
-
- -
client.employers.get_invoice_pdf(employer_id:, invoice_id:) -> VitableConnect::Types::EmployerInvoicePdfResponse -
-
- -#### 📝 Description - -
-
- -
-
- -Returns the time-limited PDF download link for a single invoice belonging to the employer's billing customer. `invoice_id` is the external Chargebee id (not a prefixed UUID). The caller must be authorized for the employer; an unknown or unauthorized employer or invoice returns 404. -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```ruby -client.employers.get_invoice_pdf( - employer_id: "empr_abc123def456", - invoice_id: "INV-00042" -) -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**employer_id:** `String` — Unique employer identifier (empr_*) - -
-
- -
-
- -**invoice_id:** `String` — External Chargebee invoice id (not a prefixed UUID). - -
-
- -
-
- -**request_options:** `VitableConnect::Employers::RequestOptions` - -
-
-
-
- - -
-
-
- -
client.employers.get_payroll_access_setup(employer_id:) -> VitableConnect::Types::PayrollAccessSetupStatusResponse -
-
- -#### 📝 Description - -
-
- -
-
- -Return whether the employer has submitted payroll access setup. -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```ruby -client.employers.get_payroll_access_setup(employer_id: "empr_abc123def456") -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**employer_id:** `String` - -
-
- -
-
- -**request_options:** `VitableConnect::Employers::RequestOptions` - -
-
-
-
- - -
-
-
- -
client.employers.submit_payroll_access_setup(employer_id:, request) -> VitableConnect::Types::PayrollAccessSetupStatusResponse -
-
- -#### 📝 Description - -
-
- -
-
- -Submit the employer's payroll access setup answers. -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```ruby -client.employers.submit_payroll_access_setup( - employer_id: "empr_abc123def456", - employees_in_payroll_acknowledged: true, - payroll_data_impacts_eligibility_acknowledged: true, - classifications_accurate: true, - all_benefit_eligible_employees_present: true, - is_controlled_group: true, - access_method: "SELF_SETUP", - has_additional_payroll_system: true -) -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**employer_id:** `String` - -
-
- -
-
- -**employees_in_payroll_acknowledged:** `Internal::Types::Boolean` — Attestation that all benefit-eligible employees appear in the payroll system. - -
-
- -
-
- -**payroll_data_impacts_eligibility_acknowledged:** `Internal::Types::Boolean` — Attestation that changes to payroll data affect benefit eligibility. - -
-
- -
-
- -**classifications_accurate:** `Internal::Types::Boolean` — Attestation that employee classifications in payroll are accurate. Set `false` to report corrections in the fields below. - -
-
- -
-
- -**classification_correction_source:** `VitableConnect::Types::ClassificationCorrectionSource` — Where corrected classifications come from, when `classifications_accurate` is `false`. - -
-
- -
-
- -**misclassified_employee_names:** `Internal::Types::Array[String]` — Names of employees whose payroll classification needs correcting. - -
-
- -
-
- -**remaining_employee_action:** `VitableConnect::Types::RemainingEmployeeAction` — How to handle employees still missing from the payroll system. - -
-
- -
-
- -**all_benefit_eligible_employees_present:** `Internal::Types::Boolean` — Attestation that every benefit-eligible employee is present in payroll. - -
-
- -
-
- -**missing_employee_resolution:** `VitableConnect::Types::MissingEmployeeResolution` — How any missing employees will be added, when some are absent. - -
-
- -
-
- -**is_controlled_group:** `Internal::Types::Boolean` — Whether this employer belongs to a controlled group of related entities. - -
-
- -
-
- -**same_payroll_covers_other_eins:** `Internal::Types::Boolean` — Whether this payroll system also covers other EINs in the controlled group. - -
-
- -
-
- -**access_method:** `VitableConnect::Types::AccessMethod` - -
-
- -
-
- -**login_url:** `String` — Sign-in URL for the payroll system. - -
-
- -
-
- -**username:** `String` — Username Vitable should use to access the payroll system. - -
-
- -
-
- -**phone:** `String` — Phone number used for payroll-system verification codes. - -
-
- -
-
- -**password:** `String` — Password Vitable should use to access the payroll system. - -
-
- -
-
- -**integration_confirmed:** `Internal::Types::Boolean` — Whether the payroll integration has been confirmed as working. - -
-
- -
-
- -**has_additional_payroll_system:** `Internal::Types::Boolean` — Whether a second payroll system is in use. When `true`, supply the `additional_*` fields below. - -
-
- -
-
- -**additional_access_method:** `VitableConnect::Types::AdditionalAccessMethod` — How Vitable will access the second payroll system. - -
-
- -
-
- -**additional_login_url:** `String` — Sign-in URL for the second payroll system. - -
-
- -
-
- -**additional_username:** `String` — Username Vitable should use for the second payroll system. - -
-
- -
-
- -**additional_phone:** `String` — Phone number used for second payroll-system verification codes. - -
-
- -
-
- -**additional_password:** `String` — Password Vitable should use for the second payroll system. - -
-
- -
-
- -**additional_integration_confirmed:** `Internal::Types::Boolean` — Whether the second payroll integration has been confirmed as working. - -
-
- -
-
- -**request_options:** `VitableConnect::Employers::RequestOptions` - -
-
-
-
- - -
-
-
- -
client.employers.list_payroll_deduction_statements(employer_id:) -> VitableConnect::Types::EmployerPayrollDeductionStatementListResponse -
-
- -#### 📝 Description - -
-
- -
-
- -Returns a paginated list of the employer's payroll-deduction statements, newest period first, each with its period, generation date, distinct employee count, total deduction, change-file link, and deduction frequency. Statements superseded by a later correction are excluded. The caller must be authorized for the employer; an unknown or unauthorized employer returns 404. -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```ruby -client.employers.list_payroll_deduction_statements( - employer_id: "empr_abc123def456", - limit: 20, - page: 1 -) -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**employer_id:** `String` — Unique employer identifier (empr_*) - -
-
- -
-
- -**limit:** `Integer` — Maximum number of statements per page - -
-
- -
-
- -**page:** `Integer` — Page number to retrieve (starts at 1) - -
-
- -
-
- -**request_options:** `VitableConnect::Employers::RequestOptions` - -
-
-
-
- - -
-
-
- -
client.employers.ensure_payroll_integration_email(employer_id:) -> VitableConnect::Types::PayrollIntegrationEmailResponse -
-
- -#### 📝 Description - -
-
- -
-
- -Provision and return the employer's payroll integration email. -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```ruby -client.employers.ensure_payroll_integration_email(employer_id: "empr_abc123def456") -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**employer_id:** `String` - -
-
- -
-
- -**request_options:** `VitableConnect::Employers::RequestOptions` - -
-
-
-
- - -
-
-
- -
client.employers.update_settings(employer_id:, request) -> VitableConnect::Types::EmployerSettingsResponse -
-
- -#### 📝 Description - -
-
- -
-
- -Updates configuration settings for a specific employer. The employer must belong to the authenticated organization. -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```ruby -client.employers.update_settings( - employer_id: "empr_abc123def456", - pay_frequency: "bi_weekly" -) -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**employer_id:** `String` — Unique employer identifier (empr_*) - -
-
- -
-
- -**pay_frequency:** `VitableConnect::Types::DeductionFrequency` - -
-
- -
-
- -**request_options:** `VitableConnect::Employers::RequestOptions` - -
-
-
-
- - -
-
-
- -
client.employers.list_hris_providers() -> VitableConnect::Types::OrganizationHrisProvidersResponse -
-
- -#### 📝 Description - -
-
- -
-
- -Returns the distinct HRIS/payroll providers across the same book `GET /v1/employers` returns, sorted for display. Use these as the values for the employers list's `hris_provider` filter — filter on `provider`, show `provider_label`. The stored providers are free text, so they cannot be enumerated in advance. -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```ruby -client.employers.list_hris_providers -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request_options:** `VitableConnect::Employers::RequestOptions` - -
-
-
-
- - -
-
-
- -## Enrollments -
client.enrollments.get(enrollment_id:) -> VitableConnect::Types::EnrollmentResponse -
-
- -#### 📝 Description - -
-
- -
-
- -Retrieves a single enrollment: the employee and employer it belongs to, the benefit product, its status, the coverage period, the employee payroll deduction and employer contribution, and the enrolled plan's Summary of Benefits and Coverage document when one is on file. An enrollment the caller cannot reach is indistinguishable from one that does not exist. -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```ruby -client.enrollments.get(enrollment_id: "enrl_AAAAAAAAAAAAAAAAAAAAAQ") -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**enrollment_id:** `String` — Unique enrollment identifier (enrl_*) - -
-
- -
-
- -**request_options:** `VitableConnect::Enrollments::RequestOptions` - -
-
-
-
- - -
-
-
- -
client.enrollments.reissue(enrollment_id:, request) -> VitableConnect::Types::ReissueEnrollmentResponse -
-
- -#### 📝 Description - -
-
- -
-
- -Closes the targeted enrollment and creates a new unanswered enrollment for the same member and plan year. VPC never requires a qualifying life event; other products require an accepted, member-owned event outside open enrollment. User-backed callers must provide a reason; it is optional for organization API-key callers. Tenant mismatches return a non-disclosing 404 before the request body is validated. -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```ruby -client.enrollments.reissue( - enrollment_id: "enrl_AAAAAAAAAAAAAAAAAAAAAQ", - reason: "Member needs a new election after a qualifying event.", - ticket_number: "BPT-1234", - qualifying_life_event_id: "qle_AAAAAAAAAAAAAAAAAAAAAQ" -) -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**enrollment_id:** `String` — Unique enrollment identifier (enrl_*) - -
-
- -
-
- -**reason:** `String` — Audit reason for the reissue; required for user-backed callers and optional for long-lived organization API-key callers - -
-
- -
-
- -**ticket_number:** `String` — Optional support or operational ticket number - -
-
- -
-
- -**qualifying_life_event_id:** `String` — Accepted member qualifying life event identifier (qle_*) - -
-
- -
-
- -**request_options:** `VitableConnect::Enrollments::RequestOptions` - -
-
-
-
- - -
-
-
- -
client.enrollments.terminate(enrollment_id:, request) -> -
-
- -#### 📝 Description - -
-
- -
-
- -Terminates enrolled coverage immediately. An accepted qualifying life event owned by the enrollment member is required unless the plan is VPC or ICHRA. User-backed callers must provide a reason; it is optional for organization API-key callers. API keys may act across the caller organization's book. Tenant mismatches return the same non-disclosing 404 before the request body is validated. -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```ruby -client.enrollments.terminate( - enrollment_id: "enrl_AAAAAAAAAAAAAAAAAAAAAQ", - reason: "Member requested coverage termination after a qualifying event.", - ticket_number: "BPT-1234", - qualifying_life_event_id: "qle_AAAAAAAAAAAAAAAAAAAAAQ" -) -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**enrollment_id:** `String` — Unique enrollment identifier (enrl_*) - -
-
- -
-
- -**reason:** `String` — Audit reason for the termination; required for user-backed callers and optional for long-lived organization API-key callers - -
-
- -
-
- -**ticket_number:** `String` — Optional support or operational ticket number - -
-
- -
-
- -**qualifying_life_event_id:** `String` — Accepted member qualifying life event identifier (qle_*) - -
-
- -
-
- -**request_options:** `VitableConnect::Enrollments::RequestOptions` - -
-
-
-
- - -
-
-
- -## Groups -
client.groups.list() -> VitableConnect::Types::GroupListResponse -
-
- -#### 📝 Description - -
-
- -
-
- -Returns a paginated list of groups belonging to the authenticated organization. -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```ruby -client.groups.list( - limit: 20, - page: 1 -) -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**limit:** `Integer` — Items per page (default: 20, max: 100) - -
-
- -
-
- -**page:** `Integer` — Page number (default: 1) - -
-
- -
-
- -**request_options:** `VitableConnect::Groups::RequestOptions` - -
-
-
-
- - -
-
-
- -
client.groups.create(request) -> VitableConnect::Types::GroupResponse -
-
- -#### 📝 Description - -
-
- -
-
- -Creates a new group scoped to the authenticated organization. -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```ruby -client.groups.create( - name: "Tier 1", - external_reference_id: "mol_seg_001" -) -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**name:** `String` — Display name for the group. - -
-
- -
-
- -**external_reference_id:** `String` — Your own identifier for this group. Use it to correlate the group with a record in your system; it must be unique within your organization. - -
-
- -
-
- -**request_options:** `VitableConnect::Groups::RequestOptions` - -
-
-
-
- - -
-
-
- -
client.groups.get(group_id:) -> VitableConnect::Types::GroupResponse -
-
- -#### 📝 Description - -
-
- -
-
- -Retrieves a single group by its prefixed ID. Returns 404 if the group does not belong to the authenticated organization. -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```ruby -client.groups.get(group_id: "grp_abc123def456") -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**group_id:** `String` — Unique group identifier (grp_*) - -
-
- -
-
- -**request_options:** `VitableConnect::Groups::RequestOptions` - -
-
-
-
- - -
-
-
- -
client.groups.update(group_id:, request) -> VitableConnect::Types::GroupResponse -
-
- -#### 📝 Description - -
-
- -
-
- -Partially updates a group's name or external reference ID. Returns 404 if the group does not belong to the authenticated organization. -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```ruby -client.groups.update( - group_id: "grp_abc123def456", - name: "Tier 1 (renamed)", - external_reference_id: "mol_seg_001_v2" -) -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**group_id:** `String` — Unique group identifier (grp_*) - -
-
- -
-
- -**name:** `String` — New display name for the group. Omit to leave unchanged. - -
-
- -
-
- -**external_reference_id:** `String` — New external reference ID for the group. Omit to leave unchanged. - -
-
- -
-
- -**request_options:** `VitableConnect::Groups::RequestOptions` - -
-
-
-
- - -
-
-
- -## Members -
client.members.get(member_id:) -> VitableConnect::Types::MemberResponse -
-
- -#### 📝 Description - -
-
- -
-
- -Retrieves a member's profile by ID — identity, demographics, address, contact details, tobacco status, and profile status. Access is scoped to the authenticated principal; a member not visible to the caller returns a 404. -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```ruby -client.members.get(member_id: "mbr_abc123def456") -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**member_id:** `String` — Unique member identifier (mbr_*) - -
-
- -
-
- -**request_options:** `VitableConnect::Members::RequestOptions` - -
-
-
-
- - -
-
-
- -
client.members.list_dependents(member_id:) -> VitableConnect::Types::MemberDependentsResponse -
-
- -#### 📝 Description - -
-
- -
-
- -Lists a member's active legal dependents — name, relationship, date of birth, age, and sex at birth. Access is scoped to the authenticated principal; a member not visible to the caller returns a 404. -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```ruby -client.members.list_dependents(member_id: "mbr_abc123def456") -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**member_id:** `String` - -
-
- -
-
- -**request_options:** `VitableConnect::Members::RequestOptions` - -
-
-
-
- - -
-
-
- -
client.members.list_employments(member_id:) -> VitableConnect::Types::MemberEmploymentsResponse -
-
- -#### 📝 Description - -
-
- -
-
- -Lists a member's employment across every employer — the same employee record shape as the employer's employees list, plus the employer name. For an organization caller the rows are scoped to companies in that organization's book; a member (self/household) or Vitable Admin sees all employments. A member not visible to the caller returns a 404. -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```ruby -client.members.list_employments(member_id: "mbr_abc123def456") -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**member_id:** `String` - -
-
- -
-
- -**request_options:** `VitableConnect::Members::RequestOptions` - -
-
-
-
- - -
-
-
- -
client.members.list_enrollments(member_id:) -> VitableConnect::Types::MemberEnrollmentsResponse -
-
- -#### 📝 Description - -
-
- -
-
- -Lists a member's benefit enrollments across every employer — benefit type and product, employer, carrier, plan, tier, employee deduction, employer contribution and total premium, the individual enrollment coverage boundary (`coverage_end`), the separate pre-effective cancellation boundary (`cancelled_date`), and the distinct benefit plan-year boundary (`plan_year_coverage_end`) used to determine whether the plan year itself has ended, the date the enrollment record was created (`issued_date`, the value Ops labels Issued on, reported for every row whatever the member answered), the window the member could answer in -- which never opens before the enrollment was issued, so a row issued mid-open-enrollment starts its window on its issue date -- whether a qualifying life event would currently be required for reissue under the product/open-enrollment rule, enrollment/open-enrollment window, and two statuses: `election_status` (what the member answered) and `policy_status` (what became of their coverage, null unless they enrolled). Every row includes a stable enrollment ID and the exact employer and benefit plan-year IDs used to fetch that row's plan-year detail. The full list is returned across all states so the client derives active plans (effective and upcoming) and the enrollment history from those per-row statuses. For an organization caller the rows are scoped to companies in that organization's book; a member (self/household) or Vitable Admin sees all enrollments. A member not visible to the caller returns a 404. -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```ruby -client.members.list_enrollments(member_id: "mbr_abc123def456") -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**member_id:** `String` - -
-
- -
-
- -**request_options:** `VitableConnect::Members::RequestOptions` - -
-
-
-
- - -
-
-
- -
client.members.get_household(member_id:) -> VitableConnect::Types::HouseholdMembersResponse -
-
- -#### 📝 Description - -
-
- -
-
- -Lists a member's household as a per-participant table — the account holder plus each active household member, with name, relationship, member type, date of birth, and household-admin flag. Access is scoped to the authenticated principal; a member not visible to the caller (or with no household) returns a 404. -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```ruby -client.members.get_household(member_id: "mbr_abc123def456") -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**member_id:** `String` - -
-
- -
-
- -**request_options:** `VitableConnect::Members::RequestOptions` - -
-
-
-
- - -
-
-
- -
client.members.list_id_cards(member_id:) -> VitableConnect::Types::MemberDigitalBenefitCardsResponse -
-
- -#### 📝 Description - -
-
- -
-
- -Lists a member's benefit ID cards — card type (medical, dental, vision, or rx), employer, plan, provider network, claims payer, carrier contact details, and the disclaimers printed on the card. Medical, dental and vision cards come from the member's active digital benefit cards; the rx card from the member's Ventegra pharmacy benefit (omitted when the member has no free-medication coverage), which carries no plan, network, or carrier details. Access is scoped to the authenticated principal, and an organization caller sees only cards from employers in its book; a member not visible to the caller returns a 404. -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```ruby -client.members.list_id_cards(member_id: "mbr_abc123def456") -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**member_id:** `String` - -
-
- -
-
- -**request_options:** `VitableConnect::Members::RequestOptions` - -
-
-
-
- - -
-
-
- -
client.members.list_qualifying_life_events(member_id:) -> VitableConnect::Types::MemberQualifyingLifeEventListResponse -
-
- -#### 📝 Description - -
-
- -
-
- -Lists a member's qualifying life events, including events already used for another enrollment. Returns all statuses by default; pass the status query param to filter to one (e.g. approved). Events are ordered newest submission first with stable paging. Custom text is present only when submitted and is otherwise null. A member not visible to the caller returns a 404. API keys and unbound access tokens have organization-wide access. Employer-bound tokens require employment at the bound employer, and employee-bound tokens require the exact employee-member relationship. Organization or scope mismatches return a 404 before pagination is validated. -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```ruby -client.members.list_qualifying_life_events( - member_id: "mbr_abc123def456", - limit: 20, - page: 1 -) -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**member_id:** `String` — Unique member identifier (mbr_*) - -
-
- -
-
- -**limit:** `Integer` — Items per page (default: 20, max: 100) - -
-
- -
-
- -**page:** `Integer` — Page number (default: 1) - -
-
- -
-
- -**status:** `VitableConnect::Types::Status` — Optional. Filter to a single QLE status; omit to return all statuses. - -
-
- -
-
- -**request_options:** `VitableConnect::Members::RequestOptions` - -
-
-
-
- - -
-
-
- -
client.members.list() -> VitableConnect::Types::MemberListResponse -
-
- -#### 📝 Description - -
-
- -
-
- -Retrieves a paginated list of the members in the authenticated organization's book — identity, contact details, and address. The book covers members reached through an employer in the organization's book as well as members of a group it owns. Supports free-text search (name, email, phone number, or exact member id). -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```ruby -client.members.list( - limit: 20, - page: 1 -) -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**limit:** `Integer` — Items per page (default: 20, max: 100) - -
-
- -
-
- -**page:** `Integer` — Page number (default: 1) - -
-
- -
-
- -**search:** `String` — Case-insensitive search across member name, email, and phone number; exact match on member id (prefixed or raw uuid) - -
-
- -
-
- -**request_options:** `VitableConnect::Members::RequestOptions` - -
-
-
-
- - -
-
-
- -## Organizations -
client.organizations.list() -> VitableConnect::Types::OrganizationsListResponse -
-
- -#### 📝 Description - -
-
- -
-
- -Lists the organizations the authenticated caller is an active member of (paginated). Returns an empty list when the caller belongs to no organizations. -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```ruby -client.organizations.list -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request_options:** `VitableConnect::Organizations::RequestOptions` - -
-
-
-
- - -
-
-
- -
client.organizations.create(request) -> VitableConnect::Types::Organization -
-
- -#### 📝 Description - -
-
- -
-
- -Onboards the authenticated user's partner Organization: creates the local Organization + the creator's admin membership atomically, then mirrors it to WorkOS (creates the WorkOS org and binds the creator as admin). 409 `organization_already_exists` when the user already has an organization (v0: one organization per user). -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```ruby -client.organizations.create( - name: "Acme Brokerage", - type: "BROKERAGE" -) -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**name:** `String` — Legal or trading name of the organization. - -
-
- -
-
- -**type:** `VitableConnect::Types::CreateOrganizationRequestType` — Category of organization being onboarded. - -
-
- -
-
- -**request_options:** `VitableConnect::Organizations::RequestOptions` - -
-
-
-
- - -
-
-
- -## Plans -
client.plans.list() -> VitableConnect::Types::PlanListResponse -
-
- -#### 📝 Description - -
-
- -
-
- -Returns a paginated list of benefit plans linked to the authenticated organization. -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```ruby -client.plans.list( - limit: 20, - page: 1 -) -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**limit:** `Integer` — Items per page (default: 20, max: 100) - -
-
- -
-
- -**page:** `Integer` — Page number (default: 1) - -
-
- -
-
- -**request_options:** `VitableConnect::Plans::RequestOptions` - -
-
-
-
- - -
-
-
- -## Webhook Events -
client.webhook_events.list() -> VitableConnect::Types::WebhookEventListResponse -
-
- -#### 📝 Description - -
-
- -
-
- -Retrieves a paginated list of webhook events for the authenticated organization. Supports filtering by event name, resource type, resource ID, and date range. -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```ruby -client.webhook_events.list( - limit: 20, - page: 1 -) -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**created_after:** `String` - -
-
- -
-
- -**created_before:** `String` - -
-
- -
-
- -**event_name:** `VitableConnect::Types::EventName` - -* `enrollment.accepted` - Enrollment Accepted -* `enrollment.terminated` - Enrollment Terminated -* `enrollment.termination_rescheduled` - Enrollment Termination Rescheduled -* `enrollment.elected` - Enrollment Elected -* `enrollment.granted` - Enrollment Granted -* `enrollment.waived` - Enrollment Waived -* `enrollment.started` - Enrollment Started -* `employee.eligibility_granted` - Employee Eligibility Granted -* `employee.eligibility_terminated` - Employee Eligibility Terminated -* `employee.deactivated` - Employee Deactivated -* `employee.deduction_created` - Employee Deduction Created - -
-
- -
-
- -**limit:** `Integer` - -
-
- -
-
- -**page:** `Integer` - -
-
- -
-
- -**resource_id:** `String` - -
-
- -
-
- -**resource_type:** `VitableConnect::Types::ResourceType` - -* `enrollment` - Enrollment -* `employee` - Employee -* `employer` - Employer -* `dependent` - Dependent -* `plan_year` - Plan Year -* `payroll_deduction` - Payroll Deduction - -
-
- -
-
- -**request_options:** `VitableConnect::WebhookEvents::RequestOptions` - -
-
-
-
- - -
-
-
- -
client.webhook_events.get(event_id:) -> VitableConnect::Types::WebhookEventResponse -
-
- -#### 📝 Description - -
-
- -
-
- -Retrieves a single webhook event by its prefixed ID. Returns 404 if the event does not exist or belongs to a different organization. -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```ruby -client.webhook_events.get(event_id: "event_id") -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**event_id:** `String` - -
-
- -
-
- -**request_options:** `VitableConnect::WebhookEvents::RequestOptions` - -
-
-
-
- - -
-
-
- -
client.webhook_events.list_deliveries(event_id:) -> VitableConnect::Types::ListWebhookEventDeliveriesResponse -
-
- -#### 📝 Description - -
-
- -
-
- -Retrieves all delivery attempts for a webhook event. Returns up to 100 deliveries. Each delivery includes a computed status field (Pending, In Progress, Delivered, or Failed). -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```ruby -client.webhook_events.list_deliveries(event_id: "event_id") -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**event_id:** `String` - -
-
- -
-
- -**request_options:** `VitableConnect::WebhookEvents::RequestOptions` - -
-
-
-
- - -
-
-
- -## Groups Members Sync -
client.groups.members.sync.submit(group_id:, request) -> VitableConnect::Types::GroupMemberSyncDetailResponse -
-
- -#### 📝 Description - -
-
- -
-
- -Submits a member sync payload for the specified group. Members in the payload will be queued for processing asynchronously. Returns HTTP 202 with the batch ID and acceptance timestamp. -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```ruby -client.groups.members.sync.submit( - group_id: "grp_abc123def456", - members: [{ - reference_id: "EMP-001", - first_name: "Jane", - last_name: "Doe", - date_of_birth: "1990-05-15", - phone: "4155550100", - plan_id: "pln_abc123def456", - address: { - address_line1: "123 Main Street", - address_line2: "Apt 4B", - city: "San Francisco", - state: "CA", - zipcode: "94102" - }, - email: "jane.doe@acme.com" - }] -) -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**group_id:** `String` - -
-
- -
-
- -**members:** `Internal::Types::Array[VitableConnect::Types::GroupMemberSyncMemberRequest]` - -
-
- -
-
- -**request_options:** `VitableConnect::Groups::Members::Sync::RequestOptions` - -
-
-
-
- - -
-
-
- -
client.groups.members.sync.get(group_id:, request_id:) -> VitableConnect::Types::GroupMemberSyncRequestDetailResponse -
-
- -#### 📝 Description - -
-
- -
-
- -Retrieves a previously-submitted group member sync request by its `grpmsr_` ID. Returns the acceptance timestamp, completion timestamp (if processing has finished), and the per-member `results` once available. While processing is in flight, `completed_at` and `results` are `null`. -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```ruby -client.groups.members.sync.get( - group_id: "grp_abc123def456", - request_id: "request_id" -) -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**group_id:** `String` - -
-
- -
-
- -**request_id:** `String` - -
-
- -
-
- -**request_options:** `VitableConnect::Groups::Members::Sync::RequestOptions` - -
-
-
-
- - -
-
-
- diff --git a/release-please-config.json b/release-please-config.json new file mode 100644 index 0000000..9ca3204 --- /dev/null +++ b/release-please-config.json @@ -0,0 +1,70 @@ +{ + "packages": { + ".": {} + }, + "$schema": "https://raw.githubusercontent.com/stainless-api/release-please/main/schemas/config.json", + "include-v-in-tag": true, + "include-component-in-tag": false, + "versioning": "prerelease", + "prerelease": true, + "bump-minor-pre-major": true, + "bump-patch-for-minor-pre-major": false, + "pull-request-header": "Automated Release PR", + "pull-request-title-pattern": "release: ${version}", + "changelog-sections": [ + { + "type": "feat", + "section": "Features" + }, + { + "type": "fix", + "section": "Bug Fixes" + }, + { + "type": "perf", + "section": "Performance Improvements" + }, + { + "type": "revert", + "section": "Reverts" + }, + { + "type": "chore", + "section": "Chores" + }, + { + "type": "docs", + "section": "Documentation" + }, + { + "type": "style", + "section": "Styles" + }, + { + "type": "refactor", + "section": "Refactors" + }, + { + "type": "test", + "section": "Tests", + "hidden": true + }, + { + "type": "build", + "section": "Build System" + }, + { + "type": "ci", + "section": "Continuous Integration", + "hidden": true + } + ], + "release-type": "ruby", + "version-file": "lib/vitable_connect/version.rb", + "extra-files": [ + { + "type": "ruby-readme", + "path": "README.md" + } + ] +} \ No newline at end of file diff --git a/scripts/bootstrap b/scripts/bootstrap new file mode 100755 index 0000000..a5e1b80 --- /dev/null +++ b/scripts/bootstrap @@ -0,0 +1,24 @@ +#!/usr/bin/env bash + +set -e + +cd -- "$(dirname -- "$0")/.." + +if [ -f "Brewfile" ] && [ "$(uname -s)" = "Darwin" ] && [ "${SKIP_BREW:-}" != "1" ] && [ -t 0 ]; then + brew bundle check >/dev/null 2>&1 || { + echo -n "==> Install Homebrew dependencies? (y/N): " + read -r response + case "$response" in + [yY][eE][sS]|[yY]) + brew bundle + ;; + *) + ;; + esac + echo + } +fi + +echo "==> Installing Ruby dependencies…" + +exec -- bundle install "$@" diff --git a/scripts/fast-format b/scripts/fast-format new file mode 100755 index 0000000..6d5973f --- /dev/null +++ b/scripts/fast-format @@ -0,0 +1,18 @@ +#!/usr/bin/env bash + +set -euo pipefail + +echo "Script started with $# arguments" +echo "Arguments: $*" +echo "Script location: $(dirname "$0")" + +cd -- "$(dirname "$0")/.." +echo "Changed to directory: $PWD" + +if [ $# -eq 0 ]; then + echo "Usage: $0 [additional-formatter-args...]" + echo "The file should contain one file path per line" + exit 1 +fi + +exec -- bundle exec rake format FORMAT_FILE="$1" diff --git a/scripts/format b/scripts/format new file mode 100755 index 0000000..177d1e6 --- /dev/null +++ b/scripts/format @@ -0,0 +1,9 @@ +#!/usr/bin/env bash + +set -e + +cd -- "$(dirname -- "$0")/.." + +echo "==> Running formatters" + +exec -- bundle exec rake format "$@" diff --git a/scripts/lint b/scripts/lint new file mode 100755 index 0000000..08b0dbe --- /dev/null +++ b/scripts/lint @@ -0,0 +1,9 @@ +#!/usr/bin/env bash + +set -e + +cd -- "$(dirname -- "$0")/.." + +echo "==> Running linters" + +exec -- bundle exec rake lint "$@" diff --git a/scripts/test b/scripts/test new file mode 100755 index 0000000..df8caf9 --- /dev/null +++ b/scripts/test @@ -0,0 +1,10 @@ +#!/usr/bin/env bash + +set -e + +cd -- "$(dirname -- "$0")/.." + + + +echo "==> Running tests" +bundle exec rake test "$@" diff --git a/scripts/utils/upload-artifact.sh b/scripts/utils/upload-artifact.sh new file mode 100755 index 0000000..bb4a74f --- /dev/null +++ b/scripts/utils/upload-artifact.sh @@ -0,0 +1,113 @@ +#!/usr/bin/env bash + +set -euo pipefail + +# ANSI Color Codes +GREEN='\033[32m' +RED='\033[31m' +NC='\033[0m' # No Color + +DIST_DIR="dist" + +log_error() { + local msg="$1" + local headers="$2" + local body="$3" + echo -e "${RED}${msg}${NC}" + [[ -f "$headers" ]] && echo -e "${RED}Headers:$(cat "$headers")${NC}" + echo -e "${RED}Body: ${body}${NC}" + exit 1 +} + +upload_file() { + local file_name="$1" + local tmp_headers + tmp_headers=$(mktemp) + + if [ -f "$file_name" ]; then + echo -e "${GREEN}Processing file: $file_name${NC}" + pkg_file_name="${file_name#"${DIST_DIR}/"}" + + # Get signed URL for uploading artifact file + signed_url_response=$(curl -X POST -G "$URL" \ + -sS --retry 5 \ + -D "$tmp_headers" \ + --data-urlencode "filename=$pkg_file_name" \ + -H "Authorization: Bearer $AUTH" \ + -H "Content-Type: application/json") + + # Validate JSON and extract URL + if ! signed_url=$(echo "$signed_url_response" | jq -e -r '.url' 2>/dev/null) || [[ "$signed_url" == "null" ]]; then + log_error "Failed to get valid signed URL" "$tmp_headers" "$signed_url_response" + fi + + # Set content-type based on file extension + local extension="${file_name##*.}" + local content_type + case "$extension" in + gem) content_type="application/octet-stream" ;; + gz) content_type="application/gzip" ;; + rz) content_type="application/octet-stream" ;; + html) content_type="text/html" ;; + *) content_type="application/octet-stream" ;; + esac + + # Upload file + upload_response=$(curl -v -X PUT \ + --retry 5 \ + --retry-all-errors \ + -D "$tmp_headers" \ + -H "Content-Type: $content_type" \ + --data-binary "@${file_name}" "$signed_url" 2>&1) + + if ! echo "$upload_response" | grep -q "HTTP/[0-9.]* 200"; then + log_error "Failed to upload artifact file" "$tmp_headers" "$upload_response" + fi + + # Insert small throttle to reduce rate limiting risk + sleep 0.1 + fi +} + +walk_tree() { + local current_dir="$1" + + for entry in "$current_dir"/*; do + # Check that entry is valid + [ -e "$entry" ] || [ -h "$entry" ] || continue + + if [ -d "$entry" ]; then + walk_tree "$entry" + else + upload_file "$entry" + fi + done +} + +cd "$(dirname "$0")/../.." + +echo "::group::Building gem" +VERSION_FILE="lib/${PACKAGE_NAME}/version.rb" +if [[ ! -f "$VERSION_FILE" ]]; then + echo -e "${RED}Version file not found: ${VERSION_FILE}${NC}" + exit 1 +fi +SHORT_SHA="${SHA:0:7}" +sed -i.bak -E "s/(VERSION = \"[^\"]+)\"/\1.beta.${SHORT_SHA}\"/" "$VERSION_FILE" +rm -f "${VERSION_FILE}.bak" + +gem build +mkdir -p "${DIST_DIR}/gems" +mv ./*.gem "${DIST_DIR}/gems/" +echo "::endgroup::" + +echo "::group::Generating gem index" +gem generate_index --directory "$DIST_DIR" +echo "::endgroup::" + +echo "::group::Uploading to pkg.stainless.com" +walk_tree "$DIST_DIR" +echo "::endgroup::" + +echo -e "${GREEN}Gem artifacts uploaded to Stainless storage.${NC}" +echo -e "\033[32mInstallation: bundle remove vitable-connect && bundle add vitable-connect --source 'https://pkg.stainless.com/s/vitable-connect-ruby/$SHA'\033[0m" diff --git a/sig/vitable_connect/client.rbs b/sig/vitable_connect/client.rbs new file mode 100644 index 0000000..676f76e --- /dev/null +++ b/sig/vitable_connect/client.rbs @@ -0,0 +1,52 @@ +module VitableConnect + class Client < VitableConnect::Internal::Transport::BaseClient + DEFAULT_MAX_RETRIES: 2 + + DEFAULT_TIMEOUT_IN_SECONDS: Float + + DEFAULT_INITIAL_RETRY_DELAY: Float + + DEFAULT_MAX_RETRY_DELAY: Float + + ENVIRONMENTS: { + production: "https://api.vitablehealth.com", + :environment_1 => "https://api.uat.vitablehealth.com" + } + + attr_reader api_key: String + + attr_reader auth: VitableConnect::Resources::Auth + + attr_reader employees: VitableConnect::Resources::Employees + + attr_reader employers: VitableConnect::Resources::Employers + + attr_reader enrollments: VitableConnect::Resources::Enrollments + + attr_reader webhook_events: VitableConnect::Resources::WebhookEvents + + attr_reader groups: VitableConnect::Resources::Groups + + attr_reader members: VitableConnect::Resources::Members + + attr_reader organizations: VitableConnect::Resources::Organizations + + attr_reader plans: VitableConnect::Resources::Plans + + private def auth_headers: ( + security: { api_key_auth: bool } + ) -> ::Hash[String, String] + + private def api_key_auth: -> ::Hash[String, String] + + def initialize: ( + ?api_key: String?, + ?environment: :production | :environment_1 | nil, + ?base_url: String?, + ?max_retries: Integer, + ?timeout: Float, + ?initial_retry_delay: Float, + ?max_retry_delay: Float + ) -> void + end +end diff --git a/sig/vitable_connect/errors.rbs b/sig/vitable_connect/errors.rbs new file mode 100644 index 0000000..fc8a732 --- /dev/null +++ b/sig/vitable_connect/errors.rbs @@ -0,0 +1,117 @@ +module VitableConnect + module Errors + class Error < StandardError + attr_accessor cause: StandardError? + end + + class ConversionError < VitableConnect::Errors::Error + def cause: -> StandardError? + + def initialize: ( + on: Class, + method: Symbol, + target: top, + value: top, + ?cause: StandardError? + ) -> void + end + + class APIError < VitableConnect::Errors::Error + attr_accessor url: URI::Generic + + attr_accessor status: Integer? + + attr_accessor headers: ::Hash[String, String]? + + attr_accessor body: top? + + def initialize: ( + url: URI::Generic, + ?status: Integer?, + ?headers: ::Hash[String, String]?, + ?body: Object?, + ?request: nil, + ?response: nil, + ?message: String? + ) -> void + end + + class APIConnectionError < VitableConnect::Errors::APIError + def initialize: ( + url: URI::Generic, + ?status: nil, + ?headers: ::Hash[String, String]?, + ?body: nil, + ?request: nil, + ?response: nil, + ?message: String? + ) -> void + end + + class APITimeoutError < VitableConnect::Errors::APIConnectionError + def initialize: ( + url: URI::Generic, + ?status: nil, + ?headers: ::Hash[String, String]?, + ?body: nil, + ?request: nil, + ?response: nil, + ?message: String? + ) -> void + end + + class APIStatusError < VitableConnect::Errors::APIError + def self.for: ( + url: URI::Generic, + status: Integer, + headers: ::Hash[String, String]?, + body: Object?, + request: nil, + response: nil, + ?message: String? + ) -> instance + + def initialize: ( + url: URI::Generic, + status: Integer, + headers: ::Hash[String, String]?, + body: Object?, + request: nil, + response: nil, + ?message: String? + ) -> void + end + + class BadRequestError < VitableConnect::Errors::APIStatusError + HTTP_STATUS: 400 + end + + class AuthenticationError < VitableConnect::Errors::APIStatusError + HTTP_STATUS: 401 + end + + class PermissionDeniedError < VitableConnect::Errors::APIStatusError + HTTP_STATUS: 403 + end + + class NotFoundError < VitableConnect::Errors::APIStatusError + HTTP_STATUS: 404 + end + + class ConflictError < VitableConnect::Errors::APIStatusError + HTTP_STATUS: 409 + end + + class UnprocessableEntityError < VitableConnect::Errors::APIStatusError + HTTP_STATUS: 422 + end + + class RateLimitError < VitableConnect::Errors::APIStatusError + HTTP_STATUS: 429 + end + + class InternalServerError < VitableConnect::Errors::APIStatusError + HTTP_STATUS: Range[Integer] + end + end +end diff --git a/sig/vitable_connect/file_part.rbs b/sig/vitable_connect/file_part.rbs new file mode 100644 index 0000000..0cfd266 --- /dev/null +++ b/sig/vitable_connect/file_part.rbs @@ -0,0 +1,21 @@ +module VitableConnect + class FilePart + attr_reader content: Pathname | StringIO | IO | String + + attr_reader content_type: String? + + attr_reader filename: String? + + private def read: -> String + + def to_json: (*top a) -> String + + def to_yaml: (*top a) -> String + + def initialize: ( + Pathname | StringIO | IO | String content, + ?filename: (Pathname | String)?, + ?content_type: String? + ) -> void + end +end diff --git a/sig/vitable_connect/internal.rbs b/sig/vitable_connect/internal.rbs new file mode 100644 index 0000000..f28470b --- /dev/null +++ b/sig/vitable_connect/internal.rbs @@ -0,0 +1,10 @@ +module VitableConnect + module Internal + extend VitableConnect::Internal::Util::SorbetRuntimeSupport + + type file_input = + Pathname | StringIO | IO | String | VitableConnect::FilePart + + OMIT: Object + end +end diff --git a/sig/vitable_connect/internal/page_number_page.rbs b/sig/vitable_connect/internal/page_number_page.rbs new file mode 100644 index 0000000..029bee2 --- /dev/null +++ b/sig/vitable_connect/internal/page_number_page.rbs @@ -0,0 +1,28 @@ +module VitableConnect + module Internal + class PageNumberPage[Elem] + include VitableConnect::Internal::Type::BasePage[Elem] + + attr_accessor data: ::Array[Elem]? + + attr_accessor pagination: Pagination + + def inspect: -> String + + type pagination = { page: Integer, total_pages: Integer } + class Pagination < VitableConnect::Internal::Type::BaseModel + attr_reader page: Integer? + + def page=: (Integer) -> Integer + + attr_reader total_pages: Integer? + + def total_pages=: (Integer) -> Integer + + def initialize: (?page: Integer, ?total_pages: Integer) -> void + + def to_hash: -> { page: Integer, total_pages: Integer } + end + end + end +end diff --git a/sig/vitable_connect/internal/transport/base_client.rbs b/sig/vitable_connect/internal/transport/base_client.rbs new file mode 100644 index 0000000..25c2f78 --- /dev/null +++ b/sig/vitable_connect/internal/transport/base_client.rbs @@ -0,0 +1,135 @@ +module VitableConnect + module Internal + module Transport + class BaseClient + extend VitableConnect::Internal::Util::SorbetRuntimeSupport + + type request_components = + { + method: Symbol, + path: String | ::Array[String], + query: ::Hash[String, (::Array[String] | String)?]?, + headers: ::Hash[String, (String + | Integer + | ::Array[(String | Integer)?])?]?, + body: top?, + unwrap: (Symbol + | Integer + | ::Array[(Symbol | Integer)] + | (^(top arg0) -> top))?, + page: Class?, + stream: Class?, + model: VitableConnect::Internal::Type::Converter::input?, + security: { api_key_auth: bool }?, + options: VitableConnect::request_opts? + } + type request_input = + { + method: Symbol, + url: URI::Generic, + headers: ::Hash[String, String], + body: top, + max_retries: Integer, + timeout: Float + } + + MAX_REDIRECTS: 20 + + PLATFORM_HEADERS: ::Hash[String, String] + + def self.validate!: ( + VitableConnect::Internal::Transport::BaseClient::request_components req + ) -> void + + def self.should_retry?: ( + Integer status, + headers: ::Hash[String, String] + ) -> bool + + def self.follow_redirect: ( + VitableConnect::Internal::Transport::BaseClient::request_input request, + status: Integer, + response_headers: ::Hash[String, String] + ) -> VitableConnect::Internal::Transport::BaseClient::request_input + + def self.reap_connection!: ( + Integer | VitableConnect::Errors::APIConnectionError status, + stream: Enumerable[String]? + ) -> void + + attr_reader base_url: URI::Generic + + attr_reader timeout: Float + + attr_reader max_retries: Integer + + attr_reader initial_retry_delay: Float + + attr_reader max_retry_delay: Float + + attr_reader headers: ::Hash[String, String] + + attr_reader idempotency_header: String? + + # @api private + attr_reader requester: VitableConnect::Internal::Transport::PooledNetRequester + + def initialize: ( + base_url: String, + ?timeout: Float, + ?max_retries: Integer, + ?initial_retry_delay: Float, + ?max_retry_delay: Float, + ?headers: ::Hash[String, (String + | Integer + | ::Array[(String | Integer)?])?], + ?idempotency_header: String? + ) -> void + + private def auth_headers: -> ::Hash[String, String] + + private def user_agent: -> String + + private def generate_idempotency_key: -> String + + private def build_request: ( + VitableConnect::Internal::Transport::BaseClient::request_components req, + VitableConnect::request_options opts + ) -> VitableConnect::Internal::Transport::BaseClient::request_input + + private def retry_delay: ( + ::Hash[String, String] headers, + retry_count: Integer + ) -> Float + + def send_request: ( + VitableConnect::Internal::Transport::BaseClient::request_input request, + redirect_count: Integer, + retry_count: Integer, + send_retry_header: bool + ) -> [Integer, top, Enumerable[String]] + + def request: ( + Symbol method, + String | ::Array[String] path, + ?query: ::Hash[String, (::Array[String] | String)?]?, + ?headers: ::Hash[String, (String + | Integer + | ::Array[(String | Integer)?])?]?, + ?body: top?, + ?unwrap: (Symbol + | Integer + | ::Array[(Symbol | Integer)] + | (^(top arg0) -> top))?, + ?page: Class?, + ?stream: Class?, + ?model: VitableConnect::Internal::Type::Converter::input?, + ?security: { api_key_auth: bool }?, + ?options: VitableConnect::request_opts? + ) -> top + + def inspect: -> String + end + end + end +end diff --git a/sig/vitable_connect/internal/transport/pooled_net_requester.rbs b/sig/vitable_connect/internal/transport/pooled_net_requester.rbs new file mode 100644 index 0000000..e0b5745 --- /dev/null +++ b/sig/vitable_connect/internal/transport/pooled_net_requester.rbs @@ -0,0 +1,48 @@ +module VitableConnect + module Internal + module Transport + class PooledNetRequester + extend VitableConnect::Internal::Util::SorbetRuntimeSupport + + type request = + { + method: Symbol, + url: URI::Generic, + headers: ::Hash[String, String], + body: top, + deadline: Float + } + + KEEP_ALIVE_TIMEOUT: 30 + + DEFAULT_MAX_CONNECTIONS: Integer + + def self.connect: ( + cert_store: OpenSSL::X509::Store, + url: URI::Generic + ) -> top + + def self.calibrate_socket_timeout: (top conn, Float deadline) -> void + + def self.build_request: ( + VitableConnect::Internal::Transport::PooledNetRequester::request request + ) { + (String arg0) -> void + } -> [top, (^-> void)] + + private def with_pool: ( + URI::Generic url, + deadline: Float + ) { + (top arg0) -> void + } -> void + + def execute: ( + VitableConnect::Internal::Transport::PooledNetRequester::request request + ) -> [Integer, top, Enumerable[String]] + + def initialize: (?size: Integer) -> void + end + end + end +end diff --git a/sig/vitable_connect/internal/type/array_of.rbs b/sig/vitable_connect/internal/type/array_of.rbs new file mode 100644 index 0000000..34b7b41 --- /dev/null +++ b/sig/vitable_connect/internal/type/array_of.rbs @@ -0,0 +1,48 @@ +module VitableConnect + module Internal + module Type + class ArrayOf[Elem] + include VitableConnect::Internal::Type::Converter + include VitableConnect::Internal::Util::SorbetRuntimeSupport + + def self.[]: ( + ::Hash[Symbol, top] + | ^-> VitableConnect::Internal::Type::Converter::input + | VitableConnect::Internal::Type::Converter::input type_info, + ?::Hash[Symbol, top] spec + ) -> instance + + def ===: (top other) -> bool + + def ==: (top other) -> bool + + def hash: -> Integer + + def coerce: ( + ::Array[top] | top value, + state: VitableConnect::Internal::Type::Converter::coerce_state + ) -> (::Array[top] | top) + + def dump: ( + ::Array[top] | top value, + state: VitableConnect::Internal::Type::Converter::dump_state + ) -> (::Array[top] | top) + + def to_sorbet_type: -> top + + def item_type: -> Elem + + def nilable?: -> bool + + def initialize: ( + ::Hash[Symbol, top] + | ^-> VitableConnect::Internal::Type::Converter::input + | VitableConnect::Internal::Type::Converter::input type_info, + ?::Hash[Symbol, top] spec + ) -> void + + def inspect: (?depth: Integer) -> String + end + end + end +end diff --git a/sig/vitable_connect/internal/type/base_model.rbs b/sig/vitable_connect/internal/type/base_model.rbs new file mode 100644 index 0000000..47e6030 --- /dev/null +++ b/sig/vitable_connect/internal/type/base_model.rbs @@ -0,0 +1,104 @@ +module VitableConnect + module Internal + module Type + class BaseModel + extend VitableConnect::Internal::Type::Converter + extend VitableConnect::Internal::Util::SorbetRuntimeSupport + + type known_field = + { mode: (:coerce | :dump)?, required: bool, nilable: bool } + + def self.inherited: (self child) -> void + + def self.known_fields: -> ::Hash[Symbol, (VitableConnect::Internal::Type::BaseModel::known_field + & { type_fn: (^-> VitableConnect::Internal::Type::Converter::input) })] + + def self.fields: -> ::Hash[Symbol, (VitableConnect::Internal::Type::BaseModel::known_field + & { type: VitableConnect::Internal::Type::Converter::input })] + + private def self.add_field: ( + Symbol name_sym, + required: bool, + type_info: { + const: (nil | bool | Integer | Float | Symbol)?, + enum: ^-> VitableConnect::Internal::Type::Converter::input?, + union: ^-> VitableConnect::Internal::Type::Converter::input?, + api_name: Symbol + } + | ^-> VitableConnect::Internal::Type::Converter::input + | VitableConnect::Internal::Type::Converter::input, + spec: ::Hash[Symbol, top] + ) -> void + + def self.required: ( + Symbol name_sym, + ::Hash[Symbol, top] + | ^-> VitableConnect::Internal::Type::Converter::input + | VitableConnect::Internal::Type::Converter::input type_info, + ?::Hash[Symbol, top] spec + ) -> void + + def self.optional: ( + Symbol name_sym, + ::Hash[Symbol, top] + | ^-> VitableConnect::Internal::Type::Converter::input + | VitableConnect::Internal::Type::Converter::input type_info, + ?::Hash[Symbol, top] spec + ) -> void + + private def self.request_only: { -> void } -> void + + private def self.response_only: { -> void } -> void + + def self.==: (top other) -> bool + + def self.hash: -> Integer + + def ==: (top other) -> bool + + def hash: -> Integer + + def self.coerce: ( + VitableConnect::Internal::Type::BaseModel + | ::Hash[top, top] + | top value, + state: VitableConnect::Internal::Type::Converter::coerce_state + ) -> (instance | top) + + def self.dump: ( + instance | top value, + state: VitableConnect::Internal::Type::Converter::dump_state + ) -> (::Hash[top, top] | top) + + def self.to_sorbet_type: -> top + + def self.recursively_to_h: ( + VitableConnect::Internal::Type::BaseModel model, + convert: bool + ) -> ::Hash[Symbol, top] + + def []: (Symbol key) -> top? + + def to_h: -> ::Hash[Symbol, top] + + alias to_hash to_h + + def deep_to_h: -> ::Hash[Symbol, top] + + def deconstruct_keys: (::Array[Symbol]? keys) -> ::Hash[Symbol, top] + + def to_json: (*top a) -> String + + def to_yaml: (*top a) -> String + + def initialize: (?::Hash[Symbol, top] | instance data) -> void + + def self.inspect: (?depth: Integer) -> String + + def to_s: -> String + + def inspect: -> String + end + end + end +end diff --git a/sig/vitable_connect/internal/type/base_page.rbs b/sig/vitable_connect/internal/type/base_page.rbs new file mode 100644 index 0000000..b98ebc6 --- /dev/null +++ b/sig/vitable_connect/internal/type/base_page.rbs @@ -0,0 +1,24 @@ +module VitableConnect + module Internal + module Type + module BasePage[Elem] + def next_page?: -> bool + + def next_page: -> instance + + def auto_paging_each: { (Elem arg0) -> void } -> void + + def to_enum: -> Enumerable[Elem] + + alias enum_for to_enum + + def initialize: ( + client: VitableConnect::Internal::Transport::BaseClient, + req: VitableConnect::Internal::Transport::BaseClient::request_components, + headers: ::Hash[String, String], + page_data: top + ) -> void + end + end + end +end diff --git a/sig/vitable_connect/internal/type/boolean.rbs b/sig/vitable_connect/internal/type/boolean.rbs new file mode 100644 index 0000000..92570fd --- /dev/null +++ b/sig/vitable_connect/internal/type/boolean.rbs @@ -0,0 +1,26 @@ +module VitableConnect + module Internal + module Type + class Boolean + extend VitableConnect::Internal::Type::Converter + extend VitableConnect::Internal::Util::SorbetRuntimeSupport + + def self.===: (top other) -> bool + + def self.==: (top other) -> bool + + def self.coerce: ( + bool | top value, + state: VitableConnect::Internal::Type::Converter::coerce_state + ) -> (bool | top) + + def self.dump: ( + bool | top value, + state: VitableConnect::Internal::Type::Converter::dump_state + ) -> (bool | top) + + def self.to_sorbet_type: -> top + end + end + end +end diff --git a/sig/vitable_connect/internal/type/converter.rbs b/sig/vitable_connect/internal/type/converter.rbs new file mode 100644 index 0000000..ef4c62d --- /dev/null +++ b/sig/vitable_connect/internal/type/converter.rbs @@ -0,0 +1,79 @@ +module VitableConnect + module Internal + module Type + module Converter + extend VitableConnect::Internal::Util::SorbetRuntimeSupport + + type input = VitableConnect::Internal::Type::Converter | Class + + type coerce_state = + { + translate_names: bool, + strictness: bool, + exactness: { yes: Integer, no: Integer, maybe: Integer }, + error: Class, + branched: Integer + } + + type dump_state = { can_retry: bool } + + def coerce: ( + top value, + state: VitableConnect::Internal::Type::Converter::coerce_state + ) -> top + + def dump: ( + top value, + state: VitableConnect::Internal::Type::Converter::dump_state + ) -> top + + def inspect: (?depth: Integer) -> String + + def self.type_info: ( + { + const: (nil | bool | Integer | Float | Symbol)?, + enum: ^-> VitableConnect::Internal::Type::Converter::input?, + union: ^-> VitableConnect::Internal::Type::Converter::input? + } + | ^-> VitableConnect::Internal::Type::Converter::input + | VitableConnect::Internal::Type::Converter::input spec + ) -> (^-> top) + + def self.meta_info: ( + { + const: (nil | bool | Integer | Float | Symbol)?, + enum: ^-> VitableConnect::Internal::Type::Converter::input?, + union: ^-> VitableConnect::Internal::Type::Converter::input? + } + | ^-> VitableConnect::Internal::Type::Converter::input + | VitableConnect::Internal::Type::Converter::input type_info, + { + const: (nil | bool | Integer | Float | Symbol)?, + enum: ^-> VitableConnect::Internal::Type::Converter::input?, + union: ^-> VitableConnect::Internal::Type::Converter::input? + } + | ^-> VitableConnect::Internal::Type::Converter::input + | VitableConnect::Internal::Type::Converter::input spec + ) -> ::Hash[Symbol, top] + + def self.new_coerce_state: ( + ?translate_names: bool + ) -> VitableConnect::Internal::Type::Converter::coerce_state + + def self.coerce: ( + VitableConnect::Internal::Type::Converter::input target, + top value, + ?state: VitableConnect::Internal::Type::Converter::coerce_state + ) -> top + + def self.dump: ( + VitableConnect::Internal::Type::Converter::input target, + top value, + ?state: VitableConnect::Internal::Type::Converter::dump_state + ) -> top + + def self.inspect: (top target, depth: Integer) -> String + end + end + end +end diff --git a/sig/vitable_connect/internal/type/enum.rbs b/sig/vitable_connect/internal/type/enum.rbs new file mode 100644 index 0000000..8cbe4e9 --- /dev/null +++ b/sig/vitable_connect/internal/type/enum.rbs @@ -0,0 +1,32 @@ +module VitableConnect + module Internal + module Type + module Enum + include VitableConnect::Internal::Type::Converter + include VitableConnect::Internal::Util::SorbetRuntimeSupport + + def self.values: -> ::Array[(nil | bool | Integer | Float | Symbol)] + + def ===: (top other) -> bool + + def ==: (top other) -> bool + + def hash: -> Integer + + def coerce: ( + String | Symbol | top value, + state: VitableConnect::Internal::Type::Converter::coerce_state + ) -> (Symbol | top) + + def dump: ( + Symbol | top value, + state: VitableConnect::Internal::Type::Converter::dump_state + ) -> (Symbol | top) + + def to_sorbet_type: -> top + + def inspect: (?depth: Integer) -> String + end + end + end +end diff --git a/sig/vitable_connect/internal/type/file_input.rbs b/sig/vitable_connect/internal/type/file_input.rbs new file mode 100644 index 0000000..854875c --- /dev/null +++ b/sig/vitable_connect/internal/type/file_input.rbs @@ -0,0 +1,25 @@ +module VitableConnect + module Internal + module Type + class FileInput + extend VitableConnect::Internal::Type::Converter + + def self.===: (top other) -> bool + + def self.==: (top other) -> bool + + def self.coerce: ( + StringIO | String | top value, + state: VitableConnect::Internal::Type::Converter::coerce_state + ) -> (StringIO | top) + + def self.dump: ( + Pathname | StringIO | IO | String | top value, + state: VitableConnect::Internal::Type::Converter::dump_state + ) -> (Pathname | StringIO | IO | String | top) + + def self.to_sorbet_type: -> top + end + end + end +end diff --git a/sig/vitable_connect/internal/type/hash_of.rbs b/sig/vitable_connect/internal/type/hash_of.rbs new file mode 100644 index 0000000..1fd0a2d --- /dev/null +++ b/sig/vitable_connect/internal/type/hash_of.rbs @@ -0,0 +1,48 @@ +module VitableConnect + module Internal + module Type + class HashOf[Elem] + include VitableConnect::Internal::Type::Converter + include VitableConnect::Internal::Util::SorbetRuntimeSupport + + def self.[]: ( + ::Hash[Symbol, top] + | ^-> VitableConnect::Internal::Type::Converter::input + | VitableConnect::Internal::Type::Converter::input type_info, + ?::Hash[Symbol, top] spec + ) -> instance + + def ===: (top other) -> bool + + def ==: (top other) -> bool + + def hash: -> Integer + + def coerce: ( + ::Hash[top, top] | top value, + state: VitableConnect::Internal::Type::Converter::coerce_state + ) -> (::Hash[Symbol, top] | top) + + def dump: ( + ::Hash[top, top] | top value, + state: VitableConnect::Internal::Type::Converter::dump_state + ) -> (::Hash[Symbol, top] | top) + + def to_sorbet_type: -> top + + def item_type: -> Elem + + def nilable?: -> bool + + def initialize: ( + ::Hash[Symbol, top] + | ^-> VitableConnect::Internal::Type::Converter::input + | VitableConnect::Internal::Type::Converter::input type_info, + ?::Hash[Symbol, top] spec + ) -> void + + def inspect: (?depth: Integer) -> String + end + end + end +end diff --git a/sig/vitable_connect/internal/type/request_parameters.rbs b/sig/vitable_connect/internal/type/request_parameters.rbs new file mode 100644 index 0000000..1f59452 --- /dev/null +++ b/sig/vitable_connect/internal/type/request_parameters.rbs @@ -0,0 +1,20 @@ +module VitableConnect + module Internal + module Type + type request_parameters = + { request_options: VitableConnect::request_opts } + + module RequestParameters + attr_reader request_options: VitableConnect::request_opts + + def request_options=: ( + VitableConnect::request_opts + ) -> VitableConnect::request_opts + + module Converter + def dump_request: (top params) -> [top, ::Hash[Symbol, top]] + end + end + end + end +end diff --git a/sig/vitable_connect/internal/type/union.rbs b/sig/vitable_connect/internal/type/union.rbs new file mode 100644 index 0000000..8770784 --- /dev/null +++ b/sig/vitable_connect/internal/type/union.rbs @@ -0,0 +1,52 @@ +module VitableConnect + module Internal + module Type + module Union + include VitableConnect::Internal::Type::Converter + include VitableConnect::Internal::Util::SorbetRuntimeSupport + + private def self.known_variants: -> ::Array[[Symbol?, (^-> VitableConnect::Internal::Type::Converter::input), ::Hash[Symbol, top]]] + + def self.derefed_variants: -> ::Array[[Symbol?, top, ::Hash[Symbol, top]]] + + def self.variants: -> ::Array[top] + + private def self.discriminator: (Symbol property) -> void + + private def self.variant: ( + Symbol + | ::Hash[Symbol, top] + | ^-> VitableConnect::Internal::Type::Converter::input + | VitableConnect::Internal::Type::Converter::input key, + ?::Hash[Symbol, top] + | ^-> VitableConnect::Internal::Type::Converter::input + | VitableConnect::Internal::Type::Converter::input spec + ) -> void + + private def self.resolve_variant: ( + top value + ) -> VitableConnect::Internal::Type::Converter::input? + + def ===: (top other) -> bool + + def ==: (top other) -> bool + + def hash: -> Integer + + def coerce: ( + top value, + state: VitableConnect::Internal::Type::Converter::coerce_state + ) -> top + + def dump: ( + top value, + state: VitableConnect::Internal::Type::Converter::dump_state + ) -> top + + def to_sorbet_type: -> top + + def inspect: (?depth: Integer) -> String + end + end + end +end diff --git a/sig/vitable_connect/internal/type/unknown.rbs b/sig/vitable_connect/internal/type/unknown.rbs new file mode 100644 index 0000000..326cdad --- /dev/null +++ b/sig/vitable_connect/internal/type/unknown.rbs @@ -0,0 +1,26 @@ +module VitableConnect + module Internal + module Type + class Unknown + extend VitableConnect::Internal::Type::Converter + extend VitableConnect::Internal::Util::SorbetRuntimeSupport + + def self.===: (top other) -> bool + + def self.==: (top other) -> bool + + def self.coerce: ( + top value, + state: VitableConnect::Internal::Type::Converter::coerce_state + ) -> top + + def self.dump: ( + top value, + state: VitableConnect::Internal::Type::Converter::dump_state + ) -> top + + def self.to_sorbet_type: -> top + end + end + end +end diff --git a/sig/vitable_connect/internal/util.rbs b/sig/vitable_connect/internal/util.rbs new file mode 100644 index 0000000..39039b5 --- /dev/null +++ b/sig/vitable_connect/internal/util.rbs @@ -0,0 +1,199 @@ +module VitableConnect + module Internal + module Util + extend VitableConnect::Internal::Util::SorbetRuntimeSupport + + def self?.monotonic_secs: -> Float + + def self?.walk_namespaces: ( + Module | Class ns + ) -> Enumerable[(Module | Class)] + + def self?.arch: -> String + + def self?.os: -> String + + def self?.primitive?: (top input) -> bool + + def self?.coerce_boolean: (String | bool input) -> (bool | top) + + def self?.coerce_boolean!: (String | bool input) -> bool? + + def self?.coerce_integer: (String | Integer input) -> (Integer | top) + + def self?.coerce_float: (String | Integer | Float input) -> (Float | top) + + def self?.coerce_hash: (top input) -> (::Hash[top, top] | top) + + def self?.coerce_hash!: (top input) -> ::Hash[top, top]? + + def self?.deep_merge_lr: (top lhs, top rhs, ?concat: bool) -> top + + def self?.deep_merge: ( + *::Array[top] values, + ?sentinel: top?, + ?concat: bool + ) -> top + + def self?.dig: ( + ::Hash[Symbol, top] | ::Array[top] | top data, + (Symbol + | Integer + | ::Array[(Symbol | Integer)] + | (^(top arg0) -> top))? pick + ) { + -> top? + } -> top? + + RFC_3986_NOT_PCHARS: Regexp + + def self?.uri_origin: (URI::Generic uri) -> String + + def self?.encode_path: (String | Integer path) -> String + + def self?.interpolate_path: (String | ::Array[String] path) -> String + + def self?.decode_query: (String? query) -> ::Hash[String, ::Array[String]] + + def self?.encode_query: ( + ::Hash[String, (::Array[String] | String)?]? query + ) -> String? + + type parsed_uri = + { + scheme: String?, + host: String?, + port: Integer?, + path: String?, + query: ::Hash[String, ::Array[String]] + } + + def self?.parse_uri: ( + URI::Generic | String url + ) -> VitableConnect::Internal::Util::parsed_uri + + def self?.unparse_uri: ( + VitableConnect::Internal::Util::parsed_uri parsed + ) -> URI::Generic + + def self?.join_parsed_uri: ( + VitableConnect::Internal::Util::parsed_uri lhs, + VitableConnect::Internal::Util::parsed_uri rhs + ) -> URI::Generic + + def self?.normalized_headers: ( + *::Hash[String, (String + | Integer + | ::Array[(String | Integer)?])?] headers + ) -> ::Hash[String, String] + + class ReadIOAdapter + def close?: -> bool? + + def close: -> void + + private def read_enum: (Integer? max_len) -> String + + def read: (?Integer? max_len, ?String? out_string) -> String? + + def initialize: ( + String | Pathname | StringIO | Enumerable[String] src + ) { + (String arg0) -> void + } -> void + end + + def self?.writable_enum: { + (Enumerator::Yielder y) -> void + } -> Enumerable[String] + + JSON_CONTENT: Regexp + JSONL_CONTENT: Regexp + + def encode_query_params: ( + ::Hash[Symbol, top] query + ) -> ::Hash[Symbol, top] + + private def write_query_param_element!: ( + ::Hash[Symbol, top] collection, + String key, + top element + ) -> nil + + def self?.write_multipart_content: ( + Enumerator::Yielder y, + val: top, + closing: ::Array[^-> void], + ?content_type: String? + ) -> void + + def self?.write_multipart_chunk: ( + Enumerator::Yielder y, + boundary: String, + key: Symbol | String, + val: top, + closing: ::Array[^-> void] + ) -> void + + def self?.encode_multipart_streaming: ( + top body + ) -> [String, Enumerable[String]] + + def self?.encode_content: ( + ::Hash[String, String] headers, + top body + ) -> top + + def self?.force_charset!: (String content_type, text: String) -> void + + def self?.decode_content: ( + ::Hash[String, String] headers, + stream: Enumerable[String], + ?suppress_error: bool + ) -> top + + def self?.fused_enum: ( + Enumerable[top] enum, + ?external: bool + ) { + -> void + } -> Enumerable[top] + + def self?.close_fused!: (Enumerable[top]? enum) -> void + + def self?.chain_fused: ( + Enumerable[top]? enum + ) { + (Enumerator::Yielder arg0) -> void + } -> Enumerable[top] + + type server_sent_event = + { event: String?, data: String?, id: String?, retry: Integer? } + + def self?.decode_lines: (Enumerable[String] enum) -> Enumerable[String] + + def self?.decode_sse: ( + Enumerable[String] lines + ) -> Enumerable[VitableConnect::Internal::Util::server_sent_event] + + module SorbetRuntimeSupport + class MissingSorbetRuntimeError < ::RuntimeError + end + + private def sorbet_runtime_constants: -> ::Hash[Symbol, top] + + def const_missing: (Symbol name) -> void + + def sorbet_constant_defined?: (Symbol name) -> bool + + def define_sorbet_constant!: (Symbol name) { -> top } -> void + + def to_sorbet_type: -> top + + def self.to_sorbet_type: ( + VitableConnect::Internal::Util::SorbetRuntimeSupport | top `type` + ) -> top + end + end + end +end diff --git a/sig/vitable_connect/models.rbs b/sig/vitable_connect/models.rbs new file mode 100644 index 0000000..426f291 --- /dev/null +++ b/sig/vitable_connect/models.rbs @@ -0,0 +1,109 @@ +module VitableConnect + class AuthIssueAccessTokenParams = VitableConnect::Models::AuthIssueAccessTokenParams + + class Employee = VitableConnect::Models::Employee + + module EmployeeClass = VitableConnect::Models::EmployeeClass + + class EmployeeListEnrollmentsParams = VitableConnect::Models::EmployeeListEnrollmentsParams + + class EmployeeRetrieveParams = VitableConnect::Models::EmployeeRetrieveParams + + class EmployeeUpdateParams = VitableConnect::Models::EmployeeUpdateParams + + class Employer = VitableConnect::Models::Employer + + class EmployerCreateParams = VitableConnect::Models::EmployerCreateParams + + class EmployerEnsurePayrollIntegrationEmailParams = VitableConnect::Models::EmployerEnsurePayrollIntegrationEmailParams + + class EmployerListBenefitPlanYearEnrollmentsParams = VitableConnect::Models::EmployerListBenefitPlanYearEnrollmentsParams + + class EmployerListBenefitPlanYearsParams = VitableConnect::Models::EmployerListBenefitPlanYearsParams + + class EmployerListEmployeesParams = VitableConnect::Models::EmployerListEmployeesParams + + class EmployerListHRISProvidersParams = VitableConnect::Models::EmployerListHRISProvidersParams + + class EmployerListInvoicesParams = VitableConnect::Models::EmployerListInvoicesParams + + class EmployerListParams = VitableConnect::Models::EmployerListParams + + class EmployerListPayrollDeductionStatementsParams = VitableConnect::Models::EmployerListPayrollDeductionStatementsParams + + class EmployerResponse = VitableConnect::Models::EmployerResponse + + class EmployerRetrieveBenefitPlanYearParams = VitableConnect::Models::EmployerRetrieveBenefitPlanYearParams + + class EmployerRetrieveHRISParams = VitableConnect::Models::EmployerRetrieveHRISParams + + class EmployerRetrieveInvoicePdfParams = VitableConnect::Models::EmployerRetrieveInvoicePdfParams + + class EmployerRetrieveParams = VitableConnect::Models::EmployerRetrieveParams + + class EmployerRetrievePayrollAccessSetupParams = VitableConnect::Models::EmployerRetrievePayrollAccessSetupParams + + class EmployerSubmitCensusSyncParams = VitableConnect::Models::EmployerSubmitCensusSyncParams + + class EmployerSubmitPayrollAccessSetupParams = VitableConnect::Models::EmployerSubmitPayrollAccessSetupParams + + class EmployerUpdateParams = VitableConnect::Models::EmployerUpdateParams + + class EmployerUpdateSettingsParams = VitableConnect::Models::EmployerUpdateSettingsParams + + class Enrollment = VitableConnect::Models::Enrollment + + class EnrollmentReissueParams = VitableConnect::Models::EnrollmentReissueParams + + class EnrollmentRetrieveParams = VitableConnect::Models::EnrollmentRetrieveParams + + module EnrollmentStatus = VitableConnect::Models::EnrollmentStatus + + class EnrollmentTerminateParams = VitableConnect::Models::EnrollmentTerminateParams + + class Group = VitableConnect::Models::Group + + class GroupCreateParams = VitableConnect::Models::GroupCreateParams + + class GroupListParams = VitableConnect::Models::GroupListParams + + class GroupResponse = VitableConnect::Models::GroupResponse + + class GroupRetrieveParams = VitableConnect::Models::GroupRetrieveParams + + module Groups = VitableConnect::Models::Groups + + class GroupUpdateParams = VitableConnect::Models::GroupUpdateParams + + class MemberListDependentsParams = VitableConnect::Models::MemberListDependentsParams + + class MemberListEmploymentsParams = VitableConnect::Models::MemberListEmploymentsParams + + class MemberListEnrollmentsParams = VitableConnect::Models::MemberListEnrollmentsParams + + class MemberListIDCardsParams = VitableConnect::Models::MemberListIDCardsParams + + class MemberListParams = VitableConnect::Models::MemberListParams + + class MemberListQualifyingLifeEventsParams = VitableConnect::Models::MemberListQualifyingLifeEventsParams + + class MemberRetrieveHouseholdParams = VitableConnect::Models::MemberRetrieveHouseholdParams + + class MemberRetrieveParams = VitableConnect::Models::MemberRetrieveParams + + class OrganizationCreateParams = VitableConnect::Models::OrganizationCreateParams + + class OrganizationListParams = VitableConnect::Models::OrganizationListParams + + class Pagination = VitableConnect::Models::Pagination + + class PlanListParams = VitableConnect::Models::PlanListParams + + class WebhookEvent = VitableConnect::Models::WebhookEvent + + class WebhookEventListDeliveriesParams = VitableConnect::Models::WebhookEventListDeliveriesParams + + class WebhookEventListParams = VitableConnect::Models::WebhookEventListParams + + class WebhookEventRetrieveParams = VitableConnect::Models::WebhookEventRetrieveParams +end diff --git a/sig/vitable_connect/models/auth_issue_access_token_params.rbs b/sig/vitable_connect/models/auth_issue_access_token_params.rbs new file mode 100644 index 0000000..3d4b0d6 --- /dev/null +++ b/sig/vitable_connect/models/auth_issue_access_token_params.rbs @@ -0,0 +1,74 @@ +module VitableConnect + module Models + type auth_issue_access_token_params = + { + grant_type: VitableConnect::Models::AuthIssueAccessTokenParams::grant_type, + bound_entity: VitableConnect::AuthIssueAccessTokenParams::BoundEntity? + } + & VitableConnect::Internal::Type::request_parameters + + class AuthIssueAccessTokenParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + attr_accessor grant_type: VitableConnect::Models::AuthIssueAccessTokenParams::grant_type + + attr_accessor bound_entity: VitableConnect::AuthIssueAccessTokenParams::BoundEntity? + + def initialize: ( + grant_type: VitableConnect::Models::AuthIssueAccessTokenParams::grant_type, + ?bound_entity: VitableConnect::AuthIssueAccessTokenParams::BoundEntity?, + ?request_options: VitableConnect::request_opts + ) -> void + + def to_hash: -> { + grant_type: VitableConnect::Models::AuthIssueAccessTokenParams::grant_type, + bound_entity: VitableConnect::AuthIssueAccessTokenParams::BoundEntity?, + request_options: VitableConnect::RequestOptions + } + + type grant_type = :client_credentials + + module GrantType + extend VitableConnect::Internal::Type::Enum + + CLIENT_CREDENTIALS: :client_credentials + + def self?.values: -> ::Array[VitableConnect::Models::AuthIssueAccessTokenParams::grant_type] + end + + type bound_entity = + { + id: String, + type: VitableConnect::Models::AuthIssueAccessTokenParams::BoundEntity::type_ + } + + class BoundEntity < VitableConnect::Internal::Type::BaseModel + attr_accessor id: String + + attr_accessor type: VitableConnect::Models::AuthIssueAccessTokenParams::BoundEntity::type_ + + def initialize: ( + id: String, + type: VitableConnect::Models::AuthIssueAccessTokenParams::BoundEntity::type_ + ) -> void + + def to_hash: -> { + id: String, + type: VitableConnect::Models::AuthIssueAccessTokenParams::BoundEntity::type_ + } + + type type_ = :employer | :employee + + module Type + extend VitableConnect::Internal::Type::Enum + + EMPLOYER: :employer + EMPLOYEE: :employee + + def self?.values: -> ::Array[VitableConnect::Models::AuthIssueAccessTokenParams::BoundEntity::type_] + end + end + end + end +end diff --git a/sig/vitable_connect/models/auth_issue_access_token_response.rbs b/sig/vitable_connect/models/auth_issue_access_token_response.rbs new file mode 100644 index 0000000..2688bba --- /dev/null +++ b/sig/vitable_connect/models/auth_issue_access_token_response.rbs @@ -0,0 +1,68 @@ +module VitableConnect + module Models + type auth_issue_access_token_response = + { + access_token: String, + expires_in: Integer, + token_type: String, + bound_entity: VitableConnect::Models::AuthIssueAccessTokenResponse::BoundEntity? + } + + class AuthIssueAccessTokenResponse < VitableConnect::Internal::Type::BaseModel + attr_accessor access_token: String + + attr_accessor expires_in: Integer + + attr_accessor token_type: String + + attr_accessor bound_entity: VitableConnect::Models::AuthIssueAccessTokenResponse::BoundEntity? + + def initialize: ( + access_token: String, + expires_in: Integer, + token_type: String, + ?bound_entity: VitableConnect::Models::AuthIssueAccessTokenResponse::BoundEntity? + ) -> void + + def to_hash: -> { + access_token: String, + expires_in: Integer, + token_type: String, + bound_entity: VitableConnect::Models::AuthIssueAccessTokenResponse::BoundEntity? + } + + type bound_entity = + { + id: String, + type: VitableConnect::Models::AuthIssueAccessTokenResponse::BoundEntity::type_ + } + + class BoundEntity < VitableConnect::Internal::Type::BaseModel + attr_accessor id: String + + attr_accessor type: VitableConnect::Models::AuthIssueAccessTokenResponse::BoundEntity::type_ + + def initialize: ( + id: String, + type: VitableConnect::Models::AuthIssueAccessTokenResponse::BoundEntity::type_ + ) -> void + + def to_hash: -> { + id: String, + type: VitableConnect::Models::AuthIssueAccessTokenResponse::BoundEntity::type_ + } + + type type_ = :employer | :employee + + module Type + extend VitableConnect::Internal::Type::Enum + + EMPLOYER: :employer + EMPLOYEE: :employee + + def self?.values: -> ::Array[VitableConnect::Models::AuthIssueAccessTokenResponse::BoundEntity::type_] + end + end + end + end +end diff --git a/sig/vitable_connect/models/employee.rbs b/sig/vitable_connect/models/employee.rbs new file mode 100644 index 0000000..8c5761b --- /dev/null +++ b/sig/vitable_connect/models/employee.rbs @@ -0,0 +1,261 @@ +module VitableConnect + module Models + type employee = + { + id: String, + classification_effective_date: Date, + compensation_type: VitableConnect::Models::Employee::compensation_type?, + compensation_type_effective_date: Date, + created_at: Time, + date_of_birth: Date, + deductions: ::Array[VitableConnect::Employee::Deduction], + email: String, + employee_class: VitableConnect::Models::employee_class, + employer_id: String, + first_name: String, + last_name: String, + member_id: String, + phone: String?, + start_date: Date, + status: VitableConnect::Models::Employee::status, + updated_at: Time, + address: VitableConnect::Employee::Address?, + employer_name: String?, + gender: String?, + reference_id: String?, + suffix: String?, + termination_date: Date? + } + + class Employee < VitableConnect::Internal::Type::BaseModel + attr_accessor created_at: Time + + attr_accessor date_of_birth: Date + + attr_accessor deductions: ::Array[VitableConnect::Employee::Deduction] + + attr_accessor email: String + + attr_accessor employee_class: VitableConnect::Models::employee_class + + attr_accessor first_name: String + + attr_accessor last_name: String + + attr_accessor updated_at: Time + + attr_accessor address: VitableConnect::Employee::Address? + + attr_accessor employer_name: String? + + attr_accessor gender: String? + + attr_accessor reference_id: String? + + attr_accessor suffix: String? + + attr_accessor termination_date: Date? + + attr_accessor id: String + + attr_accessor classification_effective_date: Date + + attr_accessor compensation_type: VitableConnect::Models::Employee::compensation_type? + + attr_accessor compensation_type_effective_date: Date + + attr_accessor employer_id: String + + attr_accessor member_id: String + + attr_accessor phone: String? + + attr_accessor start_date: Date + + attr_accessor status: VitableConnect::Models::Employee::status + + def initialize: ( + id: String, + classification_effective_date: Date, + compensation_type: VitableConnect::Models::Employee::compensation_type?, + compensation_type_effective_date: Date, + created_at: Time, + date_of_birth: Date, + deductions: ::Array[VitableConnect::Employee::Deduction], + email: String, + employee_class: VitableConnect::Models::employee_class, + employer_id: String, + first_name: String, + last_name: String, + member_id: String, + phone: String?, + start_date: Date, + status: VitableConnect::Models::Employee::status, + updated_at: Time, + ?address: VitableConnect::Employee::Address?, + ?employer_name: String?, + ?gender: String?, + ?reference_id: String?, + ?suffix: String?, + ?termination_date: Date? + ) -> void + + def to_hash: -> { + id: String, + classification_effective_date: Date, + compensation_type: VitableConnect::Models::Employee::compensation_type?, + compensation_type_effective_date: Date, + created_at: Time, + date_of_birth: Date, + deductions: ::Array[VitableConnect::Employee::Deduction], + email: String, + employee_class: VitableConnect::Models::employee_class, + employer_id: String, + first_name: String, + last_name: String, + member_id: String, + phone: String?, + start_date: Date, + status: VitableConnect::Models::Employee::status, + updated_at: Time, + address: VitableConnect::Employee::Address?, + employer_name: String?, + gender: String?, + reference_id: String?, + suffix: String?, + termination_date: Date? + } + + type compensation_type = :Salary | :Hourly + + module CompensationType + extend VitableConnect::Internal::Type::Enum + + SALARY: :Salary + HOURLY: :Hourly + + def self?.values: -> ::Array[VitableConnect::Models::Employee::compensation_type] + end + + type deduction = + { + benefit_name: String, + deduction_amount_in_cents: Integer, + deduction_category: String?, + frequency: VitableConnect::Models::Employee::Deduction::frequency, + period_end_date: Date, + period_start_date: Date, + tax_classification: VitableConnect::Models::Employee::Deduction::tax_classification + } + + class Deduction < VitableConnect::Internal::Type::BaseModel + attr_accessor benefit_name: String + + attr_accessor deduction_amount_in_cents: Integer + + attr_accessor deduction_category: String? + + attr_accessor frequency: VitableConnect::Models::Employee::Deduction::frequency + + attr_accessor period_end_date: Date + + attr_accessor period_start_date: Date + + attr_accessor tax_classification: VitableConnect::Models::Employee::Deduction::tax_classification + + def initialize: ( + benefit_name: String, + deduction_amount_in_cents: Integer, + deduction_category: String?, + frequency: VitableConnect::Models::Employee::Deduction::frequency, + period_end_date: Date, + period_start_date: Date, + tax_classification: VitableConnect::Models::Employee::Deduction::tax_classification + ) -> void + + def to_hash: -> { + benefit_name: String, + deduction_amount_in_cents: Integer, + deduction_category: String?, + frequency: VitableConnect::Models::Employee::Deduction::frequency, + period_end_date: Date, + period_start_date: Date, + tax_classification: VitableConnect::Models::Employee::Deduction::tax_classification + } + + type frequency = :weekly | :bi_weekly | :semi_monthly | :monthly + + module Frequency + extend VitableConnect::Internal::Type::Enum + + WEEKLY: :weekly + BI_WEEKLY: :bi_weekly + SEMI_MONTHLY: :semi_monthly + MONTHLY: :monthly + + def self?.values: -> ::Array[VitableConnect::Models::Employee::Deduction::frequency] + end + + type tax_classification = :Unknown | :"Pre-tax" | :"Post-tax" + + module TaxClassification + extend VitableConnect::Internal::Type::Enum + + UNKNOWN: :Unknown + PRE_TAX: :"Pre-tax" + POST_TAX: :"Post-tax" + + def self?.values: -> ::Array[VitableConnect::Models::Employee::Deduction::tax_classification] + end + end + + type status = :active | :terminated + + module Status + extend VitableConnect::Internal::Type::Enum + + ACTIVE: :active + TERMINATED: :terminated + + def self?.values: -> ::Array[VitableConnect::Models::Employee::status] + end + + type address = + { + :address_line_1 => String, + city: String, + state: String, + zipcode: String, + :address_line_2 => String? + } + + class Address < VitableConnect::Internal::Type::BaseModel + attr_accessor address_line_1: String + + attr_accessor city: String + + attr_accessor state: String + + attr_accessor zipcode: String + + attr_accessor address_line_2: String? + + def initialize: ( + address_line_1: String, + city: String, + state: String, + zipcode: String, + ?address_line_2: String? + ) -> void + + def to_hash: -> { + :address_line_1 => String, + city: String, + state: String, + zipcode: String, + :address_line_2 => String? + } + end + end + end +end diff --git a/sig/vitable_connect/models/employee_class.rbs b/sig/vitable_connect/models/employee_class.rbs new file mode 100644 index 0000000..e6439ae --- /dev/null +++ b/sig/vitable_connect/models/employee_class.rbs @@ -0,0 +1,24 @@ +module VitableConnect + module Models + type employee_class = + :"Full Time" + | :"Part Time" + | :Temporary + | :Intern + | :Seasonal + | :"Individual Contractor" + + module EmployeeClass + extend VitableConnect::Internal::Type::Enum + + FULL_TIME: :"Full Time" + PART_TIME: :"Part Time" + TEMPORARY: :Temporary + INTERN: :Intern + SEASONAL: :Seasonal + INDIVIDUAL_CONTRACTOR: :"Individual Contractor" + + def self?.values: -> ::Array[VitableConnect::Models::employee_class] + end + end +end diff --git a/sig/vitable_connect/models/employee_list_enrollments_params.rbs b/sig/vitable_connect/models/employee_list_enrollments_params.rbs new file mode 100644 index 0000000..2f6be62 --- /dev/null +++ b/sig/vitable_connect/models/employee_list_enrollments_params.rbs @@ -0,0 +1,36 @@ +module VitableConnect + module Models + type employee_list_enrollments_params = + { employee_id: String, limit: Integer, page: Integer } + & VitableConnect::Internal::Type::request_parameters + + class EmployeeListEnrollmentsParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + attr_accessor employee_id: String + + attr_reader limit: Integer? + + def limit=: (Integer) -> Integer + + attr_reader page: Integer? + + def page=: (Integer) -> Integer + + def initialize: ( + employee_id: String, + ?limit: Integer, + ?page: Integer, + ?request_options: VitableConnect::request_opts + ) -> void + + def to_hash: -> { + employee_id: String, + limit: Integer, + page: Integer, + request_options: VitableConnect::RequestOptions + } + end + end +end diff --git a/sig/vitable_connect/models/employee_retrieve_params.rbs b/sig/vitable_connect/models/employee_retrieve_params.rbs new file mode 100644 index 0000000..213d7c5 --- /dev/null +++ b/sig/vitable_connect/models/employee_retrieve_params.rbs @@ -0,0 +1,24 @@ +module VitableConnect + module Models + type employee_retrieve_params = + { employee_id: String } + & VitableConnect::Internal::Type::request_parameters + + class EmployeeRetrieveParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + attr_accessor employee_id: String + + def initialize: ( + employee_id: String, + ?request_options: VitableConnect::request_opts + ) -> void + + def to_hash: -> { + employee_id: String, + request_options: VitableConnect::RequestOptions + } + end + end +end diff --git a/sig/vitable_connect/models/employee_retrieve_response.rbs b/sig/vitable_connect/models/employee_retrieve_response.rbs new file mode 100644 index 0000000..fcb7853 --- /dev/null +++ b/sig/vitable_connect/models/employee_retrieve_response.rbs @@ -0,0 +1,13 @@ +module VitableConnect + module Models + type employee_retrieve_response = { data: VitableConnect::Employee } + + class EmployeeRetrieveResponse < VitableConnect::Internal::Type::BaseModel + attr_accessor data: VitableConnect::Employee + + def initialize: (data: VitableConnect::Employee) -> void + + def to_hash: -> { data: VitableConnect::Employee } + end + end +end diff --git a/sig/vitable_connect/models/employee_update_params.rbs b/sig/vitable_connect/models/employee_update_params.rbs new file mode 100644 index 0000000..7dc3c75 --- /dev/null +++ b/sig/vitable_connect/models/employee_update_params.rbs @@ -0,0 +1,140 @@ +module VitableConnect + module Models + type employee_update_params = + { + employee_id: String, + effective_date: Date, + address: VitableConnect::EmployeeUpdateParams::Address?, + compensation_type: VitableConnect::Models::EmployeeUpdateParams::compensation_type?, + email: String?, + employee_class: VitableConnect::Models::employee_class?, + gender: VitableConnect::Models::EmployeeUpdateParams::gender?, + phone: String?, + start_date: Date? + } + & VitableConnect::Internal::Type::request_parameters + + class EmployeeUpdateParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + attr_accessor employee_id: String + + attr_accessor effective_date: Date + + attr_accessor address: VitableConnect::EmployeeUpdateParams::Address? + + attr_accessor compensation_type: VitableConnect::Models::EmployeeUpdateParams::compensation_type? + + attr_accessor email: String? + + attr_accessor employee_class: VitableConnect::Models::employee_class? + + attr_accessor gender: VitableConnect::Models::EmployeeUpdateParams::gender? + + attr_accessor phone: String? + + attr_accessor start_date: Date? + + def initialize: ( + employee_id: String, + effective_date: Date, + ?address: VitableConnect::EmployeeUpdateParams::Address?, + ?compensation_type: VitableConnect::Models::EmployeeUpdateParams::compensation_type?, + ?email: String?, + ?employee_class: VitableConnect::Models::employee_class?, + ?gender: VitableConnect::Models::EmployeeUpdateParams::gender?, + ?phone: String?, + ?start_date: Date?, + ?request_options: VitableConnect::request_opts + ) -> void + + def to_hash: -> { + employee_id: String, + effective_date: Date, + address: VitableConnect::EmployeeUpdateParams::Address?, + compensation_type: VitableConnect::Models::EmployeeUpdateParams::compensation_type?, + email: String?, + employee_class: VitableConnect::Models::employee_class?, + gender: VitableConnect::Models::EmployeeUpdateParams::gender?, + phone: String?, + start_date: Date?, + request_options: VitableConnect::RequestOptions + } + + type address = + { + city: String, + state: String, + :street_1 => String, + zip_code: String, + country: String, + :street_2 => String? + } + + class Address < VitableConnect::Internal::Type::BaseModel + attr_accessor city: String + + attr_accessor state: String + + attr_accessor street_1: String + + attr_accessor zip_code: String + + attr_reader country: String? + + def country=: (String) -> String + + attr_accessor street_2: String? + + def initialize: ( + city: String, + state: String, + street_1: String, + zip_code: String, + ?country: String, + ?street_2: String? + ) -> void + + def to_hash: -> { + city: String, + state: String, + :street_1 => String, + zip_code: String, + country: String, + :street_2 => String? + } + end + + type compensation_type = :Salary | :Hourly + + module CompensationType + extend VitableConnect::Internal::Type::Enum + + SALARY: :Salary + HOURLY: :Hourly + + def self?.values: -> ::Array[VitableConnect::Models::EmployeeUpdateParams::compensation_type] + end + + type gender = + :Male + | :Female + | :Transgender + | :"Non-binary" + | :"Prefer not to respond" + + module Gender + extend VitableConnect::Internal::Type::Enum + + MALE: :Male + FEMALE: :Female + TRANSGENDER: :Transgender + NON_BINARY: :"Non-binary" + PREFER_NOT_TO_RESPOND: :"Prefer not to respond" + + def self?.values: -> ::Array[VitableConnect::Models::EmployeeUpdateParams::gender] + end + end + end +end diff --git a/sig/vitable_connect/models/employee_update_response.rbs b/sig/vitable_connect/models/employee_update_response.rbs new file mode 100644 index 0000000..02aaa86 --- /dev/null +++ b/sig/vitable_connect/models/employee_update_response.rbs @@ -0,0 +1,13 @@ +module VitableConnect + module Models + type employee_update_response = { data: VitableConnect::Employee } + + class EmployeeUpdateResponse < VitableConnect::Internal::Type::BaseModel + attr_accessor data: VitableConnect::Employee + + def initialize: (data: VitableConnect::Employee) -> void + + def to_hash: -> { data: VitableConnect::Employee } + end + end +end diff --git a/sig/vitable_connect/models/employer.rbs b/sig/vitable_connect/models/employer.rbs new file mode 100644 index 0000000..59066cf --- /dev/null +++ b/sig/vitable_connect/models/employer.rbs @@ -0,0 +1,129 @@ +module VitableConnect + module Models + type employer = + { + id: String, + active: bool, + address: VitableConnect::Employer::Address, + contact: VitableConnect::Employer::Contact?, + created_at: Time, + ein: String?, + legal_name: String, + name: String, + organization_id: String?, + updated_at: Time, + email: String?, + phone_number: String?, + reference_id: String? + } + + class Employer < VitableConnect::Internal::Type::BaseModel + attr_accessor active: bool + + attr_accessor address: VitableConnect::Employer::Address + + attr_accessor created_at: Time + + attr_accessor legal_name: String + + attr_accessor name: String + + attr_accessor updated_at: Time + + attr_accessor email: String? + + attr_accessor phone_number: String? + + attr_accessor reference_id: String? + + attr_accessor id: String + + attr_accessor contact: VitableConnect::Employer::Contact? + + attr_accessor ein: String? + + attr_accessor organization_id: String? + + def initialize: ( + id: String, + active: bool, + address: VitableConnect::Employer::Address, + contact: VitableConnect::Employer::Contact?, + created_at: Time, + ein: String?, + legal_name: String, + name: String, + organization_id: String?, + updated_at: Time, + ?email: String?, + ?phone_number: String?, + ?reference_id: String? + ) -> void + + def to_hash: -> { + id: String, + active: bool, + address: VitableConnect::Employer::Address, + contact: VitableConnect::Employer::Contact?, + created_at: Time, + ein: String?, + legal_name: String, + name: String, + organization_id: String?, + updated_at: Time, + email: String?, + phone_number: String?, + reference_id: String? + } + + type address = + { + :address_line_1 => String, + city: String, + state: String, + zipcode: String, + :address_line_2 => String? + } + + class Address < VitableConnect::Internal::Type::BaseModel + attr_accessor address_line_1: String + + attr_accessor city: String + + attr_accessor state: String + + attr_accessor zipcode: String + + attr_accessor address_line_2: String? + + def initialize: ( + address_line_1: String, + city: String, + state: String, + zipcode: String, + ?address_line_2: String? + ) -> void + + def to_hash: -> { + :address_line_1 => String, + city: String, + state: String, + zipcode: String, + :address_line_2 => String? + } + end + + type contact = { email: String?, phone: String? } + + class Contact < VitableConnect::Internal::Type::BaseModel + attr_accessor email: String? + + attr_accessor phone: String? + + def initialize: (email: String?, phone: String?) -> void + + def to_hash: -> { email: String?, phone: String? } + end + end + end +end diff --git a/sig/vitable_connect/models/employer_create_params.rbs b/sig/vitable_connect/models/employer_create_params.rbs new file mode 100644 index 0000000..7056f06 --- /dev/null +++ b/sig/vitable_connect/models/employer_create_params.rbs @@ -0,0 +1,93 @@ +module VitableConnect + module Models + type employer_create_params = + { + address: VitableConnect::EmployerCreateParams::Address, + ein: String, + email: String, + legal_name: String, + name: String, + phone_number: String?, + reference_id: String? + } + & VitableConnect::Internal::Type::request_parameters + + class EmployerCreateParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + attr_accessor address: VitableConnect::EmployerCreateParams::Address + + attr_accessor ein: String + + attr_accessor email: String + + attr_accessor legal_name: String + + attr_accessor name: String + + attr_accessor phone_number: String? + + attr_accessor reference_id: String? + + def initialize: ( + address: VitableConnect::EmployerCreateParams::Address, + ein: String, + email: String, + legal_name: String, + name: String, + ?phone_number: String?, + ?reference_id: String?, + ?request_options: VitableConnect::request_opts + ) -> void + + def to_hash: -> { + address: VitableConnect::EmployerCreateParams::Address, + ein: String, + email: String, + legal_name: String, + name: String, + phone_number: String?, + reference_id: String?, + request_options: VitableConnect::RequestOptions + } + + type address = + { + :address_line_1 => String, + city: String, + state: String, + zipcode: String, + :address_line_2 => String? + } + + class Address < VitableConnect::Internal::Type::BaseModel + attr_accessor address_line_1: String + + attr_accessor city: String + + attr_accessor state: String + + attr_accessor zipcode: String + + attr_accessor address_line_2: String? + + def initialize: ( + address_line_1: String, + city: String, + state: String, + zipcode: String, + ?address_line_2: String? + ) -> void + + def to_hash: -> { + :address_line_1 => String, + city: String, + state: String, + zipcode: String, + :address_line_2 => String? + } + end + end + end +end diff --git a/sig/vitable_connect/models/employer_ensure_payroll_integration_email_params.rbs b/sig/vitable_connect/models/employer_ensure_payroll_integration_email_params.rbs new file mode 100644 index 0000000..5048475 --- /dev/null +++ b/sig/vitable_connect/models/employer_ensure_payroll_integration_email_params.rbs @@ -0,0 +1,24 @@ +module VitableConnect + module Models + type employer_ensure_payroll_integration_email_params = + { employer_id: String } + & VitableConnect::Internal::Type::request_parameters + + class EmployerEnsurePayrollIntegrationEmailParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + attr_accessor employer_id: String + + def initialize: ( + employer_id: String, + ?request_options: VitableConnect::request_opts + ) -> void + + def to_hash: -> { + employer_id: String, + request_options: VitableConnect::RequestOptions + } + end + end +end diff --git a/sig/vitable_connect/models/employer_ensure_payroll_integration_email_response.rbs b/sig/vitable_connect/models/employer_ensure_payroll_integration_email_response.rbs new file mode 100644 index 0000000..9d832ea --- /dev/null +++ b/sig/vitable_connect/models/employer_ensure_payroll_integration_email_response.rbs @@ -0,0 +1,30 @@ +module VitableConnect + module Models + type employer_ensure_payroll_integration_email_response = + { + data: VitableConnect::Models::EmployerEnsurePayrollIntegrationEmailResponse::Data + } + + class EmployerEnsurePayrollIntegrationEmailResponse < VitableConnect::Internal::Type::BaseModel + attr_accessor data: VitableConnect::Models::EmployerEnsurePayrollIntegrationEmailResponse::Data + + def initialize: ( + data: VitableConnect::Models::EmployerEnsurePayrollIntegrationEmailResponse::Data + ) -> void + + def to_hash: -> { + data: VitableConnect::Models::EmployerEnsurePayrollIntegrationEmailResponse::Data + } + + type data = { integration_email: String } + + class Data < VitableConnect::Internal::Type::BaseModel + attr_accessor integration_email: String + + def initialize: (integration_email: String) -> void + + def to_hash: -> { integration_email: String } + end + end + end +end diff --git a/sig/vitable_connect/models/employer_list_benefit_plan_year_enrollments_params.rbs b/sig/vitable_connect/models/employer_list_benefit_plan_year_enrollments_params.rbs new file mode 100644 index 0000000..a2364bb --- /dev/null +++ b/sig/vitable_connect/models/employer_list_benefit_plan_year_enrollments_params.rbs @@ -0,0 +1,74 @@ +module VitableConnect + module Models + type employer_list_benefit_plan_year_enrollments_params = + { + employer_id: String, + benefit_plan_year_id: String, + election_status: ::Array[VitableConnect::Models::EmployerListBenefitPlanYearEnrollmentsParams::election_status], + limit: Integer, + page: Integer, + search: String + } + & VitableConnect::Internal::Type::request_parameters + + class EmployerListBenefitPlanYearEnrollmentsParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + attr_accessor employer_id: String + + attr_accessor benefit_plan_year_id: String + + attr_reader election_status: ::Array[VitableConnect::Models::EmployerListBenefitPlanYearEnrollmentsParams::election_status]? + + def election_status=: ( + ::Array[VitableConnect::Models::EmployerListBenefitPlanYearEnrollmentsParams::election_status] + ) -> ::Array[VitableConnect::Models::EmployerListBenefitPlanYearEnrollmentsParams::election_status] + + attr_reader limit: Integer? + + def limit=: (Integer) -> Integer + + attr_reader page: Integer? + + def page=: (Integer) -> Integer + + attr_reader search: String? + + def search=: (String) -> String + + def initialize: ( + employer_id: String, + benefit_plan_year_id: String, + ?election_status: ::Array[VitableConnect::Models::EmployerListBenefitPlanYearEnrollmentsParams::election_status], + ?limit: Integer, + ?page: Integer, + ?search: String, + ?request_options: VitableConnect::request_opts + ) -> void + + def to_hash: -> { + employer_id: String, + benefit_plan_year_id: String, + election_status: ::Array[VitableConnect::Models::EmployerListBenefitPlanYearEnrollmentsParams::election_status], + limit: Integer, + page: Integer, + search: String, + request_options: VitableConnect::RequestOptions + } + + type election_status = :Enrolled | :Expired | :Pending | :Waived + + module ElectionStatus + extend VitableConnect::Internal::Type::Enum + + ENROLLED: :Enrolled + EXPIRED: :Expired + PENDING: :Pending + WAIVED: :Waived + + def self?.values: -> ::Array[VitableConnect::Models::EmployerListBenefitPlanYearEnrollmentsParams::election_status] + end + end + end +end diff --git a/sig/vitable_connect/models/employer_list_benefit_plan_year_enrollments_response.rbs b/sig/vitable_connect/models/employer_list_benefit_plan_year_enrollments_response.rbs new file mode 100644 index 0000000..0ea8d9c --- /dev/null +++ b/sig/vitable_connect/models/employer_list_benefit_plan_year_enrollments_response.rbs @@ -0,0 +1,115 @@ +module VitableConnect + module Models + type employer_list_benefit_plan_year_enrollments_response = + { + carrier: String?, + dependent_count: Integer, + election_status: VitableConnect::Models::EmployerListBenefitPlanYearEnrollmentsResponse::election_status, + employee_deduction_in_cents: Integer?, + employee_external_reference_id: String?, + employee_id: String, + employer_contribution_in_cents: Integer?, + member_first_name: String, + member_id: String, + member_last_name: String, + plan: String?, + policy_status: VitableConnect::Models::EmployerListBenefitPlanYearEnrollmentsResponse::policy_status?, + premium_in_cents: Integer?, + tier: String? + } + + class EmployerListBenefitPlanYearEnrollmentsResponse < VitableConnect::Internal::Type::BaseModel + attr_accessor carrier: String? + + attr_accessor dependent_count: Integer + + attr_accessor election_status: VitableConnect::Models::EmployerListBenefitPlanYearEnrollmentsResponse::election_status + + attr_accessor employee_deduction_in_cents: Integer? + + attr_accessor employee_external_reference_id: String? + + attr_accessor employee_id: String + + attr_accessor employer_contribution_in_cents: Integer? + + attr_accessor member_first_name: String + + attr_accessor member_id: String + + attr_accessor member_last_name: String + + attr_accessor plan: String? + + attr_accessor policy_status: VitableConnect::Models::EmployerListBenefitPlanYearEnrollmentsResponse::policy_status? + + attr_accessor premium_in_cents: Integer? + + attr_accessor tier: String? + + def initialize: ( + carrier: String?, + dependent_count: Integer, + election_status: VitableConnect::Models::EmployerListBenefitPlanYearEnrollmentsResponse::election_status, + employee_deduction_in_cents: Integer?, + employee_external_reference_id: String?, + employee_id: String, + employer_contribution_in_cents: Integer?, + member_first_name: String, + member_id: String, + member_last_name: String, + plan: String?, + policy_status: VitableConnect::Models::EmployerListBenefitPlanYearEnrollmentsResponse::policy_status?, + premium_in_cents: Integer?, + tier: String? + ) -> void + + def to_hash: -> { + carrier: String?, + dependent_count: Integer, + election_status: VitableConnect::Models::EmployerListBenefitPlanYearEnrollmentsResponse::election_status, + employee_deduction_in_cents: Integer?, + employee_external_reference_id: String?, + employee_id: String, + employer_contribution_in_cents: Integer?, + member_first_name: String, + member_id: String, + member_last_name: String, + plan: String?, + policy_status: VitableConnect::Models::EmployerListBenefitPlanYearEnrollmentsResponse::policy_status?, + premium_in_cents: Integer?, + tier: String? + } + + type election_status = :Enrolled | :Waived | :Pending | :Expired + + module ElectionStatus + extend VitableConnect::Internal::Type::Enum + + ENROLLED: :Enrolled + WAIVED: :Waived + PENDING: :Pending + EXPIRED: :Expired + + def self?.values: -> ::Array[VitableConnect::Models::EmployerListBenefitPlanYearEnrollmentsResponse::election_status] + end + + type policy_status = + :"Coverage Upcoming" + | :"Coverage Effective" + | :"Coverage Ended" + | :Cancelled + + module PolicyStatus + extend VitableConnect::Internal::Type::Enum + + COVERAGE_UPCOMING: :"Coverage Upcoming" + COVERAGE_EFFECTIVE: :"Coverage Effective" + COVERAGE_ENDED: :"Coverage Ended" + CANCELLED: :Cancelled + + def self?.values: -> ::Array[VitableConnect::Models::EmployerListBenefitPlanYearEnrollmentsResponse::policy_status] + end + end + end +end diff --git a/sig/vitable_connect/models/employer_list_benefit_plan_years_params.rbs b/sig/vitable_connect/models/employer_list_benefit_plan_years_params.rbs new file mode 100644 index 0000000..e945628 --- /dev/null +++ b/sig/vitable_connect/models/employer_list_benefit_plan_years_params.rbs @@ -0,0 +1,24 @@ +module VitableConnect + module Models + type employer_list_benefit_plan_years_params = + { employer_id: String } + & VitableConnect::Internal::Type::request_parameters + + class EmployerListBenefitPlanYearsParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + attr_accessor employer_id: String + + def initialize: ( + employer_id: String, + ?request_options: VitableConnect::request_opts + ) -> void + + def to_hash: -> { + employer_id: String, + request_options: VitableConnect::RequestOptions + } + end + end +end diff --git a/sig/vitable_connect/models/employer_list_benefit_plan_years_response.rbs b/sig/vitable_connect/models/employer_list_benefit_plan_years_response.rbs new file mode 100644 index 0000000..0248ee7 --- /dev/null +++ b/sig/vitable_connect/models/employer_list_benefit_plan_years_response.rbs @@ -0,0 +1,197 @@ +module VitableConnect + module Models + type employer_list_benefit_plan_years_response = + { + data: ::Array[VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data] + } + + class EmployerListBenefitPlanYearsResponse < VitableConnect::Internal::Type::BaseModel + attr_accessor data: ::Array[VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data] + + def initialize: ( + data: ::Array[VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data] + ) -> void + + def to_hash: -> { + data: ::Array[VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data] + } + + type data = + { + benefit_id: String, + benefit_plan_year_id: String, + carrier: String?, + coverage_end: Date?, + coverage_start: Date, + employee_contribution: VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data::EmployeeContribution?, + employer_contribution: VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data::EmployerContribution?, + enrollment_rate: VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data::EnrollmentRate, + family: VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data::family, + is_current: bool, + network_names: ::Array[String], + offered_states: ::Array[String], + open_enrollment_end: Date?, + open_enrollment_start: Date, + premium_in_cents: Integer?, + product_name: String, + status: VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data::status, + year: Integer + } + + class Data < VitableConnect::Internal::Type::BaseModel + attr_accessor benefit_id: String + + attr_accessor benefit_plan_year_id: String + + attr_accessor carrier: String? + + attr_accessor coverage_end: Date? + + attr_accessor coverage_start: Date + + attr_accessor employee_contribution: VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data::EmployeeContribution? + + attr_accessor employer_contribution: VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data::EmployerContribution? + + attr_accessor enrollment_rate: VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data::EnrollmentRate + + attr_accessor family: VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data::family + + attr_accessor is_current: bool + + attr_accessor network_names: ::Array[String] + + attr_accessor offered_states: ::Array[String] + + attr_accessor open_enrollment_end: Date? + + attr_accessor open_enrollment_start: Date + + attr_accessor premium_in_cents: Integer? + + attr_accessor product_name: String + + attr_accessor status: VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data::status + + attr_accessor year: Integer + + def initialize: ( + benefit_id: String, + benefit_plan_year_id: String, + carrier: String?, + coverage_end: Date?, + coverage_start: Date, + employee_contribution: VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data::EmployeeContribution?, + employer_contribution: VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data::EmployerContribution?, + enrollment_rate: VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data::EnrollmentRate, + family: VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data::family, + is_current: bool, + network_names: ::Array[String], + offered_states: ::Array[String], + open_enrollment_end: Date?, + open_enrollment_start: Date, + premium_in_cents: Integer?, + product_name: String, + status: VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data::status, + year: Integer + ) -> void + + def to_hash: -> { + benefit_id: String, + benefit_plan_year_id: String, + carrier: String?, + coverage_end: Date?, + coverage_start: Date, + employee_contribution: VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data::EmployeeContribution?, + employer_contribution: VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data::EmployerContribution?, + enrollment_rate: VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data::EnrollmentRate, + family: VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data::family, + is_current: bool, + network_names: ::Array[String], + offered_states: ::Array[String], + open_enrollment_end: Date?, + open_enrollment_start: Date, + premium_in_cents: Integer?, + product_name: String, + status: VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data::status, + year: Integer + } + + type employee_contribution = { max_cents: Integer, min_cents: Integer } + + class EmployeeContribution < VitableConnect::Internal::Type::BaseModel + attr_accessor max_cents: Integer + + attr_accessor min_cents: Integer + + def initialize: (max_cents: Integer, min_cents: Integer) -> void + + def to_hash: -> { max_cents: Integer, min_cents: Integer } + end + + type employer_contribution = { max_cents: Integer, min_cents: Integer } + + class EmployerContribution < VitableConnect::Internal::Type::BaseModel + attr_accessor max_cents: Integer + + attr_accessor min_cents: Integer + + def initialize: (max_cents: Integer, min_cents: Integer) -> void + + def to_hash: -> { max_cents: Integer, min_cents: Integer } + end + + type enrollment_rate = + { eligible: Integer, enrolled: Integer, percentage: Integer } + + class EnrollmentRate < VitableConnect::Internal::Type::BaseModel + attr_accessor eligible: Integer + + attr_accessor enrolled: Integer + + attr_accessor percentage: Integer + + def initialize: ( + eligible: Integer, + enrolled: Integer, + percentage: Integer + ) -> void + + def to_hash: -> { + eligible: Integer, + enrolled: Integer, + percentage: Integer + } + end + + type family = :mec | :mvp | :ichra | :vpc | :dental | :vision + + module Family + extend VitableConnect::Internal::Type::Enum + + MEC: :mec + MVP: :mvp + ICHRA: :ichra + VPC: :vpc + DENTAL: :dental + VISION: :vision + + def self?.values: -> ::Array[VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data::family] + end + + type status = :active | :upcoming | :open_enrollment | :inactive + + module Status + extend VitableConnect::Internal::Type::Enum + + ACTIVE: :active + UPCOMING: :upcoming + OPEN_ENROLLMENT: :open_enrollment + INACTIVE: :inactive + + def self?.values: -> ::Array[VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data::status] + end + end + end + end +end diff --git a/sig/vitable_connect/models/employer_list_employees_params.rbs b/sig/vitable_connect/models/employer_list_employees_params.rbs new file mode 100644 index 0000000..1ed8cf9 --- /dev/null +++ b/sig/vitable_connect/models/employer_list_employees_params.rbs @@ -0,0 +1,67 @@ +module VitableConnect + module Models + type employer_list_employees_params = + { + employer_id: String, + employment_status: VitableConnect::Models::EmployerListEmployeesParams::employment_status, + limit: Integer, + page: Integer, + search: String + } + & VitableConnect::Internal::Type::request_parameters + + class EmployerListEmployeesParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + attr_accessor employer_id: String + + attr_reader employment_status: VitableConnect::Models::EmployerListEmployeesParams::employment_status? + + def employment_status=: ( + VitableConnect::Models::EmployerListEmployeesParams::employment_status + ) -> VitableConnect::Models::EmployerListEmployeesParams::employment_status + + attr_reader limit: Integer? + + def limit=: (Integer) -> Integer + + attr_reader page: Integer? + + def page=: (Integer) -> Integer + + attr_reader search: String? + + def search=: (String) -> String + + def initialize: ( + employer_id: String, + ?employment_status: VitableConnect::Models::EmployerListEmployeesParams::employment_status, + ?limit: Integer, + ?page: Integer, + ?search: String, + ?request_options: VitableConnect::request_opts + ) -> void + + def to_hash: -> { + employer_id: String, + employment_status: VitableConnect::Models::EmployerListEmployeesParams::employment_status, + limit: Integer, + page: Integer, + search: String, + request_options: VitableConnect::RequestOptions + } + + type employment_status = :active | :terminated + + module EmploymentStatus + extend VitableConnect::Internal::Type::Enum + + ACTIVE: :active + TERMINATED: :terminated + + def self?.values: -> ::Array[VitableConnect::Models::EmployerListEmployeesParams::employment_status] + end + end + end +end diff --git a/sig/vitable_connect/models/employer_list_hris_providers_params.rbs b/sig/vitable_connect/models/employer_list_hris_providers_params.rbs new file mode 100644 index 0000000..b83dd7b --- /dev/null +++ b/sig/vitable_connect/models/employer_list_hris_providers_params.rbs @@ -0,0 +1,15 @@ +module VitableConnect + module Models + type employer_list_hris_providers_params = + { } & VitableConnect::Internal::Type::request_parameters + + class EmployerListHRISProvidersParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + def initialize: (?request_options: VitableConnect::request_opts) -> void + + def to_hash: -> { request_options: VitableConnect::RequestOptions } + end + end +end diff --git a/sig/vitable_connect/models/employer_list_hris_providers_response.rbs b/sig/vitable_connect/models/employer_list_hris_providers_response.rbs new file mode 100644 index 0000000..843faae --- /dev/null +++ b/sig/vitable_connect/models/employer_list_hris_providers_response.rbs @@ -0,0 +1,32 @@ +module VitableConnect + module Models + type employer_list_hris_providers_response = + { + data: ::Array[VitableConnect::Models::EmployerListHRISProvidersResponse::Data] + } + + class EmployerListHRISProvidersResponse < VitableConnect::Internal::Type::BaseModel + attr_accessor data: ::Array[VitableConnect::Models::EmployerListHRISProvidersResponse::Data] + + def initialize: ( + data: ::Array[VitableConnect::Models::EmployerListHRISProvidersResponse::Data] + ) -> void + + def to_hash: -> { + data: ::Array[VitableConnect::Models::EmployerListHRISProvidersResponse::Data] + } + + type data = { provider: String, provider_label: String } + + class Data < VitableConnect::Internal::Type::BaseModel + attr_accessor provider: String + + attr_accessor provider_label: String + + def initialize: (provider: String, provider_label: String) -> void + + def to_hash: -> { provider: String, provider_label: String } + end + end + end +end diff --git a/sig/vitable_connect/models/employer_list_invoices_params.rbs b/sig/vitable_connect/models/employer_list_invoices_params.rbs new file mode 100644 index 0000000..a52b21a --- /dev/null +++ b/sig/vitable_connect/models/employer_list_invoices_params.rbs @@ -0,0 +1,34 @@ +module VitableConnect + module Models + type employer_list_invoices_params = + { employer_id: String, limit: Integer, offset: String? } + & VitableConnect::Internal::Type::request_parameters + + class EmployerListInvoicesParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + attr_accessor employer_id: String + + attr_reader limit: Integer? + + def limit=: (Integer) -> Integer + + attr_accessor offset: String? + + def initialize: ( + employer_id: String, + ?limit: Integer, + ?offset: String?, + ?request_options: VitableConnect::request_opts + ) -> void + + def to_hash: -> { + employer_id: String, + limit: Integer, + offset: String?, + request_options: VitableConnect::RequestOptions + } + end + end +end diff --git a/sig/vitable_connect/models/employer_list_invoices_response.rbs b/sig/vitable_connect/models/employer_list_invoices_response.rbs new file mode 100644 index 0000000..91a1158 --- /dev/null +++ b/sig/vitable_connect/models/employer_list_invoices_response.rbs @@ -0,0 +1,62 @@ +module VitableConnect + module Models + type employer_list_invoices_response = + { + data: ::Array[VitableConnect::Models::EmployerListInvoicesResponse::Data], + pagination: VitableConnect::Models::EmployerListInvoicesResponse::Pagination + } + + class EmployerListInvoicesResponse < VitableConnect::Internal::Type::BaseModel + attr_accessor data: ::Array[VitableConnect::Models::EmployerListInvoicesResponse::Data] + + attr_accessor pagination: VitableConnect::Models::EmployerListInvoicesResponse::Pagination + + def initialize: ( + data: ::Array[VitableConnect::Models::EmployerListInvoicesResponse::Data], + pagination: VitableConnect::Models::EmployerListInvoicesResponse::Pagination + ) -> void + + def to_hash: -> { + data: ::Array[VitableConnect::Models::EmployerListInvoicesResponse::Data], + pagination: VitableConnect::Models::EmployerListInvoicesResponse::Pagination + } + + type data = + { invoice_id: String, period: String?, status: String?, total: Float? } + + class Data < VitableConnect::Internal::Type::BaseModel + attr_accessor invoice_id: String + + attr_accessor period: String? + + attr_accessor status: String? + + attr_accessor total: Float? + + def initialize: ( + invoice_id: String, + period: String?, + status: String?, + total: Float? + ) -> void + + def to_hash: -> { + invoice_id: String, + period: String?, + status: String?, + total: Float? + } + end + + type pagination = { next_offset: String? } + + class Pagination < VitableConnect::Internal::Type::BaseModel + attr_accessor next_offset: String? + + def initialize: (next_offset: String?) -> void + + def to_hash: -> { next_offset: String? } + end + end + end +end diff --git a/sig/vitable_connect/models/employer_list_params.rbs b/sig/vitable_connect/models/employer_list_params.rbs new file mode 100644 index 0000000..2b5b6d4 --- /dev/null +++ b/sig/vitable_connect/models/employer_list_params.rbs @@ -0,0 +1,125 @@ +module VitableConnect + module Models + type employer_list_params = + { + benefit_family: ::Array[VitableConnect::Models::EmployerListParams::benefit_family], + benefit_lifecycle_stage: ::Array[VitableConnect::Models::EmployerListParams::benefit_lifecycle_stage], + hris_provider: ::Array[String], + hris_status: ::Array[VitableConnect::Models::EmployerListParams::hris_status], + include_cancelled: bool, + limit: Integer, + page: Integer, + search: String? + } + & VitableConnect::Internal::Type::request_parameters + + class EmployerListParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + attr_reader benefit_family: ::Array[VitableConnect::Models::EmployerListParams::benefit_family]? + + def benefit_family=: ( + ::Array[VitableConnect::Models::EmployerListParams::benefit_family] + ) -> ::Array[VitableConnect::Models::EmployerListParams::benefit_family] + + attr_reader benefit_lifecycle_stage: ::Array[VitableConnect::Models::EmployerListParams::benefit_lifecycle_stage]? + + def benefit_lifecycle_stage=: ( + ::Array[VitableConnect::Models::EmployerListParams::benefit_lifecycle_stage] + ) -> ::Array[VitableConnect::Models::EmployerListParams::benefit_lifecycle_stage] + + attr_reader hris_provider: ::Array[String]? + + def hris_provider=: (::Array[String]) -> ::Array[String] + + attr_reader hris_status: ::Array[VitableConnect::Models::EmployerListParams::hris_status]? + + def hris_status=: ( + ::Array[VitableConnect::Models::EmployerListParams::hris_status] + ) -> ::Array[VitableConnect::Models::EmployerListParams::hris_status] + + attr_reader include_cancelled: bool? + + def include_cancelled=: (bool) -> bool + + attr_reader limit: Integer? + + def limit=: (Integer) -> Integer + + attr_reader page: Integer? + + def page=: (Integer) -> Integer + + attr_accessor search: String? + + def initialize: ( + ?benefit_family: ::Array[VitableConnect::Models::EmployerListParams::benefit_family], + ?benefit_lifecycle_stage: ::Array[VitableConnect::Models::EmployerListParams::benefit_lifecycle_stage], + ?hris_provider: ::Array[String], + ?hris_status: ::Array[VitableConnect::Models::EmployerListParams::hris_status], + ?include_cancelled: bool, + ?limit: Integer, + ?page: Integer, + ?search: String?, + ?request_options: VitableConnect::request_opts + ) -> void + + def to_hash: -> { + benefit_family: ::Array[VitableConnect::Models::EmployerListParams::benefit_family], + benefit_lifecycle_stage: ::Array[VitableConnect::Models::EmployerListParams::benefit_lifecycle_stage], + hris_provider: ::Array[String], + hris_status: ::Array[VitableConnect::Models::EmployerListParams::hris_status], + include_cancelled: bool, + limit: Integer, + page: Integer, + search: String?, + request_options: VitableConnect::RequestOptions + } + + type benefit_family = :mec | :mvp | :ichra | :vpc | :dental | :vision + + module BenefitFamily + extend VitableConnect::Internal::Type::Enum + + MEC: :mec + MVP: :mvp + ICHRA: :ichra + VPC: :vpc + DENTAL: :dental + VISION: :vision + + def self?.values: -> ::Array[VitableConnect::Models::EmployerListParams::benefit_family] + end + + type benefit_lifecycle_stage = + :open_enrollment | :renewal | :active | :onboarding | :cancelled + + module BenefitLifecycleStage + extend VitableConnect::Internal::Type::Enum + + OPEN_ENROLLMENT: :open_enrollment + RENEWAL: :renewal + ACTIVE: :active + ONBOARDING: :onboarding + CANCELLED: :cancelled + + def self?.values: -> ::Array[VitableConnect::Models::EmployerListParams::benefit_lifecycle_stage] + end + + type hris_status = :Pending | :Active | :Inactive | :Paused | :Terminated + + module HRISStatus + extend VitableConnect::Internal::Type::Enum + + PENDING: :Pending + ACTIVE: :Active + INACTIVE: :Inactive + PAUSED: :Paused + TERMINATED: :Terminated + + def self?.values: -> ::Array[VitableConnect::Models::EmployerListParams::hris_status] + end + end + end +end diff --git a/sig/vitable_connect/models/employer_list_payroll_deduction_statements_params.rbs b/sig/vitable_connect/models/employer_list_payroll_deduction_statements_params.rbs new file mode 100644 index 0000000..11a393e --- /dev/null +++ b/sig/vitable_connect/models/employer_list_payroll_deduction_statements_params.rbs @@ -0,0 +1,36 @@ +module VitableConnect + module Models + type employer_list_payroll_deduction_statements_params = + { employer_id: String, limit: Integer, page: Integer } + & VitableConnect::Internal::Type::request_parameters + + class EmployerListPayrollDeductionStatementsParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + attr_accessor employer_id: String + + attr_reader limit: Integer? + + def limit=: (Integer) -> Integer + + attr_reader page: Integer? + + def page=: (Integer) -> Integer + + def initialize: ( + employer_id: String, + ?limit: Integer, + ?page: Integer, + ?request_options: VitableConnect::request_opts + ) -> void + + def to_hash: -> { + employer_id: String, + limit: Integer, + page: Integer, + request_options: VitableConnect::RequestOptions + } + end + end +end diff --git a/sig/vitable_connect/models/employer_list_payroll_deduction_statements_response.rbs b/sig/vitable_connect/models/employer_list_payroll_deduction_statements_response.rbs new file mode 100644 index 0000000..25b1d03 --- /dev/null +++ b/sig/vitable_connect/models/employer_list_payroll_deduction_statements_response.rbs @@ -0,0 +1,73 @@ +module VitableConnect + module Models + type employer_list_payroll_deduction_statements_response = + { + csv_file_url: String?, + deduction_frequency: VitableConnect::Models::EmployerListPayrollDeductionStatementsResponse::deduction_frequency, + deduction_frequency_label: String, + employee_count: Integer, + period_end: Date, + period_start: Date, + run_date: Time, + statement_id: String, + total_deduction_cents: Integer + } + + class EmployerListPayrollDeductionStatementsResponse < VitableConnect::Internal::Type::BaseModel + attr_accessor csv_file_url: String? + + attr_accessor deduction_frequency: VitableConnect::Models::EmployerListPayrollDeductionStatementsResponse::deduction_frequency + + attr_accessor deduction_frequency_label: String + + attr_accessor employee_count: Integer + + attr_accessor period_end: Date + + attr_accessor period_start: Date + + attr_accessor run_date: Time + + attr_accessor statement_id: String + + attr_accessor total_deduction_cents: Integer + + def initialize: ( + csv_file_url: String?, + deduction_frequency: VitableConnect::Models::EmployerListPayrollDeductionStatementsResponse::deduction_frequency, + deduction_frequency_label: String, + employee_count: Integer, + period_end: Date, + period_start: Date, + run_date: Time, + statement_id: String, + total_deduction_cents: Integer + ) -> void + + def to_hash: -> { + csv_file_url: String?, + deduction_frequency: VitableConnect::Models::EmployerListPayrollDeductionStatementsResponse::deduction_frequency, + deduction_frequency_label: String, + employee_count: Integer, + period_end: Date, + period_start: Date, + run_date: Time, + statement_id: String, + total_deduction_cents: Integer + } + + type deduction_frequency = :weekly | :bi_weekly | :semi_monthly | :monthly + + module DeductionFrequency + extend VitableConnect::Internal::Type::Enum + + WEEKLY: :weekly + BI_WEEKLY: :bi_weekly + SEMI_MONTHLY: :semi_monthly + MONTHLY: :monthly + + def self?.values: -> ::Array[VitableConnect::Models::EmployerListPayrollDeductionStatementsResponse::deduction_frequency] + end + end + end +end diff --git a/sig/vitable_connect/models/employer_list_response.rbs b/sig/vitable_connect/models/employer_list_response.rbs new file mode 100644 index 0000000..a48eaf2 --- /dev/null +++ b/sig/vitable_connect/models/employer_list_response.rbs @@ -0,0 +1,190 @@ +module VitableConnect + module Models + type employer_list_response = + { + active: bool, + address: VitableConnect::Models::EmployerListResponse::Address, + benefit_families: ::Array[String], + benefit_lifecycle_stage: VitableConnect::Models::EmployerListResponse::BenefitLifecycleStage, + created_at: Time, + ein: String?, + email: String?, + employer_id: String, + enrollment_rate_summary: VitableConnect::Models::EmployerListResponse::EnrollmentRateSummary, + hris_status: VitableConnect::Models::EmployerListResponse::HRISStatus?, + legal_name: String?, + name: String, + organization_id: String?, + phone_number: String?, + reference_id: String?, + updated_at: Time + } + + class EmployerListResponse < VitableConnect::Internal::Type::BaseModel + attr_accessor active: bool + + attr_accessor address: VitableConnect::Models::EmployerListResponse::Address + + attr_accessor benefit_families: ::Array[String] + + attr_accessor benefit_lifecycle_stage: VitableConnect::Models::EmployerListResponse::BenefitLifecycleStage + + attr_accessor created_at: Time + + attr_accessor ein: String? + + attr_accessor email: String? + + attr_accessor employer_id: String + + attr_accessor enrollment_rate_summary: VitableConnect::Models::EmployerListResponse::EnrollmentRateSummary + + attr_accessor hris_status: VitableConnect::Models::EmployerListResponse::HRISStatus? + + attr_accessor legal_name: String? + + attr_accessor name: String + + attr_accessor organization_id: String? + + attr_accessor phone_number: String? + + attr_accessor reference_id: String? + + attr_accessor updated_at: Time + + def initialize: ( + active: bool, + address: VitableConnect::Models::EmployerListResponse::Address, + benefit_families: ::Array[String], + benefit_lifecycle_stage: VitableConnect::Models::EmployerListResponse::BenefitLifecycleStage, + created_at: Time, + ein: String?, + email: String?, + employer_id: String, + enrollment_rate_summary: VitableConnect::Models::EmployerListResponse::EnrollmentRateSummary, + hris_status: VitableConnect::Models::EmployerListResponse::HRISStatus?, + legal_name: String?, + name: String, + organization_id: String?, + phone_number: String?, + reference_id: String?, + updated_at: Time + ) -> void + + def to_hash: -> { + active: bool, + address: VitableConnect::Models::EmployerListResponse::Address, + benefit_families: ::Array[String], + benefit_lifecycle_stage: VitableConnect::Models::EmployerListResponse::BenefitLifecycleStage, + created_at: Time, + ein: String?, + email: String?, + employer_id: String, + enrollment_rate_summary: VitableConnect::Models::EmployerListResponse::EnrollmentRateSummary, + hris_status: VitableConnect::Models::EmployerListResponse::HRISStatus?, + legal_name: String?, + name: String, + organization_id: String?, + phone_number: String?, + reference_id: String?, + updated_at: Time + } + + type address = + { + :address_line_1 => String, + :address_line_2 => String?, + city: String, + state: String, + zipcode: String + } + + class Address < VitableConnect::Internal::Type::BaseModel + attr_accessor address_line_1: String + + attr_accessor address_line_2: String? + + attr_accessor city: String + + attr_accessor state: String + + attr_accessor zipcode: String + + def initialize: ( + address_line_1: String, + address_line_2: String?, + city: String, + state: String, + zipcode: String + ) -> void + + def to_hash: -> { + :address_line_1 => String, + :address_line_2 => String?, + city: String, + state: String, + zipcode: String + } + end + + type benefit_lifecycle_stage = { as_of_date: Date?, stage: String } + + class BenefitLifecycleStage < VitableConnect::Internal::Type::BaseModel + attr_accessor as_of_date: Date? + + attr_accessor stage: String + + def initialize: (as_of_date: Date?, stage: String) -> void + + def to_hash: -> { as_of_date: Date?, stage: String } + end + + type enrollment_rate_summary = + { eligible: Integer, enrolled: Integer, percentage: Integer } + + class EnrollmentRateSummary < VitableConnect::Internal::Type::BaseModel + attr_accessor eligible: Integer + + attr_accessor enrolled: Integer + + attr_accessor percentage: Integer + + def initialize: ( + eligible: Integer, + enrolled: Integer, + percentage: Integer + ) -> void + + def to_hash: -> { + eligible: Integer, + enrolled: Integer, + percentage: Integer + } + end + + type hris_status = + { provider: String, provider_label: String, status: String } + + class HRISStatus < VitableConnect::Internal::Type::BaseModel + attr_accessor provider: String + + attr_accessor provider_label: String + + attr_accessor status: String + + def initialize: ( + provider: String, + provider_label: String, + status: String + ) -> void + + def to_hash: -> { + provider: String, + provider_label: String, + status: String + } + end + end + end +end diff --git a/sig/vitable_connect/models/employer_response.rbs b/sig/vitable_connect/models/employer_response.rbs new file mode 100644 index 0000000..d59e82f --- /dev/null +++ b/sig/vitable_connect/models/employer_response.rbs @@ -0,0 +1,13 @@ +module VitableConnect + module Models + type employer_response = { data: VitableConnect::Employer } + + class EmployerResponse < VitableConnect::Internal::Type::BaseModel + attr_accessor data: VitableConnect::Employer + + def initialize: (data: VitableConnect::Employer) -> void + + def to_hash: -> { data: VitableConnect::Employer } + end + end +end diff --git a/sig/vitable_connect/models/employer_retrieve_benefit_plan_year_params.rbs b/sig/vitable_connect/models/employer_retrieve_benefit_plan_year_params.rbs new file mode 100644 index 0000000..8878f8d --- /dev/null +++ b/sig/vitable_connect/models/employer_retrieve_benefit_plan_year_params.rbs @@ -0,0 +1,28 @@ +module VitableConnect + module Models + type employer_retrieve_benefit_plan_year_params = + { employer_id: String, benefit_plan_year_id: String } + & VitableConnect::Internal::Type::request_parameters + + class EmployerRetrieveBenefitPlanYearParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + attr_accessor employer_id: String + + attr_accessor benefit_plan_year_id: String + + def initialize: ( + employer_id: String, + benefit_plan_year_id: String, + ?request_options: VitableConnect::request_opts + ) -> void + + def to_hash: -> { + employer_id: String, + benefit_plan_year_id: String, + request_options: VitableConnect::RequestOptions + } + end + end +end diff --git a/sig/vitable_connect/models/employer_retrieve_benefit_plan_year_response.rbs b/sig/vitable_connect/models/employer_retrieve_benefit_plan_year_response.rbs new file mode 100644 index 0000000..dbe7dbe --- /dev/null +++ b/sig/vitable_connect/models/employer_retrieve_benefit_plan_year_response.rbs @@ -0,0 +1,559 @@ +module VitableConnect + module Models + type employer_retrieve_benefit_plan_year_response = + { + data: VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data + } + + class EmployerRetrieveBenefitPlanYearResponse < VitableConnect::Internal::Type::BaseModel + attr_accessor data: VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data + + def initialize: ( + data: VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data + ) -> void + + def to_hash: -> { + data: VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data + } + + type data = + { + benefit_id: String, + benefit_plan_year_id: String, + carrier: String?, + contribution_strategy: VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy, + coverage_end: Date?, + coverage_start: Date, + eligibility_policy: VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy?, + employee_contribution: VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EmployeeContribution?, + employer_contribution: VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EmployerContribution?, + enrollment_rate: VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EnrollmentRate, + family: VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::family, + network_names: ::Array[String], + offered_states: ::Array[String], + open_enrollment_end: Date?, + open_enrollment_start: Date, + premium_in_cents: Integer?, + product_name: String, + spd_file_url: String?, + status: VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::status, + year: Integer + } + + class Data < VitableConnect::Internal::Type::BaseModel + attr_accessor benefit_id: String + + attr_accessor benefit_plan_year_id: String + + attr_accessor carrier: String? + + attr_accessor contribution_strategy: VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy + + attr_accessor coverage_end: Date? + + attr_accessor coverage_start: Date + + attr_accessor eligibility_policy: VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy? + + attr_accessor employee_contribution: VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EmployeeContribution? + + attr_accessor employer_contribution: VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EmployerContribution? + + attr_accessor enrollment_rate: VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EnrollmentRate + + attr_accessor family: VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::family + + attr_accessor network_names: ::Array[String] + + attr_accessor offered_states: ::Array[String] + + attr_accessor open_enrollment_end: Date? + + attr_accessor open_enrollment_start: Date + + attr_accessor premium_in_cents: Integer? + + attr_accessor product_name: String + + attr_accessor spd_file_url: String? + + attr_accessor status: VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::status + + attr_accessor year: Integer + + def initialize: ( + benefit_id: String, + benefit_plan_year_id: String, + carrier: String?, + contribution_strategy: VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy, + coverage_end: Date?, + coverage_start: Date, + eligibility_policy: VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy?, + employee_contribution: VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EmployeeContribution?, + employer_contribution: VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EmployerContribution?, + enrollment_rate: VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EnrollmentRate, + family: VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::family, + network_names: ::Array[String], + offered_states: ::Array[String], + open_enrollment_end: Date?, + open_enrollment_start: Date, + premium_in_cents: Integer?, + product_name: String, + spd_file_url: String?, + status: VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::status, + year: Integer + ) -> void + + def to_hash: -> { + benefit_id: String, + benefit_plan_year_id: String, + carrier: String?, + contribution_strategy: VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy, + coverage_end: Date?, + coverage_start: Date, + eligibility_policy: VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy?, + employee_contribution: VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EmployeeContribution?, + employer_contribution: VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EmployerContribution?, + enrollment_rate: VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EnrollmentRate, + family: VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::family, + network_names: ::Array[String], + offered_states: ::Array[String], + open_enrollment_end: Date?, + open_enrollment_start: Date, + premium_in_cents: Integer?, + product_name: String, + spd_file_url: String?, + status: VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::status, + year: Integer + } + + type contribution_strategy = + { + contribution_tiers: ::Array[VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::ContributionTier], + ichra_contribution_classes: ::Array[VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass] + } + + class ContributionStrategy < VitableConnect::Internal::Type::BaseModel + attr_accessor contribution_tiers: ::Array[VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::ContributionTier] + + attr_accessor ichra_contribution_classes: ::Array[VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass] + + def initialize: ( + contribution_tiers: ::Array[VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::ContributionTier], + ichra_contribution_classes: ::Array[VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass] + ) -> void + + def to_hash: -> { + contribution_tiers: ::Array[VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::ContributionTier], + ichra_contribution_classes: ::Array[VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass] + } + + type contribution_tier = + { + benefit_plan_id: String, + benefit_plan_name: String, + benefit_plan_tier_name: String, + cost: Integer, + cost_per_dependent: Integer, + coverage_tier: VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::ContributionTier::coverage_tier, + dependents_required_in: bool, + spouse_required_in: bool + } + + class ContributionTier < VitableConnect::Internal::Type::BaseModel + attr_accessor benefit_plan_id: String + + attr_accessor benefit_plan_name: String + + attr_accessor benefit_plan_tier_name: String + + attr_accessor cost: Integer + + attr_accessor cost_per_dependent: Integer + + attr_accessor coverage_tier: VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::ContributionTier::coverage_tier + + attr_accessor dependents_required_in: bool + + attr_accessor spouse_required_in: bool + + def initialize: ( + benefit_plan_id: String, + benefit_plan_name: String, + benefit_plan_tier_name: String, + cost: Integer, + cost_per_dependent: Integer, + coverage_tier: VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::ContributionTier::coverage_tier, + dependents_required_in: bool, + spouse_required_in: bool + ) -> void + + def to_hash: -> { + benefit_plan_id: String, + benefit_plan_name: String, + benefit_plan_tier_name: String, + cost: Integer, + cost_per_dependent: Integer, + coverage_tier: VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::ContributionTier::coverage_tier, + dependents_required_in: bool, + spouse_required_in: bool + } + + type coverage_tier = :Unspecified | :EE | :ES | :EC | :EF + + module CoverageTier + extend VitableConnect::Internal::Type::Enum + + UNSPECIFIED: :Unspecified + EE: :EE + ES: :ES + EC: :EC + EF: :EF + + def self?.values: -> ::Array[VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::ContributionTier::coverage_tier] + end + end + + type ichra_contribution_class = + { + amount_in_cents: Integer, + compensation: VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass::compensation, + contribution_class_id: String, + employment: VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass::employment, + family_status: VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass::family_status, + location: VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass::location, + location_value: String?, + max_age: Integer?, + min_age: Integer? + } + + class IchraContributionClass < VitableConnect::Internal::Type::BaseModel + attr_accessor amount_in_cents: Integer + + attr_accessor compensation: VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass::compensation + + attr_accessor contribution_class_id: String + + attr_accessor employment: VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass::employment + + attr_accessor family_status: VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass::family_status + + attr_accessor location: VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass::location + + attr_accessor location_value: String? + + attr_accessor max_age: Integer? + + attr_accessor min_age: Integer? + + def initialize: ( + amount_in_cents: Integer, + compensation: VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass::compensation, + contribution_class_id: String, + employment: VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass::employment, + family_status: VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass::family_status, + location: VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass::location, + location_value: String?, + max_age: Integer?, + min_age: Integer? + ) -> void + + def to_hash: -> { + amount_in_cents: Integer, + compensation: VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass::compensation, + contribution_class_id: String, + employment: VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass::employment, + family_status: VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass::family_status, + location: VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass::location, + location_value: String?, + max_age: Integer?, + min_age: Integer? + } + + type compensation = :Unspecified | :Salary | :Hourly + + module Compensation + extend VitableConnect::Internal::Type::Enum + + UNSPECIFIED: :Unspecified + SALARY: :Salary + HOURLY: :Hourly + + def self?.values: -> ::Array[VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass::compensation] + end + + type employment = + :Unspecified + | :"Full Time" + | :"Part Time" + | :Temporary + | :Seasonal + + module Employment + extend VitableConnect::Internal::Type::Enum + + UNSPECIFIED: :Unspecified + FULL_TIME: :"Full Time" + PART_TIME: :"Part Time" + TEMPORARY: :Temporary + SEASONAL: :Seasonal + + def self?.values: -> ::Array[VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass::employment] + end + + type family_status = :Unspecified | :EE | :ES | :EC | :EF + + module FamilyStatus + extend VitableConnect::Internal::Type::Enum + + UNSPECIFIED: :Unspecified + EE: :EE + ES: :ES + EC: :EC + EF: :EF + + def self?.values: -> ::Array[VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass::family_status] + end + + type location = :Unspecified | :State + + module Location + extend VitableConnect::Internal::Type::Enum + + UNSPECIFIED: :Unspecified + STATE: :State + + def self?.values: -> ::Array[VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::ContributionStrategy::IchraContributionClass::location] + end + end + end + + type eligibility_policy = + { + rules: ::Array[VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::Rule], + termination_n_months: Integer?, + termination_rule: VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::termination_rule, + waiting_period: VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::waiting_period? + } + + class EligibilityPolicy < VitableConnect::Internal::Type::BaseModel + attr_accessor rules: ::Array[VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::Rule] + + attr_accessor termination_n_months: Integer? + + attr_accessor termination_rule: VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::termination_rule + + attr_accessor waiting_period: VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::waiting_period? + + def initialize: ( + rules: ::Array[VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::Rule], + termination_n_months: Integer?, + termination_rule: VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::termination_rule, + waiting_period: VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::waiting_period? + ) -> void + + def to_hash: -> { + rules: ::Array[VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::Rule], + termination_n_months: Integer?, + termination_rule: VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::termination_rule, + waiting_period: VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::waiting_period? + } + + type rule = + { + compensation_type: VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::Rule::compensation_type, + eligible_geographical_location: VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::Rule::EligibleGeographicalLocation, + employee_class: VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::Rule::employee_class + } + + class Rule < VitableConnect::Internal::Type::BaseModel + attr_accessor compensation_type: VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::Rule::compensation_type + + attr_accessor eligible_geographical_location: VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::Rule::EligibleGeographicalLocation + + attr_accessor employee_class: VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::Rule::employee_class + + def initialize: ( + compensation_type: VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::Rule::compensation_type, + eligible_geographical_location: VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::Rule::EligibleGeographicalLocation, + employee_class: VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::Rule::employee_class + ) -> void + + def to_hash: -> { + compensation_type: VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::Rule::compensation_type, + eligible_geographical_location: VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::Rule::EligibleGeographicalLocation, + employee_class: VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::Rule::employee_class + } + + type compensation_type = :Salary | :Hourly | :All + + module CompensationType + extend VitableConnect::Internal::Type::Enum + + SALARY: :Salary + HOURLY: :Hourly + ALL: :All + + def self?.values: -> ::Array[VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::Rule::compensation_type] + end + + type eligible_geographical_location = + { + state_codes: ::Array[String], + type: VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::Rule::EligibleGeographicalLocation::type_ + } + + class EligibleGeographicalLocation < VitableConnect::Internal::Type::BaseModel + attr_accessor state_codes: ::Array[String] + + attr_accessor type: VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::Rule::EligibleGeographicalLocation::type_ + + def initialize: ( + state_codes: ::Array[String], + type: VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::Rule::EligibleGeographicalLocation::type_ + ) -> void + + def to_hash: -> { + state_codes: ::Array[String], + type: VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::Rule::EligibleGeographicalLocation::type_ + } + + type type_ = :All | :StateCodes + + module Type + extend VitableConnect::Internal::Type::Enum + + ALL: :All + STATE_CODES: :StateCodes + + def self?.values: -> ::Array[VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::Rule::EligibleGeographicalLocation::type_] + end + end + + type employee_class = + :"Full Time" + | :"Part Time" + | :Temporary + | :Intern + | :Seasonal + | :"Individual Contractor" + | :All + + module EmployeeClass + extend VitableConnect::Internal::Type::Enum + + FULL_TIME: :"Full Time" + PART_TIME: :"Part Time" + TEMPORARY: :Temporary + INTERN: :Intern + SEASONAL: :Seasonal + INDIVIDUAL_CONTRACTOR: :"Individual Contractor" + ALL: :All + + def self?.values: -> ::Array[VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::Rule::employee_class] + end + end + + type termination_rule = :END_OF_N_MONTHS | :END_OF_PLAN_YEAR + + module TerminationRule + extend VitableConnect::Internal::Type::Enum + + END_OF_N_MONTHS: :END_OF_N_MONTHS + END_OF_PLAN_YEAR: :END_OF_PLAN_YEAR + + def self?.values: -> ::Array[VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::termination_rule] + end + + type waiting_period = + :FIRST_OF_FOLLOWING_MONTH | :THIRTY_DAYS | :SIXTY_DAYS + + module WaitingPeriod + extend VitableConnect::Internal::Type::Enum + + FIRST_OF_FOLLOWING_MONTH: :FIRST_OF_FOLLOWING_MONTH + THIRTY_DAYS: :THIRTY_DAYS + SIXTY_DAYS: :SIXTY_DAYS + + def self?.values: -> ::Array[VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::EligibilityPolicy::waiting_period] + end + end + + type employee_contribution = { max_cents: Integer, min_cents: Integer } + + class EmployeeContribution < VitableConnect::Internal::Type::BaseModel + attr_accessor max_cents: Integer + + attr_accessor min_cents: Integer + + def initialize: (max_cents: Integer, min_cents: Integer) -> void + + def to_hash: -> { max_cents: Integer, min_cents: Integer } + end + + type employer_contribution = { max_cents: Integer, min_cents: Integer } + + class EmployerContribution < VitableConnect::Internal::Type::BaseModel + attr_accessor max_cents: Integer + + attr_accessor min_cents: Integer + + def initialize: (max_cents: Integer, min_cents: Integer) -> void + + def to_hash: -> { max_cents: Integer, min_cents: Integer } + end + + type enrollment_rate = + { eligible: Integer, enrolled: Integer, percentage: Integer } + + class EnrollmentRate < VitableConnect::Internal::Type::BaseModel + attr_accessor eligible: Integer + + attr_accessor enrolled: Integer + + attr_accessor percentage: Integer + + def initialize: ( + eligible: Integer, + enrolled: Integer, + percentage: Integer + ) -> void + + def to_hash: -> { + eligible: Integer, + enrolled: Integer, + percentage: Integer + } + end + + type family = :mec | :mvp | :ichra | :vpc | :dental | :vision + + module Family + extend VitableConnect::Internal::Type::Enum + + MEC: :mec + MVP: :mvp + ICHRA: :ichra + VPC: :vpc + DENTAL: :dental + VISION: :vision + + def self?.values: -> ::Array[VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::family] + end + + type status = :active | :upcoming | :open_enrollment | :inactive + + module Status + extend VitableConnect::Internal::Type::Enum + + ACTIVE: :active + UPCOMING: :upcoming + OPEN_ENROLLMENT: :open_enrollment + INACTIVE: :inactive + + def self?.values: -> ::Array[VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data::status] + end + end + end + end +end diff --git a/sig/vitable_connect/models/employer_retrieve_hris_params.rbs b/sig/vitable_connect/models/employer_retrieve_hris_params.rbs new file mode 100644 index 0000000..e038c2c --- /dev/null +++ b/sig/vitable_connect/models/employer_retrieve_hris_params.rbs @@ -0,0 +1,24 @@ +module VitableConnect + module Models + type employer_retrieve_hris_params = + { employer_id: String } + & VitableConnect::Internal::Type::request_parameters + + class EmployerRetrieveHRISParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + attr_accessor employer_id: String + + def initialize: ( + employer_id: String, + ?request_options: VitableConnect::request_opts + ) -> void + + def to_hash: -> { + employer_id: String, + request_options: VitableConnect::RequestOptions + } + end + end +end diff --git a/sig/vitable_connect/models/employer_retrieve_hris_response.rbs b/sig/vitable_connect/models/employer_retrieve_hris_response.rbs new file mode 100644 index 0000000..c154e6b --- /dev/null +++ b/sig/vitable_connect/models/employer_retrieve_hris_response.rbs @@ -0,0 +1,72 @@ +module VitableConnect + module Models + type employer_retrieve_hris_response = + { data: VitableConnect::Models::EmployerRetrieveHRISResponse::Data } + + class EmployerRetrieveHRISResponse < VitableConnect::Internal::Type::BaseModel + attr_accessor data: VitableConnect::Models::EmployerRetrieveHRISResponse::Data + + def initialize: ( + data: VitableConnect::Models::EmployerRetrieveHRISResponse::Data + ) -> void + + def to_hash: -> { + data: VitableConnect::Models::EmployerRetrieveHRISResponse::Data + } + + type data = + { + hris: VitableConnect::Models::EmployerRetrieveHRISResponse::Data::HRIS? + } + + class Data < VitableConnect::Internal::Type::BaseModel + attr_accessor hris: VitableConnect::Models::EmployerRetrieveHRISResponse::Data::HRIS? + + def initialize: ( + hris: VitableConnect::Models::EmployerRetrieveHRISResponse::Data::HRIS? + ) -> void + + def to_hash: -> { + hris: VitableConnect::Models::EmployerRetrieveHRISResponse::Data::HRIS? + } + + type hris = + { + last_sync_on: Time?, + provider: String, + provider_label: String, + status: String, + synced_row_count: Integer? + } + + class HRIS < VitableConnect::Internal::Type::BaseModel + attr_accessor last_sync_on: Time? + + attr_accessor provider: String + + attr_accessor provider_label: String + + attr_accessor status: String + + attr_accessor synced_row_count: Integer? + + def initialize: ( + last_sync_on: Time?, + provider: String, + provider_label: String, + status: String, + synced_row_count: Integer? + ) -> void + + def to_hash: -> { + last_sync_on: Time?, + provider: String, + provider_label: String, + status: String, + synced_row_count: Integer? + } + end + end + end + end +end diff --git a/sig/vitable_connect/models/employer_retrieve_invoice_pdf_params.rbs b/sig/vitable_connect/models/employer_retrieve_invoice_pdf_params.rbs new file mode 100644 index 0000000..ad0ab0e --- /dev/null +++ b/sig/vitable_connect/models/employer_retrieve_invoice_pdf_params.rbs @@ -0,0 +1,28 @@ +module VitableConnect + module Models + type employer_retrieve_invoice_pdf_params = + { employer_id: String, invoice_id: String } + & VitableConnect::Internal::Type::request_parameters + + class EmployerRetrieveInvoicePdfParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + attr_accessor employer_id: String + + attr_accessor invoice_id: String + + def initialize: ( + employer_id: String, + invoice_id: String, + ?request_options: VitableConnect::request_opts + ) -> void + + def to_hash: -> { + employer_id: String, + invoice_id: String, + request_options: VitableConnect::RequestOptions + } + end + end +end diff --git a/sig/vitable_connect/models/employer_retrieve_invoice_pdf_response.rbs b/sig/vitable_connect/models/employer_retrieve_invoice_pdf_response.rbs new file mode 100644 index 0000000..45ec7d3 --- /dev/null +++ b/sig/vitable_connect/models/employer_retrieve_invoice_pdf_response.rbs @@ -0,0 +1,28 @@ +module VitableConnect + module Models + type employer_retrieve_invoice_pdf_response = + { data: VitableConnect::Models::EmployerRetrieveInvoicePdfResponse::Data } + + class EmployerRetrieveInvoicePdfResponse < VitableConnect::Internal::Type::BaseModel + attr_accessor data: VitableConnect::Models::EmployerRetrieveInvoicePdfResponse::Data + + def initialize: ( + data: VitableConnect::Models::EmployerRetrieveInvoicePdfResponse::Data + ) -> void + + def to_hash: -> { + data: VitableConnect::Models::EmployerRetrieveInvoicePdfResponse::Data + } + + type data = { download_url: String } + + class Data < VitableConnect::Internal::Type::BaseModel + attr_accessor download_url: String + + def initialize: (download_url: String) -> void + + def to_hash: -> { download_url: String } + end + end + end +end diff --git a/sig/vitable_connect/models/employer_retrieve_params.rbs b/sig/vitable_connect/models/employer_retrieve_params.rbs new file mode 100644 index 0000000..ca66493 --- /dev/null +++ b/sig/vitable_connect/models/employer_retrieve_params.rbs @@ -0,0 +1,24 @@ +module VitableConnect + module Models + type employer_retrieve_params = + { employer_id: String } + & VitableConnect::Internal::Type::request_parameters + + class EmployerRetrieveParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + attr_accessor employer_id: String + + def initialize: ( + employer_id: String, + ?request_options: VitableConnect::request_opts + ) -> void + + def to_hash: -> { + employer_id: String, + request_options: VitableConnect::RequestOptions + } + end + end +end diff --git a/sig/vitable_connect/models/employer_retrieve_payroll_access_setup_params.rbs b/sig/vitable_connect/models/employer_retrieve_payroll_access_setup_params.rbs new file mode 100644 index 0000000..8d260b2 --- /dev/null +++ b/sig/vitable_connect/models/employer_retrieve_payroll_access_setup_params.rbs @@ -0,0 +1,24 @@ +module VitableConnect + module Models + type employer_retrieve_payroll_access_setup_params = + { employer_id: String } + & VitableConnect::Internal::Type::request_parameters + + class EmployerRetrievePayrollAccessSetupParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + attr_accessor employer_id: String + + def initialize: ( + employer_id: String, + ?request_options: VitableConnect::request_opts + ) -> void + + def to_hash: -> { + employer_id: String, + request_options: VitableConnect::RequestOptions + } + end + end +end diff --git a/sig/vitable_connect/models/employer_retrieve_payroll_access_setup_response.rbs b/sig/vitable_connect/models/employer_retrieve_payroll_access_setup_response.rbs new file mode 100644 index 0000000..e633fae --- /dev/null +++ b/sig/vitable_connect/models/employer_retrieve_payroll_access_setup_response.rbs @@ -0,0 +1,32 @@ +module VitableConnect + module Models + type employer_retrieve_payroll_access_setup_response = + { + data: VitableConnect::Models::EmployerRetrievePayrollAccessSetupResponse::Data + } + + class EmployerRetrievePayrollAccessSetupResponse < VitableConnect::Internal::Type::BaseModel + attr_accessor data: VitableConnect::Models::EmployerRetrievePayrollAccessSetupResponse::Data + + def initialize: ( + data: VitableConnect::Models::EmployerRetrievePayrollAccessSetupResponse::Data + ) -> void + + def to_hash: -> { + data: VitableConnect::Models::EmployerRetrievePayrollAccessSetupResponse::Data + } + + type data = { completed: bool, submitted_at: Time? } + + class Data < VitableConnect::Internal::Type::BaseModel + attr_accessor completed: bool + + attr_accessor submitted_at: Time? + + def initialize: (completed: bool, submitted_at: Time?) -> void + + def to_hash: -> { completed: bool, submitted_at: Time? } + end + end + end +end diff --git a/sig/vitable_connect/models/employer_submit_census_sync_params.rbs b/sig/vitable_connect/models/employer_submit_census_sync_params.rbs new file mode 100644 index 0000000..7cc94f4 --- /dev/null +++ b/sig/vitable_connect/models/employer_submit_census_sync_params.rbs @@ -0,0 +1,274 @@ +module VitableConnect + module Models + type employer_submit_census_sync_params = + { + employer_id: String, + employees: ::Array[VitableConnect::EmployerSubmitCensusSyncParams::Employee] + } + & VitableConnect::Internal::Type::request_parameters + + class EmployerSubmitCensusSyncParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + attr_accessor employer_id: String + + attr_accessor employees: ::Array[VitableConnect::EmployerSubmitCensusSyncParams::Employee] + + def initialize: ( + employer_id: String, + employees: ::Array[VitableConnect::EmployerSubmitCensusSyncParams::Employee], + ?request_options: VitableConnect::request_opts + ) -> void + + def to_hash: -> { + employer_id: String, + employees: ::Array[VitableConnect::EmployerSubmitCensusSyncParams::Employee], + request_options: VitableConnect::RequestOptions + } + + type employee = + { + date_of_birth: Date, + email: String, + first_name: String, + last_name: String, + address: VitableConnect::EmployerSubmitCensusSyncParams::Employee::Address?, + compensation_type: VitableConnect::Models::EmployerSubmitCensusSyncParams::Employee::compensation_type?, + employee_class: VitableConnect::Models::employee_class?, + phone: String?, + reference_id: String?, + start_date: Date? + } + + class Employee < VitableConnect::Internal::Type::BaseModel + attr_accessor date_of_birth: Date + + attr_accessor email: String + + attr_accessor first_name: String + + attr_accessor last_name: String + + attr_accessor address: VitableConnect::EmployerSubmitCensusSyncParams::Employee::Address? + + attr_accessor compensation_type: VitableConnect::Models::EmployerSubmitCensusSyncParams::Employee::compensation_type? + + attr_accessor employee_class: VitableConnect::Models::employee_class? + + attr_accessor phone: String? + + attr_accessor reference_id: String? + + attr_accessor start_date: Date? + + def initialize: ( + date_of_birth: Date, + email: String, + first_name: String, + last_name: String, + ?address: VitableConnect::EmployerSubmitCensusSyncParams::Employee::Address?, + ?compensation_type: VitableConnect::Models::EmployerSubmitCensusSyncParams::Employee::compensation_type?, + ?employee_class: VitableConnect::Models::employee_class?, + ?phone: String?, + ?reference_id: String?, + ?start_date: Date? + ) -> void + + def to_hash: -> { + date_of_birth: Date, + email: String, + first_name: String, + last_name: String, + address: VitableConnect::EmployerSubmitCensusSyncParams::Employee::Address?, + compensation_type: VitableConnect::Models::EmployerSubmitCensusSyncParams::Employee::compensation_type?, + employee_class: VitableConnect::Models::employee_class?, + phone: String?, + reference_id: String?, + start_date: Date? + } + + type address = + { + :address_line_1 => String, + city: String, + state: VitableConnect::Models::EmployerSubmitCensusSyncParams::Employee::Address::state, + zipcode: String, + :address_line_2 => String? + } + + class Address < VitableConnect::Internal::Type::BaseModel + attr_accessor address_line_1: String + + attr_accessor city: String + + attr_accessor state: VitableConnect::Models::EmployerSubmitCensusSyncParams::Employee::Address::state + + attr_accessor zipcode: String + + attr_accessor address_line_2: String? + + def initialize: ( + address_line_1: String, + city: String, + state: VitableConnect::Models::EmployerSubmitCensusSyncParams::Employee::Address::state, + zipcode: String, + ?address_line_2: String? + ) -> void + + def to_hash: -> { + :address_line_1 => String, + city: String, + state: VitableConnect::Models::EmployerSubmitCensusSyncParams::Employee::Address::state, + zipcode: String, + :address_line_2 => String? + } + + type state = + :AL + | :AK + | :AZ + | :AR + | :CA + | :CO + | :CT + | :DC + | :DE + | :FL + | :GA + | :HI + | :ID + | :IL + | :IN + | :IA + | :KS + | :KY + | :LA + | :ME + | :MD + | :MA + | :MI + | :MN + | :MS + | :MO + | :MT + | :NE + | :NV + | :NH + | :NJ + | :NM + | :NY + | :NC + | :ND + | :OH + | :OK + | :OR + | :PA + | :RI + | :SC + | :SD + | :TN + | :TX + | :UT + | :VT + | :VA + | :WA + | :WI + | :WV + | :WY + | :PR + | :GU + | :AS + | :VI + | :MP + | :MH + | :PW + | :FM + | :AE + | :AA + | :AP + + module State + extend VitableConnect::Internal::Type::Enum + + AL: :AL + AK: :AK + AZ: :AZ + AR: :AR + CA: :CA + CO: :CO + CT: :CT + DC: :DC + DE: :DE + FL: :FL + GA: :GA + HI: :HI + ID: :ID + IL: :IL + IN: :IN + IA: :IA + KS: :KS + KY: :KY + LA: :LA + ME: :ME + MD: :MD + MA: :MA + MI: :MI + MN: :MN + MS: :MS + MO: :MO + MT: :MT + NE: :NE + NV: :NV + NH: :NH + NJ: :NJ + NM: :NM + NY: :NY + NC: :NC + ND: :ND + OH: :OH + OK: :OK + OR: :OR + PA: :PA + RI: :RI + SC: :SC + SD: :SD + TN: :TN + TX: :TX + UT: :UT + VT: :VT + VA: :VA + WA: :WA + WI: :WI + WV: :WV + WY: :WY + PR: :PR + GU: :GU + AS: :AS + VI: :VI + MP: :MP + MH: :MH + PW: :PW + FM: :FM + AE: :AE + AA: :AA + AP: :AP + + def self?.values: -> ::Array[VitableConnect::Models::EmployerSubmitCensusSyncParams::Employee::Address::state] + end + end + + type compensation_type = :Salary | :Hourly + + module CompensationType + extend VitableConnect::Internal::Type::Enum + + SALARY: :Salary + HOURLY: :Hourly + + def self?.values: -> ::Array[VitableConnect::Models::EmployerSubmitCensusSyncParams::Employee::compensation_type] + end + end + end + end +end diff --git a/sig/vitable_connect/models/employer_submit_census_sync_response.rbs b/sig/vitable_connect/models/employer_submit_census_sync_response.rbs new file mode 100644 index 0000000..340de3d --- /dev/null +++ b/sig/vitable_connect/models/employer_submit_census_sync_response.rbs @@ -0,0 +1,30 @@ +module VitableConnect + module Models + type employer_submit_census_sync_response = + { data: VitableConnect::Models::EmployerSubmitCensusSyncResponse::Data } + + class EmployerSubmitCensusSyncResponse < VitableConnect::Internal::Type::BaseModel + attr_accessor data: VitableConnect::Models::EmployerSubmitCensusSyncResponse::Data + + def initialize: ( + data: VitableConnect::Models::EmployerSubmitCensusSyncResponse::Data + ) -> void + + def to_hash: -> { + data: VitableConnect::Models::EmployerSubmitCensusSyncResponse::Data + } + + type data = { accepted_at: Time, employer_id: String } + + class Data < VitableConnect::Internal::Type::BaseModel + attr_accessor accepted_at: Time + + attr_accessor employer_id: String + + def initialize: (accepted_at: Time, employer_id: String) -> void + + def to_hash: -> { accepted_at: Time, employer_id: String } + end + end + end +end diff --git a/sig/vitable_connect/models/employer_submit_payroll_access_setup_params.rbs b/sig/vitable_connect/models/employer_submit_payroll_access_setup_params.rbs new file mode 100644 index 0000000..65bb66a --- /dev/null +++ b/sig/vitable_connect/models/employer_submit_payroll_access_setup_params.rbs @@ -0,0 +1,198 @@ +module VitableConnect + module Models + type employer_submit_payroll_access_setup_params = + { + employer_id: String, + access_method: VitableConnect::Models::EmployerSubmitPayrollAccessSetupParams::access_method, + all_benefit_eligible_employees_present: bool, + classifications_accurate: bool, + employees_in_payroll_acknowledged: bool, + has_additional_payroll_system: bool, + is_controlled_group: bool, + payroll_data_impacts_eligibility_acknowledged: bool, + additional_access_method: VitableConnect::Models::EmployerSubmitPayrollAccessSetupParams::additional_access_method?, + additional_integration_confirmed: bool?, + additional_login_url: String?, + additional_password: String?, + additional_phone: String?, + additional_username: String?, + classification_correction_source: VitableConnect::Models::EmployerSubmitPayrollAccessSetupParams::classification_correction_source?, + integration_confirmed: bool?, + login_url: String?, + misclassified_employee_names: ::Array[String], + missing_employee_resolution: VitableConnect::Models::EmployerSubmitPayrollAccessSetupParams::missing_employee_resolution?, + password: String?, + phone: String?, + remaining_employee_action: VitableConnect::Models::EmployerSubmitPayrollAccessSetupParams::remaining_employee_action?, + same_payroll_covers_other_eins: bool?, + username: String? + } + & VitableConnect::Internal::Type::request_parameters + + class EmployerSubmitPayrollAccessSetupParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + attr_accessor employer_id: String + + attr_accessor access_method: VitableConnect::Models::EmployerSubmitPayrollAccessSetupParams::access_method + + attr_accessor all_benefit_eligible_employees_present: bool + + attr_accessor classifications_accurate: bool + + attr_accessor employees_in_payroll_acknowledged: bool + + attr_accessor has_additional_payroll_system: bool + + attr_accessor is_controlled_group: bool + + attr_accessor payroll_data_impacts_eligibility_acknowledged: bool + + attr_accessor additional_access_method: VitableConnect::Models::EmployerSubmitPayrollAccessSetupParams::additional_access_method? + + attr_accessor additional_integration_confirmed: bool? + + attr_accessor additional_login_url: String? + + attr_accessor additional_password: String? + + attr_accessor additional_phone: String? + + attr_accessor additional_username: String? + + attr_accessor classification_correction_source: VitableConnect::Models::EmployerSubmitPayrollAccessSetupParams::classification_correction_source? + + attr_accessor integration_confirmed: bool? + + attr_accessor login_url: String? + + attr_reader misclassified_employee_names: ::Array[String]? + + def misclassified_employee_names=: (::Array[String]) -> ::Array[String] + + attr_accessor missing_employee_resolution: VitableConnect::Models::EmployerSubmitPayrollAccessSetupParams::missing_employee_resolution? + + attr_accessor password: String? + + attr_accessor phone: String? + + attr_accessor remaining_employee_action: VitableConnect::Models::EmployerSubmitPayrollAccessSetupParams::remaining_employee_action? + + attr_accessor same_payroll_covers_other_eins: bool? + + attr_accessor username: String? + + def initialize: ( + employer_id: String, + access_method: VitableConnect::Models::EmployerSubmitPayrollAccessSetupParams::access_method, + all_benefit_eligible_employees_present: bool, + classifications_accurate: bool, + employees_in_payroll_acknowledged: bool, + has_additional_payroll_system: bool, + is_controlled_group: bool, + payroll_data_impacts_eligibility_acknowledged: bool, + ?additional_access_method: VitableConnect::Models::EmployerSubmitPayrollAccessSetupParams::additional_access_method?, + ?additional_integration_confirmed: bool?, + ?additional_login_url: String?, + ?additional_password: String?, + ?additional_phone: String?, + ?additional_username: String?, + ?classification_correction_source: VitableConnect::Models::EmployerSubmitPayrollAccessSetupParams::classification_correction_source?, + ?integration_confirmed: bool?, + ?login_url: String?, + ?misclassified_employee_names: ::Array[String], + ?missing_employee_resolution: VitableConnect::Models::EmployerSubmitPayrollAccessSetupParams::missing_employee_resolution?, + ?password: String?, + ?phone: String?, + ?remaining_employee_action: VitableConnect::Models::EmployerSubmitPayrollAccessSetupParams::remaining_employee_action?, + ?same_payroll_covers_other_eins: bool?, + ?username: String?, + ?request_options: VitableConnect::request_opts + ) -> void + + def to_hash: -> { + employer_id: String, + access_method: VitableConnect::Models::EmployerSubmitPayrollAccessSetupParams::access_method, + all_benefit_eligible_employees_present: bool, + classifications_accurate: bool, + employees_in_payroll_acknowledged: bool, + has_additional_payroll_system: bool, + is_controlled_group: bool, + payroll_data_impacts_eligibility_acknowledged: bool, + additional_access_method: VitableConnect::Models::EmployerSubmitPayrollAccessSetupParams::additional_access_method?, + additional_integration_confirmed: bool?, + additional_login_url: String?, + additional_password: String?, + additional_phone: String?, + additional_username: String?, + classification_correction_source: VitableConnect::Models::EmployerSubmitPayrollAccessSetupParams::classification_correction_source?, + integration_confirmed: bool?, + login_url: String?, + misclassified_employee_names: ::Array[String], + missing_employee_resolution: VitableConnect::Models::EmployerSubmitPayrollAccessSetupParams::missing_employee_resolution?, + password: String?, + phone: String?, + remaining_employee_action: VitableConnect::Models::EmployerSubmitPayrollAccessSetupParams::remaining_employee_action?, + same_payroll_covers_other_eins: bool?, + username: String?, + request_options: VitableConnect::RequestOptions + } + + type access_method = :SELF_SETUP | :NEEDS_HELP + + module AccessMethod + extend VitableConnect::Internal::Type::Enum + + SELF_SETUP: :SELF_SETUP + NEEDS_HELP: :NEEDS_HELP + + def self?.values: -> ::Array[VitableConnect::Models::EmployerSubmitPayrollAccessSetupParams::access_method] + end + + type additional_access_method = :SELF_SETUP | :NEEDS_HELP + + module AdditionalAccessMethod + extend VitableConnect::Internal::Type::Enum + + SELF_SETUP: :SELF_SETUP + NEEDS_HELP: :NEEDS_HELP + + def self?.values: -> ::Array[VitableConnect::Models::EmployerSubmitPayrollAccessSetupParams::additional_access_method] + end + + type classification_correction_source = :ENTER_NAMES | :EMAIL_LIST + + module ClassificationCorrectionSource + extend VitableConnect::Internal::Type::Enum + + ENTER_NAMES: :ENTER_NAMES + EMAIL_LIST: :EMAIL_LIST + + def self?.values: -> ::Array[VitableConnect::Models::EmployerSubmitPayrollAccessSetupParams::classification_correction_source] + end + + type missing_employee_resolution = :EMAIL_CENSUS | :SECOND_SYSTEM_ACCESS + + module MissingEmployeeResolution + extend VitableConnect::Internal::Type::Enum + + EMAIL_CENSUS: :EMAIL_CENSUS + SECOND_SYSTEM_ACCESS: :SECOND_SYSTEM_ACCESS + + def self?.values: -> ::Array[VitableConnect::Models::EmployerSubmitPayrollAccessSetupParams::missing_employee_resolution] + end + + type remaining_employee_action = :VITABLE_UPDATE | :EMPLOYER_UPDATE + + module RemainingEmployeeAction + extend VitableConnect::Internal::Type::Enum + + VITABLE_UPDATE: :VITABLE_UPDATE + EMPLOYER_UPDATE: :EMPLOYER_UPDATE + + def self?.values: -> ::Array[VitableConnect::Models::EmployerSubmitPayrollAccessSetupParams::remaining_employee_action] + end + end + end +end diff --git a/sig/vitable_connect/models/employer_submit_payroll_access_setup_response.rbs b/sig/vitable_connect/models/employer_submit_payroll_access_setup_response.rbs new file mode 100644 index 0000000..fc83c5b --- /dev/null +++ b/sig/vitable_connect/models/employer_submit_payroll_access_setup_response.rbs @@ -0,0 +1,32 @@ +module VitableConnect + module Models + type employer_submit_payroll_access_setup_response = + { + data: VitableConnect::Models::EmployerSubmitPayrollAccessSetupResponse::Data + } + + class EmployerSubmitPayrollAccessSetupResponse < VitableConnect::Internal::Type::BaseModel + attr_accessor data: VitableConnect::Models::EmployerSubmitPayrollAccessSetupResponse::Data + + def initialize: ( + data: VitableConnect::Models::EmployerSubmitPayrollAccessSetupResponse::Data + ) -> void + + def to_hash: -> { + data: VitableConnect::Models::EmployerSubmitPayrollAccessSetupResponse::Data + } + + type data = { completed: bool, submitted_at: Time? } + + class Data < VitableConnect::Internal::Type::BaseModel + attr_accessor completed: bool + + attr_accessor submitted_at: Time? + + def initialize: (completed: bool, submitted_at: Time?) -> void + + def to_hash: -> { completed: bool, submitted_at: Time? } + end + end + end +end diff --git a/sig/vitable_connect/models/employer_update_params.rbs b/sig/vitable_connect/models/employer_update_params.rbs new file mode 100644 index 0000000..c1cdc06 --- /dev/null +++ b/sig/vitable_connect/models/employer_update_params.rbs @@ -0,0 +1,83 @@ +module VitableConnect + module Models + type employer_update_params = + { + employer_id: String, + active: bool?, + address: VitableConnect::EmployerUpdateParams::Address?, + legal_name: String?, + name: String? + } + & VitableConnect::Internal::Type::request_parameters + + class EmployerUpdateParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + attr_accessor employer_id: String + + attr_accessor active: bool? + + attr_accessor address: VitableConnect::EmployerUpdateParams::Address? + + attr_accessor legal_name: String? + + attr_accessor name: String? + + def initialize: ( + employer_id: String, + ?active: bool?, + ?address: VitableConnect::EmployerUpdateParams::Address?, + ?legal_name: String?, + ?name: String?, + ?request_options: VitableConnect::request_opts + ) -> void + + def to_hash: -> { + employer_id: String, + active: bool?, + address: VitableConnect::EmployerUpdateParams::Address?, + legal_name: String?, + name: String?, + request_options: VitableConnect::RequestOptions + } + + type address = + { + :address_line_1 => String, + city: String, + state: String, + zipcode: String, + :address_line_2 => String? + } + + class Address < VitableConnect::Internal::Type::BaseModel + attr_accessor address_line_1: String + + attr_accessor city: String + + attr_accessor state: String + + attr_accessor zipcode: String + + attr_accessor address_line_2: String? + + def initialize: ( + address_line_1: String, + city: String, + state: String, + zipcode: String, + ?address_line_2: String? + ) -> void + + def to_hash: -> { + :address_line_1 => String, + city: String, + state: String, + zipcode: String, + :address_line_2 => String? + } + end + end + end +end diff --git a/sig/vitable_connect/models/employer_update_settings_params.rbs b/sig/vitable_connect/models/employer_update_settings_params.rbs new file mode 100644 index 0000000..841ad07 --- /dev/null +++ b/sig/vitable_connect/models/employer_update_settings_params.rbs @@ -0,0 +1,44 @@ +module VitableConnect + module Models + type employer_update_settings_params = + { + employer_id: String, + pay_frequency: VitableConnect::Models::EmployerUpdateSettingsParams::pay_frequency + } + & VitableConnect::Internal::Type::request_parameters + + class EmployerUpdateSettingsParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + attr_accessor employer_id: String + + attr_accessor pay_frequency: VitableConnect::Models::EmployerUpdateSettingsParams::pay_frequency + + def initialize: ( + employer_id: String, + pay_frequency: VitableConnect::Models::EmployerUpdateSettingsParams::pay_frequency, + ?request_options: VitableConnect::request_opts + ) -> void + + def to_hash: -> { + employer_id: String, + pay_frequency: VitableConnect::Models::EmployerUpdateSettingsParams::pay_frequency, + request_options: VitableConnect::RequestOptions + } + + type pay_frequency = :weekly | :bi_weekly | :semi_monthly | :monthly + + module PayFrequency + extend VitableConnect::Internal::Type::Enum + + WEEKLY: :weekly + BI_WEEKLY: :bi_weekly + SEMI_MONTHLY: :semi_monthly + MONTHLY: :monthly + + def self?.values: -> ::Array[VitableConnect::Models::EmployerUpdateSettingsParams::pay_frequency] + end + end + end +end diff --git a/sig/vitable_connect/models/employer_update_settings_response.rbs b/sig/vitable_connect/models/employer_update_settings_response.rbs new file mode 100644 index 0000000..e98bcbc --- /dev/null +++ b/sig/vitable_connect/models/employer_update_settings_response.rbs @@ -0,0 +1,48 @@ +module VitableConnect + module Models + type employer_update_settings_response = + { data: VitableConnect::Models::EmployerUpdateSettingsResponse::Data } + + class EmployerUpdateSettingsResponse < VitableConnect::Internal::Type::BaseModel + attr_accessor data: VitableConnect::Models::EmployerUpdateSettingsResponse::Data + + def initialize: ( + data: VitableConnect::Models::EmployerUpdateSettingsResponse::Data + ) -> void + + def to_hash: -> { + data: VitableConnect::Models::EmployerUpdateSettingsResponse::Data + } + + type data = + { + pay_frequency: VitableConnect::Models::EmployerUpdateSettingsResponse::Data::pay_frequency? + } + + class Data < VitableConnect::Internal::Type::BaseModel + attr_accessor pay_frequency: VitableConnect::Models::EmployerUpdateSettingsResponse::Data::pay_frequency? + + def initialize: ( + pay_frequency: VitableConnect::Models::EmployerUpdateSettingsResponse::Data::pay_frequency? + ) -> void + + def to_hash: -> { + pay_frequency: VitableConnect::Models::EmployerUpdateSettingsResponse::Data::pay_frequency? + } + + type pay_frequency = :weekly | :bi_weekly | :semi_monthly | :monthly + + module PayFrequency + extend VitableConnect::Internal::Type::Enum + + WEEKLY: :weekly + BI_WEEKLY: :bi_weekly + SEMI_MONTHLY: :semi_monthly + MONTHLY: :monthly + + def self?.values: -> ::Array[VitableConnect::Models::EmployerUpdateSettingsResponse::Data::pay_frequency] + end + end + end + end +end diff --git a/sig/vitable_connect/models/enrollment.rbs b/sig/vitable_connect/models/enrollment.rbs new file mode 100644 index 0000000..a792615 --- /dev/null +++ b/sig/vitable_connect/models/enrollment.rbs @@ -0,0 +1,164 @@ +module VitableConnect + module Models + type enrollment = + { + id: String, + answered_at: Time?, + benefit: VitableConnect::Enrollment::Benefit, + coverage_end: Date?, + coverage_start: Date, + created_at: Time, + employee_deduction_in_cents: Integer?, + employee_id: String, + employer_contribution_in_cents: Integer?, + employer_id: String, + status: VitableConnect::Models::enrollment_status, + terminated_at: Time?, + updated_at: Time + } + + class Enrollment < VitableConnect::Internal::Type::BaseModel + attr_accessor id: String + + attr_accessor answered_at: Time? + + attr_accessor benefit: VitableConnect::Enrollment::Benefit + + attr_accessor coverage_end: Date? + + attr_accessor coverage_start: Date + + attr_accessor created_at: Time + + attr_accessor employee_deduction_in_cents: Integer? + + attr_accessor employee_id: String + + attr_accessor employer_contribution_in_cents: Integer? + + attr_accessor employer_id: String + + attr_accessor status: VitableConnect::Models::enrollment_status + + attr_accessor terminated_at: Time? + + attr_accessor updated_at: Time + + def initialize: ( + id: String, + answered_at: Time?, + benefit: VitableConnect::Enrollment::Benefit, + coverage_end: Date?, + coverage_start: Date, + created_at: Time, + employee_deduction_in_cents: Integer?, + employee_id: String, + employer_contribution_in_cents: Integer?, + employer_id: String, + status: VitableConnect::Models::enrollment_status, + terminated_at: Time?, + updated_at: Time + ) -> void + + def to_hash: -> { + id: String, + answered_at: Time?, + benefit: VitableConnect::Enrollment::Benefit, + coverage_end: Date?, + coverage_start: Date, + created_at: Time, + employee_deduction_in_cents: Integer?, + employee_id: String, + employer_contribution_in_cents: Integer?, + employer_id: String, + status: VitableConnect::Models::enrollment_status, + terminated_at: Time?, + updated_at: Time + } + + type benefit = + { + id: String, + category: VitableConnect::Models::Enrollment::Benefit::category, + name: String, + product_code: VitableConnect::Models::Enrollment::Benefit::product_code + } + + class Benefit < VitableConnect::Internal::Type::BaseModel + attr_accessor id: String + + attr_accessor category: VitableConnect::Models::Enrollment::Benefit::category + + attr_accessor name: String + + attr_accessor product_code: VitableConnect::Models::Enrollment::Benefit::product_code + + def initialize: ( + id: String, + category: VitableConnect::Models::Enrollment::Benefit::category, + name: String, + product_code: VitableConnect::Models::Enrollment::Benefit::product_code + ) -> void + + def to_hash: -> { + id: String, + category: VitableConnect::Models::Enrollment::Benefit::category, + name: String, + product_code: VitableConnect::Models::Enrollment::Benefit::product_code + } + + type category = :Medical | :Dental | :Vision | :Hospital + + module Category + extend VitableConnect::Internal::Type::Enum + + MEDICAL: :Medical + DENTAL: :Dental + VISION: :Vision + HOSPITAL: :Hospital + + def self?.values: -> ::Array[VitableConnect::Models::Enrollment::Benefit::category] + end + + type product_code = + :EBA + | :VPC + | :VPC_CORE + | :MEC + | :MEC2 + | :MEC_PLUS + | :MVP + | :MVP2 + | :MVPSL + | :MVPSL2 + | :VD + | :VV + | :ICHRA + | :ICHRA_PREMIUM_PLUS + | :ICHRA_REIMBURSEMENT_ONLY + + module ProductCode + extend VitableConnect::Internal::Type::Enum + + EBA: :EBA + VPC: :VPC + VPC_CORE: :VPC_CORE + MEC: :MEC + MEC2: :MEC2 + MEC_PLUS: :MEC_PLUS + MVP: :MVP + MVP2: :MVP2 + MVPSL: :MVPSL + MVPSL2: :MVPSL2 + VD: :VD + VV: :VV + ICHRA: :ICHRA + ICHRA_PREMIUM_PLUS: :ICHRA_PREMIUM_PLUS + ICHRA_REIMBURSEMENT_ONLY: :ICHRA_REIMBURSEMENT_ONLY + + def self?.values: -> ::Array[VitableConnect::Models::Enrollment::Benefit::product_code] + end + end + end + end +end diff --git a/sig/vitable_connect/models/enrollment_reissue_params.rbs b/sig/vitable_connect/models/enrollment_reissue_params.rbs new file mode 100644 index 0000000..dc3fd00 --- /dev/null +++ b/sig/vitable_connect/models/enrollment_reissue_params.rbs @@ -0,0 +1,41 @@ +module VitableConnect + module Models + type enrollment_reissue_params = + { + enrollment_id: String, + qualifying_life_event_id: String?, + reason: String?, + ticket_number: String? + } + & VitableConnect::Internal::Type::request_parameters + + class EnrollmentReissueParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + attr_accessor enrollment_id: String + + attr_accessor qualifying_life_event_id: String? + + attr_accessor reason: String? + + attr_accessor ticket_number: String? + + def initialize: ( + enrollment_id: String, + ?qualifying_life_event_id: String?, + ?reason: String?, + ?ticket_number: String?, + ?request_options: VitableConnect::request_opts + ) -> void + + def to_hash: -> { + enrollment_id: String, + qualifying_life_event_id: String?, + reason: String?, + ticket_number: String?, + request_options: VitableConnect::RequestOptions + } + end + end +end diff --git a/sig/vitable_connect/models/enrollment_reissue_response.rbs b/sig/vitable_connect/models/enrollment_reissue_response.rbs new file mode 100644 index 0000000..1066b77 --- /dev/null +++ b/sig/vitable_connect/models/enrollment_reissue_response.rbs @@ -0,0 +1,28 @@ +module VitableConnect + module Models + type enrollment_reissue_response = + { data: VitableConnect::Models::EnrollmentReissueResponse::Data } + + class EnrollmentReissueResponse < VitableConnect::Internal::Type::BaseModel + attr_accessor data: VitableConnect::Models::EnrollmentReissueResponse::Data + + def initialize: ( + data: VitableConnect::Models::EnrollmentReissueResponse::Data + ) -> void + + def to_hash: -> { + data: VitableConnect::Models::EnrollmentReissueResponse::Data + } + + type data = { enrollment_id: String } + + class Data < VitableConnect::Internal::Type::BaseModel + attr_accessor enrollment_id: String + + def initialize: (enrollment_id: String) -> void + + def to_hash: -> { enrollment_id: String } + end + end + end +end diff --git a/sig/vitable_connect/models/enrollment_retrieve_params.rbs b/sig/vitable_connect/models/enrollment_retrieve_params.rbs new file mode 100644 index 0000000..671ac61 --- /dev/null +++ b/sig/vitable_connect/models/enrollment_retrieve_params.rbs @@ -0,0 +1,24 @@ +module VitableConnect + module Models + type enrollment_retrieve_params = + { enrollment_id: String } + & VitableConnect::Internal::Type::request_parameters + + class EnrollmentRetrieveParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + attr_accessor enrollment_id: String + + def initialize: ( + enrollment_id: String, + ?request_options: VitableConnect::request_opts + ) -> void + + def to_hash: -> { + enrollment_id: String, + request_options: VitableConnect::RequestOptions + } + end + end +end diff --git a/sig/vitable_connect/models/enrollment_retrieve_response.rbs b/sig/vitable_connect/models/enrollment_retrieve_response.rbs new file mode 100644 index 0000000..52c1fc7 --- /dev/null +++ b/sig/vitable_connect/models/enrollment_retrieve_response.rbs @@ -0,0 +1,184 @@ +module VitableConnect + module Models + type enrollment_retrieve_response = + { data: VitableConnect::Models::EnrollmentRetrieveResponse::Data } + + class EnrollmentRetrieveResponse < VitableConnect::Internal::Type::BaseModel + attr_accessor data: VitableConnect::Models::EnrollmentRetrieveResponse::Data + + def initialize: ( + data: VitableConnect::Models::EnrollmentRetrieveResponse::Data + ) -> void + + def to_hash: -> { + data: VitableConnect::Models::EnrollmentRetrieveResponse::Data + } + + type data = + { + id: String, + answered_at: Time?, + benefit: VitableConnect::Models::EnrollmentRetrieveResponse::Data::Benefit, + coverage_end: Date?, + coverage_start: Date, + created_at: Time, + employee_deduction_in_cents: Integer?, + employee_id: String, + employer_contribution_in_cents: Integer?, + employer_id: String, + status: VitableConnect::Models::enrollment_status, + terminated_at: Time?, + updated_at: Time, + sbc_url: String? + } + + class Data < VitableConnect::Internal::Type::BaseModel + attr_accessor id: String + + attr_accessor answered_at: Time? + + attr_accessor benefit: VitableConnect::Models::EnrollmentRetrieveResponse::Data::Benefit + + attr_accessor coverage_end: Date? + + attr_accessor coverage_start: Date + + attr_accessor created_at: Time + + attr_accessor employee_deduction_in_cents: Integer? + + attr_accessor employee_id: String + + attr_accessor employer_contribution_in_cents: Integer? + + attr_accessor employer_id: String + + attr_accessor status: VitableConnect::Models::enrollment_status + + attr_accessor terminated_at: Time? + + attr_accessor updated_at: Time + + attr_accessor sbc_url: String? + + def initialize: ( + id: String, + answered_at: Time?, + benefit: VitableConnect::Models::EnrollmentRetrieveResponse::Data::Benefit, + coverage_end: Date?, + coverage_start: Date, + created_at: Time, + employee_deduction_in_cents: Integer?, + employee_id: String, + employer_contribution_in_cents: Integer?, + employer_id: String, + status: VitableConnect::Models::enrollment_status, + terminated_at: Time?, + updated_at: Time, + ?sbc_url: String? + ) -> void + + def to_hash: -> { + id: String, + answered_at: Time?, + benefit: VitableConnect::Models::EnrollmentRetrieveResponse::Data::Benefit, + coverage_end: Date?, + coverage_start: Date, + created_at: Time, + employee_deduction_in_cents: Integer?, + employee_id: String, + employer_contribution_in_cents: Integer?, + employer_id: String, + status: VitableConnect::Models::enrollment_status, + terminated_at: Time?, + updated_at: Time, + sbc_url: String? + } + + type benefit = + { + id: String, + category: VitableConnect::Models::EnrollmentRetrieveResponse::Data::Benefit::category, + name: String, + product_code: VitableConnect::Models::EnrollmentRetrieveResponse::Data::Benefit::product_code + } + + class Benefit < VitableConnect::Internal::Type::BaseModel + attr_accessor id: String + + attr_accessor category: VitableConnect::Models::EnrollmentRetrieveResponse::Data::Benefit::category + + attr_accessor name: String + + attr_accessor product_code: VitableConnect::Models::EnrollmentRetrieveResponse::Data::Benefit::product_code + + def initialize: ( + id: String, + category: VitableConnect::Models::EnrollmentRetrieveResponse::Data::Benefit::category, + name: String, + product_code: VitableConnect::Models::EnrollmentRetrieveResponse::Data::Benefit::product_code + ) -> void + + def to_hash: -> { + id: String, + category: VitableConnect::Models::EnrollmentRetrieveResponse::Data::Benefit::category, + name: String, + product_code: VitableConnect::Models::EnrollmentRetrieveResponse::Data::Benefit::product_code + } + + type category = :Medical | :Dental | :Vision | :Hospital + + module Category + extend VitableConnect::Internal::Type::Enum + + MEDICAL: :Medical + DENTAL: :Dental + VISION: :Vision + HOSPITAL: :Hospital + + def self?.values: -> ::Array[VitableConnect::Models::EnrollmentRetrieveResponse::Data::Benefit::category] + end + + type product_code = + :EBA + | :VPC + | :VPC_CORE + | :MEC + | :MEC2 + | :MEC_PLUS + | :MVP + | :MVP2 + | :MVPSL + | :MVPSL2 + | :VD + | :VV + | :ICHRA + | :ICHRA_PREMIUM_PLUS + | :ICHRA_REIMBURSEMENT_ONLY + + module ProductCode + extend VitableConnect::Internal::Type::Enum + + EBA: :EBA + VPC: :VPC + VPC_CORE: :VPC_CORE + MEC: :MEC + MEC2: :MEC2 + MEC_PLUS: :MEC_PLUS + MVP: :MVP + MVP2: :MVP2 + MVPSL: :MVPSL + MVPSL2: :MVPSL2 + VD: :VD + VV: :VV + ICHRA: :ICHRA + ICHRA_PREMIUM_PLUS: :ICHRA_PREMIUM_PLUS + ICHRA_REIMBURSEMENT_ONLY: :ICHRA_REIMBURSEMENT_ONLY + + def self?.values: -> ::Array[VitableConnect::Models::EnrollmentRetrieveResponse::Data::Benefit::product_code] + end + end + end + end + end +end diff --git a/sig/vitable_connect/models/enrollment_status.rbs b/sig/vitable_connect/models/enrollment_status.rbs new file mode 100644 index 0000000..0392328 --- /dev/null +++ b/sig/vitable_connect/models/enrollment_status.rbs @@ -0,0 +1,16 @@ +module VitableConnect + module Models + type enrollment_status = :pending | :enrolled | :waived | :inactive + + module EnrollmentStatus + extend VitableConnect::Internal::Type::Enum + + PENDING: :pending + ENROLLED: :enrolled + WAIVED: :waived + INACTIVE: :inactive + + def self?.values: -> ::Array[VitableConnect::Models::enrollment_status] + end + end +end diff --git a/sig/vitable_connect/models/enrollment_terminate_params.rbs b/sig/vitable_connect/models/enrollment_terminate_params.rbs new file mode 100644 index 0000000..6204b86 --- /dev/null +++ b/sig/vitable_connect/models/enrollment_terminate_params.rbs @@ -0,0 +1,41 @@ +module VitableConnect + module Models + type enrollment_terminate_params = + { + enrollment_id: String, + qualifying_life_event_id: String?, + reason: String?, + ticket_number: String? + } + & VitableConnect::Internal::Type::request_parameters + + class EnrollmentTerminateParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + attr_accessor enrollment_id: String + + attr_accessor qualifying_life_event_id: String? + + attr_accessor reason: String? + + attr_accessor ticket_number: String? + + def initialize: ( + enrollment_id: String, + ?qualifying_life_event_id: String?, + ?reason: String?, + ?ticket_number: String?, + ?request_options: VitableConnect::request_opts + ) -> void + + def to_hash: -> { + enrollment_id: String, + qualifying_life_event_id: String?, + reason: String?, + ticket_number: String?, + request_options: VitableConnect::RequestOptions + } + end + end +end diff --git a/sig/vitable_connect/models/group.rbs b/sig/vitable_connect/models/group.rbs new file mode 100644 index 0000000..b6cc696 --- /dev/null +++ b/sig/vitable_connect/models/group.rbs @@ -0,0 +1,45 @@ +module VitableConnect + module Models + type group = + { + id: String, + created_at: Time?, + external_reference_id: String, + name: String, + organization_id: String, + updated_at: Time? + } + + class Group < VitableConnect::Internal::Type::BaseModel + attr_accessor id: String + + attr_accessor created_at: Time? + + attr_accessor external_reference_id: String + + attr_accessor name: String + + attr_accessor organization_id: String + + attr_accessor updated_at: Time? + + def initialize: ( + id: String, + created_at: Time?, + external_reference_id: String, + name: String, + organization_id: String, + updated_at: Time? + ) -> void + + def to_hash: -> { + id: String, + created_at: Time?, + external_reference_id: String, + name: String, + organization_id: String, + updated_at: Time? + } + end + end +end diff --git a/sig/vitable_connect/models/group_create_params.rbs b/sig/vitable_connect/models/group_create_params.rbs new file mode 100644 index 0000000..5d90dbc --- /dev/null +++ b/sig/vitable_connect/models/group_create_params.rbs @@ -0,0 +1,28 @@ +module VitableConnect + module Models + type group_create_params = + { external_reference_id: String, name: String } + & VitableConnect::Internal::Type::request_parameters + + class GroupCreateParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + attr_accessor external_reference_id: String + + attr_accessor name: String + + def initialize: ( + external_reference_id: String, + name: String, + ?request_options: VitableConnect::request_opts + ) -> void + + def to_hash: -> { + external_reference_id: String, + name: String, + request_options: VitableConnect::RequestOptions + } + end + end +end diff --git a/sig/vitable_connect/models/group_list_params.rbs b/sig/vitable_connect/models/group_list_params.rbs new file mode 100644 index 0000000..abe59f4 --- /dev/null +++ b/sig/vitable_connect/models/group_list_params.rbs @@ -0,0 +1,32 @@ +module VitableConnect + module Models + type group_list_params = + { limit: Integer, page: Integer } + & VitableConnect::Internal::Type::request_parameters + + class GroupListParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + attr_reader limit: Integer? + + def limit=: (Integer) -> Integer + + attr_reader page: Integer? + + def page=: (Integer) -> Integer + + def initialize: ( + ?limit: Integer, + ?page: Integer, + ?request_options: VitableConnect::request_opts + ) -> void + + def to_hash: -> { + limit: Integer, + page: Integer, + request_options: VitableConnect::RequestOptions + } + end + end +end diff --git a/sig/vitable_connect/models/group_response.rbs b/sig/vitable_connect/models/group_response.rbs new file mode 100644 index 0000000..c4919b1 --- /dev/null +++ b/sig/vitable_connect/models/group_response.rbs @@ -0,0 +1,13 @@ +module VitableConnect + module Models + type group_response = { data: VitableConnect::Group } + + class GroupResponse < VitableConnect::Internal::Type::BaseModel + attr_accessor data: VitableConnect::Group + + def initialize: (data: VitableConnect::Group) -> void + + def to_hash: -> { data: VitableConnect::Group } + end + end +end diff --git a/sig/vitable_connect/models/group_retrieve_params.rbs b/sig/vitable_connect/models/group_retrieve_params.rbs new file mode 100644 index 0000000..64d872f --- /dev/null +++ b/sig/vitable_connect/models/group_retrieve_params.rbs @@ -0,0 +1,23 @@ +module VitableConnect + module Models + type group_retrieve_params = + { group_id: String } & VitableConnect::Internal::Type::request_parameters + + class GroupRetrieveParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + attr_accessor group_id: String + + def initialize: ( + group_id: String, + ?request_options: VitableConnect::request_opts + ) -> void + + def to_hash: -> { + group_id: String, + request_options: VitableConnect::RequestOptions + } + end + end +end diff --git a/sig/vitable_connect/models/group_update_params.rbs b/sig/vitable_connect/models/group_update_params.rbs new file mode 100644 index 0000000..ab82e30 --- /dev/null +++ b/sig/vitable_connect/models/group_update_params.rbs @@ -0,0 +1,32 @@ +module VitableConnect + module Models + type group_update_params = + { group_id: String, external_reference_id: String?, name: String? } + & VitableConnect::Internal::Type::request_parameters + + class GroupUpdateParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + attr_accessor group_id: String + + attr_accessor external_reference_id: String? + + attr_accessor name: String? + + def initialize: ( + group_id: String, + ?external_reference_id: String?, + ?name: String?, + ?request_options: VitableConnect::request_opts + ) -> void + + def to_hash: -> { + group_id: String, + external_reference_id: String?, + name: String?, + request_options: VitableConnect::RequestOptions + } + end + end +end diff --git a/sig/vitable_connect/models/groups/members/sync_retrieve_params.rbs b/sig/vitable_connect/models/groups/members/sync_retrieve_params.rbs new file mode 100644 index 0000000..f3e22b8 --- /dev/null +++ b/sig/vitable_connect/models/groups/members/sync_retrieve_params.rbs @@ -0,0 +1,32 @@ +module VitableConnect + module Models + module Groups + module Members + type sync_retrieve_params = + { group_id: String, request_id: String } + & VitableConnect::Internal::Type::request_parameters + + class SyncRetrieveParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + attr_accessor group_id: String + + attr_accessor request_id: String + + def initialize: ( + group_id: String, + request_id: String, + ?request_options: VitableConnect::request_opts + ) -> void + + def to_hash: -> { + group_id: String, + request_id: String, + request_options: VitableConnect::RequestOptions + } + end + end + end + end +end diff --git a/sig/vitable_connect/models/groups/members/sync_retrieve_response.rbs b/sig/vitable_connect/models/groups/members/sync_retrieve_response.rbs new file mode 100644 index 0000000..51fe8a0 --- /dev/null +++ b/sig/vitable_connect/models/groups/members/sync_retrieve_response.rbs @@ -0,0 +1,126 @@ +module VitableConnect + module Models + module Groups + module Members + type sync_retrieve_response = + { + data: VitableConnect::Models::Groups::Members::SyncRetrieveResponse::Data + } + + class SyncRetrieveResponse < VitableConnect::Internal::Type::BaseModel + attr_accessor data: VitableConnect::Models::Groups::Members::SyncRetrieveResponse::Data + + def initialize: ( + data: VitableConnect::Models::Groups::Members::SyncRetrieveResponse::Data + ) -> void + + def to_hash: -> { + data: VitableConnect::Models::Groups::Members::SyncRetrieveResponse::Data + } + + type data = + { + accepted_at: Time, + completed_at: Time?, + group_id: String, + request_id: String, + results: VitableConnect::Models::Groups::Members::SyncRetrieveResponse::Data::Results? + } + + class Data < VitableConnect::Internal::Type::BaseModel + attr_accessor accepted_at: Time + + attr_accessor completed_at: Time? + + attr_accessor group_id: String + + attr_accessor request_id: String + + attr_accessor results: VitableConnect::Models::Groups::Members::SyncRetrieveResponse::Data::Results? + + def initialize: ( + accepted_at: Time, + completed_at: Time?, + group_id: String, + request_id: String, + results: VitableConnect::Models::Groups::Members::SyncRetrieveResponse::Data::Results? + ) -> void + + def to_hash: -> { + accepted_at: Time, + completed_at: Time?, + group_id: String, + request_id: String, + results: VitableConnect::Models::Groups::Members::SyncRetrieveResponse::Data::Results? + } + + type results = + { + added_group_member_ids: ::Array[String], + failures: ::Array[VitableConnect::Models::Groups::Members::SyncRetrieveResponse::Data::Results::Failure], + removed_group_member_ids: ::Array[String] + } + + class Results < VitableConnect::Internal::Type::BaseModel + attr_accessor added_group_member_ids: ::Array[String] + + attr_accessor failures: ::Array[VitableConnect::Models::Groups::Members::SyncRetrieveResponse::Data::Results::Failure] + + attr_accessor removed_group_member_ids: ::Array[String] + + def initialize: ( + added_group_member_ids: ::Array[String], + failures: ::Array[VitableConnect::Models::Groups::Members::SyncRetrieveResponse::Data::Results::Failure], + removed_group_member_ids: ::Array[String] + ) -> void + + def to_hash: -> { + added_group_member_ids: ::Array[String], + failures: ::Array[VitableConnect::Models::Groups::Members::SyncRetrieveResponse::Data::Results::Failure], + removed_group_member_ids: ::Array[String] + } + + type failure = + { + operation: VitableConnect::Models::Groups::Members::SyncRetrieveResponse::Data::Results::Failure::operation, + reason: String, + reference_id: String + } + + class Failure < VitableConnect::Internal::Type::BaseModel + attr_accessor operation: VitableConnect::Models::Groups::Members::SyncRetrieveResponse::Data::Results::Failure::operation + + attr_accessor reason: String + + attr_accessor reference_id: String + + def initialize: ( + operation: VitableConnect::Models::Groups::Members::SyncRetrieveResponse::Data::Results::Failure::operation, + reason: String, + reference_id: String + ) -> void + + def to_hash: -> { + operation: VitableConnect::Models::Groups::Members::SyncRetrieveResponse::Data::Results::Failure::operation, + reason: String, + reference_id: String + } + + type operation = :add | :remove + + module Operation + extend VitableConnect::Internal::Type::Enum + + ADD: :add + REMOVE: :remove + + def self?.values: -> ::Array[VitableConnect::Models::Groups::Members::SyncRetrieveResponse::Data::Results::Failure::operation] + end + end + end + end + end + end + end + end +end diff --git a/sig/vitable_connect/models/groups/members/sync_submit_params.rbs b/sig/vitable_connect/models/groups/members/sync_submit_params.rbs new file mode 100644 index 0000000..21ba000 --- /dev/null +++ b/sig/vitable_connect/models/groups/members/sync_submit_params.rbs @@ -0,0 +1,124 @@ +module VitableConnect + module Models + module Groups + module Members + type sync_submit_params = + { + group_id: String, + members: ::Array[VitableConnect::Groups::Members::SyncSubmitParams::Member] + } + & VitableConnect::Internal::Type::request_parameters + + class SyncSubmitParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + attr_accessor group_id: String + + attr_accessor members: ::Array[VitableConnect::Groups::Members::SyncSubmitParams::Member] + + def initialize: ( + group_id: String, + members: ::Array[VitableConnect::Groups::Members::SyncSubmitParams::Member], + ?request_options: VitableConnect::request_opts + ) -> void + + def to_hash: -> { + group_id: String, + members: ::Array[VitableConnect::Groups::Members::SyncSubmitParams::Member], + request_options: VitableConnect::RequestOptions + } + + type member = + { + address: VitableConnect::Groups::Members::SyncSubmitParams::Member::Address, + date_of_birth: Date, + first_name: String, + last_name: String, + plan_id: String, + reference_id: String, + email: String?, + phone: String? + } + + class Member < VitableConnect::Internal::Type::BaseModel + attr_accessor address: VitableConnect::Groups::Members::SyncSubmitParams::Member::Address + + attr_accessor date_of_birth: Date + + attr_accessor first_name: String + + attr_accessor last_name: String + + attr_accessor plan_id: String + + attr_accessor reference_id: String + + attr_accessor email: String? + + attr_accessor phone: String? + + def initialize: ( + address: VitableConnect::Groups::Members::SyncSubmitParams::Member::Address, + date_of_birth: Date, + first_name: String, + last_name: String, + plan_id: String, + reference_id: String, + ?email: String?, + ?phone: String? + ) -> void + + def to_hash: -> { + address: VitableConnect::Groups::Members::SyncSubmitParams::Member::Address, + date_of_birth: Date, + first_name: String, + last_name: String, + plan_id: String, + reference_id: String, + email: String?, + phone: String? + } + + type address = + { + :address_line_1 => String, + city: String, + state: String, + zipcode: String, + :address_line_2 => String? + } + + class Address < VitableConnect::Internal::Type::BaseModel + attr_accessor address_line_1: String + + attr_accessor city: String + + attr_accessor state: String + + attr_accessor zipcode: String + + attr_accessor address_line_2: String? + + def initialize: ( + address_line_1: String, + city: String, + state: String, + zipcode: String, + ?address_line_2: String? + ) -> void + + def to_hash: -> { + :address_line_1 => String, + city: String, + state: String, + zipcode: String, + :address_line_2 => String? + } + end + end + end + end + end + end +end diff --git a/sig/vitable_connect/models/groups/members/sync_submit_response.rbs b/sig/vitable_connect/models/groups/members/sync_submit_response.rbs new file mode 100644 index 0000000..f557ff1 --- /dev/null +++ b/sig/vitable_connect/models/groups/members/sync_submit_response.rbs @@ -0,0 +1,47 @@ +module VitableConnect + module Models + module Groups + module Members + type sync_submit_response = + { + data: VitableConnect::Models::Groups::Members::SyncSubmitResponse::Data + } + + class SyncSubmitResponse < VitableConnect::Internal::Type::BaseModel + attr_accessor data: VitableConnect::Models::Groups::Members::SyncSubmitResponse::Data + + def initialize: ( + data: VitableConnect::Models::Groups::Members::SyncSubmitResponse::Data + ) -> void + + def to_hash: -> { + data: VitableConnect::Models::Groups::Members::SyncSubmitResponse::Data + } + + type data = + { accepted_at: Time, group_id: String, request_id: String } + + class Data < VitableConnect::Internal::Type::BaseModel + attr_accessor accepted_at: Time + + attr_accessor group_id: String + + attr_accessor request_id: String + + def initialize: ( + accepted_at: Time, + group_id: String, + request_id: String + ) -> void + + def to_hash: -> { + accepted_at: Time, + group_id: String, + request_id: String + } + end + end + end + end + end +end diff --git a/sig/vitable_connect/models/member_list_dependents_params.rbs b/sig/vitable_connect/models/member_list_dependents_params.rbs new file mode 100644 index 0000000..1dd3c49 --- /dev/null +++ b/sig/vitable_connect/models/member_list_dependents_params.rbs @@ -0,0 +1,23 @@ +module VitableConnect + module Models + type member_list_dependents_params = + { member_id: String } & VitableConnect::Internal::Type::request_parameters + + class MemberListDependentsParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + attr_accessor member_id: String + + def initialize: ( + member_id: String, + ?request_options: VitableConnect::request_opts + ) -> void + + def to_hash: -> { + member_id: String, + request_options: VitableConnect::RequestOptions + } + end + end +end diff --git a/sig/vitable_connect/models/member_list_dependents_response.rbs b/sig/vitable_connect/models/member_list_dependents_response.rbs new file mode 100644 index 0000000..bfd9963 --- /dev/null +++ b/sig/vitable_connect/models/member_list_dependents_response.rbs @@ -0,0 +1,96 @@ +module VitableConnect + module Models + type member_list_dependents_response = + { + data: ::Array[VitableConnect::Models::MemberListDependentsResponse::Data] + } + + class MemberListDependentsResponse < VitableConnect::Internal::Type::BaseModel + attr_accessor data: ::Array[VitableConnect::Models::MemberListDependentsResponse::Data] + + def initialize: ( + data: ::Array[VitableConnect::Models::MemberListDependentsResponse::Data] + ) -> void + + def to_hash: -> { + data: ::Array[VitableConnect::Models::MemberListDependentsResponse::Data] + } + + type data = + { + age: Integer, + date_of_birth: Date, + first_name: String, + last_name: String, + member_id: String, + primary_member_id: String, + relationship: VitableConnect::Models::MemberListDependentsResponse::Data::relationship, + sex_at_birth: VitableConnect::Models::MemberListDependentsResponse::Data::sex_at_birth? + } + + class Data < VitableConnect::Internal::Type::BaseModel + attr_accessor age: Integer + + attr_accessor date_of_birth: Date + + attr_accessor first_name: String + + attr_accessor last_name: String + + attr_accessor relationship: VitableConnect::Models::MemberListDependentsResponse::Data::relationship + + attr_accessor sex_at_birth: VitableConnect::Models::MemberListDependentsResponse::Data::sex_at_birth? + + attr_accessor member_id: String + + attr_accessor primary_member_id: String + + def initialize: ( + age: Integer, + date_of_birth: Date, + first_name: String, + last_name: String, + member_id: String, + primary_member_id: String, + relationship: VitableConnect::Models::MemberListDependentsResponse::Data::relationship, + ?sex_at_birth: VitableConnect::Models::MemberListDependentsResponse::Data::sex_at_birth? + ) -> void + + def to_hash: -> { + age: Integer, + date_of_birth: Date, + first_name: String, + last_name: String, + member_id: String, + primary_member_id: String, + relationship: VitableConnect::Models::MemberListDependentsResponse::Data::relationship, + sex_at_birth: VitableConnect::Models::MemberListDependentsResponse::Data::sex_at_birth? + } + + type relationship = :Spouse | :Child + + module Relationship + extend VitableConnect::Internal::Type::Enum + + SPOUSE: :Spouse + CHILD: :Child + + def self?.values: -> ::Array[VitableConnect::Models::MemberListDependentsResponse::Data::relationship] + end + + type sex_at_birth = :Male | :Female | :Other | :Unknown + + module SexAtBirth + extend VitableConnect::Internal::Type::Enum + + MALE: :Male + FEMALE: :Female + OTHER: :Other + UNKNOWN: :Unknown + + def self?.values: -> ::Array[VitableConnect::Models::MemberListDependentsResponse::Data::sex_at_birth] + end + end + end + end +end diff --git a/sig/vitable_connect/models/member_list_employments_params.rbs b/sig/vitable_connect/models/member_list_employments_params.rbs new file mode 100644 index 0000000..b78a54d --- /dev/null +++ b/sig/vitable_connect/models/member_list_employments_params.rbs @@ -0,0 +1,23 @@ +module VitableConnect + module Models + type member_list_employments_params = + { member_id: String } & VitableConnect::Internal::Type::request_parameters + + class MemberListEmploymentsParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + attr_accessor member_id: String + + def initialize: ( + member_id: String, + ?request_options: VitableConnect::request_opts + ) -> void + + def to_hash: -> { + member_id: String, + request_options: VitableConnect::RequestOptions + } + end + end +end diff --git a/sig/vitable_connect/models/member_list_employments_response.rbs b/sig/vitable_connect/models/member_list_employments_response.rbs new file mode 100644 index 0000000..f272914 --- /dev/null +++ b/sig/vitable_connect/models/member_list_employments_response.rbs @@ -0,0 +1,14 @@ +module VitableConnect + module Models + type member_list_employments_response = + { data: ::Array[VitableConnect::Employee] } + + class MemberListEmploymentsResponse < VitableConnect::Internal::Type::BaseModel + attr_accessor data: ::Array[VitableConnect::Employee] + + def initialize: (data: ::Array[VitableConnect::Employee]) -> void + + def to_hash: -> { data: ::Array[VitableConnect::Employee] } + end + end +end diff --git a/sig/vitable_connect/models/member_list_enrollments_params.rbs b/sig/vitable_connect/models/member_list_enrollments_params.rbs new file mode 100644 index 0000000..b893d42 --- /dev/null +++ b/sig/vitable_connect/models/member_list_enrollments_params.rbs @@ -0,0 +1,23 @@ +module VitableConnect + module Models + type member_list_enrollments_params = + { member_id: String } & VitableConnect::Internal::Type::request_parameters + + class MemberListEnrollmentsParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + attr_accessor member_id: String + + def initialize: ( + member_id: String, + ?request_options: VitableConnect::request_opts + ) -> void + + def to_hash: -> { + member_id: String, + request_options: VitableConnect::RequestOptions + } + end + end +end diff --git a/sig/vitable_connect/models/member_list_enrollments_response.rbs b/sig/vitable_connect/models/member_list_enrollments_response.rbs new file mode 100644 index 0000000..f6c006d --- /dev/null +++ b/sig/vitable_connect/models/member_list_enrollments_response.rbs @@ -0,0 +1,239 @@ +module VitableConnect + module Models + type member_list_enrollments_response = + { + data: ::Array[VitableConnect::Models::MemberListEnrollmentsResponse::Data] + } + + class MemberListEnrollmentsResponse < VitableConnect::Internal::Type::BaseModel + attr_accessor data: ::Array[VitableConnect::Models::MemberListEnrollmentsResponse::Data] + + def initialize: ( + data: ::Array[VitableConnect::Models::MemberListEnrollmentsResponse::Data] + ) -> void + + def to_hash: -> { + data: ::Array[VitableConnect::Models::MemberListEnrollmentsResponse::Data] + } + + type data = + { + id: String, + benefit_plan_year_id: String, + benefit_type: VitableConnect::Models::MemberListEnrollmentsResponse::Data::benefit_type, + cancelled_date: Date?, + election_status: VitableConnect::Models::MemberListEnrollmentsResponse::Data::election_status, + employer_id: String, + employer_name: String, + enrollment_window_start: Date, + in_last_month_of_coverage: bool, + is_within_enrollment_window: bool, + issued_date: Date, + plan_year_coverage_end: Date?, + policy_status: VitableConnect::Models::MemberListEnrollmentsResponse::Data::policy_status?, + product_code: VitableConnect::Models::MemberListEnrollmentsResponse::Data::product_code, + product_name: String, + requires_qle_for_reissue: bool, + carrier_name: String?, + coverage_end: Date?, + coverage_start: Date?, + employee_deduction_in_cents: Integer?, + employer_contribution_in_cents: Integer?, + enrollment_window_end: Date?, + plan_name: String?, + premium_in_cents: Integer?, + tier_name: String? + } + + class Data < VitableConnect::Internal::Type::BaseModel + attr_accessor id: String + + attr_accessor benefit_plan_year_id: String + + attr_accessor benefit_type: VitableConnect::Models::MemberListEnrollmentsResponse::Data::benefit_type + + attr_accessor cancelled_date: Date? + + attr_accessor election_status: VitableConnect::Models::MemberListEnrollmentsResponse::Data::election_status + + attr_accessor employer_id: String + + attr_accessor employer_name: String + + attr_accessor enrollment_window_start: Date + + attr_accessor in_last_month_of_coverage: bool + + attr_accessor is_within_enrollment_window: bool + + attr_accessor issued_date: Date + + attr_accessor plan_year_coverage_end: Date? + + attr_accessor policy_status: VitableConnect::Models::MemberListEnrollmentsResponse::Data::policy_status? + + attr_accessor product_code: VitableConnect::Models::MemberListEnrollmentsResponse::Data::product_code + + attr_accessor product_name: String + + attr_accessor requires_qle_for_reissue: bool + + attr_accessor carrier_name: String? + + attr_accessor coverage_end: Date? + + attr_accessor coverage_start: Date? + + attr_accessor employee_deduction_in_cents: Integer? + + attr_accessor employer_contribution_in_cents: Integer? + + attr_accessor enrollment_window_end: Date? + + attr_accessor plan_name: String? + + attr_accessor premium_in_cents: Integer? + + attr_accessor tier_name: String? + + def initialize: ( + id: String, + benefit_plan_year_id: String, + benefit_type: VitableConnect::Models::MemberListEnrollmentsResponse::Data::benefit_type, + cancelled_date: Date?, + election_status: VitableConnect::Models::MemberListEnrollmentsResponse::Data::election_status, + employer_id: String, + employer_name: String, + enrollment_window_start: Date, + in_last_month_of_coverage: bool, + is_within_enrollment_window: bool, + issued_date: Date, + plan_year_coverage_end: Date?, + policy_status: VitableConnect::Models::MemberListEnrollmentsResponse::Data::policy_status?, + product_code: VitableConnect::Models::MemberListEnrollmentsResponse::Data::product_code, + product_name: String, + requires_qle_for_reissue: bool, + ?carrier_name: String?, + ?coverage_end: Date?, + ?coverage_start: Date?, + ?employee_deduction_in_cents: Integer?, + ?employer_contribution_in_cents: Integer?, + ?enrollment_window_end: Date?, + ?plan_name: String?, + ?premium_in_cents: Integer?, + ?tier_name: String? + ) -> void + + def to_hash: -> { + id: String, + benefit_plan_year_id: String, + benefit_type: VitableConnect::Models::MemberListEnrollmentsResponse::Data::benefit_type, + cancelled_date: Date?, + election_status: VitableConnect::Models::MemberListEnrollmentsResponse::Data::election_status, + employer_id: String, + employer_name: String, + enrollment_window_start: Date, + in_last_month_of_coverage: bool, + is_within_enrollment_window: bool, + issued_date: Date, + plan_year_coverage_end: Date?, + policy_status: VitableConnect::Models::MemberListEnrollmentsResponse::Data::policy_status?, + product_code: VitableConnect::Models::MemberListEnrollmentsResponse::Data::product_code, + product_name: String, + requires_qle_for_reissue: bool, + carrier_name: String?, + coverage_end: Date?, + coverage_start: Date?, + employee_deduction_in_cents: Integer?, + employer_contribution_in_cents: Integer?, + enrollment_window_end: Date?, + plan_name: String?, + premium_in_cents: Integer?, + tier_name: String? + } + + type benefit_type = :Medical | :Dental | :Vision | :Hospital + + module BenefitType + extend VitableConnect::Internal::Type::Enum + + MEDICAL: :Medical + DENTAL: :Dental + VISION: :Vision + HOSPITAL: :Hospital + + def self?.values: -> ::Array[VitableConnect::Models::MemberListEnrollmentsResponse::Data::benefit_type] + end + + type election_status = :Enrolled | :Waived | :Pending | :Expired + + module ElectionStatus + extend VitableConnect::Internal::Type::Enum + + ENROLLED: :Enrolled + WAIVED: :Waived + PENDING: :Pending + EXPIRED: :Expired + + def self?.values: -> ::Array[VitableConnect::Models::MemberListEnrollmentsResponse::Data::election_status] + end + + type policy_status = + :"Coverage Upcoming" + | :"Coverage Effective" + | :"Coverage Ended" + | :Cancelled + + module PolicyStatus + extend VitableConnect::Internal::Type::Enum + + COVERAGE_UPCOMING: :"Coverage Upcoming" + COVERAGE_EFFECTIVE: :"Coverage Effective" + COVERAGE_ENDED: :"Coverage Ended" + CANCELLED: :Cancelled + + def self?.values: -> ::Array[VitableConnect::Models::MemberListEnrollmentsResponse::Data::policy_status] + end + + type product_code = + :EBA + | :VPC + | :VPC_CORE + | :MEC + | :MEC2 + | :MEC_PLUS + | :MVP + | :MVP2 + | :MVPSL + | :MVPSL2 + | :VD + | :VV + | :ICHRA + | :ICHRA_PREMIUM_PLUS + | :ICHRA_REIMBURSEMENT_ONLY + + module ProductCode + extend VitableConnect::Internal::Type::Enum + + EBA: :EBA + VPC: :VPC + VPC_CORE: :VPC_CORE + MEC: :MEC + MEC2: :MEC2 + MEC_PLUS: :MEC_PLUS + MVP: :MVP + MVP2: :MVP2 + MVPSL: :MVPSL + MVPSL2: :MVPSL2 + VD: :VD + VV: :VV + ICHRA: :ICHRA + ICHRA_PREMIUM_PLUS: :ICHRA_PREMIUM_PLUS + ICHRA_REIMBURSEMENT_ONLY: :ICHRA_REIMBURSEMENT_ONLY + + def self?.values: -> ::Array[VitableConnect::Models::MemberListEnrollmentsResponse::Data::product_code] + end + end + end + end +end diff --git a/sig/vitable_connect/models/member_list_id_cards_params.rbs b/sig/vitable_connect/models/member_list_id_cards_params.rbs new file mode 100644 index 0000000..29d67b3 --- /dev/null +++ b/sig/vitable_connect/models/member_list_id_cards_params.rbs @@ -0,0 +1,23 @@ +module VitableConnect + module Models + type member_list_id_cards_params = + { member_id: String } & VitableConnect::Internal::Type::request_parameters + + class MemberListIDCardsParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + attr_accessor member_id: String + + def initialize: ( + member_id: String, + ?request_options: VitableConnect::request_opts + ) -> void + + def to_hash: -> { + member_id: String, + request_options: VitableConnect::RequestOptions + } + end + end +end diff --git a/sig/vitable_connect/models/member_list_id_cards_response.rbs b/sig/vitable_connect/models/member_list_id_cards_response.rbs new file mode 100644 index 0000000..1eb90dc --- /dev/null +++ b/sig/vitable_connect/models/member_list_id_cards_response.rbs @@ -0,0 +1,256 @@ +module VitableConnect + module Models + type member_list_id_cards_response = + { data: ::Array[VitableConnect::Models::MemberListIDCardsResponse::Data] } + + class MemberListIDCardsResponse < VitableConnect::Internal::Type::BaseModel + attr_accessor data: ::Array[VitableConnect::Models::MemberListIDCardsResponse::Data] + + def initialize: ( + data: ::Array[VitableConnect::Models::MemberListIDCardsResponse::Data] + ) -> void + + def to_hash: -> { + data: ::Array[VitableConnect::Models::MemberListIDCardsResponse::Data] + } + + type data = + { + card_type: VitableConnect::Models::MemberListIDCardsResponse::Data::card_type, + group_id: String, + group_member_id: String, + member_name: String, + nsa_table: ::Array[::Array[String]], + benefit_code: VitableConnect::Models::MemberListIDCardsResponse::Data::benefit_code?, + carrier_phone: String?, + carrier_website: String?, + claims_payer_display_name: String?, + employer_name: String?, + general_disclaimer: String?, + network: VitableConnect::Models::MemberListIDCardsResponse::Data::Network?, + plan_disclaimer: String?, + plan_name: String? + } + + class Data < VitableConnect::Internal::Type::BaseModel + attr_accessor card_type: VitableConnect::Models::MemberListIDCardsResponse::Data::card_type + + attr_accessor group_id: String + + attr_accessor group_member_id: String + + attr_accessor member_name: String + + attr_accessor nsa_table: ::Array[::Array[String]] + + attr_accessor benefit_code: VitableConnect::Models::MemberListIDCardsResponse::Data::benefit_code? + + attr_accessor carrier_phone: String? + + attr_accessor carrier_website: String? + + attr_accessor claims_payer_display_name: String? + + attr_accessor employer_name: String? + + attr_accessor general_disclaimer: String? + + attr_accessor network: VitableConnect::Models::MemberListIDCardsResponse::Data::Network? + + attr_accessor plan_disclaimer: String? + + attr_accessor plan_name: String? + + def initialize: ( + card_type: VitableConnect::Models::MemberListIDCardsResponse::Data::card_type, + group_id: String, + group_member_id: String, + member_name: String, + nsa_table: ::Array[::Array[String]], + ?benefit_code: VitableConnect::Models::MemberListIDCardsResponse::Data::benefit_code?, + ?carrier_phone: String?, + ?carrier_website: String?, + ?claims_payer_display_name: String?, + ?employer_name: String?, + ?general_disclaimer: String?, + ?network: VitableConnect::Models::MemberListIDCardsResponse::Data::Network?, + ?plan_disclaimer: String?, + ?plan_name: String? + ) -> void + + def to_hash: -> { + card_type: VitableConnect::Models::MemberListIDCardsResponse::Data::card_type, + group_id: String, + group_member_id: String, + member_name: String, + nsa_table: ::Array[::Array[String]], + benefit_code: VitableConnect::Models::MemberListIDCardsResponse::Data::benefit_code?, + carrier_phone: String?, + carrier_website: String?, + claims_payer_display_name: String?, + employer_name: String?, + general_disclaimer: String?, + network: VitableConnect::Models::MemberListIDCardsResponse::Data::Network?, + plan_disclaimer: String?, + plan_name: String? + } + + type card_type = :medical | :dental | :vision | :rx + + module CardType + extend VitableConnect::Internal::Type::Enum + + MEDICAL: :medical + DENTAL: :dental + VISION: :vision + RX: :rx + + def self?.values: -> ::Array[VitableConnect::Models::MemberListIDCardsResponse::Data::card_type] + end + + type benefit_code = + :EBA + | :VPC + | :VPC_CORE + | :MEC + | :MEC2 + | :MEC_PLUS + | :MVP + | :MVP2 + | :MVPSL + | :MVPSL2 + | :VD + | :VV + | :ICHRA + | :ICHRA_PREMIUM_PLUS + | :ICHRA_REIMBURSEMENT_ONLY + + module BenefitCode + extend VitableConnect::Internal::Type::Enum + + EBA: :EBA + VPC: :VPC + VPC_CORE: :VPC_CORE + MEC: :MEC + MEC2: :MEC2 + MEC_PLUS: :MEC_PLUS + MVP: :MVP + MVP2: :MVP2 + MVPSL: :MVPSL + MVPSL2: :MVPSL2 + VD: :VD + VV: :VV + ICHRA: :ICHRA + ICHRA_PREMIUM_PLUS: :ICHRA_PREMIUM_PLUS + ICHRA_REIMBURSEMENT_ONLY: :ICHRA_REIMBURSEMENT_ONLY + + def self?.values: -> ::Array[VitableConnect::Models::MemberListIDCardsResponse::Data::benefit_code] + end + + type network = + { + id: String, + address: VitableConnect::Models::MemberListIDCardsResponse::Data::Network::Address, + logo: String?, + member_phone: String?, + name: String, + phone: String, + provider_phone: String?, + website: String, + edi: String?, + member_website: String?, + provider_website: String? + } + + class Network < VitableConnect::Internal::Type::BaseModel + attr_accessor address: VitableConnect::Models::MemberListIDCardsResponse::Data::Network::Address + + attr_accessor logo: String? + + attr_accessor member_phone: String? + + attr_accessor name: String + + attr_accessor phone: String + + attr_accessor provider_phone: String? + + attr_accessor website: String + + attr_accessor edi: String? + + attr_accessor member_website: String? + + attr_accessor provider_website: String? + + attr_accessor id: String + + def initialize: ( + id: String, + address: VitableConnect::Models::MemberListIDCardsResponse::Data::Network::Address, + logo: String?, + member_phone: String?, + name: String, + phone: String, + provider_phone: String?, + website: String, + ?edi: String?, + ?member_website: String?, + ?provider_website: String? + ) -> void + + def to_hash: -> { + id: String, + address: VitableConnect::Models::MemberListIDCardsResponse::Data::Network::Address, + logo: String?, + member_phone: String?, + name: String, + phone: String, + provider_phone: String?, + website: String, + edi: String?, + member_website: String?, + provider_website: String? + } + + type address = + { + :address_line_1 => String, + :address_line_2 => String?, + city: String, + state: String, + zipcode: String + } + + class Address < VitableConnect::Internal::Type::BaseModel + attr_accessor address_line_1: String + + attr_accessor address_line_2: String? + + attr_accessor city: String + + attr_accessor state: String + + attr_accessor zipcode: String + + def initialize: ( + address_line_1: String, + address_line_2: String?, + city: String, + state: String, + zipcode: String + ) -> void + + def to_hash: -> { + :address_line_1 => String, + :address_line_2 => String?, + city: String, + state: String, + zipcode: String + } + end + end + end + end + end +end diff --git a/sig/vitable_connect/models/member_list_params.rbs b/sig/vitable_connect/models/member_list_params.rbs new file mode 100644 index 0000000..93c796e --- /dev/null +++ b/sig/vitable_connect/models/member_list_params.rbs @@ -0,0 +1,38 @@ +module VitableConnect + module Models + type member_list_params = + { limit: Integer, page: Integer, search: String } + & VitableConnect::Internal::Type::request_parameters + + class MemberListParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + attr_reader limit: Integer? + + def limit=: (Integer) -> Integer + + attr_reader page: Integer? + + def page=: (Integer) -> Integer + + attr_reader search: String? + + def search=: (String) -> String + + def initialize: ( + ?limit: Integer, + ?page: Integer, + ?search: String, + ?request_options: VitableConnect::request_opts + ) -> void + + def to_hash: -> { + limit: Integer, + page: Integer, + search: String, + request_options: VitableConnect::RequestOptions + } + end + end +end diff --git a/sig/vitable_connect/models/member_list_qualifying_life_events_params.rbs b/sig/vitable_connect/models/member_list_qualifying_life_events_params.rbs new file mode 100644 index 0000000..b7e8081 --- /dev/null +++ b/sig/vitable_connect/models/member_list_qualifying_life_events_params.rbs @@ -0,0 +1,61 @@ +module VitableConnect + module Models + type member_list_qualifying_life_events_params = + { + member_id: String, + limit: Integer, + page: Integer, + status: VitableConnect::Models::MemberListQualifyingLifeEventsParams::status + } + & VitableConnect::Internal::Type::request_parameters + + class MemberListQualifyingLifeEventsParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + attr_accessor member_id: String + + attr_reader limit: Integer? + + def limit=: (Integer) -> Integer + + attr_reader page: Integer? + + def page=: (Integer) -> Integer + + attr_reader status: VitableConnect::Models::MemberListQualifyingLifeEventsParams::status? + + def status=: ( + VitableConnect::Models::MemberListQualifyingLifeEventsParams::status + ) -> VitableConnect::Models::MemberListQualifyingLifeEventsParams::status + + def initialize: ( + member_id: String, + ?limit: Integer, + ?page: Integer, + ?status: VitableConnect::Models::MemberListQualifyingLifeEventsParams::status, + ?request_options: VitableConnect::request_opts + ) -> void + + def to_hash: -> { + member_id: String, + limit: Integer, + page: Integer, + status: VitableConnect::Models::MemberListQualifyingLifeEventsParams::status, + request_options: VitableConnect::RequestOptions + } + + type status = :approved | :denied | :pending + + module Status + extend VitableConnect::Internal::Type::Enum + + APPROVED: :approved + DENIED: :denied + PENDING: :pending + + def self?.values: -> ::Array[VitableConnect::Models::MemberListQualifyingLifeEventsParams::status] + end + end + end +end diff --git a/sig/vitable_connect/models/member_list_qualifying_life_events_response.rbs b/sig/vitable_connect/models/member_list_qualifying_life_events_response.rbs new file mode 100644 index 0000000..c3a144c --- /dev/null +++ b/sig/vitable_connect/models/member_list_qualifying_life_events_response.rbs @@ -0,0 +1,108 @@ +module VitableConnect + module Models + type member_list_qualifying_life_events_response = + { + id: String, + event_type: VitableConnect::Models::MemberListQualifyingLifeEventsResponse::event_type, + event_type_label: String, + other_event: String?, + status: VitableConnect::Models::MemberListQualifyingLifeEventsResponse::status, + submitted_at: Time + } + + class MemberListQualifyingLifeEventsResponse < VitableConnect::Internal::Type::BaseModel + attr_accessor id: String + + attr_accessor event_type: VitableConnect::Models::MemberListQualifyingLifeEventsResponse::event_type + + attr_accessor event_type_label: String + + attr_accessor other_event: String? + + attr_accessor status: VitableConnect::Models::MemberListQualifyingLifeEventsResponse::status + + attr_accessor submitted_at: Time + + def initialize: ( + id: String, + event_type: VitableConnect::Models::MemberListQualifyingLifeEventsResponse::event_type, + event_type_label: String, + other_event: String?, + status: VitableConnect::Models::MemberListQualifyingLifeEventsResponse::status, + submitted_at: Time + ) -> void + + def to_hash: -> { + id: String, + event_type: VitableConnect::Models::MemberListQualifyingLifeEventsResponse::event_type, + event_type_label: String, + other_event: String?, + status: VitableConnect::Models::MemberListQualifyingLifeEventsResponse::status, + submitted_at: Time + } + + type event_type = + :lost_job_based_coverage + | :aged_off_parent_plan + | :lost_medicaid_chip_medicare + | :lost_decertified_individual_plan + | :married + | :divorced + | :had_baby + | :adopted_child + | :foster_care_placement + | :death_of_spouse_or_dependent + | :court_ordered + | :moved_to_new_coverage_area + | :moved_to_us + | :moved_to_or_from_school_housing + | :moved_to_or_from_seasonal_work_housing + | :became_us_citizen + | :left_incarceration + | :gained_tribal_status + | :started_or_ended_americorps_service + | :new_child + | :other + + module EventType + extend VitableConnect::Internal::Type::Enum + + LOST_JOB_BASED_COVERAGE: :lost_job_based_coverage + AGED_OFF_PARENT_PLAN: :aged_off_parent_plan + LOST_MEDICAID_CHIP_MEDICARE: :lost_medicaid_chip_medicare + LOST_DECERTIFIED_INDIVIDUAL_PLAN: :lost_decertified_individual_plan + MARRIED: :married + DIVORCED: :divorced + HAD_BABY: :had_baby + ADOPTED_CHILD: :adopted_child + FOSTER_CARE_PLACEMENT: :foster_care_placement + DEATH_OF_SPOUSE_OR_DEPENDENT: :death_of_spouse_or_dependent + COURT_ORDERED: :court_ordered + MOVED_TO_NEW_COVERAGE_AREA: :moved_to_new_coverage_area + MOVED_TO_US: :moved_to_us + MOVED_TO_OR_FROM_SCHOOL_HOUSING: :moved_to_or_from_school_housing + MOVED_TO_OR_FROM_SEASONAL_WORK_HOUSING: :moved_to_or_from_seasonal_work_housing + BECAME_US_CITIZEN: :became_us_citizen + LEFT_INCARCERATION: :left_incarceration + GAINED_TRIBAL_STATUS: :gained_tribal_status + STARTED_OR_ENDED_AMERICORPS_SERVICE: :started_or_ended_americorps_service + NEW_CHILD: :new_child + OTHER: :other + + def self?.values: -> ::Array[VitableConnect::Models::MemberListQualifyingLifeEventsResponse::event_type] + end + + type status = :pending | :approved | :denied + + module Status + extend VitableConnect::Internal::Type::Enum + + PENDING: :pending + APPROVED: :approved + DENIED: :denied + + def self?.values: -> ::Array[VitableConnect::Models::MemberListQualifyingLifeEventsResponse::status] + end + end + end +end diff --git a/sig/vitable_connect/models/member_list_response.rbs b/sig/vitable_connect/models/member_list_response.rbs new file mode 100644 index 0000000..41ceb09 --- /dev/null +++ b/sig/vitable_connect/models/member_list_response.rbs @@ -0,0 +1,215 @@ +module VitableConnect + module Models + type member_list_response = + { + id: String, + first_name: String, + last_name: String, + address: VitableConnect::Models::MemberListResponse::Address?, + email: String?, + phone: String? + } + + class MemberListResponse < VitableConnect::Internal::Type::BaseModel + attr_accessor first_name: String + + attr_accessor last_name: String + + attr_accessor address: VitableConnect::Models::MemberListResponse::Address? + + attr_accessor email: String? + + attr_accessor phone: String? + + attr_accessor id: String + + def initialize: ( + id: String, + first_name: String, + last_name: String, + ?address: VitableConnect::Models::MemberListResponse::Address?, + ?email: String?, + ?phone: String? + ) -> void + + def to_hash: -> { + id: String, + first_name: String, + last_name: String, + address: VitableConnect::Models::MemberListResponse::Address?, + email: String?, + phone: String? + } + + type address = + { + :address_line_1 => String, + city: String, + state: VitableConnect::Models::MemberListResponse::Address::state, + zipcode: String, + :address_line_2 => String? + } + + class Address < VitableConnect::Internal::Type::BaseModel + attr_accessor address_line_1: String + + attr_accessor city: String + + attr_accessor state: VitableConnect::Models::MemberListResponse::Address::state + + attr_accessor zipcode: String + + attr_accessor address_line_2: String? + + def initialize: ( + address_line_1: String, + city: String, + state: VitableConnect::Models::MemberListResponse::Address::state, + zipcode: String, + ?address_line_2: String? + ) -> void + + def to_hash: -> { + :address_line_1 => String, + city: String, + state: VitableConnect::Models::MemberListResponse::Address::state, + zipcode: String, + :address_line_2 => String? + } + + type state = + :AL + | :AK + | :AZ + | :AR + | :CA + | :CO + | :CT + | :DC + | :DE + | :FL + | :GA + | :HI + | :ID + | :IL + | :IN + | :IA + | :KS + | :KY + | :LA + | :ME + | :MD + | :MA + | :MI + | :MN + | :MS + | :MO + | :MT + | :NE + | :NV + | :NH + | :NJ + | :NM + | :NY + | :NC + | :ND + | :OH + | :OK + | :OR + | :PA + | :RI + | :SC + | :SD + | :TN + | :TX + | :UT + | :VT + | :VA + | :WA + | :WI + | :WV + | :WY + | :PR + | :GU + | :AS + | :VI + | :MP + | :MH + | :PW + | :FM + | :AE + | :AA + | :AP + + module State + extend VitableConnect::Internal::Type::Enum + + AL: :AL + AK: :AK + AZ: :AZ + AR: :AR + CA: :CA + CO: :CO + CT: :CT + DC: :DC + DE: :DE + FL: :FL + GA: :GA + HI: :HI + ID: :ID + IL: :IL + IN: :IN + IA: :IA + KS: :KS + KY: :KY + LA: :LA + ME: :ME + MD: :MD + MA: :MA + MI: :MI + MN: :MN + MS: :MS + MO: :MO + MT: :MT + NE: :NE + NV: :NV + NH: :NH + NJ: :NJ + NM: :NM + NY: :NY + NC: :NC + ND: :ND + OH: :OH + OK: :OK + OR: :OR + PA: :PA + RI: :RI + SC: :SC + SD: :SD + TN: :TN + TX: :TX + UT: :UT + VT: :VT + VA: :VA + WA: :WA + WI: :WI + WV: :WV + WY: :WY + PR: :PR + GU: :GU + AS: :AS + VI: :VI + MP: :MP + MH: :MH + PW: :PW + FM: :FM + AE: :AE + AA: :AA + AP: :AP + + def self?.values: -> ::Array[VitableConnect::Models::MemberListResponse::Address::state] + end + end + end + end +end diff --git a/sig/vitable_connect/models/member_retrieve_household_params.rbs b/sig/vitable_connect/models/member_retrieve_household_params.rbs new file mode 100644 index 0000000..6d3d093 --- /dev/null +++ b/sig/vitable_connect/models/member_retrieve_household_params.rbs @@ -0,0 +1,23 @@ +module VitableConnect + module Models + type member_retrieve_household_params = + { member_id: String } & VitableConnect::Internal::Type::request_parameters + + class MemberRetrieveHouseholdParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + attr_accessor member_id: String + + def initialize: ( + member_id: String, + ?request_options: VitableConnect::request_opts + ) -> void + + def to_hash: -> { + member_id: String, + request_options: VitableConnect::RequestOptions + } + end + end +end diff --git a/sig/vitable_connect/models/member_retrieve_household_response.rbs b/sig/vitable_connect/models/member_retrieve_household_response.rbs new file mode 100644 index 0000000..6c234bb --- /dev/null +++ b/sig/vitable_connect/models/member_retrieve_household_response.rbs @@ -0,0 +1,92 @@ +module VitableConnect + module Models + type member_retrieve_household_response = + { + data: ::Array[VitableConnect::Models::MemberRetrieveHouseholdResponse::Data] + } + + class MemberRetrieveHouseholdResponse < VitableConnect::Internal::Type::BaseModel + attr_accessor data: ::Array[VitableConnect::Models::MemberRetrieveHouseholdResponse::Data] + + def initialize: ( + data: ::Array[VitableConnect::Models::MemberRetrieveHouseholdResponse::Data] + ) -> void + + def to_hash: -> { + data: ::Array[VitableConnect::Models::MemberRetrieveHouseholdResponse::Data] + } + + type data = + { + date_of_birth: Date, + first_name: String, + household_admin_in: bool, + last_name: String, + member_id: String, + member_type: VitableConnect::Models::MemberRetrieveHouseholdResponse::Data::member_type, + relationship: VitableConnect::Models::MemberRetrieveHouseholdResponse::Data::relationship? + } + + class Data < VitableConnect::Internal::Type::BaseModel + attr_accessor date_of_birth: Date + + attr_accessor first_name: String + + attr_accessor household_admin_in: bool + + attr_accessor last_name: String + + attr_accessor member_type: VitableConnect::Models::MemberRetrieveHouseholdResponse::Data::member_type + + attr_accessor relationship: VitableConnect::Models::MemberRetrieveHouseholdResponse::Data::relationship? + + attr_accessor member_id: String + + def initialize: ( + date_of_birth: Date, + first_name: String, + household_admin_in: bool, + last_name: String, + member_id: String, + member_type: VitableConnect::Models::MemberRetrieveHouseholdResponse::Data::member_type, + ?relationship: VitableConnect::Models::MemberRetrieveHouseholdResponse::Data::relationship? + ) -> void + + def to_hash: -> { + date_of_birth: Date, + first_name: String, + household_admin_in: bool, + last_name: String, + member_id: String, + member_type: VitableConnect::Models::MemberRetrieveHouseholdResponse::Data::member_type, + relationship: VitableConnect::Models::MemberRetrieveHouseholdResponse::Data::relationship? + } + + type member_type = :"Account Holder" | :Dependent | :Inactive + + module MemberType + extend VitableConnect::Internal::Type::Enum + + ACCOUNT_HOLDER: :"Account Holder" + DEPENDENT: :Dependent + INACTIVE: :Inactive + + def self?.values: -> ::Array[VitableConnect::Models::MemberRetrieveHouseholdResponse::Data::member_type] + end + + type relationship = :Child | :Spouse | :Roommate | :Other + + module Relationship + extend VitableConnect::Internal::Type::Enum + + CHILD: :Child + SPOUSE: :Spouse + ROOMMATE: :Roommate + OTHER: :Other + + def self?.values: -> ::Array[VitableConnect::Models::MemberRetrieveHouseholdResponse::Data::relationship] + end + end + end + end +end diff --git a/sig/vitable_connect/models/member_retrieve_params.rbs b/sig/vitable_connect/models/member_retrieve_params.rbs new file mode 100644 index 0000000..70319dc --- /dev/null +++ b/sig/vitable_connect/models/member_retrieve_params.rbs @@ -0,0 +1,23 @@ +module VitableConnect + module Models + type member_retrieve_params = + { member_id: String } & VitableConnect::Internal::Type::request_parameters + + class MemberRetrieveParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + attr_accessor member_id: String + + def initialize: ( + member_id: String, + ?request_options: VitableConnect::request_opts + ) -> void + + def to_hash: -> { + member_id: String, + request_options: VitableConnect::RequestOptions + } + end + end +end diff --git a/sig/vitable_connect/models/member_retrieve_response.rbs b/sig/vitable_connect/models/member_retrieve_response.rbs new file mode 100644 index 0000000..fa7cbdf --- /dev/null +++ b/sig/vitable_connect/models/member_retrieve_response.rbs @@ -0,0 +1,370 @@ +module VitableConnect + module Models + type member_retrieve_response = + { data: VitableConnect::Models::MemberRetrieveResponse::Data } + + class MemberRetrieveResponse < VitableConnect::Internal::Type::BaseModel + attr_accessor data: VitableConnect::Models::MemberRetrieveResponse::Data + + def initialize: ( + data: VitableConnect::Models::MemberRetrieveResponse::Data + ) -> void + + def to_hash: -> { + data: VitableConnect::Models::MemberRetrieveResponse::Data + } + + type data = + { + id: String, + age: Integer, + date_of_birth: Date, + first_name: String, + last_name: String, + name: String, + status: VitableConnect::Models::MemberRetrieveResponse::Data::status, + address: VitableConnect::Models::MemberRetrieveResponse::Data::Address?, + email: String?, + gender: VitableConnect::Models::MemberRetrieveResponse::Data::gender?, + marital_status: VitableConnect::Models::MemberRetrieveResponse::Data::marital_status?, + middle_name: String?, + phone: String?, + preferred_language: VitableConnect::Models::MemberRetrieveResponse::Data::preferred_language?, + sex_at_birth: VitableConnect::Models::MemberRetrieveResponse::Data::sex_at_birth?, + suffix: VitableConnect::Models::MemberRetrieveResponse::Data::suffix?, + tobacco_status: bool? + } + + class Data < VitableConnect::Internal::Type::BaseModel + attr_accessor age: Integer + + attr_accessor date_of_birth: Date + + attr_accessor first_name: String + + attr_accessor last_name: String + + attr_accessor address: VitableConnect::Models::MemberRetrieveResponse::Data::Address? + + attr_accessor email: String? + + attr_accessor gender: VitableConnect::Models::MemberRetrieveResponse::Data::gender? + + attr_accessor marital_status: VitableConnect::Models::MemberRetrieveResponse::Data::marital_status? + + attr_accessor middle_name: String? + + attr_accessor phone: String? + + attr_accessor preferred_language: VitableConnect::Models::MemberRetrieveResponse::Data::preferred_language? + + attr_accessor sex_at_birth: VitableConnect::Models::MemberRetrieveResponse::Data::sex_at_birth? + + attr_accessor suffix: VitableConnect::Models::MemberRetrieveResponse::Data::suffix? + + attr_accessor tobacco_status: bool? + + attr_accessor id: String + + attr_accessor name: String + + attr_accessor status: VitableConnect::Models::MemberRetrieveResponse::Data::status + + def initialize: ( + id: String, + age: Integer, + date_of_birth: Date, + first_name: String, + last_name: String, + name: String, + status: VitableConnect::Models::MemberRetrieveResponse::Data::status, + ?address: VitableConnect::Models::MemberRetrieveResponse::Data::Address?, + ?email: String?, + ?gender: VitableConnect::Models::MemberRetrieveResponse::Data::gender?, + ?marital_status: VitableConnect::Models::MemberRetrieveResponse::Data::marital_status?, + ?middle_name: String?, + ?phone: String?, + ?preferred_language: VitableConnect::Models::MemberRetrieveResponse::Data::preferred_language?, + ?sex_at_birth: VitableConnect::Models::MemberRetrieveResponse::Data::sex_at_birth?, + ?suffix: VitableConnect::Models::MemberRetrieveResponse::Data::suffix?, + ?tobacco_status: bool? + ) -> void + + def to_hash: -> { + id: String, + age: Integer, + date_of_birth: Date, + first_name: String, + last_name: String, + name: String, + status: VitableConnect::Models::MemberRetrieveResponse::Data::status, + address: VitableConnect::Models::MemberRetrieveResponse::Data::Address?, + email: String?, + gender: VitableConnect::Models::MemberRetrieveResponse::Data::gender?, + marital_status: VitableConnect::Models::MemberRetrieveResponse::Data::marital_status?, + middle_name: String?, + phone: String?, + preferred_language: VitableConnect::Models::MemberRetrieveResponse::Data::preferred_language?, + sex_at_birth: VitableConnect::Models::MemberRetrieveResponse::Data::sex_at_birth?, + suffix: VitableConnect::Models::MemberRetrieveResponse::Data::suffix?, + tobacco_status: bool? + } + + type status = :onboarded | :pending_onboarding + + module Status + extend VitableConnect::Internal::Type::Enum + + ONBOARDED: :onboarded + PENDING_ONBOARDING: :pending_onboarding + + def self?.values: -> ::Array[VitableConnect::Models::MemberRetrieveResponse::Data::status] + end + + type address = + { + :address_line_1 => String, + city: String, + state: VitableConnect::Models::MemberRetrieveResponse::Data::Address::state, + zipcode: String, + :address_line_2 => String? + } + + class Address < VitableConnect::Internal::Type::BaseModel + attr_accessor address_line_1: String + + attr_accessor city: String + + attr_accessor state: VitableConnect::Models::MemberRetrieveResponse::Data::Address::state + + attr_accessor zipcode: String + + attr_accessor address_line_2: String? + + def initialize: ( + address_line_1: String, + city: String, + state: VitableConnect::Models::MemberRetrieveResponse::Data::Address::state, + zipcode: String, + ?address_line_2: String? + ) -> void + + def to_hash: -> { + :address_line_1 => String, + city: String, + state: VitableConnect::Models::MemberRetrieveResponse::Data::Address::state, + zipcode: String, + :address_line_2 => String? + } + + type state = + :AL + | :AK + | :AZ + | :AR + | :CA + | :CO + | :CT + | :DC + | :DE + | :FL + | :GA + | :HI + | :ID + | :IL + | :IN + | :IA + | :KS + | :KY + | :LA + | :ME + | :MD + | :MA + | :MI + | :MN + | :MS + | :MO + | :MT + | :NE + | :NV + | :NH + | :NJ + | :NM + | :NY + | :NC + | :ND + | :OH + | :OK + | :OR + | :PA + | :RI + | :SC + | :SD + | :TN + | :TX + | :UT + | :VT + | :VA + | :WA + | :WI + | :WV + | :WY + | :PR + | :GU + | :AS + | :VI + | :MP + | :MH + | :PW + | :FM + | :AE + | :AA + | :AP + + module State + extend VitableConnect::Internal::Type::Enum + + AL: :AL + AK: :AK + AZ: :AZ + AR: :AR + CA: :CA + CO: :CO + CT: :CT + DC: :DC + DE: :DE + FL: :FL + GA: :GA + HI: :HI + ID: :ID + IL: :IL + IN: :IN + IA: :IA + KS: :KS + KY: :KY + LA: :LA + ME: :ME + MD: :MD + MA: :MA + MI: :MI + MN: :MN + MS: :MS + MO: :MO + MT: :MT + NE: :NE + NV: :NV + NH: :NH + NJ: :NJ + NM: :NM + NY: :NY + NC: :NC + ND: :ND + OH: :OH + OK: :OK + OR: :OR + PA: :PA + RI: :RI + SC: :SC + SD: :SD + TN: :TN + TX: :TX + UT: :UT + VT: :VT + VA: :VA + WA: :WA + WI: :WI + WV: :WV + WY: :WY + PR: :PR + GU: :GU + AS: :AS + VI: :VI + MP: :MP + MH: :MH + PW: :PW + FM: :FM + AE: :AE + AA: :AA + AP: :AP + + def self?.values: -> ::Array[VitableConnect::Models::MemberRetrieveResponse::Data::Address::state] + end + end + + type gender = + :Male + | :Female + | :Transgender + | :"Non-binary" + | :"Prefer not to respond" + + module Gender + extend VitableConnect::Internal::Type::Enum + + MALE: :Male + FEMALE: :Female + TRANSGENDER: :Transgender + NON_BINARY: :"Non-binary" + PREFER_NOT_TO_RESPOND: :"Prefer not to respond" + + def self?.values: -> ::Array[VitableConnect::Models::MemberRetrieveResponse::Data::gender] + end + + type marital_status = :Single | :Married + + module MaritalStatus + extend VitableConnect::Internal::Type::Enum + + SINGLE: :Single + MARRIED: :Married + + def self?.values: -> ::Array[VitableConnect::Models::MemberRetrieveResponse::Data::marital_status] + end + + type preferred_language = :en | :es | :zh | :ru | :sw | :th + + module PreferredLanguage + extend VitableConnect::Internal::Type::Enum + + EN: :en + ES: :es + ZH: :zh + RU: :ru + SW: :sw + TH: :th + + def self?.values: -> ::Array[VitableConnect::Models::MemberRetrieveResponse::Data::preferred_language] + end + + type sex_at_birth = :Male | :Female | :Other | :Unknown + + module SexAtBirth + extend VitableConnect::Internal::Type::Enum + + MALE: :Male + FEMALE: :Female + OTHER: :Other + UNKNOWN: :Unknown + + def self?.values: -> ::Array[VitableConnect::Models::MemberRetrieveResponse::Data::sex_at_birth] + end + + type suffix = :Sr | :Jr | :I | :II | :III | :IV | :V + + module Suffix + extend VitableConnect::Internal::Type::Enum + + SR: :Sr + JR: :Jr + I: :I + II: :II + III: :III + IV: :IV + V: :V + + def self?.values: -> ::Array[VitableConnect::Models::MemberRetrieveResponse::Data::suffix] + end + end + end + end +end diff --git a/sig/vitable_connect/models/organization_create_params.rbs b/sig/vitable_connect/models/organization_create_params.rbs new file mode 100644 index 0000000..94576d8 --- /dev/null +++ b/sig/vitable_connect/models/organization_create_params.rbs @@ -0,0 +1,52 @@ +module VitableConnect + module Models + type organization_create_params = + { + name: String, + type: VitableConnect::Models::OrganizationCreateParams::type_? + } + & VitableConnect::Internal::Type::request_parameters + + class OrganizationCreateParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + attr_accessor name: String + + attr_accessor type: VitableConnect::Models::OrganizationCreateParams::type_? + + def initialize: ( + name: String, + ?type: VitableConnect::Models::OrganizationCreateParams::type_?, + ?request_options: VitableConnect::request_opts + ) -> void + + def to_hash: -> { + name: String, + type: VitableConnect::Models::OrganizationCreateParams::type_?, + request_options: VitableConnect::RequestOptions + } + + type type_ = + :BROKERAGE + | :TPA + | :GENERAL_AGENT + | :CHANNEL_PARTNER + | :CONSULTING_FIRM + | :API_PLATFORM + + module Type + extend VitableConnect::Internal::Type::Enum + + BROKERAGE: :BROKERAGE + TPA: :TPA + GENERAL_AGENT: :GENERAL_AGENT + CHANNEL_PARTNER: :CHANNEL_PARTNER + CONSULTING_FIRM: :CONSULTING_FIRM + API_PLATFORM: :API_PLATFORM + + def self?.values: -> ::Array[VitableConnect::Models::OrganizationCreateParams::type_] + end + end + end +end diff --git a/sig/vitable_connect/models/organization_create_response.rbs b/sig/vitable_connect/models/organization_create_response.rbs new file mode 100644 index 0000000..b327f2b --- /dev/null +++ b/sig/vitable_connect/models/organization_create_response.rbs @@ -0,0 +1,77 @@ +module VitableConnect + module Models + type organization_create_response = + { + id: String, + idp_org_id: String?, + idp_provider: VitableConnect::Models::OrganizationCreateResponse::idp_provider?, + name: String, + super_in: bool, + type: VitableConnect::Models::OrganizationCreateResponse::type_? + } + + class OrganizationCreateResponse < VitableConnect::Internal::Type::BaseModel + attr_accessor id: String + + attr_accessor idp_org_id: String? + + attr_accessor idp_provider: VitableConnect::Models::OrganizationCreateResponse::idp_provider? + + attr_accessor name: String + + attr_accessor super_in: bool + + attr_accessor type: VitableConnect::Models::OrganizationCreateResponse::type_? + + def initialize: ( + id: String, + idp_org_id: String?, + idp_provider: VitableConnect::Models::OrganizationCreateResponse::idp_provider?, + name: String, + super_in: bool, + type: VitableConnect::Models::OrganizationCreateResponse::type_? + ) -> void + + def to_hash: -> { + id: String, + idp_org_id: String?, + idp_provider: VitableConnect::Models::OrganizationCreateResponse::idp_provider?, + name: String, + super_in: bool, + type: VitableConnect::Models::OrganizationCreateResponse::type_? + } + + type idp_provider = :workos | :vitable + + module IdpProvider + extend VitableConnect::Internal::Type::Enum + + WORKOS: :workos + VITABLE: :vitable + + def self?.values: -> ::Array[VitableConnect::Models::OrganizationCreateResponse::idp_provider] + end + + type type_ = + :BROKERAGE + | :TPA + | :GENERAL_AGENT + | :CHANNEL_PARTNER + | :CONSULTING_FIRM + | :API_PLATFORM + + module Type + extend VitableConnect::Internal::Type::Enum + + BROKERAGE: :BROKERAGE + TPA: :TPA + GENERAL_AGENT: :GENERAL_AGENT + CHANNEL_PARTNER: :CHANNEL_PARTNER + CONSULTING_FIRM: :CONSULTING_FIRM + API_PLATFORM: :API_PLATFORM + + def self?.values: -> ::Array[VitableConnect::Models::OrganizationCreateResponse::type_] + end + end + end +end diff --git a/sig/vitable_connect/models/organization_list_params.rbs b/sig/vitable_connect/models/organization_list_params.rbs new file mode 100644 index 0000000..75950a6 --- /dev/null +++ b/sig/vitable_connect/models/organization_list_params.rbs @@ -0,0 +1,15 @@ +module VitableConnect + module Models + type organization_list_params = + { } & VitableConnect::Internal::Type::request_parameters + + class OrganizationListParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + def initialize: (?request_options: VitableConnect::request_opts) -> void + + def to_hash: -> { request_options: VitableConnect::RequestOptions } + end + end +end diff --git a/sig/vitable_connect/models/organization_list_response.rbs b/sig/vitable_connect/models/organization_list_response.rbs new file mode 100644 index 0000000..c74463c --- /dev/null +++ b/sig/vitable_connect/models/organization_list_response.rbs @@ -0,0 +1,99 @@ +module VitableConnect + module Models + type organization_list_response = + { + organizations: ::Array[VitableConnect::Models::OrganizationListResponse::Organization], + total: Integer + } + + class OrganizationListResponse < VitableConnect::Internal::Type::BaseModel + attr_accessor organizations: ::Array[VitableConnect::Models::OrganizationListResponse::Organization] + + attr_accessor total: Integer + + def initialize: ( + organizations: ::Array[VitableConnect::Models::OrganizationListResponse::Organization], + total: Integer + ) -> void + + def to_hash: -> { + organizations: ::Array[VitableConnect::Models::OrganizationListResponse::Organization], + total: Integer + } + + type organization = + { + id: String, + idp_org_id: String?, + idp_provider: VitableConnect::Models::OrganizationListResponse::Organization::idp_provider?, + name: String, + super_in: bool, + type: VitableConnect::Models::OrganizationListResponse::Organization::type_? + } + + class Organization < VitableConnect::Internal::Type::BaseModel + attr_accessor id: String + + attr_accessor idp_org_id: String? + + attr_accessor idp_provider: VitableConnect::Models::OrganizationListResponse::Organization::idp_provider? + + attr_accessor name: String + + attr_accessor super_in: bool + + attr_accessor type: VitableConnect::Models::OrganizationListResponse::Organization::type_? + + def initialize: ( + id: String, + idp_org_id: String?, + idp_provider: VitableConnect::Models::OrganizationListResponse::Organization::idp_provider?, + name: String, + super_in: bool, + type: VitableConnect::Models::OrganizationListResponse::Organization::type_? + ) -> void + + def to_hash: -> { + id: String, + idp_org_id: String?, + idp_provider: VitableConnect::Models::OrganizationListResponse::Organization::idp_provider?, + name: String, + super_in: bool, + type: VitableConnect::Models::OrganizationListResponse::Organization::type_? + } + + type idp_provider = :workos | :vitable + + module IdpProvider + extend VitableConnect::Internal::Type::Enum + + WORKOS: :workos + VITABLE: :vitable + + def self?.values: -> ::Array[VitableConnect::Models::OrganizationListResponse::Organization::idp_provider] + end + + type type_ = + :BROKERAGE + | :TPA + | :GENERAL_AGENT + | :CHANNEL_PARTNER + | :CONSULTING_FIRM + | :API_PLATFORM + + module Type + extend VitableConnect::Internal::Type::Enum + + BROKERAGE: :BROKERAGE + TPA: :TPA + GENERAL_AGENT: :GENERAL_AGENT + CHANNEL_PARTNER: :CHANNEL_PARTNER + CONSULTING_FIRM: :CONSULTING_FIRM + API_PLATFORM: :API_PLATFORM + + def self?.values: -> ::Array[VitableConnect::Models::OrganizationListResponse::Organization::type_] + end + end + end + end +end diff --git a/sig/vitable_connect/models/pagination.rbs b/sig/vitable_connect/models/pagination.rbs new file mode 100644 index 0000000..ae8ab55 --- /dev/null +++ b/sig/vitable_connect/models/pagination.rbs @@ -0,0 +1,30 @@ +module VitableConnect + module Models + type pagination = + { limit: Integer, page: Integer, total: Integer, total_pages: Integer } + + class Pagination < VitableConnect::Internal::Type::BaseModel + attr_accessor limit: Integer + + attr_accessor page: Integer + + attr_accessor total: Integer + + attr_accessor total_pages: Integer + + def initialize: ( + limit: Integer, + page: Integer, + total: Integer, + total_pages: Integer + ) -> void + + def to_hash: -> { + limit: Integer, + page: Integer, + total: Integer, + total_pages: Integer + } + end + end +end diff --git a/sig/vitable_connect/models/plan_list_params.rbs b/sig/vitable_connect/models/plan_list_params.rbs new file mode 100644 index 0000000..ce5ad73 --- /dev/null +++ b/sig/vitable_connect/models/plan_list_params.rbs @@ -0,0 +1,32 @@ +module VitableConnect + module Models + type plan_list_params = + { limit: Integer, page: Integer } + & VitableConnect::Internal::Type::request_parameters + + class PlanListParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + attr_reader limit: Integer? + + def limit=: (Integer) -> Integer + + attr_reader page: Integer? + + def page=: (Integer) -> Integer + + def initialize: ( + ?limit: Integer, + ?page: Integer, + ?request_options: VitableConnect::request_opts + ) -> void + + def to_hash: -> { + limit: Integer, + page: Integer, + request_options: VitableConnect::RequestOptions + } + end + end +end diff --git a/sig/vitable_connect/models/plan_list_response.rbs b/sig/vitable_connect/models/plan_list_response.rbs new file mode 100644 index 0000000..d7a4bf7 --- /dev/null +++ b/sig/vitable_connect/models/plan_list_response.rbs @@ -0,0 +1,15 @@ +module VitableConnect + module Models + type plan_list_response = { id: String, name: String } + + class PlanListResponse < VitableConnect::Internal::Type::BaseModel + attr_accessor id: String + + attr_accessor name: String + + def initialize: (id: String, name: String) -> void + + def to_hash: -> { id: String, name: String } + end + end +end diff --git a/sig/vitable_connect/models/webhook_event.rbs b/sig/vitable_connect/models/webhook_event.rbs new file mode 100644 index 0000000..bb94ea0 --- /dev/null +++ b/sig/vitable_connect/models/webhook_event.rbs @@ -0,0 +1,45 @@ +module VitableConnect + module Models + type webhook_event = + { + id: String, + created_at: Time, + event_name: String, + organization_id: String, + resource_id: String, + resource_type: String + } + + class WebhookEvent < VitableConnect::Internal::Type::BaseModel + attr_accessor id: String + + attr_accessor created_at: Time + + attr_accessor event_name: String + + attr_accessor organization_id: String + + attr_accessor resource_id: String + + attr_accessor resource_type: String + + def initialize: ( + id: String, + created_at: Time, + event_name: String, + organization_id: String, + resource_id: String, + resource_type: String + ) -> void + + def to_hash: -> { + id: String, + created_at: Time, + event_name: String, + organization_id: String, + resource_id: String, + resource_type: String + } + end + end +end diff --git a/sig/vitable_connect/models/webhook_event_list_deliveries_params.rbs b/sig/vitable_connect/models/webhook_event_list_deliveries_params.rbs new file mode 100644 index 0000000..c79afe0 --- /dev/null +++ b/sig/vitable_connect/models/webhook_event_list_deliveries_params.rbs @@ -0,0 +1,23 @@ +module VitableConnect + module Models + type webhook_event_list_deliveries_params = + { event_id: String } & VitableConnect::Internal::Type::request_parameters + + class WebhookEventListDeliveriesParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + attr_accessor event_id: String + + def initialize: ( + event_id: String, + ?request_options: VitableConnect::request_opts + ) -> void + + def to_hash: -> { + event_id: String, + request_options: VitableConnect::RequestOptions + } + end + end +end diff --git a/sig/vitable_connect/models/webhook_event_list_deliveries_response.rbs b/sig/vitable_connect/models/webhook_event_list_deliveries_response.rbs new file mode 100644 index 0000000..ea2ac54 --- /dev/null +++ b/sig/vitable_connect/models/webhook_event_list_deliveries_response.rbs @@ -0,0 +1,77 @@ +module VitableConnect + module Models + type webhook_event_list_deliveries_response = + { + data: ::Array[VitableConnect::Models::WebhookEventListDeliveriesResponse::Data] + } + + class WebhookEventListDeliveriesResponse < VitableConnect::Internal::Type::BaseModel + attr_accessor data: ::Array[VitableConnect::Models::WebhookEventListDeliveriesResponse::Data] + + def initialize: ( + data: ::Array[VitableConnect::Models::WebhookEventListDeliveriesResponse::Data] + ) -> void + + def to_hash: -> { + data: ::Array[VitableConnect::Models::WebhookEventListDeliveriesResponse::Data] + } + + type data = + { + id: String, + created_at: Time, + delivered_at: Time?, + failed_at: Time?, + failure_reason: String, + started_at: Time?, + status: String, + subscription_id: String, + webhook_event_id: String + } + + class Data < VitableConnect::Internal::Type::BaseModel + attr_accessor id: String + + attr_accessor created_at: Time + + attr_accessor delivered_at: Time? + + attr_accessor failed_at: Time? + + attr_accessor failure_reason: String + + attr_accessor started_at: Time? + + attr_accessor status: String + + attr_accessor subscription_id: String + + attr_accessor webhook_event_id: String + + def initialize: ( + id: String, + created_at: Time, + delivered_at: Time?, + failed_at: Time?, + failure_reason: String, + started_at: Time?, + status: String, + subscription_id: String, + webhook_event_id: String + ) -> void + + def to_hash: -> { + id: String, + created_at: Time, + delivered_at: Time?, + failed_at: Time?, + failure_reason: String, + started_at: Time?, + status: String, + subscription_id: String, + webhook_event_id: String + } + end + end + end +end diff --git a/sig/vitable_connect/models/webhook_event_list_params.rbs b/sig/vitable_connect/models/webhook_event_list_params.rbs new file mode 100644 index 0000000..3ef4e4f --- /dev/null +++ b/sig/vitable_connect/models/webhook_event_list_params.rbs @@ -0,0 +1,126 @@ +module VitableConnect + module Models + type webhook_event_list_params = + { + created_after: Time, + created_before: Time, + event_name: VitableConnect::Models::WebhookEventListParams::event_name, + limit: Integer, + page: Integer, + resource_id: String, + resource_type: VitableConnect::Models::WebhookEventListParams::resource_type + } + & VitableConnect::Internal::Type::request_parameters + + class WebhookEventListParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + attr_reader created_after: Time? + + def created_after=: (Time) -> Time + + attr_reader created_before: Time? + + def created_before=: (Time) -> Time + + attr_reader event_name: VitableConnect::Models::WebhookEventListParams::event_name? + + def event_name=: ( + VitableConnect::Models::WebhookEventListParams::event_name + ) -> VitableConnect::Models::WebhookEventListParams::event_name + + attr_reader limit: Integer? + + def limit=: (Integer) -> Integer + + attr_reader page: Integer? + + def page=: (Integer) -> Integer + + attr_reader resource_id: String? + + def resource_id=: (String) -> String + + attr_reader resource_type: VitableConnect::Models::WebhookEventListParams::resource_type? + + def resource_type=: ( + VitableConnect::Models::WebhookEventListParams::resource_type + ) -> VitableConnect::Models::WebhookEventListParams::resource_type + + def initialize: ( + ?created_after: Time, + ?created_before: Time, + ?event_name: VitableConnect::Models::WebhookEventListParams::event_name, + ?limit: Integer, + ?page: Integer, + ?resource_id: String, + ?resource_type: VitableConnect::Models::WebhookEventListParams::resource_type, + ?request_options: VitableConnect::request_opts + ) -> void + + def to_hash: -> { + created_after: Time, + created_before: Time, + event_name: VitableConnect::Models::WebhookEventListParams::event_name, + limit: Integer, + page: Integer, + resource_id: String, + resource_type: VitableConnect::Models::WebhookEventListParams::resource_type, + request_options: VitableConnect::RequestOptions + } + + type event_name = + :"enrollment.accepted" + | :"enrollment.terminated" + | :"enrollment.termination_rescheduled" + | :"enrollment.elected" + | :"enrollment.granted" + | :"enrollment.waived" + | :"enrollment.started" + | :"employee.eligibility_granted" + | :"employee.eligibility_terminated" + | :"employee.deactivated" + | :"employee.deduction_created" + + module EventName + extend VitableConnect::Internal::Type::Enum + + ENROLLMENT_ACCEPTED: :"enrollment.accepted" + ENROLLMENT_TERMINATED: :"enrollment.terminated" + ENROLLMENT_TERMINATION_RESCHEDULED: :"enrollment.termination_rescheduled" + ENROLLMENT_ELECTED: :"enrollment.elected" + ENROLLMENT_GRANTED: :"enrollment.granted" + ENROLLMENT_WAIVED: :"enrollment.waived" + ENROLLMENT_STARTED: :"enrollment.started" + EMPLOYEE_ELIGIBILITY_GRANTED: :"employee.eligibility_granted" + EMPLOYEE_ELIGIBILITY_TERMINATED: :"employee.eligibility_terminated" + EMPLOYEE_DEACTIVATED: :"employee.deactivated" + EMPLOYEE_DEDUCTION_CREATED: :"employee.deduction_created" + + def self?.values: -> ::Array[VitableConnect::Models::WebhookEventListParams::event_name] + end + + type resource_type = + :enrollment + | :employee + | :employer + | :dependent + | :plan_year + | :payroll_deduction + + module ResourceType + extend VitableConnect::Internal::Type::Enum + + ENROLLMENT: :enrollment + EMPLOYEE: :employee + EMPLOYER: :employer + DEPENDENT: :dependent + PLAN_YEAR: :plan_year + PAYROLL_DEDUCTION: :payroll_deduction + + def self?.values: -> ::Array[VitableConnect::Models::WebhookEventListParams::resource_type] + end + end + end +end diff --git a/sig/vitable_connect/models/webhook_event_retrieve_params.rbs b/sig/vitable_connect/models/webhook_event_retrieve_params.rbs new file mode 100644 index 0000000..fff5c5e --- /dev/null +++ b/sig/vitable_connect/models/webhook_event_retrieve_params.rbs @@ -0,0 +1,23 @@ +module VitableConnect + module Models + type webhook_event_retrieve_params = + { event_id: String } & VitableConnect::Internal::Type::request_parameters + + class WebhookEventRetrieveParams < VitableConnect::Internal::Type::BaseModel + extend VitableConnect::Internal::Type::RequestParameters::Converter + include VitableConnect::Internal::Type::RequestParameters + + attr_accessor event_id: String + + def initialize: ( + event_id: String, + ?request_options: VitableConnect::request_opts + ) -> void + + def to_hash: -> { + event_id: String, + request_options: VitableConnect::RequestOptions + } + end + end +end diff --git a/sig/vitable_connect/models/webhook_event_retrieve_response.rbs b/sig/vitable_connect/models/webhook_event_retrieve_response.rbs new file mode 100644 index 0000000..a107434 --- /dev/null +++ b/sig/vitable_connect/models/webhook_event_retrieve_response.rbs @@ -0,0 +1,14 @@ +module VitableConnect + module Models + type webhook_event_retrieve_response = + { data: VitableConnect::WebhookEvent } + + class WebhookEventRetrieveResponse < VitableConnect::Internal::Type::BaseModel + attr_accessor data: VitableConnect::WebhookEvent + + def initialize: (data: VitableConnect::WebhookEvent) -> void + + def to_hash: -> { data: VitableConnect::WebhookEvent } + end + end +end diff --git a/sig/vitable_connect/request_options.rbs b/sig/vitable_connect/request_options.rbs new file mode 100644 index 0000000..f6d3d0a --- /dev/null +++ b/sig/vitable_connect/request_options.rbs @@ -0,0 +1,36 @@ +module VitableConnect + type request_opts = + VitableConnect::RequestOptions + | VitableConnect::request_options + | ::Hash[Symbol, top] + + type request_options = + { + idempotency_key: String?, + extra_query: ::Hash[String, (::Array[String] | String)?]?, + extra_headers: ::Hash[String, String?]?, + extra_body: top?, + max_retries: Integer?, + timeout: Float? + } + + class RequestOptions < VitableConnect::Internal::Type::BaseModel + def self.validate!: (VitableConnect::request_opts opts) -> void + + attr_accessor idempotency_key: String? + + attr_accessor extra_query: ::Hash[String, (::Array[String] | String)?]? + + attr_accessor extra_headers: ::Hash[String, String?]? + + attr_accessor extra_body: top? + + attr_accessor max_retries: Integer? + + attr_accessor timeout: Float? + + def initialize: ( + ?VitableConnect::request_options | ::Hash[Symbol, top] values + ) -> void + end +end diff --git a/sig/vitable_connect/resources/auth.rbs b/sig/vitable_connect/resources/auth.rbs new file mode 100644 index 0000000..228460d --- /dev/null +++ b/sig/vitable_connect/resources/auth.rbs @@ -0,0 +1,13 @@ +module VitableConnect + module Resources + class Auth + def issue_access_token: ( + grant_type: VitableConnect::Models::AuthIssueAccessTokenParams::grant_type, + ?bound_entity: VitableConnect::AuthIssueAccessTokenParams::BoundEntity?, + ?request_options: VitableConnect::request_opts + ) -> VitableConnect::Models::AuthIssueAccessTokenResponse + + def initialize: (client: VitableConnect::Client) -> void + end + end +end diff --git a/sig/vitable_connect/resources/employees.rbs b/sig/vitable_connect/resources/employees.rbs new file mode 100644 index 0000000..bdc2f57 --- /dev/null +++ b/sig/vitable_connect/resources/employees.rbs @@ -0,0 +1,32 @@ +module VitableConnect + module Resources + class Employees + def retrieve: ( + String employee_id, + ?request_options: VitableConnect::request_opts + ) -> VitableConnect::Models::EmployeeRetrieveResponse + + def update: ( + String employee_id, + effective_date: Date, + ?address: VitableConnect::EmployeeUpdateParams::Address?, + ?compensation_type: VitableConnect::Models::EmployeeUpdateParams::compensation_type?, + ?email: String?, + ?employee_class: VitableConnect::Models::employee_class?, + ?gender: VitableConnect::Models::EmployeeUpdateParams::gender?, + ?phone: String?, + ?start_date: Date?, + ?request_options: VitableConnect::request_opts + ) -> VitableConnect::Models::EmployeeUpdateResponse + + def list_enrollments: ( + String employee_id, + ?limit: Integer, + ?page: Integer, + ?request_options: VitableConnect::request_opts + ) -> VitableConnect::Internal::PageNumberPage[VitableConnect::Enrollment] + + def initialize: (client: VitableConnect::Client) -> void + end + end +end diff --git a/sig/vitable_connect/resources/employers.rbs b/sig/vitable_connect/resources/employers.rbs new file mode 100644 index 0000000..aa28f30 --- /dev/null +++ b/sig/vitable_connect/resources/employers.rbs @@ -0,0 +1,153 @@ +module VitableConnect + module Resources + class Employers + def create: ( + address: VitableConnect::EmployerCreateParams::Address, + ein: String, + email: String, + legal_name: String, + name: String, + ?phone_number: String?, + ?reference_id: String?, + ?request_options: VitableConnect::request_opts + ) -> VitableConnect::EmployerResponse + + def retrieve: ( + String employer_id, + ?request_options: VitableConnect::request_opts + ) -> VitableConnect::EmployerResponse + + def update: ( + String employer_id, + ?active: bool?, + ?address: VitableConnect::EmployerUpdateParams::Address?, + ?legal_name: String?, + ?name: String?, + ?request_options: VitableConnect::request_opts + ) -> VitableConnect::EmployerResponse + + def list: ( + ?benefit_family: ::Array[VitableConnect::Models::EmployerListParams::benefit_family], + ?benefit_lifecycle_stage: ::Array[VitableConnect::Models::EmployerListParams::benefit_lifecycle_stage], + ?hris_provider: ::Array[String], + ?hris_status: ::Array[VitableConnect::Models::EmployerListParams::hris_status], + ?include_cancelled: bool, + ?limit: Integer, + ?page: Integer, + ?search: String?, + ?request_options: VitableConnect::request_opts + ) -> VitableConnect::Internal::PageNumberPage[VitableConnect::Models::EmployerListResponse] + + def ensure_payroll_integration_email: ( + String employer_id, + ?request_options: VitableConnect::request_opts + ) -> VitableConnect::Models::EmployerEnsurePayrollIntegrationEmailResponse + + def list_benefit_plan_year_enrollments: ( + String benefit_plan_year_id, + employer_id: String, + ?election_status: ::Array[VitableConnect::Models::EmployerListBenefitPlanYearEnrollmentsParams::election_status], + ?limit: Integer, + ?page: Integer, + ?search: String, + ?request_options: VitableConnect::request_opts + ) -> VitableConnect::Internal::PageNumberPage[VitableConnect::Models::EmployerListBenefitPlanYearEnrollmentsResponse] + + def list_benefit_plan_years: ( + String employer_id, + ?request_options: VitableConnect::request_opts + ) -> VitableConnect::Models::EmployerListBenefitPlanYearsResponse + + def list_employees: ( + String employer_id, + ?employment_status: VitableConnect::Models::EmployerListEmployeesParams::employment_status, + ?limit: Integer, + ?page: Integer, + ?search: String, + ?request_options: VitableConnect::request_opts + ) -> VitableConnect::Internal::PageNumberPage[VitableConnect::Employee] + + def list_hris_providers: ( + ?request_options: VitableConnect::request_opts + ) -> VitableConnect::Models::EmployerListHRISProvidersResponse + + def list_invoices: ( + String employer_id, + ?limit: Integer, + ?offset: String?, + ?request_options: VitableConnect::request_opts + ) -> VitableConnect::Models::EmployerListInvoicesResponse + + def list_payroll_deduction_statements: ( + String employer_id, + ?limit: Integer, + ?page: Integer, + ?request_options: VitableConnect::request_opts + ) -> VitableConnect::Internal::PageNumberPage[VitableConnect::Models::EmployerListPayrollDeductionStatementsResponse] + + def retrieve_benefit_plan_year: ( + String benefit_plan_year_id, + employer_id: String, + ?request_options: VitableConnect::request_opts + ) -> VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse + + def retrieve_hris: ( + String employer_id, + ?request_options: VitableConnect::request_opts + ) -> VitableConnect::Models::EmployerRetrieveHRISResponse + + def retrieve_invoice_pdf: ( + String invoice_id, + employer_id: String, + ?request_options: VitableConnect::request_opts + ) -> VitableConnect::Models::EmployerRetrieveInvoicePdfResponse + + def retrieve_payroll_access_setup: ( + String employer_id, + ?request_options: VitableConnect::request_opts + ) -> VitableConnect::Models::EmployerRetrievePayrollAccessSetupResponse + + def submit_census_sync: ( + String employer_id, + employees: ::Array[VitableConnect::EmployerSubmitCensusSyncParams::Employee], + ?request_options: VitableConnect::request_opts + ) -> VitableConnect::Models::EmployerSubmitCensusSyncResponse + + def submit_payroll_access_setup: ( + String employer_id, + access_method: VitableConnect::Models::EmployerSubmitPayrollAccessSetupParams::access_method, + all_benefit_eligible_employees_present: bool, + classifications_accurate: bool, + employees_in_payroll_acknowledged: bool, + has_additional_payroll_system: bool, + is_controlled_group: bool, + payroll_data_impacts_eligibility_acknowledged: bool, + ?additional_access_method: VitableConnect::Models::EmployerSubmitPayrollAccessSetupParams::additional_access_method?, + ?additional_integration_confirmed: bool?, + ?additional_login_url: String?, + ?additional_password: String?, + ?additional_phone: String?, + ?additional_username: String?, + ?classification_correction_source: VitableConnect::Models::EmployerSubmitPayrollAccessSetupParams::classification_correction_source?, + ?integration_confirmed: bool?, + ?login_url: String?, + ?misclassified_employee_names: ::Array[String], + ?missing_employee_resolution: VitableConnect::Models::EmployerSubmitPayrollAccessSetupParams::missing_employee_resolution?, + ?password: String?, + ?phone: String?, + ?remaining_employee_action: VitableConnect::Models::EmployerSubmitPayrollAccessSetupParams::remaining_employee_action?, + ?same_payroll_covers_other_eins: bool?, + ?username: String?, + ?request_options: VitableConnect::request_opts + ) -> VitableConnect::Models::EmployerSubmitPayrollAccessSetupResponse + + def update_settings: ( + String employer_id, + pay_frequency: VitableConnect::Models::EmployerUpdateSettingsParams::pay_frequency, + ?request_options: VitableConnect::request_opts + ) -> VitableConnect::Models::EmployerUpdateSettingsResponse + + def initialize: (client: VitableConnect::Client) -> void + end + end +end diff --git a/sig/vitable_connect/resources/enrollments.rbs b/sig/vitable_connect/resources/enrollments.rbs new file mode 100644 index 0000000..51c313d --- /dev/null +++ b/sig/vitable_connect/resources/enrollments.rbs @@ -0,0 +1,28 @@ +module VitableConnect + module Resources + class Enrollments + def retrieve: ( + String enrollment_id, + ?request_options: VitableConnect::request_opts + ) -> VitableConnect::Models::EnrollmentRetrieveResponse + + def reissue: ( + String enrollment_id, + ?qualifying_life_event_id: String?, + ?reason: String?, + ?ticket_number: String?, + ?request_options: VitableConnect::request_opts + ) -> VitableConnect::Models::EnrollmentReissueResponse + + def terminate: ( + String enrollment_id, + ?qualifying_life_event_id: String?, + ?reason: String?, + ?ticket_number: String?, + ?request_options: VitableConnect::request_opts + ) -> nil + + def initialize: (client: VitableConnect::Client) -> void + end + end +end diff --git a/sig/vitable_connect/resources/groups.rbs b/sig/vitable_connect/resources/groups.rbs new file mode 100644 index 0000000..6878c39 --- /dev/null +++ b/sig/vitable_connect/resources/groups.rbs @@ -0,0 +1,33 @@ +module VitableConnect + module Resources + class Groups + attr_reader members: VitableConnect::Resources::Groups::Members + + def create: ( + external_reference_id: String, + name: String, + ?request_options: VitableConnect::request_opts + ) -> VitableConnect::GroupResponse + + def retrieve: ( + String group_id, + ?request_options: VitableConnect::request_opts + ) -> VitableConnect::GroupResponse + + def update: ( + String group_id, + ?external_reference_id: String?, + ?name: String?, + ?request_options: VitableConnect::request_opts + ) -> VitableConnect::GroupResponse + + def list: ( + ?limit: Integer, + ?page: Integer, + ?request_options: VitableConnect::request_opts + ) -> VitableConnect::Internal::PageNumberPage[VitableConnect::Group] + + def initialize: (client: VitableConnect::Client) -> void + end + end +end diff --git a/sig/vitable_connect/resources/groups/members.rbs b/sig/vitable_connect/resources/groups/members.rbs new file mode 100644 index 0000000..6efa7d8 --- /dev/null +++ b/sig/vitable_connect/resources/groups/members.rbs @@ -0,0 +1,11 @@ +module VitableConnect + module Resources + class Groups + class Members + attr_reader sync: VitableConnect::Resources::Groups::Members::Sync + + def initialize: (client: VitableConnect::Client) -> void + end + end + end +end diff --git a/sig/vitable_connect/resources/groups/members/sync.rbs b/sig/vitable_connect/resources/groups/members/sync.rbs new file mode 100644 index 0000000..f3df413 --- /dev/null +++ b/sig/vitable_connect/resources/groups/members/sync.rbs @@ -0,0 +1,23 @@ +module VitableConnect + module Resources + class Groups + class Members + class Sync + def retrieve: ( + String request_id, + group_id: String, + ?request_options: VitableConnect::request_opts + ) -> VitableConnect::Models::Groups::Members::SyncRetrieveResponse + + def submit: ( + String group_id, + members: ::Array[VitableConnect::Groups::Members::SyncSubmitParams::Member], + ?request_options: VitableConnect::request_opts + ) -> VitableConnect::Models::Groups::Members::SyncSubmitResponse + + def initialize: (client: VitableConnect::Client) -> void + end + end + end + end +end diff --git a/sig/vitable_connect/resources/members.rbs b/sig/vitable_connect/resources/members.rbs new file mode 100644 index 0000000..00e7a3f --- /dev/null +++ b/sig/vitable_connect/resources/members.rbs @@ -0,0 +1,52 @@ +module VitableConnect + module Resources + class Members + def retrieve: ( + String member_id, + ?request_options: VitableConnect::request_opts + ) -> VitableConnect::Models::MemberRetrieveResponse + + def list: ( + ?limit: Integer, + ?page: Integer, + ?search: String, + ?request_options: VitableConnect::request_opts + ) -> VitableConnect::Internal::PageNumberPage[VitableConnect::Models::MemberListResponse] + + def list_dependents: ( + String member_id, + ?request_options: VitableConnect::request_opts + ) -> VitableConnect::Models::MemberListDependentsResponse + + def list_employments: ( + String member_id, + ?request_options: VitableConnect::request_opts + ) -> VitableConnect::Models::MemberListEmploymentsResponse + + def list_enrollments: ( + String member_id, + ?request_options: VitableConnect::request_opts + ) -> VitableConnect::Models::MemberListEnrollmentsResponse + + def list_id_cards: ( + String member_id, + ?request_options: VitableConnect::request_opts + ) -> VitableConnect::Models::MemberListIDCardsResponse + + def list_qualifying_life_events: ( + String member_id, + ?limit: Integer, + ?page: Integer, + ?status: VitableConnect::Models::MemberListQualifyingLifeEventsParams::status, + ?request_options: VitableConnect::request_opts + ) -> VitableConnect::Internal::PageNumberPage[VitableConnect::Models::MemberListQualifyingLifeEventsResponse] + + def retrieve_household: ( + String member_id, + ?request_options: VitableConnect::request_opts + ) -> VitableConnect::Models::MemberRetrieveHouseholdResponse + + def initialize: (client: VitableConnect::Client) -> void + end + end +end diff --git a/sig/vitable_connect/resources/organizations.rbs b/sig/vitable_connect/resources/organizations.rbs new file mode 100644 index 0000000..edfa6a7 --- /dev/null +++ b/sig/vitable_connect/resources/organizations.rbs @@ -0,0 +1,17 @@ +module VitableConnect + module Resources + class Organizations + def create: ( + name: String, + ?type: VitableConnect::Models::OrganizationCreateParams::type_?, + ?request_options: VitableConnect::request_opts + ) -> VitableConnect::Models::OrganizationCreateResponse + + def list: ( + ?request_options: VitableConnect::request_opts + ) -> VitableConnect::Models::OrganizationListResponse + + def initialize: (client: VitableConnect::Client) -> void + end + end +end diff --git a/sig/vitable_connect/resources/plans.rbs b/sig/vitable_connect/resources/plans.rbs new file mode 100644 index 0000000..7b7f27b --- /dev/null +++ b/sig/vitable_connect/resources/plans.rbs @@ -0,0 +1,13 @@ +module VitableConnect + module Resources + class Plans + def list: ( + ?limit: Integer, + ?page: Integer, + ?request_options: VitableConnect::request_opts + ) -> VitableConnect::Internal::PageNumberPage[VitableConnect::Models::PlanListResponse] + + def initialize: (client: VitableConnect::Client) -> void + end + end +end diff --git a/sig/vitable_connect/resources/webhook_events.rbs b/sig/vitable_connect/resources/webhook_events.rbs new file mode 100644 index 0000000..7c563f9 --- /dev/null +++ b/sig/vitable_connect/resources/webhook_events.rbs @@ -0,0 +1,28 @@ +module VitableConnect + module Resources + class WebhookEvents + def retrieve: ( + String event_id, + ?request_options: VitableConnect::request_opts + ) -> VitableConnect::Models::WebhookEventRetrieveResponse + + def list: ( + ?created_after: Time, + ?created_before: Time, + ?event_name: VitableConnect::Models::WebhookEventListParams::event_name, + ?limit: Integer, + ?page: Integer, + ?resource_id: String, + ?resource_type: VitableConnect::Models::WebhookEventListParams::resource_type, + ?request_options: VitableConnect::request_opts + ) -> VitableConnect::Internal::PageNumberPage[VitableConnect::WebhookEvent] + + def list_deliveries: ( + String event_id, + ?request_options: VitableConnect::request_opts + ) -> VitableConnect::Models::WebhookEventListDeliveriesResponse + + def initialize: (client: VitableConnect::Client) -> void + end + end +end diff --git a/sig/vitable_connect/version.rbs b/sig/vitable_connect/version.rbs new file mode 100644 index 0000000..e84449f --- /dev/null +++ b/sig/vitable_connect/version.rbs @@ -0,0 +1,3 @@ +module VitableConnect + VERSION: String +end diff --git a/sorbet/config b/sorbet/config new file mode 100644 index 0000000..6fe84ed --- /dev/null +++ b/sorbet/config @@ -0,0 +1,2 @@ +--dir=rbi/ +--ignore=test/ diff --git a/sorbet/rbi/.gitignore b/sorbet/rbi/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/sorbet/rbi/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/test/custom.test.rb b/test/custom.test.rb deleted file mode 100644 index 4bd5798..0000000 --- a/test/custom.test.rb +++ /dev/null @@ -1,15 +0,0 @@ -# frozen_string_literal: true - -# This is a custom test file, if you wish to add more tests -# to your SDK. -# Be sure to mark this file in `.fernignore`. -# -# If you include example requests/responses in your fern definition, -# you will have tests automatically generated for you. - -# This test is run via command line: rake customtest -describe "Custom Test" do - it "Default" do - refute false - end -end diff --git a/test/test_helper.rb b/test/test_helper.rb deleted file mode 100644 index 6c16f4d..0000000 --- a/test/test_helper.rb +++ /dev/null @@ -1,3 +0,0 @@ -# frozen_string_literal: true - -require_relative "../lib/VitableConnect" diff --git a/test/unit/internal/http/test_raw_client.rb b/test/unit/internal/http/test_raw_client.rb deleted file mode 100644 index 1032f5b..0000000 --- a/test/unit/internal/http/test_raw_client.rb +++ /dev/null @@ -1,195 +0,0 @@ -# frozen_string_literal: true - -require "test_helper" -require "socket" -require "zlib" - -describe VitableConnect::Internal::Http::RawClient do - def make_response(status_code) - response = Minitest::Mock.new - response.expect(:code, status_code.to_s) - response - end - - describe "#should_retry?" do - let(:client) do - VitableConnect::Internal::Http::RawClient.new(base_url: "https://example.com", max_retries: 3) - end - - it "retries on 408 Request Timeout" do - assert client.should_retry?(make_response(408), 0) - end - - it "retries on 429 Too Many Requests" do - assert client.should_retry?(make_response(429), 0) - end - - it "retries on retryable 5xx statuses" do - [500, 502, 503, 504, 521, 522, 524].each do |status| - assert client.should_retry?(make_response(status), 0), "expected retry for status #{status}" - end - end - - it "does not retry on non-retryable 5xx statuses" do - [501, 505, 510, 599].each do |status| - refute client.should_retry?(make_response(status), 0), "expected no retry for status #{status}" - end - end - - it "does not retry on 2xx success codes" do - [200, 201, 204].each do |status| - refute client.should_retry?(make_response(status), 0), "expected no retry for status #{status}" - end - end - - it "does not retry on 4xx other than 408 and 429" do - [400, 401, 403, 404, 422].each do |status| - refute client.should_retry?(make_response(status), 0), "expected no retry for status #{status}" - end - end - - it "does not retry when max retries is reached" do - refute client.should_retry?(make_response(502), 3) - end - - it "retries when attempt is below max retries" do - assert client.should_retry?(make_response(502), 2) - end - end - - describe "gzip response decompression" do - it "decompresses a gzip response when Accept-Encoding is set explicitly" do - body = '{"message": "gzipped response"}' - compressed = Zlib.gzip(body) - - server = TCPServer.new("127.0.0.1", 0) - port = server.addr[1] - server_thread = Thread.new do - socket = server.accept - request_lines = [] - while (line = socket.gets) && line != "\r\n" - request_lines << line - end - socket.write("HTTP/1.1 200 OK\r\n") - socket.write("Content-Type: application/json\r\n") - socket.write("Content-Encoding: gzip\r\n") - socket.write("Content-Length: #{compressed.bytesize}\r\n") - socket.write("\r\n") - socket.write(compressed) - socket.close - request_lines - end - - client = VitableConnect::Internal::Http::RawClient.new( - base_url: "http://127.0.0.1:#{port}", - max_retries: 0 - ) - request = VitableConnect::Internal::JSON::Request.new( - base_url: "http://127.0.0.1:#{port}", - path: "/gzip", - method: "GET", - headers: { "Accept-Encoding" => "gzip" } - ) - - response = client.send(request) - request_lines = server_thread.value - server.close - - assert(request_lines.any? { |line| line.casecmp("accept-encoding: gzip\r\n").zero? }) - assert_equal "200", response.code - assert_equal body, response.body - end - end - - # A minimal auth provider whose `auth_headers` returns a *different* token on - # each call, simulating a token that is refreshed on expiry. - class RefreshingAuthProvider - def initialize - @count = 0 - end - - def auth_headers - @count += 1 - { "Authorization" => "Bearer TOKEN_#{@count}" } - end - end - - describe "#resolve_auth_headers" do - it "returns an empty hash when no auth provider is configured" do - client = VitableConnect::Internal::Http::RawClient.new(base_url: "https://example.com") - - assert_equal({}, client.resolve_auth_headers) - end - - it "consults the auth provider on every call so an expired token is refreshed" do - client = VitableConnect::Internal::Http::RawClient.new( - base_url: "https://example.com", - auth_provider: RefreshingAuthProvider.new - ) - - assert_equal({ "Authorization" => "Bearer TOKEN_1" }, client.resolve_auth_headers) - assert_equal({ "Authorization" => "Bearer TOKEN_2" }, client.resolve_auth_headers) - end - end - - describe "#build_http_request auth header precedence" do - let(:client) do - VitableConnect::Internal::Http::RawClient.new( - base_url: "https://example.com", - headers: { "Authorization" => "Bearer STATIC" } - ) - end - - it "lets resolved auth headers override the static default headers" do - request = client.build_http_request( - url: URI.parse("https://example.com"), - method: "GET", - auth_headers: { "Authorization" => "Bearer FRESH" } - ) - - assert_equal("Bearer FRESH", request["Authorization"]) - end - - it "lets per-request headers take precedence over auth headers" do - request = client.build_http_request( - url: URI.parse("https://example.com"), - method: "GET", - headers: { "Authorization" => "Bearer PER_REQUEST" }, - auth_headers: { "Authorization" => "Bearer FRESH" } - ) - - assert_equal("Bearer PER_REQUEST", request["Authorization"]) - end - - it "defaults auth headers to empty, leaving the default headers unchanged" do - request = client.build_http_request(url: URI.parse("https://example.com"), method: "GET") - - assert_equal("Bearer STATIC", request["Authorization"]) - end - end - - describe "#protected_header_keys" do - def client_with(overridable_headers) - VitableConnect::Internal::Http::RawClient.new( - base_url: "https://example.com", - headers: { "X-Api-Version" => "1", "User-Agent" => "sdk/0.0.1" }, - overridable_headers: overridable_headers - ) - end - - it "protects every default header when no header is overridable" do - assert_includes client_with([]).protected_header_keys, "X-Api-Version" - end - - it "leaves an overridable header unprotected so a request can replace it" do - protected_keys = client_with(["X-Api-Version"]).protected_header_keys - - refute_includes protected_keys, "X-Api-Version" - assert_includes protected_keys, "User-Agent" - end - - it "matches overridable header names case-insensitively" do - refute_includes client_with(["x-api-version"]).protected_header_keys, "X-Api-Version" - end - end -end diff --git a/test/unit/internal/iterators/test_cursor_item_iterator.rb b/test/unit/internal/iterators/test_cursor_item_iterator.rb deleted file mode 100644 index c62a9c9..0000000 --- a/test/unit/internal/iterators/test_cursor_item_iterator.rb +++ /dev/null @@ -1,192 +0,0 @@ -# frozen_string_literal: true - -require "minitest/autorun" -require "stringio" -require "json" -require "test_helper" - -NUMBERS = (1..65).to_a -PageResponse = Struct.new(:cards, :next_cursor, keyword_init: true) - -class CursorItemIteratorTest < Minitest::Test - def make_iterator(initial_cursor:) - @times_called = 0 - - VitableConnect::Internal::CursorItemIterator.new(initial_cursor:, cursor_field: :next_cursor, item_field: :cards) do |cursor| - @times_called += 1 - cursor ||= 0 - next_cursor = cursor + 10 - PageResponse.new( - cards: NUMBERS[cursor...next_cursor], - next_cursor: next_cursor < NUMBERS.length ? next_cursor : nil - ) - end - end - - def test_item_iterator_can_iterate_to_exhaustion - iterator = make_iterator(initial_cursor: 0) - - assert_equal NUMBERS, iterator.to_a - assert_equal 7, @times_called - - iterator = make_iterator(initial_cursor: 10) - - assert_equal (11..65).to_a, iterator.to_a - - iterator = make_iterator(initial_cursor: 5) - - assert_equal (6..65).to_a, iterator.to_a - end - - def test_item_iterator_can_work_without_an_initial_cursor - iterator = make_iterator(initial_cursor: nil) - - assert_equal NUMBERS, iterator.to_a - assert_equal 7, @times_called - end - - def test_items_iterator_iterates_lazily - iterator = make_iterator(initial_cursor: 0) - - assert_equal 0, @times_called - assert_equal 1, iterator.first - assert_equal 1, @times_called - - iterator = make_iterator(initial_cursor: 0) - - assert_equal 0, @times_called - assert_equal (1..15).to_a, iterator.first(15) - assert_equal 2, @times_called - - iterator = make_iterator(initial_cursor: 0) - - assert_equal 0, @times_called - iterator.each do |card| - break if card >= 15 - end - - assert_equal 2, @times_called - end - - def test_items_iterator_implements_enumerable - iterator = make_iterator(initial_cursor: 0) - - assert_equal 0, @times_called - doubled = iterator.map { |card| card * 2 } - - assert_equal 7, @times_called - assert_equal NUMBERS.length, doubled.length - end - - def test_items_iterator_can_be_advanced_manually - iterator = make_iterator(initial_cursor: 0) - - assert_equal 0, @times_called - - items = [] - expected_times_called = 0 - while (item = iterator.next_element) - expected_times_called += 1 if (item % 10) == 1 - - assert_equal expected_times_called, @times_called - assert_equal item != NUMBERS.last, iterator.next?, "#{item} #{iterator}" - - items.push(item) - end - - assert_equal 7, @times_called - assert_equal NUMBERS, items - end - - def test_pages_iterator - iterator = make_iterator(initial_cursor: 0).pages - - assert_equal( - [ - (1..10).to_a, - (11..20).to_a, - (21..30).to_a, - (31..40).to_a, - (41..50).to_a, - (51..60).to_a, - (61..65).to_a - ], - iterator.to_a.map(&:cards) - ) - - iterator = make_iterator(initial_cursor: 10).pages - - assert_equal( - [ - (11..20).to_a, - (21..30).to_a, - (31..40).to_a, - (41..50).to_a, - (51..60).to_a, - (61..65).to_a - ], - iterator.to_a.map(&:cards) - ) - end - - def test_pages_iterator_can_work_without_an_initial_cursor - iterator = make_iterator(initial_cursor: nil).pages - - assert_equal 7, iterator.to_a.length - assert_equal 7, @times_called - end - - def test_pages_iterator_iterates_lazily - iterator = make_iterator(initial_cursor: 0).pages - - assert_equal 0, @times_called - - iterator.first - - assert_equal 1, @times_called - - iterator = make_iterator(initial_cursor: 0).pages - - assert_equal 0, @times_called - assert_equal 2, iterator.first(2).length - assert_equal 2, @times_called - end - - def test_pages_iterator_knows_whether_another_page_is_upcoming - iterator = make_iterator(initial_cursor: 0).pages - - iterator.each_with_index do |_page, index| - assert_equal index + 1, @times_called - assert_equal index < 6, iterator.next? - end - end - - def test_pages_iterator_can_be_advanced_manually - iterator = make_iterator(initial_cursor: 0).pages - - assert_equal 0, @times_called - - lengths = [] - expected_times_called = 0 - while (page = iterator.next_page) - expected_times_called += 1 - - assert_equal expected_times_called, @times_called - - lengths.push(page.cards.length) - end - - assert_equal 7, @times_called - assert_equal [10, 10, 10, 10, 10, 10, 5], lengths - end - - def test_pages_iterator_implements_enumerable - iterator = make_iterator(initial_cursor: 0).pages - - assert_equal 0, @times_called - lengths = iterator.map { |page| page.cards.length } - - assert_equal 7, @times_called - assert_equal [10, 10, 10, 10, 10, 10, 5], lengths - end -end diff --git a/test/unit/internal/iterators/test_offset_item_iterator.rb b/test/unit/internal/iterators/test_offset_item_iterator.rb deleted file mode 100644 index 639fc0a..0000000 --- a/test/unit/internal/iterators/test_offset_item_iterator.rb +++ /dev/null @@ -1,150 +0,0 @@ -# frozen_string_literal: true - -require "minitest/autorun" -require "stringio" -require "json" -require "test_helper" - -OffsetPageResponse = Struct.new(:items, :has_next, keyword_init: true) -TestIteratorConfig = Struct.new( - :step, - :has_next_field, - :total_item_count, - :per_page, - :initial_page -) do - def first_item_returned - if step - (initial_page || 0) + 1 - else - (((initial_page || 1) - 1) * per_page) + 1 - end - end -end - -LAZY_TEST_ITERATOR_CONFIG = TestIteratorConfig.new(initial_page: 1, step: false, has_next_field: :has_next, total_item_count: 65, per_page: 10) -ALL_TEST_ITERATOR_CONFIGS = [true, false].map do |step| - [:has_next, nil].map do |has_next_field| - [0, 5, 10, 60, 63].map do |total_item_count| - [5, 10].map do |per_page| - initial_pages = [nil, 3, 100] - initial_pages << (step ? 0 : 1) - - initial_pages.map do |initial_page| - TestIteratorConfig.new( - step: step, - has_next_field: has_next_field, - total_item_count: total_item_count, - per_page: per_page, - initial_page: initial_page - ) - end - end - end - end -end.flatten - -class OffsetItemIteratorTest < Minitest::Test - def make_iterator(config) - @times_called = 0 - - items = (1..config.total_item_count).to_a - - VitableConnect::Internal::OffsetItemIterator.new( - initial_page: config.initial_page, - item_field: :items, - has_next_field: config.has_next_field, - step: config.step - ) do |page| - @times_called += 1 - - slice_start = config.step ? page : (page - 1) * config.per_page - slice_end = slice_start + config.per_page - - output = { - items: items[slice_start...slice_end] - } - output[config.has_next_field] = slice_end < items.length if config.has_next_field - - OffsetPageResponse.new(**output) - end - end - - ALL_TEST_ITERATOR_CONFIGS.each do |config| - define_method("test_item_iterator_can_iterate_to_exhaustion_#{config.to_a.join("_")}") do - iterator = make_iterator(config) - - assert_equal (config.first_item_returned..config.total_item_count).to_a, iterator.to_a - end - - define_method("test_items_iterator_can_be_advanced_manually_and_has_accurate_has_next_#{config.to_a.join("_")}") do - iterator = make_iterator(config) - items = [] - - while (item = iterator.next_element) - assert_equal(item != config.total_item_count, iterator.next?, "#{item} #{iterator}") - - items.push(item) - end - - assert_equal (config.first_item_returned..config.total_item_count).to_a, items - end - - define_method("test_pages_iterator_can_be_advanced_manually_and_has_accurate_has_next_#{config.to_a.join("_")}") do - iterator = make_iterator(config).pages - pages = [] - - loop do - has_next_output = iterator.next? - page = iterator.next_page - - assert_equal(has_next_output, !page.nil?, "next? was inaccurate: #{config} #{iterator.inspect}") - - break if page.nil? - - pages.push(page) - end - - assert_equal pages, make_iterator(config).pages.to_a - end - end - - def test_items_iterator_iterates_lazily - iterator = make_iterator(LAZY_TEST_ITERATOR_CONFIG) - - assert_equal 0, @times_called - assert_equal 1, iterator.first - assert_equal 1, @times_called - - iterator = make_iterator(LAZY_TEST_ITERATOR_CONFIG) - - assert_equal 0, @times_called - assert_equal (1..15).to_a, iterator.first(15) - assert_equal 2, @times_called - - iterator = make_iterator(LAZY_TEST_ITERATOR_CONFIG) - - assert_equal 0, @times_called - iterator.each do |card| - break if card >= 15 - end - - assert_equal 2, @times_called - end - - def test_pages_iterator_iterates_lazily - iterator = make_iterator(LAZY_TEST_ITERATOR_CONFIG).pages - - assert_equal 0, @times_called - - iterator.first - - assert_equal 1, @times_called - - iterator = make_iterator(LAZY_TEST_ITERATOR_CONFIG).pages - - assert_equal 0, @times_called - assert_equal 3, iterator.first(3).length - assert_equal 3, @times_called - end -end diff --git a/test/unit/internal/types/test_array.rb b/test/unit/internal/types/test_array.rb deleted file mode 100644 index f996cd7..0000000 --- a/test/unit/internal/types/test_array.rb +++ /dev/null @@ -1,37 +0,0 @@ -# frozen_string_literal: true - -require "test_helper" - -describe VitableConnect::Internal::Types::Array do - module TestArray - StringArray = VitableConnect::Internal::Types::Array[String] - end - - describe "#initialize" do - it "sets the type" do - assert_equal String, TestArray::StringArray.type - end - end - - describe "#coerce" do - it "does not perform coercion if not an array" do - assert_equal 1, TestArray::StringArray.coerce(1) - end - - it "raises an error if not an array and strictness is on" do - assert_raises VitableConnect::Internal::Errors::TypeError do - TestArray::StringArray.coerce(1, strict: true) - end - end - - it "coerces the elements" do - assert_equal %w[foobar 1 true], TestArray::StringArray.coerce(["foobar", 1, true]) - end - - it "raises an error if element of array is not coercable and strictness is on" do - assert_raises VitableConnect::Internal::Errors::TypeError do - TestArray::StringArray.coerce([Object.new], strict: true) - end - end - end -end diff --git a/test/unit/internal/types/test_boolean.rb b/test/unit/internal/types/test_boolean.rb deleted file mode 100644 index 69a7891..0000000 --- a/test/unit/internal/types/test_boolean.rb +++ /dev/null @@ -1,35 +0,0 @@ -# frozen_string_literal: true - -require "test_helper" - -describe VitableConnect::Internal::Types::Boolean do - describe ".coerce" do - it "coerces true/false" do - assert VitableConnect::Internal::Types::Boolean.coerce(true) - refute VitableConnect::Internal::Types::Boolean.coerce(false) - end - - it "coerces an Integer" do - assert VitableConnect::Internal::Types::Boolean.coerce(1) - refute VitableConnect::Internal::Types::Boolean.coerce(0) - end - - it "coerces a String" do - assert VitableConnect::Internal::Types::Boolean.coerce("1") - assert VitableConnect::Internal::Types::Boolean.coerce("true") - refute VitableConnect::Internal::Types::Boolean.coerce("0") - end - - it "passes through other values with strictness off" do - obj = Object.new - - assert_equal obj, VitableConnect::Internal::Types::Boolean.coerce(obj) - end - - it "raises an error with other values with strictness on" do - assert_raises VitableConnect::Internal::Errors::TypeError do - VitableConnect::Internal::Types::Boolean.coerce(Object.new, strict: true) - end - end - end -end diff --git a/test/unit/internal/types/test_enum.rb b/test/unit/internal/types/test_enum.rb deleted file mode 100644 index a419217..0000000 --- a/test/unit/internal/types/test_enum.rb +++ /dev/null @@ -1,42 +0,0 @@ -# frozen_string_literal: true - -require "test_helper" - -describe VitableConnect::Internal::Types::Enum do - module EnumTest - module ExampleEnum - extend VitableConnect::Internal::Types::Enum - - FOO = :foo - BAR = :bar - - finalize! - end - end - - describe "#values" do - it "defines values" do - assert_equal %i[foo bar].sort, EnumTest::ExampleEnum.values.sort - end - end - - describe "#coerce" do - it "coerces an existing member" do - assert_equal :foo, EnumTest::ExampleEnum.coerce(:foo) - end - - it "coerces a string version of a member" do - assert_equal :foo, EnumTest::ExampleEnum.coerce("foo") - end - - it "returns the value if not a member with strictness off" do - assert_equal 1, EnumTest::ExampleEnum.coerce(1) - end - - it "raises an error if value is not a member with strictness on" do - assert_raises VitableConnect::Internal::Errors::TypeError do - EnumTest::ExampleEnum.coerce(1, strict: true) - end - end - end -end diff --git a/test/unit/internal/types/test_hash.rb b/test/unit/internal/types/test_hash.rb deleted file mode 100644 index ace58c7..0000000 --- a/test/unit/internal/types/test_hash.rb +++ /dev/null @@ -1,50 +0,0 @@ -# frozen_string_literal: true - -require "test_helper" - -describe VitableConnect::Internal::Types::Hash do - module TestHash - SymbolStringHash = VitableConnect::Internal::Types::Hash[Symbol, String] - end - - describe ".[]" do - it "defines the key and value type" do - assert_equal Symbol, TestHash::SymbolStringHash.key_type - assert_equal String, TestHash::SymbolStringHash.value_type - end - end - - describe "#coerce" do - it "coerces the keys" do - assert_equal %i[foo bar], TestHash::SymbolStringHash.coerce({ "foo" => "1", :bar => "2" }).keys - end - - it "coerces the values" do - assert_equal %w[foo 1], TestHash::SymbolStringHash.coerce({ foo: :foo, bar: 1 }).values - end - - it "passes through other values with strictness off" do - obj = Object.new - - assert_equal obj, TestHash::SymbolStringHash.coerce(obj) - end - - it "raises an error with other values with strictness on" do - assert_raises VitableConnect::Internal::Errors::TypeError do - TestHash::SymbolStringHash.coerce(Object.new, strict: true) - end - end - - it "raises an error with non-coercable key types with strictness on" do - assert_raises VitableConnect::Internal::Errors::TypeError do - TestHash::SymbolStringHash.coerce({ Object.new => 1 }, strict: true) - end - end - - it "raises an error with non-coercable value types with strictness on" do - assert_raises VitableConnect::Internal::Errors::TypeError do - TestHash::SymbolStringHash.coerce({ "foobar" => Object.new }, strict: true) - end - end - end -end diff --git a/test/unit/internal/types/test_model.rb b/test/unit/internal/types/test_model.rb deleted file mode 100644 index eff47de..0000000 --- a/test/unit/internal/types/test_model.rb +++ /dev/null @@ -1,154 +0,0 @@ -# frozen_string_literal: true - -require "test_helper" - -describe VitableConnect::Internal::Types::Model do - module StringInteger - extend VitableConnect::Internal::Types::Union - - member String - member Integer - end - - class ExampleModel < VitableConnect::Internal::Types::Model - field :name, String - field :rating, StringInteger, optional: true - field :year, Integer, optional: true, nullable: true, api_name: "yearOfRelease" - end - - class ExampleModelInheritance < ExampleModel - field :director, String - end - - class ExampleWithDefaults < ExampleModel - field :type, String, default: "example" - end - - class ExampleChild < VitableConnect::Internal::Types::Model - field :value, String - end - - class ExampleParent < VitableConnect::Internal::Types::Model - field :child, ExampleChild - end - - describe ".field" do - before do - @example = ExampleModel.new(name: "Inception", rating: 4) - end - - it "defines fields on model" do - assert_equal %i[name rating year], ExampleModel.fields.keys - end - - it "defines fields from parent models" do - assert_equal %i[name rating year director], ExampleModelInheritance.fields.keys - end - - it "sets the field's type" do - assert_equal String, ExampleModel.fields[:name].type - assert_equal StringInteger, ExampleModel.fields[:rating].type - end - - it "sets the `default` option" do - assert_equal "example", ExampleWithDefaults.fields[:type].default - end - - it "defines getters" do - assert_respond_to @example, :name - assert_respond_to @example, :rating - - assert_equal "Inception", @example.name - assert_equal 4, @example.rating - end - - it "defines setters" do - assert_respond_to @example, :name= - assert_respond_to @example, :rating= - - @example.name = "Inception 2" - @example.rating = 5 - - assert_equal "Inception 2", @example.name - assert_equal 5, @example.rating - end - end - - describe "#initialize" do - it "sets the data" do - example = ExampleModel.new(name: "Inception", rating: 4) - - assert_equal "Inception", example.name - assert_equal 4, example.rating - end - - it "allows extra fields to be set" do - example = ExampleModel.new(name: "Inception", rating: 4, director: "Christopher Nolan") - - assert_equal "Christopher Nolan", example.director - end - - it "sets the defaults where applicable" do - example_using_defaults = ExampleWithDefaults.new - - assert_equal "example", example_using_defaults.type - - example_without_defaults = ExampleWithDefaults.new(type: "not example") - - assert_equal "not example", example_without_defaults.type - end - - it "coerces child models" do - parent = ExampleParent.new(child: { value: "foobar" }) - - assert_kind_of ExampleChild, parent.child - end - - it "uses the api_name to pull the value" do - example = ExampleModel.new({ name: "Inception", yearOfRelease: 2014 }) - - assert_equal 2014, example.year - refute_respond_to example, :yearOfRelease - end - end - - describe "#inspect" do - class SensitiveModel < VitableConnect::Internal::Types::Model - field :username, String - field :password, String - field :client_secret, String - field :access_token, String - field :api_key, String - end - - it "redacts sensitive fields" do - model = SensitiveModel.new( - username: "user123", - password: "secret123", - client_secret: "cs_abc", - access_token: "token_xyz", - api_key: "key_123" - ) - - inspect_output = model.inspect - - assert_includes inspect_output, "username=\"user123\"" - assert_includes inspect_output, "password=[REDACTED]" - assert_includes inspect_output, "client_secret=[REDACTED]" - assert_includes inspect_output, "access_token=[REDACTED]" - assert_includes inspect_output, "api_key=[REDACTED]" - refute_includes inspect_output, "secret123" - refute_includes inspect_output, "cs_abc" - refute_includes inspect_output, "token_xyz" - refute_includes inspect_output, "key_123" - end - - it "does not redact non-sensitive fields" do - example = ExampleModel.new(name: "Inception", rating: 4) - inspect_output = example.inspect - - assert_includes inspect_output, "name=\"Inception\"" - assert_includes inspect_output, "rating=4" - end - end -end diff --git a/test/unit/internal/types/test_union.rb b/test/unit/internal/types/test_union.rb deleted file mode 100644 index 96e4d54..0000000 --- a/test/unit/internal/types/test_union.rb +++ /dev/null @@ -1,62 +0,0 @@ -# frozen_string_literal: true - -require "test_helper" - -describe VitableConnect::Internal::Types::Union do - class Rectangle < VitableConnect::Internal::Types::Model - literal :type, "square" - - field :area, Float - end - - class Circle < VitableConnect::Internal::Types::Model - literal :type, "circle" - - field :area, Float - end - - class Pineapple < VitableConnect::Internal::Types::Model - literal :type, "pineapple" - - field :area, Float - end - - module Shape - extend VitableConnect::Internal::Types::Union - - discriminant :type - - member -> { Rectangle }, key: "rect" - member -> { Circle }, key: "circle" - end - - module StringOrInteger - extend VitableConnect::Internal::Types::Union - - member String - member Integer - end - - describe "#coerce" do - it "coerces hashes into member models with discriminated unions" do - circle = Shape.coerce({ type: "circle", area: 4.0 }) - - assert_instance_of Circle, circle - end - end - - describe "#type_member?" do - it "defines Model members" do - assert Shape.type_member?(Rectangle) - assert Shape.type_member?(Circle) - refute Shape.type_member?(Pineapple) - end - - it "defines other members" do - assert StringOrInteger.type_member?(String) - assert StringOrInteger.type_member?(Integer) - refute StringOrInteger.type_member?(Float) - refute StringOrInteger.type_member?(Pineapple) - end - end -end diff --git a/test/unit/internal/types/test_utils.rb b/test/unit/internal/types/test_utils.rb deleted file mode 100644 index c6da358..0000000 --- a/test/unit/internal/types/test_utils.rb +++ /dev/null @@ -1,212 +0,0 @@ -# frozen_string_literal: true - -require "test_helper" - -describe VitableConnect::Internal::Types::Utils do - Utils = VitableConnect::Internal::Types::Utils - - module TestUtils - class M < VitableConnect::Internal::Types::Model - field :value, String - end - - class UnionMemberA < VitableConnect::Internal::Types::Model - literal :type, "A" - field :only_on_a, String - end - - class UnionMemberB < VitableConnect::Internal::Types::Model - literal :type, "B" - field :only_on_b, String - end - - module U - extend VitableConnect::Internal::Types::Union - - discriminant :type - - member -> { UnionMemberA }, key: "A" - member -> { UnionMemberB }, key: "B" - end - - SymbolStringHash = VitableConnect::Internal::Types::Hash[Symbol, String] - SymbolModelHash = -> { VitableConnect::Internal::Types::Hash[Symbol, TestUtils::M] } - end - - describe ".coerce" do - describe "NilClass" do - it "always returns nil" do - assert_nil Utils.coerce(NilClass, "foobar") - assert_nil Utils.coerce(NilClass, 1) - assert_nil Utils.coerce(NilClass, Object.new) - end - end - - describe "String" do - it "coerces from String, Symbol, Numeric, or Boolean" do - assert_equal "foobar", Utils.coerce(String, "foobar") - assert_equal "foobar", Utils.coerce(String, :foobar) - assert_equal "1", Utils.coerce(String, 1) - assert_equal "1.0", Utils.coerce(String, 1.0) - assert_equal "true", Utils.coerce(String, true) - end - - it "passes through value if it cannot be coerced and not strict" do - obj = Object.new - - assert_equal obj, Utils.coerce(String, obj) - end - - it "raises an error if value cannot be coerced and strict" do - assert_raises VitableConnect::Internal::Errors::TypeError do - Utils.coerce(String, Object.new, strict: true) - end - end - end - - describe "Symbol" do - it "coerces from Symbol, String" do - assert_equal :foobar, Utils.coerce(Symbol, :foobar) - assert_equal :foobar, Utils.coerce(Symbol, "foobar") - end - - it "passes through value if it cannot be coerced and not strict" do - obj = Object.new - - assert_equal obj, Utils.coerce(Symbol, obj) - end - - it "raises an error if value cannot be coerced and strict" do - assert_raises VitableConnect::Internal::Errors::TypeError do - Utils.coerce(Symbol, Object.new, strict: true) - end - end - end - - describe "Integer" do - it "coerces from Numeric, String, Time" do - assert_equal 1, Utils.coerce(Integer, 1) - assert_equal 1, Utils.coerce(Integer, 1.0) - assert_equal 1, Utils.coerce(Integer, Complex.rect(1)) - assert_equal 1, Utils.coerce(Integer, Rational(1)) - assert_equal 1, Utils.coerce(Integer, "1") - assert_equal 1_713_916_800, Utils.coerce(Integer, Time.utc(2024, 4, 24)) - end - - it "passes through value if it cannot be coerced and not strict" do - obj = Object.new - - assert_equal obj, Utils.coerce(Integer, obj) - end - - it "raises an error if value cannot be coerced and strict" do - assert_raises VitableConnect::Internal::Errors::TypeError do - Utils.coerce(Integer, Object.new, strict: true) - end - end - end - - describe "Float" do - it "coerces from Numeric, Time" do - assert_in_delta(1.0, Utils.coerce(Float, 1.0)) - assert_in_delta(1.0, Utils.coerce(Float, 1)) - assert_in_delta(1.0, Utils.coerce(Float, Complex.rect(1))) - assert_in_delta(1.0, Utils.coerce(Float, Rational(1))) - assert_in_delta(1_713_916_800.0, Utils.coerce(Integer, Time.utc(2024, 4, 24))) - end - - it "passes through value if it cannot be coerced and not strict" do - obj = Object.new - - assert_equal obj, Utils.coerce(Float, obj) - end - - it "raises an error if value cannot be coerced and strict" do - assert_raises VitableConnect::Internal::Errors::TypeError do - Utils.coerce(Float, Object.new, strict: true) - end - end - end - - describe "Model" do - it "coerces a hash" do - result = Utils.coerce(TestUtils::M, { value: "foobar" }) - - assert_kind_of TestUtils::M, result - assert_equal "foobar", result.value - end - - it "coerces a hash when the target is a type function" do - result = Utils.coerce(-> { TestUtils::M }, { value: "foobar" }) - - assert_kind_of TestUtils::M, result - assert_equal "foobar", result.value - end - - it "will not coerce non-hashes" do - assert_equal "foobar", Utils.coerce(TestUtils::M, "foobar") - end - end - - describe "Enum" do - module ExampleEnum - extend VitableConnect::Internal::Types::Enum - - FOO = :FOO - BAR = :BAR - - finalize! - end - - it "coerces into a Symbol version of the member value" do - assert_equal :FOO, Utils.coerce(ExampleEnum, "FOO") - end - - it "returns given value if not a member" do - assert_equal "NOPE", Utils.coerce(ExampleEnum, "NOPE") - end - end - - describe "Array" do - StringArray = VitableConnect::Internal::Types::Array[String] - ModelArray = -> { VitableConnect::Internal::Types::Array[TestUtils::M] } - UnionArray = -> { VitableConnect::Internal::Types::Array[TestUtils::U] } - - it "coerces an array of literals" do - assert_equal %w[a b c], Utils.coerce(StringArray, %w[a b c]) - assert_equal ["1", "2.0", "true"], Utils.coerce(StringArray, [1, 2.0, true]) - assert_equal ["1", "2.0", "true"], Utils.coerce(StringArray, Set.new([1, 2.0, true])) - end - - it "coerces an array of Models" do - assert_equal [TestUtils::M.new(value: "foobar"), TestUtils::M.new(value: "bizbaz")], - Utils.coerce(ModelArray, [{ value: "foobar" }, { value: "bizbaz" }]) - - assert_equal [TestUtils::M.new(value: "foobar"), TestUtils::M.new(value: "bizbaz")], - Utils.coerce(ModelArray, [TestUtils::M.new(value: "foobar"), TestUtils::M.new(value: "bizbaz")]) - end - - it "coerces an array of model unions" do - assert_equal [TestUtils::UnionMemberA.new(type: "A", only_on_a: "A"), TestUtils::UnionMemberB.new(type: "B", only_on_b: "B")], - Utils.coerce(UnionArray, [{ type: "A", only_on_a: "A" }, { type: "B", only_on_b: "B" }]) - end - - it "returns given value if not an array" do - assert_equal 1, Utils.coerce(StringArray, 1) - end - end - - describe "Hash" do - it "coerces the keys and values" do - ssh_res = Utils.coerce(TestUtils::SymbolStringHash, { "foo" => "bar", "biz" => "2" }) - - assert_equal "bar", ssh_res[:foo] - assert_equal "2", ssh_res[:biz] - - smh_res = Utils.coerce(TestUtils::SymbolModelHash, { "foo" => { "value" => "foo" } }) - - assert_equal TestUtils::M.new(value: "foo"), smh_res[:foo] - end - end - end -end diff --git a/test/vitable_connect/client_test.rb b/test/vitable_connect/client_test.rb new file mode 100644 index 0000000..fe32126 --- /dev/null +++ b/test/vitable_connect/client_test.rb @@ -0,0 +1,332 @@ +# frozen_string_literal: true + +require_relative "test_helper" + +class VitableConnectTest < Minitest::Test + extend Minitest::Serial + include WebMock::API + + def before_all + super + WebMock.enable! + end + + def setup + super + Thread.current.thread_variable_set(:mock_sleep, []) + end + + def teardown + Thread.current.thread_variable_set(:mock_sleep, nil) + WebMock.reset! + super + end + + def after_all + WebMock.disable! + super + end + + def test_raises_on_unknown_environment + e = assert_raises(ArgumentError) do + VitableConnect::Client.new(environment: "wrong") + end + assert_match(/environment must be one of/, e.message) + end + + def test_raises_on_missing_non_nullable_opts + e = assert_raises(ArgumentError) do + VitableConnect::Client.new + end + assert_match(/is required/, e.message) + end + + def test_client_default_request_default_retry_attempts + stub_request(:post, "http://localhost/v1/auth/access-tokens").to_return_json(status: 500, body: {}) + + vitable_connect = VitableConnect::Client.new(base_url: "http://localhost", api_key: "My API Key") + + assert_raises(VitableConnect::Errors::InternalServerError) do + vitable_connect.auth.issue_access_token(grant_type: :client_credentials) + end + + assert_requested(:any, /./, times: 3) + end + + def test_client_given_request_default_retry_attempts + stub_request(:post, "http://localhost/v1/auth/access-tokens").to_return_json(status: 500, body: {}) + + vitable_connect = + VitableConnect::Client.new(base_url: "http://localhost", api_key: "My API Key", max_retries: 3) + + assert_raises(VitableConnect::Errors::InternalServerError) do + vitable_connect.auth.issue_access_token(grant_type: :client_credentials) + end + + assert_requested(:any, /./, times: 4) + end + + def test_client_default_request_given_retry_attempts + stub_request(:post, "http://localhost/v1/auth/access-tokens").to_return_json(status: 500, body: {}) + + vitable_connect = VitableConnect::Client.new(base_url: "http://localhost", api_key: "My API Key") + + assert_raises(VitableConnect::Errors::InternalServerError) do + vitable_connect.auth.issue_access_token( + grant_type: :client_credentials, + request_options: {max_retries: 3} + ) + end + + assert_requested(:any, /./, times: 4) + end + + def test_client_given_request_given_retry_attempts + stub_request(:post, "http://localhost/v1/auth/access-tokens").to_return_json(status: 500, body: {}) + + vitable_connect = + VitableConnect::Client.new(base_url: "http://localhost", api_key: "My API Key", max_retries: 3) + + assert_raises(VitableConnect::Errors::InternalServerError) do + vitable_connect.auth.issue_access_token( + grant_type: :client_credentials, + request_options: {max_retries: 4} + ) + end + + assert_requested(:any, /./, times: 5) + end + + def test_client_retry_after_seconds + stub_request(:post, "http://localhost/v1/auth/access-tokens").to_return_json( + status: 500, + headers: {"retry-after" => "1.3"}, + body: {} + ) + + vitable_connect = + VitableConnect::Client.new(base_url: "http://localhost", api_key: "My API Key", max_retries: 1) + + assert_raises(VitableConnect::Errors::InternalServerError) do + vitable_connect.auth.issue_access_token(grant_type: :client_credentials) + end + + assert_requested(:any, /./, times: 2) + assert_equal(1.3, Thread.current.thread_variable_get(:mock_sleep).last) + end + + def test_client_retry_after_date + time_now = Time.now + + stub_request(:post, "http://localhost/v1/auth/access-tokens").to_return_json( + status: 500, + headers: {"retry-after" => (time_now + 10).httpdate}, + body: {} + ) + + vitable_connect = + VitableConnect::Client.new(base_url: "http://localhost", api_key: "My API Key", max_retries: 1) + + Thread.current.thread_variable_set(:time_now, time_now) + assert_raises(VitableConnect::Errors::InternalServerError) do + vitable_connect.auth.issue_access_token(grant_type: :client_credentials) + end + Thread.current.thread_variable_set(:time_now, nil) + + assert_requested(:any, /./, times: 2) + assert_in_delta(10, Thread.current.thread_variable_get(:mock_sleep).last, 1.0) + end + + def test_client_retry_after_ms + stub_request(:post, "http://localhost/v1/auth/access-tokens").to_return_json( + status: 500, + headers: {"retry-after-ms" => "1300"}, + body: {} + ) + + vitable_connect = + VitableConnect::Client.new(base_url: "http://localhost", api_key: "My API Key", max_retries: 1) + + assert_raises(VitableConnect::Errors::InternalServerError) do + vitable_connect.auth.issue_access_token(grant_type: :client_credentials) + end + + assert_requested(:any, /./, times: 2) + assert_equal(1.3, Thread.current.thread_variable_get(:mock_sleep).last) + end + + def test_retry_count_header + stub_request(:post, "http://localhost/v1/auth/access-tokens").to_return_json(status: 500, body: {}) + + vitable_connect = VitableConnect::Client.new(base_url: "http://localhost", api_key: "My API Key") + + assert_raises(VitableConnect::Errors::InternalServerError) do + vitable_connect.auth.issue_access_token(grant_type: :client_credentials) + end + + 3.times do + assert_requested(:any, /./, headers: {"x-stainless-retry-count" => _1}) + end + end + + def test_omit_retry_count_header + stub_request(:post, "http://localhost/v1/auth/access-tokens").to_return_json(status: 500, body: {}) + + vitable_connect = VitableConnect::Client.new(base_url: "http://localhost", api_key: "My API Key") + + assert_raises(VitableConnect::Errors::InternalServerError) do + vitable_connect.auth.issue_access_token( + grant_type: :client_credentials, + request_options: {extra_headers: {"x-stainless-retry-count" => nil}} + ) + end + + assert_requested(:any, /./, times: 3) do + refute_includes(_1.headers.keys.map(&:downcase), "x-stainless-retry-count") + end + end + + def test_overwrite_retry_count_header + stub_request(:post, "http://localhost/v1/auth/access-tokens").to_return_json(status: 500, body: {}) + + vitable_connect = VitableConnect::Client.new(base_url: "http://localhost", api_key: "My API Key") + + assert_raises(VitableConnect::Errors::InternalServerError) do + vitable_connect.auth.issue_access_token( + grant_type: :client_credentials, + request_options: {extra_headers: {"x-stainless-retry-count" => "42"}} + ) + end + + assert_requested(:any, /./, headers: {"x-stainless-retry-count" => "42"}, times: 3) + end + + def test_client_redirect_307 + stub_request(:post, "http://localhost/v1/auth/access-tokens").to_return_json( + status: 307, + headers: {"location" => "/redirected"}, + body: {} + ) + stub_request(:any, "http://localhost/redirected").to_return( + status: 307, + headers: {"location" => "/redirected"} + ) + + vitable_connect = VitableConnect::Client.new(base_url: "http://localhost", api_key: "My API Key") + + assert_raises(VitableConnect::Errors::APIConnectionError) do + vitable_connect.auth.issue_access_token( + grant_type: :client_credentials, + request_options: {extra_headers: {}} + ) + end + + recorded, = WebMock::RequestRegistry.instance.requested_signatures.hash.first + + assert_requested(:any, "http://localhost/redirected", times: VitableConnect::Client::MAX_REDIRECTS) do + assert_equal(recorded.method, _1.method) + assert_equal(recorded.body, _1.body) + assert_equal( + recorded.headers.transform_keys(&:downcase)["content-type"], + _1.headers.transform_keys(&:downcase)["content-type"] + ) + end + end + + def test_client_redirect_303 + stub_request(:post, "http://localhost/v1/auth/access-tokens").to_return_json( + status: 303, + headers: {"location" => "/redirected"}, + body: {} + ) + stub_request(:get, "http://localhost/redirected").to_return( + status: 303, + headers: {"location" => "/redirected"} + ) + + vitable_connect = VitableConnect::Client.new(base_url: "http://localhost", api_key: "My API Key") + + assert_raises(VitableConnect::Errors::APIConnectionError) do + vitable_connect.auth.issue_access_token( + grant_type: :client_credentials, + request_options: {extra_headers: {}} + ) + end + + assert_requested(:get, "http://localhost/redirected", times: VitableConnect::Client::MAX_REDIRECTS) do + headers = _1.headers.keys.map(&:downcase) + refute_includes(headers, "content-type") + assert_nil(_1.body) + end + end + + def test_client_redirect_auth_keep_same_origin + stub_request(:post, "http://localhost/v1/auth/access-tokens").to_return_json( + status: 307, + headers: {"location" => "/redirected"}, + body: {} + ) + stub_request(:any, "http://localhost/redirected").to_return( + status: 307, + headers: {"location" => "/redirected"} + ) + + vitable_connect = VitableConnect::Client.new(base_url: "http://localhost", api_key: "My API Key") + + assert_raises(VitableConnect::Errors::APIConnectionError) do + vitable_connect.auth.issue_access_token( + grant_type: :client_credentials, + request_options: {extra_headers: {"authorization" => "Bearer xyz"}} + ) + end + + recorded, = WebMock::RequestRegistry.instance.requested_signatures.hash.first + auth_header = recorded.headers.transform_keys(&:downcase).fetch("authorization") + + assert_equal("Bearer xyz", auth_header) + assert_requested(:any, "http://localhost/redirected", times: VitableConnect::Client::MAX_REDIRECTS) do + auth_header = _1.headers.transform_keys(&:downcase).fetch("authorization") + assert_equal("Bearer xyz", auth_header) + end + end + + def test_client_redirect_auth_strip_cross_origin + stub_request(:post, "http://localhost/v1/auth/access-tokens").to_return_json( + status: 307, + headers: {"location" => "https://example.com/redirected"}, + body: {} + ) + stub_request(:any, "https://example.com/redirected").to_return( + status: 307, + headers: {"location" => "https://example.com/redirected"} + ) + + vitable_connect = VitableConnect::Client.new(base_url: "http://localhost", api_key: "My API Key") + + assert_raises(VitableConnect::Errors::APIConnectionError) do + vitable_connect.auth.issue_access_token( + grant_type: :client_credentials, + request_options: {extra_headers: {"authorization" => "Bearer xyz"}} + ) + end + + assert_requested(:any, "https://example.com/redirected", times: VitableConnect::Client::MAX_REDIRECTS) do + headers = _1.headers.keys.map(&:downcase) + refute_includes(headers, "authorization") + end + end + + def test_default_headers + stub_request(:post, "http://localhost/v1/auth/access-tokens").to_return_json(status: 200, body: {}) + + vitable_connect = VitableConnect::Client.new(base_url: "http://localhost", api_key: "My API Key") + + vitable_connect.auth.issue_access_token(grant_type: :client_credentials) + + assert_requested(:any, /./) do |req| + headers = req.headers.transform_keys(&:downcase) + expected = req.body.nil? ? ["accept"] : %w[accept content-type] + headers.fetch_values(*expected).each { refute_empty(_1) } + end + end +end diff --git a/test/vitable_connect/file_part_test.rb b/test/vitable_connect/file_part_test.rb new file mode 100644 index 0000000..e10e6df --- /dev/null +++ b/test/vitable_connect/file_part_test.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +require_relative "test_helper" + +class VitableConnect::Test::FilePartTest < Minitest::Test + def test_to_json + text = "gray" + filepart = VitableConnect::FilePart.new(StringIO.new(text)) + + assert_equal(text.to_json, filepart.to_json) + assert_equal(text.to_yaml, filepart.to_yaml) + end +end diff --git a/test/vitable_connect/internal/sorbet_runtime_support_test.rb b/test/vitable_connect/internal/sorbet_runtime_support_test.rb new file mode 100644 index 0000000..cc7173d --- /dev/null +++ b/test/vitable_connect/internal/sorbet_runtime_support_test.rb @@ -0,0 +1,52 @@ +# frozen_string_literal: true + +require_relative "../test_helper" + +class VitableConnect::Test::SorbetRuntimeSupportTest < Minitest::Test + extend Minitest::Serial + + i_suck_and_my_tests_are_order_dependent! + + module E + extend VitableConnect::Internal::Type::Enum + + define_sorbet_constant!(:TaggedSymbol) { 1 } + end + + module U + extend VitableConnect::Internal::Type::Union + + define_sorbet_constant!(:Variants) { 2 } + end + + class M < VitableConnect::Internal::Type::BaseModel + define_sorbet_constant!(:OrHash) { 3 } + end + + def test_nil_aliases + err = VitableConnect::Internal::Util::SorbetRuntimeSupport::MissingSorbetRuntimeError + + assert_raises(err) { VitableConnect::Internal::AnyHash } + assert_raises(err) { VitableConnect::Internal::FileInput } + assert_raises(err) { VitableConnect::Internal::Type::Converter::Input } + assert_raises(err) { VitableConnect::Internal::Type::Converter::CoerceState } + assert_raises(err) { VitableConnect::Internal::Type::Converter::DumpState } + assert_raises(err) { VitableConnect::Internal::Type::BaseModel::KnownField } + assert_raises(err) { VitableConnect::Internal::Util::ParsedUri } + assert_raises(err) { VitableConnect::Internal::Util::ServerSentEvent } + assert_raises(err) { VitableConnect::Internal::Transport::BaseClient::RequestComponents } + assert_raises(err) { VitableConnect::Internal::Transport::BaseClient::RequestInput } + assert_raises(err) { VitableConnect::Internal::Transport::PooledNetRequester::Request } + assert_raises(err) { E::TaggedSymbol } + assert_raises(err) { U::Variants } + assert_raises(err) { M::OrHash } + end + + def test_stubbed_aliases + Kernel.instance_eval { const_set(:T, nil) } + + assert_equal(1, E::TaggedSymbol) + assert_equal(2, U::Variants) + assert_equal(3, M::OrHash) + end +end diff --git a/test/vitable_connect/internal/type/base_model_test.rb b/test/vitable_connect/internal/type/base_model_test.rb new file mode 100644 index 0000000..a496f50 --- /dev/null +++ b/test/vitable_connect/internal/type/base_model_test.rb @@ -0,0 +1,727 @@ +# frozen_string_literal: true + +require_relative "../../test_helper" + +class VitableConnect::Test::PrimitiveModelTest < Minitest::Test + A = VitableConnect::Internal::Type::ArrayOf[-> { Integer }] + H = VitableConnect::Internal::Type::HashOf[-> { Integer }, nil?: true] + + module E + extend VitableConnect::Internal::Type::Enum + end + + module U + extend VitableConnect::Internal::Type::Union + end + + class B < VitableConnect::Internal::Type::BaseModel + optional :a, Integer + optional :b, B + end + + def test_typing + converters = [ + VitableConnect::Internal::Type::Unknown, + VitableConnect::Internal::Type::Boolean, + A, + H, + E, + U, + B + ] + + converters.each do |conv| + assert_pattern do + conv => VitableConnect::Internal::Type::Converter + end + end + end + + def test_coerce + cases = { + [VitableConnect::Internal::Type::Unknown, :a] => [{yes: 1}, :a], + [NilClass, :a] => [{maybe: 1}, nil], + [NilClass, nil] => [{yes: 1}, nil], + [VitableConnect::Internal::Type::Boolean, true] => [{yes: 1}, true], + [VitableConnect::Internal::Type::Boolean, "true"] => [{no: 1}, "true"], + [Integer, 1] => [{yes: 1}, 1], + [Integer, 1.0] => [{maybe: 1}, 1], + [Integer, "1"] => [{maybe: 1}, 1], + [Integer, "one"] => [{no: 1}, "one"], + [Float, 1] => [{yes: 1}, 1.0], + [Float, "1"] => [{maybe: 1}, 1.0], + [Float, :one] => [{no: 1}, :one], + [String, :str] => [{yes: 1}, "str"], + [String, "str"] => [{yes: 1}, "str"], + [String, 1] => [{maybe: 1}, "1"], + [:a, "a"] => [{yes: 1}, :a], + [Date, "1990-09-19"] => [{yes: 1}, Date.new(1990, 9, 19)], + [Date, Date.new(1990, 9, 19)] => [{yes: 1}, Date.new(1990, 9, 19)], + [Date, "one"] => [{no: 1}, "one"], + [Time, "1990-09-19"] => [{yes: 1}, Time.new(1990, 9, 19)], + [Time, Time.new(1990, 9, 19)] => [{yes: 1}, Time.new(1990, 9, 19)], + [Time, "one"] => [{no: 1}, "one"] + } + + cases.each do |lhs, rhs| + target, input = lhs + exactness, expect = rhs + state = VitableConnect::Internal::Type::Converter.new_coerce_state + assert_pattern do + VitableConnect::Internal::Type::Converter.coerce(target, input, state: state) => ^expect + state.fetch(:exactness).filter { _2.nonzero? }.to_h => ^exactness + end + end + end + + def test_dump + cases = { + [VitableConnect::Internal::Type::Unknown, B.new(a: "one", b: B.new(a: 1.0))] => {a: "one", b: {a: 1}}, + [A, B.new(a: "one", b: B.new(a: 1.0))] => {a: "one", b: {a: 1}}, + [H, B.new(a: "one", b: B.new(a: 1.0))] => {a: "one", b: {a: 1}}, + [E, B.new(a: "one", b: B.new(a: 1.0))] => {a: "one", b: {a: 1}}, + [U, B.new(a: "one", b: B.new(a: 1.0))] => {a: "one", b: {a: 1}}, + [B, B.new(a: "one", b: B.new(a: 1.0))] => {a: "one", b: {a: 1}}, + [String, B.new(a: "one", b: B.new(a: 1.0))] => {a: "one", b: {a: 1}}, + [:b, B.new(a: "one", b: B.new(a: 1.0))] => {a: "one", b: {a: 1}}, + [nil, B.new(a: "one", b: B.new(a: 1.0))] => {a: "one", b: {a: 1}}, + [VitableConnect::Internal::Type::Boolean, true] => true, + [VitableConnect::Internal::Type::Boolean, "true"] => "true", + [Integer, "1"] => "1", + [Float, 1] => 1, + [String, "one"] => "one", + [String, :one] => :one, + [:a, :b] => :b, + [:a, "a"] => "a", + [String, StringIO.new("one")] => "one", + [String, Pathname(__FILE__)] => VitableConnect::FilePart + } + + cases.each do + target, input = _1 + expect = _2 + assert_pattern do + VitableConnect::Internal::Type::Converter.dump(target, input) => ^expect + end + end + end + + def test_coerce_errors + cases = { + [Integer, "one"] => ArgumentError, + [Float, "one"] => ArgumentError, + [String, Time] => TypeError, + [Date, "one"] => ArgumentError, + [Time, "one"] => ArgumentError + } + + cases.each do |testcase, expect| + target, input = testcase + state = VitableConnect::Internal::Type::Converter.new_coerce_state + VitableConnect::Internal::Type::Converter.coerce(target, input, state: state) + assert_pattern do + state => {error: ^expect} + end + end + end + + def test_dump_retry + types = [ + VitableConnect::Internal::Type::Unknown, + VitableConnect::Internal::Type::Boolean, + A, + H, + E, + U, + B + ] + Pathname(__FILE__).open do |fd| + cases = [ + fd, + [fd], + {a: fd}, + {a: {b: fd}} + ] + types.product(cases).each do |target, input| + state = {can_retry: true} + VitableConnect::Internal::Type::Converter.dump(target, input, state: state) + + assert_pattern do + state => {can_retry: false} + end + end + end + end +end + +class VitableConnect::Test::EnumModelTest < Minitest::Test + class E0 + include VitableConnect::Internal::Type::Enum + + attr_reader :values + + def initialize(*values) = (@values = values) + end + + module E1 + extend VitableConnect::Internal::Type::Enum + + TRUE = true + end + + module E2 + extend VitableConnect::Internal::Type::Enum + + ONE = 1 + TWO = 2 + end + + module E3 + extend VitableConnect::Internal::Type::Enum + + ONE = 1.0 + TWO = 2.0 + end + + module E4 + extend VitableConnect::Internal::Type::Enum + + ONE = :one + TWO = :two + end + + def test_coerce + cases = { + [E0.new, "one"] => [{no: 1}, "one"], + [E0.new(:one), "one"] => [{yes: 1}, :one], + [E0.new(:two), "one"] => [{maybe: 1}, "one"], + + [E1, true] => [{yes: 1}, true], + [E1, false] => [{no: 1}, false], + [E1, :true] => [{no: 1}, :true], + + [E2, 1] => [{yes: 1}, 1], + [E2, 1.0] => [{yes: 1}, 1], + [E2, 1.2] => [{no: 1}, 1.2], + [E2, "1"] => [{no: 1}, "1"], + + [E3, 1.0] => [{yes: 1}, 1.0], + [E3, 1] => [{yes: 1}, 1.0], + [E3, "one"] => [{no: 1}, "one"], + + [E4, :one] => [{yes: 1}, :one], + [E4, "one"] => [{yes: 1}, :one], + [E4, "1"] => [{maybe: 1}, "1"], + [E4, :"1"] => [{maybe: 1}, :"1"], + [E4, 1] => [{no: 1}, 1] + } + + cases.each do |lhs, rhs| + target, input = lhs + exactness, expect = rhs + state = VitableConnect::Internal::Type::Converter.new_coerce_state + assert_pattern do + VitableConnect::Internal::Type::Converter.coerce(target, input, state: state) => ^expect + state.fetch(:exactness).filter { _2.nonzero? }.to_h => ^exactness + end + end + end + + def test_dump + cases = { + [E1, true] => true, + [E1, "true"] => "true", + + [E2, 1.0] => 1.0, + [E2, 3] => 3, + [E2, "1.0"] => "1.0", + + [E3, 1.0] => 1.0, + [E3, 3] => 3, + [E3, "1.0"] => "1.0", + + [E4, :one] => :one, + [E4, "one"] => "one", + [E4, "1.0"] => "1.0" + } + + cases.each do + target, input = _1 + expect = _2 + assert_pattern do + VitableConnect::Internal::Type::Converter.dump(target, input) => ^expect + end + end + end +end + +class VitableConnect::Test::CollectionModelTest < Minitest::Test + A1 = VitableConnect::Internal::Type::ArrayOf[-> { Integer }] + H1 = VitableConnect::Internal::Type::HashOf[Integer] + + A2 = VitableConnect::Internal::Type::ArrayOf[H1] + H2 = VitableConnect::Internal::Type::HashOf[-> { A1 }] + + A3 = VitableConnect::Internal::Type::ArrayOf[Integer, nil?: true] + H3 = VitableConnect::Internal::Type::HashOf[Integer, nil?: true] + + def test_coerce + cases = { + [A1, []] => [{yes: 1}, []], + [A1, {}] => [{no: 1}, {}], + [A1, [1, 2.0]] => [{yes: 2, maybe: 1}, [1, 2]], + [A1, ["1", 2.0]] => [{yes: 1, maybe: 2}, [1, 2]], + [H1, {}] => [{yes: 1}, {}], + [H1, []] => [{no: 1}, []], + [H1, {a: 1, b: 2}] => [{yes: 3}, {a: 1, b: 2}], + [H1, {"a" => 1, "b" => 2}] => [{yes: 3}, {a: 1, b: 2}], + [H1, {[] => 1}] => [{yes: 2, no: 1}, {[] => 1}], + [H1, {a: 1.5}] => [{yes: 1, maybe: 1}, {a: 1}], + + [A2, [{}, {"a" => 1}]] => [{yes: 4}, [{}, {a: 1}]], + [A2, [{"a" => "1"}]] => [{yes: 2, maybe: 1}, [{a: 1}]], + [H2, {a: [1, 2]}] => [{yes: 4}, {a: [1, 2]}], + [H2, {"a" => ["1", 2]}] => [{yes: 3, maybe: 1}, {a: [1, 2]}], + [H2, {"a" => ["one", 2]}] => [{yes: 3, no: 1}, {a: ["one", 2]}], + + [A3, [nil, 1]] => [{yes: 3}, [nil, 1]], + [A3, [nil, "1"]] => [{yes: 2, maybe: 1}, [nil, 1]], + [H3, {a: nil, b: "1"}] => [{yes: 2, maybe: 1}, {a: nil, b: 1}], + [H3, {a: nil}] => [{yes: 2}, {a: nil}] + } + + cases.each do |lhs, rhs| + target, input = lhs + exactness, expect = rhs + state = VitableConnect::Internal::Type::Converter.new_coerce_state + assert_pattern do + VitableConnect::Internal::Type::Converter.coerce(target, input, state: state) => ^expect + state.fetch(:exactness).filter { _2.nonzero? }.to_h => ^exactness + end + end + end +end + +class VitableConnect::Test::BaseModelTest < Minitest::Test + class M1 < VitableConnect::Internal::Type::BaseModel + required :a, Integer + end + + class M2 < M1 + required :a, Time + required :b, Integer, nil?: true + optional :c, String + end + + class M3 < VitableConnect::Internal::Type::BaseModel + optional :c, const: :c + required :d, const: :d + end + + class M4 < M1 + request_only do + required :a, Integer + optional :b, String + end + + response_only do + required :c, Integer + optional :d, String + end + end + + class M5 < VitableConnect::Internal::Type::BaseModel + request_only do + required :c, const: :c + end + + response_only do + required :d, const: :d + end + end + + class M6 < M1 + required :a, VitableConnect::Internal::Type::ArrayOf[M6] + optional :b, M6 + end + + def test_coerce + cases = { + [M1, {}] => [{yes: 1, no: 1}, {}], + [M1, :m1] => [{no: 1}, :m1], + + [M2, {}] => [{yes: 2, no: 1, maybe: 1}, {}], + [M2, {a: "1990-09-19", b: nil}] => [{yes: 4}, {a: "1990-09-19", b: nil}], + [M2, {a: "1990-09-19", b: "1"}] => [{yes: 3, maybe: 1}, {a: "1990-09-19", b: "1"}], + [M2, {a: "1990-09-19"}] => [{yes: 3, maybe: 1}, {a: "1990-09-19"}], + [M2, {a: "1990-09-19", c: nil}] => [{yes: 2, maybe: 2}, {a: "1990-09-19", c: nil}], + + [M3, {c: "c", d: "d"}] => [{yes: 3}, {c: :c, d: :d}], + [M3, {c: "d", d: "c"}] => [{yes: 1, maybe: 2}, {c: "d", d: "c"}], + + [M4, {c: 2}] => [{yes: 5}, {c: 2}], + [M4, {a: "1", c: 2}] => [{yes: 4, maybe: 1}, {a: "1", c: 2}], + [M4, {b: nil, c: 2}] => [{yes: 4, maybe: 1}, {b: nil, c: 2}], + + [M5, {}] => [{yes: 3}, {}], + [M5, {c: "c"}] => [{yes: 3}, {c: :c}], + [M5, {d: "d"}] => [{yes: 3}, {d: :d}], + [M5, {d: nil}] => [{yes: 2, no: 1}, {d: nil}], + + [M6, {a: [{a: []}]}] => [{yes: 6}, -> { _1 in {a: [M6]} }], + [M6, {b: {a: []}}] => [{yes: 4, no: 1}, -> { _1 in {b: M6} }] + } + + cases.each do |lhs, rhs| + target, input = lhs + exactness, expect = rhs + state = VitableConnect::Internal::Type::Converter.new_coerce_state + assert_pattern do + coerced = VitableConnect::Internal::Type::Converter.coerce(target, input, state: state) + assert_equal(coerced, coerced) + if coerced.is_a?(VitableConnect::Internal::Type::BaseModel) + coerced.to_h => ^expect + else + coerced => ^expect + end + state.fetch(:exactness).filter { _2.nonzero? }.to_h => ^exactness + end + end + end + + def test_dump + cases = { + [M3, M3.new] => {d: :d}, + [M3, {}] => {d: :d}, + [M3, {d: 1}] => {d: 1}, + + [M4, M4.new(a: 1, b: "b", c: 2, d: "d")] => {a: 1, b: "b"}, + [M4, {a: 1, b: "b", c: 2, d: "d"}] => {a: 1, b: "b"}, + + [M5, M5.new] => {c: :c}, + [M5, {}] => {c: :c}, + [M5, {c: 1}] => {c: 1} + } + + cases.each do + target, input = _1 + expect = _2 + assert_pattern do + VitableConnect::Internal::Type::Converter.dump(target, input) => ^expect + end + end + end + + def test_accessors + cases = { + M2.new({a: "1990-09-19", b: "1"}) => [{a: "1990-09-19", b: "1"}, {a: Time.new(1990, 9, 19), b: 1}], + M2.new(a: "one", b: "one") => [{a: "one", b: "one"}, {a: ArgumentError, b: ArgumentError}], + M2.new(a: nil, b: 2.0) => [{a: nil, b: 2.0}, {a: TypeError}], + M2.new(a: nil, b: 2.2) => [{a: nil, b: 2.2}, {a: TypeError, b: 2}], + + M3.new => [{}, {d: :d}], + M3.new(d: 1) => [{d: 1}, {d: ArgumentError}], + + M5.new => [{}, {c: :c, d: :d}] + } + + cases.each do + target = _1 + data, attributes = _2 + + assert_pattern do + target.to_h => ^data + end + + attributes.each do |accessor, expect| + case expect + in Class if expect <= StandardError + tap do + target.public_send(accessor) + flunk + rescue VitableConnect::Errors::ConversionError => e + assert_kind_of(expect, e.cause) + end + else + assert_pattern { target.public_send(accessor) => ^expect } + end + end + end + end + + def test_inplace_modification + m1 = M6.new(a: []) + m1.a << M6.new(a: []) + + m2 = M6.new(b: M6.new(a: [])) + m2.b.a << M6.new(a: []) + + m3 = M6.new(a: []) + m4 = M6.new(b: m3) + m3.a << M6.new(a: []) + + assert_pattern do + m1 => {a: [{a: []}]} + m2 => {b: {a: [{a: []}]}} + m4 => {b: {a: [{a: []}]}} + end + end +end + +class VitableConnect::Test::UnionTest < Minitest::Test + class U0 + include VitableConnect::Internal::Type::Union + + def initialize(*variants) = variants.each { variant(_1) } + end + + module U1 + extend VitableConnect::Internal::Type::Union + + variant const: :a + variant const: 2 + end + + class M1 < VitableConnect::Internal::Type::BaseModel + required :t, const: :a, api_name: :type + optional :c, String + end + + class M2 < VitableConnect::Internal::Type::BaseModel + required :type, const: :b + optional :c, String + end + + module U2 + extend VitableConnect::Internal::Type::Union + + discriminator :type + + variant :a, M1 + variant :b, M2 + end + + module U3 + extend VitableConnect::Internal::Type::Union + + discriminator :type + + variant :a, M1 + variant String + end + + module U4 + extend VitableConnect::Internal::Type::Union + + discriminator :type + + variant String + variant :a, M1 + end + + class M3 < VitableConnect::Internal::Type::BaseModel + optional :recur, -> { U5 } + required :a, Integer + end + + class M4 < VitableConnect::Internal::Type::BaseModel + optional :recur, -> { U5 } + required :a, VitableConnect::Internal::Type::ArrayOf[-> { U5 }] + end + + class M5 < VitableConnect::Internal::Type::BaseModel + optional :recur, -> { U5 } + required :b, VitableConnect::Internal::Type::ArrayOf[-> { U5 }] + end + + module U5 + extend VitableConnect::Internal::Type::Union + + variant -> { M3 } + variant -> { M4 } + end + + module U6 + extend VitableConnect::Internal::Type::Union + + variant -> { M3 } + variant -> { M5 } + end + + def test_accessors + model = M3.new(recur: []) + tap do + model.recur + flunk + rescue VitableConnect::Errors::ConversionError => e + assert_kind_of(ArgumentError, e.cause) + end + end + + def test_coerce + cases = { + [U0, :""] => [{no: 1}, 0, :""], + + [U0.new(Integer, Float), "one"] => [{no: 1}, 2, "one"], + [U0.new(Integer, Float), 1.0] => [{yes: 1}, 2, 1.0], + [U0.new({const: :a}), "a"] => [{yes: 1}, 1, :a], + [U0.new({const: :a}), "2"] => [{maybe: 1}, 1, "2"], + + [U1, "a"] => [{yes: 1}, 1, :a], + [U1, "2"] => [{maybe: 1}, 2, "2"], + [U1, :b] => [{maybe: 1}, 2, :b], + + [U2, {type: :a}] => [{yes: 3}, 0, {t: :a}], + [U2, {type: "b"}] => [{yes: 3}, 0, {type: :b}], + + [U3, "one"] => [{yes: 1}, 2, "one"], + [U4, "one"] => [{yes: 1}, 1, "one"], + + [U5, {a: []}] => [{yes: 3}, 2, {a: []}], + [U6, {b: []}] => [{yes: 3}, 2, {b: []}], + + [U5, {a: [{a: []}]}] => [{yes: 6}, 4, {a: [M4.new(a: [])]}], + [U5, {a: [{a: [{a: []}]}]}] => [{yes: 9}, 6, {a: [M4.new(a: [M4.new(a: [])])]}] + } + + cases.each do |lhs, rhs| + target, input = lhs + exactness, branched, expect = rhs + state = VitableConnect::Internal::Type::Converter.new_coerce_state + assert_pattern do + coerced = VitableConnect::Internal::Type::Converter.coerce(target, input, state: state) + assert_equal(coerced, coerced) + if coerced.is_a?(VitableConnect::Internal::Type::BaseModel) + coerced.to_h => ^expect + else + coerced => ^expect + end + state.fetch(:exactness).filter { _2.nonzero? }.to_h => ^exactness + state => {branched: ^branched} + end + end + end +end + +class VitableConnect::Test::BaseModelQoLTest < Minitest::Test + class E0 + include VitableConnect::Internal::Type::Enum + + attr_reader :values + + def initialize(*values) = (@values = values) + end + + module E1 + extend VitableConnect::Internal::Type::Enum + + A = 1 + end + + module E2 + extend VitableConnect::Internal::Type::Enum + + A = 1 + end + + module E3 + extend VitableConnect::Internal::Type::Enum + + A = 2 + B = 3 + end + + class U0 + include VitableConnect::Internal::Type::Union + + def initialize(*variants) = variants.each { variant(_1) } + end + + module U1 + extend VitableConnect::Internal::Type::Union + + variant String + variant Integer + end + + module U2 + extend VitableConnect::Internal::Type::Union + + variant String + variant Integer + end + + class M1 < VitableConnect::Internal::Type::BaseModel + required :a, Integer + end + + class M2 < VitableConnect::Internal::Type::BaseModel + required :a, Integer, nil?: true + end + + class M3 < M2 + required :a, Integer + end + + def test_equality + cases = { + [VitableConnect::Internal::Type::Unknown, VitableConnect::Internal::Type::Unknown] => true, + [VitableConnect::Internal::Type::Boolean, VitableConnect::Internal::Type::Boolean] => true, + [VitableConnect::Internal::Type::Unknown, VitableConnect::Internal::Type::Boolean] => false, + [E0.new(:a, :b), E0.new(:a, :b)] => true, + [E0.new(:a, :b), E0.new(:b, :a)] => true, + [E0.new(:a, :b), E0.new(:b, :c)] => false, + [E1, E2] => true, + [E1, E3] => false, + [U0.new(String, Integer), U0.new(String, Integer)] => true, + [U0.new(String, Integer), U0.new(Integer, String)] => false, + [U0.new(String, Float), U0.new(String, Integer)] => false, + [U1, U2] => true, + [M1, M2] => false, + [M1, M3] => true, + [M1.new(a: 1), M1.new(a: 1)] => true + } + + cases.each do + if _2 + assert_equal(*_1) + assert_equal(*_1.map(&:hash)) + else + refute_equal(*_1) + refute_equal(*_1.map(&:hash)) + end + end + end +end + +class VitableConnect::Test::MetaInfoTest < Minitest::Test + A1 = VitableConnect::Internal::Type::ArrayOf[Integer, nil?: true, doc: "dog"] + H1 = VitableConnect::Internal::Type::HashOf[-> { String }, nil?: true, doc: "dawg"] + + class M1 < VitableConnect::Internal::Type::BaseModel + required :a, Integer, doc: "dog" + optional :b, -> { String }, nil?: true, doc: "dawg" + end + + module U1 + extend VitableConnect::Internal::Type::Union + + variant -> { Integer }, const: 2, doc: "dog" + variant -> { String }, doc: "dawg" + end + + def test_meta_retrieval + m1 = A1.instance_variable_get(:@meta) + m2 = H1.instance_variable_get(:@meta) + assert_equal({doc: "dog"}, m1) + assert_equal({doc: "dawg"}, m2) + + ma, mb = M1.fields.fetch_values(:a, :b) + assert_equal({doc: "dog"}, ma.fetch(:meta)) + assert_equal({doc: "dawg"}, mb.fetch(:meta)) + + ua, ub = U1.send(:known_variants).map(&:last) + assert_equal({doc: "dog"}, ua) + assert_equal({doc: "dawg"}, ub) + end +end diff --git a/test/vitable_connect/internal/util_test.rb b/test/vitable_connect/internal/util_test.rb new file mode 100644 index 0000000..a76c65f --- /dev/null +++ b/test/vitable_connect/internal/util_test.rb @@ -0,0 +1,678 @@ +# frozen_string_literal: true + +require_relative "../test_helper" + +class VitableConnect::Test::UtilDataHandlingTest < Minitest::Test + def test_left_map + assert_pattern do + VitableConnect::Internal::Util.deep_merge({a: 1}, nil) => nil + end + end + + def test_right_map + assert_pattern do + VitableConnect::Internal::Util.deep_merge(nil, {a: 1}) => {a: 1} + end + end + + def test_disjoint_maps + assert_pattern do + VitableConnect::Internal::Util.deep_merge({b: 2}, {a: 1}) => {a: 1, b: 2} + end + end + + def test_overlapping_maps + assert_pattern do + VitableConnect::Internal::Util.deep_merge({b: 2, c: 3}, {a: 1, c: 4}) => {a: 1, b: 2, c: 4} + end + end + + def test_nested + assert_pattern do + VitableConnect::Internal::Util.deep_merge({b: {b2: 1}}, {b: {b2: 2}}) => {b: {b2: 2}} + end + end + + def test_nested_left_map + assert_pattern do + VitableConnect::Internal::Util.deep_merge({b: {b2: 1}}, {b: 6}) => {b: 6} + end + end + + def test_omission + merged = VitableConnect::Internal::Util.deep_merge( + {b: {b2: 1, b3: {c: 4, d: 5}}}, + {b: {b2: 1, b3: {c: VitableConnect::Internal::OMIT, d: 5}}} + ) + + assert_pattern do + merged => {b: {b2: 1, b3: {d: 5}}} + end + end + + def test_concat + merged = VitableConnect::Internal::Util.deep_merge( + {a: {b: [1, 2]}}, + {a: {b: [3, 4]}}, + concat: true + ) + + assert_pattern do + merged => {a: {b: [1, 2, 3, 4]}} + end + end + + def test_concat_false + merged = VitableConnect::Internal::Util.deep_merge( + {a: {b: [1, 2]}}, + {a: {b: [3, 4]}}, + concat: false + ) + + assert_pattern do + merged => {a: {b: [3, 4]}} + end + end + + def test_dig + assert_pattern do + VitableConnect::Internal::Util.dig(1, nil) => 1 + VitableConnect::Internal::Util.dig({a: 1}, :b) => nil + VitableConnect::Internal::Util.dig({a: 1}, :a) => 1 + VitableConnect::Internal::Util.dig({a: {b: 1}}, [:a, :b]) => 1 + + VitableConnect::Internal::Util.dig([], 1) => nil + VitableConnect::Internal::Util.dig([nil, [nil, 1]], [1, 1]) => 1 + VitableConnect::Internal::Util.dig({a: [nil, 1]}, [:a, 1]) => 1 + VitableConnect::Internal::Util.dig([], 1.0) => nil + + VitableConnect::Internal::Util.dig(Object, 1) => nil + VitableConnect::Internal::Util.dig([], 1.0) { 2 } => 2 + VitableConnect::Internal::Util.dig([], ->(_) { 2 }) => 2 + VitableConnect::Internal::Util.dig([1], -> { _1 in [1] }) => true + end + end +end + +class VitableConnect::Test::UtilUriHandlingTest < Minitest::Test + def test_parsing + %w[ + http://example.com + https://example.com/ + https://example.com:443/example?e1=e1&e2=e2&e= + ].each do |url| + parsed = VitableConnect::Internal::Util.parse_uri(url) + unparsed = VitableConnect::Internal::Util.unparse_uri(parsed).to_s + + assert_equal(url, unparsed) + assert_equal(parsed, VitableConnect::Internal::Util.parse_uri(unparsed)) + end + end + + def test_joining + cases = [ + [ + "h://a.b/c?d=e", + "h://nope/ignored", + VitableConnect::Internal::Util.parse_uri("h://a.b/c?d=e") + ], + [ + "h://a.b/c?d=e", + "h://nope", + { + host: "a.b", + path: "/c", + query: {"d" => ["e"]} + } + ], + [ + "h://a.b/c?d=e", + "h://nope", + { + path: "h://a.b/c", + query: {"d" => ["e"]} + } + ] + ] + + cases.each do |expect, lhs, rhs| + assert_equal( + URI.parse(expect), + VitableConnect::Internal::Util.join_parsed_uri( + VitableConnect::Internal::Util.parse_uri(lhs), + rhs + ) + ) + end + end + + def test_joining_queries + base_url = "h://a.b/c?d=e" + cases = { + "c2" => "h://a.b/c/c2", + "/c2?f=g" => "h://a.b/c2?f=g", + "/c?f=g" => "h://a.b/c?d=e&f=g" + } + + cases.each do |path, expected| + assert_equal( + URI.parse(expected), + VitableConnect::Internal::Util.join_parsed_uri( + VitableConnect::Internal::Util.parse_uri(base_url), + {path: path} + ) + ) + end + end +end + +class VitableConnect::Test::RegexMatchTest < Minitest::Test + def test_json_content + cases = { + "application/json" => true, + "application/jsonl" => false, + "application/arbitrary+json" => true, + "application/ARBITRARY+json" => true, + "application/vnd.github.v3+json" => true, + "application/vnd.api+json" => true + } + cases.each do |header, verdict| + assert_pattern do + VitableConnect::Internal::Util::JSON_CONTENT.match?(header) => ^verdict + end + end + end + + def test_jsonl_content + cases = { + "application/x-ndjson" => true, + "application/x-ldjson" => true, + "application/jsonl" => true, + "application/x-jsonl" => true, + "application/json" => false, + "application/vnd.api+json" => false + } + cases.each do |header, verdict| + assert_pattern do + VitableConnect::Internal::Util::JSONL_CONTENT.match?(header) => ^verdict + end + end + end +end + +class VitableConnect::Test::UtilFormDataEncodingTest < Minitest::Test + class FakeCGI < CGI + def initialize(headers, io) + encoded = io.to_a + @ctype = headers["content-type"] + # rubocop:disable Lint/EmptyBlock + @io = VitableConnect::Internal::Util::ReadIOAdapter.new(encoded.to_enum) {} + # rubocop:enable Lint/EmptyBlock + @c_len = encoded.join.bytesize.to_s + super() + end + + def stdinput = @io + + def env_table + { + "REQUEST_METHOD" => "POST", + "CONTENT_TYPE" => @ctype, + "CONTENT_LENGTH" => @c_len + } + end + end + + def test_encoding_length + headers, = VitableConnect::Internal::Util.encode_content( + {"content-type" => "multipart/form-data"}, + Pathname(__FILE__) + ) + assert_pattern do + headers.fetch("content-type") => /boundary=(.+)$/ + end + field, = Regexp.last_match.captures + assert(field.length < 70 - 6) + end + + def test_file_encode + file = Pathname(__FILE__) + fileinput = VitableConnect::Internal::Type::Converter.dump( + VitableConnect::Internal::Type::FileInput, + "abc" + ) + headers = {"content-type" => "multipart/form-data"} + cases = { + "abc" => ["", "abc"], + StringIO.new("abc") => ["", "abc"], + fileinput => %w[upload abc], + VitableConnect::FilePart.new(StringIO.new("abc")) => ["", "abc"], + file => [file.basename.to_path, /^class VitableConnect/], + VitableConnect::FilePart.new(file, filename: "d o g") => ["d%20o%20g", /^class VitableConnect/] + } + cases.each do |body, testcase| + filename, val = testcase + encoded = VitableConnect::Internal::Util.encode_content(headers, body) + cgi = FakeCGI.new(*encoded) + io = cgi[""] + assert_pattern do + io.original_filename => ^filename + io.read => ^val + end + end + end + + def test_hash_encode + headers = {"content-type" => "multipart/form-data"} + cases = { + {a: 2, b: 3} => {"a" => "2", "b" => "3"}, + {a: 2, b: nil} => {"a" => "2", "b" => "null"}, + {a: 2, b: [1, 2, 3]} => {"a" => "2", "b" => "1"}, + {strio: StringIO.new("a")} => {"strio" => "a"}, + {strio: VitableConnect::FilePart.new("a")} => {"strio" => "a"}, + {pathname: Pathname(__FILE__)} => {"pathname" => -> { _1.read in /^class VitableConnect/ }}, + {pathname: VitableConnect::FilePart.new(Pathname(__FILE__))} => {"pathname" => -> { _1.read in /^class VitableConnect/ }} + } + cases.each do |body, testcase| + encoded = VitableConnect::Internal::Util.encode_content(headers, body) + cgi = FakeCGI.new(*encoded) + testcase.each do |key, val| + assert_pattern do + parsed = + case (p = cgi[key]) + in StringIO + p.read + else + p + end + parsed => ^val + end + end + end + end +end + +class VitableConnect::Test::UtilIOAdapterTest < Minitest::Test + def test_copy_read + cases = { + StringIO.new("abc") => "abc", + Enumerator.new { _1 << "abc" } => "abc" + } + cases.each do |input, expected| + io = StringIO.new + # rubocop:disable Lint/EmptyBlock + adapter = VitableConnect::Internal::Util::ReadIOAdapter.new(input) {} + # rubocop:enable Lint/EmptyBlock + IO.copy_stream(adapter, io) + assert_equal(expected, io.string) + end + end + + def test_copy_write + cases = { + StringIO.new => "", + StringIO.new("abc") => "abc" + } + cases.each do |input, expected| + enum = VitableConnect::Internal::Util.writable_enum do |y| + IO.copy_stream(input, y) + end + assert_equal(expected, enum.to_a.join) + end + end +end + +class VitableConnect::Test::UtilFusedEnumTest < Minitest::Test + def test_rewind_closing + touched = false + once = 0 + steps = 0 + enum = Enumerator.new do |y| + next if touched + + 10.times do + steps = _1 + y << _1 + end + ensure + once = once.succ + end + + fused = VitableConnect::Internal::Util.fused_enum(enum, external: true) do + touched = true + loop { enum.next } + end + VitableConnect::Internal::Util.close_fused!(fused) + + assert_equal(1, once) + assert_equal(0, steps) + end + + def test_thread_interrupts + once = 0 + que = Queue.new + enum = Enumerator.new do |y| + 10.times { y << _1 } + ensure + once = once.succ + end + + fused_1 = VitableConnect::Internal::Util.fused_enum(enum, external: true) { loop { enum.next } } + fused_2 = VitableConnect::Internal::Util.chain_fused(fused_1) { fused_1.each(&_1) } + fused_3 = VitableConnect::Internal::Util.chain_fused(fused_2) { fused_2.each(&_1) } + + th = ::Thread.new do + que << "🐶" + fused_3.each { sleep(10) } + end + + assert_equal("🐶", que.pop) + th.kill.join + assert_equal(1, once) + end + + def test_closing + arr = [1, 2, 3] + once = 0 + fused = VitableConnect::Internal::Util.fused_enum(arr.to_enum) do + once = once.succ + end + + enumerated_1 = fused.to_a + assert_equal(arr, enumerated_1) + assert_equal(1, once) + + enumerated_2 = fused.to_a + assert_equal([], enumerated_2) + assert_equal(1, once) + end + + def test_rewind_chain + once = 0 + fused = VitableConnect::Internal::Util.fused_enum([1, 2, 3].to_enum) do + once = once.succ + end + .lazy + .map(&:succ) + .filter(&:odd?) + first = fused.next + + assert_equal(3, first) + assert_equal(0, once) + assert_raises(StopIteration) { fused.rewind.next } + assert_equal(1, once) + end + + def test_external_iteration + iter = [1, 2, 3].to_enum + first = iter.next + fused = VitableConnect::Internal::Util.fused_enum(iter, external: true) + + assert_equal(1, first) + assert_equal([2, 3], fused.to_a) + end + + def test_close_fused + once = 0 + fused = VitableConnect::Internal::Util.fused_enum([1, 2, 3].to_enum) do + once = once.succ + end + + VitableConnect::Internal::Util.close_fused!(fused) + + assert_equal(1, once) + assert_equal([], fused.to_a) + assert_equal(1, once) + end + + def test_closed_fused_extern_iteration + taken = 0 + enum = [1, 2, 3].to_enum.lazy.map do + taken = taken.succ + _1 + end + fused = VitableConnect::Internal::Util.fused_enum(enum) + first = fused.next + + assert_equal(1, first) + VitableConnect::Internal::Util.close_fused!(fused) + assert_equal(1, taken) + end + + def test_closed_fused_taken_count + taken = 0 + enum = [1, 2, 3].to_enum.lazy.map do + taken = taken.succ + _1 + end + .map(&:succ) + .filter(&:odd?) + fused = VitableConnect::Internal::Util.fused_enum(enum) + + assert_equal(0, taken) + VitableConnect::Internal::Util.close_fused!(fused) + assert_equal(0, taken) + end + + def test_closed_fused_extern_iter_taken_count + taken = 0 + enum = [1, 2, 3].to_enum.lazy.map do + taken = taken.succ + _1 + end + .map(&:succ) + .filter(&:itself) + first = enum.next + assert_equal(2, first) + assert_equal(1, taken) + + fused = VitableConnect::Internal::Util.fused_enum(enum) + VitableConnect::Internal::Util.close_fused!(fused) + assert_equal(1, taken) + end + + def test_close_fused_sse_chain + taken = 0 + enum = [1, 2, 3].to_enum.lazy.map do + taken = taken.succ + _1 + end + .map(&:succ) + .filter(&:odd?) + .map(&:to_s) + + fused_1 = VitableConnect::Internal::Util.fused_enum(enum) + fused_2 = VitableConnect::Internal::Util.decode_lines(fused_1) + fused_3 = VitableConnect::Internal::Util.decode_sse(fused_2) + + assert_equal(0, taken) + VitableConnect::Internal::Util.close_fused!(fused_3) + assert_equal(0, taken) + end +end + +class VitableConnect::Test::UtilContentDecodingTest < Minitest::Test + def test_charset + cases = { + "application/json" => Encoding::BINARY, + "application/json; charset=utf-8" => Encoding::UTF_8, + "charset=uTf-8 application/json; " => Encoding::UTF_8, + "charset=UTF-8; application/json; " => Encoding::UTF_8, + "charset=ISO-8859-1 ;application/json; " => Encoding::ISO_8859_1, + "charset=EUC-KR ;application/json; " => Encoding::EUC_KR + } + text = String.new.force_encoding(Encoding::BINARY) + cases.each do |content_type, encoding| + VitableConnect::Internal::Util.force_charset!(content_type, text: text) + assert_equal(encoding, text.encoding) + end + end +end + +class VitableConnect::Test::UtilSseTest < Minitest::Test + def test_decode_lines + cases = { + %w[] => %w[], + %W[\n\n] => %W[\n \n], + %W[\n \n] => %W[\n \n], + %w[a] => %w[a], + %W[a\nb] => %W[a\n b], + %W[a\nb\n] => %W[a\n b\n], + %W[\na b\n] => %W[\n ab\n], + %W[\na b\n\n] => %W[\n ab\n \n], + %W[\na b] => %W[\n ab], + %W[\u1F62E\u200D\u1F4A8] => %W[\u1F62E\u200D\u1F4A8], + %W[\u1F62E \u200D \u1F4A8] => %W[\u1F62E\u200D\u1F4A8], + ["\xf0\x9f".b, "\xa5\xba".b] => ["\xf0\x9f\xa5\xba".b], + ["\xf0".b, "\x9f".b, "\xa5".b, "\xba".b] => ["\xf0\x9f\xa5\xba".b] + } + eols = %W[\n \r \r\n] + cases.each do |enum, expected| + eols.each do |eol| + lines = VitableConnect::Internal::Util.decode_lines(enum.map { _1.gsub("\n", eol) }) + assert_equal(expected.map { _1.gsub("\n", eol) }, lines.to_a, "eol=#{JSON.generate(eol)}") + end + end + end + + def test_mixed_decode_lines + cases = { + %w[] => %w[], + %W[\r\r] => %W[\r \r], + %W[\r \r] => %W[\r \r], + %W[\r\r\r] => %W[\r \r \r], + %W[\r\r \r] => %W[\r \r \r], + %W[\r \n] => %W[\r\n], + %W[\r\r\n] => %W[\r \r\n], + %W[\n\r] => %W[\n \r] + } + cases.each do |enum, expected| + lines = VitableConnect::Internal::Util.decode_lines(enum) + assert_equal(expected, lines.to_a) + end + end + + def test_decode_sse + cases = { + "empty input" => { + [] => [] + }, + "single data event" => { + [ + "data: hello world\n", + "\n" + ] => [ + {data: "hello world\n"} + ] + }, + "multiple data lines" => { + [ + "data: line 1\n", + "data: line 2\n", + "\n" + ] => [ + {data: "line 1\nline 2\n"} + ] + }, + "complete event" => { + [ + "id: 123\n", + "event: update\n", + "data: hello world\n", + "retry: 5000\n", + "\n" + ] => [ + { + event: "update", + id: "123", + data: "hello world\n", + retry: 5000 + } + ] + }, + "multiple events" => { + [ + "event: update\n", + "data: first\n", + "\n", + "event: message\n", + "data: second\n", + "\n" + ] => [ + {event: "update", data: "first\n"}, + {event: "message", data: "second\n"} + ] + }, + "comments" => { + [ + ": this is a comment\n", + "data: actual data\n", + "\n" + ] => [ + {data: "actual data\n"} + ] + }, + "invalid retry" => { + [ + "retry: not a number\n", + "data: hello\n", + "\n" + ] => [ + {data: "hello\n"} + ] + }, + "invalid id with null" => { + [ + "id: bad\0id\n", + "data: hello\n", + "\n" + ] => [ + {data: "hello\n"} + ] + }, + "leading space in value" => { + [ + "data: hello world\n", + "data: leading space\n", + "\n" + ] => [ + {data: "hello world\n leading space\n"} + ] + }, + "no final newline" => { + [ + "data: hello\n", + "id: 1" + ] => [ + {data: "hello\n", id: "1"} + ] + }, + "multiple empty lines" => { + [ + "data: first\n", + "\n", + "\n", + "data: second\n", + "\n" + ] => [ + {data: "first\n"}, + {data: "second\n"} + ] + }, + "multibyte unicode" => { + [ + "data: \u1F62E\u200D\u1F4A8\n" + ] => [ + {data: "\u1F62E\u200D\u1F4A8\n"} + ] + } + } + + cases.each do |name, test_cases| + test_cases.each do |input, expected| + actual = VitableConnect::Internal::Util.decode_sse(input).map(&:compact) + assert_equal(expected, actual, name) + end + end + end +end diff --git a/test/vitable_connect/resource_namespaces.rb b/test/vitable_connect/resource_namespaces.rb new file mode 100644 index 0000000..48e7913 --- /dev/null +++ b/test/vitable_connect/resource_namespaces.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +module VitableConnect + module Test + module Resources + module Groups + module Members + end + end + + module Members + end + end + end +end diff --git a/test/vitable_connect/resources/auth_test.rb b/test/vitable_connect/resources/auth_test.rb new file mode 100644 index 0000000..929bd49 --- /dev/null +++ b/test/vitable_connect/resources/auth_test.rb @@ -0,0 +1,24 @@ +# frozen_string_literal: true + +require_relative "../test_helper" + +class VitableConnect::Test::Resources::AuthTest < VitableConnect::Test::ResourceTest + def test_issue_access_token_required_params + skip("Mock server tests are disabled") + + response = @vitable_connect.auth.issue_access_token(grant_type: :client_credentials) + + assert_pattern do + response => VitableConnect::Models::AuthIssueAccessTokenResponse + end + + assert_pattern do + response => { + access_token: String, + expires_in: Integer, + token_type: String, + bound_entity: VitableConnect::Models::AuthIssueAccessTokenResponse::BoundEntity | nil + } + end + end +end diff --git a/test/vitable_connect/resources/employees_test.rb b/test/vitable_connect/resources/employees_test.rb new file mode 100644 index 0000000..b424734 --- /dev/null +++ b/test/vitable_connect/resources/employees_test.rb @@ -0,0 +1,72 @@ +# frozen_string_literal: true + +require_relative "../test_helper" + +class VitableConnect::Test::Resources::EmployeesTest < VitableConnect::Test::ResourceTest + def test_retrieve + skip("Mock server tests are disabled") + + response = @vitable_connect.employees.retrieve("empl_abc123def456") + + assert_pattern do + response => VitableConnect::Models::EmployeeRetrieveResponse + end + + assert_pattern do + response => { + data: VitableConnect::Employee + } + end + end + + def test_update_required_params + skip("Mock server tests are disabled") + + response = @vitable_connect.employees.update("empl_abc123def456", effective_date: "2023-03-01") + + assert_pattern do + response => VitableConnect::Models::EmployeeUpdateResponse + end + + assert_pattern do + response => { + data: VitableConnect::Employee + } + end + end + + def test_list_enrollments + skip("Mock server tests are disabled") + + response = @vitable_connect.employees.list_enrollments("empl_abc123def456") + + assert_pattern do + response => VitableConnect::Internal::PageNumberPage + end + + row = response.to_enum.first + return if row.nil? + + assert_pattern do + row => VitableConnect::Enrollment + end + + assert_pattern do + row => { + id: String, + answered_at: Time | nil, + benefit: VitableConnect::Enrollment::Benefit, + coverage_end: Date | nil, + coverage_start: Date, + created_at: Time, + employee_deduction_in_cents: Integer | nil, + employee_id: String, + employer_contribution_in_cents: Integer | nil, + employer_id: String, + status: VitableConnect::EnrollmentStatus, + terminated_at: Time | nil, + updated_at: Time + } + end + end +end diff --git a/test/vitable_connect/resources/employers_test.rb b/test/vitable_connect/resources/employers_test.rb new file mode 100644 index 0000000..716058e --- /dev/null +++ b/test/vitable_connect/resources/employers_test.rb @@ -0,0 +1,412 @@ +# frozen_string_literal: true + +require_relative "../test_helper" + +class VitableConnect::Test::Resources::EmployersTest < VitableConnect::Test::ResourceTest + def test_create_required_params + skip("Mock server tests are disabled") + + response = + @vitable_connect.employers.create( + address: {address_line_1: "789 Business Blvd", city: "Seattle", state: "WA", zipcode: "98101"}, + ein: "12-3456789", + email: "hr@newco.com", + legal_name: "NewCo Industries LLC", + name: "NewCo Industries" + ) + + assert_pattern do + response => VitableConnect::EmployerResponse + end + + assert_pattern do + response => { + data: VitableConnect::Employer + } + end + end + + def test_retrieve + skip("Mock server tests are disabled") + + response = @vitable_connect.employers.retrieve("empr_abc123def456") + + assert_pattern do + response => VitableConnect::EmployerResponse + end + + assert_pattern do + response => { + data: VitableConnect::Employer + } + end + end + + def test_update + skip("Mock server tests are disabled") + + response = @vitable_connect.employers.update("empr_abc123def456") + + assert_pattern do + response => VitableConnect::EmployerResponse + end + + assert_pattern do + response => { + data: VitableConnect::Employer + } + end + end + + def test_list + skip("Mock server tests are disabled") + + response = @vitable_connect.employers.list + + assert_pattern do + response => VitableConnect::Internal::PageNumberPage + end + + row = response.to_enum.first + return if row.nil? + + assert_pattern do + row => VitableConnect::Models::EmployerListResponse + end + + assert_pattern do + row => { + active: VitableConnect::Internal::Type::Boolean, + address: VitableConnect::Models::EmployerListResponse::Address, + benefit_families: ^(VitableConnect::Internal::Type::ArrayOf[String]), + benefit_lifecycle_stage: VitableConnect::Models::EmployerListResponse::BenefitLifecycleStage, + created_at: Time, + ein: String | nil, + email: String | nil, + employer_id: String, + enrollment_rate_summary: VitableConnect::Models::EmployerListResponse::EnrollmentRateSummary, + hris_status: VitableConnect::Models::EmployerListResponse::HRISStatus | nil, + legal_name: String | nil, + name: String, + organization_id: String | nil, + phone_number: String | nil, + reference_id: String | nil, + updated_at: Time + } + end + end + + def test_ensure_payroll_integration_email + skip("Mock server tests are disabled") + + response = @vitable_connect.employers.ensure_payroll_integration_email("empr_abc123def456") + + assert_pattern do + response => VitableConnect::Models::EmployerEnsurePayrollIntegrationEmailResponse + end + + assert_pattern do + response => { + data: VitableConnect::Models::EmployerEnsurePayrollIntegrationEmailResponse::Data + } + end + end + + def test_list_benefit_plan_year_enrollments_required_params + skip("Mock server tests are disabled") + + response = + @vitable_connect.employers.list_benefit_plan_year_enrollments( + "plyr_abc123def456", + employer_id: "empr_abc123def456" + ) + + assert_pattern do + response => VitableConnect::Internal::PageNumberPage + end + + row = response.to_enum.first + return if row.nil? + + assert_pattern do + row => VitableConnect::Models::EmployerListBenefitPlanYearEnrollmentsResponse + end + + assert_pattern do + row => { + carrier: String | nil, + dependent_count: Integer, + election_status: VitableConnect::Models::EmployerListBenefitPlanYearEnrollmentsResponse::ElectionStatus, + employee_deduction_in_cents: Integer | nil, + employee_external_reference_id: String | nil, + employee_id: String, + employer_contribution_in_cents: Integer | nil, + member_first_name: String, + member_id: String, + member_last_name: String, + plan: String | nil, + policy_status: VitableConnect::Models::EmployerListBenefitPlanYearEnrollmentsResponse::PolicyStatus | nil, + premium_in_cents: Integer | nil, + tier: String | nil + } + end + end + + def test_list_benefit_plan_years + skip("Mock server tests are disabled") + + response = @vitable_connect.employers.list_benefit_plan_years("empr_abc123def456") + + assert_pattern do + response => VitableConnect::Models::EmployerListBenefitPlanYearsResponse + end + + assert_pattern do + response => { + data: ^(VitableConnect::Internal::Type::ArrayOf[VitableConnect::Models::EmployerListBenefitPlanYearsResponse::Data]) + } + end + end + + def test_list_employees + skip("Mock server tests are disabled") + + response = @vitable_connect.employers.list_employees("empr_abc123def456") + + assert_pattern do + response => VitableConnect::Internal::PageNumberPage + end + + row = response.to_enum.first + return if row.nil? + + assert_pattern do + row => VitableConnect::Employee + end + + assert_pattern do + row => { + id: String, + classification_effective_date: Date, + compensation_type: VitableConnect::Employee::CompensationType | nil, + compensation_type_effective_date: Date, + created_at: Time, + date_of_birth: Date, + deductions: ^(VitableConnect::Internal::Type::ArrayOf[VitableConnect::Employee::Deduction]), + email: String, + employee_class: VitableConnect::EmployeeClass, + employer_id: String, + first_name: String, + last_name: String, + member_id: String, + phone: String | nil, + start_date: Date, + status: VitableConnect::Employee::Status, + updated_at: Time, + address: VitableConnect::Employee::Address | nil, + employer_name: String | nil, + gender: String | nil, + reference_id: String | nil, + suffix: String | nil, + termination_date: Date | nil + } + end + end + + def test_list_hris_providers + skip("Mock server tests are disabled") + + response = @vitable_connect.employers.list_hris_providers + + assert_pattern do + response => VitableConnect::Models::EmployerListHRISProvidersResponse + end + + assert_pattern do + response => { + data: ^(VitableConnect::Internal::Type::ArrayOf[VitableConnect::Models::EmployerListHRISProvidersResponse::Data]) + } + end + end + + def test_list_invoices + skip("Mock server tests are disabled") + + response = @vitable_connect.employers.list_invoices("empr_abc123def456") + + assert_pattern do + response => VitableConnect::Models::EmployerListInvoicesResponse + end + + assert_pattern do + response => { + data: ^(VitableConnect::Internal::Type::ArrayOf[VitableConnect::Models::EmployerListInvoicesResponse::Data]), + pagination: VitableConnect::Models::EmployerListInvoicesResponse::Pagination + } + end + end + + def test_list_payroll_deduction_statements + skip("Mock server tests are disabled") + + response = @vitable_connect.employers.list_payroll_deduction_statements("empr_abc123def456") + + assert_pattern do + response => VitableConnect::Internal::PageNumberPage + end + + row = response.to_enum.first + return if row.nil? + + assert_pattern do + row => VitableConnect::Models::EmployerListPayrollDeductionStatementsResponse + end + + assert_pattern do + row => { + csv_file_url: String | nil, + deduction_frequency: VitableConnect::Models::EmployerListPayrollDeductionStatementsResponse::DeductionFrequency, + deduction_frequency_label: String, + employee_count: Integer, + period_end: Date, + period_start: Date, + run_date: Time, + statement_id: String, + total_deduction_cents: Integer + } + end + end + + def test_retrieve_benefit_plan_year_required_params + skip("Mock server tests are disabled") + + response = + @vitable_connect.employers.retrieve_benefit_plan_year( + "plyr_abc123def456", + employer_id: "empr_abc123def456" + ) + + assert_pattern do + response => VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse + end + + assert_pattern do + response => { + data: VitableConnect::Models::EmployerRetrieveBenefitPlanYearResponse::Data + } + end + end + + def test_retrieve_hris + skip("Mock server tests are disabled") + + response = @vitable_connect.employers.retrieve_hris("empr_abc123def456") + + assert_pattern do + response => VitableConnect::Models::EmployerRetrieveHRISResponse + end + + assert_pattern do + response => { + data: VitableConnect::Models::EmployerRetrieveHRISResponse::Data + } + end + end + + def test_retrieve_invoice_pdf_required_params + skip("Mock server tests are disabled") + + response = @vitable_connect.employers.retrieve_invoice_pdf("INV-00042", employer_id: "empr_abc123def456") + + assert_pattern do + response => VitableConnect::Models::EmployerRetrieveInvoicePdfResponse + end + + assert_pattern do + response => { + data: VitableConnect::Models::EmployerRetrieveInvoicePdfResponse::Data + } + end + end + + def test_retrieve_payroll_access_setup + skip("Mock server tests are disabled") + + response = @vitable_connect.employers.retrieve_payroll_access_setup("empr_abc123def456") + + assert_pattern do + response => VitableConnect::Models::EmployerRetrievePayrollAccessSetupResponse + end + + assert_pattern do + response => { + data: VitableConnect::Models::EmployerRetrievePayrollAccessSetupResponse::Data + } + end + end + + def test_submit_census_sync_required_params + skip("Mock server tests are disabled") + + response = + @vitable_connect.employers.submit_census_sync( + "empr_abc123def456", + employees: [ + {date_of_birth: "1990-05-15", email: "jane.doe@acme.com", first_name: "Jane", last_name: "Doe"}, + {date_of_birth: "1985-11-20", email: "john.smith@acme.com", first_name: "John", last_name: "Smith"} + ] + ) + + assert_pattern do + response => VitableConnect::Models::EmployerSubmitCensusSyncResponse + end + + assert_pattern do + response => { + data: VitableConnect::Models::EmployerSubmitCensusSyncResponse::Data + } + end + end + + def test_submit_payroll_access_setup_required_params + skip("Mock server tests are disabled") + + response = + @vitable_connect.employers.submit_payroll_access_setup( + "empr_abc123def456", + access_method: :SELF_SETUP, + all_benefit_eligible_employees_present: true, + classifications_accurate: true, + employees_in_payroll_acknowledged: true, + has_additional_payroll_system: true, + is_controlled_group: true, + payroll_data_impacts_eligibility_acknowledged: true + ) + + assert_pattern do + response => VitableConnect::Models::EmployerSubmitPayrollAccessSetupResponse + end + + assert_pattern do + response => { + data: VitableConnect::Models::EmployerSubmitPayrollAccessSetupResponse::Data + } + end + end + + def test_update_settings_required_params + skip("Mock server tests are disabled") + + response = @vitable_connect.employers.update_settings("empr_abc123def456", pay_frequency: :bi_weekly) + + assert_pattern do + response => VitableConnect::Models::EmployerUpdateSettingsResponse + end + + assert_pattern do + response => { + data: VitableConnect::Models::EmployerUpdateSettingsResponse::Data + } + end + end +end diff --git a/test/vitable_connect/resources/enrollments_test.rb b/test/vitable_connect/resources/enrollments_test.rb new file mode 100644 index 0000000..d6a82dc --- /dev/null +++ b/test/vitable_connect/resources/enrollments_test.rb @@ -0,0 +1,47 @@ +# frozen_string_literal: true + +require_relative "../test_helper" + +class VitableConnect::Test::Resources::EnrollmentsTest < VitableConnect::Test::ResourceTest + def test_retrieve + skip("Mock server tests are disabled") + + response = @vitable_connect.enrollments.retrieve("enrl_AAAAAAAAAAAAAAAAAAAAAQ") + + assert_pattern do + response => VitableConnect::Models::EnrollmentRetrieveResponse + end + + assert_pattern do + response => { + data: VitableConnect::Models::EnrollmentRetrieveResponse::Data + } + end + end + + def test_reissue + skip("Mock server tests are disabled") + + response = @vitable_connect.enrollments.reissue("enrl_AAAAAAAAAAAAAAAAAAAAAQ") + + assert_pattern do + response => VitableConnect::Models::EnrollmentReissueResponse + end + + assert_pattern do + response => { + data: VitableConnect::Models::EnrollmentReissueResponse::Data + } + end + end + + def test_terminate + skip("Mock server tests are disabled") + + response = @vitable_connect.enrollments.terminate("enrl_AAAAAAAAAAAAAAAAAAAAAQ") + + assert_pattern do + response => nil + end + end +end diff --git a/test/vitable_connect/resources/groups/members/sync_test.rb b/test/vitable_connect/resources/groups/members/sync_test.rb new file mode 100644 index 0000000..205e146 --- /dev/null +++ b/test/vitable_connect/resources/groups/members/sync_test.rb @@ -0,0 +1,55 @@ +# frozen_string_literal: true + +require_relative "../../../test_helper" + +class VitableConnect::Test::Resources::Groups::Members::SyncTest < VitableConnect::Test::ResourceTest + def test_retrieve_required_params + skip("Mock server tests are disabled") + + response = @vitable_connect.groups.members.sync.retrieve("request_id", group_id: "grp_abc123def456") + + assert_pattern do + response => VitableConnect::Models::Groups::Members::SyncRetrieveResponse + end + + assert_pattern do + response => { + data: VitableConnect::Models::Groups::Members::SyncRetrieveResponse::Data + } + end + end + + def test_submit_required_params + skip("Mock server tests are disabled") + + response = + @vitable_connect.groups.members.sync.submit( + "grp_abc123def456", + members: [ + { + address: { + address_line_1: "123 Main Street", + city: "San Francisco", + state: "CA", + zipcode: "94102" + }, + date_of_birth: "1990-05-15", + first_name: "Jane", + last_name: "Doe", + plan_id: "pln_abc123def456", + reference_id: "EMP-001" + } + ] + ) + + assert_pattern do + response => VitableConnect::Models::Groups::Members::SyncSubmitResponse + end + + assert_pattern do + response => { + data: VitableConnect::Models::Groups::Members::SyncSubmitResponse::Data + } + end + end +end diff --git a/test/vitable_connect/resources/groups/members_test.rb b/test/vitable_connect/resources/groups/members_test.rb new file mode 100644 index 0000000..7c97120 --- /dev/null +++ b/test/vitable_connect/resources/groups/members_test.rb @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +require_relative "../../test_helper" + +class VitableConnect::Test::Resources::Groups::MembersTest < VitableConnect::Test::ResourceTest +end diff --git a/test/vitable_connect/resources/groups_test.rb b/test/vitable_connect/resources/groups_test.rb new file mode 100644 index 0000000..f9c5bd8 --- /dev/null +++ b/test/vitable_connect/resources/groups_test.rb @@ -0,0 +1,81 @@ +# frozen_string_literal: true + +require_relative "../test_helper" + +class VitableConnect::Test::Resources::GroupsTest < VitableConnect::Test::ResourceTest + def test_create_required_params + skip("Mock server tests are disabled") + + response = @vitable_connect.groups.create(external_reference_id: "mol_seg_001", name: "Tier 1") + + assert_pattern do + response => VitableConnect::GroupResponse + end + + assert_pattern do + response => { + data: VitableConnect::Group + } + end + end + + def test_retrieve + skip("Mock server tests are disabled") + + response = @vitable_connect.groups.retrieve("grp_abc123def456") + + assert_pattern do + response => VitableConnect::GroupResponse + end + + assert_pattern do + response => { + data: VitableConnect::Group + } + end + end + + def test_update + skip("Mock server tests are disabled") + + response = @vitable_connect.groups.update("grp_abc123def456") + + assert_pattern do + response => VitableConnect::GroupResponse + end + + assert_pattern do + response => { + data: VitableConnect::Group + } + end + end + + def test_list + skip("Mock server tests are disabled") + + response = @vitable_connect.groups.list + + assert_pattern do + response => VitableConnect::Internal::PageNumberPage + end + + row = response.to_enum.first + return if row.nil? + + assert_pattern do + row => VitableConnect::Group + end + + assert_pattern do + row => { + id: String, + created_at: Time | nil, + external_reference_id: String, + name: String, + organization_id: String, + updated_at: Time | nil + } + end + end +end diff --git a/test/vitable_connect/resources/members_test.rb b/test/vitable_connect/resources/members_test.rb new file mode 100644 index 0000000..03e9813 --- /dev/null +++ b/test/vitable_connect/resources/members_test.rb @@ -0,0 +1,157 @@ +# frozen_string_literal: true + +require_relative "../test_helper" + +class VitableConnect::Test::Resources::MembersTest < VitableConnect::Test::ResourceTest + def test_retrieve + skip("Mock server tests are disabled") + + response = @vitable_connect.members.retrieve("mbr_abc123def456") + + assert_pattern do + response => VitableConnect::Models::MemberRetrieveResponse + end + + assert_pattern do + response => { + data: VitableConnect::Models::MemberRetrieveResponse::Data + } + end + end + + def test_list + skip("Mock server tests are disabled") + + response = @vitable_connect.members.list + + assert_pattern do + response => VitableConnect::Internal::PageNumberPage + end + + row = response.to_enum.first + return if row.nil? + + assert_pattern do + row => VitableConnect::Models::MemberListResponse + end + + assert_pattern do + row => { + id: String, + first_name: String, + last_name: String, + address: VitableConnect::Models::MemberListResponse::Address | nil, + email: String | nil, + phone: String | nil + } + end + end + + def test_list_dependents + skip("Mock server tests are disabled") + + response = @vitable_connect.members.list_dependents("mbr_abc123def456") + + assert_pattern do + response => VitableConnect::Models::MemberListDependentsResponse + end + + assert_pattern do + response => { + data: ^(VitableConnect::Internal::Type::ArrayOf[VitableConnect::Models::MemberListDependentsResponse::Data]) + } + end + end + + def test_list_employments + skip("Mock server tests are disabled") + + response = @vitable_connect.members.list_employments("mbr_abc123def456") + + assert_pattern do + response => VitableConnect::Models::MemberListEmploymentsResponse + end + + assert_pattern do + response => { + data: ^(VitableConnect::Internal::Type::ArrayOf[VitableConnect::Employee]) + } + end + end + + def test_list_enrollments + skip("Mock server tests are disabled") + + response = @vitable_connect.members.list_enrollments("mbr_abc123def456") + + assert_pattern do + response => VitableConnect::Models::MemberListEnrollmentsResponse + end + + assert_pattern do + response => { + data: ^(VitableConnect::Internal::Type::ArrayOf[VitableConnect::Models::MemberListEnrollmentsResponse::Data]) + } + end + end + + def test_list_id_cards + skip("Mock server tests are disabled") + + response = @vitable_connect.members.list_id_cards("mbr_abc123def456") + + assert_pattern do + response => VitableConnect::Models::MemberListIDCardsResponse + end + + assert_pattern do + response => { + data: ^(VitableConnect::Internal::Type::ArrayOf[VitableConnect::Models::MemberListIDCardsResponse::Data]) + } + end + end + + def test_list_qualifying_life_events + skip("Mock server tests are disabled") + + response = @vitable_connect.members.list_qualifying_life_events("mbr_abc123def456") + + assert_pattern do + response => VitableConnect::Internal::PageNumberPage + end + + row = response.to_enum.first + return if row.nil? + + assert_pattern do + row => VitableConnect::Models::MemberListQualifyingLifeEventsResponse + end + + assert_pattern do + row => { + id: String, + event_type: VitableConnect::Models::MemberListQualifyingLifeEventsResponse::EventType, + event_type_label: String, + other_event: String | nil, + status: VitableConnect::Models::MemberListQualifyingLifeEventsResponse::Status, + submitted_at: Time + } + end + end + + def test_retrieve_household + skip("Mock server tests are disabled") + + response = @vitable_connect.members.retrieve_household("mbr_abc123def456") + + assert_pattern do + response => VitableConnect::Models::MemberRetrieveHouseholdResponse + end + + assert_pattern do + response => { + data: ^(VitableConnect::Internal::Type::ArrayOf[VitableConnect::Models::MemberRetrieveHouseholdResponse::Data]) + } + end + end +end diff --git a/test/vitable_connect/resources/organizations_test.rb b/test/vitable_connect/resources/organizations_test.rb new file mode 100644 index 0000000..ffd63d6 --- /dev/null +++ b/test/vitable_connect/resources/organizations_test.rb @@ -0,0 +1,43 @@ +# frozen_string_literal: true + +require_relative "../test_helper" + +class VitableConnect::Test::Resources::OrganizationsTest < VitableConnect::Test::ResourceTest + def test_create_required_params + skip("Mock server tests are disabled") + + response = @vitable_connect.organizations.create(name: "Acme Brokerage") + + assert_pattern do + response => VitableConnect::Models::OrganizationCreateResponse + end + + assert_pattern do + response => { + id: String, + idp_org_id: String | nil, + idp_provider: VitableConnect::Models::OrganizationCreateResponse::IdpProvider | nil, + name: String, + super_in: VitableConnect::Internal::Type::Boolean, + type: VitableConnect::Models::OrganizationCreateResponse::Type | nil + } + end + end + + def test_list + skip("Mock server tests are disabled") + + response = @vitable_connect.organizations.list + + assert_pattern do + response => VitableConnect::Models::OrganizationListResponse + end + + assert_pattern do + response => { + organizations: ^(VitableConnect::Internal::Type::ArrayOf[VitableConnect::Models::OrganizationListResponse::Organization]), + total: Integer + } + end + end +end diff --git a/test/vitable_connect/resources/plans_test.rb b/test/vitable_connect/resources/plans_test.rb new file mode 100644 index 0000000..384731a --- /dev/null +++ b/test/vitable_connect/resources/plans_test.rb @@ -0,0 +1,29 @@ +# frozen_string_literal: true + +require_relative "../test_helper" + +class VitableConnect::Test::Resources::PlansTest < VitableConnect::Test::ResourceTest + def test_list + skip("Mock server tests are disabled") + + response = @vitable_connect.plans.list + + assert_pattern do + response => VitableConnect::Internal::PageNumberPage + end + + row = response.to_enum.first + return if row.nil? + + assert_pattern do + row => VitableConnect::Models::PlanListResponse + end + + assert_pattern do + row => { + id: String, + name: String + } + end + end +end diff --git a/test/vitable_connect/resources/webhook_events_test.rb b/test/vitable_connect/resources/webhook_events_test.rb new file mode 100644 index 0000000..03e6d3b --- /dev/null +++ b/test/vitable_connect/resources/webhook_events_test.rb @@ -0,0 +1,65 @@ +# frozen_string_literal: true + +require_relative "../test_helper" + +class VitableConnect::Test::Resources::WebhookEventsTest < VitableConnect::Test::ResourceTest + def test_retrieve + skip("Mock server tests are disabled") + + response = @vitable_connect.webhook_events.retrieve("event_id") + + assert_pattern do + response => VitableConnect::Models::WebhookEventRetrieveResponse + end + + assert_pattern do + response => { + data: VitableConnect::WebhookEvent + } + end + end + + def test_list + skip("Mock server tests are disabled") + + response = @vitable_connect.webhook_events.list + + assert_pattern do + response => VitableConnect::Internal::PageNumberPage + end + + row = response.to_enum.first + return if row.nil? + + assert_pattern do + row => VitableConnect::WebhookEvent + end + + assert_pattern do + row => { + id: String, + created_at: Time, + event_name: String, + organization_id: String, + resource_id: String, + resource_type: String + } + end + end + + def test_list_deliveries + skip("Mock server tests are disabled") + + response = @vitable_connect.webhook_events.list_deliveries("event_id") + + assert_pattern do + response => VitableConnect::Models::WebhookEventListDeliveriesResponse + end + + assert_pattern do + response => { + data: ^(VitableConnect::Internal::Type::ArrayOf[VitableConnect::Models::WebhookEventListDeliveriesResponse::Data]) + } + end + end +end diff --git a/test/vitable_connect/test_helper.rb b/test/vitable_connect/test_helper.rb new file mode 100644 index 0000000..18b548f --- /dev/null +++ b/test/vitable_connect/test_helper.rb @@ -0,0 +1,87 @@ +# frozen_string_literal: true + +# Requiring this file from each test file ensures we always do the following, even +# when running a single-file test: +# - Load the whole gem (as one would in production) +# - Define shared testing namespace so that we don't need to indent test files as much +# - Setting up testing dependencies + +require "digest" +require "singleton" + +require "async" +require "minitest/autorun" +require "minitest/focus" +require "minitest/hooks/test" +require "minitest/proveit" +require "minitest/rg" +require "webmock" + +require_relative "../../lib/vitable_connect" +require_relative "resource_namespaces" + +module Kernel + alias_method :_sleep, :sleep + + def sleep(secs) + case Thread.current.thread_variable_get(:mock_sleep) + in Array => counter + counter << secs + secs + else + _sleep(secs) + end + end +end + +class Time + class << self + alias_method :_now, :now + end + + def self.now = Thread.current.thread_variable_get(:time_now) || _now +end + +class VitableConnect::Test::SingletonClient < VitableConnect::Client + include Singleton + + TEST_API_BASE_URL = ENV.fetch("TEST_API_BASE_URL", "http://localhost:4010") + + def initialize + super(base_url: VitableConnect::Test::SingletonClient::TEST_API_BASE_URL, api_key: "My API Key") + end +end + +module Minitest::Serial + def test_order = :random + + def run_one_method(...) = Minitest::Runnable.run_one_method(...) +end + +class Minitest::Test + include Minitest::Hooks + + make_my_diffs_pretty! + parallelize_me! + prove_it! +end + +class VitableConnect::Test::ResourceTest < Minitest::Test + def async? + return @async unless @async.nil? + @async = Digest::SHA256.hexdigest(self.class.name).to_i(16).odd? + end + + def before_all + super + @vitable_connect = VitableConnect::Test::SingletonClient.instance + end + + def around_all = async? ? Sync { super } : super + + def around = async? ? Async { super }.wait : super +end + +module WebMock + AssertionFailure.error_class = Minitest::Assertion +end diff --git a/vitable_connect.gemspec b/vitable_connect.gemspec new file mode 100644 index 0000000..88b56c6 --- /dev/null +++ b/vitable_connect.gemspec @@ -0,0 +1,29 @@ +# frozen_string_literal: true + +require_relative "lib/vitable_connect/version" + +Gem::Specification.new do |s| + s.name = "vitable-connect" + s.version = VitableConnect::VERSION + s.summary = "Ruby library to access the Vitable Connect API" + s.authors = ["Vitable Connect"] + s.email = "dev@vitablehealth.com" + s.homepage = "https://gemdocs.org/gems/vitable-connect" + s.metadata["homepage_uri"] = s.homepage + s.metadata["source_code_uri"] = "https://github.com/Vitable-Inc/vitable-connect-ruby" + s.metadata["rubygems_mfa_required"] = false.to_s + s.required_ruby_version = ">= 3.2.0" + + s.files = Dir[ + "lib/**/*.rb", + "rbi/**/*.rbi", + "sig/**/*.rbs", + "manifest.yaml", + "SECURITY.md", + "CHANGELOG.md", + ".ignore" + ] + s.extra_rdoc_files = ["README.md"] + s.add_dependency "cgi" + s.add_dependency "connection_pool" +end From 5ccdc75d90cc8bd00335b74da9d1b8ab940b6e1a Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Tue, 8 Sep 2026 16:40:57 +0000 Subject: [PATCH 2/3] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index 19c28af..b1e854b 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 45 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/vitable/vitable-connect-c3a225d6201981c24180c285dd0d8a6ed97544f9e4e6a734130ead4231063f5e.yml -openapi_spec_hash: 05748169a4747ace4fcb717d9c87458c +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/vitable/vitable-connect-ed962000eda6b30d84f37c29546fcc14fab2805e3f8bcf311ef46fe03bfb1165.yml +openapi_spec_hash: 22a93ea35199f43e267e960cd2a34903 config_hash: 0b4d62a9a1e0cc71998bcfc3d15c4db7 From 759de4f183bf3aa26fd01062c46368ba1d7d5c14 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Tue, 8 Sep 2026 16:41:26 +0000 Subject: [PATCH 3/3] release: 0.6.1 --- .release-please-manifest.json | 2 +- CHANGELOG.md | 13 +++++++++++++ Gemfile.lock | 2 +- README.md | 2 +- lib/vitable_connect/version.rb | 2 +- 5 files changed, 17 insertions(+), 4 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 4208b5c..ac03171 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "0.6.0" + ".": "0.6.1" } \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 2b8a2c2..0479f50 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,18 @@ # Changelog +## 0.6.1 (2026-09-08) + +Full Changelog: [v0.6.0...v0.6.1](https://github.com/Vitable-Inc/vitable-connect-ruby/compare/v0.6.0...v0.6.1) + +### Bug Fixes + +* rubocop entrypoint exclusion + legacy require shim ([4eedc17](https://github.com/Vitable-Inc/vitable-connect-ruby/commit/4eedc172358068e4851075710c0ff74836c3df57)) + + +### Chores + +* sync repo ([8f04bbd](https://github.com/Vitable-Inc/vitable-connect-ruby/commit/8f04bbdb9df9b19bbdfd3636f19e7f27eeb84ce4)) + ## 0.6.0 (2026-08-20) Full Changelog: [v0.5.0...v0.6.0](https://github.com/Vitable-Inc/vitable-connect-ruby/compare/v0.5.0...v0.6.0) diff --git a/Gemfile.lock b/Gemfile.lock index 2346c80..5d93e02 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -11,7 +11,7 @@ GIT PATH remote: . specs: - vitable-connect (0.6.0) + vitable-connect (0.6.1) cgi connection_pool diff --git a/README.md b/README.md index 15f565a..900fef9 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ To use this gem, install via Bundler by adding the following to your application ```ruby -gem "vitable-connect", "~> 0.6.0" +gem "vitable-connect", "~> 0.6.1" ``` diff --git a/lib/vitable_connect/version.rb b/lib/vitable_connect/version.rb index 2d069ea..96d1d93 100644 --- a/lib/vitable_connect/version.rb +++ b/lib/vitable_connect/version.rb @@ -1,5 +1,5 @@ # frozen_string_literal: true module VitableConnect - VERSION = "0.6.0" + VERSION = "0.6.1" end