1
0
mirror of https://github.com/invoiceninja/invoiceninja.git synced 2024-11-10 05:02:36 +01:00
invoiceninja/app/Ninja/Repositories/DocumentRepository.php

232 lines
8.5 KiB
PHP
Raw Normal View History

2017-01-30 20:40:43 +01:00
<?php
namespace App\Ninja\Repositories;
2016-03-23 03:23:45 +01:00
use App\Models\Document;
2017-01-30 20:40:43 +01:00
use DB;
2016-03-24 16:58:30 +01:00
use Form;
2017-01-30 20:40:43 +01:00
use Intervention\Image\ImageManager;
use Utils;
2016-03-23 03:23:45 +01:00
class DocumentRepository extends BaseRepository
{
2016-07-21 14:35:23 +02:00
// Expenses
2016-03-23 03:23:45 +01:00
public function getClassName()
{
return 'App\Models\Document';
}
public function all()
{
return Document::scope()
->with('user')
->get();
}
public function find()
{
$accountid = \Auth::user()->account_id;
$query = DB::table('clients')
->join('accounts', 'accounts.id', '=', 'clients.account_id')
->leftjoin('clients', 'clients.id', '=', 'clients.client_id')
->where('documents.account_id', '=', $accountid)
->select(
'documents.account_id',
'documents.path',
'documents.deleted_at',
'documents.size',
'documents.width',
'documents.height',
'documents.id',
'documents.is_deleted',
'documents.public_id',
'documents.invoice_id',
'documents.expense_id',
'documents.user_id',
'invoices.public_id as invoice_public_id',
'invoices.user_id as invoice_user_id',
'expenses.public_id as expense_public_id',
'expenses.user_id as expense_user_id'
);
return $query;
}
2017-01-30 20:40:43 +01:00
public function upload($data, &$doc_array = null)
2016-03-23 03:23:45 +01:00
{
2018-02-12 16:35:57 +01:00
if (! empty($data['files']) && is_array($data['files'])) {
$uploaded = $data['files'][0];
} else {
$uploaded = $data['file'];
}
$extension = strtolower($uploaded->getClientOriginalExtension());
2017-01-30 20:40:43 +01:00
if (empty(Document::$types[$extension]) && ! empty(Document::$extraExtensions[$extension])) {
2016-05-26 17:28:13 +02:00
$documentType = Document::$extraExtensions[$extension];
2017-01-30 17:05:31 +01:00
} else {
$documentType = $extension;
}
2016-05-26 17:28:13 +02:00
2017-01-30 17:05:31 +01:00
if (empty(Document::$types[$documentType])) {
return 'Unsupported file type';
2016-03-23 03:23:45 +01:00
}
2016-05-26 17:28:13 +02:00
$documentTypeData = Document::$types[$documentType];
2016-05-26 17:28:13 +02:00
2016-03-23 03:23:45 +01:00
$filePath = $uploaded->path();
$name = $uploaded->getClientOriginalName();
2016-03-24 00:52:51 +01:00
$size = filesize($filePath);
2016-05-26 17:28:13 +02:00
2017-01-30 20:40:43 +01:00
if ($size / 1000 > MAX_DOCUMENT_SIZE) {
return 'File too large';
2016-03-23 03:23:45 +01:00
}
2016-05-26 17:28:13 +02:00
// don't allow a document to be linked to both an invoice and an expense
if (array_get($data, 'invoice_id') && array_get($data, 'expense_id')) {
unset($data['expense_id']);
}
2016-05-26 17:28:13 +02:00
2016-03-23 20:41:05 +01:00
$hash = sha1_file($filePath);
$filename = \Auth::user()->account->account_key.'/'.$hash.'.'.$documentType;
2016-05-26 17:28:13 +02:00
2016-03-23 03:23:45 +01:00
$document = Document::createNew();
$document->fill($data);
2016-03-23 03:23:45 +01:00
$disk = $document->getDisk();
2017-01-30 20:40:43 +01:00
if (! $disk->exists($filename)) {// Have we already stored the same file
2016-03-24 00:52:51 +01:00
$stream = fopen($filePath, 'r');
2017-01-30 20:40:43 +01:00
$disk->getDriver()->putStream($filename, $stream, ['mimetype' => $documentTypeData['mime']]);
2017-08-06 15:08:30 +02:00
//fclose($stream);
2016-03-23 20:41:05 +01:00
}
2016-05-26 17:28:13 +02:00
2016-03-23 20:41:05 +01:00
// This is an image; check if we need to create a preview
2017-01-30 20:40:43 +01:00
if (in_array($documentType, ['jpeg', 'png', 'gif', 'bmp', 'tiff', 'psd'])) {
2016-03-23 20:41:05 +01:00
$makePreview = false;
$imageSize = getimagesize($filePath);
2016-03-23 23:40:42 +01:00
$width = $imageSize[0];
$height = $imageSize[1];
$imgManagerConfig = [];
2017-01-30 20:40:43 +01:00
if (in_array($documentType, ['gif', 'bmp', 'tiff', 'psd'])) {
2016-03-23 20:41:05 +01:00
// Needs to be converted
$makePreview = true;
2017-01-30 17:05:31 +01:00
} elseif ($width > DOCUMENT_PREVIEW_SIZE || $height > DOCUMENT_PREVIEW_SIZE) {
2016-05-26 17:28:13 +02:00
$makePreview = true;
2016-03-23 20:41:05 +01:00
}
2016-05-26 17:28:13 +02:00
2017-01-30 20:40:43 +01:00
if (in_array($documentType, ['bmp', 'tiff', 'psd'])) {
if (! class_exists('Imagick')) {
2016-03-23 20:41:05 +01:00
// Cant't read this
$makePreview = false;
} else {
$imgManagerConfig['driver'] = 'imagick';
2016-05-26 17:28:13 +02:00
}
2016-03-23 20:41:05 +01:00
}
2016-05-26 17:28:13 +02:00
2017-01-30 17:05:31 +01:00
if ($makePreview) {
$previewType = 'jpeg';
2017-01-30 20:40:43 +01:00
if (in_array($documentType, ['png', 'gif', 'tiff', 'psd'])) {
2016-03-23 20:41:05 +01:00
// Has transparency
$previewType = 'png';
}
2016-05-26 17:28:13 +02:00
$document->preview = \Auth::user()->account->account_key.'/'.$hash.'.'.$documentType.'.x'.DOCUMENT_PREVIEW_SIZE.'.'.$previewType;
2017-01-30 20:40:43 +01:00
if (! $disk->exists($document->preview)) {
2016-03-23 20:41:05 +01:00
// We haven't created a preview yet
$imgManager = new ImageManager($imgManagerConfig);
2016-05-26 17:28:13 +02:00
2016-03-23 20:41:05 +01:00
$img = $imgManager->make($filePath);
2016-05-26 17:28:13 +02:00
2017-01-30 17:05:31 +01:00
if ($width <= DOCUMENT_PREVIEW_SIZE && $height <= DOCUMENT_PREVIEW_SIZE) {
2016-03-23 23:40:42 +01:00
$previewWidth = $width;
$previewHeight = $height;
2017-01-30 17:05:31 +01:00
} elseif ($width > $height) {
2016-03-23 23:40:42 +01:00
$previewWidth = DOCUMENT_PREVIEW_SIZE;
$previewHeight = $height * DOCUMENT_PREVIEW_SIZE / $width;
} else {
$previewHeight = DOCUMENT_PREVIEW_SIZE;
$previewWidth = $width * DOCUMENT_PREVIEW_SIZE / $height;
}
2016-05-26 17:28:13 +02:00
2016-03-23 23:40:42 +01:00
$img->resize($previewWidth, $previewHeight);
2016-05-26 17:28:13 +02:00
2016-03-23 20:41:05 +01:00
$previewContent = (string) $img->encode($previewType);
$disk->put($document->preview, $previewContent);
2016-03-23 23:40:42 +01:00
$base64 = base64_encode($previewContent);
2017-01-30 17:05:31 +01:00
} else {
2016-03-23 23:40:42 +01:00
$base64 = base64_encode($disk->get($document->preview));
}
2017-01-30 17:05:31 +01:00
} else {
2016-03-23 23:40:42 +01:00
$base64 = base64_encode(file_get_contents($filePath));
2016-05-26 17:28:13 +02:00
}
2016-03-23 03:23:45 +01:00
}
2016-05-26 17:28:13 +02:00
2016-03-23 03:23:45 +01:00
$document->path = $filename;
$document->type = $documentType;
2016-03-24 00:52:51 +01:00
$document->size = $size;
$document->hash = $hash;
2016-03-23 03:23:45 +01:00
$document->name = substr($name, -255);
2016-05-26 17:28:13 +02:00
2017-01-30 20:40:43 +01:00
if (! empty($imageSize)) {
2016-03-23 20:41:05 +01:00
$document->width = $imageSize[0];
$document->height = $imageSize[1];
2016-03-23 03:23:45 +01:00
}
2016-05-26 17:28:13 +02:00
2016-03-23 03:23:45 +01:00
$document->save();
2016-03-23 23:40:42 +01:00
$doc_array = $document->toArray();
2016-05-26 17:28:13 +02:00
2017-01-30 20:40:43 +01:00
if (! empty($base64)) {
$mime = Document::$types[! empty($previewType) ? $previewType : $documentType]['mime'];
2016-03-23 23:40:42 +01:00
$doc_array['base64'] = 'data:'.$mime.';base64,'.$base64;
}
2016-03-23 03:23:45 +01:00
return $document;
2016-03-23 03:23:45 +01:00
}
2016-05-26 17:28:13 +02:00
2016-03-24 16:58:30 +01:00
public function getClientDatatable($contactId, $entityType, $search)
{
2017-01-30 17:05:31 +01:00
$query = DB::table('invitations')
2016-03-24 16:58:30 +01:00
->join('accounts', 'accounts.id', '=', 'invitations.account_id')
->join('invoices', 'invoices.id', '=', 'invitations.invoice_id')
->join('documents', 'documents.invoice_id', '=', 'invitations.invoice_id')
2016-03-24 16:58:30 +01:00
->join('clients', 'clients.id', '=', 'invoices.client_id')
->where('invitations.contact_id', '=', $contactId)
->where('invitations.deleted_at', '=', null)
->where('invoices.is_deleted', '=', false)
->where('clients.deleted_at', '=', null)
->where('invoices.is_recurring', '=', false)
->where('invoices.is_public', '=', true)
// TODO: This needs to be a setting to also hide the activity on the dashboard page
2016-05-26 17:28:13 +02:00
//->where('invoices.invoice_status_id', '>=', INVOICE_STATUS_SENT)
2016-03-24 16:58:30 +01:00
->select(
'invitations.invitation_key',
'invoices.invoice_number',
'documents.name',
'documents.public_id',
'documents.created_at',
'documents.size'
);
$table = \Datatable::query($query)
->addColumn('invoice_number', function ($model) {
return link_to(
2016-05-26 17:28:13 +02:00
'/view/'.$model->invitation_key,
2016-03-24 16:58:30 +01:00
$model->invoice_number
2016-05-26 17:28:13 +02:00
)->toHtml();
2016-03-24 16:58:30 +01:00
})
->addColumn('name', function ($model) {
return link_to(
2016-05-26 17:28:13 +02:00
'/client/documents/'.$model->invitation_key.'/'.$model->public_id.'/'.$model->name,
2016-03-24 16:58:30 +01:00
$model->name,
2017-01-30 20:40:43 +01:00
['target' => '_blank']
2016-05-26 17:28:13 +02:00
)->toHtml();
2016-03-24 16:58:30 +01:00
})
->addColumn('created_at', function ($model) {
2016-05-26 17:28:13 +02:00
return Utils::dateToString($model->created_at);
2016-03-24 16:58:30 +01:00
})
->addColumn('size', function ($model) {
2016-05-26 17:28:13 +02:00
return Form::human_filesize($model->size);
2016-03-24 16:58:30 +01:00
});
return $table->make();
}
2016-03-23 03:23:45 +01:00
}