Yetkisiz erişim engellidir. Kullanıcı adı ve şifrenizi girin.
Kaydedildi.

Emin misiniz?

Bu işlem geri alınamaz.

'); w.document.close(); showToast('Yeni pencerede açıldı — Ctrl+A ile seçip kopyalayın.','error'); } } function exportProjectsPDF(){ const html = _buildProjectsTableHTML(true); const w = window.open('','_blank'); w.document.write(` Projeler Özet Raporu ${html} `); w.document.close(); } function deleteSummaryItem(id){ DB.summaryItems=DB.summaryItems.filter(i=>i.id!==id); dbSave(); showToast('Kalem silindi.'); renderProjects(document.getElementById('pageContent'),document.getElementById('topbarRight')); } function openProjectModal(projId){ if(!isAdmin)return; const proj=projId?DB.projects.find(p=>p.id===projId):null; const m=document.createElement('div'); m.className='modal-overlay open'; m.id='mProj'; m.innerHTML=``; m.addEventListener('click',e=>{if(e.target===m)m.remove();}); document.getElementById('modals').appendChild(m); } function saveProject(projId){ const name=document.getElementById('mp_name').value.trim(); if(!name){showToast('Proje adı zorunlu!','error');return;} const archived=document.getElementById('mp_archived')?.checked||false; if(projId){ const p=DB.projects.find(p=>p.id===projId); if(p){p.name=name;p.code=document.getElementById('mp_code').value.trim();p.budget=parseFloat(document.getElementById('mp_budget').value)||0;p.archived=archived;} } else DB.projects.push({id:uid(),name,code:document.getElementById('mp_code').value.trim(),budget:parseFloat(document.getElementById('mp_budget').value)||0,archived:false}); dbSave();closeModal('mProj');showToast('Proje kaydedildi.');renderProjects(document.getElementById('pageContent'),document.getElementById('topbarRight')); } // Para birimi → EUR çevirme function toEur(amount, currency){ const n=parseFloat(amount)||0; if(currency==='EUR') return n; if(currency==='USD') return n/(DB.settings.usdRate/DB.settings.eurRate); // USD→EUR via TL parite if(currency==='TL') return n/DB.settings.eurRate; return n; } function fromEur(eurVal, currency){ if(currency==='EUR') return eurVal; if(currency==='USD') return eurVal*(DB.settings.usdRate/DB.settings.eurRate); if(currency==='TL') return eurVal*DB.settings.eurRate; return eurVal; } function siCurChange(field){ // Kullanıcı para birimi değiştirince, mevcut EUR değerini yeni para birimine dönüştür const curSel=document.getElementById(`si_${field}_cur`); const inp=document.getElementById(`si_${field}_inp`); const eurHidden=document.getElementById(`si_${field}_eur`); if(!curSel||!inp||!eurHidden) return; const oldEur=parseFloat(eurHidden.value)||0; if(oldEur>0){ inp.value=(Math.round(fromEur(oldEur,curSel.value)*100)/100)||''; } } function siInpChange(field){ // Kullanıcı tutar girince EUR karşılığını hesapla ve sakla const curSel=document.getElementById(`si_${field}_cur`); const inp=document.getElementById(`si_${field}_inp`); const eurHidden=document.getElementById(`si_${field}_eur`); const eurDisplay=document.getElementById(`si_${field}_eur_display`); if(!curSel||!inp||!eurHidden) return; const eur=toEur(inp.value,curSel.value); eurHidden.value=eur; if(eurDisplay){ if(curSel.value!=='EUR'&&eur>0) eurDisplay.textContent=`= ${fmtEur(eur)}`; else eurDisplay.textContent=''; } } function makeCurField(fieldId, labelText, eurVal, savedCurrency){ const cur=savedCurrency||'EUR'; const dispVal=eurVal?(Math.round(fromEur(eurVal,cur)*100)/100):''; return `
${cur!=='EUR'&&eurVal>0?'= '+fmtEur(eurVal):''}
`; } function openSummaryItemModal(projId,itemId){ if(!isAdmin)return; const item=itemId?DB.summaryItems.find(i=>i.id===itemId):null; const projSel=DB.projects.map(p=>``).join(''); const statusOpts=['SİPARİŞ VERİLMEDİ','TEKLİF AŞAMASINDA','SİPARİŞ VERİLDİ','ATÖLYEDE','SEVK HALİNDE','SAHADA','SEVK EDİLDİ','İPTAL'].map(s=>`${s}`).join(''); const m=document.createElement('div'); m.className='modal-overlay open'; m.id='mSI'; m.innerHTML=``; m.addEventListener('click',e=>{if(e.target===m)m.remove();}); document.getElementById('modals').appendChild(m); } function saveSummaryItem(itemId){ const name=document.getElementById('si_name').value.trim(); if(!name){showToast('Kalem adı zorunlu!','error');return;} // EUR değerlerini hidden inputtan al (zaten hesaplanmış) const budgetEur=parseFloat(document.getElementById('si_budget_eur').value)||0; const actualEur=parseFloat(document.getElementById('si_actual_eur').value)||0; const paidEur=parseFloat(document.getElementById('si_paid_eur').value)||0; const data={ projectId:document.getElementById('si_proj').value,name, status:document.getElementById('si_status').value, brand:document.getElementById('si_brand').value.trim(), budgetEur, actualEur, paidEur, budgetCurrency:document.getElementById('si_budget_cur').value, actualCurrency:document.getElementById('si_actual_cur').value, paidCurrency:document.getElementById('si_paid_cur').value, orderDate:document.getElementById('si_order').value, deliveryDate:document.getElementById('si_delivery').value, shippingDate:document.getElementById('si_ship').value }; if(itemId){const i=DB.summaryItems.find(x=>x.id===itemId);if(i)Object.assign(i,data);} else DB.summaryItems.push({id:uid(),...data}); dbSave();closeModal('mSI');showToast('Kaydedildi.');renderProjects(document.getElementById('pageContent'),document.getElementById('topbarRight')); } // ══════════════════════════════════════════════════ // EQUIPMENT // ══════════════════════════════════════════════════ // Data model: // From Excel (auto): pidNo, equipment, description, main, spare, qty, unit, group, specBrand, specNote // sectionHeader:true rows = T-02/T-03 section dividers // Manual: status, budgetPrice, budgetTotal, actualPrice, actualTotal, // orderDate, deliveryDate, shippingDate, note, brand, model, supplier let eqFilterProj='all', eqFilterGrp='all', eqSearch=''; function renderEquipment(c,tr){ tr.innerHTML=''; // topbar right is empty for equipment page — buttons are in content const adminBtns=isAdmin?` `:''; const projSel=`${DB.projects.map(p=>``).join('')}`; const projItems=DB.equipmentItems.filter(i=>eqFilterProj==='all'||i.projectId===eqFilterProj); const allGroups=[...new Set(projItems.filter(i=>!i.sectionHeader&&i.group).map(i=>(i.group||'').toUpperCase()))].sort(); const grpSel=`${allGroups.map(g=>``).join('')}`; // For search — filter only real items (not section headers) const filtered=projItems.filter(i=>{ if(i.sectionHeader) return eqFilterGrp==='all'; // section headers sadece tüm gruplar modunda if(eqFilterGrp!=='all' && (i.group||'').toUpperCase()!==eqFilterGrp) return false; if(i.sectionHeader) return true; // always keep section headers in their group if(!eqSearch) return true; const q=eqSearch; return i.equipment.toLowerCase().includes(q)|| String(i.pidNo||'').toLowerCase().includes(q)|| String(i.specBrand||'').toLowerCase().includes(q)|| String(i.brand||'').toLowerCase().includes(q)|| String(i.supplier||'').toLowerCase().includes(q)|| String(i.group||'').toLowerCase().includes(q); }); // Count real items (not section headers) for stats const realItems=filtered.filter(i=>!i.sectionHeader); const totB=realItems.reduce((s,i)=>s+(+i.budgetTotal||0),0); const totA=realItems.reduce((s,i)=>s+(+i.actualTotal||0),0); // Group by project, keep original order const projMap={}; filtered.forEach(i=>{ if(!projMap[i.projectId]) projMap[i.projectId]=[]; projMap[i.projectId].push(i); }); // Total columns: Excel(10) + Manual(12) + edit = 23 const C=isAdmin?23:22; let rows=''; Object.keys(projMap).forEach(projId=>{ const proj=getProject(projId); rows+=` ▸ ${escH(proj.name)} `; projMap[projId].forEach(i=>{ if(i.sectionHeader){ // T-02 / T-03 section divider row rows+=` ${escH(i.pidNo||'')}${escH(i.equipment||'')} ${i.specNote?`· ${escH(i.specNote)}`:''} ${isAdmin?``:''} `; return; } // Regular equipment row const overBudget=(+i.actualTotal||0)>(+i.budgetTotal||0)&&(+i.budgetTotal||0)>0; rows+=` ${escH(i.pidNo||'—')}
${escH(i.equipment)}
${i.description?`
${escH(i.description.length>90?i.description.substring(0,90)+'…':i.description)}
`:''} ${i.main||0} ${i.spare||0} ${i.qty||0} ${escH(i.unit||'')} ${escH(i.group||'—')} ${escH(i.specBrand||'—')} ${escH((i.specNote||'').length>60?(i.specNote||'').substring(0,60)+'…':i.specNote||'—')} ${statusBadge(i.status)} ${(+i.budgetPrice||0)?fmtEur(i.budgetPrice):'—'} ${(+i.budgetTotal||0)?fmtEur(i.budgetTotal):'—'} ${(+i.actualPrice||0)?fmtEur(i.actualPrice):'—'} ${(+i.actualTotal||0)?fmtEur(i.actualTotal):'—'} ${fmtDate(i.orderDate)} ${fmtDate(i.deliveryDate)} ${fmtDate(i.shippingDate)} ${escH(i.note||'—')} ${escH(i.brand||'—')} ${escH(i.model||'—')} ${escH(i.supplier||'—')} ${isAdmin?`
`:''} `; }); }); // Two-row header: Excel cols | Manual cols c.innerHTML=`
${adminBtns}
${adminBtns?'
':''}
${eqFilterGrp!=='all'?``:''} ${realItems.length} kalem ${totB?`Hedef: ${fmtEur(totB)}`:''} ${totA?`Gerçekleşen: ${fmtEur(totA)}`:''}
${isAdmin?'':''} ${isAdmin?'':''} ${rows||``}
⬡ EXCELden GELEN — OTOMATIK ✏ MANUEL GİRİŞ
POZ NO EKİPMAN / AÇIKLAMA ASLYDKTOP BİRİM GRUP MARKA (ŞART.) NOT (ŞART.) DURUM H.FİYAT€ H.TUTAR€ G.FİYAT€ G.TUTAR€ SİP.TARİH TESLİM SEVK NOT MARKA MODEL TEDARİKÇİ

Ekipman bulunamadı. Excel yükleyin veya manuel ekleyin.

`; /* placeholder boşluk */ } function exportEquipmentExcel(){ // Hangi proje seçili? const projId = eqFilterProj; // Proje seçili değilse kullanıcıya sor if(projId === 'all'){ const projSel = DB.projects.map(p=>``).join(''); const m=document.createElement('div'); m.className='modal-overlay open'; m.id='mExportSel'; m.innerHTML=``; m.addEventListener('click',e=>{if(e.target===m)m.remove();}); document.getElementById('modals').appendChild(m); return; } doExportEquipExcel(projId); } function doExportEquipExcel(projId){ const proj = DB.projects.find(p=>p.id===projId); const projName = proj ? proj.name : projId; const items = DB.equipmentItems.filter(i=>i.projectId===projId); const today = new Date().toLocaleDateString('tr-TR'); const headers = ['POZ NO','EKİPMAN','AÇIKLAMA','ASIL','YEDEK','TOPLAM','BİRİM','GRUP','MARKA (ŞARTNAME)','NOT (ŞARTNAME)','DURUM','MARKA','MODEL','TEDARİKÇİ']; const NCOLS = headers.length; const dataRows = []; dataRows.push({type:'header', values:headers}); items.forEach(i=>{ if(i.sectionHeader){ dataRows.push({type:'section', values:[(i.pidNo?i.pidNo+' — ':'')+( i.equipment||''),'','','','','','','','','','','','','']}); } else { dataRows.push({type:'data', values:[ i.pidNo||'', i.equipment||'', i.description||'', i.main||0, i.spare||0, i.qty||0, i.unit||'', i.group||'', i.specBrand||'', i.specNote||'', i.status||'', i.brand||'', i.model||'', i.supplier||'' ]}); } }); const ws = {}; ws['!ref'] = XLSX.utils.encode_range({s:{r:0,c:0}, e:{r:dataRows.length-1, c:NCOLS-1}}); dataRows.forEach((row, ri)=>{ row.values.forEach((val, ci)=>{ const addr = XLSX.utils.encode_cell({r:ri, c:ci}); const cell = {v: val, t: typeof val==='number'?'n':'s'}; if(row.type==='header'){ cell.s={font:{bold:true,sz:10},alignment:{horizontal:'center',vertical:'center',wrapText:true}}; } else if(row.type==='section'){ cell.s={font:{bold:true,sz:10},alignment:{horizontal:'left',vertical:'center'}}; } else { const isNum = ci>=3&&ci<=5; cell.s={ font:{sz:10}, alignment:{horizontal:isNum?'center':'left', vertical:'top', wrapText:(ci===2||ci===8||ci===9)} }; if(ci===10) cell.s.font={bold:true,sz:10}; } ws[addr]=cell; }); }); ws['!cols']=[ {wch:12},{wch:24},{wch:34},{wch:6},{wch:6},{wch:7},{wch:7}, {wch:13},{wch:20},{wch:28},{wch:18},{wch:15},{wch:15},{wch:18} ]; ws['!rows']=dataRows.map((row,ri)=>{ if(ri===0) return {hpt:28}; if(row.type==='section') return {hpt:18}; return {hpt:14}; }); ws['!freeze']={xSplit:0,ySplit:1}; const wb=XLSX.utils.book_new(); XLSX.utils.book_append_sheet(wb, ws, projName.substring(0,31)); const infoWs=XLSX.utils.aoa_to_sheet([ ['PROJE', projName], ['TARİH', today], ['HAZIRLAYAN', DB.settings.adminUser||''], ['',''], ['NOT','Bu liste fiyat bilgisi içermemektedir.'] ]); infoWs['!cols']=[{wch:16},{wch:40}]; XLSX.utils.book_append_sheet(wb, infoWs, 'Bilgi'); XLSX.writeFile(wb, `${projName}_Ekipman_${today.replace(/\./g,'-')}.xlsx`); showToast('Excel indirildi.'); } function deleteEquip(id){ DB.equipmentItems=DB.equipmentItems.filter(i=>i.id!==id);dbSave();showToast('Silindi.');renderEquipment(document.getElementById('pageContent'),document.getElementById('topbarRight')); } function openSectionHeaderModal(itemId){ if(!isAdmin) return; const item=DB.equipmentItems.find(i=>i.id===itemId); if(!item) return; const m=document.createElement('div'); m.className='modal-overlay open'; m.id='mSecHdr'; m.innerHTML=``; m.addEventListener('click',e=>{if(e.target===m)m.remove();}); document.getElementById('modals').appendChild(m); } function saveSectionHeader(itemId){ const item=DB.equipmentItems.find(i=>i.id===itemId); if(!item) return; item.pidNo=document.getElementById('shdr_pid').value.trim(); item.equipment=document.getElementById('shdr_name').value.trim()||item.equipment; item.specNote=document.getElementById('shdr_note').value.trim(); if(document.getElementById('shdr_convert').checked){ // Normal ekipman kalemine dönüştür item.sectionHeader=false; item.manualEntry=true; item.main=1; item.spare=0; item.qty=1; item.status=''; item.budgetPrice=0; item.budgetTotal=0; item.actualPrice=0; item.actualTotal=0; item.note=''; item.brand=''; item.model=''; item.supplier=''; showToast('Normal ekipman kalemine dönüştürüldü.'); } else { showToast('Başlık güncellendi.'); } dbSave(); closeModal('mSecHdr'); renderEquipment(document.getElementById('pageContent'),document.getElementById('topbarRight')); } function syncEqScrollbars(){ const top=document.getElementById('eqTopScroll'); const main=document.getElementById('eqMainScroll'); if(!top||!main) return; top.addEventListener('scroll',()=>{ main.scrollLeft=top.scrollLeft; },{passive:true}); main.addEventListener('scroll',()=>{ top.scrollLeft=main.scrollLeft; },{passive:true}); } // renderEquipment çağrıldıktan sonra sync başlat const _origRenderEq=renderEquipment; renderEquipment=function(...args){ _origRenderEq(...args); setTimeout(syncEqScrollbars,50); }; // ── Excel Import ────────────────────────────────── function openExcelImportModal(fileInput){ if(!isAdmin||!fileInput.files[0])return; const file=fileInput.files[0]; fileInput.value=''; const projSel=``+DB.projects.map(p=>``).join(''); const m=document.createElement('div'); m.className='modal-overlay open'; m.id='mExcel'; m.innerHTML=``; m.addEventListener('click',e=>{if(e.target===m)m.remove();}); document.getElementById('modals').appendChild(m); const reader=new FileReader(); reader.onload=e=>{ try{ const wb=XLSX.read(e.target.result,{type:'array',cellDates:true}); const ws=wb.Sheets[wb.SheetNames[0]]; // raw:true to keep numbers as numbers, cellDates for dates const raw=XLSX.utils.sheet_to_json(ws,{header:1,raw:true,defval:null}); window._xlRaw=raw; // Find header row: look for row containing 'EKİPMAN' or 'EQUIPMENT' let hdrIdx=-1; let colMap={}; function normTR(s){ return String(s||'').toUpperCase().replace(/\u00fc/g,'U').replace(/\u00dc/g,'U').replace(/\u011f/g,'G').replace(/\u011e/g,'G').replace(/\u015f/g,'S').replace(/\u015e/g,'S').replace(/\u0131/g,'I').replace(/\u0130/g,'I').replace(/\u00f6/g,'O').replace(/\u00d6/g,'O').replace(/\u00e7/g,'C').replace(/\u00c7/g,'C').trim(); } for(let i=0;ic&&(normTR(c)==='EKIPMAN'||normTR(c)==='EQUIPMENT')); if(found>=0){ hdrIdx=i; // Map column indices from header row.forEach((cell,idx)=>{ if(!cell) return; const cu=String(cell).toUpperCase().trim(); // Türkçe karakter normalize (JavaScript toUpperCase Türkçe-locale bağımlı olabilir) const cuN=cu.replace(/\u00dc/g,'U').replace(/\u011e/g,'G').replace(/\u015e/g,'S').replace(/\u0130/g,'I').replace(/\u00d6/g,'O').replace(/\u00c7/g,'C').replace(/\u0131/g,'I').replace(/\u00fc/g,'U'); if(cuN==='POZ NO'||cuN==='PID NO'||cuN==='KOD'||cuN.includes('POZ')) { if(colMap.pidNo===undefined) colMap.pidNo=idx; } if(cuN==='EKIPMAN'||cuN==='EKIPMAN ADI'||cuN==='EQUIPMENT') colMap.equip=idx; if(cuN==='ACIKLAMA'||cuN==='DESCRIPTION') colMap.desc=idx; if(cuN==='ASIL'||cuN==='MAIN') colMap.main=idx; if(cuN==='YEDEK'||cuN==='SPARE') colMap.spare=idx; if(cuN==='TOPLAM'||cuN==='ADET'||cuN==='QNT'||cuN==='TOPLAM ADET') colMap.qty=idx; if(cuN==='BIRIM'||cuN==='UNIT') colMap.unit=idx; if(cuN.includes('GRUP')||cuN.includes('GROUP')||cuN.includes('GURUBU')||cuN.includes('GRUBU')) colMap.group=idx; if(cuN==='MARKA'||cuN==='BRAND') { if(colMap.specBrand===undefined) colMap.specBrand=idx; } if(cuN==='NOT'||cuN==='NOTE') { if(colMap.specNote===undefined) colMap.specNote=idx; } }); break; } } if(hdrIdx<0){ document.getElementById('xl_preview').innerHTML=`✗ Başlık satırı bulunamadı. Dosyanızda "EKİPMAN" sütunu olmalı.`; return; } window._xlHdr=hdrIdx; window._xlColMap=colMap; // Preview: count real items and section headers let eqCount=0, secCount=0; for(let i=hdrIdx+1;i✓ Başlık bulundu (${hdrIdx+1}. satır)
` + `• ${eqCount} ekipman kalemi
` + `• ${secCount} bölüm başlığı (T-02, T-03…)
` + `Kolon eşleşmesi: POZ=${colMap.pidNo??'?'} · EKİP=${colMap.equip??'?'} · GRUP=${colMap.group??'?'} · MARKA=${colMap.specBrand??'?'} · NOT=${colMap.specNote??'?'}`; document.getElementById('xl_import_btn').disabled=false; }catch(err){ document.getElementById('xl_preview').innerHTML=`✗ Hata: ${escH(err.message)}`; } }; reader.readAsArrayBuffer(file); } function doExcelImport(){ const projId=document.getElementById('xl_proj').value; if(!projId){ const sel=document.getElementById('xl_proj'); sel.style.border='2px solid var(--red)'; sel.focus(); showToast('⚠ Lütfen önce projeyi seçin!'); return; } const mode=document.getElementById('xl_mode').value; const raw=window._xlRaw; const hdrIdx=window._xlHdr; const cm=window._xlColMap; // column map if(!raw||!projId||!cm) return; function str(v){ return v==null?'':String(v).trim(); } function num(v){ if(v==null||v==='') return 0; return parseFloat(String(v).replace(',','.'))||0; } function parseXlDate(v){ if(v==null||v==='') return ''; if(v instanceof Date) return v.toISOString().split('T')[0]; // XLSX with cellDates:true may give Date objects or numbers if(typeof v==='number'&&v>30000&&v<100000){ // Excel serial date (days since 1900-01-00) const d=new Date(Math.round((v-25569)*86400*1000)); return d.toISOString().split('T')[0]; } const s=String(v).trim(); if(s.match(/^\d{2}\.\d{2}\.\d{4}$/)){ const[dd,mm,yy]=s.split('.'); return`${yy}-${mm}-${dd}`; } if(s.match(/^\d{4}-\d{2}-\d{2}$/)) return s; return ''; } const items=[]; let eqCount=0, secCount=0; for(let i=hdrIdx+1;ii.projectId!==projId); DB.equipmentItems.push(...items); dbSave(); closeModal('mExcel'); showToast(`${eqCount} ekipman + ${secCount} bölüm başlığı yüklendi.`); eqFilterProj=projId; renderEquipment(document.getElementById('pageContent'),document.getElementById('topbarRight')); } function openEquipModal(itemId){ if(!isAdmin)return; const item=itemId?DB.equipmentItems.find(i=>i.id===itemId):null; // If editing a section-header, skip if(item&&item.sectionHeader) return; const isEdit=!!item; const projSel=DB.projects.map(p=>``).join(''); const statusOpts=['','SİPARİŞ VERİLMEDİ','TEKLİF AŞAMASINDA','SİPARİŞ VERİLDİ','ATÖLYEDE','SEVK HALİNDE','SAHADA','SEVK EDİLDİ','İPTAL'].map(s=>`${s}`).join(''); // Excel zone fields (editable only when manually adding; read-only hint when editing import row) const xlReadonly = isEdit && !item.manualEntry ? 'style="background:rgba(110,159,255,.04);color:var(--text-muted)" readonly' : ''; const xlNote = isEdit && !item.manualEntry ? `
📥 Excel'den yüklenen satır — soldaki bilgiler salt okunur, sağdaki manuel alanları doldurun.
` : ''; const m=document.createElement('div'); m.className='modal-overlay open'; m.id='mEq'; m.innerHTML=``; m.addEventListener('click',e=>{if(e.target===m)m.remove();}); document.getElementById('modals').appendChild(m); const autoCalc=(changedId)=>{ const qty=parseFloat(document.getElementById('eq_qty').value)||1; if(changedId==='eq_bp'||changedId==='eq_qty'){ const bp=parseFloat(document.getElementById('eq_bp').value)||0; if(bp>0) document.getElementById('eq_bt').value=(bp*qty).toFixed(2); } if(changedId==='eq_bt'){ const bt=parseFloat(document.getElementById('eq_bt').value)||0; if(bt>0&&qty>0) document.getElementById('eq_bp').value=(bt/qty).toFixed(2); } if(changedId==='eq_ap'||changedId==='eq_qty'){ const ap=parseFloat(document.getElementById('eq_ap').value)||0; if(ap>0) document.getElementById('eq_at').value=(ap*qty).toFixed(2); } if(changedId==='eq_at'){ const at=parseFloat(document.getElementById('eq_at').value)||0; if(at>0&&qty>0) document.getElementById('eq_ap').value=(at/qty).toFixed(2); } }; ['eq_bp','eq_ap','eq_qty','eq_bt','eq_at'].forEach(id=>document.getElementById(id)?.addEventListener('input',()=>autoCalc(id))); } function saveEquip(itemId){ const name=document.getElementById('eq_name').value.trim(); if(!name){showToast('Ekipman adı zorunlu!','error');return;} const existing=itemId?DB.equipmentItems.find(x=>x.id===itemId):null; const isManual=!existing||existing.manualEntry; // For imported rows, only update manual fields const manualFields={ status:document.getElementById('eq_status').value, budgetPrice:parseFloat(document.getElementById('eq_bp').value)||0, budgetTotal:parseFloat(document.getElementById('eq_bt').value)||0, actualPrice:parseFloat(document.getElementById('eq_ap').value)||0, actualTotal:parseFloat(document.getElementById('eq_at').value)||0, orderDate:document.getElementById('eq_order').value, deliveryDate:document.getElementById('eq_delivery').value, shippingDate:document.getElementById('eq_ship').value, note:document.getElementById('eq_note').value.trim(), brand:document.getElementById('eq_brand').value.trim(), model:document.getElementById('eq_model').value.trim(), supplier:document.getElementById('eq_supplier').value.trim(), }; if(itemId&&existing){ // Always update manual fields Object.assign(existing, manualFields); // Also update Excel fields if it's a manual entry (not imported) if(isManual){ Object.assign(existing,{ projectId:document.getElementById('eq_proj').value, pidNo:document.getElementById('eq_pid').value.trim(), equipment:name, description:document.getElementById('eq_desc').value.trim(), main:parseInt(document.getElementById('eq_main').value)||0, spare:parseInt(document.getElementById('eq_spare').value)||0, qty:parseInt(document.getElementById('eq_qty').value)||1, unit:document.getElementById('eq_unit').value.trim(), group:document.getElementById('eq_group').value.trim(), specBrand:document.getElementById('eq_specbrand').value.trim(), specNote:document.getElementById('eq_specnote').value.trim(), }); } } else { // New manual entry DB.equipmentItems.push({ id:uid(), sectionHeader:false, manualEntry:true, projectId:document.getElementById('eq_proj').value, pidNo:document.getElementById('eq_pid').value.trim(), equipment:name, description:document.getElementById('eq_desc').value.trim(), main:parseInt(document.getElementById('eq_main').value)||0, spare:parseInt(document.getElementById('eq_spare').value)||0, qty:parseInt(document.getElementById('eq_qty').value)||1, unit:document.getElementById('eq_unit').value.trim(), group:document.getElementById('eq_group').value.trim(), specBrand:document.getElementById('eq_specbrand').value.trim(), specNote:document.getElementById('eq_specnote').value.trim(), ...manualFields, }); } dbSave();closeModal('mEq');showToast('Kaydedildi.');renderEquipment(document.getElementById('pageContent'),document.getElementById('topbarRight')); } // ══════════════════════════════════════════════════ // INVOICES // ══════════════════════════════════════════════════ let invFilterProj='all', invFilterStatus='all', invSearch=''; function getInvProjects(inv){ // projectIds varsa kullan, yoksa eski projectId'den üret const ids=inv.projectIds||(inv.projectId?[inv.projectId]:[]); return ids.map(id=>getProject(id)).filter(p=>p.id); } function getInvProjectNames(inv){ return getInvProjects(inv).map(p=>p.name).join(', ')||'—'; } function renderInvoices(c,tr){ setTopbar(tr, isAdmin?``:null); const projSel=`${DB.projects.map(p=>``).join('')}`; let invs=DB.invoices.filter(i=>{ const ids=i.projectIds||(i.projectId?[i.projectId]:[]); if(invFilterProj!=='all'&&!ids.includes(invFilterProj))return false; if(invFilterStatus!=='all'&&i.status!==invFilterStatus)return false; if(invSearch){const q=invSearch;const names=ids.map(id=>getProject(id).name.toLowerCase()).join(' ');if(!names.includes(q)&&!i.supplier.toLowerCase().includes(q)&&!i.material.toLowerCase().includes(q))return false;} return true; }); invs=invs.sort((a,b)=>a.weekNo-b.weekNo); const eurTotal=invs.filter(i=>i.currency==='EUR').reduce((s,i)=>s+(+i.amount||0),0); const usdTotal=invs.filter(i=>i.currency==='USD').reduce((s,i)=>s+(+i.amount||0),0); const tlTotal=invs.filter(i=>i.currency==='TL').reduce((s,i)=>s+(+i.amount||0),0); c.innerHTML=`
TCMB SATIŞ KURU
EUR/TL${DB.settings.eurRate}
USD/TL${DB.settings.usdRate}
${isAdmin?``:''}
EUR: ${fmtEur(eurTotal)} USD: ${fmtUsd(usdTotal)} TL: ${fmtTL(tlTotal)}
${isAdmin?``:''}
${isAdmin?'':''} ${invs.map(inv=>` ${isAdmin?``:''} `).join('')||``}
PROJEMALZEMETEDARİKÇİKURTUTARVADE HAFTAHAFTA TARİHİDURUMF.TARİH
${getInvProjects(inv).map(p=>`${escH(p.name)}`).join('')||'—'} ${escH(inv.material)}${escH(inv.supplier)} ${inv.currency} ${fmtCur(inv.amount,inv.currency)} ${inv.weekNo}. Hafta ${(()=>{const d=weekDate(inv.weekNo);return inv.weekNo>52?d.toLocaleDateString('tr-TR',{day:'2-digit',month:'2-digit',year:'numeric'}):d.toLocaleDateString('tr-TR');})()} ${payStatusBadge(inv.status)} ${fmtDate(inv.invoiceDate)}

Fatura bulunamadı.

`; } function togglePay(id,page='invoices'){ const inv=DB.invoices.find(i=>i.id===id); if(inv){inv.status=inv.status==='ÖDENDİ'?'ÖDENMEDİ':'ÖDENDİ';dbSave();showToast('Durum güncellendi.');} if(page==='payments') renderPayments(document.getElementById('pageContent'),document.getElementById('topbarRight')); else renderInvoices(document.getElementById('pageContent'),document.getElementById('topbarRight')); } function deleteInvoice(id){ DB.invoices=DB.invoices.filter(i=>i.id!==id);dbSave();showToast('Fatura silindi.');renderInvoices(document.getElementById('pageContent'),document.getElementById('topbarRight')); } function moveUnpaidToNextWeek(){ const curWk=DB.settings.currentWeek; const toMove=DB.invoices.filter(i=>i.weekNo===curWk&&i.status==='ÖDENMEDİ'); if(!toMove.length){showToast(curWk+'. haftada ödenmemiş fatura yok.','error');return;} confirm2(curWk+'. haftadaki '+toMove.length+' ödenmemiş fatura '+(curWk+1)+'. haftaya taşınsın mı?',()=>{ toMove.forEach(i=>i.weekNo=curWk+1); dbSave(); showToast(toMove.length+' fatura '+(curWk+1)+'. haftaya taşındı.','success'); renderInvoices(document.getElementById('pageContent'),document.getElementById('topbarRight')); }); } async function fetchTCMBRates(){ const btn=document.getElementById('rateBtn'); if(btn){btn.textContent='↻ Alınıyor…';btn.disabled=true;} // XML'den ForexSelling çekmeye çalış (proxy üzerinden) async function tryXML(proxyUrl){ const resp=await fetch(proxyUrl,{cache:'no-store'}); if(!resp.ok) throw new Error('http '+resp.status); const text=await resp.text(); // XML mi HTML mi? if(text.trim().startsWith('{ const code=c.getAttribute('CurrencyCode'); const sell=parseFloat((c.querySelector('ForexSelling')?.textContent||'').replace(',','.')); if(code==='USD'&&sell>0) usd=sell; if(code==='EUR'&&sell>0) eur=sell; }); if(!eur||!usd) throw new Error('no data'); return {eur,usd}; } // HTML sayfasını parse ederek kur çek async function tryHTMLPage(proxyUrl){ const resp=await fetch(proxyUrl,{cache:'no-store'}); if(!resp.ok) throw new Error('http '+resp.status); const text=await resp.text(); // TCMB ana sayfasında "USD" ve "EUR" satırlarını tablo hücrelerinden al // Format: sayı içeren hücreleri regex ile tara // USD Satış / EUR Satış → 4 ondalıklı TL değerleri const rows=text.match(/USD[\s\S]{0,300}?(\d{2,3},\d{4})[\s\S]{0,50}?(\d{2,3},\d{4})/i); const eurRows=text.match(/EUR[\s\S]{0,300}?(\d{2,3},\d{4})[\s\S]{0,50}?(\d{2,3},\d{4})/i); // Daha güvenilir: tüm "XX,XXXX" formatındaki sayıları bağlama göre seç // USD satış ~ 43-46, EUR satış ~ 47-55 aralığında olmalı const allNums=(text.match(/\d{2,3},\d{4}/g)||[]).map(s=>parseFloat(s.replace(',','.'))); const usdCands=allNums.filter(n=>n>38&&n<55); const eurCands=allNums.filter(n=>n>44&&n<65); if(!usdCands.length||!eurCands.length) throw new Error('no candidates'); // En olası değer: USD için ~44, EUR için ~51 civarı medyan al const med=arr=>arr.slice().sort((a,b)=>a-b)[Math.floor(arr.length/2)]; return {eur:med(eurCands),usd:med(usdCands)}; } const TCMB_XML='https://www.tcmb.gov.tr/kurlar/today.xml'; const TCMB_HTML='https://www.tcmb.gov.tr/wps/wcm/connect/tr/tcmb+tr/main+page+site+area/bugun'; const proxies=[ ()=>tryXML(`https://api.allorigins.win/raw?url=${encodeURIComponent(TCMB_XML)}`), ()=>tryXML(`https://corsproxy.io/?${encodeURIComponent(TCMB_XML)}`), ()=>tryHTMLPage(`https://api.allorigins.win/raw?url=${encodeURIComponent(TCMB_HTML)}`), ()=>tryHTMLPage(`https://corsproxy.io/?${encodeURIComponent(TCMB_HTML)}`), ]; for(const tryFn of proxies){ try{ const {eur,usd}=await tryFn(); // Doğruluk kontrolü: EUR/USD parite ~0.85-1.35 arasında olmalı const parity=eur/usd; if(parity<0.8||parity>1.5) throw new Error(`implausible parity ${parity.toFixed(4)}`); DB.settings.eurRate=Math.round(eur*10000)/10000; DB.settings.usdRate=Math.round(usd*10000)/10000; dbSave(); showToast(`TCMB kuru güncellendi — EUR/TL: ${DB.settings.eurRate} · USD/TL: ${DB.settings.usdRate}`); if(btn){btn.textContent='↻ Kuru Güncelle';btn.disabled=false;} navigate(currentPage); return; }catch(e){ /* sonraki yöntemi dene */ } } // ── Son çare: exchangerate-api (piyasa kuru) ── try{ const r=await fetch('https://open.er-api.com/v6/latest/USD',{cache:'no-store'}); const d=await r.json(); const usd=d?.rates?.TRY, eur=usd&&d?.rates?.EUR?usd/d.rates.EUR:null; if(usd&&eur){ DB.settings.eurRate=parseFloat(eur.toFixed(4)); DB.settings.usdRate=parseFloat(usd.toFixed(4)); dbSave(); showToast(`Piyasa kuru alındı (TCMB'ye yakın) — EUR: ${DB.settings.eurRate} · USD: ${DB.settings.usdRate}`,'info'); if(btn){btn.textContent='↻ Kuru Güncelle';btn.disabled=false;} navigate(currentPage); return; } }catch(e){} showToast('Kur otomatik alınamadı — lütfen manuel girin.','error'); if(btn){btn.textContent='↻ Kuru Güncelle';btn.disabled=false;} } // Tarih + vade gün → hafta no hesapla function calcWeekNo(dateStr, days){ if(!dateStr) return DB.settings.currentWeek; const base=new Date(2025,11,29); const due=new Date(dateStr); due.setDate(due.getDate()+(parseInt(days)||0)); const diff=Math.floor((due-base)/(7*24*3600*1000))+1; return Math.max(1,diff); // No upper cap — allows next year weeks } // Hafta no → tarih etiketi (yıl sınırı aşılabilir) function weekLabel(wk){ const d=weekDate(wk); if(wk<=52) return `${wk}. Hafta (${d.toLocaleDateString('tr-TR')})`; return `${wk}. Hafta · ${d.toLocaleDateString('tr-TR')} (${d.getFullYear()})`; } function openInvoiceModal(invId){ if(!isAdmin)return; const inv=invId?DB.invoices.find(i=>i.id===invId):null; const existingIds=inv?.projectIds||(inv?.projectId?[inv.projectId]:[]); // 3. Autocomplete: geçmiş tedarikçi ve malzeme listesi const allSuppliers=[...new Set(DB.invoices.map(i=>i.supplier).filter(Boolean))].sort(); const allMaterials=[...new Set(DB.invoices.map(i=>i.material).filter(Boolean))].sort(); const supList=allSuppliers.map(s=>``; }).join(''); const m=document.createElement('div'); m.className='modal-overlay open'; m.id='mInv'; m.innerHTML=``; m.addEventListener('click',e=>{if(e.target===m)m.remove();}); document.getElementById('modals').appendChild(m); } function filterInvProjects(q){ const list=document.getElementById('inv_proj_list'); if(!list)return; list.querySelectorAll('label').forEach(lbl=>{ const txt=lbl.textContent.toLowerCase(); lbl.style.display=(!q||txt.includes(q.toLowerCase()))?'':'none'; }); } function invRecalcWeek(){ const dateVal=document.getElementById('inv_date')?.value; const daysVal=document.getElementById('inv_days')?.value; if(!dateVal||daysVal==='') return; const wk=calcWeekNo(dateVal,daysVal); const sel=document.getElementById('inv_week'); if(sel) sel.value=wk; const hint=document.getElementById('inv_week_hint'); if(hint) hint.textContent=`(${daysVal} gün → ${wk}. Hafta otomatik seçildi)`; } function saveInvoice(invId){ const sup=document.getElementById('inv_sup').value.trim(); const amt=parseFloat(document.getElementById('inv_amt').value)||0; const projIds=[...document.querySelectorAll('.inv-proj-chk:checked')].map(c=>c.value); if(!sup||!amt){showToast('Tedarikçi ve tutar zorunlu!','error');return;} if(!projIds.length){showToast('En az bir proje seçin!','error');return;} const data={ projectIds:projIds, projectId:projIds[0], supplier:sup, material:document.getElementById('inv_mat').value.trim(), currency:document.getElementById('inv_cur').value, amount:amt, invoiceDate:document.getElementById('inv_date').value, vadeDays:document.getElementById('inv_days').value, weekNo:parseInt(document.getElementById('inv_week').value)||1, note:document.getElementById('inv_note').value.trim(), status:'ÖDENMEDİ' }; if(invId){const i=DB.invoices.find(x=>x.id===invId);if(i){data.status=i.status;Object.assign(i,data);}} else DB.invoices.push({id:uid(),...data}); dbSave();closeModal('mInv');showToast('Fatura kaydedildi.');renderInvoices(document.getElementById('pageContent'),document.getElementById('topbarRight')); } // ══════════════════════════════════════════════════ // PAYMENTS // ══════════════════════════════════════════════════ function renderPayments(c,tr){ // İlk açılışta gerçek hafta numarasını hesapla (manuel geçiş yapılmadıysa) if(!window._paymentManualNav){ const base=new Date(2025,11,29); // Hafta 1 başlangıcı const now=new Date(); const realWk=Math.max(1,Math.min(52,Math.floor((now-base)/(7*24*3600*1000))+1)); DB.settings.currentWeek=realWk; } const curWk=DB.settings.currentWeek; // Topbar butonları setTopbar(tr, isAdmin?` ${curWk}. Hafta `:null); // ONLY unpaid invoices, sorted: EUR↓ USD↓ TL↓ const thisWeekInvs=DB.invoices .filter(i=>i.weekNo===curWk&&i.status==='ÖDENMEDİ') .sort((a,b)=>{ const co=['EUR','USD','TL']; const cd=co.indexOf(a.currency)-co.indexOf(b.currency); if(cd!==0)return cd; return(+b.amount)-(+a.amount); }); // 6-month summary (only unpaid) const sixMonthWeeks=[]; for(let w=curWk;w<=curWk+25;w++){ const wInvs=DB.invoices.filter(i=>i.weekNo===w&&i.status==='ÖDENMEDİ'); const eur=wInvs.filter(i=>i.currency==='EUR').reduce((s,i)=>s+(+i.amount||0),0); const usd=wInvs.filter(i=>i.currency==='USD').reduce((s,i)=>s+(+i.amount||0),0); const tl=wInvs.filter(i=>i.currency==='TL').reduce((s,i)=>s+(+i.amount||0),0); const totalTL=eur*DB.settings.eurRate+usd*DB.settings.usdRate+tl; if(eur||usd||tl)sixMonthWeeks.push({week:w,eur,usd,tl,totalTL,invs:wInvs}); } const sixTotEur=sixMonthWeeks.reduce((s,w)=>s+w.eur,0); const sixTotUsd=sixMonthWeeks.reduce((s,w)=>s+w.usd,0); const sixTotTL=sixMonthWeeks.reduce((s,w)=>s+w.tl,0); const sixTotTLAll=sixMonthWeeks.reduce((s,w)=>s+w.totalTL,0); // Summary by currency for this week const wkEur=thisWeekInvs.filter(i=>i.currency==='EUR').reduce((s,i)=>s+(+i.amount||0),0); const wkUsd=thisWeekInvs.filter(i=>i.currency==='USD').reduce((s,i)=>s+(+i.amount||0),0); const wkTL=thisWeekInvs.filter(i=>i.currency==='TL').reduce((s,i)=>s+(+i.amount||0),0); const wkTotalTL=wkEur*DB.settings.eurRate+wkUsd*DB.settings.usdRate+wkTL; c.innerHTML=`
TCMB SATIŞ KURU
EUR/TL${DB.settings.eurRate}
USD/TL${DB.settings.usdRate}
${weekDate(curWk).toLocaleDateString('tr-TR',{day:'2-digit',month:'long',year:'numeric'})}
${curWk}. Hafta Ödeme Planı — Bekleyen
${thisWeekInvs.length?`
${isAdmin?'':''} ${thisWeekInvs.map(inv=>` ${isAdmin?``:''} `).join('')} ${isAdmin?'':''}
PROJEMALZEMETEDARİKÇİKURTUTAR
${getInvProjects(inv).map(p=>`${escH(p.name)}`).join('')||'—'} ${escH(inv.material)} ${escH(inv.supplier)} ${inv.currency} ${fmtCur(inv.amount,inv.currency)}
`: `

Bu hafta bekleyen ödeme yok.

`}
Hafta Özeti
${wkEur?`
EUR${fmtEur(wkEur)}
`:''} ${wkUsd?`
USD${fmtUsd(wkUsd)}
`:''} ${wkTL?`
TL${fmtTL(wkTL)}
`:''} ${!wkEur&&!wkUsd&&!wkTL?`
Bu hafta ödeme yok.
`:''}
TOPLAM TL KARŞILIĞI
${fmtTL(wkTotalTL)}
6 Aylık Ödeme Takvimi (Sadece Bekleyenler) ${curWk}–${curWk+25}. Haftalar · Toplam: ${fmtTL(sixTotTLAll)}
${sixMonthWeeks.length?`
${sixMonthWeeks.map(w=>` `).join('')}
HAFTATARİHEURUSDTLTOPLAM TLDETAY
${w.week===curWk?`${w.week}. ◀`:`${w.week}.`} ${weekDate(w.week).toLocaleDateString('tr-TR',{day:'2-digit',month:'short',year:'numeric'})} ${w.eur?fmtEur(w.eur):'—'} ${w.usd?fmtUsd(w.usd):'—'} ${w.tl?fmtTL(w.tl):'—'} ${fmtTL(w.totalTL)} ${w.invs.map(i=>`${escH(getInvProjectNames(i))}: ${escH(i.supplier)}`).join(' · ')}
`: `

Önümüzdeki 6 ayda bekleyen ödeme yok.

`}
`; } function printPaymentReport(){ // Build a completely clean white HTML page for printing // This avoids ALL dark-theme inline styles bleeding into print const curWk = DB.settings.currentWeek; const thisWeekInvs = DB.invoices .filter(i=>i.weekNo===curWk && i.status==='ÖDENMEDİ') .sort((a,b)=>{ const co=['EUR','USD','TL']; const cd=co.indexOf(a.currency)-co.indexOf(b.currency); if(cd!==0) return cd; return (+b.amount)-(+a.amount); }); const sixMonthWeeks=[]; for(let w=curWk;w<=curWk+25;w++){ const wInvs=DB.invoices.filter(i=>i.weekNo===w&&i.status==='ÖDENMEDİ'); const eur=wInvs.filter(i=>i.currency==='EUR').reduce((s,i)=>s+(+i.amount||0),0); const usd=wInvs.filter(i=>i.currency==='USD').reduce((s,i)=>s+(+i.amount||0),0); const tl=wInvs.filter(i=>i.currency==='TL').reduce((s,i)=>s+(+i.amount||0),0); const totalTL=eur*DB.settings.eurRate+usd*DB.settings.usdRate+tl; if(eur||usd||tl) sixMonthWeeks.push({week:w,eur,usd,tl,totalTL,invs:wInvs}); } const sixTotEur=sixMonthWeeks.reduce((s,w)=>s+w.eur,0); const sixTotUsd=sixMonthWeeks.reduce((s,w)=>s+w.usd,0); const sixTotTL=sixMonthWeeks.reduce((s,w)=>s+w.tl,0); const sixTotTLAll=sixMonthWeeks.reduce((s,w)=>s+w.totalTL,0); const wkEur=thisWeekInvs.filter(i=>i.currency==='EUR').reduce((s,i)=>s+(+i.amount||0),0); const wkUsd=thisWeekInvs.filter(i=>i.currency==='USD').reduce((s,i)=>s+(+i.amount||0),0); const wkTL=thisWeekInvs.filter(i=>i.currency==='TL').reduce((s,i)=>s+(+i.amount||0),0); const wkTotalTL=wkEur*DB.settings.eurRate+wkUsd*DB.settings.usdRate+wkTL; // ── Projeler toplamı bakiyesi ── const _rptEqGroups = DB.projects.map(p=>getEquipGroupSummary(p.id)).flat(); const grandActual = DB.summaryItems.reduce((s,i)=>s+(+i.actualEur||0),0) + _rptEqGroups.reduce((s,g)=>s+g.actualEur,0); const grandPaid = DB.summaryItems.reduce((s,i)=>s+(+i.paidEur||0),0) + Object.values(DB.equipGroupPayments||{}).reduce((s,v)=>s+(+v||0),0); const grandBal = grandActual - grandPaid; const projBalSection = `
PROJELER TOPLAMI — BAKİYE ${fmtEur(grandBal)}
`; const logoB64='data:image/png;base64,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'; const invRows=thisWeekInvs.map(inv=>` ${escH(getInvProjectNames(inv))} ${escH(inv.material)} ${escH(inv.supplier)} ${inv.currency} ${fmtCur(inv.amount,inv.currency)} `).join(''); const totalsRow=` TOPLAM ${wkEur?`
${fmtEur(wkEur)}
`:''} ${wkUsd?`
${fmtUsd(wkUsd)}
`:''} ${wkTL?`
${fmtTL(wkTL)}
`:''} `; const sixRows=sixMonthWeeks.map(w=>` ${w.week===curWk ?`${w.week}. ◀` :`${w.week}.`} ${weekDate(w.week).toLocaleDateString('tr-TR',{day:'2-digit',month:'short',year:'numeric'})} ${w.eur?fmtEur(w.eur):'—'} ${w.usd?fmtUsd(w.usd):'—'} ${w.tl?fmtTL(w.tl):'—'} ${fmtTL(w.totalTL)} `).join(''); const sixTotRow=` 6 AYLIK TOPLAM ${fmtEur(sixTotEur)} ${fmtUsd(sixTotUsd)} ${fmtTL(sixTotTL)} ${fmtTL(sixTotTLAll)} `; const wkDate = weekDate(curWk).toLocaleDateString('tr-TR',{weekday:'long',year:'numeric',month:'long',day:'numeric'}); const printHTML=`
Ödeme Raporu
${curWk}. Hafta
${wkDate}
TCMB Satış Kuru
EUR / TL${DB.settings.eurRate}
USD / TL${DB.settings.usdRate}
Hafta Toplamı${fmtTL(wkTotalTL)}
${curWk}. Hafta · Bekleyen Ödemeler
${thisWeekInvs.length?` ${invRows}${totalsRow}
PROJEMALZEMETEDARİKÇİKURTUTAR
`:'

Bu hafta bekleyen ödeme bulunmamaktadır.

'}
Hafta Özeti
${wkEur?`
EUR${fmtEur(wkEur)}
`:''} ${wkUsd?`
USD${fmtUsd(wkUsd)}
`:''} ${wkTL?`
TL${fmtTL(wkTL)}
`:''} ${!wkEur&&!wkUsd&&!wkTL?'
Ödeme yok
':''}
Toplam TL Karşılığı
${fmtTL(wkTotalTL)}
${projBalSection} ${sixMonthWeeks.length?`
6 Aylık Ödeme Takvimi — Sadece Bekleyenler (${curWk}–${curWk+25}. Haftalar)
${sixRows} ${sixTotRow}
HAFTA TARİH EUR USD TL TOPLAM TL
`:''} `; const pw = window.open('','_blank','width=900,height=700'); if(!pw){ showToast('Popup engellendi! Tarayıcı izin ayarlarını kontrol edin.','error'); return; } pw.document.write(printHTML); pw.document.title = ''; // Firefox başlık satırını boşalt pw.document.close(); pw.onload = ()=>{ pw.document.title = ''; // onload sonra da sıfırla // beforeprint: title'ı tekrar boşalt (bazı tarayıcılar sıfırlar) pw.addEventListener('beforeprint', ()=>{ pw.document.title=''; }); pw.focus(); pw.print(); setTimeout(()=> pw.close(), 1200); }; } // ══════════════════════════════════════════════════ // SETTINGS // ══════════════════════════════════════════════════ function renderSettings(c,tr){ c.innerHTML=`
☁ Bulut Bağlantısı (Supabase)
☁ Bağlantı kontrol ediliyor…
Nasıl çalışır?
• Her kayıtta otomatik buluta yazılır
• 15 saniyede bir güncelleme kontrol edilir
• Başka biri değişiklik yaparsa ekran otomatik yenilenir
• İnternet kesilse bile yerel kopyada çalışmaya devam eder
Veritabanı Yönetimi

Tüm veriler JSON dosyası olarak dışa aktarılabilir ve tekrar içe alınabilir.

${isAdmin?`
`:''}
${isAdmin?`
👥 Kullanıcı Yönetimi
${renderUserList()}
🕐 Yedek Yönetimi

Supabase'de son 30 yedek saklanır. Her kayıtta saatte 1 otomatik yedek alınır.

📧 MAİL YEDEĞİ

JSON yedeğini ali.gul@enta.com.tr adresine gönderir.

Listelemek için butona basın.
Genel Ayarlar
🔐 Hesap Güvenliği

Kendi kullanıcı adı ve şifrenizi güncelleyin. Değişiklik sonrası yeni bilgilerinizle giriş yapın.

Paylaşım

Ekip arkadaşlarınızla sadece görüntüleme modunda paylaşabilirsiniz.

`:''}
`; sbCheckStatus(); } function renderUserList(){ if(!DB.users||!DB.users.length) return '

Henüz kullanıcı yok.

'; return DB.users.map(u=>`
${(u.name||'?')[0].toUpperCase()}
${escH(u.name)}
@${escH(u.username)} · ${u.role==='admin'?'Admin':'Görüntüleyici'}
${u.id!=='u1'?``:''}
`).join(''); } // Sayfa izin tanımları const PAGE_LABELS = { dashboard: 'Ana Sayfa', projects: 'Projeler Özet', equipment: 'Ekipman Listesi', invoices: 'Fatura Kayıtları', payments: 'Haftalık Ödeme Raporu', }; function canSeePage(page){ // Admin her sayfayı görür if(isAdmin) return true; // Ayarlar sadece admin if(page==='settings') return false; // Kullanıcının pages izni varsa kontrol et const pages = currentUserObj?.pages; if(!pages) return true; // izin tanımlı değilse her şeyi göster (geriye dönük uyumluluk) return pages.includes(page); } function openUserModal(userId){ if(!isAdmin) return; const u=userId?DB.users.find(x=>x.id===userId):null; const colors=['#6e9fff','#a78bfa','#34d399','#fb923c','#f472b6','#facc15','#38bdf8']; const colorPicker=colors.map(c=>``).join(''); // Sayfa izin checkboxları — admin için gösterme const isEditingAdmin = u?.role==='admin'; const currentPages = u?.pages || Object.keys(PAGE_LABELS); // varsayılan: hepsi const pageChecks = Object.entries(PAGE_LABELS).map(([key,label])=>` `).join(''); const m=document.createElement('div'); m.className='modal-overlay open'; m.id='mUser'; m.innerHTML=``; m.addEventListener('click',e=>{if(e.target===m)m.remove();}); document.getElementById('modals').appendChild(m); } function saveUser(userId){ const name=document.getElementById('um_name').value.trim(); const username=document.getElementById('um_user').value.trim(); const pass=document.getElementById('um_pass').value; const role=document.getElementById('um_role').value; const color=document.getElementById('um_color').value; if(!name||!username){showToast('Ad ve kullanıcı adı zorunlu!','error');return;} if(!userId&&!pass){showToast('Şifre zorunlu!','error');return;} // Kullanıcı adı benzersiz mi? const dup=(DB.users||[]).find(x=>x.username===username&&x.id!==userId); if(dup){showToast('Bu kullanıcı adı zaten alınmış!','error');return;} // Sayfa izinlerini topla (sadece viewer için) const pages = role==='admin' ? null : Object.keys(PAGE_LABELS).filter(k=>document.getElementById('um_page_'+k)?.checked); if(userId){ const u=DB.users.find(x=>x.id===userId); if(u){ u.name=name; u.username=username; u.role=role; u.color=color; if(pass) u.password=pass; u.pages=pages; } } else { if(!DB.users) DB.users=[]; DB.users.push({id:uid(),name,username,password:pass,role,color,pages}); } dbSave(); closeModal('mUser'); showToast('Kullanıcı kaydedildi.'); const w=document.getElementById('userListWrap'); if(w) w.innerHTML=renderUserList(); } function deleteUser(userId){ if(userId==='u1'){showToast('Ana admin silinemez!','error');return;} confirm2('Bu kullanıcıyı silmek istiyor musunuz?',()=>{ DB.users=DB.users.filter(x=>x.id!==userId); dbSave(); showToast('Kullanıcı silindi.'); const w=document.getElementById('userListWrap'); if(w) w.innerHTML=renderUserList(); }); } async function sendMailBackup(){ const btn=document.getElementById('mailBackupBtn'); const res=document.getElementById('mailBackupResult'); btn.disabled=true; btn.textContent='⏳ Gönderiliyor...'; res.textContent=''; res.style.color='var(--text-muted)'; try{ const r=await fetch('/.netlify/functions/weekly',{method:'POST',headers:{'Content-Type':'application/json'},body:'{}'}); const d=await r.json(); if(d.mail){ res.textContent='✓ Mail gönderildi — ali.gul@enta.com.tr'; res.style.color='var(--green)'; } else if(d.backup){ res.textContent='⚠ Yedek alındı ama mail gönderilemedi.'; res.style.color='var(--yellow)'; } else { res.textContent='⚠ Hata oluştu, tekrar deneyin.'; res.style.color='var(--red)'; } }catch(e){ res.textContent='⚠ Bağlantı hatası: '+e.message; res.style.color='var(--red)'; } btn.disabled=false; btn.textContent='✉ Şimdi Mail Yedek Gönder'; } async function loadBackupList(){ const wrap=document.getElementById('backupListWrap'); if(!wrap) return; wrap.innerHTML='Yükleniyor…'; const backups=await listBackups(); if(!backups.length){ wrap.innerHTML='Henüz yedek yok. İlk değişiklikte otomatik oluşturulur.'; return; } wrap.innerHTML=backups.map((b,i)=>`
${escH(b.label)} ${i===0?'En yeni':''}
`).join(''); } function saveAuth(){ const user=document.getElementById('set_user').value.trim(); const pass=document.getElementById('set_pass').value; const pass2=document.getElementById('set_pass2').value; if(!user){showToast('Kullanıcı adı boş olamaz!','error');return;} if(pass&&pass!==pass2){showToast('Şifreler eşleşmiyor!','error');return;} DB.settings.adminUser=user; if(pass)DB.settings.adminPass=pass; /* DB.users içindeki mevcut admin kullanıcısını da güncelle */ const adminU=DB.users.find(x=>x.username===currentUser||x.role==='admin'); if(adminU){ adminU.username=user; if(pass)adminU.password=pass; } dbSave();showToast('Güncellendi.'); } function saveSettings(){ DB.settings.eurRate=parseFloat(document.getElementById('set_eur').value)||51.10; DB.settings.usdRate=parseFloat(document.getElementById('set_usd').value)||43.97; DB.settings.currentWeek=parseInt(document.getElementById('set_wk').value)||10; dbSave();showToast('Ayarlar kaydedildi.'); } async function sbCheckStatus(){ const box=document.getElementById('sbStatusBox'); const txt=document.getElementById('sbStatusText'); if(!txt) return; txt.textContent='☁ Bağlantı test ediliyor…'; try{ const r=await fetch(API_URL+'?key='+encodeURIComponent(DB_ROW_KEY)); if(r.ok){ const rd2=await r.json(); const hasData=rd2.ok&&rd2.value; if(box){ box.style.borderColor='rgba(34,197,94,.4)'; box.style.background='rgba(34,197,94,.06)'; } txt.style.color='#22c55e'; txt.innerHTML=`✓ Supabase bağlantısı aktif${hasData?' · Veri mevcut':' · Henüz veri yok'}`; } else { throw new Error('HTTP '+r.status); } }catch(e){ if(box){ box.style.borderColor='rgba(239,68,68,.4)'; box.style.background='rgba(239,68,68,.06)'; } txt.style.color='#ef4444'; txt.innerHTML=`✗ Bağlantı hatası: ${e.message} · Yerel veri kullanılıyor`; } } async function sbManualSync(){ showToast('Buluta senkronize ediliyor…'); const ok=await sbSet(DB_ROW_KEY, DB); if(ok){ showToast('✓ Buluta kaydedildi!'); sbCheckStatus(); } else showToast('✗ Senkronizasyon başarısız!','error'); } function resetDB(){ Object.assign(DB,JSON.parse(JSON.stringify(DEFAULT_DB)));dbSave();showToast('Sıfırlandı.');navigate('dashboard'); } // ══════════════════════════════════════════════════ // SHARE MODAL // ══════════════════════════════════════════════════ async function openShareModal(){ const m=document.createElement('div'); m.className='modal-overlay open'; m.id='mShare'; m.innerHTML=``; m.addEventListener('click',e=>{if(e.target===m)m.remove();}); document.getElementById('modals').appendChild(m); // Try to get local IP via WebRTC try{ const pc=new RTCPeerConnection({iceServers:[]}); pc.createDataChannel(''); await pc.createOffer().then(o=>pc.setLocalDescription(o)); let found=false; await new Promise(resolve=>{ pc.onicecandidate=e=>{ if(!e.candidate)return resolve(); const m=e.candidate.candidate.match(/(\d+\.\d+\.\d+\.\d+)/); if(m&&!m[1].startsWith('127')&&!found){ found=true; const ip=m[1]; const ipEl=document.getElementById('ipDisplay'); const urlEl=document.getElementById('shareUrl'); if(ipEl) ipEl.textContent=ip; if(urlEl) urlEl.textContent=`http://${ip}:8080/satinalma_takip.html`; resolve(); } }; setTimeout(resolve,3000); }); pc.close(); if(!found){ const ipEl=document.getElementById('ipDisplay'); if(ipEl) ipEl.textContent='IP algılanamadı — ipconfig/ifconfig ile kontrol edin'; } }catch(e){ const ipEl=document.getElementById('ipDisplay'); if(ipEl) ipEl.textContent='IP algılanamadı — ipconfig/ifconfig ile kontrol edin'; } } window.addEventListener('keydown',e=>{ if(document.getElementById('loginScreen').style.display!=='none'&&e.key==='Enter')doLogin(); });