Proje Gereksinimleri
Bir marketteki ürünlerin satış fiyatlarına göre son fiyatlarını belirleyen servisin Spring Boot Framework kullanılarak yazılması ve isteğe bağlı olarak önyüzünün yazılması.
Backend:
- Kullanıcıdan kullanıcı adı, şifre, isim, soy isim bilgilerini alarak sisteme kayıt yapılır.
- Sisteme kayıtlı kullanıcılar market ürünlerinin veri girişini yapabilir.
- Ürün türlerine göre KDV oranları değişiklik göstermektedir. Bu oranlar aşağıdaki tabloda belirtilmiştir. Zaman zaman KDV oranları değişiklik gösterebilmektedir.
- Ürün için veri girişi yapacak kullanıcı; ürünün adı, ürünün türü ve vergisiz satış fiyatı alanlarını doldurur. Her bir ürün için KDV Tutarı ve ürünün son fiyatı da hesaplanarak sisteme kaydedilir.
Kurallar ve gereksinimler:
- Sisteme yeni kullanıcı tanımlanabilir, güncellenebilir ve silinebilir.
- Sisteme yeni ürünler tanımlanabilir, güncellenebilir ve silinebilir.
- Ürünlerin fiyatları güncellenebilir.
- KDV oranları değiştiğinde sistemdeki ürünlere de bu değişiklik yansıtılmalıdır. Herhangi bir hata durumunda tüm işlemler geri alınmalıdır.
- Tüm ürünler listelenebilmelidir.
- Ürün türlerine göre ürünler listelenebilmelidir.
- Belirli bir fiyat aralığındaki ürünler listelenebilmelidir.
- Ürün türlerine göre aşağıdaki gibi detay veri içeren bir bilgilendirme alınabilmelidir.
Validasyonlar:
- Aynı kullanıcı adı ile kullanıcı tanımı yapılamaz.
- Kullanıcı girişi kullanıcı adı & şifre kombinasyonu ile yapılır.
- Ürün türü, fiyatı, adı gibi alanlar boş olamaz.
- Ürün fiyatı sıfır ya da negatif olamaz.
- KDV oranı negatif olamaz.
Authentication:
- Güvenli endpointler kullanınız. (jwt, bearer vs. )
Response:
- Başarılı ve başarısız responselar için modeller tanımlayın ve bunları kullanın.
Dökümantasyon:
- Open API Specification (Swagger tercih sebebi)
Exception Handling:
- Hatalı işlemler için doğru hata kodlarının dönüldüğünden emin olunuz.
Test:
- Unit ve integration testleri yazınız.
Projenin Local Kurulumu
- pgAdmin ile application.properties'deki özelliklere göre bir veritabanı oluşturun, ya da kendi özelliklerinizle application.properties'i değiştirin.
- Projeyi çalıştırın
/swagger-ui/index.htmladresine gidin.- Projeye
/auth/registerile kullanıcı kayıt edin. - Kayıt edilen kullanıcı bilgileri ile
/auth/logingiriş yapın ve authorization tokeninizi alın. - API'ya authorize olduktan sonra
/api/v1/value-added-taxes/init-vat-ratesile bitirme projesinde tablo olarak verilen ürün tipi - kdv oranı tablosunu veritabanına ekleyin. - Daha sonra OPEN API' da gördüğünüz tüm istekleri deneyebilirsiniz.
Bir marketteki satış ürünlerin ham fiyatlarına, ürün tipine ve KDV oranına göre satış fiyatlarını belirleyen bir servisi Spring Boot kullanılarak gerçekleştirildi.
Projede üç adet tablo bulunmaktadır:
- USR_USER kullanıcı tablosu
- PRD_PRODUCT ürün tablosu
- VAT_VALUE_ADDED_TAX KDV oranları tablosu

Buradaki Ürün tablosu ve KDV tablosunun ilişkisi ProductType(ürün tipi) üzerinden yapılmaktadır.
Proje isterlerden "KDV oranları değiştiğinde sistemdeki ürünlere de bu değişiklik yansıtılmalıdır. Herhangi bir hata durumunda tüm işlemler geri alınmalıdır." isteri, Transactional annotation'ı kullanılarak yapılmıştır.
Ürün türlerinine göre detay veri içeren tablonun oluşturulması yazılan bir dto'nun, JpaRepository üzerinden aggregation fonksiyonları içeren bir Query ile doldurulmasıyla yapılmıştır.
@Query(
"select new com.poyrazaktas.bitirme.prd.dto.PrdProductTypeDetailDto(" +
"product.productType," +
"valueAddedTax.vatRate," +
"min(product.priceWithTax), " +
"max(product.priceWithTax), " +
"avg(product.priceWithTax), " +
"count(product.id)" +
") " +
"from PrdProduct product " +
"inner join VatValueAddedTax valueAddedTax " +
"on product.productType = valueAddedTax.productType " +
"group by product.productType, valueAddedTax.vatRate"
)
List<PrdProductTypeDetailDto> getAllProductTypeDetails();Projede yazılan CalculationUtil, tüm service ve entity serviceler için Unit testler yazıldı.
| Class | Number of Tests | Code Coverage |
|---|---|---|
| CalculationUtil | 4 | %100 |
| PrdProductService | 18 | %100 |
| PrdProductEntityService | 3 | %100 |
| UsrUserService | 10 | %100 |
| UsrUserEntityService | 2 | %100 |
| VatValueAddedTaxService | 9 | %100 |
| VatValueAddedTaxEntityService | 2 | %100 |
| AuthenticationService | 4 | %50 |
Yazılan senaryoları ilgili sınıfların test paketi altındaki karşılıklarından görüntüleyebilirsiniz.
Controller'lardaki Operation annotation'ları ile yazılan API dökümante edilmiştir.

