Repository: tegohsx/laporan-keuangan-bot
Branch: main
Commit: 7ecc571e0db9
Files: 2
Total size: 9.7 KB
Directory structure:
gitextract_qm0c1jqc/
├── Kode.gs
└── README.md
================================================
FILE CONTENTS
================================================
================================================
FILE: Kode.gs
================================================
//CONFIG
var BOT_TOKEN = "6642440655:AADRAWN3nXcuJf5xJkSQLhyJgQXGag08cLc" //BOT TOKEN ANDA
var SS_URL = "https://docs.google.com/spreadsheets/d/1LArhvsBXZ8lJ3tzvx8DyYrFWwtRxlQsWQEFzdsyignw/edit#gid=0" //URL SPREADSHEET
var CREDIT_SHEET_NAME = "Pemasukan" //NAMA SHEET PEMASUKAN
var DEBIT_SHEET_NAME = "Pengeluaran" //NAMA SHEET PENGELUARAN
//BEGIN
const ss = SpreadsheetApp.openByUrl(SS_URL);
const creditSheet = ss.getSheetByName(CREDIT_SHEET_NAME);
const debitSheet = ss.getSheetByName(DEBIT_SHEET_NAME);
const Credit = new Collection.Collect(creditSheet)
const Debit = new Collection.Collect(debitSheet)
function doGet(e) {
return HtmlService.createHtmlOutput('
OK
')
}
function doPost(e) {
const queryParameters = e.parameter;
const usersQuery = queryParameters.users
const validUsers = usersQuery.split(',')
try {
if (e.postData.type == "application/json") {
let update = JSON.parse(e.postData.contents);
if (update) {
commands(update, validUsers)
return true
}
}
} catch (e) {
Logger.log(e)
}
}
function commands(update, validUsers) {
const chatId = update.message.chat.id;
const first_name = update.message.chat.first_name;
const text = update.message.text || '';
const tanggal = new Date().toLocaleString();
const _date = new Date().toJSON()
if (validUsers.includes(String(chatId))) {
if (text.startsWith("/start")) {
sendMessage({
chat_id: chatId,
text: "Mulai laporan keuangan.\nPemasukan:\n/masuk [nominal] [#kategori] [item1, item2 dst]\nPengeluaran:\n/keluar [nominal] [#kategori] [item1, item2 dst]\n\nRekapitulasi: /rekap [tanggal/bulan] [tanggal/bulan (opsional)]\nTanggal dan bulan berformat YYYY-MM-DD dan YYYY-MM\nContoh: \n/rekap 2024-01-01\n/rekap 2024-01-01 2024-01-10\n/rekap 2024-01\n/rekap 2024-01 2024-06"
})
} else if (text.startsWith("/masuk")) {
const stext = text.split(' ')
const nominal = Number(stext[1]);
const kategori = stext[2].startsWith('#') ? stext[2].replace('#', '') : '';
stext.splice(0, 3);
const item = stext.join(' ')
if (nominal && kategori && item) {
Credit.insert(
{
_date,
Tanggal: tanggal,
Kategori: kategori,
Nominal: nominal,
Item: item,
ReporterID: chatId,
ReporterName: first_name
}
)
sendMessage({
chat_id: chatId,
text: 'Laporan pemasukan sukses.'
})
} else {
sendMessage({
chat_id: chatId,
text: 'Gagal. Pastikan sesuai format. \n/masuk [harga] [#kategori] [item1, item2 dst]'
})
}
} else if (text.startsWith("/keluar")) {
const stext = text.split(' ')
const nominal = Number(stext[1]);
const kategori = stext[2].startsWith('#') ? stext[2].replace('#', '') : '';
stext.splice(0, 3);
const item = stext.join(' ')
if (nominal && kategori && item) {
Debit.insert(
{
_date,
Tanggal: tanggal,
Kategori: kategori,
Nominal: nominal,
Item: item,
ReporterID: chatId,
ReporterName: first_name
}
)
sendMessage({
chat_id: chatId,
text: 'Laporan pengeluaran sukses.'
})
} else {
sendMessage({
chat_id: chatId,
text: 'Gagal. Pastikan sesuai format. \n/keluar [harga] [#kategori] [item1, item2 dst]'
})
}
} else if (text.startsWith("/rekap")) {
const stext = text.split(' ')
stext.splice(0, 1);
const oDateRange = Collection.generateDateRange(stext.join(' '))
const dataRange = oDateRange.dateRange
const sumType = oDateRange.sumType
const monthNames = ['Januari', 'Februari', 'Maret', 'April', 'Mei', 'Juni', 'Juli', 'Agustus', 'September', 'Oktober', 'November', 'Desember']
if (dataRange.length > 0) {
let textToSend = "Rekapitulasi: \n"
for (let _date of dataRange) {
const pengeluaran = Debit.find(
{
_date: d => new Date(d) >= _date.from && new Date(d) < _date.to
}
)
const pemasukan = Credit.find(
{
_date: d => new Date(d) >= _date.from && new Date(d) < _date.to
}
)
let rekapMasuk = pemasukan.reduce((acc, item) => {
if (!acc[item.Kategori]) {
acc[item.Kategori] = 0;
}
acc[item.Kategori] += item.Nominal;
return acc;
}, {});
let rekapKeluar = pengeluaran.reduce((acc, item) => {
if (!acc[item.Kategori]) {
acc[item.Kategori] = 0;
}
acc[item.Kategori] += item.Nominal;
return acc;
}, {});
if (sumType == 'daily') {
let dateTo = new Date(_date.to)
dateTo.setDate(dateTo.getDate() - 1)
textToSend += "Pemasukan " + _date.from.toLocaleDateString() + ' s.d ' + dateTo.toLocaleDateString() + "\n"
textToSend += Object.keys(rekapMasuk).map((i) => `${i}: ${Number(rekapMasuk[i]).toLocaleString('id-ID')}`).join('\n') || '---'
textToSend += '\nTotal: ' + Object.values(rekapMasuk).reduce((acc, value) => acc + value, 0).toLocaleString('id-ID');
textToSend += "\n"
textToSend += "\n"
textToSend += "Pengeluaran " + _date.from.toLocaleDateString() + ' s.d ' + dateTo.toLocaleDateString() + "\n"
textToSend += Object.keys(rekapKeluar).map((i) => `${i}: ${Number(rekapKeluar[i]).toLocaleString('id-ID')}`).join('\n') || '---'
textToSend += '\nTotal: ' + Object.values(rekapKeluar).reduce((acc, value) => acc + value, 0).toLocaleString('id-ID');
textToSend += "\n"
textToSend += "\n"
}
else {
textToSend += "Pemasukan bulan " + monthNames[_date.from.getMonth()] + ' ' + _date.from.getFullYear() + "\n"
textToSend += Object.keys(rekapMasuk).map((i) => `${i}: ${Number(rekapMasuk[i]).toLocaleString('id-ID')}`).join('\n') || '---'
textToSend += '\nTotal: ' + Object.values(rekapMasuk).reduce((acc, value) => acc + value, 0).toLocaleString('id-ID');
textToSend += "\n"
textToSend += "\n"
textToSend += "Pengeluaran bulan " + monthNames[_date.from.getMonth()] + ' ' + _date.from.getFullYear() + "\n"
textToSend += Object.keys(rekapKeluar).map((i) => `${i}: ${Number(rekapKeluar[i]).toLocaleString('id-ID')}`).join('\n') || '---'
textToSend += '\nTotal: ' + Object.values(rekapKeluar).reduce((acc, value) => acc + value, 0).toLocaleString('id-ID');
textToSend += "\n"
textToSend += "\n"
}
}
sendMessage({
chat_id: chatId,
text: textToSend
})
} else {
sendMessage({
chat_id: chatId,
text: 'Gagal. Pastikan sesuai format. \n/rekap [tanggal/bulan] [tanggal/bulan (opsional)]\nTanggal dan bulan berformat YYYY-MM-DD dan YYYY-MM\nContoh: \n/rekap 2024-01-01\n/rekap 2024-01-01 2024-01-10\n/rekap 2024-01\n/rekap 2024-01 2024-06'
})
}
}
}
}
function sendMessage(postdata) {
var options = {
'method': 'post',
'contentType': 'application/json',
'payload': JSON.stringify(postdata),
'muteHttpExceptions': true
};
UrlFetchApp.fetch('https://api.telegram.org/bot' + BOT_TOKEN + '/sendMessage', options);
}
================================================
FILE: README.md
================================================
# laporan-keuangan-bot
[]()
[]()
Laporan keuangan, pencataan pemasukan dan pengeluaran dengan Bot Telegram yang terintegrasi dengan Google Spreadsheet
### Video Tutorial
https://youtu.be/sII577Ubv-E
### Yang ada di bot
1. Input pemasukan: /masuk [nominal] [#kategori] [item1, item2, keterangan dsb.]
Contoh:
/masuk 100000 #gaji angkut barang
2. Input pengeluaran: /keluar [nominal] [#kategori] [item1, item2, keterangan dsb.]
Contoh:
/keluar 50000 #makan roti dan kopi
3. Rekapitulasi: /rekap [tanggal/bulan] [tanggal/bulan (opsional)]
Tanggal dan bulan berformat YYYY-MM-DD dan YYYY-MM
Contoh:
/rekap 2024-02-01
/rekap 2024-02-01 2024-02-10
/rekap 2024-02
/rekap 2024-02 2024-06
# Mulai
## Buat Bot telegram
1. Buka telegram search @BotFather
2. Create New Bot /newbot
3. Masukkan nama kemudian username.
4. Setelah berhasil maka akan mendapatkan Bot Token.
## Buat Spreadsheet
Buat dua sheet untuk pemasukan dan pengeluaran dengan kolom:
1. _id
2. _date
3. Tanggal
4. Kategori
5. Item
6. Nominal
7. ReporterID
8. ReporterName
## Buat Apps Script
1. Copy Kode.gs
2. Sesuaikan Token, Spreadsheet URL, dan Nama Sheet untuk pemasukan dan pengeluaran
3. Tambahkan Library dengan ID: 1CZD-ai-ImkabBPSBVOqnFFWlXoA5kUEfoXvUXOC3uQHr_qpF1H7amHMr
4. Deploy sebagai Web app, dan simpan URL-nya
## Set webhook Bot Telegram
1. Buka di browser https[]()://api.telegram.org/bot[token]/setwebhook?url=[url hasil deploy]?users=ChatID1,ChatID2,...
Sesuaikan ChatID* dengan user yang akan menggunakan bot, bisa lebih dari satu, pisahkan dengan koma.
## *Note:
Untuk mendapatkan Chat ID, buka telegram, search @getYourID_bot atau https://t.me/getyourid_bot
## Contact
Telegram: https://t.me/mastgh
WhatsApp: +62 855-1000-113
## Donasi
Paypal tegohsx@gmail.com
BRI 000401061441500
Jago 100310049829
DANA/GOPAY 085290465350
a/n Teguh S