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.

Python
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)
Keluaran
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, dan title, 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.

Jalankan contoh kode di pelajaran ini tanpa instalasi lewat compiler Python online.

Tandai pelajaran ini selesai

Masuk ke aplikasi untuk mencatat kemajuan, lalu lanjutkan ke pelajaran berikutnya dari perangkat mana pun.

Buka di aplikasi