integration = $integration; } public function getIntegration(): string { return 'cf7'; } /** * {@inheritdoc} */ public function planActions( OptIn $optIn ): array { return array( new FollowUpAction( self::ACTION_ID, FollowUpAction::KIND_MAIL, 'Contact Form 7 mail' ), ); } /** * {@inheritdoc} */ public function execute( OptIn $optIn, array $actions, FollowUpAttempt $attempt ): array { $result = AbstractFormIntegration::runAsReplay( function () use ( $optIn ) { return $this->integration->replaySubmission( $optIn ); } ); $out = array(); foreach ( $actions as $action ) { $out[ $action->getId() ] = $result; } return $out; } /** * Map CF7's submission status. Pure — unit-tested directly. */ public static function mapStatus( string $status ): FollowUpResult { switch ( $status ) { case 'mail_sent': return FollowUpResult::succeeded( 'cf7_mail_sent' ); case 'mail_failed': // Mail 1 was not handed over (CF7 sends Mail 2 only after // Mail 1 succeeded). Storage extensions on wpcf7_submit may // still have written a record, so no automatic retry. return FollowUpResult::failedPermanent( 'mail_handoff_failed' ); case 'spam': return FollowUpResult::failedPermanent( 'spam_rejected' ); case 'validation_failed': case 'acceptance_missing': return FollowUpResult::failedPermanent( 'validation_failed' ); case 'aborted': return FollowUpResult::failedPermanent( 'submission_aborted' ); default: return FollowUpResult::unknown( 'action_outcome_unknown' ); } } /** * {@inheritdoc} * * Pending attachment copies go only after the mail that attaches * them was handed over. */ public function onSettled( OptIn $optIn, array $statusByAction ): void { if ( ( $statusByAction[ self::ACTION_ID ] ?? '' ) === FollowUpStatus::SUCCEEDED ) { $this->integration->processFilesOnConfirm( '', $optIn ); } } }