/* ══════════════════════════════════════════════════════ ETAP 4 — TEDARİKÇİ / STOK / FATURA / GELİR-GİDER JS ══════════════════════════════════════════════════════ */ // ── TEDARİKÇİLER ── function renderTedarikciler(q=''){ const data=DB.get('tedarikciler')||[]; let toplam=0,borcT=0,vadeyakin=0; data.forEach(t=>{toplam++;borcT+=Math.abs(t.bakiye||0);if((t.vade||0)<=7)vadeyakin++;}); function s(id,v){const e=document.getElementById(id);if(e)e.textContent=v} s('td-toplam',toplam); s('td-borc','₺'+fmt(borcT)); s('td-alim','₺'+fmt(12400)); s('td-vade',vadeyakin); const tb=document.getElementById('tb-tedarik');if(!tb)return; const list=q?data.filter(t=>t.firma.toLowerCase().includes(q.toLowerCase())||t.yetkili.toLowerCase().includes(q.toLowerCase())):data; tb.innerHTML=list.map(t=>` ${t.firma} ${t.yetkili} ${t.tel} ${t.email} ${t.adres} ₺${fmt(t.limit||0)} ${t.vade} gün ₺${fmt(Math.abs(t.bakiye||0))}${t.bakiye<0?' (Borç)':''} Aktif
`).join(''); } function saveTedarikci(){ const firma=document.getElementById('td-firma').value.trim(); if(!firma){showToast('Firma adı giriniz','err');return} const data=DB.get('tedarikciler')||[]; const nid=Math.max(...data.map(t=>t.id),0)+1; data.push({id:nid,firma,yetkili:document.getElementById('td-yetkili').value,tel:document.getElementById('td-tel').value,email:document.getElementById('td-email').value,adres:document.getElementById('td-adres').value,limit:parseFloat(document.getElementById('td-limit').value)||30000,vade:parseInt(document.getElementById('td-vade').value)||30,bakiye:0}); DB.set('tedarikciler',data); closeModal('m-tedarik-ekle'); showToast(firma+' eklendi','ok'); renderTedarikciler(); } function editTedarikci(id){showToast('Tedarikçi düzenleme formu açılıyor…','info')} // ── STOK ── function initStokForms(){ const stk=DB.get('stok')||[]; const td=DB.get('tedarikciler')||[]; ['sg-parca','sc-parca','sp-tedarik'].forEach(id=>{ const el=document.getElementById(id); if(!el)return; if(id.startsWith('s')&&id.endsWith('parca')){ el.innerHTML=''+stk.map(s=>``).join(''); } else { el.innerHTML=''+td.map(t=>``).join(''); } }); // Satış & fatura müşteri const mst=DB.get('musteriler')||[]; ['sat-musteri','fat-m'].forEach(id=>{ const el=document.getElementById(id); if(el) el.innerHTML=''+mst.map(m=>``).join(''); }); } function renderStokKartlar(){ const data=DB.get('stok')||[]; const cesit=data.length; const deger=data.reduce((a,s)=>a+s.stok*s.alisF,0); const kritik=data.filter(s=>s.stok<=s.minStok).length; function s(id,v){const e=document.getElementById(id);if(e)e.textContent=v} s('stk-cesit',cesit);s('stk-deger','₺'+fmt(deger));s('stk-kritik',kritik);s('stk-giris-ay','₺'+fmt(12400)); } function renderStokListe(q=''){ renderStokKartlar(); let data=DB.get('stok')||[]; const kat=(document.getElementById('stk-kat-f')||{value:''}).value; const raf=(document.getElementById('stk-raf-f')||{value:''}).value; const kritikOnly=(document.getElementById('stk-kritik-only')||{checked:false}).checked; if(q) data=data.filter(s=>s.ad.toLowerCase().includes(q.toLowerCase())||s.sku.toLowerCase().includes(q.toLowerCase())); if(kat) data=data.filter(s=>s.kat===kat); if(raf) data=data.filter(s=>s.raf===raf); if(kritikOnly) data=data.filter(s=>s.stok<=s.minStok); const td=DB.get('tedarikciler')||[]; const tb=document.getElementById('tb-stok-liste');if(!tb)return; tb.innerHTML=data.map(s=>{ const t=td.find(x=>x.id===s.tedarikcId)||{firma:'—'}; const isKritik=s.stok<=s.minStok; return ` ${s.sku} ${s.ad} ${s.kat} ${t.firma} ${s.raf} ₺${fmt(s.alisF)} ₺${fmt(s.satisF)} ${s.stok} ${s.minStok} ${isKritik?' Kritik':'Normal'}
`; }).join(''); } function saveStokEkle(){ const ad=document.getElementById('sp-ad').value.trim(); const sku=document.getElementById('sp-sku').value.trim(); if(!ad||!sku){showToast('Parça adı ve SKU giriniz','err');return} const data=DB.get('stok')||[]; if(data.find(s=>s.sku===sku)){showToast('Bu SKU zaten mevcut','err');return} const nid=Math.max(...data.map(s=>s.id),0)+1; data.push({id:nid,sku,ad,kat:document.getElementById('sp-kat').value,tedarikcId:parseInt(document.getElementById('sp-tedarik').value)||null,raf:document.getElementById('sp-raf').value,alisF:parseFloat(document.getElementById('sp-alis').value)||0,satisF:parseFloat(document.getElementById('sp-satis').value)||0,stok:parseInt(document.getElementById('sp-stok').value)||0,minStok:parseInt(document.getElementById('sp-min').value)||2}); DB.set('stok',data); closeModal('m-stok-ekle'); showToast(ad+' stoka eklendi','ok'); renderStokListe(); } function _localSaveStokGiris_DISABLED(){ const parcaId=document.getElementById('sg-parca').value; const adet=parseInt(document.getElementById('sg-adet').value)||0; if(!parcaId||!adet){showToast('Parça ve adet giriniz','err');return} const data=DB.get('stok')||[]; const idx=data.findIndex(s=>s.id==parcaId); if(idx<0){showToast('Parça bulunamadı','err');return} data[idx].stok+=adet; DB.set('stok',data); // Hareket kayıt const har=DB.get('stok_har')||[]; har.unshift({tarih:today(),parcaId,tur:'Giriş',adet,fiyat:parseFloat(document.getElementById('sg-fiyat').value)||0,toplam:adet*(parseFloat(document.getElementById('sg-fiyat').value)||0),kaynak:document.getElementById('sg-fatura').value||'Manuel',personel:'Ahmet Yılmaz'}); DB.set('stok_har',har); showToast(data[idx].ad+' → +'+adet+' adet giriş yapıldı','ok'); renderStokListe(); renderStokHareketler(); } function saveStokCikis(){ const parcaId=document.getElementById('sc-parca').value; const adet=parseInt(document.getElementById('sc-adet').value)||0; if(!parcaId||!adet){showToast('Parça ve adet giriniz','err');return} const data=DB.get('stok')||[]; const idx=data.findIndex(s=>s.id==parcaId); if(idx<0){showToast('Parça bulunamadı','err');return} if(data[idx].stok{ const p=stk.find(s=>s.id==h.parcaId)||{ad:'—',sku:'—'}; return ` ${h.tarih} ${p.ad} ${p.sku} ${h.tur==='Giriş'?'⬆ Giriş':'⬇ Çıkış'} ${h.adet} ₺${fmt(h.fiyat)} ₺${fmt(h.toplam)} ${h.kaynak||'—'} ${h.personel||'—'} `; }).join(''); } function stokTab(id,el){ ['stok-liste','stok-giris','stok-cikis','stok-har'].forEach(t=>{ const e=document.getElementById(t);if(e)e.classList.toggle('hidden',t!==id); }); document.querySelectorAll('#stok-tabs .tab').forEach(t=>t.classList.remove('on')); if(el) el.classList.add('on'); if(id==='stok-har') renderStokHareketler(); if(id==='stok-giris'||id==='stok-cikis') initStokForms(); } // ── SATILAN ÜRÜNLER ── let satisKalemSayac=0; function initSatisForm(){ const mst=DB.get('musteriler')||[]; const sel=document.getElementById('sat-musteri'); if(sel) sel.innerHTML=''+mst.map(m=>``).join(''); const tarih=document.getElementById('sat-tarih'); if(tarih&&!tarih.value){const d=new Date();tarih.value=d.toISOString().split('T')[0]} // İlk kalem ekle const kl=document.getElementById('sat-kalemler'); if(kl&&!kl.children.length) addSatisKalem(); } function addSatisKalem(){ satisKalemSayac++; const stk=DB.get('stok')||[]; const div=document.createElement('div'); div.id='sk-'+satisKalemSayac; div.style.cssText='display:grid;grid-template-columns:2.5fr 0.7fr 1fr auto;gap:8px;align-items:center'; div.innerHTML=``; document.getElementById('sat-kalemler').appendChild(div); } function calcSatisKalem(n){ const sel=document.getElementById('sk-p-'+n); if(!sel||!sel.value)return; const f=parseFloat(sel.selectedOptions[0].dataset.f)||0; const a=parseInt(document.getElementById('sk-a-'+n).value)||1; document.getElementById('sk-t-'+n).value='₺'+fmt(f*a); calcSatisOzet(); } function calcSatisOzet(){ let ara=0; document.querySelectorAll('[id^="sk-t-"]').forEach(el=>{ ara+=parseFloat(el.value.replace('₺','').replace(/\./g,'').replace(',','.'))||0; }); const indirimPct=parseFloat(document.getElementById('sat-indirim')?document.getElementById('sat-indirim').value:0)||0; const indTutar=ara*indirimPct/100; const araNet=ara-indTutar; const kdv=araNet*0.20; const top=araNet+kdv; function sf(id,v){const e=document.getElementById(id);if(e)e.textContent='₺'+fmt(v)} sf('sat-ara',ara);sf('sat-ind-tutar',indTutar);sf('sat-kdv',kdv);sf('sat-toplam',top); } function renderSatilan(){ const data=DB.get('satislar')||[]; const mst=DB.get('musteriler')||[]; const tb=document.getElementById('tb-satilan');if(!tb)return; if(!data.length){ // Demo veri const demo=[ {id:'SAT-0012',mid:1,tarih:'18.03.2026',urunler:'RAM 8GB DDR4 x1',adet:1,ara:407,kdv:81.4,toplam:488.4,odeme:'Nakit',durum:'Ödendi'}, {id:'SAT-0011',mid:5,tarih:'17.03.2026',urunler:'SSD 256GB NVMe x2',adet:2,ara:1017,kdv:203.4,toplam:1220.4,odeme:'Kart',durum:'Ödendi'}, {id:'SAT-0010',mid:3,tarih:'15.03.2026',urunler:'Laptop Ekran 15.6 x1',adet:1,ara:1017,kdv:203.4,toplam:1220.4,odeme:'Cari',durum:'Bekliyor'}, ]; tb.innerHTML=demo.map(s=>{ const m=mst.find(x=>x.id===s.mid)||{ad:'—',soyad:''}; return ` ${s.id} ${s.tarih} ${m.ad} ${m.soyad} ${s.urunler} ${s.adet} ₺${fmt(s.ara)} ₺${fmt(s.kdv)} ₺${fmt(s.toplam)} ${s.odeme} ${s.durum} `; }).join(''); } } function renderUrunGecmisi(){ const stk=DB.get('stok')||[]; const tb=document.getElementById('tb-sat-gecmis');if(!tb)return; tb.innerHTML=stk.slice(0,6).map(s=>{ const satisAdet=Math.floor(Math.random()*20)+2; const ciro=satisAdet*s.satisF; const maliyet=satisAdet*s.alisF; const kar=ciro-maliyet; const marj=ciro>0?Math.round(kar/ciro*100):0; return ` ${s.ad} ${s.sku} ${satisAdet} ₺${fmt(ciro)} ₺${fmt(maliyet)} ₺${fmt(kar)} %${marj} 15.03.2026 `; }).join(''); } function satilanTab(id,el){ ['sat-liste','sat-gecmis'].forEach(t=>{ const e=document.getElementById(t);if(e)e.classList.toggle('hidden',t!==id); }); document.querySelectorAll('#pg-satilan .tab').forEach(t=>t.classList.remove('on')); if(el) el.classList.add('on'); if(id==='sat-gecmis') renderUrunGecmisi(); } function saveSatis(){ const mid=document.getElementById('sat-musteri').value; if(!mid){showToast('Müşteri seçiniz','err');return} const satislar=DB.get('satislar')||[]; const nid='SAT-'+String(satislar.length+1).padStart(4,'0'); satislar.unshift({id:nid,mid:parseInt(mid),tarih:today(),odeme:document.getElementById('sat-odeme').value,durum:'Ödendi'}); DB.set('satislar',satislar); closeModal('m-satis-ekle'); showToast(nid+' satış kaydedildi','ok'); renderSatilan(); } // ── FATURALAR ── function renderFaturalar(q=''){ const data=DB.get('faturalar')||[]; const mst=DB.get('musteriler')||[]; const durumF=(document.getElementById('fat-durum-f')||{value:''}).value; let topF=0,odeF=0,bekF=0,kdvF=0; data.forEach(f=>{topF+=f.toplam;if(f.durum==='Ödendi')odeF+=f.toplam;else bekF+=f.toplam;kdvF+=f.kdv||0}); function s(id,v){const e=document.getElementById(id);if(e)e.textContent='₺'+fmt(v)} s('fat-toplam-kart',topF);s('fat-odenen',odeF);s('fat-bekleyen',bekF);s('fat-kdv-ay',kdvF); let list=data; if(q) list=list.filter(f=>{ const m=mst.find(x=>x.id===f.mid)||{ad:'',soyad:''}; return f.id.toLowerCase().includes(q.toLowerCase())||(m.ad+' '+m.soyad).toLowerCase().includes(q.toLowerCase()); }); if(durumF) list=list.filter(f=>f.durum===durumF); const tb=document.getElementById('tb-fatura');if(!tb)return; tb.innerHTML=list.map(f=>{ const m=mst.find(x=>x.id===f.mid)||{ad:'—',soyad:''}; const durMap={'Ödendi':'b-green','Bekliyor':'b-yellow','Gecikmiş':'b-red'}; return ` ${f.id} ${m.ad} ${m.soyad} ${f.tarih} ${f.vade} ₺${fmt(f.araT||f.toplam/1.20)} ₺${fmt(f.kdv||f.toplam*0.20/1.20)} ₺${fmt(f.toplam)} ${f.odeme||'—'} ${f.durum}
`; }).join(''); } function renderIrsaliyeler(){ const tb=document.getElementById('tb-irsaliye');if(!tb)return; const mst=DB.get('musteriler')||[]; const demo=[ {id:'IRS-0006',mid:1,tarih:'18.03.2026',kalem:2,adet:2,fat:'Faturalı'}, {id:'IRS-0005',mid:5,tarih:'17.03.2026',kalem:1,adet:2,fat:'Faturalı'}, {id:'IRS-0004',mid:3,tarih:'15.03.2026',kalem:1,adet:1,fat:'Faturasız'}, ]; tb.innerHTML=demo.map(i=>{ const m=mst.find(x=>x.id===i.mid)||{ad:'—',soyad:''}; return ` ${i.id} ${m.ad} ${m.soyad} ${i.tarih} ${i.kalem} ${i.adet} ${i.fat} `; }).join(''); } let fatKalemSayac=0; function addFaturaKalem2(){ fatKalemSayac++; const div=document.createElement('div'); div.id='fk-'+fatKalemSayac; div.style.cssText='display:grid;grid-template-columns:3fr 1fr 1fr 0.5fr 1fr auto;gap:6px;align-items:center'; div.innerHTML=``; document.getElementById('fat-kalem-list').appendChild(div); } function calcFatKalem(n){ const a=parseFloat(document.getElementById('fk-a-'+n).value)||1; const f=parseFloat(document.getElementById('fk-f-'+n).value)||0; const el=document.getElementById('fk-t-'+n);if(el)el.value='₺'+fmt(a*f); calcFatOzet(); } function calcFatOzet(){ let ara=0; document.querySelectorAll('[id^="fk-t-"]').forEach(el=>{ara+=parseFloat(el.value.replace('₺','').replace(/\./g,'').replace(',','.'))||0}); const kdv=ara*0.20;const top=ara+kdv; function sf(id,v){const e=document.getElementById(id);if(e)e.textContent='₺'+fmt(v)} sf('fat2-ara',ara);sf('fat2-kdv',kdv);sf('fat2-toplam',top); } function faturaTab(id,el){ ['fat-liste','fat-irsaliye'].forEach(t=>{const e=document.getElementById(t);if(e)e.classList.toggle('hidden',t!==id)}); document.querySelectorAll('#pg-faturalar .tab').forEach(t=>t.classList.remove('on')); if(el) el.classList.add('on'); if(id==='fat-irsaliye') renderIrsaliyeler(); } function saveFatura(){ const mid=document.getElementById('fat-m').value; if(!mid){showToast('Müşteri seçiniz','err');return} const data=DB.get('faturalar')||[]; const nid='INV-'+String(Date.now()).slice(-6); data.unshift({id:nid,mid:parseInt(mid),tarih:today(),vade:'+30 gün',araT:500,kdv:90,toplam:590,odeme:'Nakit',durum:'Bekliyor'}); DB.set('faturalar',data); closeModal('m-fatura-ekle'); showToast(nid+' faturası oluşturuldu','ok'); renderFaturalar(); } // ── GELİR / GİDER ── let aktifDonem='bugun'; const donemData={ bugun:{gelir:4820,gider:1240,pct:'+18%',gPct:'+5%'}, hafta:{gelir:28400,gider:8960,pct:'+12%',gPct:'+8%'}, ay:{gelir:84600,gider:28400,pct:'+22%',gPct:'+14%'}, yil:{gelir:847200,gider:298600,pct:'+19%',gPct:'+11%'}, }; function ggDonem(d,el){ aktifDonem=d; document.querySelectorAll('#gg-donem-tabs .tab').forEach(t=>t.classList.remove('on')); if(el) el.classList.add('on'); const veri=donemData[d]; function s(id,v){const e=document.getElementById(id);if(e)e.textContent=v} s('gg-gelir-kart','₺'+fmt(veri.gelir)); s('gg-gider-kart','₺'+fmt(veri.gider)); const kar=veri.gelir-veri.gider; s('gg-kar-kart','₺'+fmt(kar)); const marj=veri.gelir>0?Math.round(kar/veri.gelir*100):0; s('gg-gelir-pct',veri.pct);s('gg-gider-pct',veri.gPct); s('gg-marj','Kâr marjı: %'+marj); renderGGChart(d); renderGG(); } function renderGGChart(d){ destroyChart('ch-gg');destroyChart('ch-gider-pie'); const cg=document.getElementById('ch-gg'); const cp=document.getElementById('ch-gider-pie'); if(!cg||!cp)return; const labels={'bugun':['00:00','04:00','08:00','12:00','16:00','20:00'],'hafta':['Pzt','Sal','Çar','Per','Cum','Cmt','Paz'],'ay':['1.Hf','2.Hf','3.Hf','4.Hf'],'yil':['Oca','Şub','Mar','Nis','May','Haz','Tem','Ağu','Eyl','Eki','Kas','Ara']}; const gelirD={'bugun':[0,0,820,1240,1680,1080],'hafta':[3200,4100,5200,3800,6100,4800,1200],'ay':[18400,22600,24800,18800],'yil':[28400,32600,41200,38900,44800,52100,48300,55700,61200,58400,72100,84600]}; const giderD={'bugun':[0,0,120,340,580,200],'hafta':[1200,1600,1900,1400,2100,1500,260],'ay':[5800,7200,8400,7000],'yil':[18200,20400,26800,22100,28900,31400,30200,34100,38400,36700,44200,52300]}; chartInstances['ch-gg']=new Chart(cg,{type:'line',data:{labels:labels[d],datasets:[{label:'Gelir',data:gelirD[d],borderColor:'var(--ok)',backgroundColor:'rgba(46,213,115,.08)',fill:true,tension:.4,pointBackgroundColor:'var(--ok)',pointRadius:3},{label:'Gider',data:giderD[d],borderColor:'var(--danger)',backgroundColor:'rgba(255,71,87,.06)',fill:true,tension:.4,pointBackgroundColor:'var(--danger)',pointRadius:3}]},options:{responsive:true,maintainAspectRatio:false,plugins:{legend:{labels:{color:'#7ea8d4',font:{size:10}}}},scales:{x:{ticks:{color:'#7ea8d4',font:{size:9}},grid:{color:'rgba(90,143,212,.06)'}},y:{ticks:{color:'#7ea8d4',font:{size:9},callback:v=>'₺'+Math.round(v/1000)+'K'},grid:{color:'rgba(90,143,212,.06)'}}}}}); chartInstances['ch-gider-pie']=new Chart(cp,{type:'doughnut',data:{labels:['Maaş','Kira','Malzeme','Elektrik/Su','Diğer'],datasets:[{data:[45,18,22,8,7],backgroundColor:['#a78bfa','#f472b6','#ff6b35','#2dd4bf','#7ea8d4'],borderWidth:0,hoverOffset:5}]},options:{responsive:true,maintainAspectRatio:false,cutout:'60%',plugins:{legend:{position:'right',labels:{color:'#7ea8d4',font:{size:9},padding:8,boxWidth:10}}}}}); } function renderGG(){ const gg=DB.get('gelir_gider')||[]; const q=(document.getElementById('gg-search')||{value:''}).value.toLowerCase(); const turF=(document.getElementById('gg-tur-f')||{value:''}).value; const katF=(document.getElementById('gg-kat-f')||{value:''}).value; let list=gg; if(q) list=list.filter(g=>g.aciklama.toLowerCase().includes(q)||(g.musteri||'').toLowerCase().includes(q)); if(turF) list=list.filter(g=>g.tur===turF); if(katF) list=list.filter(g=>g.kat===katF); const tb=document.getElementById('tb-gg');if(!tb)return; if(!list.length){tb.innerHTML='Kayıt bulunamadı';return} tb.innerHTML=list.map(g=>` ${g.tarih} ${g.tur==='Gelir'?'⬆ Gelir':'⬇ Gider'} ${g.kat} ${g.aciklama} ${g.musteri||'—'} ₺${fmt(g.tutar)} ₺${fmt(g.kdv||0)} ₺${fmt(g.toplam)} ${g.yontem} `).join(''); } function calcGGKdv(){ const tutar=parseFloat(document.getElementById('gg-tutar').value)||0; const oran=parseFloat(document.getElementById('gg-kdv-oran').value)||0; const kdvT=tutar*oran/100; const topT=tutar+kdvT; const k=document.getElementById('gg-kdv-tutar');if(k)k.value='₺'+fmt(kdvT); const t=document.getElementById('gg-toplam-i');if(t)t.value='₺'+fmt(topT); } function saveGG(){ const tutar=parseFloat(document.getElementById('gg-tutar').value)||0; if(!tutar){showToast('Tutar giriniz','err');return} const gg=DB.get('gelir_gider')||[]; const oran=parseFloat(document.getElementById('gg-kdv-oran').value)||0; const kdvT=tutar*oran/100; gg.unshift({tarih:today(),tur:document.getElementById('gg-tur-i').value,kat:document.getElementById('gg-kat-i').value,aciklama:document.getElementById('gg-aciklama-i').value,musteri:document.getElementById('gg-kaynak').value,tutar,kdv:kdvT,toplam:tutar+kdvT,yontem:document.getElementById('gg-yontem').value}); DB.set('gelir_gider',gg); closeModal('m-gg-ekle');showToast('İşlem kaydedildi','ok'); renderGG();ggDonem(aktifDonem,null); } // ── NAV HOOK (Etap 4) ── const _e4nav=window.nav; window.nav=function(page){ _e4nav(page); if(page==='tedarikciler'){renderTedarikciler()} if(page==='stok'){renderStokListe();renderStokKartlar()} if(page==='satilan'){initStokForms();renderSatilan()} if(page==='faturalar'){initStokForms();renderFaturalar()} if(page==='gelir-gider'){setTimeout(()=>ggDonem('bugun',document.querySelector('#gg-donem-tabs .tab')),100);renderGG()} }; // Modal açma hook const _e4openModal=openModal; openModal=function(id){ _e4openModal(id); if(id==='m-satis-ekle') initSatisForm(); if(id==='m-stok-ekle') initStokForms(); if(id==='m-fatura-ekle'){initStokForms();if(!document.getElementById('fat-kalem-list').children.length){addFaturaKalem2();const d=new Date();document.getElementById('fat-tarih2').value=d.toISOString().split('T')[0]}} }; /* ══════════════════════════════════════════════════════ ETAP 5 — MÜŞTERİ / SMS / HATIRLATICI / RAPORLAR / PERSONEL / AYARLAR ══════════════════════════════════════════════════════ */ // ── MÜŞTERİ LİSTESİ ── function renderMusteriler(){ const mst=DB.get('musteriler')||[]; const srv=DB.get('servisler')||[]; const q=(document.getElementById('mst-search')||{value:''}).value.toLowerCase(); const tipF=(document.getElementById('mst-tip-f')||{value:''}).value; let list=mst; if(q) list=list.filter(m=>(m.ad+' '+m.soyad).toLowerCase().includes(q)||m.tc.includes(q)||(m.tel||'').includes(q)||(m.email||'').toLowerCase().includes(q)); if(tipF) list=list.filter(m=>m.tip===tipF); const cEl=document.getElementById('mst-count');if(cEl)cEl.textContent=mst.length; const bEl=document.getElementById('borclu-count');if(bEl)bEl.textContent=mst.filter(m=>m.bakiye<0).length; const lEl=document.getElementById('mst-count-lbl');if(lEl)lEl.textContent=list.length+' müşteri'; const tb=document.getElementById('tb-mst');if(!tb)return; tb.innerHTML=list.map(m=>{ const srvSay=srv.filter(s=>s.mid===m.id).length; const bak=m.bakiye||0; const sonSrv=srv.find(s=>s.mid===m.id); return ` ${m.id} ${m.ad} ${m.soyad} ${m.tc} ${m.tel} ${m.email||'—'} ${m.tip} ${srvSay} ${bak<0?'-':''}₺${fmt(Math.abs(bak))} ${sonSrv?sonSrv.tarih:'—'}
`; }).join(''); } function renderBorcluMusteriler(){ const mst=(DB.get('musteriler')||[]).filter(m=>m.bakiye<0); const tb=document.getElementById('tb-mst-borclu');if(!tb)return; tb.innerHTML=mst.map(m=>` ${m.ad} ${m.soyad} ${m.tel} ₺${fmt(Math.abs(m.bakiye||0))} ${m.vade||30} gün ₺${fmt(m.limit||5000)} —
`).join(''); } function mstTab(id,el){ ['mst-tumü','mst-borclu'].forEach(t=>{const e=document.getElementById(t);if(e)e.classList.toggle('hidden',t!==id)}); document.querySelectorAll('#mst-tabs .tab').forEach(t=>t.classList.remove('on')); if(el) el.classList.add('on'); if(id==='mst-borclu') renderBorcluMusteriler(); } function goMusteri(id){ const m=(DB.get('musteriler')||[]).find(x=>x.id===id); if(!m) return; // Başlık const isimEl=document.getElementById('md-isim');if(isimEl)isimEl.textContent=m.ad+' '+m.soyad; const altEl=document.getElementById('md-alt');if(altEl)altEl.textContent='TC: '+m.tc+' | '+m.tel; // Bilgi kutusu function s(eid,v){const e=document.getElementById(eid);if(e)e.textContent=v} s('md-ad',m.ad+' '+m.soyad);s('md-tc',m.tc);s('md-tel',m.tel); s('md-email',m.email||'—'); const tbEl=document.getElementById('md-tip-badge'); if(tbEl) tbEl.innerHTML=`${m.tip}`; s('md-kayit','12.01.2024'); const srv=(DB.get('servisler')||[]).filter(x=>x.mid===id); s('md-srv-count',srv.length+' servis'); // Cari const bak=m.bakiye||0; const bakEl=document.getElementById('md-bakiye-txt'); if(bakEl){bakEl.textContent=(bak<0?'-':'')+'₺'+fmt(Math.abs(bak));bakEl.className='bal-amount '+(bak<0?'red':'green')} s('md-limit-txt','₺'+fmt(m.limit||5000));s('md-vade-txt',(m.vade||30)+' gün'); const barEl=document.getElementById('md-limit-bar'); if(barEl){const pct=m.limit?Math.min(100,Math.abs(bak)/m.limit*100):0;barEl.style.width=pct+'%'} // SMS alıcı const saEl=document.getElementById('sms-alici');if(saEl)saEl.value=m.tel; // Ödeme al const oaEl=document.getElementById('oa-musteri');if(oaEl)oaEl.value=m.ad+' '+m.soyad; const otEl=document.getElementById('oa-tutar');if(otEl)otEl.value=Math.abs(bak)||''; // Sekmeli tablolar renderMDCihazlar(id);renderMDUrunler(id);renderMDOdemeler(id); nav('musteri-detay'); } function openModalMusteri(id){ const m=(DB.get('musteriler')||[]).find(x=>x.id===id); if(!m) return; document.getElementById('mu-ad').value=m.ad; document.getElementById('mu-soyad').value=m.soyad; document.getElementById('mu-tel').value=m.tel; document.getElementById('mu-email').value=m.email||''; document.getElementById('mu-adres').value=m.adres||''; document.getElementById('mu-limit').value=m.limit||5000; document.getElementById('mu-vade').value=m.vade||30; openModal('m-musteri-duzenle'); } function saveMusteriDuzenle(){ showToast('Müşteri bilgileri güncellendi','ok'); closeModal('m-musteri-duzenle'); } function mdTab(id,el){ ['md-cihazlar','md-urunler','md-odemeler'].forEach(t=>{const e=document.getElementById(t);if(e)e.classList.toggle('hidden',t!==id)}); document.querySelectorAll('#pg-musteri-detay .tab').forEach(t=>t.classList.remove('on')); if(el) el.classList.add('on'); } function renderMDCihazlar(mid){ const srv=(DB.get('servisler')||[]).filter(s=>s.mid===mid); const tb=document.getElementById('tb-md-cihaz');if(!tb)return; if(!srv.length){tb.innerHTML='Servis kaydı yok';return} tb.innerHTML=srv.map(s=>` ${s.id} ${s.cihaz} ${s.ariza} ${s.tarih} ${statusBadge[s.durum]||s.durum} ${s.gercekUcret?'₺'+fmt(s.gercekUcret):s.tahmUcret?'~₺'+fmt(s.tahmUcret):'—'} `).join(''); } function renderMDUrunler(mid){ const tb=document.getElementById('tb-md-urun');if(!tb)return; // Demo tb.innerHTML=`15.03.2026HP Güç Adaptörü 65W1₺280,00₺280,0008.03.2026RAM 8GB DDR41₺480,00₺480,00`; } function renderMDOdemeler(mid){ const tb=document.getElementById('tb-md-odeme');if(!tb)return; const mst=(DB.get('musteriler')||[]).find(m=>m.id===mid)||{bakiye:0}; const bak=mst.bakiye||0; tb.innerHTML=` 18.03.2026BorçSRV-2048 HP Laptop Tamiri₺796,50—-₺${fmt(Math.abs(bak))} 05.03.2026ÖdemeNakit Ödeme—₺953,50₺0,00`; } function saveOdemeAl(){ const tutar=parseFloat(document.getElementById('oa-tutar').value)||0; const yon=document.getElementById('oa-yontem').value; showToast('₺'+fmt(tutar)+' – '+yon+' ödeme alındı. Fiş oluşturuldu!','ok'); closeModal('m-odeme-al'); } // ── CARİ HESAP ── function renderCari(q=''){ const mst=DB.get('musteriler')||[]; const list=q?mst.filter(m=>(m.ad+' '+m.soyad).toLowerCase().includes(q.toLowerCase())):mst; let alacakT=0,borcluSayi=0,maxBak=0; mst.forEach(m=>{if(m.bakiye<0){alacakT+=Math.abs(m.bakiye);borcluSayi++;if(Math.abs(m.bakiye)>maxBak)maxBak=Math.abs(m.bakiye)}}); function s(id,v){const e=document.getElementById(id);if(e)e.textContent=v} s('cari-alacak','₺'+fmt(alacakT));s('cari-borclu-sayi',borcluSayi+' müşteri'); s('cari-max','₺'+fmt(maxBak));s('cari-tahsilat','₺'+fmt(4820)); const tb=document.getElementById('tb-cari');if(!tb)return; tb.innerHTML=list.map(m=>{ const bak=m.bakiye||0; const alacak=bak<0?Math.abs(bak):0; const pct=m.limit?Math.min(100,alacak/m.limit*100):0; return ` ${m.ad} ${m.soyad} ${m.tel} ${m.tip} ${alacak?'₺'+fmt(alacak):'—'} ₺0,00 ${bak<0?'-':''}₺${fmt(Math.abs(bak))} ₺${fmt(m.limit||5000)} ${m.vade||30}${bak<0?'Borçlu':'Bakiyesiz'}
`; }).join(''); } // ── TOPLU SMS ── function updateSMSGrup(sel){ const v=parseInt(sel.value)||0; const e1=document.getElementById('sms-gonder-sayi');if(e1)e1.textContent=v; const e2=document.getElementById('sms-kredi-kullan');if(e2)e2.textContent=v; } function fillSMSSablon(){ const v=(document.getElementById('sms-sablon')||{value:''}).value; const el=document.getElementById('sms-metin-toplu'); if(el&&v){el.value=v;updateSMSChar()} } function updateSMSChar(){ const el=document.getElementById('sms-metin-toplu'); const cnt=document.getElementById('sms-char-count'); if(el&&cnt) cnt.textContent=el.value.length; } function topluSMSGonder(){ const m=(document.getElementById('sms-metin-toplu')||{value:''}).value.trim(); const g=parseInt((document.getElementById('sms-grup')||{value:'0'}).value)||0; const tek=(document.getElementById('sms-tekno')||{value:''}).value.trim(); if(!m){showToast('SMS metni giriniz','err');return} if(!g&&!tek){showToast('Hedef grup veya numara giriniz','err');return} const sayi=g||tek.split(',').length; const log=DB.get('sms_log')||[]; log.unshift({id:log.length+1,tarih:new Date().toLocaleString('tr-TR').replace(',',' '),hedef:g?document.getElementById('sms-grup').selectedOptions[0].text:tek,mesaj:m.substring(0,40)+'…',sayi,durum:'İletildi'}); DB.set('sms_log',log); showToast(sayi+' kişiye SMS gönderildi!','ok'); renderSMSLog(); document.getElementById('sms-metin-toplu').value='';updateSMSChar(); } function renderSMSLog(){ const log=DB.get('sms_log')||[]; const tb=document.getElementById('tb-sms-log');if(!tb)return; if(!log.length){tb.innerHTML='SMS gönderim geçmişi yok';return} tb.innerHTML=log.map(l=>` ${l.tarih} ${l.hedef} ${l.mesaj} ${l.sayi} ${l.durum} `).join(''); } // ── ÖDEME BİLDİRİMİ ── function renderOdemeBildirim(){ const mst=(DB.get('musteriler')||[]).filter(m=>m.bakiye<0); const tb=document.getElementById('tb-ob');if(!tb)return; if(!mst.length){tb.innerHTML='Bekleyen ödeme yok';return} tb.innerHTML=mst.map(m=>{ const gec=Math.floor(Math.random()*20); return ` ${m.ad} ${m.soyad} ₺${fmt(Math.abs(m.bakiye))} 01.03.2026 ${gec} gün SMS ${gec>0?'10.03.2026':'—'} Bekliyor `; }).join(''); } // ── HATIRLATICI ── function renderHatirlaticilar(){ const data=DB.get('hatirlatici')||[]; const aktif=data.filter(h=>!h.tamam); const tamam=data.filter(h=>h.tamam); const sayiEl=document.getElementById('hat-aktif-sayi');if(sayiEl)sayiEl.textContent=aktif.length; const lblEl=document.getElementById('hat-count-lbl');if(lblEl)lblEl.textContent=aktif.length+' aktif, '+tamam.length+' tamamlanan'; const onMap={'Normal':'b-blue','Yüksek':'b-orange','Kritik':'b-red'}; const renderItem=(h,showComplete)=>`
${h.baslik} ${h.oncelik}
${h.aciklama?`

${h.aciklama}

`:''}
${h.tarih} ${h.personel||'Tüm Ekip'}
${!h.tamam?``:''}
`; const aktifList=document.getElementById('hat-aktif'); if(aktifList) aktifList.innerHTML=aktif.length?aktif.map(h=>renderItem(h)).join(''):'
Aktif hatırlatıcı yok
'; const tamamList=document.getElementById('hat-tamam'); if(tamamList) tamamList.innerHTML=tamam.length?tamam.map(h=>renderItem(h)).join(''):'
Tamamlanan yok
'; } function _localSaveHatirlatici_DISABLED(){ const baslik=(document.getElementById('hat-baslik')||{value:''}).value.trim(); if(!baslik){showToast('Başlık giriniz','err');return} const data=DB.get('hatirlatici')||[]; const nid=Math.max(...data.map(h=>h.id),0)+1; data.push({id:nid,baslik,aciklama:(document.getElementById('hat-aciklama')||{value:''}).value,tarih:(document.getElementById('hat-tarih')||{value:''}).value||today()+' 09:00',oncelik:(document.getElementById('hat-oncelik')||{value:'Normal'}).value,personel:(document.getElementById('hat-personel-sel')||{value:'Tüm Ekip'}).value,tamam:false}); DB.set('hatirlatici',data); document.getElementById('hat-baslik').value=''; document.getElementById('hat-aciklama').value=''; showToast(baslik+' eklendi','ok'); renderHatirlaticilar(); } function tamamlaHatirlatici(id){ const data=DB.get('hatirlatici')||[]; const idx=data.findIndex(h=>h.id===id);if(idx<0)return; data[idx].tamam=true;DB.set('hatirlatici',data); showToast('Tamamlandı olarak işaretlendi','ok');renderHatirlaticilar(); } function silHatirlatici(id){ let data=DB.get('hatirlatici')||[]; data=data.filter(h=>h.id!==id);DB.set('hatirlatici',data); showToast('Hatırlatıcı silindi','warn');renderHatirlaticilar(); } function hatTab(id,el){ ['hat-aktif','hat-tamam'].forEach(t=>{const e=document.getElementById(t);if(e)e.classList.toggle('hidden',t!==id)}); document.querySelectorAll('#hat-tabs .tab').forEach(t=>t.classList.remove('on')); if(el) el.classList.add('on'); } // ── RAPORLAR ── function rapTab(id,el){ const allIds=['rap-personel','rap-karzarar','rap-kazanc','rap-urun','rap-cihaz','rap-sms','rap-gunluk']; allIds.forEach(t=>{const e=document.getElementById(t);if(e)e.classList.toggle('hidden',t!==id)}); document.querySelectorAll('#rap-tabs .tab').forEach(t=>t.classList.remove('on')); if(el)el.classList.add('on'); if(id==='rap-karzarar') renderKZChart(); if(id==='rap-kazanc') renderKazancChart(); if(id==='rap-gunluk') renderGunlukRapor(); renderRaporTablo(id); } function renderRaporTablo(id){ const per=DB.get('personel')||[]; const srv=DB.get('servisler')||[]; const stk=DB.get('stok')||[]; const gg=DB.get('gelir_gider')||[]; if(id==='rap-personel'){ const tb=document.getElementById('tb-rap-per');if(!tb)return; tb.innerHTML=per.map(p=>` ${p.ad}${p.rol} ${p.tamam||0} ${p.aktif||0} ${(Math.random()*3+1).toFixed(1)} gün ₺${fmt(Math.floor(Math.random()*50000)+10000)} Mart 2026 `).join(''); } if(id==='rap-urun'){ const tb=document.getElementById('tb-rap-ur');if(!tb)return; tb.innerHTML=stk.slice(0,6).map(s=>{ const adet=Math.floor(Math.random()*15)+2; const ciro=adet*s.satisF;const mal=adet*s.alisF;const kar=ciro-mal; const marj=ciro>0?Math.round(kar/ciro*100):0; return `${s.ad}${s.sku}${adet}₺${fmt(mal)}₺${fmt(ciro)}₺${fmt(kar)}%${marj}`; }).join(''); } if(id==='rap-cihaz'){ const tb=document.getElementById('tb-rap-ci');if(!tb)return; const cihazlar=['Dizüstü Bilgisayar','Masaüstü Bilgisayar','Cep Telefonu','Yazıcı','Tablet']; const arizalar=['Güç sorunu','Ekran arızası','Klavye bozukluğu','Performans','Batarya']; tb.innerHTML=cihazlar.map((c,i)=>` ${c} ${Math.floor(Math.random()*40)+5} ${(Math.random()*5+1).toFixed(1)} gün ₺${fmt(Math.floor(Math.random()*500)+200)} ${arizalar[i]} %${Math.floor(Math.random()*20)+5} `).join(''); } if(id==='rap-sms'){ const tb=document.getElementById('tb-rap-sms');if(!tb)return; const log=DB.get('sms_log')||[]; tb.innerHTML=log.map(l=>` ${l.tarih}${l.hedef} ${l.sayi}${l.sayi}0 ${l.sayi}₺${fmt(l.sayi*0.07)} `).join(''); } } function renderKZChart(){ destroyChart('ch-kz'); const c=document.getElementById('ch-kz');if(!c)return; const gg=DB.get('gelir_gider')||[]; const totalG=gg.filter(x=>x.tur==='Gelir').reduce((a,b)=>a+b.toplam,0)||124800; const totalGider=gg.filter(x=>x.tur==='Gider').reduce((a,b)=>a+b.toplam,0)||48600; const brut=totalG-totalGider;const kdv=totalG*0.1667;const net=brut-kdv;const marj=Math.round(net/totalG*100); function s(id,v){const e=document.getElementById(id);if(e)e.textContent='₺'+fmt(v)} s('kz-gelir',totalG);s('kz-gider',totalGider);s('kz-brut',brut);s('kz-kdv',kdv);s('kz-net',net); const mEl=document.getElementById('kz-marj');if(mEl)mEl.textContent='%'+marj; const months=['Oca','Şub','Mar']; const gData=[28400,32600,41200];const giderD=[18200,20400,26800]; chartInstances['ch-kz']=new Chart(c,{type:'bar',data:{labels:months,datasets:[{label:'Gelir',data:gData,backgroundColor:'rgba(46,213,115,.7)',borderRadius:4},{label:'Gider',data:giderD,backgroundColor:'rgba(255,71,87,.6)',borderRadius:4}]},options:{responsive:true,maintainAspectRatio:false,plugins:{legend:{labels:{color:'#7ea8d4',font:{size:10}}}},scales:{x:{ticks:{color:'#7ea8d4',font:{size:9}},grid:{color:'rgba(90,143,212,.06)'}},y:{ticks:{color:'#7ea8d4',font:{size:9},callback:v=>'₺'+Math.round(v/1000)+'K'},grid:{color:'rgba(90,143,212,.06)'}}}}}); // Tablo const tb=document.getElementById('tb-rap-kz');if(!tb)return; const rows=[['Ocak 2026',28400,18200],[' Şubat 2026',32600,20400],['Mart 2026',41200,26800]]; tb.innerHTML=rows.map(r=>{const k=r[1]-r[2];const m=Math.round(k/r[1]*100);return `${r[0]}₺${fmt(r[1])}₺${fmt(r[2])}₺${fmt(k)}₺${fmt(r[1]*0.1667)}₺${fmt(k-r[1]*0.1667)}%${m}`}).join(''); } function renderKazancChart(){ destroyChart('ch-kazanc'); const c=document.getElementById('ch-kazanc');if(!c)return; const months=['Oca','Şub','Mar','Nis','May','Haz','Tem','Ağu','Eyl','Eki','Kas','Ara']; const sData=[18400,22600,28800,26900,32800,38100,34300,41700,47200,44400,58100,70600]; const uData=[10000,10000,12400,12000,12000,14000,14000,14000,14000,14000,14000,14000]; chartInstances['ch-kazanc']=new Chart(c,{type:'line',data:{labels:months,datasets:[{label:'Servis Geliri',data:sData,borderColor:'var(--ac)',backgroundColor:'rgba(0,212,255,.08)',fill:true,tension:.4,pointRadius:3},{label:'Ürün Satışı',data:uData,borderColor:'var(--gold)',backgroundColor:'rgba(245,200,66,.06)',fill:true,tension:.4,pointRadius:3}]},options:{responsive:true,maintainAspectRatio:false,plugins:{legend:{labels:{color:'#7ea8d4',font:{size:10}}}},scales:{x:{ticks:{color:'#7ea8d4',font:{size:9}},grid:{color:'rgba(90,143,212,.06)'}},y:{ticks:{color:'#7ea8d4',font:{size:9},callback:v=>'₺'+Math.round(v/1000)+'K'},grid:{color:'rgba(90,143,212,.06)'}}}}}); const tb=document.getElementById('tb-rap-ka');if(!tb)return; tb.innerHTML=months.slice(0,3).map((m,i)=>{ const s=sData[i];const u=uData[i];const t=s+u;const prev=i>0?sData[i-1]+uData[i-1]:t;const fark=t-prev; return `${m} 2026₺${fmt(s)}₺${fmt(u)}₺${fmt(t)}${fark>=0?'+':''}₺${fmt(fark)}${fark>=0?'↑':'↓'}`; }).join(''); } function renderGunlukRapor(){ const srv=DB.get('servisler')||[]; const gg=DB.get('gelir_gider')||[]; const bugunSrv=srv.filter(s=>s.tarih===today()); const bugunGelir=gg.filter(g=>g.tarih===today()&&g.tur==='Gelir').reduce((a,b)=>a+b.toplam,0); const bugunGider=gg.filter(g=>g.tarih===today()&&g.tur==='Gider').reduce((a,b)=>a+b.toplam,0); function s(id,v){const e=document.getElementById(id);if(e)e.textContent=v} s('gun-kabul',bugunSrv.filter(s=>s.durum==='Kabul Edildi').length||6); s('gun-teslim',bugunSrv.filter(s=>s.durum==='Teslim Edildi').length||4); s('gun-gelir','₺'+fmt(bugunGelir||4820)); s('gun-gider','₺'+fmt(bugunGider||1240)); const tb=document.getElementById('tb-rap-gun');if(!tb)return; tb.innerHTML=` 09:05Servis KabulCan ÖztürkMehmet KayaHP Laptop 15s— 10:30ÖdemeZeynep KayaMehmet KayaSRV-2048₺810,00 11:45TamirdeMehmet DemirAyşe DemirDell XPS 15— 14:00TeslimCan ÖztürkAli ÇelikSamsung S22₺1.200,00 15:30SatışZeynep KayaHasan YıldızRAM 8GB DDR4₺480,00`; } function loadRaporlar(){ const aktif=document.querySelector('#rap-tabs .tab.on'); if(aktif) aktif.click(); showToast('Raporlar filtrelendi','ok'); } // ── PERSONEL ── function renderPersonel(){ const per=DB.get('personel')||[]; const tb=document.getElementById('tb-personel');if(!tb)return; const rolBadge={'Süper Admin':'b-red','Yönetici':'b-orange','Teknisyen':'b-blue','Muhasebe':'b-purple','Satış Elemanı':'b-teal'}; tb.innerHTML=per.map(p=>`
${p.ad.split(' ').map(x=>x[0]).join('').slice(0,2)}
${p.ad}
${p.rol} ${p.email} ${p.tel} ${(p.izinler||[]).join(', ')} ${p.aktif||0} ${p.tamam||0} Aktif
`).join(''); } function savePersonel(){ const ad=(document.getElementById('per-ad')||{value:''}).value.trim(); if(!ad){showToast('Ad Soyad giriniz','err');return} const per=DB.get('personel')||[]; const nid=Math.max(...per.map(p=>p.id),0)+1; per.push({id:nid,ad,rol:(document.getElementById('per-rol')||{value:'Teknisyen'}).value,email:(document.getElementById('per-email')||{value:''}).value,tel:(document.getElementById('per-tel')||{value:''}).value,izinler:['servis'],aktif:0,tamam:0}); DB.set('personel',per); closeModal('m-personel-ekle'); showToast(ad+' personele eklendi','ok'); renderPersonel(); } // ── AYARLAR ── function ayarTab(id,el){ ['ayar-firma','ayar-servis','ayar-fatura','ayar-sms','ayar-bildirim','ayar-guvenlik'].forEach(t=>{const e=document.getElementById(t);if(e)e.classList.toggle('hidden',t!==id)}); document.querySelectorAll('#ayar-tabs .tab').forEach(t=>t.classList.remove('on')); if(el) el.classList.add('on'); } // ── NAV HOOK (Etap 5) ── const _e5nav=window.nav; window.nav=function(page){ _e5nav(page); if(page==='musteriler'){renderMusteriler()} if(page==='cari'){renderCari()} if(page==='sms'){renderSMSLog()} if(page==='odeme-bildirim'){renderOdemeBildirim()} if(page==='hatirlatici'){renderHatirlaticilar()} if(page==='raporlar'){setTimeout(()=>{renderRaporTablo('rap-personel')},100)} if(page==='personel'){renderPersonel()} }; /* ══════════════════════════════════════════════════════ ETAP 6 — MÜŞTERİ PANELİ JS (TAM) ══════════════════════════════════════════════════════ */ // ── MÜŞTERİ PANELİ INIT ── function initCustPanel(){ const tc=document.getElementById('c-tcno')?document.getElementById('c-tcno').value:'12345678901'; // Demo müşteri: TC 12345678901 → Mehmet Kaya renderCustServisler(); renderCustUrunler(); renderCustHareketler(); // Bugünün tarihini doldur const today_=new Date().toISOString().split('T')[0]; const obT=document.getElementById('ob-tarih');if(obT)obT.value=today_; } // ── SERVİS KARTLARI ── function renderCustServisler(){ const srv=DB.get('servisler')||[]; const mySrv=srv.filter(s=>s.mid===1); // Demo: Mehmet Kaya müşteri ID=1 const aktif=mySrv.filter(s=>!['Teslim Edildi','İptal'].includes(s.durum)); const bitti=mySrv.filter(s=>s.durum==='Teslim Edildi'); const el1=document.getElementById('cust-aktif-srv');if(el1)el1.textContent=aktif.length||2; const el2=document.getElementById('cust-done-srv');if(el2)el2.textContent=bitti.length||8; const container=document.getElementById('cust-srv-cards'); if(!container)return; const renk={'Beklemede':'var(--muted)','Kabul Edildi':'var(--ac)','İncelemede':'var(--ac3)','Tamir Bekliyor':'var(--gold)','Tamirde':'var(--purple)','Parça Bekleniyor':'var(--pink)','Hazır':'var(--ok)','Teslim Edildi':'var(--teal)','İptal':'var(--danger)'}; // Demo servis kartları (gerçek veri yoksa demo göster) const demoSrv=[ {id:'SRV-2048',cihaz:'HP Laptop 15s',marka:'HP',model:'15s-eq2',seriNo:'5CG9481YAB',ariza:'Açılmıyor, güç sorunu',durum:'Hazır',tarih:'15.03.2026',tahmUcret:796.50,notM:'Cihazınız hazır, teslim alabilirsiniz.',fotograflar:['📷','📷']}, {id:'SRV-2041',cihaz:'Samsung Galaxy S22',marka:'Samsung',model:'S22 Ultra',seriNo:'35112340001',ariza:'Ekran cam kırık',durum:'Tamirde',tarih:'08.03.2026',tahmUcret:1200,notM:'Cam değişimi devam ediyor.',fotograflar:['📷']} ]; const listSrv=mySrv.length?mySrv:demoSrv; container.innerHTML=listSrv.map(s=>`
${s.id} ${s.cihaz} ${s.marka} ${s.model||''} ${statusBadge[s.durum]||s.durum}
${s.tarih}
Seri No
${s.seriNo||'—'}
Arıza
${s.ariza}
${s.notM?`
Teknisyen Notu
${s.notM}
`:''}
${(s.fotograflar||[]).length?``:''}
${s.durum}
`).join(''); } function renderCustUrunler(){ const tb=document.getElementById('tb-cust-urun');if(!tb)return; tb.innerHTML=` 18.03.2026HP Güç Adaptörü 65W1280,00 TL280,00 TL 10.03.2026RAM 8GB DDR41480,00 TL480,00 TL 05.02.2026Isı Macunu Arctic145,00 TL45,00 TL`; } function renderCustHareketler(){ const tb=document.getElementById('tb-cust-har');if(!tb)return; const filter=(document.getElementById('ch-filter')||{value:''}).value; const hareketler=[ {tarih:'18.03.2026',aciklama:'SRV-2048 HP Laptop Tamir Ücreti',tur:'Borclu',borc:'810,00 TL',alacak:'—',bakiye:'-2.450,00 TL',bak_neg:true}, {tarih:'14.03.2026',aciklama:'RAM 8GB + Adaptör Satışı',tur:'Borclu',borc:'760,00 TL',alacak:'—',bakiye:'-1.653,50 TL',bak_neg:true}, {tarih:'10.03.2026',aciklama:'Nakit Ödeme',tur:'Odeme',borc:'—',alacak:'953,50 TL',bakiye:'0,00 TL',bak_neg:false}, {tarih:'05.03.2026',aciklama:'SRV-2041 Avans Ödemesi',tur:'Odeme',borc:'—',alacak:'500,00 TL',bakiye:'-953,50 TL',bak_neg:true}, {tarih:'01.03.2026',aciklama:'SRV-2041 Samsung Cam Değişimi',tur:'Borclu',borc:'1.200,00 TL',alacak:'—',bakiye:'-1.453,50 TL',bak_neg:true}, ]; const list=filter?hareketler.filter(h=>h.tur===filter):hareketler; tb.innerHTML=list.map(h=>` ${h.tarih} ${h.aciklama} ${h.tur==='Borclu'?'Borç':'Ödeme'} ${h.borc} ${h.alacak} ${h.bakiye} `).join(''); } // ── ÖDEME BİLDİRİMİ ── function custOdemeBildir(){ const tutar=document.getElementById('ob-tutar')?document.getElementById('ob-tutar').value:''; const banka=document.getElementById('ob-banka')?document.getElementById('ob-banka').value:''; if(!tutar||!banka){showToast('Tutar ve banka seçiniz','err');return} showToast('Ödeme bildirimi gönderildi! En kısa sürede onaylanacak.','ok'); } function copyIBAN(iban){ if(navigator.clipboard) navigator.clipboard.writeText(iban).then(()=>showToast('IBAN kopyalandı!','ok')).catch(()=>showToast('IBAN: '+iban,'info')); else showToast('IBAN: '+iban,'info'); } // ── ONLINE ÖDEME ── function formatKartNo(input){ let v=input.value.replace(/\D/g,'').substring(0,16); input.value=v.replace(/(.{4})/g,'$1 ').trim(); // Kart tipi ikonu const ico=document.getElementById('kart-tip-icon'); if(ico){if(v[0]==='4')ico.textContent='💳';else if(['51','52','53','54','55'].some(p=>v.startsWith(p)))ico.textContent='💳';else ico.textContent=''} } function formatExp(input){ let v=input.value.replace(/\D/g,''); if(v.length>=2) v=v.substring(0,2)+'/'+v.substring(2,4); input.value=v; } function calcTaksit(){ const t=parseInt((document.getElementById('kart-taksit')||{value:'1'}).value)||1; const baz=2450; const pct={1:0,2:1,3:2,6:4,9:7,12:10}[t]||0; const fark=baz*pct/100; const toplam=baz+fark; const aylik=toplam/t; const fEl=document.getElementById('taksit-fark');if(fEl)fEl.textContent=fark.toLocaleString('tr-TR',{minimumFractionDigits:2})+' TL'; const tEl=document.getElementById('taksit-toplam');if(tEl)tEl.textContent=toplam.toLocaleString('tr-TR',{minimumFractionDigits:2})+' TL'; const dEl=document.getElementById('taksit-detay');if(dEl)dEl.textContent=t===1?'Tek seferlik ödeme':t+' x '+aylik.toLocaleString('tr-TR',{minimumFractionDigits:2})+' TL'; } function custOnlineOdeme(){ const ad=(document.getElementById('kart-ad')||{value:''}).value.trim(); const no=(document.getElementById('kart-no')||{value:''}).value.replace(/\s/g,''); const exp=(document.getElementById('kart-exp')||{value:''}).value; const cvv=(document.getElementById('kart-cvv')||{value:''}).value; if(!ad||no.length<16||!exp||cvv.length<3){showToast('Kart bilgilerini eksiksiz giriniz','err');return} showToast('Ödeme işleniyor…','info'); setTimeout(()=>showToast('Ödemeniz başarıyla alındı! Fiş oluşturuldu.','ok'),1500); } // ── PROFİL ── function custProfilKaydet(){ const ad=(document.getElementById('cp-ad')||{value:''}).value.trim(); if(!ad){showToast('Ad giriniz','err');return} showToast('Profil bilgileri güncellendi','ok'); // Sidebar ismi güncelle const custNm=document.getElementById('cust-uname');if(custNm)custNm.textContent=ad+' '+((document.getElementById('cp-soyad')||{value:''}).value||''); } function sifreGuc(val){ const bars=[document.getElementById('sg1'),document.getElementById('sg2'),document.getElementById('sg3'),document.getElementById('sg4')]; const guc=val.length>=8?(val.match(/[A-Z]/)?1:0)+(val.match(/[0-9]/)?1:0)+(val.match(/[^A-Za-z0-9]/)?1:0)+1:val.length>0?1:0; const renkler=['var(--danger)','var(--warn)','var(--gold)','var(--ok)']; bars.forEach((b,i)=>{if(b)b.style.background=i{const e=document.getElementById(id);if(e)e.value=''}); } // ── SÖZLEŞME ── function sozlesmeIndir(){ const onay=document.getElementById('sozlesme-onay'); if(!onay||!onay.checked){showToast('Önce sözleşmeyi onaylayınız','warn');return} showToast('Sözleşme PDF indiriliyor…','ok'); } // ── MÜŞTERİ PANEL NAV ── function cNav(id){ document.querySelectorAll('.cust-page').forEach(p=>p.classList.remove('on')); document.querySelectorAll('.cust-nav-item').forEach(n=>n.classList.remove('on')); const pg=document.getElementById(id);if(pg)pg.classList.add('on'); if(event&&event.currentTarget) event.currentTarget.classList.add('on'); if(id==='c-hareketler') renderCustHareketler(); if(id==='c-servisler') renderCustServisler(); } // ── loginCust OVERRIDE (tam init) ── const _origLoginCust=loginCust; loginCust=function(){ const tc=document.getElementById('c-tcno').value.trim(); const p=document.getElementById('c-pass').value.trim(); if(!tc||!p){showToast('TC No ve şifre giriniz','err');return} if(tc!=='12345678901'||p!=='1234'){showToast('TC No veya şifre hatalı','err');return} show('login-page',false);show('admin-panel',false);show('cust-panel',true); document.getElementById('cust-uname').textContent='Mehmet Kaya'; initCustPanel(); showToast('Müşteri paneline hoşgeldiniz, Mehmet Bey 👋','ok'); }; /* ══════════════════════════════════════════════════════ FINAL — GENEL KONTROL & İNİT ══════════════════════════════════════════════════════ */ // Otomatik hatırlatıcı kontrol (sayfa yüklendikten sonra) function checkHatirlaticilar(){ const data=DB.get('hatirlatici')||[]; const now=new Date(); data.filter(h=>!h.tamam).forEach(h=>{ if(!h.tarih) return; const tarih=new Date(h.tarih.replace(/\./g,'-').replace(' ','T')); const diff=(tarih-now)/1000/60; // dakika if(diff>0&&diff<=30){ showToast('⏰ Hatırlatıcı: '+h.baslik+' ('+h.tarih+')','warn'); } }); } // Dashboard'dan Müşteri Detayına git function goDetay(id){window.nav('cihaz-detay');setTimeout(()=>loadCihazDetay(id),80)} /* ══════════════════════════════════════════════════════ YENİ ÖZELLİKLER — TAKVİM, DIŞ SERVİS, ADMİN PROFİL ══════════════════════════════════════════════════════ */ // ── TAKVİM MOTORU ── let calYear=new Date().getFullYear(); let calMonth=new Date().getMonth(); // 0-indexed const TR_MONTHS=['Ocak','Şubat','Mart','Nisan','Mayıs','Haziran','Temmuz','Ağustos','Eylül','Ekim','Kasım','Aralık']; function calPrev(){calMonth--;if(calMonth<0){calMonth=11;calYear--}renderCalendar()} function calNext(){calMonth++;if(calMonth>11){calMonth=0;calYear++}renderCalendar()} function calToday(){calYear=new Date().getFullYear();calMonth=new Date().getMonth();renderCalendar()} function getCalEvents(){ const srv=DB.get('servisler')||[]; const etkinlikler=DB.get('etkinlikler')||[]; const events={}; // Servis kayıtları → tarihe göre grupla srv.forEach(s=>{ const tarih=s.disTarih||s.tarih; if(!tarih)return; // Tarih formatı: dd.MM.yyyy const parts=tarih.split('.'); if(parts.length<3)return; const key=parts[2]+'-'+parts[1]+'-'+parts[0]; // yyyy-MM-dd if(!events[key])events[key]=[]; events[key].push({ tip: s.servisYeri==='Dış Servis'?'dis-servis':'servis', renk: s.servisYeri==='Dış Servis'?'var(--ac3)':'var(--ac)', baslik: (s.sistemTur||s.cihaz||s.id), alt: s.durum, saat: s.disSaat||'', id: s.id, tur: 'servis' }); }); // Manuel etkinlikler etkinlikler.forEach(e=>{ if(!e.tarih)return; if(!events[e.tarih])events[e.tarih]=[]; events[e.tarih].push({ tip: e.tur||'manuel', renk: e.renk||'var(--purple)', baslik: e.baslik, alt: e.saat+(e.bitisSaat?' – '+e.bitisSaat:''), saat: e.saat||'', id: e.id, tur: 'etkinlik' }); }); return events; } function renderCalendar(){ const titleEl=document.getElementById('cal-title'); if(titleEl) titleEl.textContent=TR_MONTHS[calMonth]+' '+calYear; const grid=document.getElementById('cal-grid'); if(!grid)return; const events=getCalEvents(); const today=new Date(); const todayKey=today.getFullYear()+'-'+String(today.getMonth()+1).padStart(2,'0')+'-'+String(today.getDate()).padStart(2,'0'); // Ayın 1. günü haftanın kaçıncı günü (Pazartesi=0) const firstDay=new Date(calYear,calMonth,1); let startOffset=firstDay.getDay()-1; if(startOffset<0)startOffset=6; // Pazar→6 const daysInMonth=new Date(calYear,calMonth+1,0).getDate(); const daysInPrevMonth=new Date(calYear,calMonth,0).getDate(); let html=''; // Önceki ayın son günleri (soluk) for(let i=startOffset-1;i>=0;i--){ const d=daysInPrevMonth-i; html+=`
${d}
`; } // Bu ayın günleri for(let d=1;d<=daysInMonth;d++){ const key=calYear+'-'+String(calMonth+1).padStart(2,'0')+'-'+String(d).padStart(2,'0'); const isToday=(key===todayKey); const evs=events[key]||[]; const hasSrv=evs.some(e=>e.tur==='servis'); const hasEtk=evs.some(e=>e.tur==='etkinlik'); const hasDis=evs.some(e=>e.tip==='dis-servis'); // Günün haftanın kaçıncı günü (Cmt/Paz rengi) const dayOfWeek=new Date(calYear,calMonth,d).getDay(); const isSun=dayOfWeek===0; const isSat=dayOfWeek===6; html+=`
${d}
${evs.length?`
${evs.slice(0,3).map(e=>`
`).join('')} ${evs.length>3?`
+
`:''}
`:''}
`; } // Sonraki ayın ilk günleri (tamamlama) const totalCells=startOffset+daysInMonth; const remaining=totalCells%7===0?0:7-(totalCells%7); for(let d=1;d<=remaining;d++){ html+=`
${d}
`; } grid.innerHTML=html; // Özet kartlar güncelle updateCalStats(); renderCalUpcoming(); } function showCalDay(key,day){ const events=getCalEvents(); const evs=events[key]||[]; const panel=document.getElementById('cal-day-events'); const titleEl=document.getElementById('cal-day-title'); const listEl=document.getElementById('cal-day-list'); if(!panel||!titleEl||!listEl)return; // Tarih formatla const parts=key.split('-'); titleEl.textContent=day+' '+TR_MONTHS[parseInt(parts[1])-1]+' '+parts[0]; if(!evs.length){ listEl.innerHTML=`
Bu güne ait kayıt yok.
`; } else { listEl.innerHTML=evs.map(e=>`
${e.baslik} ${e.saat?`${e.saat}`:''}
${e.alt||''}
${e.tur==='servis'?``:''} ${e.tur==='etkinlik'?``:''}
`).join(''); } panel.style.display='block'; } function updateCalStats(){ const srv=DB.get('servisler')||[]; const etk=DB.get('etkinlikler')||[]; const monthKey=String(calMonth+1).padStart(2,'0'); const yearKey=String(calYear); const aySrv=srv.filter(s=>{ const t=(s.disTarih||s.tarih)||''; const p=t.split('.'); return p.length===3&&p[1]===monthKey&&p[2]===yearKey; }); const ayDis=aySrv.filter(s=>s.servisYeri==='Dış Servis'); const ayDone=aySrv.filter(s=>s.durum==='Teslim Edildi'); const ayEtk=etk.filter(e=>{ const p=(e.tarih||'').split('-'); return p[0]===yearKey&&p[1]===monthKey; }); const todayKey=new Date().toISOString().split('T')[0]; const allEvts=getCalEvents(); const bugunEvts=allEvts[todayKey]||[]; function sc(id,v){const e=document.getElementById(id);if(e)e.textContent=v} sc('cal-srv-ay',aySrv.length);sc('cal-dis-ay',ayDis.length); sc('cal-done-ay',ayDone.length);sc('cal-etkinlik-ay',ayEtk.length); sc('cal-bugun',bugunEvts.length); } function renderCalUpcoming(){ const container=document.getElementById('cal-upcoming'); if(!container)return; const allEvts=getCalEvents(); const now=new Date(); const upcoming=[]; for(let i=0;i<=7;i++){ const d=new Date(now);d.setDate(d.getDate()+i); const key=d.getFullYear()+'-'+String(d.getMonth()+1).padStart(2,'0')+'-'+String(d.getDate()).padStart(2,'0'); const evs=allEvts[key]||[]; evs.forEach(e=>upcoming.push({...e,dateKey:key,dayLabel:i===0?'Bugün':i===1?'Yarın':d.getDate()+' '+TR_MONTHS[d.getMonth()].substring(0,3)})); } if(!upcoming.length){ container.innerHTML='
Yaklaşan etkinlik yok
'; return; } container.innerHTML=upcoming.slice(0,8).map(e=>`
${e.baslik}
${e.dayLabel}${e.saat?' · '+e.saat:''}
${e.tur==='servis'?`Servis`:`Etkinlik`}
`).join(''); } // ── ETKİNLİK KAYDET ── function _localSaveEtkinlik_DISABLED(){ const baslik=document.getElementById('etk-baslik').value.trim(); const tarih=document.getElementById('etk-tarih').value; if(!baslik||!tarih){showToast('Başlık ve tarih zorunlu','err');return} const saat=document.getElementById('etk-saat').value; const bitis=document.getElementById('etk-bitis').value; const tur=document.getElementById('etk-tur').value; const renk=document.getElementById('etk-renk').value; const kisi=document.getElementById('etk-kisi').value; const aciklama=document.getElementById('etk-aciklama').value; const etk=DB.get('etkinlikler')||[]; const nid=Math.max(...etk.map(e=>e.id),0)+1; etk.push({id:nid,baslik,tarih,saat,bitisSaat:bitis,tur,renk,kisi,aciklama}); DB.set('etkinlikler',etk); closeModal('m-etkinlik-ekle'); showToast(baslik+' takvime eklendi','ok'); renderCalendar(); // Formu temizle ['etk-baslik','etk-aciklama'].forEach(id=>{const e=document.getElementById(id);if(e)e.value=''}); } function deleteEtkinlik(id){ if(!confirm('Etkinlik silinecek. Emin misiniz?'))return; let etk=DB.get('etkinlikler')||[]; etk=etk.filter(e=>e.id!==id); DB.set('etkinlikler',etk); showToast('Etkinlik silindi','warn'); renderCalendar(); document.getElementById('cal-day-events').style.display='none'; } // ── DIŞ SERVİS TOGGLE ── let _servisYeri='İç Servis'; function setServisYeri(yer){ _servisYeri=yer; const ic=document.getElementById('srv-yer-ic'); const dis=document.getElementById('srv-yer-dis'); const panel=document.getElementById('dis-servis-panel'); if(ic&&dis&&panel){ if(yer==='Dış Servis'){ ic.style.background='transparent';ic.style.color='var(--muted)'; dis.style.background='var(--n600)';dis.style.color='var(--ac3)'; panel.classList.remove('hidden'); // Bugünün tarihini doldur const today_=new Date().toISOString().split('T')[0]; const dt=document.getElementById('s-dis-tarih');if(dt&&!dt.value)dt.value=today_; } else { ic.style.background='var(--n600)';ic.style.color='var(--ac)'; dis.style.background='transparent';dis.style.color='var(--muted)'; panel.classList.add('hidden'); } } } // ── SERVİS FORM - SİSTEM DEĞİŞİNCE KALIP GÜNCELLE ── function updateKaliplar(){ const sistem=document.getElementById('s-cihaz-tur')?document.getElementById('s-cihaz-tur').value:''; const kSel=document.getElementById('kalip-sel');if(!kSel)return; const klAll=DB.get('kaliplar')||[]; // Sisteme uygun kalıpları önce göster const katMap={ 'Güvenlik Kamerası':'Güvenlik','Alarm':'Güvenlik','Yangın':'Yangın', 'Geçiş Kontrol':'Geçiş Kontrol','Network':'Network','Fiber':'Network', 'Elektrik':'Elektrik','UPS':'Elektrik','Zayıf Akım':'Zayıf Akım', 'Bakım':'Bakım','Keşif':'Keşif' }; let kat=''; for(const [k,v] of Object.entries(katMap)){if(sistem.includes(k)){kat=v;break}} const filtered=kat?klAll.filter(k=>k.kat===kat):klAll; const rest=kat?klAll.filter(k=>k.kat!==kat):[]; kSel.innerHTML=''+ filtered.map(k=>``).join('')+ (rest.length?''+rest.map(k=>``).join(''):''); } // ── saveServis GÜNCELLEMESİ - servisYeri + sistem alanları ── const _origSaveServis=saveServis; saveServis=function(doPrint=true){ // servisYeri ekle const srv=DB.get('servisler')||[]; // Geçici override: sonraki kayıtta kullan _tempServisYeri=_servisYeri; _origSaveServis(doPrint); }; let _tempServisYeri='İç Servis'; // saveServis'in içinde kullanmak için hook const _origSaveServisInner=window.saveServis; window.saveServis=function(doPrint=true){ const ad=document.getElementById('s-ad')?document.getElementById('s-ad').value.trim():''; const ariza=document.getElementById('s-ariza')?document.getElementById('s-ariza').value.trim():''; if(!ad){showToast('Müşteri adı giriniz','err');return} if(!ariza){showToast('İş/Arıza açıklaması giriniz','err');return} const srv=DB.get('servisler')||[]; const nid='SRV-'+srvCounter++; const mid=parseInt(document.getElementById('s-mid')?document.getElementById('s-mid').value:0)||null; const sistemTur=document.getElementById('s-cihaz-tur')?document.getElementById('s-cihaz-tur').value:''; const hizmetTur=document.getElementById('s-tip')?document.getElementById('s-tip').value:''; const disAdres=document.getElementById('s-dis-adres')?document.getElementById('s-dis-adres').value:''; const disTarih=document.getElementById('s-dis-tarih')?document.getElementById('s-dis-tarih').value:''; const disSaat=document.getElementById('s-dis-saat')?document.getElementById('s-dis-saat').value:''; srv.unshift({ id:nid,mid, sistemTur,hizmetTur, cihaz:sistemTur, marka:document.getElementById('s-marka')?document.getElementById('s-marka').value:'', model:document.getElementById('s-model')?document.getElementById('s-model').value:'', seriNo:document.getElementById('s-sno')?document.getElementById('s-sno').value:'', ariza, personel:document.getElementById('s-personel')?document.getElementById('s-personel').value:'', durum:document.getElementById('s-durum')?document.getElementById('s-durum').value:'Kabul Edildi', tarih:today(), tahmUcret:parseFloat(document.getElementById('s-ucret')?document.getElementById('s-ucret').value:0)||0, gercekUcret:0, oncelik:document.getElementById('s-oncelik')?document.getElementById('s-oncelik').value:'Normal', servisYeri:_servisYeri, disAdres,disTarih,disSaat, sozlesmeNo:document.getElementById('s-sozlesme')?document.getElementById('s-sozlesme').value:'', notM:document.getElementById('s-not-m')?document.getElementById('s-not-m').value:'', notY:document.getElementById('s-not-y')?document.getElementById('s-not-y').value:'', parcalar:[],fotograflar:[] }); DB.set('servisler',srv); // Dış servis ise takvime de ekle if(_servisYeri==='Dış Servis'&&disTarih){ const etk=DB.get('etkinlikler')||[]; const eid=Math.max(...etk.map(e=>e.id),0)+1; etk.push({id:eid,baslik:sistemTur+' – '+ad,tarih:disTarih,saat:disSaat,tur:'dis-servis',renk:'var(--ac3)',kisi:document.getElementById('s-personel')?document.getElementById('s-personel').value:'',aciklama:disAdres+' | '+ariza}); DB.set('etkinlikler',etk); } showToast(nid+' başarıyla kaydedildi!','ok'); if(doPrint) setTimeout(()=>printBilgiFisiFor(nid),300); resetServisForm(); nav('arizali'); }; // ── ADMİN PROFİL KAYDET ── function _localSaveAdminProfil_DISABLED(){ const ad=document.getElementById('adm-ad').value.trim(); const soyad=document.getElementById('adm-soyad').value.trim(); const email=document.getElementById('adm-email').value.trim(); const kullanici=document.getElementById('adm-kullanici').value.trim(); const eski=document.getElementById('adm-eski-sifre').value; const yeni=document.getElementById('adm-yeni-sifre').value; const tekrar=document.getElementById('adm-tekrar-sifre').value; const ini=document.getElementById('adm-inisiyaller').value.trim().toUpperCase().substring(0,2); if(!ad||!email){showToast('Ad ve e-posta zorunlu','err');return} if(yeni&¥i!==tekrar){showToast('Şifreler eşleşmiyor','err');return} if(yeni&¥i.length<4){showToast('Şifre en az 4 karakter olmalı','err');return} // UI güncelle const uname=document.getElementById('sb-uname');if(uname)uname.textContent=ad+' '+soyad; const uav=document.getElementById('sb-uav-txt');if(uav)uav.textContent=ini||ad.substring(0,2).toUpperCase(); // Admin email localStorage'a kaydet DB.set('admin_profil',{ad,soyad,email,kullanici,inisiyaller:ini}); if(yeni) DB.set('admin_sifre',yeni); closeModal('m-admin-profil'); showToast('Profil güncellendi! Değişiklikler kaydedildi.','ok'); } // Admin profili yükle function loadAdminProfil(){ const profil=DB.get('admin_profil'); if(!profil)return; const fields=['ad','soyad','email','kullanici','inisiyaller']; const ids={ad:'adm-ad',soyad:'adm-soyad',email:'adm-email',kullanici:'adm-kullanici',inisiyaller:'adm-inisiyaller'}; fields.forEach(f=>{const el=document.getElementById(ids[f]);if(el&&profil[f])el.value=profil[f]}); const uname=document.getElementById('sb-uname');if(uname&&profil.ad)uname.textContent=profil.ad+' '+profil.soyad; const uav=document.getElementById('sb-uav-txt');if(uav&&profil.inisiyaller)uav.textContent=profil.inisiyaller; } // ── DASHBOARD NAV HOOK ── const _finalNav=window.nav; window.nav=function(page){ _finalNav(page); if(page==='dashboard'){ setTimeout(()=>{renderCalendar()},150); } if(page==='servis-kayit'){ // Takvim için default tarih const today_=new Date().toISOString().split('T')[0]; const dt=document.getElementById('s-dis-tarih');if(dt&&!dt.value)dt.value=today_; // Servis yeri reset setServisYeri('İç Servis'); } }; // ── SEED ETKİNLİKLER ── function seedEtkinlikler(){ if(DB.get('etkinlikler'))return; DB.set('etkinlikler',[ {id:1,baslik:'Garanti Bankası - Kamera Sistemi Bakımı',tarih:'2026-03-20',saat:'10:30',bitisSaat:'12:00',tur:'dis-servis',renk:'var(--ac3)',kisi:'Mehmet Demir',aciklama:'Ataşehir Şube - 8 kamera bakımı'}, {id:2,baslik:'Tedarikçi Toplantısı - TechParts',tarih:'2026-03-22',saat:'14:00',bitisSaat:'15:30',tur:'toplanti',renk:'var(--ac)',kisi:'Ahmet Yılmaz',aciklama:'Fiyat görüşmesi, yeni ürün tanıtımı'}, {id:3,baslik:'İstanbul Plaza - Yangın Alarm Keşfi',tarih:'2026-03-25',saat:'09:00',bitisSaat:'11:00',tur:'ziyaret',renk:'var(--danger)',kisi:'Elif Şahin',aciklama:'Beşiktaş - 6 katlı bina keşif + teklif'}, {id:4,baslik:'Parça Alımı - Elektronik Çarşı',tarih:'2026-03-19',saat:'11:00',bitisSaat:'12:30',tur:'satin-alma',renk:'var(--ok)',kisi:'Can Öztürk',aciklama:'Switch, ağ kablosu, kamera aparatı'}, {id:5,baslik:'Güvenlik Sistem Eğitimi',tarih:'2026-03-28',saat:'09:00',bitisSaat:'17:00',tur:'egitim',renk:'var(--pink)',kisi:'Tüm Ekip',aciklama:'Hikvision sertifikasyon eğitimi'}, ]); } window.addEventListener('DOMContentLoaded',()=>{ const d=document.getElementById('dash-dt');if(d)d.textContent=todayStr(); setTimeout(checkHatirlaticilar, 3000); setInterval(checkHatirlaticilar, 300000); seedEtkinlikler(); seedTeklifler(); loadAdminProfil(); setTimeout(()=>{ if(document.getElementById('pg-dashboard').classList.contains('on')){ renderCalendar(); } },400); const etkTarih=document.getElementById('etk-tarih'); if(etkTarih){const t=new Date().toISOString().split('T')[0];etkTarih.value=t;} updateNbTeklif(); }); /* ════════════════════════════════════════════════════════ TEKLİF YÖNETİMİ — TAM JS ════════════════════════════════════════════════════════ */ // ── SEED TEKLİFLER ── function seedTeklifler(){ if(DB.get('teklifler')) return; DB.set('teklifler',[ {id:'TEK-2601',mid:1,konu:'Güvenlik Kamerası Sistemi Kurulumu - 16 Kanal',hazirlayan:'Ahmet Yılmaz',tarih:'10.03.2026',gecerlilik:'10.04.2026',kalemler:[{aciklama:'IP Kamera Hikvision DS-2CD2143G2-I',adet:16,birim:'Adet',fiyat:1800,toplam:28800},{aciklama:'NVR Kayıt Cihazı 16 Kanal',adet:1,birim:'Adet',fiyat:8500,toplam:8500},{aciklama:'HDD 4TB Depolama',adet:2,birim:'Adet',fiyat:2200,toplam:4400},{aciklama:'Kablo + Aksesuvar Seti',adet:1,birim:'Seti',fiyat:3500,toplam:3500},{aciklama:'İşçilik ve Montaj',adet:1,birim:'Seti',fiyat:6000,toplam:6000}],indTip:'pct',indVal:5,odemeKosul:'%30 Avans, %70 Teslimde',teslimat:'10-15 İş Günü',garanti:'1 Yıl',notlar:'Tüm kameralar POE enjektörlü olacaktır. Kablolama duvar içinden yapılacaktır.',durum:'Gönderildi'}, {id:'TEK-2600',mid:3,konu:'Network Altyapısı Yenileme - 3 Kat',hazirlayan:'Mehmet Demir',tarih:'05.03.2026',gecerlilik:'05.04.2026',kalemler:[{aciklama:'Cisco Catalyst 2960 24 Port Switch',adet:3,birim:'Adet',fiyat:12000,toplam:36000},{aciklama:'Patch Panel + Raf Donanımı',adet:3,birim:'Takım',fiyat:2500,toplam:7500},{aciklama:'Cat6A Kablo (305m)',adet:2,birim:'Kutu',fiyat:1800,toplam:3600},{aciklama:'Kablolama + Montaj İşçilik',adet:1,birim:'Seti',fiyat:8000,toplam:8000}],indTip:'tl',indVal:2000,odemeKosul:'%50 Avans, Kalan Teslimde',teslimat:'5-7 İş Günü',garanti:'1 Yıl',notlar:'',durum:'Onaylandı'}, {id:'TEK-2599',mid:5,konu:'Yangın Alarm Sistemi Kurulumu',hazirlayan:'Ahmet Yılmaz',tarih:'01.03.2026',gecerlilik:'01.04.2026',kalemler:[{aciklama:'Bosch FPA-1200 Yangın Alarm Paneli',adet:1,birim:'Adet',fiyat:15000,toplam:15000},{aciklama:'Duman Dedektörü',adet:24,birim:'Adet',fiyat:350,toplam:8400},{aciklama:'Manuel Alarm Butonu',adet:8,birim:'Adet',fiyat:280,toplam:2240},{aciklama:'Alarm Siren + Flaşör',adet:4,birim:'Adet',fiyat:450,toplam:1800},{aciklama:'Montaj + Devreye Alma',adet:1,birim:'Seti',fiyat:7500,toplam:7500}],indTip:'pct',indVal:0,odemeKosul:'Peşin Ödeme',teslimat:'10-15 İş Günü',garanti:'2 Yıl',notlar:'TSE ve BSEN 54 standartlarına uygun.',durum:'Beklemede'}, {id:'TEK-2598',mid:7,konu:'Geçiş Kontrol + Parmak İzi Sistemi',hazirlayan:'Elif Şahin',tarih:'25.02.2026',gecerlilik:'25.03.2026',kalemler:[{aciklama:'ZKTeco ProFace X Biyometrik Okuyucu',adet:4,birim:'Adet',fiyat:4200,toplam:16800},{aciklama:'Elektromanyetik Kilit 600lb',adet:4,birim:'Adet',fiyat:850,toplam:3400},{aciklama:'Çıkış Butonu + Aksesuvar',adet:4,birim:'Takım',fiyat:200,toplam:800},{aciklama:'GÇK Yazılımı ve Lisans',adet:1,birim:'Adet',fiyat:3500,toplam:3500},{aciklama:'Montaj İşçilik',adet:1,birim:'Seti',fiyat:4000,toplam:4000}],indTip:'pct',indVal:0,odemeKosul:'Sözleşmeye Göre',teslimat:'7-10 İş Günü',garanti:'1 Yıl',notlar:'',durum:'Reddedildi'}, {id:'TEK-2597',mid:2,konu:'UPS Sistem Yenileme - Server Odası',hazirlayan:'Ahmet Yılmaz',tarih:'20.02.2026',gecerlilik:'20.03.2026',kalemler:[{aciklama:'APC Smart-UPS 3000VA Online',adet:2,birim:'Adet',fiyat:18000,toplam:36000},{aciklama:'Harici Akü Paketi',adet:2,birim:'Adet',fiyat:5500,toplam:11000},{aciklama:'Eski UPS Demontaj',adet:1,birim:'İş',fiyat:1500,toplam:1500},{aciklama:'Kurulum + Devreye Alma',adet:1,birim:'Seti',fiyat:3000,toplam:3000}],indTip:'tl',indVal:3000,odemeKosul:'Peşin Ödeme',teslimat:'3-5 İş Günü',garanti:'2 Yıl',notlar:'Teslimatta şebeke testi yapılacaktır.',durum:'Onaylandı'}, ]); } // ── TEKLIF HESAPLAMA ── let tkKalemSayac=0; function addTeklifKalem(data){ tkKalemSayac++; const n=tkKalemSayac; const div=document.createElement('div'); div.id='tk-row-'+n; div.style.cssText='display:grid;grid-template-columns:3fr 0.8fr 1fr 1fr auto;gap:6px;align-items:center'; div.innerHTML=` `; document.getElementById('tk-kalemler').appendChild(div); } function calcTeklifKalemTop(n){ const adetStr=(document.getElementById('tk-ad-'+n)||{value:'1'}).value; const adet=parseFloat(adetStr)||1; const fiyat=parseFloat((document.getElementById('tk-fp-'+n)||{value:'0'}).value)||0; const top=adet*fiyat; const el=document.getElementById('tk-ft-'+n); if(el) el.value='₺'+fmt(top); return top; } function calcTeklifOzet(){ let ara=0; document.querySelectorAll('[id^="tk-ft-"]').forEach(el=>{ ara+=parseFloat(el.value.replace('₺','').replace(/\./g,'').replace(',','.'))||0; }); const indTip=(document.getElementById('tk-ind-tip')||{value:'pct'}).value; const indVal=parseFloat((document.getElementById('tk-ind-val')||{value:'0'}).value)||0; const indTutar=indTip==='pct'?ara*indVal/100:indVal; const indAra=ara-indTutar; const kdv=indAra*0.20; const top=indAra+kdv; function sf(id,v){const e=document.getElementById(id);if(e)e.textContent='₺'+fmt(v)} sf('tk-ara-top',ara);sf('tk-ind-tutar',indTutar);sf('tk-ind-ara',indAra);sf('tk-kdv-g',kdv);sf('tk-genel-top',top); } // ── TEKLİF KAYDET ── let tkSayac=2602; function _localSaveTeklif_DISABLED(durum){ const mid=parseInt((document.getElementById('tk-musteri')||{value:0}).value)||null; const konu=(document.getElementById('tk-konu')||{value:''}).value.trim(); if(!konu){showToast('Teklif konusu giriniz','err');return} const tarih=(document.getElementById('tk-tarih')||{value:today()}).value||today(); const gecerlilik=(document.getElementById('tk-gecerlilik')||{value:''}).value; const kalemler=[]; document.querySelectorAll('[id^="tk-row-"]').forEach(row=>{ const n=row.id.replace('tk-row-',''); const ac=(document.getElementById('tk-ac-'+n)||{value:''}).value; if(!ac) return; const adStr=(document.getElementById('tk-ad-'+n)||{value:'1 Adet'}).value; const fiyat=parseFloat((document.getElementById('tk-fp-'+n)||{value:0}).value)||0; const adetNum=parseFloat(adStr)||1; kalemler.push({aciklama:ac,adet:adetNum,birim:adStr.replace(/[0-9.]/g,'').trim()||'Adet',fiyat,toplam:adetNum*fiyat}); }); const teklifler=DB.get('teklifler')||[]; const nid='TEK-'+tkSayac++; teklifler.unshift({ id:nid,mid,konu, hazirlayan:(document.getElementById('tk-hazirlayan')||{value:'Ahmet Yılmaz'}).value, tarih:tarih.includes('.')?tarih:tarih.split('-').reverse().join('.'), gecerlilik:gecerlilik?gecerlilik.split('-').reverse().join('.'):'+30 Gün', kalemler, indTip:(document.getElementById('tk-ind-tip')||{value:'pct'}).value, indVal:parseFloat((document.getElementById('tk-ind-val')||{value:0}).value)||0, odemeKosul:(document.getElementById('tk-odeme-kosul')||{value:'Peşin'}).value, teslimat:(document.getElementById('tk-teslimat')||{value:''}).value, garanti:(document.getElementById('tk-garanti-sure')||{value:''}).value, notlar:(document.getElementById('tk-notlar')||{value:''}).value, durum }); DB.set('teklifler',teklifler); closeModal('m-teklif-olustur'); showToast(nid+' teklif kaydedildi!','ok'); if(durum!=='Taslak') setTimeout(()=>printTeklifById(nid),400); renderTeklifler(); updateNbTeklif(); } // ── TEKLİF RENDER ── function renderTeklifler(){ const teklifler=DB.get('teklifler')||[]; const musteriler=DB.get('musteriler')||[]; const q=(document.getElementById('tk-search')||{value:''}).value.toLowerCase(); const df=(document.getElementById('tk-durum-f')||{value:''}).value; let list=teklifler; if(q) list=list.filter(t=>t.id.toLowerCase().includes(q)||(t.konu||'').toLowerCase().includes(q)); if(df) list=list.filter(t=>t.durum===df); // Özet const toplam=teklifler.length; const bekleyen=teklifler.filter(t=>['Taslak','Gönderildi','Beklemede'].includes(t.durum)).length; const onay=teklifler.filter(t=>t.durum==='Onaylandı').length; const potCiro=teklifler.filter(t=>!['Reddedildi'].includes(t.durum)).reduce((a,t)=>{ const ara=t.kalemler.reduce((s,k)=>s+k.toplam,0); const ind=t.indTip==='pct'?ara*t.indVal/100:t.indVal||0; return a+(ara-ind)*1.20; },0); function s(id,v){const e=document.getElementById(id);if(e)e.textContent=v} s('tk-toplam',toplam);s('tk-bekleyen',bekleyen);s('tk-onay',onay); s('tk-ciro','₺'+fmt(potCiro)); const lbl=document.getElementById('teklif-count-lbl');if(lbl)lbl.textContent=list.length+' teklif'; const tb=document.getElementById('tb-teklifler');if(!tb)return; const durMap={Taslak:'b-gray',Gönderildi:'b-blue',Beklemede:'b-yellow',Onaylandı:'b-green',Reddedildi:'b-red','Süresi Doldu':'b-gray'}; tb.innerHTML=list.map(t=>{ const mst=musteriler.find(m=>m.id===t.mid)||{ad:'—',soyad:''}; const ara=t.kalemler.reduce((s,k)=>s+k.toplam,0); const ind=t.indTip==='pct'?ara*t.indVal/100:t.indVal||0; const araNet=ara-ind;const kdv=araNet*0.20;const top=araNet+kdv; return ` ${t.id} ${mst.ad} ${mst.soyad} ${t.konu||'—'} ${t.hazirlayan||'—'} ${t.tarih} ${t.gecerlilik} ₺${fmt(araNet)} ₺${fmt(kdv)} ₺${fmt(top)} ${t.durum}
`; }).join(''); } function updateNbTeklif(){ const t=DB.get('teklifler')||[]; const bekleyen=t.filter(x=>['Taslak','Gönderildi','Beklemede'].includes(x.durum)).length; const el=document.getElementById('nb-teklif');if(el)el.textContent=bekleyen; } function deleteTeklif(id){ if(!confirm(id+' silinecek. Emin misiniz?'))return; let t=DB.get('teklifler')||[]; t=t.filter(x=>x.id!==id); DB.set('teklifler',t); showToast('Teklif silindi','warn'); renderTeklifler();updateNbTeklif(); } function teklifDurumDegistir(id){ const t=DB.get('teklifler')||[]; const idx=t.findIndex(x=>x.id===id);if(idx<0)return; const secenekler=['Taslak','Gönderildi','Beklemede','Onaylandı','Reddedildi','Süresi Doldu']; const mevcutIdx=secenekler.indexOf(t[idx].durum); const yeni=prompt('Yeni durum seçin (1-6): 1-Taslak 2-Gönderildi 3-Beklemede 4-Onaylandı 5-Reddedildi 6-Süresi Doldu Numara girin:'); if(!yeni)return; const yeniD=secenekler[parseInt(yeni)-1]; if(!yeniD){showToast('Geçersiz seçim','err');return} t[idx].durum=yeniD; DB.set('teklifler',t); showToast(id+' → '+yeniD,'ok'); renderTeklifler();updateNbTeklif(); } // ── TEKLİF GÖRÜNTÜLE ── function viewTeklif(id){ const t=(DB.get('teklifler')||[]).find(x=>x.id===id); if(!t)return; const mst=(DB.get('musteriler')||[]).find(m=>m.id===t.mid)||{ad:'—',soyad:'',tel:'—',adres:'—'}; const ara=t.kalemler.reduce((s,k)=>s+k.toplam,0); const ind=t.indTip==='pct'?ara*t.indVal/100:t.indVal||0; const araNet=ara-ind;const kdv=araNet*0.20;const top=araNet+kdv; const durMap={Taslak:'b-gray',Gönderildi:'b-blue',Beklemede:'b-yellow',Onaylandı:'b-green',Reddedildi:'b-red','Süresi Doldu':'b-gray'}; document.getElementById('td-baslik').textContent=t.id+' — '+t.konu; document.getElementById('td-body').innerHTML=`
${t.konu}
${mst.ad} ${mst.soyad} | ${t.tarih} | Geçerlilik: ${t.gecerlilik}
${t.durum}
${mst.ad} ${mst.soyad}
${mst.tel||'—'}
${t.hazirlayan}
${t.odemeKosul}
${t.kalemler.map((k,i)=>``).join('')}
AçıklamaAdet/BirimBirim FiyatToplam
${k.aciklama}${k.adet} ${k.birim}₺${fmt(k.fiyat)}₺${fmt(k.toplam)}
Ara Toplam:₺${fmt(ara)}
${ind>0?`
İndirim (${t.indTip==='pct'?'%'+t.indVal:'₺'+t.indVal}):-₺${fmt(ind)}
`:''}
KDV (%20):₺${fmt(kdv)}
GENEL TOPLAM:₺${fmt(top)}
${t.notlar?`
${t.notlar}
`:''}`; openModal('m-teklif-detay'); } // ── TEKLİF YAZDIRMA (MARKA'LI ŞABLON) ── function printTeklifById(id){ const t=(DB.get('teklifler')||[]).find(x=>x.id===id); if(!t){showToast('Teklif bulunamadı','err');return} const mst=(DB.get('musteriler')||[]).find(m=>m.id===t.mid)||{ad:'Müşteri',soyad:'',tel:'—',adres:'—'}; const firmaProfil=DB.get('admin_profil')||{}; const firmaAd=DB.get('faturalar')?.length?'BEMA BİLİŞİM':'BEMA BİLİŞİM'; const ara=t.kalemler.reduce((s,k)=>s+k.toplam,0); const ind=t.indTip==='pct'?ara*t.indVal/100:t.indVal||0; const araNet=ara-ind;const kdv=araNet*0.20;const top=araNet+kdv; const html=` Teklif ${t.id}
B
BEMA BİLİŞİM
Güvenlik · Network · Elektrik · Teknik Hizmetler
Tel: 0212 xxx xx xx | [email protected] | www.bema.com.tr
Teklif Numarası
${t.id}
${t.durum}
Müşteri / Firma${mst.ad} ${mst.soyad}
Telefon${mst.tel||'—'}
Teklif Tarihi${t.tarih}
Geçerlilik${t.gecerlilik}
Teklif Konusu${t.konu}
Hazırlayan${t.hazirlayan}
Teklif Kalemleri
${t.kalemler.map(k=>``).join('')}
Açıklama / Hizmet Miktar Birim Fiyat Tutar
${k.aciklama} ${k.adet} ${k.birim} ₺${fmt(k.fiyat)} ₺${fmt(k.toplam)}
${ind>0?``:''}
Ara Toplam:₺${fmt(ara)}
İndirim (${t.indTip==='pct'?'%'+t.indVal:'₺'+t.indVal}):-₺${fmt(ind)}
İndirimli Tutar:₺${fmt(araNet)}
KDV (%20):₺${fmt(kdv)}
GENEL TOPLAM:₺${fmt(top)}
Teklif Koşulları
Ödeme: ${t.odemeKosul}
Teslimat Süresi: ${t.teslimat}
Garanti: ${t.garanti}
Fiyatlar: KDV hariç belirtilmiş olup %20 KDV ilave edilmiştir.
Geçerlilik: Bu teklif ${t.gecerlilik} tarihine kadar geçerlidir.
${t.notlar?`
Not: ${t.notlar}
`:''}
`; const w=window.open('','_blank','width=900,height=700'); w.document.write(html);w.document.close(); setTimeout(()=>{w.focus();w.print()},600); showToast(t.id+' teklif şablonu açıldı','ok'); } function printTeklif(){ const title=document.getElementById('td-baslik').textContent; const id=title.split(' — ')[0]; closeModal('m-teklif-detay'); setTimeout(()=>printTeklifById(id),200); } function teklifDurumGuncelle(){ const title=document.getElementById('td-baslik').textContent; const id=title.split(' — ')[0]; closeModal('m-teklif-detay'); setTimeout(()=>teklifDurumDegistir(id),100); } // ── TEKLİF FORM INIT ── function initTeklifForm(){ const mst=DB.get('musteriler')||[]; const sel=document.getElementById('tk-musteri'); if(sel) sel.innerHTML=''+mst.map(m=>``).join(''); const today_=new Date().toISOString().split('T')[0]; const tarihEl=document.getElementById('tk-tarih');if(tarihEl&&!tarihEl.value)tarihEl.value=today_; const gecEl=document.getElementById('tk-gecerlilik'); if(gecEl&&!gecEl.value){const d=new Date();d.setDate(d.getDate()+30);gecEl.value=d.toISOString().split('T')[0]} // Kalemler reset const kl=document.getElementById('tk-kalemler');if(kl)kl.innerHTML=''; tkKalemSayac=0; addTeklifKalem();addTeklifKalem();addTeklifKalem(); } /* ════════════════════════════════════════════════════════ SERVİS KABUL FORMU — TAM JS ════════════════════════════════════════════════════════ */ let kfIslemSayac=0; let kfMalzemeSayac=0; function initKabulFormu(){ const srv=DB.get('servisler')||[]; const sel=document.getElementById('kf-srv-sel'); const mst=DB.get('musteriler')||[]; if(sel){ sel.innerHTML=''+ srv.map(s=>{ const m=mst.find(x=>x.id===s.mid)||{ad:'—',soyad:''}; return ``; }).join(''); } const today_=new Date().toISOString().split('T')[0]; const tarihEl=document.getElementById('kf-tarih');if(tarihEl&&!tarihEl.value)tarihEl.value=today_; // Varsayılan 1 işlem satırı if(!document.getElementById('kf-islemler').children.length){ addKFIslem('Sistem incelemesi yapıldı.'); addKFIslem(''); } renderKFPreview(); } function filterDisServisler(val){ const srv=DB.get('servisler')||[]; const mst=DB.get('musteriler')||[]; const sel=document.getElementById('kf-srv-sel'); if(!sel)return; const list=val==='dis'?srv.filter(s=>s.servisYeri==='Dış Servis'):srv; sel.innerHTML=''+ list.map(s=>{ const m=mst.find(x=>x.id===s.mid)||{ad:'—',soyad:''}; const disIcon=s.servisYeri==='Dış Servis'?'🚗 ':''; return ``; }).join(''); } function loadKabulFormu(srvId){ if(!srvId)return; const srv=(DB.get('servisler')||[]).find(s=>s.id===srvId); if(!srv)return; const mst=(DB.get('musteriler')||[]).find(m=>m.id===srv.mid)||{ad:'—',soyad:'',tel:'—',adres:'—'}; function sv(id,v){const e=document.getElementById(id);if(e)e.value=v||''} sv('kf-musteri',mst.ad+' '+mst.soyad); sv('kf-yetkili',''); sv('kf-tel',mst.tel); sv('kf-adres',srv.disAdres||mst.adres||''); sv('kf-srvno',srv.id); sv('kf-sistem',srv.sistemTur||srv.cihaz||''); sv('kf-model',(srv.marka||'')+(srv.model?' – '+srv.model:'')); sv('kf-ariza',srv.ariza||''); sv('kf-notlar',srv.notY||''); // Tarih const tarihEl=document.getElementById('kf-tarih'); if(tarihEl){ const t=srv.disTarih||srv.tarih||new Date().toISOString().split('T')[0]; // dd.mm.yyyy → yyyy-mm-dd if(t.includes('.')){const p=t.split('.');tarihEl.value=p[2]+'-'+p[1]+'-'+p[0]} else tarihEl.value=t; } // İşlemler reset const kfEl=document.getElementById('kf-islemler');if(kfEl)kfEl.innerHTML=''; kfIslemSayac=0; addKFIslem(srv.ariza||'Sistem incelemesi ve arıza tespiti yapıldı.'); addKFIslem(''); // Malzemeler reset const kfMEl=document.getElementById('kf-malzemeler');if(kfMEl)kfMEl.innerHTML=''; kfMalzemeSayac=0; // Parçalar varsa ekle (srv.parcalar||[]).forEach(p=>addKFMalzeme(p.ad||'',p.adet||1,p.fiyat||0)); setTimeout(renderKFPreview,100); } function addKFIslem(defaultText){ kfIslemSayac++; const n=kfIslemSayac; const div=document.createElement('div'); div.id='kfi-'+n; div.style.cssText='display:flex;gap:8px;align-items:center'; div.innerHTML=`
${n}
`; document.getElementById('kf-islemler').appendChild(div); } function addKFMalzeme(ad,adet,fiyat){ kfMalzemeSayac++; const n=kfMalzemeSayac; const div=document.createElement('div'); div.id='kfm-'+n; div.style.cssText='display:grid;grid-template-columns:3fr 0.6fr 1fr 1fr auto;gap:6px;align-items:center'; div.innerHTML=` `; document.getElementById('kf-malzemeler').appendChild(div); if(adet&&fiyat){ const el=document.getElementById('kfm-t-'+n); if(el)el.value='₺'+fmt(adet*fiyat); } const kfMR=document.getElementById('kf-maliyet-row'); if(kfMR)kfMR.style.display='flex'; } function calcKFUcret(){ let malzemeTop=0; document.querySelectorAll('[id^="kfm-"]').forEach(row=>{ if(!row.id.includes('-')) return; const n=row.id.replace('kfm-',''); if(!n.match(/^\d+$/)) return; const q=parseFloat((document.getElementById('kfm-q-'+n)||{value:1}).value)||1; const p=parseFloat((document.getElementById('kfm-p-'+n)||{value:0}).value)||0; const t=q*p; const tEl=document.getElementById('kfm-t-'+n);if(tEl)tEl.value='₺'+fmt(t); malzemeTop+=t; }); // Malzeme ücret alanına yansıt const mucEl=document.getElementById('kf-malzeme-uc');if(mucEl&&malzemeTop>0)mucEl.value=malzemeTop.toFixed(2); const kfMTop=document.getElementById('kf-maliyet-top');if(kfMTop)kfMTop.textContent='₺'+fmt(malzemeTop); // Genel hesap const iscilik=parseFloat((document.getElementById('kf-iscilik')||{value:0}).value)||0; const malzeme=parseFloat((document.getElementById('kf-malzeme-uc')||{value:0}).value)||0; const indirim=parseFloat((document.getElementById('kf-indirim')||{value:0}).value)||0; const ara=iscilik+malzeme-indirim; const kdv=ara*0.20;const top=ara+kdv; function sf(id,v){const e=document.getElementById(id);if(e)e.textContent='₺'+fmt(v)} sf('kf-ara',ara);sf('kf-kdv-tutar',kdv);sf('kf-toplam',top); setTimeout(renderKFPreview,100); } function resetKabulFormu(){ ['kf-musteri','kf-yetkili','kf-tel','kf-adres','kf-srvno','kf-sistem','kf-model','kf-ariza','kf-notlar','kf-oneriler','kf-iscilik','kf-malzeme-uc','kf-indirim'].forEach(id=>{const e=document.getElementById(id);if(e)e.value=''}); document.getElementById('kf-islemler').innerHTML=''; document.getElementById('kf-malzemeler').innerHTML=''; kfIslemSayac=0;kfMalzemeSayac=0; addKFIslem('Sistem incelemesi yapıldı.');addKFIslem(''); calcKFUcret();renderKFPreview(); showToast('Form temizlendi','info'); } function renderKFPreview(){ const preview=document.getElementById('kf-preview');if(!preview)return; const musteri=(document.getElementById('kf-musteri')||{value:''}).value||'Müşteri Adı'; const yetkili=(document.getElementById('kf-yetkili')||{value:''}).value; const tel=(document.getElementById('kf-tel')||{value:''}).value; const adres=(document.getElementById('kf-adres')||{value:''}).value; const srvno=(document.getElementById('kf-srvno')||{value:''}).value; const sistem=(document.getElementById('kf-sistem')||{value:''}).value; const model=(document.getElementById('kf-model')||{value:''}).value; const ariza=(document.getElementById('kf-ariza')||{value:''}).value; const tarih=(document.getElementById('kf-tarih')||{value:''}).value; const tarihStr=tarih?tarih.split('-').reverse().join('.'):today(); const notlar=(document.getElementById('kf-notlar')||{value:''}).value; const oneriler=(document.getElementById('kf-oneriler')||{value:''}).value; const islemler=[]; document.querySelectorAll('[id^="kfi-t-"]').forEach(el=>{if(el.value.trim())islemler.push(el.value.trim())}); const malzemeler=[]; document.querySelectorAll('[id^="kfm-"]').forEach(row=>{ if(!row.id.match(/^kfm-\d+$/))return; const n=row.id.replace('kfm-',''); const a=(document.getElementById('kfm-a-'+n)||{value:''}).value; if(!a)return; const q=(document.getElementById('kfm-q-'+n)||{value:1}).value; const p=(document.getElementById('kfm-p-'+n)||{value:0}).value; malzemeler.push({ad:a,adet:q,fiyat:p}); }); const iscilik=parseFloat((document.getElementById('kf-iscilik')||{value:0}).value)||0; const malzeme=parseFloat((document.getElementById('kf-malzeme-uc')||{value:0}).value)||0; const indirim=parseFloat((document.getElementById('kf-indirim')||{value:0}).value)||0; const ara=iscilik+malzeme-indirim; const kdv=ara*0.20;const top=ara+kdv; preview.innerHTML=`
BEMA BİLİŞİM
Güvenlik · Network · Elektrik · Teknik Hizmetler
SERVİS KABUL FORMU
${srvno||'SRV-XXXX'} | ${tarihStr}
Müşteri / Firma
${musteri}
${yetkili?`
${yetkili}
`:''}
Adres / Lokasyon
${adres||'—'}
${tel?`
Tel: ${tel}
`:''}
Sistem
${sistem||'—'}
${model||''}
Arıza / Talep
${ariza||'—'}
${islemler.length?`
Yapılan İşler
${islemler.map((is,i)=>``).join('')}
${i+1}.${is}
`:''} ${malzemeler.length?`
Kullanılan Malzeme
${malzemeler.map((m,i)=>``).join('')}
MalzemeAdetFiyat
${m.ad}${m.adet}₺${fmt(m.fiyat)}
`:''} ${top>0?`
İşçilik:₺${fmt(iscilik)}
Malzeme:₺${fmt(malzeme)}
KDV (%20):₺${fmt(kdv)}
TOPLAM:₺${fmt(top)}
`:''} ${notlar?`
Not: ${notlar}
`:''} ${oneriler?`
Öneri: ${oneriler}
`:''}
Teknisyen: ___________________
Müşteri Onayı: ___________________
`; } function printKabulFormu(){ const musteri=(document.getElementById('kf-musteri')||{value:''}).value||'Müşteri'; const yetkili=(document.getElementById('kf-yetkili')||{value:''}).value; const tel=(document.getElementById('kf-tel')||{value:''}).value; const adres=(document.getElementById('kf-adres')||{value:''}).value; const srvno=(document.getElementById('kf-srvno')||{value:''}).value; const sistem=(document.getElementById('kf-sistem')||{value:''}).value; const model=(document.getElementById('kf-model')||{value:''}).value; const ariza=(document.getElementById('kf-ariza')||{value:''}).value; const tarih=(document.getElementById('kf-tarih')||{value:''}).value; const tarihStr=tarih?tarih.split('-').reverse().join('.'):today(); const notlar=(document.getElementById('kf-notlar')||{value:''}).value; const oneriler=(document.getElementById('kf-oneriler')||{value:''}).value; const islemler=[]; document.querySelectorAll('[id^="kfi-t-"]').forEach(el=>{if(el.value.trim())islemler.push(el.value.trim())}); const malzemeler=[]; document.querySelectorAll('[id^="kfm-"]').forEach(row=>{ if(!row.id.match(/^kfm-\d+$/))return; const n=row.id.replace('kfm-',''); const a=(document.getElementById('kfm-a-'+n)||{value:''}).value;if(!a)return; const q=parseInt((document.getElementById('kfm-q-'+n)||{value:1}).value)||1; const p=parseFloat((document.getElementById('kfm-p-'+n)||{value:0}).value)||0; malzemeler.push({ad:a,adet:q,fiyat:p,toplam:q*p}); }); const iscilik=parseFloat((document.getElementById('kf-iscilik')||{value:0}).value)||0; const malzemeUc=parseFloat((document.getElementById('kf-malzeme-uc')||{value:0}).value)||0; const indirim=parseFloat((document.getElementById('kf-indirim')||{value:0}).value)||0; const ara=iscilik+malzemeUc-indirim; const kdv=ara*0.20;const top=ara+kdv; const html=` Servis Kabul Formu – ${srvno}
BEMA BİLİŞİM
Güvenlik Sistemleri · Network Altyapı · Elektrik & Zayıf Akım
Tel: 0212 xxx xx xx | [email protected] | Vergi No: 0123456789
SERVİS KABUL FORMU
No: ${srvno||'SRV-XXXX'} | Tarih: ${tarihStr}
Müşteri / Firma
${musteri}
${yetkili?`
Yetkili: ${yetkili}
`:''}
Telefon
${tel||'—'}
Servis Adresi / Lokasyon
${adres||'—'}
Sistem Türü
${sistem||'—'}
${model||''}
Arıza / Talep
${ariza||'—'}
${islemler.length?`
Yapılan İşler ve İşlemler
${islemler.map((is,i)=>``).join('')}
${i+1}.${is}
`:''} ${malzemeler.length?`
Kullanılan Malzeme / Parçalar
${malzemeler.map((m,i)=>``).join('')}
Malzeme / Parça AdıAdetBirim FiyatToplam
${m.ad}${m.adet}₺${fmt(m.fiyat)}₺${fmt(m.toplam)}
`:''} ${top>0?`
İşçilik Ücreti:₺${fmt(iscilik)}
Malzeme Ücreti:₺${fmt(malzemeUc)}
${indirim>0?`
İndirim:-₺${fmt(indirim)}
`:''}
Ara Toplam:₺${fmt(ara)}
KDV (%20):₺${fmt(kdv)}
GENEL TOPLAM:₺${fmt(top)}
`:''} ${notlar?`
Teknisyen Notu: ${notlar}
`:''} ${oneriler?`
Öneri / Uyarı: ${oneriler}
`:''}
Teknisyen Adı Soyadı
İmza
Müşteri Adı Soyadı
İmza / Kaşe
Tarih
${tarihStr}
`; const w=window.open('','_blank','width=900,height=750'); w.document.write(html);w.document.close(); setTimeout(()=>{w.focus();w.print()},600); showToast('Servis kabul formu yazdırma açıldı','ok'); } // ── NAV HOOK GÜNCELLEMESİ ── const _e7nav