Embedded Extensions examples Tutorial 1

Dokumentation •
In diesem Artikel

'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,'&lt;'); // replace the < symbol
        attachments = attachments.replace(/>/g,'&gt;'); // 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;
}

Helfen Sie uns, unsere Dokumentation zu verbessern

Ihre Anregungen, wie wir diese Seite verbessern könnten, sind uns jederzeit willkommen.

Sagen Sie uns bitte, welches Thema eine bessere Erklärung braucht oder wie wir ein Argument verständlicher erklären könnten.

Diesen Artikel teilen: Twitter | Facebook | LinkedIn | Email