diff --git a/app/Http/Controllers/V1/Admin/ExchangeRate/ExchangeRateProviderController.php b/app/Http/Controllers/V1/Admin/ExchangeRate/ExchangeRateProviderController.php index d0817657..c2547465 100644 --- a/app/Http/Controllers/V1/Admin/ExchangeRate/ExchangeRateProviderController.php +++ b/app/Http/Controllers/V1/Admin/ExchangeRate/ExchangeRateProviderController.php @@ -3,12 +3,17 @@ namespace App\Http\Controllers\V1\Admin\ExchangeRate; use App\Http\Controllers\Controller; +use App\Http\Requests\BulkExchangeRateRequest; use App\Http\Requests\ExchangeRateProviderRequest; use App\Http\Resources\ExchangeRateProviderResource; use App\Models\CompanySetting; use App\Models\Currency; +use App\Models\Estimate; use App\Models\ExchangeRateLog; use App\Models\ExchangeRateProvider; +use App\Models\Invoice; +use App\Models\Payment; +use App\Models\Tax; use App\Traits\ExchangeRateProvidersTrait; use Illuminate\Http\Request; use Illuminate\Http\Response; @@ -217,4 +222,126 @@ class ExchangeRateProviderController extends Controller 'activeUsedCurrencies' => $activeExchangeRateProvider ? $activeExchangeRateProvider : [], ]); } + + public function usedCurrenciesWithoutRate(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(), + ]); + } + + public function bulkUpdate(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->updateItemsExchangeRate($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->updateItemsExchangeRate($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, + ]); + } + + private function updateItemsExchangeRate($model): void + { + 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->updateTaxesExchangeRate($item); + } + + $this->updateTaxesExchangeRate($model); + } + + private function updateTaxesExchangeRate($model): void + { + 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, + ]); + }); + } + } } diff --git a/app/Http/Controllers/V1/Admin/General/BulkExchangeRateController.php b/app/Http/Controllers/V1/Admin/General/BulkExchangeRateController.php deleted file mode 100644 index 12631094..00000000 --- a/app/Http/Controllers/V1/Admin/General/BulkExchangeRateController.php +++ /dev/null @@ -1,130 +0,0 @@ -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, - ]); - }); - } - } -} diff --git a/app/Http/Controllers/V1/Admin/General/DateFormatsController.php b/app/Http/Controllers/V1/Admin/General/DateFormatsController.php deleted file mode 100644 index c0b27576..00000000 --- a/app/Http/Controllers/V1/Admin/General/DateFormatsController.php +++ /dev/null @@ -1,23 +0,0 @@ -json([ - 'date_formats' => DateFormatter::get_list(), - ]); - } -} diff --git a/app/Http/Controllers/V1/Admin/General/FormatsController.php b/app/Http/Controllers/V1/Admin/General/FormatsController.php new file mode 100644 index 00000000..44362ba2 --- /dev/null +++ b/app/Http/Controllers/V1/Admin/General/FormatsController.php @@ -0,0 +1,33 @@ +json([ + 'date_formats' => DateFormatter::get_list(), + ]); + } + + public function timeFormats(): JsonResponse + { + return response()->json([ + 'time_formats' => TimeFormatter::get_list(), + ]); + } + + public function timezones(): JsonResponse + { + return response()->json([ + 'time_zones' => TimeZones::get_list(), + ]); + } +} diff --git a/app/Http/Controllers/V1/Admin/General/GetAllUsedCurrenciesController.php b/app/Http/Controllers/V1/Admin/General/GetAllUsedCurrenciesController.php deleted file mode 100644 index 36ba05de..00000000 --- a/app/Http/Controllers/V1/Admin/General/GetAllUsedCurrenciesController.php +++ /dev/null @@ -1,37 +0,0 @@ -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(), - ]); - } -} diff --git a/app/Http/Controllers/V1/Admin/General/NumberPlaceholdersController.php b/app/Http/Controllers/V1/Admin/General/NumberPlaceholdersController.php deleted file mode 100644 index 4ed87184..00000000 --- a/app/Http/Controllers/V1/Admin/General/NumberPlaceholdersController.php +++ /dev/null @@ -1,30 +0,0 @@ -format) { - $placeholders = SerialNumberService::getPlaceholders($request->format); - } else { - $placeholders = []; - } - - return response()->json([ - 'success' => true, - 'placeholders' => $placeholders, - ]); - } -} diff --git a/app/Http/Controllers/V1/Admin/General/SearchController.php b/app/Http/Controllers/V1/Admin/General/SearchController.php index a81b5c89..37f99b7a 100644 --- a/app/Http/Controllers/V1/Admin/General/SearchController.php +++ b/app/Http/Controllers/V1/Admin/General/SearchController.php @@ -36,4 +36,15 @@ class SearchController extends Controller 'users' => $users ?? [], ]); } + + public function users(Request $request) + { + $this->authorize('create', User::class); + + $users = User::whereEmail($request->email) + ->latest() + ->paginate(10); + + return response()->json(['users' => $users]); + } } diff --git a/app/Http/Controllers/V1/Admin/General/SearchUsersController.php b/app/Http/Controllers/V1/Admin/General/SearchUsersController.php deleted file mode 100644 index c4556859..00000000 --- a/app/Http/Controllers/V1/Admin/General/SearchUsersController.php +++ /dev/null @@ -1,27 +0,0 @@ -authorize('create', User::class); - - $users = User::whereEmail($request->email) - ->latest() - ->paginate(10); - - return response()->json(['users' => $users]); - } -} diff --git a/app/Http/Controllers/V1/Admin/General/NextNumberController.php b/app/Http/Controllers/V1/Admin/General/SerialNumberController.php similarity index 68% rename from app/Http/Controllers/V1/Admin/General/NextNumberController.php rename to app/Http/Controllers/V1/Admin/General/SerialNumberController.php index d9259e2e..d4362ba2 100644 --- a/app/Http/Controllers/V1/Admin/General/NextNumberController.php +++ b/app/Http/Controllers/V1/Admin/General/SerialNumberController.php @@ -7,17 +7,12 @@ use App\Models\Estimate; use App\Models\Invoice; use App\Models\Payment; use App\Services\SerialNumberService; +use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; -use Illuminate\Http\Response; -class NextNumberController extends Controller +class SerialNumberController extends Controller { - /** - * Handle the incoming request. - * - * @return Response - */ - public function __invoke(Request $request, Invoice $invoice, Estimate $estimate, Payment $payment) + public function nextNumber(Request $request, Invoice $invoice, Estimate $estimate, Payment $payment): JsonResponse { $key = $request->key; $nextNumber = null; @@ -49,7 +44,9 @@ class NextNumberController extends Controller break; default: - return; + return response()->json([ + 'success' => false, + ]); } } catch (\Exception $exception) { return response()->json([ @@ -63,4 +60,18 @@ class NextNumberController extends Controller 'nextNumber' => $nextNumber, ]); } + + public function placeholders(Request $request): JsonResponse + { + if ($request->format) { + $placeholders = SerialNumberService::getPlaceholders($request->format); + } else { + $placeholders = []; + } + + return response()->json([ + 'success' => true, + 'placeholders' => $placeholders, + ]); + } } diff --git a/app/Http/Controllers/V1/Admin/General/TimeFormatsController.php b/app/Http/Controllers/V1/Admin/General/TimeFormatsController.php deleted file mode 100644 index 3ec42627..00000000 --- a/app/Http/Controllers/V1/Admin/General/TimeFormatsController.php +++ /dev/null @@ -1,23 +0,0 @@ -json([ - 'time_formats' => TimeFormatter::get_list(), - ]); - } -} diff --git a/app/Http/Controllers/V1/Admin/General/TimezonesController.php b/app/Http/Controllers/V1/Admin/General/TimezonesController.php deleted file mode 100644 index 766dfe50..00000000 --- a/app/Http/Controllers/V1/Admin/General/TimezonesController.php +++ /dev/null @@ -1,23 +0,0 @@ -json([ - 'time_zones' => TimeZones::get_list(), - ]); - } -} diff --git a/app/Http/Controllers/V1/Admin/General/CountriesController.php b/app/Http/Controllers/V1/SuperAdmin/CountriesController.php similarity index 90% rename from app/Http/Controllers/V1/Admin/General/CountriesController.php rename to app/Http/Controllers/V1/SuperAdmin/CountriesController.php index a0f32e25..d1bfa82c 100644 --- a/app/Http/Controllers/V1/Admin/General/CountriesController.php +++ b/app/Http/Controllers/V1/SuperAdmin/CountriesController.php @@ -1,6 +1,6 @@ group(function () { // ---------------------------------- Route::prefix('/currencies')->group(function () { - Route::get('/used', GetAllUsedCurrenciesController::class); + Route::get('/used', [ExchangeRateProviderController::class, 'usedCurrenciesWithoutRate']); - Route::post('/bulk-update-exchange-rate', BulkExchangeRateController::class); + Route::post('/bulk-update-exchange-rate', [ExchangeRateProviderController::class, 'bulkUpdate']); }); // Dashboard @@ -219,7 +213,7 @@ Route::prefix('/v1')->group(function () { Route::get('/search', SearchController::class); - Route::get('/search/user', SearchUsersController::class); + Route::get('/search/user', [SearchController::class, 'users']); // MISC // ---------------------------------- @@ -228,15 +222,15 @@ Route::prefix('/v1')->group(function () { Route::get('/currencies', CurrenciesController::class); - Route::get('/timezones', TimezonesController::class); + Route::get('/timezones', [FormatsController::class, 'timezones']); - Route::get('/date/formats', DateFormatsController::class); + Route::get('/date/formats', [FormatsController::class, 'dateFormats']); - Route::get('/time/formats', TimeFormatsController::class); + Route::get('/time/formats', [FormatsController::class, 'timeFormats']); - Route::get('/next-number', NextNumberController::class); + Route::get('/next-number', [SerialNumberController::class, 'nextNumber']); - Route::get('/number-placeholders', NumberPlaceholdersController::class); + Route::get('/number-placeholders', [SerialNumberController::class, 'placeholders']); Route::get('/current-company', [CompaniesController::class, 'show']);