/**
  * @args {"description": "Delay: Stats of StatsMemberGrowthQuarterly every day"}
  * @author Rex Chen
  */
 public function perform()
 {
     $args = $this->args;
     $date = empty($args['date']) ? '' : $args['date'];
     $datetime = TimeUtil::getDatetime($date);
     $year = date('Y', $datetime);
     $quarter = TimeUtil::getQuarter($datetime);
     $startMonth = ($quarter - 1) * 3 + 1;
     $startTime = new \MongoDate(strtotime($year . '-' . $startMonth . '-01'));
     $endTime = new \MongoDate(strtotime($year . '-' . $startMonth . '-01' . ' +3 month'));
     $accounts = Account::findAll(['enabledMods' => 'member']);
     foreach ($accounts as $account) {
         $accountId = $account->_id;
         $totalMember = Member::countByAccount($accountId, null, $endTime);
         $totalActive = MemberLogs::getTotalActiveByAccount($accountId, $startTime, $endTime);
         $totalNew = Member::countByAccount($accountId, $startTime, $endTime);
         $statsGrowth = ModelStatsMemberGrowthQuarterly::getByQuarterAndAccount($accountId, $year, $quarter);
         if (empty($statsGrowth)) {
             $statsGrowth = new ModelStatsMemberGrowthQuarterly();
             $statsGrowth->accountId = $accountId;
             $statsGrowth->year = $year;
             $statsGrowth->quarter = $quarter;
         }
         $statsGrowth->totalNew = $totalNew;
         $statsGrowth->totalActive = $totalActive;
         $statsGrowth->totalInactive = $totalMember - $totalActive;
         try {
             $statsGrowth->save();
         } catch (Exception $e) {
             ResqueUtil::log(['Update StatsMemberGrowthQuarterly error' => $e->getMessage(), 'StatsMemberGrowthMonthly' => $statsGrowth]);
             continue;
         }
     }
     return true;
 }
 private static function _setStatsMemberPropTradeQuarterly($startTime, $endTime, $args)
 {
     //Assume that the subChannel is the secode element in properties
     $propertyKey = $args['properties'][1];
     $memberProperty = MemberProperty::findOne(['propertyId' => $propertyKey]);
     if (!empty($memberProperty)) {
         $startQuarter = TimeUtil::getQuarter($startTime);
         $endQuarter = TimeUtil::getQuarter($endTime);
         for ($quarter = $startQuarter; $quarter <= $endQuarter; ++$quarter) {
             $year = date('Y', $startTime);
             $condition = ['accountId' => $args['accountId'], 'year' => $year, 'quarter' => $quarter];
             StatsMemberPropTradeQuarterly::deleteAll($condition);
             self::generateStatsMemberPropTradeQuarterlyData((string) $memberProperty['_id'], $condition);
             LogUtil::info(['message' => $quarter . ' :Run StatsMemberPropTradeQuarterly'], 'update_job');
         }
     } else {
         LogUtil::info(['message' => 'Can not find this propertyId:' . $propertyKey], 'update_job');
     }
 }
 public function perform()
 {
     //accountId, properties are required fileds
     $args = $this->args;
     if (empty($args['accountId']) || empty($args['properties'])) {
         ResqueUtil::log('Missing required arguments accountId or properties!');
         return false;
     }
     $date = empty($args['date']) ? '' : $args['date'];
     $datetime = TimeUtil::getDatetime($date);
     $dateStr = date('Y-m-d', $datetime);
     $start = new MongoDate($datetime);
     $end = new MongoDate(strtotime('+1 day', $datetime));
     $accountId = new MongoId($args['accountId']);
     $condition = ['accountId' => $accountId, 'createdAt' => ['$gte' => $start, '$lt' => $end]];
     $campaignLogs = self::getCampaignLog($condition);
     if (empty($campaignLogs)) {
         LogUtil::info(['date' => date('Y-m-d H:i:s'), 'message' => $dateStr . ': campaignLogs is empty,no need to store data'], 'resque');
         return true;
     }
     //get all member info
     $memberInfos = self::getMemberInfo($condition);
     //Get all the property mongo id for comparison
     $condition = ['propertyId' => ['$in' => $args['properties']], 'accountId' => $accountId];
     $propertyIdStrs = self::getPropertyIds($condition);
     //Generate the meta data for inserting
     $statsRows = [];
     foreach ($campaignLogs as $campaignLog) {
         $campaignLog = $campaignLog['_id'];
         $redeemTime = self::getRedeemTime($campaignLog);
         //check the redeem time whether exists
         $condition = ['code' => $campaignLog['code'], 'productId' => $campaignLog['productId'], 'month' => date('Y-m', $redeemTime)];
         $memberCampaignLogDaily = ModelStatsMemberCampaignLogDaily::findOne($condition);
         if (empty($memberCampaignLogDaily)) {
             $memProperty = self::getProperty((string) $campaignLog['member']['id'], $memberInfos, $propertyIdStrs);
             $statsRows[] = ['memberId' => $campaignLog['member']['id'], 'memProperty' => $memProperty, 'productId' => $campaignLog['productId'], 'code' => $campaignLog['code'], 'year' => date('Y', $redeemTime), 'month' => date('Y-m', $redeemTime), 'quarter' => TimeUtil::getQuarter($redeemTime), 'accountId' => $accountId, 'createdAt' => new MongoDate(strtotime('+1 day', $datetime) - 1)];
         }
     }
     ModelStatsMemberCampaignLogDaily::batchInsert($statsRows);
     unset($statsRows, $memberCampaignLogDaily, $condition, $memProperty, $memberInfos);
     return true;
 }
 public function perform()
 {
     $args = $this->args;
     if (empty($args['accountId']) || empty($args['properties'][0])) {
         ResqueUtil::log('Missing required arguments accountId or properties!');
         return false;
     }
     $accountId = new MongoId($args['accountId']);
     $property = $args['properties'][0];
     $memberProperty = MemberProperty::getByPropertyId($accountId, $property);
     if (empty($memberProperty)) {
         ResqueUtil::log('Can not find member property with propertyId:' . $property);
         return false;
     }
     $date = empty($args['date']) ? '' : $args['date'];
     $date = TimeUtil::getDatetime($date);
     $year = date('Y', $date);
     $quarter = TimeUtil::getQuarter($date);
     self::generateData($memberProperty, $property, $year, $quarter, $accountId);
     return true;
 }
 public static function createDailyData($members, $campaignLogs, $propertyIdStrs, $accountId)
 {
     $statsRows = [];
     foreach ($campaignLogs as $campaignLog) {
         $campaignLog = $campaignLog['_id'];
         if ($campaignLog['redeemTime'] == $campaignLog['createdAt']) {
             $createdAt = $campaignLog['createdAt'];
         } else {
             $createdAt = $campaignLog['redeemTime'];
         }
         //check the redeem time whether exists
         $createdAt = MongodbUtil::MongoDate2TimeStamp($createdAt);
         $month = date('Y-m', $createdAt);
         $memberId = $campaignLog['member']['id'];
         $memProperty = [];
         if (isset($members[(string) $memberId])) {
             $member = $members[(string) $memberId];
             foreach ($member->properties as $property) {
                 $propertyId = (string) $property['id'];
                 if (in_array($propertyId, $propertyIdStrs)) {
                     $memProperty[$propertyId] = $property['value'];
                 }
             }
         }
         $statsRows[] = ['memberId' => $memberId, 'memProperty' => $memProperty, 'productId' => $campaignLog['productId'], 'code' => $campaignLog['code'], 'year' => date('Y', $createdAt), 'month' => $month, 'quarter' => TimeUtil::getQuarter($createdAt), 'accountId' => $accountId, 'createdAt' => $campaignLog['createdAt']];
     }
     StatsMemberCampaignLogDaily::batchInsert($statsRows);
     unset($statsRows, $members, $campaignLog, $campaignLogs);
 }