152 lines
3.9 KiB
JavaScript
152 lines
3.9 KiB
JavaScript
'use strict';
|
|
// Part of the accounting-api project:
|
|
// https://gitorious.org/conservancy/accounting-api
|
|
// License: AGPLv3-or-later
|
|
|
|
function s4() {
|
|
return Math.floor((1 + Math.random()) * 0x10000)
|
|
.toString(16)
|
|
.substring(1);
|
|
};
|
|
|
|
function guid() {
|
|
return s4() + s4() + '-' + s4() + '-' + s4() + '-' +
|
|
s4() + '-' + s4() + s4() + s4();
|
|
}
|
|
|
|
function Transaction(args) {
|
|
var self = this;
|
|
this.__type__ = 'Transaction';
|
|
this.id = null;
|
|
this.payee = null;
|
|
this.date = null;
|
|
this.postings = null;
|
|
this.metadata = {};
|
|
|
|
this.generateId = function () {
|
|
self.id = guid();
|
|
}
|
|
|
|
for (var i in args) {
|
|
this[i] = args[i];
|
|
}
|
|
}
|
|
|
|
function Posting(args) {
|
|
this.__type__ = 'Posting';
|
|
this.account = null;
|
|
this.amount = null;
|
|
|
|
for (var i in args) {
|
|
this[i] = args[i];
|
|
}
|
|
}
|
|
|
|
function Amount(args) {
|
|
this.__type__ = 'Amount';
|
|
this.symbol = null;
|
|
this.amount = null;
|
|
|
|
for (var i in args) {
|
|
this[i] = args[i];
|
|
}
|
|
}
|
|
|
|
var models = {
|
|
'Amount': Amount,
|
|
'Posting': Posting,
|
|
'Transaction': Transaction
|
|
};
|
|
|
|
function accountingObjectHook(object) {
|
|
if ('__type__' in object) {
|
|
console.log('Found typed object: ', object.__type__, object);
|
|
var model = new models[object.__type__];
|
|
for (var i in object) {
|
|
model[i] = object[i];
|
|
}
|
|
return model;
|
|
}
|
|
return object;
|
|
}
|
|
|
|
function transformResponseFactory(object_hook) {
|
|
var self = this;
|
|
self.object_hook = object_hook;
|
|
|
|
function transformResponse(json, headers) {
|
|
var transformed;
|
|
console.log('json: ', json);
|
|
if (typeof json == 'undefined') {
|
|
return;
|
|
} else if ((typeof json == 'object') &&
|
|
Object.prototype.toString.call(json) == '[object Object]') {
|
|
console.log('json is Object, json: ', json);
|
|
for (var i in json) {
|
|
json[i] = transformResponse(json[i]);
|
|
}
|
|
transformed = self.object_hook(json)
|
|
} else if ((typeof json == 'object') &&
|
|
Object.prototype.toString.call(json) == '[object Array]') {
|
|
console.log('json is Array, json: ', json);
|
|
for (var i in json) {
|
|
json[i] = transformResponse(json[i]);
|
|
}
|
|
transformed = json;
|
|
} else {
|
|
transformed = json;
|
|
}
|
|
return transformed;
|
|
};
|
|
return transformResponse;
|
|
}
|
|
|
|
function transformRequestFactory(object_hook) {
|
|
function transformRequest(data, headerSetter) {
|
|
console.log('transformRequest', data, headerSetter)
|
|
headerSetter()['Content-Type'] = 'application/json';
|
|
return data;
|
|
}
|
|
return transformRequest;
|
|
}
|
|
|
|
angular.module('accountingApi', ['ngResource'])
|
|
.factory('Transaction', function () {
|
|
return Transaction;
|
|
})
|
|
.factory('Posting', function () {
|
|
return Posting;
|
|
})
|
|
.factory('Amount', function () {
|
|
return Amount;
|
|
})
|
|
.factory('AccountingApi', function($resource, $http) {
|
|
$http.defaults.useXDomain = true;
|
|
$http.defaults.transformResponse.push(new transformResponseFactory(
|
|
accountingObjectHook));
|
|
var AccountingApi = $resource(
|
|
'/transaction/:id',
|
|
{},
|
|
{
|
|
get: {
|
|
method: 'GET',
|
|
transformResponse: Array.prototype.concat(
|
|
$http.defaults.transformResponse,
|
|
[function (data){
|
|
if (typeof data == 'object' &&
|
|
'transaction' in data) {
|
|
return data.transaction;
|
|
}
|
|
return data;
|
|
}]
|
|
)
|
|
},
|
|
save: {
|
|
method: 'POST',
|
|
transformRequest: [new transformRequestFactory()].concat(
|
|
$http.defaults.transformRequest)
|
|
}
|
|
}
|
|
);
|
|
return AccountingApi;
|
|
});
|