Fix: Product ledger was not totalling. This is because for some reason, pydantic was sending the data as string when the field was nullable
160 lines
6.6 KiB
HTML
160 lines
6.6 KiB
HTML
<mat-card>
|
|
<mat-card-header>
|
|
<mat-card-title-group>
|
|
<mat-card-title>Receipt</mat-card-title>
|
|
<mat-icon
|
|
matSuffix
|
|
(click)="voucher.isStarred = !voucher.isStarred"
|
|
class="pointer"
|
|
[class.gold]="voucher.isStarred"
|
|
>
|
|
{{ voucher.isStarred ? 'star' : 'star_border' }}
|
|
</mat-icon>
|
|
</mat-card-title-group>
|
|
</mat-card-header>
|
|
<mat-card-content>
|
|
<form [formGroup]="form" class="flex flex-col">
|
|
<div class="flex flex-row justify-around content-start items-start sm:max-lg:flex-col">
|
|
<mat-form-field class="flex-auto basis-2/5 mr-5">
|
|
<mat-label>Date</mat-label>
|
|
<input
|
|
matInput
|
|
[matDatepicker]="date"
|
|
formControlName="date"
|
|
autocomplete="off"
|
|
#dateElement
|
|
(focus)="dateElement.select()"
|
|
/>
|
|
<mat-datepicker-toggle matSuffix [for]="date"></mat-datepicker-toggle>
|
|
<mat-datepicker #date></mat-datepicker>
|
|
</mat-form-field>
|
|
<mat-form-field class="flex-auto basis-2/5 mr-5">
|
|
<mat-select formControlName="receiptAccount">
|
|
<mat-option *ngFor="let account of receiptAccounts" [value]="account.id">
|
|
{{ account.name }}
|
|
</mat-option>
|
|
</mat-select>
|
|
</mat-form-field>
|
|
<mat-form-field class="flex-auto basis-1/5">
|
|
<mat-label>Receipt Amount</mat-label>
|
|
<input type="text" matInput formControlName="receiptAmount" />
|
|
<span matTextPrefix>₹ </span>
|
|
</mat-form-field>
|
|
</div>
|
|
|
|
<div formGroupName="addRow" class="flex flex-row justify-around content-start items-start sm:max-lg:flex-col">
|
|
<mat-form-field class="flex-auto basis-[55%] mr-5">
|
|
<mat-label>Account</mat-label>
|
|
<input
|
|
type="text"
|
|
matInput
|
|
#accountElement
|
|
[matAutocomplete]="auto"
|
|
formControlName="account"
|
|
autocomplete="off"
|
|
/>
|
|
<mat-hint *ngIf="accBal">
|
|
Balance as on Date: <strong>{{ accBal.date | currency: 'INR' | accounting }}</strong> / Final balance:
|
|
<strong>{{ accBal.total | currency: 'INR' | accounting }}</strong>
|
|
</mat-hint>
|
|
</mat-form-field>
|
|
<mat-autocomplete
|
|
#auto="matAutocomplete"
|
|
autoActiveFirstOption
|
|
[displayWith]="displayFn"
|
|
(optionSelected)="accountSelected($event)"
|
|
>
|
|
<mat-option *ngFor="let account of accounts | async" [value]="account">{{ account.name }}</mat-option>
|
|
</mat-autocomplete>
|
|
<mat-form-field class="flex-auto basis-1/4 mr-5">
|
|
<mat-label>Amount</mat-label>
|
|
<input type="text" matInput formControlName="amount" autocomplete="off" />
|
|
<span matTextPrefix>₹ </span>
|
|
</mat-form-field>
|
|
|
|
<button mat-raised-button color="primary" (click)="addRow()" class="flex-auto basis-1/5">Add</button>
|
|
</div>
|
|
<mat-table #table [dataSource]="dataSource" matSort aria-label="Elements">
|
|
<!-- Account Column -->
|
|
<ng-container matColumnDef="account">
|
|
<mat-header-cell *matHeaderCellDef>Account</mat-header-cell>
|
|
<mat-cell *matCellDef="let row">{{ row.account.name }}</mat-cell>
|
|
</ng-container>
|
|
|
|
<!-- Amount Column -->
|
|
<ng-container matColumnDef="amount">
|
|
<mat-header-cell *matHeaderCellDef class="right">Amount</mat-header-cell>
|
|
<mat-cell *matCellDef="let row" class="right">{{ row.amount | currency: 'INR' }}</mat-cell>
|
|
</ng-container>
|
|
|
|
<!-- Action Column -->
|
|
<ng-container matColumnDef="action">
|
|
<mat-header-cell *matHeaderCellDef class="center">Action</mat-header-cell>
|
|
<mat-cell *matCellDef="let row" class="center">
|
|
<button mat-icon-button tabindex="-1" (click)="editRow(row)">
|
|
<mat-icon>edit</mat-icon>
|
|
</button>
|
|
<button mat-icon-button tabindex="-1" color="warn" (click)="deleteRow(row)">
|
|
<mat-icon>delete</mat-icon>
|
|
</button>
|
|
</mat-cell>
|
|
</ng-container>
|
|
|
|
<mat-header-row *matHeaderRowDef="displayedColumns"></mat-header-row>
|
|
<mat-row *matRowDef="let row; columns: displayedColumns"></mat-row>
|
|
</mat-table>
|
|
<mat-form-field class="flex-auto">
|
|
<mat-label>Narration</mat-label>
|
|
<textarea matInput matAutosizeMinRows="5" formControlName="narration"></textarea>
|
|
</mat-form-field>
|
|
<div class="flex flex-row justify-center items-stretch">
|
|
<div class="img-container" class="flex-auto mr-5 basis-1/5" *ngFor="let item of voucher.files">
|
|
<img [src]="item.thumbnail" (click)="zoomImage(item)" />
|
|
<button mat-icon-button class="overlay" (click)="deleteImage(item)">
|
|
<mat-icon>delete</mat-icon>
|
|
</button>
|
|
</div>
|
|
<div class="img-container" class="flex flex-auto basis-1/5">
|
|
<label ng-href for="fileUp">
|
|
<img
|
|
src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAiIGhlaWdodD0iMTUwIj48cmVjdCB3aWR0aD0iMTAwIiBoZWlnaHQ9IjE1MCIgZmlsbD0iI2VlZSIvPjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjUwIiB5PSI3NSIgc3R5bGU9ImZpbGw6I2FhYTtmb250LXdlaWdodDpib2xkO2ZvbnQtc2l6ZToxMDBweDtmb250LWZhbWlseTpBcmlhbCxIZWx2ZXRpY2Esc2Fucy1zZXJpZjtkb21pbmFudC1iYXNlbGluZTpjZW50cmFsIj4rPC90ZXh0Pjwvc3ZnPg=="
|
|
/>
|
|
</label>
|
|
<input
|
|
type="file"
|
|
id="fileUp"
|
|
multiple
|
|
accept="image/*"
|
|
style="display: none"
|
|
(change)="image.detectFiles($event, voucher)"
|
|
/>
|
|
</div>
|
|
</div>
|
|
</form>
|
|
</mat-card-content>
|
|
<mat-card-actions>
|
|
<button mat-raised-button color="primary" (click)="save()" [disabled]="!canSave()" class="mr-5">
|
|
{{ voucher.id ? 'Update' : 'Save' }}
|
|
</button>
|
|
<button
|
|
mat-raised-button
|
|
(click)="post()"
|
|
*ngIf="voucher.id"
|
|
[disabled]="voucher.posted || !auth.allowed('post-vouchers')"
|
|
class="mr-5"
|
|
>
|
|
{{ voucher.posted ? 'Posted' : 'Post' }}
|
|
</button>
|
|
<button mat-raised-button color="warn" (click)="confirmDelete()" *ngIf="voucher.id" [disabled]="!canSave()">
|
|
Delete
|
|
</button>
|
|
<span class="fill-remaining-space"></span>
|
|
<span *ngIf="voucher.id" class="flex">
|
|
Created on <strong>{{ voucher.creationDate | localTime }}</strong
|
|
> and Last Edited on <strong>{{ voucher.lastEditDate | localTime }}</strong
|
|
> by <strong>{{ voucher.user.name }}</strong
|
|
>. {{ voucher.poster ? 'Posted by ' + voucher.poster : '' }}
|
|
</span>
|
|
</mat-card-actions>
|
|
</mat-card>
|