Co-op to CSV

By Michael Vandercamp Last update Mar 5, 2006 — Installed 612 times.
// ==UserScript==
// @name           Co-op to CSV
// @namespace      http://factorial.co.uk/coop2csv
// @description    UNOFFICIAL script to convert bank statements into CSV files
// @include        https://welcome6.co-operativebank.co.uk/CBIBSWeb/getDomesticStatementPage*
// @include			 https://welcome6.co-operativebank.co.uk/CBIBSWeb/paginateDomesticStatement*
// @include        https://welcome7.co-operativebank.co.uk/CBIBSWeb/getDomesticStatementPage*
// @include			 https://welcome7.co-operativebank.co.uk/CBIBSWeb/paginateDomesticStatement*
// ==/UserScript==
var trs = document.evaluate("//tr", document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null); 
var CSV = "";
var i = 0;
var j = 0;
var statsArrayCSV = new Array(25);
var statsArrayOFX = new Array(25);
var statsLineArray = new Array(5);
var statLine;
var date,transaction,deposit,withdrawal,balance;
var sortCode,accountNumber,statementDate, statementFrom, statementTo;
var transCount = 0;
var OFX;


sortCode = parseSortCode( trs.snapshotItem(19).childNodes[1].textContent ) ;
accountNumber = parseAccountNumber(trs.snapshotItem(19).childNodes[1].textContent);	
statementDate = parseDate(trs.snapshotItem(21).childNodes[3].textContent) ;







for (i = 25;trs.snapshotItem(i).childNodes.length == 11;i++)
{
		statLine = trs.snapshotItem(i).childNodes;
		date 			=	trimString(statLine[1].innerHTML) ;
		transaction	= trimString(statLine[3].innerHTML) ;
		deposit 		= trimString(statLine[5].innerHTML);
		withdrawal  = trimString(statLine[7].innerHTML) ;
		balance 		= trimString(statLine[9].innerHTML);

		if (deposit == " ")
		{
			deposit = '';
		}
		else
		{
			deposit = deposit.substring(1);
		}
		
		if (withdrawal == " ")
		{
			withdrawal = '';
		}
		else
		{
			withdrawal = withdrawal.substring(1);
		}
		
		if (balance == " ")
		{
			balance ='';
		}
		else
		{
			balance = balance.substring(1);
			balance = fixBalance(balance);
			
		}
		
		statsLineArray[0] = date;
		statsLineArray[1] = transaction;
		statsLineArray[2] = deposit;
		statsLineArray[3] = withdrawal;
		statsLineArray[4] = balance;
		
		
		
		statsArrayOFX[i-25] = lineToOFX(date,deposit,withdrawal,transaction);
		CSV += date +","+ transaction +","+ deposit +","+ withdrawal +","+ balance + "\n";
		transCount++;
		
		if (i == 25)
		{
			statementFrom = date ;
		}
		
		if (trs.snapshotItem(i+1).childNodes.length != 11)
		{
			statementTo = date;
		}
}

OFX = header1XML(sortCode,accountNumber);
OFX += header2XML(statementFrom.substring(6,10)+statementFrom.substring(3,5)+statementFrom.substring(0,2)+"000000",statementTo.substring(6,10)+statementTo.substring(3,5)+statementTo.substring(0,2)+"000000");

for(i=1;i<transCount;i++)
{
	OFX += statsArrayOFX[i];
}

GM_log(OFX);

GM_log(CSV);


var trs1 = document.getElementsByTagName('tr');

var div = document.createElement('div');

div.appendChild((createButton1("", "","blah",80,15, 'data:image/png;base64,'+
'iVBORw0KGgoAAAANSUhEUgAAAFAAAAAPCAIAAAD8q9/YAAAA0klEQVR4nOVXQRKEMAgLO75V3sRr'+
'8eCKlpaO2qqH5kRThkkUcKR5njESJgAi8rWMl8DM0xZSh3qixB3KPAQVAPh9LeNtDGd4KnCiQNrk'+
'K2Ok6H57jFPothnWPndHY9yxzrQjM2wG8uAKVLxK4oS02IIooS/iljaTTBDdX7IxqD2LVb1W1389'+
'4UyFG4gNO4dm8jSI/6LrCS0VbiBraTN2nFK7cmlxq7eP3xMDjPLScjYiV9XBLqo8khYXyahCO4b7'+
'LA1neGvpiwspQvel2h002t/SAoQjXAfYBEnCAAAAAElFTkSuQmCC')),trs.snapshotItem(16).nextSibling);



div.appendChild((createButton2("", "","blah",80,15, 'data:image/png;base64,'+
'iVBORw0KGgoAAAANSUhEUgAAAFAAAAAPCAIAAAD8q9/YAAAA00lEQVR4nOVXQQ7EIAgcNn2rvInX'+
'soeurFqlTdX24JxgNITJgE0phICVsAEQkbfbeAjMvMWQBtQTJR5QZhJUAODzdhtPYznBW4UTBZIh'+
'31NjRLOj9i5ofBn2OS9SY4rUZ/pxEGwaUjGpKqbf0ZnaokvijLTYgtaFsag5fETh+ZlaxO7hmqPu'+
'x+FKhRu4tsNMmTxz2AXxv2nnQk+FGzg4bEpaBpq3rs/96zdjgVEf6UKDk7anutplSlpcJVsV+rHc'+
'Z2k5wXGkz16gixj7wMwArfa39AVuZlgZGDYq9gAAAABJRU5ErkJggg==')),trs.snapshotItem(16).nextSibling);

trs.snapshotItem(16).parentNode.insertBefore(div, trs.snapshotItem(16).nextSibling);






function createButton1(target, func, title, width, height, src) {
    var img, button;
    img = document.createElement('img');
    img.width = width;
    img.height = height;

    img.src = src;
    button = document.createElement('a');
    button._target = target;
    button.title = title;
    button.href = '#';
   
    button.appendChild(img);
	
	button.addEventListener('click',
                           function(e) { wCSV() ; },
                           false);
    return button;
}

function createButton2(target, func, title, width, height, src) {
    var img, button;
    img = document.createElement('img');
    img.width = width;
    img.height = height;

    img.src = src;
    button = document.createElement('a');
    button._target = target;
    button.title = title;
    button.href = '#';
   
    button.appendChild(img);
	
	button.addEventListener('click',
                           function(e) { wOFX() ; },
                           false);
    return button;
}



	function trimString(str) 
	{
		if(str.charAt(0) == " ")
		{  
		str = trimString(str.substring(1));
		}
		if (str.charAt(str.length-1) == " ")
		{  
			str = trimString(str.substring(0,str.length-1));
		}
		return str;
	}


	function fixBalance(balanceIn)
	{
		var balanceSplit = new Array();
		balanceSplit = balanceIn.split(' ');
		
		if (balanceSplit[1] == 'DR')
		{
			return (balanceSplit[0] * -1);
		
		}
		else 
		{
			return balanceSplit[0];
		}
	
	}
	
	function lineToOFX(dateIN,dep,withd,trans)
	{
		var transactionXML = '';
		
		transactionXML += '<STMTTRN>' + "\n";
		
		transactionXML += '<TRNTYPE>';
		if (dep != '')
		{
			transactionXML += 'CREDIT';
		}
		else if ( withd != '')
		{
			transactionXML += 'DEBIT';
		}
		transactionXML += '</TRNTYPE>';
		transactionXML += "\n";
		
		transactionXML += '<DTPOSTED>';
		transactionXML += dateIN.substring(6,10) + dateIN.substring(3,5) + dateIN.substring(0,2) + '000000';
		transactionXML += '</DTPOSTED>';
		transactionXML += "\n";
		
		transactionXML += '<TRNAMT>';
		transactionXML += dep + withd;
		transactionXML += '</TRNAMT>';
		transactionXML += "\n";
		
		transactionXML += '<FITID>';
		transactionXML += dateIN.substring(6,10) + dateIN.substring(3,5) + dateIN.substring(0,2) + '000000';
		transactionXML += '</FITID>';
		transactionXML += "\n";
		
		transactionXML += '<NAME>';
		transactionXML += trans;
		transactionXML += '</NAME>';
		transactionXML += "\n";
		
		transactionXML += '<MEMO>';
		transactionXML += trans;
		transactionXML += '</MEMO>';
		transactionXML += "\n";
		
		transactionXML += '</STMTTRN>' + "\n";
		
		return transactionXML;
	}
	
	function parseSortCode(str)
	{
		var _sortCode = str.match(  (/\d\d-\d\d-\d\d/ ))
		return _sortCode[0];
		
	}
	
	function parseAccountNumber(str)
	{
		var _accountNumber = str.match(  (/\d\d\d\d\d\d\d\d/ ) )
		return _accountNumber[0];
		
	}
	
	function parseDate(str)
	{
		var _statementDate = str.match( ( /\d\d\/\d\d\/\d\d\d\d/  ) )
		return _statementDate[0];
	}
	
	function header1XML(_sortCode,_accountNumber)
	{
		
		var dateTimeNow = new Date();
		
		var headerXML = ''
		headerXML += "OFXHEADER:100\nDATA:OFXSGML\nVERSION:102\nSECURITY:NONE\nENCODING:USASCII\nCHARSET:1252\nCOMPRESSION:NONE\nOLDFILEUID:NONE\nNEWFILEUID:NONE\n\n";
		headerXML += "<OFX>\n<SIGNONMSGSRSV1>\n<SONRS>\n<STATUS>\n<CODE>0</CODE>\n<SEVERITY>INFO</SEVERITY>\n</STATUS>";
		headerXML += "<DTSERVER>" + fixDate(dateTimeNow) +"</DTSERVER>\n";
		headerXML += "<LANGUAGE>ENG</LANGUAGE>\n</SONRS>\n</SIGNONMSGSRSV1>\n";
		headerXML += "<BANKMSGSRSV1>\n<STMTTRNRS><TRNUID>1</TRNUID>\n";
		headerXML += "<STATUS><CODE>0</CODE><SEVERITY>INFO</SEVERITY></STATUS>\n";
		headerXML += "<STMTRS><CURDEF>GBP</CURDEF><BANKACCTFROM><BANKID>";
		headerXML += _sortCode;
		headerXML += "</BANKID><ACCTID>";
		headerXML += _accountNumber;
		headerXML += "</ACCTID><ACCTTYPE>CHECKING</ACCTTYPE>\n</BANKACCTFROM>\n\n";
		
		return headerXML;
	}
	
	function fixDate(_date)
	{
		
		var temp,_year,_month,_day,_hour,_minute,_second;
				
		_year = _date.getFullYear();
		_month = _date.getMonth() + 1;
		_day = _date.getDate();
		_hour = _date.getHours();
		_minute = _date.getMinutes();
		_second = _date.getSeconds();
		
		temp =  _year;
		temp += ((_month < 10) ? "0" : "") + _month;
		temp += ((_day < 10) ? "0" : "") + _day;
		temp += ((_hour < 10) ? "0" : "") + _hour;
		temp += ((_minute < 10) ? "0" : "") + _minute;
		temp += ((_second < 10) ? "0" : "") + _second;
		return temp;
	}
	
	function header2XML(_start,_end)
	{
		var headerXML ='';
		headerXML += "<BANKTRANLIST>\n<DTSTART>";
		headerXML += _start;
		headerXML += "</DTSTART><DTEND>";
		headerXML += _end;
		headerXML += "</DTEND>\n";
		
		return headerXML;
	}
	
	
	function wOFX()
   {
		OpenWindow=window.open("", "newwin", "height=700, width=700,toolbar=no,menubar=yes");
		OpenWindow.document.open("text/plain", "replace");
		OpenWindow.document.write(OFX)
		OpenWindow.document.close();
   }

   function wCSV()
      {
   		OpenWindow=window.open("", "newwin", "height=700, width=700,toolbar=no,menubar=yes");
   		OpenWindow.document.open("text/plain", "replace");
   		OpenWindow.document.write(CSV)
   		OpenWindow.document.close();
      }