private static function MaterialDo(&$Material, &$Matlog, $row) { $result = false; // Присваиваем значения свойств материальной ценности из Excel в массив атрибутов $xls_attributes_material = self::xls_attributes_material($row); // Проверяем, что ТипНоменклатуры Материалов принадлежат к "Продукты питания" или "Прочие материальные запасы" $material_assigned = self::$os || !self::$os && in_array($xls_attributes_material['material_tip_nomenklaturi'], ['Продукты питания', 'Прочие материальные запасы']) ? true : false; if ($material_assigned) { // Находим материальную ценность в базе по коду 1С, если не находим создаем новую запись $find_ar = Material::model()->Find('material_1c = :material_1c', [':material_1c' => $xls_attributes_material['material_1c']]); if ($find_ar !== null) { $Material = $find_ar; } self::$material_number_xls = $xls_attributes_material['material_number']; self::$material_price_xls = $xls_attributes_material['material_price']; // Если материальная ценность найдена if (!$Material->isNewRecord) { $Material->material_price = floatval($Material->material_price); // т.к. $Material->material_price = "~.00" $Material->material_number = floatval($Material->material_number); // т.к. $Material->material_number = "1.000" // Убераем атрибуты, чтобы он не попали в $diff_attr unset($xls_attributes_material['material_tip_nomenklaturi']); unset($xls_attributes_material['material_number']); unset($xls_attributes_material['material_price']); // Массив заполняется измененными значениями атрибутов материальной ценности $diff_attr = array_diff_assoc($xls_attributes_material, $Material->attributes); } // Если новая запись или произошли изменения в текущей if ($Material->isNewRecord || count((array) $diff_attr) > 0) { $Material->attributes = $xls_attributes_material; // material_name1с - Наименование из Excel файла. material_name - Изменяемое наименование пользователем в БД if ($Material->material_name === '' || $Material->material_name === NULL) { $Material->material_name = $Material->material_name1c; } $Matlog->attributes = $xls_attributes_material; $Matlog->material_number = self::$material_number_xls; $Matlog->material_price = self::$material_price_xls; $Matlog->matvid_name = Matvid::model()->findbyPk($Material->id_matvid)->matvid_name; $Matlog->izmer_name = Izmer::model()->findbyPk($Material->id_izmer)->izmer_name; $Matlog->material_writeoff = 'Нет'; $Matlog->matlog_message = $Material->isNewRecord ? 'Запись добавлена' : 'Запись изменена: '; if (!$Material->isNewRecord) { foreach ($diff_attr as $attr => $value) { $Matlog->matlog_message .= '[' . Material::model()->getAttributeLabel($attr) . '] = "' . $value . '", '; } } // Валидируем значения модели и пишем в лог $result = self::ImportValidate($Material, $Matlog); } else { // Если изменения не внесены пишем в лог $Matlog->attributes = $Material->attributes; $Matlog->matvid_name = Matvid::model()->findbyPk($Material->id_matvid)->matvid_name; $Matlog->izmer_name = Izmer::model()->findbyPk($Material->id_izmer)->izmer_name; $Matlog->material_writeoff = $Material->material_writeoff === '1' ? 'Да' : 'Нет'; // Добавляем в лог не измененные значения ActiveRecord $result = self::JustAddToLog($Material, $Matlog); } } else { self::$logreport_missed += 1; } return $result; }