public Task <NumberTagResolveResult> Resolve(GenerateNumberRequest request, IEnumerable <string> tags, CancellationToken cancellationToken) { var result = new NumberTagResolveResult { Date = Date, Values = Values.Where(x => tags.Contains(x.Key)).ToDictionary(x => x.Key, x => x.Value, Numerator.TagComparer) }; return(Task.FromResult(result)); }
public bool Supports(GenerateNumberRequest request, out string[] supportedTags) { if (request.EntityTypeCode == EntityTypeCode) { supportedTags = Values.Keys.ToArray(); return(true); } supportedTags = null; return(false); }
public bool Supports(GenerateNumberRequest request, out string[] supportedTags) { if (request.EntityTypeCode == DocumentType.EntityTypeCode) { supportedTags = new [] { SupportedTags.DocumentType, SupportedTags.Company }; return(true); } supportedTags = null; return(false); }
public async Task GenerateNumber_IndependentNumerator_ShouldGenerate() { // arrange var cancellationToken = new CancellationToken(); var unitOfWorkFactory = new TransactionScopeUnitOfWorkFactory(); var dbContextFactory = new DefaultDbContextFactory(); var dateTimeProvider = new DefaultDateTimeProvider(); var generator = new MasterDataDbGenerator(unitOfWorkFactory, dbContextFactory); var numeratorTagProvider = new TestNumberTagResolver { EntityTypeCode = NumerableEntityTypeCode }; var classifierRepositoryFactory = CreateClassifierRepositoryFactory(dbContextFactory); var service = new DbNumberGenerator(dbContextFactory, classifierRepositoryFactory, dateTimeProvider, new INumberTagResolver[] { numeratorTagProvider }); using (var _ = unitOfWorkFactory.Create()) { var request = new GenerateNumberRequest { EntityTypeCode = NumerableEntityTypeCode, EntityTypeUid = Guid.NewGuid() }; await generator.InsertNumerator(new Numerator { Pattern = "{Company}-{Number}", KeyTags = new[] { "Company" } }, request, cancellationToken); // act numeratorTagProvider.Values = new Dictionary <string, string> { { "Company", "MT" } }; var number1 = await service.GenerateNumber(request, cancellationToken); var number2 = await service.GenerateNumber(request, cancellationToken); numeratorTagProvider.Values = new Dictionary <string, string> { { "Company", "GT" } }; var number3 = await service.GenerateNumber(request, cancellationToken); var number4 = await service.GenerateNumber(request, cancellationToken); // assert Assert.AreEqual("MT-00001", number1); Assert.AreEqual("MT-00002", number2); Assert.AreEqual("GT-00001", number3); Assert.AreEqual("GT-00002", number4); } }
public async Task GenerateNumber_WithPeriodTags_ShouldGenerate() { // arrange var cancellationToken = new CancellationToken(); var unitOfWorkFactory = new TransactionScopeUnitOfWorkFactory(); var dbContextFactory = new DefaultDbContextFactory(); var dateTimeProvider = new DefaultDateTimeProvider(); var generator = new MasterDataDbGenerator(unitOfWorkFactory, dbContextFactory); var numeratorTagProvider = new TestNumberTagResolver { EntityTypeCode = NumerableEntityTypeCode }; var classifierRepositoryFactory = CreateClassifierRepositoryFactory(dbContextFactory); var service = new DbNumberGenerator(dbContextFactory, classifierRepositoryFactory, dateTimeProvider, new INumberTagResolver[] { numeratorTagProvider }); using (var _ = unitOfWorkFactory.Create()) { var request = new GenerateNumberRequest { EntityTypeCode = NumerableEntityTypeCode, EntityTypeUid = Guid.NewGuid() }; await generator.InsertNumerator(new Numerator { Periodicity = NumeratorPeriodicity.Year, Pattern = "{Company}-{Number}-{Day}-{Month}-{Quarter}-{Year2}-{Year4}" }, request, cancellationToken); // act numeratorTagProvider.Values = new Dictionary <string, string> { { "Company", "MT" } }; numeratorTagProvider.Date = new DateTime(2003, 2, 5); var number1 = await service.GenerateNumber(request, cancellationToken); numeratorTagProvider.Date = new DateTime(1999, 10, 30); var number2 = await service.GenerateNumber(request, cancellationToken); // assert Assert.AreEqual("MT-00001-05-02-1-03-2003", number1); Assert.AreEqual("MT-00001-30-10-4-99-1999", number2); } }
public async Task <NumberTagResolveResult> Resolve(GenerateNumberRequest request, IEnumerable <string> tags, CancellationToken cancellationToken) { if (request.EntityTypeCode == DocumentType.EntityTypeCode) { var searchResult = await _repository.Search(new DocumentSearchRequest { Uid = request.EntityUid }, cancellationToken); var document = searchResult.Rows.FirstOrDefault(); if (document != null) { DocumentType documentType = null; var result = new NumberTagResolveResult { Date = document.DocumentDate, Values = new Dictionary <string, string>(Numerator.TagComparer) }; foreach (var tag in tags) { // todo: read document type and company number tags from separate table (service) if (tag == SupportedTags.DocumentType) { if (documentType == null) { var classifierRepository = _classifierRepositoryFactory.GetNamedOrDefaultService(ClassifierTypeCode.DocumentType); documentType = (DocumentType)await classifierRepository.Get(ClassifierTypeCode.DocumentType, document.DocumentTypeUid, cancellationToken); } result.Values[tag] = "CRR"; // documentType.Code; } else if (tag == SupportedTags.Company) { // todo: resolve tag } } return(result); } } return(null); }
// todo: use numerator repository (?) public async Task <ApiResult> InsertNumerator(Numerator numerator, GenerateNumberRequest request, CancellationToken cancellationToken) { var type = await EnsureClassifierTypeRegistered(Numerator.GetDefaultMetadata(), cancellationToken); var numeratorUid = Guid.NewGuid(); using (var db = _dbContextFactory.Create()) { await db.GetTable <DbClassifier>() .Value(x => x.Uid, numeratorUid) .Value(x => x.TypeUid, type.Uid) .Value(x => x.StatusCode, ClassifierStatusCode.Active) .Value(x => x.Code, numeratorUid.ToString().Substring(0, 32)) .Value(x => x.Name, numerator.Name ?? "Test numerator") .Value(x => x.IsActive, true) .Value(x => x.IsSystem, false) .InsertAsync(cancellationToken); await db.GetTable <DbNumerator>() .Value(x => x.Uid, numeratorUid) .Value(x => x.EntityTypeCode, request.EntityTypeCode) .Value(x => x.Pattern, numerator.Pattern ?? Numerator.DefaultPattern) .Value(x => x.Periodicity, numerator.Periodicity.ToString()) .Value(x => x.KeyTags, numerator.KeyTags != null ? string.Join(DbNumerator.KeyTagsSeparator, numerator.KeyTags) : null) .InsertAsync(cancellationToken); await db.GetTable <DbNumeratorEntity>() .Value(x => x.IsAutoNumbering, true) .Value(x => x.NumeratorUid, numeratorUid) .Value(x => x.EntityUid, request.EntityTypeUid) .InsertAsync(cancellationToken); return(new ApiResult { Uid = numeratorUid }); } }
public async Task GenerateNumber_QuarterPeriodicity_ShouldGenerate() { // arrange var cancellationToken = new CancellationToken(); var unitOfWorkFactory = new TransactionScopeUnitOfWorkFactory(); var dbContextFactory = new DefaultDbContextFactory(); var dateTimeProvider = new DefaultDateTimeProvider(); var generator = new MasterDataDbGenerator(unitOfWorkFactory, dbContextFactory); var numeratorTagProvider = new TestNumberTagResolver { EntityTypeCode = NumerableEntityTypeCode, Values = new Dictionary <string, string>() }; var classifierRepositoryFactory = CreateClassifierRepositoryFactory(dbContextFactory); var service = new DbNumberGenerator(dbContextFactory, classifierRepositoryFactory, dateTimeProvider, new INumberTagResolver[] { numeratorTagProvider }); using (var _ = unitOfWorkFactory.Create()) { var request = new GenerateNumberRequest { EntityTypeCode = NumerableEntityTypeCode, EntityTypeUid = Guid.NewGuid() }; await generator.InsertNumerator(new Numerator { Periodicity = NumeratorPeriodicity.Quarter, Pattern = "{Company}-{Number}/{Year4}" }, request, cancellationToken); numeratorTagProvider.Values = new Dictionary <string, string> { { "Company", "MT" } }; // act - Q1.2020 - first time numeratorTagProvider.Date = new DateTime(2020, 01, 31); var number1OfQ1 = await service.GenerateNumber(request, cancellationToken); var number2OfQ1 = await service.GenerateNumber(request, cancellationToken); // assert - Q1.2020 - first time Assert.AreEqual("MT-00001/2020", number1OfQ1); Assert.AreEqual("MT-00002/2020", number2OfQ1); // act - Q3.2020 numeratorTagProvider.Date = new DateTime(2020, 07, 30); var number1OfQ3 = await service.GenerateNumber(request, cancellationToken); var number2OfQ3 = await service.GenerateNumber(request, cancellationToken); // assert - Q3.2020 Assert.AreEqual("MT-00001/2020", number1OfQ3); Assert.AreEqual("MT-00002/2020", number2OfQ3); // act - Q1.2020 - second time numeratorTagProvider.Date = new DateTime(2020, 02, 29); var number3OfQ1 = await service.GenerateNumber(request, cancellationToken); var number4OfQ1 = await service.GenerateNumber(request, cancellationToken); // assert - Q1.2020 - second time Assert.AreEqual("MT-00003/2020", number3OfQ1); Assert.AreEqual("MT-00004/2020", number4OfQ1); } }