%PDF- %PDF-
Direktori : /home/bitrix/www/bitrix/modules/sale/lib/discount/ |
Current File : /home/bitrix/www/bitrix/modules/sale/lib/discount/formatter.php |
<?php namespace Bitrix\Sale\Discount; use Bitrix\Main\Localization\Loc; Loc::loadMessages(__FILE__); final class Formatter { const TYPE_SIMPLE = 0x0001; const TYPE_VALUE = 0x0002; const TYPE_LIMIT_VALUE = 0x0004; const TYPE_FIXED = 0x0008; const TYPE_MAX_BOUND = 0x0010; const TYPE_SIMPLE_GIFT = 0x0020; const VALUE_TYPE_PERCENT = 'P'; const VALUE_TYPE_CURRENCY = 'C'; const VALUE_TYPE_SUMM = 'S'; const VALUE_TYPE_SUMM_BASKET = 'B'; const VALUE_ACTION_DISCOUNT = 'D'; const VALUE_ACTION_EXTRA = 'E'; const VALUE_ACTION_CUMULATIVE = 'A'; const LIMIT_MAX = 'MAX'; const LIMIT_MIN = 'MIN'; private static $errors = array(); /** * Prepare action or result description. * * @param int $type Action description type. * @param array|string $data Action description data. * @return null|array */ public static function prepareRow($type, $data) { self::clearErrors(); $process = true; $result = array(); $type = (int)$type; if ($type != self::TYPE_SIMPLE) { if (empty($data) || !is_array($data)) { $process = false; self::addError(Loc::getMessage('SALE_DISCOUNT_FORMATTER_ERR_FORMAT_DESCR_BAD')); } } switch ($type) { case self::TYPE_SIMPLE: if (empty($data) || !is_string($data)) { $process = false; self::addError(Loc::getMessage('SALE_DISCOUNT_FORMATTER_ERR_FORMAT_DESCR_BAD')); } if ($process) { $result = array( 'TYPE' => self::TYPE_SIMPLE, 'DESCR' => $data ); } break; case self::TYPE_LIMIT_VALUE: case self::TYPE_VALUE: if ($type == self::TYPE_LIMIT_VALUE) { if ($process) { if (!isset($data['LIMIT_TYPE']) || !isset($data['LIMIT_VALUE']) || !isset($data['LIMIT_UNIT'])) { $process = false; self::addError(Loc::getMessage('SALE_DISCOUNT_FORMATTER_ERR_FORMAT_DESCR_BAD')); } elseif ($data['LIMIT_TYPE'] != self::LIMIT_MAX && $data['LIMIT_TYPE'] != self::LIMIT_MIN) { $process = false; self::addError(Loc::getMessage('SALE_DISCOUNT_FORMATTER_ERR_FORMAT_DESCR_BAD')); } } if ($process) { if ($data['VALUE_TYPE'] != self::VALUE_TYPE_PERCENT) { $process = false; self::addError(Loc::getMessage('SALE_DISCOUNT_FORMATTER_ERR_FORMAT_DESCR_BAD')); } } if ($process) { $result['LIMIT_TYPE'] = $data['LIMIT_TYPE']; $result['LIMIT_VALUE'] = $data['LIMIT_VALUE']; $result['LIMIT_UNIT'] = $data['LIMIT_UNIT']; } } if ($process) { if (!isset($data['VALUE']) || !isset($data['VALUE_TYPE'])) { $process = false; self::addError(Loc::getMessage('SALE_DISCOUNT_FORMATTER_ERR_FORMAT_DESCR_BAD')); } } if ($process) { if ( $data['VALUE_TYPE'] != self::VALUE_TYPE_PERCENT && $data['VALUE_TYPE'] != self::VALUE_TYPE_CURRENCY && $data['VALUE_TYPE'] != self::VALUE_TYPE_SUMM && $data['VALUE_TYPE'] != self::VALUE_TYPE_SUMM_BASKET ) { $process = false; self::addError(Loc::getMessage('SALE_DISCOUNT_FORMATTER_ERR_FORMAT_DESCR_BAD')); } elseif ( $data['VALUE_TYPE'] == self::VALUE_TYPE_CURRENCY || $data['VALUE_TYPE'] == self::VALUE_TYPE_SUMM || $data['VALUE_TYPE'] == self::VALUE_TYPE_SUMM_BASKET ) { if (!isset($data['VALUE_UNIT'])) { $process = false; self::addError(Loc::getMessage('SALE_DISCOUNT_FORMATTER_ERR_FORMAT_DESCR_BAD')); } } } if ($process) { if (!isset($data['VALUE_ACTION'])) $data['VALUE_ACTION'] = self::VALUE_ACTION_DISCOUNT; if ( $data['VALUE_ACTION'] != self::VALUE_ACTION_DISCOUNT && $data['VALUE_ACTION'] != self::VALUE_ACTION_EXTRA && $data['VALUE_ACTION'] != self::VALUE_ACTION_CUMULATIVE ) { $process = false; self::addError(Loc::getMessage('SALE_DISCOUNT_FORMATTER_ERR_FORMAT_DESCR_BAD')); } } if ($process) { $result['TYPE'] = $type; $result['VALUE'] = $data['VALUE']; $result['VALUE_TYPE'] = $data['VALUE_TYPE']; $result['VALUE_ACTION'] = $data['VALUE_ACTION']; if ( $data['VALUE_TYPE'] == self::VALUE_TYPE_CURRENCY || $data['VALUE_TYPE'] == self::VALUE_TYPE_SUMM || $data['VALUE_TYPE'] == self::VALUE_TYPE_SUMM_BASKET ) $result['VALUE_UNIT'] = $data['VALUE_UNIT']; if (isset($data['RESULT_VALUE']) && isset($data['RESULT_UNIT'])) { $result['RESULT_VALUE'] = (string)$data['RESULT_VALUE']; $result['RESULT_UNIT'] = $data['RESULT_UNIT']; } } break; case self::TYPE_FIXED: if ($process) { if (!isset($data['VALUE']) || !isset($data['VALUE_UNIT'])) { $process = false; self::addError(Loc::getMessage('SALE_DISCOUNT_FORMATTER_ERR_FORMAT_DESCR_BAD')); } } if ($process) { $result = array( 'TYPE' => $type, 'VALUE' => $data['VALUE'], 'VALUE_UNIT' => $data['VALUE_UNIT'] ); } break; case self::TYPE_MAX_BOUND: if ($process) { if (!isset($data['VALUE']) || !isset($data['VALUE_UNIT'])) { $process = false; self::addError(Loc::getMessage('SALE_DISCOUNT_FORMATTER_ERR_FORMAT_DESCR_BAD')); } } if ($process) { $result = array( 'TYPE' => $type, 'VALUE' => $data['VALUE'], 'VALUE_UNIT' => $data['VALUE_UNIT'] ); if (isset($data['RESULT_VALUE']) && isset($data['RESULT_UNIT'])) { $result['RESULT_VALUE'] = (string)$data['RESULT_VALUE']; $result['RESULT_UNIT'] = $data['RESULT_UNIT']; } } break; case self::TYPE_SIMPLE_GIFT: $result = array( 'TYPE' => self::TYPE_SIMPLE_GIFT ); break; default: $process = false; self::addError(Loc::getMessage('SALE_DISCOUNT_FORMATTER_ERR_FORMAT_DESCR_BAD')); break; } return ($process ? $result : null); } /** * Returns format action or result description. * * @param array $action Action description. * @return null|string */ public static function formatRow(array $action) { self::clearErrors(); $result = null; if (!isset($action['TYPE'])) { self::addError(Loc::getMessage('SALE_DISCOUNT_FORMATTER_ERR_FORMAT_TYPE_BAD')); return $result; } switch ($action['TYPE']) { case self::TYPE_SIMPLE: $result = $action['DESCR']; break; case self::TYPE_VALUE: if ($action['VALUE_TYPE'] == self::VALUE_TYPE_PERCENT) { $value = $action['VALUE'].'%'; if (isset($action['RESULT_VALUE']) && isset($action['RESULT_UNIT'])) $value .= ' ('.\CCurrencyLang::CurrencyFormat($action['RESULT_VALUE'], $action['RESULT_UNIT'], true).')'; } else { if ($action['VALUE_TYPE'] == self::VALUE_TYPE_CURRENCY) { $value = \CCurrencyLang::CurrencyFormat($action['VALUE'], $action['VALUE_UNIT'], true); } else { $subMessageID = ( $action['VALUE_TYPE'] == self::VALUE_TYPE_SUMM ? 'SALE_DISCOUNT_FORMATTER_MESS_SUMM_FORMAT' : 'SALE_DISCOUNT_FORMATTER_MESS_SUMM_BASKET_FORMAT' ); $value = Loc::getMessage( $subMessageID, array('#VALUE#' => \CCurrencyLang::CurrencyFormat($action['VALUE'], $action['VALUE_UNIT'], true)) ); unset($subMessageID); } if (isset($action['RESULT_VALUE']) && isset($action['RESULT_UNIT']) && $action['VALUE_UNIT'] != $action['RESULT_UNIT']) $value .= ' ('.\CCurrencyLang::CurrencyFormat($action['RESULT_VALUE'], $action['RESULT_UNIT'], true).')'; } $messageId = 'SALE_DISCOUNT_FORMATTER_MESS_TYPE_DISCOUNT'; if (isset($action['VALUE_ACTION'])) { switch ($action['VALUE_ACTION']) { case self::VALUE_ACTION_EXTRA: $messageId = 'SALE_DISCOUNT_FORMATTER_MESS_TYPE_EXTRA'; break; case self::VALUE_ACTION_CUMULATIVE: $messageId = 'SALE_DISCOUNT_FORMATTER_MESS_TYPE_CUMULATIVE'; break; } } $result = Loc::getMessage($messageId, array('#VALUE#' => $value)); unset($value, $messageId); break; case self::TYPE_LIMIT_VALUE: $messageId = ( isset($action['LIMIT_TYPE']) && $action['LIMIT_TYPE'] == self::LIMIT_MIN ? 'SALE_DISCOUNT_FORMATTER_MESS_LIMIT_MIN_FORMAT' : 'SALE_DISCOUNT_FORMATTER_MESS_LIMIT_MAX_FORMAT' ); $value = Loc::getMessage( $messageId, array( '#PERCENT#' => $action['VALUE'].'%', '#LIMIT#' => \CCurrencyLang::CurrencyFormat($action['LIMIT_VALUE'], $action['LIMIT_UNIT'], true) ) ); if (isset($action['RESULT_VALUE']) && isset($action['RESULT_UNIT'])) $value .= ' ('.\CCurrencyLang::CurrencyFormat($action['RESULT_VALUE'], $action['RESULT_UNIT'], true).')'; $messageId = ( isset($action['VALUE_ACTION']) && $action['VALUE_ACTION'] == self::VALUE_ACTION_EXTRA ? 'SALE_DISCOUNT_FORMATTER_MESS_TYPE_EXTRA' : 'SALE_DISCOUNT_FORMATTER_MESS_TYPE_DISCOUNT' ); $result = Loc::getMessage($messageId, array('#VALUE#' => $value)); unset($value, $messageId); break; case self::TYPE_FIXED: $result = Loc::getMessage( 'SALE_DISCOUNT_FORMATTER_MESS_FIXED_FORMAT', array('#VALUE#' => \CCurrencyLang::CurrencyFormat($action['VALUE'], $action['VALUE_UNIT'], true)) ); break; case self::TYPE_MAX_BOUND: $value = \CCurrencyLang::CurrencyFormat($action['VALUE'], $action['VALUE_UNIT'], true); if (isset($action['RESULT_VALUE']) && isset($action['RESULT_UNIT'])) $value .= ' ('.\CCurrencyLang::CurrencyFormat($action['RESULT_VALUE'], $action['RESULT_UNIT'], true).')'; else $value .= ' ('.$value.')'; $result = Loc::getMessage( 'SALE_DISCOUNT_FORMATTER_MESS_MAX_BOUND_FORMAT', array('#VALUE#' => $value) ); unset($value); break; case self::TYPE_SIMPLE_GIFT: $result = Loc::getMessage('SALE_DISCOUNT_FORMATTER_MESS_SIMPLE_GIFT'); break; default: break; } return $result; } /** * Format discount result. * * @param array $actionList Descriptions. * @return array|null */ public static function formatList(array $actionList) { self::clearErrors(); $result = array(); if (!empty($actionList)) { foreach ($actionList as $row) { if (!is_array($row)) return null; $value = self::formatRow($row); if ($value === null) return null; $result[] = $value; } unset($value, $row); } return (empty($result) ? null: $result); } /** * Clear formatter errors. * * @return void */ public static function clearErrors() { self::$errors = array(); } /** * Returns formatter errors. * * @return array */ public static function getErrors() { return self::$errors; } /** * Add error. * * @param string $error Error message. * @return void */ private static function addError($error) { if ($error === '') return; self::$errors[] = $error; } }