<!--
  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.
-->

<fims-layout-card-over title="{{'General Ledger' | translate}}">
  <fims-two-column-layout>
    <mat-nav-list left>
      <h3 mat-subheader translate>Details</h3>
      <a mat-list-item [routerLink]="['./chartOfAccounts']">
        <mat-icon matListAvatar>list</mat-icon>
        <h3 matLine translate>Chart of accounts</h3>
        <p matLine translate>View chart of accounts</p>
      </a>
      <a mat-list-item [routerLink]="['./journalEntries']" *hasPermission="{ id: 'accounting_journals', accessLevel: 'READ' }">
        <mat-icon matListAvatar>assignment</mat-icon>
        <h3 matLine translate>Journal entries</h3>
        <p matLine translate>View journal entries</p>
      </a>
      <a mat-list-item [routerLink]="['./transactiontypes']" *hasPermission="{ id: 'accounting_tx_types', accessLevel: 'READ' }">
        <mat-icon matListAvatar>swap_horiz</mat-icon>
        <h3 matLine translate>Transaction types</h3>
        <p matLine translate>View transaction types</p>
      </a>
      <a mat-list-item [routerLink]="['./cheques']" *hasPermission="{ id: 'cheque_management', accessLevel: 'READ' }">
        <mat-icon matListAvatar>import_contacts</mat-icon>
        <h3 matLine translate>Cheque clearing</h3>
        <p matLine translate>View and clear cheques</p>
      </a>
      <a mat-list-item [routerLink]="['./trialBalance']">
        <mat-icon matListAvatar>account_balance</mat-icon>
        <h3 matLine translate>Trial balance</h3>
        <p matLine translate>View trial balance</p>
      </a>
      <a mat-list-item [routerLink]="['./incomeStatement']" *hasPermission="{ id: 'accounting_income_statement', accessLevel: 'READ'}">
        <mat-icon matListAvatar>timeline</mat-icon>
        <h3 matLine translate>Income statement</h3>
        <p matLine translate>View income statement</p>
      </a>
      <a mat-list-item [routerLink]="['./financialCondition']" *hasPermission="{ id: 'accounting_fin_condition', accessLevel: 'READ'}">
        <mat-icon matListAvatar>timeline</mat-icon>
        <h3 matLine translate>Financial condition</h3>
        <p matLine translate>View financial condition</p>
      </a>
      <a mat-list-item [routerLink]="['./payrolls']" *hasPermission="{ id: 'payroll_distribution', accessLevel: 'READ' }">
        <mat-icon matListAvatar>receipt</mat-icon>
        <h3 matLine translate>Payrolls</h3>
        <p matLine translate>Manage payrolls</p>
      </a>
    </mat-nav-list>
    <div layout="column" flex-gt-md="100" right>
      <h3 translate>Ledger</h3>
      <fims-data-table flex (onActionCellClick)="rowSelect($event)" [columns]="columns" [data]="ledgerData | async"></fims-data-table>
    </div>
  </fims-two-column-layout>
</fims-layout-card-over>
<fims-fab-button title="{{'Create ledger' | translate}}" icon="add" [link]="['create']" [permission]="{ id: 'accounting_ledgers', accessLevel: 'CHANGE'}"></fims-fab-button>
