duplicate feature
This commit is contained in:
@ -39,7 +39,7 @@ class Controller extends BaseController
|
||||
}
|
||||
|
||||
// Add CRUD permission check
|
||||
$this->middleware('permission:create-' . $controller)->only(['create', 'store']);
|
||||
$this->middleware('permission:create-' . $controller)->only(['create', 'store', 'duplicate']);
|
||||
$this->middleware('permission:read-' . $controller)->only(['index', 'show', 'edit']);
|
||||
$this->middleware('permission:update-' . $controller)->only(['update']);
|
||||
$this->middleware('permission:delete-' . $controller)->only('destroy');
|
||||
|
@ -261,6 +261,24 @@ class Bills extends Controller
|
||||
return redirect('expenses/bills/' . $bill->id);
|
||||
}
|
||||
|
||||
/**
|
||||
* Duplicate the specified resource.
|
||||
*
|
||||
* @param Bill $bill
|
||||
*
|
||||
* @return Response
|
||||
*/
|
||||
public function duplicate(Bill $bill)
|
||||
{
|
||||
$clone = $bill->duplicate();
|
||||
|
||||
$message = trans('messages.success.duplicated', ['type' => trans_choice('general.bills', 1)]);
|
||||
|
||||
flash($message)->success();
|
||||
|
||||
return redirect('expenses/bills/' . $clone->id . '/edit');
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the form for editing the specified resource.
|
||||
*
|
||||
|
@ -90,6 +90,24 @@ class Payments extends Controller
|
||||
return redirect('expenses/payments');
|
||||
}
|
||||
|
||||
/**
|
||||
* Duplicate the specified resource.
|
||||
*
|
||||
* @param Payment $payment
|
||||
*
|
||||
* @return Response
|
||||
*/
|
||||
public function duplicate(Payment $payment)
|
||||
{
|
||||
$clone = $payment->duplicate();
|
||||
|
||||
$message = trans('messages.success.duplicated', ['type' => trans_choice('general.payments', 1)]);
|
||||
|
||||
flash($message)->success();
|
||||
|
||||
return redirect('expenses/payments/' . $clone->id . '/edit');
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the form for editing the specified resource.
|
||||
*
|
||||
|
@ -52,6 +52,24 @@ class Vendors extends Controller
|
||||
return redirect('expenses/vendors');
|
||||
}
|
||||
|
||||
/**
|
||||
* Duplicate the specified resource.
|
||||
*
|
||||
* @param Vendor $vendor
|
||||
*
|
||||
* @return Response
|
||||
*/
|
||||
public function duplicate(Vendor $vendor)
|
||||
{
|
||||
$clone = $vendor->duplicate();
|
||||
|
||||
$message = trans('messages.success.duplicated', ['type' => trans_choice('general.vendors', 1)]);
|
||||
|
||||
flash($message)->success();
|
||||
|
||||
return redirect('expenses/vendors/' . $clone->id . '/edit');
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the form for editing the specified resource.
|
||||
*
|
||||
|
@ -83,6 +83,24 @@ class Customers extends Controller
|
||||
return redirect('incomes/customers');
|
||||
}
|
||||
|
||||
/**
|
||||
* Duplicate the specified resource.
|
||||
*
|
||||
* @param Customer $customer
|
||||
*
|
||||
* @return Response
|
||||
*/
|
||||
public function duplicate(Customer $customer)
|
||||
{
|
||||
$clone = $customer->duplicate();
|
||||
|
||||
$message = trans('messages.success.duplicated', ['type' => trans_choice('general.customers', 1)]);
|
||||
|
||||
flash($message)->success();
|
||||
|
||||
return redirect('incomes/customers/' . $clone->id . '/edit');
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the form for editing the specified resource.
|
||||
*
|
||||
|
@ -24,6 +24,7 @@ use App\Notifications\Income\Invoice as Notification;
|
||||
use App\Notifications\Item\Item as ItemNotification;
|
||||
use App\Traits\Currencies;
|
||||
use App\Traits\DateTime;
|
||||
use App\Traits\Incomes;
|
||||
use App\Traits\Uploads;
|
||||
use App\Utilities\Modules;
|
||||
use Date;
|
||||
@ -31,7 +32,7 @@ use File;
|
||||
|
||||
class Invoices extends Controller
|
||||
{
|
||||
use DateTime, Currencies, Uploads;
|
||||
use DateTime, Currencies, Incomes, Uploads;
|
||||
|
||||
/**
|
||||
* Display a listing of the resource.
|
||||
@ -100,11 +101,7 @@ class Invoices extends Controller
|
||||
|
||||
$taxes = Tax::enabled()->pluck('name', 'id');
|
||||
|
||||
// Generate next invoice number
|
||||
$prefix = setting('general.invoice_number_prefix', 'INV-');
|
||||
$next = setting('general.invoice_number_next', '1');
|
||||
$digit = setting('general.invoice_number_digit', '5');
|
||||
$number = $prefix . str_pad($next, $digit, '0', STR_PAD_LEFT);
|
||||
$number = $this->getNextInvoiceNumber();
|
||||
|
||||
return view('incomes.invoices.create', compact('customers', 'currencies', 'items', 'taxes', 'number'));
|
||||
}
|
||||
@ -235,9 +232,7 @@ class Invoices extends Controller
|
||||
InvoiceHistory::create($request->all());
|
||||
|
||||
// Update next invoice number
|
||||
$next = setting('general.invoice_number_next', 1) + 1;
|
||||
setting(['general.invoice_number_next' => $next]);
|
||||
setting()->save();
|
||||
$this->increaseNextInvoiceNumber();
|
||||
|
||||
// Fire the event to make it extendible
|
||||
event(new InvoiceCreated($invoice));
|
||||
@ -249,6 +244,27 @@ class Invoices extends Controller
|
||||
return redirect('incomes/invoices/' . $invoice->id);
|
||||
}
|
||||
|
||||
/**
|
||||
* Duplicate the specified resource.
|
||||
*
|
||||
* @param Invoice $invoice
|
||||
*
|
||||
* @return Response
|
||||
*/
|
||||
public function duplicate(Invoice $invoice)
|
||||
{
|
||||
$clone = $invoice->duplicate();
|
||||
|
||||
// Update next invoice number
|
||||
$this->increaseNextInvoiceNumber();
|
||||
|
||||
$message = trans('messages.success.duplicated', ['type' => trans_choice('general.invoices', 1)]);
|
||||
|
||||
flash($message)->success();
|
||||
|
||||
return redirect('incomes/invoices/' . $clone->id . '/edit');
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the form for editing the specified resource.
|
||||
*
|
||||
|
@ -91,6 +91,24 @@ class Revenues extends Controller
|
||||
return redirect('incomes/revenues');
|
||||
}
|
||||
|
||||
/**
|
||||
* Duplicate the specified resource.
|
||||
*
|
||||
* @param Revenue $revenue
|
||||
*
|
||||
* @return Response
|
||||
*/
|
||||
public function duplicate(Revenue $revenue)
|
||||
{
|
||||
$clone = $revenue->duplicate();
|
||||
|
||||
$message = trans('messages.success.duplicated', ['type' => trans_choice('general.revenues', 1)]);
|
||||
|
||||
flash($message)->success();
|
||||
|
||||
return redirect('incomes/revenues/' . $clone->id . '/edit');
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the form for editing the specified resource.
|
||||
*
|
||||
|
@ -67,6 +67,24 @@ class Items extends Controller
|
||||
return redirect('items/items');
|
||||
}
|
||||
|
||||
/**
|
||||
* Duplicate the specified resource.
|
||||
*
|
||||
* @param Item $item
|
||||
*
|
||||
* @return Response
|
||||
*/
|
||||
public function duplicate(Item $item)
|
||||
{
|
||||
$clone = $item->duplicate();
|
||||
|
||||
$message = trans('messages.success.duplicated', ['type' => trans_choice('general.items', 1)]);
|
||||
|
||||
flash($message)->success();
|
||||
|
||||
return redirect('items/items/' . $clone->id . '/edit');
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the form for editing the specified resource.
|
||||
*
|
||||
|
@ -5,11 +5,12 @@ namespace App\Models\Expense;
|
||||
use App\Models\Model;
|
||||
use App\Traits\Currencies;
|
||||
use App\Traits\DateTime;
|
||||
use Bkwld\Cloner\Cloneable;
|
||||
use Sofa\Eloquence\Eloquence;
|
||||
|
||||
class Bill extends Model
|
||||
{
|
||||
use Currencies, DateTime, Eloquence;
|
||||
use Cloneable, Currencies, DateTime, Eloquence;
|
||||
|
||||
protected $table = 'bills';
|
||||
|
||||
@ -44,6 +45,13 @@ class Bill extends Model
|
||||
'notes' => 2,
|
||||
];
|
||||
|
||||
/**
|
||||
* Clonable relationships.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $cloneable_relations = ['histories', 'items', 'payments', 'totals'];
|
||||
|
||||
public function vendor()
|
||||
{
|
||||
return $this->belongsTo('App\Models\Expense\Vendor');
|
||||
|
@ -5,11 +5,12 @@ namespace App\Models\Expense;
|
||||
use App\Models\Model;
|
||||
use App\Traits\Currencies;
|
||||
use App\Traits\DateTime;
|
||||
use Bkwld\Cloner\Cloneable;
|
||||
use Sofa\Eloquence\Eloquence;
|
||||
|
||||
class Payment extends Model
|
||||
{
|
||||
use Currencies, DateTime, Eloquence;
|
||||
use Cloneable, Currencies, DateTime, Eloquence;
|
||||
|
||||
protected $table = 'payments';
|
||||
|
||||
|
@ -3,11 +3,12 @@
|
||||
namespace App\Models\Expense;
|
||||
|
||||
use App\Models\Model;
|
||||
use Bkwld\Cloner\Cloneable;
|
||||
use Sofa\Eloquence\Eloquence;
|
||||
|
||||
class Vendor extends Model
|
||||
{
|
||||
use Eloquence;
|
||||
use Cloneable, Eloquence;
|
||||
|
||||
protected $table = 'vendors';
|
||||
|
||||
|
@ -3,13 +3,13 @@
|
||||
namespace App\Models\Income;
|
||||
|
||||
use App\Models\Model;
|
||||
use Bkwld\Cloner\Cloneable;
|
||||
use Illuminate\Notifications\Notifiable;
|
||||
use Sofa\Eloquence\Eloquence;
|
||||
|
||||
class Customer extends Model
|
||||
{
|
||||
use Eloquence;
|
||||
use Notifiable;
|
||||
use Cloneable, Eloquence, Notifiable;
|
||||
|
||||
protected $table = 'customers';
|
||||
|
||||
@ -59,4 +59,9 @@ class Customer extends Model
|
||||
{
|
||||
return $this->belongsTo('App\Models\Auth\User', 'customer_id', 'id');
|
||||
}
|
||||
|
||||
public function onCloning($src, $child = null)
|
||||
{
|
||||
$this->user_id = null;
|
||||
}
|
||||
}
|
||||
|
@ -5,11 +5,13 @@ namespace App\Models\Income;
|
||||
use App\Models\Model;
|
||||
use App\Traits\Currencies;
|
||||
use App\Traits\DateTime;
|
||||
use App\Traits\Incomes;
|
||||
use Bkwld\Cloner\Cloneable;
|
||||
use Sofa\Eloquence\Eloquence;
|
||||
|
||||
class Invoice extends Model
|
||||
{
|
||||
use Currencies, DateTime, Eloquence;
|
||||
use Cloneable, Currencies, DateTime, Eloquence, Incomes;
|
||||
|
||||
protected $table = 'invoices';
|
||||
|
||||
@ -44,6 +46,13 @@ class Invoice extends Model
|
||||
'notes' => 2,
|
||||
];
|
||||
|
||||
/**
|
||||
* Clonable relationships.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $cloneable_relations = ['histories', 'items', 'payments', 'totals'];
|
||||
|
||||
public function user()
|
||||
{
|
||||
return $this->belongsTo('App\Models\Auth\User', 'customer_id', 'id');
|
||||
@ -99,6 +108,11 @@ class Invoice extends Model
|
||||
return $query->where('invoice_status_code', '!=', 'draft');
|
||||
}
|
||||
|
||||
public function onCloning($src, $child = null)
|
||||
{
|
||||
$this->invoice_number = $this->getNextInvoiceNumber();
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert amount to double.
|
||||
*
|
||||
|
@ -5,11 +5,12 @@ namespace App\Models\Income;
|
||||
use App\Models\Model;
|
||||
use App\Traits\Currencies;
|
||||
use App\Traits\DateTime;
|
||||
use Bkwld\Cloner\Cloneable;
|
||||
use Sofa\Eloquence\Eloquence;
|
||||
|
||||
class Revenue extends Model
|
||||
{
|
||||
use Currencies, DateTime, Eloquence;
|
||||
use Cloneable, Currencies, DateTime, Eloquence;
|
||||
|
||||
protected $table = 'revenues';
|
||||
|
||||
|
@ -3,14 +3,13 @@
|
||||
namespace App\Models\Item;
|
||||
|
||||
use App\Models\Model;
|
||||
use App\Models\Expense\Bill;
|
||||
use App\Models\Income\Invoice;
|
||||
use App\Traits\Currencies;
|
||||
use Bkwld\Cloner\Cloneable;
|
||||
use Sofa\Eloquence\Eloquence;
|
||||
|
||||
class Item extends Model
|
||||
{
|
||||
use Currencies, Eloquence;
|
||||
use Cloneable, Currencies, Eloquence;
|
||||
|
||||
protected $table = 'items';
|
||||
|
||||
|
34
app/Traits/Incomes.php
Normal file
34
app/Traits/Incomes.php
Normal file
@ -0,0 +1,34 @@
|
||||
<?php
|
||||
|
||||
namespace App\Traits;
|
||||
|
||||
trait Incomes
|
||||
{
|
||||
|
||||
/**
|
||||
* Generate next invoice number
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getNextInvoiceNumber()
|
||||
{
|
||||
$prefix = setting('general.invoice_number_prefix', 'INV-');
|
||||
$next = setting('general.invoice_number_next', '1');
|
||||
$digit = setting('general.invoice_number_digit', '5');
|
||||
|
||||
$number = $prefix . str_pad($next, $digit, '0', STR_PAD_LEFT);
|
||||
|
||||
return $number;
|
||||
}
|
||||
|
||||
/**
|
||||
* Increase the next invoice number
|
||||
*/
|
||||
public function increaseNextInvoiceNumber()
|
||||
{
|
||||
// Update next invoice number
|
||||
$next = setting('general.invoice_number_next', 1) + 1;
|
||||
setting(['general.invoice_number_next' => $next]);
|
||||
setting()->save();
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user