· 5 years ago · Aug 14, 2020, 12:50 PM
1<?php
2
3namespace App\Http\Controllers;
4
5use App\Enums\JobObjectiveEnum;
6use App\Enums\JobStatusEnum;
7use App\Enums\YearsOfCultivationEnum;
8use App\Models\CollectionProfile;
9use App\Models\Culture;
10use App\Models\CustomField;
11use App\Models\Job;
12use App\Models\Crop;
13use App\Models\JobCustomField;
14use App\Models\JobDepth;
15use App\Models\JobField;
16use App\Models\JobFieldCrop;
17use App\Models\JobFinancialData;
18use App\Models\State;
19use App\Models\WorkType;
20use App\Rules\CNPJ;
21use App\Rules\CPF;
22use App\Rules\Phone;
23use App\Rules\ZipCode;
24use Illuminate\Http\Request;
25use Illuminate\Support\Facades\Auth;
26use Illuminate\Support\Facades\DB;
27use Illuminate\Support\Facades\Session;
28use Illuminate\Support\Facades\Validator;
29use Illuminate\Validation\Rule;
30use App\Models\JobStatus;
31use App\Models\Customer;
32use App\Models\Segment;
33use Illuminate\Support\Facades\Storage;
34use Illuminate\Support\Facades\Mail;
35use App\Mail\JobMail;
36use App\Models\CustomerConfig;
37use App\Models\Farm;
38use App\Models\Field;
39use App\Models\JobType;
40use App\Models\Producer;
41use Carbon\Carbon;
42use Illuminate\Http\Response;
43
44/**
45 * Controlador de solicitação de trabalho
46 *
47 * @author Gerley Adriano <gerley@sysout.com.br>
48 * @since 4 de set de 2018
49 * @version 1.0.0
50 */
51class JobController extends Controller {
52
53 private $jobObjectives = [
54 [ 'id' => 1, 'name' => 'Gestão de Fertilidade Básica'],
55 [ 'id' => 2, 'name' => 'Gestão de Fertilidade Avançada']
56 ];
57
58 /**
59 * Lista todas as solicitações de serviço previamente cadastradas.
60 *
61 * @param Request $request
62 * @return \Illuminate\View\View|\Illuminate\Contracts\View\Factory
63 */
64 public function index(Request $request) {
65
66 list($limit, $column, $sort) = $filters = filterSearch($request, 50);
67
68 $orderedColumns = [ 'id','producer_name', 'farm_name', 'user_email',
69 'city_name', 'state_name', 'created_at', 'job_status_name'];
70 $column = checkOrderBy($orderedColumns, $request->column, 'id');
71
72 //Obtem todos os trabalhos
73 $jobs = Job::search($request->search)->orderBy($column, $sort)->paginate($limit);
74
75 return view("job.index", [ "jobs" => $jobs, "filters" => $filters ]);
76 }
77
78 /**
79 * Exibe o formulário de cadastro de solicitaçao de serviço
80 *
81 * @return \Illuminate\View\View|\Illuminate\Contracts\View\Factory
82 */
83 public function create() {
84
85 //Obtem os dados para criação do formulário
86 $data = $this->getFormData();
87
88 $user = Auth::user();
89
90 $data['job'] = new Job();
91 // $data['jobFinancial'] = null;
92
93 // if (count($customers) == 1) {
94 // $data['jobFinancial'] = $customers->first();
95 // } else {
96 // $data['jobFinancial'] = new JobFinancialData();
97 // }
98
99 return view('job.create-edit', $data);
100 }
101
102 /**
103 * Exibe as informações da solicitação de trabalho
104 * @param unknown $id
105 * @return \Illuminate\View\View|\Illuminate\Contracts\View\Factory|unknown
106 */
107 public function info($id) {
108
109 if($id) {
110
111 $job = Job::findById($id, Auth::user())
112 ->leftJoin('crops as c', 'c.id', 'jobs.crop_id')
113 ->leftJoin('farms as f', 'f.id', 'c.farm_id')
114 ->leftJoin('producers as p', 'p.id', 'f.producer_id')
115 ->leftJoin('customers as ct', 'ct.id', 'p.customer_id')
116 ->select(
117 'jobs.*',
118 'jobs.producer_name as job_producer_name',
119 'jobs.farm_name as job_farm_name',
120 'c.name as crop_name',
121 'c.id as crop_id',
122 'f.name as farm_name',
123 'f.id as farm_id',
124 'p.name as producer_name',
125 'p.id as producer_id',
126 'ct.name as customer_name',
127 'ct.id as customer_id'
128 )
129 ->first();
130
131 if($job) {
132
133 //Obtem as informações do trabalho
134 $data = $this->getJobInfo($id);
135
136 $data['job'] = $job;
137
138 $data['jobStatus'] = JobStatus::all();
139
140 $data['isInfo'] = true;
141
142 $data['customer'] = Customer::search(Auth::user()->customer_id)->first();
143
144 $data['jobFinancial'] = $job->financial;
145
146 return view('job.create-edit', $data);
147 }
148 }
149
150 return redirect('jobs');
151 }
152
153
154 /**
155 * Carrega o formulário para edição da solicitação de trabalho
156 * @param unknown $id
157 * @return \Illuminate\View\View|\Illuminate\Contracts\View\Factory|unknown
158 */
159 public function edit($id) {
160
161 if($id) {
162
163 $job = Job::findById($id, Auth::user())
164 ->leftJoin('crops as c', 'c.id', 'jobs.crop_id')
165 ->leftJoin('farms as f', 'f.id', 'c.farm_id')
166 ->leftJoin('producers as p', 'p.id', 'f.producer_id')
167 ->leftJoin('customers as ct', 'ct.id', 'p.customer_id')
168 ->select(
169 'jobs.*',
170 'jobs.producer_name as job_producer_name',
171 'jobs.farm_name as job_farm_name',
172 'c.name as crop_name',
173 'c.id as crop_id',
174 'f.name as farm_name',
175 'f.id as farm_id',
176 'p.name as producer_name',
177 'p.id as producer_id',
178 'ct.name as customer_name',
179 'ct.id as customer_id'
180 )
181 ->first();
182
183 if($job && ($job->status_id == JobStatusEnum::STAND_BY)) {
184
185 //Obtem as informações do trabalho
186 $data = $this->getJobInfo($id);
187 $data['job'] = $job;
188
189 // $data['jobFinancial'] = $job->financial;
190
191 return view('job.create-edit', $data);
192 }
193 }
194
195 return redirect('jobs');
196 }
197
198 /**
199 * Estabelece as rotinas necessárias para a inserção de uma nova solicitação de serviço.
200 *
201 * @param Request $request
202 * @return \Illuminate\Routing\Redirector|\Illuminate\Http\RedirectResponse
203 */
204 public function insert(Request $request) {
205
206 $validator = $this->validation($request);
207
208 if(!$validator->fails()) {
209
210 $user = Auth::user();
211
212 $job = new Job();
213
214 $customer = Customer::findById($user, $request->customer_id)
215 ->select('customers.*')
216 ->first();
217
218 if(isset($request->fields) && count($request->fields)) {
219
220 if ($this->save($request, $job, $customer)) {
221
222 Session::flash('success', 'Solicitação de Serviço realizada com sucesso! Em breve entraremos em contato!');
223 return redirect('/jobs/' . $job->id . '/edit/#fields-outline');
224
225 }
226
227 dd('aqui aa');
228 return back()->withErrors([ 'id' => 'Não foi possível realizar a solicitação de trabalho. Tente novamente mais tarde.'])->withInput();
229 } else {
230
231 dd('aqui');
232 return back()->withErrors([ 'id' => 'Não foi possível realizar a solicitação de trabalho. A safra não possue talhões cadastrados.']);
233 }
234
235 }
236
237 return back()->withErrors($validator)->withInput();
238 }
239
240 /**
241 * Insere uma solicitação de trabalho realizada pelo app
242 *
243 * @param Request $request
244 * @return void
245 */
246 public function insertFromApi(Request $request) {
247
248 $validator = Validator::make($request->all(), [
249 'objective_id' => 'required|numeric|between:1,3',
250 'fields' => 'nullable|array',
251 'crop_id' => 'required|numeric',
252 ]);
253
254 if(!$validator->fails()) {
255
256 $user = Auth::user();
257 $crop = Crop::findById($request->crop_id, $user)
258 ->join('customers as c', 'c.id', 'p.customer_id')
259 ->select(
260 'crops.id',
261 'f.name as farm_name',
262 'p.name as producer_name',
263 'c.id as customer_id',
264 'f.state_id as farm_state',
265 'f.city_id as farm_city'
266 )
267 ->first();
268
269 if($crop) {
270
271 try {
272
273 DB::beginTransaction();
274
275 $config = CustomerConfig::where([
276 ['customer_id', $crop->customer_id],
277 ['job_type_id', $request->objective_id]
278 ])->first();
279
280 if(isset($config) || $request->objective_id == JobObjectiveEnum::DIGITAL) {
281
282 //Salva a solicitação de trabalho
283 $job = new Job();
284 $job->crop_id = $crop->id;
285 $job->farm_name = $crop->farm_name;
286 $job->producer_name = $crop->producer_name;
287 $job->state_id = $crop->farm_state;
288 $job->city_id = $crop->farm_city;
289 $job->objective_id = $request->objective_id;
290
291 if($request->objective_id != JobObjectiveEnum::DIGITAL) {
292
293 $job->phosphor_in_mehlich = $config->phosphor_in_mehlich;
294 $job->phosphor_in_resin = $config->phosphor_in_resin;
295 $job->phosphor_remaining = $config->phosphor_remaining;
296 $job->area_average_by_zone = $config->area_average_by_zone;
297 $job->qty_samples_by_zone = $config->qty_samples_by_zone;
298 }
299
300 $job->status_id = JobStatusEnum::STAND_BY;
301 $job->user_id = $user->id;
302
303 $job->save();
304
305 //Insere informações de profundidade
306 $newDepths = [];
307
308 if($request->objective_id != JobObjectiveEnum::DIGITAL) {
309 foreach($config->depths as $depth) {
310
311 array_push($newDepths, [
312 'collection_profile_id' => $depth->collection_profile_id,
313 'basic' => $depth->basic,
314 'sulfur' => $depth->sulfur,
315 'mo' => $depth->mo,
316 'micro' => $depth->micro,
317 'texture' => $depth->texture,
318 'job_id' => $job->id
319 ]);
320 }
321
322 JobDepth::insert($newDepths);
323 }
324
325 //Insere talhões relacionados a solicitação
326 $fieldsToInsert = [];
327 if(isset($request->fields)) {
328
329 foreach($request->fields as $f) {
330
331 array_push($fieldsToInsert, [
332 'name' => $f['name'],
333 'work_type_id' => (isset($f['work_type_id'])) ? $f['work_type_id'] : null,
334 'job_id' => $job->id,
335 'field_id' => $f['field_id']
336 ]);
337 }
338 }
339
340 //Insere lista de talhões
341 JobField::insert($fieldsToInsert);
342
343 DB::commit();
344
345 $jobStatus = JobStatus::all()->pluck('name', 'id');
346 $jobTypes = JobType::all()->pluck('name', 'id');
347
348 $job->job_status_name = $jobStatus[$job->status_id];
349 $job->type_name = $jobTypes[$job->objective_id];
350 $job->job_status_id = $job->status_id;
351
352 return $job;
353
354 //return response()->json(['success' => true, 'msg' => 'Solicitação de Serviço cadastrada com sucesso!']);
355
356 } else {
357
358 return response()->json(['success' => false, 'msg' => 'Nenhuma configuração foi encontrada para o objetivo selecionado!']);
359 }
360
361 } catch(\Exception $e) {
362
363 return $e->getMessage();
364
365 DB::rollBack();
366
367 return response('Não foi possível inserir a solicitação, houve um erro interno!', Response::HTTP_INTERNAL_SERVER_ERROR);
368 }
369
370 }
371
372 return response('Não foi possível inserir a solicitação, informações não encontradas!', Response::HTTP_NOT_FOUND);
373 }
374
375 return response('Não foi possível inserir a solicitação, os dados são inválidos!', Response::HTTP_BAD_REQUEST);
376
377 }
378
379 /**
380 * Atualiza informações de uma determinada solicitação de trabalho!
381 *
382 * @return void
383 */
384 public function updateFromApi(Request $request) {
385
386 $validator = Validator::make($request->all(), [
387 'objective_id' => 'required|numeric|between:1,3',
388 'fields' => 'nullable',
389 'crop_id' => 'required|numeric',
390 'id' => 'required|numeric'
391 ]);
392
393 if(!$validator->fails()) {
394
395 $user = Auth::user();
396
397 $job = Job::findById($request->id, $user)
398 ->select('jobs.*')
399 ->first();
400
401 if($job) {
402
403
404 if($job->status_id == JobStatusEnum::STAND_BY) {
405
406 try {
407
408 DB::beginTransaction();
409
410 $job->objective_id = $request->objective_id;
411 $job->save();
412
413 //Remove todos os talhões
414 $job->fields()->delete();
415
416 //Insere talhões relacionados a solicitação
417 $fieldsToInsert = [];
418
419 foreach($request->fields as $f) {
420
421 array_push($fieldsToInsert, [
422 'name' => $f['name'],
423 'work_type_id' => (isset($f['work_type_id'])) ? $f['work_type_id'] : null,
424 'job_id' => $job->id,
425 'field_id' => $f['field_id']
426 ]);
427 }
428
429 JobField::insert($fieldsToInsert);
430
431 DB::commit();
432
433 return response()->json(['success' => true, 'msg' => 'Solcitação atualizada com sucesso!']);
434
435 } catch(\Exception $e) {
436
437 return response('Não foi possível atualizar a solicitação, houve um erro interno!', Response::HTTP_INTERNAL_SERVER_ERROR);
438
439 }
440 }
441
442 return response('Solicitação de serviço não pode ser alterada!', Response::HTTP_NOT_FOUND);
443
444 }
445
446 return response('Não foi possível atualizar a solicitação, informações não encontradas!', Response::HTTP_NOT_FOUND);
447
448 }
449
450 return response('Não foi possível atualizar a solicitação, os dados são inválidos!', Response::HTTP_BAD_REQUEST);
451 }
452
453 /**
454 * Obtêm todas as informações da solicitação de trabalho
455 *
456 * @param int $id
457 * @return \Illuminate\View\View|\Illuminate\Contracts\View\Factory|unknown
458 */
459 private function getJobInfo($id) {
460
461 if($id) {
462
463 $data = [];
464
465 $job = Job::findById($id, Auth::user())
466 ->select('jobs.*', 'states.name as state_name', 'cities.name as city_name',
467 'users.name as user_name', 'users.email as user_email',
468 'job_status.name as job_status_name')
469 ->first();
470
471 if($job) {
472
473 // Lista todos os talhões associados a esta solicitação de serviço.
474 list($data['jobFields'], $data['nrMaxCrops']) = $this->getJobFields($id);
475
476 // Lista todos os dados financeiros associados a esta solicitação de serviço.
477 // $data['jobFinancial'] = $job->financial;
478
479 //Obtem os contornos selecionados do trabalho
480 $data['jobCustomFields'] = JobCustomField::searchByJobId($id)->select('job_custom_fields.*', 'cf.name as custom_field_name', 'cf.coords', 'cf.area', 'cf.created_at', 'jc.name as field', 'wt.name as work_type_name')->get();
481
482 return array_merge($data, $this->getFormData());
483 }
484 }
485
486 return false;
487 }
488
489 /**
490 * Atualiza as informações da solicitação
491 * @param Request $request
492 * @return \Illuminate\Http\RedirectResponse|unknown
493 */
494 public function update(Request $request) {
495
496 $validator = $this->validation($request);
497
498 if(!$validator->fails()) {
499
500 $job = Job::search($request->id)->first();
501
502 if($job && $job->status_id == JobStatusEnum::STAND_BY) {
503
504 if ($this->saveUpdate($request, $job)) {
505
506 Session::flash('success', 'Solicitação de Serviço atualizada com sucesso!');
507
508 } else {
509 return back()->withErrors([ 'id' => 'Não foi possível alterar a solicitação de trabalho. Tente novamente mais tarde.'])->withInput();
510 }
511 }
512
513 return redirect('/jobs');
514
515 } else {
516 return back()->withErrors($validator)->withInput();
517 }
518 }
519
520 /**
521 * Obtêm os dados necessários para construção do formulário.
522 *
523 * @param unknown $id
524 * @return \App\Http\Controllers\unknown[]|unknown[]
525 */
526 private function getFormData() {
527
528 $user = Auth::user();
529 $data = [];
530
531 $data['jobObjectives'] = JobType::all();
532 $data['workTypes'] = WorkType::all();
533 $data['states'] = State::all();
534 // $data['segments'] = Segment::all();
535 // $data['cultures'] = Culture::orderBy('name')->get();
536
537 $data['customers'] = Customer::getByUserId($user)
538 ->select(
539 'customers.id',
540 'customers.name',
541 DB::raw("(CASE WHEN customers.type = 1 THEN customers.name ELSE customers.fantasy_name END) as name")
542 )
543 ->orderBy('customers.name', 'asc')
544 ->get();
545
546 $data['collectionProfiles'] = CollectionProfile::orderBy('priority', 'asc')->get();
547
548 //Lista todas as regiões cadastradas todavia vinculadas ao usuário logado.
549 $data['customFields'] = CustomField::searchByUser(Auth::user())
550 ->select('custom_fields.id', 'custom_fields.name')
551 ->orderBy('custom_fields.id', 'desc')
552 ->get();
553
554 return $data;
555 }
556
557 /**
558 * Obtêm todos os talhões juntamente as suas safras correspondentes.
559 *
560 * @param unknown $jobId
561 * @return unknown
562 */
563 private function getJobFields($jobId) {
564
565 // Busca todos os talhões
566 $jobFields = JobField::searchByJobId($jobId, Auth::user())->get();
567
568 $cropsMaxNumber = 1;
569
570 for($index=0;$index < count($jobFields);$index++) {
571
572 $field = $jobFields[$index];
573
574 //Obtêm as safras do talhão
575 $crops = JobFieldCrop::searchByJobFieldId($field->id)->get();
576
577 if (count($crops) > $cropsMaxNumber) {
578 $cropsMaxNumber = count($crops);
579 }
580
581 $jobFields[$index]->cropList = $crops;
582
583 }
584
585 return [ $jobFields, $cropsMaxNumber ];
586 }
587
588 /**
589 * Obtêm os nutrientes a partir do cropId.
590 *
591 * @param unknown $jobId
592 * @return unknown
593 */
594 public function getJobProfilesByCrop($cropId) {
595
596 $crop = Crop::findById($cropId, Auth::user(), true)->select('crops.*')->first();
597
598 if ($crop) {
599
600 $job = $crop->job;
601
602 if ($job) {
603 return $job->jobDepths;
604 }
605 }
606
607 return [];
608
609 }
610
611 /**
612 * Realiza as devidas validaçãos para solicitação de serviço.
613 *
614 * @param Request $request
615 * @return unknown
616 */
617 private function validation(Request $request) {
618
619 $validator = Validator::make($request->all(), [
620
621 // 'technical_advisor_name' => 'required|string|max:150',
622 // 'technical_advisor_email' => 'required|string|email|max:85',
623
624 'objective_id' => [ 'required', 'numeric', Rule::in( ['1', '2', '3'] ) ],
625 // 'producer_name' => 'required|string|max:150',
626 // 'farm_name' => 'required|string|max:50',
627 'state_id' => 'nullable|numeric|exists:states,id',
628 'city_id' => 'nullable|numeric|exists:cities,id',
629 'area_average_by_zone' => 'required|numeric|min:0.1',
630 'qty_samples_by_zone' => 'required|numeric|min:1|max:1000',
631
632 'collection_profile_id' => 'bail|array',
633 'collection_profile_id.*' => 'bail|numeric|exists:collection_profiles,id',
634 'basic' => 'bail|array',
635 'basic.*' => 'bail|numeric',
636 'sulfur' => 'bail|array',
637 'sulfur.*' => 'bail|numeric',
638 'mo' => 'bail|array',
639 'mo.*' => 'bail|numeric',
640 'micro' => 'bail|array',
641 'micro.*' => 'bail|numeric',
642 'texture' => 'bail|array',
643 'texture.*' => 'bail|numeric',
644
645 // //Talhões
646 // 'field_name' => 'bail|required|array',
647 // 'field_name.*' => 'bail|required|string',
648 // 'work_type_id' => 'bail|required|array',
649 // 'work_type_id.*' => 'bail|required|numeric|exists:work_types,id|nullable',
650 // 'years_of_cultivation' => 'bail|required|array',
651 // 'years_of_cultivation.*' => 'bail|numeric|required|min:1|max:3',
652
653 // //Safras
654 // 'culture_id.*' => 'bail|numeric|exists:cultures,id|nullable',
655 // 'planting_date.*' => 'bail|date_format:"d/m/Y"|nullable',
656 // 'harvest_date.*' => 'bail|date_format:"d/m/Y"|nullable',
657
658 // //Dados Financeiros
659 // 'financial_type_id' => [ Rule::in( ['1', '2'] ), 'numeric', 'required' ],
660 // 'financial_name' => 'string|max:90|nullable',
661 // 'financial_cpf' => [ 'required_if:financial_type_id,==,1', 'string', 'max:14', 'nullable', new CPF() ],
662 // 'financial_issuing_agency' => 'string|max:10|nullable',
663 // 'financial_rg' => 'string|max:30|nullable',
664 // 'financial_cnpj' => [ 'required_if:financial_type_id,==,2', 'string', 'max:18', 'nullable', new CNPJ() ],
665 // 'financial_fantasy_name' => 'required_if:financial_type_id,==,2|string|max:50|nullable',
666 // 'financial_social_reason' => 'required_if:financial_type_id,==,2|string|max:60|nullable',
667 // 'financial_email' => 'string|max:40|email',
668 // 'financial_responsible_name' => 'max:150|nullable',
669 // 'financial_phone1' => [ 'string', 'required', 'max:15', new Phone() ],
670 // 'financial_phone2' => [ 'string', 'max:15', 'nullable',new Phone() ],
671 // 'financial_zipcode' => [ 'max:9', new ZipCode(), 'nullable' ],
672 // 'financial_street' => 'max:150|nullable',
673 // 'financial_number' => 'max:5|nullable',
674 // 'financial_district' => 'max:50|nullable',
675 // 'financial_complement' => 'max:150|string|nullable',
676 // 'financial_state_id' => 'numeric|exists:states,id|nullable',
677 // 'financial_city_id' => 'numeric|exists:cities,id|nullable',
678 ],[
679 'technical_advisor_name.required' => 'O Nome do Consultor Técnico de Vendas é um campo obrigatório',
680 'technical_advisor_email.required' => 'O endereço de Email do Consultor Técnico de Vendas é um campo obrigatório',
681 ]);
682
683 $validator->after(function ($validator) use ($request) {
684
685 // if(!$request->phosphor_in_mehlich && !$request->phosphor_in_resin && !$request->phosphor_remaining) {
686
687 // $validator->errors()->add('phosphor_in_mehlich', 'Selecione ao menos um único método de extração de fósforo!');
688 // }
689 });
690
691 return $validator;
692 }
693
694 /**
695 * Realiza as devidas rotinas para salvamento da solicitação de serviço, profundidade, talhão e safra.
696 *
697 * @param Request $request
698 * @param Job $job
699 */
700 private function save(Request $request, Job $job, $customer) {
701
702 DB::beginTransaction();
703
704 try {
705
706 $farm = Farm::find($request->farm_id);
707 $producer = Producer::find($request->producer_id);
708
709 $job->crop_id = $request->crop_id;
710 //$job->technical_advisor_name = $request->technical_advisor_name;
711 //$job->technical_advisor_email = $request->technical_advisor_email;
712
713 $job->objective_id = $request->objective_id;
714 $job->producer_name = $producer->name;
715 $job->farm_name = $farm->name;
716 $job->state_id = $request->state_id;
717 $job->city_id = $request->city_id;
718 $job->phosphor_in_mehlich = boolval($request->phosphor_in_mehlich) ?? null;
719 $job->phosphor_in_resin = boolval($request->phosphor_in_resin) ?? null;
720 $job->phosphor_remaining = boolval($request->phosphor_remaining) ?? null;
721
722 $job->additional_leaf = $request->additional_leaf;
723 $job->additional_nematoid = $request->additional_nematoid;
724
725 $job->area_average_by_zone = $request->area_average_by_zone;
726 $job->qty_samples_by_zone = $request->qty_samples_by_zone;
727
728 if (!$job->id) {
729 $job->user_id = Auth::user()->id;
730 }
731
732 $job->status_id = JobStatusEnum::STAND_BY;
733
734 $job->save();
735
736 if (!empty($job->depths)) {
737 $job->depths()->delete();
738 }
739
740 //Verifica se deve inserir profundidades!
741 if($request->objective_id != JobObjectiveEnum::DIGITAL && $request->collection_profile_id && count($request->collection_profile_id)) {
742
743 $depthsToInsert = [];
744
745 // Insere um novo registro na table "job_depths"
746 foreach ($request->collection_profile_id as $key => $collectionProfileId) {
747
748 array_push($depthsToInsert, [
749 'collection_profile_id' => $collectionProfileId,
750 'basic' => $request->basic[$key],
751 'sulfur' => $request->sulfur[$key],
752 'mo' => $request->mo[$key],
753 'micro' => $request->micro[$key],
754 'texture' => $request->texture[$key],
755 'job_id' => $job->id
756 ]);
757
758 }
759
760 JobDepth::insert($depthsToInsert);
761 }
762
763 //Define lista de talhões
764 $fieldsToInsert = [];
765
766 foreach($request->fields as $k => $f) {
767
768 array_push($fieldsToInsert, [
769 'name' => $f,
770 'work_type_id' => $request->work_type_id[$k],
771 'job_id' => $job->id,
772 'field_id' => $request->field_ids[$k]
773 ]);
774 }
775
776 //Insere lista de talhões
777 JobField::insert($fieldsToInsert);
778
779 //Insere os dados financeiros
780 if ($job->financial) {
781 $financial = $job->financial;
782 } else {
783 $financial = new JobFinancialData();
784 }
785
786 $financial->type = $customer->type;
787 $financial->name = $customer->name;
788
789 if($financial->type == 1) {
790
791 $financial->cpf = $customer->cpf;
792 $financial->issuing_agency = $customer->issuing_agency;
793 $financial->rg = $customer->rg;
794
795 } else {
796
797 $financial->cnpj = $customer->cnpj;
798 $financial->fantasy_name = $customer->fantasy_name;
799 $financial->social_reason = $customer->social_reason;
800 }
801
802 $financial->email = $customer->email;
803 $financial->responsible_name = $customer->responsible_name;
804 $financial->phone1 = $customer->phone1;
805 $financial->phone2 = $customer->phone2;
806 $financial->zipcode = $customer->zipcode;
807 $financial->street = $customer->street;
808 $financial->number = $customer->number;
809 $financial->district = $customer->district;
810 $financial->complement = $customer->complement;
811 $financial->state_id = $customer->state_id;
812 $financial->city_id = $customer->city_id;
813 $financial->job_id = $job->id;
814 $financial->save();
815
816 DB::commit();
817 return true;
818
819 } catch (\Exception $e) {
820
821 DB::rollback();
822 return false;
823 }
824
825 }
826
827 /**
828 * Realiza as devidas rotinas para edição da solicitação de serviço.
829 *
830 * @param Request $request
831 * @param Job $job
832 */
833 public function saveUpdate(Request $request, Job $job) {
834
835 try {
836 DB::beginTransaction();
837
838 // $job->crop_id = $request->crop_id;
839 $job->technical_advisor_name = $request->technical_advisor_name;
840 $job->technical_advisor_email = $request->technical_advisor_email;
841
842 $job->objective_id = $request->objective_id;
843
844 if($request->state_id && $request->city_id) {
845
846 $job->state_id = $request->state_id;
847 $job->city_id = $request->city_id;
848 }
849
850 $job->phosphor_in_mehlich = boolval($request->phosphor_in_mehlich) ?? null;
851 $job->phosphor_in_resin = boolval($request->phosphor_in_resin) ?? null;
852 $job->phosphor_remaining = boolval($request->phosphor_remaining) ?? null;
853
854 $job->additional_leaf = $request->additional_leaf;
855 $job->additional_nematoid = $request->additional_nematoid;
856
857 $job->area_average_by_zone = $request->area_average_by_zone;
858 $job->qty_samples_by_zone = $request->qty_samples_by_zone;
859
860 $job->save();
861
862 //Atualiza as informações dos talhões
863 if(isset($request->fields)) {
864
865 $jobs = JobField::whereIn('id', $request->fields)->get();
866
867 foreach($request->fields as $k => $f) {
868 $job = $jobs->where('id', $f)->first();
869 $job->work_type_id = $request->work_type_id[$k];
870 $job->save();
871 }
872
873 }
874
875 //Remove os talhões excluídos pelo usuário
876 if(isset($request->fieldsToRemove)) {
877
878 JobField::whereIn('id', $request->fieldsToRemove)->delete();
879
880 }
881
882 DB::commit();
883 return true;
884
885 } catch (\Exception $e) {
886
887 DB::rollback();
888 return false;
889 }
890
891 }
892
893 /**
894 * Altera o status da solicitação de serviço.
895 *
896 * @param Request $request
897 * @return number[]
898 */
899 public function changeJobStatus(Request $request) {
900
901 $this->validate($request, [
902 'id' => 'required|numeric|exists:jobs',
903 'status_id' => 'required|numeric|exists:job_status,id',
904 'worked_area' => 'numeric|nullable|max:1000000|required_if:status_id,' . JobStatusEnum::APPROVED,
905 'job_status_obs' => 'string|nullable',
906 ]);
907
908 $job = Job::findById($request->id, Auth::user())->select('jobs.*')->first();
909
910 if($job) {
911
912 if($job && $job->status_id == JobStatusEnum::STAND_BY && $request->status_id == JobStatusEnum::IN_ANALISYS) {
913 $job->analyzed_at = Carbon::now();
914 }
915
916 $job->status_id = $request->status_id;
917 $job->job_status_obs = $request->job_status_obs??null;
918 $job->worked_area = $request->worked_area??null;
919 $job->save();
920
921 if ($job->status_id == JobStatusEnum::APPROVED) {
922
923 //Confirma todos os talhões relacionados a solicitação
924 if(isset($job->crop_id)) {
925
926 $uncofirmedFieldsIds = $job->fields->pluck('field_id');
927 Field::whereIn('id', $uncofirmedFieldsIds)->update(['is_confirmed' => true]);
928 }
929
930 try {
931
932 //Inicia o envio do email
933 Mail::to([$job->user->email, $job->technical_advisor_email, $job->financial->email])
934 ->queue(new JobMail($job));
935
936 } catch(\Exception $e) {
937 return redirect('/jobs/'.$job->id.'/info')->withSuccess('Solicitação de serviço aprovada com sucesso, todavia não foi possível enviar o email aos interessados.');
938 }
939 }
940
941 return redirect('/jobs/'.$job->id.'/info')->withSuccess('Solicitação de serviço aprovada com sucesso!');
942
943 }
944
945 return redirect('/jobs');
946 }
947
948 /**
949 * Insere um novo talhão customizado.
950 *
951 * @param Request $request
952 * @return \Illuminate\Routing\Redirector|\Illuminate\Http\RedirectResponse|unknown
953 */
954 public function insertCustomField(Request $request) {
955
956 $validator = Validator::make($request->all(),[
957 'field_id' => 'bail|numeric|required|min:1|max:2147483647',
958 'job_id' => 'bail|numeric|required|min:1|max:2147483647',
959 'custom_field_id' => 'bail|numeric|required|min:1|max:2147483647',
960 ]);
961
962 $validator->after(function($validator) use ($request) {
963
964 $user = Auth::user();
965
966 $job = Job::findById($request->job_id, $user)->select('jobs.*')->first();
967
968 if (!$job) {
969
970 $validator->errors()->add('job_field', 'Solicitação de serviço inválida!');
971 } else {
972
973 $jobField = JobField::searchByJobId($job->id, $user)->where('job_fields.id', $request->field_id)->select('job_fields.*')->first();
974
975 if (!$jobField) {
976
977 $validator->errors()->add('job_field', 'Talhão inválido para a solicitação de serviço informada!');
978 }
979 }
980
981 $customField = CustomField::searchByUser($user)
982 ->where('custom_fields.id', $request->custom_field_id)
983 ->select('custom_fields.*')
984 ->first();
985
986 if (!$customField) {
987
988 $validator->errors()->add('custom_field_id', 'A região informada é inválida!');
989 }
990 });
991
992 if(!$validator->fails()) {
993
994 $jobCustomField = new JobCustomField();
995 $jobCustomField->field_id = $request->field_id;
996 $jobCustomField->custom_field_id = $request->custom_field_id;
997 $jobCustomField->save();
998
999 return redirect('/jobs/' . $request->job_id . '/edit#fields-outline')->withSuccess('Talhão selecionado com sucesso!');
1000
1001 } else {
1002 return back()->withErrors($validator)->withInput();
1003 }
1004 }
1005
1006 /**
1007 * Remove um determinado vínculo entre uma região e um determinado talhão vinculado a uma solicitação de serviço
1008 *
1009 * @param Request $request
1010 * @return \Illuminate\Routing\Redirector|\Illuminate\Http\RedirectResponse
1011 */
1012 public function deleteCustomField(Request $request) {
1013
1014 $this->validate($request, [ 'id' => 'required|numeric' ]);
1015
1016 $jobCustomField = JobCustomField::findById($request->id, Auth::user())
1017 ->select('job_custom_fields.*', 'jf.job_id')
1018 ->first();
1019
1020 if ($jobCustomField) {
1021
1022 $jobCustomField->delete();
1023
1024 return redirect('/jobs/' . $jobCustomField->job_id . '/edit#fields-outline')->withSuccess('O contorno do talhão especificado foi removido com sucesso!');
1025 }
1026
1027 return back()->withErrors('Solicitação de serviço inválida');
1028 }
1029
1030 /**
1031 * Remove uma solicitação de serviço
1032 * @param Request $request
1033 * @return \Illuminate\Routing\Redirector|\Illuminate\Http\RedirectResponse
1034 */
1035 public function delete(Request $request) {
1036
1037 $this->validate($request, [ 'id' => 'required|numeric' ]);
1038
1039 // $job = Job::find($request->id);
1040 $job = Job::findById($request->id, Auth::user())->select('jobs.*')->first();
1041
1042 if($job) {
1043
1044 try {
1045
1046 DB::transaction(function() use ($job) {
1047
1048 $documents = $job->documents;
1049
1050 if($documents->count() > 0) {
1051
1052 foreach ($documents as $doc) {
1053
1054 Storage::delete($doc->dir . '/' . $doc->name);
1055 }
1056 }
1057
1058 $job->delete();
1059
1060 Session::flash('success', 'Solicitação de trabalho removida com sucesso!');
1061 });
1062 } catch (\Exception $e) {
1063
1064 Session::flash('error', 'Não foi possível remover a solicitação de trabalho! Tente novamente mais tarde!');
1065 }
1066 }
1067
1068 return redirect('jobs');
1069 }
1070
1071 /**
1072 * Remove uma solicitação de serviço a partir da api
1073 *
1074 * @param Request $request
1075 * @return void
1076 */
1077 public function removeJobApi(Request $request) {
1078
1079 if($request->id && is_numeric($request->id)) {
1080
1081 $job = Job::findById($request->id, Auth::user())
1082 ->select('jobs.*')
1083 ->first();
1084
1085 if($job && $job->status_id == JobStatusEnum::STAND_BY) {
1086
1087 try {
1088
1089 DB::beginTransaction();
1090
1091 $documents = $job->documents;
1092
1093 if($documents->count() > 0) {
1094
1095 foreach ($documents as $doc) {
1096
1097 Storage::delete($doc->dir . '/' . $doc->name);
1098 }
1099 }
1100
1101 $job->delete();
1102
1103 DB::commit();
1104
1105 return response()->json([ 'success' => true, 'msg' => 'Solicitação de trabalho removida com sucesso!' ]);
1106
1107 } catch (\Exception $e) {
1108
1109 DB::rollBack();
1110 response('Não foi possível remover a solicitação de trabalho! Tente novamente mais tarde!', Response::HTTP_INTERNAL_SERVER_ERROR);
1111 }
1112 }
1113
1114 }
1115
1116 return response('Não foi possível remover a solicitação de trabalho! Tente novamente mais tarde!', Response::HTTP_BAD_REQUEST);
1117
1118 }
1119
1120 /**
1121 * Retorna solicitação a partir do id
1122 *
1123 * @param [type] $id
1124 * @return void
1125 */
1126 public function getJobById($id) {
1127
1128 if(isset($id) && is_numeric($id)) {
1129
1130 $user = Auth::user();
1131
1132 $job = Job::findById($id, $user)
1133 ->select('jobs.id', 'jobs.objective_id')
1134 ->with('fields')
1135 ->first();
1136
1137 return $job;
1138 }
1139
1140 return response('Dados inválidos!', Response::HTTP_BAD_REQUEST);
1141 }
1142
1143 /**
1144 * Obtém a lista de solicitações de trabalho disponíveis!
1145 *
1146 * @return void
1147 */
1148 public function getJobsByCrop($cropId) {
1149
1150 $jobsAvailable = Job::search()
1151 ->join('job_types as jt', 'jt.id', 'jobs.objective_id')
1152 ->join('users as u', 'u.id', 'jobs.user_id')
1153 ->select(
1154 'jobs.id',
1155 'jobs.created_at',
1156 'jobs.updated_at',
1157 'job_status.id as job_status_id',
1158 'job_status.name as job_status_name',
1159 'jt.name as type_name',
1160 'u.name as created_by'
1161 )
1162 ->where('jobs.crop_id', $cropId)
1163 ->orderBy('jobs.created_at', 'desc')
1164 ->get();
1165
1166 return $jobsAvailable;
1167
1168 }
1169
1170 /**
1171 * Obtém lista de tipo de solicitações de trabalho
1172 *
1173 * @return void
1174 */
1175 public function getJobTypes() {
1176
1177 return JobType::all();
1178 }
1179}
1180