AHMET ÇETİN#FikrimVar

Kod ve sistemler · Çalışıyor · Ders / Proje

Bir ders projesi nasıl yıllarca yaşayan işyeri aracına dönüştü?

İşyerimdeki üretim sürecini takip etmek için başladığım; zamanla gelişen, aktif kullanılan ve kodlama serüvenimin temelini oluşturan ilk büyük projem.

Hızlı bakışSüreç haritası Hikâyeyi okuKısa bölümler Derine inAçılır teknik notlar
Üretim Takip Sistemi

Süreç haritası

Bu yazı düzenlenmiş bir süreç hikâyesi.

Bu sayfa ham günlük değil; seçilmiş bölümlerden kurulmuş hikâye akışı. Ham Atölye Günlüğü ayrı bir kayıt akışı olarak hazırlanacak.

4 Yıl Önce

İlk Sipariş Modülü ve İlk Adım

Karmaşık tablolar yoktu. Sadece dışarı verilen siparişlerin ilkel bir takibiyle başladık.

2 Yıl Önce

Mimarinin Evrimi

Kod kilitlenince radikal karar alındı: Spagetti koddan OOP yapısına geçiş ve parçalanmış modüller.

1-2 Yıl Önce

Tedarik ve Eksik Takibi

Tek tedarikçiden tüm fason sektörüne uzanan takip serüveni ve sahadan dönen İmalat modülü.

Son 5-6 Ay

Akıllı Otomasyon Katmanı

E-posta kutusuna giden, sipariş tablolarını parse edip maliyet çıkaran Python/Streamlit botları.

4 Yıl Önce

İlk Sipariş Modülü ve İlk Adım

Karmaşık tablolar yoktu. Sadece dışarı verilen siparişlerin ilkel bir takibiyle başladık.

Bölüm 01-04
Bölüm 01 / 134 Yıl Önce · İlk Sipariş Modülü ve İlk AdımHikâye bölümü

0. Giriş

4 Yıllık Zaman Tüneli

Pek çok yazılım tanıtımında projenin tek bir anda kusursuzca yazılıp bittiği algısı yaratılır. Oysa gerçek hayat böyle değildir. Bu sistem **tam 4 yıllık bir serüvenin ürünüdür.**

İhtiyaç ortaya çıktıkça gelişen, geliştiricisi kodlamayı öğrendikçe mimarisi değişen, düz yazılan kodların 2 yıl sonra Nesne Yönelimli Programlamaya (OOP) dönüştürüldüğü ve en son e-posta okuyan Python otomasyonlarıyla taçlanan yaşayan bir süreçtir.

Bölüm 02 / 134 Yıl Önce · İlk Sipariş Modülü ve İlk AdımDeneme

Zaman Çizelgesi

[4 Yıl Önce] ➔ İlk Sipariş Modülü (Düz PHP)
     │
[2 Yıl Önce] ➔ Büyük Mimari Dönüşüm (OOP & Modüler)
     │
[İhtiyaç Anı] ➔ Tedarikçi ve Eksik Takip Modülleri
     │
[Son 5-6 Ay] ➔ Akıllı Otomasyon Katmanı (Python)
Bölüm 03 / 134 Yıl Önce · İlk Sipariş Modülü ve İlk AdımHikâye bölümü

İlk Modül

Sipariş Modülü (Lazer Sipariş)

4 yıl önce projenin doğmasını sağlayan ilk modüldür. O zamanlar her şey çok ilkeldi. Amaç sadece "hangi firmaya ne sipariş verdik?" sorusuna cevap bulmaktı. Düz prosedürel PHP kodlarıyla yazılmıştı.

Bölüm 04 / 134 Yıl Önce · İlk Sipariş Modülü ve İlk AdımDeneme

Mutfak Kodu

Otomatik Sipariş Maili Gönderimi

// siparis_kaydet.php - Lazer firmasına otomatik bildirim maili
if ($firma_id == LAZER_FIRMA_ID) {
    $to = "[email protected]";
    $subject = "Yeni Lazer Siparişi: SIP-" . $siparis_no;
    $message = "Merhaba,\n\n" . $siparis_no . " numaralı sipariş detayları...\n";
    $headers = "From: [email protected]\r\nContent-Type: text/plain; charset=UTF-8";
    mail($to, $subject, $message, $headers);
}

2 Yıl Önce

Mimarinin Evrimi

Kod kilitlenince radikal karar alındı: Spagetti koddan OOP yapısına geçiş ve parçalanmış modüller.

Bölüm 05-08
Bölüm 05 / 132 Yıl Önce · Mimarinin EvrimiHikâye bölümü

Mimarinin Evrimi

Spagetti Koddan OOP'ye

Sistem büyüdükçe ve modüller çoğaldıkça tek dosyalı prosedürel kodlar kilitlenmeye başladı. Kod okunamaz hale gelince radikal bir karar aldım: **Sistemi silibaştan refactor etmek!**

Düz `mysqli_query` yapılarından **PDO** kullanımına geçildi. Veritabanı işlemleri **OOP (Nesne Yönelimli Programlama)** ve `Database` sınıfı altına toplandı.

Bölüm 06 / 132 Yıl Önce · Mimarinin EvrimiDeneme

Singleton Pattern

OOP ve Veritabanı Bağlantı Mimarisi

// core/database/connection.php
class Database {
    private static $instance = null;
    private $conn;

    private function __construct() {
        $this->conn = new PDO("mysql:host=".DB_HOST.";dbname=".DB_NAME, DB_USER, DB_PASS);
    }

    public static function getInstance() {
        if (!self::$instance) { self::$instance = new Database(); }
        return self::$instance;
    }
}
Bölüm 07 / 132 Yıl Önce · Mimarinin EvrimiHikâye bölümü

Modüller

Ürünler (Ana Kumanda) ve BOM Ağacı

Her ne kadar bir dashboard olsa da, günlük çalışmada asıl ana sayfamız **"Ürünler"** ekranıdır. Hangi mamulden kaç adet kaldığı, kritik stok sınırları DataTables ile canlı takip ediliyor.

Bir ürünün sadece koddan ibaret kalmaması, imalattaki ustanın parçanın görselini ve iş akışını ekranda görebilmesi için de **BOM (Ürün Ağacı)** modülünü geliştirdim.

Bölüm 08 / 132 Yıl Önce · Mimarinin EvrimiDeneme

İlişkisel Veri

BOM Ürün Reçetesi SQL Sorgusu

-- Bir mamulün altındaki yarı mamul ve parçaları çeken ilişkisel sorgu
SELECT b.ana_urun_id, u1.urun_adi AS mamul_adi, 
       u2.urun_kodu AS alt_parca_kodu, u2.urun_adi AS alt_parca_adi, 
       b.miktar, u2.gorsel_url
FROM bom_iliski b
INNER JOIN urunler u1 ON b.ana_urun_id = u1.id
INNER JOIN urunler u2 ON b.alt_urun_id = u2.id
WHERE b.ana_urun_id = :mamul_id;

1-2 Yıl Önce

Tedarik ve Eksik Takibi

Tek tedarikçiden tüm fason sektörüne uzanan takip serüveni ve sahadan dönen İmalat modülü.

Bölüm 09-10
Bölüm 09 / 131-2 Yıl Önce · Tedarik ve Eksik TakibiHikâye bölümü

Süreç Kontrolü

Fason Tedarik ve Eksik Takibi

Tek tedarikçiden başlayıp tüm sektöre yayılan Lazer Eksik ve Sipariş Takip ekranları sayesinde dışarıya siparişi verilen malzemelerin durumu anlık listelenir.

Fason tedarikçinin işi teslim etme süresini hesaplayarak, hedeflenen süreyi aşan işlerde ekranda kırmızı uyarı (gecikme günü) rozetleri çıkar.

Bölüm 10 / 131-2 Yıl Önce · Tedarik ve Eksik TakibiHikâye bölümü

Saha Notu

Bitirilmeyen İmalat Modülü

Kenar notu

Kenar notu

Tamamlanmayan ama dürüstçe duran 5 bölüm... İmalat tarafında 5 ayrı bölüm tasarladık ama sahadaki pratik kullanımda ustalara fazla bürokrasi getirdiği için tamamlamadık ve yarıda bıraktık. Gerçek hayat yazılımdan her zaman daha hızlıdır.

Son 5-6 Ay

Akıllı Otomasyon Katmanı

E-posta kutusuna giden, sipariş tablolarını parse edip maliyet çıkaran Python/Streamlit botları.

Bölüm 11-13
Bölüm 11 / 13Son 5-6 Ay · Akıllı Otomasyon KatmanıHikâye bölümü

Akıllı Katman

Uygulamalar ve Python Otomasyonu

Mutfaktaki son yenilik: E-posta kutusuna gidip gelen mailleri okuyan ve maliyet çıkaran Python botu!

Bu modül son 5-6 ay içerisinde aşama aşama ihtiyaç duyuldukça geliştirildi. Python ve Streamlit kullanılarak IMAP üzerinden e-posta okuyan, HTML sipariş tablolarını parse eden Pandas destekli bir entegrasyon sisteme kazandırıldı.

Bölüm 12 / 13Son 5-6 Ay · Akıllı Otomasyon KatmanıDeneme

Python Kodu

E-posta Otomatik Mail Okuyucu

# app.py - E-posta Kutusuna Bağlanıp Siparişi Çeken Kod
import streamlit as st
import pandas as pd
from imap_tools import MailBox, A

def find_latest_email():
    with MailBox(st.secrets.imap.server).login(st.secrets.imap.user, st.secrets.imap.pass, 'INBOX') as mailbox:
        for msg in mailbox.fetch(A(from_="[email protected]"), limit=5, reverse=True):
            if "Sipariş" in msg.subject:
                df_list = pd.read_html(msg.html)
                return df_list[0]
Bölüm 13 / 13Son 5-6 Ay · Akıllı Otomasyon KatmanıHikâye bölümü

4 Yıllık Deneyim

Son Söz

Bu hikâye, bir yazılımcının ve bir atölyenin 4 yıllık birlikte büyüme günlüğüdür. 4 yıl önceki acemi PHP kodlarından, 2 yıl sonraki OOP refactoring hamlesine ve son 5-6 ayda eklenen Python e-posta robotlarına kadar bu proje; yaşadığım en büyük öğretmendir.

Bugünkü Durum

Hikâye burada bitiyor ama proje yaşıyor.

Son Güncelleme:

Proje Notu

Bazen küçük bir merak, koca bir sistemin temelini atar.