diff --git a/app/Abstracts/View/Components/TransferShow.php b/app/Abstracts/View/Components/TransferShow.php new file mode 100644 index 000000000..ba62cd890 --- /dev/null +++ b/app/Abstracts/View/Components/TransferShow.php @@ -0,0 +1,721 @@ +transfer = $transfer; + $this->transferTemplate = $this->getTransferTemplate($transferTemplate); + $this->payment_methods = ($payment_methods) ?: Modules::getPaymentMethods('all'); + $this->date_format = $this->getCompanyDateFormat(); + + // Navbar Hide + $this->hideButtonAddNew = $hideButtonAddNew; + $this->hideButtonMoreActions = $hideButtonMoreActions; + $this->hideButtonEdit = $hideButtonEdit; + $this->hideButtonDuplicate = $hideButtonDuplicate; + $this->hideButtonPrint = $hideButtonPrint; + $this->hideButtonShare = $hideButtonShare; + $this->hideButtonEmail = $hideButtonEmail; + $this->hideButtonPdf = $hideButtonPdf; + $this->hideButtonTemplate = $hideButtonTemplate; + $this->hideButtonDelete = $hideButtonDelete; + $this->hideButtonGroupDivider1 = $hideButtonGroupDivider1; + $this->hideButtonGroupDivider2 = $hideButtonGroupDivider2; + $this->hideButtonGroupDivider3 = $hideButtonGroupDivider3; + + // Navbar Permission + $this->permissionCreate = $this->getPermissionCreate($permissionCreate); + $this->permissionUpdate = $this->getPermissionUpdate($permissionUpdate); + $this->permissionDelete = $this->getPermissionDelete($permissionDelete); + + // Navbar route + $this->routeButtonAddNew = $this->getRouteButtonAddNew($routeButtonAddNew); + $this->routeButtonEdit = $this->getRouteButtonEdit($routeButtonEdit); + $this->routeButtonDuplicate = $this->getRouteButtonDuplicate($routeButtonDuplicate); + $this->routeButtonPrint = $this->getRouteButtonPrint($routeButtonPrint); + $this->signedUrl = $this->getSignedUrl($signedUrl); + $this->routeButtonEmail = $this->getRouteButtonEmail($routeButtonEmail); + $this->routeButtonPdf = $this->getRouteButtonPdf($routeButtonPdf); + $this->routeButtonDelete = $this->getRouteButtonDelete($routeButtonDelete); + + // Navbar Text + $this->textDeleteModal = $textDeleteModal; + + // Header Hide + $this->hideHeader = $hideHeader; + + $this->hideHeaderFromAccount = $hideHeaderFromAccount; + $this->hideHeaderToAccount = $hideHeaderToAccount; + $this->hideHeaderToAccount = $hideHeaderToAccount; + $this->hideHeaderAmount = $hideHeaderAmount; + $this->hideHeaderPaidAt = $hideHeaderPaidAt; + + // Header Text + $this->textHeaderFromAccount = $this->getTextHeaderFromAccount($textHeaderFromAccount); + $this->textHeaderToAccount = $this->getTextHeaderToAccount($textHeaderToAccount); + $this->textHeaderAmount = $this->getTextHeaderAmount($textHeaderAmount); + $this->textHeaderPaidAt = $this->gettextHeaderPaidAt($textHeaderPaidAt); + + // Header Class + $this->classHeaderFromAccount = $this->getclassHeaderFromAccount($classHeaderFromAccount); + $this->classHeaderToAccount = $this->getClassHeaderToAccount($classHeaderToAccount); + $this->classHeaderAmount = $this->getClassHeaderAmount($classHeaderAmount); + $this->classHeaderPaidAt = $this->getclassHeaderPaidAt($classHeaderPaidAt); + + // From account Hide + $this->hideFromAccount = $hideFromAccount; + $this->hideFromAccountTitle = $hideFromAccountTitle; + $this->hideFromAccountName = $hideFromAccountName; + $this->hideFromAccountNumber = $hideFromAccountNumber; + $this->hideFromAccountBankName = $hideFromAccountBankName; + $this->hideFromAccountBankPhone = $hideFromAccountBankPhone; + $this->hideFromAccountBankAddress = $hideFromAccountBankAddress; + + // From account text + $this->textFromAccountTitle = $this->getTextFromAccountTitle($textFromAccountTitle); + $this->textFromAccountNumber = $this->getTextFromAccountNumber($textFromAccountNumber); + + // To account Hide + $this->hideToAccount = $hideToAccount; + $this->hideToAccountTitle = $hideToAccountTitle; + $this->hideToAccountName = $hideToAccountName; + $this->hideToAccountNumber = $hideToAccountNumber; + $this->hideToAccountBankName = $hideToAccountBankName; + $this->hideToAccountBankPhone = $hideToAccountBankPhone; + $this->hideToAccountBankAddress = $hideToAccountBankAddress; + + // To account text + $this->textToAccountTitle = $this->getTextToAccountTitle($textToAccountTitle); + $this->textToAccountNumber = $this->getTextToAccountNumber($textToAccountNumber); + + // Detail Information Hide checker + $this->hideDetails = $hideDetails; + $this->hideDetailTitle = $hideDetailTitle; + $this->hideDetailDate = $hideDetailDate; + $this->hideDetailPaymentMethod = $hideDetailPaymentMethod; + $this->hideDetailReference = $hideDetailReference; + $this->hideDetailDescription = $hideDetailDescription; + $this->hideDetailAmount = $hideDetailAmount; + + // Releated Information Text + $this->textDetailTitle = $this->getTextDetailTitle($textDetailTitle); + $this->textDetailDate = $this->getTextDetailDate($textDetailDate); + $this->textDetailPaymentMethod = $this->getTextDetailPaymentMethod($textDetailPaymentMethod); + $this->textDetailReference = $this->getTextDetailReference($textDetailReference); + $this->textDetailDescription = $this->getTextDetailDescription($textDetailDescription); + $this->textDetailAmount = $this->getTextDetailAmount($textDetailAmount); + + // Hide Attachment + $this->hideAttachment = $hideAttachment; + + // Attachment data.. + $this->attachment = ''; + + if (!empty($attachment)) { + $this->attachment = $attachment; + } else if (!empty($transfer)) { + $this->attachment = $transfer->attachment; + } + + // Histories Hide + $this->hideFooter = $hideFooter; + $this->hideFooterHistories = $hideFooterHistories; + + // Histories + $this->histories = $this->getHistories($histories); + $this->textHistories = $this->getTextHistories($textHistories); + $this->classFooterHistories = $this->getClassFooterHistories($classFooterHistories); + } + + protected function getTransferTemplate($transferTemplate) + { + if (!empty($transferTemplate)) { + return $transferTemplate; + } + + return setting('transfer.template'); + } + + protected function getRouteButtonAddNew($routeButtonAddNew) + { + if (!empty($routeButtonAddNew)) { + return $routeButtonAddNew; + } + + return 'transfers.create'; + } + + protected function getRouteButtonEdit($routeButtonEdit) + { + if (!empty($routeButtonEdit)) { + return $routeButtonEdit; + } + + return 'transfers.edit'; + } + + protected function getRouteButtonDuplicate($routeButtonDuplicate) + { + if (!empty($routeButtonDuplicate)) { + return $routeButtonDuplicate; + } + + return 'transfers.duplicate'; + } + + protected function getRouteButtonPrint($routeButtonPrint) + { + if (!empty($routeButtonPrint)) { + return $routeButtonPrint; + } + + return 'transfers.print'; + } + + protected function getSignedUrl($signedUrl) + { + if (!empty($signedUrl)) { + return $signedUrl; + } + + try { + $signedUrl = URL::signedRoute('signed.transfer.show', [$this->transfer->id]); + } catch (\Exception $e) { + $signedUrl = false; + } + + return $signedUrl; + } + + protected function getRouteButtonEmail($routeButtonEmail) + { + if (!empty($routeButtonEmail)) { + return $routeButtonEmail; + } + + return 'transfers.email'; + } + + protected function getRouteButtonPdf($routeButtonPdf) + { + if (!empty($routeButtonPdf)) { + return $routeButtonPdf; + } + + return 'transfers.pdf'; + } + + protected function getRouteButtonDelete($routeButtonDelete) + { + if (!empty($routeButtonDelete)) { + return $routeButtonDelete; + } + + return 'transfers.destroy'; + } + + protected function getPermissionCreate($permissionCreate) + { + if (!empty($permissionCreate)) { + return $permissionCreate; + } + + return 'create-banking-transfers'; + } + + protected function getPermissionUpdate($permissionUpdate) + { + if (!empty($permissionUpdate)) { + return $permissionUpdate; + } + + return 'update-banking-transfers'; + } + + protected function getPermissionDelete($permissionDelete) + { + if (!empty($permissionDelete)) { + return $permissionDelete; + } + + return 'delete-banking-transfers'; + } + + protected function getTextHeaderFromAccount($textHeaderFromAccount) + { + if (!empty($textHeaderFromAccount)) { + return $textHeaderFromAccount; + } + + return 'transfers.from_account'; + } + + protected function getTextHeaderToAccount($textHeaderToAccount) + { + if (!empty($textHeaderToAccount)) { + return $textHeaderToAccount; + } + + return 'transfers.to_account'; + } + + protected function getTextHeaderAmount($textHeaderAmount) + { + if (!empty($textHeaderAmount)) { + return $textHeaderAmount; + } + + return 'general.amount'; + } + + protected function getTextHeaderPaidAt($textHeaderPaidAt) + { + if (!empty($textHeaderPaidAt)) { + return $textHeaderPaidAt; + } + + return 'general.date'; + } + + protected function getClassHeaderFromAccount($classHeaderFromAccount) + { + if (!empty($classHeaderFromAccount)) { + return $classHeaderFromAccount; + } + + return 'col-4 col-lg-2'; + } + + protected function getClassHeaderToAccount($classHeaderToAccount) + { + if (!empty($classHeaderToAccount)) { + return $classHeaderToAccount; + } + + return 'col-4 col-lg-6'; + } + + protected function getClassHeaderAmount($classHeaderAmount) + { + if (!empty($classHeaderAmount)) { + return $classHeaderAmount; + } + + return 'col-4 col-lg-2 float-right'; + } + + protected function getClassHeaderPaidAt($classHeaderPaidAt) + { + if (!empty($classHeaderPaidAt)) { + return $classHeaderPaidAt; + } + + return 'col-4 col-lg-2'; + } + + protected function getTextFromAccountTitle($textToAccountTitle) + { + if (!empty($textToAccountTitle)) { + return $textToAccountTitle; + } + + return 'transfers.from_account'; + } + + protected function getTextFromAccountNumber($textFromAccountNumber) + { + if (!empty($textFromAccountNumber)) { + return $textFromAccountNumber; + } + + return 'accounts.number'; + } + + protected function getTextToAccountTitle($textFromAccountTitle) + { + if (!empty($textFromAccountTitle)) { + return $textFromAccountTitle; + } + + return 'transfers.to_account'; + } + + protected function getTextToAccountNumber($textToAccountNumber) + { + if (!empty($textToAccountNumber)) { + return $textToAccountNumber; + } + + return 'accounts.number'; + } + + protected function getTextDetailTitle($textDetailTitle) + { + if (!empty($textDetailTitle)) { + return $textDetailTitle; + } + + return 'transfers.details'; + } + + protected function getTextDetailDate($textDetailDate) + { + if (!empty($textDetailDate)) { + return $textDetailDate; + } + + return 'general.date'; + } + + protected function getTextDetailPaymentMethod($textDetailPaymentMethod) + { + if (!empty($textDetailPaymentMethod)) { + return $textDetailPaymentMethod; + } + + return 'general.payment_methods'; + } + + protected function getTextDetailReference($textDetailReference) + { + if (!empty($textDetailReference)) { + return $textDetailReference; + } + + return 'general.reference'; + } + + protected function getTextDetailDescription($textDetailDescription) + { + if (!empty($textDetailDescription)) { + return $textDetailDescription; + } + + return 'general.description'; + } + + protected function getTextDetailAmount($textDetailAmount) + { + if (!empty($textDetailAmount)) { + return $textDetailAmount; + } + + return 'general.amount'; + } + + protected function getHistories($histories) + { + if (!empty($histories)) { + return $histories; + } + + $histories[] = $this->transfer; + + return $histories; + } + + protected function getTextHistories($textHistories) + { + if (!empty($textHistories)) { + return $textHistories; + } + + return 'invoices.histories'; + } + + protected function getClassFooterHistories($classFooterHistories) + { + if (!empty($classFooterHistories)) { + return $classFooterHistories; + } + + return 'col-sm-6 col-md-6 col-lg-6 col-xl-6'; + } +} diff --git a/app/Abstracts/View/Components/TransferTemplate.php b/app/Abstracts/View/Components/TransferTemplate.php new file mode 100644 index 000000000..b1b11725b --- /dev/null +++ b/app/Abstracts/View/Components/TransferTemplate.php @@ -0,0 +1,278 @@ +transfer = $transfer; + + $this->payment_methods = ($payment_methods) ?: Modules::getPaymentMethods('all'); + + // From account Hide + $this->hideFromAccount = $hideFromAccount; + $this->hideFromAccountTitle = $hideFromAccountTitle; + $this->hideFromAccountName = $hideFromAccountName; + $this->hideFromAccountNumber = $hideFromAccountNumber; + $this->hideFromAccountBankName = $hideFromAccountBankName; + $this->hideFromAccountBankPhone = $hideFromAccountBankPhone; + $this->hideFromAccountBankAddress = $hideFromAccountBankAddress; + + // From account text + $this->textFromAccountTitle = $this->getTextFromAccountTitle($textFromAccountTitle); + $this->textFromAccountNumber = $this->getTextFromAccountNumber($textFromAccountNumber); + + // To account Hide + $this->hideToAccount = $hideToAccount; + $this->hideToAccountTitle = $hideToAccountTitle; + $this->hideToAccountName = $hideToAccountName; + $this->hideToAccountNumber = $hideToAccountNumber; + $this->hideToAccountBankName = $hideToAccountBankName; + $this->hideToAccountBankPhone = $hideToAccountBankPhone; + $this->hideToAccountBankAddress = $hideToAccountBankAddress; + + // To account text + $this->textToAccountTitle = $this->getTextToAccountTitle($textToAccountTitle); + $this->textToAccountNumber = $this->getTextToAccountNumber($textToAccountNumber); + + // Detail Information Hide checker + $this->hideDetails = $hideDetails; + $this->hideDetailTitle = $hideDetailTitle; + $this->hideDetailDate = $hideDetailDate; + $this->hideDetailPaymentMethod = $hideDetailPaymentMethod; + $this->hideDetailReference = $hideDetailReference; + $this->hideDetailDescription = $hideDetailDescription; + $this->hideDetailAmount = $hideDetailAmount; + + // Releated Information Text + $this->textDetailTitle = $this->getTextDetailTitle($textDetailTitle); + $this->textDetailDate = $this->getTextDetailDate($textDetailDate); + $this->textDetailPaymentMethod = $this->getTextDetailPaymentMethod($textDetailPaymentMethod); + $this->textDetailReference = $this->getTextDetailReference($textDetailReference); + $this->textDetailDescription = $this->getTextDetailDescription($textDetailDescription); + $this->textDetailAmount = $this->getTextDetailAmount($textDetailAmount); + } + + protected function getTextFromAccountTitle($textToAccountTitle) + { + if (!empty($textToAccountTitle)) { + return $textToAccountTitle; + } + + return 'transfers.from_account'; + } + + protected function getTextFromAccountNumber($textFromAccountNumber) + { + if (!empty($textFromAccountNumber)) { + return $textFromAccountNumber; + } + + return 'accounts.number'; + } + + protected function getTextToAccountTitle($textFromAccountTitle) + { + if (!empty($textFromAccountTitle)) { + return $textFromAccountTitle; + } + + return 'transfers.to_account'; + } + + protected function getTextToAccountNumber($textToAccountNumber) + { + if (!empty($textToAccountNumber)) { + return $textToAccountNumber; + } + + return 'accounts.number'; + } + + protected function getTextDetailTitle($textDetailTitle) + { + if (!empty($textDetailTitle)) { + return $textDetailTitle; + } + + return 'transfers.details'; + } + + protected function getTextDetailDate($textDetailDate) + { + if (!empty($textDetailDate)) { + return $textDetailDate; + } + + return 'general.date'; + } + + protected function getTextDetailPaymentMethod($textDetailPaymentMethod) + { + if (!empty($textDetailPaymentMethod)) { + return $textDetailPaymentMethod; + } + + return 'general.payment_methods'; + } + + protected function getTextDetailReference($textDetailReference) + { + if (!empty($textDetailReference)) { + return $textDetailReference; + } + + return 'general.reference'; + } + + protected function getTextDetailDescription($textDetailDescription) + { + if (!empty($textDetailDescription)) { + return $textDetailDescription; + } + + return 'general.description'; + } + + protected function getTextDetailAmount($textDetailAmount) + { + if (!empty($textDetailAmount)) { + return $textDetailAmount; + } + + return 'general.amount'; + } +} diff --git a/app/Events/Banking/TransferPrinting.php b/app/Events/Banking/TransferPrinting.php new file mode 100644 index 000000000..e7721975d --- /dev/null +++ b/app/Events/Banking/TransferPrinting.php @@ -0,0 +1,22 @@ +transfer = $transfer; + } +} diff --git a/app/Http/Controllers/Banking/Transfers.php b/app/Http/Controllers/Banking/Transfers.php index 35a72318b..0a975b60f 100644 --- a/app/Http/Controllers/Banking/Transfers.php +++ b/app/Http/Controllers/Banking/Transfers.php @@ -15,6 +15,7 @@ use App\Models\Banking\Transfer; use App\Models\Setting\Currency; use App\Utilities\Modules; use Date; +use Illuminate\Support\Str; class Transfers extends Controller { @@ -37,9 +38,9 @@ class Transfers extends Controller * * @return Response */ - public function show() + public function show(Transfer $transfer) { - return redirect()->route('transfers.index'); + return view('banking.transfers.show', compact('transfer')); } /** @@ -53,11 +54,19 @@ class Transfers extends Controller $payment_methods = Modules::getPaymentMethods(); - $currencies = Currency::enabled()->orderBy('name')->get()->makeHidden(['id', 'company_id', 'created_at', 'updated_at', 'deleted_at']); - $currency = Currency::where('code', setting('default.currency'))->first(); - return view('banking.transfers.create', compact('accounts', 'payment_methods', 'currencies', 'currency')); + $file_type_mimes = explode(',', config('filesystems.mimes')); + + $file_types = []; + + foreach ($file_type_mimes as $mime) { + $file_types[] = '.' . $mime; + } + + $file_types = implode(',', $file_types); + + return view('banking.transfers.create', compact('accounts', 'payment_methods', 'currency', 'file_types')); } /** @@ -72,7 +81,7 @@ class Transfers extends Controller $response = $this->ajaxDispatch(new CreateTransfer($request)); if ($response['success']) { - $response['redirect'] = route('transfers.index'); + $response['redirect'] = route('transfers.show', $response['data']->id); $message = trans('messages.success.added', ['type' => trans_choice('general.transfers', 1)]); @@ -88,6 +97,24 @@ class Transfers extends Controller return response()->json($response); } + /** + * Duplicate the specified resource. + * + * @param Transfer $transfer + * + * @return Response + */ + public function duplicate(Transfer $transfer) + { + $clone = $transfer->duplicate(); + + $message = trans('messages.success.duplicated', ['type' => trans_choice('general.transfers', 1)]); + + flash($message)->success(); + + return redirect()->route('transfers.show', $clone->id); + } + /** * Import the specified resource. * @@ -139,11 +166,19 @@ class Transfers extends Controller $account = $transfer->expense_transaction->account; - $currencies = Currency::enabled()->orderBy('name')->get()->makeHidden(['id', 'company_id', 'created_at', 'updated_at', 'deleted_at']); - $currency = Currency::where('code', $account->currency_code)->first(); - return view('banking.transfers.edit', compact('transfer', 'accounts', 'payment_methods', 'currencies', 'currency')); + $file_type_mimes = explode(',', config('filesystems.mimes')); + + $file_types = []; + + foreach ($file_type_mimes as $mime) { + $file_types[] = '.' . $mime; + } + + $file_types = implode(',', $file_types); + + return view('banking.transfers.edit', compact('transfer', 'accounts', 'payment_methods', 'currency', 'file_types')); } /** @@ -159,7 +194,7 @@ class Transfers extends Controller $response = $this->ajaxDispatch(new UpdateTransfer($transfer, $request)); if ($response['success']) { - $response['redirect'] = route('transfers.index'); + $response['redirect'] = route('transfers.show', $transfer->id); $message = trans('messages.success.updated', ['type' => trans_choice('general.transfers', 1)]); @@ -210,4 +245,46 @@ class Transfers extends Controller { return $this->exportExcel(new Export, trans_choice('general.transfers', 2)); } + + /** + * Print the transfer. + * + * @param Transfer $transfer + * + * @return Response + */ + public function printTransfer(Transfer $transfer) + { + event(new \App\Events\Banking\TransferPrinting($transfer)); + + $view = view($transfer->template_path, compact('transfer')); + + return mb_convert_encoding($view, 'HTML-ENTITIES', 'UTF-8'); + } + + /** + * Download the PDF file of transfer. + * + * @param Transfer $transfer + * + * @return Response + */ + public function pdfTransfer(Transfer $transfer) + { + event(new \App\Events\Banking\TransferPrinting($transfer)); + + $currency_style = true; + + $view = view($transfer->template_path, compact('transfer', 'currency_style'))->render(); + $html = mb_convert_encoding($view, 'HTML-ENTITIES', 'UTF-8'); + + $pdf = app('dompdf.wrapper'); + $pdf->loadHTML($html); + + //$pdf->setPaper('A4', 'portrait'); + + $file_name = trans_choice('general.transfers', 1) . '-' . Str::slug($transfer->id, '-', language()->getShortCode()) . '-' . time() . '.pdf'; + + return $pdf->download($file_name); + } } diff --git a/app/Http/Controllers/Modals/TransferTemplates.php b/app/Http/Controllers/Modals/TransferTemplates.php new file mode 100644 index 000000000..022545ecd --- /dev/null +++ b/app/Http/Controllers/Modals/TransferTemplates.php @@ -0,0 +1,67 @@ +middleware('permission:create-settings-settings')->only('create', 'store'); + $this->middleware('permission:read-settings-settings')->only('index', 'edit'); + $this->middleware('permission:update-settings-settings')->only('update', 'enable', 'disable'); + $this->middleware('permission:delete-settings-settings')->only('destroy'); + } + + /** + * Update the specified resource in storage. + * + * @param Request $request + * + * @return Response + */ + public function update(Request $request) + { + $fields = $request->all(); + $prefix = $request->get('_prefix', 'transfer'); + $company_id = $request->get('company_id'); + + if (empty($company_id)) { + $company_id = company_id(); + } + + foreach ($fields as $key => $value) { + $real_key = $prefix . '.' . $key; + + // Don't process unwanted keys + if (in_array($key, $this->skip_keys)) { + continue; + } + + setting()->set($real_key, $value); + } + + // Save all settings + setting()->save(); + + $message = trans('messages.success.updated', ['type' => trans_choice('general.settings', 2)]); + + $response = [ + 'status' => null, + 'success' => true, + 'error' => false, + 'message' => $message, + 'data' => null, + 'redirect' => route('settings.invoice.edit'), + ]; + + flash($message)->success(); + + return response()->json($response); + } +} diff --git a/app/Jobs/Banking/CreateTransfer.php b/app/Jobs/Banking/CreateTransfer.php index ce87338f8..7f5927774 100644 --- a/app/Jobs/Banking/CreateTransfer.php +++ b/app/Jobs/Banking/CreateTransfer.php @@ -84,6 +84,15 @@ class CreateTransfer extends Job 'expense_transaction_id' => $expense_transaction->id, 'income_transaction_id' => $income_transaction->id, ]); + + // Upload attachment + if ($this->request->file('attachment')) { + foreach ($this->request->file('attachment') as $attachment) { + $media = $this->getMedia($attachment, 'transfers'); + + $this->transfer->attachMedia($media, 'attachment'); + } + } }); return $this->transfer; diff --git a/app/Jobs/Banking/UpdateTransfer.php b/app/Jobs/Banking/UpdateTransfer.php index 81a11b8ba..23fb96b51 100644 --- a/app/Jobs/Banking/UpdateTransfer.php +++ b/app/Jobs/Banking/UpdateTransfer.php @@ -38,6 +38,19 @@ class UpdateTransfer extends Job public function handle() { \DB::transaction(function () { + // Upload attachment + if ($this->request->file('attachment')) { + $this->deleteMediaModel($this->transfer, 'attachment', $this->request); + + foreach ($this->request->file('attachment') as $attachment) { + $media = $this->getMedia($attachment, 'transfers'); + + $this->transfer->attachMedia($media, 'attachment'); + } + } elseif (!$this->request->file('attachment') && $this->transfer->attachment) { + $this->deleteMediaModel($this->transfer, 'attachment', $this->request); + } + $expense_currency_code = $this->getCurrencyCode('from'); $income_currency_code = $this->getCurrencyCode('to'); diff --git a/app/Models/Banking/Transfer.php b/app/Models/Banking/Transfer.php index aa2664e0e..862138f43 100644 --- a/app/Models/Banking/Transfer.php +++ b/app/Models/Banking/Transfer.php @@ -3,16 +3,20 @@ namespace App\Models\Banking; use App\Abstracts\Model; +use App\Models\Common\Media as MediaModel; use App\Traits\Currencies; +use App\Traits\Media; use Illuminate\Database\Eloquent\Factories\HasFactory; use Znck\Eloquent\Traits\BelongsToThrough; class Transfer extends Model { - use BelongsToThrough, Currencies, HasFactory; + use BelongsToThrough, Currencies, HasFactory, Media; protected $table = 'transfers'; + protected $appends = ['attachment']; + /** * Attributes that should be mass-assignable. * @@ -59,6 +63,36 @@ class Transfer extends Model )->withDefault(['name' => trans('general.na')]); } + /** + * Get the current balance. + * + * @return string + */ + public function getAttachmentAttribute($value = null) + { + if (!empty($value) && !$this->hasMedia('attachment')) { + return $value; + } elseif (!$this->hasMedia('attachment')) { + return false; + } + + return $this->getMedia('attachment')->all(); + } + + public function delete_attachment() + { + if ($attachments = $this->attachment) { + foreach ($attachments as $file) { + MediaModel::where('id', $file->id)->delete(); + } + } + } + + public function getTemplatePathAttribute($value = null) + { + return $value ?: 'banking.transfers.print_' . setting('transfer.template'); + } + /** * Create a new factory instance for the model. * diff --git a/app/View/Components/Transfers/Script.php b/app/View/Components/Transfers/Script.php new file mode 100644 index 000000000..19df6f1a2 --- /dev/null +++ b/app/View/Components/Transfers/Script.php @@ -0,0 +1,55 @@ +type = $type; + $this->scriptFile = ($scriptFile) ? $scriptFile : 'public/js/banking/transfers.js'; + $this->version = $this->getVersion($version); + $this->transfer = $transfer; + } + + /** + * Get the view / contents that represent the component. + * + * @return \Illuminate\Contracts\View\View|string + */ + public function render() + { + return view('components.transfers.script'); + } + + protected function getVersion($version) + { + if (!empty($version)) { + return $version; + } + + if ($alias = config('type.' . $this->type . '.alias')) { + return module_version($alias); + } + + return version('short'); + } +} diff --git a/app/View/Components/Transfers/Show/Attachment.php b/app/View/Components/Transfers/Show/Attachment.php new file mode 100644 index 000000000..e89a9c9e0 --- /dev/null +++ b/app/View/Components/Transfers/Show/Attachment.php @@ -0,0 +1,18 @@ + env('SETTING_FALLBACK_TRANSACTION_TYPE_EXPENSE', 'expense'), ], ], + 'transfer' => [ + 'template' => env('SETTING_FALLBACK_BANKING_TEMPLATE', 'default'), + ], ], /* diff --git a/public/img/transfer_templates/default.png b/public/img/transfer_templates/default.png new file mode 100644 index 000000000..ec891524e Binary files /dev/null and b/public/img/transfer_templates/default.png differ diff --git a/public/img/transfer_templates/second.png b/public/img/transfer_templates/second.png new file mode 100644 index 000000000..192abaaf6 Binary files /dev/null and b/public/img/transfer_templates/second.png differ diff --git a/public/img/transfer_templates/third.png b/public/img/transfer_templates/third.png new file mode 100644 index 000000000..eb3f55ecf Binary files /dev/null and b/public/img/transfer_templates/third.png differ diff --git a/resources/assets/js/views/banking/transfers.js b/resources/assets/js/views/banking/transfers.js index 65fb2cf87..57f74e702 100644 --- a/resources/assets/js/views/banking/transfers.js +++ b/resources/assets/js/views/banking/transfers.js @@ -19,7 +19,7 @@ import BulkAction from './../../plugins/bulk-action'; Vue.use(DashboardPlugin); const app = new Vue({ - el: '#app', + el: '#main-body', mixins: [ Global @@ -30,6 +30,15 @@ const app = new Vue({ form: new Form('transfer'), bulk_action: new BulkAction('transfers'), show_rate: false, + + transfer_form: new Form('template'), + template: { + modal: false, + title: '', + message: '', + html: '', + errors: new Error() + }, } }, @@ -87,5 +96,35 @@ const app = new Vue({ } }); }, + + onTemplate() { + this.template.modal = true; + + this.transfer_form = new Form('template'); + + this.transfer_form.template = this.transfer_form._template; + }, + + addTemplate() { + if (this.transfer_form.template != 1) { + + this.transfer_form.submit(); + + this.template.errors = this.transfer_form.errors; + } + + this.form.loading = true; + + this.$emit("confirm"); + }, + + closeTemplate() { + this.template = { + modal: false, + title: '', + message: '', + errors: this.transfer_form.errors + }; + }, } }); diff --git a/resources/lang/en-GB/transfers.php b/resources/lang/en-GB/transfers.php index 551bcae00..93145b053 100644 --- a/resources/lang/en-GB/transfers.php +++ b/resources/lang/en-GB/transfers.php @@ -6,6 +6,7 @@ return [ 'from_account_rate' => 'From Account Rate', 'to_account' => 'To Account', 'to_account_rate' => 'To Account Rate', + 'details' => 'Detail|Details', 'messages' => [ 'delete' => ':from to :to (:amount)', diff --git a/resources/views/banking/transfers/create.blade.php b/resources/views/banking/transfers/create.blade.php index 7e2db5f79..592341aaa 100644 --- a/resources/views/banking/transfers/create.blade.php +++ b/resources/views/banking/transfers/create.blade.php @@ -41,6 +41,8 @@ {{ Form::textGroup('reference', trans('general.reference'), 'file', []) }} + {{ Form::fileGroup('attachment', trans('general.attachment'), '', ['dropzone-class' => 'w-100', 'multiple' => 'multiple', 'options' => ['acceptedFiles' => $file_types]], null , 'col-md-12') }} + {!! Form::hidden('currency_code', null, ['id' => 'currency_code', 'v-model' => 'form.currency_code']) !!} {!! Form::hidden('currency_rate', null, ['id' => 'currency_rate', 'v-model' => 'form.currency_rate']) !!} diff --git a/resources/views/banking/transfers/edit.blade.php b/resources/views/banking/transfers/edit.blade.php index 934c888da..14e8576ad 100644 --- a/resources/views/banking/transfers/edit.blade.php +++ b/resources/views/banking/transfers/edit.blade.php @@ -42,6 +42,8 @@ {{ Form::textGroup('reference', trans('general.reference'), 'file', []) }} + {{ Form::fileGroup('attachment', trans('general.attachment'), '', ['dropzone-class' => 'w-100', 'multiple' => 'multiple', 'options' => ['acceptedFiles' => $file_types]], !empty($transfer) ? $transfer->attachment : null , 'col-md-12') }} + {!! Form::hidden('currency_code', $currency->code, ['id' => 'currency_code', 'v-model' => 'form.currency_code']) !!} {!! Form::hidden('currency_rate', $currency->rate, ['id' => 'currency_rate', 'v-model' => 'form.currency_rate']) !!} diff --git a/resources/views/banking/transfers/index.blade.php b/resources/views/banking/transfers/index.blade.php index e8b5f17b9..2ee546e3b 100644 --- a/resources/views/banking/transfers/index.blade.php +++ b/resources/views/banking/transfers/index.blade.php @@ -52,7 +52,7 @@ @endphp {{ Form::bulkActionGroup($item->id, $item->expense_transaction->account->name) }} - @date($item->expense_transaction->paid_at) + @date($item->expense_transaction->paid_at) {{ $item->expense_transaction->account->name }} {{ $item->income_transaction->account->name }} @money($item->expense_transaction->amount, $item->expense_transaction->currency_code, true) @@ -62,6 +62,8 @@