<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.infinite-erp.co.id/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Wikiadmin</id>
	<title>InfiniteERP Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.infinite-erp.co.id/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Wikiadmin"/>
	<link rel="alternate" type="text/html" href="https://wiki.infinite-erp.co.id/index.php/Special:Contributions/Wikiadmin"/>
	<updated>2026-09-17T01:47:02Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.31.1</generator>
	<entry>
		<id>https://wiki.infinite-erp.co.id/index.php?title=JRXML_Local_Verification&amp;diff=4555</id>
		<title>JRXML Local Verification</title>
		<link rel="alternate" type="text/html" href="https://wiki.infinite-erp.co.id/index.php?title=JRXML_Local_Verification&amp;diff=4555"/>
		<updated>2026-09-16T15:28:11Z</updated>

		<summary type="html">&lt;p&gt;Wikiadmin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Halaman ini menjelaskan cara menguji file JRXML '''di laptop''' — compile dan render PDF tanpa men-deploy ke server InfiniteERP. Wajib dilakukan sebelum JRXML baru/diubah dipasang di server.&lt;br /&gt;
&lt;br /&gt;
== Kenapa Verifikasi Lokal ==&lt;br /&gt;
&lt;br /&gt;
* Kesalahan JRXML (ekspresi tidak valid, field tidak dideklarasikan, class salah) baru ketahuan saat compile — bukan dari membaca XML.&lt;br /&gt;
* Menguji di server berarti menyentuh sistem produksi; di laptop cukup 1 perintah Java.&lt;br /&gt;
* Klaim &amp;quot;compatible&amp;quot; harus dibuktikan dengan hasil compile terhadap '''versi library yang sama dengan server''' (6.0.0), bukan versi lain.&lt;br /&gt;
&lt;br /&gt;
== Classpath (Terbukti Jalan) ==&lt;br /&gt;
&lt;br /&gt;
Unduh dari Maven Central, taruh dalam satu folder (misal &amp;lt;code&amp;gt;lib6/&amp;lt;/code&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Jar !! Fungsi&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;jasperreports-6.0.0.jar&amp;lt;/code&amp;gt; || Engine report — versi sama dengan server&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;jasperreports-fonts-6.0.0.jar&amp;lt;/code&amp;gt; || Font extension — sama dengan server&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;commons-digester-2.1.jar&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;commons-collections-3.2.2.jar&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;commons-beanutils-1.9.4.jar&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;commons-logging-1.2.jar&amp;lt;/code&amp;gt; || Dependensi parsing&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ecj-4.4.2.jar&amp;lt;/code&amp;gt; || Compiler ekspresi (JDT)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;itextpdf-5.5.13.3.jar&amp;lt;/code&amp;gt; || Export PDF (JR 6.x memakai package &amp;lt;code&amp;gt;com.itextpdf&amp;lt;/code&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;itext-pdfa-5.5.13.3.jar&amp;lt;/code&amp;gt; || '''Wajib''' — &amp;lt;code&amp;gt;PdfAWriter&amp;lt;/code&amp;gt; dipisah ke jar ini&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Jebakan versi yang sudah ditemukan:&lt;br /&gt;
&lt;br /&gt;
* JR 6.x '''tidak''' memakai iText lawas &amp;lt;code&amp;gt;com.lowagie&amp;lt;/code&amp;gt; (itu milik JR 5.x). Tanpa &amp;lt;code&amp;gt;itextpdf&amp;lt;/code&amp;gt;, export gagal: &amp;lt;code&amp;gt;NoClassDefFoundError: com/itextpdf/text/DocumentException&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Tanpa &amp;lt;code&amp;gt;itext-pdfa&amp;lt;/code&amp;gt;, export gagal: &amp;lt;code&amp;gt;NoClassDefFoundError: com/itextpdf/text/pdf/PdfAWriter&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Teruji jalan di '''Java 17'''.&lt;br /&gt;
&lt;br /&gt;
== Langkah ==&lt;br /&gt;
&lt;br /&gt;
=== 1. Compile ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
JasperReport rep = JasperCompileManager.compileReport(&amp;quot;report.jrxml&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Compile sukses = JRXML valid dan kompatibel dengan JR 6.0.0.&lt;br /&gt;
&lt;br /&gt;
=== 2. Fill dengan data dummy ===&lt;br /&gt;
&lt;br /&gt;
Report ber-query SQL tidak butuh database untuk diuji — lewatkan datasource map:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
Map&amp;lt;String,Object&amp;gt; row = new HashMap&amp;lt;&amp;gt;();&lt;br /&gt;
row.put(&amp;quot;bpnmae&amp;quot;, &amp;quot;PT CONTOH PELANGGAN&amp;quot;);&lt;br /&gt;
row.put(&amp;quot;pricestd&amp;quot;, new BigDecimal(&amp;quot;5000000&amp;quot;));&lt;br /&gt;
// ... isi semua field sesuai deklarasi &amp;lt;field&amp;gt; di JRXML&lt;br /&gt;
&lt;br /&gt;
Map&amp;lt;String,Object&amp;gt; params = new HashMap&amp;lt;&amp;gt;();&lt;br /&gt;
params.put(&amp;quot;IMAGE_DIR&amp;quot;, &amp;quot;/path/ke/folder/gambar&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
JasperPrint print = JasperFillManager.fillReport(rep, params,&lt;br /&gt;
    new JRMapCollectionDataSource(java.util.Collections.singletonList(row)));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Catatan: ImageIO membaca gambar '''berdasarkan konten''', bukan ekstensi — file PNG bernama &amp;lt;code&amp;gt;.jpg&amp;lt;/code&amp;gt; tetap ter-render (berguna untuk placeholder).&lt;br /&gt;
&lt;br /&gt;
=== 3. Export PDF ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
JRPdfExporter exporter = new JRPdfExporter();&lt;br /&gt;
exporter.setParameter(JRExporterParameter.JASPER_PRINT, print);&lt;br /&gt;
exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, &amp;quot;sample.pdf&amp;quot;);&lt;br /&gt;
exporter.exportReport();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jalankan: &amp;lt;code&amp;gt;java -cp &amp;quot;.:lib6/*&amp;quot; NamaVerifier&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. Cek hasil ===&lt;br /&gt;
&lt;br /&gt;
* Buka PDF dan periksa visual: overlap, teks terpotong, alignment angka.&lt;br /&gt;
* Untuk elemen grafis kritis (accent bar, latar blok), bisa dicek deterministik: konversi PDF ke PNG lalu baca warna piksel pada koordinat yang diharapkan. Cara ini terbukti menangkap bug outline hitam pada &amp;lt;code&amp;gt;&amp;amp;lt;rectangle&amp;amp;gt;&amp;lt;/code&amp;gt; (lihat [[JRXML Best Practices]]).&lt;br /&gt;
&lt;br /&gt;
== Tool CLI: jrxmlcheck ==&lt;br /&gt;
&lt;br /&gt;
Untuk pengguna non-programmer tersedia tool CLI '''jrxmlcheck''' — satu perintah, tanpa menulis Java.&lt;br /&gt;
&lt;br /&gt;
=== Unduh &amp;amp; Pasang ===&lt;br /&gt;
&lt;br /&gt;
# Unduh '''[[Media:Jrxmlcheck.zip|Jrxmlcheck.zip]]''' (5 KB; halaman berkas: [[:File:Jrxmlcheck.zip]]).&lt;br /&gt;
# Ekstrak: &amp;lt;code&amp;gt;unzip Jrxmlcheck.zip&amp;lt;/code&amp;gt; — terbentuk folder &amp;lt;code&amp;gt;cli/&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Beri izin eksekusi (sekali saja): &amp;lt;code&amp;gt;chmod +x cli/jrxmlcheck&amp;lt;/code&amp;gt;&lt;br /&gt;
# Prasyarat: Java/JDK terpasang (teruji di Java 17), dan internet saat '''pertama''' dijalankan karena library JasperReports 6.0.0 diunduh otomatis dari Maven Central.&lt;br /&gt;
&lt;br /&gt;
=== Cara Pakai ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;./cli/jrxmlcheck compile laporan.jrxml                     # cek valid &amp;amp; kompatibel JR 6.0.0&lt;br /&gt;
./cli/jrxmlcheck preview laporan.jrxml                     # buat PDF contoh, data otomatis&lt;br /&gt;
./cli/jrxmlcheck preview laporan.jrxml --images ./images   # pakai folder gambar (logo/stempel/ttd)&lt;br /&gt;
./cli/jrxmlcheck preview laporan.jrxml --data data.txt     # data sendiri, format: namafield=nilai&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Mode &amp;lt;code&amp;gt;preview&amp;lt;/code&amp;gt; membaca deklarasi &amp;lt;code&amp;gt;&amp;amp;lt;field&amp;amp;gt;&amp;lt;/code&amp;gt; di JRXML lalu membuat data contoh otomatis — langsung jalan tanpa menyiapkan apa pun. Jumlah baris contoh diatur dengan &amp;lt;code&amp;gt;--rows N&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Mode &amp;lt;code&amp;gt;audit&amp;lt;/code&amp;gt; — pemeriksaan menyeluruh sebelum deploy:&lt;br /&gt;
** '''Font''' — setiap &amp;lt;code&amp;gt;fontName&amp;lt;/code&amp;gt; dicek terhadap isi &amp;lt;code&amp;gt;jasperreports-fonts-6.0.0.jar&amp;lt;/code&amp;gt; (DejaVu Sans/Serif/Sans Mono + SansSerif/Serif/Monospaced). Font lain akan disubstitusi diam-diam di server → layout bergeser.&lt;br /&gt;
** '''Path absolut''' pada &amp;lt;code&amp;gt;imageExpression&amp;lt;/code&amp;gt; (mis. &amp;lt;code&amp;gt;/home/zaien_aji/...&amp;lt;/code&amp;gt;) — harus diganti parameter seperti &amp;lt;code&amp;gt;$P{IMAGE_DIR}&amp;lt;/code&amp;gt;.&lt;br /&gt;
** '''Geometri''' — elemen yang keluar batas band atau lebar kolom (tidak akan tercetak utuh).&lt;br /&gt;
** '''Variabel mati''' (variableExpression kosong) dan '''field/parameter tidak terpakai'''.&lt;br /&gt;
** '''Jejak Jaspersoft Studio''' (&amp;lt;code&amp;gt;splitType&amp;lt;/code&amp;gt;, property &amp;lt;code&amp;gt;com.jaspersoft.studio.*&amp;lt;/code&amp;gt;) — jadi peringatan bila diaudit dengan &amp;lt;code&amp;gt;--target ireport&amp;lt;/code&amp;gt;.&lt;br /&gt;
** '''Elemen teks bertumpuk''' — dua elemen teks yang kotaknya beririsan &amp;gt;50% dari kotak terkecil (irisan tipis antar kolom kiri/kanan diabaikan karena umum &amp;amp; aman; teks di dalam kotak latar dan stempel-di-atas-tanda-tangan juga diabaikan — gambar bertumpuk hanya dicatat sebagai info).&lt;br /&gt;
** '''Atribut PDF lawas''' (&amp;lt;code&amp;gt;pdfFontName&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;pdfEncoding&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;isPdfEmbedded&amp;lt;/code&amp;gt;) — deprecated, migrasikan ke font extension.&lt;br /&gt;
** '''Encoding file''' — JRXML wajib UTF-8 valid; file Latin-1/Windows-1252 ditolak sebelum compile dengan pesan yang menunjuk cara memperbaikinya (karakter &amp;lt;code&amp;gt;•&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;·&amp;lt;/code&amp;gt; rawan rusak).&lt;br /&gt;
** &amp;lt;code&amp;gt;--strict&amp;lt;/code&amp;gt;: exit code 1 bila ada peringatan — cocok untuk gerbang CI sebelum deploy.&lt;br /&gt;
&lt;br /&gt;
* File data sendiri: teks biasa, satu &amp;lt;code&amp;gt;namafield=nilai&amp;lt;/code&amp;gt; per baris, baris &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; untuk komentar.&lt;br /&gt;
* Pesan error diringkas ke penyebab utama beserta daftar penyebab umum (field tidak dideklarasikan, salah ketik nama field, class field salah, ekspresi bukan Java valid).&lt;br /&gt;
* PDF hasil terbuka otomatis di macOS (nonaktifkan dengan &amp;lt;code&amp;gt;--no-open&amp;lt;/code&amp;gt;); nama file diatur dengan &amp;lt;code&amp;gt;--out&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Petunjuk lengkap juga tersedia di &amp;lt;code&amp;gt;README.txt&amp;lt;/code&amp;gt; dalam paket.&lt;br /&gt;
&lt;br /&gt;
=== Validasi query ke database (--jdbc) ===&lt;br /&gt;
&lt;br /&gt;
Menjalankan query JRXML ke '''PostgreSQL sungguhan''' — persis alur produksi:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;./cli/jrxmlcheck audit laporan.jrxml \&lt;br /&gt;
    --jdbc jdbc:postgresql://HOST:5432/NAMA_DB --dbuser USER&lt;br /&gt;
# password: --dbpass PASS atau lebih aman env JRXMLCHECK_DBPASS&lt;br /&gt;
# override parameter: --param DOCUMENT_ID=XXX (boleh berulang)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Yang diverifikasi:&lt;br /&gt;
&lt;br /&gt;
# Query dieksekusi lewat &amp;lt;code&amp;gt;fillReport(connection)&amp;lt;/code&amp;gt; — parameter default ikut dievaluasi JasperReports, jadi kesalahan nama tabel/kolom langsung ketahuan dengan pesan asli PostgreSQL.&lt;br /&gt;
# '''Probe kolom''': &amp;lt;code&amp;gt;ResultSetMetaData&amp;lt;/code&amp;gt; hasil query dicocokkan dengan deklarasi &amp;lt;code&amp;gt;&amp;amp;lt;field&amp;amp;gt;&amp;lt;/code&amp;gt; — tetap bekerja walau hasil query '''0 baris''' (kasus alias salah yang tidak ketahuan saat fill biasa).&lt;br /&gt;
# Gambar tidak perlu disiapkan: placeholder otomatis dibuat untuk nama file yang dirujuk &amp;lt;code&amp;gt;imageExpression&amp;lt;/code&amp;gt; (bisa dioverride dengan &amp;lt;code&amp;gt;--images&amp;lt;/code&amp;gt;).&lt;br /&gt;
# Kolom query yang tidak dideklarasikan hanya dicatat sebagai INFO.&lt;br /&gt;
&lt;br /&gt;
Driver PostgreSQL (42.7.3) ikut terunduh otomatis oleh wrapper. Teruji end-to-end memakai PostgreSQL 16 dengan skema mini ala Openbravo (c_invoice dkk).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hasil yang Pernah Diverifikasi ==&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;sales_invoice_SSD.jrxml&amp;lt;/code&amp;gt; (asli, iReport 5.6): compile OK di JR 5.6.0 dan 6.0.0&lt;br /&gt;
* Versi perbaikan (parameter &amp;lt;code&amp;gt;IMAGE_DIR&amp;lt;/code&amp;gt;, variable mati dihapus): compile + render OK&lt;br /&gt;
* Layout modern tanpa border penuh: compile + render OK, cek piksel lolos&lt;br /&gt;
&lt;br /&gt;
[[Category:Development ERP]]&lt;/div&gt;</summary>
		<author><name>Wikiadmin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.infinite-erp.co.id/index.php?title=JRXML_Best_Practices&amp;diff=4554</id>
		<title>JRXML Best Practices</title>
		<link rel="alternate" type="text/html" href="https://wiki.infinite-erp.co.id/index.php?title=JRXML_Best_Practices&amp;diff=4554"/>
		<updated>2026-09-16T15:27:46Z</updated>

		<summary type="html">&lt;p&gt;Wikiadmin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Halaman ini merangkum aturan dan jebakan yang ditemukan saat menulis/memperbaiki JRXML untuk InfiniteERP (runtime JasperReports 6.0.0). Latar belakang versi ada di halaman [[JasperReports]].&lt;br /&gt;
&lt;br /&gt;
== Aturan Kompatibilitas ==&lt;br /&gt;
&lt;br /&gt;
* Namespace root: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;http://jasperreports.sourceforge.net/jasperreports&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; (jangan ganti ke namespace &amp;lt;code&amp;gt;jaspersoft.com&amp;lt;/code&amp;gt; — itu gaya file baru Studio, dan tidak konsisten dengan report existing).&lt;br /&gt;
* Ekspresi ditulis sebagai '''Java valid''', bukan gaya Groovy. Contoh: &amp;lt;code&amp;gt;new Integer($V{No_Urut}.intValue()+1)&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Deklarasikan '''semua''' field yang dipakai di &amp;lt;code&amp;gt;&amp;amp;lt;field&amp;amp;gt;&amp;lt;/code&amp;gt; dengan class Java yang benar:&lt;br /&gt;
** Uang/numerik: &amp;lt;code&amp;gt;java.math.BigDecimal&amp;lt;/code&amp;gt;&lt;br /&gt;
** Tanggal: &amp;lt;code&amp;gt;java.sql.Timestamp&amp;lt;/code&amp;gt;&lt;br /&gt;
** String: &amp;lt;code&amp;gt;java.lang.String&amp;lt;/code&amp;gt;&lt;br /&gt;
* Font: pakai logical font (&amp;lt;code&amp;gt;SansSerif&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Serif&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Monospaced&amp;lt;/code&amp;gt;) kecuali ada font extension jar di server.&lt;br /&gt;
&lt;br /&gt;
== Jebakan yang Sudah Ditemukan ==&lt;br /&gt;
&lt;br /&gt;
=== 1. Path absolut untuk gambar ===&lt;br /&gt;
&lt;br /&gt;
Report existing me-hardcode path seperti:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;amp;lt;imageExpression&amp;amp;gt;&amp;amp;lt;![CDATA[&amp;quot;/home/zaien_aji/appl/sahila/modules/.../ssd_logo.png&amp;quot;]]&amp;amp;gt;&amp;amp;lt;/imageExpression&amp;amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ini gagal render di mesin/user lain. '''Solusi''': parameter direktori gambar:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;amp;lt;parameter name=&amp;quot;IMAGE_DIR&amp;quot; class=&amp;quot;java.lang.String&amp;quot; isForPrompting=&amp;quot;false&amp;quot;&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;defaultValueExpression&amp;amp;gt;&amp;amp;lt;![CDATA[&amp;quot;.&amp;quot;]]&amp;amp;gt;&amp;amp;lt;/defaultValueExpression&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;/parameter&amp;amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;amp;lt;imageExpression&amp;amp;gt;&amp;amp;lt;![CDATA[$P{IMAGE_DIR} + &amp;quot;/ssd_logo.png&amp;quot;]]&amp;amp;gt;&amp;amp;lt;/imageExpression&amp;amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. Rectangle selalu ber-outline hitam ===&lt;br /&gt;
&lt;br /&gt;
Elemen &amp;lt;code&amp;gt;&amp;amp;lt;rectangle&amp;amp;gt;&amp;lt;/code&amp;gt; '''selalu digambar dengan garis tepi 1pt berwarna &amp;lt;code&amp;gt;forecolor&amp;lt;/code&amp;gt;''' (default hitam), di samping fill &amp;lt;code&amp;gt;backcolor&amp;lt;/code&amp;gt;. Untuk balok warna bersih (accent bar, latar blok total), samakan keduanya:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;amp;lt;reportElement mode=&amp;quot;Opaque&amp;quot; x=&amp;quot;0&amp;quot; y=&amp;quot;84&amp;quot; width=&amp;quot;565&amp;quot; height=&amp;quot;3&amp;quot;&lt;br /&gt;
    forecolor=&amp;quot;#224435&amp;quot; backcolor=&amp;quot;#224435&amp;quot; .../&amp;amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
Jika hanya &amp;lt;code&amp;gt;backcolor&amp;lt;/code&amp;gt; yang di-set, balok tipis (height 1–3) akan terlihat kehitaman karena tercampur border.&lt;br /&gt;
&lt;br /&gt;
=== 3. Variable mati sisa template ===&lt;br /&gt;
&lt;br /&gt;
Variable dengan &amp;lt;code&amp;gt;calculation=&amp;quot;Sum&amp;quot;&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;Average&amp;lt;/code&amp;gt; tetapi &amp;lt;code&amp;gt;&amp;amp;lt;variableExpression&amp;amp;gt;&amp;lt;/code&amp;gt; kosong adalah sisa template iReport — tidak dipakai dan aman dihapus.&lt;br /&gt;
&lt;br /&gt;
=== 4. Atribut versi baru di file lama ===&lt;br /&gt;
&lt;br /&gt;
Atribut seperti &amp;lt;code&amp;gt;splitType&amp;lt;/code&amp;gt; pada &amp;lt;code&amp;gt;&amp;amp;lt;band&amp;amp;gt;&amp;lt;/code&amp;gt; (milik JR 6.x) bisa muncul di file lama karena pernah dibuka di Jaspersoft Studio. Compile tetap OK (parser mengabaikannya), tetapi iReport 5.6 dapat mengacaukannya saat edit-save. Untuk file yang masih dirawat di iReport, hapus atribut tersebut.&lt;br /&gt;
&lt;br /&gt;
== Pola Kalkulasi ==&lt;br /&gt;
&lt;br /&gt;
Report existing melakukan kalkulasi di '''SQL (PostgreSQL)''', bukan di ekspresi report:&lt;br /&gt;
&lt;br /&gt;
* Pajak: &amp;lt;code&amp;gt;ci.grandtotal - ci.totallines as pajak&amp;lt;/code&amp;gt;&lt;br /&gt;
* Terbilang: fungsi custom database &amp;lt;code&amp;gt;terbilang(grandtotal)&amp;lt;/code&amp;gt;&lt;br /&gt;
* Format tanggal Indonesia: &amp;lt;code&amp;gt;CASE EXTRACT(MONTH FROM ...)&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;to_char&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ikuti pola yang sama kecuali ada alasan memindahkannya ke report — query mengambil langsung dari skema Openbravo/ADempiere (&amp;lt;code&amp;gt;c_invoice&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;c_invoiceline&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;c_bpartner&amp;lt;/code&amp;gt;, dst).&lt;br /&gt;
&lt;br /&gt;
== Trik Layout ==&lt;br /&gt;
&lt;br /&gt;
=== Satu sel, dua baris (nama produk + deskripsi) ===&lt;br /&gt;
&lt;br /&gt;
Buat dua text field bertumpuk di kolom yang sama; hilangkan border yang bertemu agar terlihat seperti satu sel:&lt;br /&gt;
&lt;br /&gt;
* Elemen atas: &amp;lt;code&amp;gt;&amp;amp;lt;bottomPen lineWidth=&amp;quot;0.0&amp;quot;/&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* Elemen bawah: &amp;lt;code&amp;gt;&amp;amp;lt;topPen lineWidth=&amp;quot;0.0&amp;quot;/&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Tabel tanpa border penuh (gaya modern) ===&lt;br /&gt;
&lt;br /&gt;
* Header kolom: hanya &amp;lt;code&amp;gt;&amp;amp;lt;bottomPen lineWidth=&amp;quot;1.0&amp;quot; lineColor=&amp;quot;#224435&amp;quot;/&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* Baris detail: hanya &amp;lt;code&amp;gt;&amp;amp;lt;bottomPen lineWidth=&amp;quot;0.5&amp;quot; lineColor=&amp;quot;#E0E0E0&amp;quot;/&amp;amp;gt;&amp;lt;/code&amp;gt; di setiap sel (menjadi separator tipis antar-baris)&lt;br /&gt;
* Penekanan total: balok &amp;lt;code&amp;gt;&amp;amp;lt;rectangle&amp;amp;gt;&amp;lt;/code&amp;gt; berlatar warna muda, bukan kotak border&lt;br /&gt;
&lt;br /&gt;
== Setelah Menulis: Verifikasi ==&lt;br /&gt;
&lt;br /&gt;
Jangan menganggap JRXML benar hanya dari membaca XML. Compile (dan bila perlu render) secara lokal — lihat [[JRXML Local Verification]].&lt;br /&gt;
&lt;br /&gt;
[[Category:Development ERP]]&lt;/div&gt;</summary>
		<author><name>Wikiadmin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.infinite-erp.co.id/index.php?title=JasperReports&amp;diff=4553</id>
		<title>JasperReports</title>
		<link rel="alternate" type="text/html" href="https://wiki.infinite-erp.co.id/index.php?title=JasperReports&amp;diff=4553"/>
		<updated>2026-09-16T15:27:35Z</updated>

		<summary type="html">&lt;p&gt;Wikiadmin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''JasperReports''' adalah library reporting Java yang dipakai InfiniteERP (Openbravo) untuk mencetak dokumen (invoice, kuitansi, dan report lain) dari file template '''JRXML'''.&lt;br /&gt;
&lt;br /&gt;
== Versi Library di Server ==&lt;br /&gt;
&lt;br /&gt;
Berdasarkan pemeriksaan source code Openbravo, runtime report memakai:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;jasperreports-6.0.0.jar&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;jasperreports-fonts-6.0.0.jar&amp;lt;/code&amp;gt;&lt;br /&gt;
* iText 5.5.x (package &amp;lt;code&amp;gt;com.itextpdf&amp;lt;/code&amp;gt;) untuk export PDF — bukan iText lawas &amp;lt;code&amp;gt;com.lowagie&amp;lt;/code&amp;gt; yang dipakai JasperReports 5.x&lt;br /&gt;
&lt;br /&gt;
== Tool Desain ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Tool !! Library JasperReports bawaan !! Keterangan&lt;br /&gt;
|-&lt;br /&gt;
| iReport 5.6.0 || 5.6.0 || Legacy, sudah tidak dikembangkan&lt;br /&gt;
|-&lt;br /&gt;
| Jaspersoft Studio CE 6.21.x || 6.21.x || Tool desain aktif berbasis Eclipse&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
File JRXML existing (contoh: &amp;lt;code&amp;gt;sales_invoice_SSD.jrxml&amp;lt;/code&amp;gt;) dibuat dengan iReport 5.6, lalu sempat disentuh Jaspersoft Studio (terlihat dari property &amp;lt;code&amp;gt;com.jaspersoft.studio.*&amp;lt;/code&amp;gt; dan atribut &amp;lt;code&amp;gt;splitType&amp;lt;/code&amp;gt; di dalamnya).&lt;br /&gt;
&lt;br /&gt;
== Kompatibilitas JRXML (Sudah Diuji) ==&lt;br /&gt;
&lt;br /&gt;
Pengujian dilakukan dengan meng-compile JRXML memakai &amp;lt;code&amp;gt;jasperreports-6.0.0.jar&amp;lt;/code&amp;gt; persis seperti di server:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! File JRXML !! Compile di JR 6.0.0 !! Export PDF&lt;br /&gt;
|-&lt;br /&gt;
| Asli (output iReport 5.6, ada &amp;lt;code&amp;gt;splitType&amp;lt;/code&amp;gt;) || OK || —&lt;br /&gt;
|-&lt;br /&gt;
| Versi perbaikan (clean-up) || OK || OK&lt;br /&gt;
|-&lt;br /&gt;
| Layout baru (modern) || OK || OK&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kesimpulan:&lt;br /&gt;
&lt;br /&gt;
* Namespace lawas &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;http://jasperreports.sourceforge.net/jasperreports&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; '''sepenuhnya kompatibel''' dengan JR 6.0.0 — tidak perlu diubah.&lt;br /&gt;
* Parser JR 6.0.0 (bahkan 5.6.0) '''toleran''' terhadap atribut yang tidak dikenal; atribut asing diabaikan saat compile.&lt;br /&gt;
* Risiko sesungguhnya bukan di runtime, melainkan di '''editor''': iReport 5.6 dapat menghapus/mengacaukan atribut versi baru saat file di-edit lalu di-save.&lt;br /&gt;
&lt;br /&gt;
== Mengedit dengan Jaspersoft Studio CE ==&lt;br /&gt;
&lt;br /&gt;
Jaspersoft Studio Community Edition dapat diunduh di: [https://community.jaspersoft.com/download-jaspersoft/community-edition/jaspersoft-studio_6.21.2 Download Jaspersoft Studio CE 6.21.x]&lt;br /&gt;
&lt;br /&gt;
Karena Studio 6.21.x membawa library JasperReports 6.21.x (lebih baru dari runtime server 6.0.0), perhatikan:&lt;br /&gt;
&lt;br /&gt;
# Setelah mengedit, '''selalu compile ulang JRXML terhadap JR 6.0.0''' (lihat [[JRXML Local Verification]]) sebelum deploy — jangan mengandalkan preview Studio.&lt;br /&gt;
# Hindari memakai komponen/fitur yang hanya ada di versi baru (misal elemen &amp;lt;code&amp;gt;&amp;amp;lt;part&amp;amp;gt;&amp;lt;/code&amp;gt;) kecuali runtime server memang di-upgrade.&lt;br /&gt;
# Property &amp;lt;code&amp;gt;com.jaspersoft.studio.*&amp;lt;/code&amp;gt; yang ditulis Studio aman — diabaikan oleh runtime.&lt;br /&gt;
# Simpan file dengan encoding UTF-8 dan pertahankan namespace lawas agar tetap konsisten dengan report existing.&lt;br /&gt;
&lt;br /&gt;
=== Setting Compatibility ke JasperReports 6.0.0 (Dokumentasi Resmi) ===&lt;br /&gt;
&lt;br /&gt;
Jaspersoft Studio secara default memakai library versi bawaannya (Studio 6.21.x → JasperReports 6.21.x) untuk '''menyimpan JRXML''' dan '''meng-compile report'''. Karena runtime server InfiniteERP adalah JR 6.0.0, atur compatibility agar keduanya memakai 6.0.0:&lt;br /&gt;
&lt;br /&gt;
# Buka '''Window &amp;gt; Preferences''' (di macOS: '''Jaspersoft Studio &amp;gt; Preferences''').&lt;br /&gt;
# Pilih '''Jaspersoft Studio &amp;gt; Compatibility'''.&lt;br /&gt;
# Pada bagian '''Source .jrxml Version''', pilih '''6.0.0''' di menu ''Version'' — JRXML akan disimpan dalam format versi tersebut.&lt;br /&gt;
# Centang '''Don't save Jaspersoft Studio properties''' — property khusus Studio (info layout, dimensi px/mm, data adapter terakhir dipakai) tidak ikut tersimpan ke JRXML.&lt;br /&gt;
# Pada bagian '''Compiler Settings''', pilih '''6.0.0''' di menu ''Version'' — report di-compile memakai JR 6.0.0.&lt;br /&gt;
# Jika 6.0.0 belum tersedia di menu, klik '''Manage JasperReports Versions''':&lt;br /&gt;
#* '''Add From Path''' — jika jar JR 6.0.0 sudah ada di lokal; arahkan ke direktori berisi JasperReports Library dan Studio akan memverifikasinya.&lt;br /&gt;
#* '''Add From URL''' — unduh dari SourceForge (https://sourceforge.net/projects/jasperreports/) atau URL lain; Studio mengunduh, memverifikasi jar, lalu menambahkannya ke menu.&lt;br /&gt;
&lt;br /&gt;
Catatan dari dokumentasi resmi:&lt;br /&gt;
&lt;br /&gt;
* Fitur report yang bergantung pada versi JasperReports lebih baru '''tidak akan tersedia''' saat memakai versi lebih lama.&lt;br /&gt;
* Pengaturan Compatibility ini ditujukan untuk report yang dipakai di aplikasi sendiri berbasis JasperReports Library (persis kasus Openbravo/InfiniteERP). Jika targetnya JasperReports Server, versi diatur di ''connection settings'' server.&lt;br /&gt;
&lt;br /&gt;
Sumber resmi: [https://community.jaspersoft.com/documentation/jaspersoft%C2%AE-studio/tibco-jaspersoft-studio-user-guide/v621/setting-compatibility-earlier-versions/ TIBCO Jaspersoft Studio User Guide — Setting Compatibility with Earlier Versions of JasperReports Library] ([https://web.archive.org/web/20250804124055/https://community.jaspersoft.com/documentation/jaspersoft%C2%AE-studio/tibco-jaspersoft-studio-user-guide/v621/setting-compatibility-earlier-versions/ arsip Wayback, 4 Agustus 2025])&lt;br /&gt;
&lt;br /&gt;
== Praktik dan Verifikasi ==&lt;br /&gt;
&lt;br /&gt;
* [[JRXML Best Practices]] — aturan penulisan JRXML, jebakan umum, dan polanya&lt;br /&gt;
* [[JRXML Local Verification]] — cara compile + render JRXML di laptop tanpa server&lt;br /&gt;
&lt;br /&gt;
[[Category:Development ERP]]&lt;/div&gt;</summary>
		<author><name>Wikiadmin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.infinite-erp.co.id/index.php?title=JRXML_Local_Verification&amp;diff=4552</id>
		<title>JRXML Local Verification</title>
		<link rel="alternate" type="text/html" href="https://wiki.infinite-erp.co.id/index.php?title=JRXML_Local_Verification&amp;diff=4552"/>
		<updated>2026-09-16T11:35:17Z</updated>

		<summary type="html">&lt;p&gt;Wikiadmin: Audit v4: validasi query --jdbc + cek encoding UTF-8&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Halaman ini menjelaskan cara menguji file JRXML '''di laptop''' — compile dan render PDF tanpa men-deploy ke server InfiniteERP. Wajib dilakukan sebelum JRXML baru/diubah dipasang di server.&lt;br /&gt;
&lt;br /&gt;
== Kenapa Verifikasi Lokal ==&lt;br /&gt;
&lt;br /&gt;
* Kesalahan JRXML (ekspresi tidak valid, field tidak dideklarasikan, class salah) baru ketahuan saat compile — bukan dari membaca XML.&lt;br /&gt;
* Menguji di server berarti menyentuh sistem produksi; di laptop cukup 1 perintah Java.&lt;br /&gt;
* Klaim &amp;quot;compatible&amp;quot; harus dibuktikan dengan hasil compile terhadap '''versi library yang sama dengan server''' (6.0.0), bukan versi lain.&lt;br /&gt;
&lt;br /&gt;
== Classpath (Terbukti Jalan) ==&lt;br /&gt;
&lt;br /&gt;
Unduh dari Maven Central, taruh dalam satu folder (misal &amp;lt;code&amp;gt;lib6/&amp;lt;/code&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Jar !! Fungsi&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;jasperreports-6.0.0.jar&amp;lt;/code&amp;gt; || Engine report — versi sama dengan server&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;jasperreports-fonts-6.0.0.jar&amp;lt;/code&amp;gt; || Font extension — sama dengan server&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;commons-digester-2.1.jar&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;commons-collections-3.2.2.jar&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;commons-beanutils-1.9.4.jar&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;commons-logging-1.2.jar&amp;lt;/code&amp;gt; || Dependensi parsing&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ecj-4.4.2.jar&amp;lt;/code&amp;gt; || Compiler ekspresi (JDT)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;itextpdf-5.5.13.3.jar&amp;lt;/code&amp;gt; || Export PDF (JR 6.x memakai package &amp;lt;code&amp;gt;com.itextpdf&amp;lt;/code&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;itext-pdfa-5.5.13.3.jar&amp;lt;/code&amp;gt; || '''Wajib''' — &amp;lt;code&amp;gt;PdfAWriter&amp;lt;/code&amp;gt; dipisah ke jar ini&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Jebakan versi yang sudah ditemukan:&lt;br /&gt;
&lt;br /&gt;
* JR 6.x '''tidak''' memakai iText lawas &amp;lt;code&amp;gt;com.lowagie&amp;lt;/code&amp;gt; (itu milik JR 5.x). Tanpa &amp;lt;code&amp;gt;itextpdf&amp;lt;/code&amp;gt;, export gagal: &amp;lt;code&amp;gt;NoClassDefFoundError: com/itextpdf/text/DocumentException&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Tanpa &amp;lt;code&amp;gt;itext-pdfa&amp;lt;/code&amp;gt;, export gagal: &amp;lt;code&amp;gt;NoClassDefFoundError: com/itextpdf/text/pdf/PdfAWriter&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Teruji jalan di '''Java 17'''.&lt;br /&gt;
&lt;br /&gt;
== Langkah ==&lt;br /&gt;
&lt;br /&gt;
=== 1. Compile ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
JasperReport rep = JasperCompileManager.compileReport(&amp;quot;report.jrxml&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Compile sukses = JRXML valid dan kompatibel dengan JR 6.0.0.&lt;br /&gt;
&lt;br /&gt;
=== 2. Fill dengan data dummy ===&lt;br /&gt;
&lt;br /&gt;
Report ber-query SQL tidak butuh database untuk diuji — lewatkan datasource map:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
Map&amp;lt;String,Object&amp;gt; row = new HashMap&amp;lt;&amp;gt;();&lt;br /&gt;
row.put(&amp;quot;bpnmae&amp;quot;, &amp;quot;PT CONTOH PELANGGAN&amp;quot;);&lt;br /&gt;
row.put(&amp;quot;pricestd&amp;quot;, new BigDecimal(&amp;quot;5000000&amp;quot;));&lt;br /&gt;
// ... isi semua field sesuai deklarasi &amp;lt;field&amp;gt; di JRXML&lt;br /&gt;
&lt;br /&gt;
Map&amp;lt;String,Object&amp;gt; params = new HashMap&amp;lt;&amp;gt;();&lt;br /&gt;
params.put(&amp;quot;IMAGE_DIR&amp;quot;, &amp;quot;/path/ke/folder/gambar&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
JasperPrint print = JasperFillManager.fillReport(rep, params,&lt;br /&gt;
    new JRMapCollectionDataSource(java.util.Collections.singletonList(row)));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Catatan: ImageIO membaca gambar '''berdasarkan konten''', bukan ekstensi — file PNG bernama &amp;lt;code&amp;gt;.jpg&amp;lt;/code&amp;gt; tetap ter-render (berguna untuk placeholder).&lt;br /&gt;
&lt;br /&gt;
=== 3. Export PDF ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
JRPdfExporter exporter = new JRPdfExporter();&lt;br /&gt;
exporter.setParameter(JRExporterParameter.JASPER_PRINT, print);&lt;br /&gt;
exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, &amp;quot;sample.pdf&amp;quot;);&lt;br /&gt;
exporter.exportReport();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jalankan: &amp;lt;code&amp;gt;java -cp &amp;quot;.:lib6/*&amp;quot; NamaVerifier&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. Cek hasil ===&lt;br /&gt;
&lt;br /&gt;
* Buka PDF dan periksa visual: overlap, teks terpotong, alignment angka.&lt;br /&gt;
* Untuk elemen grafis kritis (accent bar, latar blok), bisa dicek deterministik: konversi PDF ke PNG lalu baca warna piksel pada koordinat yang diharapkan. Cara ini terbukti menangkap bug outline hitam pada &amp;lt;code&amp;gt;&amp;amp;lt;rectangle&amp;amp;gt;&amp;lt;/code&amp;gt; (lihat [[JRXML Best Practices]]).&lt;br /&gt;
&lt;br /&gt;
== Tool CLI: jrxmlcheck ==&lt;br /&gt;
&lt;br /&gt;
Untuk pengguna non-programmer tersedia tool CLI '''jrxmlcheck''' — satu perintah, tanpa menulis Java.&lt;br /&gt;
&lt;br /&gt;
=== Unduh &amp;amp; Pasang ===&lt;br /&gt;
&lt;br /&gt;
# Unduh '''[[Media:Jrxmlcheck.zip|Jrxmlcheck.zip]]''' (5 KB; halaman berkas: [[:File:Jrxmlcheck.zip]]).&lt;br /&gt;
# Ekstrak: &amp;lt;code&amp;gt;unzip Jrxmlcheck.zip&amp;lt;/code&amp;gt; — terbentuk folder &amp;lt;code&amp;gt;cli/&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Beri izin eksekusi (sekali saja): &amp;lt;code&amp;gt;chmod +x cli/jrxmlcheck&amp;lt;/code&amp;gt;&lt;br /&gt;
# Prasyarat: Java/JDK terpasang (teruji di Java 17), dan internet saat '''pertama''' dijalankan karena library JasperReports 6.0.0 diunduh otomatis dari Maven Central.&lt;br /&gt;
&lt;br /&gt;
=== Cara Pakai ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;./cli/jrxmlcheck compile laporan.jrxml                     # cek valid &amp;amp; kompatibel JR 6.0.0&lt;br /&gt;
./cli/jrxmlcheck preview laporan.jrxml                     # buat PDF contoh, data otomatis&lt;br /&gt;
./cli/jrxmlcheck preview laporan.jrxml --images ./images   # pakai folder gambar (logo/stempel/ttd)&lt;br /&gt;
./cli/jrxmlcheck preview laporan.jrxml --data data.txt     # data sendiri, format: namafield=nilai&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Mode &amp;lt;code&amp;gt;preview&amp;lt;/code&amp;gt; membaca deklarasi &amp;lt;code&amp;gt;&amp;amp;lt;field&amp;amp;gt;&amp;lt;/code&amp;gt; di JRXML lalu membuat data contoh otomatis — langsung jalan tanpa menyiapkan apa pun. Jumlah baris contoh diatur dengan &amp;lt;code&amp;gt;--rows N&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Mode &amp;lt;code&amp;gt;audit&amp;lt;/code&amp;gt; — pemeriksaan menyeluruh sebelum deploy:&lt;br /&gt;
** '''Font''' — setiap &amp;lt;code&amp;gt;fontName&amp;lt;/code&amp;gt; dicek terhadap isi &amp;lt;code&amp;gt;jasperreports-fonts-6.0.0.jar&amp;lt;/code&amp;gt; (DejaVu Sans/Serif/Sans Mono + SansSerif/Serif/Monospaced). Font lain akan disubstitusi diam-diam di server → layout bergeser.&lt;br /&gt;
** '''Path absolut''' pada &amp;lt;code&amp;gt;imageExpression&amp;lt;/code&amp;gt; (mis. &amp;lt;code&amp;gt;/home/zaien_aji/...&amp;lt;/code&amp;gt;) — harus diganti parameter seperti &amp;lt;code&amp;gt;$P{IMAGE_DIR}&amp;lt;/code&amp;gt;.&lt;br /&gt;
** '''Geometri''' — elemen yang keluar batas band atau lebar kolom (tidak akan tercetak utuh).&lt;br /&gt;
** '''Variabel mati''' (variableExpression kosong) dan '''field/parameter tidak terpakai'''.&lt;br /&gt;
** '''Jejak Jaspersoft Studio''' (&amp;lt;code&amp;gt;splitType&amp;lt;/code&amp;gt;, property &amp;lt;code&amp;gt;com.jaspersoft.studio.*&amp;lt;/code&amp;gt;) — jadi peringatan bila diaudit dengan &amp;lt;code&amp;gt;--target ireport&amp;lt;/code&amp;gt;.&lt;br /&gt;
** '''Elemen teks bertumpuk''' — dua elemen teks yang kotaknya beririsan &amp;gt;50% dari kotak terkecil (irisan tipis antar kolom kiri/kanan diabaikan karena umum &amp;amp; aman; teks di dalam kotak latar dan stempel-di-atas-tanda-tangan juga diabaikan — gambar bertumpuk hanya dicatat sebagai info).&lt;br /&gt;
** '''Atribut PDF lawas''' (&amp;lt;code&amp;gt;pdfFontName&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;pdfEncoding&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;isPdfEmbedded&amp;lt;/code&amp;gt;) — deprecated, migrasikan ke font extension.&lt;br /&gt;
** '''Encoding file''' — JRXML wajib UTF-8 valid; file Latin-1/Windows-1252 ditolak sebelum compile dengan pesan yang menunjuk cara memperbaikinya (karakter &amp;lt;code&amp;gt;•&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;·&amp;lt;/code&amp;gt; rawan rusak).&lt;br /&gt;
** &amp;lt;code&amp;gt;--strict&amp;lt;/code&amp;gt;: exit code 1 bila ada peringatan — cocok untuk gerbang CI sebelum deploy.&lt;br /&gt;
&lt;br /&gt;
* File data sendiri: teks biasa, satu &amp;lt;code&amp;gt;namafield=nilai&amp;lt;/code&amp;gt; per baris, baris &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; untuk komentar.&lt;br /&gt;
* Pesan error diringkas ke penyebab utama beserta daftar penyebab umum (field tidak dideklarasikan, salah ketik nama field, class field salah, ekspresi bukan Java valid).&lt;br /&gt;
* PDF hasil terbuka otomatis di macOS (nonaktifkan dengan &amp;lt;code&amp;gt;--no-open&amp;lt;/code&amp;gt;); nama file diatur dengan &amp;lt;code&amp;gt;--out&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Petunjuk lengkap juga tersedia di &amp;lt;code&amp;gt;README.txt&amp;lt;/code&amp;gt; dalam paket.&lt;br /&gt;
&lt;br /&gt;
=== Validasi query ke database (--jdbc) ===&lt;br /&gt;
&lt;br /&gt;
Menjalankan query JRXML ke '''PostgreSQL sungguhan''' — persis alur produksi:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;./cli/jrxmlcheck audit laporan.jrxml \&lt;br /&gt;
    --jdbc jdbc:postgresql://HOST:5432/NAMA_DB --dbuser USER&lt;br /&gt;
# password: --dbpass PASS atau lebih aman env JRXMLCHECK_DBPASS&lt;br /&gt;
# override parameter: --param DOCUMENT_ID=XXX (boleh berulang)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Yang diverifikasi:&lt;br /&gt;
&lt;br /&gt;
# Query dieksekusi lewat &amp;lt;code&amp;gt;fillReport(connection)&amp;lt;/code&amp;gt; — parameter default ikut dievaluasi JasperReports, jadi kesalahan nama tabel/kolom langsung ketahuan dengan pesan asli PostgreSQL.&lt;br /&gt;
# '''Probe kolom''': &amp;lt;code&amp;gt;ResultSetMetaData&amp;lt;/code&amp;gt; hasil query dicocokkan dengan deklarasi &amp;lt;code&amp;gt;&amp;amp;lt;field&amp;amp;gt;&amp;lt;/code&amp;gt; — tetap bekerja walau hasil query '''0 baris''' (kasus alias salah yang tidak ketahuan saat fill biasa).&lt;br /&gt;
# Gambar tidak perlu disiapkan: placeholder otomatis dibuat untuk nama file yang dirujuk &amp;lt;code&amp;gt;imageExpression&amp;lt;/code&amp;gt; (bisa dioverride dengan &amp;lt;code&amp;gt;--images&amp;lt;/code&amp;gt;).&lt;br /&gt;
# Kolom query yang tidak dideklarasikan hanya dicatat sebagai INFO.&lt;br /&gt;
&lt;br /&gt;
Driver PostgreSQL (42.7.3) ikut terunduh otomatis oleh wrapper. Teruji end-to-end memakai PostgreSQL 16 dengan skema mini ala Openbravo (c_invoice dkk).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hasil yang Pernah Diverifikasi ==&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;sales_invoice_SSD.jrxml&amp;lt;/code&amp;gt; (asli, iReport 5.6): compile OK di JR 5.6.0 dan 6.0.0&lt;br /&gt;
* Versi perbaikan (parameter &amp;lt;code&amp;gt;IMAGE_DIR&amp;lt;/code&amp;gt;, variable mati dihapus): compile + render OK&lt;br /&gt;
* Layout modern tanpa border penuh: compile + render OK, cek piksel lolos&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]]&lt;/div&gt;</summary>
		<author><name>Wikiadmin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.infinite-erp.co.id/index.php?title=File:Jrxmlcheck.zip&amp;diff=4551</id>
		<title>File:Jrxmlcheck.zip</title>
		<link rel="alternate" type="text/html" href="https://wiki.infinite-erp.co.id/index.php?title=File:Jrxmlcheck.zip&amp;diff=4551"/>
		<updated>2026-09-16T11:35:16Z</updated>

		<summary type="html">&lt;p&gt;Wikiadmin: Wikiadmin uploaded a new version of File:Jrxmlcheck.zip&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Tool CLI jrxmlcheck v1: compile &amp;amp; preview JRXML (JR 6.0.0)&lt;/div&gt;</summary>
		<author><name>Wikiadmin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.infinite-erp.co.id/index.php?title=JRXML_Local_Verification&amp;diff=4550</id>
		<title>JRXML Local Verification</title>
		<link rel="alternate" type="text/html" href="https://wiki.infinite-erp.co.id/index.php?title=JRXML_Local_Verification&amp;diff=4550"/>
		<updated>2026-09-16T11:17:09Z</updated>

		<summary type="html">&lt;p&gt;Wikiadmin: Audit v3: cek overlap teks &amp;amp; atribut PDF lawas&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Halaman ini menjelaskan cara menguji file JRXML '''di laptop''' — compile dan render PDF tanpa men-deploy ke server InfiniteERP. Wajib dilakukan sebelum JRXML baru/diubah dipasang di server.&lt;br /&gt;
&lt;br /&gt;
== Kenapa Verifikasi Lokal ==&lt;br /&gt;
&lt;br /&gt;
* Kesalahan JRXML (ekspresi tidak valid, field tidak dideklarasikan, class salah) baru ketahuan saat compile — bukan dari membaca XML.&lt;br /&gt;
* Menguji di server berarti menyentuh sistem produksi; di laptop cukup 1 perintah Java.&lt;br /&gt;
* Klaim &amp;quot;compatible&amp;quot; harus dibuktikan dengan hasil compile terhadap '''versi library yang sama dengan server''' (6.0.0), bukan versi lain.&lt;br /&gt;
&lt;br /&gt;
== Classpath (Terbukti Jalan) ==&lt;br /&gt;
&lt;br /&gt;
Unduh dari Maven Central, taruh dalam satu folder (misal &amp;lt;code&amp;gt;lib6/&amp;lt;/code&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Jar !! Fungsi&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;jasperreports-6.0.0.jar&amp;lt;/code&amp;gt; || Engine report — versi sama dengan server&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;jasperreports-fonts-6.0.0.jar&amp;lt;/code&amp;gt; || Font extension — sama dengan server&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;commons-digester-2.1.jar&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;commons-collections-3.2.2.jar&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;commons-beanutils-1.9.4.jar&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;commons-logging-1.2.jar&amp;lt;/code&amp;gt; || Dependensi parsing&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ecj-4.4.2.jar&amp;lt;/code&amp;gt; || Compiler ekspresi (JDT)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;itextpdf-5.5.13.3.jar&amp;lt;/code&amp;gt; || Export PDF (JR 6.x memakai package &amp;lt;code&amp;gt;com.itextpdf&amp;lt;/code&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;itext-pdfa-5.5.13.3.jar&amp;lt;/code&amp;gt; || '''Wajib''' — &amp;lt;code&amp;gt;PdfAWriter&amp;lt;/code&amp;gt; dipisah ke jar ini&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Jebakan versi yang sudah ditemukan:&lt;br /&gt;
&lt;br /&gt;
* JR 6.x '''tidak''' memakai iText lawas &amp;lt;code&amp;gt;com.lowagie&amp;lt;/code&amp;gt; (itu milik JR 5.x). Tanpa &amp;lt;code&amp;gt;itextpdf&amp;lt;/code&amp;gt;, export gagal: &amp;lt;code&amp;gt;NoClassDefFoundError: com/itextpdf/text/DocumentException&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Tanpa &amp;lt;code&amp;gt;itext-pdfa&amp;lt;/code&amp;gt;, export gagal: &amp;lt;code&amp;gt;NoClassDefFoundError: com/itextpdf/text/pdf/PdfAWriter&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Teruji jalan di '''Java 17'''.&lt;br /&gt;
&lt;br /&gt;
== Langkah ==&lt;br /&gt;
&lt;br /&gt;
=== 1. Compile ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
JasperReport rep = JasperCompileManager.compileReport(&amp;quot;report.jrxml&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Compile sukses = JRXML valid dan kompatibel dengan JR 6.0.0.&lt;br /&gt;
&lt;br /&gt;
=== 2. Fill dengan data dummy ===&lt;br /&gt;
&lt;br /&gt;
Report ber-query SQL tidak butuh database untuk diuji — lewatkan datasource map:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
Map&amp;lt;String,Object&amp;gt; row = new HashMap&amp;lt;&amp;gt;();&lt;br /&gt;
row.put(&amp;quot;bpnmae&amp;quot;, &amp;quot;PT CONTOH PELANGGAN&amp;quot;);&lt;br /&gt;
row.put(&amp;quot;pricestd&amp;quot;, new BigDecimal(&amp;quot;5000000&amp;quot;));&lt;br /&gt;
// ... isi semua field sesuai deklarasi &amp;lt;field&amp;gt; di JRXML&lt;br /&gt;
&lt;br /&gt;
Map&amp;lt;String,Object&amp;gt; params = new HashMap&amp;lt;&amp;gt;();&lt;br /&gt;
params.put(&amp;quot;IMAGE_DIR&amp;quot;, &amp;quot;/path/ke/folder/gambar&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
JasperPrint print = JasperFillManager.fillReport(rep, params,&lt;br /&gt;
    new JRMapCollectionDataSource(java.util.Collections.singletonList(row)));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Catatan: ImageIO membaca gambar '''berdasarkan konten''', bukan ekstensi — file PNG bernama &amp;lt;code&amp;gt;.jpg&amp;lt;/code&amp;gt; tetap ter-render (berguna untuk placeholder).&lt;br /&gt;
&lt;br /&gt;
=== 3. Export PDF ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
JRPdfExporter exporter = new JRPdfExporter();&lt;br /&gt;
exporter.setParameter(JRExporterParameter.JASPER_PRINT, print);&lt;br /&gt;
exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, &amp;quot;sample.pdf&amp;quot;);&lt;br /&gt;
exporter.exportReport();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jalankan: &amp;lt;code&amp;gt;java -cp &amp;quot;.:lib6/*&amp;quot; NamaVerifier&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. Cek hasil ===&lt;br /&gt;
&lt;br /&gt;
* Buka PDF dan periksa visual: overlap, teks terpotong, alignment angka.&lt;br /&gt;
* Untuk elemen grafis kritis (accent bar, latar blok), bisa dicek deterministik: konversi PDF ke PNG lalu baca warna piksel pada koordinat yang diharapkan. Cara ini terbukti menangkap bug outline hitam pada &amp;lt;code&amp;gt;&amp;amp;lt;rectangle&amp;amp;gt;&amp;lt;/code&amp;gt; (lihat [[JRXML Best Practices]]).&lt;br /&gt;
&lt;br /&gt;
== Tool CLI: jrxmlcheck ==&lt;br /&gt;
&lt;br /&gt;
Untuk pengguna non-programmer tersedia tool CLI '''jrxmlcheck''' — satu perintah, tanpa menulis Java.&lt;br /&gt;
&lt;br /&gt;
=== Unduh &amp;amp; Pasang ===&lt;br /&gt;
&lt;br /&gt;
# Unduh '''[[Media:Jrxmlcheck.zip|Jrxmlcheck.zip]]''' (5 KB; halaman berkas: [[:File:Jrxmlcheck.zip]]).&lt;br /&gt;
# Ekstrak: &amp;lt;code&amp;gt;unzip Jrxmlcheck.zip&amp;lt;/code&amp;gt; — terbentuk folder &amp;lt;code&amp;gt;cli/&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Beri izin eksekusi (sekali saja): &amp;lt;code&amp;gt;chmod +x cli/jrxmlcheck&amp;lt;/code&amp;gt;&lt;br /&gt;
# Prasyarat: Java/JDK terpasang (teruji di Java 17), dan internet saat '''pertama''' dijalankan karena library JasperReports 6.0.0 diunduh otomatis dari Maven Central.&lt;br /&gt;
&lt;br /&gt;
=== Cara Pakai ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;./cli/jrxmlcheck compile laporan.jrxml                     # cek valid &amp;amp; kompatibel JR 6.0.0&lt;br /&gt;
./cli/jrxmlcheck preview laporan.jrxml                     # buat PDF contoh, data otomatis&lt;br /&gt;
./cli/jrxmlcheck preview laporan.jrxml --images ./images   # pakai folder gambar (logo/stempel/ttd)&lt;br /&gt;
./cli/jrxmlcheck preview laporan.jrxml --data data.txt     # data sendiri, format: namafield=nilai&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Mode &amp;lt;code&amp;gt;preview&amp;lt;/code&amp;gt; membaca deklarasi &amp;lt;code&amp;gt;&amp;amp;lt;field&amp;amp;gt;&amp;lt;/code&amp;gt; di JRXML lalu membuat data contoh otomatis — langsung jalan tanpa menyiapkan apa pun. Jumlah baris contoh diatur dengan &amp;lt;code&amp;gt;--rows N&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Mode &amp;lt;code&amp;gt;audit&amp;lt;/code&amp;gt; — pemeriksaan menyeluruh sebelum deploy:&lt;br /&gt;
** '''Font''' — setiap &amp;lt;code&amp;gt;fontName&amp;lt;/code&amp;gt; dicek terhadap isi &amp;lt;code&amp;gt;jasperreports-fonts-6.0.0.jar&amp;lt;/code&amp;gt; (DejaVu Sans/Serif/Sans Mono + SansSerif/Serif/Monospaced). Font lain akan disubstitusi diam-diam di server → layout bergeser.&lt;br /&gt;
** '''Path absolut''' pada &amp;lt;code&amp;gt;imageExpression&amp;lt;/code&amp;gt; (mis. &amp;lt;code&amp;gt;/home/zaien_aji/...&amp;lt;/code&amp;gt;) — harus diganti parameter seperti &amp;lt;code&amp;gt;$P{IMAGE_DIR}&amp;lt;/code&amp;gt;.&lt;br /&gt;
** '''Geometri''' — elemen yang keluar batas band atau lebar kolom (tidak akan tercetak utuh).&lt;br /&gt;
** '''Variabel mati''' (variableExpression kosong) dan '''field/parameter tidak terpakai'''.&lt;br /&gt;
** '''Jejak Jaspersoft Studio''' (&amp;lt;code&amp;gt;splitType&amp;lt;/code&amp;gt;, property &amp;lt;code&amp;gt;com.jaspersoft.studio.*&amp;lt;/code&amp;gt;) — jadi peringatan bila diaudit dengan &amp;lt;code&amp;gt;--target ireport&amp;lt;/code&amp;gt;.&lt;br /&gt;
** '''Elemen teks bertumpuk''' — dua elemen teks yang kotaknya beririsan &amp;gt;50% dari kotak terkecil (irisan tipis antar kolom kiri/kanan diabaikan karena umum &amp;amp; aman; teks di dalam kotak latar dan stempel-di-atas-tanda-tangan juga diabaikan — gambar bertumpuk hanya dicatat sebagai info).&lt;br /&gt;
** '''Atribut PDF lawas''' (&amp;lt;code&amp;gt;pdfFontName&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;pdfEncoding&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;isPdfEmbedded&amp;lt;/code&amp;gt;) — deprecated, migrasikan ke font extension.&lt;br /&gt;
** &amp;lt;code&amp;gt;--strict&amp;lt;/code&amp;gt;: exit code 1 bila ada peringatan — cocok untuk gerbang CI sebelum deploy.&lt;br /&gt;
* File data sendiri: teks biasa, satu &amp;lt;code&amp;gt;namafield=nilai&amp;lt;/code&amp;gt; per baris, baris &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; untuk komentar.&lt;br /&gt;
* Pesan error diringkas ke penyebab utama beserta daftar penyebab umum (field tidak dideklarasikan, salah ketik nama field, class field salah, ekspresi bukan Java valid).&lt;br /&gt;
* PDF hasil terbuka otomatis di macOS (nonaktifkan dengan &amp;lt;code&amp;gt;--no-open&amp;lt;/code&amp;gt;); nama file diatur dengan &amp;lt;code&amp;gt;--out&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Petunjuk lengkap juga tersedia di &amp;lt;code&amp;gt;README.txt&amp;lt;/code&amp;gt; dalam paket.&lt;br /&gt;
&lt;br /&gt;
== Hasil yang Pernah Diverifikasi ==&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;sales_invoice_SSD.jrxml&amp;lt;/code&amp;gt; (asli, iReport 5.6): compile OK di JR 5.6.0 dan 6.0.0&lt;br /&gt;
* Versi perbaikan (parameter &amp;lt;code&amp;gt;IMAGE_DIR&amp;lt;/code&amp;gt;, variable mati dihapus): compile + render OK&lt;br /&gt;
* Layout modern tanpa border penuh: compile + render OK, cek piksel lolos&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]]&lt;/div&gt;</summary>
		<author><name>Wikiadmin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.infinite-erp.co.id/index.php?title=File:Jrxmlcheck.zip&amp;diff=4549</id>
		<title>File:Jrxmlcheck.zip</title>
		<link rel="alternate" type="text/html" href="https://wiki.infinite-erp.co.id/index.php?title=File:Jrxmlcheck.zip&amp;diff=4549"/>
		<updated>2026-09-16T11:17:08Z</updated>

		<summary type="html">&lt;p&gt;Wikiadmin: Wikiadmin uploaded a new version of File:Jrxmlcheck.zip&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Tool CLI jrxmlcheck v1: compile &amp;amp; preview JRXML (JR 6.0.0)&lt;/div&gt;</summary>
		<author><name>Wikiadmin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.infinite-erp.co.id/index.php?title=JRXML_Local_Verification&amp;diff=4548</id>
		<title>JRXML Local Verification</title>
		<link rel="alternate" type="text/html" href="https://wiki.infinite-erp.co.id/index.php?title=JRXML_Local_Verification&amp;diff=4548"/>
		<updated>2026-09-16T11:08:37Z</updated>

		<summary type="html">&lt;p&gt;Wikiadmin: Dokumentasi mode audit jrxmlcheck v2&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Halaman ini menjelaskan cara menguji file JRXML '''di laptop''' — compile dan render PDF tanpa men-deploy ke server InfiniteERP. Wajib dilakukan sebelum JRXML baru/diubah dipasang di server.&lt;br /&gt;
&lt;br /&gt;
== Kenapa Verifikasi Lokal ==&lt;br /&gt;
&lt;br /&gt;
* Kesalahan JRXML (ekspresi tidak valid, field tidak dideklarasikan, class salah) baru ketahuan saat compile — bukan dari membaca XML.&lt;br /&gt;
* Menguji di server berarti menyentuh sistem produksi; di laptop cukup 1 perintah Java.&lt;br /&gt;
* Klaim &amp;quot;compatible&amp;quot; harus dibuktikan dengan hasil compile terhadap '''versi library yang sama dengan server''' (6.0.0), bukan versi lain.&lt;br /&gt;
&lt;br /&gt;
== Classpath (Terbukti Jalan) ==&lt;br /&gt;
&lt;br /&gt;
Unduh dari Maven Central, taruh dalam satu folder (misal &amp;lt;code&amp;gt;lib6/&amp;lt;/code&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Jar !! Fungsi&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;jasperreports-6.0.0.jar&amp;lt;/code&amp;gt; || Engine report — versi sama dengan server&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;jasperreports-fonts-6.0.0.jar&amp;lt;/code&amp;gt; || Font extension — sama dengan server&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;commons-digester-2.1.jar&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;commons-collections-3.2.2.jar&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;commons-beanutils-1.9.4.jar&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;commons-logging-1.2.jar&amp;lt;/code&amp;gt; || Dependensi parsing&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ecj-4.4.2.jar&amp;lt;/code&amp;gt; || Compiler ekspresi (JDT)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;itextpdf-5.5.13.3.jar&amp;lt;/code&amp;gt; || Export PDF (JR 6.x memakai package &amp;lt;code&amp;gt;com.itextpdf&amp;lt;/code&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;itext-pdfa-5.5.13.3.jar&amp;lt;/code&amp;gt; || '''Wajib''' — &amp;lt;code&amp;gt;PdfAWriter&amp;lt;/code&amp;gt; dipisah ke jar ini&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Jebakan versi yang sudah ditemukan:&lt;br /&gt;
&lt;br /&gt;
* JR 6.x '''tidak''' memakai iText lawas &amp;lt;code&amp;gt;com.lowagie&amp;lt;/code&amp;gt; (itu milik JR 5.x). Tanpa &amp;lt;code&amp;gt;itextpdf&amp;lt;/code&amp;gt;, export gagal: &amp;lt;code&amp;gt;NoClassDefFoundError: com/itextpdf/text/DocumentException&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Tanpa &amp;lt;code&amp;gt;itext-pdfa&amp;lt;/code&amp;gt;, export gagal: &amp;lt;code&amp;gt;NoClassDefFoundError: com/itextpdf/text/pdf/PdfAWriter&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Teruji jalan di '''Java 17'''.&lt;br /&gt;
&lt;br /&gt;
== Langkah ==&lt;br /&gt;
&lt;br /&gt;
=== 1. Compile ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
JasperReport rep = JasperCompileManager.compileReport(&amp;quot;report.jrxml&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Compile sukses = JRXML valid dan kompatibel dengan JR 6.0.0.&lt;br /&gt;
&lt;br /&gt;
=== 2. Fill dengan data dummy ===&lt;br /&gt;
&lt;br /&gt;
Report ber-query SQL tidak butuh database untuk diuji — lewatkan datasource map:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
Map&amp;lt;String,Object&amp;gt; row = new HashMap&amp;lt;&amp;gt;();&lt;br /&gt;
row.put(&amp;quot;bpnmae&amp;quot;, &amp;quot;PT CONTOH PELANGGAN&amp;quot;);&lt;br /&gt;
row.put(&amp;quot;pricestd&amp;quot;, new BigDecimal(&amp;quot;5000000&amp;quot;));&lt;br /&gt;
// ... isi semua field sesuai deklarasi &amp;lt;field&amp;gt; di JRXML&lt;br /&gt;
&lt;br /&gt;
Map&amp;lt;String,Object&amp;gt; params = new HashMap&amp;lt;&amp;gt;();&lt;br /&gt;
params.put(&amp;quot;IMAGE_DIR&amp;quot;, &amp;quot;/path/ke/folder/gambar&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
JasperPrint print = JasperFillManager.fillReport(rep, params,&lt;br /&gt;
    new JRMapCollectionDataSource(java.util.Collections.singletonList(row)));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Catatan: ImageIO membaca gambar '''berdasarkan konten''', bukan ekstensi — file PNG bernama &amp;lt;code&amp;gt;.jpg&amp;lt;/code&amp;gt; tetap ter-render (berguna untuk placeholder).&lt;br /&gt;
&lt;br /&gt;
=== 3. Export PDF ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
JRPdfExporter exporter = new JRPdfExporter();&lt;br /&gt;
exporter.setParameter(JRExporterParameter.JASPER_PRINT, print);&lt;br /&gt;
exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, &amp;quot;sample.pdf&amp;quot;);&lt;br /&gt;
exporter.exportReport();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jalankan: &amp;lt;code&amp;gt;java -cp &amp;quot;.:lib6/*&amp;quot; NamaVerifier&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. Cek hasil ===&lt;br /&gt;
&lt;br /&gt;
* Buka PDF dan periksa visual: overlap, teks terpotong, alignment angka.&lt;br /&gt;
* Untuk elemen grafis kritis (accent bar, latar blok), bisa dicek deterministik: konversi PDF ke PNG lalu baca warna piksel pada koordinat yang diharapkan. Cara ini terbukti menangkap bug outline hitam pada &amp;lt;code&amp;gt;&amp;amp;lt;rectangle&amp;amp;gt;&amp;lt;/code&amp;gt; (lihat [[JRXML Best Practices]]).&lt;br /&gt;
&lt;br /&gt;
== Tool CLI: jrxmlcheck ==&lt;br /&gt;
&lt;br /&gt;
Untuk pengguna non-programmer tersedia tool CLI '''jrxmlcheck''' — satu perintah, tanpa menulis Java.&lt;br /&gt;
&lt;br /&gt;
=== Unduh &amp;amp; Pasang ===&lt;br /&gt;
&lt;br /&gt;
# Unduh '''[[Media:Jrxmlcheck.zip|Jrxmlcheck.zip]]''' (5 KB; halaman berkas: [[:File:Jrxmlcheck.zip]]).&lt;br /&gt;
# Ekstrak: &amp;lt;code&amp;gt;unzip Jrxmlcheck.zip&amp;lt;/code&amp;gt; — terbentuk folder &amp;lt;code&amp;gt;cli/&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Beri izin eksekusi (sekali saja): &amp;lt;code&amp;gt;chmod +x cli/jrxmlcheck&amp;lt;/code&amp;gt;&lt;br /&gt;
# Prasyarat: Java/JDK terpasang (teruji di Java 17), dan internet saat '''pertama''' dijalankan karena library JasperReports 6.0.0 diunduh otomatis dari Maven Central.&lt;br /&gt;
&lt;br /&gt;
=== Cara Pakai ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;./cli/jrxmlcheck compile laporan.jrxml                     # cek valid &amp;amp; kompatibel JR 6.0.0&lt;br /&gt;
./cli/jrxmlcheck preview laporan.jrxml                     # buat PDF contoh, data otomatis&lt;br /&gt;
./cli/jrxmlcheck preview laporan.jrxml --images ./images   # pakai folder gambar (logo/stempel/ttd)&lt;br /&gt;
./cli/jrxmlcheck preview laporan.jrxml --data data.txt     # data sendiri, format: namafield=nilai&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Mode &amp;lt;code&amp;gt;preview&amp;lt;/code&amp;gt; membaca deklarasi &amp;lt;code&amp;gt;&amp;amp;lt;field&amp;amp;gt;&amp;lt;/code&amp;gt; di JRXML lalu membuat data contoh otomatis — langsung jalan tanpa menyiapkan apa pun. Jumlah baris contoh diatur dengan &amp;lt;code&amp;gt;--rows N&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Mode &amp;lt;code&amp;gt;audit&amp;lt;/code&amp;gt; — pemeriksaan menyeluruh sebelum deploy:&lt;br /&gt;
** '''Font''' — setiap &amp;lt;code&amp;gt;fontName&amp;lt;/code&amp;gt; dicek terhadap isi &amp;lt;code&amp;gt;jasperreports-fonts-6.0.0.jar&amp;lt;/code&amp;gt; (DejaVu Sans/Serif/Sans Mono + SansSerif/Serif/Monospaced). Font lain akan disubstitusi diam-diam di server → layout bergeser.&lt;br /&gt;
** '''Path absolut''' pada &amp;lt;code&amp;gt;imageExpression&amp;lt;/code&amp;gt; (mis. &amp;lt;code&amp;gt;/home/zaien_aji/...&amp;lt;/code&amp;gt;) — harus diganti parameter seperti &amp;lt;code&amp;gt;$P{IMAGE_DIR}&amp;lt;/code&amp;gt;.&lt;br /&gt;
** '''Geometri''' — elemen yang keluar batas band atau lebar kolom (tidak akan tercetak utuh).&lt;br /&gt;
** '''Variabel mati''' (variableExpression kosong) dan '''field/parameter tidak terpakai'''.&lt;br /&gt;
** '''Jejak Jaspersoft Studio''' (&amp;lt;code&amp;gt;splitType&amp;lt;/code&amp;gt;, property &amp;lt;code&amp;gt;com.jaspersoft.studio.*&amp;lt;/code&amp;gt;) — jadi peringatan bila diaudit dengan &amp;lt;code&amp;gt;--target ireport&amp;lt;/code&amp;gt;.&lt;br /&gt;
** &amp;lt;code&amp;gt;--strict&amp;lt;/code&amp;gt;: exit code 1 bila ada peringatan — cocok untuk gerbang CI sebelum deploy.&lt;br /&gt;
* File data sendiri: teks biasa, satu &amp;lt;code&amp;gt;namafield=nilai&amp;lt;/code&amp;gt; per baris, baris &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; untuk komentar.&lt;br /&gt;
* Pesan error diringkas ke penyebab utama beserta daftar penyebab umum (field tidak dideklarasikan, salah ketik nama field, class field salah, ekspresi bukan Java valid).&lt;br /&gt;
* PDF hasil terbuka otomatis di macOS (nonaktifkan dengan &amp;lt;code&amp;gt;--no-open&amp;lt;/code&amp;gt;); nama file diatur dengan &amp;lt;code&amp;gt;--out&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Petunjuk lengkap juga tersedia di &amp;lt;code&amp;gt;README.txt&amp;lt;/code&amp;gt; dalam paket.&lt;br /&gt;
&lt;br /&gt;
== Hasil yang Pernah Diverifikasi ==&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;sales_invoice_SSD.jrxml&amp;lt;/code&amp;gt; (asli, iReport 5.6): compile OK di JR 5.6.0 dan 6.0.0&lt;br /&gt;
* Versi perbaikan (parameter &amp;lt;code&amp;gt;IMAGE_DIR&amp;lt;/code&amp;gt;, variable mati dihapus): compile + render OK&lt;br /&gt;
* Layout modern tanpa border penuh: compile + render OK, cek piksel lolos&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]]&lt;/div&gt;</summary>
		<author><name>Wikiadmin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.infinite-erp.co.id/index.php?title=File:Jrxmlcheck.zip&amp;diff=4547</id>
		<title>File:Jrxmlcheck.zip</title>
		<link rel="alternate" type="text/html" href="https://wiki.infinite-erp.co.id/index.php?title=File:Jrxmlcheck.zip&amp;diff=4547"/>
		<updated>2026-09-16T11:08:36Z</updated>

		<summary type="html">&lt;p&gt;Wikiadmin: Wikiadmin uploaded a new version of File:Jrxmlcheck.zip&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Tool CLI jrxmlcheck v1: compile &amp;amp; preview JRXML (JR 6.0.0)&lt;/div&gt;</summary>
		<author><name>Wikiadmin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.infinite-erp.co.id/index.php?title=JRXML_Local_Verification&amp;diff=4546</id>
		<title>JRXML Local Verification</title>
		<link rel="alternate" type="text/html" href="https://wiki.infinite-erp.co.id/index.php?title=JRXML_Local_Verification&amp;diff=4546"/>
		<updated>2026-09-16T10:55:04Z</updated>

		<summary type="html">&lt;p&gt;Wikiadmin: Tool jrxmlcheck: ganti referensi path lokal menjadi link unduh Media:Jrxmlcheck.zip + petunjuk pasang&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Halaman ini menjelaskan cara menguji file JRXML '''di laptop''' — compile dan render PDF tanpa men-deploy ke server InfiniteERP. Wajib dilakukan sebelum JRXML baru/diubah dipasang di server.&lt;br /&gt;
&lt;br /&gt;
== Kenapa Verifikasi Lokal ==&lt;br /&gt;
&lt;br /&gt;
* Kesalahan JRXML (ekspresi tidak valid, field tidak dideklarasikan, class salah) baru ketahuan saat compile — bukan dari membaca XML.&lt;br /&gt;
* Menguji di server berarti menyentuh sistem produksi; di laptop cukup 1 perintah Java.&lt;br /&gt;
* Klaim &amp;quot;compatible&amp;quot; harus dibuktikan dengan hasil compile terhadap '''versi library yang sama dengan server''' (6.0.0), bukan versi lain.&lt;br /&gt;
&lt;br /&gt;
== Classpath (Terbukti Jalan) ==&lt;br /&gt;
&lt;br /&gt;
Unduh dari Maven Central, taruh dalam satu folder (misal &amp;lt;code&amp;gt;lib6/&amp;lt;/code&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Jar !! Fungsi&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;jasperreports-6.0.0.jar&amp;lt;/code&amp;gt; || Engine report — versi sama dengan server&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;jasperreports-fonts-6.0.0.jar&amp;lt;/code&amp;gt; || Font extension — sama dengan server&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;commons-digester-2.1.jar&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;commons-collections-3.2.2.jar&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;commons-beanutils-1.9.4.jar&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;commons-logging-1.2.jar&amp;lt;/code&amp;gt; || Dependensi parsing&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ecj-4.4.2.jar&amp;lt;/code&amp;gt; || Compiler ekspresi (JDT)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;itextpdf-5.5.13.3.jar&amp;lt;/code&amp;gt; || Export PDF (JR 6.x memakai package &amp;lt;code&amp;gt;com.itextpdf&amp;lt;/code&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;itext-pdfa-5.5.13.3.jar&amp;lt;/code&amp;gt; || '''Wajib''' — &amp;lt;code&amp;gt;PdfAWriter&amp;lt;/code&amp;gt; dipisah ke jar ini&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Jebakan versi yang sudah ditemukan:&lt;br /&gt;
&lt;br /&gt;
* JR 6.x '''tidak''' memakai iText lawas &amp;lt;code&amp;gt;com.lowagie&amp;lt;/code&amp;gt; (itu milik JR 5.x). Tanpa &amp;lt;code&amp;gt;itextpdf&amp;lt;/code&amp;gt;, export gagal: &amp;lt;code&amp;gt;NoClassDefFoundError: com/itextpdf/text/DocumentException&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Tanpa &amp;lt;code&amp;gt;itext-pdfa&amp;lt;/code&amp;gt;, export gagal: &amp;lt;code&amp;gt;NoClassDefFoundError: com/itextpdf/text/pdf/PdfAWriter&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Teruji jalan di '''Java 17'''.&lt;br /&gt;
&lt;br /&gt;
== Langkah ==&lt;br /&gt;
&lt;br /&gt;
=== 1. Compile ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
JasperReport rep = JasperCompileManager.compileReport(&amp;quot;report.jrxml&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Compile sukses = JRXML valid dan kompatibel dengan JR 6.0.0.&lt;br /&gt;
&lt;br /&gt;
=== 2. Fill dengan data dummy ===&lt;br /&gt;
&lt;br /&gt;
Report ber-query SQL tidak butuh database untuk diuji — lewatkan datasource map:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
Map&amp;lt;String,Object&amp;gt; row = new HashMap&amp;lt;&amp;gt;();&lt;br /&gt;
row.put(&amp;quot;bpnmae&amp;quot;, &amp;quot;PT CONTOH PELANGGAN&amp;quot;);&lt;br /&gt;
row.put(&amp;quot;pricestd&amp;quot;, new BigDecimal(&amp;quot;5000000&amp;quot;));&lt;br /&gt;
// ... isi semua field sesuai deklarasi &amp;lt;field&amp;gt; di JRXML&lt;br /&gt;
&lt;br /&gt;
Map&amp;lt;String,Object&amp;gt; params = new HashMap&amp;lt;&amp;gt;();&lt;br /&gt;
params.put(&amp;quot;IMAGE_DIR&amp;quot;, &amp;quot;/path/ke/folder/gambar&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
JasperPrint print = JasperFillManager.fillReport(rep, params,&lt;br /&gt;
    new JRMapCollectionDataSource(java.util.Collections.singletonList(row)));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Catatan: ImageIO membaca gambar '''berdasarkan konten''', bukan ekstensi — file PNG bernama &amp;lt;code&amp;gt;.jpg&amp;lt;/code&amp;gt; tetap ter-render (berguna untuk placeholder).&lt;br /&gt;
&lt;br /&gt;
=== 3. Export PDF ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
JRPdfExporter exporter = new JRPdfExporter();&lt;br /&gt;
exporter.setParameter(JRExporterParameter.JASPER_PRINT, print);&lt;br /&gt;
exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, &amp;quot;sample.pdf&amp;quot;);&lt;br /&gt;
exporter.exportReport();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jalankan: &amp;lt;code&amp;gt;java -cp &amp;quot;.:lib6/*&amp;quot; NamaVerifier&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. Cek hasil ===&lt;br /&gt;
&lt;br /&gt;
* Buka PDF dan periksa visual: overlap, teks terpotong, alignment angka.&lt;br /&gt;
* Untuk elemen grafis kritis (accent bar, latar blok), bisa dicek deterministik: konversi PDF ke PNG lalu baca warna piksel pada koordinat yang diharapkan. Cara ini terbukti menangkap bug outline hitam pada &amp;lt;code&amp;gt;&amp;amp;lt;rectangle&amp;amp;gt;&amp;lt;/code&amp;gt; (lihat [[JRXML Best Practices]]).&lt;br /&gt;
&lt;br /&gt;
== Tool CLI: jrxmlcheck ==&lt;br /&gt;
&lt;br /&gt;
Untuk pengguna non-programmer tersedia tool CLI '''jrxmlcheck''' — satu perintah, tanpa menulis Java.&lt;br /&gt;
&lt;br /&gt;
=== Unduh &amp;amp; Pasang ===&lt;br /&gt;
&lt;br /&gt;
# Unduh '''[[Media:Jrxmlcheck.zip|Jrxmlcheck.zip]]''' (5 KB; halaman berkas: [[:File:Jrxmlcheck.zip]]).&lt;br /&gt;
# Ekstrak: &amp;lt;code&amp;gt;unzip Jrxmlcheck.zip&amp;lt;/code&amp;gt; — terbentuk folder &amp;lt;code&amp;gt;cli/&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Beri izin eksekusi (sekali saja): &amp;lt;code&amp;gt;chmod +x cli/jrxmlcheck&amp;lt;/code&amp;gt;&lt;br /&gt;
# Prasyarat: Java/JDK terpasang (teruji di Java 17), dan internet saat '''pertama''' dijalankan karena library JasperReports 6.0.0 diunduh otomatis dari Maven Central.&lt;br /&gt;
&lt;br /&gt;
=== Cara Pakai ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;./cli/jrxmlcheck compile laporan.jrxml                     # cek valid &amp;amp; kompatibel JR 6.0.0&lt;br /&gt;
./cli/jrxmlcheck preview laporan.jrxml                     # buat PDF contoh, data otomatis&lt;br /&gt;
./cli/jrxmlcheck preview laporan.jrxml --images ./images   # pakai folder gambar (logo/stempel/ttd)&lt;br /&gt;
./cli/jrxmlcheck preview laporan.jrxml --data data.txt     # data sendiri, format: namafield=nilai&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Mode &amp;lt;code&amp;gt;preview&amp;lt;/code&amp;gt; membaca deklarasi &amp;lt;code&amp;gt;&amp;amp;lt;field&amp;amp;gt;&amp;lt;/code&amp;gt; di JRXML lalu membuat data contoh otomatis — langsung jalan tanpa menyiapkan apa pun. Jumlah baris contoh diatur dengan &amp;lt;code&amp;gt;--rows N&amp;lt;/code&amp;gt;.&lt;br /&gt;
* File data sendiri: teks biasa, satu &amp;lt;code&amp;gt;namafield=nilai&amp;lt;/code&amp;gt; per baris, baris &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; untuk komentar.&lt;br /&gt;
* Pesan error diringkas ke penyebab utama beserta daftar penyebab umum (field tidak dideklarasikan, salah ketik nama field, class field salah, ekspresi bukan Java valid).&lt;br /&gt;
* PDF hasil terbuka otomatis di macOS (nonaktifkan dengan &amp;lt;code&amp;gt;--no-open&amp;lt;/code&amp;gt;); nama file diatur dengan &amp;lt;code&amp;gt;--out&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Petunjuk lengkap juga tersedia di &amp;lt;code&amp;gt;README.txt&amp;lt;/code&amp;gt; dalam paket.&lt;br /&gt;
&lt;br /&gt;
== Hasil yang Pernah Diverifikasi ==&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;sales_invoice_SSD.jrxml&amp;lt;/code&amp;gt; (asli, iReport 5.6): compile OK di JR 5.6.0 dan 6.0.0&lt;br /&gt;
* Versi perbaikan (parameter &amp;lt;code&amp;gt;IMAGE_DIR&amp;lt;/code&amp;gt;, variable mati dihapus): compile + render OK&lt;br /&gt;
* Layout modern tanpa border penuh: compile + render OK, cek piksel lolos&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]]&lt;/div&gt;</summary>
		<author><name>Wikiadmin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.infinite-erp.co.id/index.php?title=File:Jrxmlcheck.zip&amp;diff=4545</id>
		<title>File:Jrxmlcheck.zip</title>
		<link rel="alternate" type="text/html" href="https://wiki.infinite-erp.co.id/index.php?title=File:Jrxmlcheck.zip&amp;diff=4545"/>
		<updated>2026-09-16T10:53:33Z</updated>

		<summary type="html">&lt;p&gt;Wikiadmin: Tool CLI jrxmlcheck v1: compile &amp;amp; preview JRXML (JR 6.0.0)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Tool CLI jrxmlcheck v1: compile &amp;amp; preview JRXML (JR 6.0.0)&lt;/div&gt;</summary>
		<author><name>Wikiadmin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.infinite-erp.co.id/index.php?title=JRXML_Local_Verification&amp;diff=4544</id>
		<title>JRXML Local Verification</title>
		<link rel="alternate" type="text/html" href="https://wiki.infinite-erp.co.id/index.php?title=JRXML_Local_Verification&amp;diff=4544"/>
		<updated>2026-09-16T10:39:13Z</updated>

		<summary type="html">&lt;p&gt;Wikiadmin: Tambah dokumentasi tool CLI jrxmlcheck&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Halaman ini menjelaskan cara menguji file JRXML '''di laptop''' — compile dan render PDF tanpa men-deploy ke server InfiniteERP. Wajib dilakukan sebelum JRXML baru/diubah dipasang di server.&lt;br /&gt;
&lt;br /&gt;
== Kenapa Verifikasi Lokal ==&lt;br /&gt;
&lt;br /&gt;
* Kesalahan JRXML (ekspresi tidak valid, field tidak dideklarasikan, class salah) baru ketahuan saat compile — bukan dari membaca XML.&lt;br /&gt;
* Menguji di server berarti menyentuh sistem produksi; di laptop cukup 1 perintah Java.&lt;br /&gt;
* Klaim &amp;quot;compatible&amp;quot; harus dibuktikan dengan hasil compile terhadap '''versi library yang sama dengan server''' (6.0.0), bukan versi lain.&lt;br /&gt;
&lt;br /&gt;
== Classpath (Terbukti Jalan) ==&lt;br /&gt;
&lt;br /&gt;
Unduh dari Maven Central, taruh dalam satu folder (misal &amp;lt;code&amp;gt;lib6/&amp;lt;/code&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Jar !! Fungsi&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;jasperreports-6.0.0.jar&amp;lt;/code&amp;gt; || Engine report — versi sama dengan server&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;jasperreports-fonts-6.0.0.jar&amp;lt;/code&amp;gt; || Font extension — sama dengan server&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;commons-digester-2.1.jar&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;commons-collections-3.2.2.jar&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;commons-beanutils-1.9.4.jar&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;commons-logging-1.2.jar&amp;lt;/code&amp;gt; || Dependensi parsing&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ecj-4.4.2.jar&amp;lt;/code&amp;gt; || Compiler ekspresi (JDT)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;itextpdf-5.5.13.3.jar&amp;lt;/code&amp;gt; || Export PDF (JR 6.x memakai package &amp;lt;code&amp;gt;com.itextpdf&amp;lt;/code&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;itext-pdfa-5.5.13.3.jar&amp;lt;/code&amp;gt; || '''Wajib''' — &amp;lt;code&amp;gt;PdfAWriter&amp;lt;/code&amp;gt; dipisah ke jar ini&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Jebakan versi yang sudah ditemukan:&lt;br /&gt;
&lt;br /&gt;
* JR 6.x '''tidak''' memakai iText lawas &amp;lt;code&amp;gt;com.lowagie&amp;lt;/code&amp;gt; (itu milik JR 5.x). Tanpa &amp;lt;code&amp;gt;itextpdf&amp;lt;/code&amp;gt;, export gagal: &amp;lt;code&amp;gt;NoClassDefFoundError: com/itextpdf/text/DocumentException&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Tanpa &amp;lt;code&amp;gt;itext-pdfa&amp;lt;/code&amp;gt;, export gagal: &amp;lt;code&amp;gt;NoClassDefFoundError: com/itextpdf/text/pdf/PdfAWriter&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Teruji jalan di '''Java 17'''.&lt;br /&gt;
&lt;br /&gt;
== Langkah ==&lt;br /&gt;
&lt;br /&gt;
=== 1. Compile ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
JasperReport rep = JasperCompileManager.compileReport(&amp;quot;report.jrxml&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Compile sukses = JRXML valid dan kompatibel dengan JR 6.0.0.&lt;br /&gt;
&lt;br /&gt;
=== 2. Fill dengan data dummy ===&lt;br /&gt;
&lt;br /&gt;
Report ber-query SQL tidak butuh database untuk diuji — lewatkan datasource map:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
Map&amp;lt;String,Object&amp;gt; row = new HashMap&amp;lt;&amp;gt;();&lt;br /&gt;
row.put(&amp;quot;bpnmae&amp;quot;, &amp;quot;PT CONTOH PELANGGAN&amp;quot;);&lt;br /&gt;
row.put(&amp;quot;pricestd&amp;quot;, new BigDecimal(&amp;quot;5000000&amp;quot;));&lt;br /&gt;
// ... isi semua field sesuai deklarasi &amp;lt;field&amp;gt; di JRXML&lt;br /&gt;
&lt;br /&gt;
Map&amp;lt;String,Object&amp;gt; params = new HashMap&amp;lt;&amp;gt;();&lt;br /&gt;
params.put(&amp;quot;IMAGE_DIR&amp;quot;, &amp;quot;/path/ke/folder/gambar&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
JasperPrint print = JasperFillManager.fillReport(rep, params,&lt;br /&gt;
    new JRMapCollectionDataSource(java.util.Collections.singletonList(row)));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Catatan: ImageIO membaca gambar '''berdasarkan konten''', bukan ekstensi — file PNG bernama &amp;lt;code&amp;gt;.jpg&amp;lt;/code&amp;gt; tetap ter-render (berguna untuk placeholder).&lt;br /&gt;
&lt;br /&gt;
=== 3. Export PDF ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
JRPdfExporter exporter = new JRPdfExporter();&lt;br /&gt;
exporter.setParameter(JRExporterParameter.JASPER_PRINT, print);&lt;br /&gt;
exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, &amp;quot;sample.pdf&amp;quot;);&lt;br /&gt;
exporter.exportReport();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jalankan: &amp;lt;code&amp;gt;java -cp &amp;quot;.:lib6/*&amp;quot; NamaVerifier&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. Cek hasil ===&lt;br /&gt;
&lt;br /&gt;
* Buka PDF dan periksa visual: overlap, teks terpotong, alignment angka.&lt;br /&gt;
* Untuk elemen grafis kritis (accent bar, latar blok), bisa dicek deterministik: konversi PDF ke PNG lalu baca warna piksel pada koordinat yang diharapkan. Cara ini terbukti menangkap bug outline hitam pada &amp;lt;code&amp;gt;&amp;amp;lt;rectangle&amp;amp;gt;&amp;lt;/code&amp;gt; (lihat [[JRXML Best Practices]]).&lt;br /&gt;
&lt;br /&gt;
== Tool CLI: jrxmlcheck ==&lt;br /&gt;
&lt;br /&gt;
Untuk pengguna non-programmer tersedia tool CLI '''jrxmlcheck''' (folder &amp;lt;code&amp;gt;~/jrxml-work/cli/&amp;lt;/code&amp;gt;) — satu perintah, tanpa menulis Java:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;jrxmlcheck compile laporan.jrxml                     # cek valid &amp;amp; kompatibel JR 6.0.0&lt;br /&gt;
jrxmlcheck preview laporan.jrxml                     # buat PDF contoh, data otomatis&lt;br /&gt;
jrxmlcheck preview laporan.jrxml --images ./images   # pakai folder gambar (logo/stempel/ttd)&lt;br /&gt;
jrxmlcheck preview laporan.jrxml --data data.txt     # data sendiri, format: namafield=nilai&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Library JR 6.0.0 diunduh otomatis dari Maven Central saat '''pertama''' dijalankan (butuh internet sekali saja).&lt;br /&gt;
* Mode &amp;lt;code&amp;gt;preview&amp;lt;/code&amp;gt; membaca deklarasi &amp;lt;code&amp;gt;&amp;amp;lt;field&amp;amp;gt;&amp;lt;/code&amp;gt; di JRXML lalu membuat data contoh otomatis — langsung jalan tanpa menyiapkan apa pun. Jumlah baris contoh diatur dengan &amp;lt;code&amp;gt;--rows N&amp;lt;/code&amp;gt;.&lt;br /&gt;
* File data sendiri: teks biasa, satu &amp;lt;code&amp;gt;namafield=nilai&amp;lt;/code&amp;gt; per baris, baris &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; untuk komentar.&lt;br /&gt;
* Pesan error diringkas ke penyebab utama beserta daftar penyebab umum (field tidak dideklarasikan, salah ketik nama field, class field salah, ekspresi bukan Java valid).&lt;br /&gt;
* PDF hasil terbuka otomatis di macOS (nonaktifkan dengan &amp;lt;code&amp;gt;--no-open&amp;lt;/code&amp;gt;); nama file diatur dengan &amp;lt;code&amp;gt;--out&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Prasyarat: Java/JDK terpasang (teruji di Java 17).&lt;br /&gt;
&lt;br /&gt;
== Hasil yang Pernah Diverifikasi ==&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;sales_invoice_SSD.jrxml&amp;lt;/code&amp;gt; (asli, iReport 5.6): compile OK di JR 5.6.0 dan 6.0.0&lt;br /&gt;
* Versi perbaikan (parameter &amp;lt;code&amp;gt;IMAGE_DIR&amp;lt;/code&amp;gt;, variable mati dihapus): compile + render OK&lt;br /&gt;
* Layout modern tanpa border penuh: compile + render OK, cek piksel lolos&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]]&lt;/div&gt;</summary>
		<author><name>Wikiadmin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.infinite-erp.co.id/index.php?title=JasperReports&amp;diff=4543</id>
		<title>JasperReports</title>
		<link rel="alternate" type="text/html" href="https://wiki.infinite-erp.co.id/index.php?title=JasperReports&amp;diff=4543"/>
		<updated>2026-09-16T10:25:52Z</updated>

		<summary type="html">&lt;p&gt;Wikiadmin: Tambah prosedur resmi Setting Compatibility Jaspersoft Studio ke JR 6.0.0 + sumber&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''JasperReports''' adalah library reporting Java yang dipakai InfiniteERP (Openbravo) untuk mencetak dokumen (invoice, kuitansi, dan report lain) dari file template '''JRXML'''.&lt;br /&gt;
&lt;br /&gt;
== Versi Library di Server ==&lt;br /&gt;
&lt;br /&gt;
Berdasarkan pemeriksaan source code Openbravo, runtime report memakai:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;jasperreports-6.0.0.jar&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;jasperreports-fonts-6.0.0.jar&amp;lt;/code&amp;gt;&lt;br /&gt;
* iText 5.5.x (package &amp;lt;code&amp;gt;com.itextpdf&amp;lt;/code&amp;gt;) untuk export PDF — bukan iText lawas &amp;lt;code&amp;gt;com.lowagie&amp;lt;/code&amp;gt; yang dipakai JasperReports 5.x&lt;br /&gt;
&lt;br /&gt;
== Tool Desain ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Tool !! Library JasperReports bawaan !! Keterangan&lt;br /&gt;
|-&lt;br /&gt;
| iReport 5.6.0 || 5.6.0 || Legacy, sudah tidak dikembangkan&lt;br /&gt;
|-&lt;br /&gt;
| Jaspersoft Studio CE 6.21.x || 6.21.x || Tool desain aktif berbasis Eclipse&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
File JRXML existing (contoh: &amp;lt;code&amp;gt;sales_invoice_SSD.jrxml&amp;lt;/code&amp;gt;) dibuat dengan iReport 5.6, lalu sempat disentuh Jaspersoft Studio (terlihat dari property &amp;lt;code&amp;gt;com.jaspersoft.studio.*&amp;lt;/code&amp;gt; dan atribut &amp;lt;code&amp;gt;splitType&amp;lt;/code&amp;gt; di dalamnya).&lt;br /&gt;
&lt;br /&gt;
== Kompatibilitas JRXML (Sudah Diuji) ==&lt;br /&gt;
&lt;br /&gt;
Pengujian dilakukan dengan meng-compile JRXML memakai &amp;lt;code&amp;gt;jasperreports-6.0.0.jar&amp;lt;/code&amp;gt; persis seperti di server:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! File JRXML !! Compile di JR 6.0.0 !! Export PDF&lt;br /&gt;
|-&lt;br /&gt;
| Asli (output iReport 5.6, ada &amp;lt;code&amp;gt;splitType&amp;lt;/code&amp;gt;) || OK || —&lt;br /&gt;
|-&lt;br /&gt;
| Versi perbaikan (clean-up) || OK || OK&lt;br /&gt;
|-&lt;br /&gt;
| Layout baru (modern) || OK || OK&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kesimpulan:&lt;br /&gt;
&lt;br /&gt;
* Namespace lawas &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;http://jasperreports.sourceforge.net/jasperreports&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; '''sepenuhnya kompatibel''' dengan JR 6.0.0 — tidak perlu diubah.&lt;br /&gt;
* Parser JR 6.0.0 (bahkan 5.6.0) '''toleran''' terhadap atribut yang tidak dikenal; atribut asing diabaikan saat compile.&lt;br /&gt;
* Risiko sesungguhnya bukan di runtime, melainkan di '''editor''': iReport 5.6 dapat menghapus/mengacaukan atribut versi baru saat file di-edit lalu di-save.&lt;br /&gt;
&lt;br /&gt;
== Mengedit dengan Jaspersoft Studio CE ==&lt;br /&gt;
&lt;br /&gt;
Jaspersoft Studio Community Edition dapat diunduh di: [https://community.jaspersoft.com/download-jaspersoft/community-edition/jaspersoft-studio_6.21.2 Download Jaspersoft Studio CE 6.21.x]&lt;br /&gt;
&lt;br /&gt;
Karena Studio 6.21.x membawa library JasperReports 6.21.x (lebih baru dari runtime server 6.0.0), perhatikan:&lt;br /&gt;
&lt;br /&gt;
# Setelah mengedit, '''selalu compile ulang JRXML terhadap JR 6.0.0''' (lihat [[JRXML Local Verification]]) sebelum deploy — jangan mengandalkan preview Studio.&lt;br /&gt;
# Hindari memakai komponen/fitur yang hanya ada di versi baru (misal elemen &amp;lt;code&amp;gt;&amp;amp;lt;part&amp;amp;gt;&amp;lt;/code&amp;gt;) kecuali runtime server memang di-upgrade.&lt;br /&gt;
# Property &amp;lt;code&amp;gt;com.jaspersoft.studio.*&amp;lt;/code&amp;gt; yang ditulis Studio aman — diabaikan oleh runtime.&lt;br /&gt;
# Simpan file dengan encoding UTF-8 dan pertahankan namespace lawas agar tetap konsisten dengan report existing.&lt;br /&gt;
&lt;br /&gt;
=== Setting Compatibility ke JasperReports 6.0.0 (Dokumentasi Resmi) ===&lt;br /&gt;
&lt;br /&gt;
Jaspersoft Studio secara default memakai library versi bawaannya (Studio 6.21.x → JasperReports 6.21.x) untuk '''menyimpan JRXML''' dan '''meng-compile report'''. Karena runtime server InfiniteERP adalah JR 6.0.0, atur compatibility agar keduanya memakai 6.0.0:&lt;br /&gt;
&lt;br /&gt;
# Buka '''Window &amp;gt; Preferences''' (di macOS: '''Jaspersoft Studio &amp;gt; Preferences''').&lt;br /&gt;
# Pilih '''Jaspersoft Studio &amp;gt; Compatibility'''.&lt;br /&gt;
# Pada bagian '''Source .jrxml Version''', pilih '''6.0.0''' di menu ''Version'' — JRXML akan disimpan dalam format versi tersebut.&lt;br /&gt;
# Centang '''Don't save Jaspersoft Studio properties''' — property khusus Studio (info layout, dimensi px/mm, data adapter terakhir dipakai) tidak ikut tersimpan ke JRXML.&lt;br /&gt;
# Pada bagian '''Compiler Settings''', pilih '''6.0.0''' di menu ''Version'' — report di-compile memakai JR 6.0.0.&lt;br /&gt;
# Jika 6.0.0 belum tersedia di menu, klik '''Manage JasperReports Versions''':&lt;br /&gt;
#* '''Add From Path''' — jika jar JR 6.0.0 sudah ada di lokal; arahkan ke direktori berisi JasperReports Library dan Studio akan memverifikasinya.&lt;br /&gt;
#* '''Add From URL''' — unduh dari SourceForge (https://sourceforge.net/projects/jasperreports/) atau URL lain; Studio mengunduh, memverifikasi jar, lalu menambahkannya ke menu.&lt;br /&gt;
&lt;br /&gt;
Catatan dari dokumentasi resmi:&lt;br /&gt;
&lt;br /&gt;
* Fitur report yang bergantung pada versi JasperReports lebih baru '''tidak akan tersedia''' saat memakai versi lebih lama.&lt;br /&gt;
* Pengaturan Compatibility ini ditujukan untuk report yang dipakai di aplikasi sendiri berbasis JasperReports Library (persis kasus Openbravo/InfiniteERP). Jika targetnya JasperReports Server, versi diatur di ''connection settings'' server.&lt;br /&gt;
&lt;br /&gt;
Sumber resmi: [https://community.jaspersoft.com/documentation/jaspersoft%C2%AE-studio/tibco-jaspersoft-studio-user-guide/v621/setting-compatibility-earlier-versions/ TIBCO Jaspersoft Studio User Guide — Setting Compatibility with Earlier Versions of JasperReports Library] ([https://web.archive.org/web/20250804124055/https://community.jaspersoft.com/documentation/jaspersoft%C2%AE-studio/tibco-jaspersoft-studio-user-guide/v621/setting-compatibility-earlier-versions/ arsip Wayback, 4 Agustus 2025])&lt;br /&gt;
&lt;br /&gt;
== Praktik dan Verifikasi ==&lt;br /&gt;
&lt;br /&gt;
* [[JRXML Best Practices]] — aturan penulisan JRXML, jebakan umum, dan polanya&lt;br /&gt;
* [[JRXML Local Verification]] — cara compile + render JRXML di laptop tanpa server&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]]&lt;/div&gt;</summary>
		<author><name>Wikiadmin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.infinite-erp.co.id/index.php?title=JRXML_Best_Practices&amp;diff=4541</id>
		<title>JRXML Best Practices</title>
		<link rel="alternate" type="text/html" href="https://wiki.infinite-erp.co.id/index.php?title=JRXML_Best_Practices&amp;diff=4541"/>
		<updated>2026-09-16T10:15:26Z</updated>

		<summary type="html">&lt;p&gt;Wikiadmin: Dokumentasi&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Halaman ini merangkum aturan dan jebakan yang ditemukan saat menulis/memperbaiki JRXML untuk InfiniteERP (runtime JasperReports 6.0.0). Latar belakang versi ada di halaman [[JasperReports]].&lt;br /&gt;
&lt;br /&gt;
== Aturan Kompatibilitas ==&lt;br /&gt;
&lt;br /&gt;
* Namespace root: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;http://jasperreports.sourceforge.net/jasperreports&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; (jangan ganti ke namespace &amp;lt;code&amp;gt;jaspersoft.com&amp;lt;/code&amp;gt; — itu gaya file baru Studio, dan tidak konsisten dengan report existing).&lt;br /&gt;
* Ekspresi ditulis sebagai '''Java valid''', bukan gaya Groovy. Contoh: &amp;lt;code&amp;gt;new Integer($V{No_Urut}.intValue()+1)&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Deklarasikan '''semua''' field yang dipakai di &amp;lt;code&amp;gt;&amp;amp;lt;field&amp;amp;gt;&amp;lt;/code&amp;gt; dengan class Java yang benar:&lt;br /&gt;
** Uang/numerik: &amp;lt;code&amp;gt;java.math.BigDecimal&amp;lt;/code&amp;gt;&lt;br /&gt;
** Tanggal: &amp;lt;code&amp;gt;java.sql.Timestamp&amp;lt;/code&amp;gt;&lt;br /&gt;
** String: &amp;lt;code&amp;gt;java.lang.String&amp;lt;/code&amp;gt;&lt;br /&gt;
* Font: pakai logical font (&amp;lt;code&amp;gt;SansSerif&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Serif&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Monospaced&amp;lt;/code&amp;gt;) kecuali ada font extension jar di server.&lt;br /&gt;
&lt;br /&gt;
== Jebakan yang Sudah Ditemukan ==&lt;br /&gt;
&lt;br /&gt;
=== 1. Path absolut untuk gambar ===&lt;br /&gt;
&lt;br /&gt;
Report existing me-hardcode path seperti:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;amp;lt;imageExpression&amp;amp;gt;&amp;amp;lt;![CDATA[&amp;quot;/home/zaien_aji/appl/sahila/modules/.../ssd_logo.png&amp;quot;]]&amp;amp;gt;&amp;amp;lt;/imageExpression&amp;amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ini gagal render di mesin/user lain. '''Solusi''': parameter direktori gambar:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;amp;lt;parameter name=&amp;quot;IMAGE_DIR&amp;quot; class=&amp;quot;java.lang.String&amp;quot; isForPrompting=&amp;quot;false&amp;quot;&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;defaultValueExpression&amp;amp;gt;&amp;amp;lt;![CDATA[&amp;quot;.&amp;quot;]]&amp;amp;gt;&amp;amp;lt;/defaultValueExpression&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;/parameter&amp;amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;amp;lt;imageExpression&amp;amp;gt;&amp;amp;lt;![CDATA[$P{IMAGE_DIR} + &amp;quot;/ssd_logo.png&amp;quot;]]&amp;amp;gt;&amp;amp;lt;/imageExpression&amp;amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. Rectangle selalu ber-outline hitam ===&lt;br /&gt;
&lt;br /&gt;
Elemen &amp;lt;code&amp;gt;&amp;amp;lt;rectangle&amp;amp;gt;&amp;lt;/code&amp;gt; '''selalu digambar dengan garis tepi 1pt berwarna &amp;lt;code&amp;gt;forecolor&amp;lt;/code&amp;gt;''' (default hitam), di samping fill &amp;lt;code&amp;gt;backcolor&amp;lt;/code&amp;gt;. Untuk balok warna bersih (accent bar, latar blok total), samakan keduanya:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;amp;lt;reportElement mode=&amp;quot;Opaque&amp;quot; x=&amp;quot;0&amp;quot; y=&amp;quot;84&amp;quot; width=&amp;quot;565&amp;quot; height=&amp;quot;3&amp;quot;&lt;br /&gt;
    forecolor=&amp;quot;#224435&amp;quot; backcolor=&amp;quot;#224435&amp;quot; .../&amp;amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
Jika hanya &amp;lt;code&amp;gt;backcolor&amp;lt;/code&amp;gt; yang di-set, balok tipis (height 1–3) akan terlihat kehitaman karena tercampur border.&lt;br /&gt;
&lt;br /&gt;
=== 3. Variable mati sisa template ===&lt;br /&gt;
&lt;br /&gt;
Variable dengan &amp;lt;code&amp;gt;calculation=&amp;quot;Sum&amp;quot;&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;Average&amp;lt;/code&amp;gt; tetapi &amp;lt;code&amp;gt;&amp;amp;lt;variableExpression&amp;amp;gt;&amp;lt;/code&amp;gt; kosong adalah sisa template iReport — tidak dipakai dan aman dihapus.&lt;br /&gt;
&lt;br /&gt;
=== 4. Atribut versi baru di file lama ===&lt;br /&gt;
&lt;br /&gt;
Atribut seperti &amp;lt;code&amp;gt;splitType&amp;lt;/code&amp;gt; pada &amp;lt;code&amp;gt;&amp;amp;lt;band&amp;amp;gt;&amp;lt;/code&amp;gt; (milik JR 6.x) bisa muncul di file lama karena pernah dibuka di Jaspersoft Studio. Compile tetap OK (parser mengabaikannya), tetapi iReport 5.6 dapat mengacaukannya saat edit-save. Untuk file yang masih dirawat di iReport, hapus atribut tersebut.&lt;br /&gt;
&lt;br /&gt;
== Pola Kalkulasi ==&lt;br /&gt;
&lt;br /&gt;
Report existing melakukan kalkulasi di '''SQL (PostgreSQL)''', bukan di ekspresi report:&lt;br /&gt;
&lt;br /&gt;
* Pajak: &amp;lt;code&amp;gt;ci.grandtotal - ci.totallines as pajak&amp;lt;/code&amp;gt;&lt;br /&gt;
* Terbilang: fungsi custom database &amp;lt;code&amp;gt;terbilang(grandtotal)&amp;lt;/code&amp;gt;&lt;br /&gt;
* Format tanggal Indonesia: &amp;lt;code&amp;gt;CASE EXTRACT(MONTH FROM ...)&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;to_char&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ikuti pola yang sama kecuali ada alasan memindahkannya ke report — query mengambil langsung dari skema Openbravo/ADempiere (&amp;lt;code&amp;gt;c_invoice&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;c_invoiceline&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;c_bpartner&amp;lt;/code&amp;gt;, dst).&lt;br /&gt;
&lt;br /&gt;
== Trik Layout ==&lt;br /&gt;
&lt;br /&gt;
=== Satu sel, dua baris (nama produk + deskripsi) ===&lt;br /&gt;
&lt;br /&gt;
Buat dua text field bertumpuk di kolom yang sama; hilangkan border yang bertemu agar terlihat seperti satu sel:&lt;br /&gt;
&lt;br /&gt;
* Elemen atas: &amp;lt;code&amp;gt;&amp;amp;lt;bottomPen lineWidth=&amp;quot;0.0&amp;quot;/&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* Elemen bawah: &amp;lt;code&amp;gt;&amp;amp;lt;topPen lineWidth=&amp;quot;0.0&amp;quot;/&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Tabel tanpa border penuh (gaya modern) ===&lt;br /&gt;
&lt;br /&gt;
* Header kolom: hanya &amp;lt;code&amp;gt;&amp;amp;lt;bottomPen lineWidth=&amp;quot;1.0&amp;quot; lineColor=&amp;quot;#224435&amp;quot;/&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* Baris detail: hanya &amp;lt;code&amp;gt;&amp;amp;lt;bottomPen lineWidth=&amp;quot;0.5&amp;quot; lineColor=&amp;quot;#E0E0E0&amp;quot;/&amp;amp;gt;&amp;lt;/code&amp;gt; di setiap sel (menjadi separator tipis antar-baris)&lt;br /&gt;
* Penekanan total: balok &amp;lt;code&amp;gt;&amp;amp;lt;rectangle&amp;amp;gt;&amp;lt;/code&amp;gt; berlatar warna muda, bukan kotak border&lt;br /&gt;
&lt;br /&gt;
== Setelah Menulis: Verifikasi ==&lt;br /&gt;
&lt;br /&gt;
Jangan menganggap JRXML benar hanya dari membaca XML. Compile (dan bila perlu render) secara lokal — lihat [[JRXML Local Verification]].&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]]&lt;/div&gt;</summary>
		<author><name>Wikiadmin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.infinite-erp.co.id/index.php?title=JRXML_Local_Verification&amp;diff=4542</id>
		<title>JRXML Local Verification</title>
		<link rel="alternate" type="text/html" href="https://wiki.infinite-erp.co.id/index.php?title=JRXML_Local_Verification&amp;diff=4542"/>
		<updated>2026-09-16T10:15:26Z</updated>

		<summary type="html">&lt;p&gt;Wikiadmin: Dokumentasi&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Halaman ini menjelaskan cara menguji file JRXML '''di laptop''' — compile dan render PDF tanpa men-deploy ke server InfiniteERP. Wajib dilakukan sebelum JRXML baru/diubah dipasang di server.&lt;br /&gt;
&lt;br /&gt;
== Kenapa Verifikasi Lokal ==&lt;br /&gt;
&lt;br /&gt;
* Kesalahan JRXML (ekspresi tidak valid, field tidak dideklarasikan, class salah) baru ketahuan saat compile — bukan dari membaca XML.&lt;br /&gt;
* Menguji di server berarti menyentuh sistem produksi; di laptop cukup 1 perintah Java.&lt;br /&gt;
* Klaim &amp;quot;compatible&amp;quot; harus dibuktikan dengan hasil compile terhadap '''versi library yang sama dengan server''' (6.0.0), bukan versi lain.&lt;br /&gt;
&lt;br /&gt;
== Classpath (Terbukti Jalan) ==&lt;br /&gt;
&lt;br /&gt;
Unduh dari Maven Central, taruh dalam satu folder (misal &amp;lt;code&amp;gt;lib6/&amp;lt;/code&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Jar !! Fungsi&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;jasperreports-6.0.0.jar&amp;lt;/code&amp;gt; || Engine report — versi sama dengan server&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;jasperreports-fonts-6.0.0.jar&amp;lt;/code&amp;gt; || Font extension — sama dengan server&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;commons-digester-2.1.jar&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;commons-collections-3.2.2.jar&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;commons-beanutils-1.9.4.jar&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;commons-logging-1.2.jar&amp;lt;/code&amp;gt; || Dependensi parsing&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ecj-4.4.2.jar&amp;lt;/code&amp;gt; || Compiler ekspresi (JDT)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;itextpdf-5.5.13.3.jar&amp;lt;/code&amp;gt; || Export PDF (JR 6.x memakai package &amp;lt;code&amp;gt;com.itextpdf&amp;lt;/code&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;itext-pdfa-5.5.13.3.jar&amp;lt;/code&amp;gt; || '''Wajib''' — &amp;lt;code&amp;gt;PdfAWriter&amp;lt;/code&amp;gt; dipisah ke jar ini&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Jebakan versi yang sudah ditemukan:&lt;br /&gt;
&lt;br /&gt;
* JR 6.x '''tidak''' memakai iText lawas &amp;lt;code&amp;gt;com.lowagie&amp;lt;/code&amp;gt; (itu milik JR 5.x). Tanpa &amp;lt;code&amp;gt;itextpdf&amp;lt;/code&amp;gt;, export gagal: &amp;lt;code&amp;gt;NoClassDefFoundError: com/itextpdf/text/DocumentException&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Tanpa &amp;lt;code&amp;gt;itext-pdfa&amp;lt;/code&amp;gt;, export gagal: &amp;lt;code&amp;gt;NoClassDefFoundError: com/itextpdf/text/pdf/PdfAWriter&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Teruji jalan di '''Java 17'''.&lt;br /&gt;
&lt;br /&gt;
== Langkah ==&lt;br /&gt;
&lt;br /&gt;
=== 1. Compile ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
JasperReport rep = JasperCompileManager.compileReport(&amp;quot;report.jrxml&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Compile sukses = JRXML valid dan kompatibel dengan JR 6.0.0.&lt;br /&gt;
&lt;br /&gt;
=== 2. Fill dengan data dummy ===&lt;br /&gt;
&lt;br /&gt;
Report ber-query SQL tidak butuh database untuk diuji — lewatkan datasource map:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
Map&amp;lt;String,Object&amp;gt; row = new HashMap&amp;lt;&amp;gt;();&lt;br /&gt;
row.put(&amp;quot;bpnmae&amp;quot;, &amp;quot;PT CONTOH PELANGGAN&amp;quot;);&lt;br /&gt;
row.put(&amp;quot;pricestd&amp;quot;, new BigDecimal(&amp;quot;5000000&amp;quot;));&lt;br /&gt;
// ... isi semua field sesuai deklarasi &amp;lt;field&amp;gt; di JRXML&lt;br /&gt;
&lt;br /&gt;
Map&amp;lt;String,Object&amp;gt; params = new HashMap&amp;lt;&amp;gt;();&lt;br /&gt;
params.put(&amp;quot;IMAGE_DIR&amp;quot;, &amp;quot;/path/ke/folder/gambar&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
JasperPrint print = JasperFillManager.fillReport(rep, params,&lt;br /&gt;
    new JRMapCollectionDataSource(java.util.Collections.singletonList(row)));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Catatan: ImageIO membaca gambar '''berdasarkan konten''', bukan ekstensi — file PNG bernama &amp;lt;code&amp;gt;.jpg&amp;lt;/code&amp;gt; tetap ter-render (berguna untuk placeholder).&lt;br /&gt;
&lt;br /&gt;
=== 3. Export PDF ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
JRPdfExporter exporter = new JRPdfExporter();&lt;br /&gt;
exporter.setParameter(JRExporterParameter.JASPER_PRINT, print);&lt;br /&gt;
exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, &amp;quot;sample.pdf&amp;quot;);&lt;br /&gt;
exporter.exportReport();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jalankan: &amp;lt;code&amp;gt;java -cp &amp;quot;.:lib6/*&amp;quot; NamaVerifier&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. Cek hasil ===&lt;br /&gt;
&lt;br /&gt;
* Buka PDF dan periksa visual: overlap, teks terpotong, alignment angka.&lt;br /&gt;
* Untuk elemen grafis kritis (accent bar, latar blok), bisa dicek deterministik: konversi PDF ke PNG lalu baca warna piksel pada koordinat yang diharapkan. Cara ini terbukti menangkap bug outline hitam pada &amp;lt;code&amp;gt;&amp;amp;lt;rectangle&amp;amp;gt;&amp;lt;/code&amp;gt; (lihat [[JRXML Best Practices]]).&lt;br /&gt;
&lt;br /&gt;
== Hasil yang Pernah Diverifikasi ==&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;sales_invoice_SSD.jrxml&amp;lt;/code&amp;gt; (asli, iReport 5.6): compile OK di JR 5.6.0 dan 6.0.0&lt;br /&gt;
* Versi perbaikan (parameter &amp;lt;code&amp;gt;IMAGE_DIR&amp;lt;/code&amp;gt;, variable mati dihapus): compile + render OK&lt;br /&gt;
* Layout modern tanpa border penuh: compile + render OK, cek piksel lolos&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]]&lt;/div&gt;</summary>
		<author><name>Wikiadmin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.infinite-erp.co.id/index.php?title=JasperReports&amp;diff=4540</id>
		<title>JasperReports</title>
		<link rel="alternate" type="text/html" href="https://wiki.infinite-erp.co.id/index.php?title=JasperReports&amp;diff=4540"/>
		<updated>2026-09-16T10:15:24Z</updated>

		<summary type="html">&lt;p&gt;Wikiadmin: Dokumentasi&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''JasperReports''' adalah library reporting Java yang dipakai InfiniteERP (Openbravo) untuk mencetak dokumen (invoice, kuitansi, dan report lain) dari file template '''JRXML'''.&lt;br /&gt;
&lt;br /&gt;
== Versi Library di Server ==&lt;br /&gt;
&lt;br /&gt;
Berdasarkan pemeriksaan source code Openbravo, runtime report memakai:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;jasperreports-6.0.0.jar&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;jasperreports-fonts-6.0.0.jar&amp;lt;/code&amp;gt;&lt;br /&gt;
* iText 5.5.x (package &amp;lt;code&amp;gt;com.itextpdf&amp;lt;/code&amp;gt;) untuk export PDF — bukan iText lawas &amp;lt;code&amp;gt;com.lowagie&amp;lt;/code&amp;gt; yang dipakai JasperReports 5.x&lt;br /&gt;
&lt;br /&gt;
== Tool Desain ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Tool !! Library JasperReports bawaan !! Keterangan&lt;br /&gt;
|-&lt;br /&gt;
| iReport 5.6.0 || 5.6.0 || Legacy, sudah tidak dikembangkan&lt;br /&gt;
|-&lt;br /&gt;
| Jaspersoft Studio CE 6.21.x || 6.21.x || Tool desain aktif berbasis Eclipse&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
File JRXML existing (contoh: &amp;lt;code&amp;gt;sales_invoice_SSD.jrxml&amp;lt;/code&amp;gt;) dibuat dengan iReport 5.6, lalu sempat disentuh Jaspersoft Studio (terlihat dari property &amp;lt;code&amp;gt;com.jaspersoft.studio.*&amp;lt;/code&amp;gt; dan atribut &amp;lt;code&amp;gt;splitType&amp;lt;/code&amp;gt; di dalamnya).&lt;br /&gt;
&lt;br /&gt;
== Kompatibilitas JRXML (Sudah Diuji) ==&lt;br /&gt;
&lt;br /&gt;
Pengujian dilakukan dengan meng-compile JRXML memakai &amp;lt;code&amp;gt;jasperreports-6.0.0.jar&amp;lt;/code&amp;gt; persis seperti di server:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! File JRXML !! Compile di JR 6.0.0 !! Export PDF&lt;br /&gt;
|-&lt;br /&gt;
| Asli (output iReport 5.6, ada &amp;lt;code&amp;gt;splitType&amp;lt;/code&amp;gt;) || OK || —&lt;br /&gt;
|-&lt;br /&gt;
| Versi perbaikan (clean-up) || OK || OK&lt;br /&gt;
|-&lt;br /&gt;
| Layout baru (modern) || OK || OK&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kesimpulan:&lt;br /&gt;
&lt;br /&gt;
* Namespace lawas &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;http://jasperreports.sourceforge.net/jasperreports&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; '''sepenuhnya kompatibel''' dengan JR 6.0.0 — tidak perlu diubah.&lt;br /&gt;
* Parser JR 6.0.0 (bahkan 5.6.0) '''toleran''' terhadap atribut yang tidak dikenal; atribut asing diabaikan saat compile.&lt;br /&gt;
* Risiko sesungguhnya bukan di runtime, melainkan di '''editor''': iReport 5.6 dapat menghapus/mengacaukan atribut versi baru saat file di-edit lalu di-save.&lt;br /&gt;
&lt;br /&gt;
== Mengedit dengan Jaspersoft Studio CE ==&lt;br /&gt;
&lt;br /&gt;
Jaspersoft Studio Community Edition dapat diunduh di: [https://community.jaspersoft.com/download-jaspersoft/community-edition/jaspersoft-studio_6.21.2 Download Jaspersoft Studio CE 6.21.x]&lt;br /&gt;
&lt;br /&gt;
Karena Studio 6.21.x membawa library JasperReports 6.21.x (lebih baru dari runtime server 6.0.0), perhatikan:&lt;br /&gt;
&lt;br /&gt;
# Setelah mengedit, '''selalu compile ulang JRXML terhadap JR 6.0.0''' (lihat [[JRXML Local Verification]]) sebelum deploy — jangan mengandalkan preview Studio.&lt;br /&gt;
# Hindari memakai komponen/fitur yang hanya ada di versi baru (misal elemen &amp;lt;code&amp;gt;&amp;amp;lt;part&amp;amp;gt;&amp;lt;/code&amp;gt;) kecuali runtime server memang di-upgrade.&lt;br /&gt;
# Property &amp;lt;code&amp;gt;com.jaspersoft.studio.*&amp;lt;/code&amp;gt; yang ditulis Studio aman — diabaikan oleh runtime.&lt;br /&gt;
# Simpan file dengan encoding UTF-8 dan pertahankan namespace lawas agar tetap konsisten dengan report existing.&lt;br /&gt;
&lt;br /&gt;
== Praktik dan Verifikasi ==&lt;br /&gt;
&lt;br /&gt;
* [[JRXML Best Practices]] — aturan penulisan JRXML, jebakan umum, dan polanya&lt;br /&gt;
* [[JRXML Local Verification]] — cara compile + render JRXML di laptop tanpa server&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]]&lt;/div&gt;</summary>
		<author><name>Wikiadmin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.infinite-erp.co.id/index.php?title=Getting_started_with_Openbravo/id&amp;diff=4539</id>
		<title>Getting started with Openbravo/id</title>
		<link rel="alternate" type="text/html" href="https://wiki.infinite-erp.co.id/index.php?title=Getting_started_with_Openbravo/id&amp;diff=4539"/>
		<updated>2026-08-29T02:34:37Z</updated>

		<summary type="html">&lt;p&gt;Wikiadmin: test&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Languages}}&lt;br /&gt;
&lt;br /&gt;
== Getting started with Openbravo (Bahasa Indonesia) ==&lt;br /&gt;
&lt;br /&gt;
Stub.&lt;/div&gt;</summary>
		<author><name>Wikiadmin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.infinite-erp.co.id/index.php?title=Release_Notes&amp;diff=4538</id>
		<title>Release Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.infinite-erp.co.id/index.php?title=Release_Notes&amp;diff=4538"/>
		<updated>2026-08-28T12:20:14Z</updated>

		<summary type="html">&lt;p&gt;Wikiadmin: Add {{Languages}} switcher (EN) for ID subpage&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Languages}}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
This page documents the official Openbravo quarterly Platform Releases, including the release notes and maturity status.&lt;br /&gt;
&lt;br /&gt;
Additional Release status and schedules information are available following [[ERP/Release_Life_Cycle | this link]].&lt;br /&gt;
&lt;br /&gt;
== Openbravo Business Suite releases ==&lt;br /&gt;
&lt;br /&gt;
{| align=&amp;quot;center&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!Release Notes&lt;br /&gt;
!Date&lt;br /&gt;
!Version&lt;br /&gt;
![http://wiki.openbravo.com/wiki/Modules_Management#Maturity_Status Maturity Status] (*)&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR21Q4.1| 3.0PR21Q4.1]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |16/11/2021&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.214101&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |QAA&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR21Q4| 3.0PR21Q4]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |28/10/2021&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.214003&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR21Q3.5| 3.0PR21Q3.5]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |16/11/2021&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.213501&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |CS&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR21Q3.4| 3.0PR21Q3.4]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |27/10/2021&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.213401&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR21Q3.3| 3.0PR21Q3.3]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |20/10/2021&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.213301&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR21Q3.2| 3.0PR21Q3.2]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |15/09/2021&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.213201&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR21Q3.1| 3.0PR21Q3.1]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |31/08/2021&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.213101&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR21Q3| 3.0PR21Q3]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |03/08/2021&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.213003&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR21Q2.4| 3.0PR21Q2.4]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |20/10/2021&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.212401&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |CS&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR21Q2.3| 3.0PR21Q2.3]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |15/09/2021&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.212301&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR21Q2.2| 3.0PR21Q2.2]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |31/08/2021&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.212201&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR21Q2.1| 3.0PR21Q2.1]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |29/07/2021&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.212101&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR21Q2| 3.0PR21Q2]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |11/06/2021&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.212003&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR21Q1.3| 3.0PR21Q1.3]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |09/06/2021&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.211301&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |CS&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR21Q1.2| 3.0PR21Q1.2]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |31/05/2021&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.211202&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR21Q1.1| 3.0PR21Q1.1]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |08/04/2021&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.211101&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR21Q1| 3.0PR21Q1]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |04/03/2021&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.211004 &lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR20Q4.4| 3.0PR20Q4.4]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |31/05/2021&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.204402&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |CS&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR20Q4.3| 3.0PR20Q4.3]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |06/04/2021&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.204301&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR20Q4.2| 3.0PR20Q4.2]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |02/03/2021&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.204201&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR20Q4.1| 3.0PR20Q4.1]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |21/01/2021&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.204101&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR20Q4| 3.0PR20Q4]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |03/12/2020&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.204003&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR20Q3.4| 3.0PR20Q3.4]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |26/02/2021&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.203401&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |CS&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR20Q3.3| 3.0PR20Q3.3]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |21/01/2021&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.203301&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR20Q3.2| 3.0PR20Q3.2]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |02/12/2020&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.203201&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR20Q3.1| 3.0PR20Q3.1]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |22/09/2020&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.203101&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR20Q3| 3.0PR20Q3]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |10/08/2020&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.203002&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR20Q2.2| 3.0PR20Q2.2]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |23/09/2020&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.202201&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |CS&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR20Q2.1| 3.0PR20Q2.1]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |03/08/2020&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.202101&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR20Q2| 3.0PR20Q2]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |04/06/2020&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.37242&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR20Q1.3| 3.0PR20Q1.3]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |04/08/2020&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.201301&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |CS&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR20Q1.2| 3.0PR20Q1.2]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |04/06/2020&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.36908&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR20Q1.1| 3.0PR20Q1.1]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |30/04/2020&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.36902&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR20Q1 | 3.0PR20Q1]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |18/03/2020&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.36897&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR19Q4.4 | 3.0PR19Q4.4]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |28/04/2020&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.36580&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |CS&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR19Q4.3 | 3.0PR19Q4.3]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |12/03/2020&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.36577&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR19Q4.2 | 3.0PR19Q4.2]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |25/02/2020&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.36576&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR19Q4.1 | 3.0PR19Q4.1]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |06/01/2020&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.36568&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR19Q4 | 3.0PR19Q4]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |12/12/2019&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.36563&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR19Q3.4 | 3.0PR19Q3.4]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |20/02/2020&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.36257&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |CS&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR19Q3.3 | 3.0PR19Q3.3]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |02/01/2020&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.36249&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR19Q3.2 | 3.0PR19Q3.2]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |08/11/2019&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.36241&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR19Q3.1 | 3.0PR19Q3.1]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |30/09/2019&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.36238&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR19Q3 | 3.0PR19Q3]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |22/08/2019&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.36231&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR19Q2.3 | 3.0PR19Q2.3]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |30/09/2019&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.35659&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |CS&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR19Q2.2 | 3.0PR19Q2.2]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |08/08/2019&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.35653&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR19Q2.1 | 3.0PR19Q2.1]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |22/07/2019&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.35650&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR19Q2 | 3.0PR19Q2]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |21/05/2019&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.35625&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR19Q1.2 | 3.0PR19Q1.2]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |15/07/2019&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.35359&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |CS&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR19Q1.1 | 3.0PR19Q1.1]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |08/05/2019&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.35341&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR19Q1 | 3.0PR19Q1]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |27/03/2019&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.35325&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR18Q4.3 | 3.0PR18Q4.3]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |17/04/2019&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.34866&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |CS&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR18Q4.2 | 3.0PR18Q4.2]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |01/03/2019&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.34861&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR18Q4.1 | 3.0PR18Q4.1]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |27/12/2018&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.34849&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR18Q4 | 3.0PR18Q4]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |12/12/2018&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.34846&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR18Q3.5 | 3.0PR18Q3.5]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |26/02/2019&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.3432&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |CS&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR18Q3.4 | 3.0PR18Q3.4]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |27/12/2018&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.34302&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR18Q3.3 | 3.0PR18Q3.3]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |28/11/2018&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.34292&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR18Q3.2 | 3.0PR18Q3.2]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |31/10/2018&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.34284 &lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR18Q3.1 | 3.0PR18Q3.1]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |27/09/2018&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.34272 &lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR18Q3 | 3.0PR18Q3]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |08/08/2018&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.34267&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR18Q2.3 | 3.0PR18Q2.3]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |30/10/2018&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.33814&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |CS&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR18Q2.2 | 3.0PR18Q2.2]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |22/08/2018&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.33803&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR18Q2.1 | 3.0PR18Q2.1]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |12/07/2018&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.33797&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR18Q2 | 3.0PR18Q2]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |09/05/2018&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.33777&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR18Q1.3 | 3.0PR18Q1.3]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |17/05/2018&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.33196&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |CS&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR18Q1.2 | 3.0PR18Q1.2]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |24/04/2018&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.33194&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR18Q1.1 | 3.0PR18Q1.1]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |26/03/2018&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.33192&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR18Q1 | 3.0PR18Q1]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |21/02/2018&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.33184&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR17Q4.2 | 3.0PR17Q4.2]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |23/03/2018&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.32891&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |CS&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR17Q4.1 | 3.0PR17Q4.1]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |20/02/2018&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.32880&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR17Q4 | 3.0PR17Q4]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |29/12/2017&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.32857&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR17Q3.3 | 3.0PR17Q3.3]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |01/02/2018&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.32432&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |CS&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR17Q3.2 | 3.0PR17Q3.2]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |28/12/2017&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.32425&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR17Q3.1 | 3.0PR17Q3.1]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |07/11/2017&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.32416&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR17Q3 | 3.0PR17Q3]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |21/09/2017&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.32403&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR17Q2.4 | 3.0PR17Q2.4]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |06/11/2017&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.31816&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |CS&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR17Q2.3 | 3.0PR17Q2.3]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |14/09/2017&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.31811&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR17Q2.2 | 3.0PR17Q2.2]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |10/08/2017&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.31802&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR17Q2.1 | 3.0PR17Q2.1]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |28/06/2017&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.31796&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR17Q2 | 3.0PR17Q2]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |18/04/2017&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.31787&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR17Q1.3 | 3.0PR17Q1.3]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |23/06/2017&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.31116&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |CS&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR17Q1.2 | 3.0PR17Q1.2]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |23/06/2017&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.31111&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR17Q1.1 | 3.0PR17Q1.1]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |05/05/2017&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.31101&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR17Q1 | 3.0PR17Q1]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |15/03/2017&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.31087&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR16Q4.4 | 3.0PR16Q4.4]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |09/03/2017&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.30460&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |CS&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR16Q4.3 | 3.0PR16Q4.3]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |09/03/2017&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.30460&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR16Q4.2 | 3.0PR16Q4.2]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |24/01/2017&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.30447&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR16Q4.1 | 3.0PR16Q4.1]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |23/01/2017&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.30445&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR16Q4 | 3.0PR16Q4]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |16/12/2016&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.30440&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR16Q3.5 | 3.0PR16Q3.5]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |27/01/2017&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.29799&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |CS&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR16Q3.4 | 3.0PR16Q3.4]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |18/01/2017&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.29789&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR16Q3.3 | 3.0PR16Q3.3]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |23/11/2016&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.29786&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR16Q3.2 | 3.0PR16Q3.2]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |13/10/2016&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.29751&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR16Q3.1 | 3.0PR16Q3.1]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |01/09/2016&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.29734&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR16Q3 | 3.0PR16Q3]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |11/08/2016&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.29727&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR16Q2.4 | 3.0PR16Q2.4]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |18/11/2016&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.28902&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |CS&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR16Q2.3 | 3.0PR16Q2.3]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |04/10/2016&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.28899&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR16Q2.2 | 3.0PR16Q2.2]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |26/08/2016&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.28883&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR16Q2.1 | 3.0PR16Q2.1]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |11/07/2016&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.28873&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR16Q2 | 3.0PR16Q2]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |16/06/2016&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.28860&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR16Q1.3 | 3.0PR16Q1.3]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |07/06/2016&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.28231&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |CS&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR16Q1.2 | 3.0PR16Q1.2]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |26/05/2016&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.28226&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR16Q1.1 | 3.0PR16Q1.1]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |29/04/2016&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.28220&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR16Q1 | 3.0PR16Q1]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |15/03/2016&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.28207&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR15Q4.6 | 3.0PR15Q4.6]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |27/04/2016&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.27708&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |CS&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR15Q4.5 | 3.0PR15Q4.5]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |18/03/2016&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.27703&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR15Q4.4 | 3.0PR15Q4.4]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |01/03/2016&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.27695&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR15Q4.3 | 3.0PR15Q4.3]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |15/02/2016&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.27688&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR15Q4.2 | 3.0PR15Q4.2]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |25/01/2016&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.27681&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR15Q4.1 | 3.0PR15Q4.1]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |16/12/2015&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.27665&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR15Q4 | 3.0PR15Q4]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |23/11/2015&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.27657&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR15Q3.5 | 3.0PR15Q3.5]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |22/01/2016&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.27124&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |CS&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR15Q3.4 | 3.0PR15Q3.4]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |10/12/2015&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.27112&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR15Q3.3 | 3.0PR15Q3.3]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |03/11/2015&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.27099&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR15Q3.2 | 3.0PR15Q3.2]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |27/10/2015&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.27096&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR15Q3.1 | 3.0PR15Q3.1]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |8/9/2015&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.27080&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR15Q3 | 3.0PR15Q3]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |18/08/2015&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.27073&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR15Q2.6 | 3.0PR15Q2.6]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |26/10/2015&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.26471&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |CS&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR15Q2.5 | 3.0PR15Q2.5]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |18/09/2015&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.26460&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR15Q2.4 | 3.0PR15Q2.4]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |26/08/2015&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.26456 &lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR15Q2.3 | 3.0PR15Q2.3]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |29/07/2015&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.26448&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR15Q2.2 | 3.0PR15Q2.2]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |22/06/2015&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.26430&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR15Q2.1 | 3.0PR15Q2.1]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |21/05/2015&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.26407&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR15Q2 | 3.0PR15Q2]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |06/05/2015&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.26393&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR15Q1.5 | 3.0PR15Q1.5]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |19/06/2015&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.25877&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |CS&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR15Q1.4 | 3.0PR15Q1.4]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |21/05/2015&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.25852&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR15Q1.3 | 3.0PR15Q1.3]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |17/04/2015&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.25819&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR15Q1.2 | 3.0PR15Q1.2]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |01/04/2015&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.25793&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR15Q1.1 | 3.0PR15Q1.1]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |20/02/2015&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.25735&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR15Q1 | 3.0PR15Q1]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |2/02/2015&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.25704&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR14Q4 | 3.0PR14Q4]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |30/12/2014&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.25161 &lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |QAA&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR14Q3.8 | 3.0PR14Q3.8]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |24/03/2015&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.24112&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |CS&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR14Q3.7 | 3.0PR14Q3.7]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |24/02/2015&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.24089&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR14Q3.6 | 3.0PR14Q3.6]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |05/02/2015&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.24075&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR14Q3.5 | 3.0PR14Q3.5]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |15/01/2015&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.24063&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR14Q3.4 | 3.0PR14Q3.4]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |05/12/2014&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.24052&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR14Q3.3 | 3.0PR14Q3.3]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |14/11/2014&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.24041&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR14Q3.2 | 3.0PR14Q3.2]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |24/10/2014&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.24034&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR14Q3.1 | 3.0PR14Q3.1]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |05/09/2014&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.24019&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR14Q3 | 3.0PR14Q3]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |06/08/2014&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.24005&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR14Q2.6 | 3.0PR14Q2.6]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |01/10/2014&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.22943&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |CS&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR14Q2.5 | 3.0PR14Q2.5]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |04/08/2014&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.22936&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR14Q2.4 | 3.0PR14Q2.4]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |18/07/2014&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.22925&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR14Q2.3 | 3.0PR14Q2.3]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |27/06/2014&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.22913&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR14Q2.2 | 3.0PR14Q2.2]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |19/06/2014&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.22896 &lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR14Q2.1 | 3.0PR14Q2.1]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |22/05/2014&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.22859&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0PR14Q2 | 3.0PR14Q2]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |07/05/2014&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.22845&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''(*)''': Maturity Levels Legend:&lt;br /&gt;
* CS : Confirmed Stable&lt;br /&gt;
* QAA : QA Approved&lt;br /&gt;
* C  : Cancelled&lt;br /&gt;
&lt;br /&gt;
== Maintenance packs ==&lt;br /&gt;
&lt;br /&gt;
Before changing the release cycle to be quarterly we released monthly ''Maintenance Packs''.&lt;br /&gt;
&lt;br /&gt;
{| align=&amp;quot;center&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!Release Notes&lt;br /&gt;
!Date&lt;br /&gt;
!Version&lt;br /&gt;
![http://wiki.openbravo.com/wiki/Modules_Management#Maturity_Status Maturity Status] (*)&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP31.4 | 3.0MP31.4]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |11/06/2014&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.21811&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |CS&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP31.3 | 3.0MP31.3]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |14/05/2014&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.21803&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP31.2 | 3.0MP31.2]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |28/02/2014&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.21792&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP31.1 | 3.0MP31.1]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |15/02/2014&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.21782&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP31 | 3.0MP31]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |18/01/2014&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.21766&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP30.3 | 3.0MP30.3]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |13/02/2014&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.21573&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |CS&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP30.2 | 3.0MP30.2]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |28/01/2014&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.21560&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP30.1 | 3.0MP30.1]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |09/01/2014&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.21549&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP30 | 3.0MP30]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |18/12/2013&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.21543&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP29.4 | 3.0MP29.4]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |20/01/2014&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.21451&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |CS&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP29.3 | 3.0MP29.3]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |10/01/2014&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.21444&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP29.2 | 3.0MP29.2]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |30/12/2013&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.21440&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP29.1 | 3.0MP29.1]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |21/11/2013&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.21423&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP29 | 3.0MP29]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |19/11/2013&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.21419&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP28.5 | 3.0MP28.5]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |24/12/2013&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.21285&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |CS&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP28.4 | 3.0MP28.4]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |19/12/2013&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.21283&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP28.3 | 3.0MP28.3]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |04/12/2013&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.21275&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP28.2 | 3.0MP28.2]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |22/10/2013&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.21255&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP28.1 | 3.0MP28.1]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |18/10/2013&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.21253&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP28 | 3.0MP28]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |15/10/2013&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.21251&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP27.1 | 3.0MP27.1]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |25/10/2013&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.21096&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |CS&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP27 | 3.0MP27]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |18/09/2013&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.21083&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP26.4 | 3.0MP26.4]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |21/10/2013&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.20857&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |CS&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP26.3 | 3.0MP26.3]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |10/10/2013&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.20852&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP26.2 | 3.0MP26.2]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |06/09/2013&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.20842&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP26.1 | 3.0MP26.1]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |27/08/2013&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.20838&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP26 | 3.0MP26]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |27/08/2013&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.20833&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP25.2 | 3.0MP25.2]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |05/09/2013&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.20698&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |CS&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP25.1 | 3.0MP25.1]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |16/07/2013&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.20695&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP25 | 3.0MP25]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |16/07/2013&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.20689&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP24.2 | 3.0MP24.2]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |17/07/2013&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.20531&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |CS&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP24.1 | 3.0MP24.1]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |28/06/2013&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.20527&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP24 | 3.0MP24]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |20/06/2013&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.20523&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP23.2 | 3.0MP23.2]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |10/07/2013&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.20281&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |CS&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP23.1 | 3.0MP23.1]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |26/06/2013&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.20278&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP23 | 3.0MP23]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |21/05/2013&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.20267&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP22.3 | 3.0MP22.3]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |22/05/2013&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.20088&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |CS&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP22.2 | 3.0MP22.2]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |02/05/2013&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.20079&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP22.1 | 3.0MP22.1]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |17/04/2013&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.20067&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP22 | 3.0MP22]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |15/04/2013&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.20065&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP21.1 | 3.0MP21.1]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |17/05/2013&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.19883&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |CS&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP21 | 3.0MP21]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |22/03/2013&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.19865&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP20 | 3.0MP20]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |19/02/2013&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.19641&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |CS&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP19.4 | 3.0MP19.4]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |20/02/2013&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.19251&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |CS&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP19.3 | 3.0 MP19.3]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |31/01/2013&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.19241&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP19.2 | 3.0 MP19.2]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |24/01/2013&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.19233&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP19.1 | 3.0 MP19.1]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |21/01/2013&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.19229&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP19 | 3.0 MP19]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |21/01/2013&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.19226&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP18.5 | 3.0MP18.5]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |15/02/2013&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.19042&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |CS&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP18.4 | 3.0MP18.4]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |28/01/2013&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.19037&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP18.3 | 3.0MP18.3]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |22/01/2013&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.19035&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP18.2 | 3.0 MP18.2]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |12/01/2013&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.19028&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP18.1 | 3.0 MP18.1]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |27/12/2012&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.19016&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP18 | 3.0 MP18]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |17/12/2012&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.19013&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP17.3 | 3.0 MP17.3]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |15/01/2012&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.18540&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |CS&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP17.2 | 3.0 MP17.2]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |24/12/2012&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.18537&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP17.1 | 3.0 MP17.1]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |09/12/2012&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.18529&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP17 | 3.0 MP17]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |15/11/2012&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.18521&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP16.3 | 3.0 MP16.3]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |29/11/2012&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.18151&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |CS&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP16.2 | 3.0 MP16.2]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |22/11/2012&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.18145&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP16.1 | 3.0 MP16.1]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |02/11/2012&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.18142&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP16 | 3.0 MP16]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |10/10/2012&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.18129&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP15.2 | 3.0 MP15.2]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |01/11/2012&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.17898&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |CS&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP15.1 | 3.0 MP15.1]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |05/10/2012&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.17889&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP15 | 3.0 MP15]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |25/09/2012&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.17885&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP14.2 | 3.0 MP14.2]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |26/10/2012&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.17646&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |CS&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP14.1 | 3.0 MP14.1]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |03/10/2012&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.17641&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP14 | 3.0 MP14]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |06/09/2012&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.17628&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP13.2 | 3.0 MP13.2]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |01/10/2012&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.17529&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |CS&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP13.1 | 3.0 MP13.1]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |12/09/2012&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.17522&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP13 | 3.0 MP13]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |20/07/2012&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.17503&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP12.2 | 3.0 MP12.2]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |16/08/2012&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.16768&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |QA&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP12.1 | 3.0 MP12.1]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |09/07/2012&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.16758&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP12 | 3.0 MP12]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |26/06/2012&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.16746&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP11.1 | 3.0 MP11.1]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |28/06/2012&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.16288&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |CS&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP11 | 3.0 MP11]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |22/05/2012&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.16285&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP10.3 | 3.0 MP10.3]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |28/05/2012&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.16029&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |CS&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP10.2 | 3.0 MP10.2]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |14/05/2012&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.16027&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP10.1 | 3.0 MP10.1]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |16/04/2012&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.16017&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP10 | 3.0 MP10]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |N/A&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.16012&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP9.3 | 3.0 MP9.3]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |24/05/2012&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.15736&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |CS&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP9.2 | 3.0 MP9.2]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |09/05/2012&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.15734&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP9.1 | 3.0 MP9.1]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |24/04/2012&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.15727&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP9 | 3.0 MP9]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |02/04/2012&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.15716&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP8.4 | 3.0 MP8.4]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |02/05/2012&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.15320&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |CS&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP8.3 | 3.0 MP8.3]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |20/04/2012&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.15318&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP8.2 | 3.0 MP8.2]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |05/04/2012&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.15313&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP8.1 | 3.0 MP8.1]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |06/03/2012&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.15303&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP8 | 3.0 MP8]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |22/02/2012&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.15300&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP7.3 | 3.0 MP7.3]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |16/02/2012&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.15075&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |CS&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP7.2 | 3.0 MP7.2]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |08/02/2012&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.15073&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP7.1 | 3.0 MP7.1]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |13/01/2012&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.15070&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP7 | 3.0 MP7]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |13/01/2012&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.15068&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP6.2 | 3.0 MP6.2]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |08/02/2012&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.14833&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |CS&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP6.1 | 3.0 MP6.1]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |04/01/2012&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.14830&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP6 | 3.0 MP6]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |12/12/2011&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.14822&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP5.3 | 3.0 MP5.3]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |14/12/2011&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.14221&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |CS&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP5.2 | 3.0 MP5.2]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |07/12/2011&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.14219&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP5.1 | 3.0 MP5.1]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |21/11/2011&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.14203&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP5 | 3.0 MP5]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |12/11/2011&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.14195&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP4.2 | 3.0 MP4.2]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |16/11/2011&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.13970&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |CS&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP4.1 | 3.0 MP4.1]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |22/10/2011&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.13968&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP4 | 3.0 MP4]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |15/10/2011&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.13966&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP3.2 | 3.0 MP3.2]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |15/11/2011&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.13703&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |CS&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP3.1 | 3.0 MP3.1]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |19/10/2011&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.13701&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP3 | 3.0 MP3]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |29/09/2011&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.13698&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP2.4 | 3.0 MP2.4]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |16/10/2011&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.13468&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |CS&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP2.3 | 3.0 MP2.3]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |29/09/2011&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.13465&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP2.2 | 3.0 MP2.2]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |14/09/2011&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.13459&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP2.1 | 3.0 MP2.1]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |06/09/2011&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.13453&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP2 | 3.0 MP2]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |16/08/2011&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.13451&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP1 | 3.0 MP1]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |15/07/2011&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.13118&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |CS&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP0.1 | 3.0 MP0.1]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |29/06/2011&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.12782&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |CS&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[Release_Notes/3.0MP0 | 3.0 MP0]]&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |15/06/2011&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0.12774&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |C&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''(*)''': Maturity Levels Legend:&lt;br /&gt;
* CS : Confirmed Stable&lt;br /&gt;
* QA : QA Approved&lt;br /&gt;
* C  : Cancelled&lt;br /&gt;
&lt;br /&gt;
== Early Adopter Releases ==&lt;br /&gt;
{| align=&amp;quot;center&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!Release&lt;br /&gt;
!Date&lt;br /&gt;
!Release Notes&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0 RC7&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |20/05/2011&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[ERP/3.0/Release_Notes/3.0RC7 | 3.0 RC7]]&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0 RC6.1&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |24/04/2011&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[ERP/3.0/Release_Notes/3.0RC6.1 | 3.0 RC6.1]]&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0 RC6&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |21/04/2011&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[ERP/3.0/Release_Notes/3.0RC6 | 3.0 RC6]]&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0 RC5.1&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |01/04/2011&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[ERP/3.0/Release_Notes/3.0RC5.1 | 3.0 RC5.1]]&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0 RC5&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |22/03/2011&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[ERP/3.0/Release_Notes/3.0RC5 | 3.0 RC5]]&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0 RC4&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |23/02/2011&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[ERP/3.0/Release_Notes/3.0RC4 | 3.0 RC4]]&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0 RC3&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |30/11/2010&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[ERP/3.0/Release_Notes/3.0RC3 | 3.0 RC3]]&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0 RC2&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |17/09/2010&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[ERP/3.0/Release_Notes/3.0RC2 | 3.0 RC2]]&lt;br /&gt;
&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |3.0 RC1&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |16/07/2010&lt;br /&gt;
|width=&amp;quot;10%&amp;quot; |[[ERP/3.0/Release_Notes/3.0RC1| 3.0 RC1]]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Older release notes ==&lt;br /&gt;
&lt;br /&gt;
* [[ERP/2.50/ReleaseNotes | Openbravo 2.50]]&lt;br /&gt;
* [http://archive.wiki.openbravo.com/wiki/ERP/2.40/Release_History Openbravo 2.40]&lt;br /&gt;
&lt;br /&gt;
== Feedback ==&lt;br /&gt;
&lt;br /&gt;
Do you want to contribute? To get involved with Openbravo see our [[Contributor's_Guide | Contributor's guide]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Release Notes ERP]]&lt;br /&gt;
[[Category:General Information]]&lt;/div&gt;</summary>
		<author><name>Wikiadmin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.infinite-erp.co.id/index.php?title=Release_Notes/id&amp;diff=4537</id>
		<title>Release Notes/id</title>
		<link rel="alternate" type="text/html" href="https://wiki.infinite-erp.co.id/index.php?title=Release_Notes/id&amp;diff=4537"/>
		<updated>2026-08-28T12:20:13Z</updated>

		<summary type="html">&lt;p&gt;Wikiadmin: Create ID subpage stub (scaffold) for Release Notes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Languages}}&lt;br /&gt;
&lt;br /&gt;
== Release Notes (Bahasa Indonesia) ==&lt;br /&gt;
&lt;br /&gt;
Halaman ini adalah terjemahan Bahasa Indonesia dari [[Release Notes|Release Notes]]. Isinya masih dalam pengerjaan (work in progress).&lt;br /&gt;
&lt;br /&gt;
Silakan bantu melengkapi terjemahan mengikuti panduan di [[Starting_Guide_for_Wiki_translators|Starting Guide for Wiki Translators]].&lt;br /&gt;
&lt;br /&gt;
[[Category:WorkInProgress]]&lt;/div&gt;</summary>
		<author><name>Wikiadmin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.infinite-erp.co.id/index.php?title=How_To/id&amp;diff=4535</id>
		<title>How To/id</title>
		<link rel="alternate" type="text/html" href="https://wiki.infinite-erp.co.id/index.php?title=How_To/id&amp;diff=4535"/>
		<updated>2026-08-28T12:20:12Z</updated>

		<summary type="html">&lt;p&gt;Wikiadmin: Create ID subpage stub (scaffold) for How To&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Languages}}&lt;br /&gt;
&lt;br /&gt;
== How To (Bahasa Indonesia) ==&lt;br /&gt;
&lt;br /&gt;
Halaman ini adalah terjemahan Bahasa Indonesia dari [[How To|How To]]. Isinya masih dalam pengerjaan (work in progress).&lt;br /&gt;
&lt;br /&gt;
Silakan bantu melengkapi terjemahan mengikuti panduan di [[Starting_Guide_for_Wiki_translators|Starting Guide for Wiki Translators]].&lt;br /&gt;
&lt;br /&gt;
[[Category:WorkInProgress]]&lt;/div&gt;</summary>
		<author><name>Wikiadmin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.infinite-erp.co.id/index.php?title=How_To&amp;diff=4536</id>
		<title>How To</title>
		<link rel="alternate" type="text/html" href="https://wiki.infinite-erp.co.id/index.php?title=How_To&amp;diff=4536"/>
		<updated>2026-08-28T12:20:12Z</updated>

		<summary type="html">&lt;p&gt;Wikiadmin: Add {{Languages}} switcher (EN) for ID subpage&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Languages}}&lt;br /&gt;
&lt;br /&gt;
Below is a list of &amp;quot;How To&amp;quot; documents aimed at describing ways in which business objectives can be met using Openbravo.&amp;lt;br&amp;gt;If you want to review development related How To documents please visit this [http://wiki.openbravo.com/wiki/Category:HowTo link].&lt;br /&gt;
&lt;br /&gt;
[[How to configure InfiniteERP high level? | How to configure InfiniteERP high level?]]&lt;br /&gt;
&lt;br /&gt;
[[How to initialize Opening Balance in InfiniteERP | How to initialize Opening Balance in InfiniteERP]]&lt;br /&gt;
&lt;br /&gt;
[[How_to_initialize_financial_balances_in_Openbravo | How to initialize financial balances in Openbravo ]]&lt;br /&gt;
&lt;br /&gt;
[[How to Adjust Customer Account Balances Using Credit Memos]]&lt;br /&gt;
&lt;br /&gt;
[[How_to_Transfer_Funds_Between_Financial_Accounts | How to Transfer Funds Between Financial Accounts]]&lt;br /&gt;
&lt;br /&gt;
[[How_to_Set_Up_Discounts_for_Early_Payment | How to Set Up Discounts for Early Payment]]&lt;br /&gt;
&lt;br /&gt;
[[How_to_Use_Volume_Discounts | How To Use Volume Discounts]]&lt;br /&gt;
&lt;br /&gt;
[[How_to_Manage_Prepaid_Invoices_in_Receivables | How to Manage Prepaid Invoices in Receivables]]&lt;br /&gt;
&lt;br /&gt;
[[How_to_Manage_Prepaid_Invoices_in_Payables | How to Manage Prepaid Invoices in Payables]]&lt;br /&gt;
&lt;br /&gt;
[[How_to_manage_payroll_accounting_and_payment | How to Manage Payroll Accounting and Payment]]&lt;br /&gt;
&lt;br /&gt;
[[How_to_Manage_Attributes_And_Attribute_Sets | How to Manage Attributes and Attributes Sets]]&lt;br /&gt;
&lt;br /&gt;
[[How_to_manage_VAT_settlement_and_payment | How to Manage VAT settlement and payment]]&lt;br /&gt;
&lt;br /&gt;
[[How_to_manage_deferred_revenue_and_expenses| How to Manage Deferred Revenue and Expenses]]&lt;br /&gt;
&lt;br /&gt;
[[How_to_manage_payments_in_other_currencies_than_the_financial_account_currency| How to Manage Payments in other currencies than the financial account currency]]&lt;br /&gt;
&lt;br /&gt;
[[How_Price_Including_Taxes_are_Calculated| How Prices Including Taxes are calculated]]&lt;br /&gt;
&lt;br /&gt;
[[How_to_Configure_an_Attachment_Method|How to Configure an Attachment Method]]&lt;br /&gt;
&lt;br /&gt;
[[How_to_manage_Cancel_and_Replace_process|How to manage &amp;quot;Cancel and Replace&amp;quot; process]]&lt;br /&gt;
&lt;br /&gt;
[[How_to_manage_Alternative_Unit_of_Measure_AUM|How to manage Alternative Units of Measure (AUM)]]&lt;br /&gt;
&lt;br /&gt;
[[How_to_Property_Configure_Costing_Functionality|How to Properly Configure Costing Functionality]]&lt;br /&gt;
&lt;br /&gt;
[[Category:User_Guide]]&lt;/div&gt;</summary>
		<author><name>Wikiadmin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.infinite-erp.co.id/index.php?title=User_Interface_Introduction&amp;diff=4534</id>
		<title>User Interface Introduction</title>
		<link rel="alternate" type="text/html" href="https://wiki.infinite-erp.co.id/index.php?title=User_Interface_Introduction&amp;diff=4534"/>
		<updated>2026-08-28T12:20:11Z</updated>

		<summary type="html">&lt;p&gt;Wikiadmin: Add {{Languages}} switcher (EN) for ID subpage&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Languages}}&lt;br /&gt;
&lt;br /&gt;
{{BackTo|User Guide}}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
The  Openbravo 3 user interface is optimized for productivity. It is characterized by the following attributes:&lt;br /&gt;
*Multiple tabs that allow to have multiple documents open at the same time&lt;br /&gt;
*Master-detail views: Parent and child record information is shown in the same view&lt;br /&gt;
*In-grid editing: It is possible to modify field values directly in the grid&lt;br /&gt;
*Column filtering: Filter fields on top of the grid allow for real-time filtering while typing the keyword&lt;br /&gt;
*Application menu: A multilevel fly-out menu to discover and access all functional areas&lt;br /&gt;
*Quick menus allow for fast access to existing documents and creation of new documents&lt;br /&gt;
*Sessions: user and profile/role settings can be accessed via the top navigation &lt;br /&gt;
*Help can be accessed via the top navigation and help content will be opened on separate tabs&lt;br /&gt;
&lt;br /&gt;
===Login===&lt;br /&gt;
You access Openbravo through a Web browser. &lt;br /&gt;
&lt;br /&gt;
{|width=&amp;quot;100%&amp;quot;&lt;br /&gt;
|-|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[Image:WIK_Logon.png|thumbnail|right|150px|View larger]]&lt;br /&gt;
&lt;br /&gt;
1. ''Enter your Openbravo URL into the address bar of the browser.''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The login window opens up. &lt;br /&gt;
&lt;br /&gt;
In case the login page is not being not displayed, please verify the correctness of the URL, or contact your system administrator.&lt;br /&gt;
|}&lt;br /&gt;
{|width=&amp;quot;100%&amp;quot;&lt;br /&gt;
|-|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
2. ''Enter your user name and password.''&lt;br /&gt;
&lt;br /&gt;
The user name and password are assigned by the system administrator. If you don´t know your user name and password contact your system administrator.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|width=&amp;quot;100%&amp;quot;&lt;br /&gt;
|-|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|3. ''Click login''&lt;br /&gt;
&lt;br /&gt;
The Openbravo Home page shows up.&lt;br /&gt;
&lt;br /&gt;
===Google Account Association===&lt;br /&gt;
&lt;br /&gt;
You have the ability to log into an Openbravo instance using your Google Account by clicking the G-button that is shown on the login screen below the login button.&lt;br /&gt;
There are two ways to use the Google Accounts authentication service:&lt;br /&gt;
&lt;br /&gt;
* Link an existing Openbravo user name with a Google Account&lt;br /&gt;
* Configure an instance to allow any user with a Google Account to log into the application. If no Openbravo user is linked to that Google Account, a new one is created with default properties. &lt;br /&gt;
&lt;br /&gt;
Learn more about Google Account association in the [http://wiki.openbravo.com/wiki/Configuration_Manual/Google_Integration Configuration Manual]&lt;br /&gt;
&lt;br /&gt;
== Screen Areas ==&lt;br /&gt;
[[Image:WIK PartsOfScreen.png|thumbnail|right|150px|View larger]]&lt;br /&gt;
The Openbravo 3 screen consists of the following components:&lt;br /&gt;
&lt;br /&gt;
*Top navigation&lt;br /&gt;
*Main (1st level) tabs&lt;br /&gt;
*Toolbar&lt;br /&gt;
*Message area&lt;br /&gt;
*Status bar&lt;br /&gt;
*Header level (form or grid)&lt;br /&gt;
*Sections&lt;br /&gt;
*Child (2nd level) tabs&lt;br /&gt;
*Column filters&lt;br /&gt;
*Child grid&lt;br /&gt;
*Grandchild (3rd level) tabs&lt;br /&gt;
&lt;br /&gt;
== Top Navigation ==&lt;br /&gt;
&lt;br /&gt;
[[Image:top-nav.png]]&lt;br /&gt;
&lt;br /&gt;
The top navigation offers the following menus or functionalities:&lt;br /&gt;
&lt;br /&gt;
*Quick Menus&lt;br /&gt;
**Create New&lt;br /&gt;
**Launch&lt;br /&gt;
*Application Menu&lt;br /&gt;
*Alerts&lt;br /&gt;
*Log out&lt;br /&gt;
*User Preferences&lt;br /&gt;
*Help&lt;br /&gt;
&lt;br /&gt;
=== Quick Menus === &lt;br /&gt;
[[Image:quickmenu-buttons.png]]&lt;br /&gt;
&lt;br /&gt;
Via the quick menus you can quickly launch new documents or jump to existing documents. &lt;br /&gt;
*Create New: a new document of a specific type is created on a new tab in form view &lt;br /&gt;
*Launch: a grid for a specific document type is opened on a new tab&lt;br /&gt;
&lt;br /&gt;
Both QuickCreate and QuickLaunch work in the same way using auto-suggest based on the typed input. By simply entering the first couple of letters of the name of the document type, you will be offered suggestions for the type of document you are looking for.&lt;br /&gt;
&lt;br /&gt;
[[Image:WIK_Quick.png]]&lt;br /&gt;
&lt;br /&gt;
=== Application Menu === &lt;br /&gt;
The Openbravo 3 application menu uses the same taxonomy as the 2.x versions, only the presentation has changed. Folders are replaced by expandable menus but its contents remain the same.&lt;br /&gt;
&lt;br /&gt;
[[Image:WIK_AppMenu.png|thumbnail|right|150px|View larger]]&lt;br /&gt;
&lt;br /&gt;
''The contents of the Application Menu depends on the user's role. For example, one user can have various roles and see different things with each. Users and roles are usually created and maintained by the client's Administrator.&lt;br /&gt;
&lt;br /&gt;
=== Alerts ===&lt;br /&gt;
[[Image:WIK_Alerts.png|thumbnail|right|150px|View larger]]&lt;br /&gt;
[[Image:WIK_Alerticon.png]]&lt;br /&gt;
&lt;br /&gt;
An alert is a notification that informs or warns its recipients about a critical or very important situation that has arisen. With one click you can see and edit all your active alerts. &lt;br /&gt;
&lt;br /&gt;
The number of new alerts is shown in the top navigation as ''Alerts (n)''. Clicking this link will take you to the Alerts Management tab. This tab shows four sections, each one representing a status or stage in the alert life cycle:&lt;br /&gt;
&lt;br /&gt;
*'''New alerts''': alerts that you have not marked as read/acknowledged and that are not ignored nor solved&lt;br /&gt;
*'''Pending alerts''': alerts that you have marked as read/pending because you don´t want to see them in the new section anymore. You would do this for example when you or your colleague have taken care of the problem but this has not been updated in the system. A typical example is: Stock of product x dropped below critical level. You just placed a new order by phone but it will still take a day to receive the orders.&lt;br /&gt;
*'''Ignored alerts''': alerts that you do not want to see back again. By placing them in the Ignore section, it means that they are now exceptions to the alert rule.&lt;br /&gt;
*'''Solved alerts''': alerts are automatically moved to the solved section when the system notices that the alerts threshold seized to be violated. Note that you cannot mark alerts as solved yourself.&lt;br /&gt;
&lt;br /&gt;
In the Notes column, you can add a comment. You would typically do it when moving a New alert to (for example) the Acknowledged/read section. You can move alerts to a different section and clicking one of the buttons in the top right of the grid.&lt;br /&gt;
The Record column contains clickable links. They let you open the (problematic) record on a new tab for further investigation.&lt;br /&gt;
&lt;br /&gt;
[[ERP/2.50/User_Manual/General_Setup#Alert | More about Alerts]]&lt;br /&gt;
&lt;br /&gt;
=== Help &amp;amp; About ===&lt;br /&gt;
The last item in the top navigation is the Help menu. It also contains an About item. Help content is opened on a new tab.&lt;br /&gt;
&lt;br /&gt;
=== User Preferences === &lt;br /&gt;
Click the user name in the top navigation to access a user preferences menu. The menu is split in two tabs: Profile and Change Password&lt;br /&gt;
&lt;br /&gt;
[[Image:WIK_Profile.png|thumbnail|right|150px|View larger]]&lt;br /&gt;
&lt;br /&gt;
*See the current role information.&lt;br /&gt;
*Change the session options such as role, entity, organization, warehouse, language you want to work with.&lt;br /&gt;
*Set your default session options .&lt;br /&gt;
*Change password (on the second tab in the menu)&lt;br /&gt;
&lt;br /&gt;
=== Log out === &lt;br /&gt;
[[Image:logout-icon.png]]&lt;br /&gt;
&lt;br /&gt;
This button logs you out of the application. A confirmation dialog lets you confirm.&lt;br /&gt;
&lt;br /&gt;
== Tabs ==&lt;br /&gt;
[[Image:WIK_tabs.png|thumbnail|right|150px|View larger]]&lt;br /&gt;
&lt;br /&gt;
Openbravo 3 allows you to have multiple transactions open a the same time on different tabs. You can switch between active tabs, just as you do using a modern internet browser. Tabs can be closed by pressing the X button.&lt;br /&gt;
&lt;br /&gt;
In case of overflow, when the total width of the tabs exceed the available horizontal space, three buttons appear to the right of the last tab that allow you to scroll through the tabs and easily navigate to one.&lt;br /&gt;
&lt;br /&gt;
Starting from version '''3.0PR14Q2''', it is possible to reorder tab position. To do it, drag the tab and drop it in the desired position.&lt;br /&gt;
&lt;br /&gt;
Starting form version '''3.0PR15Q3''', by default only one tab of a window is allowed. Only in case there is a module in development or the window is flagged as ''Thread Safe'' it is possible to have multiple tabs. Since this version there is a new [[Preference]] property '''Allow Multiple Tabs of a Window''' that enables the possibility to open more than one tab of a window. This preference can be configured by user, role and/or window level.&lt;br /&gt;
&lt;br /&gt;
== Levels &amp;amp; Views ==&lt;br /&gt;
[[Image:WIK_Levels.png|thumbnail|right|150px|View larger]]&lt;br /&gt;
An application window consists of one or more levels: parent, child and sometimes even grandchildren and deeper. They are separated by a horizontal splitter bar. Each level can be displayed in grid or form view. &lt;br /&gt;
&lt;br /&gt;
=== Grid View ===&lt;br /&gt;
[[Image:WIK_OpenForm.png|thumbnail|right|150px|View larger]]&lt;br /&gt;
&lt;br /&gt;
The grid view functions as the base view and often as a starting point to filtering and drilling down. The user can open a record in form view on top of the grid. The interaction metaphor that is used is that of a file explorer of an operating system. The grid is the folder with files, a double click opens the record. The record in form view can be closed at any time by clicking the close (X) button in the top right corner of the form.&lt;br /&gt;
&lt;br /&gt;
A record in the grid can be opened via:&lt;br /&gt;
*A double click on the row&lt;br /&gt;
*Pressing the &amp;lt;ENTER&amp;gt; key on the keyboard&lt;br /&gt;
*Clicking the form/document icon on the left hand side of the row&lt;br /&gt;
&lt;br /&gt;
=== Tree Grid View ===&lt;br /&gt;
&lt;br /&gt;
{{(!)| The Tree Grid View is available from '''Openbravo PR14Q2'''}}&lt;br /&gt;
&lt;br /&gt;
[[Image:MenuTreeGridView.png|thumbnail|right|150px|View larger]]&lt;br /&gt;
&lt;br /&gt;
The tree grid view is an alternative to the standard grid view that is available for tabs based on [http://wiki.openbravo.com/wiki/How_to_Define_a_Table_as_a_Tree tables that have been defined as a tree]. The tree grid view shows the tab data hierarchically. When the view is first loaded only the root nodes are shown. The user can then open individual nodes to load its children. &lt;br /&gt;
&lt;br /&gt;
To switch between the standard grid view and the tree grid view the user has to click the Tree toolbar button: [[Image:WIK_button_Tree.png]]&lt;br /&gt;
&lt;br /&gt;
The user can reorder the nodes of the tree, moving a node to another parent or to another position within its original parent. Some restrictions apply when moving a node:&lt;br /&gt;
* If the tab is set as read only, the user will not be able to change the position of tree nodes.&lt;br /&gt;
* Openbravo PR14Q3: If the tab has the flag &amp;quot;Read Only Tree&amp;quot; checked, the user will not be able to change the position of tree nodes.&lt;br /&gt;
* If the tab has a '''Summary Level''' field, then it will not be possible to drop a node to a record whose summary level field is not checked.&lt;br /&gt;
* Some trees may define specific restrictions. For instance, it is not possible to move an organization if it is set as ready, or a menu item if it belongs to a module that is not in developement. If the user tries to move one of these nodes, the movement will be reverted and a meaningful message will be shown in the message bar.&lt;br /&gt;
* By default the node movement will occur just after it is droped in its new position. To show a confirmation popup before actually moving the node, the OBUIAPP_ConfirmNodeReparent preference should be set.&lt;br /&gt;
&lt;br /&gt;
Openbravo PR14Q3: There are some configurations that can be done at tab level:&lt;br /&gt;
* &amp;quot;Show Tree Node Icons&amp;quot;: It is only available when the tree is in read only mode and by disabling it the tree icons can be hidden.&lt;br /&gt;
* &amp;quot;Default Tree View Logic&amp;quot;: It defines if by default the tree view should be shown following a specific logic&lt;br /&gt;
&lt;br /&gt;
When the tree grid view is filtered, not only the records that fulfill the filter criteria will be shown, also its parent nodes, until reaching the root node. This is done in order to show the filtered nodes in its proper context. The font color of the context nodes is grey in order to distinguish them from the nodes that actually fulfill the filter criteria. It is not possible to reorder the tree nodes while it is being filtered, as it some records are hidden the new position of the node could be ambiguous.&lt;br /&gt;
&lt;br /&gt;
It is not possible to create or edit a node using the tree grid view, for that the standard grid view should be used. What it is actually possible is to open a record in form view from the tree grid view. Then the record can be edited in the form view, and when the form view is closed the tree grid view will be shown again.&lt;br /&gt;
&lt;br /&gt;
If a user wants to use the classic tree popup instead of the tree grid view, he can use the '''Use Classic Popup Tree''' preference.&lt;br /&gt;
&lt;br /&gt;
=== Form View ===&lt;br /&gt;
[[Image:WIK_CloseForm.png|thumbnail|right|150px|View larger]]&lt;br /&gt;
&lt;br /&gt;
The form view is used for more complex editing of individual records. Normally header records are created in form view because they e.g. a description which usually is too long to enter comfortably in grid view.&lt;br /&gt;
&lt;br /&gt;
The form view can be closed by &lt;br /&gt;
*Clicking the close (X) button in the top right of the form.&lt;br /&gt;
*Clicking the Save&amp;amp;Close button in the toolbar, this is the button with the floppy disk combined with the X symbol.&lt;br /&gt;
&lt;br /&gt;
=== Form Personalization===&lt;br /&gt;
&lt;br /&gt;
This feature allows you to change the order and visibility of fields, and several other settings:&lt;br /&gt;
&lt;br /&gt;
*assign fields to the status bar and assign fields to existing field groups&lt;br /&gt;
*set the colspan or rowspan&lt;br /&gt;
*define if a field should be placed on a new row&lt;br /&gt;
*the field which will get the first focus &lt;br /&gt;
&lt;br /&gt;
[[Image:WIK_FormPersonalization.png‎]]&lt;br /&gt;
&lt;br /&gt;
More detailed documentation:[[User_Manual/Window_Personalization|Window_Personalization]]&lt;br /&gt;
&lt;br /&gt;
{{(!)|This is a '''Premium''' functionality. [http://www.openbravo.com/product/erp/editions/ Learn more] about the benefits of Openbravo's commercial editions}}&lt;br /&gt;
&lt;br /&gt;
=== Activating, resizing, maximizing and toggling levels ===&lt;br /&gt;
[[Image:WIK_3Levels.png|thumbnail|right|150px|View larger]]&lt;br /&gt;
&lt;br /&gt;
Each application window is split in two visible levels. This can be either parent-child or child-grandchild (or even deeper down). The distribution of the height of each level is not fixed as it can be changed by dragging the horizontal splitter bar that divides the two levels.&lt;br /&gt;
&lt;br /&gt;
Only one level can be active at a time. An active level is marked with an orange vertical strip on the left hand side and an orange horizontal strip on top of the tab. You can toggle between active levels simply by clicking in a non-active level. The orange markers will move along.&lt;br /&gt;
&lt;br /&gt;
The standard view is parent-child (also known as header-lines). In case there is a third level available, it will sit at the bottom of the window in collapsed state. In order to expand the third level, you can simply click on its tab. It will then pop out and push the other levels upwards. In this case you will notice that the top level (header) will become collapsed. Here the same interaction principle applies: a single click on the header tab will make it re-appear.&lt;br /&gt;
&lt;br /&gt;
A level can be maximized by double clicking on its tab. Double clicking it again will restore its size to the previous size.&lt;br /&gt;
&lt;br /&gt;
[[Image:WIK_3Levels2.png|thumbnail|right|150px|View larger]]&lt;br /&gt;
&lt;br /&gt;
=== Saving Views ===&lt;br /&gt;
&lt;br /&gt;
Saving Views stores grid and form settings, column filters and even the entire layout of the screen, for example the position of the splitterbar between the header and lines. So imagine that you rearranged your grid and it´s perfectly adapted to your task. You even added some column filters, for example you only want to see invoices that are more than 21 days overdue for organization East Coast. Now you save all this in one go using a name. Now when you need to work on another task that needs other filters and grid or form settings, you can easily retrieve this view later. You can access Saved Views through a pull down menu that sits underneath the Saved Views button in the toolbar.&lt;br /&gt;
&lt;br /&gt;
[[Image:WIK_SavingViews.png]]&lt;br /&gt;
&lt;br /&gt;
A saved view can be set as default and can be deleted. The active view is indicated by a little arrow in front of the view name.&lt;br /&gt;
&lt;br /&gt;
As an administrator you are able to save predefined views on different levels (client, org, role) which are made available to users. As a regular user you can only edit/save views on your own levels and not change views entered by an administrator.&lt;br /&gt;
&lt;br /&gt;
More detailed documentation: [http://wiki.openbravo.com/wiki/User_Manual/Window_Personalization#Saved_and_Named_Views Window_Personalization]&lt;br /&gt;
&lt;br /&gt;
{{(!)|This is a '''Premium''' functionality. [http://www.openbravo.com/product/erp/editions/ Learn more] about the benefits of Openbravo's commercial editions}}&lt;br /&gt;
&lt;br /&gt;
== Advanced Grid Functionality ==&lt;br /&gt;
The Openbravo 3 grids let you browse, select, filter and organize high volumes of records with ease. Listed below are the main capabilities of the new grids.&lt;br /&gt;
=== Selecting Rows ===&lt;br /&gt;
[[Image:WIK_Selecting.png|thumbnail|right|150px|View larger]]&lt;br /&gt;
Row(s) in grids can be selected as follows: &lt;br /&gt;
*Selecting a single row is simply done by clicking on it. There is no need to tick the checkbox in front of the row.&lt;br /&gt;
*Multiple selection is done by either ticking the checkboxes in front of the rows or using CTRL-click or SHIFT-click combinations.&lt;br /&gt;
*All records displayed in the grid can be selected using the checkbox in the top left of the grid as far as the number of records is smaller than 100.&lt;br /&gt;
In the top left of the grid, two numbers are shown. The first one indicates the number of selected rows, the second one the total number of rows in the grid.&lt;br /&gt;
&lt;br /&gt;
=== Column Filters ===&lt;br /&gt;
[[Image:WIK_Filter.png|thumbnail|right|150px|View larger]]&lt;br /&gt;
[[Image:WIK_Filter_fk.png|thumbnail|right|150px|View larger]]&lt;br /&gt;
On top of the columns in a grid you will find column filters. There are several types of column filters:&lt;br /&gt;
*Regular column filters: These are fields that are empty by default but once you start typing the first characters of a search term, the grid will be filtered in real-time.&lt;br /&gt;
*Date column filters: Clicking it will launch a dialog where you can set a range, for example ''8 days ago till today''.&lt;br /&gt;
*Dropdown reference column filters: filters on references to other data, for example from a sales order to a business partner. You can filter on multiple values (available from MP17), if there are many values to filter on then you can scroll in the dropdown box.&lt;br /&gt;
*Dropdown column filters: Filters that contain a limited set of values. Just open the dropdown and select a value. From MP17 you can select more than one value to filter on.&lt;br /&gt;
&lt;br /&gt;
The following symbols can be used in regular column filter fields to create more complex filter expressions. Note that once you start typing a filter expression in a numerical value column, the real-time filtering is switched off and you will need to hit Enter to apply the filter.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Symbol&lt;br /&gt;
! Filter&lt;br /&gt;
! Example&lt;br /&gt;
! Which means&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;&lt;br /&gt;
| less than (also works for strings)&lt;br /&gt;
| &amp;lt;100&lt;br /&gt;
| Only show amounts less than 100&lt;br /&gt;
|-&lt;br /&gt;
| &amp;gt; &lt;br /&gt;
| greater than (also works for strings)&lt;br /&gt;
| &amp;gt;100&lt;br /&gt;
| Only show amounts greater than 100&lt;br /&gt;
|-&lt;br /&gt;
| ! &lt;br /&gt;
| not equal (also works for strings)&lt;br /&gt;
| !100&lt;br /&gt;
| Show everything except amounts that equal 100&lt;br /&gt;
|-&lt;br /&gt;
| ^ &lt;br /&gt;
| starts with&lt;br /&gt;
| ^H&lt;br /&gt;
| Only show values that start with &amp;quot;H&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[File:endsWithSymbol.png]]&lt;br /&gt;
| ends with&lt;br /&gt;
| [[File:endsWithSymbol.png]]H&lt;br /&gt;
| Only show values that end with &amp;quot;H&amp;quot;	&lt;br /&gt;
|-&lt;br /&gt;
| !^ &lt;br /&gt;
| does not start with&lt;br /&gt;
| !^H&lt;br /&gt;
| Only show values that do not start with &amp;quot;H&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| !@ &lt;br /&gt;
| does not end with&lt;br /&gt;
| !@H&lt;br /&gt;
| Only show values that do not end with &amp;quot;H&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| ~ &lt;br /&gt;
| contains (this is the default for most column filters)&lt;br /&gt;
| ~buenas&lt;br /&gt;
| Only show values that contain &amp;quot;buenas&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| !~ &lt;br /&gt;
| does not contain&lt;br /&gt;
| !~buenas&lt;br /&gt;
| Only show values that do not contain &amp;quot;buenas&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| #&lt;br /&gt;
| is Null&lt;br /&gt;
| #&lt;br /&gt;
| Only show records without a value in this column (works in regular and date column filters)&lt;br /&gt;
|-&lt;br /&gt;
| !#&lt;br /&gt;
| is not Null&lt;br /&gt;
| !#&lt;br /&gt;
| Only show records with a value in this column (works in regular and date column filters)&lt;br /&gt;
|-&lt;br /&gt;
| ==&lt;br /&gt;
| exact match (for fields where 'contains' is the default)&lt;br /&gt;
| ==FV/1&lt;br /&gt;
| Only show values that equal exactly &amp;quot;FV/1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| a...b&lt;br /&gt;
| range (between a and b)&lt;br /&gt;
| 0...100&lt;br /&gt;
| Only show values between 0 and 100.&lt;br /&gt;
|-&lt;br /&gt;
| or&lt;br /&gt;
| OR boolean&lt;br /&gt;
| check or cash&lt;br /&gt;
| Only show records that contain &amp;quot;check&amp;quot; or &amp;quot;cash&amp;quot;. Note if you want to use the term 'or' as a filter value then you should prefix it with a '\'. So to get all records containing the value 'or' filter using this value: \or.&lt;br /&gt;
|-&lt;br /&gt;
| and&lt;br /&gt;
| AND boolean&lt;br /&gt;
| check and cash&lt;br /&gt;
| Only show records that contain &amp;quot;check&amp;quot; and &amp;quot;cash&amp;quot;. Note if you want to use the term 'and' as a filter value then you should prefix it with a '\'. So to get all records containing the value 'and' filter using this value: \and.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Filters can be cleared by clicking the funnel icon in the top right of the grid.&lt;br /&gt;
&lt;br /&gt;
==== Client Filtering ====&lt;br /&gt;
&lt;br /&gt;
{{(!)|This capability is available starting from '''MP28'''}}&lt;br /&gt;
&lt;br /&gt;
When applying column filters in a grid, a new request is done to backend to retrieve the filtered data set. In case of applying a filter more restrictive than the one used to retrieve the previous one and if the complete data set for that previous filter has already been completely retrieved from the client (this is, the number of records matching the filter is equals or smaller than the page size -100 records-), the filtering is done in the browser without the need of doing additional requests. This implies a better performance in these cases saving backend trips.&lt;br /&gt;
&lt;br /&gt;
==== Grid Configuration ====&lt;br /&gt;
&lt;br /&gt;
{{(!)|This capability is available starting from '''MP31'''.  It was sponsored through [http://www.agilityerp.com Agility ERP] to enable more efficient user interaction with grids configured against a table with millions of rows.  In this case it can make sense to restrict the normal interaction to avoid inefficient queries that result in full table scans.}}&lt;br /&gt;
&lt;br /&gt;
The behaviour of the grid filters can be configured by system administrators at System level (Grid Configuration at System Level window) or Tab and Field level (Grid Configuration at Window/Tab/Field Level). Tab configurations will overwrite system configurations, and field configuration will overwrite tab configurations. Grid configuration also can be configured to determine if a column is sortable or not. &lt;br /&gt;
&lt;br /&gt;
Working with '''high volume''' of data we recommend to deactivate sorting and filtering in some/most columns in backend grids. [http://wiki.openbravo.com/wiki/How_to_configure_high_volume_windows How to configure high volume windows.] &lt;br /&gt;
&lt;br /&gt;
The following parameters can be configured in these windows:&lt;br /&gt;
* By Default Allow Sorting: If this property is set to false, columns will not be sortable.&lt;br /&gt;
* By Default Allow Filtering: If this property is set to false, column filters will be disabled.&lt;br /&gt;
* Text Field Filter Behavior: Defines the operator used on the filter of text columns. Allowed values are equals, iEquals, startsWith, iStartsWith, contains and iContains).&lt;br /&gt;
* Threshold to Trigger Filter on Text Field (in ms): By default 500 milliseconds after the last user keystroke on the filter of a text colum, a request to the datasource will be done with the current content of the filter. If the user types at a rate slower than 500 milliseconds, then each time the users enters a string in a text filter it will result in several datasource requests. This parameter can be configured to make this delay higher (values lower than 500 will not be applied).&lt;br /&gt;
* Filter On Change: Using this property the user can change the behavior of text filters, so instead of triggering a datasource request some time after the last keystroke of the user, the datasource request will be triggered only when the user presses enter or moves the focus out of the text filter.&lt;br /&gt;
* Lazy Filtering on Grid: If this property is set to true, then the filters will not be applied to the grid until the user presses enter or clicks on the check icon under the funnel icon. This allows to define several filters and then do just one request to the datasource. If this property is checked then the user opens a window the initial datasource request will not be done automatically. The user will have to do the datasource request explicitally after he sets the filters he needs. This property also affects when changing the sorting criteria of the grid: when set to true, the sorting will not be performed until the user presses the enter key or the mentioned check icon.&lt;br /&gt;
* Allow Filtering Foreign Keys by its Identifier: If this flag is unchecked, then the only way to filter the foreign key columns will be by picking some value from the filter drop down. The query done to fetch data when the filter is set this way is much better than the query done when the column is filtered without using the filter drop down. Even if this flag is unchecked the user will be able to enter text to filter the data shown in the drop down list.&lt;br /&gt;
* Unfiltered Foreign Key Combo: If this flag if checked, the filter drop down will show the rows from the referenced table unfiltered by specific rows being referenced in the referencing table. The filters entered by the user in the grid filter editor will be applied. This configuration makes sense if the referenced table does not have that much volume, but loading the foreign key filter drop down takes a lot of time anyway.&lt;br /&gt;
* Disable Foreign Key Filter Combo: In some cases the population of the drop down is very slow even using the previous configuration. In that case, it could be useful to use this configuration, that will get rid of the foreign key filter combo, so that the column will be filtered like a standard text column. Use this only if filtering this way outperforms the population of the combo.&lt;br /&gt;
* Allow Summary Functions: Determines if the [http://wiki.openbravo.com/wiki/User_Interface_Introduction#Grid_Summaries Summary Functions] can be added into the grid, i.e., the menu entry which allows the entering of this summaries will not be available if this flag is not checked. Besides, in the case of Summary Functions already present in [http://wiki.openbravo.com/wiki/User_Interface_Introduction#Saving_Views Saved Views], they will not be displayed.&lt;br /&gt;
* Allow Transactional Filters: If this property is set to true then the [http://wiki.openbravo.com/wiki/Standard_Windows#Transactional_Windows transactional filters] will be enabled. Otherwise, all the transactional filters will be disabled.  &lt;br /&gt;
* Sequence Number: In case of having multiple configurations for the same level, it determines which one is going to be applied. In these cases the configuration that will be taken into account is the one with the highest sequence number.&lt;br /&gt;
&lt;br /&gt;
{{(!)|The '''Allow Filtering Foreign Keys by its Identifier''' feature (also sponsored through [http://www.agilityerp.com Agility ERP]) is available starting from '''PR14Q4'''}}&lt;br /&gt;
&lt;br /&gt;
{{(!)|The '''Unfiltered Foreign Key Combo''' and the '''Disable Foreign Key Filter Combo''' features are available starting from '''PR15Q3'''}}&lt;br /&gt;
&lt;br /&gt;
{{(!)|The '''Sequence Number''' fields is available starting from '''PR16Q2'''}}&lt;br /&gt;
&lt;br /&gt;
{{(!)|The '''Allow Summary Functions''' feature is available starting from '''PR17Q1'''}}&lt;br /&gt;
&lt;br /&gt;
{{(!)|The '''Allow Transactional Filters''' feature is available starting from '''PR19Q2'''}}&lt;br /&gt;
&lt;br /&gt;
=== Column filtering and sorting configuration ===&lt;br /&gt;
{{(!)|The '''Allow Sorting''' and the '''Allow Filtering''' checkboxes are available starting from '''PR16Q2'''}}&lt;br /&gt;
&lt;br /&gt;
Every column in Openbravo is filterable and sortable by default. Every column has two checkbox fields which are called Allow Sorting and Allow Filtering that are checked by default. Those checkboxes can be unchecked to make the columns not sortable or not filterable. This can be configured by system administrators in the ''Tables and Columns'' window and there it can be chosen the column of which one wants to change the default sorting or filtering properties.&lt;br /&gt;
&lt;br /&gt;
These defaults can be overridden by a Grid Configuration. In case sorting or filtering is allowed for a column, its behavior can be overridden by a configuration at any level. But if filtering or sorting is disabled, it can be only be enabled by a configuration at field level.&lt;br /&gt;
&lt;br /&gt;
=== Implicit Filters ===&lt;br /&gt;
Some grids, especially those with large data volumes, have preset hidden filters, the so called ''implicit filters''. Typical implicit filters are set to filter out already process transactional documents or documents before a certain date. Implicit filters can be cleared by clicking the funnel icon in the top right of the grid.&lt;br /&gt;
&lt;br /&gt;
=== Filtering in Selector Grids ===&lt;br /&gt;
[[Image:WIK_Filterpop.png|thumbnail|right|150px|View larger]]&lt;br /&gt;
Selectors make use of modal dialogs containing grids. Selector grids work in the same way as regular grids. Often, they also contain preset implicit filters that can be cleared by clicking the funnel icon. Typical cases where selectors are used are business partner and product selection.&lt;br /&gt;
&lt;br /&gt;
=== Setting Column Visibility ===&lt;br /&gt;
[[Image:WIK_Colvis.png|thumbnail|right|150px|View larger]]&lt;br /&gt;
Via a right-mouse-click on any column header, a context menu can be invoked. In this menu, you can set the column visibility via the ''Columns'' item by ticking or unticking the column (field) names.&lt;br /&gt;
&lt;br /&gt;
=== Setting Column Order &amp;amp; Widths ===&lt;br /&gt;
[[Image:WIK_Colwidth.png|thumbnail|right|150px|View larger]]&lt;br /&gt;
Column order and width can simply be modified by dragging the column header or separating split line to another position.&lt;br /&gt;
&lt;br /&gt;
=== Sorting ===&lt;br /&gt;
[[Image:WIK_Colsorting.png|thumbnail|right|150px|View larger]]&lt;br /&gt;
Columns can be sorted by clicking on a column header. A second click sorts the column in the reverse order. A triangle symbol conveys the current ordering.&lt;br /&gt;
&lt;br /&gt;
==== Client Sorting ====&lt;br /&gt;
&lt;br /&gt;
{{(!)|This capability is available starting from '''MP28'''}}&lt;br /&gt;
&lt;br /&gt;
In the same way to [[#Client_Filtering|Client Filtering]], when the number of records matching current filters is equals or smaller than the page size -100 records-, sorting is directly done in the browser instead of performing additional request to backend.&lt;br /&gt;
&lt;br /&gt;
==== Disable Sorting ====&lt;br /&gt;
&lt;br /&gt;
{{(!)|This capability is available starting from '''MP31'''}}&lt;br /&gt;
&lt;br /&gt;
Sorting can be disabled at System, Tab or Field level by configuring the By Default Allow Sorting parameter in the Grid Configuration at System Level and Grid Configuration at Window/Tab/Field Level windows.&lt;br /&gt;
&lt;br /&gt;
==== Sorting Lazily ====&lt;br /&gt;
&lt;br /&gt;
{{(!)|This capability is available starting from '''MP31'''}}&lt;br /&gt;
&lt;br /&gt;
If the Lazy Filtering on Grid parameter is set to true (for more information about grid configuration click [[#Grid_Filter_Configuration | here]]), then when the user clicks on a field title in order to sort the grid using that field, the sorting will not be applied until the user types Enter on a grid filter or until he clicks on the check icon below the funnel icon. This reduces the number of datasource requests, allowing the user to change the sorting and change several filters and then do only one datasource request.&lt;br /&gt;
&lt;br /&gt;
=== Grouping ===&lt;br /&gt;
[[Image:WIK_Grouping_showgrouping.png|thumbnail|right|150px|View larger]]&lt;br /&gt;
Records can be grouped by a certain value/column (available from MP17). &lt;br /&gt;
&lt;br /&gt;
[[Image:WIK_Grouping_preference.png|thumbnail|right|150px|View larger]]&lt;br /&gt;
Grouping is '''not''' enabled by default. The 'Grouping Enabled' preference should be set.&lt;br /&gt;
&lt;br /&gt;
[[Image:WIK_Grouping_dogroup.png|thumbnail|right|150px|View larger]]&lt;br /&gt;
To group click on the column header context menu and select 'Group by...'. The display of grid will now show the records in a grouped manner. &lt;br /&gt;
&lt;br /&gt;
[[Image:WIK_Grouping_datatoolarge.png|thumbnail|150px|View larger]]&lt;br /&gt;
If the dataset is too large then grouping is disabled. A message is displayed if a large dataset is grouped. The maximum number of records which can be grouped is also controlled by a preference: 'Maximum Number of Records for Grouping'.&lt;br /&gt;
&lt;br /&gt;
[[Image:WIK_Grouping_ungroup.png|thumbnail|right|150px|View larger]]&lt;br /&gt;
To ungroup, click the 'ungroup' option in the column header context menu.&lt;br /&gt;
&lt;br /&gt;
=== Grid Summaries ===&lt;br /&gt;
[[Image:WIK_Gummary_summarize.png|thumbnail|right|150px|View larger]]&lt;br /&gt;
[[Image:WIK_Gummary_setsummarize.png|thumbnail|right|150px|View larger]]&lt;br /&gt;
[[Image:WIK_Gummary_summary_ad.png|thumbnail|right|150px|View larger]]&lt;br /&gt;
{{(!)|This capability is available starting from '''MP17'''.}}&lt;br /&gt;
&lt;br /&gt;
The grid allows you to set summary functions for a column. These summary values are shown in a separate row in the bottom of the grid. The summary functions are executed on the server so they operate on the complete dataset which fits into the current filter. &lt;br /&gt;
&lt;br /&gt;
To set a summary function click on the column header context menu and go into the 'Set Summary Function' submenu. Numeric and date fields will have several summary functions, other fields will only have a 'count' summary function.&lt;br /&gt;
&lt;br /&gt;
You can remove the summary row by clicking on the 'Clear Summary Functions' option in the column context menu.&lt;br /&gt;
&lt;br /&gt;
It is also possible to set a summary function in the Application Dictionary (in the Window, Tabs, Field window in the Field tab). This summary function is then enabled by default when opening the target window. See the screenshot on the right on how to set this in the Application Dictionary. Valid summary functions are: avg, count, max, min, sum.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Limitations'''&lt;br /&gt;
{{(!)|This limitation starting from '''3.0PR17Q1'''.}}&lt;br /&gt;
&lt;br /&gt;
'''Summary functions are not supported''' on tabs defined based on [http://wiki.openbravo.com/wiki/How_to_create_a_HQL_Based_Table HQL Query Tables]. For this reason, since 3.0PR17Q1 the 'Set Summary Function' submenu is not available for this kind of tabs.&lt;br /&gt;
&lt;br /&gt;
{{(!)|This limitation starting from '''3.0PR17Q2'''.}}&lt;br /&gt;
&lt;br /&gt;
As computed columns allow to be defined with any arbitrary sql statement, the risk of underperformance when included in a summary function is much bigger. For this reason '''Summary functions are not supported in [http://wiki.openbravo.com/wiki/How_to_create_a_Computed_Column computed columns]'''.&lt;br /&gt;
&lt;br /&gt;
{{(!)|This limitation starting from '''3.0PR18Q1'''.}}&lt;br /&gt;
&lt;br /&gt;
'''Summary functions are not supported''' on tabs defined based on [http://wiki.openbravo.com/wiki/How_to_Create_a_Table_Based_on_a_User_Defined_Datasource Datasource Tables]. For this reason, since 3.0PR18Q1 the 'Set Summary Function' submenu is not available for this kind of tabs.&lt;br /&gt;
&lt;br /&gt;
=== Freezing Columns ===&lt;br /&gt;
[[Image:WIK_Colfreeze.png|thumbnail|right|150px|View larger]]&lt;br /&gt;
Freezing columns means that they will be kept in the same position regardless of the position of the horizontal slider bar. Freezing column(s) is typically done when information in the right hand side of the grid (that is accessed via horizontal scrolling) needs to be viewed in the context of columns on the left hand side.&lt;br /&gt;
&lt;br /&gt;
Columns can be frozen via the grid context menu that is invoked via a right mouse click on a column header.&lt;br /&gt;
&lt;br /&gt;
=== Formula Columns ===&lt;br /&gt;
[[Image:WIK_Colformula.png|thumbnail|right|150px|View larger]]&lt;br /&gt;
A formula column shows the outcome of an equation using values of two or more columns. Via the context menu (right mouse click on column header) the formula dialog is launched. Here, you enter the title of the column and the actual definition. Every column containing numerical values is represented by a capital letter. These letters are used to build the formula. For example:&lt;br /&gt;
&lt;br /&gt;
*A = Total Paid&lt;br /&gt;
*B = Outstanding Amount&lt;br /&gt;
&lt;br /&gt;
The formula to sum these two is: A+B&lt;br /&gt;
&lt;br /&gt;
=== Summary Columns ===&lt;br /&gt;
[[Image:WIK_Colsummary.png|thumbnail|right|150px|View larger]]&lt;br /&gt;
Similar to the formula columns, the summary columns simply combine to non-numerical values into a single string. The columns are represented by capital letters. When building the expression the pound sign (#) needs to be used to identify them as values.&lt;br /&gt;
&lt;br /&gt;
=== Printing ===&lt;br /&gt;
&lt;br /&gt;
With the print button of the toolbar ([[Image:WIK_button_Print.png]]) it is possible to launch a process that generates a report with the information of the records in a grid. By default there exists print processes for a limited set of windows:&lt;br /&gt;
&lt;br /&gt;
* Business Partner&lt;br /&gt;
* Requisition&lt;br /&gt;
* Goods Shipment&lt;br /&gt;
* Goods Receipt&lt;br /&gt;
* Sales Order&lt;br /&gt;
* Purchase Order&lt;br /&gt;
* Sales Invoice&lt;br /&gt;
* Purchase Invoice&lt;br /&gt;
* Payment In&lt;br /&gt;
* Payment Out&lt;br /&gt;
&lt;br /&gt;
==== Direct Print ====&lt;br /&gt;
For the windows related to the standard documents (goods shipments/receipts, orders, invoices and payments) it is also possible to configure them for '''direct printing''', i.e, instead of downloading the printed report, the print page of the browser is directly opened with the report information.&lt;br /&gt;
&lt;br /&gt;
To enable this print mode, the [http://wiki.openbravo.com/wiki/Preference#Preferences_Definition '''Direct Print'''] preference should be used and the browser must be configured to directly open the PDF files instead of downloading them. This [https://support.google.com/chrome/answer/6213030?hl=en link] explains how to configure it in Chrome.&lt;br /&gt;
&lt;br /&gt;
Please note that this feature relies on the functionality provided by the browser and not all the [http://wiki.openbravo.com/wiki/System_Requirements#Client:_web_browsers supported browsers] currently support it. For example, &lt;br /&gt;
Mozilla Firefox ESR browser does not support it due to this [https://bugzilla.mozilla.org/show_bug.cgi?id=911444 bug]. Refer [https://docs.google.com/spreadsheets/d/1LmCczLBW3NBFIB70X6gQmAlSedvRzg8hWZp1KBzZZk0 here] for a list of browsers where the direct print has been tested.&lt;br /&gt;
&lt;br /&gt;
=== Exporting grid content to a spreadsheet ===&lt;br /&gt;
&lt;br /&gt;
Openbravo 3 allows the user to export grid content to a CSV file (Comma-Separated Values) via a button in the toolbar([[Image:WIK_button_Export.png]]). This file can then be imported in most spreadsheet applications such as Microsoft Excel and OpenOffice.&lt;br /&gt;
&lt;br /&gt;
To configure the export functionality correctly, follow these guidelines:&lt;br /&gt;
&lt;br /&gt;
* The exported file is by default formatted using the iso-8859-1 encoding, which is the standard used in Windows environments and which works correctly with Microsoft Excel. In case any odd characters appear in the spreadsheet after importing a file, such as accented letters, then probably the iso-8859-1 encoding is not the best for your environment. This is probably because you are not using the Windows operating system or you are using a different spreadsheet. In case you are encountering this problem, look into the next section to find out how you can change this.&lt;br /&gt;
&lt;br /&gt;
* Openbravo has a decimal separator character, used to format numbers with decimals in the application. The Export to Spreadsheet functionality uses this character when exporting the file. This character is very important in some spreadsheets because it's used when importing a CSV file to detect whether a field should be treated as a number or not. In case a wrong decimal separator is chosen, numbers will be imported into the spreadsheet appliction as strings and problems will occur when trying to do mathematical operations on them. If you encounter this problem, you should check that your decimal separator is correctly configured in your Openbravo environment. [http://wiki.openbravo.com/wiki/Format.xml Here you can find more information] on how to configure the Format.xml file. If you are still interested in configuring the decimal separator of the exported files differently from the one used in the application, then check the next section to find out how to do it.&lt;br /&gt;
&lt;br /&gt;
* The file uses a specific character (which is the comma by default) to separate each field. This works flawlessly in general but in some spreadsheet applications it might be necessary to use a different one. Check the next section if you want to find out how to do it.&lt;br /&gt;
&lt;br /&gt;
* By default, dates and times are exported in UTC. To set a different time zone, create a ''Local Timezone ID'' preference with a valid value from [http://www.java2s.com/Tutorial/Java/0120__Development/GettingallthetimezonesIDs.htm this list]. This preference can be set at any visibility level from System to User, but not Window.&lt;br /&gt;
&lt;br /&gt;
=== Configuring export parameters in your Openbravo environment ===&lt;br /&gt;
&lt;br /&gt;
You can change the decimal separator, the field separator, and the encoding of the file you get when you use the Export to Spreadsheet functionality in Openbravo if you need them to be different from the default values.&lt;br /&gt;
&lt;br /&gt;
This is done via preferences. After logging in to Openbravo, go to the Preference window and do the following:&lt;br /&gt;
&lt;br /&gt;
* If you want to change the decimal separator: create a new record. Select the &amp;quot;CSV Decimal Separator&amp;quot; in the &amp;quot;Property&amp;quot; field. In the &amp;quot;value&amp;quot; field, type your selected decimal separator (for example, the comma character (,), or the decimal point (.)). Save the record.&lt;br /&gt;
&lt;br /&gt;
* If you want to change the field separator: create a new record. Select the &amp;quot;CSV Field Separator&amp;quot; in the &amp;quot;Property&amp;quot; field. In the &amp;quot;value&amp;quot; field, type your selected field separator. Save the record.&lt;br /&gt;
&lt;br /&gt;
* If you want to change the file encoding: create a new record. Select the &amp;quot;CSV Text Encoding&amp;quot; field in the &amp;quot;Property&amp;quot; field. In the &amp;quot;value&amp;quot; field, type the selected file encoding (for example, UTF-8 should work in most non-Windows non-Excel environments). Save the record.&lt;br /&gt;
&lt;br /&gt;
Since Openbravo 3.0PR14Q4, it also possible to define a header and/or footer text that will be included into any CSV file exported from the grid content. This text can be used, for example, for legal purposes (confidentiality of data, restrictions, etc.). This configuration is done via two new preferences: &amp;quot;CSV Header Message&amp;quot; and &amp;quot;CSV Footer Message&amp;quot; in the same way as described above. In the &amp;quot;value&amp;quot; field you can either specify any plain text or alternatively the search key of a  [[Message]] defined into the Application Dictionary. The former will directly include the plain text message into the CSV header or footer, and the latter will include the correspondent message's text, translating it to the user's language if available.&lt;br /&gt;
&lt;br /&gt;
After creating the preference (or preferences), log out of the application. Log in again, and try the Export to Spreadsheet functionality, to see the results.&lt;br /&gt;
&lt;br /&gt;
== Workspace &amp;amp; Widgets ==&lt;br /&gt;
[[Image:WIK_Workspace.png|thumbnail|right|150px|View larger]]&lt;br /&gt;
The first tab contains the Openbravo Workspace, a customized portal-style home page. This tab cannot be closed as its contents are essential. &lt;br /&gt;
&lt;br /&gt;
Widgets are customizable and the available set will be dependent on role and instance activation status.&lt;br /&gt;
&lt;br /&gt;
To add widgets, simply click the Add Widget&amp;gt;&amp;gt; link in the left column in the workspace and select from the library.&lt;br /&gt;
&lt;br /&gt;
=== Administrate widgets for other clients or roles ===&lt;br /&gt;
[[Image:WIK_AdminOthers.png|thumbnail|right|150px|View larger]]&lt;br /&gt;
&lt;br /&gt;
With the appropriate administrative rights, you can pick widgets for others users or clients in your organization. Via the Admin Others &amp;gt;&amp;gt; link on the left hand side of the workspace you can choose for which entity (client), organization or role you want to define a widget set.&lt;br /&gt;
&lt;br /&gt;
On the subsequent page you can then add widgets to this user´s / client´s workspace. Once done, click the Publish button to broadcast the selected widgets to the user(s) in the chosen entity/organization/role. The next time they log in, they will find the newly added widgets on their workspace.&lt;br /&gt;
&lt;br /&gt;
== Toolbar ==&lt;br /&gt;
The Toolbar contains two types of buttons: Action buttons (green) and Process buttons (orange). Actions are generic and can be applied to almost all selected records. Processes are record specific and depend on the record status and the active level (header or lines or lower).&lt;br /&gt;
&lt;br /&gt;
[[Image:WIK_Toolbar.png]]&lt;br /&gt;
&lt;br /&gt;
The action buttons perform the following actions:&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|[[Image:WIK_button_NewForm.png]]||'''New Form'''||''Create a new record in form view''||&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:WIK_button_InsertRow.png]]||'''Insert Row'''||''Insert a new row in grid view''||&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:WIK_button_Save.png]]||'''Save'''||''Save the record''||&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:WIK_button_SaveClose.png]]||'''Save and Close'''||''Save the record, close the form view and go back to the grid view''||&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:WIK_button_SaveCloseX.png]]||'''Close'''||''Close the record in form view and go back to the grid view''||&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:WIK_button_Cancel.png]]||'''Cancel'''||''Refresh the window and revert changes''||&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:WIK_button_Delete.png]]||'''Delete'''||''Delete the selected record(s)''||&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:WIK_button_Refresh.png]]||'''Refresh'''||''Refresh the window''||&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:WIK_button_Export.png]]||'''Export'''||''Export the grid to CSV format''||&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:WIK_button_Clone.png]]||'''Clone'''||''Clone the selected record(s) - (Only for Sales Orders)''||&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:WIK_button_Print.png]]||'''Print'''||''Print the selected record(s)''||&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:WIK_button_Email.png]]||'''Email'''||''Email the selected record(s)''||&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:WIK_button_Attach.png]]||'''Attach a File'''||''Attach a file to the active record''||&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:WIK_button_AttachOn.png]]||'''File(s) attached'''||''Attach a file. Status: file(s) attached.''||&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:WIK_button_Tree.png]]||'''Tree'''||''Rearrange account tree element value''||&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:WIK_button_URL.png]]||'''Create link'''||''Create a URL to the selected document that can be pasted into email or IM''||&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:WIK_button_Audit.png]]||'''Audit Trail'''||''Enable audit trail for this window (Basic and Professional Edition only)''||&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:WIK_button_PersonalizeForm.png]]||'''Personalize Form Layout'''||''Personalize the form layout (Basic and Professional Edition only)''||&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:WIK_button_SaveView.png]]||'''Save View'''||''Save and retrieve views (Basic and Professional Edition only)''||&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:WIK_button_Dunning.png]]||'''Dunning'''||''Apply dunning workflow (Commercial Extension Module)''||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Statusbar ==&lt;br /&gt;
[[Image:WIK_Statusbar.png]]&lt;br /&gt;
&lt;br /&gt;
The statusbar conveys the editing status of the document (New, Editing or Saved) together with a user-defined set of read-only attributes. These allow the user to get an overview of the document without having to scan the remainder of the form. The statusbar is only visible in form view. On the right side of the statusbar the following buttons are available:&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|[[Image:WIK_button_Next.png ]]||'''Browse to next record'''||&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:WIK_button_Previous.png ]]||'''Browse to previous record'''||&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:WIK_button_Max.png ]]||'''Maximize form'''||&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:WIK_button_Restore.png ]]||'''Restore form to previous size'''||&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:WIK_button_Close.png ]]||'''Close form (save and return to grid)'''||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== User Messages ==&lt;br /&gt;
User Messages are displayed centrally and their function is to inform or warn the user about some occurring situation in the application.&lt;br /&gt;
There are four different types of user messages. &lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|[[Image:WIK_message_Error.png]]||'''Error Message'''||&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:WIK_message_Success.png]]||'''Success Message'''||&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:WIK_message_Info.png]]||'''Info Message'''||&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:WIK_message_Warning.png]]||'''Warning Message'''||&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:WIK_message_Tip.png]]||'''Tip Message'''||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The messages can be hidden by clicking the little X icon in the top right of the message.&lt;br /&gt;
&lt;br /&gt;
== Sections ==&lt;br /&gt;
[[Image:WIK_Sections.png|thumbnail|right|150px|View larger]]&lt;br /&gt;
Forms contain sections that group assets such as linked items, notes, attachments and groups of related fields. Sections can be expanded and collapsed by clicking on their header or the ''twisti'' (triangle shaped icon).&lt;br /&gt;
&lt;br /&gt;
=== More Info ===&lt;br /&gt;
In this section the less frequently used fields are placed so they won´t bother you in the main part of the form.&lt;br /&gt;
&lt;br /&gt;
=== Audit ===&lt;br /&gt;
In this section the fields related to audit are placed. Just as for the More Info section, the reason they were tucked away here is to reduce the visual clutter in the main part of the form.&lt;br /&gt;
&lt;br /&gt;
=== Notes ===&lt;br /&gt;
[[Image:WIK_Notes.png|thumbnail|right|150px|View larger]]&lt;br /&gt;
In this section you can add notes related to the document. These could be notes to self or to colleagues. The bar on the left hand side is colored gray for your own notes and green for notes added by someone else. This way you can identify in one glimpse which notes aren't yours.&lt;br /&gt;
&lt;br /&gt;
=== Linked Items ===&lt;br /&gt;
[[Image:WIK_Linkeditems.png|thumbnail|right|150px|View larger]]&lt;br /&gt;
In this section all related documents to the active document are shown. The left column contains the window types with the amount of related documents shown in brackets. By selecting one of the window types to the left, the actual documents appear in the right column. The links are clickable and will launch the document on a new tab.&lt;br /&gt;
&lt;br /&gt;
=== Attachments ===&lt;br /&gt;
In this section the attachments to a record are stored. For more information on attachments and the API used to get attachments, refer [http://wiki.openbravo.com/wiki/Attachments here].&lt;br /&gt;
&lt;br /&gt;
Starting from '''3.0MP31''', it is possible to have a description for each attachment.&lt;br /&gt;
&lt;br /&gt;
== Keyboard Shortcuts ==&lt;br /&gt;
&lt;br /&gt;
This list is just a starting point. As it is virtually impossible to find the ideal set of keyboard shortcuts for all platforms and languages it is recommended to modify and create your own. You can do this in the General Setup&lt;/div&gt;</summary>
		<author><name>Wikiadmin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.infinite-erp.co.id/index.php?title=User_Interface_Introduction/id&amp;diff=4533</id>
		<title>User Interface Introduction/id</title>
		<link rel="alternate" type="text/html" href="https://wiki.infinite-erp.co.id/index.php?title=User_Interface_Introduction/id&amp;diff=4533"/>
		<updated>2026-08-28T12:20:10Z</updated>

		<summary type="html">&lt;p&gt;Wikiadmin: Create ID subpage stub (scaffold) for User Interface Introduction&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Languages}}&lt;br /&gt;
&lt;br /&gt;
== User Interface Introduction (Bahasa Indonesia) ==&lt;br /&gt;
&lt;br /&gt;
Halaman ini adalah terjemahan Bahasa Indonesia dari [[User Interface Introduction|User Interface Introduction]]. Isinya masih dalam pengerjaan (work in progress).&lt;br /&gt;
&lt;br /&gt;
Silakan bantu melengkapi terjemahan mengikuti panduan di [[Starting_Guide_for_Wiki_translators|Starting Guide for Wiki Translators]].&lt;br /&gt;
&lt;br /&gt;
[[Category:WorkInProgress]]&lt;/div&gt;</summary>
		<author><name>Wikiadmin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.infinite-erp.co.id/index.php?title=Client_Module/id&amp;diff=4531</id>
		<title>Client Module/id</title>
		<link rel="alternate" type="text/html" href="https://wiki.infinite-erp.co.id/index.php?title=Client_Module/id&amp;diff=4531"/>
		<updated>2026-08-28T12:20:09Z</updated>

		<summary type="html">&lt;p&gt;Wikiadmin: Create ID subpage stub (scaffold) for Client Module&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Languages}}&lt;br /&gt;
&lt;br /&gt;
== Client Module (Bahasa Indonesia) ==&lt;br /&gt;
&lt;br /&gt;
Halaman ini adalah terjemahan Bahasa Indonesia dari [[Client Module|Client Module]]. Isinya masih dalam pengerjaan (work in progress).&lt;br /&gt;
&lt;br /&gt;
Silakan bantu melengkapi terjemahan mengikuti panduan di [[Starting_Guide_for_Wiki_translators|Starting Guide for Wiki Translators]].&lt;br /&gt;
&lt;br /&gt;
[[Category:WorkInProgress]]&lt;/div&gt;</summary>
		<author><name>Wikiadmin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.infinite-erp.co.id/index.php?title=Client_Module&amp;diff=4532</id>
		<title>Client Module</title>
		<link rel="alternate" type="text/html" href="https://wiki.infinite-erp.co.id/index.php?title=Client_Module&amp;diff=4532"/>
		<updated>2026-08-28T12:20:09Z</updated>

		<summary type="html">&lt;p&gt;Wikiadmin: Add {{Languages}} switcher (EN) for ID subpage&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Languages}}&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
Halaman ini mencatat dokumentasi penting terkait module-module khusus yang dibuat untuk klien secara khusus dan tidak digunakan untuk klien lainnya. Nama klien menggunakan kode khusus agar tidak ter-ekpose.&lt;br /&gt;
&lt;br /&gt;
= List of client module =&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Client Code !! Module Name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| IDL || [[IDL TSM | TSM]] || module untuk menghitung target stock maksimum, menentukan target growth penjualan&lt;br /&gt;
|-&lt;br /&gt;
| TCI || [[Customer Specific TCI Quality Control | Quality Control]] || module quality control check untuk IPQC dan OQC&lt;br /&gt;
|-&lt;br /&gt;
| RUS || Example || Example&lt;br /&gt;
|-&lt;br /&gt;
| TVB || [[TVB]]|| Example&lt;br /&gt;
|-&lt;br /&gt;
| KFS || Example || Example&lt;br /&gt;
|-&lt;br /&gt;
| SS || [[Shipping Agency]]|| Shipping Agency&lt;br /&gt;
|-&lt;br /&gt;
| Infinite || [[infinite]] || Module&lt;br /&gt;
|-&lt;br /&gt;
| Example || Example || Example&lt;br /&gt;
|-&lt;br /&gt;
| Example || Example || Example&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Client_Module]]&lt;/div&gt;</summary>
		<author><name>Wikiadmin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.infinite-erp.co.id/index.php?title=Integration/id&amp;diff=4529</id>
		<title>Integration/id</title>
		<link rel="alternate" type="text/html" href="https://wiki.infinite-erp.co.id/index.php?title=Integration/id&amp;diff=4529"/>
		<updated>2026-08-28T12:20:08Z</updated>

		<summary type="html">&lt;p&gt;Wikiadmin: Create ID subpage stub (scaffold) for Integration&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Languages}}&lt;br /&gt;
&lt;br /&gt;
== Integration (Bahasa Indonesia) ==&lt;br /&gt;
&lt;br /&gt;
Halaman ini adalah terjemahan Bahasa Indonesia dari [[Integration|Integration]]. Isinya masih dalam pengerjaan (work in progress).&lt;br /&gt;
&lt;br /&gt;
Silakan bantu melengkapi terjemahan mengikuti panduan di [[Starting_Guide_for_Wiki_translators|Starting Guide for Wiki Translators]].&lt;br /&gt;
&lt;br /&gt;
[[Category:WorkInProgress]]&lt;/div&gt;</summary>
		<author><name>Wikiadmin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.infinite-erp.co.id/index.php?title=Integration&amp;diff=4530</id>
		<title>Integration</title>
		<link rel="alternate" type="text/html" href="https://wiki.infinite-erp.co.id/index.php?title=Integration&amp;diff=4530"/>
		<updated>2026-08-28T12:20:08Z</updated>

		<summary type="html">&lt;p&gt;Wikiadmin: Add {{Languages}} switcher (EN) for ID subpage&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Languages}}&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
In an organization, more than one software application often exists to support a particular aspect of operational requirements. The result is an heterogeneous set of software applications requiring data sharing and integration. An ERP system like [http://www.infinite-erp.co.id InfiniteERP] tries to solve this problem by offering one solution for every operational requirement. &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.infinite-erp.co.id InfiniteERP] maintains one shared database for all data, integrated processes among different departments, a consistent interface for every user, and homogeneous reports/score cards that display operational data of the whole organization. &lt;br /&gt;
&lt;br /&gt;
== Integration overview ==&lt;br /&gt;
The focus of this integration is to create a system where [http://www.infinite-erp.co.id InfiniteERP] is the central repository of data. Products, categories and orders are maintained and other application or services has the ability to operate with the products catalog downloaded from InfiniteERP and to upload such as orders or other transaction created through Web Services/API. &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This integration has been developed with webservices. [http://www.infinite-erp.co.id InfiniteERP] has two webservice endpoints called ExternalSales and WebService.&lt;br /&gt;
&lt;br /&gt;
== Devices Integration ==&lt;br /&gt;
&lt;br /&gt;
=== Produk dari Solution ===&lt;br /&gt;
&lt;br /&gt;
Device yang telah di support:&lt;br /&gt;
* Solution X100-C&lt;br /&gt;
** Firmware Version: Ver 8.0.4.6-20220121&lt;br /&gt;
** Firmware Version: Ver 8.0.4.6-20220616&lt;br /&gt;
* Solution X606-S&lt;br /&gt;
** Ver 8.0.4.5-20200408&lt;br /&gt;
** Ver 8.0.4.6-20220704&lt;br /&gt;
** Ver 8.0.4.6-20220704&lt;br /&gt;
&lt;br /&gt;
Adalah Mesin Absensi Sidik Jari yang di produksi oleh https://solution.co.id/ &lt;br /&gt;
Mesin ini memiliki fitur cloud ADMS dimana mesin bisa mengirimkan data absen secara realtime ke server.&lt;br /&gt;
Tim InfiniteERP telah berhasil mengembangkan server ADMS mandiri sehingga bisa integrasi langsung dengan module HRIS secara realtime.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Document Link from Solution.co.id ====&lt;br /&gt;
* SDK OLD Black &amp;amp; White : http://www.mediafire.com/file/k2vq0s06xx4a7d4/SDK_OLD_Black%2526White.rar/file&lt;br /&gt;
* New SDK Colour : http://www.mediafire.com/file/hnknf18leiv9qzi/NEW_SDK_Colour.rar/file&lt;br /&gt;
* WEB SDK : http://www.mediafire.com/file/0wotxt4fkzhtcoz/WEB_SDK.rar/file&lt;br /&gt;
* Push SDK : http://www.mediafire.com/file/tslhandv3utz8fx/pushsdk.rar/file&lt;br /&gt;
* New Push SDK : https://www.mediafire.com/file/51l70rzvgax6xr4/New_push-sdk.zip/file&lt;br /&gt;
&lt;br /&gt;
= Roadmap =&lt;br /&gt;
&lt;br /&gt;
Here the list of planned integration with other platform.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! No !! Application/Services !! Description !! Status&lt;br /&gt;
|-&lt;br /&gt;
| 1|| [[Projects/Integration Yasmeera Webstore|Yasmeera Webstore]] || Customer specific webstore || '''''Inprogress'''''&lt;br /&gt;
|-&lt;br /&gt;
| 2|| [[Projects/Integration SabilaMall.co.id | SabilaMall.co.id ]] || Local market place || '''''Inprogress'''''&lt;br /&gt;
|-&lt;br /&gt;
| 3|| [[Projects/Integration WooCommerce | WooCommerce]] || Open-source eCommerce platform built on WordPress || '''''Inprogress'''''&lt;br /&gt;
|-&lt;br /&gt;
| 4|| Tokopedia || Market Place || Planned&lt;br /&gt;
|-&lt;br /&gt;
| 5|| Shopee || Market Place || Planned&lt;br /&gt;
|-&lt;br /&gt;
| 6|| [[Projects/Integration AuraMuslim.co.id | AuraMuslim.id ]] || Local Market Place || '''''Inprogress'''''&lt;br /&gt;
|-&lt;br /&gt;
| 7|| [[Projects/Integration Moota.co | Moota.co ]] || Layanan Online Check Mutasi Rekening Bank dalam satu sistem || '''''Inprogress'''''&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Wikiadmin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.infinite-erp.co.id/index.php?title=Others_Application&amp;diff=4528</id>
		<title>Others Application</title>
		<link rel="alternate" type="text/html" href="https://wiki.infinite-erp.co.id/index.php?title=Others_Application&amp;diff=4528"/>
		<updated>2026-08-28T12:20:07Z</updated>

		<summary type="html">&lt;p&gt;Wikiadmin: Add {{Languages}} switcher (EN) for ID subpage&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Languages}}&lt;br /&gt;
&lt;br /&gt;
{{WorkInProgress}}&lt;br /&gt;
&lt;br /&gt;
= '''Introduction''' =&lt;br /&gt;
InfiniteERP memiliki beberapa aplikasi lain yang mendukung fungsi operasional bisnis, dapat berupa dekstop application ataupun module tambahan berupa aplikasi berbasis web.&lt;br /&gt;
Tidak menutup kemungkinan, aplikasi ini didesain secara specific untuk client perusahaan tertentu karena kebutuhan khusus.&lt;br /&gt;
&lt;br /&gt;
= '''Daftar aplikasi pendukung''' =&lt;br /&gt;
Daftar semua aplikasi yang dibuat untuk mensupport InfiniteERP:&lt;br /&gt;
== '''Attendance Synchronization''' ==&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Aplikasi ini berfungsi untuk menarik data absen karyawan dari mesin absen kemudian di upload ke window [[Attendance Entry | Attendance Entry]].&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
Terdapat 2 jenis aplikasi untuk memenuhi kebutuhan pelanggan agar proses otomasi penarikan data absensi karyawan dari mesin dapat dilakukan dengan baik.&lt;br /&gt;
# Aplikasi Desktop yang diinstall didalam jaringan komputer pada perusahaan klien.&lt;br /&gt;
# Aplikasi server&lt;br /&gt;
&lt;br /&gt;
== Production and Shipping apps ==&lt;br /&gt;
&lt;br /&gt;
== '''Infinte ERP Apps''' ==&lt;br /&gt;
===Infinte ERP Apps Content===&lt;br /&gt;
# POS&lt;br /&gt;
# Shipment&lt;br /&gt;
# Inventory&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
===InfiniteERP Apps Address===&lt;br /&gt;
&amp;lt;/p&amp;gt; &lt;br /&gt;
*apps for development https://dev-sg1.infinite-erp.co.id/&lt;br /&gt;
*app for production https://app-sg1.infinite-erp.co.id/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Infinte ERP Apps Setup===&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Login user erpadmin&lt;br /&gt;
**After Login change Organization used to desired Organization&lt;br /&gt;
*Go To Menu Administrator&lt;br /&gt;
**[[Image:Admnistartor.jpg]]&lt;br /&gt;
*Define Organization&lt;br /&gt;
**Organization is refer to ERP Organization&lt;br /&gt;
*Define Role &amp;amp; User&lt;br /&gt;
*Role is not Linked to ERP, only User is linked to ERP&lt;br /&gt;
*Please ensure Role at ERP on the user have been granted&lt;br /&gt;
[[Image:API_Access.jpg|500px]]&lt;br /&gt;
*Define Access related to User&lt;br /&gt;
*Done&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''User Guide'''&lt;br /&gt;
* Video setup tutorial link&lt;br /&gt;
* https://drive.google.com/file/d/163ryLybqeb0VY_JSv0lmY9mzeHBRi6DI/view?usp=sharing&lt;br /&gt;
&lt;br /&gt;
== '''Manage Infinite Apps ERP at pm2''' ==&lt;br /&gt;
===Introduction===&lt;br /&gt;
&amp;lt;p&amp;gt; To manage application at pm2 we using software Putty. &lt;br /&gt;
&amp;lt;br&amp;gt;Once login, please select '''hostxx.infinite-erp.co.id''' at PuTTy configuration. &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Image:puTTy_configuration.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Following command is to enter the root&lt;br /&gt;
&amp;lt;pre&amp;gt;''sudo su''&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Following command is to know the list application on pm2 in tablet&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;pm2 list&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Start &amp;amp; Stop===&lt;br /&gt;
'''To Stop''' &lt;br /&gt;
&amp;lt;pre&amp;gt;pm2 stop &amp;lt;name&amp;gt; &amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;'''To Start''' &lt;br /&gt;
&amp;lt;pre&amp;gt;pm2 start &amp;lt;name&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;'''Additional command'''&lt;br /&gt;
if any error on the status you can check the log&lt;br /&gt;
&amp;lt;pre&amp;gt;pm2 logs &amp;lt;name&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Delete &amp;amp; Add Apps===&lt;br /&gt;
&amp;lt;p&amp;gt;'''To Delete'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pm2 delete &amp;lt;name&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;'''To Add '''&lt;br /&gt;
&amp;lt;br&amp;gt; Following are several sequence command to type&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd appl←&lt;br /&gt;
ls←&lt;br /&gt;
cd infinteerp-v2←&lt;br /&gt;
ls←&lt;br /&gt;
cd dev←&lt;br /&gt;
ls←&lt;br /&gt;
cd infiniteapps←&lt;br /&gt;
ls←&lt;br /&gt;
nano pm2-apps-prod.json←&lt;br /&gt;
pm2 start pm2-apps-prod.json←&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Additional command to check database configuration&lt;br /&gt;
&amp;lt;pre&amp;gt;nano .env&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== '''Budibase''' ==&lt;br /&gt;
===Introduction===&lt;br /&gt;
Budibase adalah platform pengembangan yang dirancang untuk kecepatan dan produktivitas. Dengan Budibase, pengembang tidak lagi mengalami pengulangan, siklus pengembangan yang panjang, dan frustrasi. Sebaliknya, pengembang lebih produktif, lebih bahagia, dan dapat menghadirkan aplikasi yang mereka banggakan dalam hitungan menit.&lt;br /&gt;
=== Integrasi Infinite ERP dengan Budibase dengan API ===&lt;br /&gt;
==== [[Setup API]] ====&lt;br /&gt;
Dalam artikel ini akan dijelaskan bagimana mengintegrasikan Infinite ERP dengan budibase menggunakan API, sehingga data dapat di kelola menggunakan aplikasi yang di buat dari budibase.&lt;br /&gt;
&lt;br /&gt;
* Add Source kemudian pilih&lt;br /&gt;
* Rest API&lt;br /&gt;
* buat Authentication untuk mengakses API Infinite ERP sesuai dengan akun yang telah di buat di infinite ERP&lt;br /&gt;
==== [[Membuat Query]] ====&lt;br /&gt;
* Kemudian add Query&lt;br /&gt;
* Pada bagian ini tentukan endpoint dan metode yang akan digunakan, dalam contoh ini akan menggunakan API Purchase Order infinite ERP dan metode yang digunakan adalah 'get' [[file: budibase1.png|800px]]&amp;lt;br&amp;gt;&lt;br /&gt;
# Pilih metode dalam hal ini adalah &amp;lt;pre&amp;gt;get&amp;lt;/pre&amp;gt;&lt;br /&gt;
# Isikan endpoint dalam hal ini &amp;lt;pre&amp;gt;https://my.infinite-erp.co.id/infinite/org.openbravo.service.json.jsonrest/Order&amp;lt;/pre&amp;gt;&lt;br /&gt;
# Pilih Authentication&lt;br /&gt;
# Pada bagian tab Transformer ganti code dengan code berikut ini &amp;lt;pre&amp;gt;return data.response.data&amp;lt;/pre&amp;gt; fungsi ini untuk menampilkan response JSON menjadi schema atau kolom, sihingga data dapat di tampilkan pada table atau data provider budibase&lt;br /&gt;
# Pilih Save untuk menyimpan perubahan&lt;br /&gt;
==== [[Test API]]  ====&lt;br /&gt;
# Kemudian klik tombol send untuk mencoba, jika berhasil akan menampilkan result seperti berikut ini [[file: result respons API.png|800px]]&amp;lt;br&amp;gt; &lt;br /&gt;
# Berikut ini merupakan tampilan schema yang nantinya akan di tampilkan pada table view [[file: Reponse schema.png|800px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Membuat aplikasi dengan Budibase ===&lt;br /&gt;
==== [[Design]] ====&lt;br /&gt;
# Masih di halaman yang sama, pilih tab Design&lt;br /&gt;
# Pilih add screen&lt;br /&gt;
# Pilih Blank screen, lalu continue&lt;br /&gt;
# Pada bagian Screen details, isikan nama screen dan continue lagi&lt;br /&gt;
# Pada bagian Autogenerated screens, pilih basic saja kemudian done&lt;br /&gt;
==== [[Menambahkan nama menu ke navigation]] ====&lt;br /&gt;
[[file: membuat menu baru.png|800px]]&amp;lt;br&amp;gt;&lt;br /&gt;
# Pilih Navigation&lt;br /&gt;
# Pilih Configure Links&lt;br /&gt;
# Add link&lt;br /&gt;
# Isikan Nama Menu&lt;br /&gt;
# Pilih URL&lt;br /&gt;
# Kemudian pilih Save&lt;br /&gt;
&lt;br /&gt;
==== [[Menampilkan data di table View]] ====&lt;br /&gt;
* Pastikan aktif pada menu screen yang telah di buat&lt;br /&gt;
* Add component&lt;br /&gt;
* Pilih Container &lt;br /&gt;
* Kemudian add component lagi&lt;br /&gt;
* Pilih data provider&lt;br /&gt;
* Lalu add component lagi&lt;br /&gt;
* Pilih New table&lt;br /&gt;
jika di lihat pada susunan component akan tampak seperti pada gambar berikut ini :&lt;br /&gt;
[[file: component.png|800px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== [[Custom Kolom table View]] ====&lt;br /&gt;
[[file: configure_column.png|800px]]&amp;lt;br&amp;gt;&lt;br /&gt;
# Pilih component table&lt;br /&gt;
# Configure Columns&lt;br /&gt;
# Add All Columns&lt;br /&gt;
&lt;br /&gt;
[[file: configure_columns1.png|800px]]&amp;lt;br&amp;gt;&lt;br /&gt;
* Pada bagian ini pengguna dapat menghapus column yang tidak di perlu di tampilkan, cara nya dengan meng click tanda silang.&lt;br /&gt;
* Label : Pengguna juga dapat meng edit nama column sesuai dengan yang di inginkan&lt;br /&gt;
* Jika sudah click Save&lt;br /&gt;
&lt;br /&gt;
==== [[Filter Data pada Table View]] ====&lt;br /&gt;
&lt;br /&gt;
[[file: define_filter.png|800px]]&amp;lt;br&amp;gt;&lt;br /&gt;
* Pilih Data Provider&lt;br /&gt;
* Define Filters&lt;br /&gt;
* Pilih Column yang akan menjadi parameter lalu&lt;br /&gt;
* Isikan Value dan&lt;br /&gt;
* Save&lt;br /&gt;
&lt;br /&gt;
Pengguna dapat menambahkan beberapa filter sesuai dengan kebutuhan. &lt;br /&gt;
Mirip dengan pengurutan, pemfilteran akan dilakukan di sisi server untuk sumber data SQL dan DB Budibase internal, namun untuk kueri khusus, pemfilteran akan dilakukan di sisi klien. Jadi saat menggunakan kueri khusus, Anda disarankan untuk memberikan filter apa pun dalam kueri.&lt;br /&gt;
&lt;br /&gt;
==== [[Implementasi API Approval]] ====&lt;br /&gt;
Pada implementasi API Approval teknik yang digunakan adalah Bindings&lt;br /&gt;
Budibase fokus membangun aplikasi yang berpusat pada data - untuk dapat melakukan hal tersebut diperlukan suatu cara untuk memanipulasi data. Untuk melakukan ini, Budibase memiliki kemampuan untuk bind data ke dalam elemen desain atau otomasi apa pun melalui penggunaan sintaks Handlebars atau JavaScript.&lt;br /&gt;
&lt;br /&gt;
===== [[Tips dan Trik]] =====&lt;br /&gt;
Penting untuk diingat bahwa Handlebars memungkinkan pernyataan yang cukup rumit, yang dapat menggunakan logika komparatif (terutama dengan pembantu perbandingan kami). Di bawah ini kami telah merinci beberapa tip yang akan membantu Anda memulai dengan sintaks binding dan Handlebars. &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Wikiadmin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.infinite-erp.co.id/index.php?title=Others_Application/id&amp;diff=4527</id>
		<title>Others Application/id</title>
		<link rel="alternate" type="text/html" href="https://wiki.infinite-erp.co.id/index.php?title=Others_Application/id&amp;diff=4527"/>
		<updated>2026-08-28T12:20:06Z</updated>

		<summary type="html">&lt;p&gt;Wikiadmin: Create ID subpage stub (scaffold) for Others Application&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Languages}}&lt;br /&gt;
&lt;br /&gt;
== Others Application (Bahasa Indonesia) ==&lt;br /&gt;
&lt;br /&gt;
Halaman ini adalah terjemahan Bahasa Indonesia dari [[Others Application|Others Application]]. Isinya masih dalam pengerjaan (work in progress).&lt;br /&gt;
&lt;br /&gt;
Silakan bantu melengkapi terjemahan mengikuti panduan di [[Starting_Guide_for_Wiki_translators|Starting Guide for Wiki Translators]].&lt;br /&gt;
&lt;br /&gt;
[[Category:WorkInProgress]]&lt;/div&gt;</summary>
		<author><name>Wikiadmin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.infinite-erp.co.id/index.php?title=Background_Processes/id&amp;diff=4525</id>
		<title>Background Processes/id</title>
		<link rel="alternate" type="text/html" href="https://wiki.infinite-erp.co.id/index.php?title=Background_Processes/id&amp;diff=4525"/>
		<updated>2026-08-28T12:20:05Z</updated>

		<summary type="html">&lt;p&gt;Wikiadmin: Create ID subpage stub (scaffold) for Background Processes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Languages}}&lt;br /&gt;
&lt;br /&gt;
== Background Processes (Bahasa Indonesia) ==&lt;br /&gt;
&lt;br /&gt;
Halaman ini adalah terjemahan Bahasa Indonesia dari [[Background Processes|Background Processes]]. Isinya masih dalam pengerjaan (work in progress).&lt;br /&gt;
&lt;br /&gt;
Silakan bantu melengkapi terjemahan mengikuti panduan di [[Starting_Guide_for_Wiki_translators|Starting Guide for Wiki Translators]].&lt;br /&gt;
&lt;br /&gt;
[[Category:WorkInProgress]]&lt;/div&gt;</summary>
		<author><name>Wikiadmin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.infinite-erp.co.id/index.php?title=Background_Processes&amp;diff=4526</id>
		<title>Background Processes</title>
		<link rel="alternate" type="text/html" href="https://wiki.infinite-erp.co.id/index.php?title=Background_Processes&amp;diff=4526"/>
		<updated>2026-08-28T12:20:05Z</updated>

		<summary type="html">&lt;p&gt;Wikiadmin: Add {{Languages}} switcher (EN) for ID subpage&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Languages}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
InfiniteERP memiliki banyak Background Process didalamnya, yang digunakan untuk melakukan beberapa proses secara terjadwal.&amp;lt;br&amp;gt;&lt;br /&gt;
Dalam implementasi ERP dapat ditemukan kebutuhan khusus untuk masing-masing klien yang berbeda maupun customized secara umum yang digunakan oleh semua klien.&lt;br /&gt;
&lt;br /&gt;
= Daftar Background Processes =&lt;br /&gt;
&lt;br /&gt;
== Attendance Processing ==&lt;br /&gt;
&lt;br /&gt;
Adalah proses pengolahan data absen yang diterima di ERP dari mesin absen dan diolah untuk menghitung jam kerja, lembur dan keterlambatan masuk kerja dan aturan lainnya yang dimiliki perusahaan.&lt;br /&gt;
Pada proses ini akan membentuk data baru hasil pengolahan yang dapat dilihat di menu window Attendance Entry.&lt;br /&gt;
&lt;br /&gt;
InfiniteERP sudah memiliki ADMS Server yang sudah secara otomatis memiliki kemampuan menerima data absen secara realtime dari mesin produk dari X-Solution.&lt;br /&gt;
Selengkapnya dapat ditemukan disini [[Integration#Devices_Integration|Device Integration]]&lt;br /&gt;
&lt;br /&gt;
== MRP Purchase Plan (IDOLMART) ==&lt;br /&gt;
== Delete Double Payment Plan SO ==&lt;br /&gt;
* Problem&lt;br /&gt;
Terjadi double payment plan di Sales Order, sehingga Sales Order tidak dapat di Complete&lt;br /&gt;
&lt;br /&gt;
* Problem Solved&lt;br /&gt;
Run background atau process request Delete Double Payment Plan SO untuk men delete dan menyisakan satu record Payment plan saja&lt;br /&gt;
&lt;br /&gt;
== Delete Item Double Sales Order ==&lt;br /&gt;
* Problem&lt;br /&gt;
Terjadi double item di sales order hasil dari sync POS&lt;br /&gt;
&lt;br /&gt;
* Problem Solved&lt;br /&gt;
Run background atau process request Delete Item Double Sales Order untuk men delete dan menyisakan satu record Payment plan saja&lt;br /&gt;
&lt;br /&gt;
== Auto Closed Sales Orders ==&lt;br /&gt;
Berfungsi untuk merubah status [[Sales Order | Sales Order]] dari Completed menjadi Closed berdasarkan umur Sales Order dalam hitungan Hari (Days).&lt;br /&gt;
&lt;br /&gt;
=== Use Case Scenario ===&lt;br /&gt;
&lt;br /&gt;
* Perusahaan tidak ingin lagi memproses Sales Order yang sudah diterima meskipun tidak semua Order dapat dipenuhi. &lt;br /&gt;
* Dalam hal ini Order Quantity pada Sales Order Lines akan disamakan jumlahnya dengan Delivery Quantity sehingga tidak ada lagi Order yang outstanding atau pending delivery.&lt;br /&gt;
&lt;br /&gt;
=== Parameter Setup ===&lt;br /&gt;
Berikut parameter yang harus di setup pada window [[Preference | Preference]] :&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Attribute !! Data Type !! Value !! Sample Value&lt;br /&gt;
|-&lt;br /&gt;
| AutoCloseOrderBackground_ageso || Numeric || Number of days || 30&lt;br /&gt;
|-&lt;br /&gt;
| AutoCloseOrderBackground_docType || ID || Document Type ID || 'AF09244D39B24847928C73AE7692E410'&lt;br /&gt;
|-&lt;br /&gt;
| AutoCloseOrderBackground_isSo || Yes/No || Y or N || Y&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Screen Reference ===&lt;br /&gt;
&lt;br /&gt;
==== AutoCloseOrderBackground_docType ====&lt;br /&gt;
[[File: AutoCloseSalesOrder_background_1.png| 800px]]&lt;br /&gt;
&lt;br /&gt;
==== AutoCloseOrderBackground_ageso ====&lt;br /&gt;
[[File: AutoCloseSalesOrder_background_2.png| 800px]]&lt;br /&gt;
&lt;br /&gt;
==== AutoCloseOrderBackground_isSo ====&lt;br /&gt;
[[File: AutoCloseSalesOrder_background_3.png| 800px]]&lt;/div&gt;</summary>
		<author><name>Wikiadmin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.infinite-erp.co.id/index.php?title=Customer_Specific_Windows/id&amp;diff=4523</id>
		<title>Customer Specific Windows/id</title>
		<link rel="alternate" type="text/html" href="https://wiki.infinite-erp.co.id/index.php?title=Customer_Specific_Windows/id&amp;diff=4523"/>
		<updated>2026-08-28T12:20:04Z</updated>

		<summary type="html">&lt;p&gt;Wikiadmin: Create ID subpage stub (scaffold) for Customer Specific Windows&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Languages}}&lt;br /&gt;
&lt;br /&gt;
== Customer Specific Windows (Bahasa Indonesia) ==&lt;br /&gt;
&lt;br /&gt;
Halaman ini adalah terjemahan Bahasa Indonesia dari [[Customer Specific Windows|Customer Specific Windows]]. Isinya masih dalam pengerjaan (work in progress).&lt;br /&gt;
&lt;br /&gt;
Silakan bantu melengkapi terjemahan mengikuti panduan di [[Starting_Guide_for_Wiki_translators|Starting Guide for Wiki Translators]].&lt;br /&gt;
&lt;br /&gt;
[[Category:WorkInProgress]]&lt;/div&gt;</summary>
		<author><name>Wikiadmin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.infinite-erp.co.id/index.php?title=Customer_Specific_Windows&amp;diff=4524</id>
		<title>Customer Specific Windows</title>
		<link rel="alternate" type="text/html" href="https://wiki.infinite-erp.co.id/index.php?title=Customer_Specific_Windows&amp;diff=4524"/>
		<updated>2026-08-28T12:20:04Z</updated>

		<summary type="html">&lt;p&gt;Wikiadmin: Add {{Languages}} switcher (EN) for ID subpage&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Languages}}&lt;br /&gt;
&lt;br /&gt;
== Window ==&lt;br /&gt;
* [[Shipment Tracking Entry]]&lt;br /&gt;
* [[ROP Sugestion]]&lt;br /&gt;
* [[Approval Role]]&lt;br /&gt;
* [[Backlog Shipment]]&lt;br /&gt;
* [[Employee Salary View]]&lt;br /&gt;
* [[Custom SOA Monthly]]&lt;br /&gt;
* [[Bank Salary Payment Report]]&lt;br /&gt;
&lt;br /&gt;
== Report ==&lt;br /&gt;
&lt;br /&gt;
[[Payables Aging Schedule Default Org:Payables Aging Schedule Default Org]]&lt;/div&gt;</summary>
		<author><name>Wikiadmin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.infinite-erp.co.id/index.php?title=Google_Sheets_Dev&amp;diff=4522</id>
		<title>Google Sheets Dev</title>
		<link rel="alternate" type="text/html" href="https://wiki.infinite-erp.co.id/index.php?title=Google_Sheets_Dev&amp;diff=4522"/>
		<updated>2026-08-28T12:20:03Z</updated>

		<summary type="html">&lt;p&gt;Wikiadmin: Add {{Languages}} switcher (EN) for ID subpage&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Languages}}&lt;br /&gt;
&lt;br /&gt;
= Intoduction =&lt;br /&gt;
Terkadang kita perlu melakukan simulasi dan berbagai ujicoba data maupun me-modelkan database ataupun  untuk berbagai keperluan lain yang memanfaatkan Google Sheets; Dan halaman ini mencatat berbagai tips &amp;amp; trick serta formula yang biasa digunakan untuk menyelesaikan berbagai masalah di google sheets.&lt;br /&gt;
&lt;br /&gt;
= How to? =&lt;br /&gt;
&lt;br /&gt;
= Tips &amp;amp; Tricks =&lt;/div&gt;</summary>
		<author><name>Wikiadmin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.infinite-erp.co.id/index.php?title=Google_Sheets_Dev/id&amp;diff=4521</id>
		<title>Google Sheets Dev/id</title>
		<link rel="alternate" type="text/html" href="https://wiki.infinite-erp.co.id/index.php?title=Google_Sheets_Dev/id&amp;diff=4521"/>
		<updated>2026-08-28T12:20:02Z</updated>

		<summary type="html">&lt;p&gt;Wikiadmin: Create ID subpage stub (scaffold) for Google Sheets Dev&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Languages}}&lt;br /&gt;
&lt;br /&gt;
== Google Sheets Dev (Bahasa Indonesia) ==&lt;br /&gt;
&lt;br /&gt;
Halaman ini adalah terjemahan Bahasa Indonesia dari [[Google Sheets Dev|Google Sheets Dev]]. Isinya masih dalam pengerjaan (work in progress).&lt;br /&gt;
&lt;br /&gt;
Silakan bantu melengkapi terjemahan mengikuti panduan di [[Starting_Guide_for_Wiki_translators|Starting Guide for Wiki Translators]].&lt;br /&gt;
&lt;br /&gt;
[[Category:WorkInProgress]]&lt;/div&gt;</summary>
		<author><name>Wikiadmin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.infinite-erp.co.id/index.php?title=MariaDB/id&amp;diff=4519</id>
		<title>MariaDB/id</title>
		<link rel="alternate" type="text/html" href="https://wiki.infinite-erp.co.id/index.php?title=MariaDB/id&amp;diff=4519"/>
		<updated>2026-08-28T12:20:01Z</updated>

		<summary type="html">&lt;p&gt;Wikiadmin: Create ID subpage stub (scaffold) for MariaDB&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Languages}}&lt;br /&gt;
&lt;br /&gt;
== MariaDB (Bahasa Indonesia) ==&lt;br /&gt;
&lt;br /&gt;
Halaman ini adalah terjemahan Bahasa Indonesia dari [[MariaDB|MariaDB]]. Isinya masih dalam pengerjaan (work in progress).&lt;br /&gt;
&lt;br /&gt;
Silakan bantu melengkapi terjemahan mengikuti panduan di [[Starting_Guide_for_Wiki_translators|Starting Guide for Wiki Translators]].&lt;br /&gt;
&lt;br /&gt;
[[Category:WorkInProgress]]&lt;/div&gt;</summary>
		<author><name>Wikiadmin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.infinite-erp.co.id/index.php?title=MariaDB&amp;diff=4520</id>
		<title>MariaDB</title>
		<link rel="alternate" type="text/html" href="https://wiki.infinite-erp.co.id/index.php?title=MariaDB&amp;diff=4520"/>
		<updated>2026-08-28T12:20:01Z</updated>

		<summary type="html">&lt;p&gt;Wikiadmin: Add {{Languages}} switcher (EN) for ID subpage&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Languages}}&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
= Database Maintenance and Monitoring script =&lt;br /&gt;
&lt;br /&gt;
== Backup &amp;amp; Restore ==&lt;br /&gt;
&lt;br /&gt;
refer to https://mariadb.com/docs/recovery/backup-optimization/&lt;br /&gt;
&lt;br /&gt;
* Take a full backup:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo mariabackup --backup \&lt;br /&gt;
      --user=root \&lt;br /&gt;
      --password=P@ssw0rdINDO7Kali \&lt;br /&gt;
      --target-dir=/home/backup/db&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Confirm successful completion of the backup operation.&lt;br /&gt;
&lt;br /&gt;
* The backup must be prepared:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo mariabackup --prepare \&lt;br /&gt;
      --target-dir=/home/backup/db&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Confirm successful completion of the prepare operation.&lt;br /&gt;
&lt;br /&gt;
== Monitor Index status dan size for optimization ==&lt;br /&gt;
&lt;br /&gt;
== Monitor Cache Hit Ratio ==&lt;br /&gt;
&lt;br /&gt;
== Monitoring Database Query Performance ==&lt;br /&gt;
&lt;br /&gt;
== Locks held by Open Transactions ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Check Trigger Status ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= How to =&lt;br /&gt;
&lt;br /&gt;
[[Category:Database_Maintenance]]&lt;/div&gt;</summary>
		<author><name>Wikiadmin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.infinite-erp.co.id/index.php?title=PostgreSQL/id&amp;diff=4517</id>
		<title>PostgreSQL/id</title>
		<link rel="alternate" type="text/html" href="https://wiki.infinite-erp.co.id/index.php?title=PostgreSQL/id&amp;diff=4517"/>
		<updated>2026-08-28T12:20:00Z</updated>

		<summary type="html">&lt;p&gt;Wikiadmin: Create ID subpage stub (scaffold) for PostgreSQL&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Languages}}&lt;br /&gt;
&lt;br /&gt;
== PostgreSQL (Bahasa Indonesia) ==&lt;br /&gt;
&lt;br /&gt;
Halaman ini adalah terjemahan Bahasa Indonesia dari [[PostgreSQL|PostgreSQL]]. Isinya masih dalam pengerjaan (work in progress).&lt;br /&gt;
&lt;br /&gt;
Silakan bantu melengkapi terjemahan mengikuti panduan di [[Starting_Guide_for_Wiki_translators|Starting Guide for Wiki Translators]].&lt;br /&gt;
&lt;br /&gt;
[[Category:WorkInProgress]]&lt;/div&gt;</summary>
		<author><name>Wikiadmin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.infinite-erp.co.id/index.php?title=PostgreSQL&amp;diff=4518</id>
		<title>PostgreSQL</title>
		<link rel="alternate" type="text/html" href="https://wiki.infinite-erp.co.id/index.php?title=PostgreSQL&amp;diff=4518"/>
		<updated>2026-08-28T12:20:00Z</updated>

		<summary type="html">&lt;p&gt;Wikiadmin: Add {{Languages}} switcher (EN) for ID subpage&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Languages}}&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
= Database Development =&lt;br /&gt;
&lt;br /&gt;
== Validation ==&lt;br /&gt;
&lt;br /&gt;
=== Check: Columns with search reference and reference value null ===&lt;br /&gt;
Setiap Column yang ada dalam daftar hasil query harus diperbaiki sesuai standard Openbravo Development&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SELECT AD_COLUMN_ID AS referencekey_id, TABLENAME || ' - ' || COLUMNNAME AS RECORD_ID, 0 AS AD_ROLE_ID, NULL AS AD_USER_ID,&lt;br /&gt;
  'The column ' || COLUMNNAME || ' in table ' || TABLENAME || ' is referenced as search and doesn''t have an associated reference value while having active updateable fields.' AS DESCRIPTION,&lt;br /&gt;
  'Y' AS ISACTIVE, 0 AS AD_ORG_ID, 0 AS AD_CLIENT_ID, now() AS CREATED, 0 AS CREATEDBY, now() AS UPDATED, 0 AS UPDATEDBY&lt;br /&gt;
FROM AD_COLUMN, AD_TABLE&lt;br /&gt;
WHERE AD_REFERENCE_ID = '30'&lt;br /&gt;
  AND AD_COLUMN.AD_TABLE_ID = AD_TABLE.AD_TABLE_ID&lt;br /&gt;
  AND AD_REFERENCE_VALUE_ID IS NULL&lt;br /&gt;
  AND AD_TABLE.ISACTIVE = 'Y'&lt;br /&gt;
  AND AD_COLUMN.ISACTIVE = 'Y'&lt;br /&gt;
  AND AD_COLUMN.ISPARENT = 'N'&lt;br /&gt;
  --AND AD_COLUMN.ISUPDATEABLE = 'Y'&lt;br /&gt;
  AND EXISTS (SELECT 1&lt;br /&gt;
              FROM AD_FIELD, aD_TAB, AD_WINDOW&lt;br /&gt;
              WHERE AD_FIELD.AD_COLUMN_ID = AD_COLUMN.AD_COLUMN_ID&lt;br /&gt;
                AND AD_FIELD.AD_TAB_ID = AD_TAB.AD_TAB_ID&lt;br /&gt;
                AND AD_WINDOW.AD_WINDOW_ID = AD_TAB.AD_WINDOW_ID&lt;br /&gt;
                AND AD_FIELD.ISREADONLY = 'N'&lt;br /&gt;
                AND AD_TAB.ISREADONLY = 'N'&lt;br /&gt;
                AND AD_TAB.ISACTIVE = 'Y'&lt;br /&gt;
                AND AD_FIELD.ISACTIVE = 'Y'&lt;br /&gt;
                AND AD_WINDOW.ISACTIVE = 'Y'&lt;br /&gt;
                AND ISDISPLAYED = 'Y')&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Database Maintenance and Monitoring script =&lt;br /&gt;
&lt;br /&gt;
== Monitor Index status dan size for optimization ==&lt;br /&gt;
&lt;br /&gt;
Over optimizing is a thing&lt;br /&gt;
	We always our database to be performant, so in order to do that we keep things in memory/cache (see earlier) and we index things so we don’t have to scan everything on disk. &lt;br /&gt;
	But there is a trade-off when it comes to indexing your database. &lt;br /&gt;
	Each index the system has to maintain will slow down your write throughput on the database. &lt;br /&gt;
	This is fine when you do need to speed up queries, as long as they’re being utilized. &lt;br /&gt;
	If you added an index years ago, but something within your application changed and you no longer need it best to remove it.&lt;br /&gt;
	Postgres makes it simply to query for unused indexes so you can easily give yourself back some performance by removing them:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 * Over optimizing is a thing&lt;br /&gt;
	We always our database to be performant, so in order to do that we keep things in memory/cache (see earlier) and we index things so we don’t have to scan everything on disk. &lt;br /&gt;
	But there is a trade-off when it comes to indexing your database. &lt;br /&gt;
	Each index the system has to maintain will slow down your write throughput on the database. &lt;br /&gt;
	This is fine when you do need to speed up queries, as long as they’re being utilized. &lt;br /&gt;
	If you added an index years ago, but something within your application changed and you no longer need it best to remove it.&lt;br /&gt;
	Postgres makes it simply to query for unused indexes so you can easily give yourself back some performance by removing them:&lt;br /&gt;
 */&lt;br /&gt;
SELECT&lt;br /&gt;
  schemaname || '.' || relname AS table,&lt;br /&gt;
  indexrelname AS index,&lt;br /&gt;
  pg_size_pretty(pg_relation_size(i.indexrelid)) AS index_size,&lt;br /&gt;
  idx_scan as index_scans&lt;br /&gt;
FROM pg_stat_user_indexes ui&lt;br /&gt;
JOIN pg_index i ON ui.indexrelid = i.indexrelid&lt;br /&gt;
--WHERE NOT indisunique AND idx_scan &amp;lt; 50 AND pg_relation_size(relid) &amp;gt; 5 * 8192&lt;br /&gt;
--where relname = 'ret_gen_tsm_targetomzetline'&lt;br /&gt;
where relname in ('ret_gen_tsm_targetomzetgrow','ret_gen_tsm_targetomzetline','ret_tsmrekap_category','ret_gen_tsmtarget_category')&lt;br /&gt;
ORDER BY relname asc, pg_relation_size(i.indexrelid) / nullif(idx_scan, 0) DESC NULLS FIRST,&lt;br /&gt;
--idx_scan asc,&lt;br /&gt;
pg_relation_size(i.indexrelid) desc&lt;br /&gt;
;&lt;br /&gt;
&lt;br /&gt;
--drop index ret_gen_tsm_targetomzetline_tag_status_idx;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Monitor Temporary Table ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 * We all aware of the temp tables and many times developers are creating temp table for their ad-hoc testing purpose.&lt;br /&gt;
 * But unfortunately sometimes, they forget to drop unused temp tables, and temp tables keep active in those idle connections.&lt;br /&gt;
 * It also requires unnecessary utilization of disk space.&lt;br /&gt;
 * &lt;br /&gt;
 * DBAs are responsible for identifying unused temp tables and then inform to developers so that they can drop their unused temp tables.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
SELECT&lt;br /&gt;
	n.nspname as SchemaName&lt;br /&gt;
	,c.relname as RelationName&lt;br /&gt;
	,CASE c.relkind&lt;br /&gt;
	WHEN 'r' THEN 'table'&lt;br /&gt;
	WHEN 'v' THEN 'view'&lt;br /&gt;
	WHEN 'i' THEN 'index'&lt;br /&gt;
	WHEN 'S' THEN 'sequence'&lt;br /&gt;
	WHEN 's' THEN 'special'&lt;br /&gt;
	END as RelationType&lt;br /&gt;
	,pg_catalog.pg_get_userbyid(c.relowner) as RelationOwner               &lt;br /&gt;
	,pg_size_pretty(pg_relation_size(n.nspname ||'.'|| c.relname)) as RelationSize&lt;br /&gt;
FROM pg_catalog.pg_class c&lt;br /&gt;
LEFT JOIN pg_catalog.pg_namespace n               &lt;br /&gt;
                ON n.oid = c.relnamespace&lt;br /&gt;
WHERE  c.relkind IN ('r','s') &lt;br /&gt;
AND  (n.nspname !~ '^pg_toast' and nspname like 'pg_temp%')&lt;br /&gt;
ORDER BY pg_relation_size(n.nspname ||'.'|| c.relname) DESC&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Monitor Dead Tupple ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 * Under the covers Postgres is essentially a giant append only log. &lt;br /&gt;
 * When you write data it appends to the log, when you update data it marks the old record as invalid and writes a new one, &lt;br /&gt;
 * when you delete data it just marks it invalid. Later Postgres comes through and vacuums those dead records (also known as tuples).&lt;br /&gt;
 * All those unvacuumed dead tuples are what is known as bloat. Bloat can slow down other writes and create other issues. &lt;br /&gt;
 * Paying attention to your bloat and when it is getting out of hand can be key for tuning vacuum on your database.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
WITH constants AS (&lt;br /&gt;
  SELECT current_setting('block_size')::numeric AS bs, 23 AS hdr, 4 AS ma&lt;br /&gt;
), bloat_info AS (&lt;br /&gt;
  SELECT&lt;br /&gt;
    ma,bs,schemaname,tablename,&lt;br /&gt;
    (datawidth+(hdr+ma-(case when hdr%ma=0 THEN ma ELSE hdr%ma END)))::numeric AS datahdr,&lt;br /&gt;
    (maxfracsum*(nullhdr+ma-(case when nullhdr%ma=0 THEN ma ELSE nullhdr%ma END))) AS nullhdr2&lt;br /&gt;
  FROM (&lt;br /&gt;
    SELECT&lt;br /&gt;
      schemaname, tablename, hdr, ma, bs,&lt;br /&gt;
      SUM((1-null_frac)*avg_width) AS datawidth,&lt;br /&gt;
      MAX(null_frac) AS maxfracsum,&lt;br /&gt;
      hdr+(&lt;br /&gt;
        SELECT 1+count(*)/8&lt;br /&gt;
        FROM pg_stats s2&lt;br /&gt;
        WHERE null_frac&amp;lt;&amp;gt;0 AND s2.schemaname = s.schemaname AND s2.tablename = s.tablename&lt;br /&gt;
      ) AS nullhdr&lt;br /&gt;
    FROM pg_stats s, constants&lt;br /&gt;
    GROUP BY 1,2,3,4,5&lt;br /&gt;
  ) AS foo&lt;br /&gt;
), table_bloat AS (&lt;br /&gt;
  SELECT&lt;br /&gt;
    schemaname, tablename, cc.relpages, bs,&lt;br /&gt;
    CEIL((cc.reltuples*((datahdr+ma-&lt;br /&gt;
      (CASE WHEN datahdr%ma=0 THEN ma ELSE datahdr%ma END))+nullhdr2+4))/(bs-20::float)) AS otta&lt;br /&gt;
  FROM bloat_info&lt;br /&gt;
  JOIN pg_class cc ON cc.relname = bloat_info.tablename&lt;br /&gt;
  JOIN pg_namespace nn ON cc.relnamespace = nn.oid AND nn.nspname = bloat_info.schemaname AND nn.nspname &amp;lt;&amp;gt; 'information_schema'&lt;br /&gt;
), index_bloat AS (&lt;br /&gt;
  SELECT&lt;br /&gt;
    schemaname, tablename, bs,&lt;br /&gt;
    COALESCE(c2.relname,'?') AS iname, COALESCE(c2.reltuples,0) AS ituples, COALESCE(c2.relpages,0) AS ipages,&lt;br /&gt;
    COALESCE(CEIL((c2.reltuples*(datahdr-12))/(bs-20::float)),0) AS iotta -- very rough approximation, assumes all cols&lt;br /&gt;
  FROM bloat_info&lt;br /&gt;
  JOIN pg_class cc ON cc.relname = bloat_info.tablename&lt;br /&gt;
  JOIN pg_namespace nn ON cc.relnamespace = nn.oid AND nn.nspname = bloat_info.schemaname AND nn.nspname &amp;lt;&amp;gt; 'information_schema'&lt;br /&gt;
  JOIN pg_index i ON indrelid = cc.oid&lt;br /&gt;
  JOIN pg_class c2 ON c2.oid = i.indexrelid&lt;br /&gt;
)&lt;br /&gt;
SELECT&lt;br /&gt;
  type, schemaname, object_name, bloat, pg_size_pretty(raw_waste) as waste&lt;br /&gt;
FROM&lt;br /&gt;
(SELECT&lt;br /&gt;
  'table' as type,&lt;br /&gt;
  schemaname,&lt;br /&gt;
  tablename as object_name,&lt;br /&gt;
  ROUND(CASE WHEN otta=0 THEN 0.0 ELSE table_bloat.relpages/otta::numeric END,1) AS bloat,&lt;br /&gt;
  CASE WHEN relpages &amp;lt; otta THEN '0' ELSE (bs*(table_bloat.relpages-otta)::bigint)::bigint END AS raw_waste&lt;br /&gt;
FROM&lt;br /&gt;
  table_bloat&lt;br /&gt;
    UNION&lt;br /&gt;
SELECT&lt;br /&gt;
  'index' as type,&lt;br /&gt;
  schemaname,&lt;br /&gt;
  tablename || '::' || iname as object_name,&lt;br /&gt;
  ROUND(CASE WHEN iotta=0 OR ipages=0 THEN 0.0 ELSE ipages/iotta::numeric END,1) AS bloat,&lt;br /&gt;
  CASE WHEN ipages &amp;lt; iotta THEN '0' ELSE (bs*(ipages-iotta))::bigint END AS raw_waste&lt;br /&gt;
FROM&lt;br /&gt;
  index_bloat) bloat_summary&lt;br /&gt;
ORDER BY raw_waste DESC, bloat DESC&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Monitor Cache Hit Ratio ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 * monitor your cache hit ratio&lt;br /&gt;
 * URL : https://www.citusdata.com/blog/2019/03/29/health-checks-for-your-postgres-database/&lt;br /&gt;
*/&lt;br /&gt;
SELECT &lt;br /&gt;
  sum(heap_blks_read) as heap_read,&lt;br /&gt;
  sum(heap_blks_hit)  as heap_hit,&lt;br /&gt;
  sum(heap_blks_hit) / (sum(heap_blks_hit) + sum(heap_blks_read)) as ratio&lt;br /&gt;
FROM &lt;br /&gt;
  pg_statio_user_tables;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Monitoring Database Query Performance ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 * monitoring your database query performance. &lt;br /&gt;
 * It records a lot of valuable stats about which queries are run, how fast they return, how many times their run, etc. &lt;br /&gt;
 * Checking in on this set of queries regularly can tell you where is best to add indexes &lt;br /&gt;
 * or optimize your application so your query calls may not be so excessive.&lt;br /&gt;
 * URL : https://www.citusdata.com/blog/2019/03/29/health-checks-for-your-postgres-database/&lt;br /&gt;
 * &lt;br /&gt;
 * Jalankan : create extension pg_stat_statements; jika belum pernah dilakukan&lt;br /&gt;
 */&lt;br /&gt;
SELECT query, &lt;br /&gt;
       calls,&lt;br /&gt;
       ceil(total_time) as total_time, &lt;br /&gt;
       ceil(total_time / calls) as time_per_call, &lt;br /&gt;
       ceil(stddev_time) as stddev_time, &lt;br /&gt;
       rows, &lt;br /&gt;
       rows / calls as rows_per_call,&lt;br /&gt;
       ceil(100.0 * shared_blks_hit / nullif(shared_blks_hit + shared_blks_read, 0)) AS hit_percent&lt;br /&gt;
FROM pg_stat_statements&lt;br /&gt;
WHERE query not similar to '%pg_%'&lt;br /&gt;
--WHERE query similar to '%omzetline%'&lt;br /&gt;
--and calls &amp;gt; 500&lt;br /&gt;
--ORDER BY calls desc&lt;br /&gt;
--ORDER BY total_time desc&lt;br /&gt;
order by time_per_call desc&lt;br /&gt;
--ORDER BY rows_per&lt;br /&gt;
LIMIT 100;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Locks held by Open Transactions (pg_locks) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 * Script to find information about the Locks held by Open Transactions (pg_locks)&lt;br /&gt;
 * &lt;br /&gt;
 * PostgreSQL view pg_locks contains the main information about the all types of lock of Database Server.&lt;br /&gt;
 * It contains one row per active lockable object.&lt;br /&gt;
 * This script is very helpful to all PostgreSQL Database Administrators.&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
SELECT &lt;br /&gt;
	pl.pid AS ProcessID&lt;br /&gt;
	,psa.datname AS DatabaseName&lt;br /&gt;
	,psa.usename AS UserName&lt;br /&gt;
	,psa.application_name AS ApplicationName&lt;br /&gt;
	,ps.relname AS ObjectName&lt;br /&gt;
	,psa.query_start AS QueryStartTime&lt;br /&gt;
	,psa.state AS QueryState&lt;br /&gt;
	,psa.query AS SQLQuery&lt;br /&gt;
	,pl.locktype&lt;br /&gt;
	,pl.tuple AS TupleNumber&lt;br /&gt;
	,pl.mode AS LockMode&lt;br /&gt;
	,pl.granted -- True if lock is held, false if lock is awaited&lt;br /&gt;
FROM pg_locks AS pl &lt;br /&gt;
LEFT JOIN pg_stat_activity AS psa&lt;br /&gt;
	ON pl.pid = psa.pid&lt;br /&gt;
LEFT JOIN pg_class AS ps&lt;br /&gt;
	ON pl.relation = ps.oid&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Check Trigger Status ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT * FROM pg_trigger&lt;br /&gt;
WHERE tgisinternal=false and tgenabled = 'D'&lt;br /&gt;
&lt;br /&gt;
--tgrelid 'public.c_order'::regclass and&lt;br /&gt;
&lt;br /&gt;
-- enable trigger &lt;br /&gt;
-- ALTER TABLE m_product ENABLE TRIGGER m_product_trg;&lt;br /&gt;
&lt;br /&gt;
-- Disable trigger &lt;br /&gt;
-- ALTER TABLE m_product DISABLE TRIGGER m_product_trg; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== More advance ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-- Check Disabled triggers&lt;br /&gt;
&lt;br /&gt;
select trigger_name as referencekey_id,&lt;br /&gt;
       null as record_id,&lt;br /&gt;
       0 as ad_role_id,&lt;br /&gt;
       null as ad_user_id,&lt;br /&gt;
       'Constraint '||trigger_name||' on table '||table_name||' is not enabled' as description,&lt;br /&gt;
       'Y' as isActive,&lt;br /&gt;
        0 as ad_org_id, &lt;br /&gt;
        0 as ad_client_id, &lt;br /&gt;
        now() as created,  &lt;br /&gt;
        0 as createdBy,  &lt;br /&gt;
        now() as updated,&lt;br /&gt;
        0 as updatedBy&lt;br /&gt;
from user_triggers&lt;br /&gt;
where status!='ENABLED'&lt;br /&gt;
&lt;br /&gt;
-- enable trigger jika di perlukan&lt;br /&gt;
&lt;br /&gt;
--ALTER TABLE c_orderline ENABLE TRIGGER oez_order_line_addcost;&lt;br /&gt;
--ALTER TABLE m_product ENABLE TRIGGER m_product_trg;&lt;br /&gt;
--ALTER TABLE c_conversion_rate ENABLE TRIGGER c_conversion_rate_trg;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Monitor LIVE and DEAD Tupples ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT &lt;br /&gt;
	relname AS ObjectName&lt;br /&gt;
	,pg_stat_get_live_tuples(c.oid) AS LiveTuples&lt;br /&gt;
	,pg_stat_get_dead_tuples(c.oid) AS DeadTuples&lt;br /&gt;
FROM pg_class c&lt;br /&gt;
--where relname like 'c_%'&lt;br /&gt;
order by pg_stat_get_dead_tuples(c.oid) desc;&lt;br /&gt;
--order by pg_stat_get_live_tuples(c.oid) desc;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Monitor LIVE and DEAD Tupples with AUTO VACUUM ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT &lt;br /&gt;
    schemaname&lt;br /&gt;
    ,relname&lt;br /&gt;
    ,n_live_tup&lt;br /&gt;
    ,n_dead_tup&lt;br /&gt;
    ,last_autovacuum&lt;br /&gt;
FROM pg_stat_all_tables&lt;br /&gt;
ORDER BY n_dead_tup&lt;br /&gt;
    /(n_live_tup&lt;br /&gt;
      * current_setting('autovacuum_vacuum_scale_factor')::float8&lt;br /&gt;
      + current_setting('autovacuum_vacuum_threshold')::float8)&lt;br /&gt;
     DESC&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= How to =&lt;br /&gt;
== Enabled Trigger secara massal ==&lt;br /&gt;
'''Background''': &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dalam kasus tertentu selama compile terkadang terdapat problem sehingga menyebabkan ada beberapa Trigger yang tidak di Enable kembali:&lt;br /&gt;
Berikut adalah PostgreSQL command untuk ENABLE semua trigger yang statusnya masih DISABLE:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DO $$ &lt;br /&gt;
DECLARE&lt;br /&gt;
    r RECORD;&lt;br /&gt;
BEGIN&lt;br /&gt;
    FOR r IN &lt;br /&gt;
        select &lt;br /&gt;
        	table_name as tablename,&lt;br /&gt;
        	trigger_name as trigger_name&lt;br /&gt;
		from user_triggers&lt;br /&gt;
		where status!='ENABLED'&lt;br /&gt;
    LOOP&lt;br /&gt;
        EXECUTE 'ALTER TABLE ' || r.tablename || ' ENABLE TRIGGER ' || r.trigger_name;&lt;br /&gt;
    END LOOP;&lt;br /&gt;
END $$;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Terminate Idle Transactions for Postgres version 12 and previous ==&lt;br /&gt;
&lt;br /&gt;
'''Background''': &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
since configuration '''idle_in_transaction_session_timeout''' on available at version 13 and above, here is the workaround solutions&lt;br /&gt;
&lt;br /&gt;
In PostgreSQL version 10, you can use a SQL script to identify and terminate idle transactions based on your requirements.&lt;br /&gt;
&lt;br /&gt;
Create below function:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE OR REPLACE FUNCTION oez_terminate_idle_sessions(idle_timeout_minutes integer) RETURNS void AS $$&lt;br /&gt;
BEGIN&lt;br /&gt;
    -- Terminate idle sessions that exceed the specified timeout in minutes&lt;br /&gt;
    PERFORM pg_terminate_backend(pg_stat_activity.pid)&lt;br /&gt;
    FROM pg_stat_activity&lt;br /&gt;
    WHERE state = 'idle in transaction' AND now() - pg_stat_activity.query_start &amp;gt; interval '1 minute' * idle_timeout_minutes;&lt;br /&gt;
END;&lt;br /&gt;
$$ LANGUAGE plpgsql;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To use this function, you can call it with your desired idle timeout value. For example, to terminate sessions idle for more than 5 minutes, you can call the function like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT oez_terminate_idle_sessions(5); -- Terminate idle sessions idle for more than 5 minutes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Convert Integer or numeric to row number==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
select &lt;br /&gt;
    	generate_series(1,tot_wo) as row&lt;br /&gt;
from oez_gen_simple_wo sw &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Database_Maintenance]]&lt;/div&gt;</summary>
		<author><name>Wikiadmin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.infinite-erp.co.id/index.php?title=Sistem_Informasi_Desa&amp;diff=4516</id>
		<title>Sistem Informasi Desa</title>
		<link rel="alternate" type="text/html" href="https://wiki.infinite-erp.co.id/index.php?title=Sistem_Informasi_Desa&amp;diff=4516"/>
		<updated>2026-08-28T12:19:59Z</updated>

		<summary type="html">&lt;p&gt;Wikiadmin: Add {{Languages}} switcher (EN) for ID subpage&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Languages}}&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
Aplikasi yang didesain khusus untuk menampung informasi yang berkaitan dengan administrasi dan informasi publik desa. Aplikasi ini masih dalam tahap pengembanga serta beberapa fitur masih dalam tahap uji coba.&lt;br /&gt;
&lt;br /&gt;
= Persiapan =&lt;br /&gt;
Setelah admin mendapatkan akun untuk login ke sistem selanjutnya admin melakukan input Wilayah, untuk level desa wilayah yang di masukkan adalah &lt;br /&gt;
* Dusun atau RW (Rukun Warga)&lt;br /&gt;
* RT (Rukun Tetangga)&amp;lt;br&amp;gt;&lt;br /&gt;
untuk input wilayah silahkan masuk ke menu wilayah&lt;br /&gt;
= User Guide =&lt;br /&gt;
== Informasi Wilayah ==&lt;br /&gt;
=== [[Wilayah]] ===&lt;br /&gt;
Halaman ini digunakan untuk mengelola data wilayah administratif yang berada di dalam Desa, pada halaman wilayah ini mencakup&lt;br /&gt;
Level Desa terdiri dari :&lt;br /&gt;
* Dusun atau RW (Rukun Warga)&lt;br /&gt;
* RT (Rukun Tetangga)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Level Kecamatan terdiri dari :&lt;br /&gt;
* Desa atau Dusun&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Level Kabupaten terdiri dari :&lt;br /&gt;
* Kecamatan&lt;br /&gt;
* Desa&lt;br /&gt;
&lt;br /&gt;
=== [[Pejabat_Wilayah|Pejabat Wilayah]] ===&lt;br /&gt;
Halaman ini digunakan untuk mengelola data Pejabat Wilayah atau pemerintahan di dalam instansi yang mencakup Wilayah Desa, Wilayah Kecamatan, Wilayah Kabupaten atau Kota, Wilayah Provinsi, untuk informasi detail nya silahkan klik [[Pejabat_Wilayah|halaman ini]]&lt;br /&gt;
&lt;br /&gt;
== Kependudukan ==&lt;br /&gt;
=== [[Data_Penduduk|Data Penduduk]] ===&lt;br /&gt;
Pada halaman ini digunakan untuk menyimpan data penduduk desa atau sebagai arsip data penduduk yang nantinya akan dapat di kelola dalam bentuk laporan serta dapat digunakan untuk keperluan data yang lain, seperti penerima bantuan dan lain-lain.&lt;br /&gt;
&lt;br /&gt;
= Informasi Developer =&lt;br /&gt;
&lt;br /&gt;
Berikut informasi yang terdaftar:&lt;br /&gt;
&lt;br /&gt;
== Setting Surat ==&lt;br /&gt;
Untuk mengetahui setting membuat surat dari sisi developer, anda bisa lihat [[Setting Surat|disini]].&lt;br /&gt;
&lt;br /&gt;
== Profile Wilayah ==&lt;br /&gt;
Untuk update field yang ingin ditampilkan di menu Profile Wilayah, anda bisa lihat [[Langkah-Langkah Update Field Profile Wilayah|disini]].&lt;br /&gt;
&lt;br /&gt;
= Informasi Pengguna =&lt;br /&gt;
&lt;br /&gt;
== Membuat Surat ==&lt;br /&gt;
Untuk langkah-langkah membuat surat, anda bisa lihat [[Langkah-Langkah Membuat Surat|disini]].&lt;br /&gt;
&lt;br /&gt;
== Profile Wilayah ==&lt;br /&gt;
Bagi anggota koperasi yang belum update nomor rekening dan nama bank, anggota bisa update secara manual [https://dev.barelanglaluanmadani.com/blmblog/form_update_anggota disini] . Untuk langkah-langkah update bank account, anda bisa lihat [[Langkah-Langkah Update Bank Account Koperasi BLM|disini]].&lt;br /&gt;
&lt;br /&gt;
= Self Service =&lt;br /&gt;
Test WIKI&lt;br /&gt;
&lt;br /&gt;
= Glosary =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! No !! Istilah !! Pengertian&lt;br /&gt;
|-&lt;br /&gt;
| 1|| LEVEL|| Struktur atau turunan mulai dari tingkat terendah ke tinggi dalam bentuk sub&lt;br /&gt;
|-&lt;br /&gt;
| Example || Example || Example&lt;br /&gt;
|-&lt;br /&gt;
| Example || Example || Example&lt;br /&gt;
|}&lt;br /&gt;
=== Tagihan Saya ===&lt;br /&gt;
Ini contoh sub heading tagihan saya tes&lt;br /&gt;
[[Tagihan Saya|Tagihan Saya]]&lt;/div&gt;</summary>
		<author><name>Wikiadmin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.infinite-erp.co.id/index.php?title=Sistem_Informasi_Desa/id&amp;diff=4515</id>
		<title>Sistem Informasi Desa/id</title>
		<link rel="alternate" type="text/html" href="https://wiki.infinite-erp.co.id/index.php?title=Sistem_Informasi_Desa/id&amp;diff=4515"/>
		<updated>2026-08-28T12:19:58Z</updated>

		<summary type="html">&lt;p&gt;Wikiadmin: Create ID subpage stub (scaffold) for Sistem Informasi Desa&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Languages}}&lt;br /&gt;
&lt;br /&gt;
== Sistem Informasi Desa (Bahasa Indonesia) ==&lt;br /&gt;
&lt;br /&gt;
Halaman ini adalah terjemahan Bahasa Indonesia dari [[Sistem Informasi Desa|Sistem Informasi Desa]]. Isinya masih dalam pengerjaan (work in progress).&lt;br /&gt;
&lt;br /&gt;
Silakan bantu melengkapi terjemahan mengikuti panduan di [[Starting_Guide_for_Wiki_translators|Starting Guide for Wiki Translators]].&lt;br /&gt;
&lt;br /&gt;
[[Category:WorkInProgress]]&lt;/div&gt;</summary>
		<author><name>Wikiadmin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.infinite-erp.co.id/index.php?title=Koperasi_Syariah/id&amp;diff=4513</id>
		<title>Koperasi Syariah/id</title>
		<link rel="alternate" type="text/html" href="https://wiki.infinite-erp.co.id/index.php?title=Koperasi_Syariah/id&amp;diff=4513"/>
		<updated>2026-08-28T12:19:57Z</updated>

		<summary type="html">&lt;p&gt;Wikiadmin: Create ID subpage stub (scaffold) for Koperasi Syariah&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Languages}}&lt;br /&gt;
&lt;br /&gt;
== Koperasi Syariah (Bahasa Indonesia) ==&lt;br /&gt;
&lt;br /&gt;
Halaman ini adalah terjemahan Bahasa Indonesia dari [[Koperasi Syariah|Koperasi Syariah]]. Isinya masih dalam pengerjaan (work in progress).&lt;br /&gt;
&lt;br /&gt;
Silakan bantu melengkapi terjemahan mengikuti panduan di [[Starting_Guide_for_Wiki_translators|Starting Guide for Wiki Translators]].&lt;br /&gt;
&lt;br /&gt;
[[Category:WorkInProgress]]&lt;/div&gt;</summary>
		<author><name>Wikiadmin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.infinite-erp.co.id/index.php?title=Koperasi_Syariah&amp;diff=4514</id>
		<title>Koperasi Syariah</title>
		<link rel="alternate" type="text/html" href="https://wiki.infinite-erp.co.id/index.php?title=Koperasi_Syariah&amp;diff=4514"/>
		<updated>2026-08-28T12:19:57Z</updated>

		<summary type="html">&lt;p&gt;Wikiadmin: Add {{Languages}} switcher (EN) for ID subpage&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Languages}}&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
Aplikasi yang di desain khusus untuk Koperasi Syariah menggunakan module InfiniteERP khusus sebagai aplikasi backoffice dan untuk interaksi dengan anggota, mitra dan pengurus dibuatkan khusus aplikasi front end mobile friendly yang semua data tersimpan di backend.&lt;br /&gt;
&lt;br /&gt;
= Daftar Istilah / Glossary =&lt;br /&gt;
&lt;br /&gt;
Daftar nama-nama jenid akad transaksi jual beli pada koperasi syariah:&lt;br /&gt;
* Murabahah&lt;br /&gt;
* Taqsith&lt;br /&gt;
* Istishna&lt;br /&gt;
&lt;br /&gt;
Daftar nama-nama jenis investasi pada koperasi syariah:&lt;br /&gt;
* Mudhorobah Muqoyyadah&lt;br /&gt;
* Mudhorobah Mutlaqoh&lt;br /&gt;
&lt;br /&gt;
= User Story =&lt;br /&gt;
&lt;br /&gt;
* Anggota atau calon konsumen mengisi formulir pengajuan kredit&lt;br /&gt;
* Karyawan koperasi menerima notifikasi terdapat pengajuan kredit.&lt;br /&gt;
* Karyawan memastikan kelengkapan data yang diisi dan melakukan approval untuk tingkat lebih lanjut pada level pengurus.&lt;br /&gt;
* Setelah persetujuan pengurus, dapat diminta persetujuan pengawas untuk beberapa jenis transaksi khusus atau besaran nilai tertentu&lt;br /&gt;
* TBC&lt;br /&gt;
&lt;br /&gt;
= Keanggotaan =&lt;br /&gt;
&lt;br /&gt;
== Pendaftaran Anggota Baru ==&lt;br /&gt;
Proses:&lt;br /&gt;
# Calon Anggota mengisi formulir hardcopy / online form&lt;br /&gt;
# Calon Anggota melakukan pembayaran Iuran Pokok&lt;br /&gt;
# Calon Anggota melakukan pembayaran iuran wajib&lt;br /&gt;
# Pengurus mencatat informasi anggota di menu Anggota&lt;br /&gt;
&lt;br /&gt;
== Anggota Keluar ==&lt;br /&gt;
# Anggota mengisi formulir pengunduran diri&lt;br /&gt;
# Pengurus melakukan verifikasi&lt;br /&gt;
# Cek jika ada tagihan kredit belum lunas&lt;br /&gt;
# Cek total iuran yang harus dikembalikan&lt;br /&gt;
# Pengurus melakukan proses pembayaran iuran kepada anggota&lt;br /&gt;
# Pengurus update informasi anggota telah keluar dan update tanggal keluar&lt;br /&gt;
# Anggota di set Non Active dengan tanggal keluar. Data Anggota akan tetap tersimpan termasuk semua data iuran dan semua transaksi yang pernah dilakukan.&lt;br /&gt;
&lt;br /&gt;
== Update Bank Account ==&lt;br /&gt;
Bagi anggota koperasi yang belum update nomor rekening dan nama bank, anggota bisa update secara manual [https://dev.barelanglaluanmadani.com/blmblog/form_update_anggota disini] . Untuk langkah-langkah update bank account, anda bisa lihat [[Langkah-Langkah Update Bank Account Koperasi BLM|disini]].&lt;br /&gt;
&lt;br /&gt;
== Pengajuan Kredit Anggota ==&lt;br /&gt;
Bagi anggota koperasi yang belum update nomor rekening dan nama bank, anggota bisa update secara manual [https://dev.barelanglaluanmadani.com/blmblog/form_update_anggota disini]&lt;br /&gt;
&lt;br /&gt;
== Pengajuan Kredit Non-Anggota ==&lt;br /&gt;
Bagi anggota koperasi yang belum update nomor rekening dan nama bank, anggota bisa update secara manual [https://dev.barelanglaluanmadani.com/blmblog/form_update_anggota disini]&lt;br /&gt;
&lt;br /&gt;
= Self Service =&lt;br /&gt;
Adalah menu halaman layanan mandiri setiap anggota koperasi maupun sebagai konsumen.&lt;br /&gt;
=== Perubahan Data Profil Pribadi ===&lt;br /&gt;
=== Informasi Keanggotaan ===&lt;br /&gt;
=== Riwayat Transaksi ===&lt;br /&gt;
Mencakup informasi transaksi pembayaran iuran koperasi dan riwayat transaksi yang pernah terjadi.&lt;br /&gt;
=== Tagihan Saya ===&lt;br /&gt;
Ini contoh sub heading tagihan saya tes&lt;br /&gt;
[[Tagihan Saya|Tagihan Saya]]&lt;br /&gt;
&lt;br /&gt;
= Dashboard =&lt;br /&gt;
= Sahila ERP =&lt;br /&gt;
Adalah module ERP yang dibuat khusus untuk Manajemen Koperasi Syariah.&lt;br /&gt;
&lt;br /&gt;
== Menu Koperasi Syariah==&lt;br /&gt;
=== Pengajuan Kredit ===&lt;br /&gt;
Ini adalah module backoffice di ERP dan akan terhubung dengan aplikasi Front End berupa web mobile sehingga bisa di akses oleh Anggota dan calon konsumen.&lt;br /&gt;
&lt;br /&gt;
=== Anggota ===&lt;br /&gt;
Berfungsi untuk input pendaftaran anggota baru dan update data anggota seperti jika anggota telah keluar dari anggota koperasi.&lt;br /&gt;
&lt;br /&gt;
=== Setup ===&lt;br /&gt;
==== Master Data ====&lt;br /&gt;
==== Setup Jangka Waktu Kredit ====&lt;br /&gt;
Jangka waktu kredit atau tenor mencakup setting jumlah cicilan dan persentase margin per bulan atau per tahun.&lt;br /&gt;
Tenor kredit digunakan oleh pengurus untuk membuat simulasi cicilan yang akan diberikan ke calon konsumen. Tenor Kredit dapat dipilih oleh pengurus pada menu Pengajuan Kredit atau juga secara manual di input dalam skenario khusus.&lt;/div&gt;</summary>
		<author><name>Wikiadmin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.infinite-erp.co.id/index.php?title=POS_(Point_Of_Sales)&amp;diff=4512</id>
		<title>POS (Point Of Sales)</title>
		<link rel="alternate" type="text/html" href="https://wiki.infinite-erp.co.id/index.php?title=POS_(Point_Of_Sales)&amp;diff=4512"/>
		<updated>2026-08-28T12:19:56Z</updated>

		<summary type="html">&lt;p&gt;Wikiadmin: Add {{Languages}} switcher (EN) for ID subpage&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Languages}}&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
InfiniteERP memiliki aplikasi POS yang digunakan untuk beberapa klien industri retail.&lt;br /&gt;
&lt;br /&gt;
= Client Specific =&lt;br /&gt;
&lt;br /&gt;
= Fitur POS =&lt;br /&gt;
== [https://pos.idolmart.co.id/#ad_table.html?fm=d244fd83-f816-4d58-9955-a946a074b49d Promo Reguler] ==&lt;br /&gt;
Promo yang tidak bersyarat&lt;br /&gt;
&lt;br /&gt;
== Promo Tebus Murah==&lt;br /&gt;
TESTING :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CCCCC&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Troubleshooting =&lt;br /&gt;
&lt;br /&gt;
{{ManualDoc:POS-Troubleshooting}}&lt;br /&gt;
&lt;br /&gt;
Berikut beberapa problem ditemukan dan cara menyelesaikan pada link ini [[:Category:POS-HowTo|POS Troubleshooting How-To]]&lt;br /&gt;
== Sales Order Tidak Balance ==&lt;br /&gt;
Total Penjualan di Local Pos tidak sama dengan hasil kalkulasi struk di server:&lt;br /&gt;
&lt;br /&gt;
=== 1. Struk dari Local tidak Masuk Ke Server ===&lt;br /&gt;
1. Cari struk yang belum masuk ke web di menu [https://pos.idolmart.co.id/#ad_table.html?fm=022300e1-204c-4bd1-9e25-f41fb700249f Loss Bill] atau cek manual di menu [https://pos.idolmart.co.id/#ad_table.html?fm=ce256b8c-2dfc-4bec-9185-1b809caaaa7f bill today]&lt;br /&gt;
&lt;br /&gt;
2. sync manual bill yg tidak masuk dari PC local toko&lt;br /&gt;
   query : update pos_dsales set issync=false where billno like 'BILL YANG TIDAK MASUK'&lt;br /&gt;
&lt;br /&gt;
=== 2. Struk dari local double di server===&lt;br /&gt;
Cek di menu [https://pos.idolmart.co.id/#ad_table.html?fm=3b05a9b3-b0bb-4075-9e7d-8bfd5d54b52e Fail Bill], Delete Struk yg Double&lt;br /&gt;
&lt;br /&gt;
=== 3. SO tidak terbentuk ===&lt;br /&gt;
1. cek document so di table pos_dsalessum dan pos_dsalesorder&lt;br /&gt;
2. jika document so tidak ditemukan di pos_dsalesorder&lt;br /&gt;
   jalankan query : SELECT public.proc_pos_dsalesorder_manual_insert('CODE CLIENT','CODE ORG','06-Aug-22','ASP');&lt;br /&gt;
3. cek lagi di table pos_dsalesorder&lt;br /&gt;
4. jika tidak ada di pos_dsalesorder, cek data struk di table pos_dsalesbilltoday, jika tidak ada pindahkan sementara data dari table pos_dsalesbill ke pos_dsalesbilltoday&lt;br /&gt;
   query : select * from pos_dsalesorder where documentno like 'BOS88-CASH-2022-08-06';&lt;br /&gt;
           select * from pos_dsalessum where documentno like 'BOS88-CASH-2022-08-06';&lt;br /&gt;
&lt;br /&gt;
          INSERT INTO public.pos_dbilltoday&lt;br /&gt;
          (isactived, insertdate, insertby, postby, postdate, ad_org_id, billno, billamount, paymentmethodname, membercard, cardno, approvecode, edcno, serialno, billstatus, paycashgiven, pos_mbank_key, pos_dcashierbalance_key, &lt;br /&gt;
           paygiven, printcount, bankname, pos_medc_key, billcode, point)&lt;br /&gt;
         SELECT isactived, insertdate, insertby, postby, postdate, ad_org_id, billno, billamount, paymentmethodname, membercard, cardno, approvecode, edcno, serialno, billstatus, paycashgiven, pos_mbank_key, &lt;br /&gt;
         pos_dcashierbalance_key, paygiven, printcount, bankname, pos_medc_key, billcode, point&lt;br /&gt;
        FROM public.pos_dbill&lt;br /&gt;
       where billno like 'BOS88-060822S%' and paymentmethodname like 'CASH'&lt;br /&gt;
       --delete from pos_dbilltoday where billno like 'BOS88-060822S%' and paymentmethodname like 'CASH';&lt;br /&gt;
      INSERT INTO public.pos_dbilllinetoday&lt;br /&gt;
     (isactived, insertdate, insertby, postby, postdate, billno, seqno, sku, qty, price, discount, amount, ad_org_id, discountname)&lt;br /&gt;
     SELECT isactived, insertdate, insertby, postby, postdate, billno, seqno, sku, qty, price, discount, amount, ad_org_id, discountname&lt;br /&gt;
     FROM public.pos_dbillline&lt;br /&gt;
    where billno in (select billno from pos_dbill where billno like 'BOS88-060822S%' and paymentmethodname like 'CASH');&lt;br /&gt;
&lt;br /&gt;
    --delete from pos_dbilllinetoday&lt;br /&gt;
    --where billno in (select billno from pos_dbill where billno like 'BOS88-060822S%' and paymentmethodname like 'CASH');&lt;br /&gt;
    SELECT public.proc_pos_dsalesorder_manual_insert('D089DFFA729F4A22816BD8838AB0813C','AD05B790FB144FDA9704320962710058','06-Aug-22','ASP');&lt;br /&gt;
&lt;br /&gt;
= [[:Category:POS-HowTo | How-To]] =&lt;/div&gt;</summary>
		<author><name>Wikiadmin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.infinite-erp.co.id/index.php?title=POS_(Point_Of_Sales)/id&amp;diff=4511</id>
		<title>POS (Point Of Sales)/id</title>
		<link rel="alternate" type="text/html" href="https://wiki.infinite-erp.co.id/index.php?title=POS_(Point_Of_Sales)/id&amp;diff=4511"/>
		<updated>2026-08-28T12:19:55Z</updated>

		<summary type="html">&lt;p&gt;Wikiadmin: Create ID subpage stub (scaffold) for POS (Point Of Sales)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Languages}}&lt;br /&gt;
&lt;br /&gt;
== POS (Point Of Sales) (Bahasa Indonesia) ==&lt;br /&gt;
&lt;br /&gt;
Halaman ini adalah terjemahan Bahasa Indonesia dari [[POS (Point Of Sales)|POS (Point Of Sales)]]. Isinya masih dalam pengerjaan (work in progress).&lt;br /&gt;
&lt;br /&gt;
Silakan bantu melengkapi terjemahan mengikuti panduan di [[Starting_Guide_for_Wiki_translators|Starting Guide for Wiki Translators]].&lt;br /&gt;
&lt;br /&gt;
[[Category:WorkInProgress]]&lt;/div&gt;</summary>
		<author><name>Wikiadmin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.infinite-erp.co.id/index.php?title=Retail:Configuration_Guide&amp;diff=4510</id>
		<title>Retail:Configuration Guide</title>
		<link rel="alternate" type="text/html" href="https://wiki.infinite-erp.co.id/index.php?title=Retail:Configuration_Guide&amp;diff=4510"/>
		<updated>2026-08-28T08:57:25Z</updated>

		<summary type="html">&lt;p&gt;Wikiadmin: Add {{Languages}} switcher (EN) for ID subpage&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Languages}}&lt;br /&gt;
&lt;br /&gt;
[http://wiki.openbravo.com/wiki/Retail:Main_Page Back to main page]&lt;br /&gt;
== Introduction ==&lt;br /&gt;
This document describes how to configure the following specific settings of the  [http://www.openbravo.com/retailers/product-features/overview/ InfiniteERP Retail Solutions]:&lt;br /&gt;
* Enterprise model&lt;br /&gt;
* Store pricing&lt;br /&gt;
* Assortment&lt;br /&gt;
* Cash Management&lt;br /&gt;
* Web POS&lt;br /&gt;
&lt;br /&gt;
For generic documentation about '''InfiniteERP''' configuration please follow the [http://wiki.infinite-erp.co.id/index.php/Quick_Guide Quick Guide].&lt;br /&gt;
&lt;br /&gt;
'''If you are trying out '''InfiniteERP''' Retail Solutions for the first time, you MUST first execute all of the [http://wiki.openbravo.com/wiki/Quick_Guide#Business_setup Business Setup] configuration instructions in the Quick Guide before executing the configuration instructions below.'''&lt;br /&gt;
&lt;br /&gt;
== Installing the InfiniteERP Retail Solutions module ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{(!)|The Retail system manages to hit a bug in the PostgreSQL database version as being currently shipped in the Openbravo rPath Appliance which can lead to bad performance of the application. To avoid this for the moment we recommend to use the [[Openbravo_On_Demand_User_Guide | On Demand]] or [[Installation/Ubuntu | Ubuntu]] installation methods}}&lt;br /&gt;
&lt;br /&gt;
The Openbravo for Retail module is the main module of the Openbravo Commerce Suite. To install the module (an Openbravo Subscription to either [http://www.openbravo.com/retailers/editions-and-pricing/ Enterprise or Professional Edition] is required since it is a commercial module, read more about [[Retail:License|Retail License]]):&lt;br /&gt;
&lt;br /&gt;
* Login as System Administrator&lt;br /&gt;
* Navigate to '''''General Setup -&amp;gt; Application -&amp;gt; Module Management''''' &lt;br /&gt;
* Click the '''''Add Modules''''' tab&lt;br /&gt;
* Find the ''Openbravo for Retail'' module within the list of available modules.&lt;br /&gt;
* Click on '''Install Now''' and follow the guided installation flow.&lt;br /&gt;
&lt;br /&gt;
== Add Retail Stores to the Organization Model ==&lt;br /&gt;
&lt;br /&gt;
In Openbravo an organization is a business unit within an entity (company). Each entity can have more than one business unit to cover different zones, areas, region, stores...&lt;br /&gt;
Openbravo allows the definition of a hierarchical structure of organizations where a parent-child relationship between them can be determined. The result is a n-level organization tree, as follows:&lt;br /&gt;
&lt;br /&gt;
[[Image:OrgTree.png|200px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
This structure is flexible enough to support any further organizational change and may have unlimited levels, branches and nodes at each level as the situation may demand.&lt;br /&gt;
&lt;br /&gt;
In Organization window there is new group of fields called ''Retail Configuration''. There you can find ''Retail Organization Type'' field where you define whether an organization is a store or a group of stores:&lt;br /&gt;
&lt;br /&gt;
'''Store:'''&lt;br /&gt;
* Represents a physical retail store&lt;br /&gt;
* Only leaf organizations should be configured as store type&lt;br /&gt;
* The POS terminals set up in Openbravo shall be restricted to stores&lt;br /&gt;
* Must have an Anonymous Customer (Business Partner defined as Customer, with a default payment method)&lt;br /&gt;
* Must have an Anonymous Customer Location&lt;br /&gt;
* Must have at least one on-hand warehouse defined in the &amp;quot;Warehouses&amp;quot; tab&lt;br /&gt;
* The currency defined is the currency that will be used in all terminals of this store. The currency used can be edited to define retail configurations like the precision used in Web POS terminals.&lt;br /&gt;
'''Group:'''&lt;br /&gt;
* Represents  a grouping of stores (or other groups)&lt;br /&gt;
&lt;br /&gt;
[[Image:RetOrgTypeAss.png|800px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
== Store Pricing Configuration ==&lt;br /&gt;
&lt;br /&gt;
Item pricing can be managed by store or store group. This allows the retailer to manage multiple pricing for a single item.&lt;br /&gt;
&lt;br /&gt;
In Organization window there is a 'Price List' field inside ''Retail Configuration'' group. Any node of the enterprise model (either group or store) can have a sales price list assigned.&lt;br /&gt;
&lt;br /&gt;
Pricing management rules: &lt;br /&gt;
*Prices defined at store level will always overwrite the prices defined at parent level&lt;br /&gt;
*If the store does not have any attached price list, the price will be inherited from the parent element (store group) in the organizational structure&lt;br /&gt;
&lt;br /&gt;
In the following example all stores located on Zone 1 will use the prices defined at Zone 1 level, except the Store 11, that is going to have its own price list.&lt;br /&gt;
&lt;br /&gt;
[[Image:PriceListTree.png|400px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
Before RMP19, only price lists which included the tax were supported. Starting RMP19, pricelists without including taxes are also supported in Retail.&lt;br /&gt;
&lt;br /&gt;
In case a pricelist without taxes is used, the prices shown in the receipt lines will be net prices, and an additional line which includes the total tax will be shown. The total amount of the receipt will still be the gross amount.&lt;br /&gt;
&lt;br /&gt;
== Numerical Precision Configuration ==&lt;br /&gt;
The Web POS only supports one single precision, and by default uses the Price Precision of the currency it is working on both for its pricing precision, and for the general precision for all internal calculations. Sometimes, it's necessary when operating the backoffice to define a different Price Precision than the Standard precision, and sometimes this price precision would be wrong in the Web POS. For these cases, the POS Precision column in the currency window exists.&lt;br /&gt;
&lt;br /&gt;
This POS precision prevails against every other precision, so if it is defined, then it is used both for price precision and other calculations. If it's not defined, then the Price Precision is used instead.&lt;br /&gt;
&lt;br /&gt;
== Assortment Configuration ==&lt;br /&gt;
&lt;br /&gt;
Assortment management allows the retailer to determine the product range that will be made available for sale at various stores.&lt;br /&gt;
&lt;br /&gt;
A new window ''Assortment'' is created to provide a new grouping for products.&lt;br /&gt;
&lt;br /&gt;
The window has two processes (buttons) for common operations dealing with assortment:&lt;br /&gt;
*Clone: New button is displayed in the toolbar. It will create a copy (clone) of the selected assortment. Newly created assortment is opened in form view in order to let the user modify it if required&lt;br /&gt;
*Include all products: The user will be able to include all products at once in the assortment by using this button. Duplicated products in the same assortment are not allowed&lt;br /&gt;
&lt;br /&gt;
[[Image:ProductList.png|800px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
Organization window has a new optional field Assortment inside ''Retail Configuration'' section. Any node of the enterprise model (either group or store) can have an assortment assigned.&lt;br /&gt;
&lt;br /&gt;
[[Image:ProdListTreeAss.png|400px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
Assortment management rules:&lt;br /&gt;
*If a store has an attached assortment, it can only trade with products defined inside the assortment&lt;br /&gt;
*Assortment defined at store level will always overwrite assortment defined at parent level&lt;br /&gt;
*If the store does not have any attached assortment, the assortment will be inherited from the parent element (store group) in the organizational structure&lt;br /&gt;
&lt;br /&gt;
'''Notes:'''&lt;br /&gt;
* Only products included in the assortment and have a price defined in the price list assigned to the store will be available to sell.&lt;br /&gt;
* Starting with '''RR17Q3''', products with attributes are supported in Openbravo Retail. Previous versions only supported products with attributes if they were not mandatory.&lt;br /&gt;
&lt;br /&gt;
=== Assortment At POS Terminal Type Level Configuration ===&lt;br /&gt;
&lt;br /&gt;
{{(!)|Starting from 3.0RR18Q4 this functionality is available}}&lt;br /&gt;
&lt;br /&gt;
On '''3.0RR18Q3''' and previous releases, the only option to set the assortment of products for WebPOS was to define it at Store level (Organization window in the ERP). With this new development, the assortment of products for WebPOS could be defined also at POS Terminal Type level (POS Terminal Type window in the ERP).&lt;br /&gt;
&lt;br /&gt;
WebPOS always needs an assortment of products to be loaded. To get the assorment, WebPOS terminal will look first if there is an assorment at POS Terminal Type level, and, in case it's not defined or set, it will look for the assortment set at Organization level.&lt;br /&gt;
&lt;br /&gt;
== Category Tree Configuration ==&lt;br /&gt;
&lt;br /&gt;
Select menu option: ''Application / Master Data Management / Product setup / Product Category''. Push button to show Tree Grid Visibilty.&lt;br /&gt;
&lt;br /&gt;
[[File:categoryTreeConfigErp.png | 800px]]&lt;br /&gt;
&lt;br /&gt;
* Create new categories as necesary&lt;br /&gt;
&lt;br /&gt;
* Modify a category tree&lt;br /&gt;
&lt;br /&gt;
* Add products to a new categories&lt;br /&gt;
&lt;br /&gt;
'''Remember:''' For a category can have children check Summary Level&lt;br /&gt;
&lt;br /&gt;
== Cash Management Events ==&lt;br /&gt;
A cash management event is either a cash deposit or withdrawal in the store, but also the process of cashing up. A store can have several cash management events and they are configured differently depending on the nature of the event (in, out, close).&lt;br /&gt;
&lt;br /&gt;
These events are managed in WebPOS and need to be defined in tab ''Cash Management Event'' in ''Organization'' window. &lt;br /&gt;
&lt;br /&gt;
[[Image:CashManagementEvent.png|800px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
For each event you need to define the following:&lt;br /&gt;
*'''Name''': Name of the event. In &amp;quot;in/out&amp;quot; event type, the name can be seen as the event reason shown in WebPOS to allow the cashier give more detail of the operation (e.g it can be different reasons for withdrawing money from the store, for instance the cash security level is reached in the store, or we need to transfer money from one store to another)&lt;br /&gt;
*'''Currency''': Currency of the event&lt;br /&gt;
*'''Payment Method''': Payment method associated to this event. In case of cash up, it is necessary to create as different ''close'' events as different payment methods are supported in the store&lt;br /&gt;
*'''Event Type''': In, out, close depending on the nature of the event&lt;br /&gt;
*'''Financial Account''': The account which will be the destination (or the origin) of the cash movement and it depends again on the nature of the event. For ''in'' case, it is the financial account from where money is going to be extracted (origin). For ''out'' case, it is the financial account from where money is injected (destination). Finally, for ''close'' it is the financial account where money is also going to be injected (destination). '''''Be careful, do not use the same financial account in payment types (payments allowed for a POS Terminal) and for &amp;quot;close&amp;quot; Financial Accounts. Moreover, it is recommended to use a different financial account in payments allowed for a POS Terminal and for the &amp;quot;cash management&amp;quot; events.'''''&lt;br /&gt;
&lt;br /&gt;
== Limit for approvals for count differences in initial cash count and cash up ==&lt;br /&gt;
Approval system enhancement for cash up and initial count processes, adding the possibility of specifying differences limits for each payment method before asking for an approval.&lt;br /&gt;
&lt;br /&gt;
=== Global Count Difference Limit ===&lt;br /&gt;
&lt;br /&gt;
Navigate to '''''Organization''''' window and select a organization to configure. On section '''Retail Configuration''' set ''Count Difference Limit'', as shown on following figure:&lt;br /&gt;
&lt;br /&gt;
[[Image:CountDifferenceLimit_Org.png|800px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
=== Count Difference Limit for the payment methods ===&lt;br /&gt;
&lt;br /&gt;
Navigate to '''''POS Terminal Type''''' window and select a item to configure, in tab '''Payment Method''' select a item to configure. On section '''Cash Up''' set ''Count Difference Limit'' and on section '''Cash Management''' set ''Initial Count Difference Limit'', as shown on following figure:&lt;br /&gt;
&lt;br /&gt;
[[Image:CountDifferenceLimit_POSTermType.png|800px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
'''Note:''' Before to '''3.0RR16Q2''', null value in this field is the same as the value 0: the approval always is required when there is a difference amount. From '''3.0RR16Q2''' the behavior has changed: if the field is null, then never the approval is required, if the value is 0 and there is a difference amount, the approval is required.&lt;br /&gt;
&lt;br /&gt;
=== Approval Reason ===&lt;br /&gt;
Navigate to '''POS Approval Reason''' window and edit/add the reasons, as shown on following figure:&lt;br /&gt;
&lt;br /&gt;
[[Image:CountDifferenceLimit_ApprovalReason.png|800px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
== Customers default configuration ==&lt;br /&gt;
&lt;br /&gt;
The are some fields we must fill if we want to create new customers in Web POS. These fields will be the default value for customers created in our terminal.&lt;br /&gt;
*'''Default invoice term for BPs''' &lt;br /&gt;
*'''Default payment term for BPs'''&lt;br /&gt;
*'''Default BP Category for BPs'''&lt;br /&gt;
*'''Default country for BPs'''&lt;br /&gt;
*'''Default organization term for BPs'''&lt;br /&gt;
*'''Show Tax ID for BPs Edition''': If checked, this option will show an extra field to insert the Tax ID.&lt;br /&gt;
*'''Show BP Category selector for BPs edition''': If checked, this option will show an extra field to select the BP category.&lt;br /&gt;
[[Image:customersConfiguration_rmp19.png|800px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
=== Preferences ===&lt;br /&gt;
&lt;br /&gt;
The following preferences have been created:&lt;br /&gt;
&lt;br /&gt;
* '''OBPOS_retail.disableNewBPButton''', used in WebPOS to disable the New Customer button until a search is performed.&lt;br /&gt;
* '''OBPOS_retail.customer_advanced_filters''', used in WebPOS to grant/deny access to the Advanced Filters window on the Customer Search popup.&lt;br /&gt;
* '''OBPOS_FilterAlwaysBPByAddress''', used in WebPOS to enable/disable in the filter of business partner always use the location.&lt;br /&gt;
* '''OBPOS_NotAllowEditCustomer''', used in WebPOS to allow or not to modify an anonymous customer or its adress(es).&lt;br /&gt;
&lt;br /&gt;
== Grouped products ==&lt;br /&gt;
&lt;br /&gt;
By default, all of the products are grouped in Web POS. It means that when a line representing a product is already in the ticket and more units are added, the line will change the quantity without creating new lines.&lt;br /&gt;
&lt;br /&gt;
If you want to create a new line for each product, &amp;quot;Grouped product&amp;quot; field should be disabled.&lt;br /&gt;
&lt;br /&gt;
This field is located in the header of the product window.&lt;br /&gt;
&lt;br /&gt;
Not grouped products will generate new lines when they are added to the ticket through &amp;quot;Browse&amp;quot;, &amp;quot;Search&amp;quot;, &amp;quot;Scan&amp;quot;. When they are added to the ticket we will be able to change the quantity of each line.&lt;br /&gt;
&lt;br /&gt;
== Non Returnable Products ==&lt;br /&gt;
{{(!)|Starting from '''RR17Q2''' below functionality is available }}&lt;br /&gt;
&lt;br /&gt;
By default all of the products are returnables in Web POS. It means that it will always be possible to return them. However, in some cases this should not be the rule and in this field you can deactivate this functionality. It is also possible to fill the value of Overdue Return Days in order to set a maximum period of time to return an item. &lt;br /&gt;
&lt;br /&gt;
This field is located in the header of the product window.&lt;br /&gt;
&lt;br /&gt;
The following pop-up will rise when trying to return a non returnable product as a return line:&lt;br /&gt;
[[Image:NormalNonReturnable.png|600px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following pop-up will rise when trying to return a non returnable product using verifying returns:&lt;br /&gt;
[[Image:VerifiedNonReturnable.png|600px|center]]&lt;br /&gt;
&lt;br /&gt;
== PLM Status ==&lt;br /&gt;
&lt;br /&gt;
{{AvailableFrom|3.0RR18Q3}}&lt;br /&gt;
&lt;br /&gt;
From '''18Q3''' is possible to configure the PLM (Product Lifecycle Management) Status of the products. This status affects to critical flows in which the products are used. Up to now, in the ''Web POS'' the only affected flow is the process of selling them. In the next link is possible to find more information and the different status of the ''PLM Status'':&lt;br /&gt;
&lt;br /&gt;
http://wiki.openbravo.com/wiki/Projects:PLM_Status&lt;br /&gt;
&lt;br /&gt;
=== Configure the PLM Status ===&lt;br /&gt;
&lt;br /&gt;
The products status is configured directly in the '''Product''' window. There, there's a selector to set the current status to it:&lt;br /&gt;
&lt;br /&gt;
[[Image:Plmproduct.png|800px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
It is also possible to open the status list in a selector, to see which is the impact of each one:&lt;br /&gt;
&lt;br /&gt;
[[Image:Plmselectorproduct.png|800px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
Here the user can see how a status affect to the different flows. The selector is not modifiable, is read only.&lt;br /&gt;
&lt;br /&gt;
==== PLM Status in the Assortment ====&lt;br /&gt;
&lt;br /&gt;
The PLM Status can also be configured in the '''Assortment''' window, in the '''Product''' tab of the window. Any configuration done here overrides the configuration set in the '''Product''' window, affecting only in the organization for which the assortment is configured. This allows to have a different status for a product in each store. The products that are not configured in the assortment will use the status of the product.&lt;br /&gt;
&lt;br /&gt;
[[Image:Plmassortment.png|800px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
The PLM Status can also be shown with the selector popup, as in the '''Product''' window.&lt;br /&gt;
&lt;br /&gt;
== Enable cross store for a product ==&lt;br /&gt;
Cross store is an utility which allow us to see the detailed stock by bin in our store and also the stock of the product in other warehouses of the organization.&lt;br /&gt;
&lt;br /&gt;
To see the stock detail view the field ''Show stock screen'' shuold be checked in the product window.&lt;br /&gt;
&lt;br /&gt;
In this example we will activate the stock screen for the product ''Base camp duffel 70L''&lt;br /&gt;
&lt;br /&gt;
[[Image:OBPOS_enable_show_stock.png|800px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
{{(!)|Starting from '''RR16Q2''' below functionality is available }}&lt;br /&gt;
&lt;br /&gt;
It exists the possibility to define which warehouses are going to be part of “Cross Channel Warehouse”.&lt;br /&gt;
&lt;br /&gt;
Definition is done in window “Organization” using “Cross Channel Warehouse” tab and adding the warehouses using button “CC Warehouse”. This warehouses are warehouses not defined as Warehouses on Hand of the Store, and defining them in this tab it will be possible to check the Stock of products in those warehouses from Web POS for the configured Stores.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:CCWarehouse_button.jpg|800px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
Apart from that using the field “Included Warehouses” in the organization it is possible to &lt;br /&gt;
define different logics:&lt;br /&gt;
&lt;br /&gt;
-All excluding defined: Web POS will propose all the warehouses defined in the system except which ones defined as On Hand&lt;br /&gt;
&lt;br /&gt;
-Only those defined: Web POS will propose you only the stock of defined warehouses&lt;br /&gt;
&lt;br /&gt;
[[File:Included_CCWarehouses.jpg|800px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
After this configuration, Web POS will open the stock window when a product is clicked in order to be added to the ticket.&lt;br /&gt;
&lt;br /&gt;
[[Image:OBPOS_view_cross_store.png|800px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
==Product Images==&lt;br /&gt;
By default, the product images are automatically loaded into the browser local database, so they can be used offline in a convenient way. However, the browser local database has a maximum size limitation in all environments, and in some of them this maximum size can be quite restrictive (specifically, in iOS, the maximum size is restricted to 50 MB).&lt;br /&gt;
&lt;br /&gt;
If this maximum size is not enough for your needs, you can configure the Web POS so that it doesn't save the images into the local database, and instead requests them directly to the server.&lt;br /&gt;
&lt;br /&gt;
The slight downside to using this method is that in when the POS goes offline, images for previously used products will be available, but the images for products not yet used will not (the generic 'box' image will be shown instead). If this downside is not relevant for you, then you can definitely use this method to make it possible to use big amounts of products with images in devices such as the iPad&lt;br /&gt;
&lt;br /&gt;
===How to configure the alternate way to load images===&lt;br /&gt;
The first step to configure this alternate way to load images is to create a preference in the system, with property '''Web POS Product Images from server instead of cache''', and with value '''Y'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:OBPOS_image_preference.png|800px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
This preference will tell the Web POS that it needs to load images from the server directly, instead of loading them from the local database.&lt;br /&gt;
&lt;br /&gt;
To improve the performance of this functionality, and ensure that the server is not overloaded with the image requests, the images are read directly from files in the server, instead of the database. This means that image files need to be generated from the product images in the database. To do this, a process called '''Generate Product Images''' needs to be run.&lt;br /&gt;
&lt;br /&gt;
[[Image:OBPOS_generateimageprocess.png|800px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
This process receives an assortment as a parameter, and will generate files for all products in the assortment which contain an image. After this process has been run, the Web POS terminals should be able to load all product images without trouble.&lt;br /&gt;
&lt;br /&gt;
==Anonymous Layaways==&lt;br /&gt;
&lt;br /&gt;
{{(!)| This configuration will be available starting from RR16Q2}}&lt;br /&gt;
&lt;br /&gt;
This new functionality provides the functionality to allow or deny the creation of layaways for the anonymous customer of the store/terminal (the anonymous customer is defined either on the POS Terminal window or on the Organization window; the value on POS Terminal window, if it exists, will override the value on Organization window).&lt;br /&gt;
&lt;br /&gt;
Navigate to the [[Organization]] window and check '''Allow anonymous customer layaway''' if you want to allow the creation of layaways for the anonymous customer.&lt;br /&gt;
&lt;br /&gt;
[[File:AnonymousLayawaysConfig.png|thumbnail|center|800px]]&lt;br /&gt;
&lt;br /&gt;
==Allow to void Layaways partially paid==&lt;br /&gt;
&lt;br /&gt;
{{(!)| This configuration will be available starting from RR16Q4}}&lt;br /&gt;
&lt;br /&gt;
This new feature provides the ability to configure the store to allow/deny the layaway voiding process if these have some associated payment.&lt;br /&gt;
&lt;br /&gt;
Navigate to the [[Organization]] window and check '''Allow partially paid layaways to be voided''' if you want to allow the voiding of layaways when there are related payments.&lt;br /&gt;
&lt;br /&gt;
[[File:VoidLayawaysConfig.png|thumbnail|center|800px]]&lt;br /&gt;
&lt;br /&gt;
==Currency Exchange Rate at Store Level==&lt;br /&gt;
&lt;br /&gt;
{{(!)| This configuration will be available starting from RR18Q3}}&lt;br /&gt;
&lt;br /&gt;
This new feature provides the ability to configure currency exchange rates at Store level. Currently Openbravo only allows to define currency exchange rates at * level. With this feature, if any exchange rate is defined for an store, the one defined at * level will be overwritten.&lt;br /&gt;
&lt;br /&gt;
Navigate to the [[Organization]] window and open ''Conversion Rates'' tab. Notice that the tab only will be displayed if the selected organization type is ''Retail Store''.In this window it will be possible to define information:&lt;br /&gt;
* Currency&lt;br /&gt;
* To Currenty&lt;br /&gt;
* Valid From Date&lt;br /&gt;
* Valid To Date&lt;br /&gt;
* Multiple Rate By: a Multiple rate by which is the rate by which the base amount will be multiplied for to calculate the converted amount.&lt;br /&gt;
* Divide Rate By: and a Divide rate by which is the rate by which the base amount will be divided by to calculate the converted amount.&lt;br /&gt;
&lt;br /&gt;
[[File:ExchangeRateAtStoreLevel.png|thumbnail|center|1200px]]&lt;br /&gt;
&lt;br /&gt;
==Currency Rounding at Store Level==&lt;br /&gt;
{{(!)| This configuration will be available starting from RR19Q1}}&lt;br /&gt;
This new development allows to select rounding for different currencies.&lt;br /&gt;
&lt;br /&gt;
Navigate to the [[Organization]] window and open ''Currency Rounding'' tab. It will be possible to configure:&lt;br /&gt;
&lt;br /&gt;
* Currency&lt;br /&gt;
* Rounding To&lt;br /&gt;
* Rounding Down Limit&lt;br /&gt;
&lt;br /&gt;
In this example, if change is between 100 and 25, it will be rounded up to 100. However if it is less than 25, it will be rounded down to 0. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Backroun.png|thumbnail|center|1200px]]&lt;br /&gt;
&lt;br /&gt;
==Maximum Allowed Quantity or Price Configuration==&lt;br /&gt;
{{(!)| This configuration will be available starting from RR18Q3}}&lt;br /&gt;
&lt;br /&gt;
===Introduction===&lt;br /&gt;
This configuration allows to show a popup if the quantity or price exceeds a value set in two new properties defined:&lt;br /&gt;
* Web POS maximum allowed price using keyboard&lt;br /&gt;
* Web POS maximum allowed quantity using keyboard&lt;br /&gt;
&lt;br /&gt;
[[File:Retail_wk_config_price.png|thumbnail|center|600px]]&lt;br /&gt;
[[File:Retail_wk_config_qty.png|thumbnail|center|600px]]&lt;br /&gt;
&lt;br /&gt;
These preference works as other preferences from Web POS, in terms of configuration, with a small difference: the value set indicates Web POS the value to be exceeded to show a confirmation popup. Once set one or both of these preferences, the functionality starts to be check in Web POS.&lt;br /&gt;
&lt;br /&gt;
===How it works===&lt;br /&gt;
&lt;br /&gt;
Once configured, there are two possible scenarios to take into account:&lt;br /&gt;
&lt;br /&gt;
* Web POS maximum allowed price using keyboard is defined. Two different cases could happen:&lt;br /&gt;
** The price to be changed is lower than the value configured. The price is set to the lines selected without any UX difference.&amp;lt;br&amp;gt;[[File:Retail_wk_func_price_before.png|thumbnail|center|600px]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:Retail_wk_func_price_after.png|thumbnail|center|600px]]&lt;br /&gt;
** The price to be changed is equal or greater than the value configured. The price is not set directly and a confirmation popup is shown:&lt;br /&gt;
[[File:Retail_wk_func_price_before_exce.png|thumbnail|center|600px]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:Retail_wk_func_price_after_exce.png|thumbnail|center|600px]]&amp;lt;br&amp;gt;&lt;br /&gt;
*** If the user click on Cancel button, the price is not set to any line(s)&lt;br /&gt;
[[File:Retail_wk_func_price_after_exce_cancel.png|thumbnail|center|600px]]&amp;lt;br&amp;gt;&lt;br /&gt;
*** If the user click on OK button, the price is set to line(s)&lt;br /&gt;
[[File:Retail_wk_func_price_after_exce_ok.png|thumbnail|center|600px]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Web POS maximum allowed quantity using keyboard is defined. Two different cases could happen:&lt;br /&gt;
** The quantity to be changed is lower than the value configured&lt;br /&gt;
The quantity is set to the lines selected without any UX difference.&lt;br /&gt;
[[File:Retail_wk_func_qty_before.png|thumbnail|center|600px]]&lt;br /&gt;
[[File:Retail_wk_func_qty_after.png|thumbnail|center|600px]]&lt;br /&gt;
** The quantity to be changed is equal or greater than the value configured&lt;br /&gt;
The quantity is not set directly and a confirmation popup is shown:&lt;br /&gt;
[[File:Retail_wk_func_qty_before_exce.png|thumbnail|center|600px]]&lt;br /&gt;
[[File:Retail_wk_func_qty_after_exce.png|thumbnail|center|600px]]&lt;br /&gt;
*** If the user click on Cancel button, the quantity is not set to any line(s)&lt;br /&gt;
[[File:Retail_wk_func_qty_after_exce_cancel.png|thumbnail|center|600px]]&lt;br /&gt;
*** If the user click on OK button, the quantity is set to line(s)&lt;br /&gt;
[[File:Retail_wk_func_qty_after_exce_ok.png|thumbnail|center|600px]]&lt;br /&gt;
&lt;br /&gt;
==Web POS module==&lt;br /&gt;
POS Terminals represent the different terminals on each store and need to be configured properly in order to ensure operations are well supported in the backofice (e.g stock is updated in the backoffice when a sale is registered, invoice is created if customer requires it, etc.).&lt;br /&gt;
&lt;br /&gt;
Most of the configuration take place in two windows:&lt;br /&gt;
* POS Terminal Type&lt;br /&gt;
* POS Terminal&lt;br /&gt;
&lt;br /&gt;
The ''POS Terminal Type'' window contains what can be described as a &amp;quot;POS Terminal Configuration&amp;quot;. This is a configuration designed to model a type of POS terminal. Each ''POS Terminal'' can only have one POS Terminal configuration.&lt;br /&gt;
&lt;br /&gt;
It allows a very flexible configuration and an example would be a multi-store company. Each store could be managed differently (e.g have different cash up processes). In this case, different ''Pos Terminal Types'' could be defined for each store. And terminals within same store could share the same ''Pos Terminal Type''. &lt;br /&gt;
&lt;br /&gt;
This two tables are designed to simplify the configuration process for the user: if the user needs to configure 100 terminals, but all of them are basically identical, then the amount of data he will need to insert is quite small, because all POS terminals will point to the same POS Terminal configuration.&lt;br /&gt;
&lt;br /&gt;
In this section, we will first describe how ''POS Terminal Types'' are configured, and then we will describe the ''POS Terminal'' window.&lt;br /&gt;
&lt;br /&gt;
===POS Terminal Type window===&lt;br /&gt;
In this window, you basically design a POS Terminal configuration, which will be used by one or many POS terminals. Here you configure relevant information at POS level, but also at payment method level.&lt;br /&gt;
&lt;br /&gt;
[[Image:masterdata.png|800px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
In the header, you configure the following fields:&lt;br /&gt;
* '''Name''': The name of the POS terminal type&lt;br /&gt;
* '''Document type''': The document type used for sales orders, note see the [[Retail:Configuration_Guide#Configuring_for_performance|performance section]] for its influence on cashup and ticket creation performance in the backend.&lt;br /&gt;
* '''Document type for returns''': The document type for returned receipts&lt;br /&gt;
* '''Document type for reconciliations''': The document type used for the reconciliations done when executing the &amp;quot;Cash up&amp;quot; process in the POS&lt;br /&gt;
* '''Document type for quotations''': The document type for quotations&lt;br /&gt;
* '''Group orders in one invoice''': If checked, then all orders processed in Web POS without an invoice are grouped by Business Partner and an invoice for each group of orders is created in the Cash Up process. If unchecked, one invoice per order will be created. Note see the [[Retail:Configuration_Guide#Configuring_for_performance|performance section]] for its influence on cashup and ticket creation performance in the backend.&lt;br /&gt;
* '''Separate invoice for returns''' (Starting from RR18Q1): If selected, separate invoices will be generated during the cashup for sales orders and returns, respectively.&lt;br /&gt;
* '''Allow pay on credit''': If checked, all POS terminals of this POS terminal type will be able to pay sales orders as a credit.&lt;br /&gt;
* '''Default Payment Method''': Selects the payment method that will be used by default when closing a receipt.&lt;br /&gt;
* '''Use external input''':  (Previously '''Use barcode scanner''') If checked, the Web POS will take into account that an external input (keyboard or barcode scanner) is going to be used in this POS terminal type. Checking this option and then not connecting an external barcode will cause the virtual keyboard to be shown continuously in some devices (specifically in mobile devices (Android phones and tablets and iOS devices like iPads or iPhones).&lt;br /&gt;
* '''Hide virtual keyboard with barcode scanner''':  if '''Use external input''' is checked but you are using a barcode scanner in your mobile device which is not detected as en external keyboard, the virtual keyboard will appear very frecuently. Using this flag (enabled by default) it will not happen and the virtual keyboard will not be shown. (This feature does not work in iOS, so the value of this flag is ignored when web POS is running in iOS)&lt;br /&gt;
* '''Layaway Orders''' (Starting from RR15Q3): If selected, all new orders are created as layaways. This configuration option allows to create terminals that only creates layaways orders that are not paid in these terminals and must be paid in other terminal.&lt;br /&gt;
* '''Use RFID:''' (Starting from RR16Q3) Enables the use of an RFID reader. Also, in order to use the reader, the hardware url has to be set according with [[Retail:Configuration_Guide#POS_Terminal_window | this guide]].&lt;br /&gt;
* '''RFID Timeout:''' (Starting from RR16Q3) Set a timeout to Web POS after which a disconnect will be sent to the RFID reader (If this field is not set, the timeout is disabled). This timeout resets every time a product is scanned through the reader.&lt;br /&gt;
* '''Use Security Gate:''' (Starting from RR16Q3) This field establish that after every POS sale, the terminal will send the order to the Hardware Manager, and the latter will try to call to its respective sendOrder method. This method has to be implemented in a new Hardware Manager plugin if one wants to use this check. Basically is intended to be used if a communication with a security gate is needed.&lt;br /&gt;
* '''Multi Change''' (Starting from RR19Q1): If selected, it will be possible to return change in different currencies. Note see [http://wiki.openbravo.com/wiki/Projects:Multicurrency_Change_&amp;amp;_Rounding/Technical_Functional_Guide this guide] for the rest of the configuration needed.&lt;br /&gt;
In addition to these, there are two more fields which define how the masterdata reloading is done:&lt;br /&gt;
*'''Time to fully refresh masterdata (in minutes)''': A full refresh is the process of reloading the whole masterdata set (including products, business partners, prices, taxes, ...). This operation is very expensive and time consuming, so it should be done only when really needed (typically, every day). If done with too much frequency, this may tax too much the server, greatly slowing down the operation of POS terminals.&lt;br /&gt;
*'''Time to incrementally refresh masterdata (in minutes)''': This process is much lighter than a full refresh, because it only loads records which were changed from the last time a refresh was done. This is much less expensive than a full refresh, but has the disadvantage that if a record was deleted, it will not detect it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If neither of the fields is defined, then the system will fully refresh all data when the user logs in (and data will not be automatically refreshed until the next log in).&lt;br /&gt;
&lt;br /&gt;
If only the first field is filled, then the system will fully refresh all data in the next login done after of minutes specified in the field.&lt;br /&gt;
&lt;br /&gt;
If both fields are specified, then both incremental will be done each number of minutes as indicated in the field. The full refresh will be done in the next login done after of minutes specified in the field.&lt;br /&gt;
&lt;br /&gt;
==== Payment Method ====&lt;br /&gt;
&lt;br /&gt;
[[Image:PosTerminalTypePaymentMethod.png|800px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
In the Payment Method tab, you configure the following fields:&lt;br /&gt;
* '''Search key''': An identifier string for the payment method.&lt;br /&gt;
* '''Name''': The name of the payment method&lt;br /&gt;
* '''Payment method''': The Openbravo payment method associated with this POS payment method&lt;br /&gt;
* '''Currency''': The currency associated to this payment method in POS&lt;br /&gt;
* '''G/L Item for Writeoff''': In case the amount received when paying a ticket differs from what is expected, this G/L Item reflects this difference. '''We strongly recommend using the name of the POS terminal and the Payment method for naming the G/Item in order to avoid problems with matching transactions and bank statements. Example: ''VBS Cash overpayments'''''&lt;br /&gt;
* '''G/L Item for Rounding'''(Starting from RR19Q1): In case [http://wiki.openbravo.com/wiki/Retail:Configuration_Guide#Currency_Rounding_at_Store_Level rounding] is activated it is needed to configure this GL Item in order to associate it to rounding cash differences. &lt;br /&gt;
* '''Payment Provider''': Dialog that will be used to confirm the payment of a receipt using this payment method, usually the dialogs listed in this field are included by payment gateway modules.&lt;br /&gt;
* '''Refund Provider''': Dialog that will be used to confirm the refund of a return order using this payment method, usually the dialogs listed in this field are included by payment gateway modules.&lt;br /&gt;
* '''Allow Open Drawer''': If checked, to paid, the cash drawer will be opened&lt;br /&gt;
* '''Open drawer before closing ticket''': If checked, when paying a ticket, new step will appear to open drawer before finish paying the ticket.&lt;br /&gt;
* '''Cash''': When checked indicates this payment method is a cash method and will show a coins and bank notes panel when selected. To configure a new coins and bank notes panel go the document [[Retail:Developers_Guide/How-to/How_to_create_a_new_coins_and_bank_notes_selector  |How to create a new coins and bank notes selector]]. It also indicates that overpayments made with a ''cash'' method will be returned to the customer and the change to return to the customer will be calculated and displayed in the payment panel.&lt;br /&gt;
* '''Default Cash Payment Method''': only shown for a cash payment method, when there are multiple cash payment methods one of them can be flagged as the default cash payment method, is used for example when displaying the initial count view in the retail sessions module.&lt;br /&gt;
* '''Show coin keypad''': If the payment method is cash you can configure if you want to see the coin keypad checking this field to yes. If unchecked, the basic numeric pad will appear.&lt;br /&gt;
* '''Max. Limit Amount''' (Starting from RR15Q1): This amount limits the quantity of money you can use to pay a ticket for that payment method. For example if the tickets is 505€ and the limit for the cash payment method is 500 the system will show a message &amp;quot;The maximum limit (500 €) for this payment method has been exceeded. Payment not allowed&amp;quot;&lt;br /&gt;
* '''Overpayment Limit''' (Starting from RR15Q3)(Renamed to Overpayment / Change Limit in RR15Q4.2): This field is visible only for cash payment method that allows overpayment. If it contains a value, the amount of change that can be returned to a customer cannot be greater than the amount of this field, otherwise an error message will be shown to the cashier.&lt;br /&gt;
* '''Overpayment / Change Limit''' (Starting from RR15Q4.2): This field is visible for every payment methods and it is used to define the behavior regarding overpayments.&lt;br /&gt;
**If this field is empty, overpayments (change in case of payment method has been defined as cash) are allowed.&lt;br /&gt;
**If the value set in this field is 0, overpayments (change in case of payment method has been defined as cash) are not allowed.&lt;br /&gt;
**If the value set in this field is a number greater than 0, overpayments (change in case of payment method has been defined as cash) will be allowed if the amount of the overpayment (change in case of payment method has been defined as cash) is not greater than this value.&lt;br /&gt;
* '''Payment method Category''' (Starting from RR15Q2): This combo allows to group different payment methods in one category. This categorization means that when being in the payment panel instead of seeing all the payment methods the user will see just one. When clicking the button it will show the payment methods that belong to it&lt;br /&gt;
* '''Image''' (Starting from RR15Q2): This field makes sense when the payment methods is categorized, that is, when it belongs to a ''Payment Method Category''. When the popup gets opened it will show not only the name of the payment method but an image. Taping the image will select the payment&lt;br /&gt;
&lt;br /&gt;
=====Cash Up =====&lt;br /&gt;
* '''Count Payment in Cash Up''': (Starting from RR17Q2) This flag allows to avoid counting a payment method in Cash Up flows. The payment methods that have this flag unchecked are not taken into account when doing a Cash Up in the Web POS, not being possible even to count them. If this flag is unchecked, the other fields that belongs to the '''Cash Up''' group are ignored (are hidden).&lt;br /&gt;
* '''Automate movement to Other''': If this field is selected, there will be an additional step during the cash up process for this payment method, which will allow the user to specify how much money should be kept in the main account, and how much will be moved to a secondary account (configured in the ''Cash Management Events'' tab of ''Organization'' window). Hence, if you select this, following checks need to be considered, which are the different options given to the user while cashing up for this payment method:&lt;br /&gt;
* '''Keep Fixed amount:''' A fixed amount will be kept in the financial account of the terminal&lt;br /&gt;
* '''Amount:''': The amount for the previous option&lt;br /&gt;
*'''Allow variable amount''': If checked, the user will be able to input an amount to keep in the financial account of the terminal&lt;br /&gt;
* '''Allow not to move''': If checked, the user will be able to keep everything in the financial account of the terminal, so not &amp;quot;moving&amp;quot; money&lt;br /&gt;
*'''Allow move everything:''' If checked, the user will be able to move all money to the destination financial account configured in the ''Cash Management Event''&lt;br /&gt;
* '''Cash differences''': This G/L Item is used if there are cash differences during cash up (theoretical amount different than the counted one). The created transaction will be associated with it. '''We strongly recommend using the name of the POS terminal and the Payment method for naming the G/Item in order to avoid problems with matching transactions and bank statements. Example: ''VBS Cash differences'''''&lt;br /&gt;
* '''Cash deposit/withdrawal''': This G/L Item is the one associated in the transaction added in the financial account in both terminal and backoffice after cash up processed is processed. So it is important a G/L Item is configured here. '''We strongly recommend using the name of the POS terminal and the Payment method for naming the G/Item in order to avoid problems with matching transactions and bank statements. Example: ''VBS Cash G/L Item for Cash up'''''&lt;br /&gt;
* '''Count Cash''': For payment methods marked as ''Cash'' indicates whether to show or not a cash count step in the cash up process to count the cash amount in the drawer with the help of currency denominations. To activate this option you must configure first ''Coins and Bank notes'' in the ''Currency'' window for the payment method currency.&lt;br /&gt;
&lt;br /&gt;
=====Cash management=====&lt;br /&gt;
*'''Allow withdrawals''': If checked, withdrawals can be created associated with this payment method&lt;br /&gt;
*'''GLItem for withdrawals''': The G/L Item associated with the transactions created for withdrawals. '''We strongly recommend using the name of the POS terminal and the Payment method for naming the G/Item in order to avoid problems with matching transactions and bank statements. Example: ''VBS Cash withdrawal'''''&lt;br /&gt;
*'''Allow deposits''': If checked, deposits can be created associated with this payment method&lt;br /&gt;
*'''GLItem for deposits''': The G/L Item associated with the transactions created for deposits. '''We strongly recommend using the name of the POS terminal and the Payment method for naming the G/Item in order to avoid problems with matching transactions and bank statements. Example: ''VBS Cash differences'''''&lt;br /&gt;
&lt;br /&gt;
=====Change Logic=====&lt;br /&gt;
{{(!)| This configuration will be available starting from RR19Q1}}&lt;br /&gt;
This section applies if [http://wiki.openbravo.com/wiki/Projects:Multicurrency_Change_&amp;amp;_Rounding/Technical_Functional_Guide Multi Change] is enabled&lt;br /&gt;
*'''Change less than''': Amount that has to be returned in another currency&lt;br /&gt;
*'''Change Payment''': Currency in which change has to be returned if amount is less than selected in &amp;quot;Change less than&amp;quot; field&lt;br /&gt;
&lt;br /&gt;
{{(!)|Starting from '''RR15Q2''' below functionality is available }}&lt;br /&gt;
&lt;br /&gt;
If ''Leave as Credit'' field is set to 'Y' that payment method wont take part on the CashUp process since it is not going to get paid. It won't also have a Financial Account associated.&lt;br /&gt;
&lt;br /&gt;
[[Image:LeaveAsCredit.png|800px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
==== Hardware URL ====&lt;br /&gt;
&lt;br /&gt;
{{(!)|Starting from '''RR17Q1''' below functionality is available }}&lt;br /&gt;
&lt;br /&gt;
In the tab Hardware URL you can configure a list of Hardware Manager (only for printer devices) to allow the cashier to select a different printer to use in the case he wants to or the current selected printer is not working for any reason. This list of Hardware URL addresses is shared by all the terminals with the same POS Terminal Type and it must be configured using the [[#Hardware Manager window | Hardware Manager window]].&lt;br /&gt;
&lt;br /&gt;
[[Image:posterminaltypeprinters.png|800px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
==== Terminal for Seller ====&lt;br /&gt;
&lt;br /&gt;
{{AvailableFrom|3.0RR17Q3}}&lt;br /&gt;
&lt;br /&gt;
From '''RR17Q3''', a new concept of terminal have been included. These terminals are '''Terminals for Sellers'''.&lt;br /&gt;
&lt;br /&gt;
'''Terminals for Sellers''' are terminals distributed in different sections of a store. These terminals are only used to create ''layaways'', so are never used to directly buy or return products. An example may be a customer who is in a supermarket, in the fruits section. This customer chooses four apples and asks to a seller to create a layaway with those four apples, which will be paid to a vendor in a normal terminal.&lt;br /&gt;
&lt;br /&gt;
To consider a terminal to be a '''Terminal for Seller''', the terminal needs to belong to a ''Pos Terminal Type'' with an specific configuration:&lt;br /&gt;
* The '''Layaway Orders''' field must be checked.&lt;br /&gt;
* The ''Pos Terminal Type'' may only contain payment methods that are not counted in the '''Cash Up''' process.&lt;br /&gt;
* The roles that are accessing to these terminals should have the ''Web POS action Receipt this Layaway'' property set to 'N'.&lt;br /&gt;
&lt;br /&gt;
As commented before, a '''Terminal for Seller''' should never be used to pay tickets or return products. These terminals don't contain a drawer, so any operation related to a cash movement is not allowed. Due to this reason, '''Terminals for Sellers''' are not allowed to do ''Cash Ups'' or any operation available in the ''Cash Management'' window. The following functionalities are disabled here:&lt;br /&gt;
* '''Open Drawer'''&lt;br /&gt;
* '''Cash Up'''&lt;br /&gt;
* '''Cash Up Partial'''&lt;br /&gt;
* '''Cash Management'''&lt;br /&gt;
* '''Verified Returns''': The verified return menu entry is disabled, but is not also possible to do any type of return, because the new created tickets will always be layaways&lt;br /&gt;
&lt;br /&gt;
As the ''Cash Up'', ''Cash Up Partial'' and ''Cash Management'' menu entries are disabled, if an user tries to navigate directly to any one of those pages directly by URL, a popup will appear telling that a '''Terminal for Seller''' cannot navigate to that URL.&lt;br /&gt;
&lt;br /&gt;
''Payment methods not counted in the Cash Up process:''&lt;br /&gt;
&lt;br /&gt;
Even if this type of terminal is not considered to work with payments, there are some flows that may need to get money back. Those flows are:&lt;br /&gt;
* '''Void Layaway'''&lt;br /&gt;
* '''Cancel Layaway'''&lt;br /&gt;
* '''Cancel and Replace''' removing products that were previously fully or partially paid&lt;br /&gt;
&lt;br /&gt;
These three situations will be always managed using payment methods that are not counted in the cash up, so which won't need to have a drawer in the terminal.&lt;br /&gt;
&lt;br /&gt;
If the Sessions module is used, Terminals for Sellers are also considered and their behavior particularly when the Store is closed changes a bit. You can find a bit more information [http://wiki.openbravo.com/wiki/Projects:POS_Terminal_Session_Management/User_Guide#Terminal_for_Seller_2 here]&lt;br /&gt;
&lt;br /&gt;
===POS Terminal window===&lt;br /&gt;
In this window specific POS terminals can be added. Every POS terminal needs to be added here.&lt;br /&gt;
&lt;br /&gt;
[[Image:PosTerminal.png|800px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
In the header, the following fields are configured:&lt;br /&gt;
* '''Search key''': An identifier for this terminal, it must be unique and it is the one that is going to be used in the URL to access the terminal&lt;br /&gt;
* '''Name''': The name of the terminal&lt;br /&gt;
* '''Hardware URL''': The URL of the receipt printer, it will be given by the hardware manager, followed by /printer&lt;br /&gt;
* '''Scale URL''': The URL of the scale&lt;br /&gt;
* '''Order Document No PREFIX''': This prefix is used for the POS order documents generated in ''Sales Order'' window in the backoffice for each ticket of the POS terminal&lt;br /&gt;
* '''Order Quotation No Prefix''': This prefix is used for the document number of POS quotations generated in this POS terminal.&lt;br /&gt;
* '''POS Terminal type''': The Terminal Type which describes the configuration used by this POS terminal&lt;br /&gt;
* '''Default Tab for Web POS''': Ability to define whether the tab for selecting products is Scan (when scanning products is the main action) or the browse&lt;br /&gt;
* '''Default customer''': The customer can be configured at store level or at terminal level. In this case it is more restrictive so if it is filled then the system will use this customer instead&lt;br /&gt;
* '''Terminal Key Identifier''': When ''Terminal Authentication enabled'' preference is 'Y', this is the code for this POS Terminal configuration. Using for first time a physical device connecting to Web POS we will be able to link the device to this configuration using this code.&lt;br /&gt;
* '''Is linked to a physical device''': This field is checked when a physical device is linked to this POS Terminal configuration using Terminal Authentication security.&lt;br /&gt;
* '''Unlink device''': This process button allow us to unlink the actual physical device from this configuration. We could lose data not synchronized in the ERP (terminal is offline and exists data to send to the ERP), we need to be sure of this action.&lt;br /&gt;
* '''Cache Session Id''': This read only field shows the id which identifies the current cache session id. This id must match with terminal cache session id to allow login.&lt;br /&gt;
{{(!)|Starting from '''RR16Q3''' below functionality is available }}&lt;br /&gt;
* '''Return No Prefix''': This prefix is used for the document number of POS returns generated in this POS terminal. It's not mandatory, and if it's not set, then return documents will share the sequence with normal sales orders.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:PaymentCash.png|800px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
In the payment type, the following information is configured:&lt;br /&gt;
&lt;br /&gt;
* '''Search key''': It is an identifier string for the payment method.&lt;br /&gt;
* '''Name''': The name of the payment method&lt;br /&gt;
* '''Payment method''': The payment method type defined in the POS Terminal Type, which contains the configuration information for this payment method&lt;br /&gt;
* '''Financial account''': The financial account associated with this payment '''''Very important: The financial account must be associated only with this payment. It should not be used in operations generated in backoffice, only transacctions generated in the terminal should be deposited. The Organization of the Financial Account, must be in the Org Access list of the User Role (Only in the Cash Up process)'' '''. POS processes will not work correctly otherwise. (Starting from RR17Q2) The payment methods are not automatically deposited in the financial account. Instead, the '''Automatic Deposit''' field that belongs to the '''Payment Method''' tab in the '''Financial Account''' window is checked to do or not the deposit automatically&lt;br /&gt;
* '''Cash management close event''': The cash management close event which should be used when executing the cash up process&lt;br /&gt;
&lt;br /&gt;
'''Very important. Payment methods are secured by Search key value in Role preferences'''. There are three predefined values: ''OBPOS_payment.cash'' for cash payments. ''OBPOS_payment.cash'' payment method is also used to calculate cash change in the payment panel. ''OBPOS_payment.card'' for card payments and ''OBPOS_payment.voucher'' for voucher payments. If you need to add new payments with different ''Search key'' values you need to secure them in order to allow users to use the new payments you create. To do this, as ''System Administrator'' you need to go to the window ''References'', in this window search the record with name ''Property Configuration'' and in the tab ''List Reference'' add a new record with the same Search key as the new payment you need to add. This new record should belong to your own module which should be dependent from the Web POS module. Once it is created you will be able to assign permissions to this new payment in the ''Preferences'' window.&lt;br /&gt;
&lt;br /&gt;
'''Note'''. The search key field in the tab ''List Reference'' must start with the DB prefix of the module you are creating this value, but the search key of the payment method does not need to start with any prefix, so for example if the search key in ''List Reference'' is ''OBPOS_payment.mypayment'' the search key in the payment method to secure can be ''OBPOS_payment.mypayment'' or ''payment.mypayment''.&lt;br /&gt;
&lt;br /&gt;
'''Note'''. When a ticket is created within Web POS, the information related to the payments of this order is stored in Sales Order &amp;gt; Payment plan &amp;gt; payment details&lt;br /&gt;
&lt;br /&gt;
'''Note'''. Do not add payment types if this posterminal has an open cashup. This window is to define configurations before start working in Web POS, if you change the configuration while the terminal is operating you could have errors in the terminal or data inconsistency.&lt;br /&gt;
&lt;br /&gt;
[[Image:cashUpHistory.png|800px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
In the cash up history, the following information is configured:&lt;br /&gt;
&lt;br /&gt;
* '''Organization''': It is store of the POS Terminal.&lt;br /&gt;
* '''User/Contact''': The name of the user who did the cash up.&lt;br /&gt;
* '''Cashupdate''': The date when the cash up was done.&lt;br /&gt;
* '''Cash Up Report''': This process button, create a pdf report with all the information about the cash up.&lt;br /&gt;
&lt;br /&gt;
In the reconciliation subtab, the following information is configured:&lt;br /&gt;
&lt;br /&gt;
* '''Payment type''': It is payment type which is related to the financial account of the reconciliation.&lt;br /&gt;
* '''Reconciliation''': The reconciliation itself.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{(!)|The functionality described below is available starting from '''15RRQ2'''}}&lt;br /&gt;
* '''Override POS Terminal Type Configuration:''' this flag allows to override the configuration of the cash up defined in the POS terminal type – Payment Method.&lt;br /&gt;
** '''Automate movement to Other: '''If this field is selected, there will be an additional step during the cash up process for this payment type, which will allow the user to specify how much money should be kept in the main account, and how much will be moved to a secondary account (configured in the Cash Management Events tab of Organization window). Hence, if you select this, following checks need to be considered, which are the different options given to the user while cashing up for this payment method:&lt;br /&gt;
** '''Keep Fixed amount: '''A fixed amount will be kept in the financial account of the terminal&lt;br /&gt;
** '''Amount: '''The amount for the previous option&lt;br /&gt;
** '''Allow variable amount: '''If checked, the user will be able to input an amount to keep in the financial account of the terminal&lt;br /&gt;
** '''Allow not to move: '''If checked, the user will be able to keep everything in the financial account of the terminal, so not &amp;quot;moving&amp;quot; money&lt;br /&gt;
** '''Allow move everything: '''If checked, the user will be able to move all money to the destination financial account configured in the Cash Management Event&lt;br /&gt;
** '''Cash differences: '''This G/L Item is used if there are cash differences during cash up (theoretical amount different than the counted one). The created transaction will be associated with it. '''We strongly recommend using the name of the POS terminal and the Payment method for naming the G/Item in order to avoid problems with matching transactions and bank statements. Example: VBS Cash differences'''&lt;br /&gt;
** '''Cash deposit/withdrawal: '''This G/L Item is the one associated in the transaction added in the financial account in both terminal and backoffice after cash up processed is processed. So it is important a G/L Item is configured here. '''We strongly recommend using the name of the POS terminal and the Payment method for naming the G/Item in order to avoid problems with matching transactions and bank statements. Example: VBS Cash G/L Item for Cash up'''&lt;br /&gt;
** '''Count Cash: '''For payment type marked as Cash indicates whether to show or not a cash count step in the cash up process to count the cash amount in the drawer with the help of currency denominations. To activate this option you must configure first Coins and Bank notes in the Currency window for the payment type currency.&lt;br /&gt;
&lt;br /&gt;
[[Image:overridePOSTerminalConfiguration.png|800px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
{{(!)|Starting from '''RR15Q4''' below functionality is available}}&lt;br /&gt;
&lt;br /&gt;
In POS Terminal window you can define a hierarchy of terminals in order to allow to share any payment method you have accross terminals of the same organization. &lt;br /&gt;
e.g.- There are 4 terminals in an store but you have only one pinpad.&lt;br /&gt;
&lt;br /&gt;
[[Image:TerminalHierarchyMaster.png|800px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
More than two levels of hierarchy are not supported. This means that a “master” terminal cannot be slave of any terminal.&lt;br /&gt;
&lt;br /&gt;
[[Image:TerminalHierarchySlave.png|800px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
A POS terminal can use both standard payment methods and shared payment methods at the same time.&lt;br /&gt;
&lt;br /&gt;
When a POS terminal is defined in the backoffice, another terminal can be specified as its “master”. When this is done, two important changes happen in the POS operation:&lt;br /&gt;
* Shared payment methods can be defined. Shared payment methods will not appear in the “slave” terminals when doing the cash up, and will only appear in the “master” terminal. Standard payment methods will appear normally in the cash up of each terminal.&lt;br /&gt;
* The cash ups for the “slave” terminals must be done before the cash up in the “master” terminal can be done. The cash ups in the “slave” terminals will not have any real consequence in the backend other than enabling the cash up in the master terminal. The invoices and reconciliations for the payments generated in all the terminals will be created only when the cash up in the “master” terminal is done.&lt;br /&gt;
* The Shared Payment Type from the same Payment methods needs to have the same Financial Account associated.&lt;br /&gt;
&lt;br /&gt;
[[Image:PaymentMethodShared.png|800px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{(!)|The functionality described below is available starting from '''RR17Q2'''}}&lt;br /&gt;
&lt;br /&gt;
** '''Refundable: '''For payment type marked as Refundable it will be possible to refund to the Customer on that Payment Method. In the case it is unmarked it will not be possible to add a negative payment with that Payment Method from WebPOS.&lt;br /&gt;
&lt;br /&gt;
** '''Show-Hide Taxes: '''A new button called show Tax Breakdown has been added in the POS Terminal Type screen to show or hide taxes in Web POS.&lt;br /&gt;
====Terminal status====&lt;br /&gt;
&lt;br /&gt;
{{(!)|Starting from '''RR18Q2''' below functionality is available}}&lt;br /&gt;
Through the terminal window, it is also possible to monitor some key metrics and facts of each terminal in the system.&lt;br /&gt;
&lt;br /&gt;
The information is shown in terminal window header and it is grouped in Terminal Status section.&lt;br /&gt;
&lt;br /&gt;
The user could monitor the following information in Terminal Status section&lt;br /&gt;
&lt;br /&gt;
* Last Full Masterdata Load&lt;br /&gt;
** Datetime field with the information of the last time current terminal has completed successfully a full refresh of masterdata. For more information, refer to [http://wiki.openbravo.com/wiki/Retail:Configuration_Guide#POS_Terminal_Type_window Time to fully refresh masterdata section].&lt;br /&gt;
* Last Incremental Masterdata Load&lt;br /&gt;
** Datetime field with the information of the last time current terminal has completed successfully an incremental refresh of masterdata. [http://wiki.openbravo.com/wiki/Retail:Configuration_Guide#POS_Terminal_Type_window Time to incrementally refresh masterdata section].&lt;br /&gt;
* Last Cache Generation&lt;br /&gt;
** Datetime field with the information of the last time current terminal has generate cache data. For more information, refer to [http://wiki.openbravo.com/wiki/Retail:Web_POS_User_Guide#The_local_database:_how_the_Web_POS_uses_it_and_when_it.27s_safe_to_clear_the_browser_cache WebPOS cache section].&lt;br /&gt;
* Last JS Generation&lt;br /&gt;
** Datetime field with the information of the last time current terminal has upload of WebPOS js file. For more information, refer to [http://wiki.openbravo.com/wiki/Openbravo_3_Architecture#ETags.2C_Caching_and_Compressing caching and compression section].&lt;br /&gt;
&lt;br /&gt;
[[Image:Terminal_status.png|800px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
=====Terminal status extension=====&lt;br /&gt;
{{(!)|Starting from '''RR18Q4''' below functionality is available}}&lt;br /&gt;
As an extension of previous terminal status values user can monitor, now it is possible to monitor more in detail the current status of a terminal from POS Terminal Window&lt;br /&gt;
&lt;br /&gt;
The information, as before, is shown in POS Terminal window header and it is grouped in Terminal Status section.&lt;br /&gt;
&lt;br /&gt;
The user could monitor the following new information in Terminal Status section&lt;br /&gt;
&lt;br /&gt;
* Last Log In Date&lt;br /&gt;
** Datetime field with the information of the last time a user logs in the specific terminal.&lt;br /&gt;
* Last Log In User&lt;br /&gt;
** Reference field with the information of the last user logged in the terminal.&lt;br /&gt;
* Last Performance Check Score&lt;br /&gt;
** Score of the last benchmark done in the terminal, refer to [http://wiki.openbravo.com/wiki/Retail:PerformanceTesting POS Terminal Performance Testing].&lt;br /&gt;
* Last Synchronized Order&lt;br /&gt;
** Datetime field with the information of the last sales order/layaway synchronized to the ERP from the terminal.&lt;br /&gt;
* Last Completed Cashup&lt;br /&gt;
** Datetime field with the information of the last processed cashup done in the terminal.&lt;br /&gt;
* Last Loaded Ticket&lt;br /&gt;
** Datetime field with the information of the last completed sales order loaded in the terminal.&lt;br /&gt;
* Last Transition To Offline&lt;br /&gt;
** Datetime field with the information of the last time the terminal goes offline ('''this information is updated once the terminal goes online again'''), refer to [http://wiki.openbravo.com/wiki/Retail:Web_POS_User_Guide#Offline_Operations Terminal Offline mode].&lt;br /&gt;
* Last Transition to Online&lt;br /&gt;
** Datetime field with the information of the last time the terminal goes back online.&lt;br /&gt;
&lt;br /&gt;
[[Image:Terminal_status_ext.png|800px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
In addition, a new sub tab has been created in POS Terminal window called &amp;quot;Terminal Status History&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Terminal Status History records are created once the cash up is synchronized with the ERP and are updated until the current cash up is processed in WebPOS.&lt;br /&gt;
&lt;br /&gt;
The information the user could monitor is&lt;br /&gt;
&lt;br /&gt;
* Cash Up&lt;br /&gt;
** The cash up related with this monitor process.&lt;br /&gt;
* Number Of Transitions to Online&lt;br /&gt;
** Number of times the terminal switches from offline mode to online mode during this cash up.&lt;br /&gt;
* Number Of Logclient Errors&lt;br /&gt;
** Number of logclient error registered during this cash up.&lt;br /&gt;
* Number Of Errors While Importing POS Data&lt;br /&gt;
** Number of records in Errors While Importing POS Data registered during this cash up.&lt;br /&gt;
&lt;br /&gt;
[[Image:Terminal_status_ext_history.png|800px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
===Configuring for performance===&lt;br /&gt;
Several settings have consequences for the performance of Web POS in the backend operations: creating orders, invoices and doing cashups. This section gives an overview of some settings.&lt;br /&gt;
&lt;br /&gt;
====Group orders in one invoice - Cashup Performance====&lt;br /&gt;
In the POS Terminal Type you can check the group orders in one invoice. If this flag is not checked then each ticket in Web POS will result in a separate invoice in the backend. These invoices are created when doing the cashup.&lt;br /&gt;
&lt;br /&gt;
If shops close at the same time and several shops do the cashup at the same time this can result in the cashups of different shops waiting for each other as they might share the same document sequences for invoices. See the next subsection on document sequences for more information.&lt;br /&gt;
&lt;br /&gt;
In general it is fine/best to check the group orders in one invoice flag. This results in better cashup performance, smaller database sizes and most of the time no separate invoice is needed as there is already a printed ticket for the customer. &lt;br /&gt;
&lt;br /&gt;
====Generate invoice for orders====&lt;br /&gt;
Another setting in the POS Terminal Type specifies if a separate invoice should be generated for each order/ticket when the ticket is created. This results in a slighly slower ticket creation in the backend. The Web POS user does not notice this as the backend ticket creation does not block the Web POS user interface. But having a separate invoice for each ticket will result in much more data in the database and more load on the server.&lt;br /&gt;
&lt;br /&gt;
So the advice is to only check this option if it is really needed and in all other cases keep it unchecked.&lt;br /&gt;
&lt;br /&gt;
====Document Type and Sequence Numbers - (Cashup) Performance Consequences====&lt;br /&gt;
&lt;br /&gt;
The document type defines the document sequence which is being used for orders and also defines the document types for invoices and other business documents.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:POSTerminalTypeDocSequence.png|800px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
When creating new orders, shipments and invoices the system uses the document sequence to generate a new document number for the business document (order/invoice/shipment). Document numbers need to be unique and also need to be incremented correctly. To ensure this the system will lock the database while creating business documents. If different POS terminals share the same document sequence for a business document then POS actions of these terminals will sometimes wait on eachother (at database level) when new document sequence numbers are created. Especially with large cashups this can result in longer processing times.&lt;br /&gt;
&lt;br /&gt;
'''Therefore the advice is to let different POS Terminals use different document sequences, especially in high volume environments.''' This means that different POS terminals will have to make use of different POS Terminal Types.&lt;br /&gt;
&lt;br /&gt;
====Querying performance====&lt;br /&gt;
{{(!)|Starting from '''RR16Q1''' below functionality is available }}&lt;br /&gt;
Sometimes we could suffer performance problems when we are searching something in Web POS and it takes time to render all the items or when we have an environment with high volumes. Because of that, we can set this three preference (''Searching in WebPOS limit value for Products, Searching in WebPOS limit value for Customers and Searching in WebPOS limit value for Orders''). We have to put the number of items we would like to show in a search. By default this value is 300, in case you want to show less items, set preferences with your selected value. This feature is available searching Products, Customers and also Orders(Paid orders, layaways, quotations...).&lt;br /&gt;
&lt;br /&gt;
===Synchronized order===&lt;br /&gt;
&lt;br /&gt;
Enabling ''Synchronized Request Order'' we will enable this functionality. From 16Q2.&lt;br /&gt;
&lt;br /&gt;
This functionality makes the transaction be processed on the server completely synchronously. So the WebPOS user interface wait for the confirmation that the record has been successfully processed on one of the servers before it can proceed.&lt;br /&gt;
If an error occurs the ticket is not saved on the server and a message is sent to the WebPOS client to show the error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Hardware Manager window ===&lt;br /&gt;
&lt;br /&gt;
{{(!)|Starting from '''RR17Q1''' below functionality is available }}&lt;br /&gt;
&lt;br /&gt;
This window defines the list of Hardware Manager URLs with configured printers that are available for assigning to POS Terminal Types.&lt;br /&gt;
&lt;br /&gt;
See [[#Hardware_URL | Hardware URL ]] for configuring Hardware Managers for each Terminal Type.&lt;br /&gt;
&lt;br /&gt;
For each Hardware Manager record you have to configure the following fields:&lt;br /&gt;
&lt;br /&gt;
* '''Name''': The name that will appear in the dialog to select printer.&lt;br /&gt;
* '''Hardware UR'''L: The URL where the Hardware Manager is located. It must be the root location of the Hardware Manager web server.&lt;br /&gt;
* '''Has Receipt Printer''': Indicates if the printer can be selected to print receipts.&lt;br /&gt;
* '''Has PDF Printer''': Indicates if the printer can be selected to print PDF documents like service documents.&lt;br /&gt;
* '''Active''': Indicates whether the printer is active or not.&lt;br /&gt;
&lt;br /&gt;
[[Image:hardwaremanagerwindow.png|800px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Offline Mode ===&lt;br /&gt;
&lt;br /&gt;
The WebPOS supports offline operation. One of the most important parts of the support for offline operation is being able to save the application sources in a persisted state, so that if the connection is not available, the application can nonetheless be started correctly.&lt;br /&gt;
&lt;br /&gt;
In previous versions of the application, we used the [https://developer.mozilla.org/en-US/docs/Web/HTML/Using_the_application_cache Application Cache technology] to persist the application sources. This is still supported in current versions, and we expect to keep it for some time. However, starting from '''RR18Q3''' we now also support the persisting of application sources using [https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API Service Workers]. Service Workers are the preferred way to persist the sources nowadays, because they are more flexible and they give greater control to the developer of which resources he wants to cache, and how to manage this cache. However, they are not yet fully available in all browsers, which is the main reason why we are keeping the support for Application Cache as of now.&lt;br /&gt;
&lt;br /&gt;
{{(!)|Starting from '''RR18Q3''' Service Workers are enabled by default. Remember that we need to use HTTPS to make it work properly}}&lt;br /&gt;
&lt;br /&gt;
However, as previously explained, it is possible to switch between Service Workers and Application Cache using the preference &amp;quot;Web POS Use Service Workers for Offline Support&amp;quot;. This is a system-admin preference which must be defined using System Administrator role, and only once per system. If it's set to 'Y' (or if it doesn't exist) then Service Workers are enabled, otherwise Application Cache will be used instead.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{(!)|Starting from '''18Q4''' It is possible to restrict the amount of time the terminal can remain in offline mode}}&lt;br /&gt;
&lt;br /&gt;
This can be configured with the &amp;quot;Web POS Maximum time which the terminal can be offline&amp;quot; preference.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{(!)|Starting from '''18Q4''' Offline mode has changed slightly, and now it doesn't necessarily require authentication}}&lt;br /&gt;
&lt;br /&gt;
You can use the &amp;quot;Web POS Offline session time expiration&amp;quot; preference to specify how much time will the WebPOS consider a session still valid while being offline. This will slightly change the way the POS behaves is the user refreshes the application while being offline: before, it would always ask for the user to enter credentials to continue, and now it will only ask him to do so if the session is no longer considered valid.&lt;br /&gt;
&lt;br /&gt;
== Security Settings ==&lt;br /&gt;
[[Image:windowaccess.png|thumbnail|right|150px|View larger]]&lt;br /&gt;
Not every user is supposed to have access to Web POS and not every Web POS user is supposed to have access to Cash Up and Cash Management. You can set access to these windows in the back office as follows.&lt;br /&gt;
&lt;br /&gt;
'''Enabling a role to access Web POS:'''&lt;br /&gt;
*Go to the Role window in the back office (''General Setup &amp;gt; Security &amp;gt; Role'')&lt;br /&gt;
*Select the role you want to grant access to Web POS to&lt;br /&gt;
*Go to the child tab called ''Form Access''&lt;br /&gt;
*If it does not exist yet, create a new record and set the ''Special Form'' field to ''Web POS''.  &lt;br /&gt;
*Save and reload the Web POS for the changes to take effect&lt;br /&gt;
&lt;br /&gt;
'''Setting access to specific functionality:'''&lt;br /&gt;
&lt;br /&gt;
Note roles defined as ''Automatic'' ([[Role#Role|''Manual'']] field is unchecked) have access to all functionality regardless preferences.&lt;br /&gt;
&lt;br /&gt;
*Go to the Preference window in the back office (''General Setup &amp;gt; Application &amp;gt; Preference'')&lt;br /&gt;
*Create a new record and select the functionality in the ''Property'' field. For example ''order.discount'' or ''Web POS window Cash Up''.&lt;br /&gt;
*Set the value to ''Y'' in the value field to enable access.&lt;br /&gt;
*Set the desired visibility in the Visibility section below.&lt;br /&gt;
*Save and reload the Web POS for the changes to take effect&lt;br /&gt;
&lt;br /&gt;
The following functionalities are relevant for Web POS users:&lt;br /&gt;
*Changing price (''Web POS action Change price'', by default revoked)&lt;br /&gt;
*Giving discount (''Web POS action Apply discount'', by default revoked)&lt;br /&gt;
*Invoice receipt (''Web POS action Invoice receipt'', by default granted)&lt;br /&gt;
*Return receipt (''Web POS action Return receipt'', by default granted)&lt;br /&gt;
*Print report in Cash Up (''Web POS action Print cash up'', by default granted)&lt;br /&gt;
*Print report in Cash Management (''Web POS action Print cash management'', by default granted)&lt;br /&gt;
*Print receipt menu action (''Web POS action Print receipt'', by default revoked)&lt;br /&gt;
*Reject a quotation from the menu ('Web POS Quotation rejections', by default granted, available from 3.0RR15Q4)&lt;br /&gt;
*Using payment type card (''Web POS payment Card'', by default granted)&lt;br /&gt;
*Using payment type cash (''Web POS payment Cash'', by default granted)&lt;br /&gt;
*Using payment type voucher (''Web POS payment Voucher'', by default granted)&lt;br /&gt;
*Accessing Cash Management (''Web POS window Cash management'', by default revoked)&lt;br /&gt;
*Accessing Cash Up (''Web POS window Cash Up'', by default revoked)&lt;br /&gt;
*Accessing Point of Sale (''Web POS window Point of Sale'', by default granted)&lt;br /&gt;
*Accessing Back Office (''Web POS Back Office'', by default granted)&lt;br /&gt;
*Creating [[Retail:Discounts_and_Promotions_Rules#Discretionary_Discounts|Discretionary Discounts]] (''Web POS action Advanced Discounts'', by default granted; together with ''Web POS action Apply discount'')&lt;br /&gt;
*Editing ''Firm Quotation'' check when creating order from Quotation (''Web POS Quotation: Editable Firm Check'', default granted, available from RMP27)&lt;br /&gt;
*Change profile settings (''Mobile Change Profile'', by default granted, available from RMP30). Allows to change profile settings (role and language)&lt;br /&gt;
*Sales with Returns (''Do not allow Sales with return'', by default revoked)&lt;br /&gt;
*Switch from positive to return line ('Web POS Show Action Button Return'', by default granted)&lt;br /&gt;
*Multi Order (''Web POS Enable Multi Order menu entry'', by default granted)&lt;br /&gt;
*Receipt Discounts from Keyboard (''Web POS Open Discounts From Keyboard'', by default granted, available from RMP28)&lt;br /&gt;
*Open Drawer button (''Web POS Open drawer from menu'', by default granted, available from RMP29)&lt;br /&gt;
*Select a specific warehouse to consume the goods for a specific order line (''Allow to select a warehouse for a specific line order''), by default revoked.&lt;br /&gt;
*Enable the functionality to split in shipment lines, lines from orders to be returned. (''Split Lines in Shipments when Returning'', by default disabled, available from RR15Q2) &lt;br /&gt;
*Save removed tickets or ticket lines in the backend when the user chooses to delete (Web POS Save Removed Tickets, by default revoked).&lt;br /&gt;
*Enable the functionality to have layaways with negative lines if there are no partial payments. (''Allow layaways with negative lines'', by default disabled, available from RR18Q2) &lt;br /&gt;
&lt;br /&gt;
The following functionalities are related to Quotations:&lt;br /&gt;
*Create Quotation (''Web POS action create new quotation'', by default revoked)&lt;br /&gt;
*Sales Order from Quotation (''Web POS action create sales order from quotation, by default revoked)&lt;br /&gt;
*Reactivate Quotation (''Web POS action reactivate quotation'', by default revoked)&lt;br /&gt;
*Show Quotation (''Web POS action show quotations'', by default revoked)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note that access to Cash Up and Cash Management will be disabled by default for new roles.&lt;br /&gt;
&lt;br /&gt;
When the user has no access to specific menu entries these ones will be hidden in the menu&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Enabling specific terminals for users:'''&lt;br /&gt;
&lt;br /&gt;
Starting Openbravo for Retail RMP20, specific users can be given access to specific POS terminals. This is done through the '''POS Terminal Access''' tab in the '''User''' window.&lt;br /&gt;
&lt;br /&gt;
[[Image:terminalaccess.png|thumbnail|right|150px|View larger]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following rules are followed to decide whether a user has access to a terminal or not:&lt;br /&gt;
* If a user doesn't have entries in the POS Terminal Access tab, then it can log in all the available POS Terminals (provided that it has access to a role with access to the Web POS form).&lt;br /&gt;
* If a user has entries in the POS Terminal Access tab, then it can only access the terminals specified there.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{(!)|Starting from '''RR17Q4''' below functionality is available }}&lt;br /&gt;
Several preferences have been created to be able to show or hide the action buttons related to the products in the order. The default value is to show them.&lt;br /&gt;
Some examples of the preferences:&lt;br /&gt;
* Web POS Show Action Button Check Stock&lt;br /&gt;
* Web POS Show Action Button Delete&lt;br /&gt;
* Web POS Show Action Button Description&lt;br /&gt;
* Web POS Show Action Button Remove Discount&lt;br /&gt;
* Web POS Show Action Button Return&lt;br /&gt;
* Web POS Show Action Button Show Related Services&lt;br /&gt;
* Web POS Show Action Button Split&lt;br /&gt;
&lt;br /&gt;
=== Approvals ===&lt;br /&gt;
&lt;br /&gt;
{{(!)|This feature is available starting from '''RMP26'''}}&lt;br /&gt;
&lt;br /&gt;
Some actions require of supervisor's approval in order to be accomplished.&lt;br /&gt;
&lt;br /&gt;
When an action requiring of approval is performed a pop up requesting supervisor's credentials is shown and it is not possible to continue till these credentials are provided or the approval is cancelled aborting the action in this way.&lt;br /&gt;
&lt;br /&gt;
In case the user launching the action is a supervisor, no approval is requested to complete it.&lt;br /&gt;
&lt;br /&gt;
==== Supervisor ====&lt;br /&gt;
&lt;br /&gt;
Each action requiring approval can have its own supervisors, thus it is possible for a user to be supervisor of action A but not action's B supervisor.&lt;br /&gt;
&lt;br /&gt;
Each Approvable Action require of a different preference to be set:&lt;br /&gt;
* &amp;quot;Approvable Action&amp;quot; Preference with value N at client level. In order to show Approval Modal.&lt;br /&gt;
* &amp;quot;Approvable Action&amp;quot; Preference with value Y at user's or role level. In order to give access to this action.&lt;br /&gt;
&lt;br /&gt;
Note that, as opposite as the other security preferences, supervisor preferences require of explicit setting, this means automatic roles are not considered as supervisor unless there is a preference defining it.&lt;br /&gt;
&lt;br /&gt;
====== Approvable Actions ======&lt;br /&gt;
&lt;br /&gt;
Here is the list of actions that can require approval:&lt;br /&gt;
&lt;br /&gt;
* When pressing Total toolbar button, approve Discretionary Discounts. Property '''Web POS Discretionary Discount Approval''' (''OBPOS_approval.discounts''). More information about this action can be found [[Retail:Discounts_and_Promotions_Rules#Approvable_Discounts|here]].&lt;br /&gt;
* Open Cash Management window. Property '''Web POS Cash Management window approval''' (''OBPOS_approval.cashmgmt'').&lt;br /&gt;
* Open Cash Up window. Property '''Web POS Cash Up window approval''' (''OBPOS_approval.cashup'').&lt;br /&gt;
* Open Cash Drawer in Cash Up window. Property '''Web POS Open Drawer approval Cash Up''' (''OBPOS_approval.opendrawer.cashup'').&lt;br /&gt;
* Open Cash Drawer in Point of Sale window. Property '''Web POS Open Drawer approval Menu''' (''OBPOS_approval.opendrawer.menu'').&lt;br /&gt;
* Remove suspended orders in Cash Up(Step 1) window. Property '''Web POS Remove Receipts Approval in Cash Up''' (''OBPOS_approval.cashupremovereceipts'').&lt;br /&gt;
* Remove receipts with Delete button or Loging out. Property '''Web POS Remove Receipts Approval''' (''OBPOS_approval.removereceipts'').&lt;br /&gt;
* Remove an order line. Property '''Web POS Delete Line Approval''' (''OBPOS_approval.deleteLine'').&lt;br /&gt;
* When pressing Total toolbar button, approve return lines. Property '''Web POS Returns Approval''' (''OBPOS_approval.returns'').&lt;br /&gt;
* Set price of a product in a line. Property '''Web POS set Price approval''' (''OBPOS_approval.setPrice'').&lt;br /&gt;
* Approve difference between Expected and Counted cash. Property '''Web POS Cash Up Differences Approval''' (''OBPOS_approval.cashupdifferences'').&lt;br /&gt;
* Approve menu opening. Property '''Open Menu Approval''' (''OBMOBC_approval.openMenu''). From 17Q2&lt;br /&gt;
&lt;br /&gt;
==== Audit Information ====&lt;br /&gt;
&lt;br /&gt;
Whenever an action is approved by a supervisor, the Sales Order created in the back office keeps track of the supervisor's user as well as the action she approved.&lt;br /&gt;
&lt;br /&gt;
This information can be seen in the ''Approvals'' read only sub tab in ''Sales Order'' window.&lt;br /&gt;
&lt;br /&gt;
==== Offline ====&lt;br /&gt;
&lt;br /&gt;
Approvals can be granted in offline mode. In order to approve an action being in this mode, it is required that the user that has granted to that action has logged in at least one time being online in the terminal&lt;br /&gt;
&lt;br /&gt;
=== Terminal Authentication Security ===&lt;br /&gt;
&lt;br /&gt;
'''A fundamental WebPOS mandatory rule is not to access the same POS Terminal from two or more devices / web browser instances. For the same reason, it is not allowed to access from the same web browser instance to two or more terminals.''' To help avoid this, Openbravo have created the Enhanced Security Authentication.&lt;br /&gt;
&lt;br /&gt;
Starting from RR16Q1 this functionality will be enabled by default thanks to the preference ''Terminal Authentication enabled''.&lt;br /&gt;
&lt;br /&gt;
If someone wants to overwrite the value of the main preference, a new preference for the same property should be created. The value of that new preference will override the value of the original one.&lt;br /&gt;
&lt;br /&gt;
Take into account that this preference should be created for the affected client and it should be visible for Organization &amp;quot;*&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[File:Term_authentication_preference.jpg|1000px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Remember that if terminal authentication is enabled, every terminals will share the same URL and then a specific terminal will be linked.&lt;br /&gt;
* ''Terminal Authentication enabled'' is 'Y': Access url --&amp;gt; openbravo/web/org.openbravo.retail.posterminal/&lt;br /&gt;
&lt;br /&gt;
If security is not enabled we need to put the terminal searchKey in the URL.&lt;br /&gt;
* ''Terminal Authentication enabled'' is 'N': Access url --&amp;gt; openbravo/web/org.openbravo.retail.posterminal/'''?terminal=VBS-1'''&lt;br /&gt;
&lt;br /&gt;
{{(!)|When a new device is used in a terminal, it is '''very important''' to '''clean the browser cache''' in the new device, to prevent corruption data.}}&lt;br /&gt;
&lt;br /&gt;
=== Other Settings ===&lt;br /&gt;
&lt;br /&gt;
The following preferences can be also set.&lt;br /&gt;
&lt;br /&gt;
* ''Quotations are not Firm by default''. When creating an order from a quotation, by default ''Firm'' is checked unless this preference is set to Y.&lt;br /&gt;
&lt;br /&gt;
== Web POS Locale Settings ==&lt;br /&gt;
&lt;br /&gt;
=== Language ===&lt;br /&gt;
&lt;br /&gt;
UI language in Web POS works in a similar way as in ERP: it is defined per session and can be changed, while being online, from ''User &amp;gt; Profile'' dialog. &lt;br /&gt;
&lt;br /&gt;
{{(!)|Topics covered in this section below this line are available starting from '''RMP31'''}}&lt;br /&gt;
&lt;br /&gt;
It is possible to define a default language for Web POS at role level, this default language will be set to user when the role is set as default for Web POS. Additionally it a user can be restricted not to change her defaults by using the ''[[#Security_Settings|Change Profile Settings]]'' preference.&lt;br /&gt;
&lt;br /&gt;
Business Objects such as Product, Product Categories, Taxes, Promotions and Discounts, etc. Are also translated to the same language the UI is set to.&lt;br /&gt;
&lt;br /&gt;
=== Formats ===&lt;br /&gt;
&lt;br /&gt;
==== Date and Numeric ====&lt;br /&gt;
&lt;br /&gt;
Numeric and date formats in Web POS are [[How_to_personalize_Openbravo#Changing_Decimal_Separator | defaulted to the same that in backoffice]].&lt;br /&gt;
&lt;br /&gt;
{{(!)|Topics covered in this section below this line are available starting from '''RMP31'''}}&lt;br /&gt;
&lt;br /&gt;
Starting from ''RMP31'' these formats can be set different to the default ones at Store, Group of Stores or Group of Organization levels. It will be used the most specific one, for example having this Organization tree:&lt;br /&gt;
&lt;br /&gt;
  Formats in ''Format.xml'':&lt;br /&gt;
      date: dd/MM/yyyy&lt;br /&gt;
      numeric: &amp;quot;.&amp;quot; decimal, &amp;quot;,&amp;quot; for thousand grouping&lt;br /&gt;
 &lt;br /&gt;
  Organizations/Stores definition:&lt;br /&gt;
   * &lt;br /&gt;
   |- Group 1 (defined date format: MM-dd-yyyy)&lt;br /&gt;
   |   |- Store 1.1 &lt;br /&gt;
   |   |- Store 1.2 (defined numeric format: &amp;quot;,&amp;quot; decimal, &amp;quot;.&amp;quot; for thousand grouping)&lt;br /&gt;
   |- Group 2 (defined numeric format: &amp;quot;,&amp;quot; decimal, &amp;quot;.&amp;quot; for thousand grouping)&lt;br /&gt;
       |- Store 2.1&lt;br /&gt;
       |- Store 2.2 (defined numeric format: &amp;quot;.&amp;quot; decimal, &amp;quot;,&amp;quot; for thousand grouping)&lt;br /&gt;
&lt;br /&gt;
The format that would be used in each of the stores would be:&lt;br /&gt;
{|border=&amp;quot;1&amp;quot;&lt;br /&gt;
!Store&lt;br /&gt;
!Date Format&lt;br /&gt;
!Numeric format (decimal/thousands separator)&lt;br /&gt;
 |-&lt;br /&gt;
 |Store 1.1&lt;br /&gt;
 |MM-dd-yyyy (taken from Group 1)&lt;br /&gt;
 |./, (taken from Format.xml)&lt;br /&gt;
 |-&lt;br /&gt;
 |Store 1.2&lt;br /&gt;
 |MM-dd-yyyy (taken from Group 1)&lt;br /&gt;
 |,/. (taken from Store 1.2)&lt;br /&gt;
 |-&lt;br /&gt;
 |Store 2.1&lt;br /&gt;
 |dd/MM/yyyy (taken Format.xml)&lt;br /&gt;
 |,/. (taken from Group 2)&lt;br /&gt;
 |-&lt;br /&gt;
 |Store 2.2&lt;br /&gt;
 |dd/MM/yyyy (taken Format.xml)&lt;br /&gt;
 |./, (taken from Store 2.2)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
These settings can be configured in ''Organization'' window:&lt;br /&gt;
&lt;br /&gt;
[[Image:WebPOSFormat.png|center|600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Currency Format in Web POS is the same that in backoffice.&lt;br /&gt;
It will be used to change the decimals of currency , by default it will be #,##0.00 , the same that priceInform in Format.xml.&lt;br /&gt;
&lt;br /&gt;
{{(!)|Topics covered in this section below this line are available starting from '''3.0RR17Q2'''}}&lt;br /&gt;
&lt;br /&gt;
Starting from ''3.0RR17Q2'' this format can be set different to the default one at #,##0.0 and #,##0.&lt;br /&gt;
&lt;br /&gt;
The value of this field is defined in priceInform in Format.xml.&lt;br /&gt;
&lt;br /&gt;
Formats in ''Format.xml'':&lt;br /&gt;
   &amp;lt;Number name=&amp;quot;priceInform&amp;quot;&lt;br /&gt;
       decimal=&amp;quot;.&amp;quot; grouping=&amp;quot;,&amp;quot; formatOutput=&amp;quot;#,##0.00&amp;quot; formatInternal=&amp;quot;#0.00&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Organizations/Stores definition:&lt;br /&gt;
   * &lt;br /&gt;
   |- Group 1 (defined currency format: #,##0)&lt;br /&gt;
      |- Store 1.1 &lt;br /&gt;
   |- Group 2 (defined currency format: #,##0.0)&lt;br /&gt;
      |- Store 2.1 &lt;br /&gt;
   |- Group 3 (defined currency format: #,##0.00)&lt;br /&gt;
      |- Store 3.1 &lt;br /&gt;
&lt;br /&gt;
The format that would be used in each of the stores would be:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot;&lt;br /&gt;
!Store&lt;br /&gt;
!Currency Format&lt;br /&gt;
 |-&lt;br /&gt;
 |Store 1.1&lt;br /&gt;
 |#,##0&lt;br /&gt;
 |-&lt;br /&gt;
 |Store 2.1&lt;br /&gt;
 |#,##0.0&lt;br /&gt;
 |-&lt;br /&gt;
 |Store 3.1&lt;br /&gt;
 |#,##0.00 &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
These settings can be configured in ''Organization'' window&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Print Templates ====&lt;br /&gt;
&lt;br /&gt;
Print templates are used to print different reports from Web POS. Default ones can be [[Retail:Developers_Guide/How-to/How_to_create_and_modify_new_receipt_documents_from_other_module|overwritten by others provided by external modules]].&lt;br /&gt;
&lt;br /&gt;
{{(!)|Topics covered in this section below this line are available starting from '''RMP31'''}}&lt;br /&gt;
&lt;br /&gt;
In the same way it is possible to change date and numeric formats at Store/Organization level, templates can be defined at those levels. They are set in ''Organization'' window in Web POS Formats field section. Precedence of these settings works in the same way as described in previous section.&lt;br /&gt;
&lt;br /&gt;
== Do not clean the browser cache - Updating the Client Web POS ==&lt;br /&gt;
&lt;br /&gt;
In normal operations the client side application is automatically updated when updating Web POS modules on the server. However in some cases it makes sense to refresh the client side application explicitly.&lt;br /&gt;
&lt;br /&gt;
One way of refreshing the Openbravo Web POS client is to clean the cache. Then when refreshing the page the Web POS is reloaded from the server. '''But as is noted [[Retail:Web_POS_User_Guide#The_local_database:_how_the_Web_POS_uses_it_and_when_it.27s_safe_to_clear_the_browser_cache|here]] one should be really careful with cleaning the cache during business operations'''.&lt;br /&gt;
&lt;br /&gt;
Therefore this section describes a method which allows you to update the client side application without cleaning the cache. &lt;br /&gt;
&lt;br /&gt;
# In the browser with Web POS go to the following URL: chrome://appcache-internals/&lt;br /&gt;
# Find the manifest with the url of the Web POS (most likely there is the only one manifest, see below)&lt;br /&gt;
# Press on Remove option for this manifest.&lt;br /&gt;
# Close the page, close the browser.&lt;br /&gt;
# Start the browser, start the Web POS by going to the original WebPOS URL.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:WebPOSCleanAppcache.png|center]]&lt;br /&gt;
&lt;br /&gt;
== Hide Cash Up Information to the Cashier ==&lt;br /&gt;
&lt;br /&gt;
{{(!)|Starting from '''RR16Q4''' below functionality is available }}&lt;br /&gt;
&lt;br /&gt;
Since 3.0RR16Q4, it has been implemented a new property configurable from the Preference window named OBPOS_HideCashUpInfoToCashier. This preference allow to hide some critical information to the user in the cash up part.&lt;br /&gt;
&lt;br /&gt;
Follow this [http://wiki.openbravo.com/wiki/Retail:Web_POS_User_Guide#Hide_Cash_Up_Information_to_the_Cashier link] to learn more about this new functionality.&lt;br /&gt;
&lt;br /&gt;
== Configuring Web POS Import Transaction Process ==&lt;br /&gt;
&lt;br /&gt;
{{(!)|Starting from '''RR15Q3''' below functionality is available }}&lt;br /&gt;
&lt;br /&gt;
From the 2015Q3 version of Openbravo Retail transactions which are sent through the server are imported by a separate [[Retail:Web_POS_User_Guide#Backend_Data_Processing:_Data_Import_Entries|process]] using parallel processing. The benefit of this approach is that it makes the Openbravo Retail solution much more stable in very high volume environments (1000 tickets/minute). &lt;br /&gt;
&lt;br /&gt;
The import process will try to process transactions in parallel:&lt;br /&gt;
* tickets of different organizations are processed in parallel&lt;br /&gt;
* cashups of different organizations are processed in parallel&lt;br /&gt;
* business partners of different organizations are processed in parallel&lt;br /&gt;
&lt;br /&gt;
So if there 10 stores, and in each store there are POS systems submitting tickets/cashups and business partners, there will be a total of 30 processes started. They are executed in parallel if there are CPU-processors available.&lt;br /&gt;
&lt;br /&gt;
The parallel processing and even the disabling of this new import process can be controlled through several configuration parameters which can be defined in [[Openbravo.properties|Openbravo.properties]]:&lt;br /&gt;
&lt;br /&gt;
* '''import.disable.process''' (available from RR16Q1 release): default not set/false, if set to true then the import process will not run on this application server, is useful if multiple servers share the same database. In that case only server should be dedicated to process import entries, the one's should have this property set to false.&lt;br /&gt;
* '''import.bypass.entry.logic''': default not set/false, if set to the value true then the import framework is not used and requests from WebPOS are processed directly.&lt;br /&gt;
* '''import.batch.size''': default is 5000, minimum is 1000, defines the number of import entries read by type of data (Order, Cashup etc.) in each loop of the import process. This can be set to 10000 or 20000 if the server has 16GB of memory or more and there are 8 or 16 processors.&lt;br /&gt;
* '''import.number.of.threads''': default is number of processors plus 2, minimum: 4, the number of threads available for the main import thread, archiving thread and the actual processors importing data. It depends on the number of cores in the system and also how many parallel processes are expected. A good value is the number of processor cores in the system (plus 2).&lt;br /&gt;
* '''import.max.task.queue.size''': default is 1000, minimum: 50, the number of separate import tasks which are queued, the number of tasks depend on the type of data, the implementation of the data importer, for example in WebPOS there will be a separate order importer for each organization, the same for cashups and business partner imports. If there memory limits and a lot of different stores then this value should be set to a lower value, for example 100.&lt;br /&gt;
* '''import.wait.time''': (available from 17Q1), defined in seconds, default is 600 seconds, when there are no actions which trigger an import entry loop the system will wait a specific amount of time before automatically triggerin a read of any current 'Initial' entries. This property defines the wait time between runs/loops of the import entry logic when no other actions happen.&lt;br /&gt;
&lt;br /&gt;
=== Import Entry High Availability ===&lt;br /&gt;
&lt;br /&gt;
{{AvailableFrom|3.0PR18Q2}}&lt;br /&gt;
&lt;br /&gt;
Before '''3.0PR18Q2''' release when working in a clustered environment, it was only supported to run the import process in the same (one) node of the cluster. This was done by setting the '''[http://wiki.openbravo.com/wiki/Retail:Configuration_Guide#Configuring_Web_POS_Import_Transaction_Process import.disable.process]''' property as ''true'' for that node.&lt;br /&gt;
&lt;br /&gt;
Starting from '''3.0PR18Q2''' it is possible to configure the import entry processing as a high available service for the cluster. This means, that in case the node in charge of handling the service fails, eventually another available node of the cluster will take care of processing the import entries, replacing the node that failed.&lt;br /&gt;
&lt;br /&gt;
To enable this feature two properties have to be configured in the [[Openbravo.properties|Openbravo.properties]] file of '''[http://wiki.openbravo.com/wiki/Openbravo.properties#Overriding_properties_per_instance each cluster node]''':&lt;br /&gt;
&lt;br /&gt;
* '''cluster''': defined as '''true''' in all the nodes.&lt;br /&gt;
* '''import.disable.process''': defined as '''false''' (or not defined) in every node which it is desired to enable as available for executing the import process.&lt;br /&gt;
&lt;br /&gt;
==== Import Entry Cluster Service Settings ====&lt;br /&gt;
&lt;br /&gt;
Once this feature is enabled, by default, each node in the cluster will check (ping) every 10 seconds if the node in charge of executing the import process is still &amp;quot;alive&amp;quot; or, on the other hand, if it should be replaced with another node of the cluster. &lt;br /&gt;
&lt;br /&gt;
It is possible to change this default time to use a custom value by using the '''Cluster Service Settings''' window.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:ClusterServiceSettings.png|center|600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In this window a new record should be created with the following values:&lt;br /&gt;
&lt;br /&gt;
* '''Cluster Service''': ''Import Entry Cluster Service''&lt;br /&gt;
* '''Timeout (seconds)''': the amount of seconds of the ''ping'' interval&lt;br /&gt;
&lt;br /&gt;
{{(!)|After establishing the new configuration in this window, it will be required to restart every cluster node.}}&lt;br /&gt;
&lt;br /&gt;
==== Cluster Service Management Extension (JMX) ====&lt;br /&gt;
&lt;br /&gt;
This feature also provides a management extension available through [http://wiki.openbravo.com/wiki/Retail:Monitoring_and_Management JMX]. This extension provides:&lt;br /&gt;
&lt;br /&gt;
* The ability of monitoring the status of the import entries service. It is possible to check, for instance, the current cluster node in charge of handling the import entries.&lt;br /&gt;
&lt;br /&gt;
* The ability of disabling the ping service. In case the ping is disabled for the node in charge of handling the import entries service, that node will be automatically deregistered, allowing to promote another node in the cluster to be the responsible of processing the import entries.&lt;br /&gt;
&lt;br /&gt;
== Web POS Multi-Server Architecture ==&lt;br /&gt;
&lt;br /&gt;
{{(!)|Starting from '''RR15Q4''' you can configure a WebPOS client to operate in a multi-server system architecture. As of now, this functionality is only available in the [[Modules_Management#Maturity_Status_in_ERP | QAA maturity status]]. So if you want to try it we recommend to use the latest available at this point QAA release and to get in touch with Openbravo.}}&lt;br /&gt;
&lt;br /&gt;
In the RR15Q4 release the Openbravo Commerce suite takes a first step in allowing a WebPOS client to communicate to multiple servers. The first target architecture to support with this approach consists of store servers and one central server.&lt;br /&gt;
&lt;br /&gt;
The store and central server architecture is described in more detail in the next section. The services and server architecture are defined in the back office system using several windows. These are described in the subsections below.&lt;br /&gt;
&lt;br /&gt;
=== Store and Central Server ===&lt;br /&gt;
&lt;br /&gt;
Openbravo Commerce Suite can be deployed in environments in which stores can run a store server instance locally next to a central server instance hosted in the cloud.&lt;br /&gt;
&lt;br /&gt;
A store server installed locally in the store can provide several benefits:&lt;br /&gt;
* in case of [[Retail:Configuration_Guide#Supporting_High_Volume_Master_Data:_Remote_Master_Data_Handling|large master data volumes]], these can be loaded in the store server, WebPOS clients can then load (on-demand) the master data from the store server. This ensures operation of the store in case of high master data volumes in combination with offline situations&lt;br /&gt;
* performance and robustness in case of lesser-bandwith internet connections to the store. A store server helps to handle many requests from WebPOS clients on the local network instead of making use of the internet connection of the store. &lt;br /&gt;
* many WebPOS clients in a store: when there are many WebPOS clients in a store (hunderds or more) then it can make sense to let the WebPOS clients login on a dedicated store server to balance the load across several servers in the network.&lt;br /&gt;
&lt;br /&gt;
The current solution supports the following architecture:&lt;br /&gt;
* One central server instance&lt;br /&gt;
* One or more store server instances: one store can only work with one store server, but one store server can handle/operate for multiple stores.&lt;br /&gt;
&lt;br /&gt;
The illustration below demonstrates a possible architecture with store servers hosted in the stores and a central server hosted in the cloud.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:Multi-Server-Example-Store-Central-Server.png|center|600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For backend replication between servers in the network we have good experience with [http://www.symmetricds.org/ Symmetric DS]. For replication of transactions one can focus on replicating the [[Retail:Web_POS_User_Guide#Backend_Data_Processing:_Data_Import_Entries|data import entries]]. '''The SymmetricDS setup and replication logic for store and central servers will be delivered in a separate module and is targeted for the 16Q1 timeframe.'''&lt;br /&gt;
&lt;br /&gt;
The store and central-server setup can also be used to define a failover mechanism in WebPOS. WebPOS clients will automatically switch from the store server to the central server if the store server is accidentally offline.&lt;br /&gt;
&lt;br /&gt;
=== Base Setup: Enabling Preference &amp;amp; Multi-Server Authentication ===&lt;br /&gt;
&lt;br /&gt;
This section describes several setup steps which need to be done before you can use Openbravo in a multi-server.&lt;br /&gt;
&lt;br /&gt;
'''The enablement of the multi-server-communication functionality is controlled by a preference which by default is not set and therefore disables the multi-server logic'''.&lt;br /&gt;
&lt;br /&gt;
So to enable multi-server-communication behavior for your stores you need to define the preference 'Mobile Multi-Server Architecture Enablement' (see screenshot below) with value Y and 'Selected' checkbox with value Y too. This preference needs to be defined on System level by the System Administrator.&lt;br /&gt;
&lt;br /&gt;
The preference enables multi-server behavior for all WebPOS clients in the system across all clients/organizations/stores. But multi-server behavior will start only if there are Mobile Servers defined, so if you do not define mobile servers (see below) then the multi-server functionality is not operational and the WebPOS clients will work in the standard way. &lt;br /&gt;
Also: you can assign servers to stores specifically, so it is possible to test multi-server behavior first for WebPOS systems of specific/selected stores.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:preferenceMultiServer-OK.png|center|600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Then as a second step, it is needed to enable specific authentication on each of the servers. This to support multi-server login. In each server which can be used from a WebPOS client the following [[Authentication#How_to_configure_the_authentication_manager_in_Openbravo_ERP|authentication manager]] has to be set in Openbravo.properties:&lt;br /&gt;
&lt;br /&gt;
'''Note: the value of the mobile.server.key should be taken from the mobile server definition, see later subsection.'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;authentication.class=org.openbravo.mobile.core.authenticate.MobileKeyAuthenticationManager&lt;br /&gt;
mobile.server.key=Central&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finally, if tickets are send to multiple servers simultaneously from WebPOS then it makes sense that the related documents of the tickets in the different servers have the same document numbers. To make sure this happens set the preference &amp;quot;Use Order Document Number for Related Docs&amp;quot; to Y:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:Multi-Server-EnablingPreference-SameDocNumber.png|center|600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This section described the first-base setup. The next step is to define the mobile servers, specify which services they provide and assign them to stores/organizations.&lt;br /&gt;
&lt;br /&gt;
==== Mobile Server Authentication  ====&lt;br /&gt;
&lt;br /&gt;
The above section specified how to set the authentication manager.&lt;br /&gt;
&lt;br /&gt;
To provide some background information: the mobile server authentication manager uses a symmetric-shared-key logic to authenticate a WebPOS client on several servers withour requiring to relogin.&lt;br /&gt;
&lt;br /&gt;
The key is never send to the WebPOS clients but stored on the server. It is an generated key which is created automatically at first login and then replicated to all store servers. &lt;br /&gt;
&lt;br /&gt;
It is possible to regenerate the authentication key. This should be done in off-hours when none of the stores are operating. To regenerate the authentication key login into the central server backoffice. Goto the role which is linked client for which you want to change the key. Then in quick launch start the 'Recreate Mobile Server Authentication Key' process. You see a popup with an information text, click ok to regenerate the authentication key.&lt;br /&gt;
&lt;br /&gt;
After recreation the new authentication key is replicated to all store servers. '''The tomcat of all the store servers need to be restarted and all users should relogin.'''&lt;br /&gt;
&lt;br /&gt;
==== Test Setup ====&lt;br /&gt;
&lt;br /&gt;
When testing with multiple servers it is often not possible to setup replication logic directly between the central and store servers. This means that the servers will not have a shared key available to them. To force the servers to use the same authentication key you can set the key in the Openbravo.properties file.&lt;br /&gt;
&lt;br /&gt;
To make use of the test key it is mandatory to also set the test.environment property to true.&lt;br /&gt;
&lt;br /&gt;
The following properties have to be set:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;test.environment=true&lt;br /&gt;
authentication.test.key=uMbsk0ZYPS43uUY6D1KU3A==&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Preferences: token age, offline ping ===&lt;br /&gt;
&lt;br /&gt;
For a complete overview of all the relevant multi-server preferences please visit [[Store_and_Multi_Server_Preferences|this page]].&lt;br /&gt;
&lt;br /&gt;
=== Mobile Services ===&lt;br /&gt;
&lt;br /&gt;
The services definition is done by developers and provided by modules. They are available under the System Admin role and shown as a reference here.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:Multi-Server-Services.png|center|600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A description of the meaning of the fields:&lt;br /&gt;
* Module: services are provided by and implemented in modules&lt;br /&gt;
* Service: the service name, currently uniqueness of service names is not checked, the service name is used in client side code to call a service &lt;br /&gt;
* Routing Type: defines how the transport layer in the Web POS client should call the service:&lt;br /&gt;
** Fail Over: mostly used for '''querying''' services, if a call to a server fails for this service then Web POS will automatically try another server which provides the same service&lt;br /&gt;
** Transaction: as the name indicates is mostly used for '''transactions''' (such as new tickets/customers). Is similar to fail over, so servers are tried one by one until there is a server which can receive the transaction. The difference with fail over is that the system will store the message in the database and continue retrying until a server is able to receive the transaction. This makes this mode more robust than fail over which stops after all servers have been tried. &lt;br /&gt;
** Broadcast: the service request is automatically send (broadcasted) to all servers providing this service. Failed messages are not repeated. This type of request is useful for example for logout. &lt;br /&gt;
** Ping: a special service used to detect when a server is back online. Is used in the scenario that a server is offline (detected because another service request fails). In that case the Web POS client will ping the offline server to detect when it is back online&lt;br /&gt;
* Default Timeout: Time in seconds defined by default in the module for the request timeout related to the Mobile Service.&lt;br /&gt;
* Timeout: Time in seconds defined by the user, which overrides default timeout, for the request timeout related to the Mobile Service.&lt;br /&gt;
&lt;br /&gt;
The service name uses 'contains' to match it with the requests from the client. So a service name of 'org.openbravo.retail.posterminal.master' will handle all the client side requests with 'org.openbravo.retail.posterminal.master' in the requested URL. In this way for example all the master data requests can be mapped to a server.&lt;br /&gt;
&lt;br /&gt;
'''Note: In case of having more than one service for a given Service name, it gets longest name service. Longest name service will be the most similar to Service name. Avoid creating Java classes which contains another Java class name.'''&lt;br /&gt;
&lt;br /&gt;
The following are examples of standard services, see the total list of services in the mobile core and webpos modules:&lt;br /&gt;
* org.openbravo.mobile.core.login.ContextInformation: retrieval, provides the current client/organization of the current user (after logging in)&lt;br /&gt;
* org.openbravo.retail.posterminal.CustomerAddrLoader: transactional, stores updated and new addresses in the database on the server&lt;br /&gt;
* org.openbravo.retail.posterminal.CustomerLoader: transactional, stores updated and new customers in the database on the server&lt;br /&gt;
* org.openbravo.retail.posterminal.master.BPLocation: retrieval, retrieves the business partner address from the server&lt;br /&gt;
* org.openbravo.retail.posterminal.master.BusinessPartner: retrieval, retrieves the business partners from the server&lt;br /&gt;
* org.openbravo.retail.posterminal.master.DiscountFilterBusinessPartner: retrieval, reads the discounts by business partner from the server&lt;br /&gt;
* org.openbravo.retail.posterminal.master.Product: retrieval, reads product data from the server&lt;br /&gt;
* org.openbravo.retail.posterminal.OrderLoader: transactional, stores new and updated tickets in the database on the server&lt;br /&gt;
* org.openbravo.retail.posterminal.PaidReceiptsHeader: retrieval, reads tickets (and layaways and quotations) from the server&lt;br /&gt;
* org.openbravo.retail.posterminal.POSLoginHandler: retrieval, login service&lt;br /&gt;
* org.openbravo.retail.posterminal.ProcessCashClose: transactional, stores the cashup on the server&lt;br /&gt;
* org.openbravo.retail.posterminal.ProcessCashMgmt: transactional, stores the cashup on the server&lt;br /&gt;
&lt;br /&gt;
=== Mobile Server Definition ===&lt;br /&gt;
&lt;br /&gt;
The Mobile Server Definition window allows you to define the servers which are available for WebPOS clients. Servers are used by WebPOS clients for logging in, retrieving master data, sending tickets/cashups and other transactional data. &lt;br /&gt;
&lt;br /&gt;
A distinction is made between a store server and a main server. Store servers are mainly used for a specific store for logging in and querying. Main servers are used to store transactional data. Only transactions send to a Main Server are considered to be synchronized and are considered to be save. '''The 15Q4 release of the Commerce Suite assumes that a WebPOS system has one main server (which can be shared by many WebPOS clients)'''. This main server receives the transactions. In addition there can be several store servers defined for logging in and providing querying services. &lt;br /&gt;
&lt;br /&gt;
A store server can be used for system load distribution or if installed locally in the store can ensure store operation also when the store looses internet connection.&lt;br /&gt;
&lt;br /&gt;
The setup for the rest allows a large degree of flexibility. It is perfectly fine to not have a store server and only main servers. Or to let smaller stores work on a single main server, while a large store has its own store server.&lt;br /&gt;
&lt;br /&gt;
The image below illustrates the definition of a server:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:Multi-Server-Definition3.png|center|600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A description of the meaning of the fields:&lt;br /&gt;
* Name: any unique name is allowed&lt;br /&gt;
* Description: additional description for describing the purpose of the server&lt;br /&gt;
* Server Type: there are two types:&lt;br /&gt;
** Main Server: a main server is often used to store transactional data such as new tickets/updated business partners etc. Only transactions send to a main server are considered to be synchronized and save.&lt;br /&gt;
** Store Server: a store server is mainly used for load distribution and if locally maintained to ensure store operations when the store looses internet connection.&lt;br /&gt;
* URL: the main url by which the server can be reached, see the examples above/below, should include the webapp context path (openbravo in the examples here)&lt;br /&gt;
* Priority: if multiple servers can provide the same service then they are tried in order of priority. This is relevant for failover services which are will be called on the first available server. If a server is not available then the next in line is tried (in increasing order of priority number). '''In a setup with a main server and store server(s) then the store servers normally have a higher priority (lower number) than the central server. This ensures that the WebPOS clients will first access the store server before trying the central server.'''&lt;br /&gt;
* All Organizations: if this checkbox is checked then the server is made available to all WebPOS systems and the organizations defined in the 'Organizations by Server' are ignored. If unchecked then the 'Organizations by Server' information is used to determine if a server is to be used by a WebPOS client.&lt;br /&gt;
* All Services: if this field is checked then the server is assumed to provide all services. If unchecked then the information in the subtab 'Services by Server' is used to determine what services a server can provide.&lt;br /&gt;
* Defined services (from 16Q2): if All Services field is unchecked then we will see this field and we can select ''All excluding defined'' or ''Only those defined''. If ''Only those defined'' is selected then the information in the subtab 'Services by Server' is used to determine what services a server '''can''' provide. If ''All excluding defined'' is selected then the information in the subtab 'Services by Server' is used to determine what services a server '''cannot''' provide.&lt;br /&gt;
* Mobile Server Key (from 16Q1): is the unique key for the server, should be set in each server in Openbravo.properties, for example as: mobile.server.key=Central&lt;br /&gt;
* Server Status (from 16Q1): gives the current status of the server (offline, online, transitioning). See the [[Retail:Store_Server#Online_.26_Offline_concepts_of_Store_Servers|Store Server]] page for more information on server status handling.&lt;br /&gt;
* Reload Status (from 17Q2 when the replication module is installed): defines the status of the initial data reload logic. For more information see [[Retail:Store_Server_Initial_Data_Reload|this]] page.&lt;br /&gt;
* Version Status (from 17Q2.1 when the Store Server Retail module is installed): the version status shows if the store and central server have different versions. Field is relevant for [[Retail:Store_Server#Updating_an_Openbravo_Multi-Server_Environment|store server updating]]. The following values can be shown:&lt;br /&gt;
** Same as Central: store and central server have the same version for the modules which they have in common&lt;br /&gt;
** Different from Central: store and central server have different versions for the modules they have in common&lt;br /&gt;
* Version (from 17Q2.1 when the Store Server Retail module is installed): the version is computed from the versions of all the modules installed on the store server. So store servers with different module (versions) will show different overall version numbers. A higher version number means a newer server, this because version numbers can only increase over time. Field is relevant for [[Retail:Store_Server#Updating_an_Openbravo_Multi-Server_Environment|store server updating]].&lt;br /&gt;
* Allowed Origin Domains (from 17Q1): a list of comma or new-line separate domain definitions. Each domain value can be a complete domain (including http/https and the port number) or a regular expression. See the screenshot above for examples. See the next section for more information.&lt;br /&gt;
* Offline Log/Cause (from 17Q1): if the store server is offline then this field gives information on the reason for being offline. See [[Store_Server_Online_and_Offline_Concepts#Causes_for_staying_offline|here]] for more details.&lt;br /&gt;
&lt;br /&gt;
[[Image:Multi-Server-Definitions.png|center|600px]]&lt;br /&gt;
&lt;br /&gt;
==== Allowed Origin Domains Field - Cross Domain Requests ====&lt;br /&gt;
&lt;br /&gt;
Openbravo Commerce supports doing requests from one WebPOS client to multiple servers in the architecture. The WebPOS client has a url pointing to one host from which it obtains the source code. Requests to other servers (to search for products for example) are therefore so-called [https://en.wikipedia.org/wiki/Cross-origin_resource_sharing cross domain requests]. Cross domain requests are handled specifically in web environments requiring special configuration.&lt;br /&gt;
&lt;br /&gt;
A WebPOS client is only allowed to call the other servers in the environment if the domain of the original url of the WebPOS client (from where it loads the webpage itself) is:&lt;br /&gt;
* defined as an Allowed Origin Domain in any of the Mobile Server Definitions&lt;br /&gt;
* is the domain of the url of any of the Mobile Server Definitions&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
* if you define the store server with an url: http://store1.openbravo.com/openbravo and there is a central server with url: http://central.openbravo.com/openbravo.&lt;br /&gt;
* let's say that there is an alias host mystore.openbravo.com pointing to the same server as store1.openbravo.com.&lt;br /&gt;
* then a WebPOS client loaded from http://store1.openbravo.com can do requests to central.openbravo.com, this is allowed and supported.&lt;br /&gt;
* however a WebPOS client loaded from http://mystore.openbravo.com can not do requests to central.openbravo.com. &lt;br /&gt;
* to allow also WebPOS clients loaded from mystore.openbravo.com to call central.openbravo.com you have to add: http://mystore.openbravo.com to the Allowed Origin Domains field of any Mobile Server Definition.  &lt;br /&gt;
&lt;br /&gt;
If you don't set the Allowed Origin Domains field then WebPOS clients can only call other servers if they are loaded from the exact url/domain as defined in the mobile server definition of their respective store.&lt;br /&gt;
&lt;br /&gt;
If you try to load the WebPOS from a URL/location which is not defined as the url of a mobile server or allowed origin domain then when loading the client you will get a message as shown below.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:cors_error_load_webpos.png|center|600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In addition you will see messages like this in the log:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;XMLHttpRequest cannot load http://store1.openbravo.com:8080/openbravo/org.openbravo.retail.posterminal…ls?terminalName=VBS-1&amp;amp;command=userImages&amp;amp;appName=WebPOS&amp;amp;0.7785557618144872.&lt;br /&gt;
No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://127.0.0.1:8080' is therefore not allowed access.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Mobile Server Organizations - Stores ====&lt;br /&gt;
&lt;br /&gt;
A server can be linked to all organizations (stores), so it is available for all WebPOS clients, or a server can be assigned to a specific set of organizations (stores).&lt;br /&gt;
&lt;br /&gt;
To flag a server to be available for all organizations, check the 'All Organizations' field in the server definition.&lt;br /&gt;
&lt;br /&gt;
If you want to assign a server to a specific set of organizations/stores then you can use the sub tab 'Organizations by Server'. Make sure the 'All Organizations' checkbox is not checked in the server definition and then add records in the 'Organizations by Server'. Multiple servers can be assigned to multiple organizations and vice versa.&lt;br /&gt;
&lt;br /&gt;
The Openbravo organization structure also plays a role here, so assigning a server to a parent organization automatically makes it available for all the child organizations of that parent organization.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:Multi-Server-Orgs.png|center|600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Mobile Server Services ====&lt;br /&gt;
&lt;br /&gt;
The information in this subtab is used when the 'All Services' checkbox in the Mobile Server definition is not checked. &lt;br /&gt;
&lt;br /&gt;
'Defined services' value will define which services are available for the server. If ''Only those defined'' is selected then the information in the subtab 'Services by Server' is used to determine what services a server '''can''' provide. If ''All excluding defined'' is selected then the information in the subtab 'Services by Server' is used to determine what services a server '''cannot''' provide.&lt;br /&gt;
&lt;br /&gt;
This subtab allows you to specify which services are provided by which server. There is a fair amount of freedom in assigning querying services. You can load products from one server and business partners from another server. &lt;br /&gt;
&lt;br /&gt;
The thing to ensure though is that if users in WebPOS can create new customers and tickets that the tickets and customer are send to the same server. Or that the data between servers is synchronized in a different way. Also the cashup can only be send to a server which also receives or has all the WebPOS orders. This means that either the servers are synchronized in the backend or that all transactions are send to a server. All transactions can also be send to multiple servers. &lt;br /&gt;
&lt;br /&gt;
The example below shows how all transactions services are assigned to a specific main server. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:Multi-Server-Services-Definitions.png|center|600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Modules by Server ====&lt;br /&gt;
&lt;br /&gt;
This subtab is available from 17Q2.1 and only if the Retail Store Server module is installed.&lt;br /&gt;
&lt;br /&gt;
To provide complete visibility of what is installed in your environment you can check the Modules by Server sub tab in the Mobile Server window. It shows the modules installed on the store server with their respective version numbers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:StoreServerUpdate_Modules_by_Server.png|center|800px]]&lt;br /&gt;
&lt;br /&gt;
=== Multi Server Configuration: preferences and process ===&lt;br /&gt;
&lt;br /&gt;
==== Preferences ====&lt;br /&gt;
&lt;br /&gt;
{{(!)|This functionality is available from '''RR16Q1'''.}}&lt;br /&gt;
&lt;br /&gt;
Multi server functionality is disabled by default. To make use of this advanced functionality you have to set specific preferences. In addition there are several preferences which control the behavior of multi-server logic. All these preferences are described in [[Store_and_Multi_Server_Preferences|this]] page.&lt;br /&gt;
&lt;br /&gt;
==== Store Server Backoffice ERP access disabled ====&lt;br /&gt;
&lt;br /&gt;
{{(!)|This functionality is available from '''RR16Q3'''.}}&lt;br /&gt;
&lt;br /&gt;
The backoffice user interface is not official supported for the store server. This because the store server architecture assumes that changes in the store server are provided through webservices or symmetric ds replication and not done directly through the user interface.&lt;br /&gt;
&lt;br /&gt;
It is therefore the safest if the backoffice ERP access is disabled. This can be done by setting a preference: '''Restrict ERP Access in Store Server''' to 'Y'.&lt;br /&gt;
&lt;br /&gt;
This preference should be set by the system admin. If you need access to the store server backoffice UI to view current transactions or other diagnostic information then you can temporarily deactivate this preference by logging in with a system admin user/role.&lt;br /&gt;
&lt;br /&gt;
=== Synchronized Transactions in Multi-Server Environments ===&lt;br /&gt;
&lt;br /&gt;
The OB Commerce multi-server functionality is also supported for [[Retail:Configuration_Guide#WebPOS_Synchronized_Transactions|synchronized]] transactions. Synchronized transactions are defined as a fail-over service. &lt;br /&gt;
&lt;br /&gt;
Synchronized transactions in a multi-server environment have specific characteristics. These are described in detail in the [[Synchronized_Transactions_in_Multi-Server_Environments|following]] document.&lt;br /&gt;
&lt;br /&gt;
== Supporting High Volume Master Data: Remote Master Data Handling ==&lt;br /&gt;
&lt;br /&gt;
{{(!)|Starting from '''RR15Q4''' below functionality is available }}&lt;br /&gt;
&lt;br /&gt;
To support high volumes of products, customers and tickets, Openbravo Commerce allows you to work remotely with master data from the WebPOS client. The high volume master data is then not loaded into the WebPOS client database but accesses when needed on a server. The server can be a locally in-store server or a server available in the cloud.&lt;br /&gt;
&lt;br /&gt;
The following data can be handled remotely from WebPOS clients:&lt;br /&gt;
* Products&lt;br /&gt;
* Customer and Customer Addresses&lt;br /&gt;
* Tickets/Orders&lt;br /&gt;
* Discounts by Customer&lt;br /&gt;
&lt;br /&gt;
By enabling remote data handling the WebPOS clients are capable of working with millions of products, prices and customers. The remote data handling can be combined with the Openbravo [[Retail:Configuration_Guide#Web_POS_Multi-Server_Architecture|multi-server]] architecture functionality to define (local store) servers which provide product/customer data querying services to WebPOS clients.&lt;br /&gt;
&lt;br /&gt;
By default remote data handling is disabled. The enabling of the remote data functionality is controlled by several preferences which are discussed in the next section.&lt;br /&gt;
&lt;br /&gt;
Note that enabling remote data has as a consequence that it is not possible to operate the WebPOS client in complete offline mode. There are solutions to work with a local [[Retail:Configuration_Guide#Web_POS_Multi-Server_Architecture|store]] server (physically located near the terminals - on the same local network) which can help in these type of specific cases.&lt;br /&gt;
&lt;br /&gt;
=== Remote Data Preferences ===&lt;br /&gt;
&lt;br /&gt;
Several preferences are used to control which data is handled remotely. These are illustrated in the screenshot below. The screenshot below shows that by default the remote-data preferences are set to N. To enable remote data handling you have to define the related preferences and set the value Y. In addition, 'Selected' check-box has to be set as Y too. In the screenshot below this is illustrated.&lt;br /&gt;
&lt;br /&gt;
Note: '''it is important to define the preferences on at least one of client/org/user/role level to ensure that the system will prefer it over the default preferences which are set to N.''' &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:preferencesRemote-OK.png|center|600px]]&lt;br /&gt;
&lt;br /&gt;
==== Use Contains Remote Data Preferences ====&lt;br /&gt;
&lt;br /&gt;
There are also two preference more for remote searching: ''Use contains in Remote Customer search'' and ''Use contains in Remote Product search''. By default, remote queries are done using starts With to filter in order to improve performance of those queries. In case of you need to filter using contains, you can create these preference setting them to 'Y' to have this ability in Web POS for remote models. Non remote models already use contains to filter.&lt;br /&gt;
&lt;br /&gt;
=== Remote Data: Product Categories ===&lt;br /&gt;
&lt;br /&gt;
In case of a high volume of product master data, so when products are accessed remotely then the way product categories are loaded by the WebPOS clients is also changed. The system needs to run an update process in a daily (for example) batch to determine which product categories should be loaded by which WebPOS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:Remote-Data-PC-Process.png|center|600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
After running the process the product categories which are loaded in the client are displayed in the assortment. Note, the subtab is only visible if there are product categories linked to an assortment.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:Remote-Data-PC-AssortmentSubtab.png|center|600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Remote Master Data Limitations - Future enhancements ===&lt;br /&gt;
&lt;br /&gt;
In the 15Q4 release, the remote data capability also has some limitations, these will be addressed in future releases:&lt;br /&gt;
* No client-side product catalog: the Openbravo Commerce WebPOS product catalog functionality will be enhanced in a next release to work with remote product data. In the 15Q4 release it is assumed that the user will find products by scanning or searching for products. In the 16Q4 release a new hierarchical product catalog search will be added.&lt;br /&gt;
* No product characteristic support: remote product data can not be combined with product characteristic search. From the '''16Q1''' release onwards product characteristic and brand search is supported also for remote product data.&lt;br /&gt;
* No alphabetical search bar in customer search: the alphabetical bar on the left of the customer search is not available when customer data is remote, the search filter text field is there to search for customers.&lt;br /&gt;
* No automatic search customer/product when entering search term: with remote product/customer enabled after entering a search term in product/customer search the user has to explicitly tap the search button, with the remote preference set to N the search will automatically happen after 3 characters have been entered. &lt;br /&gt;
* Discounts: discounts are mostly all loaded in the client side WebPOS database, only the business partner discount definitions are loaded on demand when a business partner is selected for a ticket. This means that:&lt;br /&gt;
** Openbravo Commerce can support 10-thousands of discount definitions on product, product category or business partner category level. They are loaded in the WebPOS client side database.&lt;br /&gt;
** But Openbravo Commerce can not support 100-thousands or more discount definitions on product/product category or business partner category level. This would make the WebPOS client too slow. &lt;br /&gt;
So in high volume environments it is better to limit the number of discount definitions by defining them on product/BP category level or only for specific business partner.&lt;br /&gt;
&lt;br /&gt;
Default WebPOS layout in case of remote product data (no browse/catalog option):&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
[[Image:Remote-Data-WebPOS-UI.png|center|600px]]&lt;br /&gt;
&lt;br /&gt;
=== Retail Extension Modules enabled for Remote Data ===&lt;br /&gt;
&lt;br /&gt;
In the subsequent releases many extension modules have been checked for their support of remote product/business partner data. Also automated tests have been added to ensure continuous correct operation with remote data. &lt;br /&gt;
&lt;br /&gt;
This is the current (16Q2 release) list of modules which have been tested with remote data, most are also tested automatically:&lt;br /&gt;
* [https://code.openbravo.com/erp/pmods/org.openbravo.retail.giftcards.newentities Gift card new entities]&lt;br /&gt;
* [https://code.openbravo.com/erp/pmods/org.openbravo.mobile.warehouse.physicalinventory/ Physical inventory]&lt;br /&gt;
* [https://code.openbravo.com/erp/pmods/org.openbravo.retail.complementary Complementary products]&lt;br /&gt;
* [https://code.openbravo.com/erp/pmods/org.openbravo.retail.copystore Copy Store]&lt;br /&gt;
* [https://code.openbravo.com/erp/pmods/org.openbravo.retail.giftcards Gift Card]&lt;br /&gt;
* [https://code.openbravo.com/erp/pmods/org.openbravo.retail.giftcards.printgiftcards Print Giftcard]&lt;br /&gt;
* [https://code.openbravo.com/erp/pmods/org.openbravo.retail.stockcriteria Stock Criteria]&lt;br /&gt;
* [https://code.openbravo.com/erp/pmods/org.openbravo.retail.pricecriteria Price Criteria]&lt;br /&gt;
* [https://code.openbravo.com/erp/pmods-branches/org.openbravo.retail.sessions Retail Sessions]&lt;br /&gt;
* [https://code.openbravo.com/erp/pmods/org.openbravo.retail.stockvalidation/ Stock Validation]&lt;br /&gt;
* [https://code.openbravo.com/erp/pmods/org.openbravo.financial.multitaxcategory/ Multi Tax Category]&lt;br /&gt;
* [https://code.openbravo.com/erp/pmods/org.openbravo.multiupc/ Multi UPC]&lt;br /&gt;
* [https://code.openbravo.com/erp/pmods/org.openbravo.retail.showprodsk/ Show Prod Description]&lt;br /&gt;
* [https://code.openbravo.com/erp/pmods/org.openbravo.retail.taxexempt/ Tax Exempt]&lt;br /&gt;
* [https://code.openbravo.com/erp/pmods/org.openbravo.mobile.warehouse/ Mobile Warehouse]&lt;br /&gt;
* [http://wiki.openbravo.com/wiki/Retail:Web_POS_User_Guide#Multi_Price_List Multi Price List]&lt;br /&gt;
* [https://code.openbravo.com/erp/pmods/org.openbravo.retail.printlast Print Last Ticket]&lt;br /&gt;
* [https://code.openbravo.com/erp/pmods/org.openbravo.retail.trainingmode Retail Training]&lt;br /&gt;
* [https://code.openbravo.com/erp/pmods/org.openbravo.retail.analytics Retail Analytics]&lt;br /&gt;
* [https://code.openbravo.com/erp/pmods/org.openbravo.retail.levelpricing/ Level Pricing]&lt;br /&gt;
* [https://code.openbravo.com/erp/pmods/org.openbravo.retail.bestsellers/ Best Sellers]&lt;br /&gt;
	&lt;br /&gt;
Discount Modules (see limitations section, the remark for discount setup there still applies): &lt;br /&gt;
* [https://code.openbravo.com/erp/pmods/org.openbravo.retail.discounts Retail Discounts] &lt;br /&gt;
* [https://code.openbravo.com/erp/pmods/org.openbravo.retail.copybestsellers/ Best Sellers]&lt;br /&gt;
* [https://code.openbravo.com/erp/pmods/org.openbravo.retail.copystore Copy Bestsellers]&lt;br /&gt;
* [https://code.openbravo.com/erp/pmods/org.openbravo.retail.discounts.bytotal Discounts by Total]&lt;br /&gt;
* [https://code.openbravo.com/erp/pmods/org.openbravo.retail.discounts.combo Combo Discount]&lt;br /&gt;
* [https://code.openbravo.com/erp/pmods/org.openbravo.retail.discount.twofamiliescombo Two Families Discount]&lt;br /&gt;
* [https://code.openbravo.com/erp/pmods/org.openbravo.retail.activediscountspopup/ Active Discount Popup]&lt;br /&gt;
* [https://code.openbravo.com/erp/pmods/org.openbravo.retail.discounts.bestdeal Best Deal]&lt;br /&gt;
* [https://code.openbravo.com/erp/pmods/org.openbravo.retail.discounts.coupons Coupons]&lt;br /&gt;
* [https://code.openbravo.com/erp/pmods/org.openbravo.retail.discounts.discountmatrixmanagement Discount Matrix]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
As a next step parallel to the 16Q2/Q3 releases we are adding automated tests on high volume datasets for many of these modules. This section will be updated when the automated tests on high volume data are enabled (probably around 16Q3 timeframe).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Retail]]&lt;/div&gt;</summary>
		<author><name>Wikiadmin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.infinite-erp.co.id/index.php?title=Retail:Configuration_Guide/id&amp;diff=4509</id>
		<title>Retail:Configuration Guide/id</title>
		<link rel="alternate" type="text/html" href="https://wiki.infinite-erp.co.id/index.php?title=Retail:Configuration_Guide/id&amp;diff=4509"/>
		<updated>2026-08-28T08:57:24Z</updated>

		<summary type="html">&lt;p&gt;Wikiadmin: Create ID subpage stub (scaffold) for Retail:Configuration Guide&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Languages}}&lt;br /&gt;
&lt;br /&gt;
== Retail:Configuration Guide (Bahasa Indonesia) ==&lt;br /&gt;
&lt;br /&gt;
Halaman ini adalah terjemahan Bahasa Indonesia dari [[Retail:Configuration Guide|Retail:Configuration Guide]]. Isinya masih dalam pengerjaan (work in progress).&lt;br /&gt;
&lt;br /&gt;
Silakan bantu melengkapi terjemahan mengikuti panduan di [[Starting_Guide_for_Wiki_translators|Starting Guide for Wiki Translators]].&lt;br /&gt;
&lt;br /&gt;
[[Category:WorkInProgress]]&lt;/div&gt;</summary>
		<author><name>Wikiadmin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.infinite-erp.co.id/index.php?title=Installation&amp;diff=4508</id>
		<title>Installation</title>
		<link rel="alternate" type="text/html" href="https://wiki.infinite-erp.co.id/index.php?title=Installation&amp;diff=4508"/>
		<updated>2026-08-28T08:57:23Z</updated>

		<summary type="html">&lt;p&gt;Wikiadmin: Add {{Languages}} switcher (EN) for ID subpage&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Languages}}&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;margin:auto;&amp;quot; cellpadding=&amp;quot;0&amp;quot;&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
Installation steps: Work from left to right using the clickable links&lt;br /&gt;
| &amp;lt;div class=&amp;quot;t&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;b&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;l&amp;quot;&amp;gt;&amp;lt;div&lt;br /&gt;
class=&amp;quot;r&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;bl&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;br&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;tl&amp;quot;&amp;gt;&amp;lt;div&lt;br /&gt;
class=&amp;quot;tr&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;height:25px;display:&lt;br /&gt;
table-cell;vertical-align:middle;&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color:#DC6710&amp;quot;&amp;gt;[[System_Administration_Guide | System Administration Guide]]&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
| &amp;lt;div class=&amp;quot;t&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;b&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;l&amp;quot;&amp;gt;&amp;lt;div&lt;br /&gt;
class=&amp;quot;r&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;bl&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;br&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;tl&amp;quot;&amp;gt;&amp;lt;div&lt;br /&gt;
class=&amp;quot;tr&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;height:25px;display:&lt;br /&gt;
table-cell;vertical-align:middle;&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color:#DC6710&amp;quot;&amp;gt;[[System_Requirements | System Requirements]]&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|- &lt;br /&gt;
&lt;br /&gt;
| &amp;lt;div class=&amp;quot;t&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;b&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;l&amp;quot;&amp;gt;&amp;lt;div&lt;br /&gt;
class=&amp;quot;r&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;bl&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;br&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;tl&amp;quot;&amp;gt;&amp;lt;div&lt;br /&gt;
class=&amp;quot;tr&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;height:25px;display:&lt;br /&gt;
table-cell;vertical-align:middle;&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color:#DC6710&amp;quot;&amp;gt;[[Installation | Installation]]&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|- &lt;br /&gt;
&lt;br /&gt;
| &amp;lt;div class=&amp;quot;t&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;b&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;l&amp;quot;&amp;gt;&amp;lt;div&lt;br /&gt;
class=&amp;quot;r&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;bl&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;br&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;tl&amp;quot;&amp;gt;&amp;lt;div&lt;br /&gt;
class=&amp;quot;tr&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;height:25px;display:&lt;br /&gt;
table-cell;vertical-align:middle;&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color:#DC6710&amp;quot;&amp;gt;[[Upgrading_From_2.50 | Upgrading]]&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;div class=&amp;quot;t&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;b&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;l&amp;quot;&amp;gt;&amp;lt;div&lt;br /&gt;
class=&amp;quot;r&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;bl&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;br&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;tl&amp;quot;&amp;gt;&amp;lt;div&lt;br /&gt;
class=&amp;quot;tr&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;height:25px;display:&lt;br /&gt;
table-cell;vertical-align:middle;&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color:#DC6710&amp;quot;&amp;gt;[http://landings.openbravo.com/openbravo-cloud '''Openbravo Cloud (recommended)''']&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;div class=&amp;quot;t&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;b&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;l&amp;quot;&amp;gt;&amp;lt;div&lt;br /&gt;
class=&amp;quot;r&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;bl&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;br&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;tl&amp;quot;&amp;gt;&amp;lt;div&lt;br /&gt;
class=&amp;quot;tr&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;height:25px;display:&lt;br /&gt;
table-cell;vertical-align:middle;&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color:#DC6710&amp;quot;&amp;gt;[[Installation/Appliance | '''Appliance''']]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#489C06&amp;quot;&amp;gt;Available in EC2, ISO and VMware&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;div class=&amp;quot;t&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;b&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;l&amp;quot;&amp;gt;&amp;lt;div&lt;br /&gt;
class=&amp;quot;r&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;bl&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;br&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;tl&amp;quot;&amp;gt;&amp;lt;div&lt;br /&gt;
class=&amp;quot;tr&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;height:25px;display:&lt;br /&gt;
table-cell;vertical-align:middle;&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color:#DC6710&amp;quot;&amp;gt;[[Installation/Custom | Custom installation]]&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
| &amp;lt;div class=&amp;quot;t&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;b&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;l&amp;quot;&amp;gt;&amp;lt;div&lt;br /&gt;
class=&amp;quot;r&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;bl&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;br&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;tl&amp;quot;&amp;gt;&amp;lt;div&lt;br /&gt;
class=&amp;quot;tr&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;height:25px;display:&lt;br /&gt;
table-cell;vertical-align:middle;&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color:#DC6710&amp;quot;&amp;gt;[[Instance_Activation | Activation]]&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;currentversion type=&amp;quot;link&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;br /&gt;
&lt;br /&gt;
{{(!)|'''The current Openbravo release is #version#'''. Make sure you are installing the latest version.}}&lt;br /&gt;
&lt;br /&gt;
== Deployment options ==&lt;br /&gt;
&lt;br /&gt;
==== Recommended ====&lt;br /&gt;
The recommended option is to use the Openbravo Cloud:&lt;br /&gt;
* [http://landings.openbravo.com/openbravo-cloud '''Openbravo Cloud''']: A single-tenant Platform-as-a-Service (PaaS) option that enables you to deploy Openbravo on virtual servers in Amazon Web Services&lt;br /&gt;
&lt;br /&gt;
==== Other options available ====&lt;br /&gt;
* [[Installation/Appliance|'''Openbravo Appliance''']]:&lt;br /&gt;
** '''Amazon EC2''' : intended for production, also can be used for testing.&lt;br /&gt;
** '''Iso''' : intended for production servers, can be used in physical servers, virtualization options like (VMware Server, Virtualbox, etc) or any server provider that allows to use your own iso.&lt;br /&gt;
** '''Vmware''' : ONLY for testing, uncompress and launch it in your preferred virtualization program (VMware, Virtualbox, etc ) and get an Openbravo running easily.&lt;br /&gt;
&lt;br /&gt;
==== Experts Only ====&lt;br /&gt;
* [[Installation/Custom|'''Custom deployment''']]: we don't recommend to use it, please use the appliance in one of the previous options. Custom install is only an option when you know what are you doing and you have very special needs that don't fit in the appliances.&lt;br /&gt;
&lt;br /&gt;
==== Discontinued options ====&lt;br /&gt;
* [[Installation/Ubuntu|'''Ubuntu package (ppa)''']] '''(discontinued)''': we don't recommend to use it.&lt;br /&gt;
&lt;br /&gt;
[[Category:Installation]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/currentversion&amp;gt;&lt;/div&gt;</summary>
		<author><name>Wikiadmin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.infinite-erp.co.id/index.php?title=Installation/id&amp;diff=4507</id>
		<title>Installation/id</title>
		<link rel="alternate" type="text/html" href="https://wiki.infinite-erp.co.id/index.php?title=Installation/id&amp;diff=4507"/>
		<updated>2026-08-28T08:57:22Z</updated>

		<summary type="html">&lt;p&gt;Wikiadmin: Create ID subpage stub (scaffold) for Installation&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Languages}}&lt;br /&gt;
&lt;br /&gt;
== Installation (Bahasa Indonesia) ==&lt;br /&gt;
&lt;br /&gt;
Halaman ini adalah terjemahan Bahasa Indonesia dari [[Installation|Installation]]. Isinya masih dalam pengerjaan (work in progress).&lt;br /&gt;
&lt;br /&gt;
Silakan bantu melengkapi terjemahan mengikuti panduan di [[Starting_Guide_for_Wiki_translators|Starting Guide for Wiki Translators]].&lt;br /&gt;
&lt;br /&gt;
[[Category:WorkInProgress]]&lt;/div&gt;</summary>
		<author><name>Wikiadmin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.infinite-erp.co.id/index.php?title=Quick_Guide/id&amp;diff=4506</id>
		<title>Quick Guide/id</title>
		<link rel="alternate" type="text/html" href="https://wiki.infinite-erp.co.id/index.php?title=Quick_Guide/id&amp;diff=4506"/>
		<updated>2026-08-28T08:57:21Z</updated>

		<summary type="html">&lt;p&gt;Wikiadmin: Create ID subpage stub (scaffold) for Quick Guide&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Languages}}&lt;br /&gt;
&lt;br /&gt;
== Quick Guide (Bahasa Indonesia) ==&lt;br /&gt;
&lt;br /&gt;
Halaman ini adalah terjemahan Bahasa Indonesia dari [[Quick Guide|Quick Guide]]. Isinya masih dalam pengerjaan (work in progress).&lt;br /&gt;
&lt;br /&gt;
Silakan bantu melengkapi terjemahan mengikuti panduan di [[Starting_Guide_for_Wiki_translators|Starting Guide for Wiki Translators]].&lt;br /&gt;
&lt;br /&gt;
[[Category:WorkInProgress]]&lt;/div&gt;</summary>
		<author><name>Wikiadmin</name></author>
		
	</entry>
</feed>