دستیار فروش اقساطی سازمانی

محاسبات ورژن v1.3.0 • پیش‌نویس قرارداد

-

ورودی‌ها و تنظیمات

انتخاب طرح و اطلاعات سازمان

مقدار: 2%
مدت: 30 روز
نکته: متن قرارداد بر اساس اطلاعات ورودی در زیر منتشر خواهد شد

نتایج محاسبات

آنالیز آنی طرح انتخابی

شارژ کیف پول (خالص)

هزینه عملیات

بازپرداخت کل به بانک

مبلغ هر قسط

تسویه با تأمین‌کننده

سود اسمی (طبق اکسل)

طرح‌های اضافه‌شده به قرارداد

نکته: در تمام دسته‌بندی‌ها، محاسبه هزینه عملیات و سود طبق جداول اکسل و کاملاً داینامیک است.
if present const m = txt.match(/]*>([\s\S]*?)<\/body>/i); return (m ? m[1] : txt); } }catch(e){ lastErr = e; } } throw (lastErr || new Error("Unable to fetch template")); }function buildPlansTableHTML(){ let rows = ""; if(state.basket.length === 0){ rows = `هیچ طرحی انتخاب نشده است.`; } else { state.basket.forEach((b, i) => { rows += `${i+1}${escapeHtml(b.cat)} - ${escapeHtml(b.plan)}${b.term} ماهه${money(b.amount)}${money(b.inst)}${pct(b.cons)}`; }); }return `${rows}
ردیفشرح طرحمدتمبلغ تسهیلاتمبلغ قسطسود دوره
`; }function buildOrgSignersText(){ let signersTxt = ""; state.signers.forEach((s,i) => { signersTxt += `آقای/خانم ${s.name || ".............."} به عنوان ${s.role || ".............."} با کدملی ${s.nid || ".............."}`; if(i < state.signers.length-1) signersTxt += " و "; }); return signersTxt; }function buildOrgSignatureBlocks(){ let orgSigs = ""; state.signers.forEach((s, idx) => { orgSigs += `
${escapeHtml(s.name || "..............")} (${escapeHtml(s.role || "..............")})

مهر و امضا: ............................
`; }); return orgSigs; }function collectOrgData(){ return { name: document.getElementById("orgName").value || "...........................", reg: document.getElementById("orgReg").value || "................", eco: document.getElementById("orgEco").value || "................", nid: document.getElementById("orgNid").value || "................", tel: document.getElementById("orgTel").value || "................", zip: document.getElementById("orgZip").value || "................", addr: document.getElementById("orgAddr").value || "......................................................................" }; }function smartReplaceAll(html, map){ // Replace both {{KEY}} and <> and [[KEY]] (in case user uses different placeholder style) let out = html;const variants = (key) => [ new RegExp("\\{\\{\\s*" + key + "\\s*\\}\\}", "g"), new RegExp("\\[\\[\\s*" + key + "\\s*\\]\\]", "g"), new RegExp("<<\\s*" + key + "\\s*>>", "g") ];Object.keys(map).forEach(k => { const val = String(map[k] ?? ""); variants(k).forEach(rx => { out = out.replace(rx, val); }); });return out; }async function buildContractHTMLFromTemplate(){ const templateBody = await fetchTemplateHTML();const org = collectOrgData();const map = { CONTRACT_DATE: jalaliLong(),ORG_NAME: escapeHtml(org.name), ORG_REG: escapeHtml(org.reg), ORG_ECO: escapeHtml(org.eco), ORG_NID: escapeHtml(org.nid), ORG_TEL: escapeHtml(org.tel), ORG_ZIP: escapeHtml(org.zip), ORG_ADDR: escapeHtml(org.addr),ORG_SIGNERS_TEXT: escapeHtml(buildOrgSignersText()),// NOTE: these are HTML blocks, so do NOT escape ORG_SIGNATURE_BLOCKS: buildOrgSignatureBlocks(), PLANS_TABLE: buildPlansTableHTML() };// If template is plain texty, keep it as HTML body and inject: let filled = smartReplaceAll(templateBody, map);// Fallback safety: if template doesn't contain PLANS_TABLE placeholder, append it at end if(!/(\{\{\s*PLANS_TABLE\s*\}\}|\[\[\s*PLANS_TABLE\s*\]\]|<<\s*PLANS_TABLE\s*>>)/.test(templateBody)){ filled += `
${map.PLANS_TABLE}
`; }// Wrap with RTL + justified base to keep print/word clean return `
${filled}
`; }async function ensureContractAreaHTML(){ const area = document.getElementById("tmnContractPrintArea"); area.style.display = "block"; area.innerHTML = `
در حال آماده‌سازی قرارداد...
`;try{ const html = await buildContractHTMLFromTemplate(); area.innerHTML = html; return html; }catch(err){ // If fetch is blocked by CORS or doc isn't public, show a clear message (still no embedded contract text) area.innerHTML = `

عدم دسترسی به متن قرارداد

دریافت متن قرارداد از گوگل‌داک به دلایل دسترسی/‏CORS انجام نشد. لطفاً مطمئن شوید لینک قرارداد Public (Anyone with the link) است.

سپس دوباره روی «دانلود قرارداد» یا «چاپ / PDF» بزنید.

`; throw err; } }root.querySelector("#btnPdf").onclick = async () => { try{ await ensureContractAreaHTML(); window.print(); }catch(e){ // message already shown } };root.querySelector("#btnWord").onclick = async () => { try{ const bodyHtml = await ensureContractAreaHTML(); const content = `Contract${bodyHtml}`; const blob = new Blob(['\ufeff', content], {type: 'application/msword'}); const url = URL.createObjectURL(blob); const link = document.createElement('a'); link.href = url; link.download = 'قرارداد_پیشنهادی.doc'; document.body.appendChild(link); link.click(); document.body.removeChild(link); setTimeout(()=>URL.revokeObjectURL(url), 1000); }catch(e){ // message already shown } };// Init renderPlans(); renderTerms(); renderSigners(); render(); })();