From 5c9c99206c67a1f5c4bdba2f1febda8133db6c12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sedat=20=C3=96zt=C3=BCrk?= Date: Tue, 7 Jul 2026 00:53:45 +0300 Subject: [PATCH] =?UTF-8?q?Yeni=20M=C3=BC=C5=9Fteri=20ve=20Eski=20M=C3=BC?= =?UTF-8?q?=C5=9Fteri=20Sipari=C5=9F=20ayr=C4=B1m=C4=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Public/CountryDto.cs | 3 + .../Public/OrderDto.cs | 5 + .../Tenants/CustomTenantDto.cs | 1 + .../Identity/IdentityMappers.cs | 2 + .../Public/PublicAppService.cs | 84 +- .../Seeds/Countries.json | 751 +++++++++++++++++- .../Seeds/HostDataSeeder.cs | 3 + .../Seeds/LanguagesData.json | 42 + .../Seeds/ListFormSeeder_Saas.cs | 326 +++++++- .../Entities/Host/Definitions/Country.cs | 9 + .../Tenant/Administration/Website/Order.cs | 6 + .../EntityFrameworkCore/PlatformDbContext.cs | 6 + ....cs => 20260706213526_Initial.Designer.cs} | 36 +- ...0_Initial.cs => 20260706213526_Initial.cs} | 8 + .../PlatformDbContextModelSnapshot.cs | 34 + ui/src/components/orders/TenantForm.tsx | 539 +++++++++++-- ui/src/proxy/order/models.ts | 4 + ui/src/services/location.service.ts | 45 ++ ui/src/services/order.service.ts | 4 + ui/src/views/public/Payment.tsx | 31 +- 20 files changed, 1819 insertions(+), 120 deletions(-) rename api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/{20260625183130_Initial.Designer.cs => 20260706213526_Initial.Designer.cs} (99%) rename api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/{20260625183130_Initial.cs => 20260706213526_Initial.cs} (99%) create mode 100644 ui/src/services/location.service.ts diff --git a/api/src/Sozsoft.Platform.Application.Contracts/Public/CountryDto.cs b/api/src/Sozsoft.Platform.Application.Contracts/Public/CountryDto.cs index 3a81bfb..f4d51eb 100644 --- a/api/src/Sozsoft.Platform.Application.Contracts/Public/CountryDto.cs +++ b/api/src/Sozsoft.Platform.Application.Contracts/Public/CountryDto.cs @@ -9,6 +9,9 @@ public class CountryDto : AuditedEntityDto public string GroupName { get; set; } public string Currency { get; set; } public int PhoneCode { get; set; } + public int? PhoneNumberMinLength { get; set; } + public int? PhoneNumberMaxLength { get; set; } + public string? PhoneNumberFormat { get; set; } public string TaxLabel { get; set; } public bool ZipRequired { get; set; } public bool StateRequired { get; set; } diff --git a/api/src/Sozsoft.Platform.Application.Contracts/Public/OrderDto.cs b/api/src/Sozsoft.Platform.Application.Contracts/Public/OrderDto.cs index dbee0d5..6c7b3ce 100644 --- a/api/src/Sozsoft.Platform.Application.Contracts/Public/OrderDto.cs +++ b/api/src/Sozsoft.Platform.Application.Contracts/Public/OrderDto.cs @@ -11,6 +11,11 @@ public class OrderDto : EntityDto public List Items { get; set; } + public string BillingCycle { get; set; } + public int Period { get; set; } + public DateTime? LicenseStartTime { get; set; } + public DateTime? LicenseStopTime { get; set; } + public decimal Subtotal { get; set; } public decimal Commission { get; set; } public decimal Total { get; set; } diff --git a/api/src/Sozsoft.Platform.Application.Contracts/Tenants/CustomTenantDto.cs b/api/src/Sozsoft.Platform.Application.Contracts/Tenants/CustomTenantDto.cs index 717c09a..3b0d68c 100644 --- a/api/src/Sozsoft.Platform.Application.Contracts/Tenants/CustomTenantDto.cs +++ b/api/src/Sozsoft.Platform.Application.Contracts/Tenants/CustomTenantDto.cs @@ -6,6 +6,7 @@ public class CustomTenantDto { public string Name { get; set; } public bool IsActive { get; set; } + public bool IsExisting { get; set; } public Guid? Id { get; set; } public string OrganizationName { get; set; } diff --git a/api/src/Sozsoft.Platform.Application/Identity/IdentityMappers.cs b/api/src/Sozsoft.Platform.Application/Identity/IdentityMappers.cs index 90b218d..ebd417e 100644 --- a/api/src/Sozsoft.Platform.Application/Identity/IdentityMappers.cs +++ b/api/src/Sozsoft.Platform.Application/Identity/IdentityMappers.cs @@ -76,8 +76,10 @@ public partial class CreateUpdateOrganizationUnitDtoToOrganizationUnitMapper : M [Mapper(RequiredMappingStrategy = RequiredMappingStrategy.Target)] public partial class TenantToCustomTenantDtoMapper : MapperBase { + [MapperIgnoreTarget(nameof(CustomTenantDto.IsExisting))] public override partial CustomTenantDto Map(Tenant source); + [MapperIgnoreTarget(nameof(CustomTenantDto.IsExisting))] public override partial void Map(Tenant source, CustomTenantDto destination); public override void BeforeMap(Tenant source) diff --git a/api/src/Sozsoft.Platform.Application/Public/PublicAppService.cs b/api/src/Sozsoft.Platform.Application/Public/PublicAppService.cs index a4e63d7..bd4eff3 100644 --- a/api/src/Sozsoft.Platform.Application/Public/PublicAppService.cs +++ b/api/src/Sozsoft.Platform.Application/Public/PublicAppService.cs @@ -34,6 +34,8 @@ public class PublicAppService : PlatformAppService private readonly IRepository _homeRepository; private readonly IRepository _contactRepository; private readonly IRepository _countryRepository; + private readonly IRepository _cityRepository; + private readonly IRepository _districtRepository; private readonly IIdentityUserRepository _identityUserRepository; private readonly IRepository _languageKeyRepository; private readonly IRepository _languageTextRepository; @@ -54,6 +56,8 @@ public class PublicAppService : PlatformAppService IRepository homeRepository, IRepository contactRepository, IRepository countryRepository, + IRepository cityRepository, + IRepository districtRepository, IIdentityUserRepository identityUserRepository, IRepository languageKeyRepository, IRepository languageTextRepository, @@ -78,6 +82,8 @@ public class PublicAppService : PlatformAppService _languageTextRepository = languageTextRepository; _languageTextAppService = languageTextAppService; _countryRepository = countryRepository; + _cityRepository = cityRepository; + _districtRepository = districtRepository; } public async Task> GetServicesListAsync() @@ -457,10 +463,14 @@ public class PublicAppService : PlatformAppService public async Task CreateOrderAsync(OrderDto input) { + var billingCycle = input.BillingCycle.IsNullOrWhiteSpace() ? "yearly" : input.BillingCycle; + var period = input.Period > 0 ? input.Period : 1; + var entity = new Order() { Name = input.Tenant.Name, IsActive = input.Tenant.IsActive, + IsExisting = input.Tenant.IsExisting, OrganizationName = input.Tenant.OrganizationName, Founder = input.Tenant.Founder, @@ -479,6 +489,10 @@ public class PublicAppService : PlatformAppService Website = input.Tenant.Website, MenuGroup = input.Tenant.MenuGroup, + BillingCycle = billingCycle, + Period = period, + LicenseStartTime = input.LicenseStartTime, + LicenseStopTime = input.LicenseStopTime, Subtotal = input.Subtotal, Commission = input.Commission, Total = input.Total, @@ -526,9 +540,75 @@ public class PublicAppService : PlatformAppService public async Task> GetCountryAsync() { - var entities = await _countryRepository.GetListAsync() ?? throw new EntityNotFoundException(typeof(Country)); + var queryable = await _countryRepository.GetQueryableAsync(); - return ObjectMapper.Map, List>(entities); + return await AsyncExecuter.ToListAsync( + queryable + .OrderBy(country => country.Name) + .Select(country => new CountryDto + { + Id = country.Id, + Name = country.Name, + GroupName = country.GroupName, + Currency = country.Currency, + PhoneCode = country.PhoneCode, + PhoneNumberMinLength = country.PhoneNumberMinLength, + PhoneNumberMaxLength = country.PhoneNumberMaxLength, + PhoneNumberFormat = country.PhoneNumberFormat, + TaxLabel = country.TaxLabel, + ZipRequired = country.ZipRequired, + StateRequired = country.StateRequired, + Cities = new List() + })); + } + + public async Task> GetCityAsync(string country) + { + if (string.IsNullOrWhiteSpace(country)) + { + return []; + } + + var queryable = await _cityRepository.GetQueryableAsync(); + + return await AsyncExecuter.ToListAsync( + queryable + .Where(city => city.Country == country) + .OrderBy(city => city.Name) + .Select(city => new CityDto + { + Id = city.Id, + Country = city.Country, + Name = city.Name, + PlateCode = city.PlateCode + })); + } + + public async Task> GetDistrictAsync(string country, string city) + { + if (string.IsNullOrWhiteSpace(country) || string.IsNullOrWhiteSpace(city)) + { + return []; + } + + var queryable = await _districtRepository.GetQueryableAsync(); + var entities = await AsyncExecuter.ToListAsync( + queryable + .Where(district => district.Country == country && district.City == city) + .OrderBy(district => district.Name)); + + return entities + .GroupBy(district => district.Name, StringComparer.OrdinalIgnoreCase) + .Select(group => group.First()) + .Select(district => new DistrictDto + { + Id = district.Id, + Country = district.Country, + City = district.City, + Name = district.Name, + Township = district.Township + }) + .ToList(); } public async Task SaveContactPageAsync(SaveContactPageInput input) diff --git a/api/src/Sozsoft.Platform.DbMigrator/Seeds/Countries.json b/api/src/Sozsoft.Platform.DbMigrator/Seeds/Countries.json index f2a90d3..71e9807 100644 --- a/api/src/Sozsoft.Platform.DbMigrator/Seeds/Countries.json +++ b/api/src/Sozsoft.Platform.DbMigrator/Seeds/Countries.json @@ -3,6 +3,9 @@ "Name": "Andorra", "Currency": "EUR", "PhoneCode": 376, + "PhoneNumberMinLength": 6, + "PhoneNumberMaxLength": 9, + "PhoneNumberFormat": "000 000 000", "TaxLabel": "", "GroupName": "Avrupa" }, @@ -10,6 +13,9 @@ "Name": "Birleşik Arap Emirlikleri", "Currency": "AED", "PhoneCode": 971, + "PhoneNumberMinLength": 8, + "PhoneNumberMaxLength": 9, + "PhoneNumberFormat": "000 000 000", "TaxLabel": "", "GroupName": "Asya" }, @@ -17,6 +23,9 @@ "Name": "Afganistan", "Currency": "AFN", "PhoneCode": 93, + "PhoneNumberMinLength": 9, + "PhoneNumberMaxLength": 9, + "PhoneNumberFormat": "000 000 000", "TaxLabel": "", "GroupName": "Asya" }, @@ -24,6 +33,9 @@ "Name": "Antigua ve Barbuda", "Currency": "USD", "PhoneCode": 1268, + "PhoneNumberMinLength": 7, + "PhoneNumberMaxLength": 7, + "PhoneNumberFormat": "000-0000", "TaxLabel": "", "GroupName": "Kuzey Amerika" }, @@ -31,6 +43,9 @@ "Name": "Anguilla", "Currency": "USD", "PhoneCode": 1264, + "PhoneNumberMinLength": 7, + "PhoneNumberMaxLength": 7, + "PhoneNumberFormat": "000-0000", "TaxLabel": "", "GroupName": "" }, @@ -38,6 +53,9 @@ "Name": "Arnavutluk", "Currency": "ALL", "PhoneCode": 355, + "PhoneNumberMinLength": 8, + "PhoneNumberMaxLength": 9, + "PhoneNumberFormat": "000 000 000", "TaxLabel": "", "GroupName": "" }, @@ -45,6 +63,9 @@ "Name": "Ermenistan", "Currency": "AMD", "PhoneCode": 374, + "PhoneNumberMinLength": 8, + "PhoneNumberMaxLength": 8, + "PhoneNumberFormat": "0000 0000", "TaxLabel": "", "GroupName": "Asya" }, @@ -52,6 +73,9 @@ "Name": "Angola", "Currency": "AOA", "PhoneCode": 244, + "PhoneNumberMinLength": 9, + "PhoneNumberMaxLength": 9, + "PhoneNumberFormat": "000 000 000", "TaxLabel": "", "GroupName": "Afrika" }, @@ -59,6 +83,9 @@ "Name": "Antartika", "Currency": "USD", "PhoneCode": 672, + "PhoneNumberMinLength": 5, + "PhoneNumberMaxLength": 15, + "PhoneNumberFormat": "000 000 000 000 000", "TaxLabel": "", "GroupName": "" }, @@ -66,6 +93,9 @@ "Name": "Arjantin", "Currency": "ARS", "PhoneCode": 54, + "PhoneNumberMinLength": 10, + "PhoneNumberMaxLength": 11, + "PhoneNumberFormat": "000 0000 0000", "TaxLabel": "CUIT", "GroupName": "Güney Amerika" }, @@ -73,6 +103,9 @@ "Name": "Amerikan Samoası", "Currency": "USD", "PhoneCode": 1684, + "PhoneNumberMinLength": 7, + "PhoneNumberMaxLength": 7, + "PhoneNumberFormat": "000-0000", "TaxLabel": "", "GroupName": "Kuzey Amerika" }, @@ -80,6 +113,9 @@ "Name": "Avusturya", "Currency": "EUR", "PhoneCode": 43, + "PhoneNumberMinLength": 4, + "PhoneNumberMaxLength": 13, + "PhoneNumberFormat": "000 000 000 0000", "TaxLabel": "USt", "GroupName": "Avrupa" }, @@ -87,6 +123,9 @@ "Name": "Avustralya", "Currency": "AUD", "PhoneCode": 61, + "PhoneNumberMinLength": 9, + "PhoneNumberMaxLength": 9, + "PhoneNumberFormat": "000 000 000", "TaxLabel": "ABN", "GroupName": "Okyanusya" }, @@ -94,6 +133,9 @@ "Name": "Aruba", "Currency": "AWG", "PhoneCode": 297, + "PhoneNumberMinLength": 7, + "PhoneNumberMaxLength": 7, + "PhoneNumberFormat": "000-0000", "TaxLabel": "", "GroupName": "" }, @@ -101,6 +143,9 @@ "Name": "Aland Adaları", "Currency": "EUR", "PhoneCode": 358, + "PhoneNumberMinLength": 6, + "PhoneNumberMaxLength": 10, + "PhoneNumberFormat": "(000) 000-0000", "TaxLabel": "", "GroupName": "" }, @@ -108,6 +153,9 @@ "Name": "Azerbaycan", "Currency": "AZN", "PhoneCode": 994, + "PhoneNumberMinLength": 9, + "PhoneNumberMaxLength": 9, + "PhoneNumberFormat": "000 000 000", "TaxLabel": "", "GroupName": "Asya" }, @@ -115,6 +163,9 @@ "Name": "Bosna-Hersek", "Currency": "BAM", "PhoneCode": 387, + "PhoneNumberMinLength": 8, + "PhoneNumberMaxLength": 9, + "PhoneNumberFormat": "000 000 000", "TaxLabel": "", "GroupName": "" }, @@ -122,6 +173,9 @@ "Name": "Barbados", "Currency": "BBD", "PhoneCode": 1246, + "PhoneNumberMinLength": 7, + "PhoneNumberMaxLength": 7, + "PhoneNumberFormat": "000-0000", "TaxLabel": "", "GroupName": "Kuzey Amerika" }, @@ -129,6 +183,9 @@ "Name": "Bangladeş", "Currency": "BDT", "PhoneCode": 880, + "PhoneNumberMinLength": 6, + "PhoneNumberMaxLength": 10, + "PhoneNumberFormat": "(000) 000-0000", "TaxLabel": "", "GroupName": "Asya" }, @@ -136,6 +193,9 @@ "Name": "Belçika", "Currency": "EUR", "PhoneCode": 32, + "PhoneNumberMinLength": 8, + "PhoneNumberMaxLength": 9, + "PhoneNumberFormat": "000 000 000", "TaxLabel": "VKN/TCKN", "GroupName": "Avrupa" }, @@ -143,6 +203,9 @@ "Name": "Burkina Faso", "Currency": "XOF", "PhoneCode": 226, + "PhoneNumberMinLength": 8, + "PhoneNumberMaxLength": 8, + "PhoneNumberFormat": "0000 0000", "TaxLabel": "", "GroupName": "Afrika" }, @@ -150,6 +213,9 @@ "Name": "Bulgaristan", "Currency": "", "PhoneCode": 359, + "PhoneNumberMinLength": 6, + "PhoneNumberMaxLength": 9, + "PhoneNumberFormat": "000 000 000", "TaxLabel": "VKN/TCKN", "GroupName": "Avrupa" }, @@ -157,6 +223,9 @@ "Name": "Bahreyn", "Currency": "", "PhoneCode": 973, + "PhoneNumberMinLength": 8, + "PhoneNumberMaxLength": 8, + "PhoneNumberFormat": "0000 0000", "TaxLabel": "", "GroupName": "Asya" }, @@ -164,6 +233,9 @@ "Name": "Burundi", "Currency": "", "PhoneCode": 257, + "PhoneNumberMinLength": 8, + "PhoneNumberMaxLength": 8, + "PhoneNumberFormat": "0000 0000", "TaxLabel": "", "GroupName": "Afrika" }, @@ -171,6 +243,9 @@ "Name": "Benin", "Currency": "XOF", "PhoneCode": 229, + "PhoneNumberMinLength": 10, + "PhoneNumberMaxLength": 10, + "PhoneNumberFormat": "(000) 000-0000", "TaxLabel": "", "GroupName": "Afrika" }, @@ -178,6 +253,9 @@ "Name": "Saint Barthelemy", "Currency": "EUR", "PhoneCode": 590, + "PhoneNumberMinLength": 9, + "PhoneNumberMaxLength": 9, + "PhoneNumberFormat": "000 000 000", "TaxLabel": "", "GroupName": "" }, @@ -185,6 +263,9 @@ "Name": "Bermuda", "Currency": "", "PhoneCode": 1441, + "PhoneNumberMinLength": 7, + "PhoneNumberMaxLength": 7, + "PhoneNumberFormat": "000-0000", "TaxLabel": "", "GroupName": "" }, @@ -192,6 +273,9 @@ "Name": "Brunei", "Currency": "", "PhoneCode": 673, + "PhoneNumberMinLength": 7, + "PhoneNumberMaxLength": 7, + "PhoneNumberFormat": "000-0000", "TaxLabel": "", "GroupName": "Asya" }, @@ -199,6 +283,9 @@ "Name": "Bolivya", "Currency": "", "PhoneCode": 591, + "PhoneNumberMinLength": 8, + "PhoneNumberMaxLength": 8, + "PhoneNumberFormat": "0000 0000", "TaxLabel": "", "GroupName": "Güney Amerika" }, @@ -206,6 +293,9 @@ "Name": "Bonaire, Sint Eustatius and Saba", "Currency": "USD", "PhoneCode": 599, + "PhoneNumberMinLength": 7, + "PhoneNumberMaxLength": 7, + "PhoneNumberFormat": "000-0000", "TaxLabel": "", "GroupName": "" }, @@ -213,6 +303,9 @@ "Name": "Brezilya", "Currency": "", "PhoneCode": 55, + "PhoneNumberMinLength": 10, + "PhoneNumberMaxLength": 11, + "PhoneNumberFormat": "000 0000 0000", "TaxLabel": "", "GroupName": "Güney Amerika" }, @@ -220,6 +313,9 @@ "Name": "Bahamalar", "Currency": "", "PhoneCode": 1242, + "PhoneNumberMinLength": 7, + "PhoneNumberMaxLength": 7, + "PhoneNumberFormat": "000-0000", "TaxLabel": "", "GroupName": "Kuzey Amerika" }, @@ -227,6 +323,9 @@ "Name": "Bhutan", "Currency": "", "PhoneCode": 975, + "PhoneNumberMinLength": 7, + "PhoneNumberMaxLength": 8, + "PhoneNumberFormat": "0000 0000", "TaxLabel": "", "GroupName": "" }, @@ -234,6 +333,9 @@ "Name": "Bouvet Adası", "Currency": "", "PhoneCode": 55, + "PhoneNumberMinLength": 5, + "PhoneNumberMaxLength": 15, + "PhoneNumberFormat": "000 000 000 000 000", "TaxLabel": "", "GroupName": "" }, @@ -241,6 +343,9 @@ "Name": "Botsvana", "Currency": "BWP", "PhoneCode": 267, + "PhoneNumberMinLength": 7, + "PhoneNumberMaxLength": 8, + "PhoneNumberFormat": "0000 0000", "TaxLabel": "", "GroupName": "Afrika" }, @@ -248,6 +353,9 @@ "Name": "Belarus", "Currency": "BYN", "PhoneCode": 375, + "PhoneNumberMinLength": 9, + "PhoneNumberMaxLength": 9, + "PhoneNumberFormat": "000 000 000", "TaxLabel": "", "GroupName": "" }, @@ -255,6 +363,9 @@ "Name": "Belize", "Currency": "BZD", "PhoneCode": 501, + "PhoneNumberMinLength": 7, + "PhoneNumberMaxLength": 7, + "PhoneNumberFormat": "000-0000", "TaxLabel": "", "GroupName": "Kuzey Amerika" }, @@ -262,6 +373,9 @@ "Name": "Kanada", "Currency": "CAD", "PhoneCode": 1, + "PhoneNumberMinLength": 10, + "PhoneNumberMaxLength": 10, + "PhoneNumberFormat": "(000) 000-0000", "TaxLabel": "", "GroupName": "Kuzey Amerika" }, @@ -269,6 +383,9 @@ "Name": "Kokos (Keeling) Adaları", "Currency": "AUD", "PhoneCode": 61, + "PhoneNumberMinLength": 9, + "PhoneNumberMaxLength": 9, + "PhoneNumberFormat": "000 000 000", "TaxLabel": "", "GroupName": "" }, @@ -276,6 +393,9 @@ "Name": "Orta Afrika Cumhuriyeti", "Currency": "", "PhoneCode": 236, + "PhoneNumberMinLength": 8, + "PhoneNumberMaxLength": 8, + "PhoneNumberFormat": "0000 0000", "TaxLabel": "", "GroupName": "" }, @@ -283,6 +403,9 @@ "Name": "Kongo Demokratik Cumhuriyeti", "Currency": "", "PhoneCode": 243, + "PhoneNumberMinLength": 7, + "PhoneNumberMaxLength": 10, + "PhoneNumberFormat": "(000) 000-0000", "TaxLabel": "", "GroupName": "Afrika" }, @@ -290,6 +413,9 @@ "Name": "Kongo", "Currency": "", "PhoneCode": 242, + "PhoneNumberMinLength": 9, + "PhoneNumberMaxLength": 9, + "PhoneNumberFormat": "000 000 000", "TaxLabel": "", "GroupName": "Afrika" }, @@ -297,6 +423,9 @@ "Name": "İsviçre", "Currency": "CHF", "PhoneCode": 41, + "PhoneNumberMinLength": 9, + "PhoneNumberMaxLength": 9, + "PhoneNumberFormat": "000 000 000", "TaxLabel": "", "GroupName": "" }, @@ -304,6 +433,9 @@ "Name": "Fildişi Sahili", "Currency": "XOF", "PhoneCode": 225, + "PhoneNumberMinLength": 10, + "PhoneNumberMaxLength": 10, + "PhoneNumberFormat": "(000) 000-0000", "TaxLabel": "", "GroupName": "Afrika" }, @@ -311,6 +443,9 @@ "Name": "Cook Adaları", "Currency": "", "PhoneCode": 682, + "PhoneNumberMinLength": 5, + "PhoneNumberMaxLength": 5, + "PhoneNumberFormat": "00 000", "TaxLabel": "", "GroupName": "" }, @@ -318,6 +453,9 @@ "Name": "Şili", "Currency": "CLP", "PhoneCode": 56, + "PhoneNumberMinLength": 9, + "PhoneNumberMaxLength": 9, + "PhoneNumberFormat": "000 000 000", "TaxLabel": "", "GroupName": "Güney Amerika" }, @@ -325,6 +463,9 @@ "Name": "Kamerun", "Currency": "", "PhoneCode": 237, + "PhoneNumberMinLength": 9, + "PhoneNumberMaxLength": 9, + "PhoneNumberFormat": "000 000 000", "TaxLabel": "", "GroupName": "Afrika" }, @@ -332,6 +473,9 @@ "Name": "Çin Halk Cumhuriyeti", "Currency": "CNY", "PhoneCode": 86, + "PhoneNumberMinLength": 7, + "PhoneNumberMaxLength": 11, + "PhoneNumberFormat": "000 0000 0000", "TaxLabel": "", "GroupName": "Asya" }, @@ -339,6 +483,9 @@ "Name": "Kolombiya", "Currency": "COP", "PhoneCode": 57, + "PhoneNumberMinLength": 8, + "PhoneNumberMaxLength": 10, + "PhoneNumberFormat": "(000) 000-0000", "TaxLabel": "NIT", "GroupName": "Güney Amerika" }, @@ -346,6 +493,9 @@ "Name": "Kosta Rika", "Currency": "CRC", "PhoneCode": 506, + "PhoneNumberMinLength": 8, + "PhoneNumberMaxLength": 8, + "PhoneNumberFormat": "0000 0000", "TaxLabel": "", "GroupName": "" }, @@ -353,6 +503,9 @@ "Name": "Küba", "Currency": "CUP", "PhoneCode": 53, + "PhoneNumberMinLength": 6, + "PhoneNumberMaxLength": 10, + "PhoneNumberFormat": "(000) 000-0000", "TaxLabel": "", "GroupName": "Kuzey Amerika" }, @@ -360,6 +513,9 @@ "Name": "Cape Verde", "Currency": "", "PhoneCode": 238, + "PhoneNumberMinLength": 7, + "PhoneNumberMaxLength": 7, + "PhoneNumberFormat": "000-0000", "TaxLabel": "", "GroupName": "" }, @@ -367,6 +523,9 @@ "Name": "Curacao", "Currency": "ANG", "PhoneCode": 599, + "PhoneNumberMinLength": 7, + "PhoneNumberMaxLength": 8, + "PhoneNumberFormat": "0000 0000", "TaxLabel": "", "GroupName": "" }, @@ -374,6 +533,9 @@ "Name": "Christmas Adası", "Currency": "AUD", "PhoneCode": 61, + "PhoneNumberMinLength": 9, + "PhoneNumberMaxLength": 9, + "PhoneNumberFormat": "000 000 000", "TaxLabel": "", "GroupName": "" }, @@ -381,6 +543,9 @@ "Name": "Kıbrıs Rum Kesimi", "Currency": "EUR", "PhoneCode": 357, + "PhoneNumberMinLength": 8, + "PhoneNumberMaxLength": 8, + "PhoneNumberFormat": "0000 0000", "TaxLabel": "VKN/TCKN", "GroupName": "Avrupa" }, @@ -388,6 +553,9 @@ "Name": "Çek Cumhuriyeti", "Currency": "", "PhoneCode": 420, + "PhoneNumberMinLength": 9, + "PhoneNumberMaxLength": 9, + "PhoneNumberFormat": "000 000 000", "TaxLabel": "VKN/TCKN", "GroupName": "Avrupa" }, @@ -395,6 +563,9 @@ "Name": "Almanya", "Currency": "EUR", "PhoneCode": 49, + "PhoneNumberMinLength": 5, + "PhoneNumberMaxLength": 15, + "PhoneNumberFormat": "000 000 000 000 000", "TaxLabel": "VKN/TCKN", "GroupName": "Avrupa" }, @@ -402,6 +573,9 @@ "Name": "Cibuti", "Currency": "", "PhoneCode": 253, + "PhoneNumberMinLength": 8, + "PhoneNumberMaxLength": 8, + "PhoneNumberFormat": "0000 0000", "TaxLabel": "", "GroupName": "" }, @@ -409,6 +583,9 @@ "Name": "Danimarka", "Currency": "", "PhoneCode": 45, + "PhoneNumberMinLength": 8, + "PhoneNumberMaxLength": 8, + "PhoneNumberFormat": "0000 0000", "TaxLabel": "VKN/TCKN", "GroupName": "Avrupa" }, @@ -416,6 +593,9 @@ "Name": "Dominika", "Currency": "USD", "PhoneCode": 1767, + "PhoneNumberMinLength": 7, + "PhoneNumberMaxLength": 7, + "PhoneNumberFormat": "000-0000", "TaxLabel": "", "GroupName": "Kuzey Amerika" }, @@ -423,6 +603,9 @@ "Name": "Dominik Cumhuriyeti", "Currency": "", "PhoneCode": 1849, + "PhoneNumberMinLength": 7, + "PhoneNumberMaxLength": 7, + "PhoneNumberFormat": "000-0000", "TaxLabel": "RNC", "GroupName": "" }, @@ -430,6 +613,9 @@ "Name": "Cezayir", "Currency": "DZD", "PhoneCode": 213, + "PhoneNumberMinLength": 8, + "PhoneNumberMaxLength": 9, + "PhoneNumberFormat": "000 000 000", "TaxLabel": "", "GroupName": "Afrika" }, @@ -437,6 +623,9 @@ "Name": "Ekvador", "Currency": "USD", "PhoneCode": 593, + "PhoneNumberMinLength": 8, + "PhoneNumberMaxLength": 9, + "PhoneNumberFormat": "000 000 000", "TaxLabel": "RUC", "GroupName": "Güney Amerika" }, @@ -444,6 +633,9 @@ "Name": "Estonya", "Currency": "EUR", "PhoneCode": 372, + "PhoneNumberMinLength": 7, + "PhoneNumberMaxLength": 8, + "PhoneNumberFormat": "0000 0000", "TaxLabel": "VKN/TCKN", "GroupName": "Avrupa" }, @@ -451,6 +643,9 @@ "Name": "Mısır", "Currency": "", "PhoneCode": 20, + "PhoneNumberMinLength": 8, + "PhoneNumberMaxLength": 10, + "PhoneNumberFormat": "(000) 000-0000", "TaxLabel": "", "GroupName": "Afrika" }, @@ -458,6 +653,9 @@ "Name": "Batı Sahra", "Currency": "", "PhoneCode": 212, + "PhoneNumberMinLength": 9, + "PhoneNumberMaxLength": 9, + "PhoneNumberFormat": "000 000 000", "TaxLabel": "", "GroupName": "" }, @@ -465,6 +663,9 @@ "Name": "Eritre", "Currency": "", "PhoneCode": 291, + "PhoneNumberMinLength": 7, + "PhoneNumberMaxLength": 7, + "PhoneNumberFormat": "000-0000", "TaxLabel": "", "GroupName": "" }, @@ -472,6 +673,9 @@ "Name": "İspanya", "Currency": "EUR", "PhoneCode": 34, + "PhoneNumberMinLength": 9, + "PhoneNumberMaxLength": 9, + "PhoneNumberFormat": "000 000 000", "TaxLabel": "VKN/TCKN", "GroupName": "" }, @@ -479,6 +683,9 @@ "Name": "Etiyopya", "Currency": "", "PhoneCode": 251, + "PhoneNumberMinLength": 9, + "PhoneNumberMaxLength": 9, + "PhoneNumberFormat": "000 000 000", "TaxLabel": "", "GroupName": "Afrika" }, @@ -486,6 +693,9 @@ "Name": "Finlandiya", "Currency": "EUR", "PhoneCode": 358, + "PhoneNumberMinLength": 5, + "PhoneNumberMaxLength": 10, + "PhoneNumberFormat": "(000) 000-0000", "TaxLabel": "VKN/TCKN", "GroupName": "Avrupa" }, @@ -493,6 +703,9 @@ "Name": "Fiji", "Currency": "", "PhoneCode": 679, + "PhoneNumberMinLength": 7, + "PhoneNumberMaxLength": 7, + "PhoneNumberFormat": "000-0000", "TaxLabel": "", "GroupName": "Okyanusya" }, @@ -500,6 +713,9 @@ "Name": "Falkland Adaları", "Currency": "", "PhoneCode": 500, + "PhoneNumberMinLength": 5, + "PhoneNumberMaxLength": 5, + "PhoneNumberFormat": "00 000", "TaxLabel": "", "GroupName": "Güney Amerika" }, @@ -507,6 +723,9 @@ "Name": "Mikronezya", "Currency": "USD", "PhoneCode": 691, + "PhoneNumberMinLength": 7, + "PhoneNumberMaxLength": 7, + "PhoneNumberFormat": "000-0000", "TaxLabel": "", "GroupName": "Okyanusya" }, @@ -514,6 +733,9 @@ "Name": "Faroe Adaları", "Currency": "", "PhoneCode": 298, + "PhoneNumberMinLength": 6, + "PhoneNumberMaxLength": 6, + "PhoneNumberFormat": "000 000", "TaxLabel": "", "GroupName": "" }, @@ -521,6 +743,9 @@ "Name": "Fransa", "Currency": "EUR", "PhoneCode": 33, + "PhoneNumberMinLength": 9, + "PhoneNumberMaxLength": 9, + "PhoneNumberFormat": "000 000 000", "TaxLabel": "VKN/TCKN", "GroupName": "Avrupa" }, @@ -528,6 +753,9 @@ "Name": "Gabon", "Currency": "", "PhoneCode": 241, + "PhoneNumberMinLength": 7, + "PhoneNumberMaxLength": 8, + "PhoneNumberFormat": "0000 0000", "TaxLabel": "", "GroupName": "Afrika" }, @@ -535,6 +763,9 @@ "Name": "Grenada", "Currency": "USD", "PhoneCode": 1473, + "PhoneNumberMinLength": 7, + "PhoneNumberMaxLength": 7, + "PhoneNumberFormat": "000-0000", "TaxLabel": "", "GroupName": "Kuzey Amerika" }, @@ -542,6 +773,9 @@ "Name": "Gürcistan", "Currency": "", "PhoneCode": 995, + "PhoneNumberMinLength": 9, + "PhoneNumberMaxLength": 9, + "PhoneNumberFormat": "000 000 000", "TaxLabel": "", "GroupName": "Asya" }, @@ -549,6 +783,9 @@ "Name": "Fransız Guyanası", "Currency": "EUR", "PhoneCode": 594, + "PhoneNumberMinLength": 9, + "PhoneNumberMaxLength": 9, + "PhoneNumberFormat": "000 000 000", "TaxLabel": "", "GroupName": "Güney Amerika" }, @@ -556,6 +793,9 @@ "Name": "Gana", "Currency": "", "PhoneCode": 233, + "PhoneNumberMinLength": 9, + "PhoneNumberMaxLength": 9, + "PhoneNumberFormat": "000 000 000", "TaxLabel": "", "GroupName": "Afrika" }, @@ -563,6 +803,9 @@ "Name": "Cebelitarık", "Currency": "", "PhoneCode": 350, + "PhoneNumberMinLength": 8, + "PhoneNumberMaxLength": 8, + "PhoneNumberFormat": "0000 0000", "TaxLabel": "", "GroupName": "" }, @@ -570,6 +813,9 @@ "Name": "Guernsey", "Currency": "", "PhoneCode": 44, + "PhoneNumberMinLength": 10, + "PhoneNumberMaxLength": 10, + "PhoneNumberFormat": "(000) 000-0000", "TaxLabel": "", "GroupName": "" }, @@ -577,6 +823,9 @@ "Name": "Grönland", "Currency": "", "PhoneCode": 299, + "PhoneNumberMinLength": 6, + "PhoneNumberMaxLength": 6, + "PhoneNumberFormat": "000 000", "TaxLabel": "", "GroupName": "" }, @@ -584,6 +833,9 @@ "Name": "Gambiya", "Currency": "", "PhoneCode": 220, + "PhoneNumberMinLength": 7, + "PhoneNumberMaxLength": 7, + "PhoneNumberFormat": "000-0000", "TaxLabel": "", "GroupName": "" }, @@ -591,6 +843,9 @@ "Name": "Gine", "Currency": "", "PhoneCode": 224, + "PhoneNumberMinLength": 8, + "PhoneNumberMaxLength": 9, + "PhoneNumberFormat": "000 000 000", "TaxLabel": "", "GroupName": "Afrika" }, @@ -598,6 +853,9 @@ "Name": "Guadelup", "Currency": "EUR", "PhoneCode": 590, + "PhoneNumberMinLength": 9, + "PhoneNumberMaxLength": 9, + "PhoneNumberFormat": "000 000 000", "TaxLabel": "", "GroupName": "" }, @@ -605,6 +863,9 @@ "Name": "Ekvator Ginesi", "Currency": "", "PhoneCode": 240, + "PhoneNumberMinLength": 9, + "PhoneNumberMaxLength": 9, + "PhoneNumberFormat": "000 000 000", "TaxLabel": "", "GroupName": "Afrika" }, @@ -612,6 +873,9 @@ "Name": "Yunanistan", "Currency": "EUR", "PhoneCode": 30, + "PhoneNumberMinLength": 10, + "PhoneNumberMaxLength": 10, + "PhoneNumberFormat": "(000) 000-0000", "TaxLabel": "VKN/TCKN", "GroupName": "Avrupa" }, @@ -619,6 +883,9 @@ "Name": "Güney Georgia ve Güney Sandwich Adaları", "Currency": "", "PhoneCode": 500, + "PhoneNumberMinLength": 5, + "PhoneNumberMaxLength": 15, + "PhoneNumberFormat": "000 000 000 000 000", "TaxLabel": "", "GroupName": "" }, @@ -626,6 +893,9 @@ "Name": "Guatemala", "Currency": "", "PhoneCode": 502, + "PhoneNumberMinLength": 8, + "PhoneNumberMaxLength": 8, + "PhoneNumberFormat": "0000 0000", "TaxLabel": "NIT", "GroupName": "Kuzey Amerika" }, @@ -633,6 +903,9 @@ "Name": "Guam", "Currency": "USD", "PhoneCode": 1671, + "PhoneNumberMinLength": 7, + "PhoneNumberMaxLength": 7, + "PhoneNumberFormat": "000-0000", "TaxLabel": "", "GroupName": "" }, @@ -640,6 +913,9 @@ "Name": "Gine-Bissau", "Currency": "XOF", "PhoneCode": 245, + "PhoneNumberMinLength": 9, + "PhoneNumberMaxLength": 9, + "PhoneNumberFormat": "000 000 000", "TaxLabel": "", "GroupName": "Afrika" }, @@ -647,6 +923,9 @@ "Name": "Guyana", "Currency": "", "PhoneCode": 592, + "PhoneNumberMinLength": 7, + "PhoneNumberMaxLength": 7, + "PhoneNumberFormat": "000-0000", "TaxLabel": "", "GroupName": "Güney Amerika" }, @@ -654,6 +933,9 @@ "Name": "Hong Kong", "Currency": "", "PhoneCode": 852, + "PhoneNumberMinLength": 8, + "PhoneNumberMaxLength": 8, + "PhoneNumberFormat": "0000 0000", "TaxLabel": "", "GroupName": "" }, @@ -661,6 +943,9 @@ "Name": "Heard Adası ve McDonald Adaları", "Currency": "AUD", "PhoneCode": 672, + "PhoneNumberMinLength": 5, + "PhoneNumberMaxLength": 15, + "PhoneNumberFormat": "000 000 000 000 000", "TaxLabel": "", "GroupName": "" }, @@ -668,6 +953,9 @@ "Name": "Honduras", "Currency": "", "PhoneCode": 504, + "PhoneNumberMinLength": 8, + "PhoneNumberMaxLength": 8, + "PhoneNumberFormat": "0000 0000", "TaxLabel": "RTN", "GroupName": "Kuzey Amerika" }, @@ -675,6 +963,9 @@ "Name": "Hırvatistan", "Currency": "EUR", "PhoneCode": 385, + "PhoneNumberMinLength": 8, + "PhoneNumberMaxLength": 9, + "PhoneNumberFormat": "000 000 000", "TaxLabel": "VKN/TCKN", "GroupName": "" }, @@ -682,6 +973,9 @@ "Name": "Haiti", "Currency": "", "PhoneCode": 509, + "PhoneNumberMinLength": 8, + "PhoneNumberMaxLength": 8, + "PhoneNumberFormat": "0000 0000", "TaxLabel": "", "GroupName": "Kuzey Amerika" }, @@ -689,6 +983,9 @@ "Name": "Macaristan", "Currency": "", "PhoneCode": 36, + "PhoneNumberMinLength": 8, + "PhoneNumberMaxLength": 9, + "PhoneNumberFormat": "000 000 000", "TaxLabel": "VKN/TCKN", "GroupName": "Avrupa" }, @@ -696,6 +993,9 @@ "Name": "Endonezya", "Currency": "", "PhoneCode": 62, + "PhoneNumberMinLength": 7, + "PhoneNumberMaxLength": 12, + "PhoneNumberFormat": "000 000 000 000", "TaxLabel": "NPWP", "GroupName": "Asya" }, @@ -703,6 +1003,9 @@ "Name": "İrlanda", "Currency": "EUR", "PhoneCode": 353, + "PhoneNumberMinLength": 7, + "PhoneNumberMaxLength": 10, + "PhoneNumberFormat": "(000) 000-0000", "TaxLabel": "VKN/TCKN", "GroupName": "" }, @@ -710,6 +1013,9 @@ "Name": "İsrail", "Currency": "ILS", "PhoneCode": 972, + "PhoneNumberMinLength": 8, + "PhoneNumberMaxLength": 12, + "PhoneNumberFormat": "000 000 000 000", "TaxLabel": "", "GroupName": "" }, @@ -717,6 +1023,9 @@ "Name": "Man Adası", "Currency": "", "PhoneCode": 44, + "PhoneNumberMinLength": 10, + "PhoneNumberMaxLength": 10, + "PhoneNumberFormat": "(000) 000-0000", "TaxLabel": "", "GroupName": "" }, @@ -724,6 +1033,9 @@ "Name": "Hindistan", "Currency": "", "PhoneCode": 91, + "PhoneNumberMinLength": 10, + "PhoneNumberMaxLength": 10, + "PhoneNumberFormat": "(000) 000-0000", "TaxLabel": "GSTIN", "GroupName": "Asya" }, @@ -731,6 +1043,9 @@ "Name": "İngiliz Hint Okyanusu Toprağı", "Currency": "USD", "PhoneCode": 246, + "PhoneNumberMinLength": 7, + "PhoneNumberMaxLength": 7, + "PhoneNumberFormat": "000-0000", "TaxLabel": "", "GroupName": "" }, @@ -738,6 +1053,9 @@ "Name": "Irak", "Currency": "", "PhoneCode": 964, + "PhoneNumberMinLength": 8, + "PhoneNumberMaxLength": 10, + "PhoneNumberFormat": "(000) 000-0000", "TaxLabel": "", "GroupName": "Asya" }, @@ -745,6 +1063,9 @@ "Name": "İran", "Currency": "", "PhoneCode": 98, + "PhoneNumberMinLength": 6, + "PhoneNumberMaxLength": 10, + "PhoneNumberFormat": "(000) 000-0000", "TaxLabel": "", "GroupName": "" }, @@ -752,6 +1073,9 @@ "Name": "İzlanda", "Currency": "", "PhoneCode": 354, + "PhoneNumberMinLength": 7, + "PhoneNumberMaxLength": 9, + "PhoneNumberFormat": "000 000 000", "TaxLabel": "", "GroupName": "" }, @@ -759,6 +1083,9 @@ "Name": "İtalya", "Currency": "EUR", "PhoneCode": 39, + "PhoneNumberMinLength": 6, + "PhoneNumberMaxLength": 12, + "PhoneNumberFormat": "000 000 000 000", "TaxLabel": "VKN/TCKN", "GroupName": "" }, @@ -766,6 +1093,9 @@ "Name": "Jersey", "Currency": "", "PhoneCode": 44, + "PhoneNumberMinLength": 10, + "PhoneNumberMaxLength": 10, + "PhoneNumberFormat": "(000) 000-0000", "TaxLabel": "", "GroupName": "" }, @@ -773,6 +1103,9 @@ "Name": "Jamaika", "Currency": "", "PhoneCode": 1876, + "PhoneNumberMinLength": 7, + "PhoneNumberMaxLength": 7, + "PhoneNumberFormat": "000-0000", "TaxLabel": "", "GroupName": "Kuzey Amerika" }, @@ -780,6 +1113,9 @@ "Name": "Ürdün", "Currency": "", "PhoneCode": 962, + "PhoneNumberMinLength": 8, + "PhoneNumberMaxLength": 9, + "PhoneNumberFormat": "000 000 000", "TaxLabel": "", "GroupName": "" }, @@ -787,6 +1123,9 @@ "Name": "Japonya", "Currency": "", "PhoneCode": 81, + "PhoneNumberMinLength": 9, + "PhoneNumberMaxLength": 10, + "PhoneNumberFormat": "(000) 000-0000", "TaxLabel": "", "GroupName": "Asya" }, @@ -794,6 +1133,9 @@ "Name": "Kenya", "Currency": "", "PhoneCode": 254, + "PhoneNumberMinLength": 7, + "PhoneNumberMaxLength": 9, + "PhoneNumberFormat": "000 000 000", "TaxLabel": "", "GroupName": "Afrika" }, @@ -801,6 +1143,9 @@ "Name": "Kırgızistan", "Currency": "", "PhoneCode": 996, + "PhoneNumberMinLength": 9, + "PhoneNumberMaxLength": 9, + "PhoneNumberFormat": "000 000 000", "TaxLabel": "", "GroupName": "Asya" }, @@ -808,6 +1153,9 @@ "Name": "Kamboçya", "Currency": "", "PhoneCode": 855, + "PhoneNumberMinLength": 8, + "PhoneNumberMaxLength": 9, + "PhoneNumberFormat": "000 000 000", "TaxLabel": "", "GroupName": "Asya" }, @@ -815,6 +1163,9 @@ "Name": "Kiribati", "Currency": "AUD", "PhoneCode": 686, + "PhoneNumberMinLength": 5, + "PhoneNumberMaxLength": 8, + "PhoneNumberFormat": "0000 0000", "TaxLabel": "", "GroupName": "Okyanusya" }, @@ -822,6 +1173,9 @@ "Name": "Komorlar", "Currency": "", "PhoneCode": 269, + "PhoneNumberMinLength": 7, + "PhoneNumberMaxLength": 7, + "PhoneNumberFormat": "000-0000", "TaxLabel": "", "GroupName": "Afrika" }, @@ -829,6 +1183,9 @@ "Name": "Saint Kitts ve Nevis", "Currency": "USD", "PhoneCode": 1869, + "PhoneNumberMinLength": 7, + "PhoneNumberMaxLength": 7, + "PhoneNumberFormat": "000-0000", "TaxLabel": "", "GroupName": "Kuzey Amerika" }, @@ -836,6 +1193,9 @@ "Name": "Kuzey Kore", "Currency": "", "PhoneCode": 850, + "PhoneNumberMinLength": 8, + "PhoneNumberMaxLength": 10, + "PhoneNumberFormat": "(000) 000-0000", "TaxLabel": "", "GroupName": "Asya" }, @@ -843,6 +1203,9 @@ "Name": "Güney Kore", "Currency": "", "PhoneCode": 82, + "PhoneNumberMinLength": 5, + "PhoneNumberMaxLength": 10, + "PhoneNumberFormat": "(000) 000-0000", "TaxLabel": "", "GroupName": "Asya" }, @@ -850,6 +1213,9 @@ "Name": "Kuveyt", "Currency": "", "PhoneCode": 965, + "PhoneNumberMinLength": 8, + "PhoneNumberMaxLength": 8, + "PhoneNumberFormat": "0000 0000", "TaxLabel": "", "GroupName": "Asya" }, @@ -857,6 +1223,9 @@ "Name": "Kayman Adaları", "Currency": "", "PhoneCode": 1345, + "PhoneNumberMinLength": 7, + "PhoneNumberMaxLength": 7, + "PhoneNumberFormat": "000-0000", "TaxLabel": "", "GroupName": "" }, @@ -864,6 +1233,9 @@ "Name": "Kazakistan", "Currency": "", "PhoneCode": 7, + "PhoneNumberMinLength": 10, + "PhoneNumberMaxLength": 10, + "PhoneNumberFormat": "(000) 000-0000", "TaxLabel": "", "GroupName": "Asya" }, @@ -871,6 +1243,9 @@ "Name": "Laos", "Currency": "", "PhoneCode": 856, + "PhoneNumberMinLength": 8, + "PhoneNumberMaxLength": 10, + "PhoneNumberFormat": "(000) 000-0000", "TaxLabel": "", "GroupName": "Asya" }, @@ -878,6 +1253,9 @@ "Name": "Lübnan", "Currency": "", "PhoneCode": 961, + "PhoneNumberMinLength": 7, + "PhoneNumberMaxLength": 8, + "PhoneNumberFormat": "0000 0000", "TaxLabel": "", "GroupName": "Asya" }, @@ -885,6 +1263,9 @@ "Name": "Saint Lucia", "Currency": "USD", "PhoneCode": 1758, + "PhoneNumberMinLength": 7, + "PhoneNumberMaxLength": 7, + "PhoneNumberFormat": "000-0000", "TaxLabel": "", "GroupName": "Kuzey Amerika" }, @@ -892,6 +1273,9 @@ "Name": "Lihtenştayn", "Currency": "CHF", "PhoneCode": 423, + "PhoneNumberMinLength": 7, + "PhoneNumberMaxLength": 9, + "PhoneNumberFormat": "000 000 000", "TaxLabel": "", "GroupName": "Avrupa" }, @@ -899,6 +1283,9 @@ "Name": "Sri Lanka", "Currency": "", "PhoneCode": 94, + "PhoneNumberMinLength": 9, + "PhoneNumberMaxLength": 9, + "PhoneNumberFormat": "000 000 000", "TaxLabel": "", "GroupName": "Asya" }, @@ -906,6 +1293,9 @@ "Name": "Liberya", "Currency": "", "PhoneCode": 231, + "PhoneNumberMinLength": 7, + "PhoneNumberMaxLength": 9, + "PhoneNumberFormat": "000 000 000", "TaxLabel": "", "GroupName": "Afrika" }, @@ -913,6 +1303,9 @@ "Name": "Lesotho", "Currency": "", "PhoneCode": 266, + "PhoneNumberMinLength": 8, + "PhoneNumberMaxLength": 8, + "PhoneNumberFormat": "0000 0000", "TaxLabel": "", "GroupName": "Afrika" }, @@ -920,6 +1313,9 @@ "Name": "Litvanya", "Currency": "EUR", "PhoneCode": 370, + "PhoneNumberMinLength": 8, + "PhoneNumberMaxLength": 8, + "PhoneNumberFormat": "0000 0000", "TaxLabel": "VKN/TCKN", "GroupName": "Avrupa" }, @@ -927,6 +1323,9 @@ "Name": "Lüksemburg", "Currency": "EUR", "PhoneCode": 352, + "PhoneNumberMinLength": 4, + "PhoneNumberMaxLength": 11, + "PhoneNumberFormat": "000 0000 0000", "TaxLabel": "VKN/TCKN", "GroupName": "Avrupa" }, @@ -934,6 +1333,9 @@ "Name": "Letonya", "Currency": "EUR", "PhoneCode": 371, + "PhoneNumberMinLength": 8, + "PhoneNumberMaxLength": 8, + "PhoneNumberFormat": "0000 0000", "TaxLabel": "VKN/TCKN", "GroupName": "Avrupa" }, @@ -941,6 +1343,9 @@ "Name": "Libya", "Currency": "", "PhoneCode": 218, + "PhoneNumberMinLength": 9, + "PhoneNumberMaxLength": 9, + "PhoneNumberFormat": "000 000 000", "TaxLabel": "", "GroupName": "Afrika" }, @@ -948,6 +1353,9 @@ "Name": "Fas", "Currency": "", "PhoneCode": 212, + "PhoneNumberMinLength": 9, + "PhoneNumberMaxLength": 9, + "PhoneNumberFormat": "000 000 000", "TaxLabel": "", "GroupName": "Afrika" }, @@ -955,6 +1363,9 @@ "Name": "Monako", "Currency": "EUR", "PhoneCode": 377, + "PhoneNumberMinLength": 8, + "PhoneNumberMaxLength": 9, + "PhoneNumberFormat": "000 000 000", "TaxLabel": "", "GroupName": "Avrupa" }, @@ -962,6 +1373,9 @@ "Name": "Moldova Cumhuriyeti", "Currency": "", "PhoneCode": 373, + "PhoneNumberMinLength": 8, + "PhoneNumberMaxLength": 8, + "PhoneNumberFormat": "0000 0000", "TaxLabel": "", "GroupName": "" }, @@ -969,6 +1383,9 @@ "Name": "Karadağ", "Currency": "EUR", "PhoneCode": 382, + "PhoneNumberMinLength": 8, + "PhoneNumberMaxLength": 8, + "PhoneNumberFormat": "0000 0000", "TaxLabel": "", "GroupName": "" }, @@ -976,6 +1393,9 @@ "Name": "Saint Martin (Fransız kısmı)", "Currency": "EUR", "PhoneCode": 590, + "PhoneNumberMinLength": 9, + "PhoneNumberMaxLength": 9, + "PhoneNumberFormat": "000 000 000", "TaxLabel": "", "GroupName": "" }, @@ -983,6 +1403,9 @@ "Name": "Madagaskar", "Currency": "", "PhoneCode": 261, + "PhoneNumberMinLength": 9, + "PhoneNumberMaxLength": 9, + "PhoneNumberFormat": "000 000 000", "TaxLabel": "", "GroupName": "Afrika" }, @@ -990,6 +1413,9 @@ "Name": "Marshall Adaları", "Currency": "USD", "PhoneCode": 692, + "PhoneNumberMinLength": 7, + "PhoneNumberMaxLength": 7, + "PhoneNumberFormat": "000-0000", "TaxLabel": "", "GroupName": "Okyanusya" }, @@ -997,6 +1423,9 @@ "Name": "Makedonya", "Currency": "", "PhoneCode": 389, + "PhoneNumberMinLength": 8, + "PhoneNumberMaxLength": 8, + "PhoneNumberFormat": "0000 0000", "TaxLabel": "", "GroupName": "" }, @@ -1004,6 +1433,9 @@ "Name": "Mali", "Currency": "XOF", "PhoneCode": 223, + "PhoneNumberMinLength": 8, + "PhoneNumberMaxLength": 8, + "PhoneNumberFormat": "0000 0000", "TaxLabel": "", "GroupName": "Afrika" }, @@ -1011,6 +1443,9 @@ "Name": "Myanmar", "Currency": "", "PhoneCode": 95, + "PhoneNumberMinLength": 6, + "PhoneNumberMaxLength": 10, + "PhoneNumberFormat": "(000) 000-0000", "TaxLabel": "", "GroupName": "Asya" }, @@ -1018,6 +1453,9 @@ "Name": "Moğolistan", "Currency": "", "PhoneCode": 976, + "PhoneNumberMinLength": 8, + "PhoneNumberMaxLength": 10, + "PhoneNumberFormat": "(000) 000-0000", "TaxLabel": "", "GroupName": "Asya" }, @@ -1025,6 +1463,9 @@ "Name": "Makao", "Currency": "", "PhoneCode": 853, + "PhoneNumberMinLength": 8, + "PhoneNumberMaxLength": 8, + "PhoneNumberFormat": "0000 0000", "TaxLabel": "", "GroupName": "" }, @@ -1032,6 +1473,9 @@ "Name": "Kuzey Mariana Adaları", "Currency": "USD", "PhoneCode": 1670, + "PhoneNumberMinLength": 7, + "PhoneNumberMaxLength": 7, + "PhoneNumberFormat": "000-0000", "TaxLabel": "", "GroupName": "" }, @@ -1039,6 +1483,9 @@ "Name": "Martinik", "Currency": "EUR", "PhoneCode": 596, + "PhoneNumberMinLength": 9, + "PhoneNumberMaxLength": 9, + "PhoneNumberFormat": "000 000 000", "TaxLabel": "", "GroupName": "" }, @@ -1046,6 +1493,9 @@ "Name": "Moritanya", "Currency": "", "PhoneCode": 222, + "PhoneNumberMinLength": 8, + "PhoneNumberMaxLength": 8, + "PhoneNumberFormat": "0000 0000", "TaxLabel": "", "GroupName": "" }, @@ -1053,6 +1503,9 @@ "Name": "Montserrat", "Currency": "USD", "PhoneCode": 1664, + "PhoneNumberMinLength": 7, + "PhoneNumberMaxLength": 7, + "PhoneNumberFormat": "000-0000", "TaxLabel": "", "GroupName": "" }, @@ -1060,6 +1513,9 @@ "Name": "Malta", "Currency": "EUR", "PhoneCode": 356, + "PhoneNumberMinLength": 8, + "PhoneNumberMaxLength": 8, + "PhoneNumberFormat": "0000 0000", "TaxLabel": "VKN/TCKN", "GroupName": "Avrupa" }, @@ -1067,6 +1523,9 @@ "Name": "Mauritius", "Currency": "", "PhoneCode": 230, + "PhoneNumberMinLength": 7, + "PhoneNumberMaxLength": 8, + "PhoneNumberFormat": "0000 0000", "TaxLabel": "", "GroupName": "" }, @@ -1074,6 +1533,9 @@ "Name": "Maldivler", "Currency": "", "PhoneCode": 960, + "PhoneNumberMinLength": 7, + "PhoneNumberMaxLength": 7, + "PhoneNumberFormat": "000-0000", "TaxLabel": "", "GroupName": "Asya" }, @@ -1081,6 +1543,9 @@ "Name": "Malavi", "Currency": "", "PhoneCode": 265, + "PhoneNumberMinLength": 7, + "PhoneNumberMaxLength": 9, + "PhoneNumberFormat": "000 000 000", "TaxLabel": "", "GroupName": "Afrika" }, @@ -1088,6 +1553,9 @@ "Name": "Solomon Adaları", "Currency": "", "PhoneCode": 677, + "PhoneNumberMinLength": 5, + "PhoneNumberMaxLength": 7, + "PhoneNumberFormat": "000-0000", "TaxLabel": "", "GroupName": "Okyanusya" }, @@ -1095,6 +1563,9 @@ "Name": "Meksika", "Currency": "", "PhoneCode": 52, + "PhoneNumberMinLength": 10, + "PhoneNumberMaxLength": 10, + "PhoneNumberFormat": "(000) 000-0000", "TaxLabel": "RFC", "GroupName": "Kuzey Amerika" }, @@ -1102,6 +1573,9 @@ "Name": "Malezya", "Currency": "", "PhoneCode": 60, + "PhoneNumberMinLength": 8, + "PhoneNumberMaxLength": 10, + "PhoneNumberFormat": "(000) 000-0000", "TaxLabel": "", "GroupName": "Asya" }, @@ -1109,6 +1583,9 @@ "Name": "Mozambik", "Currency": "", "PhoneCode": 258, + "PhoneNumberMinLength": 8, + "PhoneNumberMaxLength": 9, + "PhoneNumberFormat": "000 000 000", "TaxLabel": "", "GroupName": "Afrika" }, @@ -1116,6 +1593,9 @@ "Name": "Namibya", "Currency": "", "PhoneCode": 264, + "PhoneNumberMinLength": 8, + "PhoneNumberMaxLength": 9, + "PhoneNumberFormat": "000 000 000", "TaxLabel": "", "GroupName": "Afrika" }, @@ -1123,6 +1603,9 @@ "Name": "Yeni Kaledonya", "Currency": "", "PhoneCode": 687, + "PhoneNumberMinLength": 6, + "PhoneNumberMaxLength": 6, + "PhoneNumberFormat": "000 000", "TaxLabel": "", "GroupName": "" }, @@ -1130,6 +1613,9 @@ "Name": "Nijer", "Currency": "XOF", "PhoneCode": 227, + "PhoneNumberMinLength": 8, + "PhoneNumberMaxLength": 8, + "PhoneNumberFormat": "0000 0000", "TaxLabel": "", "GroupName": "" }, @@ -1137,6 +1623,9 @@ "Name": "Norfolk Adası", "Currency": "AUD", "PhoneCode": 672, + "PhoneNumberMinLength": 6, + "PhoneNumberMaxLength": 6, + "PhoneNumberFormat": "000 000", "TaxLabel": "", "GroupName": "" }, @@ -1144,6 +1633,9 @@ "Name": "Nijerya", "Currency": "", "PhoneCode": 234, + "PhoneNumberMinLength": 10, + "PhoneNumberMaxLength": 10, + "PhoneNumberFormat": "(000) 000-0000", "TaxLabel": "", "GroupName": "" }, @@ -1151,6 +1643,9 @@ "Name": "Nikaragua", "Currency": "", "PhoneCode": 505, + "PhoneNumberMinLength": 8, + "PhoneNumberMaxLength": 8, + "PhoneNumberFormat": "0000 0000", "TaxLabel": "", "GroupName": "Kuzey Amerika" }, @@ -1158,6 +1653,9 @@ "Name": "Hollanda", "Currency": "EUR", "PhoneCode": 31, + "PhoneNumberMinLength": 9, + "PhoneNumberMaxLength": 11, + "PhoneNumberFormat": "000 0000 0000", "TaxLabel": "VKN/TCKN", "GroupName": "Avrupa" }, @@ -1165,6 +1663,9 @@ "Name": "Norveç", "Currency": "", "PhoneCode": 47, + "PhoneNumberMinLength": 8, + "PhoneNumberMaxLength": 8, + "PhoneNumberFormat": "0000 0000", "TaxLabel": "", "GroupName": "Avrupa" }, @@ -1172,6 +1673,9 @@ "Name": "Nepal", "Currency": "", "PhoneCode": 977, + "PhoneNumberMinLength": 8, + "PhoneNumberMaxLength": 10, + "PhoneNumberFormat": "(000) 000-0000", "TaxLabel": "", "GroupName": "Asya" }, @@ -1179,6 +1683,9 @@ "Name": "Nauru", "Currency": "AUD", "PhoneCode": 674, + "PhoneNumberMinLength": 7, + "PhoneNumberMaxLength": 7, + "PhoneNumberFormat": "000-0000", "TaxLabel": "", "GroupName": "Okyanusya" }, @@ -1186,6 +1693,9 @@ "Name": "Niue", "Currency": "", "PhoneCode": 683, + "PhoneNumberMinLength": 4, + "PhoneNumberMaxLength": 7, + "PhoneNumberFormat": "000-0000", "TaxLabel": "", "GroupName": "" }, @@ -1193,6 +1703,9 @@ "Name": "Yeni Zelanda", "Currency": "", "PhoneCode": 64, + "PhoneNumberMinLength": 8, + "PhoneNumberMaxLength": 10, + "PhoneNumberFormat": "(000) 000-0000", "TaxLabel": "", "GroupName": "Okyanusya" }, @@ -1200,6 +1713,9 @@ "Name": "Umman", "Currency": "", "PhoneCode": 968, + "PhoneNumberMinLength": 8, + "PhoneNumberMaxLength": 8, + "PhoneNumberFormat": "0000 0000", "TaxLabel": "", "GroupName": "" }, @@ -1207,6 +1723,9 @@ "Name": "Panama", "Currency": "", "PhoneCode": 507, + "PhoneNumberMinLength": 7, + "PhoneNumberMaxLength": 8, + "PhoneNumberFormat": "0000 0000", "TaxLabel": "RUC", "GroupName": "Kuzey Amerika" }, @@ -1214,6 +1733,9 @@ "Name": "Peru", "Currency": "", "PhoneCode": 51, + "PhoneNumberMinLength": 8, + "PhoneNumberMaxLength": 9, + "PhoneNumberFormat": "000 000 000", "TaxLabel": "RUC", "GroupName": "Güney Amerika" }, @@ -1221,6 +1743,9 @@ "Name": "Fransız Polinezyası", "Currency": "", "PhoneCode": 689, + "PhoneNumberMinLength": 8, + "PhoneNumberMaxLength": 8, + "PhoneNumberFormat": "0000 0000", "TaxLabel": "N° Tahiti", "GroupName": "" }, @@ -1228,6 +1753,9 @@ "Name": "Papua Yeni Gine", "Currency": "", "PhoneCode": 675, + "PhoneNumberMinLength": 7, + "PhoneNumberMaxLength": 8, + "PhoneNumberFormat": "0000 0000", "TaxLabel": "", "GroupName": "Afrika" }, @@ -1235,6 +1763,9 @@ "Name": "Filipinler", "Currency": "", "PhoneCode": 63, + "PhoneNumberMinLength": 6, + "PhoneNumberMaxLength": 10, + "PhoneNumberFormat": "(000) 000-0000", "TaxLabel": "", "GroupName": "Asya" }, @@ -1242,6 +1773,9 @@ "Name": "Pakistan", "Currency": "", "PhoneCode": 92, + "PhoneNumberMinLength": 9, + "PhoneNumberMaxLength": 10, + "PhoneNumberFormat": "(000) 000-0000", "TaxLabel": "", "GroupName": "Asya" }, @@ -1249,6 +1783,9 @@ "Name": "Polonya", "Currency": "", "PhoneCode": 48, + "PhoneNumberMinLength": 7, + "PhoneNumberMaxLength": 9, + "PhoneNumberFormat": "000 000 000", "TaxLabel": "VKN/TCKN", "GroupName": "Avrupa" }, @@ -1256,6 +1793,9 @@ "Name": "Saint Pierre ve Mikelon", "Currency": "EUR", "PhoneCode": 508, + "PhoneNumberMinLength": 6, + "PhoneNumberMaxLength": 9, + "PhoneNumberFormat": "000 000 000", "TaxLabel": "", "GroupName": "" }, @@ -1263,6 +1803,9 @@ "Name": "Pitcairn", "Currency": "", "PhoneCode": 64, + "PhoneNumberMinLength": 5, + "PhoneNumberMaxLength": 15, + "PhoneNumberFormat": "000 000 000 000 000", "TaxLabel": "", "GroupName": "" }, @@ -1270,6 +1813,9 @@ "Name": "Porto Riko", "Currency": "USD", "PhoneCode": 1939, + "PhoneNumberMinLength": 7, + "PhoneNumberMaxLength": 7, + "PhoneNumberFormat": "000-0000", "TaxLabel": "", "GroupName": "" }, @@ -1277,6 +1823,9 @@ "Name": "İşgal Altındaki Filistin Toprağı", "Currency": "ILS", "PhoneCode": 970, + "PhoneNumberMinLength": 8, + "PhoneNumberMaxLength": 9, + "PhoneNumberFormat": "000 000 000", "TaxLabel": "", "GroupName": "" }, @@ -1284,6 +1833,9 @@ "Name": "Portekiz", "Currency": "EUR", "PhoneCode": 351, + "PhoneNumberMinLength": 9, + "PhoneNumberMaxLength": 9, + "PhoneNumberFormat": "000 000 000", "TaxLabel": "VKN/TCKN", "GroupName": "Avrupa" }, @@ -1291,6 +1843,9 @@ "Name": "Palau", "Currency": "USD", "PhoneCode": 680, + "PhoneNumberMinLength": 7, + "PhoneNumberMaxLength": 7, + "PhoneNumberFormat": "000-0000", "TaxLabel": "", "GroupName": "Okyanusya" }, @@ -1298,6 +1853,9 @@ "Name": "Paraguay", "Currency": "", "PhoneCode": 595, + "PhoneNumberMinLength": 7, + "PhoneNumberMaxLength": 9, + "PhoneNumberFormat": "000 000 000", "TaxLabel": "", "GroupName": "Güney Amerika" }, @@ -1305,6 +1863,9 @@ "Name": "Katar", "Currency": "", "PhoneCode": 974, + "PhoneNumberMinLength": 8, + "PhoneNumberMaxLength": 8, + "PhoneNumberFormat": "0000 0000", "TaxLabel": "", "GroupName": "Asya" }, @@ -1312,6 +1873,9 @@ "Name": "Reunion", "Currency": "EUR", "PhoneCode": 262, + "PhoneNumberMinLength": 9, + "PhoneNumberMaxLength": 9, + "PhoneNumberFormat": "000 000 000", "TaxLabel": "", "GroupName": "" }, @@ -1319,6 +1883,9 @@ "Name": "Romanya", "Currency": "", "PhoneCode": 40, + "PhoneNumberMinLength": 6, + "PhoneNumberMaxLength": 9, + "PhoneNumberFormat": "000 000 000", "TaxLabel": "VKN/TCKN", "GroupName": "Avrupa" }, @@ -1326,6 +1893,9 @@ "Name": "Sırbistan", "Currency": "", "PhoneCode": 381, + "PhoneNumberMinLength": 7, + "PhoneNumberMaxLength": 12, + "PhoneNumberFormat": "000 000 000 000", "TaxLabel": "", "GroupName": "" }, @@ -1333,6 +1903,9 @@ "Name": "Rusya Federasyonu", "Currency": "", "PhoneCode": 7, + "PhoneNumberMinLength": 10, + "PhoneNumberMaxLength": 10, + "PhoneNumberFormat": "(000) 000-0000", "TaxLabel": "", "GroupName": "Asya" }, @@ -1340,6 +1913,9 @@ "Name": "Ruanda", "Currency": "", "PhoneCode": 250, + "PhoneNumberMinLength": 8, + "PhoneNumberMaxLength": 9, + "PhoneNumberFormat": "000 000 000", "TaxLabel": "", "GroupName": "Afrika" }, @@ -1347,6 +1923,9 @@ "Name": "Suudi Arabistan", "Currency": "", "PhoneCode": 966, + "PhoneNumberMinLength": 9, + "PhoneNumberMaxLength": 9, + "PhoneNumberFormat": "000 000 000", "TaxLabel": "", "GroupName": "Asya" }, @@ -1354,6 +1933,9 @@ "Name": "Seyşeller", "Currency": "", "PhoneCode": 248, + "PhoneNumberMinLength": 7, + "PhoneNumberMaxLength": 7, + "PhoneNumberFormat": "000-0000", "TaxLabel": "", "GroupName": "Afrika" }, @@ -1361,6 +1943,9 @@ "Name": "Sudan", "Currency": "", "PhoneCode": 249, + "PhoneNumberMinLength": 9, + "PhoneNumberMaxLength": 9, + "PhoneNumberFormat": "000 000 000", "TaxLabel": "", "GroupName": "Afrika" }, @@ -1368,6 +1953,9 @@ "Name": "İsveç", "Currency": "", "PhoneCode": 46, + "PhoneNumberMinLength": 7, + "PhoneNumberMaxLength": 9, + "PhoneNumberFormat": "000 000 000", "TaxLabel": "VKN/TCKN", "GroupName": "" }, @@ -1375,6 +1963,9 @@ "Name": "Singapur", "Currency": "", "PhoneCode": 65, + "PhoneNumberMinLength": 8, + "PhoneNumberMaxLength": 8, + "PhoneNumberFormat": "0000 0000", "TaxLabel": "GST No.", "GroupName": "Asya" }, @@ -1382,6 +1973,9 @@ "Name": "Saint Helena", "Currency": "", "PhoneCode": 290, + "PhoneNumberMinLength": 4, + "PhoneNumberMaxLength": 5, + "PhoneNumberFormat": "00 000", "TaxLabel": "", "GroupName": "" }, @@ -1389,6 +1983,9 @@ "Name": "Slovenya", "Currency": "EUR", "PhoneCode": 386, + "PhoneNumberMinLength": 8, + "PhoneNumberMaxLength": 8, + "PhoneNumberFormat": "0000 0000", "TaxLabel": "VKN/TCKN", "GroupName": "Avrupa" }, @@ -1396,6 +1993,9 @@ "Name": "Svalbard ve Jan Mayen", "Currency": "", "PhoneCode": 47, + "PhoneNumberMinLength": 8, + "PhoneNumberMaxLength": 8, + "PhoneNumberFormat": "0000 0000", "TaxLabel": "", "GroupName": "" }, @@ -1403,6 +2003,9 @@ "Name": "Slovakya", "Currency": "EUR", "PhoneCode": 421, + "PhoneNumberMinLength": 6, + "PhoneNumberMaxLength": 9, + "PhoneNumberFormat": "000 000 000", "TaxLabel": "VKN/TCKN", "GroupName": "Avrupa" }, @@ -1410,6 +2013,9 @@ "Name": "Sierra Leone", "Currency": "", "PhoneCode": 232, + "PhoneNumberMinLength": 8, + "PhoneNumberMaxLength": 8, + "PhoneNumberFormat": "0000 0000", "TaxLabel": "", "GroupName": "Afrika" }, @@ -1417,6 +2023,9 @@ "Name": "San Marino", "Currency": "EUR", "PhoneCode": 378, + "PhoneNumberMinLength": 8, + "PhoneNumberMaxLength": 10, + "PhoneNumberFormat": "(000) 000-0000", "TaxLabel": "", "GroupName": "Avrupa" }, @@ -1424,6 +2033,9 @@ "Name": "Senegal", "Currency": "XOF", "PhoneCode": 221, + "PhoneNumberMinLength": 9, + "PhoneNumberMaxLength": 9, + "PhoneNumberFormat": "000 000 000", "TaxLabel": "", "GroupName": "Afrika" }, @@ -1431,6 +2043,9 @@ "Name": "Somali", "Currency": "", "PhoneCode": 252, + "PhoneNumberMinLength": 6, + "PhoneNumberMaxLength": 9, + "PhoneNumberFormat": "000 000 000", "TaxLabel": "", "GroupName": "Afrika" }, @@ -1438,6 +2053,9 @@ "Name": "Surinam", "Currency": "", "PhoneCode": 597, + "PhoneNumberMinLength": 6, + "PhoneNumberMaxLength": 7, + "PhoneNumberFormat": "000-0000", "TaxLabel": "", "GroupName": "Güney Amerika" }, @@ -1445,6 +2063,9 @@ "Name": "South Sudan", "Currency": "", "PhoneCode": 211, + "PhoneNumberMinLength": 9, + "PhoneNumberMaxLength": 9, + "PhoneNumberFormat": "000 000 000", "TaxLabel": "", "GroupName": "Afrika" }, @@ -1452,6 +2073,9 @@ "Name": "Sao Tome ve Principe", "Currency": "", "PhoneCode": 239, + "PhoneNumberMinLength": 7, + "PhoneNumberMaxLength": 7, + "PhoneNumberFormat": "000-0000", "TaxLabel": "", "GroupName": "Afrika" }, @@ -1459,6 +2083,9 @@ "Name": "El Salvador", "Currency": "", "PhoneCode": 503, + "PhoneNumberMinLength": 8, + "PhoneNumberMaxLength": 8, + "PhoneNumberFormat": "0000 0000", "TaxLabel": "", "GroupName": "Kuzey Amerika" }, @@ -1466,6 +2093,9 @@ "Name": "Sint Maarten", "Currency": "ANG", "PhoneCode": 1721, + "PhoneNumberMinLength": 7, + "PhoneNumberMaxLength": 7, + "PhoneNumberFormat": "000-0000", "TaxLabel": "", "GroupName": "" }, @@ -1473,6 +2103,9 @@ "Name": "Suriye", "Currency": "", "PhoneCode": 963, + "PhoneNumberMinLength": 8, + "PhoneNumberMaxLength": 9, + "PhoneNumberFormat": "000 000 000", "TaxLabel": "", "GroupName": "Asya" }, @@ -1480,6 +2113,9 @@ "Name": "Svaziland", "Currency": "", "PhoneCode": 268, + "PhoneNumberMinLength": 8, + "PhoneNumberMaxLength": 8, + "PhoneNumberFormat": "0000 0000", "TaxLabel": "", "GroupName": "Afrika" }, @@ -1487,6 +2123,9 @@ "Name": "Turks ve Caicos Adaları", "Currency": "USD", "PhoneCode": 1649, + "PhoneNumberMinLength": 7, + "PhoneNumberMaxLength": 7, + "PhoneNumberFormat": "000-0000", "TaxLabel": "", "GroupName": "" }, @@ -1494,6 +2133,9 @@ "Name": "Çad", "Currency": "", "PhoneCode": 235, + "PhoneNumberMinLength": 8, + "PhoneNumberMaxLength": 8, + "PhoneNumberFormat": "0000 0000", "TaxLabel": "", "GroupName": "Afrika" }, @@ -1501,6 +2143,9 @@ "Name": "Fransız Güney Toprakları", "Currency": "EUR", "PhoneCode": 262, + "PhoneNumberMinLength": 5, + "PhoneNumberMaxLength": 15, + "PhoneNumberFormat": "000 000 000 000 000", "TaxLabel": "", "GroupName": "" }, @@ -1508,6 +2153,9 @@ "Name": "Togo", "Currency": "XOF", "PhoneCode": 228, + "PhoneNumberMinLength": 8, + "PhoneNumberMaxLength": 8, + "PhoneNumberFormat": "0000 0000", "TaxLabel": "", "GroupName": "Afrika" }, @@ -1515,6 +2163,9 @@ "Name": "Tayland", "Currency": "", "PhoneCode": 66, + "PhoneNumberMinLength": 8, + "PhoneNumberMaxLength": 9, + "PhoneNumberFormat": "000 000 000", "TaxLabel": "", "GroupName": "Asya" }, @@ -1522,6 +2173,9 @@ "Name": "Tacikistan", "Currency": "", "PhoneCode": 992, + "PhoneNumberMinLength": 9, + "PhoneNumberMaxLength": 9, + "PhoneNumberFormat": "000 000 000", "TaxLabel": "", "GroupName": "Asya" }, @@ -1529,6 +2183,9 @@ "Name": "Tokelau", "Currency": "", "PhoneCode": 690, + "PhoneNumberMinLength": 4, + "PhoneNumberMaxLength": 7, + "PhoneNumberFormat": "000-0000", "TaxLabel": "", "GroupName": "" }, @@ -1536,6 +2193,9 @@ "Name": "Türkmenistan", "Currency": "", "PhoneCode": 993, + "PhoneNumberMinLength": 8, + "PhoneNumberMaxLength": 8, + "PhoneNumberFormat": "0000 0000", "TaxLabel": "", "GroupName": "" }, @@ -1543,6 +2203,9 @@ "Name": "Tunus", "Currency": "", "PhoneCode": 216, + "PhoneNumberMinLength": 8, + "PhoneNumberMaxLength": 8, + "PhoneNumberFormat": "0000 0000", "TaxLabel": "", "GroupName": "Afrika" }, @@ -1550,6 +2213,9 @@ "Name": "Tonga", "Currency": "", "PhoneCode": 676, + "PhoneNumberMinLength": 5, + "PhoneNumberMaxLength": 7, + "PhoneNumberFormat": "000-0000", "TaxLabel": "", "GroupName": "Okyanusya" }, @@ -1557,6 +2223,9 @@ "Name": "Doğu Timor", "Currency": "USD", "PhoneCode": 670, + "PhoneNumberMinLength": 7, + "PhoneNumberMaxLength": 8, + "PhoneNumberFormat": "0000 0000", "TaxLabel": "", "GroupName": "Asya" }, @@ -1564,6 +2233,9 @@ "Name": "Türkiye", "Currency": "TRY", "PhoneCode": 90, + "PhoneNumberMinLength": 10, + "PhoneNumberMaxLength": 10, + "PhoneNumberFormat": "(000) 000-0000", "TaxLabel": "", "GroupName": "Avrupa" }, @@ -1571,6 +2243,9 @@ "Name": "Trinidad ve Tobago", "Currency": "", "PhoneCode": 1868, + "PhoneNumberMinLength": 7, + "PhoneNumberMaxLength": 7, + "PhoneNumberFormat": "000-0000", "TaxLabel": "", "GroupName": "Kuzey Amerika" }, @@ -1578,6 +2253,9 @@ "Name": "Tuvalu", "Currency": "AUD", "PhoneCode": 688, + "PhoneNumberMinLength": 5, + "PhoneNumberMaxLength": 7, + "PhoneNumberFormat": "000-0000", "TaxLabel": "", "GroupName": "Okyanusya" }, @@ -1585,6 +2263,9 @@ "Name": "Tayvan", "Currency": "", "PhoneCode": 886, + "PhoneNumberMinLength": 8, + "PhoneNumberMaxLength": 9, + "PhoneNumberFormat": "000 000 000", "TaxLabel": "", "GroupName": "" }, @@ -1592,6 +2273,9 @@ "Name": "Tanzanya Birleşik Cumhuriyeti", "Currency": "", "PhoneCode": 255, + "PhoneNumberMinLength": 9, + "PhoneNumberMaxLength": 9, + "PhoneNumberFormat": "000 000 000", "TaxLabel": "", "GroupName": "Afrika" }, @@ -1599,6 +2283,9 @@ "Name": "Ukrayna", "Currency": "", "PhoneCode": 380, + "PhoneNumberMinLength": 9, + "PhoneNumberMaxLength": 9, + "PhoneNumberFormat": "000 000 000", "TaxLabel": "", "GroupName": "" }, @@ -1606,6 +2293,9 @@ "Name": "Uganda", "Currency": "", "PhoneCode": 256, + "PhoneNumberMinLength": 9, + "PhoneNumberMaxLength": 9, + "PhoneNumberFormat": "000 000 000", "TaxLabel": "", "GroupName": "Afrika" }, @@ -1613,6 +2303,9 @@ "Name": "Birleşik Krallık (Büyük Britanya ve Kuzey İrlanda)", "Currency": "", "PhoneCode": 44, + "PhoneNumberMinLength": 9, + "PhoneNumberMaxLength": 10, + "PhoneNumberFormat": "(000) 000-0000", "TaxLabel": "VKN/TCKN", "GroupName": "" }, @@ -1620,6 +2313,9 @@ "Name": "Birleşik Devletler Minor Outlying Adaları", "Currency": "USD", "PhoneCode": 699, + "PhoneNumberMinLength": 5, + "PhoneNumberMaxLength": 15, + "PhoneNumberFormat": "000 000 000 000 000", "TaxLabel": "", "GroupName": "" }, @@ -1627,6 +2323,9 @@ "Name": "Amerika Birleşik Devletleri", "Currency": "USD", "PhoneCode": 1, + "PhoneNumberMinLength": 10, + "PhoneNumberMaxLength": 10, + "PhoneNumberFormat": "(000) 000-0000", "TaxLabel": "", "GroupName": "Kuzey Amerika" }, @@ -1634,6 +2333,9 @@ "Name": "Uruguay", "Currency": "", "PhoneCode": 598, + "PhoneNumberMinLength": 8, + "PhoneNumberMaxLength": 8, + "PhoneNumberFormat": "0000 0000", "TaxLabel": "", "GroupName": "Güney Amerika" }, @@ -1641,6 +2343,9 @@ "Name": "Özbekistan", "Currency": "", "PhoneCode": 998, + "PhoneNumberMinLength": 9, + "PhoneNumberMaxLength": 9, + "PhoneNumberFormat": "000 000 000", "TaxLabel": "", "GroupName": "Asya" }, @@ -1648,6 +2353,9 @@ "Name": "Vatikan", "Currency": "EUR", "PhoneCode": 379, + "PhoneNumberMinLength": 6, + "PhoneNumberMaxLength": 11, + "PhoneNumberFormat": "000 0000 0000", "TaxLabel": "", "GroupName": "Avrupa" }, @@ -1655,6 +2363,9 @@ "Name": "Saint Vincent ve Grenadinler", "Currency": "USD", "PhoneCode": 1784, + "PhoneNumberMinLength": 7, + "PhoneNumberMaxLength": 7, + "PhoneNumberFormat": "000-0000", "TaxLabel": "", "GroupName": "Kuzey Amerika" }, @@ -1662,6 +2373,9 @@ "Name": "Venezuela", "Currency": "", "PhoneCode": 58, + "PhoneNumberMinLength": 10, + "PhoneNumberMaxLength": 10, + "PhoneNumberFormat": "(000) 000-0000", "TaxLabel": "", "GroupName": "Güney Amerika" }, @@ -1669,6 +2383,9 @@ "Name": "Virjin Adaları (İngiliz)", "Currency": "USD", "PhoneCode": 1284, + "PhoneNumberMinLength": 7, + "PhoneNumberMaxLength": 7, + "PhoneNumberFormat": "000-0000", "TaxLabel": "", "GroupName": "" }, @@ -1676,6 +2393,9 @@ "Name": "Virjin Adaları (ABD)", "Currency": "USD", "PhoneCode": 1340, + "PhoneNumberMinLength": 7, + "PhoneNumberMaxLength": 7, + "PhoneNumberFormat": "000-0000", "TaxLabel": "", "GroupName": "Kuzey Amerika" }, @@ -1683,6 +2403,9 @@ "Name": "Vietnam", "Currency": "", "PhoneCode": 84, + "PhoneNumberMinLength": 9, + "PhoneNumberMaxLength": 10, + "PhoneNumberFormat": "(000) 000-0000", "TaxLabel": "", "GroupName": "" }, @@ -1690,6 +2413,9 @@ "Name": "Vanuatu", "Currency": "", "PhoneCode": 678, + "PhoneNumberMinLength": 5, + "PhoneNumberMaxLength": 7, + "PhoneNumberFormat": "000-0000", "TaxLabel": "", "GroupName": "" }, @@ -1697,6 +2423,9 @@ "Name": "Wallis ve Futuna", "Currency": "", "PhoneCode": 681, + "PhoneNumberMinLength": 6, + "PhoneNumberMaxLength": 6, + "PhoneNumberFormat": "000 000", "TaxLabel": "", "GroupName": "" }, @@ -1704,6 +2433,9 @@ "Name": "Samoa", "Currency": "", "PhoneCode": 685, + "PhoneNumberMinLength": 5, + "PhoneNumberMaxLength": 10, + "PhoneNumberFormat": "(000) 000-0000", "TaxLabel": "", "GroupName": "Okyanusya" }, @@ -1711,6 +2443,9 @@ "Name": "Yemen", "Currency": "", "PhoneCode": 967, + "PhoneNumberMinLength": 7, + "PhoneNumberMaxLength": 9, + "PhoneNumberFormat": "000 000 000", "TaxLabel": "", "GroupName": "Asya" }, @@ -1718,6 +2453,9 @@ "Name": "Mayotte", "Currency": "EUR", "PhoneCode": 262, + "PhoneNumberMinLength": 9, + "PhoneNumberMaxLength": 9, + "PhoneNumberFormat": "000 000 000", "TaxLabel": "", "GroupName": "" }, @@ -1725,6 +2463,9 @@ "Name": "Güney Afrika Cumhuriyeti", "Currency": "", "PhoneCode": 27, + "PhoneNumberMinLength": 5, + "PhoneNumberMaxLength": 9, + "PhoneNumberFormat": "000 000 000", "TaxLabel": "", "GroupName": "Afrika" }, @@ -1732,6 +2473,9 @@ "Name": "Zambia", "Currency": "", "PhoneCode": 260, + "PhoneNumberMinLength": 9, + "PhoneNumberMaxLength": 9, + "PhoneNumberFormat": "000 000 000", "TaxLabel": "", "GroupName": "" }, @@ -1739,6 +2483,9 @@ "Name": "Zimbabve", "Currency": "", "PhoneCode": 263, + "PhoneNumberMinLength": 5, + "PhoneNumberMaxLength": 10, + "PhoneNumberFormat": "(000) 000-0000", "TaxLabel": "", "GroupName": "" }, @@ -1746,8 +2493,10 @@ "Name": "Kosova", "Currency": "EUR", "PhoneCode": 383, + "PhoneNumberMinLength": 8, + "PhoneNumberMaxLength": 12, + "PhoneNumberFormat": "000 000 000 000", "TaxLabel": "", "GroupName": "" } ] - diff --git a/api/src/Sozsoft.Platform.DbMigrator/Seeds/HostDataSeeder.cs b/api/src/Sozsoft.Platform.DbMigrator/Seeds/HostDataSeeder.cs index e210eac..df724f7 100644 --- a/api/src/Sozsoft.Platform.DbMigrator/Seeds/HostDataSeeder.cs +++ b/api/src/Sozsoft.Platform.DbMigrator/Seeds/HostDataSeeder.cs @@ -248,6 +248,9 @@ public class HostDataSeeder : IDataSeedContributor, ITransientDependency groupName, item.Currency, item.PhoneCode, + item.PhoneNumberMinLength, + item.PhoneNumberMaxLength, + item.PhoneNumberFormat, item.TaxLabel )); diff --git a/api/src/Sozsoft.Platform.DbMigrator/Seeds/LanguagesData.json b/api/src/Sozsoft.Platform.DbMigrator/Seeds/LanguagesData.json index a47b0eb..60c8c9f 100644 --- a/api/src/Sozsoft.Platform.DbMigrator/Seeds/LanguagesData.json +++ b/api/src/Sozsoft.Platform.DbMigrator/Seeds/LanguagesData.json @@ -13758,6 +13758,24 @@ "en": "Billing Cycle", "tr": "Fatura Döngüsü" }, + { + "resourceName": "Platform", + "key": "App.Listform.ListformField.Period", + "en": "Period", + "tr": "Periyot" + }, + { + "resourceName": "Platform", + "key": "App.Listform.ListformField.LicenseStartTime", + "en": "License Start Time", + "tr": "Lisans Başlangıç Tarihi" + }, + { + "resourceName": "Platform", + "key": "App.Listform.ListformField.LicenseStopTime", + "en": "License Stop Time", + "tr": "Lisans Bitiş Tarihi" + }, { "resourceName": "Platform", "key": "App.Listform.ListformField.Abbreviation", @@ -16068,6 +16086,24 @@ "en": "Phone Code", "tr": "Telefon Kodu" }, + { + "resourceName": "Platform", + "key": "App.Listform.ListformField.PhoneNumberMinLength", + "en": "Phone Number Min Length", + "tr": "Telefon Numarası Minimum Uzunluk" + }, + { + "resourceName": "Platform", + "key": "App.Listform.ListformField.PhoneNumberMaxLength", + "en": "Phone Number Max Length", + "tr": "Telefon Numarası Maksimum Uzunluk" + }, + { + "resourceName": "Platform", + "key": "App.Listform.ListformField.PhoneNumberFormat", + "en": "Phone Number Format", + "tr": "Telefon Numarası Formatı" + }, { "resourceName": "Platform", "key": "App.Listform.ListformField.Place", @@ -16140,6 +16176,12 @@ "en": "Postal Code", "tr": "Posta Kodu" }, + { + "resourceName": "Platform", + "key": "App.Listform.ListformField.IsExisting", + "en": "Existing Customer", + "tr": "Mevcut Musteri" + }, { "resourceName": "Platform", "key": "App.Listform.ListformField.Priority", diff --git a/api/src/Sozsoft.Platform.DbMigrator/Seeds/ListFormSeeder_Saas.cs b/api/src/Sozsoft.Platform.DbMigrator/Seeds/ListFormSeeder_Saas.cs index 0837227..de12a7d 100644 --- a/api/src/Sozsoft.Platform.DbMigrator/Seeds/ListFormSeeder_Saas.cs +++ b/api/src/Sozsoft.Platform.DbMigrator/Seeds/ListFormSeeder_Saas.cs @@ -1766,9 +1766,12 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency new EditingFormItemDto { Order = 3, DataField = "GroupName", ColSpan = 1, EditorType2 = EditorTypes.dxSelectBox, EditorOptions=EditorOptionValues.ShowClearButton }, new EditingFormItemDto { Order = 4, DataField = "Currency", ColSpan = 1, EditorType2 = EditorTypes.dxSelectBox, EditorOptions=EditorOptionValues.ShowClearButton }, new EditingFormItemDto { Order = 5, DataField = "PhoneCode", ColSpan = 1, EditorType2 = EditorTypes.dxNumberBox }, - new EditingFormItemDto { Order = 6, DataField = "TaxLabel", ColSpan = 1, EditorType2 = EditorTypes.dxTextBox }, - new EditingFormItemDto { Order = 7, DataField = "ZipRequired", ColSpan = 1, EditorType2 = EditorTypes.dxCheckBox }, - new EditingFormItemDto { Order = 8, DataField = "StateRequired", ColSpan = 1, EditorType2 = EditorTypes.dxCheckBox } + new EditingFormItemDto { Order = 6, DataField = "PhoneNumberMinLength", ColSpan = 1, EditorType2 = EditorTypes.dxNumberBox }, + new EditingFormItemDto { Order = 7, DataField = "PhoneNumberMaxLength", ColSpan = 1, EditorType2 = EditorTypes.dxNumberBox }, + new EditingFormItemDto { Order = 8, DataField = "PhoneNumberFormat", ColSpan = 1, EditorType2 = EditorTypes.dxTextBox }, + new EditingFormItemDto { Order = 9, DataField = "TaxLabel", ColSpan = 1, EditorType2 = EditorTypes.dxTextBox }, + new EditingFormItemDto { Order = 10, DataField = "ZipRequired", ColSpan = 1, EditorType2 = EditorTypes.dxCheckBox }, + new EditingFormItemDto { Order = 11, DataField = "StateRequired", ColSpan = 1, EditorType2 = EditorTypes.dxCheckBox } ] } }), @@ -1866,6 +1869,57 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency PermissionJson = DefaultFieldPermissionJson(listForm.Name), }, new() + { + ListFormCode = listForm.ListFormCode, + CultureName = LanguageCodes.En, + SourceDbType = DbType.Int32, + FieldName = "PhoneNumberMinLength", + CaptionName = "App.Listform.ListformField.PhoneNumberMinLength", + Width = 0, + ListOrderNo = 7, + Visible = true, + IsActive = true, + + AllowSearch = false, + ValidationRuleJson = DefaultValidationRuleRequiredJson, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(listForm.Name), + }, + new() + { + ListFormCode = listForm.ListFormCode, + CultureName = LanguageCodes.En, + SourceDbType = DbType.Int32, + FieldName = "PhoneNumberMaxLength", + CaptionName = "App.Listform.ListformField.PhoneNumberMaxLength", + Width = 0, + ListOrderNo = 8, + Visible = true, + IsActive = true, + + AllowSearch = false, + ValidationRuleJson = DefaultValidationRuleRequiredJson, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(listForm.Name), + }, + new() + { + ListFormCode = listForm.ListFormCode, + CultureName = LanguageCodes.En, + SourceDbType = DbType.String, + FieldName = "PhoneNumberFormat", + CaptionName = "App.Listform.ListformField.PhoneNumberFormat", + Width = 0, + ListOrderNo = 9, + Visible = true, + IsActive = true, + + AllowSearch = false, + ValidationRuleJson = DefaultValidationRuleRequiredJson, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(listForm.Name), + }, + new() { ListFormCode = listForm.ListFormCode, CultureName = LanguageCodes.En, @@ -1873,7 +1927,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency FieldName = "TaxLabel", CaptionName = "App.Listform.ListformField.TaxLabel", Width = 0, - ListOrderNo = 7, + ListOrderNo = 10, Visible = true, IsActive = true, @@ -1889,7 +1943,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency FieldName = "ZipRequired", CaptionName = "App.Listform.ListformField.ZipRequired", Width = 0, - ListOrderNo = 8, + ListOrderNo = 11, Visible = true, IsActive = true, @@ -1904,7 +1958,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency FieldName = "StateRequired", CaptionName = "App.Listform.ListformField.StateRequired", Width = 0, - ListOrderNo = 9, + ListOrderNo = 12, Visible = true, IsActive = true, @@ -6931,13 +6985,21 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency new EditingFormItemDto { Order = 18, DataField = "Total", ColSpan = 1, EditorType2 = EditorTypes.dxNumberBox, EditorOptions=EditorOptionValues.NumberStandartFormat() }, new EditingFormItemDto { Order = 19, DataField = "PaymentMethodId", ColSpan = 1, EditorType2 = EditorTypes.dxSelectBox, EditorOptions=EditorOptionValues.ShowClearButton }, new EditingFormItemDto { Order = 20, DataField = "Installment", ColSpan = 1, EditorType2 = EditorTypes.dxSelectBox, EditorOptions=EditorOptionValues.ShowClearButton }, - new EditingFormItemDto { Order = 21, DataField = "IsActive", ColSpan = 1, EditorType2 = EditorTypes.dxCheckBox }, + new EditingFormItemDto { Order = 21, DataField = "BillingCycle", ColSpan = 1, EditorType2 = EditorTypes.dxTextBox }, + new EditingFormItemDto { Order = 22, DataField = "Period", ColSpan = 1, EditorType2 = EditorTypes.dxNumberBox }, + new EditingFormItemDto { Order = 23, DataField = "LicenseStartTime", ColSpan = 1, EditorType2 = EditorTypes.dxDateBox }, + new EditingFormItemDto { Order = 24, DataField = "LicenseStopTime", ColSpan = 1, EditorType2 = EditorTypes.dxDateBox }, + new EditingFormItemDto { Order = 25, DataField = "IsExisting", ColSpan = 1, EditorType2 = EditorTypes.dxCheckBox }, + new EditingFormItemDto { Order = 26, DataField = "IsActive", ColSpan = 1, EditorType2 = EditorTypes.dxCheckBox }, ] } }), InsertFieldsDefaultValueJson = DefaultInsertFieldsDefaultValueJson(), FormFieldsDefaultValueJson = JsonSerializer.Serialize(new FieldsDefaultValue[] { new() { FieldName = "Country", FieldDbType = DbType.String, Value = "Türkiye", CustomValueType = FieldCustomValueTypeEnum.Value }, + new() { FieldName = "BillingCycle", FieldDbType = DbType.String, Value = "yearly", CustomValueType = FieldCustomValueTypeEnum.Value }, + new() { FieldName = "Period", FieldDbType = DbType.Int32, Value = "1", CustomValueType = FieldCustomValueTypeEnum.Value }, + new() { FieldName = "IsExisting", FieldDbType = DbType.Boolean, Value = "false", CustomValueType = FieldCustomValueTypeEnum.Value }, new() { FieldName = "IsActive", FieldDbType = DbType.Boolean, Value = "true", CustomValueType = FieldCustomValueTypeEnum.Value }, new() { FieldName = "Commission", FieldDbType = DbType.Decimal, Value = "0", CustomValueType = FieldCustomValueTypeEnum.Value } }), @@ -7013,6 +7075,91 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency PivotSettingsJson = DefaultPivotSettingsJson, }, new() + { + ListFormCode = listForm.ListFormCode, + CultureName = LanguageCodes.En, + SourceDbType = DbType.Boolean, + FieldName = "IsExisting", + CaptionName = "App.Listform.ListformField.IsExisting", + Width = 0, + ListOrderNo = 4, + Visible = true, + IsActive = true, + + AllowSearch = true, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(listForm.Name), + PivotSettingsJson = DefaultPivotSettingsJson, + }, + new() + { + ListFormCode = listForm.ListFormCode, + CultureName = LanguageCodes.En, + SourceDbType = DbType.String, + FieldName = "BillingCycle", + CaptionName = "App.Listform.ListformField.BillingCycle", + Width = 0, + ListOrderNo = 5, + Visible = true, + IsActive = true, + + AllowSearch = true, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(listForm.Name), + PivotSettingsJson = DefaultPivotSettingsJson, + }, + new() + { + ListFormCode = listForm.ListFormCode, + CultureName = LanguageCodes.En, + SourceDbType = DbType.Int32, + FieldName = "Period", + CaptionName = "App.Listform.ListformField.Period", + Width = 0, + ListOrderNo = 6, + Visible = true, + IsActive = true, + + AllowSearch = true, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(listForm.Name), + PivotSettingsJson = DefaultPivotSettingsJson, + }, + new() + { + ListFormCode = listForm.ListFormCode, + CultureName = LanguageCodes.En, + SourceDbType = DbType.DateTime, + FieldName = "LicenseStartTime", + CaptionName = "App.Listform.ListformField.LicenseStartTime", + Width = 0, + ListOrderNo = 7, + Visible = true, + IsActive = true, + + AllowSearch = true, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(listForm.Name), + PivotSettingsJson = DefaultPivotSettingsJson, + }, + new() + { + ListFormCode = listForm.ListFormCode, + CultureName = LanguageCodes.En, + SourceDbType = DbType.DateTime, + FieldName = "LicenseStopTime", + CaptionName = "App.Listform.ListformField.LicenseStopTime", + Width = 0, + ListOrderNo = 8, + Visible = true, + IsActive = true, + + AllowSearch = true, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(listForm.Name), + PivotSettingsJson = DefaultPivotSettingsJson, + }, + new() { ListFormCode = listForm.ListFormCode, CultureName = LanguageCodes.En, @@ -7020,7 +7167,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency FieldName = "VknTckn", CaptionName = "App.Listform.ListformField.VknTckn", Width = 0, - ListOrderNo = 4, + ListOrderNo = 9, Visible = true, IsActive = true, @@ -7038,7 +7185,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency FieldName = "TaxOffice", CaptionName = "App.Listform.ListformField.TaxOffice", Width = 0, - ListOrderNo = 5, + ListOrderNo = 10, Visible = true, IsActive = true, @@ -7056,7 +7203,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency FieldName = "Address1", CaptionName = "App.Listform.ListformField.Address1", Width = 0, - ListOrderNo = 6, + ListOrderNo = 11, Visible = true, IsActive = true, @@ -7074,7 +7221,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency FieldName = "Address2", CaptionName = "App.Listform.ListformField.Address2", Width = 0, - ListOrderNo = 7, + ListOrderNo = 12, Visible = true, IsActive = true, @@ -7091,7 +7238,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency FieldName = "Country", CaptionName = "App.Listform.ListformField.Country", Width = 0, - ListOrderNo = 8, + ListOrderNo = 13, Visible = true, IsActive = true, @@ -7117,7 +7264,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency FieldName = "City", CaptionName = "App.Listform.ListformField.City", Width = 0, - ListOrderNo = 9, + ListOrderNo = 14, Visible = true, IsActive = true, @@ -7146,7 +7293,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency FieldName = "District", CaptionName = "App.Listform.ListformField.District", Width = 0, - ListOrderNo = 10, + ListOrderNo = 15, Visible = true, IsActive = true, @@ -7174,7 +7321,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency FieldName = "PhoneNumber", CaptionName = "Abp.Identity.User.UserInformation.PhoneNumber", Width = 0, - ListOrderNo = 11, + ListOrderNo = 16, Visible = true, IsActive = true, @@ -7193,7 +7340,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency FieldName = "MobileNumber", CaptionName = "App.Listform.ListformField.MobileNumber", Width = 0, - ListOrderNo = 12, + ListOrderNo = 17, Visible = true, IsActive = true, @@ -7212,7 +7359,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency FieldName = "FaxNumber", CaptionName = "App.Listform.ListformField.FaxNumber", Width = 0, - ListOrderNo = 13, + ListOrderNo = 18, Visible = true, IsActive = true, @@ -7230,7 +7377,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency FieldName = "Website", CaptionName = "App.Listform.ListformField.Website", Width = 0, - ListOrderNo = 14, + ListOrderNo = 19, Visible = true, IsActive = true, @@ -7249,7 +7396,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency CaptionName = "App.Listform.ListformField.Subtotal", Alignment = "right", Width = 0, - ListOrderNo = 15, + ListOrderNo = 20, Visible = true, IsActive = true, @@ -7269,7 +7416,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency CaptionName = "App.Listform.ListformField.Commission", Alignment = "right", Width = 0, - ListOrderNo = 16, + ListOrderNo = 21, Visible = true, IsActive = true, @@ -7289,7 +7436,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency CaptionName = "App.Listform.ListformField.Total", Alignment = "right", Width = 0, - ListOrderNo = 17, + ListOrderNo = 22, Visible = true, IsActive = true, @@ -7308,7 +7455,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency FieldName = "PaymentMethodId", CaptionName = "App.Listform.ListformField.PaymentMethodId", Width = 0, - ListOrderNo = 18, + ListOrderNo = 23, Visible = true, IsActive = true, @@ -7327,7 +7474,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency FieldName = "Installment", CaptionName = "App.Listform.ListformField.Installment", Width = 0, - ListOrderNo = 19, + ListOrderNo = 24, Visible = true, IsActive = true, @@ -7346,7 +7493,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency FieldName = "IsActive", CaptionName = "App.Listform.ListformField.IsActive", Width = 0, - ListOrderNo = 20, + ListOrderNo = 25, Visible = true, IsActive = true, @@ -7363,7 +7510,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency FieldName = "PostalCode", CaptionName = "App.Listform.ListformField.PostalCode", Width = 0, - ListOrderNo = 21, + ListOrderNo = 26, Visible = true, IsActive = true, @@ -7381,7 +7528,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency FieldName = "Email", CaptionName = "App.Listform.ListformField.Email", Width = 0, - ListOrderNo = 22, + ListOrderNo = 27, Visible = true, IsActive = true, @@ -7394,6 +7541,133 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency ]); #endregion } + else + { + var existingListForm = await _listFormRepository.FirstOrDefaultAsync(a => a.ListFormCode == listFormName); + + if (existingListForm != null) + { + if (!await _listFormFieldRepository.AnyAsync(a => + a.ListFormCode == listFormName && + a.FieldName == "BillingCycle" && + a.CultureName == LanguageCodes.En)) + { + await _listFormFieldRepository.InsertAsync(new() + { + ListFormCode = existingListForm.ListFormCode, + CultureName = LanguageCodes.En, + SourceDbType = DbType.String, + FieldName = "BillingCycle", + CaptionName = "App.Listform.ListformField.BillingCycle", + Width = 0, + ListOrderNo = 20, + Visible = true, + IsActive = true, + + AllowSearch = true, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(existingListForm.Name), + PivotSettingsJson = DefaultPivotSettingsJson, + }); + } + + if (!await _listFormFieldRepository.AnyAsync(a => + a.ListFormCode == listFormName && + a.FieldName == "Period" && + a.CultureName == LanguageCodes.En)) + { + await _listFormFieldRepository.InsertAsync(new() + { + ListFormCode = existingListForm.ListFormCode, + CultureName = LanguageCodes.En, + SourceDbType = DbType.Int32, + FieldName = "Period", + CaptionName = "App.Listform.ListformField.Period", + Width = 0, + ListOrderNo = 21, + Visible = true, + IsActive = true, + + AllowSearch = true, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(existingListForm.Name), + PivotSettingsJson = DefaultPivotSettingsJson, + }); + } + + if (!await _listFormFieldRepository.AnyAsync(a => + a.ListFormCode == listFormName && + a.FieldName == "LicenseStartTime" && + a.CultureName == LanguageCodes.En)) + { + await _listFormFieldRepository.InsertAsync(new() + { + ListFormCode = existingListForm.ListFormCode, + CultureName = LanguageCodes.En, + SourceDbType = DbType.DateTime, + FieldName = "LicenseStartTime", + CaptionName = "App.Listform.ListformField.LicenseStartTime", + Width = 0, + ListOrderNo = 22, + Visible = true, + IsActive = true, + + AllowSearch = true, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(existingListForm.Name), + PivotSettingsJson = DefaultPivotSettingsJson, + }); + } + + if (!await _listFormFieldRepository.AnyAsync(a => + a.ListFormCode == listFormName && + a.FieldName == "LicenseStopTime" && + a.CultureName == LanguageCodes.En)) + { + await _listFormFieldRepository.InsertAsync(new() + { + ListFormCode = existingListForm.ListFormCode, + CultureName = LanguageCodes.En, + SourceDbType = DbType.DateTime, + FieldName = "LicenseStopTime", + CaptionName = "App.Listform.ListformField.LicenseStopTime", + Width = 0, + ListOrderNo = 23, + Visible = true, + IsActive = true, + + AllowSearch = true, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(existingListForm.Name), + PivotSettingsJson = DefaultPivotSettingsJson, + }); + } + + if (!await _listFormFieldRepository.AnyAsync(a => + a.ListFormCode == listFormName && + a.FieldName == "IsExisting" && + a.CultureName == LanguageCodes.En)) + { + await _listFormFieldRepository.InsertAsync(new() + { + ListFormCode = existingListForm.ListFormCode, + CultureName = LanguageCodes.En, + SourceDbType = DbType.Boolean, + FieldName = "IsExisting", + CaptionName = "App.Listform.ListformField.IsExisting", + Width = 0, + ListOrderNo = 24, + Visible = true, + IsActive = true, + + AllowSearch = true, + ColumnCustomizationJson = DefaultColumnCustomizationJson, + PermissionJson = DefaultFieldPermissionJson(existingListForm.Name), + PivotSettingsJson = DefaultPivotSettingsJson, + }); + } + } + } #endregion #region Sales Order Item diff --git a/api/src/Sozsoft.Platform.Domain/Entities/Host/Definitions/Country.cs b/api/src/Sozsoft.Platform.Domain/Entities/Host/Definitions/Country.cs index a242e00..379d5f0 100644 --- a/api/src/Sozsoft.Platform.Domain/Entities/Host/Definitions/Country.cs +++ b/api/src/Sozsoft.Platform.Domain/Entities/Host/Definitions/Country.cs @@ -9,6 +9,9 @@ public class Country : FullAuditedEntity public string GroupName { get; set; } public string Currency { get; set; } public int PhoneCode { get; set; } + public int? PhoneNumberMinLength { get; set; } + public int? PhoneNumberMaxLength { get; set; } + public string? PhoneNumberFormat { get; set; } public string TaxLabel { get; set; } public bool ZipRequired { get; set; } public bool StateRequired { get; set; } @@ -23,6 +26,9 @@ public class Country : FullAuditedEntity string groupName, string currency, int phoneCode, + int? phoneNumberMinLength, + int? phoneNumberMaxLength, + string? phoneNumberFormat, string taxLabel, bool zipRequired = false, bool stateRequired = false) @@ -32,6 +38,9 @@ public class Country : FullAuditedEntity GroupName = groupName; Currency = currency; PhoneCode = phoneCode; + PhoneNumberMinLength = phoneNumberMinLength; + PhoneNumberMaxLength = phoneNumberMaxLength; + PhoneNumberFormat = phoneNumberFormat; TaxLabel = taxLabel; ZipRequired = zipRequired; StateRequired = stateRequired; diff --git a/api/src/Sozsoft.Platform.Domain/Entities/Tenant/Administration/Website/Order.cs b/api/src/Sozsoft.Platform.Domain/Entities/Tenant/Administration/Website/Order.cs index c0198a2..fa29b10 100644 --- a/api/src/Sozsoft.Platform.Domain/Entities/Tenant/Administration/Website/Order.cs +++ b/api/src/Sozsoft.Platform.Domain/Entities/Tenant/Administration/Website/Order.cs @@ -8,6 +8,7 @@ public class Order : FullAuditedEntity { public string Name { get; set; } public bool IsActive { get; set; } + public bool IsExisting { get; set; } public string OrganizationName { get; set; } public string Founder { get; set; } @@ -26,6 +27,11 @@ public class Order : FullAuditedEntity public string Website { get; set; } public string MenuGroup { get; set; } + public string BillingCycle { get; set; } + public int Period { get; set; } + public DateTime? LicenseStartTime { get; set; } + public DateTime? LicenseStopTime { get; set; } + public List Items { get; set; } = new(); public decimal Subtotal { get; set; } public decimal Commission { get; set; } diff --git a/api/src/Sozsoft.Platform.EntityFrameworkCore/EntityFrameworkCore/PlatformDbContext.cs b/api/src/Sozsoft.Platform.EntityFrameworkCore/EntityFrameworkCore/PlatformDbContext.cs index e523a29..46c9882 100644 --- a/api/src/Sozsoft.Platform.EntityFrameworkCore/EntityFrameworkCore/PlatformDbContext.cs +++ b/api/src/Sozsoft.Platform.EntityFrameworkCore/EntityFrameworkCore/PlatformDbContext.cs @@ -747,6 +747,9 @@ public class PlatformDbContext : b.Property(x => x.GroupName).HasMaxLength(128); b.Property(x => x.TaxLabel).HasMaxLength(64); b.Property(x => x.Currency).IsRequired().HasMaxLength(8); + b.Property(x => x.PhoneNumberMinLength).HasDefaultValue(0); + b.Property(x => x.PhoneNumberMaxLength).HasDefaultValue(0); + b.Property(x => x.PhoneNumberFormat).HasMaxLength(64); b.HasIndex(x => new { x.Name }).IsUnique().HasFilter("[IsDeleted] = 0"); @@ -1011,6 +1014,7 @@ public class PlatformDbContext : b.ConfigureByConvention(); b.Property(o => o.Name).HasMaxLength(64); + b.Property(o => o.IsExisting).IsRequired().HasDefaultValue(false); b.Property(o => o.OrganizationName).HasMaxLength(128); b.Property(o => o.Founder).HasMaxLength(128); b.Property(o => o.TaxOffice).HasMaxLength(128); @@ -1026,6 +1030,8 @@ public class PlatformDbContext : b.Property(o => o.Email).HasMaxLength(128); b.Property(o => o.Website).HasMaxLength(128); b.Property(o => o.MenuGroup).HasMaxLength(64); + b.Property(o => o.BillingCycle).HasMaxLength(32); + b.Property(o => o.Period).IsRequired().HasDefaultValue(1); b.Property(o => o.Subtotal).IsRequired().HasPrecision(18, 2); b.Property(o => o.Commission).IsRequired().HasPrecision(18, 2); diff --git a/api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/20260625183130_Initial.Designer.cs b/api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/20260706213526_Initial.Designer.cs similarity index 99% rename from api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/20260625183130_Initial.Designer.cs rename to api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/20260706213526_Initial.Designer.cs index 54da8c8..efdb97b 100644 --- a/api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/20260625183130_Initial.Designer.cs +++ b/api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/20260706213526_Initial.Designer.cs @@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore; namespace Sozsoft.Platform.Migrations { [DbContext(typeof(PlatformDbContext))] - [Migration("20260625183130_Initial")] + [Migration("20260706213526_Initial")] partial class Initial { /// @@ -1542,6 +1542,20 @@ namespace Sozsoft.Platform.Migrations b.Property("PhoneCode") .HasColumnType("int"); + b.Property("PhoneNumberFormat") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("PhoneNumberMaxLength") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasDefaultValue(0); + + b.Property("PhoneNumberMinLength") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasDefaultValue(0); + b.Property("StateRequired") .HasColumnType("bit"); @@ -4071,6 +4085,10 @@ namespace Sozsoft.Platform.Migrations .HasMaxLength(512) .HasColumnType("nvarchar(512)"); + b.Property("BillingCycle") + .HasMaxLength(32) + .HasColumnType("nvarchar(32)"); + b.Property("City") .HasMaxLength(128) .HasColumnType("nvarchar(128)"); @@ -4127,6 +4145,11 @@ namespace Sozsoft.Platform.Migrations .HasDefaultValue(false) .HasColumnName("IsDeleted"); + b.Property("IsExisting") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false); + b.Property("LastModificationTime") .HasColumnType("datetime2") .HasColumnName("LastModificationTime"); @@ -4135,6 +4158,12 @@ namespace Sozsoft.Platform.Migrations .HasColumnType("uniqueidentifier") .HasColumnName("LastModifierId"); + b.Property("LicenseStartTime") + .HasColumnType("datetime2"); + + b.Property("LicenseStopTime") + .HasColumnType("datetime2"); + b.Property("MenuGroup") .HasMaxLength(64) .HasColumnType("nvarchar(64)"); @@ -4158,6 +4187,11 @@ namespace Sozsoft.Platform.Migrations b.Property("PaymentMethodId") .HasColumnType("uniqueidentifier"); + b.Property("Period") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasDefaultValue(1); + b.Property("PhoneNumber") .HasMaxLength(20) .HasColumnType("nvarchar(20)"); diff --git a/api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/20260625183130_Initial.cs b/api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/20260706213526_Initial.cs similarity index 99% rename from api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/20260625183130_Initial.cs rename to api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/20260706213526_Initial.cs index c5e2970..d222171 100644 --- a/api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/20260625183130_Initial.cs +++ b/api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/20260706213526_Initial.cs @@ -1573,6 +1573,7 @@ namespace Sozsoft.Platform.Migrations Id = table.Column(type: "uniqueidentifier", nullable: false), Name = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), IsActive = table.Column(type: "bit", nullable: false), + IsExisting = table.Column(type: "bit", nullable: false, defaultValue: false), OrganizationName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), Founder = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), VknTckn = table.Column(type: "bigint", nullable: true), @@ -1589,6 +1590,10 @@ namespace Sozsoft.Platform.Migrations Email = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), Website = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), MenuGroup = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + BillingCycle = table.Column(type: "nvarchar(32)", maxLength: 32, nullable: true), + Period = table.Column(type: "int", nullable: false, defaultValue: 1), + LicenseStartTime = table.Column(type: "datetime2", nullable: true), + LicenseStopTime = table.Column(type: "datetime2", nullable: true), Subtotal = table.Column(type: "decimal(18,2)", precision: 18, scale: 2, nullable: false), Commission = table.Column(type: "decimal(18,2)", precision: 18, scale: 2, nullable: false), Total = table.Column(type: "decimal(18,2)", precision: 18, scale: 2, nullable: false), @@ -2683,6 +2688,9 @@ namespace Sozsoft.Platform.Migrations GroupName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), Currency = table.Column(type: "nvarchar(8)", maxLength: 8, nullable: false), PhoneCode = table.Column(type: "int", nullable: false), + PhoneNumberMinLength = table.Column(type: "int", nullable: true, defaultValue: 0), + PhoneNumberMaxLength = table.Column(type: "int", nullable: true, defaultValue: 0), + PhoneNumberFormat = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), TaxLabel = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), ZipRequired = table.Column(type: "bit", nullable: false), StateRequired = table.Column(type: "bit", nullable: false), diff --git a/api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/PlatformDbContextModelSnapshot.cs b/api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/PlatformDbContextModelSnapshot.cs index 7f7d7b6..4346b54 100644 --- a/api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/PlatformDbContextModelSnapshot.cs +++ b/api/src/Sozsoft.Platform.EntityFrameworkCore/Migrations/PlatformDbContextModelSnapshot.cs @@ -1539,6 +1539,20 @@ namespace Sozsoft.Platform.Migrations b.Property("PhoneCode") .HasColumnType("int"); + b.Property("PhoneNumberFormat") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("PhoneNumberMaxLength") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasDefaultValue(0); + + b.Property("PhoneNumberMinLength") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasDefaultValue(0); + b.Property("StateRequired") .HasColumnType("bit"); @@ -4068,6 +4082,10 @@ namespace Sozsoft.Platform.Migrations .HasMaxLength(512) .HasColumnType("nvarchar(512)"); + b.Property("BillingCycle") + .HasMaxLength(32) + .HasColumnType("nvarchar(32)"); + b.Property("City") .HasMaxLength(128) .HasColumnType("nvarchar(128)"); @@ -4124,6 +4142,11 @@ namespace Sozsoft.Platform.Migrations .HasDefaultValue(false) .HasColumnName("IsDeleted"); + b.Property("IsExisting") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false); + b.Property("LastModificationTime") .HasColumnType("datetime2") .HasColumnName("LastModificationTime"); @@ -4132,6 +4155,12 @@ namespace Sozsoft.Platform.Migrations .HasColumnType("uniqueidentifier") .HasColumnName("LastModifierId"); + b.Property("LicenseStartTime") + .HasColumnType("datetime2"); + + b.Property("LicenseStopTime") + .HasColumnType("datetime2"); + b.Property("MenuGroup") .HasMaxLength(64) .HasColumnType("nvarchar(64)"); @@ -4155,6 +4184,11 @@ namespace Sozsoft.Platform.Migrations b.Property("PaymentMethodId") .HasColumnType("uniqueidentifier"); + b.Property("Period") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasDefaultValue(1); + b.Property("PhoneNumber") .HasMaxLength(20) .HasColumnType("nvarchar(20)"); diff --git a/ui/src/components/orders/TenantForm.tsx b/ui/src/components/orders/TenantForm.tsx index d47525a..95c0b62 100644 --- a/ui/src/components/orders/TenantForm.tsx +++ b/ui/src/components/orders/TenantForm.tsx @@ -15,11 +15,123 @@ import { FaUser, FaUserPlus, } from 'react-icons/fa' -import React, { useState } from 'react' +import React, { useEffect, useState } from 'react' import { useNavigate } from 'react-router-dom' import { useLocalization } from '@/utils/hooks/useLocalization' import { ROUTES_ENUM } from '@/routes/route.constant' -import { Button } from '@/components/ui' +import { Button, Select } from '@/components/ui' +import { + CityDto, + CountryDto, + DistrictDto, + getCities, + getCountries, + getDistricts, +} from '@/services/location.service' + +interface LocationOption { + label: string + value: string + data: T +} + +const EMAIL_PATTERN = /^[^\s@]+@[^\s@]+\.[^\s@]+$/ +const DEFAULT_PHONE_FORMAT = '000 000 000 000 000' +const TURKEY_PHONE_FORMAT = '(000) 000-0000' +const REQUIRED_NEW_CUSTOMER_FIELDS: Array = [ + 'organizationName', + 'founder', + 'country', + 'city', + 'district', + 'postalCode', + 'address1', + 'phoneNumber', + 'email', + 'taxOffice', + 'vknTckn', +] +const REQUIRED_EXISTING_CUSTOMER_FIELDS: Array = [ + 'id', + 'name', + 'organizationName', + 'founder', + 'country', + 'city', + 'district', + 'address1', + 'email', +] + +const getPhoneFormat = (country?: CountryDto) => + country?.phoneNumberFormat || + (country?.phoneCode === 90 ? TURKEY_PHONE_FORMAT : DEFAULT_PHONE_FORMAT) + +const getPhoneMaxLength = (country?: CountryDto) => + country?.phoneNumberMaxLength ?? getPhoneFormat(country).replace(/[^0]/g, '').length + +const getPhoneMinLength = (country?: CountryDto) => + country?.phoneNumberMinLength ?? getPhoneMaxLength(country) + +const getNationalPhoneDigits = (value: string, country?: CountryDto) => { + let digits = value.replace(/\D/g, '') + if (!country) return digits + + const code = String(country.phoneCode) + if (value.trimStart().startsWith('+') && digits.startsWith(code)) { + digits = digits.slice(code.length) + } + return digits +} + +const getPhoneValidationError = (value: string, country?: CountryDto) => { + if (!country) return 'Lütfen önce ülke seçin.' + + const length = getNationalPhoneDigits(value, country).length + const minLength = getPhoneMinLength(country) + const maxLength = getPhoneMaxLength(country) + if (length >= minLength && length <= maxLength) return '' + + return minLength === maxLength + ? `Telefon numarası ${minLength} haneli olmalıdır.` + : `Telefon numarası ${minLength}-${maxLength} hane arasında olmalıdır.` +} + +const formatPhoneNumber = (value: string, country?: CountryDto) => { + if (!country) return value.replace(/\D/g, '').slice(0, 15) + + const maxLength = getPhoneMaxLength(country) + const digits = getNationalPhoneDigits(value, country).slice(0, maxLength) + const format = getPhoneFormat(country) + let digitIndex = 0 + let nationalNumber = '' + + for (const character of format) { + if (character === '0') { + if (digitIndex >= digits.length) break + nationalNumber += digits[digitIndex] + digitIndex += 1 + } else if (digitIndex === 0) { + if (digits.length > 0) nationalNumber += character + } else if (digitIndex < digits.length || character === ')') { + nationalNumber += character + } else { + break + } + } + + return `+${country.phoneCode}${nationalNumber ? ` ${nationalNumber}` : ''}` +} + +const isBlankValue = (value: unknown) => + value === undefined || value === null || String(value).trim() === '' + +const hasRequiredFields = ( + tenant: Partial, + fields: Array, +) => fields.every((field) => !isBlankValue(tenant[field])) + +const normalizeCode = (value?: string) => value?.trim().toLowerCase() || '' interface TenantFormProps { onSubmit: (tenant: CustomTenantDto) => void @@ -29,22 +141,203 @@ interface TenantFormProps { export const TenantForm: React.FC = ({ onSubmit }) => { const [isExisting, setIsExisting] = useState(true) const [formData, setFormData] = useState>({}) + const [countries, setCountries] = useState([]) + const [cities, setCities] = useState([]) + const [districts, setDistricts] = useState([]) + const [isLoadingCountries, setIsLoadingCountries] = useState(false) + const [isLoadingCities, setIsLoadingCities] = useState(false) + const [isLoadingDistricts, setIsLoadingDistricts] = useState(false) + const [isLoadingTenant, setIsLoadingTenant] = useState(false) + const [emailError, setEmailError] = useState('') + const [phoneError, setPhoneError] = useState('') + const [existingTenantError, setExistingTenantError] = useState('') + const [formError, setFormError] = useState('') + const [foundTenantName, setFoundTenantName] = useState('') const navigate = useNavigate() const { translate } = useLocalization() + useEffect(() => { + const loadCountries = async () => { + setIsLoadingCountries(true) + try { + const response = await getCountries() + setCountries(response.data) + + const defaultCountry = response.data.find((country) => country.name === 'Türkiye') + if (defaultCountry) { + setFormData((prev) => + prev.country + ? prev + : { + ...prev, + country: defaultCountry.name, + city: '', + district: '', + phoneNumber: `+${defaultCountry.phoneCode}`, + }, + ) + + setIsLoadingCities(true) + try { + const cityResponse = await getCities(defaultCountry.name) + setCities(cityResponse.data) + } catch (error) { + console.error('Şehirler alınırken hata:', error) + } finally { + setIsLoadingCities(false) + } + } + } catch (error) { + console.error('Ülkeler alınırken hata:', error) + } finally { + setIsLoadingCountries(false) + } + } + + void loadCountries() + }, []) + + const selectedCountry = countries.find((country) => country.name === formData.country) + const phoneMask = selectedCountry + ? `+${selectedCountry.phoneCode} ${getPhoneFormat(selectedCountry)}` + : DEFAULT_PHONE_FORMAT + const canSubmitExistingTenant = + Boolean( + formData.id && + formData.organizationName && + normalizeCode(foundTenantName) === normalizeCode(formData.name), + ) && !isLoadingTenant + const handleSubmit = (e: React.FormEvent) => { e.preventDefault() - onSubmit({ ...formData, isExisting: isExisting! } as CustomTenantDto) + let hasValidationError = false + setFormError('') + + if (isExisting) { + if (!formData.name?.trim()) { + setExistingTenantError('Lütfen önce organization code girin.') + return + } + + if ( + !formData.id || + normalizeCode(foundTenantName) !== normalizeCode(formData.name) || + !formData.organizationName + ) { + setExistingTenantError('Devam etmek için önce organization code ile kurum bilgisini bulun.') + return + } + + if (!hasRequiredFields(formData, REQUIRED_EXISTING_CUSTOMER_FIELDS)) { + setExistingTenantError('Kurum bilgileri eksik geldi. Lütfen kurum kodunu tekrar aratın.') + return + } + + onSubmit({ ...formData, isExisting: true } as CustomTenantDto) + return + } + + if (!hasRequiredFields(formData, REQUIRED_NEW_CUSTOMER_FIELDS)) { + setFormError('Lütfen zorunlu alanları eksiksiz doldurun.') + hasValidationError = true + } + + const nextPhoneError = getPhoneValidationError(formData.phoneNumber || '', selectedCountry) + setPhoneError(nextPhoneError) + if (nextPhoneError) { + hasValidationError = true + } + + if (!isExisting && !EMAIL_PATTERN.test(formData.email || '')) { + setEmailError('Lütfen geçerli bir e-posta adresi girin.') + hasValidationError = true + } + + if (hasValidationError) return + onSubmit({ ...formData, isExisting: false } as CustomTenantDto) } const handleInputChange = (field: keyof CustomTenantDto, value: string) => { setFormData((prev) => ({ ...prev, [field]: value })) } - const getTenantInfo = async () => { - if (!formData.name) return + const resetExistingTenantDetails = (name: string) => { + setFoundTenantName('') + setExistingTenantError('') + setFormError('') + setFormData({ name }) + } + + const handleCountryChange = async (option: LocationOption | null) => { + const country = option?.data + setFormData((prev) => ({ + ...prev, + country: country?.name || '', + city: '', + district: '', + phoneNumber: country ? `+${country.phoneCode}` : '', + })) + setCities([]) + setDistricts([]) + setPhoneError('') + + if (!country) return + setIsLoadingCities(true) try { - const tenant = await getTenantByNameDetail(formData.name) + const response = await getCities(country.name) + setCities(response.data) + } catch (error) { + console.error('Şehirler alınırken hata:', error) + } finally { + setIsLoadingCities(false) + } + } + + const handleCityChange = async (option: LocationOption | null) => { + const city = option?.data + setFormData((prev) => ({ ...prev, city: city?.name || '', district: '' })) + setDistricts([]) + + if (!city || !formData.country) return + setIsLoadingDistricts(true) + try { + const response = await getDistricts(formData.country, city.name) + setDistricts(response.data) + } catch (error) { + console.error('İlçeler alınırken hata:', error) + } finally { + setIsLoadingDistricts(false) + } + } + + const countryOptions: LocationOption[] = countries.map((country) => ({ + label: country.name, + value: country.name, + data: country, + })) + const cityOptions: LocationOption[] = cities.map((city) => ({ + label: city.name, + value: city.name, + data: city, + })) + const districtOptions: LocationOption[] = districts.map((district) => ({ + label: district.name, + value: district.name, + data: district, + })) + + const getTenantInfo = async () => { + const tenantName = formData.name?.trim() + if (!tenantName) { + setExistingTenantError('Lütfen önce organization code girin.') + return + } + + setIsLoadingTenant(true) + setExistingTenantError('') + setFormError('') + try { + const tenant = await getTenantByNameDetail(tenantName) setFormData((prev) => ({ ...prev, @@ -68,8 +361,13 @@ export const TenantForm: React.FC = ({ onSubmit }) => { website: tenant.data.website, menuGroup: tenant.data.menuGroup, })) + setFoundTenantName(tenant.data.name) } catch (error) { + setFoundTenantName('') + setExistingTenantError('Kurum bulunamadı. Lütfen organization code bilgisini kontrol edin.') console.error('Kurum bilgisi alınırken hata:', error) + } finally { + setIsLoadingTenant(false) } } @@ -139,7 +437,7 @@ export const TenantForm: React.FC = ({ onSubmit }) => { autoFocus placeholder="Enter your organization code" value={formData.name || ''} - onChange={(e) => handleInputChange('name', e.target.value)} + onChange={(e) => resetExistingTenantDetails(e.target.value)} onKeyDown={async (e) => { if (e.key === 'Enter') { e.preventDefault() @@ -151,23 +449,36 @@ export const TenantForm: React.FC = ({ onSubmit }) => { + {existingTenantError && ( +

{existingTenantError}

+ )} + {!existingTenantError && + formData.name && + !canSubmitExistingTenant && + !isLoadingTenant && ( +

+ Devam etmek için önce Find Organization ile kurum bilgilerini getirin. +

+ )} + {formData.organizationName && (
- - {translate('::LoginPanel.Profil')} - + {translate('::LoginPanel.Profil')} {formData.founder}
@@ -189,18 +500,14 @@ export const TenantForm: React.FC = ({ onSubmit }) => {
- - {translate('::blog.categories.mobile')}: - + {translate('::blog.categories.mobile')}: {formData.mobileNumber}
- - {translate('::App.Address')}: - + {translate('::App.Address')}:
{formData.address1}
@@ -215,9 +522,7 @@ export const TenantForm: React.FC = ({ onSubmit }) => {
- - {translate('::Public.common.city')}: - + {translate('::Public.common.city')}: {formData.city}
@@ -306,32 +611,76 @@ export const TenantForm: React.FC = ({ onSubmit }) => {
- - > required - placeholder="+90 (___) ___-____" - value={formData.phoneNumber || ''} - onChange={(e) => handleInputChange('phoneNumber', e.target.value)} - className="w-full pl-10 pr-4 py-2 border border-gray-300 rounded-lg bg-white text-gray-900 placeholder-gray-500 dark:border-gray-700 dark:bg-gray-800 dark:text-gray-100 dark:placeholder-gray-400 focus:ring-2 focus:ring-blue-500 focus:border-transparent" + isClearable + isLoading={isLoadingCountries} + options={countryOptions} + value={ + countryOptions.find((option) => option.value === formData.country) || null + } + onChange={handleCountryChange} + placeholder="Ülke seçin" />
- - > required - placeholder="sample@email.com" - value={formData.email || ''} - onChange={(e) => handleInputChange('email', e.target.value)} + isClearable + isDisabled={!formData.country} + isLoading={isLoadingCities} + options={cityOptions} + value={cityOptions.find((option) => option.value === formData.city) || null} + onChange={handleCityChange} + placeholder={formData.country ? 'Şehir seçin' : 'Önce ülke seçin'} + /> +
+
+
+ +
+
+ +
+ > + required + isClearable + isDisabled={!formData.city} + isLoading={isLoadingDistricts} + options={districtOptions} + value={ + districtOptions.find((option) => option.value === formData.district) || + null + } + onChange={(option) => + handleInputChange('district', option?.data.name || '') + } + placeholder={formData.city ? 'İlçe seçin' : 'Önce şehir seçin'} + /> +
+
+
+ +
+ + handleInputChange('postalCode', e.target.value)} className="w-full pl-10 pr-4 py-2 border border-gray-300 rounded-lg bg-white text-gray-900 placeholder-gray-500 dark:border-gray-700 dark:bg-gray-800 dark:text-gray-100 dark:placeholder-gray-400 focus:ring-2 focus:ring-blue-500 focus:border-transparent" />
@@ -358,69 +707,87 @@ export const TenantForm: React.FC = ({ onSubmit }) => {
- + handleInputChange('country', e.target.value)} - className="w-full pl-10 pr-4 py-2 border border-gray-300 rounded-lg bg-white text-gray-900 placeholder-gray-500 dark:border-gray-700 dark:bg-gray-800 dark:text-gray-100 dark:placeholder-gray-400 focus:ring-2 focus:ring-blue-500 focus:border-transparent" + type="tel" + required + inputMode="numeric" + placeholder={phoneMask.replace(/0/g, '_')} + aria-label={`Telefon numarası, format: ${phoneMask}`} + value={formData.phoneNumber || ''} + onChange={(e) => { + handleInputChange( + 'phoneNumber', + formatPhoneNumber(e.target.value, selectedCountry), + ) + if (phoneError) setPhoneError('') + }} + onBlur={() => + setPhoneError( + getPhoneValidationError(formData.phoneNumber || '', selectedCountry), + ) + } + aria-invalid={Boolean(phoneError)} + aria-describedby={phoneError ? 'tenant-phone-error' : undefined} + title={`Beklenen format: ${phoneMask}`} + className={`w-full pl-10 pr-4 py-2 border rounded-lg bg-white text-gray-900 placeholder-gray-500 dark:bg-gray-800 dark:text-gray-100 dark:placeholder-gray-400 focus:ring-2 focus:ring-blue-500 focus:border-transparent ${ + phoneError + ? 'border-red-500 dark:border-red-500' + : 'border-gray-300 dark:border-gray-700' + }`} />
+ {phoneError && ( +

+ {phoneError} +

+ )}
- + handleInputChange('city', e.target.value)} - className="w-full pl-10 pr-4 py-2 border border-gray-300 rounded-lg bg-white text-gray-900 placeholder-gray-500 dark:border-gray-700 dark:bg-gray-800 dark:text-gray-100 dark:placeholder-gray-400 focus:ring-2 focus:ring-blue-500 focus:border-transparent" - /> -
-
-
- -
-
- -
- - handleInputChange('district', e.target.value)} - className="w-full pl-10 pr-4 py-2 border border-gray-300 rounded-lg bg-white text-gray-900 placeholder-gray-500 dark:border-gray-700 dark:bg-gray-800 dark:text-gray-100 dark:placeholder-gray-400 focus:ring-2 focus:ring-blue-500 focus:border-transparent" - /> -
-
-
- -
- - handleInputChange('postalCode', e.target.value)} - className="w-full pl-10 pr-4 py-2 border border-gray-300 rounded-lg bg-white text-gray-900 placeholder-gray-500 dark:border-gray-700 dark:bg-gray-800 dark:text-gray-100 dark:placeholder-gray-400 focus:ring-2 focus:ring-blue-500 focus:border-transparent" + placeholder="sample@email.com" + value={formData.email || ''} + onChange={(e) => { + handleInputChange('email', e.target.value) + if (emailError) { + setEmailError( + EMAIL_PATTERN.test(e.target.value) + ? '' + : 'Lütfen geçerli bir e-posta adresi girin.', + ) + } + }} + onBlur={() => + setEmailError( + EMAIL_PATTERN.test(formData.email || '') + ? '' + : 'Lütfen geçerli bir e-posta adresi girin.', + ) + } + aria-invalid={Boolean(emailError)} + aria-describedby={emailError ? 'tenant-email-error' : undefined} + className={`w-full pl-10 pr-4 py-2 border rounded-lg bg-white text-gray-900 placeholder-gray-500 dark:bg-gray-800 dark:text-gray-100 dark:placeholder-gray-400 focus:ring-2 focus:ring-blue-500 focus:border-transparent ${ + emailError + ? 'border-red-500 dark:border-red-500' + : 'border-gray-300 dark:border-gray-700' + }`} />
+ {emailError && ( +

+ {emailError} +

+ )}
@@ -477,6 +844,8 @@ export const TenantForm: React.FC = ({ onSubmit }) => {
)} + {formError &&

{formError}

} +
) } - diff --git a/ui/src/proxy/order/models.ts b/ui/src/proxy/order/models.ts index 22de4d8..7dbe5d3 100644 --- a/ui/src/proxy/order/models.ts +++ b/ui/src/proxy/order/models.ts @@ -60,6 +60,10 @@ export interface InstallmentOptionDto { export interface OrderDto { tenant: CustomTenantDto items: BasketItem[] + billingCycle: BillingCycle + period: number + licenseStartTime?: string + licenseStopTime?: string subtotal: number commission: number total: number diff --git a/ui/src/services/location.service.ts b/ui/src/services/location.service.ts new file mode 100644 index 0000000..98ab260 --- /dev/null +++ b/ui/src/services/location.service.ts @@ -0,0 +1,45 @@ +import apiService from './api.service' + +export interface CountryDto { + id: string + name: string + phoneCode: number + phoneNumberMinLength: number | null + phoneNumberMaxLength: number | null + phoneNumberFormat: string | null +} + +export interface CityDto { + id: string + country: string + name: string + plateCode?: string +} + +export interface DistrictDto { + id: string + country: string + city: string + name: string + township?: string +} + +export const getCountries = () => + apiService.fetchData({ + method: 'GET', + url: '/api/app/public/country', + }) + +export const getCities = (country: string) => + apiService.fetchData({ + method: 'GET', + url: '/api/app/public/city', + params: { country }, + }) + +export const getDistricts = (country: string, city: string) => + apiService.fetchData({ + method: 'GET', + url: '/api/app/public/district', + params: { country, city }, + }) diff --git a/ui/src/services/order.service.ts b/ui/src/services/order.service.ts index 164e669..7c78ef3 100644 --- a/ui/src/services/order.service.ts +++ b/ui/src/services/order.service.ts @@ -44,6 +44,10 @@ export class OrderService { data: { tenant: orderData.tenant, items: orderData.items, + billingCycle: orderData.billingCycle, + period: orderData.period, + licenseStartTime: orderData.licenseStartTime, + licenseStopTime: orderData.licenseStopTime, subtotal: orderData.subtotal, commission: orderData.commission, total: orderData.total, diff --git a/ui/src/views/public/Payment.tsx b/ui/src/views/public/Payment.tsx index 15299ef..106e012 100644 --- a/ui/src/views/public/Payment.tsx +++ b/ui/src/views/public/Payment.tsx @@ -62,13 +62,34 @@ const Payment: React.FC = () => { setCartState(clearCart()) } + const calculateLicenseStopTime = (startTime: Date, billingCycle: string, period: number) => { + const stopTime = new Date(startTime) + + if (billingCycle === 'monthly') { + stopTime.setMonth(stopTime.getMonth() + period) + } else { + stopTime.setFullYear(stopTime.getFullYear() + period) + } + + return stopTime + } + const handlePaymentComplete = async (paymentData: Record) => { if (!tenant) return try { + const billingCycle = cartState.globalBillingCycle || 'yearly' + const period = cartState.globalPeriod > 0 ? cartState.globalPeriod : 1 + const licenseStartTime = new Date() + const licenseStopTime = calculateLicenseStopTime(licenseStartTime, billingCycle, period) + const orderData = { tenant, items: cartState.items, + billingCycle, + period, + licenseStartTime: licenseStartTime.toISOString(), + licenseStopTime: licenseStopTime.toISOString(), subtotal: cartState.total, commission: paymentData.commission, total: paymentData.total, @@ -136,20 +157,20 @@ const Payment: React.FC = () => {
setIsCartOpen(false)} onCheckout={handleCheckout} - cartState={cartState} - updateQuantity={handleUpdateQuantity} - removeItem={handleRemoveItem} - clearCart={handleClearCart} />