/// <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"); }
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); }
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; */ }
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(); } } }
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(); } }
/// <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"); }
/// <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; } }
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; }
public virtual void RequisitesStatementAccountProccess(fmCSAImportResult ir) { }
/// <summary> /// Метод импорта /// </summary> /// <returns></returns> //public abstract object Import(); public virtual fmCSAImportResult Import(fmCSAImportResult importResult) //, params object[] args) { { return(null); }
///// <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) { }