Ejemplo n.º 1
0
        public Task <ReceiptExclude> SaveAsync(ReceiptExclude exclude, CancellationToken token = default(CancellationToken))
        {
            var query = @"
INSERT INTO ReceiptExclude
     ( ReceiptId
     , ExcludeAmount
     , ExcludeCategoryId
     , OutputAt
     , CreateBy
     , CreateAt
     , UpdateBy
     , UpdateAt
       )
OUTPUT inserted.*
VALUES
     ( @ReceiptId
     , @ExcludeAmount
     , @ExcludeCategoryId
     , @OutputAt
     , @UpdateBy
     , GETDATE()
     , @UpdateBy
     , GETDATE()
    )";

            return(dbHelper.ExecuteAsync <ReceiptExclude>(query, exclude, token));
        }
Ejemplo n.º 2
0
        public Task <int> CancelDetailAsync(ReceiptExclude detail, CancellationToken token = default(CancellationToken))
        {
            var query = @"
UPDATE ReceiptExclude
   SET OutputAt = NULL
     , UpdateAt = @UpdateAt
     , UpdateBy = @UpdateBy
 WHERE Id       = @Id";

            return(dbHelper.ExecuteAsync(query, detail, token));
        }
Ejemplo n.º 3
0
        public async Task <int> CancelDetailsAsync(IEnumerable <MatchingJournalizingDetail> details,
                                                   CancellationToken token = default(CancellationToken))
        {
            var count = 0;

            using (var scope = transactionScopeBuilder.Create())
            {
                var updateAt = await dbSystemDateTimeQueryProcessor.GetAsync(token);

                foreach (var detail in details)
                {
                    if (detail.JournalizingType == JournalizingType.Matching)
                    {
                        var matching = new Matching
                        {
                            Id       = detail.Id,
                            UpdateAt = updateAt,
                            UpdateBy = detail.UpdateBy,
                        };
                        count += await updateMatchingJournalizingQueryProcessor.CancelDetailAsync(matching, token);
                    }
                    if (detail.JournalizingType == JournalizingType.ReceiptExclude)
                    {
                        var exclude = new ReceiptExclude
                        {
                            Id       = detail.Id,
                            UpdateAt = updateAt,
                            UpdateBy = detail.UpdateBy,
                        };
                        count += await updateReceiptExcludeJournalizingQueryProcessor.CancelDetailAsync(exclude, token);
                    }
                    if (detail.JournalizingType == JournalizingType.AdvanceReceivedOccured ||
                        detail.JournalizingType == JournalizingType.AdvanceReceivedTransfer)
                    {
                        var receipt = new Receipt
                        {
                            Id       = detail.Id,
                            UpdateAt = updateAt,
                            UpdateBy = detail.UpdateBy,
                        };
                        count += await updateReceiptMatchingJournalizingQueryProcessor.CancelDetailAsync(receipt, token);
                    }
                }
                scope.Complete();
            }

            return(count);
        }
Ejemplo n.º 4
0
        public async Task <int> SaveAsync(IEnumerable <MfAggrTransaction> transactions, CancellationToken token = default(CancellationToken))
        {
            using (var scope = transactionScopeBuilder.Create())
            {
                var result        = 0;
                var accounts      = (await mfAggrAccountProcessor.GetAsync(token)).ToArray();
                var accountDic    = accounts.ToDictionary(x => x.Id);
                var subAccountDic = accounts.SelectMany(x => x.SubAccounts).ToDictionary(x => x.Id);

                MfAggrAccount getAccount(long id)
                => accountDic.TryGetValue(id, out var account) ? account : null;

                MfAggrSubAccount getSubAccount(long id)
                => subAccountDic.TryGetValue(id, out var subAccount) ? subAccount : null;

                foreach (var transaction in transactions)
                {
                    if (transaction.IsIncome)
                    {
                        var receipt = transaction.ConvertReceipt(getAccount, getSubAccount);
                        var saved   = await addReceiptQueryProcessor.SaveAsync(receipt, token : token);

                        transaction.ReceiptId = saved.Id;
                        if (saved.ExcludeCategoryId.HasValue)
                        {
                            var exclude = new ReceiptExclude {
                                ReceiptId         = saved.Id,
                                ExcludeAmount     = saved.ExcludeAmount,
                                ExcludeCategoryId = saved.ExcludeCategoryId,
                                //RecordedAt          = saved.RecordedAt,
                                CreateBy = saved.CreateBy,
                                UpdateBy = saved.CreateBy,
                            };
                            await addReceiptExcludeQueryProcessor.SaveAsync(exclude, token);
                        }
                    }
                    await addMfAggrTransactionQueryProcessor.AddAsync(transaction, token);

                    result++;
                }
                scope.Complete();
                return(result);
            }
        }
Ejemplo n.º 5
0
        public async Task <Tuple <ImportFileLog, ImportResult> > ParseAsync(IEnumerable <string[]> records, CancellationToken token = default(CancellationToken))
        {
            var fileLog = new ImportFileLog
            {
                Id        = FileInformation.Index,
                CompanyId = Helper.CompanyId,
                FileName  = FileInformation.Path,
                FileSize  = FileInformation.Size,
                CreateBy  = Helper.LoginUserId,
            };
            var           parseResult       = ImportResult.Success;
            ReceiptHeader header            = null;
            var           receiptCategoryId = 0;
            var           parseSkipping     = false;
            DateTime      workDay           = new DateTime(0);
            BankAccount   account           = null;

            var ebExcludeAccountList = Helper.IsAsync ?
                                       await Helper.GetEBExcludeAccountSettingListAsync(token) :
                                       Helper.GetEBExcludeAccountSettingList();

            if (ebExcludeAccountList == null)
            {
                return(Tuple.Create(fileLog, ImportResult.FileReadError)); // UNDONE: ひとまず FileReadError を返す
            }

            foreach (var fields in records)
            {
                if (fields.Length < 1)
                {
                    parseResult = ImportResult.FileFormatError;
                    break;
                }
                var datakubun = fields[0];
                if (datakubun == Constants.DataKubun.Header)
                {
                    account = null;
                    if (fields.Length < 13)
                    {
                        parseResult = ImportResult.FileFormatError;
                        break;
                    }
                    var sakuseibi     = fields[3];
                    var bankCode      = fields[6];
                    var bankName      = fields[7];
                    var branchCode    = fields[8];
                    var branchName    = fields[9];
                    var yokinsyumoku  = fields[10];
                    var accountNumber = fields[11];
                    var accountName   = fields[12];

                    if (!Helper.ValidateBankCode(ref bankCode) ||
                        !Helper.ValidateBranchCode(ref branchCode) ||
                        !Helper.ValidateAccountNumber(ref accountNumber))
                    {
                        parseResult = ImportResult.BankAccountFormatError;
                        break;
                    }

                    bankName    = Helper.ConvertToValidEbCharacter(bankName).Left(30);
                    branchName  = Helper.ConvertToValidEbCharacter(branchName).Left(30);
                    accountName = Helper.ConvertToValidEbCharacter(accountName).Left(30);

                    var accountTypeId = 0;
                    if (!int.TryParse(yokinsyumoku, out accountTypeId) ||
                        !(Constants.ImportableAccountTypeIds.Contains(accountTypeId)))
                    {
                        parseResult = ImportResult.BankAccountFormatError;
                        break;
                    }
                    if (!Helper.TryParseJpDateTime(sakuseibi, out workDay))
                    {
                        parseResult = ImportResult.FileFormatError;
                        break;
                    }

                    account = Helper.IsAsync ?
                              await Helper.GetBankAccountAsync(bankCode, branchCode, accountTypeId, accountNumber, token) :
                              Helper.GetBankAccount(bankCode, branchCode, accountTypeId, accountNumber);

                    var defaultReceiptCategroyId = Helper.DefaultReceiptCategory?.Id;
                    if (account != null && !account.ReceiptCategoryId.HasValue ||
                        !defaultReceiptCategroyId.HasValue)
                    {
                        parseResult = ImportResult.FileReadError;
                        break;
                    }

                    receiptCategoryId = (account != null && account.ReceiptCategoryId.HasValue)
                        ? account.ReceiptCategoryId.Value
                        : defaultReceiptCategroyId.Value;
                    if (account?.ImportSkipping == 1)
                    {
                        parseSkipping = true;
                        header        = null;
                        continue;
                    }
                    header = new ReceiptHeader();
                    fileLog.ReceiptHeaders.Add(header);
                    header.Id              = fileLog.ReceiptHeaders.Count;
                    header.CompanyId       = Helper.CompanyId;
                    header.CurrencyId      = Helper.DefaultCurrency.Id;
                    header.ImportFileLogId = fileLog.Id; /* 採番後に置き換え */
                    header.Workday         = workDay;
                    header.BankCode        = bankCode;
                    header.BankName        = bankName;
                    header.BranchCode      = branchCode;
                    header.BranchName      = branchName;
                    header.AccountTypeId   = accountTypeId;
                    header.AccountNumber   = accountNumber;
                    header.AccountName     = accountName;
                    header.CreateBy        = Helper.LoginUserId;
                    header.UpdateBy        = Helper.LoginUserId;
                }
                if (datakubun == Constants.DataKubun.Data)
                {
                    if (fields.Length < 12)
                    {
                        parseResult = ImportResult.FileFormatError;
                        break;
                    }
                    if (parseSkipping)
                    {
                        continue;
                    }

                    fileLog.ReadCount++;

                    var kanjyoubi        = fields[2];
                    var kisanbi          = fields[3];
                    var kingaku1         = fields[4];
                    var payerCode        = fields[6];
                    var payerName        = fields[7];
                    var sourceBankName   = fields[8];
                    var sourceBranchName = fields[9];
                    var torikeshikubun   = fields[10];
                    var kingaku2         = fields[11];

                    if (torikeshikubun == "1")
                    {
                        continue;
                    }

                    DateTime recordedAt;
                    if (!Helper.TryParseJpDateTime(FileInformation.UseValueDate ? kisanbi : kanjyoubi, out recordedAt))
                    {
                        parseResult = ImportResult.FileFormatError;
                        break;
                    }

                    decimal receiptAmount;
                    if ((!decimal.TryParse(kingaku1, out receiptAmount) ||
                         receiptAmount == 0M && !decimal.TryParse(kingaku2, out receiptAmount) ||
                         receiptAmount == 0M) ||
                        Constants.MaxAmount < Math.Abs(receiptAmount))
                    {
                        parseResult = ImportResult.FileFormatError;
                        break;
                    }

                    if (!Helper.ValidatePayerCode(ref payerCode))
                    {
                        parseResult = ImportResult.PayerCodeFormatError;
                        break;
                    }

                    if (ebExcludeAccountList // EBデータ取込対象外口座設定
                        .Any(x => x.BankCode == header.BankCode &&
                             x.BranchCode == header.BranchCode &&
                             x.AccountTypeId == header.AccountTypeId &&
                             x.PayerCode == payerCode
                             ))
                    {
                        continue;
                    }

                    payerName        = Helper.ConvertToValidEbCharacter(payerName).Left(140);
                    sourceBankName   = Helper.ConvertToValidEbCharacter(sourceBankName).Left(140);
                    sourceBranchName = Helper.ConvertToValidEbCharacter(sourceBranchName).Left(15);

                    if (!Helper.IsValidEBChars(payerName))
                    {
                        parseResult = ImportResult.FileFormatError;
                        break;
                    }

                    int?customerId = Helper.IsAsync ?
                                     await Helper.GetCustomerIdByExclusiveInfoAsync(header.BankCode, header.BranchCode, payerCode, token) :
                                     Helper.GetCustomerIdByExclusiveInfo(header.BankCode, header.BranchCode, payerCode);

                    int?sectionId = (Helper.IsAsync ?
                                     await Helper.GetSectionIdByPayerCodeAsync(payerCode, token) :
                                     Helper.GetSectionIdByPayerCode(payerCode)) ?? account?.SectionId;

                    int?excludeCategoryId = Helper.UseApportion ? null : Helper.IsAsync ?
                                            await Helper.GetExcludeCategoryIdAsync(payerName, token) :
                                            Helper.GetExcludeCategoryId(payerName);

                    var receipt = new Receipt();
                    header.Receipts.Add(receipt);
                    receipt.Id                = header.Receipts.Count(); /* 自動採番 */
                    receipt.CompanyId         = Helper.CompanyId;
                    receipt.CurrencyId        = Helper.DefaultCurrency.Id;
                    receipt.ReceiptHeaderId   = header.Id; /* 自動採番後に置き換え */
                    receipt.ReceiptCategoryId = receiptCategoryId;
                    receipt.CustomerId        = customerId;
                    receipt.SectionId         = sectionId;
                    receipt.InputType         = Constants.InputTypeEbImporter;
                    receipt.Apportioned       = Helper.UseApportion ? 0 : 1;
                    receipt.Approved          = 1;
                    receipt.Workday           = workDay;
                    receipt.RecordedAt        = recordedAt;
                    receipt.ReceiptAmount     = receiptAmount;
                    receipt.RemainAmount      = receiptAmount;
                    receipt.PayerCode         = payerCode;
                    receipt.PayerName         = Helper.RemoveLegalPersonality(payerName);
                    receipt.PayerNameRaw      = payerName;
                    receipt.SourceBankName    = sourceBankName;
                    receipt.SourceBranchName  = sourceBranchName;

                    receipt.ExcludeFlag       = excludeCategoryId.HasValue ? 1 : 0;
                    receipt.ExcludeCategoryId = excludeCategoryId;
                    if (excludeCategoryId.HasValue)
                    {
                        receipt.ExcludeAmount  = receiptAmount;
                        receipt.RemainAmount   = 0M;
                        receipt.AssignmentFlag = 2;

                        var receiptExclude = new ReceiptExclude();
                        receiptExclude.Id                = receipt.Id;
                        receiptExclude.ReceiptId         = receipt.Id;
                        receiptExclude.ExcludeCategoryId = excludeCategoryId.Value;
                        receiptExclude.ExcludeAmount     = receiptAmount;
                        receiptExclude.CreateBy          = Helper.LoginUserId;
                        receiptExclude.UpdateBy          = Helper.LoginUserId;
                        header.ReceiptExcludes.Add(receiptExclude);
                    }
                    receipt.CreateBy = Helper.LoginUserId;
                    receipt.UpdateBy = Helper.LoginUserId;

                    header.ImportCount++;
                    header.ImportAmount += receiptAmount;
                    fileLog.ImportCount++;
                    fileLog.ImportAmount += receiptAmount;
                }
                if (datakubun == Constants.DataKubun.Trailer)
                {
                }
                if (datakubun == Constants.DataKubun.End)
                {
                }
            }

            if (parseResult == ImportResult.Success && fileLog?.ImportCount == 0)
            {
                parseResult = ImportResult.ImportDataNotFound;
            }

            return(Tuple.Create(fileLog, parseResult));
        }
Ejemplo n.º 6
0
        public async Task <Tuple <ImportFileLog, ImportResult> > ParseAsync(IEnumerable <string[]> fields, CancellationToken token = default(CancellationToken))
        {
            var fileLog = new ImportFileLog
            {
                Id        = FileInformation.Index,
                CompanyId = Helper.CompanyId,
                FileName  = FileInformation.Path,
                FileSize  = FileInformation.Size,
                CreateBy  = Helper.LoginUserId,
            };
            var parseResult = ImportResult.Success;

            ReceiptHeader header            = null;
            var           receiptCategoryId = 0;
            var           parseSkipping     = false;
            DateTime      workDay           = new DateTime(0);
            BankAccount   account           = null;

            var ebExcludeAccountList = Helper.IsAsync ?
                                       await Helper.GetEBExcludeAccountSettingListAsync(token) :
                                       Helper.GetEBExcludeAccountSettingList();

            if (ebExcludeAccountList == null)
            {
                return(Tuple.Create(fileLog, ImportResult.FileReadError)); // UNDONE: ひとまず FileReadError を返す
            }

            foreach (var field in fields)
            {
                if (field.Length < 1)
                {
                    parseResult = ImportResult.FileFormatError;
                    break;
                }
                var datakubun = field[0];
                if (datakubun == Constants.DataKubun.Header)
                {
                    account = null;
                    if (field.Length < 11)
                    {
                        parseResult = ImportResult.FileFormatError;
                        break;
                    }
                    var bankCode      = BankCode;
                    var branchCode    = field[1];
                    var bankName      = string.Empty;
                    var branchName    = field[2];
                    var kamokucode    = field[3];
                    var accountNumber = field[6];
                    var accountName   = field[7];
                    var sousabi       = field[10];

                    var accountTypeId = 0;
                    if (!int.TryParse(kamokucode, out accountTypeId) ||
                        !Constants.ImportableAccountTypeIds.Contains(accountTypeId) ||
                        !Helper.ValidateBranchCode(ref branchCode) ||
                        !Helper.ValidateAccountNumber(ref accountNumber))
                    {
                        parseResult = ImportResult.BankAccountFormatError;
                        break;
                    }

                    if (!Helper.TryParseDateTime(sousabi, out workDay))
                    {
                        parseResult = ImportResult.FileFormatError;
                        break;
                    }

                    branchCode    = Helper.ConvertToValidEbCharacter(branchCode).Right(3, '0', true);
                    accountNumber = Helper.ConvertToValidEbCharacter(accountNumber).Right(7, '0', true);

                    account = Helper.IsAsync ?
                              await Helper.GetBankAccountAsync(bankCode, branchCode, accountTypeId, accountNumber, token) :
                              Helper.GetBankAccount(bankCode, branchCode, accountTypeId, accountNumber);

                    if (account == null || !account.ReceiptCategoryId.HasValue)
                    {
                        parseResult = ImportResult.BankAccountMasterError;
                        FileInformation.BankInformation
                            = $"銀行コード:{bankCode}, 支店コード:{branchCode}, 預金種別:{Helper.GetAccountTypeNameById(accountTypeId)}, 口座番号:{accountNumber}";
                        break;
                    }

                    receiptCategoryId = account.ReceiptCategoryId.Value;

                    if (account.ImportSkipping == 1)
                    {
                        parseSkipping = true;
                        header        = null;
                        continue;
                    }

                    bankName    = Helper.ConvertToValidEbCharacter(account.BankName).Left(30);
                    branchName  = Helper.ConvertToValidEbCharacter(branchName).Left(30);
                    accountName = Helper.ConvertToValidEbCharacter(accountName).Left(30);

                    header = new ReceiptHeader();
                    fileLog.ReceiptHeaders.Add(header);
                    header.Id              = fileLog.ReceiptHeaders.Count;
                    header.CompanyId       = Helper.CompanyId;
                    header.CurrencyId      = Helper.DefaultCurrency.Id;
                    header.ImportFileLogId = fileLog.Id; /* 採番後に置き換え */
                    header.Workday         = workDay;
                    header.BankCode        = bankCode;
                    header.BankName        = bankName;
                    header.BranchCode      = branchCode;
                    header.BranchName      = branchName;
                    header.AccountTypeId   = accountTypeId;
                    header.AccountNumber   = accountNumber;
                    header.AccountName     = accountName;
                    header.CreateBy        = Helper.LoginUserId;
                    header.UpdateBy        = Helper.LoginUserId;
                }
                if (datakubun == Constants.DataKubun.Data)
                {
                    fileLog.ReadCount++;

                    if (parseSkipping)
                    {
                        continue;
                    }

                    if (field.Length < 10)
                    {
                        parseResult = ImportResult.FileFormatError;
                        break;
                    }

                    var torihikibi       = field[1];
                    var shiteibi         = field[2];
                    var payerName        = field[4];
                    var sourceBankName   = field[5];
                    var sourceBranchName = field[6];
                    var payerCode        = field[7];
                    var kingaku          = field[9 - Offset];

                    var symd = FileInformation.UseValueDate  ? shiteibi : torihikibi;
                    if (string.IsNullOrEmpty(symd))
                    {
                        symd = torihikibi;
                    }
                    DateTime recordedAt;
                    if (!Helper.TryParseDateTime(symd, out recordedAt))
                    {
                        parseResult = ImportResult.FileFormatError;
                        break;
                    }

                    decimal receiptAmount;
                    if (!decimal.TryParse(kingaku, out receiptAmount) ||
                        receiptAmount == 0M ||
                        Constants.MaxAmount < Math.Abs(receiptAmount))
                    {
                        parseResult = ImportResult.FileFormatError;
                        break;
                    }

                    if (!Helper.ValidatePayerCode(ref payerCode))
                    {
                        parseResult = ImportResult.PayerCodeFormatError;
                        break;
                    }

                    if (ebExcludeAccountList // EBデータ取込対象外口座設定
                        .Any(setting =>
                    {
                        return(header.BankCode == setting.BankCode &&
                               header.BranchCode == setting.BranchCode &&
                               header.AccountTypeId == setting.AccountTypeId &&
                               payerCode == setting.PayerCode);
                    }))
                    {
                        continue;
                    }

                    payerName        = Helper.ConvertToValidEbCharacter(payerName).Left(140);
                    sourceBankName   = Helper.ConvertToValidEbCharacter(sourceBankName).Left(140);
                    sourceBranchName = Helper.ConvertToValidEbCharacter(sourceBranchName).Left(15);

                    if (!Helper.IsValidEBChars(payerName))
                    {
                        parseResult = ImportResult.FileFormatError;
                        break;
                    }

                    int?customerId = Helper.IsAsync ?
                                     await Helper.GetCustomerIdByExclusiveInfoAsync(header.BankCode, header.BranchCode, payerCode, token) :
                                     Helper.GetCustomerIdByExclusiveInfo(header.BankCode, header.BranchCode, payerCode);

                    int?sectionId = (Helper.IsAsync ?
                                     await Helper.GetSectionIdByPayerCodeAsync(payerCode, token) :
                                     Helper.GetSectionIdByPayerCode(payerCode)) ?? account?.SectionId;

                    int?excludeCategoryId = Helper.UseApportion ? null : Helper.IsAsync ?
                                            await Helper.GetExcludeCategoryIdAsync(payerName, token) :
                                            Helper.GetExcludeCategoryId(payerName);

                    var receipt = new Receipt();
                    header.Receipts.Add(receipt);
                    receipt.Id                = header.Receipts.Count(); /* 自動採番 */
                    receipt.CompanyId         = Helper.CompanyId;
                    receipt.CurrencyId        = Helper.DefaultCurrency.Id;
                    receipt.ReceiptHeaderId   = header.Id; /* 自動採番後に置き換え */
                    receipt.ReceiptCategoryId = receiptCategoryId;
                    receipt.CustomerId        = customerId;
                    receipt.SectionId         = sectionId;
                    receipt.InputType         = Constants.InputTypeEbImporter;
                    receipt.Apportioned       = Helper.UseApportion ? 0 : 1;
                    receipt.Approved          = 1;
                    receipt.Workday           = workDay;
                    receipt.RecordedAt        = recordedAt;
                    receipt.ReceiptAmount     = receiptAmount;
                    receipt.RemainAmount      = receiptAmount;
                    receipt.PayerCode         = payerCode;
                    receipt.PayerName         = Helper.RemoveLegalPersonality(payerName);
                    receipt.PayerNameRaw      = payerName;
                    receipt.SourceBankName    = sourceBankName;
                    receipt.SourceBranchName  = sourceBranchName;

                    receipt.ExcludeFlag       = excludeCategoryId.HasValue ? 1 : 0;
                    receipt.ExcludeCategoryId = excludeCategoryId;
                    if (excludeCategoryId.HasValue)
                    {
                        receipt.ExcludeAmount  = receiptAmount;
                        receipt.RemainAmount   = 0M;
                        receipt.AssignmentFlag = 2;

                        var receiptExclude = new ReceiptExclude();
                        receiptExclude.Id                = receipt.Id;
                        receiptExclude.ReceiptId         = receipt.Id;
                        receiptExclude.ExcludeCategoryId = excludeCategoryId.Value;
                        receiptExclude.ExcludeAmount     = receiptAmount;
                        receiptExclude.CreateBy          = Helper.LoginUserId;
                        receiptExclude.UpdateBy          = Helper.LoginUserId;
                        header.ReceiptExcludes.Add(receiptExclude);
                    }
                    receipt.CreateBy = Helper.LoginUserId;
                    receipt.UpdateBy = Helper.LoginUserId;

                    header.ImportCount++;
                    header.ImportAmount += receiptAmount;
                    fileLog.ImportCount++;
                    fileLog.ImportAmount += receiptAmount;
                }
                if (datakubun == Constants.DataKubun.Trailer)
                {
                }
                if (datakubun == Constants.DataKubun.End)
                {
                }
            }

            if (parseResult == ImportResult.Success && fileLog?.ImportCount == 0)
            {
                parseResult = ImportResult.ImportDataNotFound;
            }

            return(Tuple.Create(fileLog, parseResult));
        }
Ejemplo n.º 7
0
        public async Task <Tuple <ImportFileLog, ImportResult> > ParseAsync(IEnumerable <string[]> lines, CancellationToken token = default(CancellationToken))
        {
            var torihikiKubuns = FileInformation.GetImportableValues();

            if (torihikiKubuns.Any())
            {
                ImportableTorihikiKubun = torihikiKubuns;
            }

            var fileLog = new ImportFileLog {
                Id        = FileInformation.Index,
                CompanyId = Helper.CompanyId,
                FileName  = FileInformation.Path,
                FileSize  = FileInformation.Size,
                CreateBy  = Helper.LoginUserId,
            };
            var parseResult = ImportResult.Success;

            ReceiptHeader header            = null;
            var           receiptCategoryId = 0;
            var           parseSkipping     = false;
            DateTime      workDay           = DateTime.MinValue;
            BankAccount   account           = null;

            foreach (var fields in lines)
            {
                if (fields.Length < 1)
                {
                    parseResult = ImportResult.FileFormatError;
                    break;
                }
                var datakubun = fields.First();
                if (datakubun == Constants.DataKubun.Header)
                {
                    if (fields.Length < 14)
                    {
                        parseResult = ImportResult.FileFormatError;
                        break;
                    }
                    if (header != null && header.Receipts.Any())
                    {
                        fileLog.ReceiptHeaders.Add(header);
                    }

                    var sakuseibi     = fields[2];
                    var bankCode      = fields[8];
                    var bankName      = fields[9];
                    var branchCode    = fields[10];
                    var branchName    = fields[11];
                    var accountType   = fields[12];
                    var accountNumber = fields[13];

                    if (!Helper.ValidateBankCode(ref bankCode) ||
                        !Helper.ValidateBranchCode(ref branchCode) ||
                        !Helper.ValidateAccountNumber(ref accountNumber))
                    {
                        parseResult = ImportResult.BankAccountFormatError;
                        break;
                    }
                    var accountTypeId = 0;
                    if (!int.TryParse(accountType, out accountTypeId) ||
                        !Constants.ImportableAccountTypeIds.Contains(accountTypeId))
                    {
                        parseResult = ImportResult.BankAccountFormatError;
                        break;
                    }
                    if (!Helper.TryParseDateTime(sakuseibi, out workDay))
                    {
                        parseResult = ImportResult.FileFormatError;
                        break;
                    }

                    account = Helper.IsAsync ?
                              await Helper.GetBankAccountAsync(bankCode, branchCode, accountTypeId, accountNumber, token) :
                              Helper.GetBankAccount(bankCode, branchCode, accountTypeId, accountNumber);

                    if (account == null || !account.ReceiptCategoryId.HasValue)
                    {
                        parseResult = ImportResult.BankAccountMasterError;
                        FileInformation.BankInformation
                            = $"銀行コード:{bankCode}, 支店コード:{branchCode}, 預金種別:{accountType}, 口座番号:{accountNumber}";
                        break;
                    }

                    if (account.ImportSkipping == 1)
                    {
                        parseSkipping = true;
                        header        = null;
                        continue;
                    }

                    parseSkipping     = false;
                    receiptCategoryId = account.ReceiptCategoryId.Value;

                    bankName   = Helper.ConvertToValidEbCharacter(bankName).Left(30);
                    branchName = Helper.ConvertToValidEbCharacter(branchName).Left(30);

                    header = new ReceiptHeader {
                        CompanyId       = Helper.CompanyId,
                        CurrencyId      = Helper.DefaultCurrency.Id,
                        ImportFileLogId = fileLog.ReceiptHeaders.Count,
                        Workday         = workDay,
                        BankCode        = bankCode,
                        BankName        = bankName,
                        BranchCode      = branchCode,
                        BranchName      = branchName,
                        AccountTypeId   = accountTypeId,
                        AccountNumber   = accountNumber,
                        AccountName     = string.Empty,
                        CreateBy        = Helper.LoginUserId,
                        UpdateBy        = Helper.LoginUserId,
                    };
                }
                if (datakubun == Constants.DataKubun.Data)
                {
                    if (fields.Length < 19)
                    {
                        parseResult = ImportResult.FileFormatError;
                        break;
                    }
                    if (parseSkipping)
                    {
                        continue;
                    }
                    fileLog.ReadCount++;

                    var torikeshikubun       = fields[6];
                    var kanjyoubi            = fields[8];
                    var kisanbi              = fields[9];
                    var torihikikubun        = fields[10];
                    var torihikikingakukubun = fields[11];
                    var torihikikingaku      = fields[12];
                    var tekiyo1              = fields[15];
                    var tekiyo2              = fields[16];
                    var sourceBankName       = fields[17];
                    var sourceBranchName     = fields[18];

                    if (!ImportableTorikeshiKubun.Contains(torikeshikubun) ||
                        !ImportableTorihikiKubun.Contains(torihikikubun))
                    {
                        continue;
                    }

                    var monthday = FileInformation.UseValueDate ? kisanbi : kanjyoubi;
                    monthday = monthday.Left(4, '0', true);
                    var month      = monthday.Substring(0, 2);
                    var day        = monthday.Substring(2);
                    var recordedAt = DateTime.MinValue;
                    if (!Helper.TryParseDateTimeAnser(month, day, out recordedAt))
                    {
                        parseResult = ImportResult.FileFormatError;
                        break;
                    }
                    var sign = GetSign(torihikikingakukubun);
                    if (sign == 0M)
                    {
                        parseResult = ImportResult.FileFormatError;
                        break;
                    }
                    var receiptAmount = 0M;
                    if (!decimal.TryParse(torihikikingaku, out receiptAmount) ||
                        Constants.MaxAmount < Math.Abs(receiptAmount))
                    {
                        parseResult = ImportResult.FileFormatError;
                        break;
                    }
                    receiptAmount = sign * receiptAmount;

                    var payerNameRaw = Helper.ConvertToValidEbCharacter((tekiyo1 + tekiyo2).Trim()).Left(140);
                    var payerName    = Helper.RemoveLegalPersonality(payerNameRaw);
                    sourceBankName   = Helper.ConvertToValidEbCharacter(sourceBankName).Left(140);
                    sourceBranchName = Helper.ConvertToValidEbCharacter(sourceBranchName).Left(140);

                    int?customerId = null; // Helper.GetCustomerIdByExclusiveInfo(account.BankCode, account.BranchCode, "");

                    int?sectionId = null;  // Helper.GetSectionIdByPayerCode(payerCode: "");

                    int?excludeCategoryId = Helper.UseApportion ? null : Helper.IsAsync ?
                                            await Helper.GetExcludeCategoryIdAsync(payerName, token) :
                                            Helper.GetExcludeCategoryId(payerName);

                    var receipt = new Receipt {
                        Id                = header.Receipts.Count() + 1,
                        CompanyId         = Helper.CompanyId,
                        CurrencyId        = Helper.DefaultCurrency.Id,
                        ReceiptHeaderId   = header.Id,
                        ReceiptCategoryId = receiptCategoryId,
                        CustomerId        = customerId,
                        SectionId         = sectionId,
                        InputType         = Constants.InputTypeEbImporter,
                        Apportioned       = Helper.UseApportion ? 0 : 1,
                        Approved          = 1,
                        Workday           = workDay,
                        RecordedAt        = recordedAt,
                        ReceiptAmount     = receiptAmount,
                        RemainAmount      = receiptAmount,
                        PayerCode         = string.Empty,
                        PayerName         = payerName,
                        PayerNameRaw      = payerNameRaw,
                        SourceBankName    = sourceBankName,
                        SourceBranchName  = sourceBranchName,
                        ExcludeFlag       = excludeCategoryId.HasValue ? 1 : 0,
                        ExcludeCategoryId = excludeCategoryId,
                        CreateBy          = Helper.LoginUserId,
                        UpdateBy          = Helper.LoginUserId,
                    };
                    if (excludeCategoryId.HasValue)
                    {
                        receipt.ExcludeAmount  = receiptAmount;
                        receipt.RemainAmount   = 0M;
                        receipt.AssignmentFlag = 2;
                        var exclude = new ReceiptExclude {
                            Id                = receipt.Id,
                            ReceiptId         = receipt.Id,
                            ExcludeCategoryId = excludeCategoryId,
                            ExcludeAmount     = receiptAmount,
                            CreateBy          = Helper.LoginUserId,
                            UpdateBy          = Helper.LoginUserId,
                        };
                        header.ReceiptExcludes.Add(exclude);
                    }
                    header.Receipts.Add(receipt);

                    header.ImportCount++;
                    header.ImportAmount += receiptAmount;
                    fileLog.ImportCount++;
                    fileLog.ImportAmount += receiptAmount;
                }
                if (datakubun == Constants.DataKubun.Trailer)
                {
                }
                if (datakubun == Constants.DataKubun.End)
                {
                }
            }
            if (header != null && header.Receipts.Any())
            {
                fileLog.ReceiptHeaders.Add(header);
            }

            if (parseResult == ImportResult.Success && !fileLog.ReceiptHeaders.Any())
            {
                parseResult = ImportResult.ImportDataNotFound;
            }

            return(Tuple.Create(fileLog, parseResult));
        }
Ejemplo n.º 8
0
        public async Task <Tuple <ImportFileLog, ImportResult> > ParseAsync(IEnumerable <string[]> fields, CancellationToken token = default(CancellationToken))
        {
            var torihikiKubuns = FileInformation.GetImportableValues();

            if (torihikiKubuns.Any())
            {
                ImportableTorihikiKubun = torihikiKubuns;
            }
            var fileLog = new ImportFileLog {
                Id        = FileInformation.Index,   /* 自動採番で置き換え */
                CompanyId = Helper.CompanyId,
                FileName  = FileInformation.Path,
                FileSize  = FileInformation.Size,
                CreateBy  = Helper.LoginUserId,
            };
            var           parseResult       = ImportResult.Success;
            ReceiptHeader header            = null;
            var           receiptCategoryId = 0;
            DateTime      workDay           = DateTime.Today;
            BankAccount   bankBuf           = null;

            foreach (var field in fields)
            {
                if (field.Length < 13)
                {
                    parseResult = ImportResult.FileFormatError;
                    break;
                }

                var syoukaikouza     = field[0];
                var kanjyoubi        = field[2];
                var kisanbi          = field[3];
                var kingaku          = field[5];
                var torihikikubun    = field[8];
                var sourceBankName   = field[10];
                var sourceBranchName = field[11];
                var payerName        = field[12];

                if (syoukaikouza == SkipWord)
                {
                    continue;
                }

                var bankCode      = BankCode;
                var branchCode    = GetBranchCode(syoukaikouza).Right(3, '0', true);
                var accountTypeId = Helper.GetAccountTypeIdByName(syoukaikouza);

                if (!Constants.ImportableAccountTypeIds.Contains(accountTypeId))
                {
                    parseResult = ImportResult.FileFormatError;
                    break;
                }

                var accountNumber = GetAccountNumber(syoukaikouza);

                var account = Helper.IsAsync ?
                              await Helper.GetBankAccountAsync(bankCode, branchCode, accountTypeId, accountNumber, token) :
                              Helper.GetBankAccount(bankCode, branchCode, accountTypeId, accountNumber);

                if (account == null || !account.ReceiptCategoryId.HasValue)
                {
                    parseResult = ImportResult.BankAccountMasterError;
                    FileInformation.BankInformation
                        = $"銀行コード:{bankCode}, 支店コード:{branchCode}, 預金種別:{Helper.GetAccountTypeNameById(accountTypeId)}, 口座番号:{accountNumber}";
                    break;
                }

                if (account.ImportSkipping == 1)
                {
                    // parameter
                    continue;
                }

                fileLog.ReadCount++;

                if (!ImportableTorihikiKubun.Contains(torihikikubun))
                {
                    continue;
                }

                var bankName   = account.BankName.Left(30);
                var branchName = account.BranchName.Left(30);

                receiptCategoryId = account.ReceiptCategoryId.Value;

                if (!(bankBuf?.Id == account.Id))
                {
                    header = new ReceiptHeader();
                    fileLog.ReceiptHeaders.Add(header);
                    header.Id              = fileLog.ReceiptHeaders.Count; /* 自動採番で置き換え */
                    header.CompanyId       = Helper.CompanyId;
                    header.CurrencyId      = Helper.DefaultCurrency.Id;
                    header.ImportFileLogId = fileLog.Id; /* 採番後に置き換え */
                    header.Workday         = workDay;
                    header.BankCode        = bankCode;
                    header.BankName        = bankName;
                    header.BranchCode      = branchCode;
                    header.BranchName      = branchName;
                    header.AccountTypeId   = accountTypeId;
                    header.AccountNumber   = accountNumber;
                    header.AccountName     = string.Empty;
                    header.CreateBy        = Helper.LoginUserId;
                    header.UpdateBy        = Helper.LoginUserId;

                    bankBuf = account;
                }

                kisanbi = kisanbi.Replace("(", "").Replace(")", "");
                var symd = FileInformation.UseValueDate ? kisanbi : kanjyoubi;
                if (string.IsNullOrEmpty(symd))
                {
                    symd = kanjyoubi;
                }
                DateTime recordedAt;
                if (!Helper.TryParseDateTime(symd, out recordedAt, DateFormat))
                {
                    parseResult = ImportResult.FileFormatError;
                    break;
                }

                decimal receiptAmount;
                if (!decimal.TryParse(kingaku, out receiptAmount) ||
                    receiptAmount == 0M ||
                    Constants.MaxAmount < Math.Abs(receiptAmount))
                {
                    parseResult = ImportResult.FileFormatError;
                    break;
                }
                var payerCode = string.Empty;

                payerName        = Helper.ConvertToValidEbCharacter(payerName).Left(140);
                sourceBankName   = Helper.ConvertToValidEbCharacter(sourceBankName).Left(140);
                sourceBranchName = Helper.ConvertToValidEbCharacter(sourceBranchName).Left(15);

                if (!Helper.IsValidEBChars(payerName))
                {
                    parseResult = ImportResult.FileFormatError;
                    break;
                }

                int?customerId = null;             // Helper.GetCustomerIdByExclusiveInfo(header.BankCode, header.BranchCode, header.AccountType, payerCode);

                int?sectionId = account.SectionId; // Helper.GetSectionIdByPayerCode(payerCode);

                int?excludeCategoryId = Helper.UseApportion ? null : Helper.IsAsync ?
                                        await Helper.GetExcludeCategoryIdAsync(payerName, token) :
                                        Helper.GetExcludeCategoryId(payerName);

                var receipt = new Receipt();
                header.Receipts.Add(receipt);
                receipt.Id                = header.Receipts.Count(); /* 自動採番 */
                receipt.CompanyId         = Helper.CompanyId;
                receipt.CurrencyId        = Helper.DefaultCurrency.Id;
                receipt.ReceiptHeaderId   = header.Id; /* 自動採番後に置き換え */
                receipt.ReceiptCategoryId = receiptCategoryId;
                receipt.CustomerId        = customerId;
                receipt.SectionId         = sectionId;
                receipt.InputType         = Constants.InputTypeEbImporter;
                receipt.Apportioned       = Helper.UseApportion ? 0 : 1;
                receipt.Approved          = 1;
                receipt.Workday           = workDay;
                receipt.RecordedAt        = recordedAt;
                receipt.ReceiptAmount     = receiptAmount;
                receipt.RemainAmount      = receiptAmount;
                receipt.PayerCode         = payerCode;
                receipt.PayerName         = Helper.RemoveLegalPersonality(payerName);
                receipt.PayerNameRaw      = payerName;
                receipt.SourceBankName    = sourceBankName;
                receipt.SourceBranchName  = sourceBranchName;

                receipt.ExcludeFlag       = excludeCategoryId.HasValue ? 1 : 0;
                receipt.ExcludeCategoryId = excludeCategoryId;
                if (excludeCategoryId.HasValue)
                {
                    receipt.ExcludeAmount  = receiptAmount;
                    receipt.RemainAmount   = 0M;
                    receipt.AssignmentFlag = 2;

                    var receiptExclude = new ReceiptExclude();
                    receiptExclude.Id                = receipt.Id;
                    receiptExclude.ReceiptId         = receipt.Id;
                    receiptExclude.ExcludeCategoryId = excludeCategoryId.Value;
                    receiptExclude.ExcludeAmount     = receiptAmount;
                    receiptExclude.CreateBy          = Helper.LoginUserId;
                    receiptExclude.UpdateBy          = Helper.LoginUserId;
                    header.ReceiptExcludes.Add(receiptExclude);
                }
                receipt.CreateBy = Helper.LoginUserId;
                receipt.UpdateBy = Helper.LoginUserId;

                header.ImportCount++;
                header.ImportAmount += receiptAmount;
                fileLog.ImportCount++;
                fileLog.ImportAmount += receiptAmount;
            }

            if (parseResult == ImportResult.Success && fileLog?.ImportCount == 0)
            {
                parseResult = ImportResult.ImportDataNotFound;
            }

            return(Tuple.Create(fileLog, parseResult));
        }
Ejemplo n.º 9
0
        public async Task <Tuple <ImportFileLog, ImportResult> > ParseAsync(IEnumerable <string[]> fields, CancellationToken token = default(CancellationToken))
        {
            var settingKubun = FileInformation.GetImportableValues();

            if (settingKubun.Any())
            {
                ImportableTorihikiName = settingKubun;
            }

            var fileLog = new ImportFileLog
            {
                Id        = FileInformation.Index,   /* 自動採番で置き換え */
                CompanyId = Helper.CompanyId,
                FileName  = FileInformation.Path,
                FileSize  = FileInformation.Size,
                CreateBy  = Helper.LoginUserId,
            };
            var           parseResult       = ImportResult.Success;
            ReceiptHeader header            = null;
            var           receiptCategoryId = 0;
            DateTime      workDay           = new DateTime(0);


            BankAccount bankBuf    = null;
            DateTime    workDayBuf = new DateTime(0);

            foreach (var field in fields)
            {
                if (field.Length < 1)
                {
                    parseResult = ImportResult.FileFormatError;
                    break;
                }

                var recordKubun = field[0];

                if (!ImportableRecordKubun.Contains(recordKubun))
                {
                    continue;
                }

                if (field.Length < 27)
                {
                    parseResult = ImportResult.FileFormatError;
                    break;
                }

                var torihikimei = field[12];

                if (!ImportableTorihikiName.Contains(torihikimei))
                {
                    continue;
                }

                var headerMonth      = field[1];
                var headerday        = field[2];
                var accountName      = field[5];
                var bankName         = field[6];
                var branchName       = field[7];
                var kouzasyubetsu    = field[9];
                var accountNumber    = field[10];
                var toriatsukaiMonth = field[15];
                var toriatsukaiDay   = field[16];
                var kisanbiMonth     = field[17];
                var kisanbiDay       = field[18];
                var kingaku          = field[19];
                var payerName        = field[21];
                var sourceBankName   = field[25];
                var sourceBranchName = field[26];

                var accountTypeId = Helper.GetAccountTypeIdByName(kouzasyubetsu);

                if (!Constants.ImportableAccountTypeIds.Contains(accountTypeId) ||
                    !Helper.ValidateAccountNumber(ref accountNumber))
                {
                    parseResult = ImportResult.BankAccountFormatError;
                    break;
                }

                bankName    = bankName.Left(30);
                branchName  = branchName.Left(30);
                accountName = accountName.Left(30);

                var account = Helper.IsAsync ?
                              await Helper.GetBankAccountByBankNameAsync(bankName, branchName, accountTypeId, accountNumber, token) :
                              Helper.GetBankAccountByBankName(bankName, branchName, accountTypeId, accountNumber);

                if (account == null || !account.ReceiptCategoryId.HasValue)
                {
                    parseResult = ImportResult.BankAccountMasterError;
                    FileInformation.BankInformation
                        = $"銀行名:{bankName} 支店名:{branchName}, 預金種別:{Helper.GetAccountTypeNameById(accountTypeId)}, 口座番号:{accountNumber}";
                    break;
                }

                fileLog.ReadCount++;

                if (account.ImportSkipping == 1)
                {
                    continue;
                }

                if (!Helper.TryParseDateTimeAnser(headerMonth, headerday, out workDay))
                {
                    parseResult = ImportResult.FileFormatError;
                    break;
                }

                var bankCode   = Helper.ConvertToValidEbCharacter(account.BankCode).Right(4, '0', true);
                var branchCode = Helper.ConvertToValidEbCharacter(account.BranchCode).Right(3, '0', true);

                receiptCategoryId = account.ReceiptCategoryId.Value;

                if (!(bankBuf?.Id == account.Id &&
                      workDayBuf == workDay))
                {
                    header = new ReceiptHeader();
                    fileLog.ReceiptHeaders.Add(header);
                    header.Id              = fileLog.ReceiptHeaders.Count; /* 自動採番で置き換え */
                    header.CompanyId       = Helper.CompanyId;
                    header.CurrencyId      = Helper.DefaultCurrency.Id;
                    header.ImportFileLogId = fileLog.Id; /* 採番後に置き換え */
                    header.Workday         = workDay;
                    header.BankCode        = bankCode;
                    header.BankName        = bankName;
                    header.BranchCode      = branchCode;
                    header.BranchName      = branchName;
                    header.AccountTypeId   = accountTypeId;
                    header.AccountNumber   = accountNumber;
                    header.AccountName     = accountName;
                    header.CreateBy        = Helper.LoginUserId;
                    header.UpdateBy        = Helper.LoginUserId;

                    bankBuf    = account;
                    workDayBuf = workDay;
                }

                DateTime recordedAt;
                var      smonth = FileInformation.UseValueDate ? kisanbiMonth : toriatsukaiMonth;
                if (string.IsNullOrEmpty(smonth))
                {
                    smonth = toriatsukaiMonth;
                }
                var sday = FileInformation.UseValueDate ? kisanbiDay : toriatsukaiDay;
                if (string.IsNullOrEmpty(sday))
                {
                    sday = toriatsukaiDay;
                }
                if (!Helper.TryParseDateTimeAnser(smonth, sday,
                                                  out recordedAt))
                {
                    parseResult = ImportResult.FileFormatError;
                    break;
                }

                decimal receiptAmount;
                if (!decimal.TryParse(kingaku, out receiptAmount) ||
                    receiptAmount == 0M ||
                    Constants.MaxAmount < Math.Abs(receiptAmount))
                {
                    parseResult = ImportResult.FileFormatError;
                    break;
                }
                var payerCode = string.Empty;
                payerName        = Helper.ConvertToValidEbCharacter(payerName).Left(140);
                sourceBankName   = Helper.ConvertToValidEbCharacter(sourceBankName).Left(140);
                sourceBranchName = Helper.ConvertToValidEbCharacter(sourceBranchName).Left(15);

                if (!Helper.IsValidEBChars(payerName))
                {
                    parseResult = ImportResult.FileFormatError;
                    break;
                }

                int?customerId = null;             // Helper.GetCustomerIdByExclusiveInfo(header.BankCode, header.BranchCode, header.AccountType, payerCode);

                int?sectionId = account.SectionId; // Helper.GetSectionIdByPayerCode(payerCode);

                int?excludeCategoryId = Helper.UseApportion ? null : Helper.IsAsync ?
                                        await Helper.GetExcludeCategoryIdAsync(payerName, token) :
                                        Helper.GetExcludeCategoryId(payerName);

                var receipt = new Receipt();
                header.Receipts.Add(receipt);
                receipt.Id                = header.Receipts.Count(); /* 自動採番 */
                receipt.CompanyId         = Helper.CompanyId;
                receipt.CurrencyId        = Helper.DefaultCurrency.Id;
                receipt.ReceiptHeaderId   = header.Id; /* 自動採番後に置き換え */
                receipt.ReceiptCategoryId = receiptCategoryId;
                receipt.CustomerId        = customerId;
                receipt.SectionId         = sectionId;
                receipt.InputType         = Constants.InputTypeEbImporter;
                receipt.Apportioned       = Helper.UseApportion ? 0 : 1;
                receipt.Approved          = 1;
                receipt.Workday           = workDay;
                receipt.RecordedAt        = recordedAt;
                receipt.ReceiptAmount     = receiptAmount;
                receipt.RemainAmount      = receiptAmount;
                receipt.PayerCode         = payerCode;
                receipt.PayerName         = Helper.RemoveLegalPersonality(payerName);
                receipt.PayerNameRaw      = payerName;
                receipt.SourceBankName    = sourceBankName;
                receipt.SourceBranchName  = sourceBranchName;

                receipt.ExcludeFlag       = excludeCategoryId.HasValue ? 1 : 0;
                receipt.ExcludeCategoryId = excludeCategoryId;
                if (excludeCategoryId.HasValue)
                {
                    receipt.ExcludeAmount  = receiptAmount;
                    receipt.RemainAmount   = 0M;
                    receipt.AssignmentFlag = 2;

                    var receiptExclude = new ReceiptExclude();
                    receiptExclude.Id                = receipt.Id;
                    receiptExclude.ReceiptId         = receipt.Id;
                    receiptExclude.ExcludeCategoryId = excludeCategoryId.Value;
                    receiptExclude.ExcludeAmount     = receiptAmount;
                    receiptExclude.CreateBy          = Helper.LoginUserId;
                    receiptExclude.UpdateBy          = Helper.LoginUserId;
                    header.ReceiptExcludes.Add(receiptExclude);
                }
                receipt.CreateBy = Helper.LoginUserId;
                receipt.UpdateBy = Helper.LoginUserId;

                header.ImportCount++;
                header.ImportAmount += receiptAmount;
                fileLog.ImportCount++;
                fileLog.ImportAmount += receiptAmount;
            }

            if (parseResult == ImportResult.Success && fileLog?.ImportCount == 0)
            {
                parseResult = ImportResult.ImportDataNotFound;
            }

            return(Tuple.Create(fileLog, parseResult));
        }
Ejemplo n.º 10
0
        public async Task <Tuple <ImportFileLog, ImportResult> > ParseAsync(IEnumerable <string[]> lines, CancellationToken token = default(CancellationToken))
        {
            var fileLog = new ImportFileLog {
                Id        = FileInformation.Index,
                CompanyId = Helper.CompanyId,
                FileName  = FileInformation.Path,
                FileSize  = FileInformation.Size,
                CreateBy  = Helper.LoginUserId,
            };
            var parseResult = ImportResult.Success;

            ReceiptHeader header            = null;
            var           receiptCategoryId = 0;
            var           parseSkipping     = false;
            DateTime      workDay           = DateTime.MinValue;
            BankAccount   account           = null;

            const int HeaderFieldsCount = 7;
            const int DetailFieldsCount = 6;

            foreach (var fields in lines)
            {
                if (fields.Length < 1)
                {
                    parseResult = ImportResult.FileFormatError;
                    break;
                }

                if (fields.Length == HeaderFieldsCount)
                {
                    if (header != null && header.Receipts.Any())
                    {
                        fileLog.ReceiptHeaders.Add(header);
                    }
                    var bankName         = fields[0];
                    var branchName       = fields[1];
                    var accountTypeName  = fields[2];
                    var accountNumber    = fields[3];
                    var searchYMDFrom    = fields[4];
                    var searchYMDTo      = fields[5];
                    var downloadDateTime = fields[6];
                    var accountTypeId    = Helper.GetAccountTypeIdByName(accountTypeName);
                    if (accountTypeId == 0)
                    {
                        parseResult = ImportResult.BankAccountFormatError;
                        break;
                    }
                    if (!Helper.ValidateAccountNumber(ref accountNumber))
                    {
                        parseResult = ImportResult.BankAccountFormatError;
                        break;
                    }
                    bankName   = bankName.Left(30);
                    branchName = branchName.Left(30);

                    account = Helper.IsAsync ?
                              await Helper.GetBankAccountByBankNameAsync(bankName, branchName, accountTypeId, accountNumber, token) :
                              Helper.GetBankAccountByBankName(bankName, branchName, accountTypeId, accountNumber);

                    if (account == null || !account.ReceiptCategoryId.HasValue)
                    {
                        parseResult = ImportResult.BankAccountMasterError;
                        FileInformation.BankInformation
                            = $"銀行名:{bankName}, 支店名:{branchName}, 預金種別:{accountTypeName}, 口座番号:{accountNumber}";
                        break;
                    }

                    if (account.ImportSkipping == 1)
                    {
                        parseSkipping = true;
                        header        = null;
                        continue;
                    }

                    if (!Helper.TryParseDateTime(downloadDateTime, out workDay, "yyyyMMddHHmmss"))
                    {
                        parseResult = ImportResult.FileFormatError;
                        break;
                    }
                    workDay = workDay.Date;

                    parseSkipping     = false;
                    receiptCategoryId = account.ReceiptCategoryId.Value;

                    header = new ReceiptHeader {
                        CompanyId       = Helper.CompanyId,
                        CurrencyId      = Helper.DefaultCurrency.Id,
                        ImportFileLogId = fileLog.ReceiptHeaders.Count,
                        Workday         = workDay,
                        BankCode        = account.BankCode,
                        BankName        = bankName,
                        BranchCode      = account.BranchCode,
                        BranchName      = branchName,
                        AccountTypeId   = accountTypeId,
                        AccountNumber   = accountNumber,
                        AccountName     = string.Empty,
                        CreateBy        = Helper.LoginUserId,
                        UpdateBy        = Helper.LoginUserId,
                    };
                }
                else if (fields.Length == DetailFieldsCount)
                {
                    if (parseSkipping)
                    {
                        continue;
                    }

                    fileLog.ReadCount++;

                    var dealNumber  = fields[0];
                    var torihikibi  = fields[1];
                    var syukkingaku = fields[2];
                    var nyuukingaku = fields[3];
                    var tekiyou     = fields[4];
                    var zandaka     = fields[5];

                    var recordedAt = DateTime.MinValue;
                    if (!Helper.TryParseDateTime(torihikibi, out recordedAt))
                    {
                        parseResult = ImportResult.FileFormatError;
                        break;
                    }

                    var receiptAmount = 0M;
                    if (string.IsNullOrWhiteSpace(nyuukingaku))
                    {
                        continue;
                    }
                    if (!decimal.TryParse(nyuukingaku, out receiptAmount) ||
                        Constants.MaxAmount < Math.Abs(receiptAmount))
                    {
                        parseResult = ImportResult.FileFormatError;
                        break;
                    }
                    if (receiptAmount == 0M)
                    {
                        continue;
                    }

                    tekiyou = Helper.ConvertToValidEbCharacter(tekiyou);
                    tekiyou = string.Concat(tekiyou.Select(c => c.ToString()).Where(x => Helper.GetByteCount(x) == 1).ToArray()).Trim();
                    var payerNameRaw = tekiyou.Left(140);
                    var payerName    = Helper.RemoveLegalPersonality(payerNameRaw);

                    int?customerId = null; // Helper.GetCustomerIdByExclusiveInfo(account.BankCode, account.BranchCode, "");

                    int?sectionId = null;  // Helper.GetSectionIdByPayerCode(payerCode: "");

                    int?excludeCategoryId = Helper.UseApportion ? null : Helper.IsAsync ?
                                            await Helper.GetExcludeCategoryIdAsync(payerName, token) :
                                            Helper.GetExcludeCategoryId(payerName);

                    var receipt = new Receipt {
                        Id                = header.Receipts.Count() + 1,
                        CompanyId         = Helper.CompanyId,
                        CurrencyId        = Helper.DefaultCurrency.Id,
                        ReceiptHeaderId   = header.Id,
                        ReceiptCategoryId = receiptCategoryId,
                        CustomerId        = customerId,
                        SectionId         = sectionId,
                        InputType         = Constants.InputTypeEbImporter,
                        Apportioned       = Helper.UseApportion ? 0 : 1,
                        Approved          = 1,
                        Workday           = workDay,
                        RecordedAt        = recordedAt,
                        ReceiptAmount     = receiptAmount,
                        RemainAmount      = receiptAmount,
                        PayerCode         = string.Empty,
                        PayerName         = payerName,
                        PayerNameRaw      = payerNameRaw,
                        SourceBankName    = string.Empty,
                        SourceBranchName  = string.Empty,
                        ExcludeFlag       = excludeCategoryId.HasValue ? 1 : 0,
                        ExcludeCategoryId = excludeCategoryId,
                        CreateBy          = Helper.LoginUserId,
                        UpdateBy          = Helper.LoginUserId,
                    };
                    if (excludeCategoryId.HasValue)
                    {
                        receipt.ExcludeAmount  = receiptAmount;
                        receipt.RemainAmount   = 0M;
                        receipt.AssignmentFlag = 2;
                        var exclude = new ReceiptExclude {
                            Id                = receipt.Id,
                            ReceiptId         = receipt.Id,
                            ExcludeCategoryId = excludeCategoryId,
                            ExcludeAmount     = receiptAmount,
                            CreateBy          = Helper.LoginUserId,
                            UpdateBy          = Helper.LoginUserId,
                        };
                        header.ReceiptExcludes.Add(exclude);
                    }
                    header.Receipts.Add(receipt);

                    header.ImportCount++;
                    header.ImportAmount += receiptAmount;
                    fileLog.ImportCount++;
                    fileLog.ImportAmount += receiptAmount;
                }
                else
                {
                    continue;
                }
            }

            if (header != null && header.Receipts.Any())
            {
                fileLog.ReceiptHeaders.Add(header);
            }

            if (parseResult == ImportResult.Success && !fileLog.ReceiptHeaders.Any())
            {
                parseResult = ImportResult.ImportDataNotFound;
            }

            return(Tuple.Create(fileLog, parseResult));
        }
Ejemplo n.º 11
0
        public async Task <Tuple <ImportFileLog, ImportResult> > ParseAsync(IEnumerable <string[]> fields, CancellationToken token = default(CancellationToken))
        {
            var fileLog = new ImportFileLog
            {
                Id        = FileInformation.Index,   /* 自動採番で置き換え */
                CompanyId = Helper.CompanyId,
                FileName  = FileInformation.Path,
                FileSize  = FileInformation.Size,
                CreateBy  = Helper.LoginUserId,
            };
            var           parseResult       = ImportResult.Success;
            ReceiptHeader header            = null;
            var           receiptCategoryId = 0;
            DateTime      workDay           = DateTime.Today;
            DateTime      recordedAt        = new DateTime(0);
            BankAccount   bank = null;

            var parseSkipping = false;

            foreach (var field in fields)
            {
                if (field.Length < 1)
                {
                    parseResult = ImportResult.FileFormatError;
                    break;
                }
                var datakubun = field[0];
                if (datakubun == Constants.DataKubun.Header)
                {
                    if (field.Length < 5)
                    {
                        parseResult = ImportResult.FileFormatError;
                        break;
                    }
                    bank = null;
                    var bankCode          = Constants.JPBankCode;
                    var ukeirekouzakigou  = field[2];
                    var ukeirekouzanumber = field[3];
                    var toriatsukaibi     = field[4];
                    var branchName        = ukeirekouzakigou + ukeirekouzanumber;

                    var branchCode    = string.Empty;
                    var bankName      = string.Empty;
                    var accountNumber = string.Empty;
                    var accountName   = string.Empty;

                    if (!Helper.TryParseDateTime(toriatsukaibi, out recordedAt))
                    {
                        parseResult = ImportResult.FileFormatError;
                        break;
                    }

                    bank = Helper.IsAsync ?
                           await Helper.GetBankAccountByBranchNameAsync(bankCode, branchName, token) :
                           Helper.GetBankAccountByBranchName(bankCode, branchName);

                    if (bank == null || !bank.ReceiptCategoryId.HasValue)
                    {
                        parseResult = ImportResult.BankAccountMasterError;
                        FileInformation.BankInformation
                            = $"銀行コード:{bankCode}, 支店名:{branchName}";
                        break;
                    }

                    receiptCategoryId = bank.ReceiptCategoryId.Value;

                    branchCode    = bank.BranchCode.Right(3, '0', true);
                    accountNumber = bank.AccountNumber.Right(7, '0', true);
                    bankName      = bank.BankName.Left(30);

                    if (bank.ImportSkipping == 1)
                    {
                        parseSkipping = true;
                        header        = null;
                        continue;
                    }
                    header = new ReceiptHeader();
                    fileLog.ReceiptHeaders.Add(header);
                    header.Id              = fileLog.ReceiptHeaders.Count;
                    header.CompanyId       = Helper.CompanyId;
                    header.CurrencyId      = Helper.DefaultCurrency.Id;
                    header.ImportFileLogId = fileLog.Id; /* 採番後に置き換え */
                    header.Workday         = workDay;
                    header.BankCode        = bankCode;
                    header.BankName        = bankName;
                    header.BranchCode      = branchCode;
                    header.BranchName      = branchName;
                    header.AccountTypeId   = bank.AccountTypeId;
                    header.AccountNumber   = accountNumber;
                    header.AccountName     = string.Empty;
                    header.CreateBy        = Helper.LoginUserId;
                    header.UpdateBy        = Helper.LoginUserId;
                }
                if (datakubun == Constants.DataKubun.Data)
                {
                    if (parseSkipping)
                    {
                        continue;
                    }

                    fileLog.ReadCount++;

                    if (field.Length < 11)
                    {
                        parseResult = ImportResult.FileFormatError;
                        break;
                    }

                    var kingaku          = field[5];
                    var payerName        = field[10];
                    var sourceBankName   = string.Empty;
                    var sourceBranchName = string.Empty;

                    decimal receiptAmount;
                    if (!decimal.TryParse(kingaku, out receiptAmount) ||
                        receiptAmount == 0M ||
                        Constants.MaxAmount < Math.Abs(receiptAmount))
                    {
                        parseResult = ImportResult.FileFormatError;
                        break;
                    }

                    var payerCode = string.Empty;
                    payerName        = Helper.ConvertToValidEbCharacter(payerName).Left(140);
                    sourceBankName   = Helper.ConvertToValidEbCharacter(sourceBankName).Left(140);
                    sourceBranchName = Helper.ConvertToValidEbCharacter(sourceBranchName).Left(15);

                    if (!Helper.IsValidEBChars(payerName))
                    {
                        parseResult = ImportResult.FileFormatError;
                        break;
                    }

                    int?customerId = null;          // Helper.GetCustomerIdByExclusiveInfo(header.BankCode, header.BranchCode, header.AccountType, payerCode);

                    int?sectionId = bank.SectionId; // Helper.GetSectionIdByPayerCode(payerCode);

                    int?excludeCategoryId = Helper.UseApportion ? null : Helper.IsAsync ?
                                            await Helper.GetExcludeCategoryIdAsync(payerName, token) :
                                            Helper.GetExcludeCategoryId(payerName);

                    var receipt = new Receipt();
                    header.Receipts.Add(receipt);
                    receipt.Id                = header.Receipts.Count(); /* 自動採番 */
                    receipt.CompanyId         = Helper.CompanyId;
                    receipt.CurrencyId        = Helper.DefaultCurrency.Id;
                    receipt.ReceiptHeaderId   = header.Id; /* 自動採番後に置き換え */
                    receipt.ReceiptCategoryId = receiptCategoryId;
                    receipt.CustomerId        = customerId;
                    receipt.SectionId         = sectionId;
                    receipt.InputType         = Constants.InputTypeEbImporter;
                    receipt.Apportioned       = Helper.UseApportion ? 0 : 1;
                    receipt.Approved          = 1;
                    receipt.Workday           = workDay;
                    receipt.RecordedAt        = recordedAt;
                    receipt.ReceiptAmount     = receiptAmount;
                    receipt.RemainAmount      = receiptAmount;
                    receipt.PayerCode         = payerCode;
                    receipt.PayerName         = Helper.RemoveLegalPersonality(payerName);
                    receipt.PayerNameRaw      = payerName;
                    receipt.SourceBankName    = sourceBankName;
                    receipt.SourceBranchName  = sourceBranchName;

                    receipt.ExcludeFlag       = excludeCategoryId.HasValue ? 1 : 0;
                    receipt.ExcludeCategoryId = excludeCategoryId;
                    if (excludeCategoryId.HasValue)
                    {
                        receipt.ExcludeAmount  = receiptAmount;
                        receipt.RemainAmount   = 0M;
                        receipt.AssignmentFlag = 2;

                        var receiptExclude = new ReceiptExclude();
                        receiptExclude.Id                = receipt.Id;
                        receiptExclude.ReceiptId         = receipt.Id;
                        receiptExclude.ExcludeCategoryId = excludeCategoryId.Value;
                        receiptExclude.ExcludeAmount     = receiptAmount;
                        receiptExclude.CreateBy          = Helper.LoginUserId;
                        receiptExclude.UpdateBy          = Helper.LoginUserId;
                        header.ReceiptExcludes.Add(receiptExclude);
                    }
                    receipt.CreateBy = Helper.LoginUserId;
                    receipt.UpdateBy = Helper.LoginUserId;

                    header.ImportCount++;
                    header.ImportAmount += receiptAmount;
                    fileLog.ImportCount++;
                    fileLog.ImportAmount += receiptAmount;
                }
                if (datakubun == Constants.DataKubun.Trailer)
                {
                }
                if (datakubun == Constants.DataKubun.End)
                {
                }
            }

            if (parseResult == ImportResult.Success && fileLog?.ImportCount == 0)
            {
                parseResult = ImportResult.ImportDataNotFound;
            }

            return(Tuple.Create(fileLog, parseResult));
        }
Ejemplo n.º 12
0
        public async Task <Tuple <ImportFileLog, ImportResult> > ParseAsync(IEnumerable <string[]> lines, CancellationToken token = default(CancellationToken))
        {
            var settingKubun = FileInformation.GetImportableValues().Select(x => int.Parse(x)).ToArray();

            if (settingKubun.Any())
            {
                ImportableTorihikiKubun = settingKubun;
            }

            var fileLog = new ImportFileLog {
                Id        = FileInformation.Index,
                CompanyId = Helper.CompanyId,
                FileName  = FileInformation.Path,
                FileSize  = FileInformation.Size,
                CreateBy  = Helper.LoginUserId,
            };
            var parseResult = ImportResult.Success;

            ReceiptHeader header            = null;
            var           receiptCategoryId = 0;
            DateTime      workDay           = DateTime.MinValue;

            BankAccount bankBuf    = null;
            DateTime    workDayBuf = new DateTime(0);

            foreach (var fields in lines)
            {
                if (fields.Length < 25)
                {
                    parseResult = ImportResult.FileFormatError;
                    break;
                }

                var sakuseibi = fields[KewpieNetItemIndex.Sakuseibi];

                if (!Helper.TryParseJpDateTime(sakuseibi, out workDay))
                {
                    parseResult = ImportResult.FileFormatError;
                    break;
                }

                var bankCode      = fields[KewpieNetItemIndex.BankCode];
                var bankName      = fields[KewpieNetItemIndex.BankName];
                var branchCode    = fields[KewpieNetItemIndex.BranchCode];
                var branchName    = fields[KewpieNetItemIndex.BranchName];
                var accountType   = fields[KewpieNetItemIndex.AccountType];
                var accountNumber = fields[KewpieNetItemIndex.AccountNumber];
                var accountName   = fields[KewpieNetItemIndex.AccountName];

                if (!Helper.ValidateBankCode(ref bankCode) ||
                    !Helper.ValidateBranchCode(ref branchCode) ||
                    !Helper.ValidateAccountNumber(ref accountNumber))
                {
                    parseResult = ImportResult.BankAccountFormatError;
                    break;
                }

                var accountTypeId = 0;
                if (!int.TryParse(accountType, out accountTypeId) ||
                    !Constants.ImportableAccountTypeIds.Contains(accountTypeId))
                {
                    parseResult = ImportResult.BankAccountFormatError;
                    break;
                }
                var account = Helper.IsAsync ?
                              await Helper.GetBankAccountAsync(bankCode, branchCode, accountTypeId, accountNumber, token) :
                              Helper.GetBankAccount(bankCode, branchCode, accountTypeId, accountNumber);

                if (account == null || !account.ReceiptCategoryId.HasValue)
                {
                    parseResult = ImportResult.BankAccountMasterError;
                    FileInformation.BankInformation
                        = $"銀行コード:{bankCode}, 支店コード:{branchCode}, 預金種別:{accountType}, 口座番号:{accountNumber}";
                    break;
                }

                if (account.ImportSkipping == 1)
                {
                    continue;
                }
                fileLog.ReadCount++;
                receiptCategoryId = account.ReceiptCategoryId.Value;

                bankName    = bankName.Left(30);
                branchName  = branchName.Left(30);
                accountName = accountName.Left(30);

                if (!(bankBuf?.Id == account.Id &&
                      workDayBuf == workDay))
                {
                    header = new ReceiptHeader
                    {
                        CompanyId       = Helper.CompanyId,
                        CurrencyId      = Helper.DefaultCurrency.Id,
                        ImportFileLogId = fileLog.ReceiptHeaders.Count,
                        Workday         = workDay,
                        BankCode        = bankCode,
                        BankName        = bankName,
                        BranchCode      = branchCode,
                        BranchName      = branchName,
                        AccountTypeId   = accountTypeId,
                        AccountNumber   = accountNumber,
                        AccountName     = accountName,
                        CreateBy        = Helper.LoginUserId,
                        UpdateBy        = Helper.LoginUserId,
                    };

                    fileLog.ReceiptHeaders.Add(header);

                    bankBuf    = account;
                    workDayBuf = workDay;
                }

                var kanjyoubi        = fields[KewpieNetItemIndex.Kanjobi];
                var kisanbi          = fields[KewpieNetItemIndex.Kisanbi];
                var iribaraiKubun    = fields[KewpieNetItemIndex.IribaraiKubun];
                var torihikikubun    = fields[KewpieNetItemIndex.TorihikiKubun];
                var torihikikingaku  = fields[KewpieNetItemIndex.TorihikiKingaku];
                var sourceBankName   = fields[KewpieNetItemIndex.SourceBankName];
                var sourceBranchName = fields[KewpieNetItemIndex.SourceBranchName];
                var sourcePayerName  = fields[KewpieNetItemIndex.PayerName];

                var torihikikubunInt = 0;
                if (!int.TryParse(torihikikubun, out torihikikubunInt))
                {
                    parseResult = ImportResult.FileFormatError;
                    break;
                }
                if (!ImportableIribaraiKubun.Contains(iribaraiKubun) ||
                    !ImportableTorihikiKubun.Contains(torihikikubunInt))
                {
                    continue;
                }

                DateTime recordedAt;
                if (!Helper.TryParseJpDateTime(FileInformation.UseValueDate ? kisanbi : kanjyoubi, out recordedAt))
                {
                    parseResult = ImportResult.FileFormatError;
                    break;
                }

                var receiptAmount = 0M;
                if (!decimal.TryParse(torihikikingaku, out receiptAmount) ||
                    Constants.MaxAmount < Math.Abs(receiptAmount))
                {
                    parseResult = ImportResult.FileFormatError;
                    break;
                }

                var payerNameRaw = Helper.ConvertToValidEbCharacter((sourcePayerName).Trim()).Left(140);
                var payerName    = Helper.RemoveLegalPersonality(payerNameRaw);
                sourceBankName   = Helper.ConvertToValidEbCharacter(sourceBankName).Left(140);
                sourceBranchName = Helper.ConvertToValidEbCharacter(sourceBranchName).Left(140);

                int?customerId = null;

                int?sectionId = account?.SectionId;

                int?excludeCategoryId = Helper.UseApportion ? null : Helper.IsAsync ?
                                        await Helper.GetExcludeCategoryIdAsync(payerName, token) :
                                        Helper.GetExcludeCategoryId(payerName);

                var receipt = new Receipt
                {
                    Id                = header.Receipts.Count() + 1,
                    CompanyId         = Helper.CompanyId,
                    CurrencyId        = Helper.DefaultCurrency.Id,
                    ReceiptHeaderId   = header.Id,
                    ReceiptCategoryId = receiptCategoryId,
                    CustomerId        = customerId,
                    SectionId         = sectionId,
                    InputType         = Constants.InputTypeEbImporter,
                    Apportioned       = Helper.UseApportion ? 0 : 1,
                    Approved          = 1,
                    Workday           = workDay,
                    RecordedAt        = recordedAt,
                    ReceiptAmount     = receiptAmount,
                    RemainAmount      = receiptAmount,
                    PayerCode         = string.Empty,
                    PayerName         = payerName,
                    PayerNameRaw      = payerNameRaw,
                    SourceBankName    = sourceBankName,
                    SourceBranchName  = sourceBranchName,
                    ExcludeFlag       = excludeCategoryId.HasValue ? 1 : 0,
                    ExcludeCategoryId = excludeCategoryId,
                    CreateBy          = Helper.LoginUserId,
                    UpdateBy          = Helper.LoginUserId,
                };
                if (excludeCategoryId.HasValue)
                {
                    receipt.ExcludeAmount  = receiptAmount;
                    receipt.RemainAmount   = 0M;
                    receipt.AssignmentFlag = 2;
                    var exclude = new ReceiptExclude
                    {
                        Id                = receipt.Id,
                        ReceiptId         = receipt.Id,
                        ExcludeCategoryId = excludeCategoryId,
                        ExcludeAmount     = receiptAmount,
                        CreateBy          = Helper.LoginUserId,
                        UpdateBy          = Helper.LoginUserId,
                    };
                    header.ReceiptExcludes.Add(exclude);
                }
                header.Receipts.Add(receipt);

                header.ImportCount++;
                header.ImportAmount += receiptAmount;
                fileLog.ImportCount++;
                fileLog.ImportAmount += receiptAmount;
            }

            if (parseResult == ImportResult.Success && !fileLog.ReceiptHeaders.Any())
            {
                parseResult = ImportResult.ImportDataNotFound;
            }

            return(Tuple.Create(fileLog, parseResult));
        }
Ejemplo n.º 13
0
        /// <summary>読込処理</summary>
        /// <remarks>
        /// ヘッダー は 口座名 レコード確認時に検証
        /// ヘッダー 1..3 が 正しい順序で連携される前提
        /// ヘッダー 3が連携されない場合は正常に取込不可
        ///
        /// 以下備忘 Split(' ') → 右詰め 左詰め で 空白文字が連続すると、index でのアクセスが難しい
        /// 口座番号は 右詰めなので IEnumerable{string}.Last() を利用した
        /// </remarks>
        public async Task <Tuple <ImportFileLog, ImportResult> > ParseAsync(IEnumerable <string[]> lines, CancellationToken token = default(CancellationToken))
        {
            var fileLog = new ImportFileLog {
                Id        = FileInformation.Index,
                CompanyId = Helper.CompanyId,
                FileName  = FileInformation.Path,
                FileSize  = FileInformation.Size,
                CreateBy  = Helper.LoginUserId,
            };
            var parseResult = ImportResult.Success;

            ReceiptHeader header            = null;
            var           receiptCategoryId = 0;
            var           parseSkipping     = false;
            DateTime      workDay           = DateTime.Today;
            BankAccount   account           = null;

            var bankName      = string.Empty;
            var branchName    = string.Empty;
            var accountType   = string.Empty;
            var accountTypeId = 0;
            var accountNumber = string.Empty;
            var accountName   = string.Empty;

            foreach (var fields in lines)
            {
                if (!fields.Any())
                {
                    continue;
                }

                var content = fields.First();
                if (content.StartsWith(TrailerRecord1Start) ||
                    content.StartsWith(TrailerRecord2Start) ||
                    content.StartsWith(EndRecordStart))
                {
                    continue;
                }

                var headers = content.Split(' ').Select(x => x.Trim()).ToArray();
                if (content.StartsWith(HeaderRecord1Start))
                {
                    bankName   = headers[1].Trim();
                    branchName = headers[2].Trim();
                }
                else if (content.StartsWith(HeaderRecord2Start))
                {
                    accountType   = headers[1];
                    accountTypeId = Helper.GetAccountTypeIdByName(accountType);
                    accountNumber = headers.Last();
                }
                else if (content.StartsWith(HeaderRecord3Start))
                {
                    if (header != null && header.Receipts.Any())
                    {
                        fileLog.ReceiptHeaders.Add(header);
                    }

                    accountName = headers[1];
                    bankName    = Helper.ConvertToValidEbCharacter(bankName).Left(30);
                    branchName  = Helper.ConvertToValidEbCharacter(branchName).Left(30);
                    accountName = Helper.ConvertToValidEbCharacter(accountName).Left(140);

                    if (!Helper.ValidateAccountNumber(ref accountNumber))
                    {
                        parseResult = ImportResult.BankAccountFormatError;
                        break;
                    }

                    account = Helper.IsAsync ?
                              await Helper.GetBankAccountByBankNameAsync(bankName, branchName, accountTypeId, accountNumber, token) :
                              Helper.GetBankAccountByBankName(bankName, branchName, accountTypeId, accountNumber);

                    if (account == null || !account.ReceiptCategoryId.HasValue)
                    {
                        parseResult = ImportResult.BankAccountMasterError;
                        FileInformation.BankInformation
                            = $"銀行名:{bankName}, 支店名:{branchName}, 預金種別:{accountType}, 口座番号:{accountNumber}";
                        break;
                    }

                    if (account.ImportSkipping == 1)
                    {
                        parseSkipping = true;
                        header        = null;
                        continue;
                    }

                    parseSkipping     = false;
                    receiptCategoryId = account.ReceiptCategoryId.Value;

                    header = new ReceiptHeader {
                        CompanyId       = Helper.CompanyId,
                        CurrencyId      = Helper.DefaultCurrency.Id,
                        ImportFileLogId = fileLog.ReceiptHeaders.Count,
                        Workday         = workDay,
                        BankCode        = account.BankCode,
                        BankName        = bankName,
                        BranchCode      = account.BranchCode,
                        BranchName      = branchName,
                        AccountTypeId   = accountTypeId,
                        AccountNumber   = accountNumber,
                        AccountName     = accountName,
                        CreateBy        = Helper.LoginUserId,
                        UpdateBy        = Helper.LoginUserId,
                    };
                }
                else if (content.StartsWith(DataCaptionRecordStart))
                {
                    continue;
                }
                else
                {
                    // 項番 1 : 日付 の変換可否で、データレコードの判定
                    var recordedAt = DateTime.MinValue;
                    if (!Helper.TryParseDateTime(fields.First(), out recordedAt))
                    {
                        continue;
                    }
                    if (parseSkipping)
                    {
                        continue;
                    }

                    fileLog.ReadCount++;

                    var nyukingaku       = fields[1];
                    var payerNameRaw     = fields[3];
                    var sourceBankName   = fields[4];
                    var sourceBranchName = fields[5];

                    var receiptAmount = 0M;
                    if (!decimal.TryParse(nyukingaku, out receiptAmount) ||
                        Constants.MaxAmount < Math.Abs(receiptAmount))
                    {
                        parseResult = ImportResult.FileFormatError;
                        break;
                    }
                    if (receiptAmount == 0M)
                    {
                        continue;
                    }

                    payerNameRaw = Helper.ConvertToValidEbCharacter(payerNameRaw).Left(140);
                    var payerCode = string.Empty;
                    if (Regex.IsMatch(payerNameRaw, "^[0-9]{10} .*$"))
                    {
                        payerCode    = payerNameRaw.Substring(0, 10);
                        payerNameRaw = payerNameRaw.Substring(10).Trim();
                    }
                    var payerName = Helper.RemoveLegalPersonality(payerNameRaw);

                    int?customerId = null; // Helper.GetCustomerIdByExclusiveInfo(account.BankCode, account.BranchCode, "");

                    int?sectionId = null;  // Helper.GetSectionIdByPayerCode(payerCode: "");

                    int?excludeCategoryId = Helper.UseApportion ? null : Helper.IsAsync ?
                                            await Helper.GetExcludeCategoryIdAsync(payerName, token) :
                                            Helper.GetExcludeCategoryId(payerName);

                    var receipt = new Receipt {
                        Id                = header.Receipts.Count() + 1,
                        CompanyId         = Helper.CompanyId,
                        CurrencyId        = Helper.DefaultCurrency.Id,
                        ReceiptHeaderId   = header.Id,
                        ReceiptCategoryId = receiptCategoryId,
                        CustomerId        = customerId,
                        SectionId         = sectionId,
                        InputType         = Constants.InputTypeEbImporter,
                        Apportioned       = Helper.UseApportion ? 0 : 1,
                        Approved          = 1,
                        Workday           = workDay,
                        RecordedAt        = recordedAt,
                        ReceiptAmount     = receiptAmount,
                        RemainAmount      = receiptAmount,
                        PayerCode         = payerCode,
                        PayerName         = payerName,
                        PayerNameRaw      = payerNameRaw,
                        SourceBankName    = string.Empty,
                        SourceBranchName  = string.Empty,
                        ExcludeFlag       = excludeCategoryId.HasValue ? 1 : 0,
                        ExcludeCategoryId = excludeCategoryId,
                        CreateBy          = Helper.LoginUserId,
                        UpdateBy          = Helper.LoginUserId,
                    };
                    if (excludeCategoryId.HasValue)
                    {
                        receipt.ExcludeAmount  = receiptAmount;
                        receipt.RemainAmount   = 0M;
                        receipt.AssignmentFlag = 2;
                        var exclude = new ReceiptExclude {
                            Id                = receipt.Id,
                            ReceiptId         = receipt.Id,
                            ExcludeCategoryId = excludeCategoryId,
                            ExcludeAmount     = receiptAmount,
                            CreateBy          = Helper.LoginUserId,
                            UpdateBy          = Helper.LoginUserId,
                        };
                        header.ReceiptExcludes.Add(exclude);
                    }
                    header.Receipts.Add(receipt);

                    header.ImportCount++;
                    header.ImportAmount += receiptAmount;
                    fileLog.ImportCount++;
                    fileLog.ImportAmount += receiptAmount;
                }
            }
            if (header != null && header.Receipts.Any())
            {
                fileLog.ReceiptHeaders.Add(header);
            }

            if (parseResult == ImportResult.Success && !fileLog.ReceiptHeaders.Any())
            {
                parseResult = ImportResult.ImportDataNotFound;
            }

            return(Tuple.Create(fileLog, parseResult));
        }