/// <summary>
        /// Выполнение задачи (Вызов метода импорта)
        /// </summary>
        /// <returns></returns>
        public override fmCSAImportResult ExecuteTask()
        {
            if (Importer != null)
            {
                FileStream sourceFileStream = null;
                //if (_SourceFileStream != null) return _SourceFileStream;
                string   hashFile       = "";
                FileInfo sourceFileInfo = new FileInfo(CheckedPath);
                if (!sourceFileInfo.Exists)
                {
                    throw new Exception("File '" + sourceFileInfo.Name + "' not found");
                }
                if (IsFileLoaded(sourceFileInfo, this.Session, out hashFile))
                {
                    throw new Exception("File '" + sourceFileInfo.Name + "' has been loaded before");
                }
                fmCSAImportResult importResult = null;
                using (sourceFileStream = new FileStream(sourceFileInfo.FullName, FileMode.Open, FileAccess.Read)) {
                    importResult = ExecuteTask(sourceFileStream);
                }

                if (importResult != null)
                {
                    importResult.FileName = this.CheckedPath;
                    importResult.FileDate = sourceFileInfo.CreationTime;
                    importResult.Hash     = hashFile;
                }
                return(importResult);
            }
            throw new Exception("Import procedure not found");
        }
示例#2
0
        static public fmCSAImportResult ImportProcess(IObjectSpace os, fmCSATaskImporter taskImporter)
        {
            // Стадия 1. Загрузка выписок и документов выписок.
            // Возможные варианты исхода:
            // 0. Признака, что результаты импорта были зачищены. Все документы и выписки удалены. Возможен перезапуск загрузки из просмотра ImportResult.
            // 1. Ошибок нет. Тогда переход на Стадию 2.
            // -1. Ошибка загрузки секции счетов. Некоторые счета не найдены в системе.
            // -2. Признака, что не все документы выписки загрузились. Документы должны быть удалены.
            // 2. Ошибка загрузки секции выписок. Тогда переход на показ ImportResult, минуя все остальные стадии.
            // 3. Ошибка: не найден хотя бы один счёт в системе. Тогда переход на показ ImportResult, минуя все остальные стадии.
            //    В ImportResult процедура может быть продолжена (например, пользователь ввёл недостающие счета).
            // 4. Неожиданная ошибка обработки документов выписок (сбой в памяти и т.п.). Тогда переход на показ ImportResult, минуя все остальные стадии.
            // 5. Распознаваемая ошибка обработки документов выписок (не пройдена проверка формата, синтаксиса и т.п.). Тогда переход на показ ImportResult, минуя все остальные стадии.
            // Короче, при любом исходе всегда переход на результат импорта.

            //fmCSATaskImporter taskImporter = View.CurrentObject as fmCSATaskImporter;

            // Выполнение Стадии 1.
            fmCSAImportResult importResult = taskImporter.ExecuteTask() as fmCSAImportResult;

            if (importResult == null)
            {
                throw new Exception("ImportResult object was not created.");
            }
            os.CommitChanges();

            ImportProcessDop(os, importResult);

            return(importResult);
        }
示例#3
0
        static public void ClearImportResult(fmCSAImportResult importResult)
        {
            // Вариант зачистки только документов
            foreach (fmCSAStatementAccount sa in importResult.StatementOfAccounts)
            {
                ////sa.PayInDocs.DeleteObjectOnRemove = true;
                //while (sa.PayInDocs.Count() > 0) {
                //    //sa.PayInDocs.Remove(sa.PayInDocs[0]);
                //    fmCSAStatementAccountDoc saDoc = sa.PayInDocs[0];
                //    sa.PayInDocs.Remove(saDoc);
                //    saDoc.Delete();
                //}


                ////sa.PayOutDocs.DeleteObjectOnRemove = true;
                //while (sa.PayOutDocs.Count() > 0) {
                //    //sa.PayOutDocs.Remove(sa.PayOutDocs[0]);
                //    fmCSAStatementAccountDoc saDoc = sa.PayOutDocs[0];
                //    sa.PayOutDocs.Remove(saDoc);
                //    saDoc.Delete();
                //}

                importResult.Session.Delete(sa.PayInDocs);
                importResult.Session.Delete(sa.PayOutDocs);
                importResult.Session.PurgeDeletedObjects();
            }
            importResult.ResultCode = 0;

            /*
             * // Вариант зачистки документов и выписок
             * //importResult.StatementOfAccounts.DeleteObjectOnRemove = true;
             * while (importResult.StatementOfAccounts.Count() > 0) {
             *  fmCSAStatementAccount sa = importResult.StatementOfAccounts[0];
             *
             *  //sa.PayInDocs.DeleteObjectOnRemove = true;
             *  while (sa.PayInDocs.Count() > 0) {
             *      fmCSAStatementAccountDoc saDoc = sa.PayInDocs[0];
             *      sa.PayInDocs.Remove(saDoc);
             *      saDoc.Delete();
             *  }
             *
             *  //sa.PayOutDocs.DeleteObjectOnRemove = true;
             *  while (sa.PayOutDocs.Count() > 0) {
             *      fmCSAStatementAccountDoc saDoc = sa.PayOutDocs[0];
             *      sa.PayOutDocs.Remove(saDoc);
             *      saDoc.Delete();
             *  }
             *
             *  importResult.StatementOfAccounts.Remove(sa);
             *  sa.Delete();
             * }
             * importResult.ResultCode = 0;
             */
        }
示例#4
0
        public void UpdateAllRegister(IObjectSpace os, fmCSAImportResult importResult)
        {
            if (importResult == null)
            {
                return;
            }

            using (IObjectSpace nos = os.CreateNestedObjectSpace())
            {
                fmCSAImportResult ir = nos.GetObject <fmCSAImportResult>(importResult);
                foreach (fmCSAStatementAccount sa in ir.StatementOfAccounts)
                {
                    UpdateRegister(((ObjectSpace)nos).Session, sa);
                    nos.CommitChanges();
                }
            }
        }
示例#5
0
        static public void ImportProcessDop(IObjectSpace os, fmCSAImportResult importResult)
        {
            fmCSATaskImporter taskImporter = importResult.TaskImporter;

            // Чистка (Документы выписок, возможно сами выписки).
            if (importResult.ResultCode == -2)
            {
                fmCSAStatementAccountImportLogic.ClearImportResult(importResult);
                os.CommitChanges();
                // После этого importResult.ResultCode == 0
            }


            // Выполнение Стадии 2.
            if (importResult.ResultCode == 1)
            {
                // Постобработка: Добавление контрагентов, банков, счетов.
                // Обработка выписки
                fmCSAStatementAccountImportLogic.PostProcess(os, taskImporter, importResult);
                os.CommitChanges();
            }

            // Выполнение стадии 3.
            if (importResult.ResultCode == 2)
            {
                // Создание Платёжных документов для всех непривязавшихся документов выписок, запись в регистр  и т.п. В разбивку по типам.
                fmCSAMapDocs <fmCDocRCB> mpCreateDocs = os.CreateObject <fmCSAMapDocs <fmCDocRCB> >();

                mpCreateDocs.CreateAllPaymentDocuments(os, importResult);
                os.CommitChanges();

                mpCreateDocs.UpdateAllRegister(os, importResult);
                os.CommitChanges();
            }

            // Выполнение автопривязки
            if (importResult.ResultCode == 3)
            {
                importResult.AutoBinding(null);
                os.CommitChanges();
            }
        }
示例#6
0
        /// <summary>
        /// Выполнение задачи (Вызов метода импорта)
        /// </summary>
        /// <returns></returns>
        public fmCSAImportResult ExecuteTask(Stream stream)
        {
            if (Importer != null)
            {
                fmCSAImportResult importResult = new fmCSAImportResult(this.Session);
                importResult.TaskImporter = this;
                importResult.Bank         = this.Bank;
                using (StreamReader sr = new StreamReader(stream, Encoding.GetEncoding(this.CodePageNum))) {
                    importResult.FileBody = sr.ReadToEnd();
                    sr.Close();
                }
                stream.Close();

                if (importResult != null)
                {
                    Importer.Import(importResult);
                    importResult.ImportDate = System.DateTime.Now;
                }
                return(importResult);
            }
            throw new Exception("Import procedure not found");
        }
示例#7
0
        /// <summary>
        /// Создание всех (в расслоении по типам) Платёжных документов
        /// </summary>
        /// <param name="importResult"></param>
        public void CreateAllPaymentDocuments(IObjectSpace os, fmCSAImportResult importResult)
        {
            if (importResult == null)
            {
                return;
            }

            using (IObjectSpace nos = os.CreateNestedObjectSpace()) {
                fmCSAImportResult ir = nos.GetObject <fmCSAImportResult>(importResult);
                foreach (fmCSAStatementAccount sa in ir.StatementOfAccounts)
                {
                    CreatePaymentDocuments <fmCDocRCBPaymentOrder>(((ObjectSpace)nos).Session, sa);
                    nos.CommitChanges();

                    CreatePaymentDocuments <fmCDocRCBPaymentRequest>(((ObjectSpace)nos).Session, sa);
                    nos.CommitChanges();

                    CreatePaymentDocuments <fmCDocRCBAkkreditivRequest>(((ObjectSpace)nos).Session, sa);
                    nos.CommitChanges();

                    CreatePaymentDocuments <fmCDocRCBInkassOrder>(((ObjectSpace)nos).Session, sa);
                    nos.CommitChanges();

                    CreatePaymentDocuments <fmCDocRCBOthers>(((ObjectSpace)nos).Session, sa);
                    nos.CommitChanges();

                    // 2012-04-12 Можно отказаться от параметра типа?
                    //CreatePaymentDocuments(((ObjectSpace)nos).Session, sa);
                    //nos.CommitChanges();


                    //UpdateRegister(((ObjectSpace)nos).Session, sa);
                    //nos.CommitChanges();
                }

                importResult.ResultCode = 3;
            }
        }
示例#8
0
        static public void PostProcess(IObjectSpace os, fmCSATaskImporter taskImporter, fmCSAImportResult importResult)
        {
            // Постобработка: Добавление банков, контрагентов, счетов
            if (importResult == null)
            {
                return;
            }

            using (IObjectSpace nos = os.CreateNestedObjectSpace()) {
                fmCSATaskImporter task   = nos.GetObject <fmCSATaskImporter>(taskImporter);
                fmCSAImportResult result = nos.GetObject <fmCSAImportResult>(importResult);

                // Определение и добавление банков
                foreach (fmCSAStatementAccount sa in result.StatementOfAccounts)
                {
                    foreach (fmCDocRCBRequisites requisites in sa.DocRCBRequisites)
                    {
                        fmCSAStatementAccountDoc sad = requisites.StatementOfAccountDoc;
                        task.Importer.RequisitesBankProccess(sad.PaymentPayerRequisites);
                        task.Importer.RequisitesBankProccess(sad.PaymentReceiverRequisites);
                        nos.CommitChanges();
                    }
                }

                // Определение стороны по банку, счёту и значению свойства предпочтительная сторона объекта BankAccount
                //task.Importer.PartyProccessByAccount(result);
                //nos.CommitChanges();
                foreach (fmCSAStatementAccount sa in result.StatementOfAccounts)
                {
                    foreach (fmCDocRCBRequisites requisites in sa.DocRCBRequisites)
                    {
                        fmCSAStatementAccountDoc sad = requisites.StatementOfAccountDoc;
                        task.Importer.PartyProccessByAccountRequisite(sad.PaymentPayerRequisites);
                        task.Importer.PartyProccessByAccountRequisite(sad.PaymentReceiverRequisites);
                        nos.CommitChanges();
                    }
                }

                // Определение стороны по ИНН и КПП (если не определилась на предыдущем шаге как предпочтительная сторона в счёте)
                foreach (fmCSAStatementAccount sa in result.StatementOfAccounts)
                {
                    foreach (fmCDocRCBRequisites requisites in sa.DocRCBRequisites)
                    {
                        fmCSAStatementAccountDoc sad = requisites.StatementOfAccountDoc;
                        task.Importer.RequisitesPartyProccessByINNandKPP(sad.PaymentPayerRequisites);
                        task.Importer.RequisitesPartyProccessByINNandKPP(sad.PaymentReceiverRequisites);
                        nos.CommitChanges();
                    }
                }

                // Создание счетов
                foreach (fmCSAStatementAccount sa in result.StatementOfAccounts)
                {
                    foreach (fmCDocRCBRequisites requisites in sa.DocRCBRequisites)
                    {
                        fmCSAStatementAccountDoc sad = requisites.StatementOfAccountDoc;
                        task.Importer.RequisitesStatementAccountProccess(sad.PaymentPayerRequisites);
                        task.Importer.RequisitesStatementAccountProccess(sad.PaymentReceiverRequisites);
                        nos.CommitChanges();
                    }
                }
            }

            importResult.ResultCode = 2;
        }
示例#9
0
 public virtual void RequisitesStatementAccountProccess(fmCSAImportResult ir)
 {
 }
示例#10
0
 /// <summary>
 /// Метод импорта
 /// </summary>
 /// <returns></returns>
 //public abstract object Import();
 public virtual fmCSAImportResult Import(fmCSAImportResult importResult)     //, params object[] args) {
 {
     return(null);
 }
示例#11
0
        ///// <summary>
        ///// Определение по внутренней записи в позиции "кодировка=DOS" или "кодировка=Windows"
        ///// </summary>
        ///// <returns></returns>
        //private string TestFileEncoding(byte[] mfile) {
        //    // Для Windows имеем подстроку:  CA EE E4 E8 F0 EE E2 EA E0 3D 57 69 6E 64 6F 77 73
        //    byte[] winStr = {0xCA,0xEE,0xE4,0xE8,0xF0,0xEE,0xE2,0xEA,0xE0,0x3D,0x57,0x69,0x6E,0x64,0x6F,0x77,0x73};

        //    // Для DOS     имеем подстроку:  8A AE A4 A8 E0 AE A2 AA A0 3D 44 4F 53
        //    byte[] dosStr = {0x8A,0xAE,0xA4,0xA8,0xE0,0xAE,0xA2,0xAA,0xA0,0x3D,0x44,0x4F,0x53};

        //    if (mfile == null || mfile.LongLength == 0) return "";

        //    foreach (int i in mfile.StartIndex(winStr)) {
        //        return "Windows";
        //    }

        //    foreach (int i in mfile.StartIndex(dosStr)) {
        //        return "DOS";
        //    }

        //    return "";
        //}

        /*
         * private string ByteArrayToHex16(byte[] byteArray) {
         *  StringBuilder sb = new StringBuilder();
         *
         *  for (int i = 0; i < byteArray.Length; i++) {
         *      sb.Append(byteArray[i].ToString("X2"));
         *  }
         *  return sb.ToString();
         * }
         */

        /// <summary>
        /// Запись в журнал
        /// </summary>
        /// <param name="line_doc"></param>
        public virtual void WriteLog(fmCSAImportResult result, string line)
        {
        }