/** * Возвращает текущую максимальную цену * @return float */ public function getCurrentMaxPrice() { $current_max_pricing_grid_column_id = $this->purchase->getCurrentMaxPricingGridColumnId(); $price_obj = \DB::table('prices')->where('product_id', '=', $this->getProduct()->id)->where('column_id', '=', $current_max_pricing_grid_column_id)->first(); if (!$price_obj) { \App\Helpers\Assistant::exception("Не указана цена для продукта {$this->getProduct()->id} в колонке {$current_max_pricing_grid_column_id}"); return 0; } return $price_obj->price; }
/** * Возвращает модели ценовых колонок в порядке роста цен, предварительно проверив корректность ценовых диапазонов * @return array * @throws \Exception */ public function columns() { $columns_models = $this->hasMany('\\App\\Models\\PricingGridColumnModel', 'pricing_grid_id')->orderBy('min_sum'); if (!$columns_models->count()) { return []; } $columns_models_arr = []; $last_max_sum = 0; foreach ($columns_models->get() as $column_model) { $current_min_sum = doubleval($column_model->min_sum); $current_max_sum = doubleval($column_model->max_sum); if ($current_min_sum >= $current_max_sum) { \App\Helpers\Assistant::exception('Неверные значения цен (>=) в колонке ID#' . $column_model->id . ' для ценовой сетки ID#' . $this->id); } if ($current_min_sum != $last_max_sum) { // \App\Helpers\Assistant::exception('Неверные значения цен (!=) в колонке ID#' . $column_model->id . ' для ценовой сетки ID#' . $this->id); } $last_max_sum = $current_max_sum; $columns_models_arr[] = $column_model; } return $columns_models_arr; }
/** * Возвращает текущую максимальную цену * @param $purchase_id * @return float * @throws \Exception */ public function getCurrentMaxPriceForPurchase($purchase_id) { $purchase = \App\BusinessLogic\Models\Purchase::find($purchase_id); \App\Helpers\Assistant::assertModel($purchase); $current_max_pricing_grid_column_id = $purchase->getCurrentMaxPricingGridColumnId(); $price_obj = \DB::table('prices')->where('product_id', '=', $this->id)->where('column_id', '=', $current_max_pricing_grid_column_id)->first(); if (!$price_obj) { \App\Helpers\Assistant::exception("Не указана цена для продукта {$this->id} в колонке {$current_max_pricing_grid_column_id}"); return 0; } return doubleval($price_obj->price); }
/** * Вычисляет текущую максимальную колонку и общую сумму заказов */ protected function calculateCurrentMaxPricingGridColumnIdAndOrdersTotalSum() { $orders_total_sum_matrix = $this->getOrdersTotalSumMatrix(); $pricing_grid_columns_models_arr = $this->getPricingGridColumns()->get(); if (!$pricing_grid_columns_models_arr) { \App\Helpers\Assistant::exception("Не назначено ни одной ценовой колонки для закупки {$this->id}"); } /** * @var $pricing_grid_column_model \App\Models\PricingGridColumnModel */ foreach ($pricing_grid_columns_models_arr as $pricing_grid_column_model) { if ($pricing_grid_column_model->maxSumInclusive()) { if ($orders_total_sum_matrix[$pricing_grid_column_model->id] > $pricing_grid_column_model->maxSum()) { continue; } } else { if ($orders_total_sum_matrix[$pricing_grid_column_model->id] >= $pricing_grid_column_model->maxSum()) { continue; } } $this->current_max_pricing_grid_column_id = $pricing_grid_column_model->id; $this->orders_total_sum = $orders_total_sum_matrix[$pricing_grid_column_model->id]; break; } }