usps-imis-api 0.15.3 → 1.0.0.pre.rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (542) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/main.yml +57 -0
  3. data/.gitignore +4 -0
  4. data/.rspec +2 -0
  5. data/.rubocop.yml +88 -0
  6. data/.ruby-version +1 -0
  7. data/.simplecov +8 -0
  8. data/Gemfile +12 -0
  9. data/Gemfile.lock +95 -0
  10. data/Rakefile +12 -0
  11. data/Readme.md +193 -25
  12. data/bin/console +21 -0
  13. data/bin/setup +8 -0
  14. data/lib/ext/hash.rb +10 -0
  15. data/lib/usps/imis/api.rb +135 -245
  16. data/lib/usps/imis/config.rb +10 -156
  17. data/lib/usps/imis/error/api.rb +26 -0
  18. data/lib/usps/imis/error/mapper.rb +9 -0
  19. data/lib/usps/imis/error/response.rb +75 -0
  20. data/lib/usps/imis/mapper.rb +21 -91
  21. data/lib/usps/imis/panel/base_panel.rb +42 -0
  22. data/lib/usps/imis/panel/education.rb +111 -0
  23. data/lib/usps/imis/panel/vsc.rb +109 -0
  24. data/lib/usps/imis/version.rb +1 -1
  25. data/lib/usps/imis.rb +23 -33
  26. data/spec/lib/usps/imis/api_spec.rb +143 -0
  27. data/spec/lib/usps/imis/config_spec.rb +33 -0
  28. data/spec/lib/usps/imis/error/api_spec.rb +17 -0
  29. data/spec/lib/usps/imis/error/response_spec.rb +107 -0
  30. data/spec/lib/usps/imis/mapper_spec.rb +31 -0
  31. data/spec/lib/usps/imis/panel/base_panel_spec.rb +32 -0
  32. data/spec/lib/usps/imis/panel/education_spec.rb +55 -0
  33. data/spec/lib/usps/imis/panel/vsc_spec.rb +38 -0
  34. data/spec/lib/usps/imis_spec.rb +11 -0
  35. data/spec/spec_helper.rb +35 -0
  36. data/usps-imis-api.gemspec +18 -0
  37. metadata +34 -596
  38. data/bin/imis +0 -8
  39. data/lib/usps/imis/base_data.rb +0 -87
  40. data/lib/usps/imis/blank_object.rb +0 -62
  41. data/lib/usps/imis/business_object.rb +0 -252
  42. data/lib/usps/imis/command_line/formatters.rb +0 -101
  43. data/lib/usps/imis/command_line/help.rb +0 -204
  44. data/lib/usps/imis/command_line/interface.rb +0 -186
  45. data/lib/usps/imis/command_line/options.yml +0 -167
  46. data/lib/usps/imis/command_line/options_parser.rb +0 -158
  47. data/lib/usps/imis/command_line/options_parser_config.rb +0 -82
  48. data/lib/usps/imis/command_line/performers.rb +0 -90
  49. data/lib/usps/imis/command_line.rb +0 -18
  50. data/lib/usps/imis/data.rb +0 -60
  51. data/lib/usps/imis/dependencies.rb +0 -33
  52. data/lib/usps/imis/error.rb +0 -53
  53. data/lib/usps/imis/errors/ambiguous_certificate_error.rb +0 -21
  54. data/lib/usps/imis/errors/api_error.rb +0 -11
  55. data/lib/usps/imis/errors/command_line_error.rb +0 -11
  56. data/lib/usps/imis/errors/config_error.rb +0 -11
  57. data/lib/usps/imis/errors/embedded_model_find_error.rb +0 -20
  58. data/lib/usps/imis/errors/empty_payload_error.rb +0 -23
  59. data/lib/usps/imis/errors/locked_id_error.rb +0 -15
  60. data/lib/usps/imis/errors/mapper_error.rb +0 -29
  61. data/lib/usps/imis/errors/missing_id_error.rb +0 -15
  62. data/lib/usps/imis/errors/missing_party_field_error.rb +0 -24
  63. data/lib/usps/imis/errors/not_found_error.rb +0 -11
  64. data/lib/usps/imis/errors/panel_unimplemented_error.rb +0 -34
  65. data/lib/usps/imis/errors/pattern_matching_error.rb +0 -23
  66. data/lib/usps/imis/errors/response_error.rb +0 -104
  67. data/lib/usps/imis/errors/unexpected_property_type_error.rb +0 -31
  68. data/lib/usps/imis/helpers.rb +0 -23
  69. data/lib/usps/imis/logger.rb +0 -40
  70. data/lib/usps/imis/logger_formatter.rb +0 -39
  71. data/lib/usps/imis/logger_helpers.rb +0 -39
  72. data/lib/usps/imis/mocks/business_object.rb +0 -47
  73. data/lib/usps/imis/mocks.rb +0 -11
  74. data/lib/usps/imis/models/associations/individual_demog.rb +0 -11
  75. data/lib/usps/imis/models/base/finders.rb +0 -80
  76. data/lib/usps/imis/models/base/persistence.rb +0 -110
  77. data/lib/usps/imis/models/base.rb +0 -279
  78. data/lib/usps/imis/models/education.rb +0 -25
  79. data/lib/usps/imis/models/generated/abc_cs_contact.rb +0 -91
  80. data/lib/usps/imis/models/generated/abc_fed990.rb +0 -17
  81. data/lib/usps/imis/models/generated/abc_ps_volunteer_skills.rb +0 -16
  82. data/lib/usps/imis/models/generated/access_area.rb +0 -22
  83. data/lib/usps/imis/models/generated/access_item.rb +0 -18
  84. data/lib/usps/imis/models/generated/access_main.rb +0 -18
  85. data/lib/usps/imis/models/generated/action_plan.rb +0 -21
  86. data/lib/usps/imis/models/generated/activity.rb +0 -57
  87. data/lib/usps/imis/models/generated/activity_ldao.rb +0 -58
  88. data/lib/usps/imis/models/generated/activity_ldcdr.rb +0 -57
  89. data/lib/usps/imis/models/generated/activity_ldxo.rb +0 -57
  90. data/lib/usps/imis/models/generated/add_family.rb +0 -13
  91. data/lib/usps/imis/models/generated/advanced_email_twelve_months_delivered_by_date.rb +0 -16
  92. data/lib/usps/imis/models/generated/advanced_email_twelve_months_totals.rb +0 -16
  93. data/lib/usps/imis/models/generated/aec_chapter_events.rb +0 -28
  94. data/lib/usps/imis/models/generated/aec_chapter_link_all_events.rb +0 -18
  95. data/lib/usps/imis/models/generated/aec_district_administrators.rb +0 -19
  96. data/lib/usps/imis/models/generated/aec_district_squadron_admins.rb +0 -14
  97. data/lib/usps/imis/models/generated/aec_district_squadron_events.rb +0 -15
  98. data/lib/usps/imis/models/generated/aec_si_r_charge_fee_percentages.rb +0 -14
  99. data/lib/usps/imis/models/generated/aec_si_r_charge_params.rb +0 -16
  100. data/lib/usps/imis/models/generated/appeal.rb +0 -39
  101. data/lib/usps/imis/models/generated/appeal_status_ref.rb +0 -15
  102. data/lib/usps/imis/models/generated/asc_ps_abc_squadron_price.rb +0 -25
  103. data/lib/usps/imis/models/generated/atom_panel_purpose.rb +0 -15
  104. data/lib/usps/imis/models/generated/auto_pay_instruction_detail.rb +0 -22
  105. data/lib/usps/imis/models/generated/auto_pay_invoices.rb +0 -24
  106. data/lib/usps/imis/models/generated/auto_pay_invoices_dues.rb +0 -29
  107. data/lib/usps/imis/models/generated/auto_pay_member_instruction_detail.rb +0 -22
  108. data/lib/usps/imis/models/generated/auto_pay_membership_invoices_base.rb +0 -28
  109. data/lib/usps/imis/models/generated/bad_address_reason_ref.rb +0 -18
  110. data/lib/usps/imis/models/generated/batch_line_status_ref.rb +0 -14
  111. data/lib/usps/imis/models/generated/billing_cycles.rb +0 -50
  112. data/lib/usps/imis/models/generated/billing_fees.rb +0 -61
  113. data/lib/usps/imis/models/generated/billing_fees_by_bill_to_party.rb +0 -20
  114. data/lib/usps/imis/models/generated/billing_issue_notification_by_bill_run.rb +0 -20
  115. data/lib/usps/imis/models/generated/billing_issue_notification_by_party.rb +0 -30
  116. data/lib/usps/imis/models/generated/billing_log_by_bill_cycle_data.rb +0 -28
  117. data/lib/usps/imis/models/generated/billing_log_by_party.rb +0 -29
  118. data/lib/usps/imis/models/generated/billing_product.rb +0 -30
  119. data/lib/usps/imis/models/generated/bo_district_dues.rb +0 -26
  120. data/lib/usps/imis/models/generated/bo_dues_fees.rb +0 -21
  121. data/lib/usps/imis/models/generated/bo_dues_pricing.rb +0 -18
  122. data/lib/usps/imis/models/generated/bo_national_dues.rb +0 -84
  123. data/lib/usps/imis/models/generated/bo_no_natl_dist_dues.rb +0 -135
  124. data/lib/usps/imis/models/generated/bo_squadron_dues.rb +0 -26
  125. data/lib/usps/imis/models/generated/bo_total.rb +0 -17
  126. data/lib/usps/imis/models/generated/campaign.rb +0 -42
  127. data/lib/usps/imis/models/generated/campaign_status_ref.rb +0 -15
  128. data/lib/usps/imis/models/generated/campaign_type_ref.rb +0 -15
  129. data/lib/usps/imis/models/generated/certification_module_status.rb +0 -14
  130. data/lib/usps/imis/models/generated/change_log_report.rb +0 -25
  131. data/lib/usps/imis/models/generated/change_property.rb +0 -18
  132. data/lib/usps/imis/models/generated/chapt_subscriptions.rb +0 -14
  133. data/lib/usps/imis/models/generated/chapter.rb +0 -15
  134. data/lib/usps/imis/models/generated/chapter_events.rb +0 -30
  135. data/lib/usps/imis/models/generated/commerce_product.rb +0 -47
  136. data/lib/usps/imis/models/generated/commission_rate_type_ref.rb +0 -14
  137. data/lib/usps/imis/models/generated/committee.rb +0 -16
  138. data/lib/usps/imis/models/generated/committee_districts_org_id.rb +0 -16
  139. data/lib/usps/imis/models/generated/committee_i_ds_temp.rb +0 -13
  140. data/lib/usps/imis/models/generated/committee_squadrons_org_id.rb +0 -16
  141. data/lib/usps/imis/models/generated/communication_log_summary_for_charts.rb +0 -15
  142. data/lib/usps/imis/models/generated/communication_message_type_ref.rb +0 -14
  143. data/lib/usps/imis/models/generated/communication_reason_ref.rb +0 -22
  144. data/lib/usps/imis/models/generated/community_items.rb +0 -25
  145. data/lib/usps/imis/models/generated/community_subscriptions.rb +0 -25
  146. data/lib/usps/imis/models/generated/comparison_ref.rb +0 -14
  147. data/lib/usps/imis/models/generated/component_registry.rb +0 -28
  148. data/lib/usps/imis/models/generated/contact.rb +0 -32
  149. data/lib/usps/imis/models/generated/contact_birthday_info.rb +0 -20
  150. data/lib/usps/imis/models/generated/contact_communication_reason_preferences.rb +0 -25
  151. data/lib/usps/imis/models/generated/contact_detail_report.rb +0 -49
  152. data/lib/usps/imis/models/generated/contact_offering_ref.rb +0 -14
  153. data/lib/usps/imis/models/generated/contact_profile_image.rb +0 -22
  154. data/lib/usps/imis/models/generated/contact_report.rb +0 -23
  155. data/lib/usps/imis/models/generated/contact_salutation.rb +0 -18
  156. data/lib/usps/imis/models/generated/contact_skill_ref.rb +0 -14
  157. data/lib/usps/imis/models/generated/contact_social_network.rb +0 -19
  158. data/lib/usps/imis/models/generated/contact_status_ref.rb +0 -15
  159. data/lib/usps/imis/models/generated/contact_type_ref.rb +0 -16
  160. data/lib/usps/imis/models/generated/content_filter.rb +0 -18
  161. data/lib/usps/imis/models/generated/content_manager_authority_group.rb +0 -14
  162. data/lib/usps/imis/models/generated/cost_method_ref.rb +0 -15
  163. data/lib/usps/imis/models/generated/country_ref.rb +0 -27
  164. data/lib/usps/imis/models/generated/credit_type_ref.rb +0 -14
  165. data/lib/usps/imis/models/generated/cs_activity.rb +0 -50
  166. data/lib/usps/imis/models/generated/cs_activity_basic.rb +0 -51
  167. data/lib/usps/imis/models/generated/cs_activity_forms.rb +0 -38
  168. data/lib/usps/imis/models/generated/cs_activity_types.rb +0 -16
  169. data/lib/usps/imis/models/generated/cs_address.rb +0 -40
  170. data/lib/usps/imis/models/generated/cs_address_formats.rb +0 -15
  171. data/lib/usps/imis/models/generated/cs_appeal.rb +0 -23
  172. data/lib/usps/imis/models/generated/cs_calls.rb +0 -20
  173. data/lib/usps/imis/models/generated/cs_campaign.rb +0 -20
  174. data/lib/usps/imis/models/generated/cs_committee.rb +0 -23
  175. data/lib/usps/imis/models/generated/cs_committee_code.rb +0 -20
  176. data/lib/usps/imis/models/generated/cs_committee_member.rb +0 -38
  177. data/lib/usps/imis/models/generated/cs_committee_member_group.rb +0 -15
  178. data/lib/usps/imis/models/generated/cs_committee_position.rb +0 -16
  179. data/lib/usps/imis/models/generated/cs_contact.rb +0 -91
  180. data/lib/usps/imis/models/generated/cs_contact_basic.rb +0 -79
  181. data/lib/usps/imis/models/generated/cs_country_names.rb +0 -19
  182. data/lib/usps/imis/models/generated/cs_donations.rb +0 -31
  183. data/lib/usps/imis/models/generated/cs_donations_detail.rb +0 -33
  184. data/lib/usps/imis/models/generated/cs_donor_data.rb +0 -21
  185. data/lib/usps/imis/models/generated/cs_dues_history.rb +0 -22
  186. data/lib/usps/imis/models/generated/cs_event.rb +0 -92
  187. data/lib/usps/imis/models/generated/cs_event_history.rb +0 -20
  188. data/lib/usps/imis/models/generated/cs_exchange_rate.rb +0 -14
  189. data/lib/usps/imis/models/generated/cs_freight_dollar.rb +0 -14
  190. data/lib/usps/imis/models/generated/cs_function.rb +0 -57
  191. data/lib/usps/imis/models/generated/cs_function_fees.rb +0 -20
  192. data/lib/usps/imis/models/generated/cs_gen_tables_union.rb +0 -15
  193. data/lib/usps/imis/models/generated/cs_general_lookup_tables.rb +0 -17
  194. data/lib/usps/imis/models/generated/cs_inventory.rb +0 -37
  195. data/lib/usps/imis/models/generated/cs_invoice.rb +0 -51
  196. data/lib/usps/imis/models/generated/cs_iso_currency_codes.rb +0 -14
  197. data/lib/usps/imis/models/generated/cs_member_type.rb +0 -18
  198. data/lib/usps/imis/models/generated/cs_name_fin.rb +0 -27
  199. data/lib/usps/imis/models/generated/cs_name_fr.rb +0 -27
  200. data/lib/usps/imis/models/generated/cs_name_log.rb +0 -17
  201. data/lib/usps/imis/models/generated/cs_name_note.rb +0 -18
  202. data/lib/usps/imis/models/generated/cs_name_picture.rb +0 -19
  203. data/lib/usps/imis/models/generated/cs_name_user.rb +0 -18
  204. data/lib/usps/imis/models/generated/cs_order_history.rb +0 -22
  205. data/lib/usps/imis/models/generated/cs_order_lines.rb +0 -54
  206. data/lib/usps/imis/models/generated/cs_order_type.rb +0 -15
  207. data/lib/usps/imis/models/generated/cs_orders.rb +0 -85
  208. data/lib/usps/imis/models/generated/cs_org_control.rb +0 -47
  209. data/lib/usps/imis/models/generated/cs_product.rb +0 -49
  210. data/lib/usps/imis/models/generated/cs_product_category.rb +0 -18
  211. data/lib/usps/imis/models/generated/cs_product_fundraising.rb +0 -22
  212. data/lib/usps/imis/models/generated/cs_product_location.rb +0 -14
  213. data/lib/usps/imis/models/generated/cs_product_type.rb +0 -14
  214. data/lib/usps/imis/models/generated/cs_reg_functions.rb +0 -36
  215. data/lib/usps/imis/models/generated/cs_registrant_classes.rb +0 -15
  216. data/lib/usps/imis/models/generated/cs_registration.rb +0 -39
  217. data/lib/usps/imis/models/generated/cs_relationship.rb +0 -25
  218. data/lib/usps/imis/models/generated/cs_relationship_types.rb +0 -17
  219. data/lib/usps/imis/models/generated/cs_salutations.rb +0 -14
  220. data/lib/usps/imis/models/generated/cs_staff_user.rb +0 -34
  221. data/lib/usps/imis/models/generated/cs_state_province_codes.rb +0 -15
  222. data/lib/usps/imis/models/generated/cs_subscriptions.rb +0 -58
  223. data/lib/usps/imis/models/generated/cs_subscriptions_chapters.rb +0 -15
  224. data/lib/usps/imis/models/generated/cs_system_params.rb +0 -15
  225. data/lib/usps/imis/models/generated/cs_terms.rb +0 -17
  226. data/lib/usps/imis/models/generated/cs_trans_notify.rb +0 -16
  227. data/lib/usps/imis/models/generated/cs_web_security_group.rb +0 -14
  228. data/lib/usps/imis/models/generated/cs_web_user.rb +0 -18
  229. data/lib/usps/imis/models/generated/culture_ref.rb +0 -14
  230. data/lib/usps/imis/models/generated/customer_experience_status.rb +0 -14
  231. data/lib/usps/imis/models/generated/data_type.rb +0 -16
  232. data/lib/usps/imis/models/generated/data_vault_attempt_settlement_status_ref.rb +0 -15
  233. data/lib/usps/imis/models/generated/data_vault_attempt_status_ref.rb +0 -14
  234. data/lib/usps/imis/models/generated/data_vault_attempt_summary.rb +0 -39
  235. data/lib/usps/imis/models/generated/data_vault_batch_summary.rb +0 -21
  236. data/lib/usps/imis/models/generated/data_vault_log_attempt.rb +0 -25
  237. data/lib/usps/imis/models/generated/data_vault_status_ref.rb +0 -14
  238. data/lib/usps/imis/models/generated/data_vault_status_summary.rb +0 -15
  239. data/lib/usps/imis/models/generated/data_vault_status_summary_detail.rb +0 -19
  240. data/lib/usps/imis/models/generated/date_dimension.rb +0 -24
  241. data/lib/usps/imis/models/generated/day_of_the_week_ref.rb +0 -14
  242. data/lib/usps/imis/models/generated/discountable_item.rb +0 -20
  243. data/lib/usps/imis/models/generated/discountable_item_class.rb +0 -15
  244. data/lib/usps/imis/models/generated/distinct_user_defined_multi_select_properties.rb +0 -17
  245. data/lib/usps/imis/models/generated/districts_and_primary_members.rb +0 -15
  246. data/lib/usps/imis/models/generated/document_path.rb +0 -14
  247. data/lib/usps/imis/models/generated/document_storage.rb +0 -23
  248. data/lib/usps/imis/models/generated/document_system_size_info.rb +0 -36
  249. data/lib/usps/imis/models/generated/document_system_size_info_by_type.rb +0 -37
  250. data/lib/usps/imis/models/generated/document_system_status_count_info.rb +0 -14
  251. data/lib/usps/imis/models/generated/document_system_status_size_info.rb +0 -15
  252. data/lib/usps/imis/models/generated/document_system_type_count_info.rb +0 -14
  253. data/lib/usps/imis/models/generated/document_system_type_size_info.rb +0 -15
  254. data/lib/usps/imis/models/generated/document_type.rb +0 -34
  255. data/lib/usps/imis/models/generated/document_type_status_path_info.rb +0 -28
  256. data/lib/usps/imis/models/generated/donation.rb +0 -31
  257. data/lib/usps/imis/models/generated/donation_performance.rb +0 -19
  258. data/lib/usps/imis/models/generated/donation_summary.rb +0 -36
  259. data/lib/usps/imis/models/generated/dynamic_group.rb +0 -18
  260. data/lib/usps/imis/models/generated/educ_abc.rb +0 -21
  261. data/lib/usps/imis/models/generated/educ_boc.rb +0 -21
  262. data/lib/usps/imis/models/generated/educ_crs.rb +0 -21
  263. data/lib/usps/imis/models/generated/educ_id.rb +0 -21
  264. data/lib/usps/imis/models/generated/educ_ot.rb +0 -21
  265. data/lib/usps/imis/models/generated/educ_sem.rb +0 -21
  266. data/lib/usps/imis/models/generated/education_in_progress.rb +0 -16
  267. data/lib/usps/imis/models/generated/education_level_ref.rb +0 -15
  268. data/lib/usps/imis/models/generated/effective_contact_communication_preferences_data.rb +0 -23
  269. data/lib/usps/imis/models/generated/effective_fundraising_preferences_data.rb +0 -18
  270. data/lib/usps/imis/models/generated/engagement_category.rb +0 -23
  271. data/lib/usps/imis/models/generated/engagement_measure.rb +0 -24
  272. data/lib/usps/imis/models/generated/engagement_score_current_data.rb +0 -21
  273. data/lib/usps/imis/models/generated/engagement_score_formula.rb +0 -19
  274. data/lib/usps/imis/models/generated/engagement_score_monthly_data.rb +0 -22
  275. data/lib/usps/imis/models/generated/engagement_score_result.rb +0 -21
  276. data/lib/usps/imis/models/generated/engagement_score_yearly_data.rb +0 -21
  277. data/lib/usps/imis/models/generated/event_category_list.rb +0 -16
  278. data/lib/usps/imis/models/generated/event_function_resource_data.rb +0 -22
  279. data/lib/usps/imis/models/generated/event_question.rb +0 -24
  280. data/lib/usps/imis/models/generated/event_question_response.rb +0 -25
  281. data/lib/usps/imis/models/generated/event_registrants_report.rb +0 -45
  282. data/lib/usps/imis/models/generated/execution_mode_ref.rb +0 -15
  283. data/lib/usps/imis/models/generated/experience_definition_status.rb +0 -14
  284. data/lib/usps/imis/models/generated/expired_member_update_detail_log.rb +0 -19
  285. data/lib/usps/imis/models/generated/family_add_contact.rb +0 -91
  286. data/lib/usps/imis/models/generated/family_member_count.rb +0 -37
  287. data/lib/usps/imis/models/generated/file_type_ref.rb +0 -16
  288. data/lib/usps/imis/models/generated/first_notify_contact_per_gift.rb +0 -14
  289. data/lib/usps/imis/models/generated/first_payment_date_type_ref.rb +0 -15
  290. data/lib/usps/imis/models/generated/form_definition_field_data.rb +0 -19
  291. data/lib/usps/imis/models/generated/form_field_response_data.rb +0 -22
  292. data/lib/usps/imis/models/generated/fundraising_preference_ref.rb +0 -15
  293. data/lib/usps/imis/models/generated/fundraising_profile_donor_data.rb +0 -18
  294. data/lib/usps/imis/models/generated/gateway_result_ref.rb +0 -14
  295. data/lib/usps/imis/models/generated/gateway_transaction_data.rb +0 -35
  296. data/lib/usps/imis/models/generated/gateway_transaction_ref.rb +0 -15
  297. data/lib/usps/imis/models/generated/gateway_type_ref.rb +0 -17
  298. data/lib/usps/imis/models/generated/gift.rb +0 -41
  299. data/lib/usps/imis/models/generated/gift_adjustment_log_summary.rb +0 -25
  300. data/lib/usps/imis/models/generated/gift_aid_claim_status_ref.rb +0 -14
  301. data/lib/usps/imis/models/generated/gift_array.rb +0 -16
  302. data/lib/usps/imis/models/generated/gift_detail.rb +0 -29
  303. data/lib/usps/imis/models/generated/gift_history.rb +0 -45
  304. data/lib/usps/imis/models/generated/gift_history_summary.rb +0 -33
  305. data/lib/usps/imis/models/generated/gift_history_summary_basic.rb +0 -33
  306. data/lib/usps/imis/models/generated/gift_summary.rb +0 -16
  307. data/lib/usps/imis/models/generated/gift_totals_by_date.rb +0 -15
  308. data/lib/usps/imis/models/generated/gift_transaction.rb +0 -43
  309. data/lib/usps/imis/models/generated/gifts_received.rb +0 -32
  310. data/lib/usps/imis/models/generated/gifts_received_for_receipting.rb +0 -44
  311. data/lib/usps/imis/models/generated/gifts_received_summary.rb +0 -33
  312. data/lib/usps/imis/models/generated/gifts_with_void_and_replaced_receipts.rb +0 -43
  313. data/lib/usps/imis/models/generated/gl_batch_transaction_data.rb +0 -30
  314. data/lib/usps/imis/models/generated/gl_daily_transaction_data.rb +0 -30
  315. data/lib/usps/imis/models/generated/gl_detail_due_to_due_from_transaction_data.rb +0 -17
  316. data/lib/usps/imis/models/generated/gl_detail_transaction_data.rb +0 -36
  317. data/lib/usps/imis/models/generated/gl_detail_transaction_data_full.rb +0 -36
  318. data/lib/usps/imis/models/generated/gl_due_to_due_from_transaction_data.rb +0 -18
  319. data/lib/usps/imis/models/generated/gl_entry_type_ref.rb +0 -14
  320. data/lib/usps/imis/models/generated/gl_export_format_type_ref.rb +0 -14
  321. data/lib/usps/imis/models/generated/gl_export_log_detail.rb +0 -15
  322. data/lib/usps/imis/models/generated/gl_export_log_summary.rb +0 -26
  323. data/lib/usps/imis/models/generated/gl_export_multiple.rb +0 -15
  324. data/lib/usps/imis/models/generated/gl_export_summary_level_ref.rb +0 -15
  325. data/lib/usps/imis/models/generated/gl_monthly_due_to_due_from_transaction_data.rb +0 -18
  326. data/lib/usps/imis/models/generated/gl_monthly_transaction_data.rb +0 -29
  327. data/lib/usps/imis/models/generated/gl_source_item_type_ref.rb +0 -14
  328. data/lib/usps/imis/models/generated/gl_transaction_data.rb +0 -41
  329. data/lib/usps/imis/models/generated/grade.rb +0 -14
  330. data/lib/usps/imis/models/generated/group_info.rb +0 -28
  331. data/lib/usps/imis/models/generated/group_member_administrator_type_ref.rb +0 -15
  332. data/lib/usps/imis/models/generated/group_member_detail.rb +0 -29
  333. data/lib/usps/imis/models/generated/group_member_status_ref.rb +0 -15
  334. data/lib/usps/imis/models/generated/group_perspective.rb +0 -16
  335. data/lib/usps/imis/models/generated/group_price_sheet.rb +0 -17
  336. data/lib/usps/imis/models/generated/group_role_ref.rb +0 -17
  337. data/lib/usps/imis/models/generated/group_status_ref.rb +0 -16
  338. data/lib/usps/imis/models/generated/group_type_member_status.rb +0 -17
  339. data/lib/usps/imis/models/generated/group_type_ref.rb +0 -33
  340. data/lib/usps/imis/models/generated/group_type_role.rb +0 -22
  341. data/lib/usps/imis/models/generated/handling_price_ref.rb +0 -15
  342. data/lib/usps/imis/models/generated/hierarchy.rb +0 -21
  343. data/lib/usps/imis/models/generated/hierarchy_root.rb +0 -22
  344. data/lib/usps/imis/models/generated/i_series_data.rb +0 -15
  345. data/lib/usps/imis/models/generated/individual_demog.rb +0 -34
  346. data/lib/usps/imis/models/generated/institute_type_code_ref.rb +0 -16
  347. data/lib/usps/imis/models/generated/interaction_log.rb +0 -35
  348. data/lib/usps/imis/models/generated/interaction_log_event.rb +0 -24
  349. data/lib/usps/imis/models/generated/interaction_log_event_summary.rb +0 -30
  350. data/lib/usps/imis/models/generated/interval_type_ref.rb +0 -15
  351. data/lib/usps/imis/models/generated/invoice_line_data.rb +0 -39
  352. data/lib/usps/imis/models/generated/invoice_lines.rb +0 -42
  353. data/lib/usps/imis/models/generated/invoice_number.rb +0 -16
  354. data/lib/usps/imis/models/generated/invoice_payment_summary.rb +0 -14
  355. data/lib/usps/imis/models/generated/invoice_purpose.rb +0 -15
  356. data/lib/usps/imis/models/generated/invoice_source_system_ref.rb +0 -13
  357. data/lib/usps/imis/models/generated/invoice_type_ref.rb +0 -14
  358. data/lib/usps/imis/models/generated/journal_entry_type_ref.rb +0 -14
  359. data/lib/usps/imis/models/generated/license_ref.rb +0 -15
  360. data/lib/usps/imis/models/generated/line_pricing_ref.rb +0 -15
  361. data/lib/usps/imis/models/generated/list_entity.rb +0 -14
  362. data/lib/usps/imis/models/generated/locale_ref.rb +0 -14
  363. data/lib/usps/imis/models/generated/location_status.rb +0 -14
  364. data/lib/usps/imis/models/generated/mail_code_ref.rb +0 -16
  365. data/lib/usps/imis/models/generated/matching_gift_plan_type_ref.rb +0 -15
  366. data/lib/usps/imis/models/generated/matching_mode_ref.rb +0 -15
  367. data/lib/usps/imis/models/generated/matching_period_ref.rb +0 -15
  368. data/lib/usps/imis/models/generated/memorial_tribute_type_ref.rb +0 -14
  369. data/lib/usps/imis/models/generated/method_set_type_ref.rb +0 -14
  370. data/lib/usps/imis/models/generated/month_ref.rb +0 -18
  371. data/lib/usps/imis/models/generated/name_prefixes.rb +0 -15
  372. data/lib/usps/imis/models/generated/name_suffixes.rb +0 -13
  373. data/lib/usps/imis/models/generated/navigation_pane.rb +0 -18
  374. data/lib/usps/imis/models/generated/net_contact.rb +0 -99
  375. data/lib/usps/imis/models/generated/net_contact_basic.rb +0 -88
  376. data/lib/usps/imis/models/generated/net_contact_data.rb +0 -88
  377. data/lib/usps/imis/models/generated/note_purpose_ref.rb +0 -14
  378. data/lib/usps/imis/models/generated/offering_status.rb +0 -14
  379. data/lib/usps/imis/models/generated/opportunity_class_ref.rb +0 -15
  380. data/lib/usps/imis/models/generated/opportunity_default_status_ref.rb +0 -15
  381. data/lib/usps/imis/models/generated/opportunity_status_ref.rb +0 -15
  382. data/lib/usps/imis/models/generated/opportunity_task_user.rb +0 -20
  383. data/lib/usps/imis/models/generated/opportunity_type.rb +0 -29
  384. data/lib/usps/imis/models/generated/order_category.rb +0 -14
  385. data/lib/usps/imis/models/generated/order_fulfillment_status_ref.rb +0 -14
  386. data/lib/usps/imis/models/generated/order_invoice.rb +0 -14
  387. data/lib/usps/imis/models/generated/order_state_ref.rb +0 -14
  388. data/lib/usps/imis/models/generated/order_type_detail.rb +0 -17
  389. data/lib/usps/imis/models/generated/org_demog.rb +0 -28
  390. data/lib/usps/imis/models/generated/organization_demo.rb +0 -18
  391. data/lib/usps/imis/models/generated/organization_hierarchy.rb +0 -19
  392. data/lib/usps/imis/models/generated/package.rb +0 -25
  393. data/lib/usps/imis/models/generated/package_item.rb +0 -19
  394. data/lib/usps/imis/models/generated/package_status_ref.rb +0 -14
  395. data/lib/usps/imis/models/generated/payment_application.rb +0 -31
  396. data/lib/usps/imis/models/generated/payment_application_detail.rb +0 -35
  397. data/lib/usps/imis/models/generated/payment_application_restriction_ref.rb +0 -14
  398. data/lib/usps/imis/models/generated/payment_application_summary.rb +0 -18
  399. data/lib/usps/imis/models/generated/payment_application_type.rb +0 -14
  400. data/lib/usps/imis/models/generated/payment_category_ref.rb +0 -14
  401. data/lib/usps/imis/models/generated/payment_detail_status_ref.rb +0 -15
  402. data/lib/usps/imis/models/generated/payment_method_data.rb +0 -20
  403. data/lib/usps/imis/models/generated/payment_reconciliation.rb +0 -26
  404. data/lib/usps/imis/models/generated/payment_status_ref.rb +0 -14
  405. data/lib/usps/imis/models/generated/percentile_ranking.rb +0 -20
  406. data/lib/usps/imis/models/generated/picture_purpose_ref.rb +0 -14
  407. data/lib/usps/imis/models/generated/pin_update.rb +0 -13
  408. data/lib/usps/imis/models/generated/pipeline.rb +0 -15
  409. data/lib/usps/imis/models/generated/pipeline_stage.rb +0 -17
  410. data/lib/usps/imis/models/generated/postal_code_ref.rb +0 -26
  411. data/lib/usps/imis/models/generated/prefix_ref.rb +0 -17
  412. data/lib/usps/imis/models/generated/price_basis_ref.rb +0 -15
  413. data/lib/usps/imis/models/generated/pricing_type_ref.rb +0 -15
  414. data/lib/usps/imis/models/generated/primary_fam_members.rb +0 -14
  415. data/lib/usps/imis/models/generated/process_type_default_owner_all_users.rb +0 -15
  416. data/lib/usps/imis/models/generated/product_price_sheet.rb +0 -20
  417. data/lib/usps/imis/models/generated/product_status_ref.rb +0 -15
  418. data/lib/usps/imis/models/generated/product_trans.rb +0 -31
  419. data/lib/usps/imis/models/generated/product_trans_detail.rb +0 -17
  420. data/lib/usps/imis/models/generated/profile_documents.rb +0 -15
  421. data/lib/usps/imis/models/generated/profile_page.rb +0 -36
  422. data/lib/usps/imis/models/generated/program_group_status.rb +0 -14
  423. data/lib/usps/imis/models/generated/program_status.rb +0 -14
  424. data/lib/usps/imis/models/generated/promotion_rule_ref.rb +0 -15
  425. data/lib/usps/imis/models/generated/property_definition.rb +0 -33
  426. data/lib/usps/imis/models/generated/prospect.rb +0 -38
  427. data/lib/usps/imis/models/generated/publish_priority.rb +0 -14
  428. data/lib/usps/imis/models/generated/publish_request.rb +0 -18
  429. data/lib/usps/imis/models/generated/publish_request_detail.rb +0 -22
  430. data/lib/usps/imis/models/generated/publish_request_status.rb +0 -15
  431. data/lib/usps/imis/models/generated/publish_server.rb +0 -29
  432. data/lib/usps/imis/models/generated/quality_ref.rb +0 -15
  433. data/lib/usps/imis/models/generated/rank.rb +0 -21
  434. data/lib/usps/imis/models/generated/receipt_report.rb +0 -24
  435. data/lib/usps/imis/models/generated/receipt_status_ref.rb +0 -15
  436. data/lib/usps/imis/models/generated/recurring_donation_expected_payment_set.rb +0 -19
  437. data/lib/usps/imis/models/generated/recurring_donation_expected_payment_set_list.rb +0 -20
  438. data/lib/usps/imis/models/generated/recurring_donation_expected_payment_set_status.rb +0 -15
  439. data/lib/usps/imis/models/generated/recurring_donation_expected_payment_status.rb +0 -15
  440. data/lib/usps/imis/models/generated/recurring_donation_frequency_ref.rb +0 -15
  441. data/lib/usps/imis/models/generated/reference_date.rb +0 -13
  442. data/lib/usps/imis/models/generated/registered_component.rb +0 -27
  443. data/lib/usps/imis/models/generated/registration_status.rb +0 -14
  444. data/lib/usps/imis/models/generated/relationship.rb +0 -18
  445. data/lib/usps/imis/models/generated/relationship_category.rb +0 -17
  446. data/lib/usps/imis/models/generated/relationship_type_category.rb +0 -17
  447. data/lib/usps/imis/models/generated/relationship_type_ref.rb +0 -16
  448. data/lib/usps/imis/models/generated/relationship_update.rb +0 -16
  449. data/lib/usps/imis/models/generated/relationship_update_contact_panel.rb +0 -16
  450. data/lib/usps/imis/models/generated/remove_district_org_committee_terms.rb +0 -28
  451. data/lib/usps/imis/models/generated/remove_squadron_org_committee_terms.rb +0 -28
  452. data/lib/usps/imis/models/generated/reporting_group_user.rb +0 -14
  453. data/lib/usps/imis/models/generated/response_media_ref.rb +0 -14
  454. data/lib/usps/imis/models/generated/response_type_ref.rb +0 -15
  455. data/lib/usps/imis/models/generated/restock_price_ref.rb +0 -15
  456. data/lib/usps/imis/models/generated/sales_location_status_ref.rb +0 -15
  457. data/lib/usps/imis/models/generated/salutation_ref.rb +0 -22
  458. data/lib/usps/imis/models/generated/sbuddy_answers.rb +0 -23
  459. data/lib/usps/imis/models/generated/sbuddy_definition.rb +0 -28
  460. data/lib/usps/imis/models/generated/schedule_frequency_ref.rb +0 -14
  461. data/lib/usps/imis/models/generated/segmentation_job_status_ref.rb +0 -15
  462. data/lib/usps/imis/models/generated/sequence_counter.rb +0 -16
  463. data/lib/usps/imis/models/generated/set_district_org_committee_terms.rb +0 -28
  464. data/lib/usps/imis/models/generated/set_squadron_org_committee_terms.rb +0 -28
  465. data/lib/usps/imis/models/generated/ship_price_ref.rb +0 -15
  466. data/lib/usps/imis/models/generated/soa_group.rb +0 -21
  467. data/lib/usps/imis/models/generated/soa_group_member.rb +0 -19
  468. data/lib/usps/imis/models/generated/soa_group_member_detail.rb +0 -28
  469. data/lib/usps/imis/models/generated/social_network_ref.rb +0 -15
  470. data/lib/usps/imis/models/generated/solicitation.rb +0 -40
  471. data/lib/usps/imis/models/generated/solicitation_status_ref.rb +0 -15
  472. data/lib/usps/imis/models/generated/source_code.rb +0 -43
  473. data/lib/usps/imis/models/generated/source_code_status_ref.rb +0 -15
  474. data/lib/usps/imis/models/generated/source_code_type_ref.rb +0 -15
  475. data/lib/usps/imis/models/generated/squad_form_add_fam.rb +0 -23
  476. data/lib/usps/imis/models/generated/squad_form_add_individual.rb +0 -31
  477. data/lib/usps/imis/models/generated/squad_leader_add_individual_contact.rb +0 -28
  478. data/lib/usps/imis/models/generated/squad_note.rb +0 -13
  479. data/lib/usps/imis/models/generated/squad_to_district.rb +0 -18
  480. data/lib/usps/imis/models/generated/squadron_chap_com.rb +0 -16
  481. data/lib/usps/imis/models/generated/squadron_district_lookup.rb +0 -18
  482. data/lib/usps/imis/models/generated/squadrons_and_primary_members.rb +0 -15
  483. data/lib/usps/imis/models/generated/standard_page.rb +0 -15
  484. data/lib/usps/imis/models/generated/state_province_ref.rb +0 -21
  485. data/lib/usps/imis/models/generated/suffix_ref.rb +0 -16
  486. data/lib/usps/imis/models/generated/supplement.rb +0 -27
  487. data/lib/usps/imis/models/generated/supplement_status_ref.rb +0 -15
  488. data/lib/usps/imis/models/generated/supplement_type_ref.rb +0 -15
  489. data/lib/usps/imis/models/generated/system_config_xml.rb +0 -14
  490. data/lib/usps/imis/models/generated/system_param_int.rb +0 -23
  491. data/lib/usps/imis/models/generated/tag_hierarchy.rb +0 -32
  492. data/lib/usps/imis/models/generated/tag_relationship_type.rb +0 -16
  493. data/lib/usps/imis/models/generated/task_item.rb +0 -32
  494. data/lib/usps/imis/models/generated/task_item_status_ref.rb +0 -15
  495. data/lib/usps/imis/models/generated/task_latest_log.rb +0 -15
  496. data/lib/usps/imis/models/generated/task_notify_creator_ref.rb +0 -15
  497. data/lib/usps/imis/models/generated/task_priority.rb +0 -15
  498. data/lib/usps/imis/models/generated/task_status.rb +0 -16
  499. data/lib/usps/imis/models/generated/task_type.rb +0 -15
  500. data/lib/usps/imis/models/generated/tax_authority_level_ref.rb +0 -15
  501. data/lib/usps/imis/models/generated/time_zone_ref.rb +0 -20
  502. data/lib/usps/imis/models/generated/top_level_parent_organization.rb +0 -20
  503. data/lib/usps/imis/models/generated/transaction_detail.rb +0 -56
  504. data/lib/usps/imis/models/generated/transaction_summary_large_batch.rb +0 -44
  505. data/lib/usps/imis/models/generated/uniform_registry.rb +0 -14
  506. data/lib/usps/imis/models/generated/uniform_tag.rb +0 -17
  507. data/lib/usps/imis/models/generated/upgrade_log_detail.rb +0 -19
  508. data/lib/usps/imis/models/generated/url_mapping_type_ref.rb +0 -15
  509. data/lib/usps/imis/models/generated/user_data.rb +0 -33
  510. data/lib/usps/imis/models/generated/user_role.rb +0 -14
  511. data/lib/usps/imis/models/generated/user_token.rb +0 -14
  512. data/lib/usps/imis/models/generated/vertical_alignment_ref.rb +0 -15
  513. data/lib/usps/imis/models/generated/vessels.rb +0 -18
  514. data/lib/usps/imis/models/generated/volunteer_information.rb +0 -22
  515. data/lib/usps/imis/models/generated/warehouse_status_ref.rb +0 -14
  516. data/lib/usps/imis/models/generated/warehouse_type_ref.rb +0 -14
  517. data/lib/usps/imis/models/generated/web_user_control_ref.rb +0 -15
  518. data/lib/usps/imis/models/generated/workflow_queue_item.rb +0 -25
  519. data/lib/usps/imis/models/generated/workflow_queue_item_with_status.rb +0 -25
  520. data/lib/usps/imis/models/generated/workflow_queue_status_ref.rb +0 -15
  521. data/lib/usps/imis/models/generated/workflow_status_ref.rb +0 -15
  522. data/lib/usps/imis/models/party/address.rb +0 -32
  523. data/lib/usps/imis/models/party/alternate_id.rb +0 -16
  524. data/lib/usps/imis/models/party/email.rb +0 -17
  525. data/lib/usps/imis/models/party/phone.rb +0 -17
  526. data/lib/usps/imis/models/party/salutation.rb +0 -18
  527. data/lib/usps/imis/models/party.rb +0 -131
  528. data/lib/usps/imis/models/types/upcase_string.rb +0 -18
  529. data/lib/usps/imis/models/vessel_safety_checks.rb +0 -20
  530. data/lib/usps/imis/models.rb +0 -92
  531. data/lib/usps/imis/panels/base_panel.rb +0 -136
  532. data/lib/usps/imis/panels/education.rb +0 -29
  533. data/lib/usps/imis/panels/vsc.rb +0 -28
  534. data/lib/usps/imis/panels.rb +0 -25
  535. data/lib/usps/imis/party_data.rb +0 -76
  536. data/lib/usps/imis/properties.rb +0 -74
  537. data/lib/usps/imis/query.rb +0 -163
  538. data/lib/usps/imis/requests.rb +0 -67
  539. data/spec/support/usps/simple_cov_uncovered_lines_formatter.rb +0 -53
  540. data/spec/support/usps/vcr/config.rb +0 -47
  541. data/spec/support/usps/vcr/filters.rb +0 -89
  542. data/spec/support/usps/vcr.rb +0 -8
data/lib/usps/imis/api.rb CHANGED
@@ -1,317 +1,207 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'business_object'
4
- require_relative 'mapper'
5
- require_relative 'query'
6
-
7
3
  module Usps
8
4
  module Imis
9
- # The core API wrapper
10
- #
11
5
  class Api
12
- include Requests
13
- include Imis::Helpers
14
-
15
- NAME = 'USPS iMIS API - Ruby'
16
-
17
- # Endpoint for (re-)authentication requests
18
- #
19
6
  AUTHENTICATION_PATH = 'Token'
7
+ API_PATH = 'api'
8
+ QUERY_PATH = 'api/Query'
9
+ PANELS = Struct.new(:vsc, :education)
20
10
 
21
- # API bearer token
22
- #
23
- attr_reader :token
24
-
25
- # Expiration time for the API bearer token
26
- #
27
- # Used to automatically re-authenticate as needed
28
- #
29
- attr_reader :token_expiration
30
-
31
- # Currently selected iMIS ID for API requests
32
- #
33
- attr_reader :imis_id
34
-
35
- # Whether to lock changes to the selected iMIS ID
36
- #
37
- attr_reader :lock_imis_id
38
-
39
- # Tagged logger
40
- #
41
- attr_reader :logger
42
-
43
- # Name and version of the API
44
- #
45
- def self.version = "#{NAME} (v#{Imis::VERSION})"
46
-
47
- # Create a new instance of +Api+ and provide an existing auth token
48
- #
49
- # @param token [String] Auth token
50
- #
51
- def self.with_token(token)
52
- new.tap do |api|
53
- api.instance_variable_set(:@token, token)
54
- api.instance_variable_set(:@token_expiration, Time.now + 3600) # Greater than the actual lifetime of the token
55
- end
56
- end
57
-
58
- # A new instance of +Api+
59
- #
60
- # @param imis_id [Integer, String] iMIS ID to select immediately on initialization
61
- # @param record_id [Integer, String] iMIS ID to select immediately on initialization
62
- # @param certificate [String] Certificate to convert to iMIS ID immediately on initialization
63
- #
64
- def initialize(imis_id: nil, record_id: nil, certificate: nil)
65
- raise ArgumentError, 'Cannot provide both imis_id and certificate' if imis_id && certificate
66
-
67
- @logger = Imis.logger('Api')
68
- Imis.config.validate!
11
+ attr_reader :token, :token_expiration, :imis_id
69
12
 
13
+ def initialize(skip_authentication: false, imis_id: nil)
14
+ authenticate unless skip_authentication
70
15
  self.imis_id = imis_id if imis_id
71
- self.record_id = record_id if record_id
72
- imis_id_for(certificate) if certificate
73
16
  end
74
17
 
75
18
  # Manually set the current ID, if you already have it for a given member
76
19
  #
77
- # Supports integer ID and UUID string
78
- #
79
- # @param id [Integer, String] iMIS ID to select for future requests
80
- #
81
- # @return [Integer, String] iMIS ID
82
- #
83
20
  def imis_id=(id)
84
- raise Errors::LockedIdError if lock_imis_id
85
-
86
- @imis_id = format_id(id)
21
+ @imis_id = id.to_i.to_s
87
22
  end
88
23
 
89
- # Manually set the current record ID
90
- #
91
- # @param id [Integer, String] Record ID to select for future requests
92
- #
93
- # @return [Integer] Record ID
94
- #
95
- def record_id=(id)
96
- return if id.nil?
97
-
98
- raise Errors::LockedIdError if lock_imis_id
99
-
100
- @record_id = format_id(id)
101
- end
102
-
103
- # Currently selected Record ID for API requests
104
- #
105
- # Defaults to the iMIS ID
106
- #
107
- def record_id = @record_id || imis_id
108
-
109
24
  # Convert a member's certificate number into an iMIS ID number
110
25
  #
111
- # @param certificate [String] Certificate number to lookup the corresponding iMIS ID for
112
- #
113
- # @return [Integer] Corresponding iMIS ID
114
- #
115
- # @raise [Errors::AmbiguousCertificateError] If the certificate matches more than one person
116
- #
117
26
  def imis_id_for(certificate)
118
- raise Errors::LockedIdError if lock_imis_id
119
-
120
- logger.debug "Fetching iMIS ID for #{certificate}"
121
-
122
- # Family records can share their member's MajorKey, so only people are candidates
123
- people = query('NetContactData', MajorKey: certificate).page.reject { it['IsCompany'] }
124
- raise Errors::NotFoundError, 'Member not found' if people.empty?
125
- raise Errors::AmbiguousCertificateError, certificate if people.many?
126
-
127
- party = query('Party', UniformId: people.first.id).one
128
- raise Errors::NotFoundError, 'Member not found' if party.nil?
129
-
130
- self.imis_id = party.imis_id
131
- rescue Errors::ResponseError
132
- raise Errors::NotFoundError, 'Member not found'
27
+ result = query(Imis.configuration.imis_id_query_name, { certificate: })
28
+ @imis_id = result['Items']['$values'][0]['ID']
29
+ rescue StandardError
30
+ raise Error::Api, 'Member not found'
133
31
  end
134
32
 
135
33
  # Run requests as DSL, with specific iMIS ID only maintained for this scope
136
34
  #
137
- # Either +id+ or +certificate+ is required.
138
- #
139
- # While in this block, changes to the value of +imis_id+ are not allowed
35
+ # This should be used with methods that do not change the value of `imis_id`
140
36
  #
141
- # If no block is given, this sets the iMIS ID and returns self.
142
- #
143
- # @param id [Integer, String] iMIS ID to select for requests within the block
144
- # @param certificate [String] Certificate number to convert to iMIS ID and select for requests within the block
145
- # @param record_id [Integer] Record ID to select for requests within the block
146
- # @yield Block context to run requests with a specific iMIS ID
147
- # @yieldparam [Api]
148
- #
149
- # @example
150
- # with(12345) do
151
- # update(mm: 15)
152
- # end
153
- #
154
- # @return [Usps::Imis::Api]
155
- #
156
- def with(id = nil, certificate: nil, record_id: nil, &)
157
- raise ArgumentError, 'Must provide id or certificate' unless id || certificate
158
-
37
+ def with(id, &)
159
38
  old_id = imis_id
160
- old_record_id = @record_id
161
-
162
- id.nil? ? imis_id_for(certificate) : self.imis_id = id
163
- self.record_id = record_id
164
- return self unless block_given?
165
-
166
- @lock_imis_id = true
39
+ self.imis_id = id
167
40
  instance_eval(&)
168
41
  ensure
169
- if block_given?
170
- @lock_imis_id = false
171
- self.imis_id = old_id
172
- self.record_id = old_record_id
173
- end
42
+ self.imis_id = old_id
174
43
  end
175
44
 
176
- # Build a Query interface
177
- #
178
- # Works with IQA queries and Business Objects
179
- #
180
- # @param query_name [String] Full path of the query, e.g. +$/_ABC/Fiander/iMIS_ID+
181
- # @query_params [Hash] Conforms to pattern +{ param_name => param_value }+
45
+ # Get a business object for the current member
182
46
  #
183
- # @return [Usps::Imis::Query] Query wrapper
184
- #
185
- def query(query_name, query_params = {}) = Query.new(self, query_name, **query_params)
47
+ def get(business_object_name, url_id: nil)
48
+ uri = uri_for(business_object_name, url_id:)
49
+ request = Net::HTTP::Get.new(uri)
50
+ result = submit(uri, authorize(request))
51
+ JSON.parse(result.body)
52
+ end
186
53
 
187
- # Run requests as DSL, with specific +BusinessObject+ only maintained for this scope
188
- #
189
- # If no block is given, this returns the specified +BusinessObject+.
54
+ # Update only specific fields on a business object for the current member
190
55
  #
191
- # @param business_object_name [String, Symbol] Name of the business object
192
- # @param ordinal [Integer] Ordinal to build override ID param of the URL (e.g. used for Panels)
193
- # @yield Block context to run requests on a specific +BusinessObject+
194
- # @yieldparam [Api]
56
+ # fields - hash of shape: { field_name => new_value }
195
57
  #
196
- # @return [Usps::Imis::BusinessObject]
197
- #
198
- def on(business_object_name, ordinal: nil, &)
199
- object = BusinessObject.new(self, business_object_name, ordinal:)
200
- return object unless block_given?
201
-
202
- object.instance_eval(&)
58
+ def put_fields(business_object_name, fields, url_id: nil)
59
+ updated = filter_fields(business_object_name, fields)
60
+ put(business_object_name, updated, url_id:)
203
61
  end
204
62
 
205
- # An instance of +Mapper+, using this instance as its parent +Api+
63
+ # Update a business object for the current member
206
64
  #
207
- def mapper
208
- @mapper ||= Mapper.new(self)
65
+ def put(business_object_name, body, url_id: nil)
66
+ uri = uri_for(business_object_name, url_id:)
67
+ request = Net::HTTP::Put.new(uri)
68
+ request.body = JSON.dump(body)
69
+ result = submit(uri, authorize(request))
70
+ JSON.parse(result.body)
209
71
  end
210
72
 
211
- # Convenience alias for reading mapped fields
212
- #
213
- # @return Value of the specified field
214
- #
215
- delegate :fetch, to: :mapper
216
- alias [] fetch
217
-
218
- # Convenience alias for reading multiple mapped fields
219
- #
220
- # @return [Array] Values of the specified fields
221
- #
222
- delegate :fetch_all, to: :mapper
223
-
224
- # Convenience alias for updating mapped fields
73
+ # Create a business object for the current member
225
74
  #
226
- # @return [Array] Array containing the updated object
227
- #
228
- def put_field(field_key, value) = update(field_key => value)
229
- alias []= put_field
75
+ def post(business_object_name, body, url_id: nil)
76
+ uri = uri_for(business_object_name, url_id:)
77
+ request = Net::HTTP::Post.new(uri)
78
+ request.body = JSON.dump(body)
79
+ result = submit(uri, authorize(request))
80
+ JSON.parse(result.body)
81
+ end
230
82
 
231
- # Convenience alias for updating mapped fields
83
+ # Remove a business object for the current member
232
84
  #
233
- # @return [Usps::Imis::Data] Updated object
85
+ # Returns empty string on success
234
86
  #
235
- delegate :update, to: :mapper
87
+ def delete(business_object_name, url_id: nil)
88
+ uri = uri_for(business_object_name, url_id:)
89
+ request = Net::HTTP::Delete.new(uri)
90
+ result = submit(uri, authorize(request))
91
+ result.body
92
+ end
236
93
 
237
- # Names of every Business Object that has a registered +Models::Base+
238
- # wrapper, partitioned by whether the name carries an +ABC+ prefix.
239
- # Sourced from the in-process registry — no HTTP — so this answers
240
- # "what does the gem know how to wrap?", not "what does the server
241
- # expose?". Anything not listed still round-trips as raw +Data+.
94
+ # Run an IQA Query
242
95
  #
243
- # @return [Hash<Symbol, Array<String>>] Grouped registered Business Objects
96
+ # query_name - the full path of the query in IQA, e.g. `$/_ABC/Fiander/iMIS_ID`
97
+ # query_params - hash of shape: { param_name => param_value }
244
98
  #
245
- def business_objects
246
- abc, other = Models.entity_names.partition { it.include?('ABC') }
99
+ def query(query_name, query_params = {})
100
+ query_params[:QueryName] = query_name
101
+ path = "#{QUERY_PATH}?#{query_params.to_query}"
102
+ uri = URI(File.join(imis_hostname, path))
103
+ request = Net::HTTP::Get.new(uri)
104
+ result = submit(uri, authorize(request))
105
+ JSON.parse(result.body)
106
+ end
247
107
 
248
- { abc:, other: }
108
+ def mapper
109
+ @mapper ||= Mapper.new(self)
249
110
  end
250
111
 
251
- # Convenience accessor for available Panel objects, each using this instance as its parent
252
- # +Api+
253
- #
254
112
  def panels
255
- @panels ||= Panels.all(self)
113
+ @panels ||= PANELS.new(
114
+ Panel::Vsc.new(self),
115
+ Panel::Education.new(self)
116
+ )
256
117
  end
257
118
 
258
- # Used by the CLI wrappers to reduce authentication requests
259
- #
260
- def auth_token
261
- authenticate
262
-
263
- { token: @token, token_expiration: @token_expiration }
119
+ def update(data)
120
+ mapper.update(data)
264
121
  end
265
122
 
266
- # Persistent HTTP connection for reuse across requests
267
- #
268
- def http_connection
269
- return @http_connection if @http_connection&.started?
123
+ def instance_variables_to_inspect = %i[@token_expiration @imis_id]
124
+
125
+ private
270
126
 
271
- config = Imis.configuration
272
- hostname = URI(config.hostname)
273
- @http_connection = Net::HTTP.new(hostname.host, hostname.port).tap do |http|
127
+ def client(uri)
128
+ Net::HTTP.new(uri.host, uri.port).tap do |http|
274
129
  http.use_ssl = true
275
130
  http.verify_mode = OpenSSL::SSL::VERIFY_PEER
276
- http.open_timeout = config.open_timeout
277
- http.read_timeout = config.read_timeout
278
- http.write_timeout = config.write_timeout
279
- http.keep_alive_timeout = 30
280
- http.start
281
131
  end
282
132
  end
283
133
 
284
- # Ruby 3.5 instance variable filter
285
- #
286
- def instance_variables_to_inspect = %i[@token_expiration @imis_id]
134
+ def imis_hostname
135
+ Imis.configuration.hostname
136
+ end
287
137
 
288
- # Authenticate to the iMIS API, and store the access token and expiration time
138
+ # Authorize a request prior to submitting
289
139
  #
290
- def authenticate
291
- json = nil # Scope
140
+ # If the current token is missing/expired, request a new one
141
+ #
142
+ def authorize(request)
143
+ authenticate if token_expiration < Time.now
144
+ request.tap { |r| r.add_field('Authorization', "Bearer #{token}") }
145
+ end
292
146
 
293
- logger.tagged('Auth') do
294
- logger.info 'Authenticating with iMIS'
147
+ # Construct a business object API endpoint address
148
+ #
149
+ def uri_for(business_object_name, url_id: nil)
150
+ url_id ||= imis_id
151
+ url_id = CGI.escape(url_id)
152
+ URI(File.join(imis_hostname, "#{API_PATH}/#{business_object_name}/#{url_id}"))
153
+ end
295
154
 
296
- request = http_post
297
- request.body = URI.encode_www_form(
298
- grant_type: 'password',
299
- username: Imis.configuration.username,
300
- password: Imis.configuration.password
301
- )
302
- result = submit(request)
303
- json = JSON.parse(result.body)
155
+ def submit(uri, request)
156
+ client(uri).request(request).tap do |result|
157
+ raise Error::Response.from(result) unless result.is_a?(Net::HTTPSuccess)
304
158
  end
159
+ end
160
+
161
+ # Authenticate to the iMIS API, and store the access token and expiration time
162
+ #
163
+ def authenticate
164
+ uri = URI(File.join(imis_hostname, AUTHENTICATION_PATH))
165
+ req = Net::HTTP::Post.new(uri)
166
+ authentication_data = {
167
+ grant_type: 'password',
168
+ username: Imis.configuration.username,
169
+ password: Imis.configuration.password
170
+ }
171
+ req.body = URI.encode_www_form(authentication_data)
172
+ result = submit(uri, req)
173
+ json = JSON.parse(result.body)
305
174
 
306
175
  @token = json['access_token']
307
- @token_expiration = Time.now + json['expires_in'] - 60
176
+ @token_expiration = Time.parse(json['.expires'])
308
177
  end
309
178
 
310
- private
311
-
312
- # URI for the authentication endpoint
179
+ # Manually assemble the matching data structure, with fields in the correct order
313
180
  #
314
- def uri(...) = URI(File.join(Imis.configuration.hostname, AUTHENTICATION_PATH))
181
+ def filter_fields(business_object_name, fields)
182
+ existing = get(business_object_name)
183
+
184
+ JSON.parse(JSON.dump(existing)).tap do |updated|
185
+ # The first property is always the iMIS ID again
186
+ updated['Properties']['$values'] = [existing['Properties']['$values'][0]]
187
+
188
+ # Iterate through all existing fields
189
+ existing['Properties']['$values'].each do |value|
190
+ next unless fields.keys.include?(value['Name'])
191
+
192
+ # Strings are not wrapped in the type definition structure
193
+ new_value = fields[value['Name']]
194
+ if new_value.is_a?(String)
195
+ value['Value'] = new_value
196
+ else
197
+ value['Value']['$value'] = new_value
198
+ end
199
+
200
+ # Add the completed field with the updated value
201
+ updated['Properties']['$values'] << value
202
+ end
203
+ end
204
+ end
315
205
  end
316
206
  end
317
207
  end
@@ -1,175 +1,29 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'logger'
4
-
5
3
  module Usps
6
4
  module Imis
7
- # API Configuration
8
- #
9
5
  class Config
10
6
  IMIS_ROOT_URL_PROD = 'https://portal.americasboatingclub.org'
11
7
  IMIS_ROOT_URL_DEV = 'https://abcdev.imiscloud.com'
12
- DEFAULT_GLOBAL_LOG_PATH = '/var/log/imis/imis.log'
13
-
14
- # Net::HTTP timeouts for the API connection (seconds). open_timeout governs connection
15
- # establishment (TCP connect + TLS handshake) — the phase that stalls when iMIS is unreachable,
16
- # so it defaults low to fail fast rather than pin the caller.
17
- DEFAULT_OPEN_TIMEOUT = 3
18
- DEFAULT_READ_TIMEOUT = 30
19
- DEFAULT_WRITE_TIMEOUT = 30
20
-
21
- REQUIRED = %w[username password].freeze
22
- OPTIONAL = %w[
23
- environment logger_file global_log_path pretty_print_api
24
- open_timeout read_timeout write_timeout
25
- ].freeze
26
- SETTABLE = (REQUIRED + OPTIONAL).freeze
27
-
28
- class << self
29
- # Opt-in +.env+ loader. The gem no longer auto-loads dotenv on require —
30
- # call this from your app boot (or before +Imis.configure+) if you want
31
- # +ENV+ populated from +.env+. Idempotent.
32
- #
33
- def load_dotenv!
34
- Dotenv.load
35
- end
36
- end
37
8
 
38
- attr_accessor :username, :password, :pretty_print_api, :open_timeout, :read_timeout, :write_timeout
39
- attr_reader :environment, :logger, :logger_level, :logger_file
9
+ attr_accessor :environment, :imis_id_query_name, :username, :password
40
10
 
41
11
  def initialize
42
- @environment = default_environment
43
- @username = ENV.fetch('IMIS_USERNAME', nil)
44
- @password = ENV.fetch('IMIS_PASSWORD', nil)
45
- @open_timeout = Integer(ENV.fetch('IMIS_OPEN_TIMEOUT', DEFAULT_OPEN_TIMEOUT).to_s, 10)
46
- @read_timeout = Integer(ENV.fetch('IMIS_READ_TIMEOUT', DEFAULT_READ_TIMEOUT).to_s, 10)
47
- @write_timeout = Integer(ENV.fetch('IMIS_WRITE_TIMEOUT', DEFAULT_WRITE_TIMEOUT).to_s, 10)
48
- @base_logger = Logger.new($stdout, level: :info)
49
- @logger = ActiveSupport::TaggedLogging.new(@base_logger)
50
-
51
12
  yield self if block_given?
52
-
53
- @logger_level = logger.class::SEV_LABEL[logger.level].downcase.to_sym
54
- end
55
-
56
- # Define the API environment
57
- #
58
- # @param env [String] Environment to use
59
- #
60
- def environment=(env)
61
- @environment = ActiveSupport::StringInquirer.new(env.to_s)
62
- end
63
-
64
- # Override the main logger
65
- #
66
- # @param logger [Logger] Configured logging object
67
- #
68
- def logger=(logger)
69
- @base_logger = logger.tap { it.formatter = LoggerFormatter.new }
70
- @base_logger.singleton_class.include(LoggerHelpers)
71
- @logger = ActiveSupport::TaggedLogging.new(@base_logger)
72
- end
73
-
74
- # Define the main logger
75
- #
76
- # @param path [path, nil] Path to write log to, or +nil+ to log to +STDOUT+
77
- #
78
- def logger_file=(path)
79
- @logger_file = path
80
- @base_logger = Logger.new(@logger_file.nil? ? $stdout : @logger_file, level: logger.level)
81
- @logger = ActiveSupport::TaggedLogging.new(@base_logger)
82
- end
83
-
84
- # Current global mirror debug logger
85
- #
86
- def global_logger
87
- return @global_logger if @global_logger
88
-
89
- global_log_path
90
- @global_logger
91
- end
92
-
93
- # Current path for the global mirror debug logger
94
- #
95
- def global_log_path
96
- return @global_log_path if defined?(@global_log_path)
97
-
98
- self.global_log_path = DEFAULT_GLOBAL_LOG_PATH
99
13
  end
100
14
 
101
- # Define the global mirror debug logger
102
- #
103
- # @param path [path, nil] Path to write log to, or +nil+ to disable
104
- #
105
- def global_log_path=(path)
106
- @global_log_path = path
107
- @global_logger = build_global_logger
108
- end
109
-
110
- # Whether the global mirror debug logger writes anywhere. Disabled or unwritable, it is a null
111
- # logger, and nothing needs to be mirrored to it.
112
- #
113
- def global_logging?
114
- global_logger
115
- @global_logging
116
- end
117
-
118
- def silence!
119
- self.logger = Logger.new(nil)
120
- end
121
-
122
- # Environment-specific API endpoint hostname
123
- #
124
- # @return The API hostname for the current environment
125
- #
126
15
  def hostname
127
- return IMIS_ROOT_URL_PROD if environment.production?
128
- return IMIS_ROOT_URL_DEV if environment.development?
129
-
130
- raise Errors::ConfigError, "Unexpected API environment: #{environment}"
131
- end
132
-
133
- # Ruby 3.5 instance variable filter
134
- #
135
- def instance_variables_to_inspect = instance_variables - %i[@password @base_logger @logger @global_logger]
136
-
137
- # Parameters to filter out of logging
138
- #
139
- def filtered_parameters = %i[password]
140
-
141
- def validate!
142
- missing_config = REQUIRED.filter_map { it if public_send(it).nil? }
143
- return if missing_config.empty?
144
-
145
- raise Errors::ConfigError, "Missing required configuration: #{missing_config.join(', ')}"
146
- end
147
-
148
- private
149
-
150
- def default_environment
151
- return ::Rails.env if defined?(::Rails)
152
-
153
- ActiveSupport::StringInquirer.new(ENV.fetch('IMIS_ENVIRONMENT', 'development'))
16
+ case environment.to_sym
17
+ when :production
18
+ IMIS_ROOT_URL_PROD
19
+ when :development
20
+ IMIS_ROOT_URL_DEV
21
+ else
22
+ raise Error::Api, "Unexpected API environment: #{environment}"
23
+ end
154
24
  end
155
25
 
156
- def build_global_logger
157
- writable =
158
- begin
159
- FileUtils.mkdir_p(File.dirname(global_log_path))
160
- File.writable?(global_log_path) || File.writable?(File.dirname(global_log_path))
161
- rescue StandardError
162
- false
163
- end
164
- @global_logging = writable
165
- return ActiveSupport::TaggedLogging.new(::Logger.new(nil)) unless writable
166
-
167
- ActiveSupport::TaggedLogging.new(
168
- ::Logger
169
- .new(File.open(global_log_path, 'a'), level: :debug)
170
- .tap { it.formatter = LoggerFormatter.new }
171
- )
172
- end
26
+ def instance_variables_to_inspect = %i[@environment @imis_id_query_name @username]
173
27
  end
174
28
  end
175
29
  end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Usps
4
+ module Imis
5
+ module Error
6
+ class Api < StandardError
7
+ attr_accessor :metadata
8
+
9
+ def initialize(message, metadata = {})
10
+ super(message)
11
+ @metadata = metadata
12
+ end
13
+
14
+ def bugsnag_meta_data
15
+ metadata == {} ? {} : base_metadata
16
+ end
17
+
18
+ private
19
+
20
+ def base_metadata
21
+ { api: metadata }
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Usps
4
+ module Imis
5
+ module Error
6
+ class Mapper < Api; end
7
+ end
8
+ end
9
+ end