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)); }
/// <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); }
public async Task <ActionResult <IEnumerable <Staff> > > GetItems(StaffSearch option, CancellationToken token) => (await staffProcessor.GetAsync(option, token)).ToArray();
private async Task <List <Staff> > GetStaffsAsync(int companyId, string[] codes, CancellationToken token) => (await staffProcessor.GetAsync(new StaffSearch { CompanyId = companyId, Codes = codes, }, token)).ToList();
/// <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); }
/// <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); } }
/// <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); }
/// <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); }