★ Membership MSO • Promo komunitas & layanan • Jadwal bermain setiap minggu • Jasa Foto & Video MSO • #Kitamainlagi • Membership MSO • Promo komunitas & layanan •
ORGANIZER – FUN FOOTBALL & MINI SOCCER – JABODETABEK

Fun game.
Good vibes.
#MainBolaTerus

Booking slot fun football, mini soccer, dan padel di venue terbaik Jabodetabek. Datang sendiri atau bareng tim – urusan lapangan, wasit, sampai dokumentasi, kami yang atur.

⌖
120+Venue Partner
♧
3.500+Pemain Aktif
♜
35+Jadwal / Minggu
Jadwal bermain

Jadwal Minggu Ini

Agar website lebih ringkas, maksimal 6 jadwal terdekat ditampilkan untuk 7 hari ke depan. Jadwal lainnya dapat dilihat melalui tombol “Lihat Selengkapnya”.

Total jadwal tersedia minggu ini
MSO Media Services

Jasa Foto & Video MSO

Abadikan pertandingan, tim, dan momen terbaik dengan dokumentasi olahraga yang profesional.

Turnamen & event

Event yang Sedang Buka Pendaftaran

Daftarkan tim atau dirimu sekarang sebelum slot habis.

Cerita dalam gambar

Portofolio Foto & Video MSO

Geser foto untuk melihat karya lainnya, atau buka portofolio video dari YouTube dan Instagram.

Geser untuk melihat foto dan video lainnya. Maksimal 10 item portofolio.

Update MSO

Berita & Cerita Terbaru

Informasi seputar komunitas, pertandingan, dokumentasi, dan kegiatan MSO.

MSO EVENTS Admin Dashboard
CMS website, operasional event, dan POS
Ini adalah preview antarmuka. Perubahan di sini tersimpan sementara di browser demo. Login, role admin/user, upload file permanen, dan penyimpanan database perlu dihubungkan ke backend saat implementasi produksi.

Ringkasan Website

Jadwal aktif minggu ini

3

Katalog layanan

3

Item portofolio

3

Pilih menu di atas untuk mengelola isi website. Pada versi produksi, akses ini hanya diberikan kepada akun dengan role Admin.

');w.document.close()} function invoicePdfAndWhatsApp(){const x=invoiceData();if(!x.phone){alert('Isi nomor WhatsApp klien terlebih dahulu.');return}lastInvoice=x;if(!lastInvoice.no)lastInvoice.no='MSO-'+new Date().toISOString().slice(0,10).replaceAll('-','')+'-'+String(mediaBookings.length+1).padStart(3,'0');x.no=lastInvoice.no;printInvoice();const msg=`Halo ${x.client}, saya kirim invoice PDF MSO MEDIA SERVICES. Total ${fmtMoney(x.amount)}, DP ${fmtMoney(x.paid)}, sisa ${fmtMoney(Math.max(0,x.amount-x.paid))}. Saya akan melampirkan file PDF di chat ini.`;window.open('https://wa.me/'+x.phone+'?text='+encodeURIComponent(msg),'_blank')} function exportProductionCSV(){exportRowsCSV('rekap-produksi-mso.csv',[['Klien','Layanan','Tanggal','Jam','Venue','Tim'],...productions.map(p=>[p.client,p.service,p.date,p.time,p.venue,p.team])])} function countMemberSessions(){const i=Number(document.getElementById('salaryMember').value),m=mediaTeam[i];if(!m){alert('Tambahkan anggota tim terlebih dahulu.');return}const from=document.getElementById('salaryPeriodStart').value,to=document.getElementById('salaryPeriodEnd').value;if(from&&to&&toString(p.team||'').toLowerCase().includes(m.name.toLowerCase())&&(!from||p.date>=from)&&(!to||p.date<=to)).length;document.getElementById('salarySessions').value=count;document.getElementById('salaryFee').value=Number(m.fee||0);alert('Ditemukan '+count+' jadwal untuk '+m.name+' pada periode yang dipilih. Periksa dan sesuaikan jumlah sesi bila diperlukan.')} function updateSalaryPeriodLabel(){const a=document.getElementById('salaryPeriodStart').value,b=document.getElementById('salaryPeriodEnd').value,label=document.getElementById('salaryPeriodLabel');if(a&&b&&b
${logo?`Logo MSO`:''}
Jasa Foto & Video Olahraga · Media Solusindo Olahraga
DOKUMEN TIM
SLIP FEE

SLIP GAJI / FEE TIM

${m.photo?`Foto ${escapeDocText(m.name)}`:''}
${escapeDocText(m.name)}
${escapeDocText(m.role)}
${m.phone?`
${escapeDocText(m.phone)}
`:''}
PERIODE PEMBAYARAN
${escapeDocText(period)}
JUMLAH SESI
${sessions} sesi
RincianJumlah
Fee sesi (${sessions} × ${fmtMoney(fee)})${fmtMoney(sessions*fee)}
Bonus / tambahan${fmtMoney(bonus)}
Potongan− ${fmtMoney(deduction)}
TOTAL DIBAYARKAN${fmtMoney(total)}
Penerima
${escapeDocText(m.name)}
Owner / MSO

Dokumen ini merupakan rekap fee berdasarkan data jadwal dan penyesuaian owner. Periksa kembali jumlah sesi, bonus, dan potongan sebelum pembayaran.

MSO MEDIA SERVICES · Media Solusindo Olahraga
`} function printSalarySlip(){if(!window.currentSalarySlip){generateSalarySlip();if(!window.currentSalarySlip)return}const el=document.getElementById('salarySlipPreview');const w=window.open('','_blank');if(!w){alert('Izinkan pop-up browser untuk mencetak slip.');return}w.document.write('Slip Gaji MSO'+el.innerHTML+'');w.document.close()} let currentStandings=[]; function calculateStandings(){ const names=(document.getElementById('standingTeams').value||'').split(/\r?\n/).map(s=>s.trim()).filter(Boolean); const unique=[...new Set(names)]; if(unique.length<2){alert('Masukkan minimal dua nama tim.');return} const rows={};unique.forEach(name=>rows[name]={team:name,played:0,w:0,d:0,l:0,gf:0,ga:0,gd:0,pts:0}); const lines=(document.getElementById('standingResults').value||'').split(/\r?\n/).map(s=>s.trim()).filter(Boolean); const errors=[]; lines.forEach((line,i)=>{ const parts=line.split(',').map(s=>s.trim()); if(parts.length!==4){errors.push('Baris '+(i+1)+': format harus Nama Tim A, skor A, Nama Tim B, skor B.');return} const [a,as,b,bs]=parts,sa=Number(as),sb=Number(bs); if(!rows[a]||!rows[b]){errors.push('Baris '+(i+1)+': nama tim tidak ditemukan pada daftar tim.');return} if(a===b){errors.push('Baris '+(i+1)+': tim tidak dapat melawan dirinya sendiri.');return} if(!Number.isInteger(sa)||!Number.isInteger(sb)||sa<0||sb<0){errors.push('Baris '+(i+1)+': skor harus bilangan bulat nol atau lebih.');return} const A=rows[a],B=rows[b];A.played++;B.played++;A.gf+=sa;A.ga+=sb;B.gf+=sb;B.ga+=sa; if(sa>sb){A.w++;B.l++;A.pts+=3}else if(sar.gd=r.gf-r.ga); currentStandings=Object.values(rows).sort((a,b)=>b.pts-a.pts||b.gd-a.gd||b.gf-a.gf||a.team.localeCompare(b.team)); const output=document.getElementById('standingsOutput'); output.innerHTML=''+currentStandings.map((r,i)=>``).join('')+'
#TimMPMSKGMGKSGPoin
${i+1}${escapeDocText(r.team)}${r.played}${r.w}${r.d}${r.l}${r.gf}${r.ga}${r.gd}${r.pts}
'; } function downloadStandingsCSV(){if(!currentStandings.length)calculateStandings();if(!currentStandings.length)return;exportRowsCSV('klasemen-mso-events.csv',[['Posisi','Tim','Main','Menang','Seri','Kalah','Gol Memasukkan','Gol Kemasukan','Selisih Gol','Poin'],...currentStandings.map((r,i)=>[i+1,r.team,r.played,r.w,r.d,r.l,r.gf,r.ga,r.gd,r.pts])])} function printStandings(){if(!currentStandings.length)calculateStandings();if(!currentStandings.length)return;const rows=currentStandings.map((r,i)=>`${i+1}${escapeDocText(r.team)}${r.played}${r.w}${r.d}${r.l}${r.gf}${r.ga}${r.gd}${r.pts}`).join('');const w=window.open('','_blank');if(!w){alert('Izinkan pop-up browser untuk mencetak klasemen.');return}w.document.write(`Klasemen MSO EVENTS

Klasemen MSO EVENTS

Dihitung berdasarkan poin, selisih gol, dan gol memasukkan.

${rows}
#TimMPMSKGMGKSGPoin

MP: Main · M: Menang · S: Seri · K: Kalah · GM: Gol memasukkan · GK: Gol kemasukan · SG: Selisih gol