<!--
  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="{{'Trial balance' | translate}}" [navigateBackTo]="['../']">
  <fims-layout-card-over-header-menu>
    <mat-checkbox [(ngModel)]="includeEmptyEntries" (change)="fetchTrialBalance($event)" translate>Include empty entries?</mat-checkbox>
  </fims-layout-card-over-header-menu>
  <div layout="row">
    <table td-data-table>
      <thead>
        <tr td-data-table-column-row>
          <th td-data-table-column>
            <span translate>Ledger</span>
          </th>
          <th td-data-table-column>
            <span translate>Debit</span>
          </th>
          <th td-data-table-column>
            <span translate>Credit</span>
          </th>
        </tr>
      </thead>
      <tbody>
        <tr td-data-table-row *ngFor="let row of (trialBalance$ | async)?.trialBalanceEntries">
          <td td-data-table-cell>
            <a [routerLink]="['../ledgers/detail', row['ledger'].identifier]" *hasPermission="{ id: 'accounting_ledgers', accessLevel: 'READ' }">{{row['ledger'].identifier }} - {{row['ledger'].name }}</a>
          </td>
          <td td-data-table-cell>
            {{row['type'] == 'DEBIT' ? (row['amount'] | number): '-'}}
          </td>
          <td td-data-table-cell>
            {{row['type'] == 'CREDIT' ? (row['amount'] | number) : '-'}}
          </td>
        </tr>
        <tr td-data-table-row>
          <td td-data-table-cell translate>Total</td>
          <td td-data-table-cell>
            {{(trialBalance$ | async)?.debitTotal | number}}
          </td>
          <td td-data-table-cell>
            {{(trialBalance$ | async)?.creditTotal | number}}
          </td>
        </tr>
      </tbody>
    </table>
  </div>
</fims-layout-card-over>
