/**
  * Получить данные из текста письма
  */
 public function testGetDataFromMailPart()
 {
     // Создаем отправителя
     $source = new EmailSource();
     $source->setName($this->_source);
     $source->setEmailList("anytest@test.tst, " . $this->_from);
     $source->save();
     $sourceId = $source->getId();
     // Создаем парсер
     $parser = new EmailParser();
     $parser->setEmailSourceId($sourceId);
     $parser->setName($this->_subject);
     $parser->setSubjectRegexp("описание операции \\(Снятие наличных\\/Платеж\\)");
     $parser->setAccountRegexp("Номер карты: (\\d\\d\\d\\d)");
     $parser->setTotalRegexp("списано средств: ([\\d\\.,]+) ");
     $parser->setDescriptionRegexp("Описание: (.+)");
     $parser->setType($this->_type);
     $parser->save();
     $email = new myCreateEmailImport($this->_getEmailData());
     $email->addPart('qwerty');
     $mailArray = myParseEmailImport::getEmailData((string) $email);
     $getEmail = new myParseEmailImport($mailArray['body'], $parser, $mailArray['to']);
     $this->assertEquals($this->_getParseData(), $getEmail->getData($this->_operationId));
     // Проверим, работает ли регексп чистки суммы
     $this->_amount = '123,-400x.a00';
     $parser->setTotalRegexp("списано средств: ([\\d\\.,a-zA-Z\\-]+) ");
     $parser->save();
     $email = new myCreateEmailImport($this->_getEmailData());
     $mailArray = myParseEmailImport::getEmailData((string) $email);
     $getEmail = new myParseEmailImport($mailArray['body'], $parser, $mailArray['to']);
     $data = $getEmail->getData($this->_operationId);
     $this->assertEquals('123400.00', $data['amount']);
 }
 /**
  * Run
  */
 public function execute($arguments = array(), $options = array())
 {
     // From file
     if ($arguments['file']) {
         if (!is_readable($arguments['file'])) {
             $this->logSection('import', "Failed to read file `{$arguments['file']}`", null, 'ERROR');
             return self::ERROR_INVALID_INPUT;
         }
         $input = file_get_contents($arguments['file']);
         // STDIN
     } else {
         $input = '';
         while ($row = fgets(STDIN)) {
             $input .= $row;
         }
         $input = trim($input);
     }
     if (!$input) {
         $this->logging("Expected not empty input", $input);
         $this->logMessage(null, 'Нет данных на входе', 'При парсинге входящего письма не получили данных.');
         return self::ERROR_EMPTY_INPUT;
     }
     $mail = myParseEmailImport::getEmailData($input);
     if (false == $mail) {
         $this->logging("Not a valid .eml file format", $input);
         $this->logMessage(null, 'Письмо не может быть распознано', 'Входящее письмо не может быть распознано, т.к. формат не соответствует стандарту.', $input);
         return self::ERROR_EMAIL_FORMAT;
     }
     $from = $mail['from'];
     $subject = $mail['subject'];
     // Инициализировать соединение с БД
     $databaseManager = new sfDatabaseManager($this->configuration);
     if ($from == self::AMT_SOURCE_EMAIL) {
         // Для парсинга AMT
         $importClass = "myParseEmailAmtImport";
         $importForm = "OperationImportAmtForm";
         $parser = null;
     } else {
         $importClass = "myParseEmailImport";
         $importForm = "OperationImportForm";
         // Получаем отправителя
         $source = Doctrine_Core::getTable("EmailSource")->getByEmail($from);
         if (false === $source) {
             $this->logging("Unknown sender", $from);
             $this->logMessage(null, 'Неизвестный отправитель', 'В нашей БД отсутствует отправитель (БАНК).', sprintf("Отправлено от: %s\nОтправлено для: %s\nТема письма: %s\nТело письма:\n%s", $from, $mail['to'], $mail['subject'], $mail['body']));
             $this->forwardMail($mail['to'], $mail['subject'], $mail['body']);
             return self::ERROR_UNKNOWN_SENDER;
         }
         // Ищем подходящий парсер
         $parser = $source->getParserBySubject($subject);
         if (!is_object($parser) || !$parser instanceof EmailParser) {
             $this->logging("Can't find any suitable parser for subject", $subject);
             $this->logMessage(null, 'Нет парсера для обработки письма', 'Невозможно подобрать парсер, необходимый для обработки письма, по его теме.', sprintf("Отправлено от: %s\nОтправлено для: %s\nТема письма: %s\nТело письма:\n%s", $from, $mail['to'], $mail['subject'], $mail['body']));
             $this->forwardMail($mail['to'], $mail['subject'], $mail['body']);
             return self::ERROR_NO_PARSER;
         }
         $input = $mail['body'];
     }
     // Парсинг данных
     try {
         $getEmail = new $importClass($input, $parser, $mail['to']);
         $operationData = $getEmail->getData();
     } catch (Exception $e) {
         $this->logging($e->getMessage(), $input);
         $this->logMessage(null, 'Парсер не смог обработать письмо', sprintf('Обработка данных письма вызвала ошибку "%s" при обработке тела письма', $e->getMessage()), sprintf("Отправлено для: %s\nТело письма:\n%s", $mail['to'], $input));
         return self::ERROR_PARSER_EXCEPTION;
     }
     // Форма/Сохранить операцию
     $form = new $importForm();
     $form->bind($operationData);
     if ($form->isValid()) {
         $form->save();
     } else {
         $this->logging($form->getErrorSchema(), $input);
         $this->logMessage(null, 'Сохранение операции', sprintf("Попытка сохранения операции не удалась.\nВозникшие ошибки при валидации данных: %s", $form->getErrorSchema()), sprintf("Отправлено для: %s\nТело письма:\n%s", $mail['to'], $input));
         return self::ERROR_IMPORT_OPERATION;
     }
     $this->logMessage('info', 'Сохранение операции', sprintf('Операция успешно создана.'), sprintf("Отправлено для: %s\nТело письма:\n%s", $mail['to'], $input), null, $form->getObject()->getId());
     $this->logSection('import', 'Done');
     return self::OK;
 }