Example #1
0
 			}*/
 $processProductRows = array_key_exists($productDataFieldName, $_POST);
 $arProd = array();
 $taxList = array();
 if ($processProductRows) {
     $prodJson = isset($_POST[$productDataFieldName]) ? strval($_POST[$productDataFieldName]) : '';
     $arProd = $arResult['PRODUCT_ROWS'] = strlen($prodJson) > 0 ? CUtil::JsObjectToPhp($prodJson) : array();
     if (count($arProd) > 0) {
         // SYNC OPPORTUNITY WITH PRODUCT ROW SUM TOTAL
         //$arFields['OPPORTUNITY'] = CCrmProductRow::GetTotalSum($arProd);
         $enableSaleDiscount = false;
         $calcOptions = array();
         if ($bTaxMode) {
             $calcOptions['LOCATION_ID'] = $arFields['LOCATION_ID'];
         }
         $result = CCrmSaleHelper::Calculate($arProd, $currencyID, $personTypeId, $enableSaleDiscount, SITE_ID, $calcOptions);
         $arFields['OPPORTUNITY'] = isset($result['PRICE']) ? round(doubleval($result['PRICE']), 2) : 1.0;
         $arFields['TAX_VALUE'] = isset($result['TAX_VALUE']) ? round(doubleval($result['TAX_VALUE']), 2) : 0.0;
     }
 }
 // Product row settings
 $productRowSettings = array();
 $productRowSettingsFieldName = $productDataFieldName . '_SETTINGS';
 if (array_key_exists($productRowSettingsFieldName, $_POST)) {
     $settingsJson = isset($_POST[$productRowSettingsFieldName]) ? strval($_POST[$productRowSettingsFieldName]) : '';
     $arSettings = strlen($settingsJson) > 0 ? CUtil::JsObjectToPhp($settingsJson) : array();
     if (is_array($arSettings)) {
         $productRowSettings['ENABLE_DISCOUNT'] = isset($arSettings['ENABLE_DISCOUNT']) ? $arSettings['ENABLE_DISCOUNT'] === 'Y' : false;
         $productRowSettings['ENABLE_TAX'] = isset($arSettings['ENABLE_TAX']) ? $arSettings['ENABLE_TAX'] === 'Y' : false;
     }
 }
Example #2
0
 public static function PrepareSalePaymentData(array &$arQuote)
 {
     $ID = isset($arQuote['ID']) ? intval($arQuote['ID']) : 0;
     if ($ID <= 0) {
         return null;
     }
     $fieldMap = self::GetSaleOrderMap();
     $order = array();
     foreach ($fieldMap as $orderFileldID => $fileldID) {
         if (!is_array($fileldID)) {
             $order[$orderFileldID] = isset($arQuote[$fileldID]) ? $arQuote[$fileldID] : '';
         } else {
             $v = '';
             foreach ($fileldID as $item) {
                 $s = isset($arQuote[$item]) ? trim($arQuote[$item]) : '';
                 if ($s === '') {
                     continue;
                 }
                 if (preg_match('/<br(\\/)?>$/i', $v) !== 1) {
                     $v .= '<br/>';
                 }
                 $v .= $s;
             }
             $order[$orderFileldID] = $v;
         }
     }
     $personTypeIDs = CCrmPaySystem::getPersonTypeIDs();
     $personTypeID = isset($arQuote['PERSON_TYPE_ID']) ? intval($arQuote['PERSON_TYPE_ID']) : 0;
     $propertyMap = isset($personTypeIDs['COMPANY']) && intval($personTypeIDs['COMPANY']) === $personTypeID ? self::GetCompanyPersonTypeMap() : self::GetContactPersonTypeMap();
     $properties = array();
     foreach ($propertyMap as $propertyFileldID => $fileldID) {
         $properties[$propertyFileldID] = isset($arQuote[$fileldID]) ? $arQuote[$fileldID] : '';
     }
     $userFields = $GLOBALS['USER_FIELD_MANAGER']->GetUserFields(self::$sUFEntityID, 0, LANGUAGE_ID);
     $supportedUserTypeIDs = array('string', 'double', 'integer', 'boolean', 'datetime');
     foreach ($userFields as $name => &$userField) {
         $fieldType = $userField['USER_TYPE_ID'];
         if (!isset($arQuote[$name]) || !in_array($fieldType, $supportedUserTypeIDs, true)) {
             continue;
         }
         $fieldValue = $arQuote[$name];
         if ($fieldType === 'boolean') {
             $fieldValue = GetMessage(intval($fieldValue) > 0 ? 'MAIN_YES' : 'MAIN_NO');
         }
         $properties[$name] = $userField['EDIT_FORM_LABEL'] . ': ' . $fieldValue;
     }
     unset($userField);
     $productRows = self::LoadProductRows($ID);
     $currencyID = isset($arQuote['CURRENCY_ID']) ? $arQuote['CURRENCY_ID'] : '';
     $calculatedOrder = CCrmSaleHelper::Calculate($productRows, $currencyID, $personTypeID, false, SITE_ID, array('LOCATION_ID' => isset($arQuote['LOCATION_ID']) ? $arQuote['LOCATION_ID'] : ''));
     $taxList = isset($calculatedOrder['TAX_LIST']) ? $calculatedOrder['TAX_LIST'] : array();
     foreach ($taxList as &$taxInfo) {
         $taxInfo['TAX_NAME'] = isset($taxInfo['NAME']) ? $taxInfo['NAME'] : '';
     }
     unset($taxInfo);
     return array('ORDER' => $order, 'PROPERTIES' => $properties, 'CART_ITEMS' => $calculatedOrder['BASKET_ITEMS'], 'TAX_LIST' => $taxList);
 }
Example #3
0
        $discoutSum = $discoutRate < 100 ? \Bitrix\Crm\Discount::calculateDiscountSum($exclusivePrice, $discoutRate) : doubleval($row['DISCOUNT_SUM']);
        $row['PRICE_NETTO'] = $exclusivePrice + $discoutSum;
    }
    $row['PRICE_BRUTTO'] = CCrmProductRow::CalculateInclusivePrice($row['PRICE_NETTO'], $row['TAX_RATE']);
    $totalDiscount += round($row['QUANTITY'] * $row['DISCOUNT_SUM'], 2);
    //$totalSum += round($row['QUANTITY'] * $row['PRICE'], 2);
    //$totalTax += round($row['PRICE'] - $exclusivePrice, 2);
}
unset($row);
if (count($arResult['PRODUCT_ROWS']) > 0 && (!isset($arParams['TOTAL_SUM']) || !isset($arParams['TOTAL_TAX']))) {
    $enableSaleDiscount = false;
    $calcOptions = array();
    if ($arResult['ALLOW_LD_TAX']) {
        $calcOptions['LOCATION_ID'] = isset($arParams['LOCATION_ID']) ? $arParams['LOCATION_ID'] : '';
    }
    $result = CCrmSaleHelper::Calculate($arResult['PRODUCT_ROWS'], $currencyID, $personTypeId, $enableSaleDiscount, SITE_ID, $calcOptions);
    $totalSum = isset($result['PRICE']) ? round(doubleval($result['PRICE']), 2) : 0.0;
    $totalTax = isset($result['TAX_VALUE']) ? round(doubleval($result['TAX_VALUE']), 2) : 0.0;
}
$arResult['TOTAL_DISCOUNT'] = isset($arParams['TOTAL_DISCOUNT']) ? doubleval($arParams['TOTAL_DISCOUNT']) : $totalDiscount;
$arResult['TOTAL_SUM'] = isset($arParams['TOTAL_SUM']) ? doubleval($arParams['TOTAL_SUM']) : $totalSum;
$arResult['TOTAL_TAX'] = isset($arParams['TOTAL_TAX']) ? doubleval($arParams['TOTAL_TAX']) : $totalTax;
$arResult['TOTAL_BEFORE_TAX'] = round($arResult['TOTAL_SUM'] - $arResult['TOTAL_TAX'], 2);
$arResult['TOTAL_BEFORE_DISCOUNT'] = $arResult['TOTAL_BEFORE_TAX'] + $arResult['TOTAL_DISCOUNT'];
unset($totalSum, $totalTax);
$arResult['FORM_ID'] = isset($arParams['FORM_ID']) ? $arParams['FORM_ID'] : '';
$arResult['TAB_ID'] = isset($arParams['TAB_ID']) ? $arParams['TAB_ID'] : '';
$arResult['PREFIX'] = isset($arParams['PREFIX']) ? $arParams['PREFIX'] : '';
if ($arResult['PREFIX'] === '') {
    $arResult['PREFIX'] = htmlspecialcharsbx($ownerID > 0 ? strtolower($ownerName) . '_' . strval($ownerID) : 'new_' . strtolower($ownerName));
}
Example #4
0
 public function executePhase()
 {
     if ($this->currentPhase === DealConversionPhase::INVOICE_CREATION || $this->currentPhase === DealConversionPhase::QUOTE_CREATION) {
         if ($this->currentPhase === DealConversionPhase::INVOICE_CREATION) {
             $entityTypeID = \CCrmOwnerType::Invoice;
         } else {
             $entityTypeID = \CCrmOwnerType::Quote;
         }
         $entityTypeName = \CCrmOwnerType::ResolveName($entityTypeID);
         $config = $this->config->getItem($entityTypeID);
         if (!$config->isActive()) {
             return false;
         }
         /** @var \CCrmPerms $permissions */
         $permissions = $this->getUserPermissions();
         $entityID = isset($this->contextData[$entityTypeName]) ? $this->contextData[$entityTypeName] : 0;
         if ($entityID > 0) {
             if ($entityTypeID === \CCrmOwnerType::Invoice) {
                 if (!\CCrmInvoice::Exists($entityID)) {
                     throw new EntityConversionException(\CCrmOwnerType::Deal, \CCrmOwnerType::Invoice, EntityConversionException::TARG_DST, EntityConversionException::NOT_FOUND);
                 }
                 if (!\CCrmInvoice::CheckUpdatePermission($entityID, $permissions)) {
                     throw new EntityConversionException(\CCrmOwnerType::Deal, \CCrmOwnerType::Invoice, EntityConversionException::TARG_DST, EntityConversionException::UPDATE_DENIED);
                 }
                 $entity = new \CCrmInvoice(false);
                 $fields = array('UF_DEAL_ID' => $this->entityID);
                 try {
                     $entity->Update($entityID, $fields);
                 } catch (Main\DB\SqlQueryException $e) {
                 }
                 $this->resultData[$entityTypeName] = $entityID;
             } else {
                 if (!\CCrmQuote::Exists($entityID)) {
                     throw new EntityConversionException(\CCrmOwnerType::Deal, \CCrmOwnerType::Quote, EntityConversionException::TARG_DST, EntityConversionException::NOT_FOUND);
                 }
                 if (!\CCrmQuote::CheckUpdatePermission($entityID, $permissions)) {
                     throw new EntityConversionException(\CCrmOwnerType::Deal, \CCrmOwnerType::Quote, EntityConversionException::TARG_DST, EntityConversionException::UPDATE_DENIED);
                 }
                 $entity = new \CCrmQuote(false);
                 $fields = array('DEAL_ID' => $this->entityID);
                 $entity->Update($entityID, $fields);
                 $this->resultData[$entityTypeName] = $entityID;
             }
             return true;
         }
         if (!\CCrmAuthorizationHelper::CheckCreatePermission($entityTypeName, $permissions)) {
             throw new EntityConversionException(\CCrmOwnerType::Deal, $entityTypeID, EntityConversionException::TARG_DST, EntityConversionException::CREATE_DENIED);
         }
         if (UserFieldSynchronizer::needForSynchronization(\CCrmOwnerType::Deal, $entityTypeID)) {
             throw new EntityConversionException(\CCrmOwnerType::Deal, $entityTypeID, EntityConversionException::TARG_DST, EntityConversionException::NOT_SYNCHRONIZED);
         }
         if (!ConversionSettings::getCurrent()->isAutocreationEnabled()) {
             throw new EntityConversionException(\CCrmOwnerType::Deal, $entityTypeID, EntityConversionException::TARG_DST, EntityConversionException::AUTOCREATION_DISABLED);
         }
         /** @var DealConversionMapper $mapper */
         $mapper = $this->getMapper();
         $map = self::prepareMap($entityTypeID);
         $fields = $mapper->map($map);
         if (empty($fields)) {
             throw new EntityConversionException(\CCrmOwnerType::Deal, $entityTypeID, EntityConversionException::TARG_DST, EntityConversionException::EMPTY_FIELDS);
         }
         if ($entityTypeID === \CCrmOwnerType::Invoice) {
             $entity = new \CCrmInvoice(false);
             if (!$entity->CheckFields($fields)) {
                 throw new EntityConversionException(\CCrmOwnerType::Deal, \CCrmOwnerType::Invoice, EntityConversionException::TARG_DST, EntityConversionException::INVALID_FIELDS, $entity->LAST_ERROR);
             }
             $entityID = $entity->Add($fields);
             if ($entityID <= 0) {
                 throw new EntityConversionException(\CCrmOwnerType::Deal, \CCrmOwnerType::Invoice, EntityConversionException::TARG_DST, EntityConversionException::CREATE_FAILED, $entity->LAST_ERROR);
             }
             $this->resultData[\CCrmOwnerType::InvoiceName] = $entityID;
         } else {
             $entity = new \CCrmQuote(false);
             if (!$entity->CheckFields($fields)) {
                 throw new EntityConversionException(\CCrmOwnerType::Deal, \CCrmOwnerType::Quote, EntityConversionException::TARG_DST, EntityConversionException::INVALID_FIELDS, $entity->LAST_ERROR);
             }
             $productRows = isset($fields['PRODUCT_ROWS']) && is_array($fields['PRODUCT_ROWS']) ? $fields['PRODUCT_ROWS'] : array();
             if (!empty($productRows)) {
                 $currencyID = isset($fields['CURRENCY_ID']) ? $fields['CURRENCY_ID'] : '';
                 $personTypes = \CCrmPaySystem::getPersonTypeIDs();
                 $personTypeID = 0;
                 if (isset($personTypes['COMPANY']) && isset($personTypes['CONTACT'])) {
                     if (isset($fields['COMPANY_ID']) && $fields['COMPANY_ID'] > 0) {
                         $personTypeID = $personTypes['COMPANY'];
                     } elseif (isset($fields['CONTACT_ID']) && $fields['CONTACT_ID'] > 0) {
                         $personTypeID = $personTypes['CONTACT'];
                     }
                 }
                 if ($currencyID !== '' && $personTypeID > 0) {
                     $calculationOptions = array();
                     if (\CCrmTax::isTaxMode() && isset($fields['LOCATION_ID'])) {
                         $calculationOptions['LOCATION_ID'] = $fields['LOCATION_ID'];
                     }
                     $result = \CCrmSaleHelper::Calculate($productRows, $currencyID, $personTypeID, false, SITE_ID, $calculationOptions);
                     $arFields['OPPORTUNITY'] = isset($result['PRICE']) ? round(doubleval($result['PRICE']), 2) : 1.0;
                     $arFields['TAX_VALUE'] = isset($result['TAX_VALUE']) ? round(doubleval($result['TAX_VALUE']), 2) : 0.0;
                 }
             }
             $entityID = $entity->Add($fields);
             if ($entityID <= 0) {
                 throw new EntityConversionException(\CCrmOwnerType::Deal, \CCrmOwnerType::Quote, EntityConversionException::TARG_DST, EntityConversionException::CREATE_FAILED, $entity->LAST_ERROR);
             }
             $this->resultData[\CCrmOwnerType::QuoteName] = $entityID;
         }
         return true;
     } elseif ($this->currentPhase === DealConversionPhase::FINALIZATION) {
         return true;
     }
     return false;
 }
Example #5
0
 $personTypeIDs = CCrmPaySystem::getPersonTypeIDs();
 if (empty($personTypeIDs)) {
     echo CUtil::PhpToJSObject(array('ERROR' => 'PERSON_TYPES_NOT_DEFINED'));
 }
 $personTypeID = isset($personTypeIDs[$clientTypeName]) ? intval($personTypeIDs[$clientTypeName]) : 0;
 if ($personTypeID <= 0) {
     echo CUtil::PhpToJSObject(array('ERROR' => 'COULD_NOT_FIND_PERSON_TYPE'));
     die;
 }
 $enableSaleDiscount = isset($_POST['ENABLE_ADDITIONAL_DISCOUNT']) && strtoupper($_POST['ENABLE_ADDITIONAL_DISCOUNT']) === 'Y';
 $calculateOptions = array();
 $isLDTaxAllowed = isset($_POST['ALLOW_LD_TAX']) ? $_POST['ALLOW_LD_TAX'] === 'Y' : CCrmTax::isTaxMode();
 if ($isLDTaxAllowed && isset($_POST['LOCATION_ID'])) {
     $calculateOptions['LOCATION_ID'] = $_POST['LOCATION_ID'];
 }
 $result = CCrmSaleHelper::Calculate($productRows, $currencyID, $personTypeID, $enableSaleDiscount, $siteID, $calculateOptions);
 if (!is_array($result)) {
     $result = array();
 }
 $totalSum = isset($result['PRICE']) ? round(doubleval($result['PRICE']), 2) : 0.0;
 $totalTax = isset($result['TAX_VALUE']) ? round(doubleval($result['TAX_VALUE']), 2) : 0.0;
 $totalBeforeTax = round($totalSum - $totalTax, 2);
 $totalBeforeDiscount = round($totalBeforeTax + $totalDiscount, 2);
 $arResponse = array('TOTALS' => array('TOTAL_SUM' => $totalSum, 'TOTAL_TAX' => $totalTax, 'TOTAL_BEFORE_TAX' => $totalBeforeTax, 'TOTAL_DISCOUNT' => $totalDiscount, 'TOTAL_BEFORE_DISCOUNT' => $totalBeforeDiscount, 'TOTAL_SUM_FORMATTED' => CCrmCurrency::MoneyToString($totalSum, $currencyID), 'TOTAL_TAX_FORMATTED' => CCrmCurrency::MoneyToString($totalTax, $currencyID), 'TOTAL_BEFORE_TAX_FORMATTED' => CCrmCurrency::MoneyToString($totalBeforeTax, $currencyID), 'TOTAL_DISCOUNT_FORMATTED' => CCrmCurrency::MoneyToString($totalDiscount, $currencyID), 'TOTAL_BEFORE_DISCOUNT_FORMATTED' => CCrmCurrency::MoneyToString($totalBeforeDiscount, $currencyID)));
 if ($isLDTaxAllowed) {
     $taxes = is_array($result['TAX_LIST']) ? $result['TAX_LIST'] : null;
     if (!is_array($taxes) || count($taxes) === 0) {
         $LDTaxes = array(array('TAX_NAME' => GetMessage('CRM_PRODUCT_TOTAL_TAX'), 'TAX_VALUE' => CCrmCurrency::MoneyToString($totalTax, $currencyID)));
     }
     $LDTaxPrecision = isset($_POST['LD_TAX_PRECISION']) ? intval($_POST['LD_TAX_PRECISION']) : 2;
     if (is_array($taxes)) {
Example #6
0
 public static function CalculateTotalInfo($ownerType, $ownerID, $checkPerms = true, $params = null, $rows = null, $totalInfo = array())
 {
     if (!is_array($totalInfo)) {
         $totalInfo = array();
     }
     $result = false;
     if (isset($totalInfo['OPPORTUNITY']) && isset($totalInfo['TAX_VALUE'])) {
         $result = array('OPPORTUNITY' => round(doubleval($totalInfo['OPPORTUNITY']), 2), 'TAX_VALUE' => round(doubleval($totalInfo['TAX_VALUE']), 2));
     } else {
         $arParams = null;
         if ($ownerID <= 0) {
             $arParams = $params;
         } else {
             if ($ownerType === 'L') {
                 $arParams = CCrmLead::GetByID($ownerID, $checkPerms);
             } elseif ($ownerType === 'D') {
                 $arParams = CCrmDeal::GetByID($ownerID, $checkPerms);
             } elseif ($ownerType === CCrmQuote::OWNER_TYPE) {
                 $arParams = CCrmQuote::GetByID($ownerID, $checkPerms);
             }
         }
         if (!is_array($arParams)) {
             return $result;
         }
         $arRows = null;
         if (is_array($rows)) {
             $arRows = $rows;
         } elseif ($ownerID > 0) {
             $arRows = CCrmProductRow::LoadRows($ownerType, $ownerID);
         }
         if (!is_array($arRows)) {
             return $result;
         }
         $currencyID = isset($params['CURRENCY_ID']) ? $params['CURRENCY_ID'] : '';
         if ($currencyID === '') {
             $currencyID = CCrmCurrency::GetBaseCurrencyID();
         }
         $companyID = isset($params['COMPANY_ID']) ? intval($params['COMPANY_ID']) : 0;
         $contactID = isset($params['CONTACT_ID']) ? intval($params['CONTACT_ID']) : 0;
         // Determine person type
         $personTypeId = 0;
         $arPersonTypes = CCrmPaySystem::getPersonTypeIDs();
         if ($companyID > 0 && isset($arPersonTypes['COMPANY'])) {
             $personTypeId = $arPersonTypes['COMPANY'];
         } elseif ($contactID > 0 && isset($arPersonTypes['CONTACT'])) {
             $personTypeId = $arPersonTypes['CONTACT'];
         }
         $enableSaleDiscount = false;
         $siteID = '';
         if (defined('SITE_ID')) {
             $siteID = SITE_ID;
         } else {
             $obSite = CSite::GetList($by = 'def', $order = 'desc', array('ACTIVE' => 'Y'));
             if ($obSite && ($arSite = $obSite->Fetch())) {
                 $siteID = $arSite["LID"];
             }
             unset($obSite, $arSite);
         }
         $calculateOptions = array();
         if (CCrmTax::isTaxMode()) {
             $calculateOptions['LOCATION_ID'] = isset($arParams['LOCATION_ID']) ? $arParams['LOCATION_ID'] : '';
         }
         $calculated = CCrmSaleHelper::Calculate($arRows, $currencyID, $personTypeId, $enableSaleDiscount, $siteID, $calculateOptions);
         $result = array('OPPORTUNITY' => isset($calculated['PRICE']) ? round(doubleval($calculated['PRICE']), 2) : 1.0, 'TAX_VALUE' => isset($calculated['TAX_VALUE']) ? round(doubleval($calculated['TAX_VALUE']), 2) : 0.0);
     }
     return $result;
 }