Example #1
0
 public static DocumentToProcessPersistenceModel AsPersistenceModel(this DocumentToProcess document)
 {
     return(new DocumentToProcessPersistenceModel
     {
         Id = document.Id,
         RequesterIdentifier = document.RequesterIdentifier,
         TemplateDefinitionIdentifier = document.TemplateDefinition.Id,
     });
 }
Example #2
0
        public virtual void Update(PickupListEntity entity, List <string> AssignedModuleIds, List <string> AssignedTruckIds)
        {
            var idsToDelete = new List <string>();

            //need to ensure modules removed from pickup list are removed from cloud
            var modulesToRemove = new List <ModuleEntity>();

            foreach (var deletedModule in entity.AssignedModules.Where(x => !AssignedModuleIds.Contains(x.Id)))
            {
                if (!_context.DocumentsToProcess.Any(i => i.Id == entity.Id))
                {
                    DocumentToProcess p = new DocumentToProcess();
                    p.EntityType = EntityType.MODULE;
                    p.Source     = InputSource.GIN;
                    p.SelfLink   = "";
                    p.Name       = deletedModule.Name;
                    p.Id         = deletedModule.Id;
                    p.Action     = ProcessingAction.DELETE;
                    _context.DocumentsToProcess.Add(p);
                    modulesToRemove.Add(deletedModule);
                }
            }

            entity.Updated       = DateTime.UtcNow;
            entity.SyncedToCloud = false;
            entity.AssignedTrucks.Clear();

            //remove modules no longer on list
            foreach (var module in modulesToRemove)
            {
                entity.AssignedModules.Remove(module);
            }

            var modulesAlreadyOnList = new List <ModuleEntity>();
            var moduleIdsToAdd       = new List <string>();

            foreach (var updatedModule in entity.AssignedModules.Where(x => AssignedModuleIds.Contains(x.Id)))
            {
                modulesAlreadyOnList.Add(updatedModule);
            }

            //add modules that have been added to list
            foreach (var moduleId in AssignedModuleIds.Where(id => !entity.AssignedModules.Any(x => x.Id == id)))
            {
                moduleIdsToAdd.Add(moduleId);
            }

            var modulesToAdd = _context.Modules.Where(m => moduleIdsToAdd.Contains(m.Id)).ToList();

            modulesToAdd.ForEach(x => x.SyncedToCloud = false);
            entity.AssignedModules.AddRange(modulesToAdd);
            entity.AssignedTrucks.AddRange(_context.Truck.Where(t => AssignedTruckIds.Contains(t.Id)));
        }
        private void ProcessPage(OrderedBitmap page, IActorRef senderRef, DocumentToProcess document)
        {
            senderRef.Tell(new DocumentPageProcessingStarted(document.Id, (int)page.Order));
            var pageDefinition = document.TemplateDefinition.DefinedPages[(int)page.Order];

            //Extracting from input only parts that are handwritten elements (ie. delta between empty document and filled by hand document)
            var extractedParts = _imagePreparationSteps.HandwrittenInputExtractor.ExtractHandwrittenInput(page.Bitmap, pageDefinition);
            //And cropping them according to defined template
            var croppingResult = _imagePreparationSteps.TemplateAreasCropper.CropUserInput(extractedParts.Result, document.Id, pageDefinition);

            //Processed parts
            var processedTextAreas   = new List <RecognizedTextPart>();
            var processedChoiceAreas = new List <RecognizedChoicePart>();

            foreach (var croppedPart in croppingResult.Result)
            {
                senderRef.Tell(new DocumentPageAreaProcessingStarted(document.Id, (int)page.Order, croppedPart.AreaUsedForCropping.AreaName));

                var cleanResult      = _imagePreparationSteps.CroppedAreaCleaner.CleanUp(croppedPart).Result;
                var roiExtractResult = _imagePreparationSteps.RegionOfInterestExtractor.ExtractRegionOfInterestFrom(cleanResult).Result;

                //Choice part, ie. checkbox on paper
                if (croppedPart.AreaUsedForCropping.ExpectedData == TemplatePartExpectedDataType.Choice)
                {
                    processedChoiceAreas.Add(RecognizeChoicePart(page, senderRef, document, croppedPart, roiExtractResult));
                }
                //Text part, ie. field to fill with name/surname/personal id etc.
                else
                {
                    var downscaleResult = _imagePreparationSteps.CroppedAreaScaler.ScaleAndFlatten(roiExtractResult).Result;
                    processedTextAreas.Add(RecognizeTextPart(page, senderRef, document, croppedPart, downscaleResult));
                }
            }

            var processedPage = new ProcessedDocumentPage(processedTextAreas, processedChoiceAreas, (int)page.Order);

            var savePageResult = _saveProcessedPageHandler.Handle(processedPage.AsSaveCommand());

            if (savePageResult.Successful)
            {
                senderRef.Tell(new DocumentPageProcessingCompleted(document.Id, processedPage));
            }
            //TODO: Create failure communication, ie. selfRef.Tell(new Failure())
            else
            {
                Console.WriteLine("Failed to save recognized parts for page: " + page.Order + "of document: " + document.Id);
            }
        }
        private RecognizedTextPart RecognizeTextPart(OrderedBitmap page, IActorRef selfRef, DocumentToProcess document,
                                                     ICroppedArea croppedPart, FlattenedCroppedArea downscaleResult)
        {
            var recognitionResult = _handwrittenInputRecognizer.RecognizeFrom(downscaleResult).Result;

            recognitionResult.AreaName = croppedPart.AreaUsedForCropping.AreaName;

            selfRef.Tell(new DocumentPageTextAreaProcessingCompleted(document.Id, (int)page.Order,
                                                                     croppedPart.AreaUsedForCropping.AreaName, recognitionResult));

            return(recognitionResult as RecognizedTextPart);
        }
        private RecognizedChoicePart RecognizeChoicePart(OrderedBitmap page, IActorRef senderRef, DocumentToProcess document,
                                                         ICroppedArea croppedPart, ICroppedArea roiExtractResult)
        {
            var recognitionResult = _handwrittenChoiceRecognizer.RecognizeFrom(roiExtractResult).Result as RecognizedChoicePart;

            recognitionResult.AreaName = croppedPart.AreaUsedForCropping.AreaName;

            senderRef.Tell(new DocumentPageChoiceAreaProcessingCompleted(document.Id, (int)page.Order,
                                                                         croppedPart.AreaUsedForCropping.AreaName, recognitionResult));

            return(recognitionResult);
        }