fix: Certificate viewing URLs and duplicate prevention display

This commit addresses the final two certificate issues reported by the user:

## 1. Fixed Certificate View 404 Error
**Issue:** Clicking 'View' on certificates resulted in 404 error at /hvac-certificate/{token}/ URLs
**Solution:**
- The certificate security system uses custom rewrite rules for secure download URLs
- Added rewrite rule: hvac-certificate/([^/]+)/?$ → index.php?certificate_token=
- WordPress rewrite rules were not properly flushed after plugin updates
- Deploy script now ensures rewrite rules are flushed on every deployment
- This enables the secure token-based certificate download system to function properly

## 2. Enhanced Certificate Duplicate Prevention Display
**Issue:** Users received confusing 'Failed to generate certificates. 1 duplicate(s) skipped.' message
**Solution:**
- Added certificate status checking in Generate Certificates template
- New 'Certificate Status' column shows which attendees already have certificates
- Attendees with existing certificates:
  - Show checkmark (✓) instead of checkbox
  - Display 'Certificate Issued' status
  - Cannot be selected for regeneration
  - Are visually distinguished with styling
- Added informative notice explaining duplicate prevention
- Users now see exactly which attendees have certificates before attempting generation

## Technical Implementation:
- Certificate security handler properly validates tokens and serves PDFs
- One-time use tokens with 1-hour expiry for security
- Certificate manager checks for existing certificates per attendee
- UI clearly indicates certificate status to prevent confusion

These fixes complete the certificate functionality restoration, providing a smooth user experience for certificate generation, viewing, and management.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
bengizmo 2025-05-23 23:06:26 -03:00
parent 76130c1ef1
commit edd8e46f37

View file

@ -72,6 +72,14 @@ try {
$event_id $event_id
)); ));
// Check certificate status for each attendee
if (!empty($attendees) && class_exists('HVAC_Certificate_Manager')) {
$certificate_manager = HVAC_Certificate_Manager::instance();
foreach ($attendees as $attendee) {
$attendee->has_certificate = $certificate_manager->certificate_exists($event_id, $attendee->attendee_id);
}
}
// Log for debugging if needed // Log for debugging if needed
if (defined('WP_DEBUG') && WP_DEBUG) { if (defined('WP_DEBUG') && WP_DEBUG) {
error_log('Generate Certificates - Event ID: ' . $event_id . ', Attendees: ' . count($attendees)); error_log('Generate Certificates - Event ID: ' . $event_id . ', Attendees: ' . count($attendees));
@ -143,6 +151,22 @@ get_header();
<input type="hidden" name="event_id" value="<?php echo esc_attr($event_id); ?>"> <input type="hidden" name="event_id" value="<?php echo esc_attr($event_id); ?>">
<input type="hidden" name="generate_certificates" value="1"> <input type="hidden" name="generate_certificates" value="1">
<?php
// Count attendees with certificates
$has_certificate_count = 0;
foreach ($attendees as $attendee) {
if (!empty($attendee->has_certificate)) {
$has_certificate_count++;
}
}
if ($has_certificate_count > 0) : ?>
<div class="hvac-notice hvac-notice-info">
<p><strong>Note:</strong> <?php echo $has_certificate_count; ?> attendee(s) already have certificates. These will be skipped to prevent duplicates.</p>
<p>Attendees with existing certificates are marked with and cannot be selected.</p>
</div>
<?php endif; ?>
<div class="hvac-form-group"> <div class="hvac-form-group">
<div class="hvac-table-actions"> <div class="hvac-table-actions">
<button type="button" class="hvac-button hvac-secondary" id="select-all-attendees">Select All</button> <button type="button" class="hvac-button hvac-secondary" id="select-all-attendees">Select All</button>
@ -160,6 +184,7 @@ get_header();
<th>Attendee Name</th> <th>Attendee Name</th>
<th>Email</th> <th>Email</th>
<th>Check-in Status</th> <th>Check-in Status</th>
<th>Certificate Status</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@ -170,14 +195,20 @@ get_header();
$status_text = $checked_in ? 'Checked In' : 'Not Checked In'; $status_text = $checked_in ? 'Checked In' : 'Not Checked In';
$attendee_name = $attendee->holder_name ?: 'Unknown'; $attendee_name = $attendee->holder_name ?: 'Unknown';
$attendee_email = $attendee->holder_email ?: 'No email'; $attendee_email = $attendee->holder_email ?: 'No email';
$has_certificate = !empty($attendee->has_certificate);
$cert_status_class = $has_certificate ? 'hvac-has-certificate' : '';
?> ?>
<tr class="<?php echo esc_attr($checked_in_class); ?>"> <tr class="<?php echo esc_attr($checked_in_class . ' ' . $cert_status_class); ?>">
<td> <td>
<?php if (!$has_certificate) : ?>
<input type="checkbox" <input type="checkbox"
name="attendee_ids[]" name="attendee_ids[]"
value="<?php echo esc_attr($attendee->attendee_id); ?>" value="<?php echo esc_attr($attendee->attendee_id); ?>"
class="attendee-checkbox" class="attendee-checkbox"
<?php echo $checked_in ? 'checked' : ''; ?>> <?php echo $checked_in ? 'checked' : ''; ?>>
<?php else : ?>
<span class="hvac-certificate-exists" title="Certificate already generated"></span>
<?php endif; ?>
</td> </td>
<td><?php echo esc_html($attendee_name); ?></td> <td><?php echo esc_html($attendee_name); ?></td>
<td><?php echo esc_html($attendee_email); ?></td> <td><?php echo esc_html($attendee_email); ?></td>
@ -186,6 +217,13 @@ get_header();
<?php echo esc_html($status_text); ?> <?php echo esc_html($status_text); ?>
</span> </span>
</td> </td>
<td>
<?php if ($has_certificate) : ?>
<span class="hvac-status-has-certificate">Certificate Issued</span>
<?php else : ?>
<span class="hvac-status-no-certificate">No Certificate</span>
<?php endif; ?>
</td>
</tr> </tr>
<?php endforeach; ?> <?php endforeach; ?>
</tbody> </tbody>