mirror of
https://github.com/crater-invoice/crater.git
synced 2025-10-27 03:31:09 -04:00
Merge branch 'master'
This commit is contained in:
@ -0,0 +1,33 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Crater\Http\Controllers\V1\Admin\Settings;
|
||||||
|
|
||||||
|
use Crater\Http\Controllers\Controller;
|
||||||
|
use Crater\Models\Company;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
|
||||||
|
class CompanyCurrencyCheckTransactionsController extends Controller
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Handle the incoming request.
|
||||||
|
*
|
||||||
|
* @param \Illuminate\Http\Request $request
|
||||||
|
* @return \Illuminate\Http\Response
|
||||||
|
*/
|
||||||
|
public function __invoke(Request $request)
|
||||||
|
{
|
||||||
|
$company = Company::find($request->header('company'));
|
||||||
|
|
||||||
|
$this->authorize('manage company', $company);
|
||||||
|
|
||||||
|
if ($company->hasTransactions()) {
|
||||||
|
return response()->json([
|
||||||
|
'success' => false,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return response()->json([
|
||||||
|
'success' => true,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -17,9 +17,20 @@ class UpdateCompanySettingsController extends Controller
|
|||||||
*/
|
*/
|
||||||
public function __invoke(UpdateSettingsRequest $request)
|
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([
|
return response()->json([
|
||||||
'success' => true,
|
'success' => true,
|
||||||
|
|||||||
@ -4,6 +4,7 @@ namespace Crater\Http\Controllers\V1\PDF;
|
|||||||
|
|
||||||
use Crater\Http\Controllers\Controller;
|
use Crater\Http\Controllers\Controller;
|
||||||
use Crater\Models\Estimate;
|
use Crater\Models\Estimate;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
|
||||||
class EstimatePdfController extends Controller
|
class EstimatePdfController extends Controller
|
||||||
{
|
{
|
||||||
@ -13,8 +14,13 @@ class EstimatePdfController extends Controller
|
|||||||
* @param \Illuminate\Http\Request $request
|
* @param \Illuminate\Http\Request $request
|
||||||
* @return \Illuminate\Http\Response
|
* @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');
|
return $estimate->getGeneratedPDFOrStream('estimate');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -4,6 +4,7 @@ namespace Crater\Http\Controllers\V1\PDF;
|
|||||||
|
|
||||||
use Crater\Http\Controllers\Controller;
|
use Crater\Http\Controllers\Controller;
|
||||||
use Crater\Models\Invoice;
|
use Crater\Models\Invoice;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
|
||||||
class InvoicePdfController extends Controller
|
class InvoicePdfController extends Controller
|
||||||
{
|
{
|
||||||
@ -13,8 +14,12 @@ class InvoicePdfController extends Controller
|
|||||||
* @param \Illuminate\Http\Request $request
|
* @param \Illuminate\Http\Request $request
|
||||||
* @return \Illuminate\Http\Response
|
* @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');
|
return $invoice->getGeneratedPDFOrStream('invoice');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -4,6 +4,7 @@ namespace Crater\Http\Controllers\V1\PDF;
|
|||||||
|
|
||||||
use Crater\Http\Controllers\Controller;
|
use Crater\Http\Controllers\Controller;
|
||||||
use Crater\Models\Payment;
|
use Crater\Models\Payment;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
|
||||||
class PaymentPdfController extends Controller
|
class PaymentPdfController extends Controller
|
||||||
{
|
{
|
||||||
@ -13,8 +14,12 @@ class PaymentPdfController extends Controller
|
|||||||
* @param \Illuminate\Http\Request $request
|
* @param \Illuminate\Http\Request $request
|
||||||
* @return \Illuminate\Http\Response
|
* @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');
|
return $payment->getGeneratedPDFOrStream('payment');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -380,4 +380,21 @@ class Company extends Model implements HasMedia
|
|||||||
$model->taxes()->delete();
|
$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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -412,6 +412,10 @@ class Estimate extends Model implements HasMedia
|
|||||||
'taxes' => $taxes,
|
'taxes' => $taxes,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
if (request()->has('preview')) {
|
||||||
|
return view('app.pdf.estimate.'.$estimateTemplate);
|
||||||
|
}
|
||||||
|
|
||||||
return PDF::loadView('app.pdf.estimate.'.$estimateTemplate);
|
return PDF::loadView('app.pdf.estimate.'.$estimateTemplate);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -575,6 +575,10 @@ class Invoice extends Model implements HasMedia
|
|||||||
'taxes' => $taxes,
|
'taxes' => $taxes,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
if (request()->has('preview')) {
|
||||||
|
return view('app.pdf.invoice.'.$invoiceTemplate);
|
||||||
|
}
|
||||||
|
|
||||||
return PDF::loadView('app.pdf.invoice.'.$invoiceTemplate);
|
return PDF::loadView('app.pdf.invoice.'.$invoiceTemplate);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -375,6 +375,10 @@ class Payment extends Model implements HasMedia
|
|||||||
'logo' => $logo ?? null,
|
'logo' => $logo ?? null,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
if (request()->has('preview')) {
|
||||||
|
return view('app.pdf.payment.payment');
|
||||||
|
}
|
||||||
|
|
||||||
return PDF::loadView('app.pdf.payment.payment');
|
return PDF::loadView('app.pdf.payment.payment');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -305,9 +305,15 @@ class RecurringInvoice extends Model
|
|||||||
->setCustomer($this->customer_id)
|
->setCustomer($this->customer_id)
|
||||||
->setNextNumbers();
|
->setNextNumbers();
|
||||||
|
|
||||||
|
$days = CompanySetting::getSetting('invoice_due_date_days', $this->company_id);
|
||||||
|
|
||||||
|
if (! $days || $days == "null") {
|
||||||
|
$days = 7;
|
||||||
|
}
|
||||||
|
|
||||||
$newInvoice['creator_id'] = $this->creator_id;
|
$newInvoice['creator_id'] = $this->creator_id;
|
||||||
$newInvoice['invoice_date'] = Carbon::today()->format('Y-m-d');
|
$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['status'] = Invoice::STATUS_DRAFT;
|
||||||
$newInvoice['company_id'] = $this->company_id;
|
$newInvoice['company_id'] = $this->company_id;
|
||||||
$newInvoice['paid_status'] = Invoice::STATUS_UNPAID;
|
$newInvoice['paid_status'] = Invoice::STATUS_UNPAID;
|
||||||
|
|||||||
@ -0,0 +1,35 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use Crater\Models\Invoice;
|
||||||
|
use Illuminate\Database\Migrations\Migration;
|
||||||
|
|
||||||
|
class ChangeOverDueStatusToSent extends Migration
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Run the migrations.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function up()
|
||||||
|
{
|
||||||
|
$overdueInvoices = Invoice::where('status', 'OVERDUE')->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()
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -40,12 +40,12 @@ export const useRecurringInvoiceStore = (useWindow = false) => {
|
|||||||
{ label: 'Every 30 Minute', value: '*/30 * * * *' },
|
{ label: 'Every 30 Minute', value: '*/30 * * * *' },
|
||||||
{ label: 'Every Hour', value: '0 * * * *' },
|
{ label: 'Every Hour', value: '0 * * * *' },
|
||||||
{ label: 'Every 2 Hour', value: '0 */2 * * *' },
|
{ 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 Week', value: '0 0 * * 0' },
|
||||||
{ label: 'Every 15 Days', value: '0 5 */15 * *' },
|
{ label: 'Every 15 days at midnight', value: '0 5 */15 * *' },
|
||||||
{ label: 'First Day Of Month', value: '0 0 1 * *' },
|
{ 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 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' },
|
{ label: 'Custom', value: 'CUSTOM' },
|
||||||
],
|
],
|
||||||
}),
|
}),
|
||||||
|
|||||||
@ -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\AbilitiesController;
|
||||||
use Crater\Http\Controllers\V1\Admin\Role\RolesController;
|
use Crater\Http\Controllers\V1\Admin\Role\RolesController;
|
||||||
use Crater\Http\Controllers\V1\Admin\Settings\CompanyController;
|
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\DiskController;
|
||||||
use Crater\Http\Controllers\V1\Admin\Settings\GetCompanyMailConfigurationController;
|
use Crater\Http\Controllers\V1\Admin\Settings\GetCompanyMailConfigurationController;
|
||||||
use Crater\Http\Controllers\V1\Admin\Settings\GetCompanySettingsController;
|
use Crater\Http\Controllers\V1\Admin\Settings\GetCompanySettingsController;
|
||||||
@ -394,6 +395,8 @@ Route::prefix('/v1')->group(function () {
|
|||||||
|
|
||||||
Route::post('/settings', UpdateSettingsController::class);
|
Route::post('/settings', UpdateSettingsController::class);
|
||||||
|
|
||||||
|
Route::get('/company/has-transactions', CompanyCurrencyCheckTransactionsController::class);
|
||||||
|
|
||||||
|
|
||||||
// Mails
|
// Mails
|
||||||
//----------------------------------
|
//----------------------------------
|
||||||
|
|||||||
Reference in New Issue
Block a user