diff --git a/app/Http/Controllers/Common/Items.php b/app/Http/Controllers/Common/Items.php index 91aa23208..887691a0d 100644 --- a/app/Http/Controllers/Common/Items.php +++ b/app/Http/Controllers/Common/Items.php @@ -37,7 +37,7 @@ class Items extends Controller */ public function show() { - return redirect('common/items'); + return redirect()->route('items.index'); } /** @@ -76,7 +76,7 @@ class Items extends Controller flash($message)->success(); - return redirect('common/items'); + return redirect()->route('items.index'); } /** @@ -94,7 +94,7 @@ class Items extends Controller flash($message)->success(); - return redirect('common/items/' . $clone->id . '/edit'); + return redirect()->route('items.edit', $item->id); } /** @@ -106,20 +106,26 @@ class Items extends Controller */ public function import(ImportFile $import) { - $rows = $import->all(); + // Loop through all sheets + $import->each(function ($sheet) { + if ($sheet->getTitle() != 'items') { + return; + } - foreach ($rows as $row) { - $data = $row->toArray(); - $data['company_id'] = session('company_id'); + // Loop through all rows + $sheet->each(function ($row) { + $data = $row->toArray(); + $data['company_id'] = session('company_id'); - Item::create($data); - } + Item::create($data); + }); + }); $message = trans('messages.success.imported', ['type' => trans_choice('general.items', 2)]); flash($message)->success(); - return redirect('common/items'); + return redirect()->route('items.index'); } /** @@ -161,7 +167,7 @@ class Items extends Controller flash($message)->success(); - return redirect('common/items'); + return redirect()->route('items.index'); } /** @@ -190,7 +196,23 @@ class Items extends Controller flash($message)->warning(); } - return redirect('common/items'); + return redirect()->route('items.index'); + } + + /** + * Export the specified resource. + * + * @return Response + */ + public function export() + { + \Excel::create('items', function($excel) { + $excel->sheet('items', function($sheet) { + $sheet->fromModel(Item::filter(request()->input())->get()->makeHidden([ + 'id', 'company_id', 'item_id', 'created_at', 'updated_at', 'deleted_at' + ])); + }); + })->download('xlsx'); } public function autocomplete() diff --git a/app/Http/Controllers/Expenses/Bills.php b/app/Http/Controllers/Expenses/Bills.php index ea06957ba..576b61a59 100644 --- a/app/Http/Controllers/Expenses/Bills.php +++ b/app/Http/Controllers/Expenses/Bills.php @@ -291,14 +291,44 @@ class Bills extends Controller */ public function import(ImportFile $import) { - $rows = $import->all(); + // Loop through all sheets + $import->each(function ($sheet) { + $class = '\App\Models\Expense\\' . str_singular(studly_case($sheet->getTitle())); - foreach ($rows as $row) { - $data = $row->toArray(); - $data['company_id'] = session('company_id'); + if (!class_exists($class)) { + return; + } - Bill::create($data); - } + $sheet->each(function ($row) use ($sheet, $class) { + $data = $row->toArray(); + $data['company_id'] = session('company_id'); + + switch ($sheet->getTitle()) { + case 'bills': + if (empty($data['vendor_email'])) { + $data['vendor_email'] = ''; + } + break; + case 'bill_items': + if (empty($data['tax_id'])) { + $data['tax_id'] = '0'; + } + break; + case 'bill_histories': + if (empty($data['notify'])) { + $data['notify'] = '0'; + } + break; + case 'bill_totals': + if (empty($data['amount'])) { + $data['amount'] = '0'; + } + break; + } + + $class::create($data); + }); + }); $message = trans('messages.success.imported', ['type' => trans_choice('general.bills', 2)]); @@ -490,6 +520,35 @@ class Bills extends Controller return redirect('expenses/bills'); } + /** + * Export the specified resource. + * + * @return Response + */ + public function export() + { + \Excel::create('bills', function($excel) { + $bills = Bill::with(['items', 'payments', 'totals'])->filter(request()->input())->get(); + + $excel->sheet('invoices', function($sheet) use ($bills) { + $sheet->fromModel($bills->makeHidden([ + 'company_id', 'parent_id', 'created_at', 'updated_at', 'deleted_at', 'attachment', 'discount', 'items', 'payments', 'totals', 'media' + ])); + }); + + $tables = ['items', 'histories', 'payments', 'totals']; + foreach ($tables as $table) { + $excel->sheet('bill_' . $table, function($sheet) use ($bills, $table) { + $bills->each(function ($bill) use ($sheet, $table) { + $sheet->fromModel($bill->$table->makeHidden([ + 'id', 'company_id', 'created_at', 'updated_at', 'deleted_at' + ])); + }); + }); + } + })->download('xlsx'); + } + /** * Mark the bill as received. * diff --git a/app/Http/Controllers/Expenses/Payments.php b/app/Http/Controllers/Expenses/Payments.php index 25fc05f3a..4e64ed7c3 100644 --- a/app/Http/Controllers/Expenses/Payments.php +++ b/app/Http/Controllers/Expenses/Payments.php @@ -133,14 +133,20 @@ class Payments extends Controller */ public function import(ImportFile $import) { - $rows = $import->all(); + // Loop through all sheets + $import->each(function ($sheet) { + if ($sheet->getTitle() != 'payments') { + return; + } - foreach ($rows as $row) { - $data = $row->toArray(); - $data['company_id'] = session('company_id'); + // Loop through all rows + $sheet->each(function ($row) { + $data = $row->toArray(); + $data['company_id'] = session('company_id'); - Payment::create($data); - } + Payment::create($data); + }); + }); $message = trans('messages.success.imported', ['type' => trans_choice('general.payments', 2)]); @@ -231,4 +237,20 @@ class Payments extends Controller return redirect('expenses/payments'); } + + /** + * Export the specified resource. + * + * @return Response + */ + public function export() + { + \Excel::create('payments', function($excel) { + $excel->sheet('payments', function($sheet) { + $sheet->fromModel(Payment::filter(request()->input())->get()->makeHidden([ + 'id', 'company_id', 'parent_id', 'created_at', 'updated_at', 'deleted_at' + ])); + }); + })->download('xlsx'); + } } diff --git a/app/Http/Controllers/Expenses/Vendors.php b/app/Http/Controllers/Expenses/Vendors.php index 2a5046831..e870fa396 100644 --- a/app/Http/Controllers/Expenses/Vendors.php +++ b/app/Http/Controllers/Expenses/Vendors.php @@ -171,19 +171,25 @@ class Vendors extends Controller */ public function import(ImportFile $import) { - $rows = $import->all(); - - foreach ($rows as $row) { - $data = $row->toArray(); - - if (empty($data['email'])) { - $data['email'] = ''; + // Loop through all sheets + $import->each(function ($sheet) { + if ($sheet->getTitle() != 'vendors') { + return; } - $data['company_id'] = session('company_id'); + // Loop through all rows + $sheet->each(function ($row) { + $data = $row->toArray(); - Vendor::create($data); - } + if (empty($data['email'])) { + $data['email'] = ''; + } + + $data['company_id'] = session('company_id'); + + Vendor::create($data); + }); + }); $message = trans('messages.success.imported', ['type' => trans_choice('general.vendors', 2)]); @@ -265,6 +271,22 @@ class Vendors extends Controller return redirect('expenses/vendors'); } + /** + * Export the specified resource. + * + * @return Response + */ + public function export() + { + \Excel::create('vendors', function($excel) { + $excel->sheet('vendors', function($sheet) { + $sheet->fromModel(Vendor::filter(request()->input())->get()->makeHidden([ + 'id', 'company_id', 'created_at', 'updated_at', 'deleted_at' + ])); + }); + })->download('xlsx'); + } + public function currency() { $vendor_id = request('vendor_id'); diff --git a/app/Http/Controllers/Incomes/Customers.php b/app/Http/Controllers/Incomes/Customers.php index e187f2763..c49fb46d9 100644 --- a/app/Http/Controllers/Incomes/Customers.php +++ b/app/Http/Controllers/Incomes/Customers.php @@ -191,19 +191,25 @@ class Customers extends Controller */ public function import(ImportFile $import) { - $rows = $import->all(); - - foreach ($rows as $row) { - $data = $row->toArray(); - - if (empty($data['email'])) { - $data['email'] = ''; + // Loop through all sheets + $import->each(function ($sheet) { + if ($sheet->getTitle() != 'customers') { + return; } - $data['company_id'] = session('company_id'); + // Loop through all rows + $sheet->each(function ($row) { + $data = $row->toArray(); - Customer::create($data); - } + if (empty($data['email'])) { + $data['email'] = ''; + } + + $data['company_id'] = session('company_id'); + + Customer::create($data); + }); + }); $message = trans('messages.success.imported', ['type' => trans_choice('general.customers', 2)]); @@ -301,6 +307,22 @@ class Customers extends Controller return redirect('incomes/customers'); } + /** + * Export the specified resource. + * + * @return Response + */ + public function export() + { + \Excel::create('customers', function($excel) { + $excel->sheet('customers', function($sheet) { + $sheet->fromModel(Customer::filter(request()->input())->get()->makeHidden([ + 'id', 'company_id', 'created_at', 'updated_at', 'deleted_at' + ])); + }); + })->download('xlsx'); + } + public function currency() { $customer_id = request('customer_id'); diff --git a/app/Http/Controllers/Incomes/Invoices.php b/app/Http/Controllers/Incomes/Invoices.php index 39eb2dc9c..405fa703b 100644 --- a/app/Http/Controllers/Incomes/Invoices.php +++ b/app/Http/Controllers/Incomes/Invoices.php @@ -312,14 +312,44 @@ class Invoices extends Controller */ public function import(ImportFile $import) { - $rows = $import->all(); + // Loop through all sheets + $import->each(function ($sheet) { + $class = '\App\Models\Income\\' . str_singular(studly_case($sheet->getTitle())); - foreach ($rows as $row) { - $data = $row->toArray(); - $data['company_id'] = session('company_id'); + if (!class_exists($class)) { + return; + } - Invoice::create($data); - } + $sheet->each(function ($row) use ($sheet, $class) { + $data = $row->toArray(); + $data['company_id'] = session('company_id'); + + switch ($sheet->getTitle()) { + case 'invoices': + if (empty($data['customer_email'])) { + $data['customer_email'] = ''; + } + break; + case 'invoice_items': + if (empty($data['tax_id'])) { + $data['tax_id'] = '0'; + } + break; + case 'invoice_histories': + if (empty($data['notify'])) { + $data['notify'] = '0'; + } + break; + case 'invoice_totals': + if (empty($data['amount'])) { + $data['amount'] = '0'; + } + break; + } + + $class::create($data); + }); + }); $message = trans('messages.success.imported', ['type' => trans_choice('general.invoices', 2)]); @@ -511,6 +541,35 @@ class Invoices extends Controller return redirect('incomes/invoices'); } + /** + * Export the specified resource. + * + * @return Response + */ + public function export() + { + \Excel::create('invoices', function($excel) { + $invoices = Invoice::with(['items', 'payments', 'totals'])->filter(request()->input())->get(); + + $excel->sheet('invoices', function($sheet) use ($invoices) { + $sheet->fromModel($invoices->makeHidden([ + 'company_id', 'parent_id', 'created_at', 'updated_at', 'deleted_at', 'attachment', 'discount', 'items', 'payments', 'totals', 'media' + ])); + }); + + $tables = ['items', 'histories', 'payments', 'totals']; + foreach ($tables as $table) { + $excel->sheet('invoice_' . $table, function($sheet) use ($invoices, $table) { + $invoices->each(function ($bill) use ($sheet, $table) { + $sheet->fromModel($bill->$table->makeHidden([ + 'id', 'company_id', 'created_at', 'updated_at', 'deleted_at' + ])); + }); + }); + } + })->download('xlsx'); + } + /** * Mark the invoice as sent. * diff --git a/app/Http/Controllers/Incomes/Revenues.php b/app/Http/Controllers/Incomes/Revenues.php index 1ca3080f9..093ac327e 100644 --- a/app/Http/Controllers/Incomes/Revenues.php +++ b/app/Http/Controllers/Incomes/Revenues.php @@ -135,14 +135,20 @@ class Revenues extends Controller */ public function import(ImportFile $import) { - $rows = $import->all(); + // Loop through all sheets + $import->each(function ($sheet) { + if ($sheet->getTitle() != 'revenues') { + return; + } - foreach ($rows as $row) { - $data = $row->toArray(); - $data['company_id'] = session('company_id'); + // Loop through all rows + $sheet->each(function ($row) { + $data = $row->toArray(); + $data['company_id'] = session('company_id'); - Revenue::create($data); - } + Revenue::create($data); + }); + }); $message = trans('messages.success.imported', ['type' => trans_choice('general.revenues', 2)]); @@ -233,4 +239,20 @@ class Revenues extends Controller return redirect('incomes/revenues'); } + + /** + * Export the specified resource. + * + * @return Response + */ + public function export() + { + \Excel::create('revenues', function($excel) { + $excel->sheet('revenues', function($sheet) { + $sheet->fromModel(Revenue::filter(request()->input())->get()->makeHidden([ + 'id', 'company_id', 'parent_id', 'created_at', 'updated_at', 'deleted_at' + ])); + }); + })->download('xlsx'); + } } diff --git a/config/excel.php b/config/excel.php index 3e682141b..d7bc5b549 100644 --- a/config/excel.php +++ b/config/excel.php @@ -476,7 +476,7 @@ return array( | When set to true, it will return a sheet collection instead. | */ - 'force_sheets_collection' => false, + 'force_sheets_collection' => true, /* |-------------------------------------------------------------------------- diff --git a/public/files/import/bills.csv b/public/files/import/bills.csv deleted file mode 100644 index 0c7b77ffa..000000000 --- a/public/files/import/bills.csv +++ /dev/null @@ -1,2 +0,0 @@ -"bill_number","order_number","bill_status_code","billed_at","due_at","amount","currency_code","currency_rate","vendor_id","vendor_name","vendor_email","vendor_tax_number","vendor_phone","vendor_address","notes","category_id" -"987654","","received","2017-11-30","2017-12-07","10.0000","USD","1.00000000","1","Test Vendor","test@vendor.com","","","","","4" diff --git a/public/files/import/bills.xlsx b/public/files/import/bills.xlsx new file mode 100644 index 000000000..633860665 Binary files /dev/null and b/public/files/import/bills.xlsx differ diff --git a/public/files/import/customers.csv b/public/files/import/customers.csv deleted file mode 100644 index 953144e4b..000000000 --- a/public/files/import/customers.csv +++ /dev/null @@ -1,2 +0,0 @@ -"user_id","name","email","tax_number","phone","address","website","currency_code","enabled" -"","Test Customer","test@customer.com","","","","","USD","1" diff --git a/public/files/import/customers.xlsx b/public/files/import/customers.xlsx new file mode 100644 index 000000000..b481ac665 Binary files /dev/null and b/public/files/import/customers.xlsx differ diff --git a/public/files/import/invoices.csv b/public/files/import/invoices.csv deleted file mode 100644 index fb2f3f903..000000000 --- a/public/files/import/invoices.csv +++ /dev/null @@ -1,2 +0,0 @@ -"invoice_number","order_number","invoice_status_code","invoiced_at","due_at","amount","currency_code","currency_rate","customer_id","customer_name","customer_email","customer_tax_number","customer_phone","customer_address","notes","category_id" -"INV-00001","","sent","2017-11-30","2017-12-07","10.0000","USD","1.00000000","1","Test Customer","test@customer.com","","","","","3" diff --git a/public/files/import/invoices.xlsx b/public/files/import/invoices.xlsx new file mode 100644 index 000000000..bc8c084de Binary files /dev/null and b/public/files/import/invoices.xlsx differ diff --git a/public/files/import/items.csv b/public/files/import/items.csv deleted file mode 100644 index fce9bd71d..000000000 --- a/public/files/import/items.csv +++ /dev/null @@ -1,2 +0,0 @@ -"name","sku","description","sale_price","purchase_price","quantity","category_id","tax_id","enabled" -"Test Item","test-item","","10.0000","5.0000","1","5","2","1" diff --git a/public/files/import/items.xlsx b/public/files/import/items.xlsx new file mode 100644 index 000000000..cc43dcec1 Binary files /dev/null and b/public/files/import/items.xlsx differ diff --git a/public/files/import/payments.csv b/public/files/import/payments.csv deleted file mode 100644 index 221938ce9..000000000 --- a/public/files/import/payments.csv +++ /dev/null @@ -1,2 +0,0 @@ -"account_id","paid_at","amount","currency_code","currency_rate","vendor_id","description","category_id","payment_method","reference" -"1","2017-11-30","10.0000","USD","1.00000000","1","","4","offlinepayment.cash.1","" diff --git a/public/files/import/payments.xlsx b/public/files/import/payments.xlsx new file mode 100644 index 000000000..c7c9e1a12 Binary files /dev/null and b/public/files/import/payments.xlsx differ diff --git a/public/files/import/revenues.csv b/public/files/import/revenues.csv deleted file mode 100644 index 1273b92bc..000000000 --- a/public/files/import/revenues.csv +++ /dev/null @@ -1,2 +0,0 @@ -"account_id","paid_at","amount","currency_code","currency_rate","customer_id","description","category_id","payment_method","reference" -"1","2017-11-30","10.0000","USD","1.00000000","","","3","offlinepayment.cash.1","" diff --git a/public/files/import/revenues.xlsx b/public/files/import/revenues.xlsx new file mode 100644 index 000000000..e740bdfae Binary files /dev/null and b/public/files/import/revenues.xlsx differ diff --git a/public/files/import/vendors.csv b/public/files/import/vendors.csv deleted file mode 100644 index 17d373d37..000000000 --- a/public/files/import/vendors.csv +++ /dev/null @@ -1,2 +0,0 @@ -"name","email","tax_number","phone","address","website","currency_code","enabled" -"Test Vendor","test@vendor.com","","","","","USD","1" diff --git a/public/files/import/vendors.xlsx b/public/files/import/vendors.xlsx new file mode 100644 index 000000000..61fcd833a Binary files /dev/null and b/public/files/import/vendors.xlsx differ diff --git a/resources/lang/en-GB/general.php b/resources/lang/en-GB/general.php index 45e49a617..730280f04 100644 --- a/resources/lang/en-GB/general.php +++ b/resources/lang/en-GB/general.php @@ -100,6 +100,7 @@ return [ 'overdue' => 'Overdue', 'partially' => 'Partially', 'partially_paid' => 'Partially Paid', + 'export' => 'Export', 'title' => [ 'new' => 'New :type', diff --git a/resources/lang/en-GB/import.php b/resources/lang/en-GB/import.php index fe5acbbc0..d4a326edf 100644 --- a/resources/lang/en-GB/import.php +++ b/resources/lang/en-GB/import.php @@ -4,6 +4,6 @@ return [ 'import' => 'Import', 'title' => 'Import :type', - 'message' => 'Allowed file types: CSV, XLS. Please, download the sample file.', + 'message' => 'Allowed file types: XLS, XLSX. Please, download the sample file.', ]; diff --git a/resources/views/common/import/create.blade.php b/resources/views/common/import/create.blade.php index 07cb70c93..77b4df6fe 100644 --- a/resources/views/common/import/create.blade.php +++ b/resources/views/common/import/create.blade.php @@ -9,7 +9,7 @@
- {!! trans('import.message', ['link' => url('public/files/import/' . $type . '.csv')]) !!} + {!! trans('import.message', ['link' => url('public/files/import/' . $type . '.xlsx')]) !!}
diff --git a/resources/views/common/items/create.blade.php b/resources/views/common/items/create.blade.php index 42a238557..c179c22d7 100644 --- a/resources/views/common/items/create.blade.php +++ b/resources/views/common/items/create.blade.php @@ -5,7 +5,7 @@ @section('content')
- {!! Form::open(['url' => 'common/items', 'files' => true, 'role' => 'form']) !!} + {!! Form::open(['route' => 'items.store', 'files' => true, 'role' => 'form']) !!}
{{ Form::textGroup('name', trans('general.name'), 'id-card-o') }} diff --git a/resources/views/common/items/edit.blade.php b/resources/views/common/items/edit.blade.php index eefaf318e..92dcd1930 100644 --- a/resources/views/common/items/edit.blade.php +++ b/resources/views/common/items/edit.blade.php @@ -8,7 +8,7 @@ {!! Form::model($item, [ 'method' => 'PATCH', 'files' => true, - 'url' => ['common/items', $item->id], + 'route' => ['items.update', $item->id], 'role' => 'form' ]) !!} diff --git a/resources/views/common/items/index.blade.php b/resources/views/common/items/index.blade.php index 07242a725..4248fc250 100644 --- a/resources/views/common/items/index.blade.php +++ b/resources/views/common/items/index.blade.php @@ -2,18 +2,19 @@ @section('title', trans_choice('general.items', 2)) -@permission('create-common-items') @section('new_button') -  {{ trans('general.add_new') }} -  {{ trans('import.import') }} -@endsection +@permission('create-common-items') +  {{ trans('general.add_new') }} +  {{ trans('import.import') }} @endpermission +  {{ trans('general.export') }} +@endsection @section('content')
- {!! Form::open(['url' => 'common/items', 'role' => 'form', 'method' => 'GET']) !!} + {!! Form::open(['route' => 'items.index', 'role' => 'form', 'method' => 'GET']) !!}
{!! Form::text('search', request('search'), ['class' => 'form-control input-filter input-sm', 'placeholder' => trans('general.search_placeholder')]) !!} @@ -47,7 +48,7 @@ @foreach($items as $item) {{ $item->name }} - {{ $item->name }} + {{ $item->name }} {{ $item->category ? $item->category->name : trans('general.na') }} {{ $item->quantity }} {{ money($item->sale_price, setting('general.default_currency'), true) }} @@ -65,10 +66,10 @@