Esempio n. 1
0
 /**
  * check the status for code in offline
  * @param $codes,array
  * @param $accountId,objectId
  * @param $member,object
  * @param $exchangeTime,mongoDate
  */
 public static function checkCodeStatus($codes, $accountId, $member, $exchangeTime, $params)
 {
     $invalid = $redeemed = $validCampaignCode = $redeemedMemberId = [];
     //check code redeem
     $condition = ['code' => ['$in' => $codes], 'isUsed' => true, 'accountId' => $accountId];
     //get member info when code is redeemed
     $redeemedCodes = PromotionCode::findAll($condition);
     $redeemInfo = self::getRedeemCodeAndRedeemMemberId($redeemedCodes);
     $redeemed = $redeemInfo['code'];
     $redeemedMemberId = $redeemInfo['memberIds'];
     if (count($codes) != count($redeemed)) {
         //if the code are not all redeem, we need select campaign
         //1.get promotioncode which is vaild
         $unRedeemedCodes = array_diff($codes, $redeemed);
         //1.code is valid,2.code is not exists in collection
         $promocodes = self::getNotRedeemCode($unRedeemedCodes, $accountId);
         if (empty($promocodes)) {
             //if the promocodes is empty,the code all are invalid
             $invalid = $unRedeemedCodes;
         } else {
             //validCodeInfo struct is a array,key is code value is productId
             $validCodeProductId = self::getValidCodeInfoFromPromotionCode($promocodes);
             $validCode = array_keys($validCodeProductId);
             $validProductId = array_values($validCodeProductId);
             $notExistsCode = self::getNotExitsCode($unRedeemedCodes, $validCode);
             //get all campaign
             $condition = ['promotion.data' => ['$in' => $validProductId], 'accountId' => $accountId];
             $campaigns = Campaign::findAll($condition);
             if (empty($campaigns)) {
                 $invalid = $validCode;
             } else {
                 //campaignCodeProductId is array.key is code value is productId
                 $campaignCodeProductId = self::getCodeInfoFitWithCampaign($campaigns, $validCodeProductId);
                 //merge not exists code and code whitch can not find any campaigns
                 $invalid = array_merge($notExistsCode, array_diff($validCode, array_keys($campaignCodeProductId)));
                 if (!empty($campaignCodeProductId)) {
                     //order the code with source code,first-in first-out
                     $campaignCodeProductId = self::orderCode($codes, $campaignCodeProductId);
                     $validCampaignCode = self::checkCode2CampainStatus($campaignCodeProductId, $member, $exchangeTime, $params);
                 }
             }
         }
     }
     $codes = [];
     if (!empty($invalid)) {
         foreach ($invalid as $invalidCode) {
             $codes[$invalidCode] = ['code' => $invalidCode, 'status' => self::CODE_STATUS_INVALID, 'score' => 0, 'description' => Yii::t('product', 'system_not_exists')];
         }
     }
     if (!empty($redeemed)) {
         $codes = array_merge($codes, self::setMemberName($redeemedMemberId, $redeemedCodes));
     }
     return array_merge($codes, $validCampaignCode);
 }