Esempio n. 1
0
            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));
            }
Esempio n. 2
0
            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);
        }
Esempio n. 4
0
        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);
            }
        }
Esempio n. 5
0
        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);
        }
Esempio n. 7
0
        // 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
                });
            }
        }
Esempio n. 8
0
        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);
            }
        }