20 protected $m_oCatalogDB = null;
25 protected $m_oShippingDB = null;
30 protected $m_sCountry = null;
35 protected $m_aTaxDefinition = null;
40 protected $m_aTaxModel = null;
45 protected $m_aTaxBandNames = [];
50 protected $m_aProductTaxes = [];
55 protected $m_nCustomTaxNo = 0;
60 protected $m_aRoundingRules = [
61 TAX_ROUND_TRUNCATION =>
"down",
62 TAX_ROUND_SCIENTIFIC_DOWN =>
"halfdown",
63 TAX_ROUND_SCIENTIFIC_NORMAL =>
"normal",
64 TAX_ROUND_CEILING =>
"up",
65 TAX_ROUND_BANKERS =>
"bankers",
71 protected $m_aRoundingGroups = [
72 TAX_ROUND_PER_LINE =>
"line",
73 TAX_ROUND_PER_ITEM =>
"item",
74 TAX_ROUND_PER_ORDER =>
"order",
80 protected $m_bSimpleTax =
true;
92 $this->m_oCatalogDB = $oCatalogDB;
93 $this->m_oShippingDB = $oShippingDB;
104 if ($this->m_sCountry == null)
106 $oSetupQueryResult = $this->m_oCatalogDB->Select(
'Setup', [
'Country']);
107 $this->m_sCountry = select_get($oSetupQueryResult,
'Country', 0);
109 return $this->m_sCountry;
120 return $this->m_aTaxDefinition;
132 $oQueryResult = $this->m_oCatalogDB->Select(
'Countries', [
'nCountryID'], [[
'sCountryCode', $sCountryName]]);
133 $nCountryID = select_get($oQueryResult,
'nCountryID', 0);
134 $oQueryResult = $this->m_oShippingDB->Select(
'ZoneMembers', [
'ZoneID'], [[
'RegionID', $nCountryID]]);
135 $nZoneID = select_get($oQueryResult,
'ZoneID');
136 return [$nCountryID, $nZoneID];
149 list($nCountryID, $nZoneID) = $this->GenerateOpaqueShipDataElements($sCountry);
150 $sOpaqueShipData =
"ShippingClass;Unknown;ShippingZone;$nZoneID;BasisTotal;0.000000;Simple;$nCost;NoRecalculation;";
151 return $sOpaqueShipData;
168 list($nCountryID, $nZoneID) = $this->GenerateOpaqueShipDataElements($sCountryName);
169 $oQueryResult = $this->m_oShippingDB->Select(
'Zones',
'*', [[
'ZoneID', $nZoneID], [
'bInternational',
true]]);
170 if (is_object($oQueryResult))
172 $aZones = $oQueryResult->fetch(\PDO::FETCH_ASSOC);
173 return !empty($aZones);
187 return ";ALT_WEIGHT=" . arr_get($aProduct,
'sAltWeight',
'')
188 .
";EXCLUDE_FROM_SHIP=" . abs(arr_get($aProduct,
'bExcludeFromShippingCalc', 0))
189 .
";SHIP_CATEGORY=" . arr_get($aProduct,
'sShippingCategory', 0)
190 .
";SHIP_QUANTITY=" . arr_get($aProduct,
'nShippingQuantity', 1)
191 .
";SHIP_SUPPLEMENT=" . arr_get($aProduct,
'dShippingSupplement', 0)
192 .
";SHIP_SUPPLEMENT_ONCE=" . arr_get($aProduct,
'bShipSupplAppliedOnce', 0)
193 .
";HAND_SUPPLEMENT=" . arr_get($aProduct,
'dHandlingSupplement', 0)
194 .
";HAND_SUPPLEMENT_ONCE=" . arr_get($aProduct,
'bHandSupplAppliedOnce', 0)
195 .
";EXCLUDE_PARENT=" . arr_get($aProduct,
'', 0)
196 .
";SEP_LINE=" . arr_get($aProduct,
'bShipSeparately',
'')
197 .
";USE_ASSOC_SHIP=" . arr_get($aProduct,
'',
'')
223 if (null == $sCountryName)
225 return "0=0=0=0=0==0=0=0==0=0=0==0=0=0==";
227 if ($this->m_bSimpleTax)
229 $nTaxModel = TAX_MODEL_SIMPLE;
230 $aTaxes = $this->GetSimpleTaxes($this->GetTaxModel());
234 $nTaxModel = TAX_MODEL_ADVANCED;
235 $aTaxes = $this->GetCountryTaxes($sCountryName);
238 $nTaxBy = TAX_BY_ALWAYS_TAX;
239 $sShippingTax1OpaqueData = arr_get($aTaxes,
'1.sShippingOpaqueData',
"0=0=0=");
240 $sShippingTax2OpaqueData = arr_get($aTaxes,
'2.sShippingOpaqueData',
"0=0=0=");
241 $sHandlingTax1OpaqueData = arr_get($aTaxes,
'1.sHandlingOpaqueData',
"0=0=0=");
242 $sHandlingTax2OpaqueData = arr_get($aTaxes,
'2.sHandlingOpaqueData',
"0=0=0=");
243 $sShippingTax1BandName = arr_get($this->m_aTaxBandNames, $this->ParseProductTaxData($sShippingTax1OpaqueData)->nBandID,
'');
244 $sShippingTax2BandName = arr_get($this->m_aTaxBandNames, $this->ParseProductTaxData($sShippingTax2OpaqueData)->nBandID,
'');
245 $sHandlingTax1BandName = arr_get($this->m_aTaxBandNames, $this->ParseProductTaxData($sHandlingTax1OpaqueData)->nBandID,
'');
246 $sHandlingTax2BandName = arr_get($this->m_aTaxBandNames, $this->ParseProductTaxData($sHandlingTax2OpaqueData)->nBandID,
'');
247 if (empty(trim($sShippingTax1OpaqueData)))
249 $sShippingTax1OpaqueData =
"0=0=0=";
251 if (empty(trim($sShippingTax2OpaqueData)))
253 $sShippingTax2OpaqueData =
"0=0=0=";
255 if (empty(trim($sHandlingTax1OpaqueData)))
257 $sHandlingTax1OpaqueData =
"0=0=0=";
259 if (empty(trim($sHandlingTax2OpaqueData)))
261 $sHandlingTax2OpaqueData =
"0=0=0=";
263 $sTaxModelOpaqueData =
"$nTaxModel=$nTaxBy=$sShippingTax1OpaqueData$sShippingTax1BandName=$sShippingTax2OpaqueData$sShippingTax2BandName=$sHandlingTax1OpaqueData$sHandlingTax1BandName=$sHandlingTax2OpaqueData$sHandlingTax2BandName=";
264 return $sTaxModelOpaqueData;
275 $oQueryResult = $this->m_oCatalogDB->Select(
276 'TaxSetup', [[
'TaxZones',
'bIncludeTax1']], [[[
'TaxSetup',
'nModelID'], 0]], [
278 [
'left',
'TaxZones', [[[
'TaxZones',
'nModelID'], [
'TaxSetup',
'nModelID']]]],
282 if ($oQueryResult ===
false)
286 $aTaxZonesResult = $oQueryResult->fetch(\PDO::FETCH_ASSOC);
287 if ($oQueryResult ===
false)
294 $bIncludeTax1 = (bool) abs(arr_get($aTaxZonesResult,
'bIncludeTax1',
true));
295 return $bIncludeTax1;
308 for ($nIndex = 1; $nIndex <= 2; $nIndex++)
310 if (arr_get($aTaxModel,
'bIncludeTax' . $nIndex .
'Always', 1) != 0)
312 $oQueryResult = $this->m_oCatalogDB->Select(
313 'Taxes', [[
'Taxes',
'*']], [[
'nTaxID', arr_get($aTaxModel,
'nTax' . $nIndex .
'ID', 1)]]
315 if ($oQueryResult ===
false)
319 $aTaxes[$nIndex] = $oQueryResult->fetch(\PDO::FETCH_ASSOC);
334 return array_filter([
335 1 => $this->GetCountryTax($sCountryName, 1),
336 2 => $this->GetCountryTax($sCountryName, 2),
348 if ($this->m_aTaxModel == null)
350 $oQueryResult = $this->m_oCatalogDB->Select(
351 'TaxSetup', [[
'TaxModels',
'*'],
'sShippingTax1OpaqueData',
'sShippingTax2OpaqueData',
'sHandlingTax1OpaqueData',
'sHandlingTax2OpaqueData',
'bTaxZonesRestrictive',
'bTaxInclusiveMode'], [], [
353 [
'left',
'TaxModels', [[[
'TaxSetup',
'nModelID'], [
'TaxModels',
'nModelID']]]],
357 if ($oQueryResult ===
false)
361 return $oQueryResult->fetch(\PDO::FETCH_ASSOC);
365 return $this->m_aTaxModel;
378 if (!in_array($nTaxNo, [1, 2]))
382 $oQueryResult = $this->m_oCatalogDB->Select(
383 'Taxes', [[
'Taxes',
'*'], [
'TaxZones',
'bAllowTax1UserExemption'], [
'TaxZones',
'bAllowTax2UserExemption'], [
'TaxZones',
'bTaxOtherTaxes']], [[
'sCountryName', $sCountryName]], [
385 [
'left',
'TaxZones', [[[
'Taxes',
'nTaxID'], [
'TaxZones',
'nTax' . $nTaxNo .
'ID']]]],
386 [
'left',
'TaxZoneMembers', [[[
'TaxZones',
'nZoneID'], [
'TaxZoneMembers',
'nTaxZoneID']]]],
387 [
'left',
'Countries', [[[
'TaxZoneMembers',
'nRegionID'], [
'Countries',
'nCountryID']]]],
391 if ($oQueryResult ===
false)
395 return $oQueryResult->fetch(\PDO::FETCH_ASSOC);
427 if (null == $sCountryName)
431 $aTaxes = $this->GetCountryTax($sCountryName, $nTaxIndex);
433 $sTaxName = $aTaxes[
'sTaxName'];
434 $sTaxID = $aTaxes[
'nTaxID'];
435 $nRoundRule = $aTaxes[
'nRoundingRule'];
436 $sRoundGroup = $aTaxes[
'nRoundingGroup'];
437 $nTaxOtherTaxesFlag = $aTaxes[
'bTaxOtherTaxes'];
438 $nLowThreshold = $aTaxes[
'nRoundingGroup'];
439 $nHighThreshold = $aTaxes[
'nHighThreshold'];
440 $sAllowExemption = $aTaxes[
'bAllowTax' . $nTaxIndex .
'UserExemption'];
442 $sTaxOpaqueData =
"$sTaxName=$nRoundRule=$sRoundGroup=$nTaxOtherTaxesFlag=$nLowThreshold=$nHighThreshold=$sAllowExemption=$sTaxID=";
443 return $sTaxOpaqueData;
454 $sCountry = $this->GetCountry();
455 $oQueryResult = $this->m_oCatalogDB->Select(
456 'TaxBands', [[
'TaxBands',
'*']], [[
'sCountryName', $sCountry]], [
458 [
'left',
'TaxZones', [[[
'TaxBands',
'nTaxID'], [
'TaxZones',
'nTax1ID']]]],
459 [
'left',
'TaxZoneMembers', [[[
'TaxZones',
'nZoneID'], [
'TaxZoneMembers',
'nTaxZoneID']]]],
460 [
'left',
'Countries', [[[
'TaxZoneMembers',
'nRegionID'], [
'Countries',
'nCountryID']]]],
464 $aTaxBands = $oQueryResult->fetch(\PDO::FETCH_ASSOC);
486 return $oTaxBand->nBandID .
"=" . $oTaxBand->dBandRate .
"=" . $oTaxBand->nCustomRate .
"=" . $this->m_aTaxBandNames[$oTaxBand->nBandID] .
"=";
498 if (is_array($vTaxBand))
500 $vTaxBand = (object) array_intersect_key($vTaxBand, array_flip([
"nBandID",
"dBandRate",
"nCustomRate"]));
501 $vTaxBand->nCustomRate = $vTaxBand->nCustomRate? : 0;
503 $vTaxBand->dBandRate = (double) $vTaxBand->dBandRate;
517 $oDefault = (object) [
"nBandID" => arr_get($aDefaultTaxBandAttributes,
'id', 0),
"dBandRate" => float2sdnum(arr_get($aDefaultTaxBandAttributes,
'rate', 0.0)),
"nCustomRate" => 0.0,
"sName" => arr_get($aDefaultTaxBandAttributes,
'name',
'')];
518 if (empty($sTaxOpaqueData))
522 $aTaxOpaqueData = explode(
"=", $sTaxOpaqueData);
523 array_pop($aTaxOpaqueData);
524 if (count($aTaxOpaqueData) != 3)
528 $oTaxOpaqueData = (object) array_combine([
"nBandID",
"dBandRate",
"nCustomRate"], $aTaxOpaqueData);
529 return $oTaxOpaqueData;
541 if (!isset($this->m_aTaxDefinition[$sCountryName]))
543 $this->m_aTaxDefinition[$sCountryName] = [
546 'taxinclusiveprices' =>
'yes',
551 $aTaxModel = $this->GetTaxModel();
552 if (arr_get($aTaxModel,
'nModelID', TAX_MODEL_SIMPLE) == TAX_MODEL_SIMPLE)
554 $this->m_bSimpleTax =
true;
555 $aTaxes = $this->GetSimpleTaxes($aTaxModel);
559 $this->m_bSimpleTax =
false;
560 $aTaxes = $this->GetCountryTaxes($sCountryName);
562 foreach ($aTaxes as $aTax)
565 $this->m_aTaxDefinition[$sCountryName][
"tax$nTaxCount"][
"@attributes"] = [
566 'id' => $aTax[
'nTaxID'],
567 'name' => iconv(
'WINDOWS-1256',
'UTF-8', $aTax[
'sTaxName']),
568 'roundingmethod' => $this->m_aRoundingRules[$aTax[
'nRoundingRule']],
569 'roundinglevel' => $this->m_aRoundingGroups[$aTax[
'nRoundingGroup']],
571 $oTaxBandsQueryResult = $this->m_oCatalogDB->Select(
'TaxBands',
'*', [[
'nTaxID', $aTax[
'nTaxID']]]);
572 if (
false === $oTaxBandsQueryResult)
576 $aTaxBands = $oTaxBandsQueryResult->fetchAll();
577 foreach ($aTaxBands as $nTaxBandIndex => $aTaxBand)
580 $nBandID = $aTaxBand[
'nBandID'];
581 $sBandName = iconv(
'WINDOWS-1256',
'UTF-8', $aTaxBand[
'sBandName']);
582 $this->m_aTaxBandNames[$nBandID] = $this->m_aTaxBandNames[$aTaxBand[$nBandID]] ? : $sBandName;
583 $this->m_aTaxDefinition[$sCountryName][
"tax$nTaxCount"][
"band"][] = [
586 'name' => $sBandName,
587 'rate' => $aTaxBand[
'dBandRate'],
591 $this->m_aTaxBandNames[0] = $this->m_aTaxBandNames[0] ? :
"Zero-Rated";
592 $this->m_aTaxDefinition[$sCountryName][
"tax$nTaxCount"][
"band"][] = [
595 'name' =>
"Zero&#45;Rated",
596 'rate' =>
"0.000000",
599 $this->m_aTaxBandNames[1] = $this->m_aTaxBandNames[1] ? :
"Exempt";
600 $this->m_aTaxDefinition[$sCountryName][
"tax$nTaxCount"][
"band"][] = [
604 'rate' =>
"0.000000",
608 $this->m_aTaxDefinition[$sCountryName][
"@attributes"][
"taxcount"] = $nTaxCount;
610 return $this->m_aTaxDefinition[$sCountryName];
622 $aProcessedOrder = $oOrder;
623 return $aProcessedOrder;
635 $this->m_aTaxDefinition[$sCountryName][
"tax$nTaxIndex"][
"band"][] = [
637 'id' =>
"c100-$nTaxIndex",
638 'name' =>
"Custom tax 100%",
642 $this->m_aTaxDefinition[$sCountryName][
"tax$nTaxIndex"][
"band"][] = [
644 'id' =>
"c000-$nTaxIndex",
645 'name' =>
"Custom tax 0%",
658 public function SetCustomTax($sCountryName, $nTaxIndex, $aOrderDetailTaxXML, $nCustomRate)
660 $this->AddCustomTaxToDefinition($sCountryName, $nTaxIndex);
661 $dRate = $nCustomRate / sdnum2float($aOrderDetailTaxXML[
'@attributes'][
'price']);
662 if (isset($aOrderDetailTaxXML[
'lineband'][0][
'@attributes'][
'applypercent']))
664 $nOtherTaxIndex = 3 - $nTaxIndex;
665 $aOrderDetailTaxXML[
'lineband'][0][
'@attributes'][
'tax' . $nTaxIndex .
'bandid'] =
"c000-$nTaxIndex";
666 $aOrderDetailTaxXML[
'lineband'][1][
'@attributes'][
'applypercent'] -= $dRate;
667 $aOrderDetailTaxXML[
'lineband'][1][
'@attributes'][
'tax' . $nTaxIndex .
'bandid'] =
"c000-$nTaxIndex";
668 $aOrderDetailTaxXML[
'lineband'][2][
'@attributes'][
'applypercent'] = $dRate;
669 $aOrderDetailTaxXML[
'lineband'][2][
'@attributes'][
'tax' . $nTaxIndex .
'bandid'] =
"c100-$nTaxIndex";
670 $aOrderDetailTaxXML[
'lineband'][2][
'@attributes'][
'tax' . $nOtherTaxIndex .
'bandid'] =
"c000-$nOtherTaxIndex";
674 $aOrderDetailTaxXML[
'lineband'][0][
'@attributes'][
'applypercent'] = $dRate;
675 $aOrderDetailTaxXML[
'lineband'][0][
'@attributes'][
'tax' . $nTaxIndex .
'bandid'] =
"c100-$nTaxIndex";
676 $aOrderDetailTaxXML[
'lineband'][1][
'@attributes'][
'applypercent'] = 100.00 - $dRate;
677 $aOrderDetailTaxXML[
'lineband'][1][
'@attributes'][
'tax' . $nTaxIndex .
'bandid'] =
"c000-$nTaxIndex";
679 return $aOrderDetailTaxXML;
691 public function AddTaxBands($sCountryName, $aOrderProducts, $aOrderDetailTaxXMLs)
693 foreach ($aOrderDetailTaxXMLs as $nOrderDetailID => $aOrderDetailTaxXML)
695 $sProductReference = arr_get($aOrderDetailTaxXML,
'@attributes.reference', 0);
696 $aOrderProduct = arr_get($aOrderProducts, $sProductReference, []);
697 $aOrderDetailTaxXMLs[$nOrderDetailID][
'@attributes'][
'orderdetailid'] = $nOrderDetailID;
698 $aTaxBands = $this->GetTaxBandsFromDefinition($sCountryName, $aOrderProduct);
699 $aTaxBandIDs = $this->GetTaxBandIDs($aTaxBands);
700 foreach ($aTaxBands as $nTaxIndex => $oTaxBand)
702 $aOrderDetailTaxXMLs[$nOrderDetailID][
'@attributes'][
'tax' . $nTaxIndex .
'rate'] = (double) $oTaxBand->dBandRate;
703 $aOrderDetailTaxXMLs[$nOrderDetailID][
'@attributes'][
'tax' . $nTaxIndex .
'opaquedata'] = $this->GenerateTaxOpaqueDataForOrderDetail($oTaxBand);
705 switch ($this->CountCustom($aTaxBandIDs))
708 foreach ($aTaxBandIDs as $nTaxIndex => $nTaxBandID)
710 $aOrderDetailTaxXMLs[$nOrderDetailID][
'@attributes'][
'tax' . $nTaxIndex .
'bandid'] = $nTaxBandID;
714 $nCustomTaxIndex = arr_get($aTaxBandIDs, 1, 0) == 6 ? 1 : 2;
715 $nNonCustomTaxIndex = 3 - $nCustomTaxIndex;
716 $nCustomRate = $aTaxBands[$nCustomTaxIndex]->nCustomRate;
717 $nNonCustomTaxBandID = $aTaxBandIDs[$nNonCustomTaxIndex];
718 $aOrderDetailTaxXMLs[$nOrderDetailID] = $this->SetCustomTax($sCountryName, $nCustomTaxIndex, $aOrderDetailTaxXMLs[$nOrderDetailID], $nCustomRate);
719 $aOrderDetailTaxXMLs[$nOrderDetailID][
'lineband'][0][
'@attributes'][
'tax' . $nNonCustomTaxIndex .
'bandid'] = $nNonCustomTaxBandID;
720 $aOrderDetailTaxXMLs[$nOrderDetailID][
'lineband'][1][
'@attributes'][
'tax' . $nNonCustomTaxIndex .
'bandid'] = $nNonCustomTaxBandID;
723 foreach ($aTaxBands as $nTaxIndex => $oTaxBand)
725 $aOrderDetailTaxXMLs[$nOrderDetailID] = $this->SetCustomTax($sCountryName, $nTaxIndex, $aOrderDetailTaxXMLs[$nOrderDetailID], $oTaxBand->nCustomRate);
730 return $aOrderDetailTaxXMLs;
743 $aTaxBandsTmp = arr_get($this->m_aTaxDefinition,
"$sCountryName.tax$nTaxIndex.band", []);
744 $aTaxBandTmp = is_array($aTaxBandsTmp) ? array_shift($aTaxBandsTmp) : [];
745 return arr_get($aTaxBandTmp,
"@attributes", []);
759 $nTaxCount = arr_get($this->m_aTaxDefinition,
"$sCountryName.@attributes.taxcount", 1);
760 $nSpecTaxDiff = $this->m_bSimpleTax ? 0 : 2;
761 for ($nTaxIndex = 1; $nTaxIndex <= $nTaxCount; $nTaxIndex++)
763 $nTaxOpaqueDataNo = arr_get($this->m_aTaxDefinition,
"$sCountryName.tax$nTaxIndex.@attributes.id", $nTaxIndex + $nSpecTaxDiff) - $nSpecTaxDiff;
764 $sTaxOpaqueData = arr_get($aOrderProduct,
'sTax' . $nTaxOpaqueDataNo .
'OpaqueData',
'');
765 $aDefaultTaxBandAttributes = $this->GetFirstTaxBand($sCountryName, $nTaxIndex);
766 $aTaxBands[$nTaxIndex] = $this->ParseProductTaxData($sTaxOpaqueData, $aDefaultTaxBandAttributes);
780 return array_map(
function($oTaxBand)
782 return $oTaxBand->nBandID;
799 'price' => $dShipping,
801 'groupid' =>
'discountedcart',
807 if ($this->m_bSimpleTax)
809 $nTaxModel = TAX_MODEL_SIMPLE;
810 $aTaxes = $this->GetSimpleTaxes($this->GetTaxModel());
814 $nTaxModel = TAX_MODEL_ADVANCED;
815 $aTaxes = $this->GetCountryTaxes($sCountryName);
817 $nTaxBy = TAX_BY_ALWAYS_TAX;
818 $nTaxCount = $this->m_aTaxDefinition[$sCountryName][
"@attributes"][
"taxcount"];
819 $sShippingTax1OpaqueData = arr_get($aTaxes,
'1.sShippingOpaqueData',
"0=0=0=");
820 $oTaxOpaqueData = $this->ParseProductTaxData($sShippingTax1OpaqueData);
821 if ($oTaxOpaqueData->nBandID != 5)
823 $aShipping[
'@attributes'][
'tax1bandid'] = $oTaxOpaqueData->nBandID;
827 $sShippingTax2OpaqueData = arr_get($aTaxes,
'2.sShippingOpaqueData',
"0=0=0=");
828 $oTaxOpaqueData = $this->ParseProductTaxData($sShippingTax2OpaqueData);
829 if ($oTaxOpaqueData->nBandID != 5)
831 $aShipping[
'@attributes'][
'tax2bandid'] = $oTaxOpaqueData->nBandID;
846 $aCountValues = array_count_values($aTaxBandIDs);
847 return arr_get($aCountValues, 6, 0);
860 public function ProcessTaxes($sCountryName, $aOrderProducts, $aOrderDetailTaxXMLs, $dShipping = 0)
862 if (!class_exists(
'CTaxModule'))
864 throw new \SDExtension\SDException\SDException(
"CTaxModule not found");
866 $this->LoadTaxes($sCountryName);
867 $aCustomer = [
'@attributes' => [
'tax1exempt' =>
'no',]];
868 $aZone = [
'@attributes' => [
'tax1applies' =>
'yes',]];
869 $nTaxCount = $this->m_aTaxDefinition[$sCountryName][
"@attributes"][
"taxcount"];
872 $aCustomer[
'@attributes'][
'tax2exempt'] =
'no';
873 $aZone[
'@attributes'][
'tax2applies'] =
'yes';
875 $aOrderDetailTaxXMLs = $this->AddTaxBands($sCountryName, $aOrderProducts, $aOrderDetailTaxXMLs);
876 $aOrderDetailTaxXMLs = [
878 '@attributes' => [
'id' =>
'discountedcart'],
880 '@attributes' => [
'id' =>
'cart'],
881 'orderline' => $aOrderDetailTaxXMLs,
885 $aOrderDetailTaxXMLs[
'orderline'] = $this->GetShippingLine($dShipping, $sCountryName);
886 $oTaxModule = new \CTaxModule();
888 'taxdefinition' => $this->m_aTaxDefinition[$sCountryName],
889 'customer' => $aCustomer,
891 'order' => $aOrderDetailTaxXMLs,
894 $sTaxXML = $oTaxXML->saveXML();
895 $sTaxModuleOutputXML = $oTaxModule->Process($sTaxXML);
897 if (arr_get($aTaxModuleOutputXML,
'MESSAGE.ORDER.GROUP.GROUP.ORDERLINE.LINEBAND', null) == null)
899 foreach (arr_get($aTaxModuleOutputXML,
'MESSAGE.ORDER.GROUP.GROUP.ORDERLINE', []) as $nKey => $aOrderLine)
901 $aTaxModuleOutputXML[
'MESSAGE'][
'ORDER'][
'GROUP'][
'GROUP'][
'ORDERLINE'][
"tmp$nKey"] = $aOrderLine;
902 unset($aTaxModuleOutputXML[
'MESSAGE'][
'ORDER'][
'GROUP'][
'GROUP'][
'ORDERLINE'][$nKey]);
904 foreach (arr_get($aTaxModuleOutputXML,
'MESSAGE.ORDER.GROUP.GROUP.ORDERLINE', []) as $sKey => $aOrderLine)
906 $aTaxModuleOutputXML[
'MESSAGE'][
'ORDER'][
'GROUP'][
'GROUP'][
'ORDERLINE'][arr_get($aOrderLine,
'@attributes.ORDERDETAILID', 0)] = $aOrderLine;
907 unset($aTaxModuleOutputXML[
'MESSAGE'][
'ORDER'][
'GROUP'][
'GROUP'][
'ORDERLINE'][$sKey]);
912 $aOrderLine = arr_get($aTaxModuleOutputXML,
'MESSAGE.ORDER.GROUP.GROUP.ORDERLINE', []);
913 $nOrderDetailID = arr_get($aTaxModuleOutputXML,
'MESSAGE.ORDER.GROUP.GROUP.ORDERLINE.@attributes.ORDERDETAILID', []);
914 unset($aTaxModuleOutputXML[
'MESSAGE'][
'ORDER'][
'GROUP'][
'GROUP'][
'ORDERLINE']);
915 $aTaxModuleOutputXML[
'MESSAGE'][
'ORDER'][
'GROUP'][
'GROUP'][
'ORDERLINE'][$nOrderDetailID] = $aOrderLine;
919 return $aTaxModuleOutputXML;
static get($sChannel="default", $sLogRoot="")
CountCustom($aTaxBandIDs)
SetCustomTax($sCountryName, $nTaxIndex, $aOrderDetailTaxXML, $nCustomRate)
GenerateOpaqueShipData($sCountry, $nCost)
GetTaxBandIDs($aTaxBands)
GetSimpleTaxes($aTaxModel)
GenerateOpaqueShipDataForOrderDetail($aProduct)
GenerateOpaqueShipDataElements($sCountryName)
GenerateTaxOpaqueDataForOrderDetail($oTaxBand)
AddTaxBands($sCountryName, $aOrderProducts, $aOrderDetailTaxXMLs)
static & createXML($node_name, $arr=array(), $namespace=null)
GetFirstTaxBand($sCountryName, $nTaxIndex)
NormalizeTaxBand($vTaxBand)
TransformOrderToXMLArray($oOrder)
ParseProductTaxData($sTaxOpaqueData, $aDefaultTaxBandAttributes=[])
ProcessTaxes($sCountryName, $aOrderProducts, $aOrderDetailTaxXMLs, $dShipping=0)
GenerateTaxOpaqueData($sCountryName, $nTaxIndex)
GetShippingLine($dShipping, $sCountryName)
GetTaxBandsFromDefinition($sCountryName, $aOrderProduct)
__construct($oCatalogDB, $oShippingDB)
GenerateTaxModelOpaqueData($sCountryName)
AddCustomTaxToDefinition($sCountryName, $nTaxIndex)
GetCountryTax($sCountryName, $nTaxNo=1)
GetInternationalShipping($sCountryName)
GetCountryTaxes($sCountryName)
static & createArray($input_xml)