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);
 }
Example #2
0
 /**
  * @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;
 }
Example #3
0
         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(), '#'));
 }
Example #5
0
 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);
 }
Example #9
0
        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;
Example #10
0
	</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);
?>