mirror of
https://github.com/crater-invoice/crater.git
synced 2025-10-27 11:41:09 -04:00
Merge branch 'master' of https://github.com/bytefury/crater
This commit is contained in:
@ -39,7 +39,7 @@ class ExpensesController extends Controller
|
||||
/**
|
||||
* Store a newly created resource in storage.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @param \Crater\Http\Requests\ExpenseRequest $request
|
||||
* @return \Illuminate\Http\JsonResponse
|
||||
*/
|
||||
public function store(ExpenseRequest $request)
|
||||
@ -67,7 +67,7 @@ class ExpensesController extends Controller
|
||||
/**
|
||||
* Update the specified resource in storage.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @param \Crater\Http\Requests\ExpenseRequest $request
|
||||
* @param \Crater\Models\Expense $expense
|
||||
* @return \Illuminate\Http\JsonResponse
|
||||
*/
|
||||
|
||||
@ -5,17 +5,18 @@ namespace Crater\Http\Controllers\V1\Admin\Expense;
|
||||
use Crater\Http\Controllers\Controller;
|
||||
use Crater\Models\Expense;
|
||||
use Illuminate\Http\Request;
|
||||
use Crater\Http\Requests\ExpenseRequest;
|
||||
|
||||
class UploadReceiptController extends Controller
|
||||
{
|
||||
/**
|
||||
* Upload the expense receipts to storage.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @param \Crater\Http\Requests\ExpenseRequest $request
|
||||
* @param Expense $expense
|
||||
* @return \Illuminate\Http\JsonResponse
|
||||
*/
|
||||
public function __invoke(Request $request, Expense $expense)
|
||||
public function __invoke(ExpenseRequest $request, Expense $expense)
|
||||
{
|
||||
$this->authorize('update', $expense);
|
||||
|
||||
|
||||
@ -9,6 +9,8 @@ use Crater\Http\Resources\CompanyResource;
|
||||
use Crater\Http\Resources\UserResource;
|
||||
use Crater\Models\Company;
|
||||
use Illuminate\Http\Request;
|
||||
use Crater\Http\Requests\AvatarRequest;
|
||||
use Crater\Http\Requests\CompanyLogoRequest;
|
||||
|
||||
class CompanyController extends Controller
|
||||
{
|
||||
@ -58,10 +60,10 @@ class CompanyController extends Controller
|
||||
/**
|
||||
* Upload the company logo to storage.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @param \Crater\Http\Requests\CompanyLogoRequest $request
|
||||
* @return \Illuminate\Http\JsonResponse
|
||||
*/
|
||||
public function uploadCompanyLogo(Request $request)
|
||||
public function uploadCompanyLogo(CompanyLogoRequest $request)
|
||||
{
|
||||
$company = Company::find($request->header('company'));
|
||||
|
||||
@ -89,10 +91,10 @@ class CompanyController extends Controller
|
||||
/**
|
||||
* Upload the Admin Avatar to public storage.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @param \Crater\Http\Requests\AvatarRequest $request
|
||||
* @return \Illuminate\Http\JsonResponse
|
||||
*/
|
||||
public function uploadAvatar(Request $request)
|
||||
public function uploadAvatar(AvatarRequest $request)
|
||||
{
|
||||
$user = auth()->user();
|
||||
|
||||
|
||||
40
app/Http/Requests/AvatarRequest.php
Normal file
40
app/Http/Requests/AvatarRequest.php
Normal file
@ -0,0 +1,40 @@
|
||||
<?php
|
||||
|
||||
namespace Crater\Http\Requests;
|
||||
|
||||
use Crater\Rules\Base64Mime;
|
||||
use Illuminate\Foundation\Http\FormRequest;
|
||||
|
||||
class AvatarRequest extends FormRequest
|
||||
{
|
||||
/**
|
||||
* Determine if the user is authorized to make this request.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function authorize()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the validation rules that apply to the request.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function rules()
|
||||
{
|
||||
return [
|
||||
'admin_avatar' => [
|
||||
'nullable',
|
||||
'file',
|
||||
'mimes:gif,jpg,png',
|
||||
'max:20000'
|
||||
],
|
||||
'avatar' => [
|
||||
'nullable',
|
||||
new Base64Mime(['gif', 'jpg', 'png'])
|
||||
]
|
||||
];
|
||||
}
|
||||
}
|
||||
34
app/Http/Requests/CompanyLogoRequest.php
Normal file
34
app/Http/Requests/CompanyLogoRequest.php
Normal file
@ -0,0 +1,34 @@
|
||||
<?php
|
||||
|
||||
namespace Crater\Http\Requests;
|
||||
|
||||
use Crater\Rules\Base64Mime;
|
||||
use Illuminate\Foundation\Http\FormRequest;
|
||||
|
||||
class CompanyLogoRequest extends FormRequest
|
||||
{
|
||||
/**
|
||||
* Determine if the user is authorized to make this request.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function authorize()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the validation rules that apply to the request.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function rules()
|
||||
{
|
||||
return [
|
||||
'company_logo' => [
|
||||
'nullable',
|
||||
new Base64Mime(['gif', 'jpg', 'png'])
|
||||
]
|
||||
];
|
||||
}
|
||||
}
|
||||
@ -51,6 +51,12 @@ class ExpenseRequest extends FormRequest
|
||||
'currency_id' => [
|
||||
'required'
|
||||
],
|
||||
'attachment_receipt' => [
|
||||
'nullable',
|
||||
'file',
|
||||
'mimes:jpg,png,pdf,doc,docx,xls,xlsx,ppt,pptx',
|
||||
'max:20000'
|
||||
]
|
||||
];
|
||||
|
||||
if ($companyCurrency && $this->currency_id) {
|
||||
|
||||
85
app/Rules/Base64Mime.php
Normal file
85
app/Rules/Base64Mime.php
Normal file
@ -0,0 +1,85 @@
|
||||
<?php
|
||||
|
||||
namespace Crater\Rules;
|
||||
|
||||
use Illuminate\Contracts\Validation\Rule;
|
||||
|
||||
class Base64Mime implements Rule
|
||||
{
|
||||
private $attribute;
|
||||
private $extensions;
|
||||
|
||||
/**
|
||||
* Create a new rule instance.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __construct(array $extensions)
|
||||
{
|
||||
$this->extensions = $extensions;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine if the validation rule passes.
|
||||
*
|
||||
* @param string $attribute
|
||||
* @param mixed $value
|
||||
* @return bool
|
||||
*/
|
||||
public function passes($attribute, $value)
|
||||
{
|
||||
$this->attribute = $attribute;
|
||||
|
||||
try {
|
||||
$data = json_decode($value)->data;
|
||||
} catch (\Exception $e) {
|
||||
return False;
|
||||
}
|
||||
|
||||
$pattern = '/^data:\w+\/[\w\+]+;base64,[\w\+\=\/]+$/';
|
||||
|
||||
if(!preg_match($pattern, $data)) {
|
||||
return False;
|
||||
}
|
||||
|
||||
$data = explode(',', $data);
|
||||
|
||||
if(!isset($data[1]) || empty($data[1])) {
|
||||
return False;
|
||||
}
|
||||
|
||||
try {
|
||||
$data = base64_decode($data[1]);
|
||||
$f = finfo_open();
|
||||
$result = finfo_buffer($f, $data, FILEINFO_EXTENSION);
|
||||
|
||||
if($result === '???')
|
||||
return False;
|
||||
|
||||
if(strpos($result, '/')) {
|
||||
foreach(explode('/', $result) as $ext) {
|
||||
if(in_array($ext, $this->extensions))
|
||||
return True;
|
||||
}
|
||||
} else {
|
||||
if(in_array($result, $this->extensions))
|
||||
return True;
|
||||
}
|
||||
} catch (\Exception $e) {
|
||||
return False;
|
||||
}
|
||||
|
||||
return False;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the validation error message.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function message()
|
||||
{
|
||||
return 'The ' . $this->attribute . ' must be a json with file of type: ' . implode(', ', $this->extensions) . ' encoded in base64.';
|
||||
}
|
||||
}
|
||||
@ -55,6 +55,8 @@ Join the Crater discord server to discuss:
|
||||
- [x] Multiple Companies
|
||||
- [x] Recurring Invoices
|
||||
- [ ] Modules
|
||||
- [ ] Blockchain Integration
|
||||
- [ ] Web 3.0 Accounting
|
||||
- [ ] White Labeling (Easy Invoice, Email & Consumer Portal Theme customisation)
|
||||
- [ ] Vendors, Inventory & Bills
|
||||
- [ ] Payment Reminders
|
||||
|
||||
1
resources/scripts/components/dropdowns/InvoiceIndexDropdown.vue
Normal file → Executable file
1
resources/scripts/components/dropdowns/InvoiceIndexDropdown.vue
Normal file → Executable file
@ -153,7 +153,6 @@ const utils = inject('utils')
|
||||
function canReSendInvoice(row) {
|
||||
return (
|
||||
(row.status == 'SENT' || row.status == 'VIEWED') &&
|
||||
route.name !== 'invoices.view' &&
|
||||
userStore.hasAbilities(abilities.SEND_INVOICE)
|
||||
)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user