From 402b4c7e79bdb567a19cb2ff7cfdf450c3d43886 Mon Sep 17 00:00:00 2001 From: denisdulici Date: Sun, 26 Nov 2017 15:20:17 +0300 Subject: [PATCH] duplicate feature --- app/Http/Controllers/Controller.php | 2 +- app/Http/Controllers/Expenses/Bills.php | 18 ++++++++++ app/Http/Controllers/Expenses/Payments.php | 18 ++++++++++ app/Http/Controllers/Expenses/Vendors.php | 18 ++++++++++ app/Http/Controllers/Incomes/Customers.php | 18 ++++++++++ app/Http/Controllers/Incomes/Invoices.php | 34 ++++++++++++++----- app/Http/Controllers/Incomes/Revenues.php | 18 ++++++++++ app/Http/Controllers/Items/Items.php | 18 ++++++++++ app/Models/Expense/Bill.php | 10 +++++- app/Models/Expense/Payment.php | 3 +- app/Models/Expense/Vendor.php | 3 +- app/Models/Income/Customer.php | 9 +++-- app/Models/Income/Invoice.php | 16 ++++++++- app/Models/Income/Revenue.php | 3 +- app/Models/Item/Item.php | 5 ++- app/Traits/Incomes.php | 34 +++++++++++++++++++ composer.json | 1 + config/app.php | 1 + resources/lang/en-GB/general.php | 1 + resources/lang/en-GB/messages.php | 1 + .../views/expenses/bills/index.blade.php | 5 +++ .../views/expenses/payments/index.blade.php | 5 +++ .../views/expenses/vendors/index.blade.php | 5 +++ .../views/incomes/customers/index.blade.php | 5 +++ .../views/incomes/invoices/index.blade.php | 5 +++ .../views/incomes/revenues/index.blade.php | 5 +++ resources/views/items/items/index.blade.php | 5 +++ routes/web.php | 13 +++++-- 28 files changed, 256 insertions(+), 23 deletions(-) create mode 100644 app/Traits/Incomes.php diff --git a/app/Http/Controllers/Controller.php b/app/Http/Controllers/Controller.php index 2ec92a43f..02ec1e290 100644 --- a/app/Http/Controllers/Controller.php +++ b/app/Http/Controllers/Controller.php @@ -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'); diff --git a/app/Http/Controllers/Expenses/Bills.php b/app/Http/Controllers/Expenses/Bills.php index add0bcdc4..e6bf13da3 100644 --- a/app/Http/Controllers/Expenses/Bills.php +++ b/app/Http/Controllers/Expenses/Bills.php @@ -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. * diff --git a/app/Http/Controllers/Expenses/Payments.php b/app/Http/Controllers/Expenses/Payments.php index c2e7b8da3..89822f8df 100644 --- a/app/Http/Controllers/Expenses/Payments.php +++ b/app/Http/Controllers/Expenses/Payments.php @@ -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. * diff --git a/app/Http/Controllers/Expenses/Vendors.php b/app/Http/Controllers/Expenses/Vendors.php index b407da365..a067894fb 100644 --- a/app/Http/Controllers/Expenses/Vendors.php +++ b/app/Http/Controllers/Expenses/Vendors.php @@ -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. * diff --git a/app/Http/Controllers/Incomes/Customers.php b/app/Http/Controllers/Incomes/Customers.php index 66ab45154..9922b04b6 100644 --- a/app/Http/Controllers/Incomes/Customers.php +++ b/app/Http/Controllers/Incomes/Customers.php @@ -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. * diff --git a/app/Http/Controllers/Incomes/Invoices.php b/app/Http/Controllers/Incomes/Invoices.php index 765ddc94d..218f71f9d 100644 --- a/app/Http/Controllers/Incomes/Invoices.php +++ b/app/Http/Controllers/Incomes/Invoices.php @@ -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. * diff --git a/app/Http/Controllers/Incomes/Revenues.php b/app/Http/Controllers/Incomes/Revenues.php index 63f12770a..44e8a443f 100644 --- a/app/Http/Controllers/Incomes/Revenues.php +++ b/app/Http/Controllers/Incomes/Revenues.php @@ -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. * diff --git a/app/Http/Controllers/Items/Items.php b/app/Http/Controllers/Items/Items.php index 70026d540..b0fd510d6 100644 --- a/app/Http/Controllers/Items/Items.php +++ b/app/Http/Controllers/Items/Items.php @@ -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. * diff --git a/app/Models/Expense/Bill.php b/app/Models/Expense/Bill.php index ea726b525..a1b0ead18 100644 --- a/app/Models/Expense/Bill.php +++ b/app/Models/Expense/Bill.php @@ -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'); diff --git a/app/Models/Expense/Payment.php b/app/Models/Expense/Payment.php index 33d7da38e..ae3e230c8 100644 --- a/app/Models/Expense/Payment.php +++ b/app/Models/Expense/Payment.php @@ -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'; diff --git a/app/Models/Expense/Vendor.php b/app/Models/Expense/Vendor.php index 4911a4158..bc2090da0 100644 --- a/app/Models/Expense/Vendor.php +++ b/app/Models/Expense/Vendor.php @@ -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'; diff --git a/app/Models/Income/Customer.php b/app/Models/Income/Customer.php index 461bd5f16..9c32ecf88 100644 --- a/app/Models/Income/Customer.php +++ b/app/Models/Income/Customer.php @@ -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; + } } diff --git a/app/Models/Income/Invoice.php b/app/Models/Income/Invoice.php index 28765ce0b..73a795ee3 100644 --- a/app/Models/Income/Invoice.php +++ b/app/Models/Income/Invoice.php @@ -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. * diff --git a/app/Models/Income/Revenue.php b/app/Models/Income/Revenue.php index 0299cabff..60c4f8b89 100644 --- a/app/Models/Income/Revenue.php +++ b/app/Models/Income/Revenue.php @@ -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'; diff --git a/app/Models/Item/Item.php b/app/Models/Item/Item.php index a1008b0c3..9095186b9 100644 --- a/app/Models/Item/Item.php +++ b/app/Models/Item/Item.php @@ -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'; diff --git a/app/Traits/Incomes.php b/app/Traits/Incomes.php new file mode 100644 index 000000000..1e2dc80d6 --- /dev/null +++ b/app/Traits/Incomes.php @@ -0,0 +1,34 @@ + $next]); + setting()->save(); + } +} \ No newline at end of file diff --git a/composer.json b/composer.json index 223a33da9..dd1941bfc 100644 --- a/composer.json +++ b/composer.json @@ -14,6 +14,7 @@ "barryvdh/laravel-debugbar": "2.3.*", "barryvdh/laravel-dompdf": "0.*", "barryvdh/laravel-ide-helper": "2.3.*", + "bkwld/cloner": "3.2.*", "cknow/laravel-money": "1.0.*", "dingo/api": "1.0.0-beta8", "fzaninotto/faker": "1.6.*", diff --git a/config/app.php b/config/app.php index 62d7f7ad9..305e5c6a4 100644 --- a/config/app.php +++ b/config/app.php @@ -187,6 +187,7 @@ return [ Akaunting\Setting\Provider::class, Akaunting\Version\Provider::class, Barryvdh\DomPDF\ServiceProvider::class, + Bkwld\Cloner\ServiceProvider::class, ClickNow\Money\MoneyServiceProvider::class, Collective\Html\HtmlServiceProvider::class, Dingo\Api\Provider\LaravelServiceProvider::class, diff --git a/resources/lang/en-GB/general.php b/resources/lang/en-GB/general.php index 0e1a74067..f761c2d09 100644 --- a/resources/lang/en-GB/general.php +++ b/resources/lang/en-GB/general.php @@ -92,6 +92,7 @@ return [ 'created' => 'Created', 'id' => 'ID', 'more_actions' => 'More Actions', + 'duplicate' => 'Duplicate', 'title' => [ 'new' => 'New :type', diff --git a/resources/lang/en-GB/messages.php b/resources/lang/en-GB/messages.php index 3c9cc96eb..d6e23dd67 100644 --- a/resources/lang/en-GB/messages.php +++ b/resources/lang/en-GB/messages.php @@ -6,6 +6,7 @@ return [ 'added' => ':type added!', 'updated' => ':type updated!', 'deleted' => ':type deleted!', + 'duplicated' => ':type duplicated!', ], 'error' => [ 'not_user_company' => 'Error: You are not allowed to manage this company!', diff --git a/resources/views/expenses/bills/index.blade.php b/resources/views/expenses/bills/index.blade.php index 10d0df512..456f931bf 100644 --- a/resources/views/expenses/bills/index.blade.php +++ b/resources/views/expenses/bills/index.blade.php @@ -72,6 +72,11 @@