public static function Calculation($users,$projects,$storage,$active_to,$tiers_str,$client_id,$active_from='') {

        $css = ClientServiceSettings::model()->findByPk($client_id);
        if ($css->CheckMinMax($users,$projects,$storage)) {

            $tiers_str_before = $css->Service_Level_ID;
            $tiers_arr_before = explode(',',$tiers_str_before);
            //we need to divide inputted settings into base and additional
            $base_level_settings_before = ClientServiceSettings::getBaseTierValues($tiers_arr_before);
            $base_level_settings_after = ClientServiceSettings::getBaseTierValues(explode(',',$tiers_str));

            $levels_check_sum_before = ClientServiceSettings::getLevelsCheckSum($tiers_arr_before);
            $levels_check_sum_after = ClientServiceSettings::getLevelsCheckSum(explode(',',$tiers_str));

            $count_sum_before = $css->Additional_Users + $css->Additional_Projects + $css->Additional_Storage + $base_level_settings_before['Users_Count'] + $base_level_settings_before['Projects_Count'] + $base_level_settings_before['Storage_Count'] + $levels_check_sum_before;
            $count_sum_after = $users + $projects + $storage + $levels_check_sum_after;// + $base_level_settings_after['Users_Count'] + $base_level_settings_after['Projects_Count'] + $base_level_settings_after['Storage_Count'];
            $service_level_grown =($count_sum_after > $count_sum_before) ? 1 : 0;
            $active_to_date_changed = (strtotime($css->Active_To)< strtotime($active_to)) ? 1 : 0;
            $service_level_grown = $active_to_date_changed ? 1 : $service_level_grown;

            $base_fee_after = ClientServiceSettings::CalculateBaseFee(explode(',',$tiers_str));

            //extra(additional)
            $add_users = intval($users) - $base_level_settings_after['Users_Count'];//- $css->Additional_Users ;
            $add_users = ( $add_users > 0 ) ? $add_users : 0;

            $add_projects = $projects - $base_level_settings_after['Projects_Count'];//-$css->Additional_Projects ;
            $add_projects = ( $add_projects > 0 ) ? $add_projects : 0;

            $add_storage = $storage - $base_level_settings_after['Storage_Count'];//-$css->Additional_Storage ;
            $add_storage = ( $add_storage > 0 ) ? $add_storage : 0;

            $add_fee = $add_users * $base_level_settings_after['Max_Add_User_Fee'] + $add_projects * $base_level_settings_after['Max_Add_Project_Fee'] + $add_storage * $base_level_settings_after['Max_Add_Storage_Fee'];
            $new_monthly_price = $base_fee_after + $add_fee;

            $old_add_fee  = $css->Additional_Users * $base_level_settings_after['Max_Add_User_Fee'] + $css->Additional_Projects * $base_level_settings_after['Max_Add_Project_Fee'] + $css->Additional_Storage * $base_level_settings_after['Max_Add_Storage_Fee'];
            $add_fee_changed = $old_add_fee -$add_fee;
            $old_monthly_price = $css->Fee;

            //1) If active_to changed, we need to calculate how many months(periods)
            $periods_for_current = Helper::calculatePeriodsBetweenDates(date('m/d/Y',strtotime($css->Active_To)),$active_to);
            $periods_for_added = Helper::calculatePeriodsBetweenDates(date('m/d/Y'),$active_to);

            //2) Multiply changes on the amount of periods
            $changed_fee = round(floatval($new_monthly_price) - floatval($old_monthly_price),2)*$periods_for_added;
            $changed_fee = ($changed_fee > 0) ? $changed_fee : 0;

            //for cases when period changed and additional settings changed
            if (!$active_from && $active_to_date_changed) {
                $changed_fee = $changed_fee + $new_monthly_price*$periods_for_current;
            }

            return array(
                'new_monthly_price'=>$new_monthly_price,
                'changed_fee'=>$changed_fee,
                'periods'=>$periods,
                'service_level_grown'=>$service_level_grown,
                'add_users'=>$add_users,
                'add_projects'=>$add_projects,
                'add_storage'=>$add_storage,

            );

        } else {
            return false;
        }


    }
                        'items'=> $items,
                        'level_ids'=>$level_ids,
                        'summary_sl_settings'=>$summary_sl_settings
                    ));
                ?></td>
                <td id="set_count_users"><?php echo $summary_sl_settings['Users_Count'];?></td>
                <td id="set_count_projects"><?php echo $summary_sl_settings['Projects_Count'];?></td>
                <td id="set_count_storage"><?php echo $summary_sl_settings['Storage_Count'];?></td>
                <td id="set_base_fee"><?php echo number_format($summary_sl_settings['Base_Fee'], 2);?></td>
            </tr>

            <tr>
                <td>Added</td>
                <?php
                    $tiers_str = $summary_sl_settings['Tiers_Str'];
                    $base_level_settings = ClientServiceSettings::getBaseTierValues(explode(',',$tiers_str));
                ?>
                <td><?php echo CHtml::activeTextField($settings, "Additional_Users", array(
                        'class' => 'input_in_grid qty_cell',
                        'disabled' =>(Yii::app()->user->id=='db_admin') ? false : true,
                        'style'=>'background:'.(Yii::app()->user->id=='db_admin' ? 'white' : ''),
                        'data-fee' => $base_level_settings['Max_Add_User_Fee'],
                        'maxlength'=>3
                    ));?></td>
                <td><?php echo CHtml::activeTextField($settings, "Additional_Projects", array(
                        'class' => 'input_in_grid qty_cell',
                        'disabled' =>(Yii::app()->user->id=='db_admin') ? false : true,
                        'style'=>'background:'.(Yii::app()->user->id=='db_admin' ? 'white' : ''),
                        'data-fee' => $base_level_settings['Max_Add_Project_Fee'],
                        'maxlength'=>3
                    ));?></td>
Beispiel #3
0
                    /**
     * 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();
            }
        }
    }