eOfis ERP Programı

Çalıştığım firmada .NET tabanlı ERP sisteminde full-stack geliştirici olarak görev aldım.

eOfis ERP Programı 1
eOfis ERP Programı 2

Proje Açıklaması

Genel Rolüm ve Sorumluluklarım

Çalıştığım projede full-stack developer olarak görev alıyorum. Backend tarafında .NET Core ile RESTful API’ler geliştiriyorum. SQL veritabanı kullanarak veri işlemlerini yönetiyor, veritabanı normalizasyonunu sağlıyorum. Hangfire entegrasyonuyla zamanlanmış görevler oluşturuyor, GitHub Actions ile CI/CD süreçlerini yönetilebilir hale getiriyorum. Sunucu tarafında API'leri yayınlıyor, sunucu yönetimini doğrudan üstleniyorum. Ayrıca birim testleri yazarak yazılım kalitesini artırıyor, loglama işlemlerini de yapılandırıyorum. Frontend tarafında ise React, HTML, CSS ve JavaScript kullanarak kullanıcı dostu arayüzler geliştiriyorum.

Yaptığım Önemli İşler

Projeyi baştan sona web'e geçirerek erişimi kolaylaştırdım. Müşteriye özel sözleşme entegrasyonu, teklif altyapısı, iyzico ile ödeme altyapısı, Hangfire üzerinden zamanlanmış raporlama görevleri gibi kritik modüllerin kurulum ve entegrasyonlarını gerçekleştirdim. Özellikle sözleşme ve teklif altyapılarını tamamen dinamik hale getirerek, her kullanıcıya özel içerikler sunulmasını sağladım.

Sözleşme Modülü

Sözleşme tarafında hem Türkçe hem İngilizce metinleri SQL veritabanında dinamik olarak saklayarak, her müşteriye özel sözleşme çıktıları oluşturulmasını sağladım. Bu sayede müşterilere özel içerikler sunabilen esnek bir sistem kurdum.

Teklif Modülü

Teklif altyapısında her müşteriye özel PDF teklif dosyalarının dinamik olarak sunucuda oluşturulmasını sağladım. Sunucuda saklanan teklif şablonları üzerinden otomatik PDF üretimi yapılmasını sağladım.

Ödeme Entegrasyonu ve Otomatik Tahsilat

İyzico entegrasyonu ile sistem üzerinden doğrudan kullanıcıdan ödeme alınmasını sağladım. Ayrıca Hangfire ile her gün iki kez borçlu firmalar için otomatik ödeme talebi sistemini kurarak manuel takip ihtiyacını ortadan kaldırdım.

Raporlama Altyapısı

Firmaya özel mali müşavir, ödeme durumu, gecikmeli ofisler ve cari hesap gibi kritik raporların SQL prosedürlerini yazarak Hangfire ile zamanlı şekilde tetiklenmesini sağladım. Bu raporlar belirli periyotlarla oluşturularak yöneticilere mail yoluyla ulaştırılıyor.

Geçiş Süreci (.NET → .NET Core)

Şu anda üzerinde çalıştığımız en önemli işlerden biri, tüm sistemin .NET Framework'ten .NET Core mimarisine taşınması. Böylece projeyi tamamen web tabanlı hale getirerek platform bağımsız, her yerden erişilebilir bir hale getiriyoruz.

Sunucu Yönetimi

Projede kullanılan sunucular, Turkcell Superonline üzerinden kiralanan Gebze Datacenter’da barındırılmaktadır. Yedekleme ve ekstra depolama ihtiyaçları ise Microsoft Azure üzerinden sağlanmaktadır.

Versiyon Kontrol Sistemi

Geliştirme süreçlerinde versiyon kontrol sistemi olarak VisualSVN Server üzerinden barındırılan SVN kullanılmaktadır. Geliştiriciler, TortoiseSVN kullanarak repository'lere erişmekte, her bir repository için erişim yetkileri ayrı ayrı yönetilmektedir.

Proje Yapısı ve Modüller

Proje şu modülleri içermektedir: istemci programlar, RESTful API’ler ve MSSQL veritabanları. OfficeSharpERP projesi kapsamında toplamda 4 veritabanı, 1 FTP sunucu, 16 REST API, 7 istemci program, 2 mobil uygulama ve 3 web panel bulunmaktadır.

OfficeSharpERP Sistem Akışı

Tüm istemci programları veritabanına doğrudan erişemez. Veriye erişim REST API’ler üzerinden sağlanır. Bu yapı, iş mantığını istemciden izole eder ve güvenliği artırır. Tüm veri işlemleri API katmanında yetki kontrolleriyle gerçekleştirilir.

Veritabanı Yapısı

Projede kullanılan başlıca veritabanları şunlardır:

Zeugma: Ana kullanıcılar ve lisans bilgilerini tutar.

OfficeSharpERP: Yönetim paneli için iş mantığına ait tüm verileri barındırır.

OfficeSharpReport: Raporlar için hazırlanmış denormalize edilmiş özel veri tablolarını içerir.

Hangfire: Zamanlanmış görevler ile ilgili tüm bilgileri saklar ve otomatik temizleme işlemleri gerçekleştirir.

FTP Sunucusu Kullanımı

FTP sunucusu, istemci program versiyonlarını, proje backuplarını, 3. parti yazılımları, kaynak kodları, fatura XML’lerini ve eski sözleşme/teklif dosyalarını barındırmak için kullanılır.

REST API Mimarisi

API yapısı MVC (Model-View-Controller) mimarisine dayanır. Her modül bağımsız bir API projesi olarak yapılandırılmıştır. Veri tabanı modelleri DTO’lar aracılığıyla dış dünyaya açılır, AutoMapper ile veri modelleri eşleştirilir.

Worker Yapısı

API'de tekrar eden veri işlemlerini kolaylaştırmak için kullanılan bir yapıdır. Her worker, sistemde belirli görevleri yerine getirir: veri okuma, ekleme, silme ve güncelleme. Her biri belirli kurallara göre çalışır ve ihtiyaç halinde veritabanı işlemlerini otomatik hale getirir.

ReadWorker (Veri Okuma)

Veritabanındaki tablo veya görünümlerden (view) veri çeker. Tüm verileri ya da belirli filtrelerle (örneğin firmaId’si 2 olanlar) seçilen verileri getirebilir. Karmaşık sorgular yazmak yerine kısa tanımlarla işlem yapılmasını sağlar.

CreateWorker (Veri Ekleme)

Yeni veri kaydı yapmak için kullanılır. Tek bir kayıt ya da birden fazla kayıt ekleyebilir. Eklenen veriye kimin eklediği bilgisi de otomatik eklenir.

DeleteWorker (Veri Silme)

Veritabanından satır siler. Silinecek veriyi tek tek, toplu halde ya da belli kurallara göre belirleyebilirsin. Yanlışlıkla tüm verinin silinmemesi için boş çalıştırılamaz.

UpdateWorker (Veri Güncelleme)

Kayıtların içeriğini güncellemek için kullanılır. Tek bir kayıt, birden fazla kayıt ya da belirli bir kritere uyan kayıtlar güncellenebilir.

ReadWorkerUtility

Bir tablodaki tüm verileri basitçe çekmek için kullanılır. Tüm sütun ve satırları getirir.

Validasyon

API projelerine gelen bir isteğin işlenmeden önce, kontrol edilmesi gerektiğinde ilgili Worker içerisinde Validate fonksiyonu kullanılır. Validate fonksiyonu ilgili kontrolleri yapar, eğer kontrol başarılı ise boş string, başarısız ile ilgili hata mesajını döner. Worker, Validate fonksiyonunun cevabına bakarak işleme devam edip etmeyeceğine karar verir. Eğer boş string döndüyse işlemi gerçekleştirip sonucunu istemci programa gönderir. Eğer hata mesajı döndü ise ilgili hata mesajını istemci programa gönderir.

İstek Yetkisi - Token

API isteklerinin çalışabilmesi için geçerli bir token gerekir. Kullanıcı sisteme giriş yaptığında sistem tarafından bir token (GUID) oluşturulur, veritabanına kaydedilir ve kullanıcıya gönderilir. Kullanıcı her istekte bu token'ı iletmek zorundadır. Geçersiz ya da eksik token içeren istekler reddedilir.

AuthActionFilter

API’de her isteğin öncesinde ve sonrasında kontrol yapılmasını sağlar. Controller’lara eklenerek loglama ve yetkilendirme işlemleri yapılır. İstek çalışmadan önce token geçerliliği, kullanıcı yetkisi gibi kontroller yapılır. Tüm kontroller geçerse istek işlenir.

Veri Tabanı Yönetimi

Veri tabanı yönetimini de yaptığım projede düzenli yedekleme, veri eşitleme, loglama ve performansı artırmak amacıyla kullanılan bazı önemli trigger’lar bulunamktadır.

Yedekleme

Veri tabanı yedekleri, Scheduler API projesindeki Hangfire zamanlayıcısı sayesinde her gün saat 02:00'de otomatik olarak alınır. Bu işlem sırasında sBackup prosedürü tetiklenerek OfficeSharpERP ve OfficeSharpReport veri tabanlarının yedeği oluşturulur ve Microsoft Azure bulut sistemine yüklenir.

Eşitleme

Geliştirme ortamı olarak kullanılan sunucuda yapılan veri tabanı güncellemeleri, canlı sistemlere geçmeden önce diğer veri tabanlarıyla senkronize edilmelidir. Bu işlem, manuel olarak yapılması halinde hata riski taşıdığı için Devart dbForge Studio for SQL Server aracı ile gerçekleştirilir.

Loglama

Veri tabanındaki tüm insert, update ve delete işlemleri, sistem tarafından otomatik olarak kaydedilir.

Önemli Trigger’lar

Bazı işlemler doğrudan API yanıt süresini etkilememesi için asenkron olarak gerçekleştirilir.Bu durumlarda, ilgili işlem trigger ile ara tabloya yazılır ve belirli zaman aralıklarında çalışan CRON görevleri tarafından işlenir.

Kullanılan Teknolojiler

.NET
C#
REST API
N-tier Architecture
AutoMapper
Hangfire
EF Core
IIS
Amazon S3
SQL
JWT
ASP.NET Core Identity
xUnit
GitHub Actions
FluentValidation
React
TypeScript
JavaScript
HTML
CSS
Tailwind CSS
MobX
Axios
Visual Studio
Git