{{ formatApplyTrackTitle(track.slug) }}
HiddenApplies to all {{ track.universities_total || 0 }} universit{{ (track.universities_total || 0) === 1 ? 'y' : 'ies' }} with country {{ track.iso_code || '—' }}.
Loading YUSR…
AI document translation & extraction
Last {{ recentTranslationCount || 0 }} clients — translations
No recent translations yet. Process a batch first.
Unrecognized Files (Assign Manually):
{{ fileObj.name }}
{{ doc.name }}
🌐 Translating… 📄 Rendering DOCX… {{ files[doc.id].name }}
Review before delivery ({{ result.warnings.length }})
{{ formatLabel(key) }}
{{ value }}
Translated Content Preview
{{ typeof result.data.body_text === 'object' ? '[RichText Rendered in DOCX]' : result.data.body_text }}
Please confirm your core settings before processing the batch.
Selected Target Country
{{ selectedCountry }}
Master Arabic Name
{{ clientNameArabic }}
⚠️ MISSING (AI Will Guess Translation)
You didn't upload a passport. Do you want to add this client to the database manually, or skip saving?
{{ verifyConflictCount }} field{{ verifyConflictCount === 1 ? ' differs' : 's differ' }} between documents. Pick the correct value for the client record — then fix the marked Word file(s) manually; they are already generated and are not changed here.
All identity fields agree across {{ verifyDocs.length }} document{{ verifyDocs.length === 1 ? '' : 's' }}. Confirm to continue, or correct a value below.
{{ row.label }}
{{ row.conflict ? row.candidates.length + ' different values' : 'Consistent' }}No identity fields were extracted from this batch.
✏️ {{ verifyManualFixCount }} Word file{{ verifyManualFixCount === 1 ? '' : 's' }} to edit by hand: {{ verifyManualFixLabels.join(', ') }} All documents match the chosen values.
Create a one-off, printable invoice
{{ manualInvoiceData.extraDocsList.length }} extra doc(s) from client profile
Under {{ crmActiveCountryLabel }}
Creates a main applications group and its first table.
{{ crmAddOptionModal.error }}
Do you really want to change this status to {{ crmPaidModal.nextPaid ? 'Yes' : 'No' }}{{ crmPaidModal.clientName ? ' for ' + crmPaidModal.clientName : '' }}?
Paid is now Yes. Who received this payment?
{{ crmPaidModal.error }}
To {{ crmDoneEmail.clientName }} · {{ crmDoneEmail.email || 'no email' }}. Name, login, password and portal links are taken from the card.
Pick at least one document.
No real email on the card — add one first.
{{ crmAddMultiOptionModal.error }}
Student communication
Pick an email type, choose who receives it, read it exactly as the student will — then send.
Ready to send
{{ campaignPreview ? campaignPreview.ready_count : '—' }}
Skipped
{{ campaignPreview ? campaignPreview.skipped_count : '—' }}
Email types
{{ campaignTemplates.length || '—' }}
Sent recently
{{ campaignSentTotal || '—' }}
{{ campaignError }}
{{ campaignSuccess }}
Recipients
Who receives this email
Leave empty to include every status except Removed.
{{ campaignClientIds.length }} row{{ campaignClientIds.length === 1 ? '' : 's' }} carried from CRM. Status filters still narrow this list if you pick any.
{{ row.email || row.name || '—' }} · {{ row.skip_reason }}
Email type
{{ campaignTemplates.length }} ready-written types · 4 languages
Message
Written for you — edit only what you need
A line with only a link becomes a button ([Open portal](https://…) alone on a line is a button with that label). [Apply here](https://yusredu.co/apply) inside text becomes a link, **text** becomes bold, and lines starting with 1. or - become a clean list.
Preview
Exactly what Gmail and Outlook will render
{{ campaignDesignText || 'The plain-text copy appears here.' }}
Last send
{{ campaignLastSent }} delivered · {{ campaignLastFailed }} failed
Every recipient was accepted by the mail server.
Recent sends
Last {{ campaignHistory.length || 0 }} of 5 kept
No campaigns sent yet from this app.
{{ row.subject || campaignTemplateLabel(row.template_id) }}
{{ campaignTemplateLabel(row.template_id) }} · {{ formatCampaignWhen(row.created_at) }} · {{ row.actor_name || 'staff' }} · {{ row.source }}{{ row.university ? ' · ' + row.university : '' }}{{ row.provider ? ' · ' + row.provider : '' }}
Live Database. Clients are automatically updated if returning.
| Date | Client Name | ID / Passport | Translated Docs | Price | Action |
|---|---|---|---|---|---|
| {{ client.date.split(' ')[0] }} | {{ client.name }} |
{{ client.citizenship || '---' }}
{{ client.passport || '---' }}
|
{{ client.docs_list }}
|
${{ (client.price || 0).toFixed(2) }} |
Clients from your CRM tables — filter by list, WHO's Card, paid status. Archived lists are skipped so calculations stay fast.
Total
${{ (financeSummary.total_earned || 0).toFixed(2) }}
Paid
{{ financeSummary.paid_count || 0 }} ${{ (financeSummary.paid_amount || 0).toFixed(0) }}
Unpaid
{{ financeSummary.unpaid_count || 0 }} ${{ (financeSummary.unpaid_amount || 0).toFixed(0) }}
Clients
{{ financeSummary.client_count || 0 }}
Not calculated
{{ financeSummary.pending_calc_count || 0 }} ${{ (financeSummary.pending_calc_amount || 0).toFixed(0) }}
| Name | List | WHO's Card | Paid | Amount | Calculated | Date |
|---|---|---|---|---|---|---|
| No clients match these filters. | ||||||
| {{ r.display_name }} | {{ r.university_label || r.university }} | {{ w }} — | {{ r.paid ? '✓ Yes' : 'No' }} | ${{ r.amount.toFixed(2) }} | ✓ Yes No | {{ (r.applied_date || r.created_at || '').split(' ')[0] }} |
Load paid clients, split revenue by WHO's Card, deduct expenses, write checks. Unpaid clients are skipped automatically. Saved calculations mark clients as calculated so they won't count again.
Shows every paid client not yet calculated — from active lists only (archived lists are skipped). Batch date is only a label on the saved record.
{{ financeCalcSelectedCount }} selected · ${{ financeCalcSelectedTotal.toFixed(2) }} collected
Who collected (on their card)
Already paid out of pocket (reimburse)
Add items in Team expenses tab when someone pays — they load here automatically. Split across everyone in this calculation.
Planned spending (from this batch)
Money you will spend next — ads, marketing, etc. Pick whose card pays each item (or split equally if blank).
| Person | Collected | + Reimburse | − Planned | In hands | Job | Comment |
|---|---|---|---|---|---|---|
| {{ p.name }} | ${{ p.revenue_share.toFixed(2) }} | +${{ (p.reimbursement || 0).toFixed(2) }} | -${{ (p.planned_share || p.expenses_share || 0).toFixed(2) }} |
Conclusion
{{ financeCalcConclusionText }}
No calculations match your filters.
{{ financePayoutsFiltered.length }} of {{ financePayouts.length }} calculation(s) · click a row for full details
Reimbursed: {{ r.paid_by }} ${{ (r.amount || 0).toFixed(0) }} ({{ r.note }})
Planned spend: ads ${{ financeHistorySelectedBatch.expenses.ads }} from {{ financeHistorySelectedBatch.expenses.ads_from }} · mgmt ${{ financeHistorySelectedBatch.expenses.management }} from {{ financeHistorySelectedBatch.expenses.management_from }} · other ${{ financeHistorySelectedBatch.expenses.other }} from {{ financeHistorySelectedBatch.expenses.other_from }} · {{ pl.label || 'Item' }} ${{ pl.amount }} from {{ pl.paid_from }}
{{ financeHistorySelectedBatch.notes }}
{{ financeHistorySelectedBatch.conclusion }}
| Person | Collected | In hands | Job | Comment |
|---|---|---|---|---|
| {{ p.name }} | ${{ (p.revenue_share || 0).toFixed(2) }} | ${{ p.check_amount.toFixed(2) }} | {{ p.job || '—' }} | {{ p.comment || '—' }} |
When someone pays out of pocket, add it here. Pending items are pulled into Calculations automatically and marked done when you save a calculation.
| Who paid | $ | Note | Status | Added | |
|---|---|---|---|---|---|
| {{ item.paid_by }} | ${{ item.amount.toFixed(2) }} | {{ item.note || '—' }} | {{ item.status }} | {{ item.created_at }} |
Track every penny spent on Gemini API.
Total Spend ({{ financeFilter }})
${{ filteredFinanceTotal.toFixed(5) }}
Documents Processed
{{ filteredFinanceData.length }} docs
Client payments
Pick Wise, PayPal, Stripe, bank, or any other link each time. Generate a message, send it, then Mark paid when the money arrives (CRM updates if a student is attached).
Open
{{ paySummary.open_count || 0 }}
Paid
{{ paySummary.paid_count || 0 }}
Total
{{ paySummary.total || 0 }}
Method
{{ payProviderLabel(payForm.provider) }}
{{ payError }}
{{ paySuccess }}
New payment link
Amount, optional CRM student, then generate
Stripe needs STRIPE_SECRET_KEY in .env (company in a Stripe country). Use Wise or PayPal until then.
{{ payForm.client_name }}
{{ payForm.client_email || 'No email on file' }}
Send the link
Copy, WhatsApp, or Telegram
Link history
Open, paid, and deactivated
| Student | Amount | Status | Created | |
|---|---|---|---|---|
|
{{ row.client_name || row.title }} {{ payProviderLabel(row.provider) }} · {{ row.client_email || row.university || '—' }} |
{{ formatPayAmount(row) }} | {{ row.status }} CRM paid | {{ formatCampaignWhen(row.created_at) }}{{ row.created_by_name }} |
Pipeline, money, documents and team — what moves us toward the deadline. Updated {{ anTime(an.generated_at) }}. Showing your tables only.
{{ analyticsError }}
Crunching CRM, finance and translation numbers…
{{ an.deadline.label }} · {{ anDate(an.deadline.date) }}
{{ anDeadlineHeadline }}
{{ an.deadline.processed }} of {{ an.deadline.target }} applications applied — {{ an.deadline.remaining }} still to process.
Needed / day
{{ an.deadline.needed_per_day }}
to finish by the deadline
Our pace / day
{{ an.deadline.pace_per_day }}
moved to Done, last {{ an.deadline.pace_window_days }} day{{ an.deadline.pace_window_days === 1 ? '' : 's' }}
Forecast finish
{{ an.deadline.forecast_date ? anDate(an.deadline.forecast_date, true) : '—' }}
at the current pace
Tables counted
{{ an.deadline.boards.length }}
{{ anDeadlineBoardNames }}
Where the {{ an.deadline.remaining }} remaining applications are stuck
Active applications
{{ an.pipeline.active }}
{{ an.boards.length }} CRM table{{ an.boards.length === 1 ? '' : 's' }} · {{ an.pipeline.removed }} removed
Applied / accepted
{{ anStage('applied') + anStage('accepted') }}
{{ anStage('accepted') }} accepted so far
Money collected
{{ anMoney(an.money.paid_amount) }}
{{ an.money.paid_count }} paid clients
Outstanding
{{ anMoney(an.money.unpaid_amount) }}
{{ an.money.unpaid_count }} unpaid · {{ an.money.no_price_count }} without price
Collection rate
{{ an.money.collection_rate }}%
of {{ anMoney(an.money.total) }} billed
Average ticket
{{ anMoney(an.money.avg_ticket) }}
per priced client
Docs translated
{{ anDocCount('translated') }}
clients marked translated
Waiting
{{ anStatusCount('waiting') }}
need a follow-up
Every client on {{ an.access.scoped ? 'your' : 'the active' }} CRM tables, in workflow order.
Clients moved to Done and new clients added, from the activity log (tracked since {{ anDate(an.throughput.tracking_since, true) }}).
Stage mix per table on one scale — the further right the color, the closer to done.
| Table | Active | Applied | Done % | Paid | Outstanding |
|---|---|---|---|---|---|
|
{{ b.name }} {{ b.country || '—' }} · {{ b.pre_reg }} pre-reg |
{{ b.active }} | {{ b.processed }} | {{ b.processed_pct }}% | {{ anMoney(b.paid_amount) }} | {{ anMoney(b.unpaid_amount) }} |
Billed amount of clients registered each week, split into collected and still outstanding.
Collected vs outstanding across all active tables.
Clients that need action before {{ anDate(an.deadline.date, true) }}. Click a name to open it in the CRM.
{{ a.severity === 'critical' ? 'Critical' : (a.severity === 'serious' ? 'Important' : 'Check') }}
{{ a.title }} · {{ a.count }}
{{ a.hint }} · {{ anMoney(a.amount) }}
Docs status on active applications.
Most missing documents
Processing Engine output{{ an.translations.source === 'ledger' ? ' — every document through the AI, from the API ledger' : ' — from the activity log' }}.
All time
{{ an.translations.total_docs.toLocaleString() }}
Last 30 days
{{ an.translations.docs_30d }}
Last 7 days
{{ an.translations.docs_7d }}
AI cost / doc
${{ an.translations.cost_per_doc.toFixed(4) }}
${{ an.translations.cost_total.toFixed(2) }} all time
Documents per week
By document type
Citizenship of active applications · {{ an.nationality.unknown }} unknown.
Website inquiries and the Telegram bot.
New inquiries
{{ an.leads.inquiries.new }}
waiting for a reply
Inquiries 7d
{{ an.leads.inquiries.last_7d }}
{{ an.leads.inquiries.total }} all time
Bot users
{{ an.leads.telegram.users.toLocaleString() }}
+{{ an.leads.telegram.new_7d }} this week
Applied via bot
{{ an.leads.telegram.applied }}
{{ an.leads.telegram.users ? ((100 * an.leads.telegram.applied / an.leads.telegram.users).toFixed(1)) : 0 }}% conversion
Clients moved to Done, added, and all logged actions.
No activity logged this week.
| Member | Done | Added | Actions |
|---|---|---|---|
| {{ m.name }} | {{ m.done }} | {{ m.added }} | {{ m.actions }} |
Shared with the whole team. Applications count as processed once they reach Done, Int-Acc or Final-Acc.
None ticked = every active table except Pre-Reg ones.
{{ analyticsSettingsError }}
Manage access and track manager activity.
Team
{{ teamAnalytics.summary.team_count }}
managers
Active (7d)
{{ teamAnalytics.summary.active_managers }}
fetched clients
Fetches (7d)
{{ teamAnalytics.summary.fetches_7d }}
control room
Fetches (30d)
{{ teamAnalytics.summary.fetches_30d }}
all managers
{{ teamError }}
Loading team…
{{ u.display_name }} Admin Inactive Active
@{{ u.username }}
Loading analytics…
| Manager | Fetches 7d | 30d | Actions 7d | 30d | Last fetch | Last login |
|---|---|---|---|---|---|---|
|
{{ m.user.display_name }} @{{ m.user.username }} |
{{ m.fetches_7d }} | {{ m.fetches_30d }} | {{ m.actions_7d || 0 }} | {{ m.actions_30d || 0 }} | {{ m.last_fetch_at }} {{ m.last_fetch_client }} — | {{ m.last_login_at || '—' }} |
No activity yet.
Manage universities, programs, news, and posts for the public website.
Curate the public experience with polished content, destination visibility, and publishing controls from one elegant workspace.
SUPABASE_URL and SUPABASE_SERVICE_KEY to your .env, then run the SQL migrations.
{{ frontendError }}
{{ frontendDestinations.length }} destinations · toggle Open to show all active universities in that country on the public website.
Type name + ISO code to add. Suggestions appear as you search. Universities pick from countries you’ve added.
014_study_destinations.sql in Supabase, then refresh.
{{ d.name }}
{{ d.iso_code }} · {{ d.slug }}
{{ d.description }}
{{ d.universities_active || 0 }} active universities · {{ d.programs_active || 0 }} programs · {{ d.universities_total }} total unis in DB · /countries/{{ d.slug }}
{{ frontendApplyTracks.length }} track{{ frontendApplyTracks.length === 1 ? '' : 's' }} · public badges on /apply · status also updates every university in that country
018_apply_tracks.sql in Supabase, then refresh.
Applies to all {{ track.universities_total || 0 }} universit{{ (track.universities_total || 0) === 1 ? 'y' : 'ies' }} with country {{ track.iso_code || '—' }}.
Programs database Supabase Local SQLite
{{ progPagination.totalCount || progOptions.total || 0 }} records · page {{ progPagination.pageNumber || 1 }} of {{ progPagination.totalPages || 1 }} · public API: /api/platform/programs
27 YUSR-managed universities are excluded from Saudi fetch — list: data/studyinsaudi/excluded_institutions.json. Logos: YUSR files only (static/institutions/logos/).
When you add a program for a new school, a basic university profile is created automatically on the Universities tab (you can edit About / logo later). Prefer adding the university first if you already have full profile text.
*Note: Programs are being added and updated continuously
| Degree | Program | Institution | Country | City | Lang | Audience | Scholarship | Tuition | Duration | Actions |
|---|---|---|---|---|---|---|---|---|---|---|
| No programs found. | ||||||||||
| {{ row.degree_level || '—' }} |
{{ row.name_ar }} ({{ row.name_en || '—' }}) {{ row.id }} |
{{ row.institution_name_en || '—' }} | {{ row.country || 'Saudi Arabia' }} | {{ row.city || '—' }} | {{ row.language || '—' }} | {{ row.audience_label || '—' }} | {{ row.scholarship_type || '—' }} | {{ Number(row.tuition_after).toLocaleString() }} ﷼ — / {{ row.fee_type }} | {{ row.duration_years != null ? (row.duration_years + ' yr') : '—' }} | |
{{ frontendUniversities.filter(u => u.is_active !== false).length }} live · {{ frontendUniversities.filter(u => u.is_active === false).length }} hidden · drag to reorder · website catalog order
{{ uniIdx + 1 }} {{ u.name }} Featured Hidden Open Pre-Registration Closed
/api/platform/universities/{{ u.slug }}
{{ u.programs_count_live != null ? u.programs_count_live : (u.programs_count || 0) }} programs linked · {{ u.country_code || '—' }}{{ u.city ? ' · ' + u.city : '' }}
{{ u.tagline }}
{{ frontendNews.length }} articles · published items appear on /api/platform/news
{{ n.title }} Published Draft
{{ n.slug }}
{{ n.excerpt }}
{{ frontendPosts.length }} posts · filter by university on /api/platform/posts?university=saudi
{{ p.title }} Published Draft {{ p.university.name }}
{{ p.slug }}
{{ p.excerpt }}
Client inbox
{{ clientsHubHeroBlurb }}
SUPABASE_URL and SUPABASE_SERVICE_KEY, then run 017_contact_inquiries.sql and 019_bug_reports.sql.
{{ clientsError }}
Inbox zero — nice!
New website inquiries will sparkle in here.
No {{ clientInquiryStatusLabel(clientsStatusFilter) }} leads in this view
{{ clientsInquiryStats.all }} website {{ clientsInquiryStats.all === 1 ? 'inquiry' : 'inquiries' }} are already in the list — open All or New.
No bug reports
Reports from the website will show up here.
{{ bugReportTitle(bug) }}
{{ clientInquiryStatusLabel(bug.status) }}{{ formatClientDateShort(bug.created_at) }}
{{ bug.description }}
No website accounts yet
When someone registers on the public website, their account shows up here.
{{ stu.full_name || 'Student' }}
{{ clientStudentStatusLabel(stu) }}{{ formatClientDateShort(stu.created_at) }}
{{ stu.email || stu.phone || 'No email on file' }}
{{ telegramPageTab === 'broadcast' ? 'Staff DM' : 'Bot directory' }}
037_telegram_bot_identity.sql.
{{ telegramError }}
{{ telegramBroadcastResult }}
Staff DM
{{ telegramBroadcastText.length }} / 4096
{{ telegramBroadcastAudienceHint }}
| Person | Message | Language | Last activity | Applied | Contest |
|---|---|---|---|---|---|
| Loading people... | |||||
| No one here yet. Anyone who opens @yusredu_bot will appear. | |||||
|
{{ clientInquiryInitials(telegramDisplayName(user)) }}
{{ telegramDisplayName(user) }} Premium {{ user.username ? '@' + user.username : 'No username' }} |
{{ telegramMessageStatus(user).label }} | {{ (user.language_code || '—').toUpperCase() }} |
{{ telegramActionLabel(user.last_action) }} {{ formatClientDateShort(user.last_seen_at || user.created_at) }} |
{{ user.apply_count ? ('Yes · ' + user.apply_count) : '—' }} | {{ user.join_count || 0 }} |
Add managers and control which sections they can access.
Permissions
Loading team…
{{ u.display_name }} Admin Inactive
@{{ u.username }}
Access: {{ (u.permissions || []).map(k => teamPermLabel(k)).join(', ') || 'None' }}
{{ yusrDialog.message }}
{{ profileError }}
@{{ authUser.username }} · {{ authUser.role === 'admin' ? 'Admin' : 'Manager' }}
Your access
No module access assigned. Contact your admin.
Admin
Full access to all modules
Use Team in the sidebar to manage staff.
Granular roles: reader, writer, fetcher
{{ teamError }}
Loading…
{{ u.display_name }} Admin Off
@{{ u.username }}
{{ formatUserAccess(u) }}
Type the country name and ISO code. Search suggests matches as you type. Landing page + open/close · public /countries/{{ frontendDestForm.slug || '…' }}
Type freely, or pick a suggestion. Already-added countries are hidden.
Public URL: /countries/{{ frontendDestForm.slug || '…' }}
No benefits yet — add 3–6 for the landing page.
Kinds: benefits, majors, html, documents, universities, list. Leave empty to use built-in Saudi defaults on the website.
Website catalog · live on GET /api/platform/universities
{{ frontendUniForm.name || 'University name' }}
{{ frontendUniForm.tagline || frontendUniForm.city || 'Tagline / city' }} · {{ frontendUniForm.slug || 'slug' }}
From Countries tab — add a destination there first if missing.
Tap what you know — leave the rest as Not confirmed.
Open for
Ma'had Arabic (pre-Arabic diploma)
Dormitory
Click the box or drop a file — we store them under /static/universities/.
Ready: {{ frontendUniPendingLogo.name }}
Ready: {{ frontendUniPendingCover.name }}
Files upload automatically when you create the university on Publish.
Picked files save immediately. Pasted URLs save when you click Save images or Save changes.
Application status
Controls the public Open / Pre-Registration / Closed badge.
{{ frontendUniForm.name || '—' }} · {{ frontendUniForm.country_code || '??' }} · {{ frontendUniForm.city || '—' }}
/api/platform/universities/{{ frontendUniForm.slug || '…' }}
{{ frontendError }}
Catalog row · public API /api/platform/programs
{{ frontendProgForm.name_en || 'Program name (EN)' }}
{{ frontendProgForm.name_ar }}
{{ frontendProgForm.institution_name_en || 'University' }} · {{ frontendProgForm.city || 'City' }} · {{ frontendProgForm.country || 'Country' }}
Country first, then pick a university from your Universities list for that country.
Add a country under the Countries tab first.
No universities for this country yet — add one under Universities.
Degree
Language
Scholarship
Audience
Gender
Used for non-Saudi programs (e.g. UAE). Saudi still loads live from Study in Saudi when available.
{{ frontendProgForm.name_en || '—' }} · {{ frontendProgForm.degree_level }}
{{ frontendProgForm.institution_name_en || '—' }} · {{ frontendProgForm.city || '—' }}
{{ frontendProgForm.scholarship_type || '—' }} · {{ frontendProgForm.tuition_after != null ? (Number(frontendProgForm.tuition_after).toLocaleString() + ' ﷼') : '—' }} / {{ frontendProgForm.fee_type }}
{{ frontendError }}
Module access
CRM restrictions
Loading tables…
No CRM tables yet. Create one in CRM first.
{{ grp.flag }} {{ grp.name }}
Pick at least one table, or switch to "All tables".
Restricted CRM users cannot create/delete tables, send campaigns, use Payments, or manage the website.
{{ teamError }}
Consulting, Translation & Application Services
Riyadh, Saudi Arabia | apply.tosaudi@gmail.com
Date: {{ new Date().toLocaleDateString() }}
INV-{{ currentInvoice.id }}-{{ Math.floor(Math.random() * 1000) }}
{{ currentInvoice.name }}
Passport / ID: {{ currentInvoice.passport }}
Citizenship: {{ currentInvoice.citizenship }}
| Description / الوصف | Documents | Amount (USD) |
|---|---|---|
|
{{ item.label }}
({{ item.sub }}) |
{{ item.amount < 0 ? '-' : '' }}${{ Math.abs(item.amount).toFixed(2) }} | |
|
Base: Consulting, Applying & Main Translation (الاستشارة والتقديم والترجمة الأساسية) |
1 (Main) | ${{ currentInvoice.price > 0 ? (currentInvoice.docs_list.includes('dip') ? '70.00' : '50.00') : '0.00' }} |
|
Additional Certified Translations (ترجمات إضافية معتمدة) |
{{ currentInvoice.docs_list }} | ${{ (currentInvoice.price - (currentInvoice.docs_list.includes('dip') ? 70 : 50)).toFixed(2) }} |
Total Due / الإجمالي
${{ (currentInvoice.price || 0).toFixed(2) }}
Thank you for trusting YUSR Education.
شكراً لثقتكم في يسر للخدمات التعليمية.