public static function PrepareAccountingData($arFields) { $accountCurrencyID = CCrmCurrency::GetAccountCurrencyID(); if (!isset($accountCurrencyID[0])) { return false; } $currencyID = isset($arFields['CURRENCY_ID']) ? strval($arFields['CURRENCY_ID']) : ''; if (!CCrmCurrency::GetByID($currencyID)) { // Currency is invalid or not assigned return false; } if ($currencyID === $accountCurrencyID) { // Avoid conversion to float since possible data lost return array('ACCOUNT_CURRENCY_ID' => $accountCurrencyID, 'ACCOUNT_SUM' => isset($arFields['SUM']) ? $arFields['SUM'] : 0.0); } $account = CCrmCurrency::ConvertMoney(isset($arFields['SUM']) ? doubleval($arFields['SUM']) : 0.0, $currencyID, $accountCurrencyID, isset($arFields['EXCH_RATE']) ? doubleval($arFields['EXCH_RATE']) : -1); return array('ACCOUNT_CURRENCY_ID' => $accountCurrencyID, 'ACCOUNT_SUM' => $account); }
/** * @return array */ public function initializeDemoData(array $data) { if (!(isset($data['items']) && is_array($data['items']))) { return $data; } foreach ($data['items'] as &$item) { $config = $this->findConfigByName(isset($item['name']) ? $item['name'] : ''); if (!$config) { continue; } $item['title'] = $config->getTitle(); if (!(isset($item['positions']) && is_array($item['positions']))) { continue; } $format = $config->getFomatParams(); foreach ($item['positions'] as &$position) { $legend = isset($position['legend']) ? (double) $position['legend'] : 0.0; $legendType = 'text'; if (isset($format['enableDecimals']) && $format['enableDecimals'] == 'N') { $legend = round($legend, 0); } if (isset($format['isCurrency']) && $format['isCurrency'] == 'Y') { $legend = \CCrmCurrency::MoneyToString($legend, \CCrmCurrency::GetAccountCurrencyID()); $legendType = 'html'; } $position['legend'] = $legend; $position['legendType'] = $legendType; } unset($position); } unset($item); return $data; }
if ($result) { $locFields['CURRENCY'] = $currencyID; $locFields['LID'] = $k; if (is_array(CCurrencyLang::GetByID($currencyID, $k))) { CCurrencyLang::Update($currencyID, $k, $locFields); } else { $locFields['DECIMALS'] = 2; //Default decimals CCurrencyLang::Add($locFields); } } } if ($result) { if ($currency['IS_ACCOUNTING_CURRENCY'] && $currencyID !== CCrmCurrency::GetAccountCurrencyID()) { CCrmCurrency::SetAccountCurrencyID($currencyID); } elseif (!$currency['IS_ACCOUNTING_CURRENCY'] && $currencyID === CCrmCurrency::GetAccountCurrencyID()) { CCrmCurrency::SetAccountCurrencyID(CCrmCurrency::GetBaseCurrencyID()); } if ($currency['IS_INVOICE_CURRENCY'] && $currencyID !== CCrmCurrency::getInvoiceDefault()) { CCrmCurrency::setInvoiceDefault($currencyID); } LocalRedirect(isset($_POST['apply']) ? CComponentEngine::MakePathFromTemplate($arParams['PATH_TO_CURRENCY_EDIT'], array('currency_id' => $currencyID)) : CComponentEngine::MakePathFromTemplate($arParams['PATH_TO_CURRENCY_LIST'], array('currency_id' => $currencyID))); } } elseif ($_SERVER['REQUEST_METHOD'] == 'GET' && isset($_GET['delete'])) { $currencyID = isset($arParams['CURRENCY_ID']) ? strval($arParams['CURRENCY_ID']) : ''; $currency = isset($currencyID[0]) ? CCrmCurrency::GetByID($currencyID) : null; if ($currency) { if (!CCrmCurrency::Delete($currencyID)) { $err = CCrmCurrency::GetLastError(); ShowError(isset($err[0]) ? $err : GetMessage('CRM_CURRENCY_DELETE_UNKNOWN_ERROR')); return;
protected static function MoneyToString($sum) { return str_replace(' ', ' ', CCrmCurrency::MoneyToString($sum, CCrmCurrency::GetAccountCurrencyID(), '#')); }
public static function OnAccountCurrencyChange() { $accountCurrencyID = CCrmCurrency::GetAccountCurrencyID(); if (!isset($accountCurrencyID[0])) { return; } $rs = self::GetList(array('ID' => 'ASC'), array(), array('ID', 'CURRENCY_ID', 'OPPORTUNITY', 'TAX_VALUE', 'EXCH_RATE')); $entity = new CCrmDeal(false); while ($arParams = $rs->Fetch()) { $ID = intval($arParams['ID']); $entity->Update($ID, $arParams, false, false); $arRows = CCrmProductRow::LoadRows('D', $ID); $context = array(); if (isset($arParams['CURRENCY_ID'])) { $context['CURRENCY_ID'] = $arParams['CURRENCY_ID']; } if (isset($arParams['EXCH_RATE'])) { $context['EXCH_RATE'] = $arParams['EXCH_RATE']; } if (count($arRows) > 0) { CCrmProductRow::SaveRows('D', $ID, $arRows, $context); } } }
/** * @return array */ public function initializeDemoData(array $data) { if (!(isset($data['items']) && is_array($data['items']))) { return $data; } foreach ($data['items'] as &$item) { $config = $this->findConfigByName(isset($item['name']) ? $item['name'] : ''); if (!$config) { continue; } $item['title'] = $config->getTitle(); $value = isset($item['value']) ? (double) $item['value'] : 0.0; $format = $config->getFomatParams(); if (isset($format['enableDecimals']) && $format['enableDecimals'] == 'N') { $value = round($value, 0); } $item['value'] = $value; if (isset($format['isCurrency']) && $format['isCurrency'] === 'Y') { $item['html'] = \CCrmCurrency::MoneyToString($value, \CCrmCurrency::GetAccountCurrencyID()); } } unset($item); return $data; }
/** * @return boolean */ public static function synchronize($ownerID, array $entityFields = null) { if (!is_int($ownerID)) { $ownerID = (int) $ownerID; } if ($ownerID <= 0) { throw new Main\ArgumentException('Owner ID must be greater than zero.', 'ownerID'); } if (!is_array($entityFields)) { $dbResult = \CCrmDeal::GetListEx(array(), array('=ID' => $ownerID, 'CHECK_PERMISSIONS' => 'N'), false, false, array('STAGE_ID', 'ASSIGNED_BY_ID', 'BEGINDATE', 'CLOSEDATE', 'OPPORTUNITY', 'CURRENCY_ID')); $entityFields = is_object($dbResult) ? $dbResult->Fetch() : null; if (!is_array($entityFields)) { return false; } } $stageID = isset($entityFields['STAGE_ID']) ? $entityFields['STAGE_ID'] : ''; $semanticID = \CCrmDeal::GetSemanticID($stageID); $isLost = PhaseSemantics::isLost($semanticID); $responsibleID = isset($entityFields['ASSIGNED_BY_ID']) ? (int) $entityFields['ASSIGNED_BY_ID'] : 0; /** @var Date $startDate */ $startDate = self::parseDateString(isset($entityFields['BEGINDATE']) ? $entityFields['BEGINDATE'] : ''); if ($startDate === null) { $startDate = new Date(); } /** @var Date $endDate */ $endDate = self::parseDateString(isset($entityFields['CLOSEDATE']) ? $entityFields['CLOSEDATE'] : ''); if ($endDate === null) { $endDate = new Date('9999-12-31', 'Y-m-d'); } $sum = isset($entityFields['OPPORTUNITY']) ? (double) $entityFields['OPPORTUNITY'] : 0.0; $currencyID = isset($entityFields['CURRENCY_ID']) ? $entityFields['CURRENCY_ID'] : ''; if ($currencyID === '') { $currencyID = \CCrmCurrency::GetBaseCurrencyID(); } $accountCurrencyID = \CCrmCurrency::GetAccountCurrencyID(); $sumData = \CCrmAccountingHelper::PrepareAccountingData(array('CURRENCY_ID' => $currencyID, 'SUM' => $sum)); if (is_array($sumData)) { $sum = (double) $sumData['ACCOUNT_SUM']; } $latest = self::getLatest($ownerID); if (!is_array($latest)) { if ($semanticID === PhaseSemantics::SUCCESS) { //Creation of stub for successfully completed entity without invoices self::innerRegister(array('OWNER_ID' => $ownerID, 'CREATED_DATE' => new Date(), 'START_DATE' => $startDate, 'END_DATE' => $endDate, 'RESPONSIBLE_ID' => $responsibleID, 'STAGE_SEMANTIC_ID' => PhaseSemantics::SUCCESS, 'STAGE_ID' => $stageID, 'IS_LOST' => 'N', 'CURRENCY_ID' => $accountCurrencyID, 'INVOICE_SUM' => 0.0, 'INVOICE_QTY' => 0, 'TOTAL_INVOICE_SUM' => 0.0, 'TOTAL_INVOICE_QTY' => 0, 'TOTAL_SUM' => $sum)); } return true; } if ($startDate->getTimestamp() === $latest['START_DATE']->getTimestamp() && $endDate->getTimestamp() === $latest['END_DATE']->getTimestamp() && $responsibleID === (int) $latest['RESPONSIBLE_ID'] && $stageID === $latest['STAGE_ID'] && $semanticID === $latest['STAGE_SEMANTIC_ID'] && $sum === (double) $latest['TOTAL_SUM']) { return false; } if ($semanticID !== $latest['STAGE_SEMANTIC_ID'] && $latest['STAGE_SEMANTIC_ID'] === PhaseSemantics::SUCCESS && (int) $latest['INVOICE_QTY'] === 0) { //Clean up stub for successfully completed entity without invoices DealInvoiceStatisticsTable::delete(array('OWNER_ID' => $ownerID, 'CREATED_DATE' => $latest['CREATED_DATE'])); } else { DealInvoiceStatisticsTable::synchronize($ownerID, array('START_DATE' => $startDate, 'END_DATE' => $endDate, 'RESPONSIBLE_ID' => $responsibleID, 'STAGE_SEMANTIC_ID' => $semanticID, 'STAGE_ID' => $stageID, 'IS_LOST' => $isLost ? 'Y' : 'N', 'TOTAL_SUM' => $sum)); } return true; }
/** * @return void */ public static function register($ownerID, array $entityFields = null) { if (!is_int($ownerID)) { $ownerID = (int) $ownerID; } if ($ownerID <= 0) { throw new Main\ArgumentException('Owner ID must be greater than zero.', 'ownerID'); } if (!is_array($entityFields)) { $dbResult = \CCrmDeal::GetListEx(array(), array('=ID' => $ownerID, 'CHECK_PERMISSIONS' => 'N'), false, false, array('STAGE_ID', 'ASSIGNED_BY_ID', 'BEGINDATE', 'CLOSEDATE', 'CURRENCY_ID', 'OPPORTUNITY', 'UF_*')); $entityFields = is_object($dbResult) ? $dbResult->Fetch() : null; if (!is_array($entityFields)) { return; } } $bindingMap = self::getSlotBindingMap(); $stageID = isset($entityFields['STAGE_ID']) ? $entityFields['STAGE_ID'] : ''; $semanticID = \CCrmDeal::GetSemanticID($stageID); $isLost = PhaseSemantics::isLost($semanticID); $isFinalized = PhaseSemantics::isFinal($semanticID); $responsibleID = isset($entityFields['ASSIGNED_BY_ID']) ? (int) $entityFields['ASSIGNED_BY_ID'] : 0; /** @var Date $startDate */ $startDate = self::parseDateString(isset($entityFields['BEGINDATE']) ? $entityFields['BEGINDATE'] : ''); if ($startDate === null || $startDate->getTimestamp() === false) { $startDate = isset($entityFields['DATE_CREATE']) ? self::parseDateString($entityFields['DATE_CREATE']) : null; if ($startDate === null || $startDate->getTimestamp() === false) { $startDate = new Date(); } } /** @var Date $endDate */ $endDate = self::parseDateString(isset($entityFields['CLOSEDATE']) ? $entityFields['CLOSEDATE'] : ''); if ($endDate === null || $endDate->getTimestamp() === false) { $endDate = new Date('9999-12-31', 'Y-m-d'); } $date = $isFinalized ? $endDate : $startDate; $day = (int) $date->format('d'); $month = (int) $date->format('m'); $quarter = $month <= 3 ? 1 : ($month <= 6 ? 2 : ($month <= 9 ? 3 : 4)); $year = (int) $date->format('Y'); $currencyID = isset($entityFields['CURRENCY_ID']) ? $entityFields['CURRENCY_ID'] : ''; $accountingCurrencyID = \CCrmCurrency::GetAccountCurrencyID(); $sum = isset($entityFields['OPPORTUNITY']) ? (double) $entityFields['OPPORTUNITY'] : 0.0; $binding = $bindingMap->get('SUM_TOTAL'); if ($binding === null) { $total = isset($entityFields['OPPORTUNITY']) ? (double) $entityFields['OPPORTUNITY'] : 0.0; } else { $bindingFieldName = $binding->getFieldName(); if ($bindingFieldName === '') { $bindingFieldName = 'OPPORTUNITY'; } $total = isset($entityFields[$bindingFieldName]) ? (double) $entityFields[$bindingFieldName] : 0.0; if ($bindingFieldName !== 'OPPORTUNITY' && $binding->getOption('ADD_PRODUCT_ROW_SUM') === 'Y') { $total += $sum; } } if ($currencyID !== $accountingCurrencyID) { $accData = \CCrmAccountingHelper::PrepareAccountingData(array('CURRENCY_ID' => $currencyID, 'SUM' => $total, 'EXCH_RATE' => isset($entityFields['EXCH_RATE']) ? $entityFields['EXCH_RATE'] : null)); if (is_array($accData)) { $total = (double) $accData['ACCOUNT_SUM']; } } $sumSlots = array(); $sumSlotFields = DealSumStatisticsTable::getSumSlotFieldNames(); foreach ($sumSlotFields as $fieldName) { $binding = $bindingMap->get($fieldName); if ($binding === null) { $slotSum = 0.0; } else { $bindingFieldName = $binding->getFieldName(); $slotSum = $bindingFieldName !== '' && isset($entityFields[$bindingFieldName]) ? (double) $entityFields[$bindingFieldName] : 0.0; if ($binding->getOption('ADD_PRODUCT_ROW_SUM') === 'Y') { $slotSum += $sum; } } if ($currencyID !== $accountingCurrencyID) { $accData = \CCrmAccountingHelper::PrepareAccountingData(array('CURRENCY_ID' => $currencyID, 'SUM' => $slotSum, 'EXCH_RATE' => isset($entityFields['EXCH_RATE']) ? $entityFields['EXCH_RATE'] : null)); if (is_array($accData)) { $slotSum = (double) $accData['ACCOUNT_SUM']; } } $sumSlots[$fieldName] = $slotSum; } $entities = self::getAll($ownerID); $final = null; $process = null; foreach ($entities as $entity) { if (PhaseSemantics::isFinal($entity['STAGE_SEMANTIC_ID'])) { $final = $entity; } else { $process = $entity; } if ($final && $process) { break; } } $latest = self::getLatest($ownerID); if (is_array($latest) && isset($latest['START_DATE']) && isset($latest['END_DATE'])) { if ($startDate->getTimestamp() === $latest['START_DATE']->getTimestamp() && $endDate->getTimestamp() === $latest['END_DATE']->getTimestamp() && $responsibleID === (int) $latest['RESPONSIBLE_ID'] && $stageID === $latest['STAGE_ID'] && $currencyID === $latest['CURRENCY_ID'] && $total === (double) $latest['SUM_TOTAL'] && $sumSlots['UF_SUM_1'] === (double) $latest['UF_SUM_1'] && $sumSlots['UF_SUM_2'] === (double) $latest['UF_SUM_2'] && $sumSlots['UF_SUM_3'] === (double) $latest['UF_SUM_3'] && $sumSlots['UF_SUM_4'] === (double) $latest['UF_SUM_4'] && $sumSlots['UF_SUM_5'] === (double) $latest['UF_SUM_5']) { return; } if ($startDate->getTimestamp() !== $latest['START_DATE']->getTimestamp() || $endDate->getTimestamp() !== $latest['END_DATE']->getTimestamp() || $responsibleID !== (int) $latest['RESPONSIBLE_ID']) { if (!$isFinalized) { DealSumStatisticsTable::deleteByFilter(array('OWNER_ID' => $ownerID, 'SEMANTIC_ID' => PhaseSemantics::getFinalSemantis())); DealSumStatisticsTable::synchronize($ownerID, array('CREATED_DATE' => $startDate, 'START_DATE' => $startDate, 'END_DATE' => $endDate, 'RESPONSIBLE_ID' => $responsibleID), PhaseSemantics::getProcessSemantis()); } else { if ($startDate->getTimestamp() === $endDate->getTimestamp()) { DealSumStatisticsTable::deleteByFilter(array('OWNER_ID' => $ownerID, 'SEMANTIC_ID' => PhaseSemantics::getProcessSemantis())); DealSumStatisticsTable::synchronize($ownerID, array('CREATED_DATE' => $endDate, 'START_DATE' => $startDate, 'END_DATE' => $endDate, 'RESPONSIBLE_ID' => $responsibleID), PhaseSemantics::getFinalSemantis()); } else { //Diphasic update of "final" semantics (first update with forged date: "1970-01-01") for avoid possible primary key conflict with "process" semantics DealSumStatisticsTable::synchronize($ownerID, array('CREATED_DATE' => new Date('1970-01-01', 'Y-m-d'), 'START_DATE' => $startDate, 'END_DATE' => $endDate, 'RESPONSIBLE_ID' => $responsibleID), PhaseSemantics::getFinalSemantis()); DealSumStatisticsTable::synchronize($ownerID, array('CREATED_DATE' => $startDate, 'START_DATE' => $startDate, 'END_DATE' => $endDate, 'RESPONSIBLE_ID' => $responsibleID), PhaseSemantics::getProcessSemantis()); DealSumStatisticsTable::synchronize($ownerID, array('CREATED_DATE' => $endDate, 'START_DATE' => $startDate, 'END_DATE' => $endDate, 'RESPONSIBLE_ID' => $responsibleID), PhaseSemantics::getFinalSemantis()); } } } } $data = array_merge(array('OWNER_ID' => $ownerID, 'CREATED_DATE' => $date, 'START_DATE' => $startDate, 'END_DATE' => $endDate, 'PERIOD_YEAR' => $year, 'PERIOD_QUARTER' => $quarter, 'PERIOD_MONTH' => $month, 'PERIOD_DAY' => $day, 'RESPONSIBLE_ID' => $responsibleID, 'STAGE_SEMANTIC_ID' => $semanticID, 'STAGE_ID' => $stageID, 'IS_LOST' => $isLost ? 'Y' : 'N', 'CURRENCY_ID' => $accountingCurrencyID, 'SUM_TOTAL' => $total), $sumSlots); DealSumStatisticsTable::upsert($data); }
if ($errorID === '') { LocalRedirect($bInternal ? '?' . $arParams['FORM_ID'] . '_active_tab=tab_currency' : ''); } else { LocalRedirect(CHTTP::urlAddParams(CComponentEngine::MakePathFromTemplate($arParams['PATH_TO_CURRENCY_LIST'], array()), array('error' => $errorID))); } } } $gridOptions = new CCrmGridOptions($arResult['GRID_ID']); $gridSorting = $gridOptions->GetSorting(array('sort' => array('SORT' => 'asc'), 'vars' => array('by' => 'by', 'order' => 'order'))); $sort = $arResult['SORT'] = $gridSorting['sort']; $arResult['SORT_VARS'] = $gridSorting['vars']; //if (!isset($arParams['CURRENCY_COUNT'])) //{ // $arParams['CURRENCY_COUNT'] = 20; //} $accountCurrencyID = CCrmCurrency::GetAccountCurrencyID(); $baseCurrencyID = CCrmCurrency::GetBaseCurrencyID(); $defaultForInvoices = CCrmCurrency::getInvoiceDefault(); $currencies = array(); $allCurrencies = CCrmCurrency::GetAll(); foreach ($allCurrencies as $k => $v) { $currency = array(); $currency['ID'] = $k; // Key is Currency ID $currency['NAME'] = $v['FULL_NAME']; $currency['SORT'] = $v['SORT']; $currency['EXCH_RATE'] = $v['AMOUNT']; //Default Exchange Rate $currency['AMOUNT_CNT'] = $v['AMOUNT_CNT']; $currency['ACCOUNTING'] = $k === $accountCurrencyID ? 'Y' : 'N'; $isBase = $k === $baseCurrencyID;
</div> </div> <?php $this->SetViewTarget("sidebar_tools_1", 100); $reportCurrencyID = CCrmReportHelper::GetReportCurrencyID(); ?> <div class="sidebar-block"> <b class="r2"></b> <b class="r1"></b> <b class="r0"></b> <div class="sidebar-block-inner"> <div class="filter-block"> <label for="crmReportCurrencyID" class="filter-field-title"><?php echo str_replace('#CURRENCY#', CCrmCurrency::GetEncodedCurrencyName(CCrmCurrency::GetAccountCurrencyID()), GetMessage('CRM_REPORT_CURRENCY_INFO')); ?> </label> </div> </div> <i class="r0"></i> <i class="r1"></i> <i class="r2"></i> </div> <?php $this->EndViewTarget(); ?> <script type="text/javascript"> var crmDealElements = <?php echo CUtil::PhpToJsObject($arDeals); ?>