Firebird Web Query Plus: Flask ile Veritabanı Yönetim Uygulaması Geliştirme

Firebird Web Query Plus: Flask ile Veritabanı Yönetim Uygulaması Geliştirme

Giriş

Merhaba! Bu blog yazısında, Firebird veritabanı ile etkileşimli bir web uygulaması geliştirme sürecini adım adım anlatacağım. Bu uygulama, özellikle tahsilat işlemleri için optimize edilmiş ve modern web teknolojileri kullanılarak geliştirilmiştir. Hadi başlayalım!

1. Proje Yapısı ve Temel Kurulum

1.1 Proje Yapısı

Öncelikle, projemizin dosya yapısını oluşturalım. Aşağıdaki gibi bir yapı kullanacağız:

firebird_web_query_plus/
│
├── app.py
├── add_queries.py
├── templates/
│   └── tahsilat_gir.html
├── static/
│   └── css/
│   └── js/
├── queries.db
└── databases.db

1.2 Gerekli Kütüphanelerin Kurulumu

Flask uygulamamızı geliştirmek için bazı Python kütüphanelerine ihtiyacımız var. Bunları kurmak için terminalde aşağıdaki komutu çalıştırabilirsiniz:

pip install flask flask-cors fdb

2. Veritabanı Şema Oluşturma

Uygulamamız için gerekli veritabanı tablolarını oluşturalım. Bu tablolar, sorgularımızı ve sorgu geçmişimizi saklayacak.

import sqlite3
import os

DB_PATH = 'queries.db'

if not os.path.exists(DB_PATH):
    conn = sqlite3.connect(DB_PATH)
    cur = conn.cursor()
    cur.execute('''CREATE TABLE queries (
        id INTEGER PRIMARY KEY AUTOINCREMENT, 
        name TEXT, 
        query TEXT, 
        type TEXT, 
        database_id INTEGER
    )''')
    cur.execute('''CREATE TABLE query_history (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        query_id INTEGER,
        execution_time TIMESTAMP,
        parameters TEXT,
        execution_duration REAL,
        status TEXT,
        result_count INTEGER,
        FOREIGN KEY (query_id) REFERENCES queries (id)
    )''')
    conn.commit()
    conn.close()

3. Tahsilat Modülü için Sorgu Yönetimi

Tahsilat formu için gerekli sorguları veritabanına ekleyelim. Bu sorgular, cari kartlar, kasalar, personeller ve işlem noktaları için veri çekecek.

import sqlite3

def add_queries():
    conn = sqlite3.connect('queries.db')
    cur = conn.cursor()

    # Cari kartları sorgusu
    cur.execute('''
        INSERT INTO queries (name, query, type, database_id) 
        VALUES (
            'cari_kartlar',
            'SELECT FIRST 10 CARI_NO, CARI_UNVANI FROM CARIKART 
             WHERE CARI_UNVANI CONTAINING ? ORDER BY CARI_UNVANI',
            'SELECT',
            1
        )
    ''')

    # Diğer sorgular...
    conn.commit()
    conn.close()

if __name__ == "__main__":
    add_queries()

Bu scripti çalıştırarak sorguları veritabanına ekleyebilirsiniz:

python add_queries.py

4. API Endpoint’lerinin Oluşturulması

Tahsilat formu için gerekli API endpoint’lerini oluşturalım. Bu endpoint’ler, kullanıcıdan gelen istekleri alacak ve veritabanından veri çekecek.

from flask import Flask, request, jsonify
import sqlite3

app = Flask(__name__)

@app.route('/api/cari-kartlar')
def get_cari_kartlar():
    try:
        conn = sqlite3.connect(DB_PATH)
        cur = conn.cursor()
        cur.execute("SELECT id FROM queries WHERE name = 'cari_kartlar'")
        query_id = cur.fetchone()[0]
        conn.close()

        search_term = request.args.get('q', '')
        params = {'q': search_term}

        return dynamic_api('cari_kartlar', query_id, params)
    except Exception as e:
        return jsonify({"success": False, "error": str(e)})

# Diğer endpoint'ler...

5. Frontend Geliştirme

Tahsilat formu için HTML template oluşturalım. Bu form, kullanıcıdan tahsilat bilgilerini alacak ve API’ye gönderecek.

<!DOCTYPE html>
<html>
<head>
    <title>Tahsilat Girişi</title>
    <link href="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/css/select2.min.css" rel="stylesheet" />
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
    <div class="container mt-5">
        <form id="tahsilatForm">
            <div class="mb-3">
                <label>Cari Hesap</label>
                <select class="form-control select2" name="cari_id" required>
                    <option value="">Seçiniz...</option>
                </select>
            </div>
            <!-- Diğer form alanları -->
        </form>
    </div>
</body>
</html>

6. Select2 Entegrasyonu

Form alanları için Select2 entegrasyonunu yapalım. Select2, kullanıcıya daha iyi bir arama ve seçim deneyimi sunar.

$(document).ready(function() {
    $('.select2').select2({
        theme: 'bootstrap-5',
        minimumInputLength: 2,
        language: {
            inputTooShort: function() {
                return 'En az 2 karakter giriniz...';
            },
            noResults: function() {
                return 'Sonuç bulunamadı';
            },
            searching: function() {
                return 'Aranıyor...';
            }
        },
        ajax: {
            url: '/api/cari-kartlar',
            dataType: 'json',
            delay: 250,
            data: function(params) {
                return {
                    q: params.term
                };
            },
            processResults: function(data) {
                return {
                    results: data.data.map(function(item) {
                        return {
                            id: item.CARI_NO,
                            text: item.CARI_UNVANI
                        };
                    })
                };
            },
            cache: true
        }
    });
});

7. Tahsilat Kaydetme İşlemi

Tahsilat kaydını veritabanına ekleyelim. Bu işlem, kullanıcıdan alınan bilgileri kullanarak veritabanına yeni bir kayıt ekler.

@app.route('/api/cari-islem-giris', methods=['POST'])
def cari_islem_giris():
    try:
        data = request.get_json()
        db_config = get_database_config(1)

        conn = fdb.connect(**db_config)
        cur = conn.cursor()

        params = {
            'ACIKLAMA': data.get('aciklama'),
            'TARIH': data.get('basket_datetime'),
            'TUTAR': data.get('hk_islem_tutari'),
            'KASA_ID': data.get('kasa_id'),
            'CARI_NO': data.get('hk_cari_id'),
            'PERSONEL_ID': data.get('personel_id'),
            'ISLEM_NOKTASI_ID': data.get('islem_noktasi_id')
        }

        cur.execute('''
            INSERT INTO CARIISLEM_GIRIS (
                ISLEM_KODU, ACIKLAMA, TARIH, VADE_TARIHI, 
                DOVIZ_BIRIMI, DOVIZ_KURU, ALACAK, 
                KASA_HESAP_NO, CARI_NO, PERSONEL_NO, 
                ISLEM_NOKTASI_NO
            ) VALUES (
                'NAKTAH', :ACIKLAMA, :TARIH, :VADE_TARIHI, 
                'TL', 1, :TUTAR, :KASA_ID, :CARI_NO, 
                :PERSONEL_ID, :ISLEM_NOKTASI_ID
            )
        ''', params)

        conn.commit()
        return jsonify({"success": True, "message": "Tahsilat kaydedildi"})

    except Exception as e:
        return jsonify({"success": False, "error": str(e)})

8. Güvenlik ve Hata Yönetimi

Uygulamamızda güvenlik ve hata yönetimi için gerekli önlemleri alalım. Bu, uygulamanın daha güvenli ve kararlı çalışmasını sağlar.

def log_yaz(mesaj, seviye="info"):
    if seviye == "error":
        logging.error(mesaj)
    else:
        logging.info(mesaj)

def format_value(value):
    if value is None:
        return None
    elif isinstance(value, (bytes, bytearray)):
        return value.decode('utf-8', errors='ignore')
    elif isinstance(value, datetime):
        return value.strftime("%d.%m.%Y %H:%M:%S")
    else:
        return str(value).strip()

9. Uygulama Çalıştırma

Son olarak, uygulamayı çalıştıralım. Bu, uygulamanın yerel sunucuda çalışmasını sağlar ve tarayıcıdan erişilebilir hale getirir.

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=5000, debug=True)

Sonuç

Bu blog yazısında, Firebird veritabanı ile çalışan bir web uygulaması geliştirme sürecini adım adım anlattık. Uygulama:

  • Modern web teknolojileri kullanıyor
  • Güvenli veritabanı işlemleri yapıyor
  • Kullanıcı dostu bir arayüz sunuyor
  • Genişletilebilir bir yapıya sahip

Projeyi geliştirmeye devam etmek için şu adımlar önerilebilir:

  1. Kullanıcı yetkilendirme sistemi eklemek
  2. Daha fazla raporlama özelliği eklemek
  3. Batch işlem desteği eklemek
  4. Performans optimizasyonları yapmak

Bu proje, Firebird veritabanı ile çalışan işletmeler için güçlü bir veri yönetim aracı olarak kullanılabilir. Umarım bu yazı, kendi projelerinizi geliştirirken size ilham verir ve yardımcı olur!