Booking Detail Invoice Download (Frontend & Backend)

This commit is contained in:
glovetleong
2021-04-04 15:37:49 +08:00
parent a339702030
commit 1d2f10079e
11 changed files with 316 additions and 29 deletions
@@ -0,0 +1,22 @@
<?php
namespace App\Classes\Modules\Bookings\Services;
use App\Classes\General\Eloquent\AbstractUpdateRecord;
use App\Models\Booking;
class UpdatesBookingStatus extends AbstractUpdateRecord
{
/**
* @param Booking $model
* @param int $status
* @return \Illuminate\Database\Eloquent\Model
* @throws \App\Classes\Exceptions\MalformedRequestException
*/
public function execute(Booking $model, int $status)
{
$model->status = $status;
return $this->handler($model);
}
}
@@ -52,7 +52,16 @@ class CreateInvoiceTransactionProcessor
private $updatesBookingStatus;
/** @var PDF */
private $pdf;
private $purchase_pdf;
/** @var PDF */
private $deliver_pdf;
/** @var PDF */
private $payment_pdf;
/** @var PDF */
private $supplier_pdf;
/**
* CreateInvoiceTransactionLogic constructor.
@@ -61,7 +70,7 @@ class CreateInvoiceTransactionProcessor
* @param GeneratesTransactionBillNumber $generatesTransactionBillNumber
* @param CalculatesBookingPaidAmount $calculatesBookingPaidAmount
*/
public function __construct(ListsTransactions $listsTransactions, CreatesTransaction $createsTransaction, GeneratesTransactionBillNumber $generatesTransactionBillNumber, CalculatesBookingPaidAmount $calculatesBookingPaidAmount, CalculatesBookingCurrencyAverageRate $calculatesBookingCurrencyAverageRate, FetchesCompany $fetchesCompany, CreatesDocument $createsDocument, CreatesFiles $createsFile, UpdatesBookingStatus $updatesBookingStatus, PDF $pdf)
public function __construct(ListsTransactions $listsTransactions, CreatesTransaction $createsTransaction, GeneratesTransactionBillNumber $generatesTransactionBillNumber, CalculatesBookingPaidAmount $calculatesBookingPaidAmount, CalculatesBookingCurrencyAverageRate $calculatesBookingCurrencyAverageRate, FetchesCompany $fetchesCompany, CreatesDocument $createsDocument, CreatesFiles $createsFile, UpdatesBookingStatus $updatesBookingStatus, PDF $purchase_pdf, PDF $deliver_pdf, PDF $payment_pdf, PDF $supplier_pdf)
{
$this->listsTransactions = $listsTransactions;
$this->generatesTransactionBillNumber = $generatesTransactionBillNumber;
@@ -72,7 +81,10 @@ class CreateInvoiceTransactionProcessor
$this->createsDocument = $createsDocument;
$this->createsFile = $createsFile;
$this->updatesBookingStatus = $updatesBookingStatus;
$this->pdf = $pdf;
$this->purchase_pdf = $purchase_pdf;
$this->deliver_pdf = $deliver_pdf;
$this->payment_pdf = $payment_pdf;
$this->supplier_pdf = $supplier_pdf;
}
/**
@@ -122,26 +134,52 @@ class CreateInvoiceTransactionProcessor
$supplier = $this->fetchesCompany->execute(['id' => $transaction->receiver]);
$pdf = $this->pdf->loadView('pages.pdfs.purchase_order', ['transaction' => $po_order_transaction, 'supplier' => $supplier]);
$purchase_order_pdf = $this->purchase_pdf->loadView('pages.pdfs.purchase_order', ['transaction' => $po_order_transaction, 'supplier' => $supplier]);
$document_object = new DocumentObject(
DocumentType::PURCHASE_ORDER,
[chunk_split('data:application/pdf;base64,'.base64_encode($pdf->output()))],
[chunk_split('data:application/pdf;base64,'.base64_encode($purchase_order_pdf->output()))],
'',
ApprovalStatus::COMPLETED,
'purchase_order'
'purchase_orders'
);
$document = $this->createsDocument->execute($po_order_transaction->booking, $document_object);
$this->createsFile->execute($document, $document_object);
$deliver_order_pdf = $this->deliver_pdf->loadView('pages.pdfs.deliver_order', ['transaction' => $po_order_transaction, 'supplier' => $supplier]);
$document_object = new DocumentObject(
DocumentType::DELIVER_ORDER,
[chunk_split('data:application/pdf;base64,'.base64_encode($deliver_order_pdf->output()))],
'',
ApprovalStatus::COMPLETED,
'deliver_orders'
);
$document = $this->createsDocument->execute($po_order_transaction->booking, $document_object);
$this->createsFile->execute($document, $document_object);
$payment_order_pdf = $this->payment_pdf->loadView('pages.pdfs.payment_order', ['transaction' => $po_order_transaction, 'supplier' => $supplier]);
$document_object = new DocumentObject(
DocumentType::PAYMENT_ORDER,
[chunk_split('data:application/pdf;base64,'.base64_encode($payment_order_pdf->output()))],
'',
ApprovalStatus::COMPLETED,
'payment_orders'
);
$document = $this->createsDocument->execute($po_order_transaction->booking, $document_object);
$this->createsFile->execute($document, $document_object);
$supplier_order_pdf = $this->supplier_pdf->loadView('pages.pdfs.supplier_order', ['transaction' => $po_order_transaction, 'supplier' => $supplier]);
$document_object = new DocumentObject(
DocumentType::SUPPLIER_ORDER,
[chunk_split('data:application/pdf;base64,'.base64_encode($supplier_order_pdf->output()))],
'',
ApprovalStatus::COMPLETED,
'supplier_orders'
);
$document = $this->createsDocument->execute($po_order_transaction->booking, $document_object);
$this->createsFile->execute($document, $document_object);
$transaction = $this->createsTransaction->execute($po_order_transaction->booking, $transaction_object);
$this->updatesBookingStatus->execute($booking, ApprovalStatus::COMPLETED);
// dd('yess');
}
}
}
@@ -19,6 +19,6 @@ final class DocumentType {
public const PURCHASE_ORDER = 'PURCHASE_ORDER';
public const DELIVER_ORDER = 'DELIVER_ORDER';
public const SUPPLIER_ORDER = 'SUPPLIER_ORDER';
public const PAYMENT_ORDER = 'PAYMENT_ORDER';
public const SUPPLIER_ORDER = 'SUPPLIER_ORDER';
}
+5
View File
@@ -7,6 +7,7 @@ use App\Classes\Modules\Bookings\Services\CalculatesBookingOutstanding;
use App\Classes\Modules\Bookings\Services\CalculatesBookingPaidAmount;
use App\Classes\ValueObjects\Constants\ApprovalStatus;
use App\Classes\ValueObjects\Constants\TransactionType;
use App\Classes\ValueObjects\Constants\DocumentType;
use Carbon\Carbon;
use Illuminate\Http\Resources\Json\JsonResource;
@@ -35,6 +36,10 @@ class BookingResource extends JsonResource
'fixed_currency' => new CurrencyResource($this->fixedCurrency),
'convertible_currency' => new CurrencyResource($this->convertibleCurrency),
'conversion_currency' => new CurrencyResource($this->conversionCurrency),
'purchase_order_document' => new DocumentResource($this->documents()->where('document_type', DocumentType::PURCHASE_ORDER)->first()),
'deliver_order_document' => new DocumentResource($this->documents()->where('document_type', DocumentType::DELIVER_ORDER)->first()),
'payment_order_document' => new DocumentResource($this->documents()->where('document_type', DocumentType::PAYMENT_ORDER)->first()),
'supplier_order_document' => new DocumentResource($this->documents()->where('document_type', DocumentType::SUPPLIER_ORDER)->first()),
'status' => $this->status,
'created_at' => Carbon::parse($this->created_at)->format('d-m-Y'),
$this->mergeWhen($this->relationLoaded('transactions'), [
+11 -1
View File
@@ -2,11 +2,13 @@
namespace App\Models;
use App\Classes\General\Interfaces\Documentable;
use App\Classes\ValueObjects\Constants\RoleTypes;
use App\Scopes\CustomerBookingsScope;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\Relations\MorphMany;
use Illuminate\Database\Eloquent\Relations\HasOne;
use Illuminate\Database\Eloquent\SoftDeletes;
@@ -22,7 +24,7 @@ use Illuminate\Database\Eloquent\SoftDeletes;
* @property \App\Models\Currency convertible_currency_id
* @property \App\Models\Currency conversion_currency_id
*/
class Booking extends AbstractModel
class Booking extends AbstractModel implements Documentable
{
use SoftDeletes;
@@ -78,6 +80,14 @@ class Booking extends AbstractModel
return $this->BelongsTo(Currency::class, 'conversion_currency_id');
}
/**
* @return MorphMany
*/
public function documents(): MorphMany
{
return $this->MorphMany(Document::class, 'owner');
}
/**
* @return HasMany
*/
@@ -222,6 +222,85 @@
</div>
</div>
</div>
<div class="row m-t-20" v-if="booking.status == 3">
<div class="col">
<div class="row m-b-10">
<div class="col">
<div class="font-head fs-10 all-caps">Invoice</div>
</div>
</div>
<div class="row">
<div class="col">
<div class="col p-t-10 p-b-10 p-r-0 bg-white">
<div v-if="booking.purchase_order_document" class="row align-items-end m-b-10 ">
<div class="col">
<div class="font-heading all-caps fs-10">Purchase Order:</div>
</div>
<div class="col-auto text-right">
<div class="col-auto no-padding m-r-5">
<document-file-viewr-component :file="booking.purchase_order_document.files[0]">
<template slot="button">
<div class="icon-thumbnail fs-11 text-white icon-25 bg-primary btn-rounded float-left m-r-5">
<i class="fa fa-file-image-o fs-10"></i>
</div>
</template>
</document-file-viewr-component>
</div>
</div>
</div>
<div v-if="booking.deliver_order_document" class="row align-items-end m-b-10 ">
<div class="col">
<div class="font-heading all-caps fs-10">Purchase Order:</div>
</div>
<div class="col-auto text-right">
<div class="col-auto no-padding m-r-5">
<document-file-viewr-component :file="booking.deliver_order_document.files[0]">
<template slot="button">
<div class="icon-thumbnail fs-11 text-white icon-25 bg-primary btn-rounded float-left m-r-5">
<i class="fa fa-file-image-o fs-10"></i>
</div>
</template>
</document-file-viewr-component>
</div>
</div>
</div>
<div v-if="booking.payment_order_document" class="row align-items-end m-b-10 ">
<div class="col">
<div class="font-heading all-caps fs-10">Purchase Order:</div>
</div>
<div class="col-auto text-right">
<div class="col-auto no-padding m-r-5">
<document-file-viewr-component :file="booking.payment_order_document.files[0]">
<template slot="button">
<div class="icon-thumbnail fs-11 text-white icon-25 bg-primary btn-rounded float-left m-r-5">
<i class="fa fa-file-image-o fs-10"></i>
</div>
</template>
</document-file-viewr-component>
</div>
</div>
</div>
<div v-if="booking.supplier_order_document" class="row align-items-end m-b-10 ">
<div class="col">
<div class="font-heading all-caps fs-10">Purchase Order:</div>
</div>
<div class="col-auto text-right">
<div class="col-auto no-padding m-r-5">
<document-file-viewr-component :file="booking.supplier_order_document.files[0]">
<template slot="button">
<div class="icon-thumbnail fs-11 text-white icon-25 bg-primary btn-rounded float-left m-r-5">
<i class="fa fa-file-image-o fs-10"></i>
</div>
</template>
</document-file-viewr-component>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="row m-t-20" v-if="booking.payment_history.length">
<div class="col">
<div class="row m-b-10">
+10 -10
View File
@@ -2,16 +2,16 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<style>
@font-face {
font-family: SimHei;
src: url('{{base_path().'/public/'}}simhei.ttf') format('truetype');
}
* {
font-family: SimHei, serif ;
}
</style>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<style>
@font-face {
font-family: SimHei;
src: url('{{base_path().'/public/'}}simhei.ttf') format('truetype');
}
* {
font-family: SimHei, serif ;
}
</style>
</head>
<body>
@@ -0,0 +1,57 @@
@extends('layouts.base_pdf')
@section('inner_content')
<style>
table, th, td {
border: 1px solid black;
border-collapse: collapse;
}
th, td {
padding: 15px;
}
</style>
<h1>Deliver Order</h1>
<table style="margin-bottom: 25px;">
<tbody>
<tr>
<td>{{$supplier->name}}</td>
<td>{{\Carbon\Carbon::now('Asia/Singapore')->format('d-m-Y h:s')}}</td>
</tr>
</tbody>
</table>
<table style="width:100%">
<tbody>
<tr>
<td>Reference</td>
<td>Amount</td>
<td>Bank in Details</td>
</tr>
<tr style="margin-bottom: 10px;">
<td>{{$transaction->booking->marking}}</td>
<td>MYR {{ $transaction->convert_original_amount() }}</td>
<td>Account Holder Name: {{$transaction->booking->bank->holder_name}}<br>{{$transaction->booking->bank->bank_name}}: {{$transaction->booking->bank->account_no}}
<br>Branch: 首都<br>Bank in Amount: {{$transaction->original_amount}}</td>
</tr>
</tbody>
</table>
<br>
<table style="width:100%">
<tbody>
<tr>
<td>Product Code</td>
<td>Product Name</td>
<td>Quantity</td>
<td>Price</td>
<td>Amount</td>
</tr>
@foreach($transaction->transactionDetails as $transaction_detail)
<tr style="margin-bottom: 10px;">
<td>{{ $transaction_detail->product_code }}</td>
<td>{{ $transaction_detail->product_name }}</td>
<td>{{ $transaction_detail->quantity }}</td>
<td>MYR {{ $transaction_detail->convert_original_price() }}</td>
<td>MYR {{ $transaction_detail->convert_original_amount() }}</td>
</tr>
@endforeach
</tbody>
</table>
@endsection
@@ -0,0 +1,57 @@
@extends('layouts.base_pdf')
@section('inner_content')
<style>
table, th, td {
border: 1px solid black;
border-collapse: collapse;
}
th, td {
padding: 15px;
}
</style>
<h1>Payment Order</h1>
<table style="margin-bottom: 25px;">
<tbody>
<tr>
<td>{{$supplier->name}}</td>
<td>{{\Carbon\Carbon::now('Asia/Singapore')->format('d-m-Y h:s')}}</td>
</tr>
</tbody>
</table>
<table style="width:100%">
<tbody>
<tr>
<td>Reference</td>
<td>Amount</td>
<td>Bank in Details</td>
</tr>
<tr style="margin-bottom: 10px;">
<td>{{$transaction->booking->marking}}</td>
<td>MYR {{ $transaction->convert_original_amount() }}</td>
<td>Account Holder Name: {{$transaction->booking->bank->holder_name}}<br>{{$transaction->booking->bank->bank_name}}: {{$transaction->booking->bank->account_no}}
<br>Branch: 首都<br>Bank in Amount: {{$transaction->original_amount}}</td>
</tr>
</tbody>
</table>
<br>
<table style="width:100%">
<tbody>
<tr>
<td>Product Code</td>
<td>Product Name</td>
<td>Quantity</td>
<td>Price</td>
<td>Amount</td>
</tr>
@foreach($transaction->transactionDetails as $transaction_detail)
<tr style="margin-bottom: 10px;">
<td>{{ $transaction_detail->product_code }}</td>
<td>{{ $transaction_detail->product_name }}</td>
<td>{{ $transaction_detail->quantity }}</td>
<td>MYR {{ $transaction_detail->convert_original_price() }}</td>
<td>MYR {{ $transaction_detail->convert_original_amount() }}</td>
</tr>
@endforeach
</tbody>
</table>
@endsection
@@ -9,6 +9,7 @@
padding: 15px;
}
</style>
<h1>Purchase Order</h1>
<table style="margin-bottom: 25px;">
<tbody>
<tr>
@@ -9,6 +9,7 @@
padding: 15px;
}
</style>
<h1>Purchase Order</h1>
<table style="margin-bottom: 25px;">
<tbody>
<tr>
@@ -21,17 +22,34 @@
<tbody>
<tr>
<td>Reference</td>
<td>Rate</td>
<td>Amount</td>
<td>Bank in Details</td>
</tr>
@foreach($transactions as $transaction)
<tr style="margin-bottom: 10px;">
<td>{{$transaction->booking->marking}}</td>
<td>{{$transaction->original_currency->short_code}} {{$transaction->original_amount}}</td>
<td>Account Holder Name: {{$transaction->booking->bank->holder_name}}<br>{{$transaction->booking->bank->bank_name}}: {{$transaction->booking->bank->account_no}}
<br>Branch: 首都<br>Bank in Amount: {{$transaction->original_amount}}</td>
</tr>
</tbody>
</table>
<br>
<table style="width:100%">
<tbody>
<tr>
<td>Product Code</td>
<td>Product Name</td>
<td>Quantity</td>
<td>Price</td>
<td>Amount</td>
</tr>
@foreach($transaction->transactionDetails as $transaction_detail)
<tr style="margin-bottom: 10px;">
<td>{{$transaction->booking->marking}}</td>
<td>{{$transaction->currency_rate}}</td>
<td>{{$transaction->original_currency->short_code}} {{$transaction->original_amount}}</td>
<td>Account Holder Name: {{$transaction->booking->bank->holder_name}}<br>{{$transaction->booking->bank->bank_name}}: {{$transaction->booking->bank->account_no}}
<br>Branch: 首都<br>Bank in Amount: {{$transaction->original_amount}}</td>
<td>{{ $transaction_detail->product_code }}</td>
<td>{{ $transaction_detail->product_name }}</td>
<td>{{ $transaction_detail->quantity }}</td>
<td>{{$transaction->original_currency->short_code}} {{ $transaction_detail->price }}</td>
<td>{{$transaction->original_currency->short_code}} {{ $transaction_detail->amount }}</td>
</tr>
@endforeach
</tbody>