+ static function recordAdditionPayment($contributionId, $trxnsData, $paymentType, $participantId = NULL) {
+ // FIXME : needs handling of partial payment validness checking, if its valid then only record new entries
+ $params = $ids = $defaults = array();
+ $getInfoOf['id'] = $contributionId;
+
+ // build params for recording financial trxn entry
+ $contributionDAO = CRM_Contribute_BAO_Contribution::retrieve($getInfoOf, $defaults, $ids);
+ $params['contribution'] = $contributionDAO;
+ $params = array_merge($defaults, $params);
+ $params['skipLineItem'] = TRUE;
+ $params['partial_payment_total'] = $contributionDAO->total_amount;
+ $params['partial_amount_pay'] = $trxnsData['total_amount'];
+ $trxnsData['trxn_date'] = !empty($trxnsData['trxn_date']) ? $trxnsData['trxn_date'] : date('YmdHis');
+
+ // record the entry
+ $financialTrxn = CRM_Contribute_BAO_Contribution::recordFinancialAccounts($params, $trxnsData);
+
+ $statusId = CRM_Core_OptionGroup::getValue('contribution_status', 'Completed', 'name');
+ $relationTypeId = key(CRM_Core_PseudoConstant::accountOptionValues('account_relationship', NULL, " AND v.name LIKE 'Accounts Receivable Account is' "));
+ $toFinancialAccount = CRM_Contribute_PseudoConstant::financialAccountType($contributionDAO->financial_type_id, $relationTypeId);
+
+ $trxnId = CRM_Core_BAO_FinancialTrxn::getBalanceTrxnAmt($contributionId, $contributionDAO->financial_type_id);
+ $trxnId = $trxnId['trxn_id'];
+
+ // update statuses
+ // criteria for updates contribution total_amount == financial_trxns of partial_payments
+ $sql = "SELECT SUM(ft.total_amount) as sum_of_payments
+FROM civicrm_financial_trxn ft
+LEFT JOIN civicrm_entity_financial_trxn eft
+ ON (ft.id = eft.financial_trxn_id)
+WHERE eft.entity_table = 'civicrm_contribution'
+ AND eft.entity_id = {$contributionId}
+ AND ft.to_financial_account_id != {$toFinancialAccount}
+ AND ft.status_id = {$statusId}
+";
+ $sumOfPayments = CRM_Core_DAO::singleValueQuery($sql);
+
+ // update statuses
+ if ($contributionDAO->total_amount == $sumOfPayments) {
+ // update contribution status
+ $contributionUpdate['id'] = $contributionId;
+ $contributionUpdate['contribution_status_id'] = $statusId;
+ $contributionUpdate['skipLineItem'] = TRUE;
+ // note : not using the self::add method,
+ // the reason because it performs 'status change' related code execution for financial records
+ // which in 'Partial Paid' => 'Completed' is not useful, instead specific financial record updates
+ // are coded below i.e. just updating financial_item status to 'Paid'
+ $contributionDetails = CRM_Core_DAO::setFieldValue('CRM_Contribute_BAO_Contribution', $contributionId, 'contribution_status_id', $statusId);
+
+ if ($participantId) {
+ // update participant status
+ $participantUpdate['id'] = $participantId;
+ $participantStatuses = CRM_Event_PseudoConstant::participantStatus();
+ $participantUpdate['status_id'] = array_search('Registered', $participantStatuses);
+ CRM_Event_BAO_Participant::add($participantUpdate);
+ }
+
+ // update financial item statuses
+ $financialItemStatus = CRM_Core_PseudoConstant::get('CRM_Financial_DAO_FinancialItem', 'status_id');
+ $paidStatus = array_search('Paid', $financialItemStatus);
+
+ $sqlFinancialItemUpdate = "
+UPDATE civicrm_financial_item fi
+ LEFT JOIN civicrm_entity_financial_trxn eft
+ ON (eft.entity_id = fi.id AND eft.entity_table = 'civicrm_financial_item')
+SET status_id = {$paidStatus}
+WHERE eft.financial_trxn_id = {$trxnId}
+";
+ CRM_Core_DAO::executeQuery($sqlFinancialItemUpdate);
+ }
+
+ if (!empty($financialTrxn)) {
+ if ($participantId) {
+ $inputParams['id'] = $participantId;
+ $values = array();
+ $ids = array();
+ $component = 'event';
+ $entityObj = CRM_Event_BAO_Participant::getValues($inputParams, $values, $ids);
+ $entityObj = $entityObj[$participantId];
+ }
+ $activityType = ($paymentType == 'refund') ? 'Refund' : 'Payment';
+
+ // creation of activity
+ $activity = new CRM_Activity_DAO_Activity();
+ $activity->source_record_id = $financialTrxn->id;
+ $activity->activity_type_id = CRM_Core_OptionGroup::getValue('activity_type',
+ $activityType,
+ 'name'
+ );
+ if (!$activity->find(TRUE)) {
+ self::addActivityForPayment($entityObj, $financialTrxn, $activityType, $component);
+ }
+ }
+ return $financialTrxn;
+ }
+
+ static function addActivityForPayment($entityObj, $trxnObj, $activityType, $component) {
+ if ($component == 'event') {
+ $date = CRM_Utils_Date::isoToMysql($trxnObj->trxn_date);
+ $paymentAmount = CRM_Utils_Money::format($trxnObj->total_amount, $trxnObj->currency);
+ $eventTitle = CRM_Core_DAO::getFieldValue('CRM_Event_BAO_Event', $entityObj->event_id, 'title');
+ $subject = "{$paymentAmount} - Offline {$activityType} for {$eventTitle}";
+ $targetCid = $entityObj->contact_id;
+ $srcRecId = $trxnObj->id;
+ }
+
+ // activity params
+ $activityParams = array(
+ 'source_contact_id' => $targetCid,
+ 'source_record_id' => $srcRecId,
+ 'activity_type_id' => CRM_Core_OptionGroup::getValue('activity_type',
+ $activityType,
+ 'name'
+ ),
+ 'subject' => $subject,
+ 'activity_date_time' => $date,
+ 'status_id' => CRM_Core_OptionGroup::getValue('activity_status',
+ 'Completed',
+ 'name'
+ ),
+ 'skipRecentView' => TRUE,
+ );
+
+ // create activity with target contacts
+ $session = CRM_Core_Session::singleton();
+ $id = $session->get('userID');
+ if ($id) {
+ $activityParams['source_contact_id'] = $id;
+ $activityParams['target_contact_id'][] = $targetCid;
+ }
+ CRM_Activity_BAO_Activity::create($activityParams);
+ }
+
+ function getPaymentInfo($id, $component, $getTrxnInfo = FALSE) {
+ if ($component == 'event') {
+ $entity = 'participant';
+ $contributionId = CRM_Core_DAO::getFieldValue('CRM_Event_BAO_ParticipantPayment', $id, 'contribution_id', 'participant_id');
+ }
+ $total = CRM_Core_BAO_FinancialTrxn::getBalanceTrxnAmt($contributionId);
+ $baseTrxnId = NULL;
+ if (empty($total)) {
+ $total = CRM_Price_BAO_LineItem::getLineTotal($id, 'civicrm_participant');
+ }
+ else {
+ $baseTrxnId = $total['trxn_id'];
+ $total = $total['total_amount'];
+ }
+ $paymentBalance = CRM_Core_BAO_FinancialTrxn::getPartialPaymentWithType($id, $entity, FALSE, $total);
+ $info['total'] = $total;
+ $info['paid'] = $total - $paymentBalance;
+ $info['balance'] = $paymentBalance;
+ $info['id'] = $id;
+ $info['component'] = $component;
+ $rows = array();
+ if ($getTrxnInfo && $baseTrxnId) {
+ $sql = "
+SELECT ft.total_amount, con.financial_type_id, ft.payment_instrument_id, ft.trxn_date, ft.trxn_id, ft.status_id
+FROM civicrm_contribution con
+ LEFT JOIN civicrm_entity_financial_trxn eft ON (eft.entity_id = con.id AND eft.entity_table = 'civicrm_contribution')
+ LEFT JOIN civicrm_financial_trxn ft ON ft.id = eft.financial_trxn_id
+WHERE ft.id != {$baseTrxnId} AND con.id = {$contributionId}
+";
+ $resultDAO = CRM_Core_DAO::executeQuery($sql);