Bir şey mi arıyorsunuz?

Bir konu, bir kelime, aklınızda kalan bir cümle.

Yazılara dön

Satın almada üç yönlü eşleştirme: sipariş, e-İrsaliye ve fatura

Sipariş, e-İrsaliye ve fatura üç ayrı birimde doğar. Faturayı teslim alınan miktara bağlayan, toleransı ve 7/8 günlük süreleri yazan bir eşleştirme kuralı.

Satın almada üç yönlü eşleştirme: sipariş, e-İrsaliye ve fatura yazısının kapak görseli

Tedarikçi faturası geldiğinde çoğu KOBİ’de yapılan kontrol tektir: tutar siparişle tutuyor mu? Oysa siparişteki 100 adedin 80’i depoya girmişse, siparişle birebir tutan bir fatura yine de 20 adetlik fazla ödeme demektir. Faturayı yalnızca siparişe değil, teslim alınan miktara da bağlamak gerekir. Muhasebede bunun adı üç yönlü eşleştirmedir: sipariş, mal kabul ve fatura.

Bu yazının tezi şu: üç yönlü eşleştirme bir muhasebe ekranı değil, bir süreç kuralıdır. Eşleştirme faturanın geldiği gün değil, malın geldiği gün başlar. Türkiye’de e-İrsaliye ve fatura süreleri kısa olduğu için toleransı, kısmi teslimatı ve süreleri yazılıma açıkça yazmayan sistem, sorunu ancak ödeme yapıldıktan sonra fark eder.

Problem: Üç belge, üç birim, üç farklı zaman

Sipariş satın almada, mal kabul depoda, fatura muhasebede doğar. Her biri kendi ekranında doğrudur; sorun, aralarındaki bağın çoğu zaman bir insanın hafızasında durmasıdır. Tipik görüntü şöyle:

  • Sipariş 100 adet, ilk sevkiyatta 80 adet geliyor, kalan 20 adet iki hafta sonra.
  • Tedarikçi tek fatura kesiyor ve 100 adedin tamamını faturalıyor.
  • Fiyat siparişte 42,50 TL, faturada 42,80 TL. Fark küçük görünüyor ama satırda 24 TL ediyor.
  • Depo siparişte “adet” yazan ürünü “koli” olarak kabul ediyor.

Bu farkların hiçbiri tek başına büyük değildir. Ama aylık yüzlerce satırda birikir ve kimin onayladığı belli olmayan bir fark olarak muhasebe kayıtlarına girer.

Neden zor: Süreler kısa, belgeler parça parça

Türkiye’de üç süre bu süreci doğrudan etkiler. Bu süreleri ERP’de görünür kılmak, eşleştirmenin kendisi kadar önemlidir.

SüreNe zaman başlarNe olurDayanak
7 gün: e-İrsaliye yanıtıe-İrsaliye üzerindeki fiili sevk tarihindenAlıcı tam kabul, kısmi kabul ya da ret bildirebilir. Yanıt zorunlu değildir; 7 gün içinde yanıt verilmezse sistem malların tam teslim alındığını varsayar.GİB e-İrsaliye Uygulama Kılavuzu, bölüm 12 ve 15.24
7 gün: fatura düzenlemeMalın teslimi ya da hizmetin yapıldığı tarihtenSatıcı faturayı en geç bu sürede düzenler; süresinde düzenlenmeyen fatura usulen hiç düzenlenmemiş sayılır.VUK m.231/5
8 gün: faturaya itirazFaturanın alınmasındanİçeriğine itiraz edilmeyen fatura kabul edilmiş sayılır. Bu bir karinedir, aksi ispat edilebilir; yine de itirazı süresinde yapmak işi kolaylaştırır.TTK m.21/2

İki ayrıntı yazılım tasarımını değiştirir. Birincisi, GİB kılavuzuna göre e-İrsaliyenin tamamen reddi yalnızca malın fiili sevkinden önce hüküm doğurur; sevkten sonra gönderilen ret yanıtı hükümsüzdür. Yani depo kapısında yapılabilecek şey çoğu zaman “ret” değil, kısmi kabuldür. İkincisi, kısmi kabulde reddedilen miktar ve gerekçe yazılır; bu bilgi daha sonra fatura eşleştirmesinin girdisidir.

Bu tabloyu hukuki görüş olarak değil, yazılım gereksinimi olarak okuyun. Kendi işletmenizdeki uygulama için mali müşavirinizle teyit edin.

Adım adım yaklaşım

1. Sipariş satırını tek doğruluk kaynağı yapın

Eşleştirmenin referansı sipariş satırıdır: ürün, birim, birim fiyat, para birimi ve KDV hariç tutar. Siparişten sonra fiyat değiştiyse siparişi revize edin; faturada “anlaştık” notuyla düzeltmeyin. Revize edilmemiş bir fiyat değişikliği, eşleştirmede haklı bir fark olarak değil açıklanamayan bir fark olarak görünür.

Tutarları float ile değil, ondalık ya da tamsayı alt birimle saklayın. Bunun nedenlerini kuruş farkı yazısında ayrıntılı anlattım; eşleştirme toleransı kuruş hassasiyetinde çalışacağı için burada da aynı kural geçerli.

2. Mal kabulü e-İrsaliyeye bağlayın

Depo, gelen e-İrsaliyeyi açarak mal kabul kaydı oluşturmalı; e-İrsaliye numarası ve satırları kayda bağlanmalı. Sayım sonucu “kabul edilen” ve “reddedilen” miktar olarak girilir, reddedilen için gerekçe zorunlu olur. e-İrsaliye yanıtı da bu kayıttan üretilir. Böylece 7 günlük yanıt süresi bir hatırlatma değil, mal kabul ekranının doğal bir sonucu olur.

Mal kabul ekranında “fiili sevk tarihi + 7 gün” geri sayımını gösterin. Yanıtı verilmemiş e-İrsaliyeleri gün sırasına göre listeleyen bir görünüm, kısmi teslimatın sessizce tam teslim sayılmasını önler.

3. Eşleştirmeyi satır bazında yapın

Fatura toplamını sipariş toplamıyla karşılaştırmak yetmez; farklar satırlarda birbirini götürebilir. Her fatura satırı bir sipariş satırına bağlanır ve üç soru sorulur:

  1. Miktar: Faturadaki miktar, kabul edilen miktardan bu satır için daha önce faturalanan miktar düşüldükten sonra kalanı aşıyor mu?
  2. Birim fiyat: Faturadaki birim fiyat siparişteki fiyattan tolerans oranından fazla mı yüksek?
  3. Satır tutarı: Fiyat farkı miktarla çarpıldığında satırdaki fark tutar toleransını aşıyor mu?

Fiyat ve tutar toleransını ayrı tutmanın nedeni şu: yüzde tolerans tek başına büyük miktarlarda anlamlı tutarları gizler. Microsoft’un Dynamics 365 belgelerindeki örnekte de birim fiyat farkı toleransı aşan bir satır, satır toplamı toleransı içinde kalabiliyor. İki kontrol birbirinin eksiğini kapatır.

4. Toleransı kural olarak yazın, kişiye bırakmayın

Tolerans, “muhasebe bakar” diye bırakılınca her ay başka uygulanır. Yazılı kural en az şunları içermeli: yüzde ve tutar olarak üst sınır, sınırın kategoriye göre değişip değişmediği (hammadde ile kırtasiye aynı davranmaz) ve sınırı aşan farkı kimin onaylayacağı. Onaylayan kişi, mal kabulü yapan ya da siparişi veren kişiyle aynı olmamalı. Yetki matrisi yazısındaki görev ayrılığı kuralı tam olarak bu noktaya uygulanır.

5. Sonucu durum olarak saklayın

Eşleştirmenin çıktısı “geçti/kaldı” değil, açıklanabilir bir durum olmalı: eşleşti, onay gerekli (gerekçe notlarıyla) ve teslim bekliyor. Teslim bekliyor durumu önemlidir: mal gelmeden gelen fatura hata değildir, beklemeye alınması gereken bir belgedir. Mal kabul kaydı oluştuğunda eşleştirme kendiliğinden yeniden çalışmalı.

6. 8 günlük itiraz takvimini görünür kılın

Fatura sisteme girdiği anda sayaç başlar. “Onay gerekli” durumundaki faturalar, kalan güne göre sıralanmış tek bir listede durmalı. Tedarikçiye itiraz edilecekse bunun kaydı da (tarih, kanal, gerekçe) aynı faturaya bağlanmalı. e-Fatura tarafındaki belge tipi ve iptal süreleri için e-Fatura/e-Arşiv alıcı kontrolü yazısına bakabilirsiniz.

Kod örneği: Kuralı tek bir sınıfa toplamak

Aşağıdaki sınıf, eşleştirme kararını çerçeveden bağımsız tek bir yerde toplar. Tutarlar tamsayıdır: fiyat 1/10.000 TL, miktar 1/1.000 birim. Böylece karşılaştırmada float kullanılmaz. Örnek PHP 8.3 ile çalıştırılarak test edildi.

<?php

declare(strict_types=1);

final class ThreeWayMatcher
{
    /**
     * Tutarlar tamsayı: fiyat 1/10000 TL, miktar 1/1000 birim.
     */
    public function __construct(
        private int $priceTolBp = 200,      // birim fiyatta +%2 (baz puan)
        private int $amountTolMinor = 5000, // satır tutarında en fazla +0,50 TL
    ) {}

    /**
     * @return array{status: string, notes: list<string>}
     */
    public function check(
        int $poPrice,          // siparişteki birim fiyat
        int $receivedQty,      // kabul edilen miktar (e-İrsaliye yanıtı / mal kabul)
        int $alreadyInvoiced,  // bu sipariş satırı için daha önce faturalanan miktar
        int $invPrice,         // faturadaki birim fiyat
        int $invQty,           // faturadaki miktar
    ): array {
        $notes = [];
        $openQty = $receivedQty - $alreadyInvoiced;

        if ($receivedQty === 0) {
            return ['status' => 'teslim_bekliyor', 'notes' => ['Mal kabulü yok.']];
        }
        if ($invQty > $openQty) {
            $notes[] = 'Miktar fazlası: faturalanabilir ' . $openQty . ', fatura ' . $invQty . '.';
        }

        $priceDiffBp = intdiv(($invPrice - $poPrice) * 10000, $poPrice);
        if ($priceDiffBp > $this->priceTolBp) {
            $notes[] = 'Birim fiyat farkı: ' . $priceDiffBp . ' baz puan.';
        }

        // Satır tutarı: fiyat (1/10000) x miktar (1/1000) -> 1/10.000.000; 1/10000 TL'ye indir
        $lineDiff = intdiv(($invPrice - $poPrice) * $invQty, 1000);
        if ($lineDiff > $this->amountTolMinor) {
            $notes[] = 'Satır tutarı farkı: ' . $lineDiff . ' (1/10000 TL).';
        }

        return ['status' => $notes === [] ? 'eslesti' : 'onay_gerekli', 'notes' => $notes];
    }
}
$m = new ThreeWayMatcher();

// Sipariş: 100 adet x 42,50 TL. Depo 80 adet kabul etti.
$m->check(425000, 80000, 0, 425000, 100000);
// ['status' => 'onay_gerekli', 'notes' => ['Miktar fazlası: faturalanabilir 80000, fatura 100000.']]

$m->check(425000, 80000, 0, 428000, 80000); // 42,80 TL: fiyat +%0,7 ama satırda 24 TL fark
// ['status' => 'onay_gerekli', 'notes' => ['Satır tutarı farkı: 240000 (1/10000 TL).']]

$m->check(425000, 80000, 0, 425000, 80000);
// ['status' => 'eslesti', 'notes' => []]

$m->check(425000, 0, 0, 425000, 80000);   // mal gelmeden fatura
// ['status' => 'teslim_bekliyor', 'notes' => ['Mal kabulü yok.']]

İki bilinçli tercih var. Birincisi, sınıf yalnızca fiyat artışını işaretler; tedarikçinin daha düşük fiyatla faturalaması onay gerektirmez, ama raporda görülmelidir. İkincisi, miktar kontrolü “daha önce faturalanan” miktarı düşer; kısmi faturalarda aynı teslimatın iki kez faturalanmasını bu yakalar. Laravel tarafında bu sınıf bir servis olarak çağrılır, sonuç fatura satırına durum ve not olarak yazılır.

Kontrol listesi

KontrolNeredeSorumlu
Sipariş satırında birim, birim fiyat, para birimi net mi?Satın almaSiparişi veren
e-İrsaliye mal kabule bağlandı mı, kabul ve ret miktarı girildi mi?DepoMal kabul sorumlusu
e-İrsaliye yanıtı fiili sevkten itibaren 7 gün içinde verildi mi?DepoMal kabul sorumlusu
Fatura satırları sipariş satırlarına bağlandı mı?MuhasebeFatura girişini yapan
Fiyat ve tutar toleransı aşıldıysa onay ve gerekçe var mı?Muhasebe / yönetimGörev ayrılığına uygun onaylayıcı
İtiraz gerekiyorsa 8 gün içinde yapıldı ve kaydı faturaya bağlandı mı?MuhasebeFatura sorumlusu

Sık yapılan hatalar

  • Toplamla eşleştirmek: Bir satırdaki fazla ödeme başka satırdaki eksikle kapanır, fark görünmez.
  • Yalnızca yüzde tolerans: %2 küçük görünür; büyük siparişte ciddi bir tutardır. Tutar sınırını da yazın.
  • Birim dönüşümünü eşleştirmeye bırakmak: Koli ile adet, mal kabulde temel birime çevrilmeli; eşleştirme aynı birimleri karşılaştırmalı.
  • e-İrsaliye yanıtını unutmak: Yanıt verilmezse sistem tam teslim varsayar; eksik gelen mal kayıtta tam gelmiş görünür.
  • Sevkten sonra “ret” göndermek: Kılavuza göre bu ret hükümsüzdür; doğru yol kısmi kabul ya da iade sürecidir.
  • Farkı onaylayanla mal kabul edenin aynı kişi olması: Kontrol, kontrol edilenin elinde kalır.
  • Erken gelen faturayı reddetmek: Mal yoldaysa fatura beklemeye alınır; mal kabul gelince eşleştirme yeniden çalışır.

Özet

  • Faturayı yalnızca siparişe değil, teslim alınan miktara da bağlayın.
  • Mal kabulü e-İrsaliyeye bağlayın; 7 günlük yanıt süresini ekranda gösterin.
  • Eşleştirmeyi satır bazında yapın; birim fiyat ve satır tutarı için iki ayrı tolerans kullanın.
  • Tolerans aşımını görev ayrılığına uygun bir onaya bağlayın, gerekçeyi saklayın.
  • Sonucu açıklanabilir bir durum olarak tutun ve 8 günlük itiraz süresini takip edin.

Üç yönlü eşleştirmenin amacı tedarikçiyle tartışmak değildir. Amaç, ödenen her liranın sipariş edilmiş ve gerçekten teslim alınmış bir şeye karşılık geldiğini gösterebilmektir.

Sizin işletmenizde fatura farkını kim onaylıyor: satın alma mı, muhasebe mi, yoksa farkı ilk gören kişi mi? Benzer bir süreç üzerinde çalışıyorsanız deneyimlerinizi paylaşın.


Kaynaklar

Siz ne düşünüyorsunuz?

Bu site istenmeyenleri azaltmak için Akismet kullanır. Yorum verilerinizin nasıl işlendiğini öğrenin.