public void micrImage_MicrDataReceived( object sender, System.EventArgs e )
{
var currentPage = Application.Current.MainWindow.Content;
if ( currentPage != this )
{
// only accept scans when the scanning page is showing
batchPage.micrImage.ClearBuffer();
return;
}
lblStartupInfo.Visibility = Visibility.Collapsed;
// from MagTek Sample Code
object dummy = null;
string routingNumber = batchPage.micrImage.FindElement( 0, "T", 0, "TT", ref dummy );
string accountNumber = batchPage.micrImage.FindElement( 0, "TT", 0, "A", ref dummy );
string checkNumber = batchPage.micrImage.FindElement( 0, "A", 0, "12", ref dummy );
short trackNumber = 0;
var rawMICR = batchPage.micrImage.GetTrack( ref trackNumber );
ScannedDocInfo scannedDoc = null;
var rockConfig = RockConfig.Load();
bool scanningMagTekBackImage = false;
if ( _currentMagtekScannedDoc != null && _currentMagtekScannedDoc.BackImageData == null && rockConfig.PromptToScanRearImage )
{
//// if we didn't get a routingnumber, and we are expecting a back scan, use the scan as the back image
//// However, if we got a routing number, assuming we are scanning a new check regardless
if ( string.IsNullOrWhiteSpace( routingNumber ) )
{
scanningMagTekBackImage = true;
}
else
{
scanningMagTekBackImage = false;
}
}
if ( scanningMagTekBackImage )
{
scannedDoc = _currentMagtekScannedDoc;
}
else
{
scannedDoc = new ScannedDocInfo();
scannedDoc.CurrencyTypeValue = batchPage.SelectedCurrencyValue;
scannedDoc.SourceTypeValue = batchPage.SelectedSourceTypeValue;
if ( scannedDoc.IsCheck )
{
scannedDoc.ScannedCheckMicrData = rawMICR;
scannedDoc.RoutingNumber = routingNumber;
scannedDoc.AccountNumber = accountNumber;
scannedDoc.CheckNumber = checkNumber;
WriteToDebugLog( string.Format( "[{0}] - '{1}'", DateTime.Now.ToString( "o" ), scannedDoc.ScannedCheckMicrData ) );
}
// set the _currentMagtekScannedDoc in case we are going to scan the back of the image
_currentMagtekScannedDoc = scannedDoc;
}
string imagePath = Path.GetTempPath();
string docImageFileName = Path.Combine( imagePath, string.Format( "scanned_item_{0}.tif", Guid.NewGuid() ) );
if ( File.Exists( docImageFileName ) )
{
File.Delete( docImageFileName );
}
try
{
string statusMsg = string.Empty;
batchPage.micrImage.TransmitCurrentImage( docImageFileName, ref statusMsg );
if ( !File.Exists( docImageFileName ) )
{
throw new Exception( "Unable to retrieve image" );
}
if ( scanningMagTekBackImage )
{
scannedDoc.BackImageData = File.ReadAllBytes( docImageFileName );
}
else
{
scannedDoc.FrontImageData = File.ReadAllBytes( docImageFileName );
// MagTek puts the symbol '?' for parts of the MICR that it can't read
bool gotValidMicr = !string.IsNullOrWhiteSpace( scannedDoc.AccountNumber ) && !scannedDoc.AccountNumber.Contains( '?' )
&& !string.IsNullOrWhiteSpace( scannedDoc.RoutingNumber ) && !scannedDoc.RoutingNumber.Contains( '?' )
&& !string.IsNullOrWhiteSpace( scannedDoc.CheckNumber ) && !scannedDoc.CheckNumber.Contains( '?' );
if ( scannedDoc.IsCheck && !gotValidMicr )
{
scannedDoc.BadMicr = true;
}
}
if ( scannedDoc.BackImageData == null && rockConfig.PromptToScanRearImage )
{
// scanning the front image, but still need to scan the back
lblScanBackInstructions.Visibility = Visibility.Visible;
HideUploadWarningPrompts( true );
DisplayScannedDocInfo( scannedDoc );
}
else
{
// scanned both sides (or just the front if they don't want to scan both sides )
lblScanBackInstructions.Visibility = Visibility.Collapsed;
scannedDoc.Upload = !scannedDoc.IsCheck || !( scannedDoc.BadMicr || scannedDoc.Duplicate );
this.ShowScannedDocStatusAndUpload( scannedDoc );
}
File.Delete( docImageFileName );
}
catch ( Exception ex )
{
if ( ex is AggregateException )
{
ShowException( ( ex as AggregateException ).Flatten() );
}
else
{
ShowException( ex );
}
}
finally
{
batchPage.micrImage.ClearBuffer();
}
}