├── .editorconfig
├── .env.example
├── .gitattributes
├── .gitignore
├── .styleci.yml
├── LICENSE
├── README.md
├── app
├── Console
│ └── Kernel.php
├── Exceptions
│ └── Handler.php
├── Http
│ ├── Controllers
│ │ ├── Controller.php
│ │ └── CustomerController.php
│ ├── Kernel.php
│ ├── Middleware
│ │ ├── Authenticate.php
│ │ ├── EncryptCookies.php
│ │ ├── PreventRequestsDuringMaintenance.php
│ │ ├── RedirectIfAuthenticated.php
│ │ ├── TrimStrings.php
│ │ ├── TrustHosts.php
│ │ ├── TrustProxies.php
│ │ └── VerifyCsrfToken.php
│ └── Requests
│ │ ├── CustomerRequest.php
│ │ └── ImportRequest.php
├── Import
│ └── CustomerImport.php
├── Models
│ ├── Customer.php
│ └── User.php
├── Providers
│ ├── AppServiceProvider.php
│ ├── AuthServiceProvider.php
│ ├── BroadcastServiceProvider.php
│ ├── EventServiceProvider.php
│ └── RouteServiceProvider.php
├── Report
│ └── CustomerReport.php
├── Rules
│ └── RightCpf.php
└── Tools
│ └── Sanitize.php
├── artisan
├── bootstrap
├── app.php
└── cache
│ └── .gitignore
├── composer.json
├── composer.lock
├── config
├── app.php
├── auth.php
├── broadcasting.php
├── cache.php
├── cors.php
├── database.php
├── filesystems.php
├── hashing.php
├── logging.php
├── mail.php
├── queue.php
├── services.php
├── session.php
└── view.php
├── database
├── .gitignore
├── factories
│ └── UserFactory.php
├── migrations
│ ├── 2014_10_12_000000_create_users_table.php
│ ├── 2014_10_12_100000_create_password_resets_table.php
│ ├── 2019_08_19_000000_create_failed_jobs_table.php
│ └── 2021_03_28_021910_create_customers_table.php
└── seeders
│ └── DatabaseSeeder.php
├── importacao_clientes.xlsx
├── package.json
├── public
├── .htaccess
├── favicon.ico
├── index.php
├── robots.txt
├── vendor
│ ├── jquery
│ │ ├── jquery.js
│ │ ├── jquery.min.js
│ │ └── jquery.min.map
│ ├── toast
│ │ ├── toast.css
│ │ └── toast.js
│ └── toastr
│ │ ├── toastr.css
│ │ └── toastr.js
└── web.config
├── resources
├── css
│ └── app.css
├── js
│ ├── app.js
│ └── bootstrap.js
├── lang
│ ├── en
│ │ ├── auth.php
│ │ ├── pagination.php
│ │ ├── passwords.php
│ │ ├── platform.php
│ │ └── validation.php
│ ├── pt_BR.json
│ └── pt_BR
│ │ ├── auth.php
│ │ ├── pagination.php
│ │ ├── passwords.php
│ │ ├── platform.php
│ │ └── validation.php
└── views
│ ├── customer
│ ├── create.blade.php
│ ├── edit.blade.php
│ ├── import.blade.php
│ └── index.blade.php
│ ├── errors
│ ├── 401.blade.php
│ ├── 403.blade.php
│ ├── 404.blade.php
│ ├── 419.blade.php
│ ├── 429.blade.php
│ ├── 500.blade.php
│ ├── 503.blade.php
│ ├── illustrated-layout.blade.php
│ ├── layout.blade.php
│ └── minimal.blade.php
│ ├── layouts
│ └── app.blade.php
│ └── welcome.blade.php
├── routes
├── api.php
├── channels.php
├── console.php
└── web.php
├── server.php
├── storage
├── app
│ ├── .gitignore
│ └── public
│ │ ├── .gitignore
│ │ └── report
│ │ ├── .gitignore
│ │ └── customer
│ │ └── .gitignore
├── framework
│ ├── .gitignore
│ ├── cache
│ │ ├── .gitignore
│ │ └── data
│ │ │ └── .gitignore
│ ├── sessions
│ │ └── .gitignore
│ ├── testing
│ │ └── .gitignore
│ └── views
│ │ └── .gitignore
└── logs
│ └── .gitignore
├── tests
├── CreatesApplication.php
├── Feature
│ └── ExampleTest.php
├── TestCase.php
└── Unit
│ └── ExampleTest.php
└── webpack.mix.js
/.editorconfig:
--------------------------------------------------------------------------------
1 | root = true
2 |
3 | [*]
4 | charset = utf-8
5 | end_of_line = lf
6 | insert_final_newline = true
7 | indent_style = space
8 | indent_size = 4
9 | trim_trailing_whitespace = true
10 |
11 | [*.md]
12 | trim_trailing_whitespace = false
13 |
14 | [*.{yml,yaml}]
15 | indent_size = 2
16 |
--------------------------------------------------------------------------------
/.env.example:
--------------------------------------------------------------------------------
1 | APP_NAME=Laravel
2 | APP_ENV=local
3 | APP_KEY=
4 | APP_DEBUG=true
5 | APP_URL=http://localhost
6 |
7 | LOG_CHANNEL=stack
8 | LOG_LEVEL=debug
9 |
10 | DB_CONNECTION=mysql
11 | DB_HOST=127.0.0.1
12 | DB_PORT=3306
13 | DB_DATABASE=laravel
14 | DB_USERNAME=root
15 | DB_PASSWORD=
16 |
17 | BROADCAST_DRIVER=log
18 | CACHE_DRIVER=file
19 | QUEUE_CONNECTION=sync
20 | SESSION_DRIVER=file
21 | SESSION_LIFETIME=120
22 |
23 | MEMCACHED_HOST=127.0.0.1
24 |
25 | REDIS_HOST=127.0.0.1
26 | REDIS_PASSWORD=null
27 | REDIS_PORT=6379
28 |
29 | MAIL_MAILER=smtp
30 | MAIL_HOST=mailhog
31 | MAIL_PORT=1025
32 | MAIL_USERNAME=null
33 | MAIL_PASSWORD=null
34 | MAIL_ENCRYPTION=null
35 | MAIL_FROM_ADDRESS=null
36 | MAIL_FROM_NAME="${APP_NAME}"
37 |
38 | AWS_ACCESS_KEY_ID=
39 | AWS_SECRET_ACCESS_KEY=
40 | AWS_DEFAULT_REGION=us-east-1
41 | AWS_BUCKET=
42 |
43 | PUSHER_APP_ID=
44 | PUSHER_APP_KEY=
45 | PUSHER_APP_SECRET=
46 | PUSHER_APP_CLUSTER=mt1
47 |
48 | MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
49 | MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
50 |
--------------------------------------------------------------------------------
/.gitattributes:
--------------------------------------------------------------------------------
1 | * text=auto
2 | *.css linguist-vendored
3 | *.scss linguist-vendored
4 | *.js linguist-vendored
5 | CHANGELOG.md export-ignore
6 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | /vendor/
2 | node_modules/
3 | npm-debug.log
4 | yarn-error.log
5 |
6 | # Laravel 4 specific
7 | bootstrap/compiled.php
8 | app/storage/
9 |
10 | # Laravel 5 & Lumen specific
11 | public/storage
12 | public/hot
13 |
14 | # Laravel 5 & Lumen specific with changed public path
15 | public_html/storage
16 | public_html/hot
17 |
18 | storage/*.key
19 | .env
20 | Homestead.yaml
21 | Homestead.json
22 | /.vagrant
23 | .phpunit.result.cache
24 |
--------------------------------------------------------------------------------
/.styleci.yml:
--------------------------------------------------------------------------------
1 | php:
2 | preset: laravel
3 | disabled:
4 | - no_unused_imports
5 | finder:
6 | not-name:
7 | - index.php
8 | - server.php
9 | js:
10 | finder:
11 | not-name:
12 | - webpack.mix.js
13 | css: true
14 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2021 Thales Bento
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # laravel-excel-import-report
2 | Como aplicar a importação e extração de dados em sua aplicação com excel usando pacote phpspreadsheet
3 |
4 | Requisitos:
5 | **Composer versão 2.0
6 | **Laravel 8
7 | **PHP 7.3
8 |
9 | Para rodar o projeto execute os passos abaixo:
10 | 1- clone o repositorio em um ambiente local
11 | 2- abra a pasta do projeto em um terminal
12 | 3- execute o comando "composer install"
13 | 4- configue uma base de dados mysql no arquivo .env na raíz do projeto
14 | 5- rode o comando para limpar possiveil cache da aplicação "php artisan optimize:clear"
15 | 6- rode o comando para executar as migrations no seu banco de dados "php artisan migrate:fresh"
16 |
17 | PhpSpreadSheet Documentação
18 | https://phpspreadsheet.readthedocs.io/en/latest/
19 |
20 | PhpSpreadSheet GitHub
21 | https://github.com/PHPOffice/PhpSpreadsheet
22 |
23 | Bootstrap 5
24 | https://getbootstrap.com/docs/5.0/getting-started/introduction/
25 |
26 | 4Devs - Gerador de cpf fake
27 | https://www.4devs.com.br/gerador_de_pessoas
28 |
--------------------------------------------------------------------------------
/app/Console/Kernel.php:
--------------------------------------------------------------------------------
1 | command('inspire')->hourly();
28 | }
29 |
30 | /**
31 | * Register the commands for the application.
32 | *
33 | * @return void
34 | */
35 | protected function commands()
36 | {
37 | $this->load(__DIR__.'/Commands');
38 |
39 | require base_path('routes/console.php');
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/app/Exceptions/Handler.php:
--------------------------------------------------------------------------------
1 | reportable(function (Throwable $e) {
38 | //
39 | });
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/app/Http/Controllers/Controller.php:
--------------------------------------------------------------------------------
1 | customer = $customer;
24 | $this->customer_import = $customer_import;
25 | $this->customer_report = $customer_report;
26 |
27 | }
28 |
29 | public function index()
30 | {
31 | $customers = $this->customer->all()->sortBy('name');
32 | return view('customer.index',['customers'=>$customers]);
33 | }
34 |
35 | public function create()
36 | {
37 | return view('customer.create');
38 | }
39 |
40 | public function store(CustomerRequest $request)
41 | {
42 | try{
43 | $this->customers->create($request->all());
44 | $notification = array(
45 | 'title'=> trans('validation.generic.Success'),
46 | 'message'=> trans('validation.generic.created'),
47 | 'alert-type' => 'success'
48 | );
49 | return redirect()->route('customers.index')->with($notification);
50 | }
51 | catch(\Exception $e)
52 | {
53 | $notification = array(
54 | 'title'=> trans('validation.generic.Error'),
55 | 'message'=> trans('validation.generic.not_created').': '.$e->getMessage(),
56 | 'alert-type' => 'danger'
57 | );
58 | return back()->with($notification)->withInput();
59 | }
60 | }
61 |
62 | public function edit($id)
63 | {
64 | //first method
65 | /*
66 | $customer = $this->customer->where('id',$id)->firstOrFail();
67 | return view('customer.edit',['customer'=>$customer]);
68 | */
69 | //second method
70 | /*
71 | $customer = $this->customer->findOrFail($id);
72 | return view('customer.edit',['customer'=>$customer]);
73 | */
74 | //third method
75 | try{
76 | $customer = $this->customer->find($id);
77 | if(empty($customer)){
78 | throw new Exception('not found result for param like "'.$id.'"');
79 | }
80 | return view('customer.edit',['customer'=>$customer]);
81 | }catch(Exception $e){
82 | $notification = array(
83 | 'title'=> trans('validation.generic.Error'),
84 | 'message'=> $e->getMessage(),
85 | 'alert-type' => 'danger'
86 | );
87 | return back()->with($notification)->withInput();
88 | }
89 | }
90 |
91 | public function update(CustomerRequest $request, $id)
92 | {
93 | $customer = $this->customer->findOrFail($id);
94 | try{
95 | $customer->update($request->all());
96 | $notification = array(
97 | 'title'=> trans('validation.generic.Success'),
98 | 'message'=> trans('validation.generic.updated'),
99 | 'alert-type' => 'success'
100 | );
101 | return redirect()->route('customers.index')->with($notification);
102 | }
103 | catch(\Exception $e)
104 | {
105 | $notification = array(
106 | 'title'=> trans('validation.generic.Error'),
107 | 'message'=> trans('validation.generic.not_updated').': '.$e->getMessage(),
108 | 'alert-type' => 'danger'
109 | );
110 | return back()->with($notification)->withInput();
111 | }
112 | }
113 |
114 | public function destroy($id)
115 | {
116 | $customer = $this->customer->findOrFail($id);
117 | try{
118 | $customer->delete();
119 | $notification = array(
120 | 'title'=> trans('validation.generic.Success'),
121 | 'message'=> trans('validation.generic.deleted'),
122 | 'alert-type' => 'success'
123 | );
124 | return redirect()->route('customers.index')->with($notification);
125 | }
126 | catch(\Exception $e)
127 | {
128 | $notification = array(
129 | 'title'=> trans('validation.generic.Error'),
130 | 'message'=> trans('validation.generic.not_deleted').': '.$e->getMessage(),
131 | 'alert-type' => 'danger'
132 | );
133 | return back()->with($notification);
134 | }
135 | }
136 |
137 | public function import()
138 | {
139 | return view('customer.import');
140 | }
141 |
142 | public function storeImport(ImportRequest $request)
143 | {
144 | try{
145 | $notification = $this->customer_import->allData($request);
146 | $notification = array(
147 | 'title'=> trans('validation.generic.Success'),
148 | 'message'=> trans('validation.generic.imported')." ".
149 | trans('validation.generic.data_created')." : ".$notification['created'].". ".
150 | trans('validation.generic.data_updated')." : ".$notification['updated'],
151 | 'alert-type' => 'success'
152 | );
153 | /*
154 | if($notification['message'] == "worksheet_imported"){
155 | $notification = array(
156 | 'title'=> trans('validation.generic.Success'),
157 | 'message'=> trans('validation.generic.imported')." ".
158 | trans('validation.generic.data_created')." : ".$notification['created'].". ".
159 | trans('validation.generic.data_updated')." : ".$notification['updated'],
160 | 'alert-type' => 'success'
161 | );
162 | }
163 | */
164 | /*
165 | if($notification['message'] == "worksheet_invalid"){
166 | $notification = array(
167 | 'title'=> trans('validation.generic.Error'),
168 | 'message'=> trans('platform.customer.message.import'),
169 | 'alert-type' => 'danger'
170 | );
171 | return back()->withInput()->with($notification);
172 | }
173 | */
174 | return redirect()->route('customers.index')->with($notification);
175 |
176 | }
177 | catch(\Exception $e)
178 | {
179 | $notification = array(
180 | 'title'=> trans('validation.generic.Error'),
181 | 'message'=> trans('validation.generic.not_imported').': '.$e->getMessage(),
182 | 'alert-type' => 'danger'
183 | );
184 | return back()->with($notification)->withInput();
185 | }
186 | }
187 |
188 | public function report($customer_id = null)
189 | {
190 | if($customer_id==null){
191 | $customers = $this->customer->all();
192 | }else{
193 | $customers = $this->customer->where('id',$customer_id)->get();
194 | }
195 | try{
196 | $notification = $this->customer_report->list($customers);
197 | }
198 | catch(\Exception $e){
199 | $notification = array(
200 | 'title'=> trans('platform.generic.Error'),
201 | 'message'=> trans('platform.report.message.generated_error').': '.$e->getMessage(),
202 | 'alert-type' => 'danger'
203 | );
204 | }
205 | return back()->with($notification);
206 | }
207 | }
208 |
--------------------------------------------------------------------------------
/app/Http/Kernel.php:
--------------------------------------------------------------------------------
1 | [
33 | \App\Http\Middleware\EncryptCookies::class,
34 | \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
35 | \Illuminate\Session\Middleware\StartSession::class,
36 | // \Illuminate\Session\Middleware\AuthenticateSession::class,
37 | \Illuminate\View\Middleware\ShareErrorsFromSession::class,
38 | \App\Http\Middleware\VerifyCsrfToken::class,
39 | \Illuminate\Routing\Middleware\SubstituteBindings::class,
40 | ],
41 |
42 | 'api' => [
43 | 'throttle:api',
44 | \Illuminate\Routing\Middleware\SubstituteBindings::class,
45 | ],
46 | ];
47 |
48 | /**
49 | * The application's route middleware.
50 | *
51 | * These middleware may be assigned to groups or used individually.
52 | *
53 | * @var array
54 | */
55 | protected $routeMiddleware = [
56 | 'auth' => \App\Http\Middleware\Authenticate::class,
57 | 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
58 | 'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
59 | 'can' => \Illuminate\Auth\Middleware\Authorize::class,
60 | 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
61 | 'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
62 | 'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
63 | 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
64 | 'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
65 | ];
66 | }
67 |
--------------------------------------------------------------------------------
/app/Http/Middleware/Authenticate.php:
--------------------------------------------------------------------------------
1 | expectsJson()) {
18 | return route('login');
19 | }
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/app/Http/Middleware/EncryptCookies.php:
--------------------------------------------------------------------------------
1 | check()) {
26 | return redirect(RouteServiceProvider::HOME);
27 | }
28 | }
29 |
30 | return $next($request);
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/app/Http/Middleware/TrimStrings.php:
--------------------------------------------------------------------------------
1 | allSubdomainsOfApplicationUrl(),
18 | ];
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/app/Http/Middleware/TrustProxies.php:
--------------------------------------------------------------------------------
1 | ['required','string'],
29 | 'email' => ['present','email'],
30 | 'cpf' => ["required","unique:customers,cpf,{$this->id}","digits:11","numeric"],//new RightCpf],
31 | ];
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/app/Http/Requests/ImportRequest.php:
--------------------------------------------------------------------------------
1 | ["required","mimes:xls,xlsx"],
29 | ];
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/app/Import/CustomerImport.php:
--------------------------------------------------------------------------------
1 | customer = $customer;
20 | $this->sanatize = $sanatize;
21 | }
22 |
23 | public function allData(Request $request)
24 | {
25 | //insert customers in the database
26 | $read = IOFactory::load($request->file);
27 | $data = $read->getActiveSheet()->toArray();
28 | $line=0;
29 | $created=0;
30 | $updated=0;
31 | foreach($data as $item){
32 | //condition to verify if has 3 collumns in the worksheet
33 | if(count($item)==3){
34 | //your condition here to first line
35 | if($line==0){
36 | //
37 | }
38 | if($line>0){
39 | //verify if the current customer exists
40 | $cpf = $this->sanatize->validCpf($item[2]);
41 | $customer = $this->customer->where('cpf',$cpf)->first();
42 | //if exists customer
43 | if(!empty($customer)){
44 | $customer->update([
45 | 'name'=> $item[0],
46 | 'email'=> $item[1],
47 | 'cpf'=> $cpf,
48 | ]);
49 | $updated++;
50 | //if not exists
51 | }else{
52 | $this->customer->create([
53 | 'name'=> $item[0],
54 | 'email'=> $item[1],
55 | 'cpf'=> $cpf,
56 | ]);
57 | $created++;
58 | }
59 | }
60 | $line++;
61 | //not exists 3 columns in the worksheet
62 | }else{
63 | throw new Exception(trans('platform.customer.message.import'));
64 | }
65 | }
66 | //returns imported worksheet notification
67 | $notification = [
68 | 'message'=> "worksheet_imported",
69 | 'created'=> $created,
70 | 'updated'=> $updated
71 | ];
72 | return $notification;
73 | }
74 | }
75 |
--------------------------------------------------------------------------------
/app/Models/Customer.php:
--------------------------------------------------------------------------------
1 | 'datetime',
42 | ];
43 | }
44 |
--------------------------------------------------------------------------------
/app/Providers/AppServiceProvider.php:
--------------------------------------------------------------------------------
1 | 'App\Policies\ModelPolicy',
17 | ];
18 |
19 | /**
20 | * Register any authentication / authorization services.
21 | *
22 | * @return void
23 | */
24 | public function boot()
25 | {
26 | $this->registerPolicies();
27 |
28 | //
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/app/Providers/BroadcastServiceProvider.php:
--------------------------------------------------------------------------------
1 | [
19 | SendEmailVerificationNotification::class,
20 | ],
21 | ];
22 |
23 | /**
24 | * Register any events for your application.
25 | *
26 | * @return void
27 | */
28 | public function boot()
29 | {
30 | //
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/app/Providers/RouteServiceProvider.php:
--------------------------------------------------------------------------------
1 | configureRateLimiting();
39 |
40 | $this->routes(function () {
41 | Route::prefix('api')
42 | ->middleware('api')
43 | ->namespace($this->namespace)
44 | ->group(base_path('routes/api.php'));
45 |
46 | Route::middleware('web')
47 | ->namespace($this->namespace)
48 | ->group(base_path('routes/web.php'));
49 | });
50 | }
51 |
52 | /**
53 | * Configure the rate limiters for the application.
54 | *
55 | * @return void
56 | */
57 | protected function configureRateLimiting()
58 | {
59 | RateLimiter::for('api', function (Request $request) {
60 | return Limit::perMinute(60)->by(optional($request->user())->id ?: $request->ip());
61 | });
62 | }
63 | }
64 |
--------------------------------------------------------------------------------
/app/Report/CustomerReport.php:
--------------------------------------------------------------------------------
1 | getActiveSheet();
15 | $sheet->setTitle(__('platform.report.type.customers'));
16 | $sheet->getStyle('A1:F1')->getBorders()->getOutline()->setBorderStyle(true);
17 | $sheet->setCellValue('A1', __('platform.customer.form.id'));
18 | $sheet->setCellValue('B1', __('platform.customer.form.name'));
19 | $sheet->setCellValue('C1', __('platform.customer.form.email'));
20 | $sheet->setCellValue('D1', __('platform.customer.form.cpf'));
21 | $sheet->setCellValue('E1', __('platform.generic.action.created_at'));
22 | $sheet->setCellValue('F1', __('platform.generic.action.updated_at'));
23 | $line = 2;
24 | foreach ($customers as $item) {
25 | $sheet->setCellValueByColumnAndRow(1, $line, $item->id);
26 | $sheet->setCellValueByColumnAndRow(2, $line, $item->name);
27 | $sheet->setCellValueByColumnAndRow(3, $line, $item->email);
28 | $sheet->setCellValueByColumnAndRow(4, $line, $item->cpf);
29 | $sheet->setCellValueByColumnAndRow(5, $line, $item->created_at);
30 | $sheet->setCellValueByColumnAndRow(6, $line, $item->updated_at);
31 | $line++;
32 | }
33 | $writer = new Xlsx($spreadsheet);
34 | $filename = "report-" . time() . ".xlsx";
35 | $writer->save(storage_path('app/public/report/customer/' . $filename));
36 | $notification = [
37 | 'report' => true,
38 | 'report_name' => trans('platform.report.singular_name') . " - " . trans('platform.report.type.customers'),
39 | 'report_link' => asset('storage/report/customer/' . $filename),
40 | 'title' => trans('validation.generic.Success'),
41 | 'message' => trans('platform.report.message.generated_success'),
42 | 'alert-type' => 'success'
43 | ];
44 | return $notification;
45 | }
46 | }
47 |
--------------------------------------------------------------------------------
/app/Rules/RightCpf.php:
--------------------------------------------------------------------------------
1 | validateCpf($value);
29 | }
30 |
31 | /**
32 | * Get the validation error message.
33 | *
34 | * @return string
35 | */
36 | public function message()
37 | {
38 | return 'This cpf is not a valid cpf';
39 | }
40 |
41 | public function validateCpf($cpf){
42 | $cpf = preg_replace( '/[^0-9]/is', '', $cpf );
43 | if (strlen($cpf) != 11) {
44 | return false;
45 | }
46 | if (preg_match('/(\d)\1{10}/', $cpf)) {
47 | return false;
48 | }
49 | for ($t = 9; $t < 11; $t++) {
50 | for ($d = 0, $c = 0; $c < $t; $c++) {
51 | $d += $cpf[$c] * (($t + 1) - $c);
52 | }
53 | $d = ((10 * $d) % 11) % 10;
54 | if ($cpf[$c] != $d) {
55 | return false;
56 | }
57 | }
58 | return true;
59 | }
60 | }
61 |
--------------------------------------------------------------------------------
/app/Tools/Sanitize.php:
--------------------------------------------------------------------------------
1 | onlyNumbers($string);
13 | if(is_numeric($clear_cpf)){
14 | $clear_cpf = substr(str_repeat("0",11).$clear_cpf, -11);
15 | return $clear_cpf;
16 | }
17 | return null;
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/artisan:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env php
2 | make(Illuminate\Contracts\Console\Kernel::class);
34 |
35 | $status = $kernel->handle(
36 | $input = new Symfony\Component\Console\Input\ArgvInput,
37 | new Symfony\Component\Console\Output\ConsoleOutput
38 | );
39 |
40 | /*
41 | |--------------------------------------------------------------------------
42 | | Shutdown The Application
43 | |--------------------------------------------------------------------------
44 | |
45 | | Once Artisan has finished running, we will fire off the shutdown events
46 | | so that any final work may be done by the application before we shut
47 | | down the process. This is the last thing to happen to the request.
48 | |
49 | */
50 |
51 | $kernel->terminate($input, $status);
52 |
53 | exit($status);
54 |
--------------------------------------------------------------------------------
/bootstrap/app.php:
--------------------------------------------------------------------------------
1 | singleton(
30 | Illuminate\Contracts\Http\Kernel::class,
31 | App\Http\Kernel::class
32 | );
33 |
34 | $app->singleton(
35 | Illuminate\Contracts\Console\Kernel::class,
36 | App\Console\Kernel::class
37 | );
38 |
39 | $app->singleton(
40 | Illuminate\Contracts\Debug\ExceptionHandler::class,
41 | App\Exceptions\Handler::class
42 | );
43 |
44 | /*
45 | |--------------------------------------------------------------------------
46 | | Return The Application
47 | |--------------------------------------------------------------------------
48 | |
49 | | This script returns the application instance. The instance is given to
50 | | the calling script so we can separate the building of the instances
51 | | from the actual running of the application and sending responses.
52 | |
53 | */
54 |
55 | return $app;
56 |
--------------------------------------------------------------------------------
/bootstrap/cache/.gitignore:
--------------------------------------------------------------------------------
1 | *
2 | !.gitignore
3 |
--------------------------------------------------------------------------------
/composer.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "laravel/laravel",
3 | "type": "project",
4 | "description": "The Laravel Framework.",
5 | "keywords": ["framework", "laravel"],
6 | "license": "MIT",
7 | "require": {
8 | "php": "^7.3|^8.0",
9 | "fideloper/proxy": "^4.4",
10 | "fruitcake/laravel-cors": "^2.0",
11 | "guzzlehttp/guzzle": "^7.0.1",
12 | "laravel/framework": "^8.12",
13 | "laravel/tinker": "^2.5",
14 | "phpoffice/phpspreadsheet": "^1.17"
15 | },
16 | "require-dev": {
17 | "facade/ignition": "^2.5",
18 | "fakerphp/faker": "^1.9.1",
19 | "laravel/sail": "^1.0.1",
20 | "lucascudo/laravel-pt-br-localization": "^1.1",
21 | "mockery/mockery": "^1.4.2",
22 | "nunomaduro/collision": "^5.0",
23 | "phpunit/phpunit": "^9.3.3"
24 | },
25 | "autoload": {
26 | "psr-4": {
27 | "App\\": "app/",
28 | "Database\\Factories\\": "database/factories/",
29 | "Database\\Seeders\\": "database/seeders/"
30 | }
31 | },
32 | "autoload-dev": {
33 | "psr-4": {
34 | "Tests\\": "tests/"
35 | }
36 | },
37 | "scripts": {
38 | "post-autoload-dump": [
39 | "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
40 | "@php artisan package:discover --ansi"
41 | ],
42 | "post-root-package-install": [
43 | "@php -r \"file_exists('.env') || copy('.env.example', '.env');\""
44 | ],
45 | "post-create-project-cmd": [
46 | "@php artisan key:generate --ansi"
47 | ]
48 | },
49 | "extra": {
50 | "laravel": {
51 | "dont-discover": []
52 | }
53 | },
54 | "config": {
55 | "optimize-autoloader": true,
56 | "preferred-install": "dist",
57 | "sort-packages": true
58 | },
59 | "minimum-stability": "dev",
60 | "prefer-stable": true
61 | }
62 |
--------------------------------------------------------------------------------
/config/app.php:
--------------------------------------------------------------------------------
1 | env('APP_NAME', 'Laravel'),
17 |
18 | /*
19 | |--------------------------------------------------------------------------
20 | | Application Environment
21 | |--------------------------------------------------------------------------
22 | |
23 | | This value determines the "environment" your application is currently
24 | | running in. This may determine how you prefer to configure various
25 | | services the application utilizes. Set this in your ".env" file.
26 | |
27 | */
28 |
29 | 'env' => env('APP_ENV', 'production'),
30 |
31 | /*
32 | |--------------------------------------------------------------------------
33 | | Application Debug Mode
34 | |--------------------------------------------------------------------------
35 | |
36 | | When your application is in debug mode, detailed error messages with
37 | | stack traces will be shown on every error that occurs within your
38 | | application. If disabled, a simple generic error page is shown.
39 | |
40 | */
41 |
42 | 'debug' => (bool) env('APP_DEBUG', false),
43 |
44 | /*
45 | |--------------------------------------------------------------------------
46 | | Application URL
47 | |--------------------------------------------------------------------------
48 | |
49 | | This URL is used by the console to properly generate URLs when using
50 | | the Artisan command line tool. You should set this to the root of
51 | | your application so that it is used when running Artisan tasks.
52 | |
53 | */
54 |
55 | 'url' => env('APP_URL', 'http://localhost'),
56 |
57 | 'asset_url' => env('ASSET_URL', null),
58 |
59 | /*
60 | |--------------------------------------------------------------------------
61 | | Application Timezone
62 | |--------------------------------------------------------------------------
63 | |
64 | | Here you may specify the default timezone for your application, which
65 | | will be used by the PHP date and date-time functions. We have gone
66 | | ahead and set this to a sensible default for you out of the box.
67 | |
68 | */
69 |
70 | 'timezone' => 'UTC',
71 |
72 | /*
73 | |--------------------------------------------------------------------------
74 | | Application Locale Configuration
75 | |--------------------------------------------------------------------------
76 | |
77 | | The application locale determines the default locale that will be used
78 | | by the translation service provider. You are free to set this value
79 | | to any of the locales which will be supported by the application.
80 | |
81 | */
82 |
83 | 'locale' => 'pt_BR', //default: 'locale' => 'en',
84 |
85 | /*
86 | |--------------------------------------------------------------------------
87 | | Application Fallback Locale
88 | |--------------------------------------------------------------------------
89 | |
90 | | The fallback locale determines the locale to use when the current one
91 | | is not available. You may change the value to correspond to any of
92 | | the language folders that are provided through your application.
93 | |
94 | */
95 |
96 | 'fallback_locale' => 'en',
97 |
98 | /*
99 | |--------------------------------------------------------------------------
100 | | Faker Locale
101 | |--------------------------------------------------------------------------
102 | |
103 | | This locale will be used by the Faker PHP library when generating fake
104 | | data for your database seeds. For example, this will be used to get
105 | | localized telephone numbers, street address information and more.
106 | |
107 | */
108 |
109 | 'faker_locale' => 'en_US',
110 |
111 | /*
112 | |--------------------------------------------------------------------------
113 | | Encryption Key
114 | |--------------------------------------------------------------------------
115 | |
116 | | This key is used by the Illuminate encrypter service and should be set
117 | | to a random, 32 character string, otherwise these encrypted strings
118 | | will not be safe. Please do this before deploying an application!
119 | |
120 | */
121 |
122 | 'key' => env('APP_KEY'),
123 |
124 | 'cipher' => 'AES-256-CBC',
125 |
126 | /*
127 | |--------------------------------------------------------------------------
128 | | Autoloaded Service Providers
129 | |--------------------------------------------------------------------------
130 | |
131 | | The service providers listed here will be automatically loaded on the
132 | | request to your application. Feel free to add your own services to
133 | | this array to grant expanded functionality to your applications.
134 | |
135 | */
136 |
137 | 'providers' => [
138 |
139 | /*
140 | * Laravel Framework Service Providers...
141 | */
142 | Illuminate\Auth\AuthServiceProvider::class,
143 | Illuminate\Broadcasting\BroadcastServiceProvider::class,
144 | Illuminate\Bus\BusServiceProvider::class,
145 | Illuminate\Cache\CacheServiceProvider::class,
146 | Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class,
147 | Illuminate\Cookie\CookieServiceProvider::class,
148 | Illuminate\Database\DatabaseServiceProvider::class,
149 | Illuminate\Encryption\EncryptionServiceProvider::class,
150 | Illuminate\Filesystem\FilesystemServiceProvider::class,
151 | Illuminate\Foundation\Providers\FoundationServiceProvider::class,
152 | Illuminate\Hashing\HashServiceProvider::class,
153 | Illuminate\Mail\MailServiceProvider::class,
154 | Illuminate\Notifications\NotificationServiceProvider::class,
155 | Illuminate\Pagination\PaginationServiceProvider::class,
156 | Illuminate\Pipeline\PipelineServiceProvider::class,
157 | Illuminate\Queue\QueueServiceProvider::class,
158 | Illuminate\Redis\RedisServiceProvider::class,
159 | Illuminate\Auth\Passwords\PasswordResetServiceProvider::class,
160 | Illuminate\Session\SessionServiceProvider::class,
161 | Illuminate\Translation\TranslationServiceProvider::class,
162 | Illuminate\Validation\ValidationServiceProvider::class,
163 | Illuminate\View\ViewServiceProvider::class,
164 |
165 | /*
166 | * Package Service Providers...
167 | */
168 |
169 | /*
170 | * Application Service Providers...
171 | */
172 | App\Providers\AppServiceProvider::class,
173 | App\Providers\AuthServiceProvider::class,
174 | // App\Providers\BroadcastServiceProvider::class,
175 | App\Providers\EventServiceProvider::class,
176 | App\Providers\RouteServiceProvider::class,
177 |
178 | ],
179 |
180 | /*
181 | |--------------------------------------------------------------------------
182 | | Class Aliases
183 | |--------------------------------------------------------------------------
184 | |
185 | | This array of class aliases will be registered when this application
186 | | is started. However, feel free to register as many as you wish as
187 | | the aliases are "lazy" loaded so they don't hinder performance.
188 | |
189 | */
190 |
191 | 'aliases' => [
192 |
193 | 'App' => Illuminate\Support\Facades\App::class,
194 | 'Arr' => Illuminate\Support\Arr::class,
195 | 'Artisan' => Illuminate\Support\Facades\Artisan::class,
196 | 'Auth' => Illuminate\Support\Facades\Auth::class,
197 | 'Blade' => Illuminate\Support\Facades\Blade::class,
198 | 'Broadcast' => Illuminate\Support\Facades\Broadcast::class,
199 | 'Bus' => Illuminate\Support\Facades\Bus::class,
200 | 'Cache' => Illuminate\Support\Facades\Cache::class,
201 | 'Config' => Illuminate\Support\Facades\Config::class,
202 | 'Cookie' => Illuminate\Support\Facades\Cookie::class,
203 | 'Crypt' => Illuminate\Support\Facades\Crypt::class,
204 | 'Date' => Illuminate\Support\Facades\Date::class,
205 | 'DB' => Illuminate\Support\Facades\DB::class,
206 | 'Eloquent' => Illuminate\Database\Eloquent\Model::class,
207 | 'Event' => Illuminate\Support\Facades\Event::class,
208 | 'File' => Illuminate\Support\Facades\File::class,
209 | 'Gate' => Illuminate\Support\Facades\Gate::class,
210 | 'Hash' => Illuminate\Support\Facades\Hash::class,
211 | 'Http' => Illuminate\Support\Facades\Http::class,
212 | 'Lang' => Illuminate\Support\Facades\Lang::class,
213 | 'Log' => Illuminate\Support\Facades\Log::class,
214 | 'Mail' => Illuminate\Support\Facades\Mail::class,
215 | 'Notification' => Illuminate\Support\Facades\Notification::class,
216 | 'Password' => Illuminate\Support\Facades\Password::class,
217 | 'Queue' => Illuminate\Support\Facades\Queue::class,
218 | 'Redirect' => Illuminate\Support\Facades\Redirect::class,
219 | // 'Redis' => Illuminate\Support\Facades\Redis::class,
220 | 'Request' => Illuminate\Support\Facades\Request::class,
221 | 'Response' => Illuminate\Support\Facades\Response::class,
222 | 'Route' => Illuminate\Support\Facades\Route::class,
223 | 'Schema' => Illuminate\Support\Facades\Schema::class,
224 | 'Session' => Illuminate\Support\Facades\Session::class,
225 | 'Storage' => Illuminate\Support\Facades\Storage::class,
226 | 'Str' => Illuminate\Support\Str::class,
227 | 'URL' => Illuminate\Support\Facades\URL::class,
228 | 'Validator' => Illuminate\Support\Facades\Validator::class,
229 | 'View' => Illuminate\Support\Facades\View::class,
230 |
231 | ],
232 |
233 | ];
234 |
--------------------------------------------------------------------------------
/config/auth.php:
--------------------------------------------------------------------------------
1 | [
17 | 'guard' => 'web',
18 | 'passwords' => 'users',
19 | ],
20 |
21 | /*
22 | |--------------------------------------------------------------------------
23 | | Authentication Guards
24 | |--------------------------------------------------------------------------
25 | |
26 | | Next, you may define every authentication guard for your application.
27 | | Of course, a great default configuration has been defined for you
28 | | here which uses session storage and the Eloquent user provider.
29 | |
30 | | All authentication drivers have a user provider. This defines how the
31 | | users are actually retrieved out of your database or other storage
32 | | mechanisms used by this application to persist your user's data.
33 | |
34 | | Supported: "session", "token"
35 | |
36 | */
37 |
38 | 'guards' => [
39 | 'web' => [
40 | 'driver' => 'session',
41 | 'provider' => 'users',
42 | ],
43 |
44 | 'api' => [
45 | 'driver' => 'token',
46 | 'provider' => 'users',
47 | 'hash' => false,
48 | ],
49 | ],
50 |
51 | /*
52 | |--------------------------------------------------------------------------
53 | | User Providers
54 | |--------------------------------------------------------------------------
55 | |
56 | | All authentication drivers have a user provider. This defines how the
57 | | users are actually retrieved out of your database or other storage
58 | | mechanisms used by this application to persist your user's data.
59 | |
60 | | If you have multiple user tables or models you may configure multiple
61 | | sources which represent each model / table. These sources may then
62 | | be assigned to any extra authentication guards you have defined.
63 | |
64 | | Supported: "database", "eloquent"
65 | |
66 | */
67 |
68 | 'providers' => [
69 | 'users' => [
70 | 'driver' => 'eloquent',
71 | 'model' => App\Models\User::class,
72 | ],
73 |
74 | // 'users' => [
75 | // 'driver' => 'database',
76 | // 'table' => 'users',
77 | // ],
78 | ],
79 |
80 | /*
81 | |--------------------------------------------------------------------------
82 | | Resetting Passwords
83 | |--------------------------------------------------------------------------
84 | |
85 | | You may specify multiple password reset configurations if you have more
86 | | than one user table or model in the application and you want to have
87 | | separate password reset settings based on the specific user types.
88 | |
89 | | The expire time is the number of minutes that the reset token should be
90 | | considered valid. This security feature keeps tokens short-lived so
91 | | they have less time to be guessed. You may change this as needed.
92 | |
93 | */
94 |
95 | 'passwords' => [
96 | 'users' => [
97 | 'provider' => 'users',
98 | 'table' => 'password_resets',
99 | 'expire' => 60,
100 | 'throttle' => 60,
101 | ],
102 | ],
103 |
104 | /*
105 | |--------------------------------------------------------------------------
106 | | Password Confirmation Timeout
107 | |--------------------------------------------------------------------------
108 | |
109 | | Here you may define the amount of seconds before a password confirmation
110 | | times out and the user is prompted to re-enter their password via the
111 | | confirmation screen. By default, the timeout lasts for three hours.
112 | |
113 | */
114 |
115 | 'password_timeout' => 10800,
116 |
117 | ];
118 |
--------------------------------------------------------------------------------
/config/broadcasting.php:
--------------------------------------------------------------------------------
1 | env('BROADCAST_DRIVER', 'null'),
19 |
20 | /*
21 | |--------------------------------------------------------------------------
22 | | Broadcast Connections
23 | |--------------------------------------------------------------------------
24 | |
25 | | Here you may define all of the broadcast connections that will be used
26 | | to broadcast events to other systems or over websockets. Samples of
27 | | each available type of connection are provided inside this array.
28 | |
29 | */
30 |
31 | 'connections' => [
32 |
33 | 'pusher' => [
34 | 'driver' => 'pusher',
35 | 'key' => env('PUSHER_APP_KEY'),
36 | 'secret' => env('PUSHER_APP_SECRET'),
37 | 'app_id' => env('PUSHER_APP_ID'),
38 | 'options' => [
39 | 'cluster' => env('PUSHER_APP_CLUSTER'),
40 | 'useTLS' => true,
41 | ],
42 | ],
43 |
44 | 'ably' => [
45 | 'driver' => 'ably',
46 | 'key' => env('ABLY_KEY'),
47 | ],
48 |
49 | 'redis' => [
50 | 'driver' => 'redis',
51 | 'connection' => 'default',
52 | ],
53 |
54 | 'log' => [
55 | 'driver' => 'log',
56 | ],
57 |
58 | 'null' => [
59 | 'driver' => 'null',
60 | ],
61 |
62 | ],
63 |
64 | ];
65 |
--------------------------------------------------------------------------------
/config/cache.php:
--------------------------------------------------------------------------------
1 | env('CACHE_DRIVER', 'file'),
19 |
20 | /*
21 | |--------------------------------------------------------------------------
22 | | Cache Stores
23 | |--------------------------------------------------------------------------
24 | |
25 | | Here you may define all of the cache "stores" for your application as
26 | | well as their drivers. You may even define multiple stores for the
27 | | same cache driver to group types of items stored in your caches.
28 | |
29 | | Supported drivers: "apc", "array", "database", "file",
30 | | "memcached", "redis", "dynamodb", "null"
31 | |
32 | */
33 |
34 | 'stores' => [
35 |
36 | 'apc' => [
37 | 'driver' => 'apc',
38 | ],
39 |
40 | 'array' => [
41 | 'driver' => 'array',
42 | 'serialize' => false,
43 | ],
44 |
45 | 'database' => [
46 | 'driver' => 'database',
47 | 'table' => 'cache',
48 | 'connection' => null,
49 | 'lock_connection' => null,
50 | ],
51 |
52 | 'file' => [
53 | 'driver' => 'file',
54 | 'path' => storage_path('framework/cache/data'),
55 | ],
56 |
57 | 'memcached' => [
58 | 'driver' => 'memcached',
59 | 'persistent_id' => env('MEMCACHED_PERSISTENT_ID'),
60 | 'sasl' => [
61 | env('MEMCACHED_USERNAME'),
62 | env('MEMCACHED_PASSWORD'),
63 | ],
64 | 'options' => [
65 | // Memcached::OPT_CONNECT_TIMEOUT => 2000,
66 | ],
67 | 'servers' => [
68 | [
69 | 'host' => env('MEMCACHED_HOST', '127.0.0.1'),
70 | 'port' => env('MEMCACHED_PORT', 11211),
71 | 'weight' => 100,
72 | ],
73 | ],
74 | ],
75 |
76 | 'redis' => [
77 | 'driver' => 'redis',
78 | 'connection' => 'cache',
79 | 'lock_connection' => 'default',
80 | ],
81 |
82 | 'dynamodb' => [
83 | 'driver' => 'dynamodb',
84 | 'key' => env('AWS_ACCESS_KEY_ID'),
85 | 'secret' => env('AWS_SECRET_ACCESS_KEY'),
86 | 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
87 | 'table' => env('DYNAMODB_CACHE_TABLE', 'cache'),
88 | 'endpoint' => env('DYNAMODB_ENDPOINT'),
89 | ],
90 |
91 | ],
92 |
93 | /*
94 | |--------------------------------------------------------------------------
95 | | Cache Key Prefix
96 | |--------------------------------------------------------------------------
97 | |
98 | | When utilizing a RAM based store such as APC or Memcached, there might
99 | | be other applications utilizing the same cache. So, we'll specify a
100 | | value to get prefixed to all our keys so we can avoid collisions.
101 | |
102 | */
103 |
104 | 'prefix' => env('CACHE_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_cache'),
105 |
106 | ];
107 |
--------------------------------------------------------------------------------
/config/cors.php:
--------------------------------------------------------------------------------
1 | ['api/*', 'sanctum/csrf-cookie'],
19 |
20 | 'allowed_methods' => ['*'],
21 |
22 | 'allowed_origins' => ['*'],
23 |
24 | 'allowed_origins_patterns' => [],
25 |
26 | 'allowed_headers' => ['*'],
27 |
28 | 'exposed_headers' => [],
29 |
30 | 'max_age' => 0,
31 |
32 | 'supports_credentials' => false,
33 |
34 | ];
35 |
--------------------------------------------------------------------------------
/config/database.php:
--------------------------------------------------------------------------------
1 | env('DB_CONNECTION', 'mysql'),
19 |
20 | /*
21 | |--------------------------------------------------------------------------
22 | | Database Connections
23 | |--------------------------------------------------------------------------
24 | |
25 | | Here are each of the database connections setup for your application.
26 | | Of course, examples of configuring each database platform that is
27 | | supported by Laravel is shown below to make development simple.
28 | |
29 | |
30 | | All database work in Laravel is done through the PHP PDO facilities
31 | | so make sure you have the driver for your particular database of
32 | | choice installed on your machine before you begin development.
33 | |
34 | */
35 |
36 | 'connections' => [
37 |
38 | 'sqlite' => [
39 | 'driver' => 'sqlite',
40 | 'url' => env('DATABASE_URL'),
41 | 'database' => env('DB_DATABASE', database_path('database.sqlite')),
42 | 'prefix' => '',
43 | 'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true),
44 | ],
45 |
46 | 'mysql' => [
47 | 'driver' => 'mysql',
48 | 'url' => env('DATABASE_URL'),
49 | 'host' => env('DB_HOST', '127.0.0.1'),
50 | 'port' => env('DB_PORT', '3306'),
51 | 'database' => env('DB_DATABASE', 'forge'),
52 | 'username' => env('DB_USERNAME', 'forge'),
53 | 'password' => env('DB_PASSWORD', ''),
54 | 'unix_socket' => env('DB_SOCKET', ''),
55 | 'charset' => 'utf8mb4',
56 | 'collation' => 'utf8mb4_unicode_ci',
57 | 'prefix' => '',
58 | 'prefix_indexes' => true,
59 | 'strict' => true,
60 | 'engine' => null,
61 | 'options' => extension_loaded('pdo_mysql') ? array_filter([
62 | PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
63 | ]) : [],
64 | ],
65 |
66 | 'pgsql' => [
67 | 'driver' => 'pgsql',
68 | 'url' => env('DATABASE_URL'),
69 | 'host' => env('DB_HOST', '127.0.0.1'),
70 | 'port' => env('DB_PORT', '5432'),
71 | 'database' => env('DB_DATABASE', 'forge'),
72 | 'username' => env('DB_USERNAME', 'forge'),
73 | 'password' => env('DB_PASSWORD', ''),
74 | 'charset' => 'utf8',
75 | 'prefix' => '',
76 | 'prefix_indexes' => true,
77 | 'schema' => 'public',
78 | 'sslmode' => 'prefer',
79 | ],
80 |
81 | 'sqlsrv' => [
82 | 'driver' => 'sqlsrv',
83 | 'url' => env('DATABASE_URL'),
84 | 'host' => env('DB_HOST', 'localhost'),
85 | 'port' => env('DB_PORT', '1433'),
86 | 'database' => env('DB_DATABASE', 'forge'),
87 | 'username' => env('DB_USERNAME', 'forge'),
88 | 'password' => env('DB_PASSWORD', ''),
89 | 'charset' => 'utf8',
90 | 'prefix' => '',
91 | 'prefix_indexes' => true,
92 | ],
93 |
94 | ],
95 |
96 | /*
97 | |--------------------------------------------------------------------------
98 | | Migration Repository Table
99 | |--------------------------------------------------------------------------
100 | |
101 | | This table keeps track of all the migrations that have already run for
102 | | your application. Using this information, we can determine which of
103 | | the migrations on disk haven't actually been run in the database.
104 | |
105 | */
106 |
107 | 'migrations' => 'migrations',
108 |
109 | /*
110 | |--------------------------------------------------------------------------
111 | | Redis Databases
112 | |--------------------------------------------------------------------------
113 | |
114 | | Redis is an open source, fast, and advanced key-value store that also
115 | | provides a richer body of commands than a typical key-value system
116 | | such as APC or Memcached. Laravel makes it easy to dig right in.
117 | |
118 | */
119 |
120 | 'redis' => [
121 |
122 | 'client' => env('REDIS_CLIENT', 'phpredis'),
123 |
124 | 'options' => [
125 | 'cluster' => env('REDIS_CLUSTER', 'redis'),
126 | 'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'),
127 | ],
128 |
129 | 'default' => [
130 | 'url' => env('REDIS_URL'),
131 | 'host' => env('REDIS_HOST', '127.0.0.1'),
132 | 'password' => env('REDIS_PASSWORD', null),
133 | 'port' => env('REDIS_PORT', '6379'),
134 | 'database' => env('REDIS_DB', '0'),
135 | ],
136 |
137 | 'cache' => [
138 | 'url' => env('REDIS_URL'),
139 | 'host' => env('REDIS_HOST', '127.0.0.1'),
140 | 'password' => env('REDIS_PASSWORD', null),
141 | 'port' => env('REDIS_PORT', '6379'),
142 | 'database' => env('REDIS_CACHE_DB', '1'),
143 | ],
144 |
145 | ],
146 |
147 | ];
148 |
--------------------------------------------------------------------------------
/config/filesystems.php:
--------------------------------------------------------------------------------
1 | env('FILESYSTEM_DRIVER', 'local'),
17 |
18 | /*
19 | |--------------------------------------------------------------------------
20 | | Filesystem Disks
21 | |--------------------------------------------------------------------------
22 | |
23 | | Here you may configure as many filesystem "disks" as you wish, and you
24 | | may even configure multiple disks of the same driver. Defaults have
25 | | been setup for each driver as an example of the required options.
26 | |
27 | | Supported Drivers: "local", "ftp", "sftp", "s3"
28 | |
29 | */
30 |
31 | 'disks' => [
32 |
33 | 'local' => [
34 | 'driver' => 'local',
35 | 'root' => storage_path('app'),
36 | ],
37 |
38 | 'public' => [
39 | 'driver' => 'local',
40 | 'root' => storage_path('app/public'),
41 | 'url' => env('APP_URL').'/storage',
42 | 'visibility' => 'public',
43 | ],
44 |
45 | 's3' => [
46 | 'driver' => 's3',
47 | 'key' => env('AWS_ACCESS_KEY_ID'),
48 | 'secret' => env('AWS_SECRET_ACCESS_KEY'),
49 | 'region' => env('AWS_DEFAULT_REGION'),
50 | 'bucket' => env('AWS_BUCKET'),
51 | 'url' => env('AWS_URL'),
52 | 'endpoint' => env('AWS_ENDPOINT'),
53 | ],
54 |
55 | ],
56 |
57 | /*
58 | |--------------------------------------------------------------------------
59 | | Symbolic Links
60 | |--------------------------------------------------------------------------
61 | |
62 | | Here you may configure the symbolic links that will be created when the
63 | | `storage:link` Artisan command is executed. The array keys should be
64 | | the locations of the links and the values should be their targets.
65 | |
66 | */
67 |
68 | 'links' => [
69 | public_path('storage') => storage_path('app/public'),
70 | ],
71 |
72 | ];
73 |
--------------------------------------------------------------------------------
/config/hashing.php:
--------------------------------------------------------------------------------
1 | 'bcrypt',
19 |
20 | /*
21 | |--------------------------------------------------------------------------
22 | | Bcrypt Options
23 | |--------------------------------------------------------------------------
24 | |
25 | | Here you may specify the configuration options that should be used when
26 | | passwords are hashed using the Bcrypt algorithm. This will allow you
27 | | to control the amount of time it takes to hash the given password.
28 | |
29 | */
30 |
31 | 'bcrypt' => [
32 | 'rounds' => env('BCRYPT_ROUNDS', 10),
33 | ],
34 |
35 | /*
36 | |--------------------------------------------------------------------------
37 | | Argon Options
38 | |--------------------------------------------------------------------------
39 | |
40 | | Here you may specify the configuration options that should be used when
41 | | passwords are hashed using the Argon algorithm. These will allow you
42 | | to control the amount of time it takes to hash the given password.
43 | |
44 | */
45 |
46 | 'argon' => [
47 | 'memory' => 1024,
48 | 'threads' => 2,
49 | 'time' => 2,
50 | ],
51 |
52 | ];
53 |
--------------------------------------------------------------------------------
/config/logging.php:
--------------------------------------------------------------------------------
1 | env('LOG_CHANNEL', 'stack'),
21 |
22 | /*
23 | |--------------------------------------------------------------------------
24 | | Log Channels
25 | |--------------------------------------------------------------------------
26 | |
27 | | Here you may configure the log channels for your application. Out of
28 | | the box, Laravel uses the Monolog PHP logging library. This gives
29 | | you a variety of powerful log handlers / formatters to utilize.
30 | |
31 | | Available Drivers: "single", "daily", "slack", "syslog",
32 | | "errorlog", "monolog",
33 | | "custom", "stack"
34 | |
35 | */
36 |
37 | 'channels' => [
38 | 'stack' => [
39 | 'driver' => 'stack',
40 | 'channels' => ['single'],
41 | 'ignore_exceptions' => false,
42 | ],
43 |
44 | 'single' => [
45 | 'driver' => 'single',
46 | 'path' => storage_path('logs/laravel.log'),
47 | 'level' => env('LOG_LEVEL', 'debug'),
48 | ],
49 |
50 | 'daily' => [
51 | 'driver' => 'daily',
52 | 'path' => storage_path('logs/laravel.log'),
53 | 'level' => env('LOG_LEVEL', 'debug'),
54 | 'days' => 14,
55 | ],
56 |
57 | 'slack' => [
58 | 'driver' => 'slack',
59 | 'url' => env('LOG_SLACK_WEBHOOK_URL'),
60 | 'username' => 'Laravel Log',
61 | 'emoji' => ':boom:',
62 | 'level' => env('LOG_LEVEL', 'critical'),
63 | ],
64 |
65 | 'papertrail' => [
66 | 'driver' => 'monolog',
67 | 'level' => env('LOG_LEVEL', 'debug'),
68 | 'handler' => SyslogUdpHandler::class,
69 | 'handler_with' => [
70 | 'host' => env('PAPERTRAIL_URL'),
71 | 'port' => env('PAPERTRAIL_PORT'),
72 | ],
73 | ],
74 |
75 | 'stderr' => [
76 | 'driver' => 'monolog',
77 | 'level' => env('LOG_LEVEL', 'debug'),
78 | 'handler' => StreamHandler::class,
79 | 'formatter' => env('LOG_STDERR_FORMATTER'),
80 | 'with' => [
81 | 'stream' => 'php://stderr',
82 | ],
83 | ],
84 |
85 | 'syslog' => [
86 | 'driver' => 'syslog',
87 | 'level' => env('LOG_LEVEL', 'debug'),
88 | ],
89 |
90 | 'errorlog' => [
91 | 'driver' => 'errorlog',
92 | 'level' => env('LOG_LEVEL', 'debug'),
93 | ],
94 |
95 | 'null' => [
96 | 'driver' => 'monolog',
97 | 'handler' => NullHandler::class,
98 | ],
99 |
100 | 'emergency' => [
101 | 'path' => storage_path('logs/laravel.log'),
102 | ],
103 | ],
104 |
105 | ];
106 |
--------------------------------------------------------------------------------
/config/mail.php:
--------------------------------------------------------------------------------
1 | env('MAIL_MAILER', 'smtp'),
17 |
18 | /*
19 | |--------------------------------------------------------------------------
20 | | Mailer Configurations
21 | |--------------------------------------------------------------------------
22 | |
23 | | Here you may configure all of the mailers used by your application plus
24 | | their respective settings. Several examples have been configured for
25 | | you and you are free to add your own as your application requires.
26 | |
27 | | Laravel supports a variety of mail "transport" drivers to be used while
28 | | sending an e-mail. You will specify which one you are using for your
29 | | mailers below. You are free to add additional mailers as required.
30 | |
31 | | Supported: "smtp", "sendmail", "mailgun", "ses",
32 | | "postmark", "log", "array"
33 | |
34 | */
35 |
36 | 'mailers' => [
37 | 'smtp' => [
38 | 'transport' => 'smtp',
39 | 'host' => env('MAIL_HOST', 'smtp.mailgun.org'),
40 | 'port' => env('MAIL_PORT', 587),
41 | 'encryption' => env('MAIL_ENCRYPTION', 'tls'),
42 | 'username' => env('MAIL_USERNAME'),
43 | 'password' => env('MAIL_PASSWORD'),
44 | 'timeout' => null,
45 | 'auth_mode' => null,
46 | ],
47 |
48 | 'ses' => [
49 | 'transport' => 'ses',
50 | ],
51 |
52 | 'mailgun' => [
53 | 'transport' => 'mailgun',
54 | ],
55 |
56 | 'postmark' => [
57 | 'transport' => 'postmark',
58 | ],
59 |
60 | 'sendmail' => [
61 | 'transport' => 'sendmail',
62 | 'path' => '/usr/sbin/sendmail -bs',
63 | ],
64 |
65 | 'log' => [
66 | 'transport' => 'log',
67 | 'channel' => env('MAIL_LOG_CHANNEL'),
68 | ],
69 |
70 | 'array' => [
71 | 'transport' => 'array',
72 | ],
73 | ],
74 |
75 | /*
76 | |--------------------------------------------------------------------------
77 | | Global "From" Address
78 | |--------------------------------------------------------------------------
79 | |
80 | | You may wish for all e-mails sent by your application to be sent from
81 | | the same address. Here, you may specify a name and address that is
82 | | used globally for all e-mails that are sent by your application.
83 | |
84 | */
85 |
86 | 'from' => [
87 | 'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'),
88 | 'name' => env('MAIL_FROM_NAME', 'Example'),
89 | ],
90 |
91 | /*
92 | |--------------------------------------------------------------------------
93 | | Markdown Mail Settings
94 | |--------------------------------------------------------------------------
95 | |
96 | | If you are using Markdown based email rendering, you may configure your
97 | | theme and component paths here, allowing you to customize the design
98 | | of the emails. Or, you may simply stick with the Laravel defaults!
99 | |
100 | */
101 |
102 | 'markdown' => [
103 | 'theme' => 'default',
104 |
105 | 'paths' => [
106 | resource_path('views/vendor/mail'),
107 | ],
108 | ],
109 |
110 | ];
111 |
--------------------------------------------------------------------------------
/config/queue.php:
--------------------------------------------------------------------------------
1 | env('QUEUE_CONNECTION', 'sync'),
17 |
18 | /*
19 | |--------------------------------------------------------------------------
20 | | Queue Connections
21 | |--------------------------------------------------------------------------
22 | |
23 | | Here you may configure the connection information for each server that
24 | | is used by your application. A default configuration has been added
25 | | for each back-end shipped with Laravel. You are free to add more.
26 | |
27 | | Drivers: "sync", "database", "beanstalkd", "sqs", "redis", "null"
28 | |
29 | */
30 |
31 | 'connections' => [
32 |
33 | 'sync' => [
34 | 'driver' => 'sync',
35 | ],
36 |
37 | 'database' => [
38 | 'driver' => 'database',
39 | 'table' => 'jobs',
40 | 'queue' => 'default',
41 | 'retry_after' => 90,
42 | 'after_commit' => false,
43 | ],
44 |
45 | 'beanstalkd' => [
46 | 'driver' => 'beanstalkd',
47 | 'host' => 'localhost',
48 | 'queue' => 'default',
49 | 'retry_after' => 90,
50 | 'block_for' => 0,
51 | 'after_commit' => false,
52 | ],
53 |
54 | 'sqs' => [
55 | 'driver' => 'sqs',
56 | 'key' => env('AWS_ACCESS_KEY_ID'),
57 | 'secret' => env('AWS_SECRET_ACCESS_KEY'),
58 | 'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'),
59 | 'queue' => env('SQS_QUEUE', 'default'),
60 | 'suffix' => env('SQS_SUFFIX'),
61 | 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
62 | 'after_commit' => false,
63 | ],
64 |
65 | 'redis' => [
66 | 'driver' => 'redis',
67 | 'connection' => 'default',
68 | 'queue' => env('REDIS_QUEUE', 'default'),
69 | 'retry_after' => 90,
70 | 'block_for' => null,
71 | 'after_commit' => false,
72 | ],
73 |
74 | ],
75 |
76 | /*
77 | |--------------------------------------------------------------------------
78 | | Failed Queue Jobs
79 | |--------------------------------------------------------------------------
80 | |
81 | | These options configure the behavior of failed queue job logging so you
82 | | can control which database and table are used to store the jobs that
83 | | have failed. You may change them to any database / table you wish.
84 | |
85 | */
86 |
87 | 'failed' => [
88 | 'driver' => env('QUEUE_FAILED_DRIVER', 'database-uuids'),
89 | 'database' => env('DB_CONNECTION', 'mysql'),
90 | 'table' => 'failed_jobs',
91 | ],
92 |
93 | ];
94 |
--------------------------------------------------------------------------------
/config/services.php:
--------------------------------------------------------------------------------
1 | [
18 | 'domain' => env('MAILGUN_DOMAIN'),
19 | 'secret' => env('MAILGUN_SECRET'),
20 | 'endpoint' => env('MAILGUN_ENDPOINT', 'api.mailgun.net'),
21 | ],
22 |
23 | 'postmark' => [
24 | 'token' => env('POSTMARK_TOKEN'),
25 | ],
26 |
27 | 'ses' => [
28 | 'key' => env('AWS_ACCESS_KEY_ID'),
29 | 'secret' => env('AWS_SECRET_ACCESS_KEY'),
30 | 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
31 | ],
32 |
33 | ];
34 |
--------------------------------------------------------------------------------
/config/session.php:
--------------------------------------------------------------------------------
1 | env('SESSION_DRIVER', 'file'),
22 |
23 | /*
24 | |--------------------------------------------------------------------------
25 | | Session Lifetime
26 | |--------------------------------------------------------------------------
27 | |
28 | | Here you may specify the number of minutes that you wish the session
29 | | to be allowed to remain idle before it expires. If you want them
30 | | to immediately expire on the browser closing, set that option.
31 | |
32 | */
33 |
34 | 'lifetime' => env('SESSION_LIFETIME', 120),
35 |
36 | 'expire_on_close' => false,
37 |
38 | /*
39 | |--------------------------------------------------------------------------
40 | | Session Encryption
41 | |--------------------------------------------------------------------------
42 | |
43 | | This option allows you to easily specify that all of your session data
44 | | should be encrypted before it is stored. All encryption will be run
45 | | automatically by Laravel and you can use the Session like normal.
46 | |
47 | */
48 |
49 | 'encrypt' => false,
50 |
51 | /*
52 | |--------------------------------------------------------------------------
53 | | Session File Location
54 | |--------------------------------------------------------------------------
55 | |
56 | | When using the native session driver, we need a location where session
57 | | files may be stored. A default has been set for you but a different
58 | | location may be specified. This is only needed for file sessions.
59 | |
60 | */
61 |
62 | 'files' => storage_path('framework/sessions'),
63 |
64 | /*
65 | |--------------------------------------------------------------------------
66 | | Session Database Connection
67 | |--------------------------------------------------------------------------
68 | |
69 | | When using the "database" or "redis" session drivers, you may specify a
70 | | connection that should be used to manage these sessions. This should
71 | | correspond to a connection in your database configuration options.
72 | |
73 | */
74 |
75 | 'connection' => env('SESSION_CONNECTION', null),
76 |
77 | /*
78 | |--------------------------------------------------------------------------
79 | | Session Database Table
80 | |--------------------------------------------------------------------------
81 | |
82 | | When using the "database" session driver, you may specify the table we
83 | | should use to manage the sessions. Of course, a sensible default is
84 | | provided for you; however, you are free to change this as needed.
85 | |
86 | */
87 |
88 | 'table' => 'sessions',
89 |
90 | /*
91 | |--------------------------------------------------------------------------
92 | | Session Cache Store
93 | |--------------------------------------------------------------------------
94 | |
95 | | While using one of the framework's cache driven session backends you may
96 | | list a cache store that should be used for these sessions. This value
97 | | must match with one of the application's configured cache "stores".
98 | |
99 | | Affects: "apc", "dynamodb", "memcached", "redis"
100 | |
101 | */
102 |
103 | 'store' => env('SESSION_STORE', null),
104 |
105 | /*
106 | |--------------------------------------------------------------------------
107 | | Session Sweeping Lottery
108 | |--------------------------------------------------------------------------
109 | |
110 | | Some session drivers must manually sweep their storage location to get
111 | | rid of old sessions from storage. Here are the chances that it will
112 | | happen on a given request. By default, the odds are 2 out of 100.
113 | |
114 | */
115 |
116 | 'lottery' => [2, 100],
117 |
118 | /*
119 | |--------------------------------------------------------------------------
120 | | Session Cookie Name
121 | |--------------------------------------------------------------------------
122 | |
123 | | Here you may change the name of the cookie used to identify a session
124 | | instance by ID. The name specified here will get used every time a
125 | | new session cookie is created by the framework for every driver.
126 | |
127 | */
128 |
129 | 'cookie' => env(
130 | 'SESSION_COOKIE',
131 | Str::slug(env('APP_NAME', 'laravel'), '_').'_session'
132 | ),
133 |
134 | /*
135 | |--------------------------------------------------------------------------
136 | | Session Cookie Path
137 | |--------------------------------------------------------------------------
138 | |
139 | | The session cookie path determines the path for which the cookie will
140 | | be regarded as available. Typically, this will be the root path of
141 | | your application but you are free to change this when necessary.
142 | |
143 | */
144 |
145 | 'path' => '/',
146 |
147 | /*
148 | |--------------------------------------------------------------------------
149 | | Session Cookie Domain
150 | |--------------------------------------------------------------------------
151 | |
152 | | Here you may change the domain of the cookie used to identify a session
153 | | in your application. This will determine which domains the cookie is
154 | | available to in your application. A sensible default has been set.
155 | |
156 | */
157 |
158 | 'domain' => env('SESSION_DOMAIN', null),
159 |
160 | /*
161 | |--------------------------------------------------------------------------
162 | | HTTPS Only Cookies
163 | |--------------------------------------------------------------------------
164 | |
165 | | By setting this option to true, session cookies will only be sent back
166 | | to the server if the browser has a HTTPS connection. This will keep
167 | | the cookie from being sent to you if it can not be done securely.
168 | |
169 | */
170 |
171 | 'secure' => env('SESSION_SECURE_COOKIE'),
172 |
173 | /*
174 | |--------------------------------------------------------------------------
175 | | HTTP Access Only
176 | |--------------------------------------------------------------------------
177 | |
178 | | Setting this value to true will prevent JavaScript from accessing the
179 | | value of the cookie and the cookie will only be accessible through
180 | | the HTTP protocol. You are free to modify this option if needed.
181 | |
182 | */
183 |
184 | 'http_only' => true,
185 |
186 | /*
187 | |--------------------------------------------------------------------------
188 | | Same-Site Cookies
189 | |--------------------------------------------------------------------------
190 | |
191 | | This option determines how your cookies behave when cross-site requests
192 | | take place, and can be used to mitigate CSRF attacks. By default, we
193 | | will set this value to "lax" since this is a secure default value.
194 | |
195 | | Supported: "lax", "strict", "none", null
196 | |
197 | */
198 |
199 | 'same_site' => 'lax',
200 |
201 | ];
202 |
--------------------------------------------------------------------------------
/config/view.php:
--------------------------------------------------------------------------------
1 | [
17 | resource_path('views'),
18 | ],
19 |
20 | /*
21 | |--------------------------------------------------------------------------
22 | | Compiled View Path
23 | |--------------------------------------------------------------------------
24 | |
25 | | This option determines where all the compiled Blade templates will be
26 | | stored for your application. Typically, this is within the storage
27 | | directory. However, as usual, you are free to change this value.
28 | |
29 | */
30 |
31 | 'compiled' => env(
32 | 'VIEW_COMPILED_PATH',
33 | realpath(storage_path('framework/views'))
34 | ),
35 |
36 | ];
37 |
--------------------------------------------------------------------------------
/database/.gitignore:
--------------------------------------------------------------------------------
1 | *.sqlite
2 | *.sqlite-journal
3 |
--------------------------------------------------------------------------------
/database/factories/UserFactory.php:
--------------------------------------------------------------------------------
1 | $this->faker->name,
27 | 'email' => $this->faker->unique()->safeEmail,
28 | 'email_verified_at' => now(),
29 | 'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
30 | 'remember_token' => Str::random(10),
31 | ];
32 | }
33 |
34 | /**
35 | * Indicate that the model's email address should be unverified.
36 | *
37 | * @return \Illuminate\Database\Eloquent\Factories\Factory
38 | */
39 | public function unverified()
40 | {
41 | return $this->state(function (array $attributes) {
42 | return [
43 | 'email_verified_at' => null,
44 | ];
45 | });
46 | }
47 | }
48 |
--------------------------------------------------------------------------------
/database/migrations/2014_10_12_000000_create_users_table.php:
--------------------------------------------------------------------------------
1 | id();
18 | $table->string('name');
19 | $table->string('email')->unique();
20 | $table->timestamp('email_verified_at')->nullable();
21 | $table->string('password');
22 | $table->rememberToken();
23 | $table->timestamps();
24 | });
25 | }
26 |
27 | /**
28 | * Reverse the migrations.
29 | *
30 | * @return void
31 | */
32 | public function down()
33 | {
34 | Schema::dropIfExists('users');
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/database/migrations/2014_10_12_100000_create_password_resets_table.php:
--------------------------------------------------------------------------------
1 | string('email')->index();
18 | $table->string('token');
19 | $table->timestamp('created_at')->nullable();
20 | });
21 | }
22 |
23 | /**
24 | * Reverse the migrations.
25 | *
26 | * @return void
27 | */
28 | public function down()
29 | {
30 | Schema::dropIfExists('password_resets');
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/database/migrations/2019_08_19_000000_create_failed_jobs_table.php:
--------------------------------------------------------------------------------
1 | id();
18 | $table->string('uuid')->unique();
19 | $table->text('connection');
20 | $table->text('queue');
21 | $table->longText('payload');
22 | $table->longText('exception');
23 | $table->timestamp('failed_at')->useCurrent();
24 | });
25 | }
26 |
27 | /**
28 | * Reverse the migrations.
29 | *
30 | * @return void
31 | */
32 | public function down()
33 | {
34 | Schema::dropIfExists('failed_jobs');
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/database/migrations/2021_03_28_021910_create_customers_table.php:
--------------------------------------------------------------------------------
1 | id();
18 | $table->string('name');
19 | $table->string('email');
20 | $table->string('cpf');
21 | $table->timestamps();
22 | });
23 | }
24 |
25 | /**
26 | * Reverse the migrations.
27 | *
28 | * @return void
29 | */
30 | public function down()
31 | {
32 | Schema::dropIfExists('customers');
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/database/seeders/DatabaseSeeder.php:
--------------------------------------------------------------------------------
1 | create();
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/importacao_clientes.xlsx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/thalesbarbosab/laravel-excel-import-report/67f21d55ddf9827708f47ea0cd42d17ab7a78a21/importacao_clientes.xlsx
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "private": true,
3 | "scripts": {
4 | "dev": "npm run development",
5 | "development": "mix",
6 | "watch": "mix watch",
7 | "watch-poll": "mix watch -- --watch-options-poll=1000",
8 | "hot": "mix watch --hot",
9 | "prod": "npm run production",
10 | "production": "mix --production"
11 | },
12 | "devDependencies": {
13 | "axios": "^0.21",
14 | "laravel-mix": "^6.0.6",
15 | "lodash": "^4.17.19",
16 | "postcss": "^8.1.14"
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/public/.htaccess:
--------------------------------------------------------------------------------
1 |
' + this.options.message + 93 | '
\n \n ' + 94 | customButtons + '\n '; 95 | 96 | this.focusedElBeforeOpen = document.activeElement; 97 | document.querySelector('.toastjs-btn--close').focus(); 98 | }; 99 | 100 | Toast.prototype._init = function() { 101 | var _this4 = this; 102 | 103 | Promise.resolve().then(function() { 104 | if (_this4.toastContainerEl) { 105 | return Promise.resolve(); 106 | } 107 | return _this4._createElements(); 108 | }).then(function() { 109 | if (_this4.toastContainerEl.getAttribute('aria-hidden') == 'false') { 110 | return _this4._close(); 111 | } 112 | return Promise.resolve(); 113 | }).then(function() { 114 | _this4._open(); 115 | _this4._addEventListeners(); 116 | }); 117 | }; 118 | -------------------------------------------------------------------------------- /public/vendor/toastr/toastr.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Note that this is toastr v2.1.3, the "latest" version in url has no more maintenance, 3 | * please go to https://cdnjs.com/libraries/toastr.js and pick a certain version you want to use, 4 | * make sure you copy the url from the website since the url may change between versions. 5 | * 6 | */ 7 | .toast-title { 8 | font-weight: 700 9 | } 10 | 11 | .toast-message { 12 | -ms-word-wrap: break-word; 13 | word-wrap: break-word 14 | } 15 | 16 | .toast-message a, 17 | .toast-message label { 18 | color: #FFF 19 | } 20 | 21 | .toast-message a:hover { 22 | color: #CCC; 23 | text-decoration: none 24 | } 25 | 26 | .toast-close-button { 27 | position: relative; 28 | right: -.3em; 29 | top: -.3em; 30 | float: right; 31 | font-size: 20px; 32 | font-weight: 700; 33 | color: #FFF; 34 | -webkit-text-shadow: 0 1px 0 #fff; 35 | text-shadow: 0 1px 0 #fff; 36 | opacity: .8; 37 | -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=80); 38 | filter: alpha(opacity=80); 39 | line-height: 1 40 | } 41 | 42 | .toast-close-button:focus, 43 | .toast-close-button:hover { 44 | color: #000; 45 | text-decoration: none; 46 | cursor: pointer; 47 | opacity: .4; 48 | -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=40); 49 | filter: alpha(opacity=40) 50 | } 51 | 52 | .rtl .toast-close-button { 53 | left: -.3em; 54 | float: left; 55 | right: .3em 56 | } 57 | 58 | button.toast-close-button { 59 | padding: 0; 60 | cursor: pointer; 61 | background: 0 0; 62 | border: 0; 63 | -webkit-appearance: none 64 | } 65 | 66 | .toast-top-center { 67 | top: 0; 68 | right: 0; 69 | width: 100% 70 | } 71 | 72 | .toast-bottom-center { 73 | bottom: 0; 74 | right: 0; 75 | width: 100% 76 | } 77 | 78 | .toast-top-full-width { 79 | top: 0; 80 | right: 0; 81 | width: 100% 82 | } 83 | 84 | .toast-bottom-full-width { 85 | bottom: 0; 86 | right: 0; 87 | width: 100% 88 | } 89 | 90 | .toast-top-left { 91 | top: 12px; 92 | left: 12px 93 | } 94 | 95 | .toast-top-right { 96 | top: 12px; 97 | right: 12px 98 | } 99 | 100 | .toast-bottom-right { 101 | right: 12px; 102 | bottom: 12px 103 | } 104 | 105 | .toast-bottom-left { 106 | bottom: 12px; 107 | left: 12px 108 | } 109 | 110 | #toast-container { 111 | position: fixed; 112 | z-index: 999999; 113 | pointer-events: none 114 | } 115 | 116 | #toast-container * { 117 | -moz-box-sizing: border-box; 118 | -webkit-box-sizing: border-box; 119 | box-sizing: border-box 120 | } 121 | 122 | #toast-container>div { 123 | position: relative; 124 | pointer-events: auto; 125 | overflow: hidden; 126 | margin: 0 0 6px; 127 | padding: 15px 15px 15px 50px; 128 | width: 300px; 129 | -moz-border-radius: 3px; 130 | -webkit-border-radius: 3px; 131 | border-radius: 3px; 132 | background-position: 15px center; 133 | background-repeat: no-repeat; 134 | -moz-box-shadow: 0 0 12px #999; 135 | -webkit-box-shadow: 0 0 12px #999; 136 | box-shadow: 0 0 12px #999; 137 | color: #FFF; 138 | opacity: .8; 139 | -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=80); 140 | filter: alpha(opacity=80) 141 | } 142 | 143 | #toast-container>div.rtl { 144 | direction: rtl; 145 | padding: 15px 50px 15px 15px; 146 | background-position: right 15px center 147 | } 148 | 149 | #toast-container>div:hover { 150 | -moz-box-shadow: 0 0 12px #000; 151 | -webkit-box-shadow: 0 0 12px #000; 152 | box-shadow: 0 0 12px #000; 153 | opacity: 1; 154 | -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100); 155 | filter: alpha(opacity=100); 156 | cursor: pointer 157 | } 158 | 159 | #toast-container>.toast-info { 160 | background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGwSURBVEhLtZa9SgNBEMc9sUxxRcoUKSzSWIhXpFMhhYWFhaBg4yPYiWCXZxBLERsLRS3EQkEfwCKdjWJAwSKCgoKCcudv4O5YLrt7EzgXhiU3/4+b2ckmwVjJSpKkQ6wAi4gwhT+z3wRBcEz0yjSseUTrcRyfsHsXmD0AmbHOC9Ii8VImnuXBPglHpQ5wwSVM7sNnTG7Za4JwDdCjxyAiH3nyA2mtaTJufiDZ5dCaqlItILh1NHatfN5skvjx9Z38m69CgzuXmZgVrPIGE763Jx9qKsRozWYw6xOHdER+nn2KkO+Bb+UV5CBN6WC6QtBgbRVozrahAbmm6HtUsgtPC19tFdxXZYBOfkbmFJ1VaHA1VAHjd0pp70oTZzvR+EVrx2Ygfdsq6eu55BHYR8hlcki+n+kERUFG8BrA0BwjeAv2M8WLQBtcy+SD6fNsmnB3AlBLrgTtVW1c2QN4bVWLATaIS60J2Du5y1TiJgjSBvFVZgTmwCU+dAZFoPxGEEs8nyHC9Bwe2GvEJv2WXZb0vjdyFT4Cxk3e/kIqlOGoVLwwPevpYHT+00T+hWwXDf4AJAOUqWcDhbwAAAAASUVORK5CYII=) !important 161 | } 162 | 163 | #toast-container>.toast-error { 164 | background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHOSURBVEhLrZa/SgNBEMZzh0WKCClSCKaIYOED+AAKeQQLG8HWztLCImBrYadgIdY+gIKNYkBFSwu7CAoqCgkkoGBI/E28PdbLZmeDLgzZzcx83/zZ2SSXC1j9fr+I1Hq93g2yxH4iwM1vkoBWAdxCmpzTxfkN2RcyZNaHFIkSo10+8kgxkXIURV5HGxTmFuc75B2RfQkpxHG8aAgaAFa0tAHqYFfQ7Iwe2yhODk8+J4C7yAoRTWI3w/4klGRgR4lO7Rpn9+gvMyWp+uxFh8+H+ARlgN1nJuJuQAYvNkEnwGFck18Er4q3egEc/oO+mhLdKgRyhdNFiacC0rlOCbhNVz4H9FnAYgDBvU3QIioZlJFLJtsoHYRDfiZoUyIxqCtRpVlANq0EU4dApjrtgezPFad5S19Wgjkc0hNVnuF4HjVA6C7QrSIbylB+oZe3aHgBsqlNqKYH48jXyJKMuAbiyVJ8KzaB3eRc0pg9VwQ4niFryI68qiOi3AbjwdsfnAtk0bCjTLJKr6mrD9g8iq/S/B81hguOMlQTnVyG40wAcjnmgsCNESDrjme7wfftP4P7SP4N3CJZdvzoNyGq2c/HWOXJGsvVg+RA/k2MC/wN6I2YA2Pt8GkAAAAASUVORK5CYII=) !important 165 | } 166 | 167 | #toast-container>.toast-success { 168 | background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADsSURBVEhLY2AYBfQMgf///3P8+/evAIgvA/FsIF+BavYDDWMBGroaSMMBiE8VC7AZDrIFaMFnii3AZTjUgsUUWUDA8OdAH6iQbQEhw4HyGsPEcKBXBIC4ARhex4G4BsjmweU1soIFaGg/WtoFZRIZdEvIMhxkCCjXIVsATV6gFGACs4Rsw0EGgIIH3QJYJgHSARQZDrWAB+jawzgs+Q2UO49D7jnRSRGoEFRILcdmEMWGI0cm0JJ2QpYA1RDvcmzJEWhABhD/pqrL0S0CWuABKgnRki9lLseS7g2AlqwHWQSKH4oKLrILpRGhEQCw2LiRUIa4lwAAAABJRU5ErkJggg==) !important 169 | } 170 | 171 | #toast-container>.toast-warning { 172 | background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGYSURBVEhL5ZSvTsNQFMbXZGICMYGYmJhAQIJAICYQPAACiSDB8AiICQQJT4CqQEwgJvYASAQCiZiYmJhAIBATCARJy+9rTsldd8sKu1M0+dLb057v6/lbq/2rK0mS/TRNj9cWNAKPYIJII7gIxCcQ51cvqID+GIEX8ASG4B1bK5gIZFeQfoJdEXOfgX4QAQg7kH2A65yQ87lyxb27sggkAzAuFhbbg1K2kgCkB1bVwyIR9m2L7PRPIhDUIXgGtyKw575yz3lTNs6X4JXnjV+LKM/m3MydnTbtOKIjtz6VhCBq4vSm3ncdrD2lk0VgUXSVKjVDJXJzijW1RQdsU7F77He8u68koNZTz8Oz5yGa6J3H3lZ0xYgXBK2QymlWWA+RWnYhskLBv2vmE+hBMCtbA7KX5drWyRT/2JsqZ2IvfB9Y4bWDNMFbJRFmC9E74SoS0CqulwjkC0+5bpcV1CZ8NMej4pjy0U+doDQsGyo1hzVJttIjhQ7GnBtRFN1UarUlH8F3xict+HY07rEzoUGPlWcjRFRr4/gChZgc3ZL2d8oAAAAASUVORK5CYII=) !important 173 | } 174 | 175 | #toast-container.toast-bottom-center>div, 176 | #toast-container.toast-top-center>div { 177 | width: 300px; 178 | margin-left: auto; 179 | margin-right: auto 180 | } 181 | 182 | #toast-container.toast-bottom-full-width>div, 183 | #toast-container.toast-top-full-width>div { 184 | width: 96%; 185 | margin-left: auto; 186 | margin-right: auto 187 | } 188 | 189 | .toast { 190 | background-color: #030303 191 | } 192 | 193 | .toast-success { 194 | background-color: #51A351 195 | } 196 | 197 | .toast-error { 198 | background-color: #BD362F 199 | } 200 | 201 | .toast-info { 202 | background-color: #2F96B4 203 | } 204 | 205 | .toast-warning { 206 | background-color: #F89406 207 | } 208 | 209 | .toast-progress { 210 | position: absolute; 211 | left: 0; 212 | bottom: 0; 213 | height: 4px; 214 | background-color: #000; 215 | opacity: .4; 216 | -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=40); 217 | filter: alpha(opacity=40) 218 | } 219 | 220 | @media all and (max-width:240px) { 221 | #toast-container>div { 222 | padding: 8px 8px 8px 50px; 223 | width: 11em 224 | } 225 | 226 | #toast-container>div.rtl { 227 | padding: 8px 50px 8px 8px 228 | } 229 | 230 | #toast-container .toast-close-button { 231 | right: -.2em; 232 | top: -.2em 233 | } 234 | 235 | #toast-container .rtl .toast-close-button { 236 | left: -.2em; 237 | right: .2em 238 | } 239 | } 240 | 241 | @media all and (min-width:241px) and (max-width:480px) { 242 | #toast-container>div { 243 | padding: 8px 8px 8px 50px; 244 | width: 18em 245 | } 246 | 247 | #toast-container>div.rtl { 248 | padding: 8px 50px 8px 8px 249 | } 250 | 251 | #toast-container .toast-close-button { 252 | right: -.2em; 253 | top: -.2em 254 | } 255 | 256 | #toast-container .rtl .toast-close-button { 257 | left: -.2em; 258 | right: .2em 259 | } 260 | } 261 | 262 | @media all and (min-width:481px) and (max-width:768px) { 263 | #toast-container>div { 264 | padding: 15px 15px 15px 50px; 265 | width: 25em 266 | } 267 | 268 | #toast-container>div.rtl { 269 | padding: 15px 50px 15px 15px 270 | } 271 | } 272 | -------------------------------------------------------------------------------- /public/vendor/toastr/toastr.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Note that this is toastr v2.1.3, the "latest" version in url has no more maintenance, 3 | * please go to https://cdnjs.com/libraries/toastr.js and pick a certain version you want to use, 4 | * make sure you copy the url from the website since the url may change between versions. 5 | * */ 6 | ! function(e) { 7 | e(["jquery"], function(e) { 8 | return function() { 9 | function t(e, t, n) { 10 | return g({ 11 | type: O.error, 12 | iconClass: m().iconClasses.error, 13 | message: e, 14 | optionsOverride: n, 15 | title: t 16 | }) 17 | } 18 | 19 | function n(t, n) { 20 | return t || (t = m()), v = e("#" + t.containerId), v.length ? v : (n && (v = d(t)), 21 | v) 22 | } 23 | 24 | function o(e, t, n) { 25 | return g({ 26 | type: O.info, 27 | iconClass: m().iconClasses.info, 28 | message: e, 29 | optionsOverride: n, 30 | title: t 31 | }) 32 | } 33 | 34 | function s(e) { 35 | C = e 36 | } 37 | 38 | function i(e, t, n) { 39 | return g({ 40 | type: O.success, 41 | iconClass: m().iconClasses.success, 42 | message: e, 43 | optionsOverride: n, 44 | title: t 45 | }) 46 | } 47 | 48 | function a(e, t, n) { 49 | return g({ 50 | type: O.warning, 51 | iconClass: m().iconClasses.warning, 52 | message: e, 53 | optionsOverride: n, 54 | title: t 55 | }) 56 | } 57 | 58 | function r(e, t) { 59 | var o = m(); 60 | v || n(o), u(e, o, t) || l(o) 61 | } 62 | 63 | function c(t) { 64 | var o = m(); 65 | return v || n(o), t && 0 === e(":focus", t).length ? void h(t) : void(v.children() 66 | .length && v.remove()) 67 | } 68 | 69 | function l(t) { 70 | for (var n = v.children(), o = n.length - 1; o >= 0; o--) u(e(n[o]), t) 71 | } 72 | 73 | function u(t, n, o) { 74 | var s = !(!o || !o.force) && o.force; 75 | return !(!t || !s && 0 !== e(":focus", t).length) && (t[n.hideMethod]({ 76 | duration: n.hideDuration, 77 | easing: n.hideEasing, 78 | complete: function() { 79 | h(t) 80 | } 81 | }), !0) 82 | } 83 | 84 | function d(t) { 85 | return v = e("").attr("id", t.containerId).addClass(t.positionClass), v 86 | .appendTo(e(t.target)), v 87 | } 88 | 89 | function p() { 90 | return { 91 | tapToDismiss: !0, 92 | toastClass: "toast", 93 | containerId: "toast-container", 94 | debug: !1, 95 | showMethod: "fadeIn", 96 | showDuration: 300, 97 | showEasing: "swing", 98 | onShown: void 0, 99 | hideMethod: "fadeOut", 100 | hideDuration: 1e3, 101 | hideEasing: "swing", 102 | onHidden: void 0, 103 | closeMethod: !1, 104 | closeDuration: !1, 105 | closeEasing: !1, 106 | closeOnHover: !0, 107 | extendedTimeOut: 1e3, 108 | iconClasses: { 109 | error: "toast-error", 110 | info: "toast-info", 111 | success: "toast-success", 112 | warning: "toast-warning" 113 | }, 114 | iconClass: "toast-info", 115 | positionClass: "toast-top-right", 116 | timeOut: 5e3, 117 | titleClass: "toast-title", 118 | messageClass: "toast-message", 119 | escapeHtml: !1, 120 | target: "body", 121 | closeHtml: '', 122 | closeClass: "toast-close-button", 123 | newestOnTop: !0, 124 | preventDuplicates: !1, 125 | progressBar: !1, 126 | progressClass: "toast-progress", 127 | rtl: !1 128 | } 129 | } 130 | 131 | function f(e) { 132 | C && C(e) 133 | } 134 | 135 | function g(t) { 136 | function o(e) { 137 | return null == e && (e = ""), e.replace(/&/g, "&").replace(/"/g, """) 138 | .replace(/'/g, "'").replace(//g, ">") 139 | } 140 | 141 | function s() { 142 | c(), u(), d(), p(), g(), C(), l(), i() 143 | } 144 | 145 | function i() { 146 | var e = ""; 147 | switch (t.iconClass) { 148 | case "toast-success": 149 | case "toast-info": 150 | e = "polite"; 151 | break; 152 | default: 153 | e = "assertive" 154 | } 155 | I.attr("aria-live", e) 156 | } 157 | 158 | function a() { 159 | E.closeOnHover && I.hover(H, D), !E.onclick && E.tapToDismiss && I.click(b), E 160 | .closeButton && j && j.click(function(e) { 161 | e.stopPropagation ? e.stopPropagation() : void 0 !== e 162 | .cancelBubble && e.cancelBubble !== !0 && (e.cancelBubble = !0), 163 | E.onCloseClick && E.onCloseClick(e), b(!0) 164 | }), E.onclick && I.click(function(e) { 165 | E.onclick(e), b() 166 | }) 167 | } 168 | 169 | function r() { 170 | I.hide(), I[E.showMethod]({ 171 | duration: E.showDuration, 172 | easing: E.showEasing, 173 | complete: E.onShown 174 | }), E.timeOut > 0 && (k = setTimeout(b, E.timeOut), F.maxHideTime = 175 | parseFloat(E.timeOut), F.hideEta = (new Date).getTime() + F.maxHideTime, 176 | E.progressBar && (F.intervalId = setInterval(x, 10))) 177 | } 178 | 179 | function c() { 180 | t.iconClass && I.addClass(E.toastClass).addClass(y) 181 | } 182 | 183 | function l() { 184 | E.newestOnTop ? v.prepend(I) : v.append(I) 185 | } 186 | 187 | function u() { 188 | if (t.title) { 189 | var e = t.title; 190 | E.escapeHtml && (e = o(t.title)), M.append(e).addClass(E.titleClass), I 191 | .append(M) 192 | } 193 | } 194 | 195 | function d() { 196 | if (t.message) { 197 | var e = t.message; 198 | E.escapeHtml && (e = o(t.message)), B.append(e).addClass(E.messageClass), I 199 | .append(B) 200 | } 201 | } 202 | 203 | function p() { 204 | E.closeButton && (j.addClass(E.closeClass).attr("role", "button"), I.prepend(j)) 205 | } 206 | 207 | function g() { 208 | E.progressBar && (q.addClass(E.progressClass), I.prepend(q)) 209 | } 210 | 211 | function C() { 212 | E.rtl && I.addClass("rtl") 213 | } 214 | 215 | function O(e, t) { 216 | if (e.preventDuplicates) { 217 | if (t.message === w) return !0; 218 | w = t.message 219 | } 220 | return !1 221 | } 222 | 223 | function b(t) { 224 | var n = t && E.closeMethod !== !1 ? E.closeMethod : E.hideMethod, 225 | o = t && E.closeDuration !== !1 ? E.closeDuration : E.hideDuration, 226 | s = t && E.closeEasing !== !1 ? E.closeEasing : E.hideEasing; 227 | if (!e(":focus", I).length || t) return clearTimeout(F.intervalId), I[n]({ 228 | duration: o, 229 | easing: s, 230 | complete: function() { 231 | h(I), clearTimeout(k), E.onHidden && "hidden" !== P 232 | .state && E.onHidden(), P.state = "hidden", P 233 | .endTime = new Date, f(P) 234 | } 235 | }) 236 | } 237 | 238 | function D() { 239 | (E.timeOut > 0 || E.extendedTimeOut > 0) && (k = setTimeout(b, E 240 | .extendedTimeOut), F.maxHideTime = parseFloat(E.extendedTimeOut), F 241 | .hideEta = (new Date).getTime() + F.maxHideTime) 242 | } 243 | 244 | function H() { 245 | clearTimeout(k), F.hideEta = 0, I.stop(!0, !0)[E.showMethod]({ 246 | duration: E.showDuration, 247 | easing: E.showEasing 248 | }) 249 | } 250 | 251 | function x() { 252 | var e = (F.hideEta - (new Date).getTime()) / F.maxHideTime * 100; 253 | q.width(e + "%") 254 | } 255 | var E = m(), 256 | y = t.iconClass || E.iconClass; 257 | if ("undefined" != typeof t.optionsOverride && (E = e.extend(E, t.optionsOverride), 258 | y = t.optionsOverride.iconClass || y), !O(E, t)) { 259 | T++, v = n(E, !0); 260 | var k = null, 261 | I = e(""), 262 | M = e(""), 263 | B = e(""), 264 | q = e(""), 265 | j = e(E.closeHtml), 266 | F = { 267 | intervalId: null, 268 | hideEta: null, 269 | maxHideTime: null 270 | }, 271 | P = { 272 | toastId: T, 273 | state: "visible", 274 | startTime: new Date, 275 | options: E, 276 | map: t 277 | }; 278 | return s(), r(), a(), f(P), E.debug && console && console.log(P), I 279 | } 280 | } 281 | 282 | function m() { 283 | return e.extend({}, p(), b.options) 284 | } 285 | 286 | function h(e) { 287 | v || (v = n()), e.is(":visible") || (e.remove(), e = null, 0 === v.children() 288 | .length && (v.remove(), w = void 0)) 289 | } 290 | var v, C, w, T = 0, 291 | O = { 292 | error: "error", 293 | info: "info", 294 | success: "success", 295 | warning: "warning" 296 | }, 297 | b = { 298 | clear: r, 299 | remove: c, 300 | error: t, 301 | getContainer: n, 302 | info: o, 303 | options: {}, 304 | subscribe: s, 305 | success: i, 306 | version: "2.1.3", 307 | warning: a 308 | }; 309 | return b 310 | }() 311 | }) 312 | }("function" == typeof define && define.amd ? define : function(e, t) { 313 | "undefined" != typeof module && module.exports ? module.exports = t(require("jquery")) : window.toastr = 314 | t(window.jQuery) 315 | }); 316 | //# sourceMappingURL=toastr.js.map 317 | -------------------------------------------------------------------------------- /public/web.config: -------------------------------------------------------------------------------- 1 | 6 |# | 22 |@lang('platform.customer.form.cpf') | 23 |@lang('platform.customer.form.name') | 24 |@lang('platform.customer.form.email') | 25 |@lang('platform.customer.form.options') | 26 |@lang('platform.customer.message.no_data') | 31 | @else 32 | @foreach ($customers as $item) 33 |
---|---|---|---|---|
{{$item->id}} | 35 |{{$item->cpf}} | 36 |{{$item->name}} | 37 |{{$item->email}} | 38 |39 | @lang('platform.generic.action.report') 40 | @lang('platform.generic.action.edit') 41 | 46 | | 47 |
477 | @yield('message') 478 |
479 | 480 | 481 | 482 | 483 |