// ==UserScript==
// @name Cetak Sekaligus Kertas A6
// @author Celleven Store
// @namespace https://www.tokopedia.com/celleven
// @version 0.0.20
// @description Untuk mencetak sekaligus buat kertas ukuran A6 untuk Tokopedia, Bukalapak, Shopee, dan Akulaku
// @require https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js
// @match https://www.tokopedia.com/logistic/print-address*
// @match https://www.tokopedia.com/print-address.pl*
// @match https://seller.shopee.co.id/api/v2/orders/waybill*
// @match https://www.bukalapak.com/payment/transactions/print_preview*
// @match http://vendor.akulaku.com/*
// @run-at document-idle
// ==/UserScript==
(function() {
'use strict';
var backgroundImage = '';
var logo = '';
if (window.location.href.indexOf("tokopedia") > -1)
{
cetakTokopedia();
}
else if (window.location.href.indexOf("shopee") > -1)
{
cetakShopee();
}
else if (window.location.href.indexOf("bukalapak") > -1)
{
cetakBukalapak();
}
else if (window.location.href.indexOf("akulaku") > -1)
{
cetakAkulaku();
}
})();
function cetakTokopedia()
{
var styleCSS = `<style>
@page
{
size: 105mm 148mm portrait;
margin: 3mm 2mm 2mm 3mm;
}
@media print
{
div.address_contaier_left, div.address_contaier_right, div.address
{
float: none !important;
padding-left: 0px;
width: 540px !important;
}
div.address
{
page-break-after: always;
}
/*body
{
zoom: 117%;
}*/
h5
{
display: none;
}
div.address_contaier_left > div > table, div.address_contaier_right > div > table
{
width: 540px !important;
}
div.additional_info_wrapper
{
margin-top: 7px;
margin-bottom: -10px;
}
div.header_wrapper
{
padding: 10px;
margin-bottom: 5px;
}
}
</style>`;
$('body').append(styleCSS);
$('div.address > table > tbody > tr > td').each(function(x, r)
{
$(r).find('table:contains("Kepada") > tbody > tr > td > div').css('font-size', '17px');
});
$("table div:contains('bayar asuransi')").remove();
$("div.page-break").remove();
$("td div:contains('Asuransi')").next().html('+ Rp 0').css('text-decoration', 'none');
$("td div:contains('Ongkir')").next().css('text-decoration', 'none');
$("div.address_contaier_right").each(function()
{
if ($(this).children().length == 0)
{
$(this).remove();
}
});
$("div.address").filter(function()
{
return $(this).text().trim() == "";
}).remove();
$("div.address_contaier_right").filter(function()
{
return $(this).text().trim() == "";
}).remove();
}
function cetakShopee()
{
var styleCSS = `<style>
@page
{
margin: 4mm 1mm 2mm 4mm;
}
@media print
{
.page
{
float: none !important;
page-break-after: always;
border-right: none !important;
width: 48%;
}
body.container
{
margin: 0;
}
div.page.left
{
margin-left: -1px;
}
div.page.left
{
padding: 0 0.55in 0 0;
border-right: none;
}
div.page.right
{
padding: 0 0.55in 0 0;
border-left: none;
}
table.instruction.no-print + div.left
{
padding: 0 15px 0 0;
}
table.instruction.no-print + div.left + div.right
{
padding: 0 15px 0 0;
}
div.cut-line.shipping-label, div.cut-line
{
width: 100%;
}
}
</style>`;
$('style:last').html($('style:last').html().replace('A4 landscape', 'auto'));
$('style:first').html($('style:first').html().replace('A4 landscape', 'auto'));
$('style:first').html($('style:first').html().replace('size: landscape; margin: 0.1in 0.2in;', 'size: auto;'));
$('head').append(styleCSS);
$('div.page-breaker').remove();
$('div:last').remove();
$('img.scissors-vertical').remove();
$('div.scissors_icon').remove();
$(".page.right").each(function()
{
if ($("div.job-shipping-label", this).length > 0)
{
$("style:last").html($('style:last').html().replace(/(padding: 0 0.55in 0 0;)/g, ""));
}
});
$("div.page:has(div.job-shipping-label)").css("width", "550px");
$("div.container:has(div.right) > div.page:has(div.job-shipping-label)").css("width", "530px");
}
function cetakBukalapak()
{
var styleCSS = `<style>
@media print
{
div.transaction-slip
{
page-break-after: always;
margin-top: 20px;
}
div#page > div.row > div.row-item
{
float: none;
width: 100%;
}
div.row
{
font-size: 13pt;
}
div.bukalapak-transaction-slip-footer
{
font-size: 12pt;
}
div.transaction-slip > div.row > table > tbody > tr > td > span
{
font-size: 13pt !important;
}
div.notice
{
font-size: 12pt;
}
div.section-logistic-booking > strong
{
font-size: 18pt !important;
}
div.section-logistic-booking > img
{
height: 82px !important;
width: 500px !important;
}
div.brand-logo > img
{
height: 39px !important;
}
div.row-item > img
{
height: 64px !important;
}
}
</style>`;
$('body').append(styleCSS);
}
let label = `
<div class="label_alamat">
<div class="label">
<div class="header">
<div class="logo">
<img src="{{logotoko}}" width="115" height="24">
</div>
<div class="label_pengiriman">
Label Pengiriman
</div>
</div>
<div class="barcode"></div>
<div class="job" style="display: none;">{{kode_booking}}</div>
<div class="ekspedisi">
<div class="logokurir">
<img src="{{logokurir}}" width="80%">
</div>
<div class="kurir">{{ekspedisi}}</div>
<div class="invoice">Nomor Invoice<br>{{invoice}}</div>
</div>
<div class="adminongkir">
<div class="admin">Administrasi<br><span class="harga_admin">{{administrasi}}</span></div>
<div class="asuransi">Asuransi<br><span class="harga_asuransi">{{asuransi}}</span></div>
<div class="ongkir">SubTotal<br><span class="harga_ongkir">{{ongkir}}</span></div>
<div class="berat">Tanggal<br><span class="total_berat">{{berat}}</span></div>
</div>
<div class="penerima">
<div class="kepada">Kepada</div>
<div class="penerima2">
<div class="nama_penerima"><b>{{nama_penerima}}</b> - {{telepon_penerima}}</div>
<div class="alamat_penerima"><b>Alamat</b><br>{{alamat_penerima}}</div>
</div>
</div>
<div class="pengirim">
<div class="dari">Dari</div>
<div class="pengirim2">
<div class="nama_pengirim"><b>{{nama_pengirim}}</b> - {{telepon_pengirim}}</div>
<div class="alamat_pengirim">{{alamat_pengirim}}</div>
</div>
</div>
<div class="gunting">
<div class="icon_gunting">
<img src="https://ecs7.tokopedia.net/img/kurir/icon-cut.png" width="14">
</div>
</div>
{{foreach_item}}
<div class="clear"></div>
</div>
</div>
`;
// foreach_item menggunakan template ini
let item = `
<div class="item">
<div class="jumlah">{{jumlah_produk}}</div>
<div class="produk">
<div class="nama_produk">{{nama_produk}}{{sku}}</div>
<div class="keterangan">Keterangan: {{keterangan_produk}}</div>
</div>
</div>
`;
let css = `
<style type="text/css">
body
{
width: 1050px;
font-size: 13px;
font-family: sans-serif;
}
.print_area
{
width: 100%;
}
.kiri
{
float: left;
width: 50%;
}
.kanan
{
float: left;
margin-left: 5px;
width: 49%;
}
.label_alamat
{
border: 1px solid black;
margin-top: 5px;
width: 100%;
}
.label
{
padding: 10px;
}
.header
{
border-bottom: 1px dashed #bdbcbc;
padding-bottom: 5px;
height: 27px;
}
.logo
{
width: 50%;
float: left;
}
.label_pengiriman
{
width: 50%;
text-align: right;
float: right;
font-weight: bold;
font-size: 18px;
position: relative;
top: 2px;
}
.print
{
margin-bottom: 3px;
font-weight: bold;
font-family: sans-serif;
font-size: 15px;
}
.print a
{
color: green;
text-decoration: none;
}
@media print
{
@page
{
size: auto;
margin: 5mm 5mm 5mm 5mm;
}
.print
{
display: none;
}
.label_alamat
{
page-break-inside: avoid;
page-break-after: always;
}
div.kanan
{
clear: both;
}
}
div.barcode, div.job, div.ekspedisi, div.barcode, div.adminongkir, div.penerima, div.pengirim, div.item
{
padding-bottom: 5px;
padding-top: 5px;
padding-left: 5px;
padding-right: 5px;
}
div.logokurir, div.kurir, div.kepada, div.dari, div.jumlah
{
width: 23%;
float: left;
line-height: 1.5;
}
div.kurir, div.invoice
{
position: relative;
top: 9px;
}
div.invoice
{
width: 50%;
float: left;
}
div.produk
{
width: 75%;
float: left;
}
div.penerima2, div.pengirim2
{
width: 77%;
float: left;
line-height: 1.5;
font-size: 17px;
}
div.kiri, div.adminongkir, div.penerima, div.pengirim, div.clear, div.item
{
clear: both;
}
div.admin, div.asuransi, div.ongkir
{
width: 23%;
float: left;
line-height: 1.5;
}
div.berat
{
width: 30%;
float: left;
line-height: 1.5;
}
span.harga_ongkir, span.total_berat
{
font-size: 13px;
}
div.gunting
{
border-bottom: 1px dashed #bdbcbc;
padding-top: 5px;
padding-bottom: 5px;
margin-top: 40px;
}
div.icon_gunting
{
position: relative;
float: right;
top: 0px;
}
div.item
{
padding-top: 0px;
}
div.keterangan
{
font-size: 10px;
padding-bottom: 10px;
}
</style>
`;
function cetakAkulaku()
{
var initWatcher = '';
if (/index\/processingOrders/.test(window.location.href))
{
initWatcher = setInterval(function ()
{
console.log('watch');
if (unsafeWindow.angular)
{
clearInterval(initWatcher);
cetakAkulaku2(1);
}
}, 100);
}
else if (/index\/preparingOrders/.test(window.location.href))
{
initWatcher = setInterval(function ()
{
console.log('watch');
if (unsafeWindow.angular)
{
clearInterval(initWatcher);
cetakAkulaku2(-1);
}
}, 100);
};
}
function cetakAkulaku2(status)
{
console.log('angular', unsafeWindow.angular);
$.getJSON('http://vendor.akulaku.com/installment/api/json/vendor/pending/delivery/sales/order/list.do?status=' + status, function()
{
console.log( "success" );
})
.done(function(data) {
console.log( "second success" );
var jumlah = data.data.list.length;
var list, html = '';
html += '<title>Cetak Slip Alamat</title>';
html += css;
html += '<div class="print"><a href="javascript:window.print();"><img src="https://ecs7.tokopedia.net/img/print.png"> Cetak</a></div><div class="print_area">';
var kanan = false;
var x = 0;
$.each(data.data.list, function(i) {
list = data.data.list[i];
if (x == 0)
{
html += '<div class="kiri">';
}
else if (x == 3 && kanan == false)
{
html += '<div class="kanan">';
kanan = true;
x = 0;
}
else if (x == 3 && kanan == true)
{
html += '<div class="kiri">';
kanan = false;
x = 0;
}
html += cetakAkulaku3(list);
x++;
if (x == 3)
{
html += '</div>';
}
});
html += '</div></div>';
$('button.btn.btn-success.btn-sm').first().after('<button type="button" id="cetakAkulaku" class="btn btn-primary btn-sm" style="margin-left: 20px;" data-toggle="button"">Cetak Sekaligus A6 (' + jumlah + ')</button>');
$('#cetakAkulaku').click(function()
{
var blank = window.open('about:blank#jangan_lupa_traktir', '_blank');
blank.document.write(html);
});
})
.fail(function() {
console.log( "error" );
})
.always(function() {
console.log( "complete" );
});
}
function cetakAkulaku3(list)
{
var text = '';
var logokurir = 'https://ecs7.tokopedia.net/img/kurir/logo_sicepat.png';
var logotoko = 'http://i66.tinypic.com/2la3t6p.png'; //'https://raw.githubusercontent.com/rendy1287/tokopedia-cetak-sekaligus/master/gambar/logo_akulaku.png';
var nama_toko = list.vendorName;
var nama_penerima = list.customerName;
var alamat_penerima = list.street + ' ' + list.roomNumber + '<br>' + list.district + ', ' + list.city + ', ' + list.province + ' ' + list.postcode;
var telepon_penerima = list.customerPhone;
var ekspedisi = 'SiCepat REG';
var kode_ekspedisi = 'SiCepat';
ekspedisi = '<b>' + ekspedisi.substr(0, ekspedisi.indexOf(' ')) + '</b><br>' + ekspedisi.substr(ekspedisi.indexOf(' ')+1);
ekspedisi = ekspedisi.replace('(', '').replace(')', '');
var ongkir = 'Rp ' + formatMoney(list.subTotal, 0, ',', '.');
var nama_pengirim = list.vendorName;
var telepon_pengirim = list.vPhone;
var alamat_pengirim = list.vDistrict + ', ' + list.vCity;
var invoice = list.invoiceNo;
var administrasi = '+ Rp 0';
var asuransi = '+ Rp 0';
var logo_asuransi = '';
var berat = timeConverter(list.orderTime);
var total_harga = 'Rp ' + list.subTotal;
var insurance_type = '';
var insurance_note = '';
var additional_fee = '';
var kode_booking = '';
if (kode_ekspedisi == 'SiCepat')
{
logokurir = 'https://ecs7.tokopedia.net/img/kurir/logo_sicepat.png';
}
text += label;
text = text.replace('{{logotoko}}', logotoko);
text = text.replace('{{kode_booking}}', kode_booking);
text = text.replace('{{logokurir}}', logokurir);
text = text.replace('{{ekspedisi}}', ekspedisi);
text = text.replace('{{invoice}}', invoice);
text = text.replace('{{administrasi}}', administrasi);
text = text.replace('{{asuransi}}', asuransi);
text = text.replace('{{ongkir}}', ongkir);
text = text.replace('{{berat}}', berat);
text = text.replace('{{nama_penerima}}', nama_penerima);
text = text.replace('{{telepon_penerima}}', telepon_penerima);
text = text.replace('{{alamat_penerima}}', alamat_penerima);
text = text.replace('{{nama_pengirim}}', nama_pengirim);
text = text.replace('{{telepon_pengirim}}', telepon_pengirim);
text = text.replace('{{alamat_pengirim}}', alamat_pengirim);
var print_item = '';
$.each(list.lineItemVOs, function(i)
{
var items = list.lineItemVOs[i];
var label_item = '';
var gambar_produk = items.img;
var nama_produk = items.itemName;
var jumlah_produk = items.qty + ' buah';
var keterangan_produk = items.property;
var sku = items.vendorSkuId;
var total_harga_barang = 'Rp ' + items.price;
label_item = item;
label_item = label_item.replace('{{jumlah_produk}}', jumlah_produk);
label_item = label_item.replace('{{nama_produk}}', nama_produk);
label_item = label_item.replace('{{keterangan_produk}}', keterangan_produk);
if (typeof(sku) != 'undefined')
{
label_item = label_item.replace('{{sku}}', ' (SKU: ' + sku + ')');
}
print_item += label_item;
});
text = text.replace('{{foreach_item}}', print_item);
return text;
}
function formatMoney(amount, decimalCount = 2, decimal = ".", thousands = ",")
{
try {
decimalCount = Math.abs(decimalCount);
decimalCount = isNaN(decimalCount) ? 2 : decimalCount;
const negativeSign = amount < 0 ? "-" : "";
let i = parseInt(amount = Math.abs(Number(amount) || 0).toFixed(decimalCount)).toString();
let j = (i.length > 3) ? i.length % 3 : 0;
return negativeSign + (j ? i.substr(0, j) + thousands : '') + i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + thousands) + (decimalCount ? decimal + Math.abs(amount - i).toFixed(decimalCount).slice(2) : "");
} catch (e) {
console.log(e)
}
};
function timeConverter(UNIX_timestamp){
var a = new Date(UNIX_timestamp);
var months = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];
var year = a.getFullYear();
var month = months[a.getMonth()];
var date = a.getDate();
var hour = a.getHours();
var min = '0' + a.getMinutes();
var sec = '0' + a.getSeconds();
var time = date + ' ' + month + ' ' + year + ' ' + hour + ':' + min.substr(-2) + ':' + sec.substr(-2) ;
return time;
}