From 5a18a5458ea188db505d2985e97373dd1a870ada Mon Sep 17 00:00:00 2001 From: dpradeep Date: Tue, 26 Aug 2014 18:27:13 +0530 Subject: [PATCH] Update financial items for change selection. --- CRM/Contribute/BAO/Contribution.php | 36 ++++++++++++++------ CRM/Event/BAO/Participant.php | 53 ++++++++++++++++++++++++++--- CRM/Financial/BAO/FinancialItem.php | 4 ++- CRM/Price/BAO/LineItem.php | 3 +- 4 files changed, 78 insertions(+), 18 deletions(-) diff --git a/CRM/Contribute/BAO/Contribution.php b/CRM/Contribute/BAO/Contribution.php index 4535010750..4128630dbe 100644 --- a/CRM/Contribute/BAO/Contribution.php +++ b/CRM/Contribute/BAO/Contribution.php @@ -2993,19 +2993,12 @@ WHERE contribution_id = %1 "; CRM_Financial_BAO_FinancialItem::create($itemParams, NULL, $trxnIds); if ($fieldValues['tax_amount']) { + $invoiceSettings = CRM_Core_BAO_Setting::getItem(CRM_Core_BAO_Setting::CONTRIBUTE_PREFERENCES_NAME, 'contribution_invoice_settings'); + $taxTerm = CRM_Utils_Array::value('tax_term', $invoiceSettings); $itemParams['amount'] = $diff * $fieldValues['tax_amount']; - $itemParams['description'] = ts('VAT'); - $accountRel = key(CRM_Core_PseudoConstant::accountOptionValues('account_relationship', NULL, " AND v.name LIKE 'Sales Tax Account is' ")); + $itemParams['description'] = $taxTerm; if ($fieldValues['financial_type_id']) { - $searchParams = array( - 'entity_table' => 'civicrm_financial_type', - 'entity_id' => $fieldValues['financial_type_id'], - 'account_relationship' => $accountRel, - ); - - $result = array(); - CRM_Financial_BAO_FinancialTypeAccount::retrieve( $searchParams, $result ); - $itemParams['financial_account_id'] = CRM_Utils_Array::value( 'financial_account_id', $result ); + $itemParams['financial_account_id'] = self::getFinancialAccountId($fieldValues['financial_type_id']); } CRM_Financial_BAO_FinancialItem::create($itemParams, NULL, $trxnIds); } @@ -3424,4 +3417,25 @@ WHERE con.id = {$contributionId} } return $info; } + + /** + * Function to get financial account id has 'Sales Tax Account is' + * account relationship with financial type + * + * @param $financialTypeId + * + * @return FinancialAccountId + */ + static function getFinancialAccountId($financialTypeId) { + $accountRel = key(CRM_Core_PseudoConstant::accountOptionValues('account_relationship', NULL, " AND v.name LIKE 'Sales Tax Account is' ")); + $searchParams = array( + 'entity_table' => 'civicrm_financial_type', + 'entity_id' => $financialTypeId, + 'account_relationship' => $accountRel, + ); + $result = array(); + CRM_Financial_BAO_FinancialTypeAccount::retrieve( $searchParams, $result ); + + return CRM_Utils_Array::value( 'financial_account_id', $result ); + } } diff --git a/CRM/Event/BAO/Participant.php b/CRM/Event/BAO/Participant.php index bc959413a0..8a2fbc5bcb 100644 --- a/CRM/Event/BAO/Participant.php +++ b/CRM/Event/BAO/Participant.php @@ -1856,8 +1856,11 @@ WHERE cpf.price_set_id = %1 AND cpfv.label LIKE %2"; unset($insertLines[$previousLineItem['price_field_value_id']]); // for updating the line items i.e. use-case - once deselect-option selecting again if ($previousLineItem['line_total'] != $submittedLineItems[$previousLineItem['price_field_value_id']]['line_total']) { + $updateLines[$previousLineItem['price_field_value_id']]['id'] = $id; $updateLines[$previousLineItem['price_field_value_id']]['qty'] = $submittedLineItems[$previousLineItem['price_field_value_id']]['qty']; $updateLines[$previousLineItem['price_field_value_id']]['line_total'] = $submittedLineItems[$previousLineItem['price_field_value_id']]['line_total']; + $updateLines[$previousLineItem['price_field_value_id']]['tax_amount'] = $submittedLineItems[$previousLineItem['price_field_value_id']]['tax_amount']; + $updateLines[$previousLineItem['price_field_value_id']]['financial_type_id'] = $submittedLineItems[$previousLineItem['price_field_value_id']]['financial_type_id']; } } } @@ -1870,7 +1873,8 @@ WHERE cpf.price_set_id = %1 AND cpfv.label LIKE %2"; INNER JOIN civicrm_financial_item fi ON (li.id = fi.entity_id AND fi.entity_table = 'civicrm_line_item') SET li.qty = 0, - li.line_total = 0.00 + li.line_total = 0.00, + li.tax_amount = NULL WHERE (li.entity_table = 'civicrm_participant' AND li.entity_id = {$participantId}) AND (price_field_value_id NOT IN ({$submittedFieldValues})) "; @@ -1878,7 +1882,7 @@ WHERE (li.entity_table = 'civicrm_participant' AND li.entity_id = {$participantI // gathering necessary info to record negative (deselected) financial_item $updateFinancialItem = " - SELECT fi.*, SUM(fi.amount) as differenceAmt, price_field_value_id + SELECT fi.*, SUM(fi.amount) as differenceAmt, price_field_value_id, financial_type_id, tax_amount FROM civicrm_financial_item fi LEFT JOIN civicrm_line_item li ON (li.id = fi.entity_id AND fi.entity_table = 'civicrm_line_item') WHERE (li.entity_table = 'civicrm_participant' AND li.entity_id = {$participantId}) GROUP BY li.entity_table, li.entity_id, price_field_value_id @@ -1886,6 +1890,8 @@ GROUP BY li.entity_table, li.entity_id, price_field_value_id $updateFinancialItemInfoDAO = CRM_Core_DAO::executeQuery($updateFinancialItem); $trxn = CRM_Core_BAO_FinancialTrxn::getFinancialTrxnId($contributionId, 'ASC', TRUE); $trxnId['id'] = $trxn['financialTrxnId']; + $invoiceSettings = CRM_Core_BAO_Setting::getItem(CRM_Core_BAO_Setting::CONTRIBUTE_PREFERENCES_NAME, 'contribution_invoice_settings'); + $taxTerm = CRM_Utils_Array::value('tax_term', $invoiceSettings); $updateFinancialItemInfoValues = array(); while ($updateFinancialItemInfoDAO->fetch()) { @@ -1899,21 +1905,48 @@ GROUP BY li.entity_table, li.entity_id, price_field_value_id // INSERT negative financial_items $updateFinancialItemInfoValues['amount'] = - $updateFinancialItemInfoValues['amount']; CRM_Financial_BAO_FinancialItem::create($updateFinancialItemInfoValues, NULL, $trxnId); + // INSERT negative financial_items for tax amount + if ($previousLineItems[$updateFinancialItemInfoValues['entity_id']]['tax_amount']) { + $updateFinancialItemInfoValues['amount'] = - ($previousLineItems[$updateFinancialItemInfoValues['entity_id']]['tax_amount']); + $updateFinancialItemInfoValues['description'] = $taxTerm; + if ($updateFinancialItemInfoValues['financial_type_id']) { + $updateFinancialItemInfoValues['financial_account_id'] = CRM_Contribute_BAO_Contribution::getFinancialAccountId($updateFinancialItemInfoValues['financial_type_id']); + } + CRM_Financial_BAO_FinancialItem::create($updateFinancialItemInfoValues, NULL, $trxnId); + } } // if submitted and difference is 0 add a positive entry again elseif (in_array($updateFinancialItemInfoValues['price_field_value_id'], $submittedFieldValueIds) && $updateFinancialItemInfoValues['differenceAmt'] == 0) { $updateFinancialItemInfoValues['amount'] = $updateFinancialItemInfoValues['amount']; CRM_Financial_BAO_FinancialItem::create($updateFinancialItemInfoValues, NULL, $trxnId); + // INSERT financial_items for tax amount + if ($updateFinancialItemInfoValues['entity_id'] == $updateLines[$updateFinancialItemInfoValues['price_field_value_id']]['id'] && + isset($updateLines[$updateFinancialItemInfoValues['price_field_value_id']]['tax_amount']) + ) { + $updateFinancialItemInfoValues['amount'] = $updateLines[$updateFinancialItemInfoValues['price_field_value_id']]['tax_amount']; + $updateFinancialItemInfoValues['description'] = $taxTerm; + if ($updateLines[$updateFinancialItemInfoValues['price_field_value_id']]['financial_type_id']) { + $updateFinancialItemInfoValues['financial_account_id'] = CRM_Contribute_BAO_Contribution::getFinancialAccountId($updateLines[$updateFinancialItemInfoValues['price_field_value_id']]['financial_type_id']); + } + CRM_Financial_BAO_FinancialItem::create($updateFinancialItemInfoValues, NULL, $trxnId); + } } } } if (!empty($updateLines)) { foreach ($updateLines as $valueId => $vals) { + if (isset($vals['tax_amount'])) { + $taxAmount = $vals['tax_amount']; + } + else { + $taxAmount = "NULL"; + } $updateLineItem = " UPDATE civicrm_line_item li SET li.qty = {$vals['qty']}, - li.line_total = {$vals['line_total']} + li.line_total = {$vals['line_total']}, + li.tax_amount = {$taxAmount} WHERE (li.entity_table = 'civicrm_participant' AND li.entity_id = {$participantId}) AND (price_field_value_id = {$valueId}) "; @@ -1941,7 +1974,13 @@ WHERE (li.entity_table = 'civicrm_participant' AND li.entity_id = {$participantI else { $updatedAmount = $params['amount']; } - self::recordAdjustedAmt($updatedAmount, $paidAmount, $contributionId); + if (strlen($params['tax_amount']) != 0) { + $taxAmount = $params['tax_amount']; + } + else { + $taxAmount = "NULL"; + } + self::recordAdjustedAmt($updatedAmount, $paidAmount, $contributionId, $taxAmount); $fetchCon = array('id' => $contributionId); $updatedContribution = CRM_Contribute_BAO_Contribution::retrieve($fetchCon, CRM_Core_DAO::$_nullArray, CRM_Core_DAO::$_nullArray); @@ -1953,6 +1992,9 @@ WHERE (li.entity_table = 'civicrm_participant' AND li.entity_id = {$participantI // insert financial items // ensure entity_financial_trxn table has a linking of it. $prevItem = CRM_Financial_BAO_FinancialItem::add($lineObj, $updatedContribution); + if (isset($lineObj->tax_amount)) { + CRM_Financial_BAO_FinancialItem::add($lineObj, $updatedContribution, TRUE); + } } // update participant fee_amount column @@ -1969,7 +2011,7 @@ WHERE (li.entity_table = 'civicrm_participant' AND li.entity_id = {$participantI * @param $paidAmount * @param $contributionId */ - static function recordAdjustedAmt($updatedAmount, $paidAmount, $contributionId) { + static function recordAdjustedAmt($updatedAmount, $paidAmount, $contributionId, $taxAmount = NULL) { $balanceAmt = $updatedAmount - $paidAmount; $contributionStatuses = CRM_Contribute_PseudoConstant::contributionStatus(NULL, 'name'); $partiallyPaidStatusId = array_search('Partially paid', $contributionStatuses); @@ -1989,6 +2031,7 @@ WHERE (li.entity_table = 'civicrm_participant' AND li.entity_id = {$participantI $updatedContributionDAO->id = $contributionId; $updatedContributionDAO->contribution_status_id = $contributionStatusVal; $updatedContributionDAO->total_amount = $updatedAmount; + $updatedContributionDAO->tax_amount = $taxAmount; $updatedContributionDAO->save(); $ftDetail = CRM_Core_BAO_FinancialTrxn::getBalanceTrxnAmt($contributionId); diff --git a/CRM/Financial/BAO/FinancialItem.php b/CRM/Financial/BAO/FinancialItem.php index 00b41f97d8..e3c6170454 100644 --- a/CRM/Financial/BAO/FinancialItem.php +++ b/CRM/Financial/BAO/FinancialItem.php @@ -104,8 +104,10 @@ class CRM_Financial_BAO_FinancialItem extends CRM_Financial_DAO_FinancialItem { ); if ($taxTrxnID) { + $invoiceSettings = CRM_Core_BAO_Setting::getItem(CRM_Core_BAO_Setting::CONTRIBUTE_PREFERENCES_NAME, 'contribution_invoice_settings'); + $taxTerm = CRM_Utils_Array::value('tax_term', $invoiceSettings); $params['amount'] = $lineItem->tax_amount; - $params['description'] = 'VAT'; + $params['description'] = $taxTerm; $accountRel = key(CRM_Core_PseudoConstant::accountOptionValues('account_relationship', NULL, " AND v.name LIKE 'Sales Tax Account is' ")); } else { diff --git a/CRM/Price/BAO/LineItem.php b/CRM/Price/BAO/LineItem.php index 94987fae97..dc49b547c1 100644 --- a/CRM/Price/BAO/LineItem.php +++ b/CRM/Price/BAO/LineItem.php @@ -114,7 +114,7 @@ class CRM_Price_BAO_LineItem extends CRM_Price_DAO_LineItem { * @return null|string */ static function getLineTotal($entityId, $entityTable) { - $sqlLineItemTotal = "SELECT SUM(li.line_total) + $sqlLineItemTotal = "SELECT SUM(li.line_total + COALESCE(li.tax_amount,0)) FROM civicrm_line_item li WHERE li.entity_table = '{$entityTable}' AND li.entity_id = {$entityId} @@ -293,6 +293,7 @@ AND li.entity_id = {$entityId} 'auto_renew' => CRM_Utils_Array::value('auto_renew', $options[$oid]), 'html_type' => $fields['html_type'], 'financial_type_id' => CRM_Utils_Array::value('financial_type_id', $options[$oid]), + 'tax_amount' => CRM_Utils_Array::value('tax_amount', $options[$oid]), ); if ($values[$oid]['membership_type_id'] && empty($values[$oid]['auto_renew'])) { -- 2.25.1