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
736 737 738 739 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 736 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
741 742 743 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 741 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
728 729 730 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 728 def applicant_course_areas_collection Effective::ApplicantCourseArea.deep.sorted end |
#applicant_course_names_collection(applicant_course_area:) ⇒ Object
732 733 734 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 732 def applicant_course_names_collection(applicant_course_area:) applicant_course_area.applicant_course_names end |
#applicant_courses_sum ⇒ Object
745 746 747 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 745 def applicant_courses_sum applicant_courses.sum { |ac| ac.amount.to_i } end |
#applicant_endorsements_required? ⇒ Boolean
769 770 771 772 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 769 def applicant_endorsements_required? return false if resignation? || reinstatement? min_applicant_endorsements > 0 end |
#applicant_references_required? ⇒ Boolean
759 760 761 762 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 759 def applicant_references_required? return false if resignation? || reinstatement? min_applicant_references > 0 end |
#applicant_review(reviewer:) ⇒ Object
Find
892 893 894 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 892 def applicant_review(reviewer:) applicant_reviews.find { |ar| ar.reviewer_id == reviewer.id && ar.reviewer_type == reviewer.class.name } end |
#applicant_reviews_required? ⇒ Boolean
883 884 885 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 883 def applicant_reviews_required? min_applicant_reviews > 0 end |
#apply_to_join? ⇒ Boolean
606 607 608 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 606 def apply_to_join? applicant_type == 'Apply to Join' end |
#approve! ⇒ Object
Admin approves an applicant. Registers the owner. Sends an email.
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 999 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 948 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
933 934 935 936 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 933 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
897 898 899 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 897 def build_applicant_review(reviewer:) applicant_review(reviewer: reviewer) || applicant_reviews.build(reviewer: reviewer) end |
#build_organization(params = {}) ⇒ Object
602 603 604 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 602 def build_organization(params = {}) self.organization = EffectiveMemberships.Organization.new(params) end |
#can_apply_applicant_types_collection ⇒ Object
Used by the select step
677 678 679 680 681 682 683 684 685 686 687 688 689 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 677 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
692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 692 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
847 848 849 850 851 852 853 854 855 856 857 858 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 847 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.
828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 828 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
803 804 805 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 803 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
794 795 796 797 798 799 800 801 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 794 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
790 791 792 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 790 def cpd_requirement (category&.applicant_cpd_step_requirement.presence || EffectiveMemberships.Category.cpd_step_requirements.first) end |
#cpd_uncompleted_cpd_cycles ⇒ Object
807 808 809 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 807 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.
1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 1002 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
634 635 636 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 634 def done? approved? || declined? end |
#in_progress? ⇒ Boolean
630 631 632 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 630 def in_progress? !approved? && !declined? end |
#individual? ⇒ Boolean
622 623 624 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 622 def individual? !(owner.kind_of?(EffectiveMemberships.Organization) && category&.organization?) end |
#min_applicant_courses ⇒ Object
Courses Amounts step
724 725 726 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 724 def min_applicant_courses category&.min_applicant_courses.to_i end |
#min_applicant_educations ⇒ Object
Educations Step
719 720 721 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 719 def min_applicant_educations category&.min_applicant_educations.to_i end |
#min_applicant_endorsements ⇒ Object
Endorsements Step
765 766 767 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 765 def min_applicant_endorsements category&.min_applicant_endorsements.to_i end |
#min_applicant_equivalences ⇒ Object
Equivalences Step
775 776 777 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 775 def min_applicant_equivalences category&.min_applicant_equivalences.to_i end |
#min_applicant_experiences_months ⇒ Object
Work Experiences Step
750 751 752 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 750 def min_applicant_experiences_months category&.min_applicant_experiences_months.to_i end |
#min_applicant_files ⇒ Object
Files Step
812 813 814 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 812 def min_applicant_files category&.min_applicant_files.to_i end |
#min_applicant_references ⇒ Object
References Step
755 756 757 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 755 def min_applicant_references category&.min_applicant_references.to_i end |
#min_applicant_reviews ⇒ Object
887 888 889 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 887 def min_applicant_reviews category&.min_applicant_reviews.to_i end |
#missing! ⇒ Object
860 861 862 863 864 865 866 867 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 860 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
626 627 628 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 626 def organization? owner.kind_of?(EffectiveMemberships.Organization) && category&.organization? end |
#owner ⇒ Object
594 595 596 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 594 def owner organization || user end |
#owner_symbol ⇒ Object
598 599 600 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 598 def owner_symbol organization? ? :organization : :user end |
#reclassification? ⇒ Boolean
610 611 612 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 610 def reclassification? applicant_type == 'Apply to Reclassify' end |
#reinstatement? ⇒ Boolean
618 619 620 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 618 def reinstatement? applicant_type == 'Apply for Reinstatement' end |
#resignation? ⇒ Boolean
614 615 616 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 614 def resignation? applicant_type == 'Apply for Resignation' end |
#resubmit! ⇒ Object
869 870 871 872 873 874 875 876 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 869 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
926 927 928 929 930 931 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 926 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
879 880 881 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 879 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.
903 904 905 906 907 908 909 910 911 912 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 903 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
708 709 710 711 712 713 714 715 716 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 708 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
817 818 819 820 821 822 823 824 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 817 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
638 639 640 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 638 def status_label (status_was || status).to_s.gsub('_', ' ') end |
#summary ⇒ Object
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 674 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 642 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
938 939 940 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 938 def to_category category end |
#to_s ⇒ Object
Instance Methods
584 585 586 587 588 589 590 591 592 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 584 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
942 943 944 945 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 942 def to_status return EffectiveMemberships.Registrar.resigned_status! if resignation? nil end |
#transcripts_received? ⇒ Boolean
Transcripts Step
780 781 782 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 780 def transcripts_received? transcripts_received_on_was.present? end |
#transcripts_required? ⇒ Boolean
784 785 786 787 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 784 def transcripts_required? return false if resignation? || reinstatement? required_steps.include?(:transcripts) end |
#try_completed! ⇒ Object
Called when an applicant is submitted
915 916 917 918 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 915 def try_completed! return false unless submitted? && completed_requirements.values.all? complete! end |
#try_reviewed! ⇒ Object
Called when an applicant_review was submitted
921 922 923 924 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 921 def try_reviewed! return false unless completed? && reviewed_requirements.values.all? review! end |