account.php 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: stanley-king
  5. * Date: 16/4/12
  6. * Time: 下午4:57
  7. */
  8. namespace bonus;
  9. use bonus_helper;
  10. use Exception;
  11. use Log;
  12. use member_info;
  13. use ranklist_helper;
  14. use room_helper;
  15. use session_helper;
  16. require_once(BASE_ROOT_PATH . '/helper/model_helper.php');
  17. require_once(BASE_ROOT_PATH . '/helper/bonus_helper.php');
  18. require_once(BASE_ROOT_PATH . '/helper/account_helper.php');
  19. require_once(BASE_ROOT_PATH . '/helper/room_helper.php');
  20. interface IPriceCalculate
  21. {
  22. public function bonus_price($goods_price, $goods_lowest_price);
  23. public function order_cash($goods_price, $goods_lowest_price);
  24. public function discount_gap($bonus_price, $goods_lowest_price);
  25. public function bonus_amount($goods_amount,$goods_lowest_amount);
  26. public function bonus_way($bonus_amount);
  27. public function bonus_detail($bonus_amount,$room_id);
  28. public function hold_bonus($user_bonus);
  29. }
  30. class normal_calc implements IPriceCalculate
  31. {
  32. public function bonus_price($goods_price, $goods_lowest_price) {
  33. return $goods_price;
  34. }
  35. public function discount_gap($bonus_price, $goods_lowest_price)
  36. {
  37. $bonus_cent = intval($bonus_price * 100 + 0.5);
  38. $lowest_cent = intval($goods_lowest_price * 100 + 0.5);
  39. if($bonus_cent >= $lowest_cent) {
  40. return ($bonus_cent - $lowest_cent) / 100;
  41. } else {
  42. return 0;
  43. }
  44. }
  45. public function order_cash($goods_price, $goods_lowest_price)
  46. {
  47. return $goods_price;
  48. }
  49. public function bonus_amount($goods_amount,$goods_lowest_amount)
  50. {
  51. return 0.00;
  52. }
  53. public function hold_bonus($user_bonus) {
  54. }
  55. public function bonus_way($bonus_amount) {
  56. return [];
  57. }
  58. public function bonus_detail($bonus_amount,$room_id)
  59. {
  60. return [];
  61. }
  62. }
  63. class account implements IPriceCalculate
  64. {
  65. private $member_id;
  66. private $mPayRates;
  67. private $mShareRates;
  68. private $mBonusState;
  69. private $mRateVersion; //用来记录,红包过期带来的红包变化
  70. private $mFromSession;
  71. private $mRoomBonus;
  72. private $mDirty;
  73. public function __construct($member_id, $from_session = false)
  74. {
  75. $this->mDirty = false;
  76. $this->member_id = $member_id;
  77. $this->mFromSession = $from_session;
  78. $pd_array = Model('member')->getMemberPdInfo($this->member_id);
  79. $this->mRateVersion = intval($pd_array['rate_version']);
  80. $this->init_rate();
  81. $this->init_roombonus();
  82. }
  83. public function __destruct()
  84. {
  85. if ($this->mDirty) {
  86. if ($this->mFromSession) {
  87. $this->del_rates();
  88. }
  89. $this->inc_rate_version();
  90. }
  91. }
  92. public function room_bonus()
  93. {
  94. return $this->mRoomBonus;
  95. }
  96. private function init_roombonus()
  97. {
  98. $this->mRoomBonus = [];
  99. $items = room_helper::user_rooms($this->member_id);
  100. foreach ($items as $item) {
  101. $amount = $item['shared_bonus'];
  102. $room_id= $item['room_id'];
  103. $name = $item['name'];
  104. $avatar = $item['avatar'];
  105. $this->mRoomBonus[] = ['room_id' => $room_id,'amount' => $amount,'shared_bonus'=> $amount ,'name' => $name,'avatar' => $avatar];
  106. }
  107. if(!empty($this->mRoomBonus)) {
  108. usort($this->mRoomBonus,['bonus\account','sort_room_bonus']);
  109. }
  110. }
  111. private function find_room($amount)
  112. {
  113. $result = [];
  114. $amount = intval(100 * $amount);
  115. foreach ($this->mRoomBonus as $item)
  116. {
  117. $cent = intval($item['amount'] * 100 + 0.5);
  118. if($amount <= $cent) {
  119. $result[] = $item;
  120. }
  121. }
  122. if(empty($result))
  123. {
  124. if(!empty($this->mRoomBonus)) {
  125. $result[] = $this->mRoomBonus[0];
  126. }
  127. }
  128. return $result;
  129. }
  130. static public function sort_room_bonus($l,$r)
  131. {
  132. $l_val = intval($l['amount'] * 100 + 0.5);
  133. $r_val = intval($r['amount'] * 100 + 0.5);
  134. if($l_val > $r_val)
  135. return -1;
  136. elseif($l_val < $r_val)
  137. return 1;
  138. else
  139. return 0;
  140. }
  141. public function member_id()
  142. {
  143. return $this->member_id;
  144. }
  145. private function init_rate()
  146. {
  147. if ($this->mFromSession)
  148. {
  149. $fUpdate = false;
  150. if (!isset($_SESSION['bonus_rate_version'])) {
  151. $fUpdate = true;
  152. }
  153. else
  154. {
  155. $version = $_SESSION['bonus_rate_version'];
  156. if ($version != $this->mRateVersion) {
  157. $fUpdate = true;
  158. }
  159. elseif (isset($_SESSION['bonus_rate']) && isset($_SESSION['bonus_state']) && isset($_SESSION['share_bonus_rate'])) {
  160. $this->mPayRates = self::create_moneycalc($_SESSION['bonus_rate']);
  161. $this->mShareRates = self::create_moneycalc($_SESSION['share_bonus_rate']);
  162. $this->mBonusState = $_SESSION['bonus_state'];
  163. } else {
  164. $fUpdate = true;
  165. }
  166. }
  167. }
  168. else {
  169. $fUpdate = true;
  170. }
  171. if ($fUpdate || $this->need_update())
  172. {
  173. $mod_bonus = Model('user_bonus');
  174. $this->mPayRates = self::create_moneycalc([]);
  175. $pay_items = $mod_bonus->getUsableBonus($this->member_id);
  176. $this->mPayRates->add_bonuses($pay_items);
  177. $pay_bonus_rate = $this->mPayRates->format();
  178. $this->mShareRates = self::create_moneycalc([]);
  179. $share_items = $mod_bonus->getShareableBonus($this->member_id);
  180. $this->mShareRates->add_bonuses($share_items);
  181. $share_bonus_rate = $this->mShareRates->format();
  182. $this->mBonusState = [];
  183. $querys = array('usable', 'expiring', 'used', 'expired');
  184. foreach ($querys as $state)
  185. {
  186. $cond = $this->query_cond($state);
  187. if ($state == 'used') {
  188. $sum = $mod_bonus->getSum($cond, 'bonus_value');
  189. } else {
  190. $sum = $mod_bonus->getSum($cond);
  191. }
  192. $this->mBonusState[$state] = doubleval($sum);
  193. }
  194. $this->write_rates($this->mBonusState, $pay_bonus_rate, $share_bonus_rate);
  195. $this->mPayRates->clean();
  196. $this->mShareRates->clean();
  197. if ($this->mFromSession) {
  198. $_SESSION['bonus_update_time'] = time();
  199. }
  200. }
  201. }
  202. private function need_update()
  203. {
  204. if ($this->mFromSession)
  205. {
  206. if (!isset($_SESSION['bonus_update_time'])) return true;
  207. $time = intval($_SESSION['bonus_update_time']);
  208. if (time() - $time > 86400) {
  209. return true;
  210. } else {
  211. return false;
  212. }
  213. }
  214. else {
  215. return true;
  216. }
  217. }
  218. public function pay_bonus_rates()
  219. {
  220. return $this->mPayRates;
  221. }
  222. public function total_bonus()
  223. {
  224. return $this->mPayRates->total();
  225. }
  226. public function usable_bonus()
  227. {
  228. if(empty($this->mRoomBonus)) {
  229. return $this->total_bonus();
  230. } else {
  231. $ramount = $this->mRoomBonus[0]['amount'];
  232. return ($ramount + $this->total_bonus());
  233. }
  234. }
  235. public function share_bonus_rates()
  236. {
  237. return $this->mShareRates;
  238. }
  239. public function share_total_bonus()
  240. {
  241. return $this->mShareRates->total();
  242. }
  243. public function bonus_state()
  244. {
  245. return $this->mBonusState;
  246. }
  247. private function query_cond($query_state)
  248. {
  249. static $stQuerys = ['usable', 'expiring', 'used', 'expired'];
  250. static $day_secs = 24 * 3600;
  251. $cond = ['user_id' => $this->member_id, 'bonus_status' => 3];
  252. if (!empty($query_state) && in_array($query_state, $stQuerys)) {
  253. if ($query_state == 'usable') {
  254. $cond['remain_amount'] = ['gt', '0.00'];
  255. $cond['usable_time'] = ['gt', time()];
  256. $cond['expired'] = 0;
  257. } elseif ($query_state == 'expiring') {
  258. $cond['usable_time&usable_time'] = ['_multi' => true, ['gt', time()], ['elt', time() + 5 * $day_secs]];
  259. $cond['remain_amount'] = ['gt', '0.00'];
  260. $cond['expired'] = 0;
  261. } elseif ($query_state == 'used') {
  262. $cond['remain_amount'] = '0.00';
  263. $cond['expired'] = 0;
  264. } elseif ($query_state == 'expired') {
  265. $cond['usable_time'] = ['lt', time()];
  266. $cond['expired'] = 1;
  267. $cond['remain_amount'] = ['gt', '0.00'];
  268. } else {
  269. }
  270. }
  271. return $cond;
  272. }
  273. private function write_rates($bonus_state, $pay_bonus_rate, $share_bonus_rate)
  274. {
  275. if ($this->mFromSession) {
  276. $_SESSION['bonus_state'] = $bonus_state;
  277. $_SESSION['bonus_rate'] = $pay_bonus_rate;
  278. $_SESSION['share_bonus_rate'] = $share_bonus_rate;
  279. $_SESSION['bonus_rate_version'] = $this->mRateVersion;
  280. }
  281. }
  282. private function del_rates()
  283. {
  284. if ($this->mFromSession)
  285. {
  286. if (isset($_SESSION['bonus_state'])) {
  287. unset($_SESSION['bonus_state']);
  288. }
  289. if (isset($_SESSION['bonus_rate'])) {
  290. unset($_SESSION['bonus_rate']);
  291. }
  292. if (isset($_SESSION['share_bonus_rate'])) {
  293. unset($_SESSION['share_bonus_rate']);
  294. }
  295. if (isset($_SESSION['bonus_rate_version'])) {
  296. unset($_SESSION['bonus_rate_version']);
  297. }
  298. }
  299. }
  300. public function topup_bonus($mobile)
  301. {
  302. $mod_bonus = Model('user_bonus');
  303. $items = $mod_bonus->getBinded($this->member_id(), $mobile);
  304. if (empty($items)) return false;
  305. $bonuses = [];
  306. $manager = new manager();
  307. foreach ($items as $val)
  308. {
  309. try
  310. {
  311. $type_id = $val['type_id'];
  312. $type = type::create_by_id($type_id);
  313. $bonus = user_bonus::create_by_param($val);
  314. if ($manager->topup($type, $mod_bonus, $val) == true) {
  315. $bonuses[] = $val;
  316. ranklist_helper::add_money($this->member_id(), $bonus->bonus_value());
  317. $logger = new recorder($this->member_id);
  318. $logger->add_bonus($bonus, $type);
  319. }
  320. } catch (Exception $ex) {
  321. Log::record(__METHOD__ . " {$ex->getMessage()}", Log::ERR);
  322. }
  323. }
  324. if (empty($bonuses)) {
  325. return false;
  326. } else {
  327. $this->mDirty = true;
  328. return $bonuses;
  329. }
  330. }
  331. public function is_enough($money)
  332. {
  333. return intval($this->total_bonus() * 100) >= intval($money * 100);
  334. }
  335. public function share_enough($money, &$bonus_rate)
  336. {
  337. if ($this->mPayRates == null) return false;
  338. return $this->mShareRates->is_enough($bonus_rate, $money);
  339. }
  340. public function rates()
  341. {
  342. return $this->mPayRates == null ? false : $this->mPayRates;
  343. }
  344. public function makeby_bonus($param, $rate_moneys, $bonus_sn)
  345. {
  346. $result = bonus_helper::make_bonus($param, $rate_moneys);
  347. if ($result == false) return false;
  348. $this->mDirty = true;
  349. foreach ($rate_moneys as $item) {
  350. $rate = intval($item['rate']);
  351. $val = $item['hold_amount'];
  352. bonus_helper::withold_bonus($this->member_id, $bonus_sn, $rate, $val, bonus_helper::send_bonus_withold);
  353. }
  354. $type_sn = $result['type_sn'];
  355. $money = $result['money'];
  356. $logger = new recorder($this->member_id);
  357. $logger->handout_bonus($money, $type_sn, session_helper::nickname(), "发送了{$money}元的红包.", type::MakeSendType);
  358. foreach ($rate_moneys as $item) {
  359. $this->mPayRates->with_hold($item['rate'], $item['amount']);
  360. }
  361. return $result;
  362. }
  363. public function make_bonus($param, $rate_moneys)
  364. {
  365. $result = bonus_helper::make_bonus($param, $rate_moneys);
  366. if ($result == false) return false;
  367. $this->mDirty = true;
  368. $rates = [];
  369. foreach ($rate_moneys as $item) {
  370. $rate = intval($item['rate']);
  371. $val = $item['hold_amount'];
  372. $rates[$rate] = $val;
  373. }
  374. bonus_helper::withold($this->member_id, $rates, bonus_helper::send_bonus_withold);
  375. $type_sn = $result['type_sn'];
  376. $money = $result['money'];
  377. $logger = new recorder($this->member_id);
  378. $logger->handout_bonus($money, $type_sn, session_helper::nickname(), "发送了{$money}元的红包.", type::MakeSendType);
  379. foreach ($rate_moneys as $item) {
  380. $this->mPayRates->with_hold($item['rate'], $item['amount']);
  381. }
  382. return $result;
  383. }
  384. public function make_vote_type($param, $rate_moneys)
  385. {
  386. $result = bonus_helper::make_vote_type($param, $rate_moneys);
  387. if ($result == false) return false;
  388. $this->mDirty = true;
  389. $rates = [];
  390. foreach ($rate_moneys as $item) {
  391. $rate = intval($item['rate']);
  392. $val = $item['hold_amount'];
  393. $rates[$rate] = $val;
  394. }
  395. bonus_helper::withold($this->member_id, $rates, bonus_helper::send_bonus_withold);
  396. $type_sn = $result['type_sn'];
  397. $money = $result['money'];
  398. $logger = new recorder($this->member_id);
  399. $logger->handout_bonus($money, $type_sn, session_helper::nickname(), "发送了{$money}元的红包.", type::MakeSendType);
  400. foreach ($rate_moneys as $item) {
  401. $this->mPayRates->with_hold($item['rate'], $item['amount']);
  402. }
  403. return $result;
  404. }
  405. private function base_param($amount, $total_num)
  406. {
  407. $param = [];
  408. $param['total_amount'] = $amount;
  409. $param['total_num'] = $total_num;
  410. $param['send_type'] = 1;
  411. return $param;
  412. }
  413. public function share_bonus($bonus_sn, &$msg)
  414. {
  415. $bonus = user_bonus::create_by_sn($bonus_sn);
  416. if ($bonus->spend_over()) {
  417. $msg = "该红包现金已经花光了~";
  418. return false;
  419. }
  420. $amount = $bonus->remain_amount();
  421. $param = $this->base_param($amount, 1);
  422. $minfo = new member_info($this->member_id);
  423. $param['sender_id'] = $this->member_id;
  424. $param['sender_mobile'] = $minfo->mobile();
  425. $param['sender_name'] = $minfo->nickname();
  426. $param['make_type'] = type::MakeSendType;
  427. $name = $minfo->nickname();
  428. $param['type_name'] = "{$name}";
  429. $type = type::create_by_input($param);
  430. $rate_moneys = [];
  431. $item['amount'] = $type->getTotal_amount();
  432. $item['num'] = $type->getTotal_num();
  433. $item['rate'] = $bonus->bonus_rate();
  434. $rate_moneys[] = $item;
  435. $result = bonus_helper::make_bonus($param, $rate_moneys);
  436. if ($result == false) {
  437. return false;
  438. } else {
  439. $this->mDirty = true;
  440. if (bonus_helper::withold_bonus($this->member_id, $bonus->bonus_rate(), $bonus_sn, $type->getTotal_amount(), bonus_helper::send_bonus_withold)) {
  441. $type_sn = $result['type_sn'];
  442. $money = $result['money'];
  443. $logger = new recorder($this->member_id);
  444. $logger->handout_bonus($money, $type_sn, session_helper::nickname(), "发送了{$money}元的红包.", type::MakeSendType);
  445. }
  446. return $result;
  447. }
  448. }
  449. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  450. // public function calc_rates($order_pd_amount)
  451. // {
  452. // $rates = $this->mPayRates->calc_rates($order_pd_amount);
  453. // return $rates;
  454. // }
  455. // public function calc_pred($order_info, $pd_amount, &$no_cash, &$rates)
  456. // {
  457. // $order_id = intval($order_info['order_id']);
  458. // $mod_order = Model('order');
  459. //
  460. // $pred_amount = 0.00;
  461. // $goods_list = $mod_order->getOrderGoodsList(array('order_id' => $order_id));
  462. // foreach ($goods_list as $goods) {
  463. // $goods_type = intval($goods['goods_type']);
  464. // if ($goods_type == 1) {
  465. // $pred_amount += doubleval($goods['goods_pay_price']);
  466. // }
  467. // }
  468. //
  469. // $pred_amount = $pred_amount - $this->mPayRates->calc_money($pred_amount, $rates);
  470. // $cur_used = intval($pred_amount * 100 + 0.5);
  471. // $cur_used = $cur_used > $pd_amount ? $pd_amount : $cur_used;
  472. //
  473. // $order_amount = intval($order_info['order_amount'] * 100 + 0.5);
  474. // $order_pd_amount = intval($order_info['pd_amount'] * 100 + 0.5);
  475. //
  476. // if ($order_amount == $cur_used) {
  477. // $no_cash = true;
  478. // } else {
  479. // $no_cash = false;
  480. // }
  481. //
  482. // return $cur_used - $order_pd_amount;
  483. // }
  484. // public function pay_bonus($rates)
  485. // {
  486. // $ret = bonus_helper::withold($this->member_id, $rates, bonus_helper::pay_order_withold);
  487. // foreach ($rates as $rate => $amount) {
  488. // $this->mPayRates->with_hold($rate, $amount);
  489. // }
  490. // $this->mDirty = true;
  491. //
  492. // return $ret;
  493. // }
  494. public function find_share_bonus($amount)
  495. {
  496. $bonus_rate = $this->share_bonus_rates();
  497. return $bonus_rate->find_rate($amount);
  498. }
  499. private function inc_rate_version()
  500. {
  501. $mod_member = Model('member');
  502. $mod_member->editMember(['member_id' => $this->member_id], ['rate_version' => ['exp', "rate_version+1"]]);
  503. }
  504. public function bonus_price($goods_price, $lowest_price)
  505. {
  506. $can_use = $goods_price - $lowest_price;
  507. $can_use_cent = intval($can_use * 100 + 0.5);
  508. $usable_cent = intval($this->usable_bonus() * 100 + 0.5);
  509. if ($usable_cent >= $can_use_cent) {
  510. return $lowest_price;
  511. } else {
  512. return intval($goods_price * 100 - $usable_cent + 0.5) / 100;
  513. }
  514. }
  515. public function order_cash($goods_amount, $lowest_amount)
  516. {
  517. return $this->bonus_price($goods_amount,$lowest_amount);
  518. }
  519. public function discount_gap($bonus_price, $goods_lowest_price)
  520. {
  521. $bonus_cent = intval($bonus_price * 100 + 0.5);
  522. $lowest_cent = intval($goods_lowest_price * 100 + 0.5);
  523. if($bonus_cent >= $lowest_cent) {
  524. return ($bonus_cent - $lowest_cent) / 100;
  525. } else {
  526. return 0;
  527. }
  528. }
  529. public function bonus_amount($goods_amount,$goods_lowest_amount)
  530. {
  531. $can_use = $goods_amount - $goods_lowest_amount;
  532. $can_use_cent = intval($can_use * 100 + 0.5);
  533. $usable_cent = intval($this->usable_bonus() * 100 + 0.5);
  534. if ($usable_cent >= $can_use_cent) {
  535. return ($can_use_cent / 100);
  536. } else {
  537. return $usable_cent/ 100;
  538. }
  539. }
  540. public function bonus_way($bonus_amount)
  541. {
  542. $result = [];
  543. $need_cent = intval($bonus_amount * 100 + 0.5);
  544. $mine_cent = intval($this->total_bonus() * 100 + 0.5);
  545. if($mine_cent >= $need_cent) {
  546. $result['user_bonus'] = $need_cent / 100;
  547. $result['show_room'] = false;
  548. $result['room_bonus'] = 0;
  549. $result['rooms'] = [];
  550. }
  551. else
  552. {
  553. $result['user_bonus'] = $mine_cent / 100;
  554. $room_bonus = ($need_cent - $mine_cent) / 100;
  555. $rooms = $this->find_room($room_bonus);
  556. if(empty($rooms)) {
  557. $result['show_room'] = false;
  558. $result['room_bonus'] = 0;
  559. $result['rooms'] = [];
  560. } else {
  561. $result['show_room'] = true;
  562. $result['room_bonus'] = $room_bonus;
  563. $result['rooms'] = $rooms;
  564. }
  565. }
  566. return $result;
  567. }
  568. public function bonus_detail($bonus_amount,$roomid)
  569. {
  570. $ways = $this->bonus_way($bonus_amount);
  571. if($ways['show_room'] == false || $roomid <= 0) {
  572. return ['user_bonus' => $ways['user_bonus']];
  573. }
  574. $room_val = 0;
  575. $roomid = intval($roomid);
  576. if($roomid > 0)
  577. {
  578. foreach ($ways['rooms'] as $room)
  579. {
  580. if($roomid == $room['room_id']) {
  581. $room_val = $ways['room_bonus'];
  582. break;
  583. }
  584. }
  585. }
  586. else
  587. {
  588. foreach ($ways['rooms'] as $room) {
  589. $roomid = $room['room_id'];
  590. $room_val = $ways['room_bonus'];
  591. break;
  592. }
  593. }
  594. return ['user_bonus' => $ways['user_bonus'],'room_bonus' => $room_val,'room_id' => $roomid];
  595. }
  596. public function hold_bonus($user_bonus)
  597. {
  598. if(intval($user_bonus * 100 + 0.5) > 0)
  599. {
  600. bonus_helper::withold($this->member_id, [30 => $user_bonus], bonus_helper::pay_order_withold);
  601. $this->mPayRates->with_hold(30, $user_bonus);
  602. $this->mDirty = true;
  603. }
  604. }
  605. static private function create_moneycalc($rate_moneys)
  606. {
  607. if (noBonusRate()) {
  608. return new BonusAmount($rate_moneys);
  609. } else {
  610. return new RateMoney($rate_moneys);
  611. }
  612. }
  613. }