public FakeWaybillLANSourceHandler(string readerClassName, uint supplierId)
 {
     FillSourcesTable();
     drLanSource          = dtSources.Rows.Cast <DataRow>().FirstOrDefault(r => Convert.ToUInt32(r["FirmCode"]) == supplierId);
     reader               = ReflectionHelper.GetDocumentReader <BaseDocumentReader>(readerClassName, Assembly.GetExecutingAssembly());
     _currentDocumentType = new WaybillType();
 }
        protected string[] GetFileFromSource(uint supplierId, BaseDocumentReader documentReader)
        {
            var pricePath = String.Empty;

            try {
                // Путь к папке, из которой нужно забирать накладную
                // \FTPOptBox\<Код постащика>\Waybills\ (или \Rejects\)
                pricePath = Path.Combine(Settings.Default.FTPOptBoxPath,
                                         supplierId.ToString().PadLeft(3, '0'),
                                         _currentDocumentType.FolderName);
                // Получаем все файлы из этой папки
                var ff = Directory.GetFiles(pricePath);
                // Отсекаем файлы с некорректным расширением
                var newFiles = new List <string>();

                //задержка что бы избежать канликтов в dfs
                Thread.Sleep(500);

                foreach (var newFileName in ff)
                {
                    if (Array.Exists(documentReader.ExcludeExtentions,
                                     s => s.Equals(Path.GetExtension(newFileName), StringComparison.OrdinalIgnoreCase)))
                    {
                        // Если есть файл с некорректным разрешением, удаляем его
                        if (File.Exists(newFileName))
                        {
                            File.Delete(newFileName);
                        }
                    }
                    else if (DateTime.Now.Subtract(File.GetLastWriteTime(newFileName)).TotalMinutes > Settings.Default.FileDownloadInterval)
                    {
                        newFiles.Add(newFileName);
                    }
                }
                return(documentReader.UnionFiles(newFiles.ToArray()));
            }
            catch (Exception e) {
                Log(e,
                    String.Format("Не удалось получить список файлов для папки {0}", pricePath));
                return(new string[] { });
            }
        }
        protected bool ProcessWaybillFile(string inFile, DataRow drCurrent, BaseDocumentReader documentReader)
        {
            //Массив файлов
            var files = new[] { inFile };
            var dir   = inFile + ExtrDirSuffix;

            if (ArchiveHelper.IsArchive(inFile))
            {
                // Получаем файлы, распакованные из архива
                files = Directory.GetFiles(dir, "*.*", SearchOption.AllDirectories);
            }

            if (!Directory.Exists(dir))
            {
                Directory.CreateDirectory(dir);
            }

            try {
                files = documentReader.DivideFiles(dir, files);
            }
            catch (Exception exDivide) {
                var supplierId = Convert.ToUInt32(drCurrent[WaybillSourcesTable.colFirmCode]);
                DocumentReceiveLog.Log(supplierId, null, Path.GetFileName(CurrFileName), _currentDocumentType.DocType, String.Format("Не удалось разделить файлы: {0}", exDivide));
                return(false);
            }

            var processed = false;

            foreach (var file in files)
            {
                if (MoveWaybill(inFile, file, drCurrent, documentReader))
                {
                    processed = true;
                }
            }
            return(processed);
        }
        protected bool MoveWaybill(string archFileName, string fileName, DataRow drCurrent, BaseDocumentReader documentReader)
        {
            using (var cleaner = new FileCleaner()) {
                var supplierId = Convert.ToUInt32(drCurrent[WaybillSourcesTable.colFirmCode]);
                try {
                    var addresses  = With.Connection(c => documentReader.ParseAddressIds(c, supplierId, archFileName, fileName));
                    var formatFile = documentReader.FormatOutputFile(fileName, drCurrent);

                    cleaner.Watch(fileName);
                    cleaner.Watch(formatFile);

                    foreach (var addressId in addresses)
                    {
                        var log = DocumentReceiveLog.LogNoCommit(supplierId,
                                                                 (uint)addressId,
                                                                 formatFile,
                                                                 _currentDocumentType.DocType,
                                                                 "Получен с нашего FTP");

                        _logger.InfoFormat("WaybillLanSourceHandler: обработка файла {0}", fileName);
                        documentReader.ImportDocument(log, fileName);
                        new WaybillService().Process(new[] { log }.ToList());
                    }
                }
                catch (Exception e) {
                    var message = "Не удалось отформатировать документ.\nОшибка: " + e;
                    _logger.ErrorFormat("WaybillLanSourceHandler: {0}, archfilename {1}, fileName {2}, error {3}", message, archFileName, fileName, e);
                    DocumentReceiveLog.Log(supplierId, null, fileName, _currentDocumentType.DocType, message);
                    return(false);
                }
            }

            return(true);
        }