/** * return true if item are returnable * * Return criterias are: * - return number is not existed before * - sum is less than or equal to total delivered item * * @param Array input from form validation * @param int edition_id * @param int total returned amount on form * * @return int distRealDetID if passed all exceptions */ private function validateReturnItem($input, $edition_id, $total) { // Check if return.num already existed $existed = ReturnItem::where('num', '=', (int) $input['number'])->get(); if (!$existed->isEmpty()) { $err = "Return number is already existed! Return#: {$existed->implode('number')}"; throw new \Exception($err); } // Check if agent_id match to distribution_plan $realizationDetail = DistRealDet::with('distributionRealization')->where('agent_id', '=', $input['agent_id'])->get(); if ($realizationDetail->isEmpty()) { $err = 'No delivery was made for this agent'; throw new \Exception($err); } $distRealDetID = 0; // look for each distributionPlan foreach ($realizationDetail as $rd) { if ($rd->distributionRealization->edition_id == (int) $edition_id) { $distRealDetID = (int) $rd->id; } } if ($distRealDetID == 0) { $err = 'No editions were delivered for this agent'; throw new \Exception($err); } //Previous returns $returnAmount = 0; $prevRets = ReturnItem::where('dist_realization_det_id', '=', $distRealDetID)->get(); if ($prevRets) { foreach ($prevRets as $x) { $returnAmount += $x->total; } } $total = $returnAmount + $total; // Delivery amount is less than return $deliveryAmount = 0; $deliveries = Delivery::where('dist_realization_det_id', '=', $distRealDetID)->get(); if ($deliveries) { foreach ($deliveries as $x) { // Quota cannot be returned, so use consigned amount $deliveryAmount += $x->consigned; } } if ($deliveryAmount < $total) { //Must fail $err = "Mismatched return amount!" . " Deliveries made = {$deliveryAmount}." . " Total returned amount = {$total}."; throw new \Exception($err); } return $distRealDetID; }