diff --git a/app/Http/Controllers/V1/Admin/Settings/CompanyCurrencyCheckTransactionsController.php b/app/Http/Controllers/V1/Admin/Settings/CompanyCurrencyCheckTransactionsController.php new file mode 100644 index 00000000..3f7979d5 --- /dev/null +++ b/app/Http/Controllers/V1/Admin/Settings/CompanyCurrencyCheckTransactionsController.php @@ -0,0 +1,33 @@ +header('company')); + + $this->authorize('manage company', $company); + + if ($company->hasTransactions()) { + return response()->json([ + 'success' => false, + ]); + } + + return response()->json([ + 'success' => true, + ]); + } +} diff --git a/app/Http/Controllers/V1/Admin/Settings/UpdateCompanySettingsController.php b/app/Http/Controllers/V1/Admin/Settings/UpdateCompanySettingsController.php index 264b0af7..f2c879c6 100644 --- a/app/Http/Controllers/V1/Admin/Settings/UpdateCompanySettingsController.php +++ b/app/Http/Controllers/V1/Admin/Settings/UpdateCompanySettingsController.php @@ -17,9 +17,20 @@ class UpdateCompanySettingsController extends Controller */ public function __invoke(UpdateSettingsRequest $request) { - $this->authorize('manage company', Company::find($request->header('company'))); + $company = Company::find($request->header('company')); + $this->authorize('manage company', $company); - CompanySetting::setSettings($request->settings, $request->header('company')); + $companyCurrency = CompanySetting::getSetting('currency', $request->header('company')); + $data = $request->settings; + + if ($companyCurrency !== $data['currency'] && $company->hasTransactions()) { + return response()->json([ + 'success' => false, + 'message' => 'You cannot change currency once transaction is created.' + ]); + } + + CompanySetting::setSettings($data, $request->header('company')); return response()->json([ 'success' => true, diff --git a/app/Http/Controllers/V1/PDF/EstimatePdfController.php b/app/Http/Controllers/V1/PDF/EstimatePdfController.php index 80e96915..64f65cce 100644 --- a/app/Http/Controllers/V1/PDF/EstimatePdfController.php +++ b/app/Http/Controllers/V1/PDF/EstimatePdfController.php @@ -4,6 +4,7 @@ namespace Crater\Http\Controllers\V1\PDF; use Crater\Http\Controllers\Controller; use Crater\Models\Estimate; +use Illuminate\Http\Request; class EstimatePdfController extends Controller { @@ -13,8 +14,13 @@ class EstimatePdfController extends Controller * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\Response */ - public function __invoke(Estimate $estimate) + public function __invoke(Request $request, Estimate $estimate) { + if ($request->has('preview')) { + return $estimate->getPDFData(); + } + + return $estimate->getGeneratedPDFOrStream('estimate'); } } diff --git a/app/Http/Controllers/V1/PDF/InvoicePdfController.php b/app/Http/Controllers/V1/PDF/InvoicePdfController.php index 07a78f45..6f3c47c9 100644 --- a/app/Http/Controllers/V1/PDF/InvoicePdfController.php +++ b/app/Http/Controllers/V1/PDF/InvoicePdfController.php @@ -4,6 +4,7 @@ namespace Crater\Http\Controllers\V1\PDF; use Crater\Http\Controllers\Controller; use Crater\Models\Invoice; +use Illuminate\Http\Request; class InvoicePdfController extends Controller { @@ -13,8 +14,12 @@ class InvoicePdfController extends Controller * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\Response */ - public function __invoke(Invoice $invoice) + public function __invoke(Request $request, Invoice $invoice) { + if ($request->has('preview')) { + return $invoice->getPDFData(); + } + return $invoice->getGeneratedPDFOrStream('invoice'); } } diff --git a/app/Http/Controllers/V1/PDF/PaymentPdfController.php b/app/Http/Controllers/V1/PDF/PaymentPdfController.php index c091e724..fec5fa4b 100644 --- a/app/Http/Controllers/V1/PDF/PaymentPdfController.php +++ b/app/Http/Controllers/V1/PDF/PaymentPdfController.php @@ -4,6 +4,7 @@ namespace Crater\Http\Controllers\V1\PDF; use Crater\Http\Controllers\Controller; use Crater\Models\Payment; +use Illuminate\Http\Request; class PaymentPdfController extends Controller { @@ -13,8 +14,12 @@ class PaymentPdfController extends Controller * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\Response */ - public function __invoke(Payment $payment) + public function __invoke(Request $request, Payment $payment) { + if ($request->has('preview')) { + return view('app.pdf.payment.payment'); + } + return $payment->getGeneratedPDFOrStream('payment'); } } diff --git a/app/Models/Company.php b/app/Models/Company.php index 2a3b2908..a0d9fddb 100644 --- a/app/Models/Company.php +++ b/app/Models/Company.php @@ -380,4 +380,21 @@ class Company extends Model implements HasMedia $model->taxes()->delete(); } } + + public function hasTransactions() + { + if ( + $this->customers()->exists() || + $this->items()->exists() || + $this->invoices()->exists() || + $this->estimates()->exists() || + $this->expenses()->exists() || + $this->payments()->exists() || + $this->recurringInvoices()->exists() + ) { + return true; + } + + return false; + } } diff --git a/app/Models/Estimate.php b/app/Models/Estimate.php index f9aa6eb3..5b7c3b8f 100644 --- a/app/Models/Estimate.php +++ b/app/Models/Estimate.php @@ -412,6 +412,10 @@ class Estimate extends Model implements HasMedia 'taxes' => $taxes, ]); + if (request()->has('preview')) { + return view('app.pdf.estimate.'.$estimateTemplate); + } + return PDF::loadView('app.pdf.estimate.'.$estimateTemplate); } diff --git a/app/Models/Invoice.php b/app/Models/Invoice.php index 396fc116..464390af 100644 --- a/app/Models/Invoice.php +++ b/app/Models/Invoice.php @@ -575,6 +575,10 @@ class Invoice extends Model implements HasMedia 'taxes' => $taxes, ]); + if (request()->has('preview')) { + return view('app.pdf.invoice.'.$invoiceTemplate); + } + return PDF::loadView('app.pdf.invoice.'.$invoiceTemplate); } diff --git a/app/Models/Payment.php b/app/Models/Payment.php index f0afd2c6..83a17441 100644 --- a/app/Models/Payment.php +++ b/app/Models/Payment.php @@ -375,6 +375,10 @@ class Payment extends Model implements HasMedia 'logo' => $logo ?? null, ]); + if (request()->has('preview')) { + return view('app.pdf.payment.payment'); + } + return PDF::loadView('app.pdf.payment.payment'); } diff --git a/app/Models/RecurringInvoice.php b/app/Models/RecurringInvoice.php index 6666ea5d..aa3ecabb 100644 --- a/app/Models/RecurringInvoice.php +++ b/app/Models/RecurringInvoice.php @@ -305,9 +305,15 @@ class RecurringInvoice extends Model ->setCustomer($this->customer_id) ->setNextNumbers(); + $days = CompanySetting::getSetting('invoice_due_date_days', $this->company_id); + + if (! $days || $days == "null") { + $days = 7; + } + $newInvoice['creator_id'] = $this->creator_id; $newInvoice['invoice_date'] = Carbon::today()->format('Y-m-d'); - $newInvoice['due_date'] = Carbon::today()->addDays(7)->format('Y-m-d'); + $newInvoice['due_date'] = Carbon::today()->addDays($days)->format('Y-m-d'); $newInvoice['status'] = Invoice::STATUS_DRAFT; $newInvoice['company_id'] = $this->company_id; $newInvoice['paid_status'] = Invoice::STATUS_UNPAID; diff --git a/database/migrations/2022_03_03_063237_change_over_due_status_to_sent.php b/database/migrations/2022_03_03_063237_change_over_due_status_to_sent.php new file mode 100644 index 00000000..a87a7351 --- /dev/null +++ b/database/migrations/2022_03_03_063237_change_over_due_status_to_sent.php @@ -0,0 +1,35 @@ +get(); + + if ($overdueInvoices) { + $overdueInvoices->map(function ($overdueInvoice) { + $overdueInvoice->status = Invoice::STATUS_SENT; + $overdueInvoice->overdue = true; + $overdueInvoice->save(); + }); + } + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + } +} diff --git a/resources/scripts/admin/stores/recurring-invoice.js b/resources/scripts/admin/stores/recurring-invoice.js index cd0ee5eb..ece01072 100644 --- a/resources/scripts/admin/stores/recurring-invoice.js +++ b/resources/scripts/admin/stores/recurring-invoice.js @@ -40,12 +40,12 @@ export const useRecurringInvoiceStore = (useWindow = false) => { { label: 'Every 30 Minute', value: '*/30 * * * *' }, { label: 'Every Hour', value: '0 * * * *' }, { label: 'Every 2 Hour', value: '0 */2 * * *' }, - { label: 'Twice A Day', value: '0 13-15 * * *' }, + { label: 'Every day at midnight ', value: '0 0 * * *' }, { label: 'Every Week', value: '0 0 * * 0' }, - { label: 'Every 15 Days', value: '0 5 */15 * *' }, - { label: 'First Day Of Month', value: '0 0 1 * *' }, + { label: 'Every 15 days at midnight', value: '0 5 */15 * *' }, + { label: 'On the first day of every month at 00:00', value: '0 0 1 * *' }, { label: 'Every 6 Month', value: '0 0 1 */6 *' }, - { label: 'Every Year', value: '0 0 1 1 *' }, + { label: 'Every year on the first day of january at 00:00', value: '0 0 1 1 *' }, { label: 'Custom', value: 'CUSTOM' }, ], }), diff --git a/routes/api.php b/routes/api.php index 784760ea..b81cbd79 100644 --- a/routes/api.php +++ b/routes/api.php @@ -67,6 +67,7 @@ use Crater\Http\Controllers\V1\Admin\RecurringInvoice\RecurringInvoiceFrequencyC use Crater\Http\Controllers\V1\Admin\Role\AbilitiesController; use Crater\Http\Controllers\V1\Admin\Role\RolesController; use Crater\Http\Controllers\V1\Admin\Settings\CompanyController; +use Crater\Http\Controllers\V1\Admin\Settings\CompanyCurrencyCheckTransactionsController; use Crater\Http\Controllers\V1\Admin\Settings\DiskController; use Crater\Http\Controllers\V1\Admin\Settings\GetCompanyMailConfigurationController; use Crater\Http\Controllers\V1\Admin\Settings\GetCompanySettingsController; @@ -394,6 +395,8 @@ Route::prefix('/v1')->group(function () { Route::post('/settings', UpdateSettingsController::class); + Route::get('/company/has-transactions', CompanyCurrencyCheckTransactionsController::class); + // Mails //----------------------------------