Module: EffectiveMembershipsApplicant
- Extended by:
- ActiveSupport::Concern
- Defined in:
- app/models/concerns/effective_memberships_applicant.rb
Overview
EffectiveMembershipsApplicant
Mark your owner model with effective_memberships_applicant to get all the includes
Defined Under Namespace
Modules: Base, ClassMethods
Instance Method Summary collapse
- #applicant_course(applicant_course_name: nil) ⇒ Object
- #applicant_course_area_sum(applicant_course_area:) ⇒ Object
- #applicant_course_areas_collection ⇒ Object
- #applicant_course_names_collection(applicant_course_area:) ⇒ Object
- #applicant_courses_sum ⇒ Object
- #applicant_endorsements_required? ⇒ Boolean
- #applicant_references_required? ⇒ Boolean
-
#applicant_review(reviewer:) ⇒ Object
Find.
- #applicant_reviews_required? ⇒ Boolean
- #apply_to_join? ⇒ Boolean
-
#approve! ⇒ Object
Admin approves an applicant.
- #approve_email_templates ⇒ Object
-
#build_applicant_review(reviewer:) ⇒ Object
Find or build.
- #build_organization(params = {}) ⇒ Object
-
#can_apply_applicant_types_collection ⇒ Object
Used by the select step.
-
#can_apply_categories_collection ⇒ Object
Used by the select step.
- #complete! ⇒ Object
-
#completed_requirements ⇒ Object
When an application is submitted, these must be done to go to completed.
- #cpd_completed_cpd_cycles ⇒ Object
- #cpd_required_cpd_cycles ⇒ Object
-
#cpd_requirement ⇒ Object
CPD Step.
- #cpd_uncompleted_cpd_cycles ⇒ Object
-
#decline! ⇒ Object
Admin approves an applicant.
- #done? ⇒ Boolean
- #in_progress? ⇒ Boolean
- #individual? ⇒ Boolean
-
#min_applicant_courses ⇒ Object
Courses Amounts step.
-
#min_applicant_educations ⇒ Object
Educations Step.
-
#min_applicant_endorsements ⇒ Object
Endorsements Step.
-
#min_applicant_equivalences ⇒ Object
Equivalences Step.
-
#min_applicant_experiences_months ⇒ Object
Work Experiences Step.
-
#min_applicant_files ⇒ Object
Files Step.
-
#min_applicant_references ⇒ Object
References Step.
- #min_applicant_reviews ⇒ Object
- #missing! ⇒ Object
- #organization? ⇒ Boolean
- #owner ⇒ Object
- #owner_symbol ⇒ Object
- #reclassification? ⇒ Boolean
- #reinstatement? ⇒ Boolean
- #resignation? ⇒ Boolean
- #resubmit! ⇒ Object
- #review! ⇒ Object
-
#reviewable? ⇒ Boolean
Completed -> Reviewed requirements.
-
#reviewed_requirements ⇒ Object
When an application is completed, these must be done to go to reviewed An Admin can override this and just set them to reviewed.
- #select! ⇒ Object
-
#stamp ⇒ Object
Stamps step.
- #status_label ⇒ Object
- #summary ⇒ Object
- #to_category ⇒ Object
-
#to_s ⇒ Object
Instance Methods.
- #to_status ⇒ Object
-
#transcripts_received? ⇒ Boolean
Transcripts Step.
- #transcripts_required? ⇒ Boolean
-
#try_completed! ⇒ Object
Called when an applicant is submitted.
-
#try_reviewed! ⇒ Object
Called when an applicant_review was submitted.
Instance Method Details
#applicant_course(applicant_course_name: nil) ⇒ Object
735 736 737 738 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 735 def applicant_course(applicant_course_name: nil) applicant_courses.find { |ac| ac.applicant_course_name_id == applicant_course_name.id } || applicant_courses.build(applicant_course_name: applicant_course_name, applicant_course_area: applicant_course_name.applicant_course_area) end |
#applicant_course_area_sum(applicant_course_area:) ⇒ Object
740 741 742 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 740 def applicant_course_area_sum(applicant_course_area:) applicant_courses.select { |ac| ac.applicant_course_area_id == applicant_course_area.id }.sum { |ac| ac.amount.to_i } end |
#applicant_course_areas_collection ⇒ Object
727 728 729 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 727 def applicant_course_areas_collection Effective::ApplicantCourseArea.deep.sorted end |
#applicant_course_names_collection(applicant_course_area:) ⇒ Object
731 732 733 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 731 def applicant_course_names_collection(applicant_course_area:) applicant_course_area.applicant_course_names end |
#applicant_courses_sum ⇒ Object
744 745 746 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 744 def applicant_courses_sum applicant_courses.sum { |ac| ac.amount.to_i } end |
#applicant_endorsements_required? ⇒ Boolean
768 769 770 771 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 768 def applicant_endorsements_required? return false if resignation? || reinstatement? min_applicant_endorsements > 0 end |
#applicant_references_required? ⇒ Boolean
758 759 760 761 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 758 def applicant_references_required? return false if resignation? || reinstatement? min_applicant_references > 0 end |
#applicant_review(reviewer:) ⇒ Object
Find
891 892 893 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 891 def applicant_review(reviewer:) applicant_reviews.find { |ar| ar.reviewer_id == reviewer.id && ar.reviewer_type == reviewer.class.name } end |
#applicant_reviews_required? ⇒ Boolean
882 883 884 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 882 def applicant_reviews_required? min_applicant_reviews > 0 end |
#apply_to_join? ⇒ Boolean
605 606 607 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 605 def apply_to_join? applicant_type == 'Apply to Join' end |
#approve! ⇒ Object
Admin approves an applicant. Registers the owner. Sends an email.
947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 947 def approve! raise('already approved') if was_approved? raise('applicant must have been submitted to approve!') unless was_submitted? # Complete the wizard step. Just incase this is run out of order. wizard_steps[:checkout] ||= Time.zone.now wizard_steps[:submitted] ||= Time.zone.now assign_attributes(missing_info_reason: nil) approved! EffectiveMemberships.Registrar.delete_fees!(owner) if apply_to_join? EffectiveMemberships.Registrar.register!( owner, to: to_category, status: to_status, date: approved_membership_date.presence, # Set by the Admin Process form, or nil number: approved_membership_number.presence # Set by the Admin Process form, or nil ) elsif reclassification? EffectiveMemberships.Registrar.reclassify!( owner, to: to_category, status: to_status, date: approved_membership_date.presence, # Set by the Admin Process form, or nil number: approved_membership_number.presence # Set by the Admin Process form, or nil ) elsif resignation? EffectiveMemberships.Registrar.remove!( owner, statuses: to_status, date: approved_membership_date.presence # Set by the Admin Process form, or nil ) elsif reinstatement? # No status EffectiveMemberships.Registrar.reinstate!( owner, to: to_category, date: approved_membership_date.presence, # Set by the Admin Process form, or nil number: approved_membership_number.presence # Set by the Admin Process form, or nil ) else raise('unsupported approval applicant_type') end save! after_commit { send_email(:applicant_approved) } true end |
#approve_email_templates ⇒ Object
932 933 934 935 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 932 def approve_email_templates raise('expected EffectiveEmailTemplates') unless defined?(EffectiveEmailTemplates) Effective::EmailTemplate.where('template_name ILIKE ?', 'applicant_approve%').order(:template_name) end |
#build_applicant_review(reviewer:) ⇒ Object
Find or build
896 897 898 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 896 def build_applicant_review(reviewer:) applicant_review(reviewer: reviewer) || applicant_reviews.build(reviewer: reviewer) end |
#build_organization(params = {}) ⇒ Object
601 602 603 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 601 def build_organization(params = {}) self.organization = EffectiveMemberships.Organization.new(params) end |
#can_apply_applicant_types_collection ⇒ Object
Used by the select step
676 677 678 679 680 681 682 683 684 685 686 687 688 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 676 def can_apply_applicant_types_collection if owner.blank? ['Apply to Join'] elsif owner.membership_removed? && owner.reinstatement_membership_history.present? ['Apply for Reinstatement', 'Apply to Join'] elsif owner.membership.blank? || owner.membership.categories.blank? ['Apply to Join'] elsif all_steps.include?(:resignation) ['Apply to Reclassify', 'Apply for Resignation'] else ['Apply to Reclassify'] end end |
#can_apply_categories_collection ⇒ Object
Used by the select step
691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 691 def can_apply_categories_collection categories = EffectiveMemberships.Category.sorted.can_apply if user.blank? || !user.is?(:member) return categories.where(can_apply_new: true) end category_ids = Array(user.membership&.category_ids).map(&:to_s) - [nil, ''] categories.select do |category| category.can_apply_new? || category.can_apply_existing? || (category.can_apply_restricted? && (category_ids & category.can_apply_restricted_ids.map(&:to_s)).present?) end end |
#complete! ⇒ Object
846 847 848 849 850 851 852 853 854 855 856 857 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 846 def complete! raise('applicant must have been submitted to complete!') unless was_submitted? # Let an admin ignore these requirements if need be # return false unless submitted? && completed_requirements.values.all? assign_attributes(missing_info_reason: nil) completed! after_commit { send_email(:applicant_completed) } true end |
#completed_requirements ⇒ Object
When an application is submitted, these must be done to go to completed. An Admin can override this and just set them to completed.
827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 827 def completed_requirements requirements = {} return requirements unless category.present? if all_steps.include?(:transcripts) || transcripts_required? requirements['Transcripts'] = ('Not Required' unless transcripts_required?) || transcripts_received? end if all_steps.include?(:ensorsements) || applicant_endorsements_required? requirements['Endorsements'] = ('Not Required' unless applicant_endorsements_required?) || (applicant_endorsements.count(&:completed?) >= min_applicant_endorsements) end if all_steps.include?(:references) || applicant_references_required? requirements['References'] = ('Not Required' unless applicant_references_required?) || (applicant_references.count(&:completed?) >= min_applicant_references) end requirements end |
#cpd_completed_cpd_cycles ⇒ Object
802 803 804 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 802 def cpd_completed_cpd_cycles cpd_required_cpd_cycles.select { |cpd_cycle| user&.cpd_statement(cpd_cycle: cpd_cycle)&.completed? } end |
#cpd_required_cpd_cycles ⇒ Object
793 794 795 796 797 798 799 800 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 793 def cpd_required_cpd_cycles date = submitted_at || Time.zone.now [ (EffectiveCpd.previous_cpd_cycle(date: date) if cpd_requirement.to_s.include?('previous')), (EffectiveCpd.current_cpd_cycle(date: date) if cpd_requirement.to_s.include?('current')) ].compact end |
#cpd_requirement ⇒ Object
CPD Step
789 790 791 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 789 def cpd_requirement (category&.applicant_cpd_step_requirement.presence || EffectiveMemberships.Category.cpd_step_requirements.first) end |
#cpd_uncompleted_cpd_cycles ⇒ Object
806 807 808 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 806 def cpd_uncompleted_cpd_cycles cpd_required_cpd_cycles.reject { |cpd_cycle| user&.cpd_statement(cpd_cycle: cpd_cycle)&.completed? } end |
#decline! ⇒ Object
Admin approves an applicant. Registers the owner. Sends an email.
1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 1001 def decline! raise('already declined') if was_declined? raise('previously approved') if was_approved? raise('applicant must have been submitted to decline!') unless was_submitted? # Complete the wizard step. Just incase this is run out of order. wizard_steps[:checkout] ||= Time.zone.now wizard_steps[:submitted] ||= Time.zone.now declined! save! after_commit { send_email(:applicant_declined) } true end |
#done? ⇒ Boolean
633 634 635 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 633 def done? approved? || declined? end |
#in_progress? ⇒ Boolean
629 630 631 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 629 def in_progress? !approved? && !declined? end |
#individual? ⇒ Boolean
621 622 623 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 621 def individual? !(owner.kind_of?(EffectiveMemberships.Organization) && category&.organization?) end |
#min_applicant_courses ⇒ Object
Courses Amounts step
723 724 725 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 723 def min_applicant_courses category&.min_applicant_courses.to_i end |
#min_applicant_educations ⇒ Object
Educations Step
718 719 720 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 718 def min_applicant_educations category&.min_applicant_educations.to_i end |
#min_applicant_endorsements ⇒ Object
Endorsements Step
764 765 766 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 764 def min_applicant_endorsements category&.min_applicant_endorsements.to_i end |
#min_applicant_equivalences ⇒ Object
Equivalences Step
774 775 776 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 774 def min_applicant_equivalences category&.min_applicant_equivalences.to_i end |
#min_applicant_experiences_months ⇒ Object
Work Experiences Step
749 750 751 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 749 def min_applicant_experiences_months category&.min_applicant_experiences_months.to_i end |
#min_applicant_files ⇒ Object
Files Step
811 812 813 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 811 def min_applicant_files category&.min_applicant_files.to_i end |
#min_applicant_references ⇒ Object
References Step
754 755 756 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 754 def min_applicant_references category&.min_applicant_references.to_i end |
#min_applicant_reviews ⇒ Object
886 887 888 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 886 def min_applicant_reviews category&.min_applicant_reviews.to_i end |
#missing! ⇒ Object
859 860 861 862 863 864 865 866 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 859 def missing! raise('applicant must have been submitted to missing!') unless was_submitted? missing_info! after_commit { send_email(:applicant_missing_info) } true end |
#organization? ⇒ Boolean
625 626 627 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 625 def organization? owner.kind_of?(EffectiveMemberships.Organization) && category&.organization? end |
#owner ⇒ Object
593 594 595 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 593 def owner organization || user end |
#owner_symbol ⇒ Object
597 598 599 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 597 def owner_symbol organization? ? :organization : :user end |
#reclassification? ⇒ Boolean
609 610 611 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 609 def reclassification? applicant_type == 'Apply to Reclassify' end |
#reinstatement? ⇒ Boolean
617 618 619 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 617 def reinstatement? applicant_type == 'Apply for Reinstatement' end |
#resignation? ⇒ Boolean
613 614 615 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 613 def resignation? applicant_type == 'Apply for Resignation' end |
#resubmit! ⇒ Object
868 869 870 871 872 873 874 875 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 868 def resubmit! raise('applicant must have been submitted and missing info to resubmit!') unless was_submitted? && was_missing_info? raise('already submitted') if submitted? raise('expected a purchased order') unless submit_order&.purchased? assign_attributes(skip_to_step: :submitted, submitted_at: Time.zone.now) submitted! end |
#review! ⇒ Object
925 926 927 928 929 930 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 925 def review! raise('applicant must have been submitted to review!') unless was_submitted? # Let an admin ignore these requirements if need be reviewed! end |
#reviewable? ⇒ Boolean
Completed -> Reviewed requirements
878 879 880 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 878 def reviewable? completed? end |
#reviewed_requirements ⇒ Object
When an application is completed, these must be done to go to reviewed An Admin can override this and just set them to reviewed.
902 903 904 905 906 907 908 909 910 911 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 902 def reviewed_requirements requirements = {} return requirements unless category.present? if EffectiveMemberships.applicant_reviews? requirements['Reviews'] = ('Not Required' unless applicant_reviews_required?) || (applicant_reviews.count(&:completed?) >= min_applicant_reviews) end requirements end |
#select! ⇒ Object
707 708 709 710 711 712 713 714 715 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 707 def select! raise('cannot select a submitted applicant') if was_submitted? raise('cannot select a purchased applicant') if orders.any? { |order| order.purchased? } # Reset the progress so far. They have to click through screens again. assign_attributes(wizard_steps: wizard_steps.slice(:start, :select)) save! end |
#stamp ⇒ Object
Stamps step
816 817 818 819 820 821 822 823 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 816 def stamp stamps.first || stamps.build( owner: owner, name: owner.to_s, shipping_address: (owner.try(:shipping_address) || owner.try(:billing_address)), price: 0 ) end |
#status_label ⇒ Object
637 638 639 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 637 def status_label (status_was || status).to_s.gsub('_', ' ') end |
#summary ⇒ Object
641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 641 def summary case status_was when 'draft' "Applicant has not yet completed the #{category} wizard steps or paid to submit this application. This application will transition to 'submitted' after payment has been collected." when 'submitted' summary = "Application has been purchased and submitted." tasks = "The following tasks remain before it can be completed:" approval = "Waiting on approval." items = completed_requirements.map do |item, done| done = (done ? 'Complete' : 'Incomplete') unless done.is_a?(String) || done.is_a?(Symbol) "<li>#{item}: #{done}</li>" end.join completed_requirements.present? ? "<p>#{summary} #{tasks}</p><ul>#{items}</ul>" : "#{summary} #{approval}" when 'completed' if applicant_reviews_required? "All required materials have been provided. This application will transition to 'reviewed' after all reviewers have voted." else "This application has been completed and is now ready for an admin to approve or decline it. If approved, prorated fees will be generated." end when 'missing_info' "Missing the following information: <ul><li>#{missing_info_reason}</li></ul>" when 'reviewed' "This application has been reviewed and is now ready for an admin to approve or decline it. If approved, prorated fees will be generated." when 'approved' "The application has been approved. All done." when 'declined' "This application has been declined." else raise("unexpected status #{status}") end.html_safe end |
#to_category ⇒ Object
937 938 939 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 937 def to_category category end |
#to_s ⇒ Object
Instance Methods
583 584 585 586 587 588 589 590 591 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 583 def to_s if applicant_type.blank? || category.blank? || owner.blank? 'New Applicant' elsif resignation? "#{owner} - #{applicant_type}" else "#{owner} - #{applicant_type} to #{category}" end end |
#to_status ⇒ Object
941 942 943 944 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 941 def to_status return EffectiveMemberships.Registrar.resigned_status! if resignation? nil end |
#transcripts_received? ⇒ Boolean
Transcripts Step
779 780 781 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 779 def transcripts_received? transcripts_received_on_was.present? end |
#transcripts_required? ⇒ Boolean
783 784 785 786 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 783 def transcripts_required? return false if resignation? || reinstatement? required_steps.include?(:transcripts) end |
#try_completed! ⇒ Object
Called when an applicant is submitted
914 915 916 917 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 914 def try_completed! return false unless submitted? && completed_requirements.values.all? complete! end |
#try_reviewed! ⇒ Object
Called when an applicant_review was submitted
920 921 922 923 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 920 def try_reviewed! return false unless completed? && reviewed_requirements.values.all? review! end |