mirror of
https://github.com/crater-invoice/crater.git
synced 2025-10-29 12:41:10 -04:00
v5.0.0 update
This commit is contained in:
@ -0,0 +1,63 @@
|
||||
<?php
|
||||
|
||||
namespace Crater\Http\Controllers\V1\Admin\General;
|
||||
|
||||
use Crater\Http\Controllers\Controller;
|
||||
use Crater\Http\Resources\CompanyResource;
|
||||
use Crater\Http\Resources\UserResource;
|
||||
use Crater\Models\Company;
|
||||
use Crater\Models\CompanySetting;
|
||||
use Crater\Models\Currency;
|
||||
use Crater\Traits\GeneratesMenuTrait;
|
||||
use Illuminate\Http\Request;
|
||||
use Silber\Bouncer\BouncerFacade;
|
||||
|
||||
class BootstrapController extends Controller
|
||||
{
|
||||
use GeneratesMenuTrait;
|
||||
|
||||
/**
|
||||
* Handle the incoming request.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @return \Illuminate\Http\JsonResponse
|
||||
*/
|
||||
public function __invoke(Request $request)
|
||||
{
|
||||
$current_user = $request->user();
|
||||
$current_user_settings = $current_user->getAllSettings();
|
||||
|
||||
$main_menu = $this->generateMenu('main_menu', $current_user);
|
||||
|
||||
$setting_menu = $this->generateMenu('setting_menu', $current_user);
|
||||
|
||||
$companies = $current_user->companies;
|
||||
|
||||
$current_company = Company::find($request->header('company'));
|
||||
|
||||
if ((! $current_company) || ($current_company && ! $current_user->hasCompany($current_company->id))) {
|
||||
$current_company = $current_user->companies()->first();
|
||||
}
|
||||
|
||||
$current_company_settings = CompanySetting::getAllSettings($current_company->id);
|
||||
|
||||
$current_company_currency = $current_company_settings->has('currency')
|
||||
? Currency::find($current_company_settings->get('currency'))
|
||||
: Currency::first();
|
||||
|
||||
BouncerFacade::refreshFor($current_user);
|
||||
|
||||
return response()->json([
|
||||
'current_user' => new UserResource($current_user),
|
||||
'current_user_settings' => $current_user_settings,
|
||||
'current_user_abilities' => $current_user->getAbilities(),
|
||||
'companies' => CompanyResource::collection($companies),
|
||||
'current_company' => new CompanyResource($current_company),
|
||||
'current_company_settings' => $current_company_settings,
|
||||
'current_company_currency' => $current_company_currency,
|
||||
'config' => config('crater'),
|
||||
'main_menu' => $main_menu,
|
||||
'setting_menu' => $setting_menu,
|
||||
]);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,128 @@
|
||||
<?php
|
||||
|
||||
namespace Crater\Http\Controllers\V1\Admin\General;
|
||||
|
||||
use Crater\Http\Controllers\Controller;
|
||||
use Crater\Http\Requests\BulkExchangeRateRequest;
|
||||
use Crater\Models\CompanySetting;
|
||||
use Crater\Models\Estimate;
|
||||
use Crater\Models\Invoice;
|
||||
use Crater\Models\Payment;
|
||||
use Crater\Models\Tax;
|
||||
|
||||
class BulkExchangeRateController extends Controller
|
||||
{
|
||||
/**
|
||||
* Handle the incoming request.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function __invoke(BulkExchangeRateRequest $request)
|
||||
{
|
||||
$bulkExchangeRate = CompanySetting::getSetting('bulk_exchange_rate_configured', $request->header('company'));
|
||||
|
||||
if ($bulkExchangeRate == 'NO') {
|
||||
if ($request->currencies) {
|
||||
foreach ($request->currencies as $currency) {
|
||||
$currency['exchange_rate'] = $currency['exchange_rate'] ?? 1;
|
||||
|
||||
$invoices = Invoice::where('currency_id', $currency['id'])->get();
|
||||
|
||||
if ($invoices) {
|
||||
foreach ($invoices as $invoice) {
|
||||
$invoice->update([
|
||||
'exchange_rate' => $currency['exchange_rate'],
|
||||
'base_discount_val' => $invoice->sub_total * $currency['exchange_rate'],
|
||||
'base_sub_total' => $invoice->sub_total * $currency['exchange_rate'],
|
||||
'base_total' => $invoice->total * $currency['exchange_rate'],
|
||||
'base_tax' => $invoice->tax * $currency['exchange_rate'],
|
||||
'base_due_amount' => $invoice->due_amount * $currency['exchange_rate']
|
||||
]);
|
||||
|
||||
$this->items($invoice);
|
||||
}
|
||||
}
|
||||
|
||||
$estimates = Estimate::where('currency_id', $currency['id'])->get();
|
||||
|
||||
if ($estimates) {
|
||||
foreach ($estimates as $estimate) {
|
||||
$estimate->update([
|
||||
'exchange_rate' => $currency['exchange_rate'],
|
||||
'base_discount_val' => $estimate->sub_total * $currency['exchange_rate'],
|
||||
'base_sub_total' => $estimate->sub_total * $currency['exchange_rate'],
|
||||
'base_total' => $estimate->total * $currency['exchange_rate'],
|
||||
'base_tax' => $estimate->tax * $currency['exchange_rate']
|
||||
]);
|
||||
|
||||
$this->items($estimate);
|
||||
}
|
||||
}
|
||||
|
||||
$taxes = Tax::where('currency_id', $currency['id'])->get();
|
||||
|
||||
if ($taxes) {
|
||||
foreach ($taxes as $tax) {
|
||||
$tax->base_amount = $tax->base_amount * $currency['exchange_rate'];
|
||||
$tax->save();
|
||||
}
|
||||
}
|
||||
|
||||
$payments = Payment::where('currency_id', $currency['id'])->get();
|
||||
|
||||
if ($payments) {
|
||||
foreach ($payments as $payment) {
|
||||
$payment->exchange_rate = $currency['exchange_rate'];
|
||||
$payment->base_amount = $payment->amount * $currency['exchange_rate'];
|
||||
$payment->save();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$settings = [
|
||||
'bulk_exchange_rate_configured' => 'YES'
|
||||
];
|
||||
|
||||
CompanySetting::setSettings($settings, $request->header('company'));
|
||||
|
||||
return response()->json([
|
||||
'success' => true
|
||||
]);
|
||||
}
|
||||
|
||||
return response()->json([
|
||||
'error' => false
|
||||
]);
|
||||
}
|
||||
|
||||
public function items($model)
|
||||
{
|
||||
foreach ($model->items as $item) {
|
||||
$item->update([
|
||||
'exchange_rate' => $model->exchange_rate,
|
||||
'base_discount_val' => $item->discount_val * $model->exchange_rate,
|
||||
'base_price' => $item->price * $model->exchange_rate,
|
||||
'base_tax' => $item->tax * $model->exchange_rate,
|
||||
'base_total' => $item->total * $model->exchange_rate
|
||||
]);
|
||||
|
||||
$this->taxes($item);
|
||||
}
|
||||
|
||||
$this->taxes($model);
|
||||
}
|
||||
|
||||
public function taxes($model)
|
||||
{
|
||||
if ($model->taxes()->exists()) {
|
||||
$model->taxes->map(function ($tax) use ($model) {
|
||||
$tax->update([
|
||||
'exchange_rate' => $model->exchange_rate,
|
||||
'base_amount' => $tax->amount * $model->exchange_rate,
|
||||
]);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
22
app/Http/Controllers/V1/Admin/General/ConfigController.php
Normal file
22
app/Http/Controllers/V1/Admin/General/ConfigController.php
Normal file
@ -0,0 +1,22 @@
|
||||
<?php
|
||||
|
||||
namespace Crater\Http\Controllers\V1\Admin\General;
|
||||
|
||||
use Crater\Http\Controllers\Controller;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class ConfigController extends Controller
|
||||
{
|
||||
/**
|
||||
* Handle the incoming request.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function __invoke(Request $request)
|
||||
{
|
||||
return response()->json([
|
||||
$request->key => config('crater.'.$request->key),
|
||||
]);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,24 @@
|
||||
<?php
|
||||
|
||||
namespace Crater\Http\Controllers\V1\Admin\General;
|
||||
|
||||
use Crater\Http\Controllers\Controller;
|
||||
use Crater\Http\Resources\CountryResource;
|
||||
use Crater\Models\Country;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class CountriesController extends Controller
|
||||
{
|
||||
/**
|
||||
* Handle the incoming request.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @return \Illuminate\Http\JsonResponse
|
||||
*/
|
||||
public function __invoke(Request $request)
|
||||
{
|
||||
$countries = Country::all();
|
||||
|
||||
return CountryResource::collection($countries);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,24 @@
|
||||
<?php
|
||||
|
||||
namespace Crater\Http\Controllers\V1\Admin\General;
|
||||
|
||||
use Crater\Http\Controllers\Controller;
|
||||
use Crater\Http\Resources\CurrencyResource;
|
||||
use Crater\Models\Currency;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class CurrenciesController extends Controller
|
||||
{
|
||||
/**
|
||||
* Handle the incoming request.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function __invoke(Request $request)
|
||||
{
|
||||
$currencies = Currency::latest()->get();
|
||||
|
||||
return CurrencyResource::collection($currencies);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,23 @@
|
||||
<?php
|
||||
|
||||
namespace Crater\Http\Controllers\V1\Admin\General;
|
||||
|
||||
use Crater\Http\Controllers\Controller;
|
||||
use Crater\Space\DateFormatter;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class DateFormatsController extends Controller
|
||||
{
|
||||
/**
|
||||
* Handle the incoming request.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function __invoke(Request $request)
|
||||
{
|
||||
return response()->json([
|
||||
'date_formats' => DateFormatter::get_list(),
|
||||
]);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,37 @@
|
||||
<?php
|
||||
|
||||
namespace Crater\Http\Controllers\V1\Admin\General;
|
||||
|
||||
use Crater\Http\Controllers\Controller;
|
||||
use Crater\Models\Currency;
|
||||
use Crater\Models\Estimate;
|
||||
use Crater\Models\Invoice;
|
||||
use Crater\Models\Payment;
|
||||
use Crater\Models\Tax;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class GetAllUsedCurrenciesController extends Controller
|
||||
{
|
||||
/**
|
||||
* Handle the incoming request.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function __invoke(Request $request)
|
||||
{
|
||||
$invoices = Invoice::where('exchange_rate', null)->pluck('currency_id')->toArray();
|
||||
|
||||
$taxes = Tax::where('exchange_rate', null)->pluck('currency_id')->toArray();
|
||||
|
||||
$estimates = Estimate::where('exchange_rate', null)->pluck('currency_id')->toArray();
|
||||
|
||||
$payments = Payment::where('exchange_rate', null)->pluck('currency_id')->toArray();
|
||||
|
||||
$currencies = array_merge($invoices, $taxes, $estimates, $payments);
|
||||
|
||||
return response()->json([
|
||||
'currencies' => Currency::whereIn('id', $currencies)->get()
|
||||
]);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,66 @@
|
||||
<?php
|
||||
|
||||
namespace Crater\Http\Controllers\V1\Admin\General;
|
||||
|
||||
use Crater\Http\Controllers\Controller;
|
||||
use Crater\Models\Estimate;
|
||||
use Crater\Models\Invoice;
|
||||
use Crater\Models\Payment;
|
||||
use Crater\Services\SerialNumberFormatter;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class NextNumberController extends Controller
|
||||
{
|
||||
/**
|
||||
* Handle the incoming request.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function __invoke(Request $request, Invoice $invoice, Estimate $estimate, Payment $payment)
|
||||
{
|
||||
$key = $request->key;
|
||||
$nextNumber = null;
|
||||
$serial = (new SerialNumberFormatter())
|
||||
->setCompany($request->header('company'))
|
||||
->setCustomer($request->userId);
|
||||
|
||||
try {
|
||||
switch ($key) {
|
||||
case 'invoice':
|
||||
$nextNumber = $serial->setModel($invoice)
|
||||
->setModelObject($request->model_id)
|
||||
->getNextNumber();
|
||||
|
||||
break;
|
||||
|
||||
case 'estimate':
|
||||
$nextNumber = $serial->setModel($estimate)
|
||||
->setModelObject($request->model_id)
|
||||
->getNextNumber();
|
||||
|
||||
break;
|
||||
|
||||
case 'payment':
|
||||
$nextNumber = $serial->setModel($payment)
|
||||
->setModelObject($request->model_id)
|
||||
->getNextNumber();
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
return;
|
||||
}
|
||||
} catch (\Exception $exception) {
|
||||
return response()->json([
|
||||
'success' => false,
|
||||
'message' => $exception->getMessage()
|
||||
]);
|
||||
}
|
||||
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'nextNumber' => $nextNumber,
|
||||
]);
|
||||
}
|
||||
}
|
||||
92
app/Http/Controllers/V1/Admin/General/NotesController.php
Normal file
92
app/Http/Controllers/V1/Admin/General/NotesController.php
Normal file
@ -0,0 +1,92 @@
|
||||
<?php
|
||||
|
||||
namespace Crater\Http\Controllers\V1\Admin\General;
|
||||
|
||||
use Crater\Http\Controllers\Controller;
|
||||
use Crater\Http\Requests\NotesRequest;
|
||||
use Crater\Http\Resources\NoteResource;
|
||||
use Crater\Models\Note;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class NotesController extends Controller
|
||||
{
|
||||
/**
|
||||
* Display a listing of the resource.
|
||||
*
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function index(Request $request)
|
||||
{
|
||||
$this->authorize('view notes');
|
||||
|
||||
$limit = $request->limit ?? 10;
|
||||
|
||||
$notes = Note::latest()
|
||||
->whereCompany()
|
||||
->applyFilters($request->all())
|
||||
->paginate($limit);
|
||||
|
||||
return NoteResource::collection($notes);
|
||||
}
|
||||
|
||||
/**
|
||||
* Store a newly created resource in storage.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function store(NotesRequest $request)
|
||||
{
|
||||
$this->authorize('manage notes');
|
||||
|
||||
$note = Note::create($request->getNotesPayload());
|
||||
|
||||
return new NoteResource($note);
|
||||
}
|
||||
|
||||
/**
|
||||
* Display the specified resource.
|
||||
*
|
||||
* @param \Crater\Models\Note $note
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function show(Note $note)
|
||||
{
|
||||
$this->authorize('view notes');
|
||||
|
||||
return new NoteResource($note);
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the specified resource in storage.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @param \Crater\Models\Note $note
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function update(NotesRequest $request, Note $note)
|
||||
{
|
||||
$this->authorize('manage notes');
|
||||
|
||||
$note->update($request->getNotesPayload());
|
||||
|
||||
return new NoteResource($note);
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the specified resource from storage.
|
||||
*
|
||||
* @param \Crater\Models\Note $note
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function destroy(Note $note)
|
||||
{
|
||||
$this->authorize('manage notes');
|
||||
|
||||
$note->delete();
|
||||
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
]);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,30 @@
|
||||
<?php
|
||||
|
||||
namespace Crater\Http\Controllers\V1\Admin\General;
|
||||
|
||||
use Crater\Http\Controllers\Controller;
|
||||
use Crater\Services\SerialNumberFormatter;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class NumberPlaceholdersController extends Controller
|
||||
{
|
||||
/**
|
||||
* Handle the incoming request.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function __invoke(Request $request)
|
||||
{
|
||||
if ($request->format) {
|
||||
$placeholders = SerialNumberFormatter::getPlaceholders($request->format);
|
||||
} else {
|
||||
$placeholders = [];
|
||||
}
|
||||
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'placeholders' => $placeholders,
|
||||
]);
|
||||
}
|
||||
}
|
||||
37
app/Http/Controllers/V1/Admin/General/SearchController.php
Normal file
37
app/Http/Controllers/V1/Admin/General/SearchController.php
Normal file
@ -0,0 +1,37 @@
|
||||
<?php
|
||||
|
||||
namespace Crater\Http\Controllers\V1\Admin\General;
|
||||
|
||||
use Crater\Http\Controllers\Controller;
|
||||
use Crater\Models\Customer;
|
||||
use Crater\Models\User;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class SearchController extends Controller
|
||||
{
|
||||
/**
|
||||
* Handle the incoming request.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function __invoke(Request $request)
|
||||
{
|
||||
$user = $request->user();
|
||||
|
||||
$customers = Customer::applyFilters($request->only(['search']))
|
||||
->latest()
|
||||
->paginate(10);
|
||||
|
||||
if ($user->isOwner()) {
|
||||
$users = User::applyFilters($request->only(['search']))
|
||||
->latest()
|
||||
->paginate(10);
|
||||
}
|
||||
|
||||
return response()->json([
|
||||
'customers' => $customers,
|
||||
'users' => $users ?? [],
|
||||
]);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,27 @@
|
||||
<?php
|
||||
|
||||
namespace Crater\Http\Controllers\V1\Admin\General;
|
||||
|
||||
use Crater\Http\Controllers\Controller;
|
||||
use Crater\Models\User;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class SearchUsersController extends Controller
|
||||
{
|
||||
/**
|
||||
* Handle the incoming request.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function __invoke(Request $request)
|
||||
{
|
||||
$this->authorize('create', User::class);
|
||||
|
||||
$users = User::whereEmail($request->email)
|
||||
->latest()
|
||||
->paginate(10);
|
||||
|
||||
return response()->json(['users' => $users]);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,23 @@
|
||||
<?php
|
||||
|
||||
namespace Crater\Http\Controllers\V1\Admin\General;
|
||||
|
||||
use Crater\Http\Controllers\Controller;
|
||||
use Crater\Space\TimeZones;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class TimezonesController extends Controller
|
||||
{
|
||||
/**
|
||||
* Handle the incoming request.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function __invoke(Request $request)
|
||||
{
|
||||
return response()->json([
|
||||
'time_zones' => TimeZones::get_list(),
|
||||
]);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user