コード例 #1
0
 public async Task <StaffsResult> GetAsync(string SessionKey, int[] Id)
 {
     return(await authorizationProcessor.DoAuthorizeAsync(SessionKey, async token =>
     {
         var result = (await staffProcessor.GetAsync(new StaffSearch {
             Ids = Id
         }, token)).ToList();
         return new StaffsResult
         {
             ProcessResult = new ProcessResult {
                 Result = true
             },
             Staffs = result,
         };
     }, logger));
 }
コード例 #2
0
ファイル: MFBillingProcessor.cs プロジェクト: fwka1605/next
        /// <summary>登録</summary>
        /// <param name="source">MFC請求書 の ID(ハッシュ文字列)は、<see cref="Billing.CustomerKana"/>へ設定されているものとする</param>
        /// <param name="token"></param>
        /// <returns></returns>
        public async Task <IEnumerable <Billing> > SaveAsync(MFBillingSource source, CancellationToken token = default(CancellationToken))
        {
            var billings     = source.Billings;
            var customers    = source.Customers;
            var newCustomers = new List <Customer>();
            var result       = new List <Billing>();

            using (var scope = transactionScopeBuilder.Create())
            {
                foreach (var c in customers)
                {
                    newCustomers.Add(await customerProcessor.SaveAsync(c, token: token));
                }

                var staffs = (await staffProcessor.GetAsync(new StaffSearch {
                    Ids = newCustomers.Select(x => x.StaffId).Distinct().ToArray()
                }, token)).ToDictionary(x => x.Id);

                foreach (var billing in billings)
                {
                    if (billing.CustomerId == 0)
                    {
                        var customer = newCustomers.Where(x => x.Code == billing.CustomerCode).FirstOrDefault();
                        var staff    = staffs[customer.StaffId];

                        billing.CustomerId        = customer.Id;
                        billing.StaffId           = customer.StaffId;
                        billing.CollectCategoryId = customer.CollectCategoryId;
                        billing.DepartmentId      = staff.DepartmentId;
                    }
                    var savedBilling = await billingSaveProcessor.SaveAsync(billing, token);

                    var mfId      = billing.CustomerKana;
                    var mfBilling = new MFBilling
                    {
                        BillingId = savedBilling.Id,
                        CompanyId = savedBilling.CompanyId,
                        Id        = mfId
                    };
                    await addMFBillingQueryProcessor.SaveAsync(mfBilling, token);

                    result.Add(savedBilling);
                }
                scope.Complete();
            }
            return(result);
        }
コード例 #3
0
ファイル: StaffController.cs プロジェクト: fwka1605/next
 public async Task <ActionResult <IEnumerable <Staff> > > GetItems(StaffSearch option, CancellationToken token)
 => (await staffProcessor.GetAsync(option, token)).ToArray();
コード例 #4
0
 private async Task <List <Staff> > GetStaffsAsync(int companyId, string[] codes, CancellationToken token)
 => (await staffProcessor.GetAsync(new StaffSearch {
     CompanyId = companyId, Codes = codes,
 }, token)).ToList();
コード例 #5
0
        /// <summary>インポート処理</summary>
        /// <param name="source"></param>
        /// <param name="token"></param>
        /// <returns></returns>
        public async Task <ImportResult> ImportAsync(MasterImportSource source, CancellationToken token = default(CancellationToken))
        {
            var mode     = (ImportMethod)source.ImportMethod;
            var encoding = Encoding.GetEncoding(source.EncodingCodePage);
            var csv      = encoding.GetString(source.Data);

            var companyTask = companyProcessor.GetAsync(new CompanySearch {
                Id = source.CompanyId,
            }, token);
            var loginUserTask = loginUserProcessor.GetAsync(new LoginUserSearch {
                Ids = new[] { source.LoginUserId },
            }, token);
            var appConTask     = applicationControlProcessor.GetAsync(source.CompanyId, token);
            var departmentTask = departmentProcessor.GetAsync(new DepartmentSearch {
                CompanyId = source.CompanyId,
            }, token);
            var staffTask = staffProcessor.GetAsync(new StaffSearch {
                CompanyId = source.CompanyId,
            }, token);
            var policyTask = passwordPolicyProcessor.GetAsync(source.CompanyId, token);

            await Task.WhenAll(companyTask, loginUserTask, appConTask, departmentTask, staffTask, policyTask);

            var company   = companyTask.Result.First();
            var loginUser = loginUserTask.Result.First();
            var appCon    = appConTask.Result;
            var deptDic   = departmentTask.Result.ToDictionary(x => x.Code);
            var stffDic   = staffTask.Result.ToDictionary(x => x.Code);
            var policy    = policyTask.Result;

            var definition = new LoginUserFileDefinition(new DataExpression(appCon));
            var parser     = new CsvParser {
                Encoding      = encoding,
                StreamCreator = new PlainTextMemoryStreamCreator(),
            };

            var useDistribution = appCon.UseDistribution == 1;

            definition.MailField.Required        = useDistribution;
            definition.UseClientField.Ignored    = !useDistribution;
            definition.UseWebViewerField.Ignored = !useDistribution;

            definition.DepartmentCodeField.GetModelsByCode = val => deptDic;
            definition.StaffCodeField.GetModelsByCode      = val => stffDic;

            var importer = definition.CreateImporter(x => x.Code, parser);

            importer.UserId      = source.LoginUserId;
            importer.UserCode    = loginUser.Code;
            importer.CompanyId   = source.CompanyId;
            importer.CompanyCode = company.Code;
            importer.LoadAsync   = () => loginUserProcessor.GetAsync(new LoginUserSearch {
                CompanyId = source.CompanyId,
            }, token);

            importer.AdditionalWorker = async worker => {
                var codes = worker.Models.Values.Select(x => x.Code).Where(x => !string.IsNullOrEmpty(x)).Distinct().ToArray();
                var def   = worker.RowDef as LoginUserFileDefinition;

                if (mode == ImportMethod.Replace)
                {
                    var sectionResult = await loginUserProcessor.GetAsync(new LoginUserSearch { CompanyId = source.CompanyId, ExcludeCodes = codes, }, token);

                    def.LoginUserCodeField.ValidateAdditional = (val, param) => {
                        var reports = new List <WorkingReport>();
                        reports.AddRange(sectionResult.Select(x => new WorkingReport {
                            FieldNo   = definition.DepartmentCodeField.FieldIndex,
                            FieldName = definition.DepartmentCodeField.FieldName,
                            Message   = $"入金部門・担当者対応マスターに存在する{x.Code}:{x.Name}が存在しないため、インポートできません。",
                        }).ToArray());

                        return(reports);
                    };
                }

                var dbCodes = (await loginUserProcessor.GetAsync(new LoginUserSearch {
                    CompanyId = source.CompanyId, Codes = codes,
                }, token)).Select(x => x.Code);
                def.InitialPasswordField.ValidateAdditional = (val, param) => {
                    var reports = new List <WorkingReport>();

                    var csvCodes = val.Values.Select(u => u.Code).ToArray();

                    var targetCodes = csvCodes.Except(dbCodes); // 検証対象(=新規登録ユーザ)

                    var addError = new Action <int, string, string>((lineNo, value, message) =>
                    {
                        reports.Add(new WorkingReport {
                            LineNo    = lineNo,
                            FieldNo   = definition.InitialPasswordField.FieldIndex,
                            FieldName = definition.InitialPasswordField.FieldName,
                            Value     = value,
                            Message   = message,
                        });
                    });

                    foreach (var lineNo in val.Keys.Where(lineNo => targetCodes.Contains(val[lineNo].Code)))
                    {
                        var password = val[lineNo].InitialPassword;

                        if (string.IsNullOrEmpty(password))
                        {
                            addError(lineNo, password, $"新規登録ユーザの初回パスワードが空白のため、インポートできません。");
                            continue;
                        }

                        var validationResult = policy.Validate(password);
                        if (validationResult != PasswordValidateResult.Valid)
                        {
                            switch (validationResult)
                            {
                            case PasswordValidateResult.ProhibitionAlphabetChar:
                                addError(lineNo, password, $"アルファベットが使用されているため、インポートできません。");
                                break;

                            case PasswordValidateResult.ProhibitionNumberChar:
                                addError(lineNo, password, $"数字が使用されているため、インポートできません。");
                                break;

                            case PasswordValidateResult.ProhibitionSymbolChar:
                                addError(lineNo, password, $"記号が使用されているため、インポートできません。");
                                break;

                            case PasswordValidateResult.ProhibitionNotAllowedSymbolChar:
                                addError(lineNo, password, $"使用できない文字が含まれているため、インポートできません。");
                                break;

                            case PasswordValidateResult.ShortageAlphabetCharCount:
                                addError(lineNo, password, $"アルファベットが最低{policy.MinAlphabetUseCount}文字含まれていないため、インポートできません。");
                                break;

                            case PasswordValidateResult.ShortageNumberCharCount:
                                addError(lineNo, password, $"数字が最低{policy.MinNumberUseCount}文字含まれていないため、インポートできません。");
                                break;

                            case PasswordValidateResult.ShortageSymbolCharCount:
                                addError(lineNo, password, $"記号が最低{policy.MinSymbolUseCount}文字含まれていないため、インポートできません。");
                                break;

                            case PasswordValidateResult.ShortagePasswordLength:
                                addError(lineNo, password, $"{policy.MinLength}文字以上でないため、インポートできません。");
                                break;

                            case PasswordValidateResult.ExceedPasswordLength:
                                addError(lineNo, password, $"{policy.MaxLength}文字以下でないため、インポートできません。");
                                break;

                            case PasswordValidateResult.ExceedSameRepeatedChar:
                                addError(lineNo, password, $"同じ文字が{policy.MinSameCharacterRepeat}文字以上続いているため、インポートできません。");
                                break;

                            default:
                                throw new NotImplementedException($"PasswordValidateResult = {validationResult.ToString()}");
                            }
                        }
                    }

                    return(reports);
                };
            };

            importer.RegisterAsync = x => loginUserProcessor.ImportAsync(x.New, x.Dirty, x.Removed, token);

            var result = await importer.ImportAsync(csv, mode, token, null);

            result.Logs = importer.GetErrorLogs();

            return(result);
        }
コード例 #6
0
        /// <summary>
        /// インポート処理本体
        /// </summary>
        /// <param name="source"></param>
        /// <param name="token"></param>
        /// <returns></returns>
        public async Task <ImportResult> ImportAsync(MasterImportSource source, CancellationToken token = default(CancellationToken))
        {
            var mode     = (ImportMethod)source.ImportMethod;
            var encoding = Encoding.GetEncoding(source.EncodingCodePage);
            var csv      = encoding.GetString(source.Data);

            var companyTask = companyProcessor.GetAsync(new CompanySearch {
                Id = source.CompanyId,
            }, token);
            var loginUserTask = loginUserProcessor.GetAsync(new LoginUserSearch {
                Ids = new[] { source.LoginUserId },
            }, token);
            var appConTask = applicationControlProcessor.GetAsync(source.CompanyId, token);
            var staffsTask = staffProcessor.GetAsync(new StaffSearch {
                CompanyId = source.CompanyId,
            }, token);

            await Task.WhenAll(companyTask, loginUserTask, appConTask, staffsTask);

            var company         = companyTask.Result.First();
            var loginUser       = loginUserTask.Result.First();
            var appCon          = appConTask.Result;
            var staffDictionary = staffsTask.Result.ToDictionary(x => x.Code);

            var definition = new DepartmentFileDefinition(new DataExpression(appCon));

            definition.StaffIdField.GetModelsByCode = codes => staffDictionary;
            var parser = new CsvParser {
                Encoding      = encoding,
                StreamCreator = new PlainTextMemoryStreamCreator(),
            };
            var importer = definition.CreateImporter(x => x.Code, parser);

            importer.UserId      = source.LoginUserId;
            importer.UserCode    = loginUser.Code;
            importer.CompanyId   = source.CompanyId;
            importer.CompanyCode = company.Code;
            if (mode == ImportMethod.Replace)
            {
                importer.AdditionalWorker = async worker => {
                    var codes = worker.Models.Values.Select(x => x.Code).Where(x => !string.IsNullOrEmpty(x)).Distinct().ToArray();

                    var staffItemTask = departmentProcessor.GetImportItemsStaffAsync(source.CompanyId, codes, token);
                    var swdItemTask   = departmentProcessor.GetImportItemsSectionWithDepartmentAsync(source.CompanyId, codes, token);
                    var billItemTask  = departmentProcessor.GetImportItemsBillingAsync(source.CompanyId, codes, token);

                    await Task.WhenAll(staffItemTask, swdItemTask, billItemTask);

                    var staffResult = staffItemTask.Result.ToArray();
                    var swdResult   = swdItemTask.Result.ToArray();
                    var billResult  = billItemTask.Result.ToArray();

                    (worker.RowDef as DepartmentFileDefinition).DepartmentCodeField.ValidateAdditional = (val, param) => {
                        var reports = new List <WorkingReport>();
                        reports.AddRange(staffResult.Select(x => new WorkingReport {
                            FieldNo   = definition.DepartmentCodeField.FieldIndex,
                            FieldName = definition.DepartmentCodeField.FieldName,
                            Message   = $"営業担当者マスターに存在する{x.Code}:{x.Name}が存在しないため、インポートできません。",
                        }).ToArray());
                        reports.AddRange(swdResult.Select(x => new WorkingReport {
                            FieldNo   = definition.DepartmentCodeField.FieldIndex,
                            FieldName = definition.DepartmentCodeField.FieldName,
                            Message   = $"入金・請求部門名対応マスターに存在する{x.Code}:{x.Name}が存在しないため、インポートできません。",
                        }).ToArray());
                        reports.AddRange(billResult.Select(x => new WorkingReport {
                            FieldNo   = definition.DepartmentCodeField.FieldIndex,
                            FieldName = definition.DepartmentCodeField.FieldName,
                            Message   = $"請求データーに存在する{x.Code}:{x.Name}が存在しないため、インポートできません。",
                        }).ToArray());
                        return(reports);
                    };
                }
            }
            ;
            importer.LoadAsync = () => departmentProcessor.GetAsync(new DepartmentSearch {
                CompanyId = source.CompanyId,
            }, token);
            importer.RegisterAsync = x => departmentProcessor.ImportAsync(x.New, x.Dirty, x.Removed, token);

            var result = await importer.ImportAsync(csv, mode, token, null);

            result.Logs = importer.GetErrorLogs();

            return(result);
        }
    }
コード例 #7
0
        /// <summary>インポート処理</summary>
        /// <param name="source"></param>
        /// <param name="token"></param>
        /// <returns></returns>
        public async Task <ImportResult> ImportAsync(MasterImportSource source, CancellationToken token = default(CancellationToken))
        {
            var mode     = (ImportMethod)source.ImportMethod;
            var encoding = Encoding.GetEncoding(source.EncodingCodePage);
            var csv      = encoding.GetString(source.Data);

            var companyTask = companyProcessor.GetAsync(new CompanySearch {
                Id = source.CompanyId,
            }, token);
            var loginUsersTask = loginUserProcessor.GetAsync(new LoginUserSearch {
                CompanyId = source.CompanyId,
            }, token);
            var appConTask     = applicationControlProcessor.GetAsync(source.CompanyId, token);
            var departmentTask = departmentProcessor.GetAsync(new DepartmentSearch {
                CompanyId = source.CompanyId,
            }, token);
            var staffTask = staffProcessor.GetAsync(new StaffSearch {
                CompanyId = source.CompanyId,
            }, token);

            await Task.WhenAll(companyTask, loginUsersTask, appConTask, departmentTask);

            var company             = companyTask.Result.First();
            var loginUserDictionary = loginUsersTask.Result.ToDictionary(x => x.Code);
            var loginUser           = loginUsersTask.Result.First(x => x.Id == source.LoginUserId);
            var appCon = appConTask.Result;
            var departmentDictionary = departmentTask.Result.ToDictionary(x => x.Code);

            var useDistribution = appCon.UseDistribution == 1;

            var definition = new StaffFileDefinition(new DataExpression(appCon));
            var parser     = new CsvParser {
                Encoding      = encoding,
                StreamCreator = new PlainTextMemoryStreamCreator(),
            };

            definition.MailField.Required = useDistribution;

            definition.DepartmentIdField.GetModelsByCode = val => departmentDictionary;

            var importer = definition.CreateImporter(x => x.Code, parser);

            importer.UserId      = source.LoginUserId;
            importer.UserCode    = loginUser.Code;
            importer.CompanyId   = source.CompanyId;
            importer.CompanyCode = company.Code;

            if (mode == ImportMethod.Replace)
            {
                importer.AdditionalWorker = async worker => {
                    var codes    = worker.Models.Values.Select(x => x.Code).Distinct().ToArray();
                    var userTask = staffProcessor.GetImportItemsLoginUserAsync(source.CompanyId, codes, token);
                    var custTask = staffProcessor.GetImportItemsCustomerAsync(source.CompanyId, codes, token);
                    var billTask = staffProcessor.GetImportItemsBillingAsync(source.CompanyId, codes, token);

                    await Task.WhenAll(userTask, custTask, billTask);

                    var def = worker.RowDef as StaffFileDefinition;

                    def.StaffCodeField.ValidateAdditional = (val, param) => {
                        var reports = new List <WorkingReport>();

                        reports.AddRange(userTask.Result.Select(x => new WorkingReport {
                            FieldNo   = def.StaffCodeField.FieldIndex,
                            FieldName = def.StaffNameField.FieldName,
                            Message   = $"ログインユーザーマスターに存在する{x.Code}:{x.Name}が存在しないため、インポートできません。",
                        }));

                        reports.AddRange(custTask.Result.Select(x => new WorkingReport {
                            FieldNo   = def.StaffCodeField.FieldIndex,
                            FieldName = def.StaffNameField.FieldName,
                            Message   = $"得意先マスターに存在する{x.Code}:{x.Name}が存在しないため、インポートできません。",
                        }));

                        reports.AddRange(billTask.Result.Select(x => new WorkingReport {
                            FieldNo   = def.StaffCodeField.FieldIndex,
                            FieldName = def.StaffNameField.FieldName,
                            Message   = $"請求データに存在する{x.Code}:{x.Name}が存在しないため、インポートできません。",
                        }));
                        return(reports);
                    };
                };
            }

            importer.LoadAsync = () => staffProcessor.GetAsync(new StaffSearch {
                CompanyId = source.CompanyId,
            }, token);
            importer.RegisterAsync = x => staffProcessor.ImportAsync(x.New, x.Dirty, x.Removed, token);

            var result = await importer.ImportAsync(csv, mode, token, null);

            result.Logs = importer.GetErrorLogs();

            return(result);
        }
コード例 #8
0
        /// <summary>インポート処理</summary>
        /// <param name="source"></param>
        /// <param name="token"></param>
        /// <returns></returns>
        public async Task <ImportResult> ImportAsync(MasterImportSource source, CancellationToken token = default(CancellationToken))
        {
            var mode     = (ImportMethod)source.ImportMethod;
            var encoding = Encoding.GetEncoding(source.EncodingCodePage);
            var csv      = encoding.GetString(source.Data);

            var companyTask = companyProcessor.GetAsync(new CompanySearch {
                Id = source.CompanyId,
            }, token);
            var loginUsersTask = loginUserProcessor.GetAsync(new LoginUserSearch {
                CompanyId = source.CompanyId,
            }, token);
            var appConTask = applicationControlProcessor.GetAsync(source.CompanyId, token);

            await Task.WhenAll(companyTask, loginUsersTask, appConTask);

            var company             = companyTask.Result.First();
            var loginUserDictionary = loginUsersTask.Result.ToDictionary(x => x.Code);
            var loginUser           = loginUsersTask.Result.First(x => x.Id == source.LoginUserId);
            var appCon = appConTask.Result;

            var importer = new Rac.VOne.Web.Models.Importers.CustomerImporterBase(appCon)
            {
                CompanyId   = source.CompanyId,
                CompanyCode = company.Code,
                LoginUserId = source.LoginUserId,
                PatternNo   = source.ImporterSettingCode,
                Parser      = new CsvParser {
                    Encoding      = encoding,
                    StreamCreator = new PlainTextMemoryStreamCreator(),
                },
                GetCollectCategoryAsync       = async() => (await categoryProcessor.GetAsync(new CategorySearch {
                    CompanyId = source.CompanyId, CategoryType = CategoryType.Collect,
                }, token)).ToList(),
                GetStaffAsync                 = async() => (await staffProcessor.GetAsync(new StaffSearch {
                    CompanyId = source.CompanyId,
                }, token)).ToList(),
                GetLeagalPersonaritiesAsync   = async() => (await juridicalPersonalityProcessor.GetAsync(new JuridicalPersonality {
                    CompanyId = source.CompanyId,
                }, token)).Select(x => x.Kana).ToArray(),
                GetCustomerAsync              = async() => (await customerProcessor.GetAsync(new CustomerSearch {
                    CompanyId = source.CompanyId,
                }, token)).ToList(),
                GetImporterSettingAsync       = async(formatId, code) => (await importerSettingProcessor.GetAsync(new ImporterSetting {
                    CompanyId = source.CompanyId, FormatId = formatId, Code = code,
                }, token)).First(),
                GetImporterSettingDetailAsync = async(formatId, code) => (await importerSettingDetailProcessor.GetAsync(new ImporterSetting {
                    CompanyId = source.CompanyId, FormatId = formatId, Code = code,
                }, token)).ToList(),
                GetRoundingTypeAsync          = async() =>
                {
                    var val           = (await generalSettingProcessor.GetAsync(new GeneralSetting {
                        CompanyId = source.CompanyId, Code = "取込時端数処理",
                    }, token)).FirstOrDefault()?.Value;
                    RoundingType type = RoundingType.Floor;
                    Enum.TryParse(val, out type);
                    return(type);
                },
                GetMasterDataForCustomerGroupParentAsync = async(codes) => (await customerProcessor.GetImportForCustomerGroupParentAsync(source.CompanyId, codes, token)).ToList(),
                GetMasterDataForCustomerGroupChildAsync  = async(codes) => (await customerProcessor.GetImportForCustomerGroupChildAsync(source.CompanyId, codes, token)).ToList(),
                GetMasterDataForKanaHistoryAsync         = async(codes) => (await customerProcessor.GetImportForKanaHistoryAsync(source.CompanyId, codes, token)).ToList(),
                GetMasterDataForBillingAsync             = async(codes) => (await customerProcessor.GetImportForBillingAsync(source.CompanyId, codes, token)).ToList(),
                GetMasterDataForReceiptAsync             = async(codes) => (await customerProcessor.GetImportForReceiptAsync(source.CompanyId, codes, token)).ToList(),
                GetMasterDataForNettingAsync             = async(codes) => (await customerProcessor.GetImportForNettingAsync(source.CompanyId, codes, token)).ToList(),
                ImportCustomerAsync = (insert, update, delete) => customerProcessor.ImportAsync(insert, update, delete, token),
            };
            await importer.InitializeAsync();

            var result = await importer.ImportAsync(csv, source.ImportMethod, null);

            result.Logs = importer.ErrorList;

            return(result);
        }