Page Menu
Home
In-Portal Phabricator
Search
Configure Global Search
Log In
Files
F864438
in-commerce
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Subscribers
None
File Metadata
Details
File Info
Storage
Attached
Created
Sat, May 3, 5:32 PM
Size
12 KB
Mime Type
text/x-diff
Expires
Mon, May 5, 5:32 PM (3 h, 43 m)
Engine
blob
Format
Raw Data
Handle
614292
Attached To
rMINC Modules.In-Commerce
in-commerce
View Options
Index: branches/5.2.x/units/orders/orders_item.php
===================================================================
--- branches/5.2.x/units/orders/orders_item.php (revision 16696)
+++ branches/5.2.x/units/orders/orders_item.php (revision 16697)
@@ -1,387 +1,391 @@
<?php
/**
* @version $Id$
* @package In-Commerce
* @copyright Copyright (C) 1997 - 2009 Intechnic. All rights reserved.
* @license Commercial License
* This software is protected by copyright law and international treaties.
* Unauthorized reproduction or unlicensed usage of the code of this program,
* or any portion of it may result in severe civil and criminal penalties,
* and will be prosecuted to the maximum extent possible under the law
* See http://www.in-portal.org/commercial-license for copyright notices and details.
*/
defined('FULL_PATH') or die('restricted access!');
class OrdersItem extends kDBItem
{
/**
* Sets item' fields corresponding to elements in passed $hash values.
* The function sets current item fields to values passed in $hash, by matching $hash keys with field names
* of current item. If current item' fields are unknown {@link kDBItem::PrepareFields()} is called before actually setting the fields
*
* @param Array $hash Fields hash.
* @param Array $set_fields Optional param, field names in target object to set, other fields will be skipped
*
* @return void
*/
public function SetFieldsFromHash($hash, $set_fields = Array ())
{
parent::SetFieldsFromHash($hash, $set_fields);
$options = $this->GetFieldOptions('PaymentCCExpDate');
+ $month_field = $options['month_field'];
+ $year_field = $options['year_field'];
- if ( $this->GetDirtyField($options['month_field']) || $this->GetDirtyField($options['year_field']) ) {
+ if ( (isset($hash[$month_field]) && $this->GetDirtyField($month_field))
+ || (isset($hash[$year_field]) && $this->GetDirtyField($year_field))
+ ) {
$this->SetDirtyField('PaymentCCExpDate', 0);
$this->SetField('PaymentCCExpDate', 0);
}
}
/**
* Returns gateway data based on payment type used in order
*
* @param int $pt_id
* @return Array
* @access public
*/
public function getGatewayData($pt_id = null)
{
// get Gateway fields
if ( !isset($pt_id) || !$pt_id ) {
$pt_id = $this->GetDBField('PaymentType');
if ( !$pt_id ) {
// no Payment Type Id found for this order - escape SQL fatal below
return false;
}
}
$pt_table = $this->Application->getUnitOption('pt', 'TableName');
$sql = 'SELECT GatewayId
FROM %s
WHERE PaymentTypeId = %s';
$gw_id = $this->Conn->GetOne(sprintf($sql, $pt_table, $pt_id));
$sql = 'SELECT *
FROM %s
WHERE GatewayId = %s';
$ret = $this->Conn->GetRow(sprintf($sql, TABLE_PREFIX . 'Gateways', $gw_id));
// get Gateway parameters based on payment type
$gwf_table = $this->Application->getUnitOption('gwf', 'TableName');
$gwfv_table = $this->Application->getUnitOption('gwfv', 'TableName');
$sql = 'SELECT gwfv.Value, gwf.SystemFieldName
FROM %s gwf
LEFT JOIN %s gwfv ON gwf.GWConfigFieldId = gwfv.GWConfigFieldId
WHERE gwfv.PaymentTypeId = %s AND gwf.GatewayId = %s';
$ret['gw_params'] = $this->Conn->GetCol(sprintf($sql, $gwf_table, $gwfv_table, $pt_id, $gw_id), 'SystemFieldName');
$ret['gw_params']['gateway_id'] = $gw_id;
if ( $this->GetDBField('IsRecurringBilling') && $this->Application->ConfigValue('Comm_AutoProcessRecurringOrders') ) {
if ( isset($ret['gw_params']['shipping_control']) ) {
$ret['gw_params']['shipping_control'] = SHIPPING_CONTROL_DIRECT;
}
}
return $ret;
}
/**
* Checks if tangible items are present in order
*
* @return boolean
*/
public function HasTangibleItems()
{
$oi_table = TABLE_PREFIX . 'OrderItems';
if ( $this->IsTempTable() ) {
$oi_table = $this->Application->GetTempName($oi_table, 'prefix:' . $this->Prefix);
}
$sql = 'SELECT COUNT(*)
FROM ' . $oi_table . ' orditems
LEFT JOIN ' . TABLE_PREFIX . 'Products p ON p.ProductId = orditems.ProductId
WHERE (orditems.OrderId = ' . $this->GetID() . ') AND (p.Type = ' . PRODUCT_TYPE_TANGIBLE . ')';
return $this->Conn->GetOne($sql) > 0;
}
/**
* Calculates tax value of order items based on billing & shipping country specified
*
* @return double
*/
function getTaxPercent()
{
/** @var kCountryStatesHelper $cs_helper */
$cs_helper = $this->Application->recallObject('CountryStatesHelper');
$shipping_country_id = $cs_helper->getCountryStateId($this->GetDBField('ShippingCountry'), DESTINATION_TYPE_COUNTRY);
$shipping_state_id = $cs_helper->getCountryStateId($this->GetDBField('ShippingState'), DESTINATION_TYPE_STATE);
$shipping_zip = (string) $this->GetDBField('ShippingZip');
$billing_country_id = $cs_helper->getCountryStateId($this->GetDBField('BillingCountry'), DESTINATION_TYPE_COUNTRY);
$billing_state_id = $cs_helper->getCountryStateId($this->GetDBField('BillingState'), DESTINATION_TYPE_STATE);
$billing_zip = (string) $this->GetDBField('BillingZip');
/*
$dest_ids = array_diff( array_unique( Array( $shipping_country_id, $shipping_state_id, $billing_country_id, $billing_state_id ) ), Array(0) );
$dest_values = array_diff( array_unique( Array( $this->Conn->qstr($shipping_zip), $this->Conn->qstr($billing_zip) ) ), Array('\'\'') );
*/
$tax = false;
$sql = 'SELECT tx.*
FROM '.$this->Application->getUnitOption('tax', 'TableName').' tx
LEFT JOIN '.$this->Application->getUnitOption('taxdst', 'TableName').' txd ON tx.TaxZoneId = txd.TaxZoneId
WHERE
( txd.StdDestId IN ('.$shipping_country_id.','.$shipping_state_id.')
AND
( (txd.DestValue = "" OR txd.DestValue IS NULL)
OR
txd.DestValue = '.$this->Conn->qstr($shipping_zip).'
)
)
OR
( txd.StdDestId IN ('.$billing_country_id.','.$billing_state_id.')
AND
( (txd.DestValue = "" OR txd.DestValue IS NULL)
OR
txd.DestValue = '.$this->Conn->qstr($billing_zip).'
)
)
ORDER BY tx.TaxValue DESC';
$tax = $this->Conn->GetRow($sql);
if ($tax == false) {
$tax['TaxValue'] = 0;
$tax['ApplyToShipping'] = 0;
$tax['ApplyToProcessing'] = 0;
}
return $tax;
}
function RecalculateTax()
{
$tax = $this->getTaxPercent();
$this->SetDBField('VATPercent', $tax['TaxValue']);
$this->SetDBField('ShippingTaxable', $tax['ApplyToShipping']);
$this->SetDBField('ProcessingTaxable', $tax['ApplyToProcessing']);
$this->UpdateTotals();
if ( !$this->GetDBField('VATIncluded') ) {
$subtotal = $this->GetDBField('AmountWithoutVAT');
$tax_exempt = $this->getTaxExempt();
if ( $tax_exempt ) {
$subtotal -= $tax_exempt;
}
$this->SetDBField('VAT', round($subtotal * $tax['TaxValue'] / 100, 2));
$this->UpdateTotals();
}
}
/**
* Returns order amount, that is excluded from tax calculations
*
* @return float
* @access protected
*/
protected function getTaxExempt()
{
$sql = 'SELECT SUM(oi.Quantity * oi.Price)
FROM ' . TABLE_PREFIX . 'OrderItems AS oi
LEFT JOIN ' . TABLE_PREFIX . 'Products AS p ON p.ProductId = oi.ProductId
WHERE p.Type = 6 AND oi.OrderId = ' . $this->GetDBField('OrderId');
return $this->Conn->GetOne($sql);
}
function UpdateTotals()
{
$total = 0;
$total += $this->GetDBField('SubTotal');
if ( $this->GetDBField('ShippingTaxable') ) {
$total += $this->GetDBField('ShippingCost');
}
if ( $this->GetDBField('ProcessingTaxable') ) {
$total += $this->GetDBField('ProcessingFee');
}
if ( $this->GetDBField('VATIncluded') ) {
$tax_exempt = $this->getTaxExempt();
$vat_percent = $this->GetDBField('VATPercent');
$this->SetDBField('VAT', round(($total - $tax_exempt) * $vat_percent / (100 + $vat_percent), 2));
$this->SetDBField('AmountWithoutVAT', $total - $this->GetDBField('VAT'));
}
else {
$this->SetDBField('AmountWithoutVAT', $total);
$total += $this->GetDBField('VAT');
}
if ( !$this->GetDBField('ShippingTaxable') ) {
$total += $this->GetDBField('ShippingCost');
}
if ( !$this->GetDBField('ProcessingTaxable') ) {
$total += $this->GetDBField('ProcessingFee');
}
$total += $this->GetDBField('InsuranceFee');
$this->SetDBField('TotalAmount', $total);
}
function getTotalAmount()
{
return $this->GetDBField('SubTotal') +
$this->GetDBField('ShippingCost') +
($this->GetDBField('VATIncluded') ? 0 : $this->GetDBField('VAT')) +
$this->GetDBField('ProcessingFee') +
$this->GetDBField('InsuranceFee') -
$this->GetDBField('GiftCertificateDiscount');
}
function requireCreditCard()
{
$sql = 'SELECT RequireCCFields
FROM ' . $this->Application->getUnitOption('pt', 'TableName') . ' pt
LEFT JOIN '.TABLE_PREFIX.'Gateways gw ON gw.GatewayId = pt.GatewayId
WHERE pt.PaymentTypeId = ' . $this->GetDBField('PaymentType');
return $this->Conn->GetOne($sql);
}
function getNextSubNumber()
{
$table = $this->Application->GetLiveName($this->TableName);
$sql = 'SELECT MAX(SubNumber) FROM '.$table.' WHERE Number = '.$this->GetDBField('Number');
return $this->Conn->GetOne($sql) + 1;
}
function ResetAddress($prefix)
{
$fields = Array('To','Company','Phone','Fax','Email','Address1','Address2','City','State','Zip','Country');
foreach($fields as $field)
{
$this->SetDBField($prefix.$field, $this->Fields[$prefix.$field]['default']);
}
}
function IsProfileAddress($address_type)
{
return $this->Application->GetVar($this->Prefix.'_IsProfileAddress');
}
// ===== Gift Certificates Related =====
function RecalculateGift($event)
{
$gc_id = $this->GetDBField('GiftCertificateId');
if ($gc_id < 1) {
return;
}
/** @var kDBItem $gc */
$gc = $this->Application->recallObject('gc', null, Array('skip_autoload' => true));
$gc->Load($gc_id);
if ($gc->GetDBField('Status') == gcDISABLED) {
// disabled GC
$this->SetDBField('GiftCertificateId', 0);
$this->SetDBField('GiftCertificateDiscount', 0);
// disabled
return;
}
$debit = $gc->GetDBField('Debit') + $this->GetDBField('GiftCertificateDiscount');
$this->UpdateTotals();
$total = $this->GetDBField('TotalAmount');
$gift_certificate_discount = $debit >= $total ? $total : $debit;
$this->SetDBField('TotalAmount', $total - $gift_certificate_discount);
$this->GetDBField('GiftCertificateDiscount', $gift_certificate_discount);
$debit -= $gift_certificate_discount;
$gc->SetDBField('Debit', $debit);
$gc->SetDBField('Status', $debit > 0 ? gcENABLED : gcUSED);
$gc->Update();
if ($gift_certificate_discount == 0) {
$this->RemoveGiftCertificate($object);
$this->setCheckoutError(OrderCheckoutErrorType::GIFT_CERTIFICATE, OrderCheckoutError::GC_REMOVED_AUTOMATICALLY);
}
$this->SetDBField('GiftCertificateDiscount', $gift_certificate_discount);
}
function RemoveGiftCertificate()
{
$gc_id = $this->GetDBField('GiftCertificateId');
/** @var kDBItem $gc */
$gc = $this->Application->recallObject('gc', null, Array('skip_autoload' => true));
$gc->Load($gc_id);
$debit = $gc->GetDBField('Debit') + $this->GetDBField('GiftCertificateDiscount');
if ($gc->isLoaded() && ($debit > 0)) {
$gc->SetDBField('Debit', $debit);
$gc->SetDBField('Status', gcENABLED);
$gc->Update();
}
$this->SetDBField('GiftCertificateId', 0);
$this->SetDBField('GiftCertificateDiscount', 0);
}
/**
* Sets checkout error
*
* @param int $error_type = {product,coupon,gc}
* @param int $error_code
* @param int $product_id - {ProductId}:{OptionsSalt}:{BackOrderFlag}:{FieldName}
*/
function setCheckoutError($error_type, $error_code, $product_id = null)
{
$errors = $this->Application->RecallVar('checkout_errors');
$errors = $errors ? unserialize($errors) : Array ();
if ( isset($product_id) ) {
$error_type .= ':' . $product_id;
// any error takes priority over FIELD_UPDATE_SUCCESS error
if ( isset($errors[$error_type]) && $error_code == OrderCheckoutError::FIELD_UPDATE_SUCCESS ) {
return ;
}
}
if ( is_numeric($error_code) ) {
$errors[$error_type] = $error_code;
}
else {
unset($errors[$error_type]);
}
if ( $this->Application->isDebugMode() ) {
$this->Application->Debugger->appendHTML('CO_ERROR: ' . $error_type . ' - ' . $error_code);
}
$this->Application->StoreVar('checkout_errors', serialize($errors));
}
}
Event Timeline
Log In to Comment