Laporan Otomatis · Pelajaran 8 dari 8
Proyek: rekap penjualan warung
12 menit baca · BelajarCode
Sebuah warung mencatat pesanan dari pesan singkat pelanggan ke dalam file teks. Formatnya tidak seragam. Setiap akhir minggu, pemilik ingin tahu omzet per hari, produk terlaris, dan pelanggan yang paling sering memesan.
1import re2from datetime import datetime3from pathlib import Path45HARGA = {"kopi susu": 15000, "teh tarik": 12000, "roti bakar": 18000, "mi goreng": 20000}6HARI = ["Senin", "Selasa", "Rabu", "Kamis", "Jumat", "Sabtu", "Minggu"]78Path("pesanan.txt").write_text("""07/09/2026 | bu sari | 2x Kopi Susu, 1x roti bakar907/09/2026 | Pak Budi | 3x kopi susu1008/09/2026 | BU SARI | 1x teh tarik1108/09/2026 | dewi | 2x mi goreng, 2x teh tarik1209/09/2026 | Pak budi | 1x kopi susu, 1x martabak13""", encoding="utf-8")141516def rupiah(angka):17 return "Rp" + f"{angka:,.0f}".replace(",", ".")181920omzet_harian = {}21porsi_produk = {}22pesanan_pelanggan = {}23catatan = []2425for nomor, baris in enumerate(Path("pesanan.txt").read_text(encoding="utf-8").splitlines(), start=1):26 tanggal_teks, pelanggan, isi = [bagian.strip() for bagian in baris.split("|")]27 tanggal = datetime.strptime(tanggal_teks, "%d/%m/%Y").date()28 pelanggan = " ".join(pelanggan.split()).title()29 pesanan_pelanggan[pelanggan] = pesanan_pelanggan.get(pelanggan, 0) + 13031 for jumlah, produk in re.findall(r"(\d+)x\s*([a-z ]+)", isi.lower()):32 produk = produk.strip()33 if produk not in HARGA:34 catatan.append(f"Baris {nomor}: produk '{produk}' tidak ada di daftar harga")35 continue36 jumlah = int(jumlah)37 omzet_harian[tanggal] = omzet_harian.get(tanggal, 0) + jumlah * HARGA[produk]38 porsi_produk[produk] = porsi_produk.get(produk, 0) + jumlah3940print("OMZET HARIAN")41for tanggal in sorted(omzet_harian):42 print(f" {HARI[tanggal.weekday()]:<7}{tanggal:%d/%m} {rupiah(omzet_harian[tanggal]):>10}")43print(f" {'Total':<13}{rupiah(sum(omzet_harian.values())):>10}")4445terlaris = max(porsi_produk, key=porsi_produk.get)46print(f"\nProduk terlaris: {terlaris.title()} ({porsi_produk[terlaris]} porsi)")47langganan = max(pesanan_pelanggan, key=pesanan_pelanggan.get)48print(f"Pelanggan tersering: {langganan} ({pesanan_pelanggan[langganan]} pesanan)")4950if catatan:51 print("\nPerlu diperiksa:")52 for c in catatan:53 print(" -", c)OMZET HARIAN Senin 07/09 Rp93.000 Selasa 08/09 Rp76.000 Rabu 09/09 Rp15.000 Total Rp184.000 Produk terlaris: Kopi Susu (6 porsi) Pelanggan tersering: Bu Sari (2 pesanan) Perlu diperiksa: - Baris 5: produk 'martabak' tidak ada di daftar harga
Hal penting dari proyek ini
- Nama pelanggan diseragamkan dengan
split,join, dantitle, sehingga "bu sari" dan "BU SARI" dihitung sebagai orang yang sama. - Regex mengambil pasangan jumlah dan produk, berapa pun banyaknya produk dalam satu baris.
- Data yang tidak dikenali tidak dibuang diam-diam, melainkan dicatat di bagian "Perlu diperiksa".
- Daftar harga disimpan di satu tempat (
HARGA). Jika harga berubah, cukup ubah satu baris.
Jalankan otomatis setiap minggu
Di komputermu sendiri, program seperti ini bisa dijadwalkan berjalan otomatis, misalnya dengan Task Scheduler di Windows atau cron di Linux dan macOS, lalu hasilnya disimpan sebagai file laporan.
Cek pemahaman
Pelanggan "Pak Budi" dan "Pak budi" muncul di data. Kenapa program menghitungnya sebagai satu pelanggan?
Latihan
Tambah produk dan diskon
Tambahkan "martabak" seharga Rp25.000 ke daftar harga, lalu terapkan diskon 10% untuk pesanan yang nilainya Rp50.000 atau lebih per baris. Tampilkan total omzet setelah diskon.
Pembahasan
1import re23HARGA = {"kopi susu": 15000, "teh tarik": 12000, "roti bakar": 18000,4 "mi goreng": 20000, "martabak": 25000}5pesanan = [6 "2x Kopi Susu, 1x roti bakar",7 "3x kopi susu",8 "1x teh tarik",9 "2x mi goreng, 2x teh tarik",10 "1x kopi susu, 1x martabak",11]1213total = 014for isi in pesanan:15 nilai = sum(int(j) * HARGA[p.strip()] for j, p in re.findall(r"(\d+)x\s*([a-z ]+)", isi.lower()))16 if nilai >= 50000:17 nilai = nilai * 90 // 10018 print(f"{isi:<28} {nilai}")19 total += nilai20print("Total setelah diskon:", total)2x Kopi Susu, 1x roti bakar 48000 3x kopi susu 45000 1x teh tarik 12000 2x mi goreng, 2x teh tarik 57600 1x kopi susu, 1x martabak 40000 Total setelah diskon: 202600
Hanya pesanan keempat (Rp64.000) yang mencapai batas Rp50.000, sehingga didiskon menjadi Rp57.600. Pesanan pertama bernilai Rp48.000, sedikit di bawah batas, jadi tidak didiskon. Selalu uji aturan seperti ini dengan nilai di sekitar batasnya.
Jalankan contoh kode di pelajaran ini tanpa instalasi lewat compiler Python online.