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));
        }
Exemple #2
0
        public async Task <Tuple <ImportFileLog, ImportResult> > ParseAsync(IEnumerable <string[]> records, CancellationToken token = default(CancellationToken))
        {
            var settingKubun = FileInformation.GetImportableValues();

            if (settingKubun.Any())
            {
                ImportTorihikiKubun = 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;
            var           parseSkipping     = false;
            DateTime      workDay           = new DateTime(0);
            BankAccount   bank = null;

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

            if (ebExcludeAccountList == null)
            {
                return(Tuple.Create(fileLog, ImportResult.DBError));
            }

            foreach (var fields in records)
            {
                if (fields.Length < 1)
                {
                    parseResult = ImportResult.FileFormatError;
                    break;
                }
                var datakubun = fields[0];

                if (datakubun == Constants.DataKubun.Header)
                {
                    parseSkipping = false;
                    bank          = null;
                    if (fields.Length < 14)
                    {
                        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 accountTypeIdBuf = fields[11];
                    var accountNumber    = fields[12];
                    var accountName      = fields[13];

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

                    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);
                    accountNumber = Helper.ConvertToValidEbCharacter(accountNumber).Left(7);
                    accountName   = Helper.ConvertToValidEbCharacter(accountName).Left(140);

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

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

                    receiptCategoryId = bank != null && bank.ReceiptCategoryId.HasValue
                        ? bank.ReceiptCategoryId.Value
                        : defaultReceiptCategoryId.Value;

                    // skip する場合は、別のheader になるまで skip
                    if (bank != null && 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   = accountTypeId;
                    header.AccountNumber   = accountNumber;
                    header.AccountName     = accountName;
                    header.CreateBy        = Helper.LoginUserId;
                    header.UpdateBy        = Helper.LoginUserId;
                }
                if (datakubun == Constants.DataKubun.Data)
                {
                    if (fields.Length < 17)
                    {
                        parseResult = ImportResult.FileFormatError;
                        break;
                    }

                    if (parseSkipping)
                    {
                        continue;
                    }

                    fileLog.ReadCount++;

                    var kanjyoubi        = fields[2];
                    var azukeirebi       = fields[3];
                    var iriharaikubun    = fields[4];
                    var torihikikubun    = fields[5];
                    var torihikikingaku  = fields[6];
                    var payerCode        = fields[13];
                    var payerName        = fields[14];
                    var sourceBankName   = fields[15];
                    var sourceBranchName = fields[16];

                    if (!ImportIriharaiKubun.Contains(iriharaikubun) ||
                        !ImportTorihikiKubun.Contains(torihikikubun))
                    {
                        continue;
                    }

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

                    decimal receiptAmount;
                    if (!decimal.TryParse(torihikikingaku, 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)) ?? bank?.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));
        }
Exemple #3
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));
        }
        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));
        }
        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));
        }