VAT-414 Changes related to VAT/TAX breakdown
[civicrm-core.git] / CRM / Price / BAO / LineItem.php
index 741a10c74dd1052fc399d54bbae0a446fb7427d6..43cb11fa4d0223d1876c885a1fe8c7069893e084 100644 (file)
@@ -1,9 +1,9 @@
 <?php
 /*
  +--------------------------------------------------------------------+
- | CiviCRM version 4.4                                                |
+ | CiviCRM version 4.5                                                |
  +--------------------------------------------------------------------+
- | Copyright CiviCRM LLC (c) 2004-2013                                |
+ | Copyright CiviCRM LLC (c) 2004-2014                                |
  +--------------------------------------------------------------------+
  | This file is a part of CiviCRM.                                    |
  |                                                                    |
@@ -28,7 +28,7 @@
 /**
  *
  * @package CRM
- * @copyright CiviCRM LLC (c) 2004-2013
+ * @copyright CiviCRM LLC (c) 2004-2014
  * $Id$
  *
  */
@@ -95,9 +95,9 @@ class CRM_Price_BAO_LineItem extends CRM_Price_DAO_LineItem {
   static function getLineTotal($entityId, $entityTable) {
     $sqlLineItemTotal = "SELECT SUM(li.line_total)
 FROM civicrm_line_item li
-INNER JOIN civicrm_participant_payment pp ON ( li.entity_id = pp.participant_id
-AND li.entity_table = '{$entityTable}'
-AND li.entity_id = {$entityId})";
+WHERE li.entity_table = '{$entityTable}'
+AND li.entity_id = {$entityId}
+";
     $lineItemTotal = CRM_Core_DAO::singleValueQuery($sqlLineItemTotal);
     return $lineItemTotal;
   }
@@ -109,9 +109,12 @@ AND li.entity_id = {$entityId})";
    * @param $entityId  int    participant/contribution id
    * @param $entity    string participant/contribution.
    *
+   * @param null $isQuick
+   * @param bool $isQtyZero
+   *
    * @return array of line items
    */
-  static function getLineItems($entityId, $entity = 'participant', $isQuick = NULL) {
+  static function getLineItems($entityId, $entity = 'participant', $isQuick = NULL , $isQtyZero = TRUE) {
     $selectClause = $whereClause = $fromClause = NULL;
     $selectClause = "
       SELECT    li.id,
@@ -127,6 +130,7 @@ AND li.entity_id = {$entityId})";
       li.participant_count,
       li.price_field_value_id,
       li.financial_type_id,
+      li.tax_amount,
       pfv.description";
 
     $fromClause = "
@@ -141,6 +145,11 @@ AND li.entity_id = {$entityId})";
       $fromClause .= " LEFT JOIN civicrm_price_set cps on cps.id = pf.price_set_id ";
       $whereClause .= " and cps.is_quick_config = 0";
     }
+
+    if (!$isQtyZero) {
+      $whereClause .= " and li.qty != 0";
+    }
+
     $lineItems = array();
 
     if (!$entityId || !$entity || !$fromClause) {
@@ -153,6 +162,7 @@ AND li.entity_id = {$entityId})";
     );
 
     $dao = CRM_Core_DAO::executeQuery("$selectClause $fromClause $whereClause", $params);
+    $getTaxDetails = FALSE;
     while ($dao->fetch()) {
       if (!$dao->id) {
         continue;
@@ -172,8 +182,16 @@ AND li.entity_id = {$entityId})";
         'financial_type_id' => $dao->financial_type_id,
         'membership_type_id' => $dao->membership_type_id,
         'membership_num_terms' => $dao->membership_num_terms,
+        'tax_amount' => $dao->tax_amount,
       );
+      $lineItems[$dao->id]['tax_rate'] = CRM_Price_BAO_LineItem::calculateTaxRate($lineItems[$dao->id]);
+      $lineItems[$dao->id]['subTotal'] = $lineItems[$dao->id]['qty'] * $lineItems[$dao->id]['unit_price'];
+      if ($lineItems[$dao->id]['tax_amount'] != '') {
+        $getTaxDetails = TRUE;
+      }
     }
+    $smarty = CRM_Core_Smarty::singleton();
+    $smarty->assign('getTaxDetails', $getTaxDetails);
     return $lineItems;
   }
 
@@ -252,6 +270,7 @@ AND li.entity_id = {$entityId})";
    * @param int $entityId
    * @param int $entityTable
    *
+   * @return bool
    * @access public
    * @static
    */
@@ -271,12 +290,16 @@ AND li.entity_id = {$entityId})";
 
   /**
    * Function to process price set and line items.
-   * @param int $contributionId contribution id
+   *
+   * @param $entityId
    * @param array $lineItem line item array
    * @param object $contributionDetails
-   * @param decimal $initAmount amount
    * @param string $entityTable entity table
    *
+   * @param bool $update
+   *
+   * @internal param int $contributionId contribution id
+   * @internal param \decimal $initAmount amount
    * @access public
    * @return void
    * @static
@@ -298,12 +321,15 @@ AND li.entity_id = {$entityId})";
         $line['entity_id'] = $entityId;
         // if financial type is not set and if price field value is NOT NULL
         // get financial type id of price field value
-        if (CRM_Utils_Array::value('price_field_value_id', $line) && !CRM_Utils_Array::value('financial_type_id', $line)) {
+        if (!empty($line['price_field_value_id']) && empty($line['financial_type_id'])) {
           $line['financial_type_id'] = CRM_Core_DAO::getFieldValue('CRM_Price_DAO_PriceFieldValue', $line['price_field_value_id'], 'financial_type_id');
         }
         $lineItems = CRM_Price_BAO_LineItem::create($line);
         if (!$update && $contributionDetails) {
           CRM_Financial_BAO_FinancialItem::add($lineItems, $contributionDetails);
+          if (isset($contributionDetails->tax_trxn_id) && !empty($contributionDetails->tax_trxn_id)) {
+            CRM_Financial_BAO_FinancialItem::add($lineItems, $contributionDetails, TRUE);
+          }
         }
       }
     }
@@ -395,7 +421,7 @@ AND li.entity_id = {$entityId})";
             $setID = CRM_Core_DAO::getFieldValue('CRM_Price_DAO_PriceField', $values['price_field_id'], 'price_set_id');
             $params['is_quick_config'] = CRM_Core_DAO::getFieldValue('CRM_Price_DAO_PriceSet', $setID, 'is_quick_config');
           }
-          if (CRM_Utils_Array::value('is_quick_config', $params) && array_key_exists('total_amount', $params)
+          if (!empty($params['is_quick_config']) && array_key_exists('total_amount', $params)
             && $totalEntityId == 1) {
             $values['line_total'] = $values['unit_price'] = $params['total_amount'];
           }
@@ -405,4 +431,24 @@ AND li.entity_id = {$entityId})";
       }
     }
   }
+
+  /**
+   * Calculate tax rate in percentage
+   *
+   * @param $lineItemId an assoc array of lineItem
+   *
+   * @return tax rate
+   *
+   * @access public
+   * @static
+   */
+  public static function calculateTaxRate($lineItemId) {
+    if ($lineItemId['html_type'] == 'Text') {
+      $tax = (($lineItemId['line_total'] - ($lineItemId['unit_price'] * $lineItemId['qty'])))/($lineItemId['unit_price'] * $lineItemId['qty'])*100;
+    }
+    else {
+      $tax = (($lineItemId['line_total'] - $lineItemId['unit_price'])/$lineItemId['unit_price']) * 100;
+    }
+    return $tax;
+  }
 }