Skip to main content

Automatic Master Angler Submission System

Overview

Similar to the Personal Best (PB) system, the Master Angler system automatically detects when a user's catch qualifies for their state's Master Angler program and creates a submission record. This allows users to easily track and submit qualifying catches to official state programs.

How It Works

1. Automatic Detection

When a catch is logged, the system automatically:

  1. Determines State: Uses GPS location (latitude/longitude) to find which state the catch occurred in
  2. Finds Program: Looks up active Master Angler program for that state
  3. Checks Requirements: Compares catch size (length/weight) against species requirements
  4. Creates Submission: If qualified, automatically creates a submission record
// After catch is logged
var detectionService = serviceProvider.GetRequiredService<MasterAnglerDetectionService>();
var submission = await detectionService.CheckAndCreateSubmissionAsync(
userId,
fishingLogEntryId,
catchDetailId,
latitude,
longitude);

if (submission != null)
{
// Catch qualifies! Submission created automatically
// User can now submit to official program via SubmissionUrl
}

2. State Detection

The system uses multiple methods to determine state:

  1. Zone Lookup: Checks if catch location is within a fishing zone's radius
  2. Bounding Box: Checks if location is within zone's bounding box
  3. Polygon Zones: Uses point-in-polygon algorithm for complex zone boundaries
  4. Reverse Geocoding: (Future) Could use reverse geocoding API as fallback

3. Qualification Check

A catch qualifies if it meets the species requirements:

  • Length Requirement: Catch length >= minimum length for species
  • Weight Requirement: Catch weight >= minimum weight (if applicable)
  • Length OR Weight: Some programs allow qualification by either length OR weight
// Example: Michigan Master Angler
// Walleye: 28 inches OR 10 lbs
// If catch is 27 inches but 11 lbs, it still qualifies

4. Submission Creation

When a catch qualifies:

  • Submission Record: Created automatically in database
  • Status: Set to Pending (user must submit to official program)
  • User Notification: User is notified of qualification (TODO: implement)
  • Auto-Submission: If program supports API, can auto-submit (TODO: implement)

Master Angler Program Configuration

Submission URL

Each program has a SubmissionUrl that links to the official submission portal:

var program = new MasterAnglerProgram
{
StateId = michiganState.Id,
ProgramName = "Master Angler",
SubmissionUrl = "https://www.michigan.gov/dnr/managing-resources/fishing/master-angler/submit",
// ... other fields
};

Auto-Submission Support

Some programs may support API-based auto-submission:

var program = new MasterAnglerProgram
{
// ... other fields
SubmissionApiUrl = "https://api.dnr.state.gov/master-angler/submit",
SubmissionApiKey = "encrypted-api-key",
SupportsAutoSubmission = true
};

Usage Examples

Check Qualification After Catch

// In your catch logging endpoint/service
public async Task<CatchDetail> LogCatchAsync(
Guid userId,
Guid fishingLogEntryId,
int catchDetailId,
double latitude,
double longitude)
{
// ... save catch ...

// Check for Master Angler qualification
var detectionService = serviceProvider.GetRequiredService<MasterAnglerDetectionService>();
var submission = await detectionService.CheckAndCreateSubmissionAsync(
userId,
fishingLogEntryId,
catchDetailId,
latitude,
longitude);

if (submission != null)
{
// Notify user
await notificationService.SendMasterAnglerQualificationAsync(userId, submission);
}

return catchDetail;
}

Get User's Submissions

var detectionService = serviceProvider.GetRequiredService<MasterAnglerDetectionService>();
var submissions = await detectionService.GetUserSubmissionsAsync(userId);

// Filter by state
var michiganSubmissions = await detectionService.GetUserSubmissionsAsync(
userId,
stateId: michiganState.Id);

Get Program Details

var program = await detectionService.GetProgramForStateAsync(michiganState.Id);
if (program != null)
{
Console.WriteLine($"Program: {program.ProgramName}");
Console.WriteLine($"Submit at: {program.SubmissionUrl}");
Console.WriteLine($"Species: {program.Species.Count}");
}

User Flow

  1. User Catches Fish: Logs catch with location, species, size
  2. System Detects: Automatically checks if catch qualifies
  3. Submission Created: If qualified, submission record created
  4. User Notified: User receives notification about qualification
  5. User Submits: User clicks link to official submission portal (SubmissionUrl)
  6. Status Updated: User can update submission status when official program responds

Future Enhancements

  1. Auto-Submission: Automatically submit to official programs via API
  2. Photo Upload: Pre-fill submission form with catch photos
  3. Status Sync: Sync submission status from official program API
  4. Reminders: Remind users to submit qualifying catches
  5. Achievement Badges: Award badges for Master Angler submissions
  6. Social Sharing: Share Master Angler achievements on social media

Integration Points

Catch Logging Service

// After catch is saved
await masterAnglerDetectionService.CheckAndCreateSubmissionAsync(
userId,
fishingLogEntryId,
catchDetailId,
latitude,
longitude);

Notification Service

// When submission is created
await notificationService.SendMasterAnglerQualificationAsync(userId, submission);

API Endpoints

  • GET /api/master-angler/submissions - Get user's submissions
  • GET /api/master-angler/program/{stateId} - Get program for state
  • POST /api/master-angler/submit/{submissionId} - Submit to official program
  • PUT /api/master-angler/submission/{submissionId}/status - Update submission status

Database Schema

MasterAnglerSubmission

  • UserId: User who caught the fish
  • ProgramId: Master Angler program
  • FishingLogEntryId: Link to catch log entry
  • CatchDetailId: Link to catch details
  • FishSpeciesId: Species caught
  • Status: Pending, UnderReview, Accepted, Rejected, etc.
  • IsQualified: Whether catch meets requirements
  • AutoSubmitted: Whether automatically submitted to official program
  • UserNotified: Whether user was notified

MasterAnglerProgram

  • StateId: State this program is for
  • ProgramName: Name of program (e.g., "Master Angler")
  • SubmissionUrl: URL to official submission portal
  • SubmissionApiUrl: API endpoint for auto-submission (if available)
  • SupportsAutoSubmission: Whether API supports auto-submission