Exemplo n.º 1
0
 /**
  * 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;
 }