darsoarafa commited on
Commit
46eddd9
·
verified ·
1 Parent(s): 597a8d1

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +168 -0
app.py ADDED
@@ -0,0 +1,168 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import random
3
+ import string
4
+ import datetime
5
+ from reportlab.lib.pagesizes import A4
6
+ from reportlab.lib import colors
7
+ from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle
8
+ from reportlab.lib.styles import ParagraphStyle, getSampleStyleSheet
9
+ from reportlab.lib.units import cm
10
+
11
+ # Daftar produk dan kategori
12
+ categories = {
13
+ "Kategori A": ["Produk A1", "Produk A2", "Produk A3", "Produk A4", "Produk A5", "Produk A6"],
14
+ "Kategori B": ["Produk B1", "Produk B2", "Produk B3", "Produk B4", "Produk B5", "Produk B6"],
15
+ "Kategori C": ["Produk C1", "Produk C2", "Produk C3", "Produk C4", "Produk C5", "Produk C6"],
16
+ "Kategori D": ["Produk D1", "Produk D2", "Produk D3", "Produk D4", "Produk D5", "Produk D6"]
17
+ }
18
+
19
+ # Fungsi untuk membuat dokumen PDF
20
+ def create_pdf(data, filename):
21
+ doc = SimpleDocTemplate(filename, pagesize=A4, rightMargin=2*cm, leftMargin=2*cm, topMargin=2*cm, bottomMargin=2*cm)
22
+ styles = getSampleStyleSheet()
23
+ elements = []
24
+
25
+ # Gaya teks
26
+ title_style = ParagraphStyle(name='Title', fontSize=16, alignment=1, spaceAfter=12)
27
+ normal_style = ParagraphStyle(name='Normal', fontSize=12, spaceAfter=8)
28
+ bold_style = ParagraphStyle(name='Bold', fontSize=12, fontName='Helvetica-Bold', spaceAfter=8)
29
+
30
+ # Header
31
+ elements.append(Paragraph("Dokumen Penawaran", title_style))
32
+ elements.append(Paragraph("PT. Contoh Perusahaan", normal_style))
33
+ elements.append(Paragraph("Jl. Contoh Alamat No. 123", normal_style))
34
+ elements.append(Spacer(1, 0.5*cm))
35
+
36
+ # Kepada Yth.
37
+ elements.append(Paragraph(f"Kepada Yth.", normal_style))
38
+ elements.append(Paragraph(f"{data['nama_prospek']}", bold_style))
39
+ elements.append(Paragraph(f"{data['alamat_prospek']}", normal_style))
40
+ elements.append(Paragraph(f"Jenis Prospek: {data['jenis_prospek']}", normal_style))
41
+ elements.append(Spacer(1, 0.5*cm))
42
+
43
+ # Tanggal
44
+ elements.append(Paragraph(f"Tanggal: {data['tanggal']}", normal_style))
45
+ elements.append(Spacer(1, 0.5*cm))
46
+
47
+ # Tabel Produk
48
+ elements.append(Paragraph("Daftar Produk yang Ditawarkan:", bold_style))
49
+ table_data = [["Nama Produk", "Jumlah", "Harga (Rp)"]]
50
+ for p in data['produk']:
51
+ table_data.append([p['nama'], str(p['jumlah']), f"{p['harga']:,}"])
52
+ table = Table(table_data)
53
+ table.setStyle(TableStyle([
54
+ ('BACKGROUND', (0, 0), (-1, 0), colors.grey),
55
+ ('TEXTCOLOR', (0, 0), (-1, 0), colors.whitesmoke),
56
+ ('ALIGN', (0, 0), (-1, -1), 'CENTER'),
57
+ ('FONTNAME', (0, 0), (-1, 0), 'Helvetica-Bold'),
58
+ ('FONTSIZE', (0, 0), (-1, -1), 12),
59
+ ('BOTTOMPADDING', (0, 0), (-1, 0), 12),
60
+ ('BACKGROUND', (0, 1), (-1, -1), colors.beige),
61
+ ('GRID', (0, 0), (-1, -1), 1, colors.black),
62
+ ]))
63
+ elements.append(table)
64
+ elements.append(Spacer(1, 0.5*cm))
65
+
66
+ # Diskon
67
+ diskon_text = f"Diskon: {data['diskon']}%".format() if 'diskon' in data else "Diskon: Tidak ada"
68
+ elements.append(Paragraph(diskon_text, normal_style))
69
+ elements.append(Spacer(1, 0.5*cm))
70
+
71
+ # Syarat dan Ketentuan
72
+ syarat_text = f"Syarat dan Ketentuan:<br/>{data['syarat']}" if 'syarat' in data else "Syarat dan Ketentuan: Tidak ada"
73
+ elements.append(Paragraph(syarat_text, normal_style))
74
+ elements.append(Spacer(1, 0.5*cm))
75
+
76
+ # Tanda Tangan
77
+ elements.append(Paragraph("Hormat kami,", normal_style))
78
+ elements.append(Paragraph("PT. Contoh Perusahaan", normal_style))
79
+
80
+ # Build PDF
81
+ doc.build(elements)
82
+ return filename
83
+
84
+ # Fungsi untuk memproses input dan membuat penawaran
85
+ def buat_penawaran(nama_prospek, alamat_prospek, jenis_prospek, produk_dipilih, jumlah_produk, harga_produk, diskon, tanggal, syarat):
86
+ data = {
87
+ 'nama_prospek': nama_prospek if nama_prospek else "Prospek Tanpa Nama",
88
+ 'alamat_prospek': alamat_prospek if alamat_prospek else "Alamat Tidak Diketahui",
89
+ 'jenis_prospek': jenis_prospek if jenis_prospek else "Individu",
90
+ 'tanggal': tanggal if tanggal else datetime.date.today().strftime("%Y-%m-%d"),
91
+ 'produk': []
92
+ }
93
+
94
+ # Proses produk
95
+ if produk_dipilih and jumlah_produk and harga_produk:
96
+ try:
97
+ jumlah_list = [int(x.strip()) for x in jumlah_produk.split(",") if x.strip()]
98
+ harga_list = [int(x.strip()) for x in harga_produk.split(",") if x.strip()]
99
+ for i, p in enumerate(produk_dipilih):
100
+ j = jumlah_list[i] if i < len(jumlah_list) else 1
101
+ h = harga_list[i] if i < len(harga_list) else 100000
102
+ data['produk'].append({'nama': p, 'jumlah': j, 'harga': h})
103
+ except ValueError:
104
+ data['produk'].append({'nama': "Produk Contoh", 'jumlah': 1, 'harga': 100000})
105
+ warning = "Peringatan: Format jumlah atau harga produk salah. Diganti dengan data contoh."
106
+ else:
107
+ data['produk'].append({'nama': "Produk Contoh", 'jumlah': 1, 'harga': 100000})
108
+
109
+ if diskon:
110
+ data['diskon'] = diskon
111
+ if syarat:
112
+ data['syarat'] = syarat
113
+
114
+ # Validasi data
115
+ missing_data = []
116
+ if not nama_prospek:
117
+ missing_data.append("Nama Prospek")
118
+ if not alamat_prospek:
119
+ missing_data.append("Alamat Prospek")
120
+ if not jenis_prospek:
121
+ missing_data.append("Jenis Prospek")
122
+ if not tanggal:
123
+ missing_data.append("Tanggal")
124
+ if not produk_dipilih or not jumlah_produk or not harga_produk:
125
+ missing_data.append("Produk, Jumlah, atau Harga")
126
+
127
+ warning = ""
128
+ if missing_data:
129
+ warning = "Peringatan: Data berikut kurang dan telah diisi dengan asumsi: " + ", ".join(missing_data) + ". Silakan lengkapi data jika perlu."
130
+
131
+ # Buat file PDF
132
+ filename = ''.join(random.choices(string.ascii_letters + string.digits, k=10)) + ".pdf"
133
+ pdf_file = create_pdf(data, filename)
134
+ return pdf_file, warning
135
+
136
+ # Interface Gradio
137
+ with gr.Blocks() as demo:
138
+ gr.Markdown("# Aplikasi Pembuatan Dokumen Penawaran")
139
+
140
+ with gr.Row():
141
+ nama_prospek = gr.Textbox(label="Nama Prospek")
142
+ alamat_prospek = gr.Textbox(label="Alamat Prospek")
143
+ jenis_prospek = gr.Dropdown(choices=["Individu", "Perusahaan", "Kafe"], label="Jenis Prospek")
144
+
145
+ with gr.Row():
146
+ tanggal = gr.Textbox(label="Tanggal Penawaran (YYYY-MM-DD)")
147
+
148
+ with gr.Row():
149
+ produk_dipilih = gr.CheckboxGroup(choices=[p for cat in categories.values() for p in cat], label="Pilih Produk")
150
+ jumlah_produk = gr.Textbox(label="Jumlah Produk (pisahkan dengan koma)")
151
+ harga_produk = gr.Textbox(label="Harga per Produk (Rp, pisahkan dengan koma)")
152
+
153
+ with gr.Row():
154
+ diskon = gr.Textbox(label="Diskon (%)")
155
+ syarat = gr.Textbox(label="Syarat dan Ketentuan")
156
+
157
+ submit_button = gr.Button("Buat Penawaran")
158
+
159
+ output_file = gr.File(label="Download Dokumen Penawaran (PDF)")
160
+ warning_text = gr.Textbox(label="Peringatan")
161
+
162
+ submit_button.click(
163
+ buat_penawaran,
164
+ inputs=[nama_prospek, alamat_prospek, jenis_prospek, produk_dipilih, jumlah_produk, harga_produk, diskon, tanggal, syarat],
165
+ outputs=[output_file, warning_text]
166
+ )
167
+
168
+ demo.launch()