public function printDocs() { // print payments which are debit returns and have flag print inquiry $resultData = array(); $filters = array(array('field' => 'is_return_debit', 'operator' => 'equals', 'value' => '1'), array('field' => 'print_inquiry', 'operator' => 'equals', 'value' => '1'), array('field' => 'inquiry_print_date', 'operator' => 'isnull', 'value' => '')); $objFilter = new Billing_Model_PaymentFilter($filters, 'AND'); $paymentIds = Billing_Controller_Payment::getInstance()->search($objFilter, null, null, true); foreach ($paymentIds as $paymentId) { $payment = Billing_Controller_Payment::getInstance()->get($paymentId); // get base payment $basePayment = $payment->getForeignRecordBreakNull('return_debit_base_payment_id', Billing_Controller_Payment::getInstance()); if ($basePayment) { $batchJobDta = $basePayment->getForeignRecordBreakNull('batch_job_dta_id', Billing_Controller_BatchJobDta::getInstance()); if ($batchJobDta) { $bankAccount = Billing_Api_BankAccount::getFromBatchJobDta($batchJobDta); $debitor = $payment->getForeignRecord('debitor_id', Billing_Controller_Debitor::getInstance()); $contact = $debitor->getForeignRecord('contact_id', Addressbook_Controller_Contact::getInstance()); $data = array(); $dummyTextBlocks = null; $data = array_merge($data, Addressbook_Custom_Template::getContactData(array('contact' => $contact, 'user' => Tinebase_Core::get(Tinebase_Core::USER), 'userContact' => Addressbook_Controller_Contact::getInstance()->getContactByUserId(Tinebase_Core::get(Tinebase_Core::USER)->getId())), $dummyTextBlocks)); $data = array_merge($data, array('bank_name' => $bankAccount->getBank(), 'account_name' => $bankAccount->getName(), 'account_nr' => $bankAccount->getNumber(), 'bank_code' => $bankAccount->getBankCode())); $resultData[$contact->__get('n_fileas')] = $data; $payment->__set('inquiry_print_date', new Zend_Date()); Billing_Controller_Payment::getInstance()->update($payment); } } } $outputFileName = 'Ruecklastschrift-Nachforschung-' . strftime('%d-%m-%Y %H-%M-%S') . '.pdf'; $templateId = Tinebase_Core::getPreference('Billing')->getValue(Billing_Preference::TEMPLATE_DEBIT_RETURN_INQUIRY); ksort($resultData); Billing_Controller_PrintJobRecordData::getInstance()->export($resultData, $templateId, $outputFileName); }
/** * the singleton pattern * * @return SoEventManager_Controller_SoEvent */ public static function getInstance() { if (self::$_instance === NULL) { self::$_instance = new self(); } return self::$_instance; }
public function getReturnDebitBasePayment() { return $this->getForeignRecordBreakNull('return_debit_base_payment_id', Billing_Controller_Payment::getInstance()); }
public function printReturnInquiry() { try { Billing_Controller_Payment::getInstance()->printReturnInquiry(); } catch (Exception $e) { echo $e->__toString(); } }
public static function import($fileName) { $result = array('failcount' => 0, 'totalcount' => 0, 'duplicatecount' => 0, 'status' => 'success'); try { $reader = new Reader(); $statements = $reader->getStatements(file_get_contents($fileName)); foreach ($statements as $statement) { foreach ($statement->getTransactions() as $transaction) { //echo $transaction->getAmount() . "\n"; $amount = (double) $transaction->getAmount(); $description = $transaction->getDescription(); $accountNumber = $statement->getAccount()->getNumber(); //echo $accountNumber; $num = null; $debitorNr = null; $memberNr = null; $receiptNr = null; $context = 'ERP'; $cdesc = strtolower($description); $opNr = null; $openItemId = null; $debitorId = null; $opId = null; $type = null; $state = 'RED'; $opAmount = 0; $overpay = 0; if ($amount < 0) { $type = 'DEBIT'; } else { $type = 'CREDIT'; } if (strpos($cdesc, 'mitg') || strpos($cdesc, 'tgli') || strpos($cdesc, 'beitr')) { $context = 'MEMBERSHIP'; } elseif (strpos($cdesc, 'spend')) { $context = 'DONATOR'; } $isReturnDebit = false; if (strpos($cdesc, 'rueckbelast')) { $isReturnDebit = true; } $numDesc = $transaction->getDescriptionConcat(1, 7); $numDescCheck = strtolower($numDesc); $pos = strpos($numDescCheck, 'mitg'); if (!$pos) { $pos = strpos($numDescCheck, 'tgli'); } if (!pos) { $pos = strpos($numDescCheck, 'beitr'); } if (!pos) { $pos = strpos($numDescCheck, 'rech'); } if ($numDesc && $pos) { if (preg_match('/([0-9]{5,7})/', substr($numDesc, $pos), $match)) { $num = $match[1]; } } if ($num && !$isReturnDebit) { if (strpos($cdesc, 'rech')) { try { $receiptNr = $num; $receiptId = Billing_Controller_Receipt::getInstance()->getIdByProperty('invoice_nr', $num); $receipt = Billing_Controller_Receipt::getInstance()->get($receiptId); $context = $receipt->getForeignId('erp_context_id'); $order = $receipt->getForeignRecordBreakNull('order_id', Billing_Controller_Order::getInstance()); $debitor = $order->getForeignRecordBreakNull('debitor_id', Billing_Controller_Debitor::getInstance()); if ($debitor) { $debitorId = $debitor->getId(); $state = 'ORANGE'; $openItems = Billing_Controller_OpenItem::getInstance()->getByDebitor($debitorId); foreach ($openItems as $op) { if ($op->__get('state') != 'DONE') { $openItem = $op; break; } } //$openItem = $openItems->getFirstRecord(); $openItemId = $openItem->getId(); $opAmount = $openItem->__get('open_sum'); } if (abs($amount) > abs($opAmount)) { $overpay = abs($amount) - abs($opAmount); } if ($overpay == 0) { $state = 'GREEN'; } /*if((float)abs($openItem->__get('total_brutto')) == (float)abs($amount)){ $state = 'GREEN'; }*/ } catch (Exception $e) { } } elseif (strpos($cdesc, 'mitg')) { $memberNr = $num; try { $member = Membership_Controller_SoMember::getInstance()->getSoMemberByMemberNr($memberNr); $contactId = $member->getForeignId('contact_id'); $debitorId = Billing_Controller_Debitor::getInstance()->getIdByContactId($contactId); $state = 'ORANGE'; $openItems = Billing_Controller_OpenItem::getInstance()->getByDebitor($debitorId); foreach ($openItems as $op) { if ($op->__get('state') != 'DONE') { $openItem = $op; break; } } //$openItem = $openItems->getFirstRecord(); if ($openItem) { $openItemId = $openItem->getId(); $opAmount = $openItem->__get('open_sum'); if (abs($amount) > abs($opAmount)) { $overpay = abs($amount) - abs($opAmount); } if ($overpay == 0) { $state = 'GREEN'; } } /*if((float)abs($openItem->__get('total_brutto')) == (float)abs($amount)){ $state = 'GREEN'; }*/ } catch (Exception $e) { } } else { try { $contactId = (int) trim($num); $debitorId = Billing_Controller_Debitor::getInstance()->getIdByContactId($contactId); $state = 'ORANGE'; $openItems = Billing_Controller_OpenItem::getInstance()->getByDebitor($debitorId); foreach ($openItems as $op) { if ($op->__get('state') != 'DONE') { $openItem = $op; break; } } // changed behviour: was only correct in first period :-/ //$openItem = $openItems->getFirstRecord(); if ($openItem) { $openItemId = $openItem->getId(); $opAmount = $openItem->__get('open_sum'); } if (abs($amount) > abs($opAmount)) { $overpay = abs($amount) - abs($opAmount); } if ($overpay == 0) { $state = 'GREEN'; } //if((float)abs($openItem->__get('total_brutto')) == (float)abs($amount)){ // $state = 'GREEN'; //} } catch (Exception $e) { } } } if ($isReturnDebit) { $returnDebitFee = (double) Tinebase_Core::getPreference('Billing')->getValue(Billing_Preference::DEBIT_RETURN_FEE); if ($num) { $contactId = (int) trim($num); $debitorId = null; try { $debitorId = Billing_Controller_Debitor::getInstance()->getIdByContactId($contactId); $state = 'ORANGE'; } catch (Exception $e) { $state = 'RED'; } try { $toReturnPayment = Billing_Controller_Payment::getInstance()->getDebitToReturn($debitorId, $amount, $returnDebitFee, 'DEBIT'); $returnPaymentId = $toReturnPayment->getId(); if ($returnPaymentId && $debitorId && $toReturnPayment->__get('is_cancelled') == false) { $state = 'GREEN'; } if ($toReturnPayment->__get('is_cancelled') == true) { $returnPaymentId = null; } } catch (Exception $e) { $returnPaymentId = null; } } } $id = md5($cdesc); try { $payment = Billing_Controller_MT940Payment::getInstance()->get($id); } catch (Exception $e) { $payment = Billing_Controller_MT940Payment::getInstance()->getEmptyMT940Payment(); $bankAccount = Billing_Controller_AccountSystem::getInstance()->getDefaultBankAccount(); $fordAccount = Billing_Controller_AccountSystem::getInstance()->getByNumber('14000'); if (!$isReturnDebit) { if ($type == 'DEBIT') { $payment->__set('account_system_id', $bankAccount->getId()); $payment->__set('account_system_id_haben', $fordAccount->getId()); } else { $payment->__set('account_system_id', $fordAccount->getId()); $payment->__set('account_system_id_haben', $bankAccount->getId()); } } else { $debitSettleAccount = Tinebase_Core::getPreference('Billing')->getValue(Billing_Preference::FIBU_KTO_DEBITOR); $payment->__set('account_system_id', $debitSettleAccount); $payment->__set('account_system_id_haben', $bankAccount->getId()); $payment->__set('is_return_debit', true); $payment->__set('print_inquiry', true); $payment->__set('set_accounts_banktransfer', true); $payment->__set('return_inquiry_fee', $returnDebitFee); $payment->__set('return_debit_base_payment_id', $returnPaymentId); } $payment->__set('id', $id); $payment->__set('erp_context_id', $context); if ($opNr) { $payment->__set('op_nr', $opNr); } if ($openItemId) { $payment->__set('op_id', $openItemId); $payment->__set('due_date', new Zend_Date($openItem->__get('due_date'))); $payment->__set('op_amount', $openItem->__get('total_brutto')); } if ($debitorId) { $payment->__set('debitor_id', $debitorId); } $payment->__set('type', $type); $payment->__set('payment_date', new Zend_Date($transaction->getBookDate()->format('Y-m-d H:i:s'))); $payment->__set('payment_amount', abs($amount)); $payment->__set('state', $state); $payment->__set('usage_payment', $description); $payment->__set('usage', $numDesc); $payment->__set('overpay_amount', $overpay); Billing_Controller_MT940Payment::getInstance()->create($payment); } } /*echo $statement->getOpeningBalance()->getAmount() . "\n"; foreach ($statement->getTransactions() as $transaction) { echo $transaction->getAmount() . "\n"; } echo $statement->getClosingBalance()->getAmount() . "\n";*/ } } catch (Exception $e) { Tinebase_Core::getLogger()->notice(__METHOD__ . '::' . __LINE__ . ' ' . 'TD-Import - Es trat ein Fehler auf. Nicht ausgeführt.' . print_r($e->__toString(), true)); $result['status'] = 'error'; $result['errorInfo'] = $e->getMessage(); $result['errorTrace'] = $e->getTrace(); } return $result; }
public function reversePayment($paymentId) { return Billing_Controller_Payment::getInstance()->reversePayment($paymentId)->toArray(); }
public function bookPayments($payments) { //throw new Zend_Exception('Temporarily disabled'); foreach ($payments as $payment) { if ($payment->hasAdditionalItem('donation')) { $donationData = $payment->getAdditionalItem('donation'); } else { $donationData = null; } if ($payment->hasMultipleOpenItems()) { $additionalData = $payment->getAdditionalData(); if ($payment->hasAdditionalItem('openItems')) { $data = $payment->getAdditionalItem('openItems'); $donationData = $payment->getAdditionalItem('donation'); $payment->flatten(); $paymentRecord = $payment->toArray(); $paymentRecord['amount'] = $paymentRecord['payment_amount']; Billing_Controller_OpenItem::getInstance()->payOpenItems($data, $paymentRecord, $donationData); } } else { $pExtract = clone $payment; $pExtract->flatten(); $paymentRecord = $pExtract->toArray(); $paymentO = Billing_Controller_Payment::getInstance()->getEmptyPayment(); if (array_key_exists('id', $paymentRecord)) { unset($paymentRecord['id']); } $paymentO->setFromArray($paymentRecord); $paymentO->__set('amount', $payment->__get('payment_amount')); $openItem = $payment->getForeignRecordBreakNull('op_id', Billing_Controller_OpenItem::getInstance()); if ($openItem) { if ($payment->__get('overpay') == 'DONATION' && !$payment->__get('is_return_debit') && $donationData) { $opAmount = abs((double) $openItem->__get('open_sum')); $pAmount = abs((double) $payment->__get('payment_amount')); if ($pAmount > $opAmount) { $donationAmount = $pAmount - $opAmount; $payment2 = clone $paymentO; $payment2->__set('id', null); $payment2->__set('amount', $donationAmount); $payment2->__set('erp_context_id', 'DONATOR'); $payment2 = Billing_Controller_Payment::getInstance()->create($payment2); $paymentDebitor = $payment2->getForeignRecord('debitor_id', Billing_Controller_Debitor::getInstance()); $contactId = $paymentDebitor->getForeignId('contact_id'); if ($donationData) { $campaignId = $donationData['campaign']; } else { $campaign = Donator_Controller_Campaign::getInstance()->getDefaultCampaign(); $campaignId = $campaign->getId(); } $usage = 'Spende Adress-Nr: ' . $paymentDebitor->__get('debitor_nr'); $date = $payment->__get('payment_date'); $donation = Donator_Controller_FundMaster::getInstance()->donateByContactId($contactId, $donationAmount, $campaignId, $date, $usage, $payment2); $paymentO->__set('amount', $pAmount - $donationAmount); } } // in case of overpay if ($paymentO->__get('amount') != 0) { $paymentO = Billing_Controller_Payment::getInstance()->create($paymentO); Billing_Controller_OpenItem::getInstance()->payOpenItem($openItem->getId(), $paymentO, abs((double) $openItem->__get('open_sum'))); } } else { // can be donation or prepay of member fee if ($payment->__get('is_return_debit')) { $paymentO = Billing_Controller_Payment::getInstance()->create($paymentO); // prepay member fee } elseif ($payment->__get('overpay') == 'PREPAYMEMBERFEE') { // do nothing else, payment is stored with context membership // so balance is positive $paymentO->__set('erp_context_id', 'MEMBERSHIP'); $paymentO = Billing_Controller_Payment::getInstance()->create($paymentO); } else { // donation $paymentO->__set('erp_context_id', 'DONATOR'); //$paymentO = Billing_Controller_Payment::getInstance()->create($paymentO); $donationData = $payment->getAdditionalItem('donation'); $donationAmount = abs((double) $payment->__get('payment_amount')); $payment2 = clone $paymentO; $payment2->__set('id', null); $payment2->__set('amount', $donationAmount); $payment2->__set('erp_context_id', 'DONATOR'); $payment2 = Billing_Controller_Payment::getInstance()->create($payment2); $paymentDebitor = $payment2->getForeignRecord('debitor_id', Billing_Controller_Debitor::getInstance()); $contactId = $paymentDebitor->getForeignId('contact_id'); if ($donationData) { $campaignId = $donationData['campaign']; } else { $campaign = Donator_Controller_Campaign::getInstance()->getDefaultCampaign(); $campaignId = $campaign->getId(); } $usage = 'Spende Adress-Nr: ' . $paymentDebitor->__get('debitor_nr'); $date = $payment->__get('payment_date'); $donation = Donator_Controller_FundMaster::getInstance()->donateByContactId($contactId, $donationAmount, $campaignId, $date, $usage, $payment2); } } } } }
public function payOpenItems($data, $paymentRecord, $donationData) { try { if (!is_array($data)) { $data = Zend_Json::decode($data); } if (!is_array($paymentRecord)) { $paymentRecord = Zend_Json::decode($paymentRecord); } if (!is_array($donationData)) { $donationData = Zend_Json::decode($donationData); } $payment = Billing_Controller_Payment::getInstance()->getEmptyPayment(); if (array_key_exists('id', $paymentRecord)) { unset($paymentRecord['id']); } $payment->setFromArray($paymentRecord); $paymentAmount = $payment->__get('amount'); $donationAmount = $donationData['donation_amount']; if (count($data) > 0) { if ($donationAmount > 0) { $paymentAmount -= min($donationAmount, $paymentAmount); $payment->__set('amount', $paymentAmount); } $payment = Billing_Controller_Payment::getInstance()->create($payment); $paymentId = $payment->getId(); foreach ($data as $item) { $this->payOpenItem($item['id'], $payment, $item['amount']); $paymentAmount -= $item['amount']; } } // if donation should be made if (is_array($donationData) && array_key_exists('donation_amount', $donationData)) { if ($donationAmount > 0) { $payment2 = clone $payment; $payment2->__set('id', null); $payment2->__set('amount', $donationAmount); $payment2->__set('erp_context_id', 'DONATOR'); $payment2 = Billing_Controller_Payment::getInstance()->create($payment2); $paymentDebitor = $payment2->getForeignRecord('debitor_id', Billing_Controller_Debitor::getInstance()); $contactId = $paymentDebitor->getForeignId('contact_id'); $campaignId = $donationData['campaign']; $usage = 'Spende Adress-Nr: ' . $paymentDebitor->__get('debitor_nr'); $date = $payment->__get('payment_date'); $donation = Donator_Controller_FundMaster::getInstance()->donateByContactId($contactId, $donationAmount, $campaignId, $date, $usage, $payment2); } } return array('success' => true, 'payment' => $payment->toArray()); } catch (Exception $e) { return array('success' => false, 'payment' => null, 'errorInfo' => $e->getTrace(), 'errorMessage' => $e->getMessage()); } }
public function runBookingQueue($jobId, $dueDate) { set_time_limit(0); $job = Billing_Api_BatchJobManager::getInstance()->loadBatchJob($jobId); Billing_Api_BatchJobManager::getInstance()->startBatchJob(); try { //$dueDate = '2014-03-11'; $dueDate = new Zend_Date($dueDate); $db = Tinebase_Core::getDb(); $tm = Tinebase_TransactionManager::getInstance(); $tId = $tm->startTransaction($db); $data = $job->getData(); $pagination = new Tinebase_Model_Pagination(); $filters = array(); // get all open items (for debit) // grouped by debitors $filters[] = array('field' => 'job_id', 'operator' => 'equals', 'value' => $job->getId()); $filters[] = array('field' => 'action_state', 'operator' => 'equals', 'value' => 'EXPORTED'); $filter = new Billing_Model_BatchJobDtaFilter($filters, 'AND'); // count membership matching filters $batchJobDtaIds = $this->search($filter, new Tinebase_Model_Pagination(array('sort' => 'n_family', 'dir' => 'ASC')), false, true); foreach ($batchJobDtaIds as $batchJobDtaId) { $batchJobDta = $this->get($batchJobDtaId); // keep out item which are diffed if ($batchJobDta->__get('bank_valid') != 'YES' || abs((double) $batchJobDta->__get('total_sum')) == 0) { continue; } //$bankAccount = Billing_Api_BankAccount::getFromBatchJobDta($batchJobDta); $bankAccount = $batchJobDta->getBankAccount(); if (is_null($bankAccount)) { continue; } $batchJobDtaItems = Billing_Controller_BatchJobDtaItem::getInstance()->getByBatchJobDtaId($batchJobDtaId); $usage = array(); $contactNr = $batchJobDta->getForeignId('contact_id'); $usage[] = 'Adr.Nr ' . $contactNr; $payment = Billing_Model_Payment::createDebitFromDta($batchJobDtaId, $batchJobDta->getForeignId('debitor_id'), new Zend_Date($dueDate), $batchJobDta->__get('total_sum'), 'DEBIT', 'ERP'); $this->extractUsageFromDtaItems($batchJobDtaItems, $usage, $contexts, $aReceiptIds); $paymentAmount = $batchJobDta->getTotalSum(); $sumOfPayment += $paymentAmount; if (is_array($usage)) { $usage = join(' ', $usage); } // booking: LS-Verrechnung AN Forderungen $soll = Tinebase_Core::getPreference('Billing')->getValue(Billing_Preference::FIBU_KTO_DTA_SETTLE); $haben = Tinebase_Core::getPreference('Billing')->getValue(Billing_Preference::FIBU_KTO_DEBITOR); $payment->setCreditAccount($haben); $payment->setDebitAccount($soll); $countPos = count($batchJobDtaItems); $payment->setUsage('LS-Einzug Anz.Pos: ' . $countPos . ' Summe:' . number_format($batchJobDta->__get('total_sum'), 2) . ' ' . $usage); $payment = Billing_Controller_Payment::getInstance()->create($payment); foreach ($batchJobDtaItems as $batchJobDtaItem) { $openItem = $batchJobDtaItem->getForeignRecordBreakNull('open_item_id', Billing_Controller_OpenItem::getInstance()); if ($openItem) { $openItem->__set('banking_exp_date', new Zend_Date($dueDate)); Billing_Controller_OpenItem::getInstance()->payOpenItem($openItem->getId(), $payment, $openItem->__get('open_sum')); } } $batchJobDta->__set('action_state', 'DONE'); $batchJobDta->__set('process_datetime', Zend_Date::now()); $batchJobDta->__set('processed_by_user', Tinebase_Core::get(Tinebase_Core::USER)->getId()); $this->update($batchJobDta); } Billing_Api_BatchJobManager::getInstance()->finish(); $tm->commitTransaction($tId); } catch (Exception $e) { $tm->rollback($tId); Billing_Api_BatchJobManager::getInstance()->finishError($e->__toString()); return array('state' => 'failure', 'result' => null, 'errorInfo' => array('message' => $e->getMessage(), 'trace' => $e->getTrace())); } }