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
714 715 716 717 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 714 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
719 720 721 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 719 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
706 707 708 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 706 def applicant_course_areas_collection Effective::ApplicantCourseArea.deep.sorted end |
#applicant_course_names_collection(applicant_course_area:) ⇒ Object
710 711 712 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 710 def applicant_course_names_collection(applicant_course_area:) applicant_course_area.applicant_course_names end |
#applicant_courses_sum ⇒ Object
723 724 725 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 723 def applicant_courses_sum applicant_courses.sum { |ac| ac.amount.to_i } end |
#applicant_endorsements_required? ⇒ Boolean
747 748 749 750 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 747 def applicant_endorsements_required? return false if resignation? || reinstatement? min_applicant_endorsements > 0 end |
#applicant_references_required? ⇒ Boolean
737 738 739 740 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 737 def applicant_references_required? return false if resignation? || reinstatement? min_applicant_references > 0 end |
#applicant_review(reviewer:) ⇒ Object
Find
870 871 872 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 870 def applicant_review(reviewer:) applicant_reviews.find { |ar| ar.reviewer_id == reviewer.id && ar.reviewer_type == reviewer.class.name } end |
#applicant_reviews_required? ⇒ Boolean
861 862 863 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 861 def applicant_reviews_required? min_applicant_reviews > 0 end |
#apply_to_join? ⇒ Boolean
584 585 586 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 584 def apply_to_join? applicant_type == 'Apply to Join' end |
#approve! ⇒ Object
Admin approves an applicant. Registers the owner. Sends an email.
926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 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 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 926 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
911 912 913 914 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 911 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
875 876 877 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 875 def build_applicant_review(reviewer:) applicant_review(reviewer: reviewer) || applicant_reviews.build(reviewer: reviewer) end |
#build_organization(params = {}) ⇒ Object
580 581 582 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 580 def build_organization(params = {}) self.organization = EffectiveMemberships.Organization.new(params) end |
#can_apply_applicant_types_collection ⇒ Object
Used by the select step
655 656 657 658 659 660 661 662 663 664 665 666 667 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 655 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
670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 670 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
825 826 827 828 829 830 831 832 833 834 835 836 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 825 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.
806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 806 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
781 782 783 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 781 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
772 773 774 775 776 777 778 779 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 772 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
768 769 770 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 768 def cpd_requirement (category&.applicant_cpd_step_requirement.presence || EffectiveMemberships.Category.cpd_step_requirements.first) end |
#cpd_uncompleted_cpd_cycles ⇒ Object
785 786 787 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 785 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.
980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 980 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
612 613 614 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 612 def done? approved? || declined? end |
#in_progress? ⇒ Boolean
608 609 610 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 608 def in_progress? !approved? && !declined? end |
#individual? ⇒ Boolean
600 601 602 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 600 def individual? !(owner.kind_of?(EffectiveMemberships.Organization) && category&.organization?) end |
#min_applicant_courses ⇒ Object
Courses Amounts step
702 703 704 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 702 def min_applicant_courses category&.min_applicant_courses.to_i end |
#min_applicant_educations ⇒ Object
Educations Step
697 698 699 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 697 def min_applicant_educations category&.min_applicant_educations.to_i end |
#min_applicant_endorsements ⇒ Object
Endorsements Step
743 744 745 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 743 def min_applicant_endorsements category&.min_applicant_endorsements.to_i end |
#min_applicant_equivalences ⇒ Object
Equivalences Step
753 754 755 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 753 def min_applicant_equivalences category&.min_applicant_equivalences.to_i end |
#min_applicant_experiences_months ⇒ Object
Work Experiences Step
728 729 730 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 728 def min_applicant_experiences_months category&.min_applicant_experiences_months.to_i end |
#min_applicant_files ⇒ Object
Files Step
790 791 792 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 790 def min_applicant_files category&.min_applicant_files.to_i end |
#min_applicant_references ⇒ Object
References Step
733 734 735 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 733 def min_applicant_references category&.min_applicant_references.to_i end |
#min_applicant_reviews ⇒ Object
865 866 867 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 865 def min_applicant_reviews category&.min_applicant_reviews.to_i end |
#missing! ⇒ Object
838 839 840 841 842 843 844 845 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 838 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
604 605 606 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 604 def organization? owner.kind_of?(EffectiveMemberships.Organization) && category&.organization? end |
#owner ⇒ Object
572 573 574 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 572 def owner organization || user end |
#owner_symbol ⇒ Object
576 577 578 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 576 def owner_symbol organization? ? :organization : :user end |
#reclassification? ⇒ Boolean
588 589 590 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 588 def reclassification? applicant_type == 'Apply to Reclassify' end |
#reinstatement? ⇒ Boolean
596 597 598 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 596 def reinstatement? applicant_type == 'Apply for Reinstatement' end |
#resignation? ⇒ Boolean
592 593 594 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 592 def resignation? applicant_type == 'Apply for Resignation' end |
#resubmit! ⇒ Object
847 848 849 850 851 852 853 854 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 847 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
904 905 906 907 908 909 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 904 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
857 858 859 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 857 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.
881 882 883 884 885 886 887 888 889 890 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 881 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
686 687 688 689 690 691 692 693 694 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 686 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
795 796 797 798 799 800 801 802 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 795 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
616 617 618 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 616 def status_label (status_was || status).to_s.gsub('_', ' ') end |
#summary ⇒ Object
620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 620 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
916 917 918 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 916 def to_category category end |
#to_s ⇒ Object
Instance Methods
562 563 564 565 566 567 568 569 570 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 562 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
920 921 922 923 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 920 def to_status return EffectiveMemberships.Registrar.resigned_status! if resignation? nil end |
#transcripts_received? ⇒ Boolean
Transcripts Step
758 759 760 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 758 def transcripts_received? transcripts_received_on_was.present? end |
#transcripts_required? ⇒ Boolean
762 763 764 765 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 762 def transcripts_required? return false if resignation? || reinstatement? required_steps.include?(:transcripts) end |
#try_completed! ⇒ Object
Called when an applicant is submitted
893 894 895 896 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 893 def try_completed! return false unless submitted? && completed_requirements.values.all? complete! end |
#try_reviewed! ⇒ Object
Called when an applicant_review was submitted
899 900 901 902 |
# File 'app/models/concerns/effective_memberships_applicant.rb', line 899 def try_reviewed! return false unless completed? && reviewed_requirements.values.all? review! end |