Dashboard Kasir
Kelola transaksi cetak spanduk
Transaksi Baru
Transaksi Hari Ini
| No | Nama Pembeli | No HP | File | Bahan | Ukuran | Finishing | Total | Aksi |
|---|---|---|---|---|---|---|---|---|
| Belum ada transaksi hari ini | ||||||||
Total Transaksi: 0 Total: Rp 0
Dashboard Admin
Kelola harga dan menu kasir
Kelola Bahan Spanduk
Belum ada data bahan
Kelola Finishing
Belum ada data finishing
Pengaturan Struk
Laporan Keuangan
Laporan global dan pengeluaran
Total Transaksi
0
Total Penjualan
Rp 0
Total Pengeluaran
Rp 0
Keuntungan Bersih
Rp 0
Perbandingan
Detail Transaksi Per Tanggal
Memuat data...
Total Transaksi
0
Total Pendapatan
Rp 0
Rata-rata per Transaksi
Rp 0
Detail Transaksi Penjualan
| Tanggal | Nama Pembeli | Bahan | Ukuran | Finishing | Total |
|---|---|---|---|---|---|
| Belum ada data laporan | |||||
Input Pengeluaran Baru
Total Pengeluaran
Rp 0
Jumlah Transaksi
0
Rata-rata
Rp 0
Daftar Pengeluaran
| No | Tanggal | Nama Transaksi | Total | Aksi |
|---|---|---|---|---|
| Belum ada data pengeluaran | ||||
Pengaturan
Konfigurasi koneksi Google Sheets
Apps Script Web App URL
Masukkan URL Web App dari Google Apps Script yang sudah di-deploy
Kode Google Apps Script
Salin kode berikut ke Google Apps Script Anda, lalu klik "Initialize" untuk membuat struktur tabel:
// Google Apps Script untuk Tefa Printing Dashboard
// Salin seluruh kode ini ke script.google.com
const SHEET_NAMES = {
TRANSAKSI: 'Transaksi',
PENGELUARAN: 'Pengeluaran',
BAHAN: 'Bahan',
FINISHING: 'Finishing',
SETTINGS: 'Settings'
};
// Fungsi untuk inisialisasi sheet
function initialize() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
// Buat sheet Transaksi
let transaksiSheet = ss.getSheetByName(SHEET_NAMES.TRANSAKSI);
if (!transaksiSheet) {
transaksiSheet = ss.insertSheet(SHEET_NAMES.TRANSAKSI);
transaksiSheet.getRange(1, 1, 1, 9).setValues([[
'ID', 'Tanggal', 'Nama Pembeli', 'No HP',
'Nama File', 'Bahan', 'Ukuran', 'Finishing', 'Total'
]]);
transaksiSheet.getRange(1, 1, 1, 9).setFontWeight('bold');
}
// Buat sheet Pengeluaran
let pengeluaranSheet = ss.getSheetByName(SHEET_NAMES.PENGELUARAN);
if (!pengeluaranSheet) {
pengeluaranSheet = ss.insertSheet(SHEET_NAMES.PENGELUARAN);
pengeluaranSheet.getRange(1, 1, 1, 4).setValues([[
'ID', 'Tanggal', 'Nama Transaksi', 'Total'
]]);
pengeluaranSheet.getRange(1, 1, 1, 4).setFontWeight('bold');
}
// Buat sheet Bahan
let bahanSheet = ss.getSheetByName(SHEET_NAMES.BAHAN);
if (!bahanSheet) {
bahanSheet = ss.insertSheet(SHEET_NAMES.BAHAN);
bahanSheet.getRange(1, 1, 1, 2).setValues([['Nama Bahan', 'Harga per m²']]);
bahanSheet.getRange(1, 1, 1, 2).setFontWeight('bold');
// Data contoh
bahanSheet.getRange(2, 1, 3, 2).setValues([
['Flexi China', 25000],
['Flexi Korea', 35000],
['Albatros', 45000]
]);
}
// Buat sheet Finishing
let finishingSheet = ss.getSheetByName(SHEET_NAMES.FINISHING);
if (!finishingSheet) {
finishingSheet = ss.insertSheet(SHEET_NAMES.FINISHING);
finishingSheet.getRange(1, 1, 1, 2).setValues([['Nama Finishing', 'Harga']]);
finishingSheet.getRange(1, 1, 1, 2).setFontWeight('bold');
// Data contoh
finishingSheet.getRange(2, 1, 4, 2).setValues([
['Tanpa Finishing', 0],
['Mata Ayam', 5000],
['Selongsong', 10000],
['Lipat Tepi', 15000]
]);
}
// Buat sheet Settings
let settingsSheet = ss.getSheetByName(SHEET_NAMES.SETTINGS);
if (!settingsSheet) {
settingsSheet = ss.insertSheet(SHEET_NAMES.SETTINGS);
settingsSheet.getRange(1, 1, 1, 2).setValues([['Key', 'Value']]);
settingsSheet.getRange(1, 1, 1, 2).setFontWeight('bold');
settingsSheet.getRange(2, 1, 4, 2).setValues([
['struk_header', 'TEFA PRINTING'],
['struk_alamat', 'Jl. Pendidikan No. 1'],
['struk_telepon', '(021) 12345678'],
['struk_footer', 'Terima Kasih!']
]);
}
return { success: true, message: 'Inisialisasi berhasil!' };
}
// Handle GET requests
function doGet(e) {
const action = e.parameter.action;
let result;
try {
switch(action) {
case 'getBahan':
result = getBahan();
break;
case 'getFinishing':
result = getFinishing();
break;
case 'getTransaksi':
result = getTransaksi(e.parameter.filter, e.parameter.date);
break;
case 'getPengeluaran':
result = getPengeluaran(e.parameter.filter, e.parameter.date);
break;
case 'getSettings':
result = getSettings();
break;
case 'initialize':
result = initialize();
break;
default:
result = { error: 'Unknown action' };
}
} catch(error) {
result = { error: error.toString() };
}
return ContentService.createTextOutput(JSON.stringify(result))
.setMimeType(ContentService.MimeType.JSON);
}
// Handle POST requests
function doPost(e) {
const data = JSON.parse(e.postData.contents);
const action = data.action;
let result;
try {
switch(action) {
case 'addTransaksi':
result = addTransaksi(data.data);
break;
case 'addPengeluaran':
result = addPengeluaran(data.data);
break;
case 'addBahan':
result = addBahan(data.data);
break;
case 'deleteBahan':
result = deleteBahan(data.nama);
break;
case 'deletePengeluaran':
result = deletePengeluaran(data.id);
break;
case 'addFinishing':
result = addFinishing(data.data);
break;
case 'deleteFinishing':
result = deleteFinishing(data.nama);
break;
case 'saveSettings':
result = saveSettings(data.data);
break;
default:
result = { error: 'Unknown action' };
}
} catch(error) {
result = { error: error.toString() };
}
return ContentService.createTextOutput(JSON.stringify(result))
.setMimeType(ContentService.MimeType.JSON);
}
function getBahan() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName(SHEET_NAMES.BAHAN);
if (!sheet) return [];
const data = sheet.getDataRange().getValues();
const result = [];
for (let i = 1; i < data.length; i++) {
if (data[i][0]) {
result.push({ nama: data[i][0], harga: data[i][1] });
}
}
return result;
}
function getFinishing() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName(SHEET_NAMES.FINISHING);
if (!sheet) return [];
const data = sheet.getDataRange().getValues();
const result = [];
for (let i = 1; i < data.length; i++) {
if (data[i][0]) {
result.push({ nama: data[i][0], harga: data[i][1] });
}
}
return result;
}
function getTransaksi(filter, dateStr) {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName(SHEET_NAMES.TRANSAKSI);
if (!sheet) return [];
const data = sheet.getDataRange().getValues();
const result = [];
const targetDate = dateStr ? new Date(dateStr) : new Date();
for (let i = 1; i < data.length; i++) {
if (!data[i][0]) continue;
const rowDate = new Date(data[i][1]);
let include = false;
if (filter === 'harian') {
include = rowDate.toDateString() === targetDate.toDateString();
} else if (filter === 'mingguan') {
const weekStart = new Date(targetDate);
weekStart.setDate(targetDate.getDate() - targetDate.getDay());
const weekEnd = new Date(weekStart);
weekEnd.setDate(weekStart.getDate() + 6);
include = rowDate >= weekStart && rowDate <= weekEnd;
} else if (filter === 'bulanan') {
include = rowDate.getMonth() === targetDate.getMonth() &&
rowDate.getFullYear() === targetDate.getFullYear();
} else {
include = true;
}
if (include) {
result.push({
id: data[i][0],
tanggal: data[i][1],
nama_pembeli: data[i][2],
no_hp: data[i][3],
nama_file: data[i][4],
bahan: data[i][5],
ukuran: data[i][6],
finishing: data[i][7],
total: data[i][8]
});
}
}
return result;
}
function getPengeluaran(filter, dateStr) {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName(SHEET_NAMES.PENGELUARAN);
if (!sheet) return [];
const data = sheet.getDataRange().getValues();
const result = [];
const targetDate = dateStr ? new Date(dateStr) : new Date();
for (let i = 1; i < data.length; i++) {
if (!data[i][0]) continue;
const rowDate = new Date(data[i][1]);
let include = false;
if (filter === 'harian') {
include = rowDate.toDateString() === targetDate.toDateString();
} else if (filter === 'mingguan') {
const weekStart = new Date(targetDate);
weekStart.setDate(targetDate.getDate() - targetDate.getDay());
const weekEnd = new Date(weekStart);
weekEnd.setDate(weekStart.getDate() + 6);
include = rowDate >= weekStart && rowDate <= weekEnd;
} else if (filter === 'bulanan') {
include = rowDate.getMonth() === targetDate.getMonth() &&
rowDate.getFullYear() === targetDate.getFullYear();
} else {
include = true;
}
if (include) {
result.push({
id: data[i][0],
tanggal: data[i][1],
nama: data[i][2],
total: data[i][3]
});
}
}
return result;
}
function addTransaksi(transaksi) {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName(SHEET_NAMES.TRANSAKSI);
if (!sheet) return { error: 'Sheet tidak ditemukan' };
const id = 'TRX' + Date.now();
sheet.appendRow([
id,
new Date().toISOString(),
transaksi.nama_pembeli,
transaksi.no_hp,
transaksi.nama_file,
transaksi.bahan,
transaksi.ukuran,
transaksi.finishing,
transaksi.total
]);
return { success: true, id: id };
}
function addPengeluaran(pengeluaran) {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName(SHEET_NAMES.PENGELUARAN);
if (!sheet) return { error: 'Sheet tidak ditemukan' };
const id = 'PG' + Date.now();
sheet.appendRow([
id,
pengeluaran.tanggal,
pengeluaran.nama,
pengeluaran.total
]);
return { success: true, id: id };
}
function addBahan(bahan) {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName(SHEET_NAMES.BAHAN);
if (!sheet) return { error: 'Sheet tidak ditemukan' };
sheet.appendRow([bahan.nama, bahan.harga]);
return { success: true };
}
function deleteBahan(nama) {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName(SHEET_NAMES.BAHAN);
if (!sheet) return { error: 'Sheet tidak ditemukan' };
const data = sheet.getDataRange().getValues();
for (let i = 1; i < data.length; i++) {
if (data[i][0] === nama) {
sheet.deleteRow(i + 1);
return { success: true };
}
}
return { error: 'Data tidak ditemukan' };
}
function addFinishing(finishing) {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName(SHEET_NAMES.FINISHING);
if (!sheet) return { error: 'Sheet tidak ditemukan' };
sheet.appendRow([finishing.nama, finishing.harga]);
return { success: true };
}
function deleteFinishing(nama) {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName(SHEET_NAMES.FINISHING);
if (!sheet) return { error: 'Sheet tidak ditemukan' };
const data = sheet.getDataRange().getValues();
for (let i = 1; i < data.length; i++) {
if (data[i][0] === nama) {
sheet.deleteRow(i + 1);
return { success: true };
}
}
return { error: 'Data tidak ditemukan' };
}
function getSettings() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName(SHEET_NAMES.SETTINGS);
if (!sheet) return {};
const data = sheet.getDataRange().getValues();
const result = {};
for (let i = 1; i < data.length; i++) {
if (data[i][0]) {
result[data[i][0]] = data[i][1];
}
}
return result;
}
function saveSettings(settings) {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName(SHEET_NAMES.SETTINGS);
if (!sheet) return { error: 'Sheet tidak ditemukan' };
const data = sheet.getDataRange().getValues();
for (const key in settings) {
let found = false;
for (let i = 1; i < data.length; i++) {
if (data[i][0] === key) {
sheet.getRange(i + 1, 2).setValue(settings[key]);
found = true;
break;
}
}
if (!found) {
sheet.appendRow([key, settings[key]]);
}
}
return { success: true };
}
Cara Deploy:
- Buka Google Sheets baru
- Klik Extensions → Apps Script
- Hapus kode default dan paste kode di atas
- Klik tombol "Run" dan pilih fungsi "initialize" untuk membuat struktur tabel
- Klik Deploy → New deployment
- Pilih "Web app", set akses "Anyone"
- Klik Deploy dan salin URL
- Paste URL di field di atas