/** * ReAuthenticates a user. * @param int $timezoneOffset * @return boolean whether authentication succeeds. */ public function reauthenticate($timezoneOffset = 0) { $user = Users::model()->with('person','clients')->find('User_Login=:login', array(':login'=>$this->username)); if(!empty($user->User_ID)) { $user->Last_IP = $_SERVER['REMOTE_ADDR']; $user->Last_Login = date("Y-m-d H:i:s"); $user->save(); // Set user info $this->setState('userInfo', $user->person->First_Name . ' ' . $user->person->Last_Name); $this->setState('userID', $user->User_ID); $this->setState('userLogin', $user->User_Login); $this->setState('userTimezoneOffset', $timezoneOffset); // get client $client = false; foreach ($user->clients as $cl) { if ($cl->Client_ID == $_SESSION['last_client']) { $client = $cl; break; } else { $client = $cl; } } //set user's tier settings //check for delayed settings DelayedClientServiceSettings::checkDate(date('Y-m-d'),$client->Client_ID); $user_client_settings = $client->service_settings; $user_tier_settings = TiersSettings::agregateTiersSettings($user_client_settings->Service_Level_ID); $this->setState('tier_settings', $user_tier_settings); if ($client && $client->company) { $this->setState('clientInfo', $client->company->Company_Name); $this->setState('clientID', $client->Client_ID); $userClientRow = UsersClientList::model()->findByAttributes(array( 'User_ID' => $user->User_ID, 'Client_ID' => $client->Client_ID, )); //get projects if ($userClientRow->hasClientAdminPrivileges()) { $projects = Projects::model()->findAllByAttributes(array( 'Client_ID' => $client->Client_ID, )); } else { $condition = new CDbCriteria(); $condition->condition = "users_project_list.User_ID = '" . Yii::app()->user->userID . "'"; $condition->addCondition("t.Client_ID = '" . $client->Client_ID . "'"); $condition->join = "LEFT JOIN users_project_list ON users_project_list.Project_ID = t.Project_ID"; $projects = Projects::model()->findAll($condition); } if ($projects) { if (isset($_SESSION['last_project']) && $_SESSION['last_project'] == 'all') { $this->setState('projectInfo', 'All Projects'); $this->setState('projectID', 'all'); unset($_SESSION['last_project']); $this->errorCode=self::ERROR_NONE; } elseif (isset($_SESSION['last_project']) && is_numeric($_SESSION['last_project'])) { foreach($projects as $project) { if ($project->Project_ID == $_SESSION['last_project']) { $this->setState('projectInfo', $project->Project_Name); $this->setState('projectID', $project->Project_ID); unset($_SESSION['last_project']); $this->errorCode=self::ERROR_NONE; break; } } } else { $project = $projects[0]; $this->setState('projectInfo', $project->Project_Name); $this->setState('projectID', $project->Project_ID); $this->errorCode=self::ERROR_NONE; } } else { $this->setState('projectInfo', 'No project'); $this->setState('projectID', 0); $this->errorCode=self::ERROR_UNKNOWN_IDENTITY; } if ($userClientRow->User_Type == UsersClientList::CLIENT_ADMIN) { $this->username = '******'; } else if ($userClientRow->User_Type == UsersClientList::APPROVER) { $this->username = '******'; } else if ($userClientRow->User_Type == UsersClientList::PROCESSOR) { $this->username = '******'; } else if ($userClientRow->User_Type == UsersClientList::USER) { $this->username = '******'; } else { $this->username = '******'; } // reset user type if he id Admin, DB Admin OR DEC if ($user->User_Type == Users::ADMIN) { $this->username = '******'; } else if ($user->User_Type == Users::DB_ADMIN) { $this->username = '******'; } else if ($user->User_Type == Users::DATA_ENTRY_CLERK) { $this->username = '******'; } if ($user->User_Type == Users::USER) { $this->setState('userType', $userClientRow->User_Type); } else { $this->setState('userType', $user->User_Type); } } else { $this->setState('clientInfo', 'No company'); $this->setState('clientID', 0); $this->setState('projectInfo', 'No project'); $this->setState('projectID', 0); $this->setState('userType', 'Single User'); $this->username = '******'; $this->errorCode=self::ERROR_NONE; } } return !$this->errorCode; }
/** * Add client Payment, apply new settings and update 'Active To' date * @param $clientID * @param $amount * @param $date */ public static function addClientPayment($clientID, $amount, $date, $monthly_payment,$paydoc_number='auto') { $client = Clients::model()->with('service_settings', 'pending_service_settings','company.adreses')->findByPk($clientID); //$user = Users::model()->with('person')->findByPk(Yii::app()->user->userID); //$uid = UsersClientList::model()->findByAttributes(array('Client_ID'=>$clientID))->User_ID; $user = Users::model()->with('person')->findByPk(Yii::app()->user->userID); $sumToPay=$amount; //$sum_settings = ServiceLevelSettings::getSummarySettings($clientID); if ($client && $amount > 0 && preg_match('/^\d{4}\-\d{2}\-\d{2}$/', $date)) { $pendingSettings = $client->pending_service_settings; $currentSettings = $client->service_settings; $dcss = DelayedClientServiceSettings::model()->findByPk(Yii::app()->user->clientID); if($dcss) {$dcss->delete();} $sum_settings = ClientServiceSettings::getBaseTierValues(explode(',',$pendingSettings->Service_Level_ID)); //variables for email notification, not for logic $settingsBefore = "Level : ".$currentSettings->Service_Level_ID." Users:".$currentSettings->Additional_Users." Projects:".$currentSettings->Additional_Projects." Storage : ". $currentSettings->Additional_Storage; $dateBefore=date_format(date_create($currentSettings->Active_To),'Y-m-d'); $tierNameBefore=ServiceLevelSettings::model()->findByPk($currentSettings->Service_Level_ID)->Tier_Name; $settings_are_delayed = $pendingSettings->Pending_Active_From=='0000-00-00' ? 0 : 1; // begin transaction $transaction = Yii::app()->db->beginTransaction(); try { $payment = new ServicePayments(); $payment->Client_ID = $clientID; $payment->Payment_Date = $date; $payment->Payment_Amount = $amount; $payment->Payment_Amount = $paydoc_number; if ($payment->validate()) { // save payment $payment->save(); //echo "Payment validated and saved\n"; $dateFrom = $currentSettings->Active_To; if ($dateFrom < date('Y-m-d')) { $dateFrom = date('Y-m-d'); } // apply new settings if necessary if ($pendingSettings && $amount >= $pendingSettings->Fee_To_Upgrade && !$monthly_payment && !$settings_are_delayed) { $currentSettings->Service_Level_ID = $pendingSettings->Service_Level_ID; $currentSettings->Additional_Users = $pendingSettings->Additional_Users-$sum_settings['Users_Count']; $currentSettings->Additional_Projects = $pendingSettings->Additional_Projects;//-$sum_settings['Projects_Count']; $currentSettings->Additional_Storage = $pendingSettings->Additional_Storage;//-$sum_settings['Storage_Count']; $currentSettings->Active_To = $pendingSettings->Pending_Active_To; $currentSettings->Fee = $pendingSettings->Fee; $currentSettings->save(); $user_client_settings = $client->service_settings; $user_tier_settings = TiersSettings::agregateTiersSettings($user_client_settings->Service_Level_ID); Yii::app()->user->setState('tier_settings', $user_tier_settings); // $amount -= $pendingSettings->getCurrentAmountToUpgrade($dateFrom); $pendingSettings->delete(); } if ($pendingSettings && $amount >= $pendingSettings->Fee_To_Upgrade && !$monthly_payment && $settings_are_delayed) { /// DelayedClientServiceSettings::createDelayedFromPending($pendingSettings,$clientID,$sum_settings['Users_Count'], $sum_settings['Projects_Count'],$sum_settings['Storage_Count'] ); /* $dcss->Additional_Users = $pendingSettings->Additional_Users-$sum_settings['Users_Count']; $dcss->Additional_Projects = $pendingSettings->Additional_Projects-$sum_settings['Projects_Count']; $dcss->Additional_Storage = $pendingSettings->Additional_Storage-$sum_settings['Storage_Count'];*/ } // update Active_To date if ( $monthly_payment) { /*$addDays = ceil($amount/($currentSettings->Fee/self::DEFAULT_DAYS_IN_MONTH)); $dateOb = date_create($dateFrom); date_add($dateOb, date_interval_create_from_date_string($addDays . ' days')); $activeTo = date_format($dateOb, 'Y-m-d');*/ $number_of_periods = floor($amount/$currentSettings->Fee); $activeTo = strtotime(date("m/d/Y", strtotime($dateFrom)) . " +".$number_of_periods." month"); $currentSettings->Active_To = date('Y-m-d',$activeTo); $currentSettings->save(); if ( $pendingSettings ) { //we need to update active_to date in the pending settings. $pendingSettings->Pending_Active_To = date('Y-m-d',$activeTo); $pendingSettings->save(); } } $transaction->commit(); //variables for email notification, not for logic $email=$user->person->Email; $settingsAfter = "Level : ".$currentSettings->Service_Level_ID." Users:".$currentSettings->Additional_Users." Projects:".$currentSettings->Additional_Projects." Storage : ". $currentSettings->Additional_Storage; $dateAfter=date_format(date_create($currentSettings->Active_To),'Y-m-d'); $tierNameAfter=ServiceLevelSettings::model()->findByPk($currentSettings->Service_Level_ID)->Tier_Name; $company_name=$client->company->Company_Name; Mail::notifyAdminAboutStripePaymentExecuted($email,$company_name,$settingsBefore,$settingsAfter,$tierNameBefore,$tierNameAfter,$dateBefore,$dateAfter,$sumToPay); } else { Yii::app()->user->setFlash('error', "ServicePayments validation error!"); } } catch(Exception $e) { $transaction->rollback(); } } }
/** * Update company service level and add payment */ public function actionUpdateCompanyServiceLevel() { if (isset($_POST['ClientServiceSettings']) && is_array($_POST['ClientServiceSettings']) && isset($_POST['Tiers']) && is_array($_POST['Tiers']) ) { $client_id = intval($_POST['ClientServiceSettings']['Client_ID']); $css = ClientServiceSettings::model()->findByPk($client_id); $pcss = PendingClientServiceSettings::model()->findByPk($client_id); if ($pcss) {$pending_fee = $pcss->Fee;} $client = $css->client; //1) add payment $amount = floatval($_POST['add_payment_amount']); $date = trim($_POST['add_payment_date']); $number = trim($_POST['add_payment_number']); $date = Helper::checkDate($date); $users = intval($_POST['ClientServiceSettings']['Additional_Users']); $projects = intval($_POST['ClientServiceSettings']['Additional_Projects']); $storage = intval($_POST['ClientServiceSettings']['Additional_Storage']); $min_max_is_valid = ClientServiceSettings::CheckMinMaxValues($users,$projects,$storage); if ($min_max_is_valid) { if ($client && $amount > 0 && preg_match('/^\d{4}\-\d{2}\-\d{2}$/', $date)) { $result = ServicePayments::addJustPayment($client_id, $amount, $date,$number,''); } } //2) update settings if ($css && $client && $min_max_is_valid) { $_POST['ClientServiceSettings']['Active_To'] = Helper::checkDate($_POST['ClientServiceSettings']['Active_To']); $css->setAttributes($_POST['ClientServiceSettings']); //$css->Additional_Storage--; //$companyServiceSettings->Service_Level_ID = implode(',',$_POST['Tiers']); //$fee = ClientServiceSettings::Calculation($css->Additional_Users,$css->Additional_Projects,$css->Additional_Storage,$css->Active_To,$css->Service_Level_ID,$client_id); //new settings and prices $base_fee_new = ClientServiceSettings::CalculateBaseFee(explode(',',$css->Service_Level_ID)); $add_fee_new = ClientServiceSettings::CalculateAddFee($css->Additional_Users,$css->Additional_Projects,$css->Additional_Storage); $fee = $base_fee_new + $add_fee_new; $css->Additional_Storage--; /**$fee = $amount ? $amount : ClientServiceSettings::getFeeByValues( $companyServiceSettings->Service_Level_ID, $companyServiceSettings->Additional_Users, $companyServiceSettings->Additional_Projects, $companyServiceSettings->Additional_Storage ); */ //$periods = Helper::calculatePeriodsBetweenDates(date('m/d/Y'),$companyServiceSettings->Active_To); $css->Fee = $fee; //* $periods; if ($css->validate()) { $css->save(); if ($pcss) $pcss->delete(); if ($css->Active_To >= date('Y-m-d') && $client->Client_Status == Clients::NOT_ACTIVE) { $client->activate(); } $user_client_settings = $client->service_settings; $user_tier_settings = TiersSettings::agregateTiersSettings($user_client_settings->Service_Level_ID); Yii::app()->user->setState('tier_settings', $user_tier_settings); } } Yii::app()->user->setFlash('success', "Settings added"); $this->redirect('/admin?tab=service'); } }
/** * Returns aggregate settings for comma separated tiers ids * @param $tiers * @return null */ public static function agregateTiersSettings ($tiers){ $tiers_ids = explode(',',$tiers); $sum_settings_array = null; foreach ($tiers_ids as $tier_id) { if ($sum_settings_array) { //concatenation here $next_settings_array = TiersSettings::model()->findByAttributes(array( 'Tier_ID'=> $tier_id ))->attributes; foreach ($next_settings_array as $field_name=>$value) { if ($value) { $sum_settings_array[$field_name] = array_merge( $sum_settings_array[$field_name], array_diff( explode(',',$value), $sum_settings_array[$field_name] ) ); } } } else { $settings = TiersSettings::model()->findByAttributes(array( 'Tier_ID'=> $tier_id ))->attributes; $settings = $settings ? $settings : array(); foreach ($settings as $field_name=>$value) { if ($value) { $sum_settings_array[$field_name] = explode(',',$value); } else { $sum_settings_array[$field_name] = array(); } } } } //this param is html that used for dropdown in upload page $sum_settings_array['docsHtml']= self::htmlListFromArray($sum_settings_array['docs']); return $sum_settings_array; }