'Hello world' report
Hello World
// Banana Accounting Extension Javascript
// @api = 1.0
// @id = ch.banana.uni.app.tutorialhelloworld
// @description = Tutorial: Hello world
// @task = app.command
// @doctype = nodocument
// @publisher = Banana.ch SA
// @pubdate = 2019-01-25
// @inputdatasource = none
// @timeout = -1
function exec() {
//Create the report
var report = Banana.Report.newReport('Report title');
//Add a paragraph with some text
report.addParagraph('Hello World!!!');
//Print the report
var stylesheet = Banana.Report.newStyleSheet();
Banana.Report.preview(report, stylesheet);
}
Creating Reports
Add several paragraphs
// Banana Accounting Extension Javascript
// @api = 1.0
// @id = ch.banana.uni.app.tutorialaddseveralparagraphs
// @description = Tutorial: Add several paragraphs
// @task = app.command
// @doctype = nodocument
// @publisher = Banana.ch SA
// @pubdate = 2019-01-25
// @inputdatasource = none
// @timeout = -1
function exec() {
//Create the report
var report = Banana.Report.newReport('Report title');
//Add several paragraphs with some text
report.addParagraph('This');
report.addParagraph('is');
report.addParagraph('a');
report.addParagraph('text');
report.addParagraph(' '); //Empty paragraph
report.addParagraph('printed');
report.addParagraph('on');
report.addParagraph('several');
report.addParagraph('paragraphs.');
//Print the report
var stylesheet = Banana.Report.newStyleSheet();
Banana.Report.preview(report, stylesheet);
}
Add the header
// Banana Accounting Extension Javascript
// @api = 1.0
// @id = ch.banana.uni.app.tutorialheaderstyles
// @description = Tutorial: Add the header with some styles
// @task = app.command
// @doctype = nodocument
// @publisher = Banana.ch SA
// @pubdate = 2019-01-25
// @inputdatasource = none
// @timeout = -1
function exec() {
//Create the report
var report = Banana.Report.newReport('Report title');
//Add the header
report.getHeader().addClass('header');
report.getHeader().addText('This is the header text aligned to the right with a bottom border', 'header');
//Add some style
var stylesheet = Banana.Report.newStyleSheet();
//Header style
style = stylesheet.addStyle(".header");
style.setAttribute("text-align", "right");
style.setAttribute("border-bottom", "thin solid black");
//Print the report
Banana.Report.preview(report, stylesheet);
}
Add the footer
// Banana Accounting Extension Javascript
// @api = 1.0
// @id = ch.banana.uni.app.tutorialfooterstyles
// @description = Tutorial: Add the footer with some styles
// @task = app.command
// @doctype = nodocument
// @publisher = Banana.ch SA
// @pubdate = 2019-01-25
// @inputdatasource = none
// @timeout = -1
function exec() {
//Create the report
var report = Banana.Report.newReport('Report title');
//Add the footer with page numbers
report.getFooter().addClass('footer');
report.getFooter().addText('Banana Accounting, v. ' + Banana.document.info('Base', 'ProgramVersion'));
report.getFooter().addText(' - Page' + ' ');
report.getFooter().addFieldPageNr();
//Add some style
var stylesheet = Banana.Report.newStyleSheet();
//Footer style
style = stylesheet.addStyle(".footer");
style.setAttribute("text-align", "right");
style.setAttribute("font-size", "8px");
style.setAttribute("font-family", "Courier New");
//Print the report
Banana.Report.preview(report, stylesheet);
}
Add an image
// Banana Accounting Extension Javascript
// @api = 1.0
// @id = ch.banana.uni.app.tutorialimage
// @description = Tutorial: Add an image
// @task = app.command
// @doctype = nodocument
// @publisher = Banana.ch SA
// @pubdate = 2019-01-25
// @inputdatasource = none
// @timeout = -1
function exec() {
//Create the report
var report = Banana.Report.newReport('Report title');
//Add an image stored in the document tabel
report.addImage("documents:logo");
//Add a png image passing the content of the image
report.addImage("data:image/png;base64,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");
//Add a svg image passing the content of image
report.addImage('data:image/svg;utf8,<svg version="1.2" baseProfile="tiny" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/" x="0px" y="0px" width="337px" height="82px" viewBox="0 0 337 82" xml:space="preserve"><defs></defs><path fill="#234571" d="M16.737,0c5.755,0,9.592,3.309,9.592,8.151c0,3.453-2.973,6.38-5.803,6.906c3.405,0.191,8.105,3.405,8.105,8.632c0,5.947-4.172,9.881-10.839,9.881H4.651V0H16.737z M16.209,14.1c4.412,0,7.337-2.35,7.337-5.851s-2.925-5.755-7.337-5.755H7.48v11.604L16.209,14.1L16.209,14.1z M17.648,31.078c4.556,0,8.104-2.734,8.104-7.242c0-4.221-3.836-7.29-8.393-7.29H7.48v14.532H17.648z"/><path fill="#234571" d="M59.56,24.076H39.514l-4.844,9.495h-3.069L48.77,0.001h1.535l17.169,33.57h-3.069L59.56,24.076z M58.218,21.438L49.873,4.989l-0.336-0.863l-0.335,0.863l-8.345,16.448L58.218,21.438L58.218,21.438z"/><path fill="#234571" d="M100.178,0v33.568H97.54L76.678,5.801l-0.671-1.007l0.096,1.391v27.387h-2.83V0.001h2.638l20.91,27.672l0.624,1.055l-0.096-1.438V0H100.178z"/><path fill="#234571" d="M132.833,24.076h-20.047l-4.844,9.495h-3.069l17.169-33.57h1.535l17.168,33.57h-3.068L132.833,24.076z M131.492,21.438L123.145,4.99l-0.336-0.863l-0.334,0.863l-8.346,16.448H131.492z"/><path fill="#234571" d="M173.452,0v33.568h-2.638L149.954,5.8l-0.672-1.007l0.096,1.391v27.387h-2.83V0.001h2.64l20.91,27.672l0.623,1.055l-0.097-1.438V0H173.452z"/><path fill="#234571" d="M206.105,24.076h-20.047l-4.844,9.495h-3.068l17.168-33.57h1.535l17.17,33.57h-3.067L206.105,24.076z M204.762,21.438L196.416,4.99l-0.336-0.863l-0.336,0.863L187.4,21.438H204.762z"/><path fill="#234571" d="M26.376,75.723H10.934l-1.966,4.316H0l15.826-33.57h5.659l15.826,33.57h-8.968L26.376,75.723z M22.972,68.193l-3.837-8.486l-0.479-1.344l-0.479,1.344l-3.837,8.486H22.972z"/><path fill="#234571" d="M61.334,56.875c-1.535-1.918-4.412-3.117-7.05-3.117c-5.563,0-9.016,3.98-9.016,9.496c0,5.803,3.789,9.398,9.016,9.398c3.213,0,6.283-1.633,7.673-3.934l8.153,2.109c-2.781,5.945-8.776,9.88-15.826,9.88c-9.64,0-17.409-7.338-17.409-17.457s7.769-17.457,17.409-17.457c6.618,0,12.277,3.55,15.251,8.92L61.334,56.875z"/><path fill="#234571" d="M97.012,56.875c-1.535-1.918-4.412-3.117-7.05-3.117c-5.563,0-9.016,3.98-9.016,9.496c0,5.803,3.789,9.398,9.016,9.398c3.213,0,6.283-1.633,7.673-3.934l8.153,2.109c-2.781,5.945-8.776,9.88-15.826,9.88c-9.64,0-17.409-7.338-17.409-17.457s7.769-17.457,17.409-17.457c6.618,0,12.277,3.55,15.251,8.92L97.012,56.875z"/><path fill="#234571" d="M125.64,45.797c9.642,0,17.457,7.338,17.457,17.457s-7.815,17.457-17.457,17.457c-9.64,0-17.409-7.338-17.409-17.457S116,45.797,125.64,45.797z M125.64,72.749c5.467,0,9.064-3.884,9.064-9.495c0-5.658-3.598-9.496-9.064-9.496c-5.418,0-9.016,3.838-9.016,9.496C116.623,68.865,120.22,72.749,125.64,72.749z"/><path fill="#234571" d="M178.102,46.469v18.655c0,10.069-6.232,15.587-15.104,15.587c-8.922,0-15.106-5.518-15.106-15.587V46.469h8.057v18.943c0,4.796,2.637,7.77,7.051,7.77c4.412,0,7.049-2.974,7.049-7.77V46.469H178.102z"/><path fill="#234571" d="M214.645,46.469v33.57h-7.58l-13.905-17.938l-0.671-1.248l0.097,1.248v17.938h-8.06v-33.57h7.576l13.908,17.696l0.672,1.247l-0.098-1.247V46.469H214.645z"/><path fill="#234571" d="M247.204,46.469v7.529h-10.218v26.041h-8.059v-26.04h-10.068v-7.53H247.204L247.204,46.469z"/><path fill="#234571" d="M251.418,80.04V46.469h8.061v33.57L251.418,80.04L251.418,80.04z"/><path fill="#234571" d="M297.077,46.469v33.57h-7.578L275.59,62.102l-0.67-1.248l0.096,1.248v17.938h-8.057v-33.57h7.576l13.908,17.696l0.672,1.247l-0.098-1.247V46.469H297.077z"/><path fill="#234571" d="M329.008,77.307c-1.965,2.109-5.317,3.404-9.106,3.404c-9.644,0-17.408-7.338-17.408-17.457s7.77-17.457,17.408-17.457c6.52,0,12.229,3.453,15.25,8.92l-8.199,2.158c-1.584-1.918-4.412-3.117-7.051-3.117c-5.562,0-9.021,3.98-9.021,9.496c0,5.896,3.98,9.592,9.496,9.592c5.371,0,7.725-2.781,8.684-5.273v-0.051h-8.823v-6.474h15.682v18.991h-6.906v-2.732H329.008L329.008,77.307z"/></svg>');
//Print the report
var stylesheet = Banana.Report.newStyleSheet();
stylesheet.addStyle("img", "margin-bottom:4em");
Banana.Report.preview(report, stylesheet);
}
Add page break
// Banana Accounting Extension Javascript
// @api = 1.0
// @id = ch.banana.uni.app.tutorialpagebreak
// @description = Tutorial: Page break
// @task = app.command
// @doctype = nodocument
// @publisher = Banana.ch SA
// @pubdate = 2019-01-25
// @inputdatasource = none
// @timeout = -1
function exec() {
//Create the report
var report = Banana.Report.newReport('Report title');
//Add a paragraph with some text
report.addParagraph('Hello');
//Add a page break
report.addPageBreak();
//Add an other paragraph
report.addParagraph('World!!!');
//Print the report
var stylesheet = Banana.Report.newStyleSheet();
Banana.Report.preview(report, stylesheet);
}
Add attachments
// Banana Accounting Extension Javascript
// @api = 1.0
// @id = ch.banana.uni.app.tutorialattachments
// @description = Tutorial: Attachments
// @task = app.command
// @doctype = nodocument
// @publisher = Banana.ch SA
// @pubdate = 2019-01-25
// @inputdatasource = none
// @timeout = -1
function exec() {
//Create the report
var report = Banana.Report.newReport('Report attachments');
//Add a paragraph with some text
report.addParagraph('Report with attachments');
//Attach text files created on the fly
//We use the prefix 'data:...' to tell that the string is not an url but is itself the content of the file
report.addAttachment('text file 1.txt', 'data:text/plain;utf8,This is the content of the text file 1.');
report.addAttachment('text file 2.txt', 'data:text/plain;utf8,This is the content of the text file 2.');
report.addAttachment('text file 3.txt', 'data:text/plain;utf8,This is the content of the text file 3.');
//Attach an image stored in the document table
//We use the prefix 'document:...'
report.addAttachment('logo.jpg', 'documents:logo');
//Add an xml element
//We just add the new created Banana.Xml.newDocument
var xmlDocument = Banana.Xml.newDocument("eCH-0217:VATDeclaration");
var rootNode = xmlDocument.addElement("eCH-0217:VATDeclaration");
rootNode.addElement("title").addTextNode("Vat Declaration 2018");
report.addAttachment('vat_declaration.xml', xmlDocument);
//Print the report
var stylesheet = Banana.Report.newStyleSheet();
Banana.Report.preview(report, stylesheet);
}
Print multiple reports
// Banana Accounting Extension Javascript
// @api = 1.0
// @id = ch.banana.uni.app.tutorialmultiplereports
// @description = Tutorial: Multiple reports
// @task = app.command
// @doctype = nodocument
// @publisher = Banana.ch SA
// @pubdate = 2019-01-25
// @inputdatasource = none
// @timeout = -1
function exec() {
var docs = [];
var styles = [];
// Report
for (var i = 0; i < 10; i++) {
var report = Banana.Report.newReport("Report title");
report.addParagraph("Hello World #" + i + " !!!", "styleHelloWorld");
report.setTitle("Document " + i);
report.getFooter().addFieldPageNr();
docs.push(report);
// Styles
var stylesheet = Banana.Report.newStyleSheet();
var style = stylesheet.addStyle(".styleHelloWorld");
style.setAttribute("font-size", "24pt");
style.setAttribute("text-align", "center");
style.setAttribute("margin-top", "10mm");
var style2 = stylesheet.addStyle("@page");
style2.setAttribute("size", "landscape");
styles.push(stylesheet);
}
// Print preview of 10 documents together
Banana.Report.preview("Multi documents printing example", docs, styles);
}
Add structured text
// Banana Accounting Extension Javascript
// @api = 1.2.0
// @id = ch.banana.uni.app.tutorialstructuredtext
// @description = Hello world
// @task = app.command
// @doctype = nodocument
// @publisher = Publisher name
// @pubdate = 2022-05-31
// @inputdatasource = none
// @timeout = -1
function exec() {
//Create the report and the stylesheet
var report = Banana.Report.newReport('Tutorial Banana.ReportElement.addStructuredText');
var stylesheet = Banana.Report.newStyleSheet();
stylesheet.addStyle(".example", "margin-top: 2em; margin-bottom: 0.5em; font-style: italic;");
report.addParagraph("--- Markdown example ---", "example");
let mdText = "# Header 1\n";
mdText += "## Header 2\n";
mdText += "### Header 3\n";
mdText += "Markdown text with **bold** and *italic*. \n";
mdText += "[Markdown link](https://www.banana.ch) \n";
mdText += "* List row 1\n";
mdText += "* List row 2\n";
mdText += "* List row 3\n";
report.addStructuredText(mdText, "md");
report.addParagraph("--- Simple html example ---", "example");
let htmlText = "<h1 style=\"color: purple\">Header 1</h1>\n";
htmlText += "<p style=\"color: blue\">Paragraph</p>\n";
report.addStructuredText(htmlText, "html");
report.addParagraph("--- Full html example ---", "example");
htmlText = "<html>\n";
htmlText += "<head>\n";
htmlText += "<style>\n";
htmlText += "p.green {color: green;}\n";
htmlText += ".red {color: red;}\n";
htmlText += "</style>\n";
htmlText += "</head>\n";
htmlText += "<body>\n";
htmlText += "<h1 class=\"red\">Header 1</h1>\n";
htmlText += "<p class=\"green\">Paragraph</p>\n";
htmlText += "</body>\n";
htmlText += "</html>\n";
report.addStructuredText(htmlText, "html", stylesheet);
report.addParagraph("--- Plain html example ---", "example");
let plainText = "Testo riga 1\n";
plainText += "Testo riga 2\n";
plainText += "Testo riga 3\n";
report.addStructuredText(plainText, "text");
//Print the report
Banana.Report.preview(report, stylesheet);
}
Creating Reports with table object
Create a table with one row
// Banana Accounting Extension Javascript
// @api = 1.0
// @id = ch.banana.uni.app.tutorialtableonerow
// @description = Tutorial: Create a table with one row
// @task = app.command
// @doctype = nodocument
// @publisher = Banana.ch SA
// @pubdate = 2019-01-25
// @inputdatasource = none
// @timeout = -1
function exec() {
//Create the report
var report = Banana.Report.newReport('Report title');
//Create a table
var table = report.addTable('myTable');
//Add a row
tableRow = table.addRow();
tableRow.addCell('Cash');
tableRow.addCell('1200');
//Create style
var stylesheet = Banana.Report.newStyleSheet();
Banana.Report.preview(report, stylesheet);
}
Create a table with multiple rows
// Banana Accounting Extension Javascript
// @api = 1.0
// @id = ch.banana.uni.app.tutorialtablemultiplerows
// @description = Tutorial: Create a table with multiple rows
// @task = app.command
// @doctype = nodocument
// @publisher = Banana.ch SA
// @pubdate = 2019-01-25
// @inputdatasource = none
// @timeout = -1
function exec() {
//Create the report
var report = Banana.Report.newReport('Report title');
//Create a table
var table = report.addTable('myTable');
//Add row 1
tableRow = table.addRow();
tableRow.addCell('Cash');
tableRow.addCell('1200');
//Add row 2
tableRow = table.addRow();
tableRow.addCell('Bank 1');
tableRow.addCell('500');
//Add row 3
tableRow = table.addRow();
tableRow.addCell('Bank 2');
tableRow.addCell('2600');
//Print report
var stylesheet = Banana.Report.newStyleSheet();
Banana.Report.preview(report, stylesheet);
}
Create a table with multiple rows and a header
// Banana Accounting Extension Javascript
// @api = 1.0
// @id = ch.banana.uni.app.tutorialtablewithheader
// @description = Tutorial: Create a table with multiple rows and header
// @task = app.command
// @doctype = nodocument
// @publisher = Banana.ch SA
// @pubdate = 2019-01-25
// @inputdatasource = none
// @timeout = -1
function exec() {
//Create the report
var report = Banana.Report.newReport('Report title');
//Create a table
var table = report.addTable('myTable');
//Create table header
var tableHeader = table.getHeader();
//Add the header of the table
tableRow = tableHeader.addRow();
tableRow.addCell('Description');
tableRow.addCell('Amount');
//Add row 1
tableRow = table.addRow();
tableRow.addCell('Cash');
tableRow.addCell('1200');
//Add row 2
tableRow = table.addRow();
tableRow.addCell('Bank 1');
tableRow.addCell('500');
//Add row 3
tableRow = table.addRow();
tableRow.addCell('Bank 2');
tableRow.addCell('2600');
//Print the report
var stylesheet = Banana.Report.newStyleSheet();
Banana.Report.preview(report, stylesheet);
}
Create a table with multiple rows, header and borders
// Banana Accounting Extension Javascript
// @api = 1.0
// @id = ch.banana.uni.app.tutorialtablewithheaderandborders
// @description = Tutorial: Create a table with multiple rows, header and borders
// @task = app.command
// @doctype = nodocument
// @publisher = Banana.ch SA
// @pubdate = 2019-01-25
// @inputdatasource = none
// @timeout = -1
function exec() {
//Create the report
var report = Banana.Report.newReport('Report title');
//Create a table
var table = report.addTable('myTable');
//Create table header
var tableHeader = table.getHeader();
//Add the header of the table
tableRow = tableHeader.addRow();
tableRow.addCell('Description');
tableRow.addCell('Amount');
//Add row 1
tableRow = table.addRow();
tableRow.addCell('Cash');
tableRow.addCell('1200');
//Add row 2
tableRow = table.addRow();
tableRow.addCell('Bank 1');
tableRow.addCell('500');
//Add row 3
tableRow = table.addRow();
tableRow.addCell('Bank 2');
tableRow.addCell('2600');
//Stylesheet
var stylesheet = Banana.Report.newStyleSheet();
//Create style for the table adding borders
var style = stylesheet.addStyle("table");
stylesheet.addStyle("table.myTable td", "border: thin solid black");
//Print report
Banana.Report.preview(report, stylesheet);
}
Create a table with fixed columns widths
// Banana Accounting Extension Javascript
// @api = 1.0
// @id = ch.banana.uni.app.tutorialtablecolumnswidth
// @description = Tutorial: Create a table with fixed columns width
// @task = app.command
// @doctype = nodocument
// @publisher = Banana.ch SA
// @pubdate = 2019-01-25
// @inputdatasource = none
// @timeout = -1
function exec() {
var report = Banana.Report.newReport("Javascrip Tutorial - Table with fixed column widths");
/* Create the table */
var table = report.addTable("table");
/* Add columns */
var column1 = table.addColumn("col1");
var column2 = table.addColumn("col2");
var column3 = table.addColumn("col3");
var column4 = table.addColumn("col4");
var row;
/* Add a row with cells */
row = table.addRow(); //Add a row
row.addCell("A", "", 1); //add first cell
row.addCell("B", "", 1); //add second cell
row.addCell("C", "", 1); //add third cell
row.addCell("D", "", 1); //add fourth cell
//Add more rows...
/* Print the report */
var stylesheet = createStyleSheet();
Banana.Report.preview(report, stylesheet);
}
function createStyleSheet() {
var stylesheet = Banana.Report.newStyleSheet();
var style = stylesheet.addStyle(".table");
style.setAttribute("width","100%"); //table takes all the page width
stylesheet.addStyle("table.table td", "border: thin solid black");
/* Set column widths */
stylesheet.addStyle(".col1", "width:10%");
stylesheet.addStyle(".col2", "width:55%");
stylesheet.addStyle(".col3", "width:30%");
stylesheet.addStyle(".col4", "width:5%");
return stylesheet;
}
Add multiple paragraphs in one cell
// Banana Accounting Extension Javascript
// @api = 1.0
// @id = ch.banana.uni.app.tutorialcellmultipleparagraphs
// @description = Tutorial: Add multiple paragraphs in one cell of the table
// @task = app.command
// @doctype = nodocument
// @publisher = Banana.ch SA
// @pubdate = 2019-01-25
// @inputdatasource = none
// @timeout = -1
function exec() {
var report = Banana.Report.newReport("Javascrip Tutorial - Add multiple paragraphs in one cell");
/* Create the table */
var table = report.addTable("table");
var row;
/* Add a row */
row = table.addRow();
/* Add first cell with paragraphs*/
var cell1 = row.addCell("", "", 1);
cell1.addParagraph("First paragraph...", "");
cell1.addParagraph("Second paragraph...", "");
cell1.addParagraph(" "); //empty paragraph
cell1.addParagraph("Fourth paragraph...", "");
/* Add second cell without paragraphs */
var cell2 = row.addCell("Cell2...", "", 1);
/* Print the report */
var stylesheet = createStyleSheet();
Banana.Report.preview(report, stylesheet);
}
function createStyleSheet() {
var stylesheet = Banana.Report.newStyleSheet();
style = stylesheet.addStyle(".table");
style.setAttribute("width","100%");
stylesheet.addStyle("table.table td", "border: thin solid black");
return stylesheet;
}
Create a table with fixed columns and cells span
// Banana Accounting Extension Javascript
// @api = 1.0
// @id = ch.banana.uni.app.tutorialtablefixedcolumnscellspan
// @description = Tutorial: Create a table with fixed columns and cells span
// @task = app.command
// @doctype = nodocument
// @publisher = Banana.ch SA
// @pubdate = 2019-01-25
// @inputdatasource = none
// @timeout = -1
function exec() {
var report = Banana.Report.newReport("Javascrip Tutorial - Simple Table");
/* Create the table */
var table = report.addTable("table");
/* Add columns */
var column1 = table.addColumn("col1");
var column2 = table.addColumn("col2");
var column3 = table.addColumn("col3");
var column4 = table.addColumn("col4");
var row;
/* 1st row */
row = table.addRow();
row.addCell("Row 1, Cell 1: span cell over 4 columns", "", 4); //span cell over 4 columns
/* 2nd row */
row = table.addRow();
row.addCell("Row 2, Cell 1: span cell over 2 columns", "", 2); //span cell over 2 columns
row.addCell("Row 2, Cell 3: span cell over 2 columns", "", 2); //span cell over 2 columns
/* 3rd row */
row = table.addRow();
row.addCell("Row 3, Cell 1", "", 1);
row.addCell("Row 3, Cell 2: span cell over 2 columns", "", 2); //span cell over 2 columns
row.addCell("Row 3, Cell 4", "", 1);
/* 4th row*/
row = table.addRow();
row.addCell("Row 4, Cell 1", "", 1);
row.addCell("Row 4, Cell 2", "", 1);
row.addCell("Row 4, Cell 3", "", 1);
row.addCell("Row 4, Cell 4", "", 1);
/* 5th row */
row = table.addRow();
row.addCell("Row 5, Cell 1: span cell over 3 columns", "", 3); //span cell over 3 columns
row.addCell("Row 5, Cell 4", "", 1);
/* Print the report */
var stylesheet = createStyleSheet();
Banana.Report.preview(report, stylesheet);
}
function createStyleSheet() {
var stylesheet = Banana.Report.newStyleSheet();
var style = stylesheet.addStyle(".table");
style.setAttribute("width","100%"); //table takes all the page width
stylesheet.addStyle("table.table td", "border: thin solid black; padding-top:10px; padding-bottom:10px;");
/* Set columns' width */
stylesheet.addStyle(".col1", "width:25%");
stylesheet.addStyle(".col2", "width:25%");
stylesheet.addStyle(".col3", "width:25%");
stylesheet.addStyle(".col4", "width:25%");
return stylesheet;
}
Add reporting styles
Set page margins
// Banana Accounting Extension Javascript
// @api = 1.0
// @id = ch.banana.uni.app.tutorialstylesheetsetmargins
// @description = Tutorial: Stylesheet set margins
// @task = app.command
// @doctype = nodocument
// @publisher = Banana.ch SA
// @pubdate = 2019-01-25
// @inputdatasource = none
// @timeout = -1
function exec() {
//Create the report
var report = Banana.Report.newReport('Report title');
//Add a paragraph with some text using a style
report.addParagraph('Hello world!');
//Add some styles
var stylesheet = Banana.Report.newStyleSheet();
//Create the margin for the page: [top, right, bottom, left]
var pageStyle = stylesheet.addStyle("@page");
pageStyle.setAttribute("margin", "10mm 20mm 10mm 20mm");
//Print the report
Banana.Report.preview(report, stylesheet);
}
Set landscape page
// Banana Accounting Extension Javascript
// @api = 1.0
// @id = ch.banana.uni.app.tutorialstylesheetsetlandscape
// @description = Tutorial: Stylesheet set landscape
// @task = app.command
// @doctype = nodocument
// @publisher = Banana.ch SA
// @pubdate = 2019-01-25
// @inputdatasource = none
// @timeout = -1
function exec() {
//Create the report
var report = Banana.Report.newReport('Report title');
//Add a paragraph with some text using a style
report.addParagraph('Hello world!');
//Add some styles
var stylesheet = Banana.Report.newStyleSheet();
//Create the margin for the page
var pageStyle = stylesheet.addStyle("@page");
pageStyle.setAttribute("size", "landscape");
//Print the report
Banana.Report.preview(report, stylesheet);
}
Add bold style to a text
// Banana Accounting Extension Javascript
// @api = 1.0
// @id = ch.banana.uni.app.tutorialstylesheetboldtext
// @description = Tutorial: Stylesheet add bold style to a text
// @task = app.command
// @doctype = nodocument
// @publisher = Banana.ch SA
// @pubdate = 2019-01-25
// @inputdatasource = none
// @timeout = -1
function exec() {
//Create the report
var report = Banana.Report.newReport('Report title');
//Add a paragraph with some text using a style
report.addParagraph('Hello world!', 'boldStyle');
//Add some styles
var stylesheet = Banana.Report.newStyleSheet();
//Create the "boldStyle"
style = stylesheet.addStyle(".boldStyle");
style.setAttribute("font-weight", "bold");
//Print the report
Banana.Report.preview(report, stylesheet);
}
Add a font size to a text
// Banana Accounting Extension Javascript
// @api = 1.0
// @id = ch.banana.uni.app.tutorialstylesheetfontsizetext
// @description = Tutorial: Stylesheet add a specific font size to a text
// @task = app.command
// @doctype = nodocument
// @publisher = Banana.ch SA
// @pubdate = 2019-01-25
// @inputdatasource = none
// @timeout = -1
function exec() {
//Create the report
var report = Banana.Report.newReport('Report title');
//Add a paragraph with some text using a style
report.addParagraph('Hello world!', 'titleStyle');
//Add some styles
var stylesheet = Banana.Report.newStyleSheet();
//Create the style for the text
style = stylesheet.addStyle(".titleStyle");
style.setAttribute("font-size", "20px");
//Print the report
Banana.Report.preview(report, stylesheet);
}
Add a color to a text
// Banana Accounting Extension Javascript
// @api = 1.0
// @id = ch.banana.uni.app.tutorialstylesheetcolortext
// @description = Tutorial: Stylesheet add a color to a text
// @task = app.command
// @doctype = nodocument
// @publisher = Banana.ch SA
// @pubdate = 2019-01-25
// @inputdatasource = none
// @timeout = -1
function exec() {
//Create the report
var report = Banana.Report.newReport('Report title');
//Add a paragraph with some text using a style
report.addParagraph('Hello world!', 'colorStyle');
//Add some styles
var stylesheet = Banana.Report.newStyleSheet();
//Create the style for the text
style = stylesheet.addStyle(".colorStyle");
style.setAttribute("color", "red");
//Print the report
Banana.Report.preview(report, stylesheet);
}
First page/cover example
// Banana Accounting Extension Javascript
// @api = 1.0
// @id = ch.banana.uni.app.tutorialcoverpageexample
// @description = Tutorial: First page/cover example
// @task = app.command
// @doctype = nodocument
// @publisher = Banana.ch SA
// @pubdate = 2019-01-25
// @inputdatasource = none
// @timeout = -1
function exec() {
//Create the report
var report = Banana.Report.newReport("Cover example");
var title = " 'This is the title' ";
var companyName = "Banana.ch SA";
var openingDate = "01.01.2015";
var closufeDate = "31.12.2015";
var year = "2015";
report.addParagraph(title, "heading1 alignCenter");
report.addParagraph(" ");
report.addParagraph(companyName, "heading2 alignCenter");
report.addParagraph(" ");
report.addParagraph(year, "heading3 alignCenter");
report.addParagraph(" ");
report.addParagraph("(" + openingDate + " - " + closufeDate + ")", "heading4 alignCenter");
//Add some styles
var stylesheet = Banana.Report.newStyleSheet();
var pageStyle = stylesheet.addStyle("@page");
pageStyle.setAttribute("margin", "10mm 10mm 10mm 20mm");
stylesheet.addStyle("body", "font-family : Helvetica");
style = stylesheet.addStyle(".heading1");
style.setAttribute("font-size", "22px");
style.setAttribute("font-weight", "bold");
style.setAttribute("border-top", "100mm");
style = stylesheet.addStyle(".heading2");
style.setAttribute("font-size", "18px");
style.setAttribute("font-weight", "bold");
style = stylesheet.addStyle(".heading3");
style.setAttribute("font-size", "14px");
style.setAttribute("font-weight", "bold");
style = stylesheet.addStyle(".heading4");
style.setAttribute("font-size", "10px");
style.setAttribute("font-weight", "bold");
style = stylesheet.addStyle(".alignCenter");
style.setAttribute("text-align", "center");
//Print the report
Banana.Report.preview(report, stylesheet);
}
Format values
Format numbers
// Banana Accounting Extension Javascript
// @api = 1.0
// @id = ch.banana.uni.app.tutorialformatnumbers
// @description = Tutorial: Format numbers
// @task = app.command
// @doctype = nodocument
// @publisher = Banana.ch SA
// @pubdate = 2019-01-25
// @inputdatasource = none
// @timeout = -1
function exec() {
//Create the report
var report = Banana.Report.newReport('Report title');
//Convert the value
var convertedAmount1 = Banana.Converter.toLocaleNumberFormat("1200.65");
var convertedAmount2 = Banana.Converter.toLocaleNumberFormat("0");
var convertedAmount3 = Banana.Converter.toLocaleNumberFormat(1234.56);
var convertedAmount4 = Banana.Converter.toLocaleNumberFormat(1);
//Add the converted amount to the report's paragraph
report.addParagraph(convertedAmount1);
report.addParagraph(convertedAmount2);
report.addParagraph(convertedAmount3);
report.addParagraph(convertedAmount4);
//Print the report
var stylesheet = Banana.Report.newStyleSheet();
Banana.Report.preview(report, stylesheet);
}
Format dates
// Banana Accounting Extension Javascript
// @api = 1.0
// @id = ch.banana.uni.app.tutorialformatdates
// @description = Tutorial: Format dates
// @task = app.command
// @doctype = nodocument
// @publisher = Banana.ch SA
// @pubdate = 2019-01-25
// @inputdatasource = none
// @timeout = -1
function exec() {
//Create the report
var report = Banana.Report.newReport('Report title');
//Convert the value: parameter is a string
var date1 = Banana.Converter.toLocaleDateFormat('2015-12-31');
//Convert the value: parameter is a date object
var d = new Date();
var date2 = Banana.Converter.toLocaleDateFormat(d);
//Add the converted amount to the report's paragraph
report.addParagraph(date1);
report.addParagraph(date2);
//Print the report
var stylesheet = Banana.Report.newStyleSheet();
Banana.Report.preview(report, stylesheet);
}
Format transactions journal data
// Banana Accounting Extension Javascript
// @api = 1.0
// @id = ch.banana.uni.app.tutorialformattransactionjournaldata
// @description = Tutorial: Format transactions journal data
// @task = app.command
// @doctype = nodocument
// @publisher = Banana.ch SA
// @pubdate = 2019-01-25
// @inputdatasource = none
// @timeout = -1
function exec() {
//Create the report
var report = Banana.Report.newReport('Report title');
//Create the table that will be printed on the report
var table = report.addTable("myTable");
//Add column titles to the table report
var tableHeader = table.getHeader();
tableRow = tableHeader.addRow();
tableRow.addCell('Data', 'boldStyle');
tableRow.addCell('Account', 'boldStyle');
tableRow.addCell('Description', 'boldStyle');
tableRow.addCell('Amount', 'boldStyle');
//Create a table with all transactions
var journal = Banana.document.journal(Banana.document.ORIGINTYPE_CURRENT, Banana.document.ACCOUNTTYPE_NORMAL);
//Read some values of the journal table
for (var i = 0; i < journal.rowCount; i++) {
var tRow = journal.row(i);
//Add the values taken from the rows to the respective cells of the table
//For the dates and the amounts we apply the format functions
tableRow = table.addRow();
tableRow.addCell(Banana.Converter.toLocaleDateFormat(tRow.value('JDate')));
tableRow.addCell(tRow.value('JAccount'));
tableRow.addCell(tRow.value('JAccountDescription'));
tableRow.addCell(Banana.Converter.toLocaleNumberFormat(tRow.value('JAmount')), 'alignRight');
}
//Create the styleSheet
var stylesheet = Banana.Report.newStyleSheet();
//Add borders to the table
var style = stylesheet.addStyle("table");
stylesheet.addStyle("table.myTable td", "border: thin solid black");
//Add the right alignment for the amount
style = stylesheet.addStyle(".alignRight");
style.setAttribute("text-align", "right");
//Add the bold style for the header
style = stylesheet.addStyle(".boldStyle");
style.setAttribute("font-weight", "bold");
//Print the report
Banana.Report.preview(report, stylesheet);
}
Numbers operations with SDecimal() functions
Basic mathematical operations (sum, subtract, multiply, divide)
// Banana Accounting Extension Javascript
// @api = 1.0
// @id = ch.banana.uni.app.tutorialbasicmathematicaloperations
// @description = Tutorial: Basic mathematical operations (sum, subtract, multiply, divide)
// @task = app.command
// @doctype = nodocument
// @publisher = Banana.ch SA
// @pubdate = 2019-01-25
// @inputdatasource = none
// @timeout = -1
function exec() {
//Create the report
var report = Banana.Report.newReport('Report title');
//Do some mathematical operations and add the results to the report
//Sum
var sum = Banana.SDecimal.add('6.50', '3.50'); // return '10.00'
report.addParagraph(sum);
//Subtract
var sub = Banana.SDecimal.subtract('10', '3'); // return '7'
report.addParagraph(sub);
//Multiply
var mul = Banana.SDecimal.multiply('6', '3'); // return '18'
report.addParagraph(mul);
//Divide
var div = Banana.SDecimal.divide('6', '3'); // return '2'
report.addParagraph(div);
//Print the report
var stylesheet = Banana.Report.newStyleSheet();
Banana.Report.preview(report, stylesheet);
}
abs function
// Banana Accounting Extension Javascript
// @api = 1.0
// @id = ch.banana.uni.app.tutorialabsfunction
// @description = Tutorial: abs function
// @task = app.command
// @doctype = nodocument
// @publisher = Banana.ch SA
// @pubdate = 2019-01-25
// @inputdatasource = none
// @timeout = -1
function exec() {
//Create the report
var report = Banana.Report.newReport('Report title');
//Return the value without the sign
var absValue = Banana.SDecimal.abs('-10');
//Add a paragraph to the report
report.addParagraph(absValue);
//Print the report
var stylesheet = Banana.Report.newStyleSheet();
Banana.Report.preview(report, stylesheet);
}
Compare two values
// Banana Accounting Extension Javascript
// @api = 1.0
// @id = ch.banana.uni.app.tutorialcomparevalues
// @description = Tutorial: Compare two values
// @task = app.command
// @doctype = nodocument
// @publisher = Banana.ch SA
// @pubdate = 2019-01-25
// @inputdatasource = none
// @timeout = -1
function exec() {
//Create the report
var report = Banana.Report.newReport('Report title');
// Compare the values:
// return 1 if value1 > value2
// return 0 if value1 = value2
// return -1 if value1 < value2
var compareValue = Banana.SDecimal.compare('5', '2');
//Add a paragraph to the report
report.addParagraph(compareValue);
//Print the report
var stylesheet = Banana.Report.newStyleSheet();
Banana.Report.preview(report, stylesheet);
}
Invert sign of a value
// Banana Accounting Extension Javascript
// @api = 1.0
// @id = ch.banana.uni.app.tutorialinvertsign
// @description = Tutorial: Invert value sign
// @task = app.command
// @doctype = nodocument
// @publisher = Banana.ch SA
// @pubdate = 2019-01-25
// @inputdatasource = none
// @timeout = -1
function exec() {
//Create the report
var report = Banana.Report.newReport('Report title');
//Invert the sign:
//if positive return a negative value
//if negative return a positive value
var invertValue = Banana.SDecimal.invert('4');
//Add a paragraph to the report
report.addParagraph(invertValue);
//Print the report
var stylesheet = Banana.Report.newStyleSheet();
Banana.Report.preview(report, stylesheet);
}
Check the sign of a value
// Banana Accounting Extension Javascript
// @api = 1.0
// @id = ch.banana.uni.app.tutorialcheckvaluesign
// @description = Tutorial: Check value sign
// @task = app.command
// @doctype = nodocument
// @publisher = Banana.ch SA
// @pubdate = 2019-01-25
// @inputdatasource = none
// @timeout = -1
function exec() {
//Create the report
var report = Banana.Report.newReport('Report title');
//Check the sign of the value:
//return 1 if value > 0
//return 0 if value = 0
//return -1 if value <0
var signValue = Banana.SDecimal.sign('-6');
//Add a paragraph to the report
report.addParagraph(signValue);
//Print the report
var stylesheet = Banana.Report.newStyleSheet();
Banana.Report.preview(report, stylesheet);
}
Number of decimals and rounding properties
// Banana Accounting Extension Javascript
// @api = 1.0
// @id = ch.banana.uni.app.tutorialdecimalsrounding
// @description = Tutorial: Number of decimals and rounding properties
// @task = app.command
// @doctype = nodocument
// @publisher = Banana.ch SA
// @pubdate = 2019-01-25
// @inputdatasource = none
// @timeout = -1
function exec() {
//Create the report
var report = Banana.Report.newReport('Report title');
//Divide without properties
var result1 = Banana.SDecimal.divide('10', '3.25'); //return '3.3333333333333333333333333'
report.addParagraph(result1);
//Divide with number of decimals property
var result2 = Banana.SDecimal.divide('10', '3.25', {
'decimals': 4
});
report.addParagraph(result2);
//Divide with number of decimals and rounding properties
var result3 = Banana.SDecimal.divide('10', '3.25', {
'decimals': 2,
'mode': Banana.SDecimal.HALF_UP
});
report.addParagraph(result3);
//Print the report
var stylesheet = Banana.Report.newStyleSheet();
Banana.Report.preview(report, stylesheet);
}
User interface functions
Dialog information
// Banana Accounting Extension Javascript
// @api = 1.0
// @id = ch.banana.uni.app.tutorialinformationdialog
// @description = Tutorial: Information dialog
// @task = app.command
// @doctype = nodocument
// @publisher = Banana.ch SA
// @pubdate = 2019-01-25
// @inputdatasource = none
// @timeout = -1
function exec() {
//Open a dialog window with an information
Banana.Ui.showInformation('Title', 'This is the information message!');
}
Dialog question
// Banana Accounting Extension Javascript
// @api = 1.0
// @id = ch.banana.uni.app.tutorialquestiondialog
// @description = Tutorial: Question dialog
// @task = app.command
// @doctype = nodocument
// @publisher = Banana.ch SA
// @pubdate = 2019-01-25
// @inputdatasource = none
// @timeout = -1
function exec() {
//Create a report
var report = Banana.Report.newReport("Report title");
//Open a dialog window with a question
var question = Banana.Ui.showQuestion('Question title', 'Print the report?');
//If 'true' do something...
if (question) {
//...for example add some text to the paragraph
report.addParagraph('The answer was YES!');
//...then print the report
var stylesheet = Banana.Report.newStyleSheet();
Banana.Report.preview(report, stylesheet);
}
}
Dialog show text
// Banana Accounting Extension Javascript
// @api = 1.0
// @id = ch.banana.uni.app.tutorialshowtextdialog
// @description = Tutorial: Show text dialog
// @task = app.command
// @doctype = nodocument
// @publisher = Banana.ch SA
// @pubdate = 2019-01-25
// @inputdatasource = none
// @timeout = -1
function exec() {
//Open a dialog window showing the text.
//In this case we want to show the table Accounts as html file
Banana.Ui.showText(Banana.document.table('Accounts').toHtml(['Account', 'Group', 'Description', 'Balance'], true));
}
Dialog input text
// Banana Accounting Extension Javascript
// @api = 1.0
// @id = ch.banana.uni.app.tutorialinputtextdialog
// @description = Tutorial: Input text dialog
// @task = app.command
// @doctype = nodocument
// @publisher = Banana.ch SA
// @pubdate = 2019-01-25
// @inputdatasource = none
// @timeout = -1
function exec() {
//Create a report
var report = Banana.Report.newReport("Report title");
//Open a dialog window asking the user to insert some text
//The text inserted is saved into a variable
var textInsertedByUser = Banana.Ui.getText('This is a dialog window', 'Insert some text', '');
//Add to the paragraph the text inserted by the user
report.addParagraph(textInsertedByUser);
//Print the report
var stylesheet = Banana.Report.newStyleSheet();
Banana.Report.preview(report, stylesheet);
}
Dialog item selection
// Banana Accounting Extension Javascript
// @api = 1.0
// @id = ch.banana.uni.app.tutorialitemselectiondialog
// @description = Tutorial: Item selection dialog
// @task = app.command
// @doctype = nodocument
// @publisher = Banana.ch SA
// @pubdate = 2019-01-25
// @inputdatasource = none
// @timeout = -1
function exec() {
//Create the report
var report = Banana.Report.newReport('Report title');
//Open a dialog window asking to select an item from the list
//The selected item is then saved into a variable
var itemSelected = Banana.Ui.getItem('Input', 'Choose a value', ['Item ONE', 'Item TWO', 'Item THREE', 'Item FOUR', 'Item FIVE'], 2, false);
//Add the selected item to the paragraph
report.addParagraph(itemSelected);
//Print the report
var stylesheet = Banana.Report.newStyleSheet();
Banana.Report.preview(report, stylesheet);
}
Dialog period selection
// Banana Accounting Extension Javascript
// @api = 1.0
// @id = ch.banana.uni.app.tutorialperiodselectiondialog
// @description = Tutorial: Period selection dialog
// @task = app.command
// @doctype = nodocument
// @publisher = Banana.ch SA
// @pubdate = 2019-01-25
// @inputdatasource = none
// @timeout = -1
function exec() {
//Create a report
var report = Banana.Report.newReport("Report title");
//Open a dialog windows to choose a period
var date = Banana.Ui.getPeriod('Period selection', '2015-01-01', '2015-12-31');
//Add the date information to the report
report.addParagraph(date.startDate);
report.addParagraph(date.endDate);
report.addParagraph(date.hasSelection);
//Print the report
var stylesheet = Banana.Report.newStyleSheet();
Banana.Report.preview(report, stylesheet);
}
Dialog multiple items selection
// Banana Accounting Extension Javascript
// @api = 1.0
// @id = ch.banana.uni.app.tutorialmultipleitemsselectiondialog
// @description = Tutorial: Multiple items selection dialog
// @task = app.command
// @doctype = nodocument
// @publisher = Banana.ch SA
// @pubdate = 2019-01-25
// @inputdatasource = none
// @timeout = -1
function exec() {
//Create the report
var report = Banana.Report.newReport('Report title');
//Open a dialog window asking to select an item from the list
//The selected item is then saved into a variable
var itemsSelected = Banana.Ui.getItems(
'Input',
'Choose one or more values',
['Item ONE', 'Item TWO', 'Item THREE', 'Item FOUR', 'Item FIVE'],
['Item ONE', 'Item THREE']
);
if (!itemsSelected) {
// User pressed cancel
return;
}
//Add the selected item to the paragraph
report.addParagraph("Selected items:");
if (itemsSelected.length > 0) {
for (var i = 0; i < itemsSelected.length; ++i) {
report.addParagraph("- " + itemsSelected[i]);
}
} else {
report.addParagraph("No item selected");
}
//Print the report
var stylesheet = Banana.Report.newStyleSheet();
Banana.Report.preview(report, stylesheet);
}
Message functions
Show messages
// Banana Accounting Extension Javascript
// @api = 1.0
// @id = ch.banana.uni.app.tutorialshowmessages
// @description = Tutorial: Show messages
// @task = app.command
// @doctype = nodocument
// @publisher = Banana.ch SA
// @pubdate = 2019-01-25
// @inputdatasource = none
// @timeout = -1
function exec() {
Banana.document.clearMessages();
//Step 1 - table access
var transactionTable = Banana.document.table('Transactions');
//Step 2 - loop on each row of the table
for (var i = 0; i < transactionTable.rowCount; i++) {
var tRow = transactionTable.row(i);
//Check the length of the description
if (tRow.value('Description').length > 20 && tRow.value('Description').length < 30) {
Banana.document.addMessage("Warning: row " + tRow.rowNr + ", description's length is " + tRow.value('Description').length + "!");
} else if (tRow.value('Description').length >= 30) {
Banana.document.addMessage("Error: row " + tRow.rowNr + ", description's length is " + tRow.value('Description').length + "!");
}
}
}
Show messages linked to table Transaction
// Banana Accounting Extension Javascript
// @api = 1.0
// @id = ch.banana.uni.app.tutorialshowmessageslinkedtotable
// @description = Tutorial: Show messages linked to table Transactions
// @task = app.command
// @doctype = nodocument
// @publisher = Banana.ch SA
// @pubdate = 2019-01-25
// @inputdatasource = none
// @timeout = -1
function exec() {
Banana.document.clearMessages();
//Step 1 - table access
var transactionTable = Banana.document.table('Transactions');
//Step 2 - loop on each row of the table
for (var i = 0; i < transactionTable.rowCount; i++) {
var tRow = transactionTable.row(i);
//Check the length of the description
if (tRow.value('Description').length > 20 && tRow.value('Description').length < 30) {
tRow.addMessage("Warning: description's length is " + tRow.value('Description').length + "!");
} else if (tRow.value('Description').length >= 30) {
tRow.addMessage("Error: description's length is " + tRow.value('Description').length + "!");
}
}
}
Clear all messages
// Banana Accounting Extension Javascript
// @api = 1.0
// @id = ch.banana.uni.app.tutorialclearmessages
// @description = Tutorial: Clear all messages
// @task = app.command
// @doctype = nodocument
// @publisher = Banana.ch SA
// @pubdate = 2019-01-25
// @inputdatasource = none
// @timeout = -1
function exec() {
Banana.document.clearMessages();
}
Save settings
Save settings
// Banana Accounting Extension Javascript
// @api = 1.0
// @id = ch.banana.uni.app.tutorialsavesettings
// @description = Tutorial: Save settings
// @task = app.command
// @doctype = nodocument
// @publisher = Banana.ch SA
// @pubdate = 2019-01-25
// @inputdatasource = none
// @timeout = -1
function exec() {
//Create the report
var report = Banana.Report.newReport('Report title');
//Readscript settings
var readText = Banana.document.scriptReadSettings();
//If there is a saved setting we can use it
if (readText) {
//Use the JSON.parse() to convert a JSON text into a JavaScript object
var object = JSON.parse(readText);
//Add a paragraph with the saved and parsed text
report.addParagraph('Previously saved value: ' + object);
//Print the report
var stylesheet = Banana.Report.newStyleSheet();
Banana.Report.preview(report, stylesheet);
}
// If it doesn't exists a saved setting yet (which it happens the very first time the script is executed),
// it is necessary to create and save it
//For example using an dialog window to insert some text
var text = Banana.Ui.getText('Save settings example', 'Insert some text', '');
//Convert a JavaScript value into a JSON string using the JSON.stringify() function
var textToSave = JSON.stringify(text);
//Save script settings
var savedText = Banana.document.scriptSaveSettings(textToSave);
}
Retrieving informations from "File and account properties..."
Retrieve basic accounting informations
// Banana Accounting Extension Javascript
// @api = 1.0
// @id = ch.banana.uni.app.tutorialretrievebasicaccountinginformation
// @description = Tutorial: Retrieve basic accounting information
// @task = app.command
// @doctype = nodocument
// @publisher = Banana.ch SA
// @pubdate = 2019-01-25
// @inputdatasource = none
// @timeout = -1
function exec() {
//Create report
var report = Banana.Report.newReport('Report title');
//Get some value of the accounting file
var fileName = Banana.document.info("Base", "FileName");
var decimalsAmounts = Banana.document.info("Base", "DecimalsAmounts");
var headerLeft = Banana.document.info("Base", "HeaderLeft");
var headerRight = Banana.document.info("Base", "HeaderRight");
var basicCurrency = Banana.document.info("AccountingDataBase", "BasicCurrency");
//For openingDate and closureDate
var startDate = Banana.document.info('AccountingDataBase', 'OpeningDate');
var endDate = Banana.document.info('AccountingDataBase', 'ClosureDate');
//For file accounting type
var fileType = Banana.document.info("Base", "FileType");
var fileGroup = Banana.document.info("Base", "FileTypeGroup");
var fileNumber = Banana.document.info("Base", "FileTypeNumber");
//Add the informations to the report
report.addParagraph(fileName);
report.addParagraph(decimalsAmounts);
report.addParagraph(headerLeft);
report.addParagraph(headerRight);
report.addParagraph(basicCurrency);
report.addParagraph(startDate);
report.addParagraph(endDate);
report.addParagraph(fileType);
report.addParagraph(fileGroup);
report.addParagraph(fileNumber);
//Print the report
var stylesheet = Banana.Report.newStyleSheet();
Banana.Report.preview(report, stylesheet);
}
Retrieve address informations
// Banana Accounting Extension Javascript
// @api = 1.0
// @id = ch.banana.uni.app.tutorialretrieveaddressinformation
// @description = Tutorial: Retrieve address information
// @task = app.command
// @doctype = nodocument
// @publisher = Banana.ch SA
// @pubdate = 2019-01-25
// @inputdatasource = none
// @timeout = -1
function exec() {
//Create report
var report = Banana.Report.newReport('Report title');
//Save informations
var company = Banana.document.info('AccountingDataBase', 'Company');
var courtesy = Banana.document.info('AccountingDataBase', 'Courtesy');
var name = Banana.document.info('AccountingDataBase', 'Name');
var familyName = Banana.document.info('AccountingDataBase', 'FamilyName');
var address1 = Banana.document.info('AccountingDataBase', 'Address1');
var address2 = Banana.document.info('AccountingDataBase', 'Address2');
var zip = Banana.document.info('AccountingDataBase', 'Zip');
var city = Banana.document.info('AccountingDataBase', 'City');
var state = Banana.document.info('AccountingDataBase', 'State');
var country = Banana.document.info('AccountingDataBase', 'Country');
var web = Banana.document.info('AccountingDataBase', 'Web');
var email = Banana.document.info('AccountingDataBase', 'Email');
var phone = Banana.document.info('AccountingDataBase', 'Phone');
var mobile = Banana.document.info('AccountingDataBase', 'Mobile');
var fax = Banana.document.info('AccountingDataBase', 'Fax');
var fiscalNumber = Banana.document.info('AccountingDataBase', 'FiscalNumber');
var vatNumber = Banana.document.info('AccountingDataBase', 'VatNumber');
//Add the informations to the report
report.addParagraph(company);
report.addParagraph(courtesy);
report.addParagraph(name);
report.addParagraph(familyName);
report.addParagraph(address1);
report.addParagraph(address2);
report.addParagraph(zip);
report.addParagraph(city);
report.addParagraph(state);
report.addParagraph(country);
report.addParagraph(web);
report.addParagraph(email);
report.addParagraph(phone);
report.addParagraph(mobile);
report.addParagraph(fax);
report.addParagraph(fiscalNumber);
report.addParagraph(vatNumber);
//Print the report
var stylesheet = Banana.Report.newStyleSheet();
Banana.Report.preview(report, stylesheet);
}
Retrieving data from Banana tables
Retrieve rows table values using findRowByValue() function
// Banana Accounting Extension Javascript
// @api = 1.0
// @id = ch.banana.uni.app.tutorialretrieverowstablevaluesusingfindrowbyvalue
// @description = Tutorial: Retrieve rows table values using findRowByValue() function
// @task = app.command
// @doctype = nodocument
// @publisher = Banana.ch SA
// @pubdate = 2019-01-25
// @inputdatasource = none
// @timeout = -1
function exec() {
//Create report
var report = Banana.Report.newReport("Report title");
//Save the row extracted from the table
var rowToExtract = Banana.document.table('Accounts').findRowByValue('Account', '1000');
//Add the Account, Description and Balance informations to the report
report.addParagraph(rowToExtract.value('Account'));
report.addParagraph(rowToExtract.value('Description'));
report.addParagraph(rowToExtract.value('Balance'));
//Print the report
var stylesheet = Banana.Report.newStyleSheet();
Banana.Report.preview(report, stylesheet);
}
Retrieve specific rows table values
// Banana Accounting Extension Javascript
// @api = 1.0
// @id = ch.banana.uni.app.tutorialretrievespecificrowstablevalues
// @description = Tutorial: Retrieve specific rows table values
// @task = app.command
// @doctype = nodocument
// @publisher = Banana.ch SA
// @pubdate = 2019-01-25
// @inputdatasource = none
// @timeout = -1
function exec() {
//Create report
var report = Banana.Report.newReport("Report title");
// Step 1 - table access: specify the name of the table ("Accounts", "Transactions", "VatCodes", ...)
var accountsTable = Banana.document.table("Accounts");
//Step 2 - row selection: it is important to note that the rows of the Banana table start counting from 0,
//so keep in mind to specify one number less than the desired one
//1st row = 0
//2nd row = 1
//3rd row = 2
//4th row = 3
//...
var row3 = accountsTable.row(2); // We want the third row
// Step 3 - select all the desired columns
var account = row3.value("Account");
var description = row3.value("Description");
var balance = row3.value("Balance");
//Add the informations to the report
report.addParagraph(account);
report.addParagraph(description);
report.addParagraph(balance);
//Print the report
var stylesheet = Banana.Report.newStyleSheet();
Banana.Report.preview(report, stylesheet);
}
Retrieve rows table values
// Banana Accounting Extension Javascript
// @api = 1.0
// @id = ch.banana.uni.app.tutorialretrieverowstablevalues
// @description = Tutorial: Retrieve rows table values
// @task = app.command
// @doctype = nodocument
// @publisher = Banana.ch SA
// @pubdate = 2019-01-25
// @inputdatasource = none
// @timeout = -1
function exec() {
//Create a report
var report = Banana.Report.newReport('Report title');
//Step 1 - table access
var accountsTable = Banana.document.table('Accounts');
//Step 2 - loop on each row of the table, instead of specifying a single row
for (var rowNumber = 0; rowNumber < accountsTable.rowCount; rowNumber++) {
var tRow = accountsTable.row(rowNumber);
//Step 3 - select the desired columns
var account = tRow.value('Account');
var description = tRow.value('Description');
var balance = tRow.value('Balance');
//Add the informations to the report
report.addParagraph(account + ', ' + description + ', ' + balance);
}
//Print the report
var stylesheet = Banana.Report.newStyleSheet();
Banana.Report.preview(report, stylesheet);
}
Retrieve rows table with account number
// Banana Accounting Extension Javascript
// @api = 1.0
// @id = ch.banana.uni.app.tutorialretretrieverowstablewithaccountnumber
// @description = Tutorial: Retrieve rows table with account number
// @task = app.command
// @doctype = nodocument
// @publisher = Banana.ch SA
// @pubdate = 2019-01-25
// @inputdatasource = none
// @timeout = -1
function exec() {
//Create a report
var report = Banana.Report.newReport('Report title');
//Step 1 - table access
var accountsTable = Banana.document.table('Accounts');
//Step 2 - loop on each row of the table, instead of specifying a single row
for (var rowNumber = 0; rowNumber < accountsTable.rowCount; rowNumber++) {
var tRow = accountsTable.row(rowNumber);
//If the row has an account number we save the values and print them
if (tRow.value('Account')) {
//Step 3 - select the desired columns
var account = tRow.value('Account');
var description = tRow.value('Description');
var balance = tRow.value('Balance');
//Add the informations to the report
report.addParagraph(account + ', ' + description + ', ' + balance);
}
}
//Print the report
var stylesheet = Banana.Report.newStyleSheet();
Banana.Report.preview(report, stylesheet);
}
Print all table rows in a table format
// Banana Accounting Extension Javascript
// @api = 1.0
// @id = ch.banana.uni.app.tutorialretprintrowstablewithaccountnumberintableformat
// @description = Tutorial: Print rows table with account number in table format
// @task = app.command
// @doctype = nodocument
// @publisher = Banana.ch SA
// @pubdate = 2019-01-25
// @inputdatasource = none
// @timeout = -1
function exec() {
//Create a report
var report = Banana.Report.newReport('Report title');
//Create the table that will be printed on the report
var table = report.addTable("myTable");
//Add column titles to the table report
var tableHeader = table.getHeader();
tableRow = tableHeader.addRow();
tableRow.addCell("Account");
tableRow.addCell("Description");
tableRow.addCell("Balance");
//Step 1 - table access
var accountsTable = Banana.document.table('Accounts');
//Step 2 - loop on each row of the table, instead of specifying a single row
for (var rowNumber = 0; rowNumber < accountsTable.rowCount; rowNumber++) {
var tRow = accountsTable.row(rowNumber);
//If the row has an account number we save the values and print them
if (tRow.value('Account')) {
//Step 3 - select the desired columns
var account = tRow.value('Account');
var description = tRow.value('Description');
var balance = tRow.value('Balance');
//Add the values taken from the rows to the respective cells of the table
tableRow = table.addRow();
tableRow.addCell(account);
tableRow.addCell(description);
tableRow.addCell(balance);
}
}
//Create the styleSheet to
var stylesheet = Banana.Report.newStyleSheet();
//Create a table style adding the border
var style = stylesheet.addStyle("table");
stylesheet.addStyle("table.myTable td", "border: thin solid black");
//Print the report
Banana.Report.preview(report, stylesheet);
}
Find all rows that match a condition using findRows
// Banana Accounting Extension Javascript
// @api = 1.0
// @id = ch.banana.uni.app.tutorialfindrows
// @description = Tutorial: Retrieve all rows table that match a condition using findRows
// @task = app.command
// @doctype = nodocument
// @publisher = Banana.ch SA
// @pubdate = 2019-01-25
// @inputdatasource = none
// @timeout = -1
function exec() {
var tableAccounts = Banana.document.table('Accounts');
var rows = tableAccounts.findRows(accountStartsWith25XX);
var accounts = [];
for(var i = 0; i < rows.length; i++) {
accounts.push(rows[i].value('Account'));
}
Banana.Ui.showInformation('Info', 'Accounts that start with 25XX: ' + accounts.join(';'));
}
function accountStartsWith25XX(rowObj,rowNr,table) {
// Return true if account start with '25XX'
return rowObj.value('Account').startsWith('25');
}
Retrieve all rows that match a condition using extractRows
// Banana Accounting Extension Javascript
// @api = 1.0
// @id = ch.banana.uni.app.tutorialextractrows
// @description = Tutorial: Retrieve all rows table that match a condition using extractRows
// @task = app.command
// @doctype = nodocument
// @publisher = Banana.ch SA
// @pubdate = 2019-01-25
// @inputdatasource = none
// @timeout = -1
function exec() {
var tableAccounts = Banana.document.table('Accounts');
tableAccounts.extractRows(accountStartsWith25XX, 'Accounts that start with 25XX');
}
function accountStartsWith25XX(rowObj,rowNr,table) {
// Return true if account start with '25XX'
return rowObj.value('Account').startsWith('25');
}
Retriveing data with currentBalance() function
Amount of opening for all transactions for an account
// Banana Accounting Extension Javascript
// @api = 1.0
// @id = ch.banana.uni.app.tutorialcurrentbalancesingleaccount
// @description = Tutorial: Retrieve amount of an account using currentBalance() function
// @task = app.command
// @doctype = nodocument
// @publisher = Banana.ch SA
// @pubdate = 2019-01-25
// @inputdatasource = none
// @timeout = -1
function exec() {
//Create the report
var report = Banana.Report.newReport('Report title');
//Take opening sum for a non-specific period: period taken from Banana
var amount1 = Banana.document.currentBalance('1000', '', '').opening;
//Take opening sum for a specific period
var amount2 = Banana.document.currentBalance('1000', '2015-01-05', '2015-02-07').opening;
//Add a paragraph with the amounts just calculated
report.addParagraph(Banana.document.accountDescription('1000'));
report.addParagraph(amount1);
report.addParagraph(amount2);
//Print the report
var stylesheet = Banana.Report.newStyleSheet();
Banana.Report.preview(report, stylesheet);
}
Amount of opening for all transactions for multiple accounts
// Banana Accounting Extension Javascript
// @api = 1.0
// @id = ch.banana.uni.app.tutorialcurrentbalancemultipleaccounts
// @description = Tutorial: Retrieve amount of multiple accounts using currentBalance() function
// @task = app.command
// @doctype = nodocument
// @publisher = Banana.ch SA
// @pubdate = 2019-01-25
// @inputdatasource = none
// @timeout = -1
function exec() {
//Create the report
var report = Banana.Report.newReport('Report title');
//Take opening sum for a non-specific period: period taken from Banana
var amount1 = Banana.document.currentBalance('1000|1010|1011', '', '').opening;
//Take opening sum for a specific period
var amount2 = Banana.document.currentBalance('1000|1010|1011', '2015-01-05', '2015-02-07').opening;
//Add a paragraph with the amounts just calculated
report.addParagraph(amount1);
report.addParagraph(amount2);
//Print the report
var stylesheet = Banana.Report.newStyleSheet();
Banana.Report.preview(report, stylesheet);
}
Amount of opening for all transactions for a single group
// Banana Accounting Extension Javascript
// @api = 1.0
// @id = ch.banana.uni.app.tutorialcurrentbalancesinglegroup
// @description = Tutorial: Retrieve amount of single group using currentBalance() function
// @task = app.command
// @doctype = nodocument
// @publisher = Banana.ch SA
// @pubdate = 2019-01-25
// @inputdatasource = none
// @timeout = -1
function exec() {
//Create the report
var report = Banana.Report.newReport('Report title');
//Take opening sum for a non-specific period: period taken from Banana
var amount1 = Banana.document.currentBalance('Gr=100', '', '').opening;
//Take opening sum for a specific period
var amount2 = Banana.document.currentBalance('Gr=100', '2015-01-05', '2015-02-07').opening;
//Add a paragraph with the amounts just calculated
report.addParagraph(Banana.document.accountDescription('Gr=100'));
report.addParagraph(amount1);
report.addParagraph(amount2);
//Print the report
var stylesheet = Banana.Report.newStyleSheet();
Banana.Report.preview(report, stylesheet);
}
Amount of opening for all transactions for multiple groups
// Banana Accounting Extension Javascript
// @api = 1.0
// @id = ch.banana.uni.app.tutorialcurrentbalancemultiplegroups
// @description = Tutorial: Retrieve amount of multiple groups using currentBalance() function
// @task = app.command
// @doctype = nodocument
// @publisher = Banana.ch SA
// @pubdate = 2019-01-25
// @inputdatasource = none
// @timeout = -1
function exec() {
//Create the report
var report = Banana.Report.newReport('Report title');
//Take opening sum for a non-specific period: period taken from Banana
var amount1 = Banana.document.currentBalance('Gr=100|110|120', '', '').opening;
//Take opening sum for a specific period
var amount2 = Banana.document.currentBalance('Gr=100|110|120', '2015-01-05', '2015-02-07').opening;
//Add a paragraph with the amounts just calculated
report.addParagraph(amount1);
report.addParagraph(amount2);
//Print the report
var stylesheet = Banana.Report.newStyleSheet();
Banana.Report.preview(report, stylesheet);
}
Amount of opening for all transactions for a BClass
// Banana Accounting Extension Javascript
// @api = 1.0
// @id = ch.banana.uni.app.tutorialcurrentbalancesinglebclass
// @description = Tutorial: Retrieve amount of a single BClass using currentBalance() function
// @task = app.command
// @doctype = nodocument
// @publisher = Banana.ch SA
// @pubdate = 2019-01-25
// @inputdatasource = none
// @timeout = -1
function exec() {
//Create the report
var report = Banana.Report.newReport('Report title');
//Take opening sum for a non-specific period: period taken from Banana
var amount1 = Banana.document.currentBalance('BClass=1', '', '').opening;
//Take opening sum for a specific period
var amount2 = Banana.document.currentBalance('BClass=1', '2015-01-05', '2015-02-07').opening;
//Add a paragraph with the amounts just calculated
report.addParagraph(amount1);
report.addParagraph(amount2);
//Print the report
var stylesheet = Banana.Report.newStyleSheet();
Banana.Report.preview(report, stylesheet);
}
Amount of opening for all transactions for multiple BClass values
// Banana Accounting Extension Javascript
// @api = 1.0
// @id = ch.banana.uni.app.tutorialcurrentbalancemultiplebclass
// @description = Tutorial: Retrieve amount of multiple BClass using currentBalance() function
// @task = app.command
// @doctype = nodocument
// @publisher = Banana.ch SA
// @pubdate = 2019-01-25
// @inputdatasource = none
// @timeout = -1
function exec() {
//Create the report
var report = Banana.Report.newReport('Report title');
//Take opening sum for a non-specific period: period taken from Banana
var amount1 = Banana.document.currentBalance('BClass=1|2', '', '').opening;
//Take opening sum for a specific period
var amount2 = Banana.document.currentBalance('BClass=1|2', '2015-01-05', '2015-02-07').opening;
//Add a paragraph with the amounts just calculated
report.addParagraph(amount1);
report.addParagraph(amount2);
//Print the report
var stylesheet = Banana.Report.newStyleSheet();
Banana.Report.preview(report, stylesheet);
}
Retriveing data with vatCurrentBalance() function
Sum the Vat amounts for the specified vat code
// Banana Accounting Extension Javascript
// @api = 1.0
// @id = ch.banana.uni.app.tutorialvatcurrentbalancesinglevatcode
// @description = Tutorial: Sum the VAT amounts for single VAT code using vatCurrentBalance() function
// @task = app.command
// @doctype = nodocument
// @publisher = Banana.ch SA
// @pubdate = 2019-01-25
// @inputdatasource = none
// @timeout = -1
function exec() {
//Create the report
var report = Banana.Report.newReport('Report title');
//Take the vatAmount sum for a non-specific period: period taken from Banana
var amount1 = Banana.document.vatCurrentBalance('S10', '', '').vatAmount;
//Take the vatAmount sum for a specific period
var amount2 = Banana.document.vatCurrentBalance('S10', '2015-01-01', '2015-01-06').vatAmount;
//Add a paragraph with the amounts just calculated
report.addParagraph(amount1);
report.addParagraph(amount2);
//Print the report
var stylesheet = Banana.Report.newStyleSheet();
Banana.Report.preview(report, stylesheet);
}
Sum the Vat amounts for multiple vat codes
// Banana Accounting Extension Javascript
// @api = 1.0
// @id = ch.banana.uni.app.tutorialvatcurrentbalancemultiplevatcodes
// @description = Tutorial: Sum the VAT amounts for multiple VAT codes using vatCurrentBalance() function
// @task = app.command
// @doctype = nodocument
// @publisher = Banana.ch SA
// @pubdate = 2019-01-25
// @inputdatasource = none
// @timeout = -1
function exec() {
//Create the report
var report = Banana.Report.newReport('Report title');
//Take the vatAmount sum for a non-specific period: period taken from Banana
var amount1 = Banana.document.vatCurrentBalance('S10|P10', '', '').vatAmount;
//Take the vatAmount sum for a specific period
var amount2 = Banana.document.vatCurrentBalance('S10|P10', '2015-02-01', '2015-02-28').vatAmount;
//Add a paragraph with the amounts just calculated
report.addParagraph(amount1);
report.addParagraph(amount2);
//Print the report
var stylesheet = Banana.Report.newStyleSheet();
Banana.Report.preview(report, stylesheet);
}
Retriveing data with currentCard() function
For a given account without specifying the period
// Banana Accounting Extension Javascript
// @api = 1.0
// @id = ch.banana.uni.app.tutorialcurrentcardnoperiod
// @description = Tutorial: Use currentCard() function for a given account
// @task = app.command
// @doctype = nodocument
// @publisher = Banana.ch SA
// @pubdate = 2019-01-25
// @inputdatasource = none
// @timeout = -1
function exec() {
//Create the report
var report = Banana.Report.newReport('Report title');
//Create a table with all the transactions of the given account
var transTab = Banana.document.currentCard('1010', '', '');
//For each row of the table we save the values
for (var i = 0; i < transTab.rowCount; i++) {
var tRow = transTab.row(i);
var date = tRow.value('JDate');
var account = tRow.value('JAccount');
var description = tRow.value("JDescription");
var debit = tRow.value('JDebitAmount');
var credit = tRow.value('JCreditAmount');
var balance = tRow.value('JBalance');
//Add a paragraph with the values just calculated
report.addParagraph(date + ', ' + account + ', ' + description + ', ' + debit + ', ' + credit + ', ' + balance);
}
//Print the report
var stylesheet = Banana.Report.newStyleSheet();
Banana.Report.preview(report, stylesheet);
}
For a given account and period
// Banana Accounting Extension Javascript
// @api = 1.0
// @id = ch.banana.uni.app.tutorialcurrentcardwithperiod
// @description = Tutorial: Use currentCard() function for a given account and period
// @task = app.command
// @doctype = nodocument
// @publisher = Banana.ch SA
// @pubdate = 2019-01-25
// @inputdatasource = none
// @timeout = -1
function exec() {
//Create the report
var report = Banana.Report.newReport('Report title');
//Create a table with all transactions for the given account and period
var transTab = Banana.document.currentCard('1010', '2015-01-03', '2015-02-07');
//For each row of the table we save the values
for (var i = 0; i < transTab.rowCount; i++) {
var tRow = transTab.row(i);
var date = tRow.value('JDate');
var account = tRow.value('JAccount');
var description = tRow.value("JDescription");
var debit = tRow.value('JDebitAmount');
var credit = tRow.value('JCreditAmount');
var balance = tRow.value('JBalance');
//Add a paragraph with the values just calculated
report.addParagraph(date + ', ' + account + ', ' + description + ', ' + debit + ', ' + credit + ', ' + balance);
}
//Print the report
var stylesheet = Banana.Report.newStyleSheet();
Banana.Report.preview(report, stylesheet);
}
Retriveing data with journal() function
Get all transaction for normal accounts
// Banana Accounting Extension Javascript
// @api = 1.0
// @id = ch.banana.uni.app.tutorialjournal
// @description = Tutorial: Retrieve all transactions for normal accounts using the journal() function
// @task = app.command
// @doctype = nodocument
// @publisher = Banana.ch SA
// @pubdate = 2019-01-25
// @inputdatasource = none
// @timeout = -1
function exec() {
//Create the report
var report = Banana.Report.newReport('Report title');
//Create a table with all transactions
var journal = Banana.document.journal(Banana.document.ORIGINTYPE_CURRENT, Banana.document.ACCOUNTTYPE_NORMAL);
//Read the table and save some values
for (var i = 0; i < journal.rowCount; i++) {
var tRow = journal.row(i);
var date = tRow.value('JDate');
var account = tRow.value('JAccount');
var accDescription = tRow.value('JAccountDescription');
var description = tRow.value('JDescription');
var vatCode = tRow.value('JVatCodeWithoutSign');
var vatDescription = tRow.value('JVatCodeDescription');
var amount = tRow.value('JAmount');
//Add to the paragraph the values just saved
report.addParagraph(date + ', ' + account + ', ' + accDescription + ', ' + description + ', ' + vatCode + ', ' + vatDescription + ', ' + amount);
}
//Print the report
var stylesheet = Banana.Report.newStyleSheet();
Banana.Report.preview(report, stylesheet);
}
Reading and writing xml files
Reading an xml file
// Banana Accounting Extension Javascript
// @api = 1.0
// @id = ch.banana.uni.app.tutorialreadxmlfile
// @description = Tutorial: Read an XML file
// @task = app.command
// @doctype = nodocument
// @publisher = Banana.ch SA
// @pubdate = 2019-01-25
// @inputdatasource = none
// @timeout = -1
var xml = '<Library updated="2018-09-03">' + // To simplify,
'<Book>' + // the variable
'<Title>Paths of colours</Title>' + // xml contains
'<Author>Rosa Indaco</Author>' + // the xml string
'</Book>' +
'<Book>' +
'<Title>Accounting exercises</Title>' +
'<Author>Su Zhang</Author>' +
'</Book>' +
'</Library>';
var bookList = ""; // Create string for the output
var xmlFile = Banana.Xml.parse(xml); // Create XML Parse object
var xmlRoot = xmlFile.firstChildElement('Library'); // Find the first tag "Library" in the XML
var updateDate = xmlRoot.attribute('updated'); // Take attribute assigned to the tag
bookList += "Books in the library on " + updateDate + "\n\n"; // Append to the output string
var bookNode = xmlRoot.firstChildElement('Book'); // Take the first Book
while (bookNode) { // As long as there are books, repeat
var title = bookNode.firstChildElement('Title').text; // Find the first tag "Title" in the XML
var authorNode = bookNode.firstChildElement('Author'); // Find the first tag "Author" in the XML
var author = authorNode ? authorNode.text : 'unknow'; // Check whether there is a tag "Author"
bookList += title + " - " + author + "\n"; // Append to the output string
bookNode = bookNode.nextSiblingElement('Book'); // Go to the next book
}
Banana.Ui.showText("List of books present in the xml file", bookList); // Output the results
Writing an xml file
// Banana Accounting Extension Javascript
// @api = 1.0
// @id = ch.banana.uni.app.tutorialwritexmlfile
// @description = Tutorial: Write an XML file
// @task = app.command
// @doctype = nodocument
// @publisher = Banana.ch SA
// @pubdate = 2019-01-25
// @inputdatasource = none
// @timeout = -1
function exec() {
var xmlDocument = Banana.Xml.newDocument("Library"); // Create XML file
xmlDocument.addComment("This is the generated xml file"); // Add comment to the file
var rootNode = xmlDocument.addElement("Library"); // Set root tag "Library"
rootNode.setAttribute("updated", "2018-09-03"); // Set attribute to the tag "Library"
var bookNode = rootNode.addElement("Book"); // Create tag "Book" child of "Library"
bookNode.addElement("Title").addTextNode("Paths of colours"); // Create tag "Title" child of "Book"
bookNode.addElement("Author").addTextNode("Rosa Indaco"); // Create tag "Author" child of "Book"
var bookNode = rootNode.addElement("Book"); // Create tag "Book" child of "Library"
bookNode.addElement("Title").addTextNode("Accounting exercises"); // Create tag "Title" child of "Book"
bookNode.addElement("Author").addTextNode("Su Zhang"); // Create tag "Author" child of "Book"
var xmlString = Banana.Xml.save(xmlDocument); // Create output
// Show the xml file
Banana.Ui.showText("Xml file", xmlString); // Generate output
}
Validate an xml file via xsd
// Banana Accounting Extension Javascript
// @api = 1.0
// @id = ch.banana.uni.app.tutorialxmlvalidation
// @description = Tutorial: Validate an XML file via XSD
// @task = app.command
// @doctype = nodocument
// @publisher = Banana.ch SA
// @pubdate = 2019-01-25
// @inputdatasource = none
// @timeout = -1
function exec() {
// The xml file
var xml = '<Library updated="2018-09-03"> \
<Book> \
<Title>Paths of colours</Title> \
<Author>Rosa Indaco</Author> \
</Book> \
<Book> \
<Title>Accounting exercises</Title> \
<Author>Su Zhang</Author> \
</Book> \
</Library>';
// Parse the xml
var xmlFile = Banana.Xml.parse(xml);
// Validate the xml
var valid = Banana.Xml.validate(xmlFile, 'documents:xsd');
if (valid) {
Banana.Ui.showInformation('Validation result', 'The xml is valid');
} else {
Banana.Ui.showInformation('Validation result', 'The xml is not valid: ' + Banana.Xml.errorString);
}
}
Filter for xml file
// Banana Accounting Extension Javascript
// @api = 1.0
// @id = ch.banana.uni.app.tutorialgeneralxmlFile
// @description = Tutorial: General functions on XML files
// @task = app.command
// @doctype = nodocument
// @publisher = Banana.ch SA
// @pubdate = 2020-03-27
// @inputdatasource = none
// @timeout = -1
function exec(){
const xml = '<solarSystem updated="2020-03-27">' +
'<Planet>' +
'<name>Sun</name>' +
'<sizeOrder>1</sizeOrder>' +
'</Planet>' +
'<Planet>' +
'<name>Earth</name>' +
'<sizeOrder>6</sizeOrder>' +
'<satellite>Moon</satellite>' +
'</Planet>' +
'<Planet>' +
'<name>Jupiter</name>' +
'<sizeOrder>2</sizeOrder>' +
'<satellite>Callisto</satellite>' +
'</Planet>' +
'<Planet>' +
'<name>Saturn</name>' +
'<sizeOrder>3</sizeOrder>' +
'<satellite>Cronus</satellite>' +
'</Planet>' +
'<Planet>' +
'<name>Mars</name>' +
'<sizeOrder>8</sizeOrder>' +
'<satellite>Phobos</satellite>' +
'</Planet>' +
'<Planet>' +
'<name>Neptune</name>' +
'<sizeOrder>5</sizeOrder>' +
'<satellite>Triton</satellite>' +
'</Planet>' +
'<Planet>' +
'<name>Mercury</name>' +
'<sizeOrder>9</sizeOrder>' +
'</Planet>' +
'<Planet>' +
'<name>Venus</name>' +
'<sizeOrder>7</sizeOrder>' +
'</Planet>' +
'<Planet>' +
'<name>Uranus</name>' +
'<sizeOrder>4</sizeOrder>' +
'<satellite>Ariel</satellite>' +
'</Planet>' +
'</solarSystem>';
var outputString = "";
var xmlFile = Banana.Xml.parse(xml);
var xmlRoot = xmlFile.firstChildElement('solarSystem');
var updateDate = xmlRoot.attribute('updated');
outputString += "Planets in the solar System with satellites updated on " + updateDate + "\n\n";
var planet = xmlRoot.firstChildElement('Planet');
while (planet) {
if (planet.hasChildElements('satellite')) {
var planetName = planet.firstChildElement('name').text;
var planetSatellite = planet.firstChildElement('satellite').text;
outputString += "name: " + planetName + ", satellite: " + planetSatellite + "\n";
}
planet = planet.nextSiblingElement('Planet');
}
Banana.Ui.showText("Planets in the XML with satellites", outputString);
}
Export Transaction table to xml file
// Banana Accounting Extension Javascript
// @id = ch.banana.apps.export
// @api = 1.0
// @pubdate = 2016-04-08
// @doctype = *.*
// @description = Export into an xml file (.xml)
// @task = export.file
// @exportfiletype = xml
// @timeout = -1
function exec() {
var xmlDocument = Banana.Xml.newDocument("Transactions");
xmlDocument.addComment("This is the generated xml file");
var rootNode = xmlDocument.addElement("transactions");
var tableTransactions = Banana.document.table('Transactions');
if (!tableTransactions) {
return;
}
for (i=0;i<tableTransactions.rowCount;i++) {
if (tableTransactions.row(i).value('Amount')) {
var transactionNode = rootNode.addElement("transaction");
transactionNode.addElement("date").addTextNode(tableTransactions.row(i).value('Date'));
transactionNode.addElement("description").addTextNode(tableTransactions.row(i).value('Description'));
transactionNode.addElement("amount").addTextNode(tableTransactions.row(i).value('Amount'));
}
}
var xmlString = Banana.Xml.save(xmlDocument);
Banana.Ui.showText("Xml file", xmlString);
return xmlString;
}
Import Transactions from xml file
// Banana Accounting Extension Javascript
// @api = 1.0
// @pubdate = 2020-04-02
// @id = ch.banana.uni.app.tutorialretrieverowstablevalues
// @description = Import transactions
// @task = import.transactions
// @outputformat = transactions.simple
// @doctype = *
// @inputdatasource = openfiledialog
// @inputencoding = latin1
// @inputfilefilter = Text files (*.xml);;All files (*.*)
// @publisher = Banana.ch SA
// @timeout = -1
function exec(inputFile) {
var CSV_String = "Date" + '","' + "Description" + '","' + "Income" + '","' + "Expenses" + '\n';
var xmlFile = Banana.Xml.parse(inputFile);
var xmlRoot = xmlFile.firstChildElement('transactions');
var transactionNode = xmlRoot.firstChildElement('transaction');
while (transactionNode) {
var date = transactionNode.firstChildElement('date').text;
var description = transactionNode.firstChildElement('description').text;
var income = transactionNode.firstChildElement('income').text;
var expenses = transactionNode.firstChildElement('expenses').text;
CSV_String += ('"' + date + '","' + description + '","' + income + '","' + expenses + '"' + '\n');
transactionNode = transactionNode.nextSiblingElement('transaction');
}
Banana.console.debug(CSV_String);
var csvFile = Banana.Converter.csvToArray(CSV_String, ',', '"');
var tsvFile = Banana.Converter.arrayToTsv(csvFile);
return tsvFile;
}
Debugging
Ouput messages to the debug panel
// Banana Accounting Extension Javascript
// @api = 1.0
// @id = ch.banana.uni.app.tutorialdebugmessages
// @description = Tutorial: Output messages to the debug panel
// @task = app.command
// @doctype = nodocument
// @publisher = Banana.ch SA
// @pubdate = 2019-01-25
// @inputdatasource = none
// @timeout = -1
function exec() {
Banana.console.log("An info message");
Banana.console.debug("A debug message");
Banana.console.warn("A warning message"); // Since Banana 9.0.4 use Banana.console.warning
Banana.console.critical("A critical message");
}
Progress bar and timeout
Script timeout
// Banana Accounting Extension Javascript
// @api = 1.0
// @id = ch.banana.uni.app.tutorialscripttimeout
// @description = Tutorial: Progress bar
// @task = app.command
// @doctype = nodocument
// @publisher = Banana.ch SA
// @pubdate = 2019-12-06
// @inputdatasource = none
// @timeout = 2000
function exec() {
while(true) {
}
}
Progess bar
// Banana Accounting Extension Javascript
// @api = 1.0
// @id = ch.banana.uni.app.tutorialprogressbar
// @description = Tutorial: Progress bar
// @task = app.command
// @doctype = nodocument
// @publisher = Banana.ch SA
// @pubdate = 2019-12-06
// @inputdatasource = none
// @timeout = 20000
function exec() {
var nr = 100000000;
var progressBar = Banana.application.progressBar;
progressBar.start(nr);
for (var i = 0; i < nr; ++i) {
if (!progressBar.step(1)) {
break; // Operation canceled by the user
}
}
}
User interface
QTableWidget interaction
// Banana Accounting Extension Javascript
/**
* This example shows the use of a QTableWidget
* The user interface is defined in file "ch.banana.tutorial.tablewidget.ui"
* This example is also found in the tutorial file "embedded_javascript_tutorial1.ac2"
*/
// @id = ch.banana.exmaple.tablewidget
// @version = 1.0
// @date = 2019-12-06
// @publisher = Banana.ch SA
// @description = Tutorial QTableWidget
// @task = app.command
// @inputdatasource = none
// @timeout = -1
// @doctype = nodocument
var param = {};
/** Dialog's functions declaration */
var dialog = Banana.Ui.createUi("documents:740.ui");
var table = dialog.findChild("tableWidget");
var buttonBox = dialog.findChild("buttonBox");
var statusLabel = dialog.findChild("statusLabel");
/** Main function */
function exec(inData) {
//Check the version of Banana
var requiredVersion = "9.1.0.0";
if (!Banana.compareVersion || Banana.compareVersion(Banana.application.version, requiredVersion) < 0) {
Banana.Ui.showInformation("You need Banana 9.1.0.0 or newer to run this example");
return;
}
// Connect button box signals
buttonBox.accepted.connect(function() {dialog.close();});
buttonBox.rejected.connect(function() {dialog.close();});
// Set the table read
// table.setEditTriggers(0); // see flags QAbstractItemView::EditTriggers
// Set columns
table.setColumnCount(4);
table.setHorizontalHeaderLabels(["A", "B", "C", "D"])
table.setColumnWidth(1, 200);
// Set rows
table.setRowCount(5);
// Set cell text
table.item(1,0).text = "hello";
// Set cell colors
var item2 = table.item(1,1);
item2.text = "colors";
item2.background = "red";
item2.foreground = "white";
// Set cell checkable
var item3 = table.item(1,2);
item3.flags = 0x33; // See flags Qt::ItemFlags
item3.text = "check-it";
item3.checkState = 0; // See flags Qt::CheckState
// Set current cell
// table.setCurrentCell(1,0);
// Connect table's signals after the table is populated
table.cellClicked.connect(updateStatusBar);
table.cellChanged.connect(updateStatusBar);
// Show dialog
Banana.application.progressBar.pause();
dialog.exec();
Banana.application.progressBar.resume();
// Get table size
Banana.console.log("Table size: " + table.rowCount + ", " + table.columnCount);
// Get current position
Banana.console.log("Current position: " + table.currentRow + ", " + table.currentColumn);
// Get current text
var curItem = table.currentItem();
Banana.console.log("Current text: " + curItem.text);
// Get item check state
Banana.console.log("Item check state: " + (item3.checkState === 2 ? "checked" : "unchecked"));
}
// Update status bar with useful info about the current cell
function updateStatusBar() {
var curItem = table.currentItem();
if (curItem) {
var msg = "Cell " + (table.currentRow + 1) + "," + (table.currentColumn + 1) + " clicked. ";
if (curItem.text.length > 0)
msg += "Text: '" + curItem.text + "'. ";
if (curItem.checkState === 2)
msg += "Checked: true.";
statusLabel.text = msg;
} else {
statusLabel.text = "";
}
}
- User interface for QTableWidget interaction
// Banana Accounting Extension Javascript
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Dialog</class>
<widget class="QDialog" name="Dialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>584</width>
<height>411</height>
</rect>
</property>
<property name="windowTitle">
<string>QTableWidget Tutorial</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QTableWidget" name="tableWidget"/>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLabel" name="statusLabel">
<property name="text">
<string/>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="standardButtons">
<set>QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
</layout>
</widget>
<tabstops>
<tabstop>tableWidget</tabstop>
</tabstops>
<resources/>
<connections/>
</ui>
Find dialog
// Banana Accounting Extension Javascript
/**
* This example search a text in all the tables of the document,
* and show the matches in the messages pane.
*/
// @id = ch.banana.scripts.find
// @version = 1.3
// @date = 2019-12-06
// @publisher = Banana.ch SA
// @description = Find in whole accounting
// @description.it = Cerca in tutta la contabilità
// @description.de = Suchen in der gesamten Buchhaltung
// @description.fr = Chercher dans toute la comptabilité
// @task = app.command
// @inputdatasource = none
// @timeout = -1
/**
* param values are loaded from Banana.document, edited through dialog and saved to Banana.document
* This array object is like a map (associative array) i.e. "key":"value", see initParam()
* Examples of keys: searchText, wholeText, ...
*/
var param = {};
/** Dialog's functions declaration */
var dialog = Banana.Ui.createUi("documents:742.ui"); // ch.banana.scripts.find.ui
/** Dialog Objects declaration */
var findNextButton = dialog.findChild('findNextButton');
var helpButton = dialog.findChild('helpButton');
var closeButton = dialog.findChild('closeButton');
var searchTextLineEdit = dialog.findChild('searchTextLineEdit');
var matchCaseCheckBox = dialog.findChild('matchCaseCheckBox');
var wholeTextCheckBox = dialog.findChild('wholeTextCheckBox');
dialog.checkdata = function () {
var valid = true;
if (searchTextLineEdit.text.length <= 0) {
Banana.Ui.showInformation("Error", "Search text can't be empty");
valid = false;
}
if (valid) {
dialog.accept();
}
};
dialog.showHelp = function () {
Banana.Ui.showHelp("ch.banana.script.find");
};
dialog.closeDialog = function () {
dialog.close();
};
/** Dialog's events declaration */
findNextButton.clicked.connect(dialog, dialog.checkdata);
helpButton.clicked.connect(dialog, dialog.showHelp);
closeButton.clicked.connect(dialog, dialog.closeDialog);
/** Main function */
function exec(inData) {
//calls dialog
// var rtnDialog = true;
var rtnDialog = dialogExec();
//search text in the whole accounting
if (rtnDialog && Banana.document) {
Banana.document.clearMessages();
searchInTables();
}
}
/** Show the dialog and set the parameters */
function dialogExec() {
// Read saved script settings
initParam();
if (Banana.document) {
var data = Banana.document.getScriptSettings();
if (data.length > 0) {
param = JSON.parse(data);
}
}
// Text at cursor position
var cursor = Banana.document.cursor;
var columnName = cursor.tableName === 'Documents' && cursor.columnName == 'Attachments' ? 'Description' : cursor.columnName;
param["searchText"] = Banana.document.value(cursor.tableName,cursor.rowNr,columnName);
searchTextLineEdit.text = param["searchText"];
// Set dialog parameters
if (param["matchCase"] == "true")
matchCaseCheckBox.checked = true;
else
matchCaseCheckBox.checked = false;
if (param["wholeText"] == "true")
wholeTextCheckBox.checked = true;
else
wholeTextCheckBox.checked = false;
Banana.application.progressBar.pause();
var dlgResult = dialog.exec();
Banana.application.progressBar.resume();
if (dlgResult !== 1)
return false;
// Read dialog parameters
param["searchText"] = searchTextLineEdit.text;
if (matchCaseCheckBox.checked)
param["matchCase"] = "true";
else
param["matchCase"] = "false";
if (wholeTextCheckBox.checked)
param["wholeText"] = "true";
else
param["wholeText"] = "false";
// Save script settings
var paramString = JSON.stringify(param);
var value = Banana.document.setScriptSettings(paramString);
return true;
}
/** Initialize dialog values with default values */
function initParam() {
param = {
"searchText": "",
"matchCase": "false",
"wholeText": "false"
};
}
/** Search a text in the accounting's tables */
function searchInTables() {
var searchText = param["searchText"];
if (param["matchCase"] === "false")
searchText = searchText.toLowerCase();
var tables = Banana.document.tableNames;
// Tables
for (var t=0; t < tables.length; t++) {
var table = Banana.document.table(tables[t]);
var columns = table.columnNames;
// Rows
for (var r=0; r < table.rowCount; r++) {
// Columns
for (var c=0; c < columns.length; c++) {
var textFound = false;
var text = table.value(r, columns[c]);
if (param["matchCase"] === "false")
text = text.toLowerCase();
// Find text
if (param["wholeText"] === "true") {
if (text === searchText)
textFound = true;
} else {
if (text.indexOf(searchText) >= 0)
textFound = true;
}
// Show message
if (textFound) {
table.addMessage("Text \"" + param["searchText"] +
"\" found in \"" + table.value(r, columns[c]) + "\"", r, columns[c]);
}
}
}
}
}
- User interface for Find dialog
// Banana Accounting Extension Javascript
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>DlgFind</class>
<widget class="QDialog" name="DlgFind">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>438</width>
<height>193</height>
</rect>
</property>
<property name="windowTitle">
<string>Find</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<layout class="QGridLayout" name="gridLayout">
<property name="horizontalSpacing">
<number>40</number>
</property>
<item row="0" column="0">
<widget class="QLabel" name="searchTextLabel">
<property name="text">
<string>Search &text</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="searchTextLineEdit"/>
</item>
</layout>
</item>
<item>
<widget class="QGroupBox" name="groupBox">
<property name="title">
<string>Options</string>
</property>
<property name="flat">
<bool>false</bool>
</property>
<property name="checkable">
<bool>false</bool>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QCheckBox" name="matchCaseCheckBox">
<property name="text">
<string>&Match case</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="wholeTextCheckBox">
<property name="text">
<string>&Whole text</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>15</height>
</size>
</property>
</spacer>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>80</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="findNextButton">
<property name="text">
<string>&Find</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="helpButton">
<property name="text">
<string>Help</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="closeButton">
<property name="text">
<string>Close</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<tabstops>
<tabstop>matchCaseCheckBox</tabstop>
<tabstop>findNextButton</tabstop>
</tabstops>
<resources/>
<connections/>
</ui>
Export
Export tutorial1 javascript codes
// Banana Accounting Extension Javascript
// @id = ch.banana.apps.exportjavascriptcodestutorial1.js
// @api = 1.0
// @publisher = Banana.ch SA
// @description = Tutorial: Export javascript codes of the Tutorial 1 examples
// @task = export.file
// @doctype = *.*
// @docproperties =
// @timeout = -1
// @exportfiletype = js
//Main function
function exec() {
//Check if we are on an opened document
if (!Banana.document) {
return;
}
//Take the table Documents
var documents = Banana.document.table('Documents');
//We check if the table Documents exists, then we can take all the codes
//If the table Documents doesn't exists, then we stop the script execution
if (!documents) {
return;
} else {
//We use this variable to save all the codes
var jsCode = '';
jsCode += '// Copyright [2018] [Banana.ch SA - Lugano Switzerland]' + '\n';
jsCode += '// ' + '\n';
jsCode += '// Licensed under the Apache License, Version 2.0 (the "License");' + '\n';
jsCode += '// you may not use this file except in compliance with the License.' + '\n';
jsCode += '// You may obtain a copy of the License at' + '\n';
jsCode += '// ' + '\n';
jsCode += '// http://www.apache.org/licenses/LICENSE-2.0' + '\n';
jsCode += '// ' + '\n';
jsCode += '// Unless required by applicable law or agreed to in writing, software' + '\n';
jsCode += '// distributed under the License is distributed on an "AS IS" BASIS,' + '\n';
jsCode += '// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.' + '\n';
jsCode += '// See the License for the specific language governing permissions and' + '\n';
jsCode += '// limitations under the License.' + '\n' + '\n' + '\n' + '\n' + '\n' + '\n' + '\n';
//Function call to get all the tutorial's codes
jsCode = getJavascriptCode(jsCode, documents);
}
return jsCode;
}
//Function that, for each tutorial's example, gets the javascript code and save it into the jsCode variable.
function getJavascriptCode(jsCode, documents) {
//Read row by row the table Documents
var len = documents.rowCount;
for (var i = 0; i < len; i++) {
//Create a variable for the row
var tRow = documents.row(i);
//We get some values
var fName = Banana.document.info("Base", "FileName").replace(/^.*[\\\/]/, ''); //the file name (without path)
var id = tRow.value("RowId"); //the id of the example
var description = tRow.value("Description"); //the description of the example
var attachments = tRow.value("Attachments"); //the javascript code of the example
//We consider only the rows that contain an id, a description and an attachment
if (id && description && attachments) {
//At the beginning of each code, we insert some information
jsCode += "/** " + '\n';
jsCode += " File: " + fName + '\n';
jsCode += " Id: " + id + '\n';
jsCode += " Description: " + description + '\n';
jsCode += "*/" + '\n';
//we add the code of the attachments
jsCode += attachments;
//At the end of each code, we insert some new lines
jsCode += '\n' + '\n' + '\n' + '\n' + '\n' + '\n' + '\n';
}
}
//Finally we return the variable containing all the codes of all the examples
return jsCode;
}
Export tutorial1 javascript codes to HTML
// Banana Accounting Extension Javascript
// @id = ch.banana.apps.exporthtmljavascriptcodestutorial1.js
// @api = 1.0
// @publisher = Banana.ch SA
// @description = Tutorial: Export javascript codes of the Tutorial 1 examples in HTML
// @task = export.file
// @doctype = *.*
// @docproperties =
// @timeout = -1
// @exportfiletype = html
//Main function
function exec() {
//Check if we are on an opened document
if (!Banana.document) {
return;
}
//Take the table Documents
var documents = Banana.document.table('Documents');
//We check if the table Documents exists, then we can take all the codes
//If the table Documents doesn't exists, then we stop the script execution
if (!documents) {
return;
} else {
//We use this variable to save all the codes
var jsCode = '';
//Function call to get all the tutorial's codes
jsCode = getJavascriptCode(jsCode, documents);
}
return jsCode;
}
//Function that, for each tutorial's example, gets the javascript code and save it into the jsCode variable.
function getJavascriptCode(jsCode, documents) {
//Read row by row the table Documents
var len = documents.rowCount;
for (var i = 0; i < len; i++) {
//Create a variable for the row
var tRow = documents.row(i);
//We get some values
var fName = Banana.document.info("Base", "FileName").replace(/^.*[\\\/]/, ''); //the file name (without path)
var section = tRow.value("Section"); // the section column used to define the title type
var id = tRow.value("RowId"); //the id of the example
var description = tRow.value("Description"); //the description of the example
var attachments = tRow.value("Attachments"); //the javascript code of the example
attachments = attachments.replace(/</g,'<'); // replace the < symbol
attachments = attachments.replace(/>/g,'>'); // replace the > symbol
//For tilte h2 we conside only rows with section h2
if (section && section === "h2") {
jsCode += '<h2>' + description + '</h2>\n';
}
//For js codes we consider only rows with section h3, id, description and attachment
else if (section && section === "h3" && id && description && attachments) {
jsCode += '<h3>' + description + '</h3>\n';
jsCode += '<pre><code class="language-javascript">\n';
jsCode += '// Banana Accounting Extension Javascript' + '\n';
jsCode += attachments;
jsCode += '\n';
jsCode += '</code></pre>\n';
}
}
//Finally we return the variable containing all the codes of all the examples
return jsCode;
}