| /** |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| import {Inject, Injectable} from '@angular/core'; |
| import {HttpClients} from '../http/http.service'; |
| import {Ledger} from './domain/ledger.model'; |
| import {Observable} from 'rxjs/Observable'; |
| import {Account} from './domain/account.model'; |
| import {RequestOptionsArgs, URLSearchParams} from '@angular/http'; |
| import {AccountCommand} from './domain/account-command.model'; |
| import {JournalEntry} from './domain/journal-entry.model'; |
| import {TrialBalance} from './domain/trial-balance.model'; |
| import {AccountEntryPage} from './domain/account-entry-page.model'; |
| import {AccountPage} from './domain/account-page.model'; |
| import {FetchRequest} from '../domain/paging/fetch-request.model'; |
| import {buildDateRangeParam, buildSearchParams} from '../domain/paging/search-param.builder'; |
| import {LedgerPage} from './domain/ledger-page.model'; |
| import {ChartOfAccountEntry} from './domain/chart-of-account-entry.model'; |
| import {TransactionType} from './domain/transaction-type.model'; |
| import {TransactionTypePage} from './domain/transaction-type-page.model'; |
| import {AccountType} from './domain/account-type.model'; |
| import {IncomeStatement} from './domain/income-statement.model'; |
| import {FinancialCondition} from './domain/financial-condition.model'; |
| |
| @Injectable() |
| export class AccountingService { |
| |
| constructor(private http: HttpClients, @Inject('accountingBaseUrl') private baseUrl: string) { |
| } |
| |
| public createLedger(ledger: Ledger): Observable<void> { |
| return this.http.post(`${this.baseUrl}/ledgers`, ledger); |
| } |
| |
| public fetchLedgers(includeSubLedgers = false, fetchRequest?: FetchRequest, type?: AccountType): Observable<LedgerPage> { |
| const params: URLSearchParams = buildSearchParams(fetchRequest); |
| |
| params.append('includeSubLedgers', String(includeSubLedgers)); |
| params.append('type', type); |
| |
| const requestOptions: RequestOptionsArgs = { |
| params |
| }; |
| |
| return this.http.get(`${this.baseUrl}/ledgers`, requestOptions); |
| } |
| |
| public findLedger(identifier: string, silent?: boolean): Observable<Ledger> { |
| return this.http.get(`${this.baseUrl}/ledgers/${identifier}`, {}, silent); |
| } |
| |
| public addSubLedger(identifier: string, subLedger: Ledger): Observable<void> { |
| return this.http.post(`${this.baseUrl}/ledgers/${identifier}`, subLedger); |
| } |
| |
| public modifyLedger(ledger: Ledger): Observable<void> { |
| return this.http.put(`${this.baseUrl}/ledgers/${ledger.identifier}`, ledger); |
| } |
| |
| public deleteLedger(identifier: string): Observable<void> { |
| return this.http.delete(`${this.baseUrl}/ledgers/${identifier}`); |
| } |
| |
| public fetchAccountsOfLedger(identifier: string, fetchRequest?: FetchRequest): Observable<AccountPage> { |
| const params: URLSearchParams = buildSearchParams(fetchRequest); |
| |
| const requestOptions: RequestOptionsArgs = { |
| params |
| }; |
| return this.http.get(`${this.baseUrl}/ledgers/${identifier}/accounts`, requestOptions); |
| } |
| |
| public createAccount(account: Account): Observable<void> { |
| return this.http.post(`${this.baseUrl}/accounts`, account); |
| } |
| |
| public fetchAccounts(fetchRequest?: FetchRequest, type?: AccountType): Observable<AccountPage> { |
| const params: URLSearchParams = buildSearchParams(fetchRequest); |
| |
| params.append('type', type); |
| |
| const requestOptions: RequestOptionsArgs = { |
| params |
| }; |
| return this.http.get(`${this.baseUrl}/accounts`, requestOptions) |
| .share(); |
| } |
| |
| public findAccount(identifier: string, silent?: boolean): Observable<Account> { |
| return this.http.get(`${this.baseUrl}/accounts/${identifier}`, {}, silent); |
| } |
| |
| public modifyAccount(account: Account): Observable<void> { |
| return this.http.put(`${this.baseUrl}/accounts/${account.identifier}`, account); |
| } |
| |
| public deleteAccount(account: Account): Observable<void> { |
| return this.http.delete(`${this.baseUrl}/accounts/${account.identifier}`); |
| } |
| |
| public fetchAccountEntries(identifier: string, startDate: string, endDate: string, |
| fetchRequest?: FetchRequest): Observable<AccountEntryPage> { |
| const params: URLSearchParams = buildSearchParams(fetchRequest); |
| const dateRange = buildDateRangeParam(startDate, endDate); |
| params.append('dateRange', dateRange); |
| |
| const requestOptions: RequestOptionsArgs = { |
| params |
| }; |
| return this.http.get(`${this.baseUrl}/accounts/${identifier}/entries`, requestOptions); |
| } |
| |
| public fetchAccountCommands(identifier: string): Observable<AccountCommand[]> { |
| return this.http.get(`${this.baseUrl}/accounts/${identifier}/commands`); |
| } |
| |
| public accountCommand(identifier: string, command: AccountCommand): Observable<void> { |
| return this.http.post(`${this.baseUrl}/accounts/${identifier}/commands`, command); |
| } |
| |
| public createJournalEntry(journalEntry: JournalEntry): Observable<void> { |
| return this.http.post(`${this.baseUrl}/journal`, journalEntry); |
| } |
| |
| public fetchJournalEntries(startDate: string, endDate: string, account?: string, amount?: string): Observable<JournalEntry[]> { |
| const params: URLSearchParams = new URLSearchParams(); |
| |
| params.append('dateRange', buildDateRangeParam(startDate, endDate)); |
| params.append('account', account && account.length > 0 ? account : undefined); |
| params.append('amount', amount && amount.length > 0 ? amount : undefined); |
| |
| const requestOptions: RequestOptionsArgs = { |
| params |
| }; |
| return this.http.get(`${this.baseUrl}/journal`, requestOptions); |
| } |
| |
| public findJournalEntry(transactionIdentifier: string): Observable<JournalEntry> { |
| return this.http.get(`${this.baseUrl}/journal/${transactionIdentifier}`); |
| } |
| |
| public getTrialBalance(includeEmptyEntries?: boolean): Observable<TrialBalance> { |
| const params: URLSearchParams = new URLSearchParams(); |
| params.append('includeEmptyEntries', includeEmptyEntries ? 'true' : 'false'); |
| |
| const requestOptions: RequestOptionsArgs = { |
| params |
| }; |
| return this.http.get(`${this.baseUrl}/trialbalance`, requestOptions); |
| } |
| |
| public getChartOfAccounts(): Observable<ChartOfAccountEntry[]> { |
| return this.http.get(`${this.baseUrl}/chartofaccounts`); |
| } |
| |
| public findTransactionType(code: string, silent?: boolean): Observable<Account> { |
| return this.http.get(`${this.baseUrl}/transactiontypes/${code}`, {}, silent); |
| } |
| |
| public createTransactionType(transactionType: TransactionType): Observable<void> { |
| return this.http.post(`${this.baseUrl}/transactiontypes`, transactionType); |
| } |
| |
| public fetchTransactionTypes(fetchRequest?: FetchRequest): Observable<TransactionTypePage> { |
| const params: URLSearchParams = buildSearchParams(fetchRequest); |
| |
| const requestOptions: RequestOptionsArgs = { |
| params |
| }; |
| |
| return this.http.get(`${this.baseUrl}/transactiontypes`, requestOptions); |
| } |
| |
| public changeTransactionType(transactionType: TransactionType): Observable<void> { |
| return this.http.put(`${this.baseUrl}/transactiontypes/${transactionType.code}`, transactionType); |
| } |
| |
| public getIncomeStatement(): Observable<IncomeStatement> { |
| return this.http.get(`${this.baseUrl}/incomestatement`); |
| } |
| |
| public getFinancialCondition(): Observable<FinancialCondition> { |
| return this.http.get(`${this.baseUrl}/financialcondition`); |
| } |
| |
| } |