| 
						
						
							
								
							
						
						
					 | 
					 | 
					@ -4,6 +4,7 @@ module Submissions
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  module Filter
 | 
					 | 
					 | 
					 | 
					  module Filter
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    ALLOWED_PARAMS = %w[
 | 
					 | 
					 | 
					 | 
					    ALLOWED_PARAMS = %w[
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      author
 | 
					 | 
					 | 
					 | 
					      author
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      status
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      completed_at_from
 | 
					 | 
					 | 
					 | 
					      completed_at_from
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      completed_at_to
 | 
					 | 
					 | 
					 | 
					      completed_at_to
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      created_at_from
 | 
					 | 
					 | 
					 | 
					      created_at_from
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					 | 
					@ -22,31 +23,68 @@ module Submissions
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    def call(submissions, current_user, params)
 | 
					 | 
					 | 
					 | 
					    def call(submissions, current_user, params)
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      filters = normalize_filter_params(params, current_user)
 | 
					 | 
					 | 
					 | 
					      filters = normalize_filter_params(params, current_user)
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      if filters[:author].present?
 | 
					 | 
					 | 
					 | 
					      submissions = filter_by_author(submissions, filters, current_user)
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        user = current_user.account.users.find_by(email: filters[:author])
 | 
					 | 
					 | 
					 | 
					      submissions = filter_by_status(submissions, filters)
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        submissions = submissions.where(created_by_user_id: user&.id || -1)
 | 
					 | 
					 | 
					 | 
					      submissions = filter_by_created_at(submissions, filters)
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      filter_by_completed_at(submissions, filters)
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    end
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    def filter_by_author(submissions, filters, current_user)
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      return submissions if filters[:author].blank?
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      user = current_user.account.users.find_by(email: filters[:author])
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      submissions.where(created_by_user_id: user&.id || -1)
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    end
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    def filter_by_status(submissions, filters)
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      submissions = submissions.pending if filters[:status] == 'pending'
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      submissions = submissions.completed if filters[:status] == 'completed'
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      submissions = submissions.declined if filters[:status] == 'declined'
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      submissions = submissions.expired if filters[:status] == 'expired'
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      if filters[:status] == 'partially_completed'
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        submissions =
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					          submissions.joins(:submitters)
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					                     .group(:id)
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					                     .having(Arel::Nodes::NamedFunction.new(
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					                       'COUNT', [Arel::Nodes::NamedFunction.new('NULLIF',
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					                                                                [Submitter.arel_table[:completed_at].eq(nil),
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					                                                                 Arel::Nodes.build_quoted(false)])]
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					                     ).gt(0))
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					                     .having(Arel::Nodes::NamedFunction.new(
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					                       'COUNT', [Arel::Nodes::NamedFunction.new('NULLIF',
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					                                                                [Submitter.arel_table[:completed_at].not_eq(nil),
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					                                                                 Arel::Nodes.build_quoted(false)])]
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					                     ).gt(0))
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      end
 | 
					 | 
					 | 
					 | 
					      end
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      submissions
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    end
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    def filter_by_created_at(submissions, filters)
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      submissions = submissions.where(created_at: filters[:created_at_from]..) if filters[:created_at_from].present?
 | 
					 | 
					 | 
					 | 
					      submissions = submissions.where(created_at: filters[:created_at_from]..) if filters[:created_at_from].present?
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      if filters[:created_at_to].present?
 | 
					 | 
					 | 
					 | 
					      if filters[:created_at_to].present?
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        submissions = submissions.where(created_at: ..filters[:created_at_to].end_of_day)
 | 
					 | 
					 | 
					 | 
					        submissions = submissions.where(created_at: ..filters[:created_at_to].end_of_day)
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      end
 | 
					 | 
					 | 
					 | 
					      end
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      if filters[:completed_at_from].present? || filters[:completed_at_to].present?
 | 
					 | 
					 | 
					 | 
					      submissions
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        completed_arel = Submitter.arel_table[:completed_at].maximum
 | 
					 | 
					 | 
					 | 
					    end
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        submissions = submissions.completed.joins(:submitters).group(:id)
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        if filters[:completed_at_from].present?
 | 
					 | 
					 | 
					 | 
					    def filter_by_completed_at(submissions, filters)
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					          submissions = submissions.having(completed_arel.gteq(filters[:completed_at_from]))
 | 
					 | 
					 | 
					 | 
					      return submissions unless filters[:completed_at_from].present? || filters[:completed_at_to].present?
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        end
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        if filters[:completed_at_to].present?
 | 
					 | 
					 | 
					 | 
					      completed_arel = Submitter.arel_table[:completed_at].maximum
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					          submissions = submissions.having(completed_arel.lteq(filters[:completed_at_to].end_of_day))
 | 
					 | 
					 | 
					 | 
					      submissions = submissions.completed.joins(:submitters).group(:id)
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        end
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      if filters[:completed_at_from].present?
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        submissions = submissions.having(completed_arel.gteq(filters[:completed_at_from]))
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      end
 | 
					 | 
					 | 
					 | 
					      end
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      submissions
 | 
					 | 
					 | 
					 | 
					      return submissions if filters[:completed_at_to].blank?
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      submissions.having(completed_arel.lteq(filters[:completed_at_to].end_of_day))
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    end
 | 
					 | 
					 | 
					 | 
					    end
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    def normalize_filter_params(params, current_user)
 | 
					 | 
					 | 
					 | 
					    def normalize_filter_params(params, current_user)
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
					 | 
					
 
 |