Функция calculate discount должна выбрасывать ошибку если ее аргументы не числа

Я пытаюсь создать динамическую меру, которая использует в качестве входных данных срез даты. Я хочу, чтобы цена МИН. Даты, выбранной с помощью слайсера даты, использовалась в качестве ориентира для расчета изменения цены. Вот моя таблица ввода: Дата__________Цена ______Производительность 13.03.20...

Я пытаюсь создать динамическую меру, которая использует в качестве входных данных срез даты. Я хочу, чтобы цена МИН. Даты, выбранной с помощью слайсера даты, использовалась в качестве ориентира для расчета изменения цены.

Вот моя таблица ввода:

Дата__________Цена ______Производительность
13.03.2008 ______ 5 ________ 0,00%
14.03.2008 ______ 5 ________ 0,00%
18.03.2008 ______ 5 ________ 0,00%
19.03.2008 ______ 5 ________ 0,00%
20.03.2008 ______ 5 ________ 0,00%
25.03.2008 ______ 5,001 ____ 0,02%
26.03.2008 ______ 5,054 ____ 1,08%
27.03.2008 ______ 5,036 ____ 0,72%
28.03.2008 ______ 5,046 ____ 0,92%
31.03.2008 ______ 5,047 ____ 0,94%
01.04.2008 ______ 5,022 ____ 0,44%

Сценарий:
Итак, в этом сценарии нижняя граница среза даты — 13 марта 2008 г. и будет использовать 5 в качестве контрольной цены для расчета производительности соответственно.

Однако, когда я изменяю нижнюю границу среза даты на 26/03/2008, я хочу, чтобы в качестве нового эталона использовалось 5,054, и, соответственно, производительность должна быть 0,00% в этой строке, а во всех последующих строках ниже должна использоваться цена от 26/03. / 2008 в качестве эталона и соответственно рассчитать их производительность.

Конечная цель, которая у меня есть, — создать визуализацию динамической линейной диаграммы, которая показывает развитие производительности, начиная с нижней границы.

DynamicPerformance :=
VAR vbenchmark = 
    CALCULATE(
        SELECTEDVALUE('Input Data'[Price]), 
        'Input Data'[NAV_Date] = 
            CALCULATE(
                min('Input Data'[NAV_Date]), 
                ALLSELECTED('Input Data')
            )
    )
RETURN
AVERAGE('Input Data'[Price]) / vbenchmark  

Однако я продолжаю получать следующее сообщение об ошибке:

Функция CALCULATE использовалась в выражении True / False, которое используется как выражение табличного фильтра. Это запрещено.)

Любая помощь очень ценится! MLU

Функция CALCULATE позволяет использовать только простые выражения True / False в качестве аргумента фильтра. Вы не можете поместить туда другое выражение CALCULATE.

Одно простое решение — предварительно рассчитать эту дату и сохранить ее как переменную:

DynamicPerformance :=
VAR vdate =
    CALCULATE ( MIN ( 'Input Data'[NAV_Date] ), ALLSELECTED ( 'Input Data' ) )
VAR vbenchmark =
    CALCULATE (
        SELECTEDVALUE ( 'Input Data'[Price] ),
        'Input Data'[NAV_Date] = vdate
    )
RETURN
    AVERAGE ( 'Input Data'[Price] ) / vbenchmark


3

Alexis Olson
17 Мар 2020 в 00:15

1. Сложить два числа

В этом задании необходимо сложить два числа. Функция в качестве аргументов может принимать как положительное или отрицательное число, так и строку, в которой содержится число
(например, «12»).
Если переданная строка содержит не только цифры, то функция должна вернуть NaN. Например, нельзя сложить строку «12 бегемотов» и строку «38 попугаев».
Подсказка
Для решения задачи рекомендуем познакомиться с исключениями, а также методами parseInt, NaN и Number.

2. Проверка времени на корректность

В этом задании необходимо проверить, что числа составляют корректное время.

  • Гарантируется, что в функцию передаются два целых числа.
  • Часы мы считаем правильными, если они находятся в диапазоне [0, 23].
  • Минуты мы считаем правильными, если они находятся в диапазоне [0, 59]. Если часы и минуты правильные, то возвращаем ‘true’, иначе — ‘false’.

3. Добавление интервала ко времени

В этом задании необходимо реализовать функцию, которая увеличивает время на заданное количество минут.
На вход функция принимает 3 параметра: часы, минуты, интервал в минутах, на который нужно изменить время.

  • Гарантируется, что любой из 3 параметров целое положительное число.
  • Параметр часы принимает значение в диапазоне [0, 23].
  • Параметр минуты принимает значение в диапазоне [0, 59].
  • Прибавляемый интервал может быть больше 60 минут.
  • Переход в следующие сутки должен корректно обрабатываться.
  • Функция должна возвращать корректно отформатированное время: 1:2 –> 01:02

Подсказки

  • Для выполнения этого задания могут понадобиться методы глобального объекта Math. Например, метод floor.
  • При реализации рекомендуем внимательно проверить все краевые случаи: именно там допускается большинство ошибок.

4. Список хештегов

В этом задании необходимо вернуть список хештегов, которые содержатся в твите. Строка содержит только буквы русского и латинского алфавита, знак решетки и пробелы.

  • Гарантируется, что в функцию передается непустая строка.
  • Слова в строке разделены одним пробелом.
  • Хештег начинается со знака решетки (#) и состоит из одного слова.
  • В результирующем массиве хештеги должны быть без решетки.
  • Если в слове хештегов нет, то возвращается пустой массив.

Подсказка

Для выполнения этого задания может понадобиться метод строки split.

5. Уникальный список хештегов

В этом задании необходимо убрать повторения из списка хештегов и привести их к нижнему регистру. Результатом должна быть строка.
Хештеги в строке должны быть разделены запятой и пробелом: tag1, tag2, tag3.

  • Гарантируется, что массив содержит только хештеги.
  • Массив может быть пустым. В этом случае должна вернуться пустая строка.
  • Хештег — непустая строка, состоящая из одного слова.
  • Повторяющиеся хештеги нужно игнорировать.
  • При сравнении хештегов следует игнорировать регистр букв.
  • Порядок хештегов из исходного массива должен сохраниться.

Подсказка

Для выполнения этого задания может понадобиться метод массива join.

6. Телефонная книга

В этом задании необходимо реализовать функцию, через которую можно управлять телефонной книгой.
Для управления телефонной книгой нужно реализовать три команды:

  • ADD — добавляет контакт
  • REMOVE_PHONE — удаляет номер
  • SHOW — возвращает содержимое телефонной книги
    Гарантируется, что функция будет вызываться корректно, только со списком перечисленных команд. Корректность входных данных проверять не нужно.
    Имя команды пишется большими буквами, параметры разделяются одним пробелом.
    Гарантируется уникальность добавляемых телефонов.

Команда ADD

Добавляет контакт в телефонную книгу со списком телефонов. Телефоны перечисляются через запятую.
Если такой контакт существует, то команда пополняет список телефонов контакта.

Команда REMOVE_PHONE

Удаляет телефон из телефонной книги. Если телефон успешно удалён, то функция должна вернуть true.
Если такого телефона в телефонной книге не существует, то возвращается false.

Команда SHOW

Возвращает массив контактов с их телефонами. Массив содержит строчки вида: «Имя: Телефон1, Телефон2».
Массив должен быть отсортирован по имени контакта. Телефоны идут в порядке добавления их в телефонную книгу. Контакт с пустым списком телефонов не должен возвращаться.

Подсказка

В этой задаче удобно разбить операции над телефонной книгой на отдельные функции. Их следует вызывать для конкретной операции.
При использовании такой декомпозиции важно не забыть вернуть результат выполнения функции. Иначе основная функция будет возвращать undefined.

7. Управление временем

В этом задании необходимо реализовать дополнительные функции для управления временем.
В функцию всегда передается строка в правильном и полном формате. Дополнительных проверок не требуется.
Формат даты — «YYYY‒MM‒DD HH:SS», где YYYY — год, MM — месяц, DD — день, HH — час, SS — минуты

В функции add/subtract всегда передается целое число

Гарантируется, что после всех манипуляций получится корректная дата, которая будет не ранее 1 января 2000 года

Функции add/subtract

Каждая функция принимает первым аргументом количество единиц, на которое нужно изменить дату, а вторым — единицу измерения.

Можно менять следующие значения: years (годы), months (месяцы), days (дни), hours (часы), minutes (минуты)

Обработка ошибок

Если первый аргумент отрицательный, либо второй содержит неизвестную единицу измерения, функции должны выбросить исключение TypeError.

Подсказки

Решение задания не требует использования регулярных выражений, но с ними реализация может быть лаконичнее.

Даты

В реализации советуем использовать объект Date. В нём реализован правильный переход через месяц, год, час.
Обратите внимание, что нумерация месяцев идет с «0»

Регулярные выражения

При использовании регулярных выражений полезно прочитать документацию. Обратите внимание на символьный класc «d», сопоставляемый с числом и на кванитификаторы «{}», через которые удобно указать точное количество символов
Для разбора строки, может пригодиться строковый метод match.

Реализация интерфейса

Для реализации рекомендуемого интерфейса необходимо из функции date вернуть объект с методами. Чтобы эти методы можно было вызывать цепочкой, из каждого метода нужно возвращать сам объект.

8. Выборка элементов коллекции

В этом задании необходимо написать библиотеку, которая упростит работу с коллекцией однотипных объектов.

Для управления коллекцией нужно реализовать три функции:

  • query — функция, выполняющая запрос с заданными операциями;

  • select— операция выбора необходимых полей объектов;

  • filterIn— операция фильтрации объектов коллекции.

  • После выполнения функции ‘query’ не должна измениться исходная коллекция.

  • Если в функцию ‘query’ передать только коллекцию, то вернётся её копия.

  • Операция ‘select’ должна игнорировать несуществующие в объекте поля.

  • Несколько операций ‘select’ должны отработать как одна с пересечёнными аргументами. Например, если мы выбираем поля a и b, а затем b и c, то в результате должно выбраться только поле b.

  • Несколько операций ‘filterIn’ должны отработать как одна с пересечёнными аргументами. Например, если фильтруем поле по значениям a и b, а затем по b и c, то в результате отфильтроваться должно только по значени b.

  • Операции должны выполняться в определённом порядке. В первую очередь происходит фильтрация, а затем выборка полей. Таким образом, можно фильтровать коллекцию даже по тем полям, которые не указаны в функции select.

  • Порядок элементов после выполнения операций должен сохраниться.

  • Гарантируется, что функция ‘query’ будет вызываться корректно. Дополнительную проверку аргументов делать не нужно.

  • Предполагается, что поля объектов имеют значения типа String или Number.

Функция ‘query’

Выполняет запрос к коллекции. Принимает коллекцию и операции. Возвращает коллекцию после применения всех операций.
В качестве операций может быть использован ‘filterIn’, ‘select’.

lib.query(collection, operation1, operation2, ...);

Операция ‘select’

Позволяет выбрать определённые поля объектов коллекции. Принимает список полей.

lib.select('fieldName1', 'fieldName2', ...);

Операция ‘filterIn’

Позволяет отфильтровать коллекцию. Принимает название поля и допустимые значения.
После выполнения фильтрации должны остаться объекты, у которых поле имеет одно из допустимых значений.

lib.filterIn('fieldName', ['acceptedValue1', 'acceptedValue2', ...]);

Подсказка

К решению данной задачи есть два подхода:

  • Из функций select и filterIn можно возвращать названия операций с параметрами. И позже ориентироваться на них при выполнении функции query.
function select () {
    // var fields = ...
    
    return ['select', fields];
}
  • Из функции можно возвращать функции, в которые позже будет передана коллекция.
    Для определения порядка понадобится возвращать именнованные функции, чтобы позже по именам определить порядок выполнения.
function select () {
    // var fields = ...
    
    return function select(collection) {
        // ...
        
        return collection;
    }
}

9. Подписка на события

В этом задании необходимо реализовать библиотеку, позволяющую подписываться на события и получать по ним уведомления.

В библиотеке нужно реализовать три метода:

  • on — подписка на событие;
  • off — отписка от события;
  • emit — оповещение всех подписчиков.

Все функции будут вызываться корректно, дополнительных проверок не требуется.
Все функции должны возвращать объект, от которого вызваны (emitter), чтобы их можно было вызывать в цепочке (chaining):

emitter
  .on(...)
  .off(...)
  .emit(...)
  .on(...);

Метод ‘on’

Подписывает на событие. На любое событие подписчик может подписаться неограниченное количество раз.

emitter.on(eventName, subscriber, handler);
  • eventName — название события, на которое подписываемся.
  • subscriber — объект-подписчик.
  • handler — функция-обработчик.

Метод ‘off’

Отписывает от события подписчика. После отписки, при возникновении данного события, никаких обработчиков, связанных с этим подписчиком, не должно быть вызвано.
Есть возможность повторно подписаться и снова получать события.

emitter.off(eventName, subscriber);
  • eventName — название события, от которого отписываемся.
  • subscriber — объект-подписчик.

Метод ’emit’

Оповещение всех подписчиков (не отписавшихся). Вызывает все функции-обработчики в порядке подписки.

  • eventName — название события, о котором оповещаем подписчиков.

I encountered the error when I try to sign in my application mede by laravel 8.41.0 and PHP 8.0.3.

error

TypeError
count(): Argument #1 ($value) must be of type Countable|array, string given

location

vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/GuardsAttributes.php:235

file

<?php

namespace IlluminateDatabaseEloquentConcerns;

use IlluminateSupportStr;

trait GuardsAttributes
{
    /**
     * The attributes that are mass assignable.
     *
     * @var string[]
     */
    protected $fillable = [];

    /**
     * The attributes that aren't mass assignable.
     *
     * @var string[]|bool
     */
    protected $guarded = ['*'];

    /**
     * Indicates if all mass assignment is enabled.
     *
     * @var bool
     */
    protected static $unguarded = false;

    /**
     * The actual columns that exist on the database and can be guarded.
     *
     * @var array
     */
    protected static $guardableColumns = [];

    /**
     * Get the fillable attributes for the model.
     *
     * @return array
     */
    public function getFillable()
    {
        return $this->fillable;
    }

    /**
     * Set the fillable attributes for the model.
     *
     * @param  array  $fillable
     * @return $this
     */
    public function fillable(array $fillable)
    {
        $this->fillable = $fillable;

        return $this;
    }

    /**
     * Merge new fillable attributes with existing fillable attributes on the model.
     *
     * @param  array  $fillable
     * @return $this
     */
    public function mergeFillable(array $fillable)
    {
        $this->fillable = array_merge($this->fillable, $fillable);

        return $this;
    }

    /**
     * Get the guarded attributes for the model.
     *
     * @return array
     */
    public function getGuarded()
    {
        return $this->guarded === false
                    ? []
                    : $this->guarded;
    }

    /**
     * Set the guarded attributes for the model.
     *
     * @param  array  $guarded
     * @return $this
     */
    public function guard(array $guarded)
    {
        $this->guarded = $guarded;

        return $this;
    }

    /**
     * Merge new guarded attributes with existing guarded attributes on the model.
     *
     * @param  array  $guarded
     * @return $this
     */
    public function mergeGuarded(array $guarded)
    {
        $this->guarded = array_merge($this->guarded, $guarded);

        return $this;
    }

    /**
     * Disable all mass assignable restrictions.
     *
     * @param  bool  $state
     * @return void
     */
    public static function unguard($state = true)
    {
        static::$unguarded = $state;
    }

    /**
     * Enable the mass assignment restrictions.
     *
     * @return void
     */
    public static function reguard()
    {
        static::$unguarded = false;
    }

    /**
     * Determine if the current state is "unguarded".
     *
     * @return bool
     */
    public static function isUnguarded()
    {
        return static::$unguarded;
    }

    /**
     * Run the given callable while being unguarded.
     *
     * @param  callable  $callback
     * @return mixed
     */
    public static function unguarded(callable $callback)
    {
        if (static::$unguarded) {
            return $callback();
        }

        static::unguard();

        try {
            return $callback();
        } finally {
            static::reguard();
        }
    }

    /**
     * Determine if the given attribute may be mass assigned.
     *
     * @param  string  $key
     * @return bool
     */
    public function isFillable($key)
    {
        if (static::$unguarded) {
            return true;
        }

        // If the key is in the "fillable" array, we can of course assume that it's
        // a fillable attribute. Otherwise, we will check the guarded array when
        // we need to determine if the attribute is black-listed on the model.
        if (in_array($key, $this->getFillable())) {
            return true;
        }

        // If the attribute is explicitly listed in the "guarded" array then we can
        // return false immediately. This means this attribute is definitely not
        // fillable and there is no point in going any further in this method.
        if ($this->isGuarded($key)) {
            return false;
        }

        return empty($this->getFillable()) &&
            strpos($key, '.') === false &&
            ! Str::startsWith($key, '_');
    }

    /**
     * Determine if the given key is guarded.
     *
     * @param  string  $key
     * @return bool
     */
    public function isGuarded($key)
    {
        if (empty($this->getGuarded())) {
            return false;
        }

        return $this->getGuarded() == ['*'] ||
               ! empty(preg_grep('/^'.preg_quote($key).'$/i', $this->getGuarded())) ||
               ! $this->isGuardableColumn($key);
    }

    /**
     * Determine if the given column is a valid, guardable column.
     *
     * @param  string  $key
     * @return bool
     */
    protected function isGuardableColumn($key)
    {
        if (! isset(static::$guardableColumns[get_class($this)])) {
            static::$guardableColumns[get_class($this)] = $this->getConnection()
                        ->getSchemaBuilder()
                        ->getColumnListing($this->getTable());
        }

        return in_array($key, static::$guardableColumns[get_class($this)]);
    }

    /**
     * Determine if the model is totally guarded.
     *
     * @return bool
     */
    public function totallyGuarded()
    {
        return count($this->getFillable()) === 0 && $this->getGuarded() == ['*'];
    }

    /**
     * Get the fillable attributes of a given array.
     *
     * @param  array  $attributes
     * @return array
     */
    protected function fillableFromArray(array $attributes)
    {
        if (count($this->getFillable()) > 0 && ! static::$unguarded) {
            return array_intersect_key($attributes, array_flip($this->getFillable()));
        }

        return $attributes;
    }
}

Some questioners ask same question and I saw that in latest version of PHP count issue the error. But i could not understood how to resolve the problem, so please tell me where and how to fix in my file.

thanks for responses!!

$fillable is declared with squared brackets, all files is added in above.
How can I modify it?

model.php (only fillable related)

    public function fill(array $attributes)
    {
        $totallyGuarded = $this->totallyGuarded();

        foreach ($this->fillableFromArray($attributes) as $key => $value) {
            // The developers may choose to place some attributes in the "fillable" array
            // which means only those attributes may be set through mass assignment to
            // the model, and all others will just get ignored for security reasons.
            if ($this->isFillable($key)) {
                $this->setAttribute($key, $value);
            } elseif ($totallyGuarded) {
                throw new MassAssignmentException(sprintf(
                    'Add [%s] to fillable property to allow mass assignment on [%s].',
                    $key, get_class($this)
                ));
            }
        }

        return $this;
    }

appmodel user.php

<?php

namespace AppModels;

use IlluminateDatabaseEloquentFactoriesHasFactory;
use IlluminateDatabaseEloquentModel;

class user extends Model
{
    use HasFactory;
    protected $fillable = 'name';
}

I encountered the error when I try to sign in my application mede by laravel 8.41.0 and PHP 8.0.3.

error

TypeError
count(): Argument #1 ($value) must be of type Countable|array, string given

location

vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/GuardsAttributes.php:235

file

<?php

namespace IlluminateDatabaseEloquentConcerns;

use IlluminateSupportStr;

trait GuardsAttributes
{
    /**
     * The attributes that are mass assignable.
     *
     * @var string[]
     */
    protected $fillable = [];

    /**
     * The attributes that aren't mass assignable.
     *
     * @var string[]|bool
     */
    protected $guarded = ['*'];

    /**
     * Indicates if all mass assignment is enabled.
     *
     * @var bool
     */
    protected static $unguarded = false;

    /**
     * The actual columns that exist on the database and can be guarded.
     *
     * @var array
     */
    protected static $guardableColumns = [];

    /**
     * Get the fillable attributes for the model.
     *
     * @return array
     */
    public function getFillable()
    {
        return $this->fillable;
    }

    /**
     * Set the fillable attributes for the model.
     *
     * @param  array  $fillable
     * @return $this
     */
    public function fillable(array $fillable)
    {
        $this->fillable = $fillable;

        return $this;
    }

    /**
     * Merge new fillable attributes with existing fillable attributes on the model.
     *
     * @param  array  $fillable
     * @return $this
     */
    public function mergeFillable(array $fillable)
    {
        $this->fillable = array_merge($this->fillable, $fillable);

        return $this;
    }

    /**
     * Get the guarded attributes for the model.
     *
     * @return array
     */
    public function getGuarded()
    {
        return $this->guarded === false
                    ? []
                    : $this->guarded;
    }

    /**
     * Set the guarded attributes for the model.
     *
     * @param  array  $guarded
     * @return $this
     */
    public function guard(array $guarded)
    {
        $this->guarded = $guarded;

        return $this;
    }

    /**
     * Merge new guarded attributes with existing guarded attributes on the model.
     *
     * @param  array  $guarded
     * @return $this
     */
    public function mergeGuarded(array $guarded)
    {
        $this->guarded = array_merge($this->guarded, $guarded);

        return $this;
    }

    /**
     * Disable all mass assignable restrictions.
     *
     * @param  bool  $state
     * @return void
     */
    public static function unguard($state = true)
    {
        static::$unguarded = $state;
    }

    /**
     * Enable the mass assignment restrictions.
     *
     * @return void
     */
    public static function reguard()
    {
        static::$unguarded = false;
    }

    /**
     * Determine if the current state is "unguarded".
     *
     * @return bool
     */
    public static function isUnguarded()
    {
        return static::$unguarded;
    }

    /**
     * Run the given callable while being unguarded.
     *
     * @param  callable  $callback
     * @return mixed
     */
    public static function unguarded(callable $callback)
    {
        if (static::$unguarded) {
            return $callback();
        }

        static::unguard();

        try {
            return $callback();
        } finally {
            static::reguard();
        }
    }

    /**
     * Determine if the given attribute may be mass assigned.
     *
     * @param  string  $key
     * @return bool
     */
    public function isFillable($key)
    {
        if (static::$unguarded) {
            return true;
        }

        // If the key is in the "fillable" array, we can of course assume that it's
        // a fillable attribute. Otherwise, we will check the guarded array when
        // we need to determine if the attribute is black-listed on the model.
        if (in_array($key, $this->getFillable())) {
            return true;
        }

        // If the attribute is explicitly listed in the "guarded" array then we can
        // return false immediately. This means this attribute is definitely not
        // fillable and there is no point in going any further in this method.
        if ($this->isGuarded($key)) {
            return false;
        }

        return empty($this->getFillable()) &&
            strpos($key, '.') === false &&
            ! Str::startsWith($key, '_');
    }

    /**
     * Determine if the given key is guarded.
     *
     * @param  string  $key
     * @return bool
     */
    public function isGuarded($key)
    {
        if (empty($this->getGuarded())) {
            return false;
        }

        return $this->getGuarded() == ['*'] ||
               ! empty(preg_grep('/^'.preg_quote($key).'$/i', $this->getGuarded())) ||
               ! $this->isGuardableColumn($key);
    }

    /**
     * Determine if the given column is a valid, guardable column.
     *
     * @param  string  $key
     * @return bool
     */
    protected function isGuardableColumn($key)
    {
        if (! isset(static::$guardableColumns[get_class($this)])) {
            static::$guardableColumns[get_class($this)] = $this->getConnection()
                        ->getSchemaBuilder()
                        ->getColumnListing($this->getTable());
        }

        return in_array($key, static::$guardableColumns[get_class($this)]);
    }

    /**
     * Determine if the model is totally guarded.
     *
     * @return bool
     */
    public function totallyGuarded()
    {
        return count($this->getFillable()) === 0 && $this->getGuarded() == ['*'];
    }

    /**
     * Get the fillable attributes of a given array.
     *
     * @param  array  $attributes
     * @return array
     */
    protected function fillableFromArray(array $attributes)
    {
        if (count($this->getFillable()) > 0 && ! static::$unguarded) {
            return array_intersect_key($attributes, array_flip($this->getFillable()));
        }

        return $attributes;
    }
}

Some questioners ask same question and I saw that in latest version of PHP count issue the error. But i could not understood how to resolve the problem, so please tell me where and how to fix in my file.

thanks for responses!!

$fillable is declared with squared brackets, all files is added in above.
How can I modify it?

model.php (only fillable related)

    public function fill(array $attributes)
    {
        $totallyGuarded = $this->totallyGuarded();

        foreach ($this->fillableFromArray($attributes) as $key => $value) {
            // The developers may choose to place some attributes in the "fillable" array
            // which means only those attributes may be set through mass assignment to
            // the model, and all others will just get ignored for security reasons.
            if ($this->isFillable($key)) {
                $this->setAttribute($key, $value);
            } elseif ($totallyGuarded) {
                throw new MassAssignmentException(sprintf(
                    'Add [%s] to fillable property to allow mass assignment on [%s].',
                    $key, get_class($this)
                ));
            }
        }

        return $this;
    }

appmodel user.php

<?php

namespace AppModels;

use IlluminateDatabaseEloquentFactoriesHasFactory;
use IlluminateDatabaseEloquentModel;

class user extends Model
{
    use HasFactory;
    protected $fillable = 'name';
}

1

Проблема заключается в том что параметры при расчёте корзины и при оформлении заказа отличаются. В частности при оформлении заказа не приходит в параметр 

‘coupon_code’ => 

В моём случае это приводило к тому что корректно рассчитанная по API скидка после оформления заказа исчезала. 

2 комментария

  • популярные
  • новые


  • +1

    В версии Shop-Script 8.16 обнаружить такую проблему не удалось. В аргументе, который получает обработчик события order_calculate_discount, регистрируется массив, в котором в поле [‘order’][‘params’][‘coupon_code’] содержится введённый покупателем купон.

    Если у вас это не так, попробуйте описать ситуацию подробнее, по шагам. Если вы уверены, что в коде Shop-Script есть ошибка, пришлите нам в службу поддержки минимальный код плагина, который позволяет продемонстрировать эту ошибку, и порядок действий пользователя, который приводит к её проявлению.



    • +1

      Я делал это на версии 8.14.1 возможно что то изменилось с тех пор.

      	public function order_calculate_discount(&$params){
      	
      	//После какой то проверки возвращаю что введённый код подошел
      	$params['order']['params']['coupon_discount'] = 1;
      	
      	//сам код купона для обработки беру отсюда
      	$params['order']['params']['coupon_code'];
      	
      	//Применяю скиду соответствующую этому купону
      	return array(
                 'discount'    => $discount,		
      		);
      	}

      При расчёте всё ок но после оформления заказа скидка исчезала. Начал смотреть оказалось что  $params немного отличается (тот что при расчёте и тот что в финальном оформлении разные) из за этого и расчёт финальный меняется. В моём случае в финальном расчёте вообще не было 

      $params['order']['params']['coupon_code']

      Добавить комментарий

      #Руководства

      • 18 янв 2023

      • 0

      Показали, как работать с логическими функциями Excel: ИСТИНА, ЛОЖЬ, И, ИЛИ, НЕ, ЕСЛИ, ЕСЛИОШИБКА, ЕОШИБКА, ЕПУСТО.

      Иллюстрация: Merry Mary для Skillbox Media

      Ксеня Шестак

      Рассказывает просто о сложных вещах из мира бизнеса и управления. До редактуры — пять лет в банке и три — в оценке имущества. Разбирается в Excel, финансах и корпоративной жизни.

      Логические функции в Excel проверяют, выполняются ли заданные условия в выбранном диапазоне таблицы. Пользователь указывает критерии, которые нужно проверить, — функции проверяют эти критерии и выдают результат: ИСТИНА или ЛОЖЬ.

      Также логические функции используют в сложных расчётах для того, чтобы убрать промежуточные шаги вычисления и объединить несколько действий в одной ячейке. Это значительно сокращает время на обработку данных.

      В статье рассмотрим основные логические функции Excel — расскажем, для чего они нужны, и на примерах покажем, как они работают.

      • Функции ИСТИНА и ЛОЖЬ
      • Функции И и ИЛИ
      • Функция НЕ
      • Функция ЕСЛИ
      • Функция ЕСЛИОШИБКА
      • Функция ЕОШИБКА
      • Функция ЕПУСТО

      В конце расскажем, как узнать больше о работе в Excel.

      Функции ИСТИНА и ЛОЖЬ не используют самостоятельно — только внутри других логических функций. Они нужны, чтобы отмечать значения как истинные или ложные.

      Функция ИСТИНА возвращает только истинные значения. Её синтаксис: =ИСТИНА ().

      Функция ЛОЖЬ — возвращает только ложные значения. Её синтаксис: =ЛОЖЬ ().

      Функции И и ИЛИ нужны для того, чтобы показать связь между условиями пользователя. Они определяют, будут соблюдены все критерии или только некоторые из них.

      Функция И. Её используют, чтобы показать, что указанные число или текст должны соответствовать одновременно всем критериям. В этом случае функция возвращает значение ИСТИНА. Если один из критериев не соблюдается, функция И возвращает значение ЛОЖЬ.

      Синтаксис функции И такой: =И(логическое_значение1;логическое_значение2;…), где «логическое_значение» — критерии пользователя, которые функция будет проверять. Всего может быть до 255 критериев.

      Пример работы функции И. Проверим, соблюдены ли два условия:

      • число 662 больше 300;
      • число 8626 больше 9000.

      Для этого выберем любую ячейку и в строке формул введём: =И(A1>300;A2>9000),

      где А1 — ячейка с числом 662, А2 — ячейка с числом 8626.

      Нажмём Enter. Функция возвращает значение ЛОЖЬ — один из критериев не соблюдён (число 8626 < 9000).

      Функция И вернула значение ЛОЖЬ, так как один из критериев не соблюдён
      Скриншот: Excel / Skillbox Media

      Проверим другие критерии:

      • число 662 меньше 666;
      • число 8626 больше 5000.

      Снова выберем любую ячейку и в строке формул введём: =И(A1<666;A2>5000).

      Функция возвращает значение ИСТИНА — оба критерия соблюдены.

      Функция И вернула значение ИСТИНА, так как соблюдены оба критерия
      Скриншот: Excel / Skillbox Media

      Функция ИЛИ. Её используют, чтобы показать, что указанные число или текст должны соответствовать одному из критериев. Если хотя бы один критерий соблюдён, функция возвращает значение ИСТИНА. Если все критерии не соблюдены, функция ИЛИ возвращает значение ЛОЖЬ.

      Синтаксис функции ИЛИ: =ИЛИ(логическое_значение1;логическое_значение2;…).

      Максимальное количество логических значений (критериев) — тоже 255.

      Пример работы функции ИЛИ. Проверим три критерия:

      • число 662 меньше 666;
      • число 8626 больше 5000;
      • число 567 больше 786.

      В строке формул введём: =ИЛИ(A1<666; A2>5000;A3>786).

      Функция возвращает значение ИСТИНА, несмотря на то, что один критерий не соблюдён (число 567 < 786).

      Функция ИЛИ вернула значение ИСТИНА — соблюдены два критерия из трёх
      Скриншот: Excel / Skillbox Media

      Проверим другие критерии:

      • число 662 меньше 500;
      • число 8626 больше 9000;
      • число 567 больше 600.

      В строке формул введём: =ИЛИ(A1<500;A2>9000;A3>600).

      Функция возвращает значение ЛОЖЬ, так как ни один из критериев не соблюдён.

      Функция ИЛИ вернула значение ЛОЖЬ — все критерии не соблюдены
      Скриншот: Excel / Skillbox Media

      С помощью этой функции возвращают значения, которые противоположны по отношению к заданному параметру.

      Если в качестве параметра функции НЕ указать ложное значение — она вернёт значение ИСТИНА. Наоборот, если указать истинное значение, функция вернёт ЛОЖЬ.

      Синтаксис функции НЕ: =НЕ(логическое_значение), где «логическое_значение» — выражение, которое нужно проверить на соответствие значениям ИСТИНА или ЛОЖЬ. В этой функции можно использовать только одно такое выражение.

      Пример работы функции НЕ. Проверим выражение «662 меньше 500». Выберем любую ячейку и в строке формул введём: =НЕ(A1<500), где А1 — ячейка с числом 662.

      Нажмём Enter.

      Выражение «662 меньше 500» ложное. Но функция НЕ поменяла значение на противоположное и вернула значение ИСТИНА.

      Функция НЕ поменяла ложное значение на противоположное и вернула значение ИСТИНА
      Скриншот: Excel / Skillbox Media

      Функцию ЕСЛИ используют, когда нужно сравнить данные таблицы с критериями пользователя.

      У этой функции также два результата: ИСТИНА и ЛОЖЬ. Первый результат функция выдаёт, когда значение ячейки совпадает с заданным условием, второй — когда значение условию не соответствует.

      Например, если нужно определить в таблице значения меньше 1000, то значение 700 будет отмечено функцией как истинное, а значение 3500 — как ложное.

      Можно задавать несколько условий одновременно. Например, найти значения меньше 300, но больше 200. В этом случае функция определит значение 100 как ложное, а 250 — как истинное. Так можно проверять не только числовые значения, но и текст.

      Синтаксис функции ЕСЛИ: =ЕСЛИ(лог_выражение;значение_если_истина;значение_если_ложь), где:

      • лог_выражение — запрос пользователя, который функция будет проверять;
      • значение_если_истина — результат, который функция принесёт в ячейку, если значение совпадёт с запросом пользователя;
      • значение_если_ложь — результат, который функция принесёт в ячейку, если значение не совпадёт с запросом пользователя.

      Пример работы функции ЕСЛИ. Предположим, из столбца с ценами нам нужно выбрать значения до 2 млн рублей.

      Создадим отдельный столбец для результатов работы функции и выберем первую ячейку.

      Создаём отдельный столбец, куда функция ЕСЛИ принесёт результаты
      Скриншот: Excel / Skillbox Media

      В строке формул введём: =ЕСЛИ(A2<2000000;»Подходит»;»Не подходит»)

      В строке формул вводим параметры функции ЕСЛИ
      Скриншот: Excel / Skillbox Media

      Дальше нажимаем Enter и растягиваем результат из первой ячейки вниз до конца таблицы.

      Так выглядит результат работы функции ЕСЛИ
      Скриншот: Excel / Skillbox Media

      Функция показала, какие значения соответствуют условию «меньше 2000000», и отметила их как «Подходит». Значения, которые не соответствуют этому условию, отмечены как «Не подходит».

      В Skillbox Media есть статья, где подробно объясняли, как использовать функцию ЕСЛИ в Excel — в частности, как запустить функцию ЕСЛИ с несколькими условиями.

      Эту функцию используют, чтобы определить, есть ли ошибки в значениях таблицы или в формулах.

      Синтаксис функции ЕСЛИОШИБКА: =ЕСЛИОШИБКА(значение;значение_если_ошибка), где:

      • значение — выражение, которое нужно проверить;
      • значение_если_ошибка — текст, число или формула, которые будут выводиться или выполняться в случае, если в результате проверки аргумента «значение» получен результат ЛОЖЬ.

      Если ошибка есть, возвращается значение второго аргумента. Если ошибки нет — первого.

      Пример работы функции ЕСЛИОШИБКА. Предположим, нам нужно разделить значения ячеек столбца A на значения ячеек столбца B. Проверим, будут ли ошибки в этих выражениях.

      Выделим первую ячейку столбца C и введём: =ЕСЛИОШИБКА(A1/B1;»Ошибка в расчёте»)

      В строке формул вводим параметры функции ЕСЛИОШИБКА
      Скриншот: Excel / Skillbox Media

      Дальше нажмём Enter и растянем результат из первой ячейки вниз до конца таблицы.

      Результат работы функции ЕСЛИОШИБКА
      Скриншот: Excel / Skillbox Media

      В первой строке функция не нашла ошибок в выражении (360/60), поэтому провела расчёт и показала результат (6).

      Во второй строке функция тоже не нашла ошибок (деление 0 на 76) — и показала результат расчёта (0).

      В третьей строке функция нашла ошибку — делить на 0 нельзя. Поэтому вместо результата расчёта показала второй аргумент функции: «Ошибка в расчёте».

      Эта функция проверяет, не содержат ли заданные ячейки ошибочных значений:

      • #Н/Д
      • #ЗНАЧ
      • #ЧИСЛО!
      • #ДЕЛ/0!
      • #ССЫЛКА!
      • #ИМЯ?
      • #ПУСТО!

      Синтаксис функции ЕОШИБКА: =ЕОШИБКА(значение), где «значение» — ячейка или диапазон ячеек, которые нужно проверить.

      Если функция находит ошибочные значения — возвращает значение ИСТИНА. Если не находит — возвращает значение ЛОЖЬ.

      Пример работы функции ЕОШИБКА. Обычно функцию ЕОШИБКА применяют в работе с большими диапазонами, где искать ошибочные значения самостоятельно долго и энергозатратно. Но для примера покажем, как она работает на небольшом диапазоне.

      Выберем любую ячейку, в которой функция должна будет вывести результат. В строке формул введём: =ЕОШИБКА(A1:A6), где A1:A6 — диапазон, который нужно проверить.

      В строке формул вводим параметры функции ЕОШИБКА
      Скриншот: Excel / Skillbox Media

      Нажимаем Enter — функция возвращает значение ИСТИНА. Это значит, что она нашла ошибку в выделенном диапазоне.

      Результат работы функции ЕОШИБКА
      Скриншот: Excel / Skillbox Media

      Дальше эту функцию используют для выполнения других действий.

      Например, при возникновении ошибки можно использовать функцию ЕОШИБКА в сочетании с функцией ЕСЛИ: =ЕСЛИ( ЕОШИБКА(B1);»Произошла ошибка»;B1*6).

      Эта формула проверит наличие ошибки в ячейке B1. При возникновении ошибки функция ЕСЛИ возвращает сообщение «Произошла ошибка». Если ошибки отсутствуют, функция ЕСЛИ вычисляет произведение B1*6.

      Функция ЕПУСТО проверяет, есть ли в выбранных ячейках какие-либо значения или эти ячейки пустые. Если ячейка пустая, функция возвращает значение ИСТИНА, если в ячейке есть данные — ЛОЖЬ.

      Синтаксис функции ЕПУСТО: =ЕПУСТО(значение), где значение — ячейка или диапазон ячеек, которые нужно проверить.

      Пример работы функции ЕОШИБКА. Так же как и предыдущую функцию, ЕПУСТО есть смысл применять при работе с большими диапазонами, где самостоятельно искать пустые ячейки слишком долго. Но для примера покажем, как она работает на небольшом диапазоне.

      Выберем любую ячейку и в строке формул введём: =ЕПУСТО(A1:A6), где A1:A6 — диапазон, который нужно проверить.

      В строке формул вводим параметры функции ЕПУСТО
      Скриншот: Excel / Skillbox Media

      Нажимаем Enter — функция возвращает значение ИСТИНА. Это значит, что она нашла пустую ячейку в выделенном диапазоне.

      Результат работы функции ЕПУСТО
      Скриншот: Excel / Skillbox Media

      Как и в случае с функцией ЕОШИБКА, эту функцию можно использовать для выполнения других действий. Например, в сочетании с функцией ЕСЛИ.

      • В Excel много функций, которые упрощают и ускоряют работу с таблицами. В этой подборке перечислили 15 статей и видео об инструментах Excel, необходимых в повседневной работе.
      • В Skillbox есть курс «Excel + Google Таблицы с нуля до PRO». Он подойдёт как новичкам, которые хотят научиться работать в Excel с нуля, так и уверенным пользователям, которые хотят улучшить свои навыки. На курсе учат быстро делать сложные расчёты, визуализировать данные, строить прогнозы, работать с внешними источниками данных, создавать макросы и скрипты.
      • Кроме того, Skillbox даёт бесплатный доступ к записи онлайн-интенсива «Экспресс-курс по Excel: осваиваем таблицы с нуля за 3 дня». Он подходит для начинающих пользователей. На нём можно научиться создавать и оформлять листы, вводить данные, использовать формулы и функции для базовых вычислений, настраивать пользовательские форматы и создавать формулы с абсолютными и относительными ссылками.

      Другие материалы Skillbox Media по Excel

      Учись бесплатно:
      вебинары по программированию, маркетингу и дизайну.

      Участвовать

      Научитесь: Excel + Google Таблицы с нуля до PRO
      Узнать больше

      Понравилась статья? Поделить с друзьями:
    • Функциональные стили речи общая характеристика смешение стилей как лексико стилистическая ошибка
    • Функциональная ошибка это
    • Функционал ошибки машинное обучение
    • Функции руководства типичные ошибки руководителя
    • Функции клавиатуры ноутбука как изменить