public function getPercentage(Request $request)
 {
     if (empty($request['species_id']) || empty($request['sector_id']) || empty($request['species_weight'])) {
         return $this->respond(['error' => ['message' => 'Need more data!']]);
     }
     $species = Species::find($request['species_id']);
     return $this->respond(['data' => ['speciesId' => $request['species_id'], 'speciesName' => $species->name, 'percentage' => Weight::calculatePercentage($request['species_id'], $request['sector_id'], $request['species_weight'], 0)]]);
 }
 /**
  * Run the database seeds.
  *
  * @return void
  */
 public function run()
 {
     $weights = [['name' => 'Angler / Monkfish', 'type_id' => '1', 'weights' => [3 => ['lbs' => 25, 'oz' => 0, 'dr' => 0], 2 => ['lbs' => 30, 'oz' => 0, 'dr' => 0], 1 => ['lbs' => 30, 'oz' => 0, 'dr' => 0]]], ['name' => 'Bass', 'type_id' => '1', 'weights' => [3 => ['lbs' => 6, 'oz' => 0, 'dr' => 0], 2 => ['lbs' => 7, 'oz' => 0, 'dr' => 0], 1 => ['lbs' => 8, 'oz' => 0, 'dr' => 0]]], ['name' => 'Bream (Black)', 'type_id' => '1', 'weights' => [3 => ['lbs' => 1, 'oz' => 12, 'dr' => 0], 2 => ['lbs' => 3, 'oz' => 0, 'dr' => 0], 1 => ['lbs' => 3, 'oz' => 12, 'dr' => 0]]], ['name' => 'Bream (Gilthead)', 'type_id' => '1', 'weights' => [3 => ['lbs' => 4, 'oz' => 8, 'dr' => 0], 2 => ['lbs' => 5, 'oz' => 0, 'dr' => 0], 1 => ['lbs' => 5, 'oz' => 0, 'dr' => 0]]], ['name' => 'Bream (Red)', 'type_id' => '1', 'weights' => [3 => ['lbs' => 1, 'oz' => 0, 'dr' => 0], 2 => ['lbs' => 2, 'oz' => 8, 'dr' => 0], 1 => ['lbs' => 3, 'oz' => 8, 'dr' => 0]]], ['name' => 'Brill', 'type_id' => '2', 'weights' => [3 => ['lbs' => 2, 'oz' => 8, 'dr' => 0], 2 => ['lbs' => 4, 'oz' => 8, 'dr' => 0], 1 => ['lbs' => 5, 'oz' => 8, 'dr' => 0]]], ['name' => 'Bull Huss', 'type_id' => '3', 'weights' => [3 => ['lbs' => 9, 'oz' => 0, 'dr' => 0], 2 => ['lbs' => 10, 'oz' => 0, 'dr' => 0], 1 => ['lbs' => 10, 'oz' => 0, 'dr' => 0]]], ['name' => 'Coalfish', 'type_id' => '1', 'weights' => [3 => ['lbs' => 2, 'oz' => 8, 'dr' => 0], 2 => ['lbs' => 8, 'oz' => 0, 'dr' => 0], 1 => ['lbs' => 15, 'oz' => 0, 'dr' => 0]]], ['name' => 'Cod', 'type_id' => '1', 'weights' => [3 => ['lbs' => 5, 'oz' => 0, 'dr' => 0], 2 => ['lbs' => 12, 'oz' => 8, 'dr' => 0], 1 => ['lbs' => 17, 'oz' => 0, 'dr' => 0]]], ['name' => 'Conger', 'type_id' => '1', 'weights' => [3 => ['lbs' => 20, 'oz' => 0, 'dr' => 0], 2 => ['lbs' => 35, 'oz' => 0, 'dr' => 0], 1 => ['lbs' => 55, 'oz' => 0, 'dr' => 0]]], ['name' => 'Dab', 'type_id' => '2', 'weights' => [3 => ['lbs' => 1, 'oz' => 0, 'dr' => 0], 2 => ['lbs' => 1, 'oz' => 2, 'dr' => 0], 1 => ['lbs' => 1, 'oz' => 2, 'dr' => 0]]], ['name' => 'Flounder', 'type_id' => '2', 'weights' => [3 => ['lbs' => 1, 'oz' => 0, 'dr' => 0], 2 => ['lbs' => 2, 'oz' => 0, 'dr' => 0], 1 => ['lbs' => 2, 'oz' => 0, 'dr' => 0]]], ['name' => 'Garfish', 'type_id' => '1', 'weights' => [3 => ['lbs' => 1, 'oz' => 4, 'dr' => 0], 2 => ['lbs' => 1, 'oz' => 12, 'dr' => 0], 1 => ['lbs' => 1, 'oz' => 12, 'dr' => 0]]], ['name' => 'Gurnard (Red)', 'type_id' => '1', 'weights' => [3 => ['lbs' => 1, 'oz' => 0, 'dr' => 0], 2 => ['lbs' => 1, 'oz' => 8, 'dr' => 0], 1 => ['lbs' => 1, 'oz' => 8, 'dr' => 0]]], ['name' => 'Gurnard (Tub)', 'type_id' => '1', 'weights' => [3 => ['lbs' => 2, 'oz' => 0, 'dr' => 0], 2 => ['lbs' => 3, 'oz' => 8, 'dr' => 0], 1 => ['lbs' => 4, 'oz' => 8, 'dr' => 0]]], ['name' => 'John Dory', 'type_id' => '1', 'weights' => [3 => ['lbs' => 1, 'oz' => 0, 'dr' => 0], 2 => ['lbs' => 4, 'oz' => 0, 'dr' => 0], 1 => ['lbs' => 4, 'oz' => 0, 'dr' => 0]]], ['name' => 'L.S. Dogfish', 'type_id' => '3', 'weights' => [3 => ['lbs' => 2, 'oz' => 6, 'dr' => 0], 2 => ['lbs' => 2, 'oz' => 12, 'dr' => 0], 1 => ['lbs' => 2, 'oz' => 12, 'dr' => 0]]], ['name' => 'Ling', 'type_id' => '1', 'weights' => [3 => ['lbs' => 5, 'oz' => 0, 'dr' => 0], 2 => ['lbs' => 13, 'oz' => 0, 'dr' => 0], 1 => ['lbs' => 18, 'oz' => 0, 'dr' => 0]]], ['name' => 'Mackerel', 'type_id' => '1', 'weights' => [3 => ['lbs' => 1, 'oz' => 10, 'dr' => 0], 2 => ['lbs' => 2, 'oz' => 0, 'dr' => 0], 1 => ['lbs' => 2, 'oz' => 4, 'dr' => 0]]], ['name' => 'Mullet (Golden Grey)', 'type_id' => '1', 'weights' => [3 => ['lbs' => 2, 'oz' => 4, 'dr' => 0], 2 => ['lbs' => 2, 'oz' => 4, 'dr' => 0], 1 => ['lbs' => 2, 'oz' => 4, 'dr' => 0]]], ['name' => 'Mullet (Grey)', 'type_id' => '1', 'weights' => [3 => ['lbs' => 4, 'oz' => 4, 'dr' => 0], 2 => ['lbs' => 4, 'oz' => 4, 'dr' => 0], 1 => ['lbs' => 4, 'oz' => 4, 'dr' => 0]]], ['name' => 'Mullet (Red)', 'type_id' => '1', 'weights' => [3 => ['lbs' => 1, 'oz' => 4, 'dr' => 0], 2 => ['lbs' => 1, 'oz' => 8, 'dr' => 0], 1 => ['lbs' => 1, 'oz' => 8, 'dr' => 0]]], ['name' => 'Mullet (Thin Lipped)', 'type_id' => '1', 'weights' => [3 => ['lbs' => 4, 'oz' => 4, 'dr' => 0], 2 => ['lbs' => 4, 'oz' => 4, 'dr' => 0], 1 => ['lbs' => 4, 'oz' => 4, 'dr' => 0]]], ['name' => 'Plaice', 'type_id' => '2', 'weights' => [3 => ['lbs' => 2, 'oz' => 8, 'dr' => 0], 2 => ['lbs' => 3, 'oz' => 0, 'dr' => 0], 1 => ['lbs' => 3, 'oz' => 0, 'dr' => 0]]], ['name' => 'Pollack', 'type_id' => '1', 'weights' => [3 => ['lbs' => 2, 'oz' => 8, 'dr' => 0], 2 => ['lbs' => 6, 'oz' => 0, 'dr' => 0], 1 => ['lbs' => 13, 'oz' => 0, 'dr' => 0]]], ['name' => 'Pouting', 'type_id' => '1', 'weights' => [3 => ['lbs' => 1, 'oz' => 2, 'dr' => 0], 2 => ['lbs' => 2, 'oz' => 8, 'dr' => 0], 1 => ['lbs' => 2, 'oz' => 12, 'dr' => 0]]], ['name' => 'Ray (Blonde)', 'type_id' => '3', 'weights' => [3 => ['lbs' => 10, 'oz' => 0, 'dr' => 0], 2 => ['lbs' => 22, 'oz' => 0, 'dr' => 0], 1 => ['lbs' => 22, 'oz' => 0, 'dr' => 0]]], ['name' => 'Ray (Small Eyed)', 'type_id' => '3', 'weights' => [3 => ['lbs' => 7, 'oz' => 8, 'dr' => 0], 2 => ['lbs' => 9, 'oz' => 8, 'dr' => 0], 1 => ['lbs' => 9, 'oz' => 8, 'dr' => 0]]], ['name' => 'Ray (Spotted)', 'type_id' => '3', 'weights' => [3 => ['lbs' => 4, 'oz' => 0, 'dr' => 0], 2 => ['lbs' => 4, 'oz' => 8, 'dr' => 0], 1 => ['lbs' => 4, 'oz' => 8, 'dr' => 0]]], ['name' => 'Ray (Thornback)', 'type_id' => '3', 'weights' => [3 => ['lbs' => 9, 'oz' => 0, 'dr' => 0], 2 => ['lbs' => 10, 'oz' => 0, 'dr' => 0], 1 => ['lbs' => 10, 'oz' => 0, 'dr' => 0]]], ['name' => 'Rockling (3 Bearded)', 'type_id' => '1', 'weights' => [3 => ['lbs' => 1, 'oz' => 8, 'dr' => 0], 2 => ['lbs' => 1, 'oz' => 12, 'dr' => 0], 1 => ['lbs' => 1, 'oz' => 12, 'dr' => 0]]], ['name' => 'Scad', 'type_id' => '1', 'weights' => [3 => ['lbs' => 1, 'oz' => 0, 'dr' => 0], 2 => ['lbs' => 1, 'oz' => 2, 'dr' => 0], 1 => ['lbs' => 1, 'oz' => 2, 'dr' => 0]]], ['name' => 'Smoothound (All)', 'type_id' => '1', 'weights' => [3 => ['lbs' => 8, 'oz' => 0, 'dr' => 0], 2 => ['lbs' => 10, 'oz' => 0, 'dr' => 0], 1 => ['lbs' => 10, 'oz' => 0, 'dr' => 0]]], ['name' => 'Sole', 'type_id' => '2', 'weights' => [3 => ['lbs' => 1, 'oz' => 12, 'dr' => 0], 2 => ['lbs' => 1, 'oz' => 12, 'dr' => 0], 1 => ['lbs' => 1, 'oz' => 12, 'dr' => 0]]], ['name' => 'Spurdog', 'type_id' => '3', 'weights' => [3 => ['lbs' => 5, 'oz' => 0, 'dr' => 0], 2 => ['lbs' => 10, 'oz' => 0, 'dr' => 0], 1 => ['lbs' => 10, 'oz' => 0, 'dr' => 0]]], ['name' => 'Trigger Fish', 'type_id' => '1', 'weights' => [3 => ['lbs' => 2, 'oz' => 8, 'dr' => 0], 2 => ['lbs' => 2, 'oz' => 12, 'dr' => 0], 1 => ['lbs' => 2, 'oz' => 12, 'dr' => 0]]], ['name' => 'Turbot', 'type_id' => '2', 'weights' => [3 => ['lbs' => 5, 'oz' => 0, 'dr' => 0], 2 => ['lbs' => 12, 'oz' => 0, 'dr' => 0], 1 => ['lbs' => 15, 'oz' => 0, 'dr' => 0]]], ['name' => 'Whiting', 'type_id' => '1', 'weights' => [3 => ['lbs' => 1, 'oz' => 0, 'dr' => 0], 2 => ['lbs' => 2, 'oz' => 2, 'dr' => 0], 1 => ['lbs' => 2, 'oz' => 2, 'dr' => 0]]], ['name' => 'Wrasse (Ballan)', 'type_id' => '1', 'weights' => [3 => ['lbs' => 4, 'oz' => 8, 'dr' => 0], 2 => ['lbs' => 5, 'oz' => 0, 'dr' => 0], 1 => ['lbs' => 5, 'oz' => 0, 'dr' => 0]]], ['name' => 'Wrasse (Cuckoo)', 'type_id' => '1', 'weights' => [3 => ['lbs' => 1, 'oz' => 2, 'dr' => 0], 2 => ['lbs' => 1, 'oz' => 4, 'dr' => 0], 1 => ['lbs' => 1, 'oz' => 8, 'dr' => 0]]]];
     foreach ($weights as $request) {
         // Create ne Species
         $species = new Species();
         $species->name = $request['name'];
         // Assign type and persist changes
         $species->type()->associate(Type::findOrFail($request['type_id']));
         $species->save();
         ksort($request['weights']);
         // Iterate through weights array and save it to the database
         foreach ($request['weights'] as $sectorId => $speciesWeight) {
             $weight = new Weight();
             $weight->weight = $speciesWeight;
             $weight->sector()->associate(Sector::findOrFail($sectorId));
             $weight->species()->associate($species);
             $weight->save();
         }
     }
 }
 /**
  * Store a newly created resource in storage.
  *
  * @param WeighInsRequest|Request $request
  * @return \Illuminate\Http\Response
  */
 public function store(WeighInsRequest $request)
 {
     // TODO: extract this as it is also used in weigh ins request
     // Clear up the entries
     $request['entries'] = array_filter(array_map(function ($entry) {
         return array_filter($entry);
     }, $request['entries']));
     // If any exceptions are thrown any DB operations
     // will be automatically rolled back.
     DB::transaction(function () use($request) {
         $weighIn = new WeighIn();
         // Deal with boat section
         if (!empty($request['boat']) && !empty($request['boat']['name'])) {
             if (isset($request['boat']['id'])) {
                 // assign a boat to the weigh-in
                 $boat = Boat::findOrFail($request['boat']['id']);
             } else {
                 // create a new boat
                 $boat = new Boat();
                 $boat->name = $request['boat']['name'];
                 $boat->charter = isset($request['boat']['charter']) ? true : false;
                 if (!empty($request['boat']['skipper']['id'])) {
                     $boat->skipper()->associate(User::find($request['boat']['skipper']['id']));
                 }
                 $boat->save();
             }
             $weighIn->boat()->associate($boat);
         }
         // TODO: discuss with Rob if it makes sense
         //            if(!empty($request['team_id'])){
         //                $weighIn->team()->associate(Team::find($request['team_id']));
         //            }
         $weighIn->date = $request['date'];
         $weighIn->entry_ticket_number = $request['entry_ticket_number'];
         $weighIn->sheet_number = $request['sheet_number'];
         $weighIn->team_number = !empty($request['team_number']) ? $request['team_number'] : null;
         $weighIn->event()->associate(Event::find($request['event_id']));
         $weighIn->site()->associate(Site::find($request['weigh_in_site_id']));
         $weighIn->user()->associate(User::find($request['user_id']));
         $weighIn->save();
         foreach ($request['entries'] as $e) {
             $entry = new Entry();
             $entry->weight = Helpers::toDrams($e['species_weight']);
             $entry->percentage = Weight::calculatePercentage($e['species_id'], $e['sector_id'], $e['species_weight']);
             $entry->sector()->associate(Sector::find($e['sector_id']));
             $entry->location()->associate(Location::find($e['location_id']));
             $entry->event()->associate(Event::find($request['event_id']));
             $entry->species()->associate(Species::find($e['species_id']));
             $entry->user()->associate(User::find($request['user_id']));
             $entry->weighIn()->associate($weighIn);
             $entry->save();
             if (isset($e['categories'])) {
                 $categories = [];
                 foreach ($e['categories'] as $catId) {
                     $categories[$catId] = ['event_id' => (int) $request['event_id']];
                 }
                 $entry->categories()->sync($categories);
             }
         }
         //dd($request);
     });
     flash()->success('Success!', "New weigh-in has been created!");
     return redirect(route('admin.weigh-ins.create'));
 }
 /**
  * Update the specified resource in storage.
  *
  * @param SpeciesRequest|Request $request
  * @param  int $id
  * @return \Illuminate\Http\Response
  */
 public function update(SpeciesRequest $request, $id)
 {
     // Fetch the edited specie from the database
     $species = Species::findOrFail($id);
     DB::transaction(function () use($request, $species) {
         // Update the fields
         $species->name = $request['name'];
         $species->type()->associate(Type::findOrFail($request['type_id']));
         $species->save();
         foreach ($request['weights'] as $sectorId => $sectorWeight) {
             Weight::where('species_id', $species->id)->where('sector_id', $sectorId)->update(['weight' => Helpers::toDrams($sectorWeight)]);
         }
     });
     flash()->success('Success!', "Species data has been updated!");
     return redirect(route('admin.settings.species.index'));
 }