/** * lock around 20 - next 20 * * @return void * @author **/ public function calculatebalance() { \Log::info('Re calculate ads` balance @' . date('Y-m-d H:i:s')); $tours = Tour::published()->upcomingtour()->adsstarted('now')->with('travel_agent')->get(); $now = \Carbon\Carbon::now()->format('Y-m-d'); foreach ($tours as $key => $value) { foreach ($value['ads'] as $key2 => $value2) { $query = []; $query[] = ['$match' => ['ads_id' => ['$eq' => $value2['ad_id']]]]; $query[] = ['$group' => ['_id' => '$ads_id', 'count' => ['$sum' => '$credit.credit_balance'], 'total' => ['$sum' => 1]]]; $prev_calc = TopUpLog::raw(function ($collection) use($query, $value2) { return $collection->aggregate($query); })->toArray(); $started = \Carbon\Carbon::parse($value2['started_at']); $days = $started->diffInDays(\Carbon\Carbon::parse('today')); $today_balance = $value2['initial_credit'] - $days * $value2['daily_rate']; if ($value2['started_at'] <= $now && $value2['today_balance'] > 0 && ($prev_calc[0]['count'] > 0 && $prev_calc[0]['count'] != $today_balance || is_null($prev_calc[0]))) { $new_balance = $value['ads']; $new_balance[$key2]['today_balance'] = $value2['initial_credit'] - $days * $value2['daily_rate']; if (is_null($prev_calc[0]['count'])) { $new_balance[$key2]['credit_balance'] = 0 - $new_balance[$key2]['today_balance']; } else { $new_balance[$key2]['credit_balance'] = 0 - ($prev_calc[0]['count'] - $new_balance[$key2]['today_balance']); } $value->ads = $new_balance; $attributes['name'] = 'Auto debit Top Up'; $attributes['ads_id'] = $value2['ad_id']; $attributes['transact_at'] = \Carbon\Carbon::now()->format('Y-m-d'); $attributes['travel_agent']['_id'] = $value->travel_agent['_id']; $attributes['travel_agent']['name'] = $value->travel_agent['name']; $attributes['credit']['started_at'] = $value2['started_at']; $attributes['credit']['initial_credit'] = $value2['initial_credit'] * 1; $attributes['credit']['daily_rate'] = $value2['daily_rate'] * 1; $attributes['credit']['today_balance'] = $new_balance[$key2]['today_balance'] * 1; $attributes['credit']['credit_balance'] = $new_balance[$key2]['credit_balance']; $attributes['credit']['tags'] = $value2['tags']; $attributes['tour']['_id'] = $value['_id']; $attributes['tour']['name'] = $value['name']; $attributes['tour']['tags'] = $value['tags']; $top_up = new TopUpLog(); $top_up->fill($attributes); if (!$top_up->save()) { \Log::error(json_encode($top_up->getError())); } } } if (!$value->save()) { \Log::error(json_encode($value->getError())); } } return true; }
function credit_per_travel_agent() { /////////// // Query // /////////// $query[] = ['$group' => ['_id' => '$travel_agent._id', 'travel_agent_name' => ['$last' => '$travel_agent.name'], 'count' => ['$sum' => '$credit.credit_balance']]]; $query[] = ['$sort' => ['count' => 1]]; ////////////////////////////// // Get Result // ////////////////////////////// $data = Model::raw(function ($collection) use($query) { return $collection->aggregate($query); }); return response()->json(JSend::success(['count' => count($data), 'data' => $data->toArray()])->asArray())->setCallback($this->request->input('callback')); }