İlk Sipariş Modülü ve İlk Adım
Karmaşık tablolar yoktu. Sadece dışarı verilen siparişlerin ilkel bir takibiyle başladık.
Kod ve sistemler · Çalışıyor · Ders / Proje
İş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.
Süreç haritası
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.
Karmaşık tablolar yoktu. Sadece dışarı verilen siparişlerin ilkel bir takibiyle başladık.
Kod kilitlenince radikal karar alındı: Spagetti koddan OOP yapısına geçiş ve parçalanmış modüller.
Tek tedarikçiden tüm fason sektörüne uzanan takip serüveni ve sahadan dönen İmalat modülü.
E-posta kutusuna giden, sipariş tablolarını parse edip maliyet çıkaran Python/Streamlit botları.
4 Yıl Önce
Karmaşık tablolar yoktu. Sadece dışarı verilen siparişlerin ilkel bir takibiyle başladık.
Bölüm 01-040. Giriş
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.
[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)İlk Modül
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ı.
Mutfak Kodu
// 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
Kod kilitlenince radikal karar alındı: Spagetti koddan OOP yapısına geçiş ve parçalanmış modüller.
Bölüm 05-08Mimarinin Evrimi
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ı.
Singleton Pattern
// 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;
}
}Modüller
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.
İlişkisel Veri
-- 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
Tek tedarikçiden tüm fason sektörüne uzanan takip serüveni ve sahadan dönen İmalat modülü.
Bölüm 09-10Süreç Kontrolü
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.
Saha 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
E-posta kutusuna giden, sipariş tablolarını parse edip maliyet çıkaran Python/Streamlit botları.
Bölüm 11-13Akıllı Katman
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ı.
Python Kodu
# 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]4 Yıllık Deneyim
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
Son Güncelleme:
Proje Notu
Bazen küçük bir merak, koca bir sistemin temelini atar.