/** * * Extract and provide data to be delivered to template * @param array $dataObjects * @param array $textBlocks Reference to template inherent textblocks (can be manipulated here) */ protected static function getUniversalReceiptData(array $dataObjects, &$textBlocks) { self::getDataObjects($dataObjects, &$contact, &$receipt, &$job, &$order, &$debitor, &$creditor, &$sums, &$aPositions, &$sumTable, &$sumData, &$addData); $letterDrawee = $contact->getLetterDrawee(); $shippingDrawee = $contact->getShippingDrawee(); $invoiceDrawee = $contact->getInvoiceDrawee(); $alternativeShippingDrawee = ''; if ($invoiceDrawee !== $shippingDrawee) { $alternativeShippingDrawee = 'Lieferung an:' . chr(13) . chr(10) . $shippingDrawee->toText(true); } $totalBrutto = $sums['total']['sum']['brutto']; $monitionFee = $receipt->__get('monition_fee'); $totalSum = $totalBrutto + $monitionFee; // overwrite payment conditions, if these are set in the record // otherwise use text from docmanager template $paymentMethod = $receipt->getForeignRecord('payment_method_id', Billing_Controller_PaymentMethod::getInstance()); // if order state: PAYED -> get tb2 from payment method otherwise tb2 if ($order->__get('payment_state') == 'PAYED') { $textBlocks['ZAHLUNGSBEDINGUNGEN'] = $paymentMethod->__get('text1'); } else { $textBlocks['ZAHLUNGSBEDINGUNGEN'] = $paymentMethod->__get('text2'); } if ($receipt->__get('payment_conditions')) { $textBlocks['ZAHLUNGSBEDINGUNGEN'] = $receipt->__get('payment_conditions'); } $sumPositions = $sumTable['POSITIONS']; $aVat = array(); foreach ($sumPositions as $sp) { $name = (string) 'vat' . floor($sp['vn_vatindex']); $aVat[$name] = $sp['vn_vat']; } $userContact = $dataObjects['userContact']; $user = $dataObjects['user']; $userName = $userContact->__get('n_family'); $payerName = $contact->__get('n_fileas'); $payerBankAccountNumber = $contact->__get('bank_account_number'); $payerBankCode = $contact->__get('bank_code'); $payerBankAccountName = $contact->__get('bank_account_name'); $payerBankName = $contact->__get('bank_name'); $cpInvoiceDrawee = $contact->getInvoiceDrawee()->toText(); $cpShippingDrawee = $contact->getShippingDrawee()->toText(); if ($receipt->hasAdditionalItem('contactPersonId')) { try { $contactPerson = Addressbook_Controller_ContactPerson::getInstance()->get((int) $receipt->getAdditionalItem('contactPersonId')); $cpInvoiceDrawee = $contact->getInvoiceDrawee()->setContactPerson($contactPerson)->toText(); $cpShippingDrawee = $contact->getShippingDrawee()->setContactPerson($contactPerson)->toText(); } catch (Exception $e) { echo $e; exit; // } } $result = array('JOB_NR' => $job ? $job->__get('job_nr') : null, 'ORDER_NR' => $order->__get('order_nr'), 'CALC_NR' => $receipt->__get('calc_nr'), 'BID_NR' => $receipt->__get('bid_nr'), 'BID_DATE' => \org\sopen\app\util\format\Date::format($receipt->__get('bid_date')), 'BID_SHIP_DATE' => \org\sopen\app\util\format\Date::format($receipt->__get('bid_shipping_date')), 'CONFIRM_NR' => $receipt->__get('confirm_nr'), 'CONFIRM_DATE' => \org\sopen\app\util\format\Date::format($receipt->__get('order_confirm_date')), 'INV_NR' => $receipt->__get('invoice_nr'), 'INV_DATE' => \org\sopen\app\util\format\Date::format($receipt->__get('invoice_date')), 'DUE_DATE' => \org\sopen\app\util\format\Date::format($receipt->__get('due_date')), 'CUST_NR' => $debitor->__get('debitor_nr'), 'SHIP_NR' => $receipt->__get('ship_nr'), 'SHIP_DATE' => \org\sopen\app\util\format\Date::format($receipt->__get('shipping_date')), 'CREDIT_NR' => $receipt->__get('credit_nr'), 'CREDIT_DATE' => \org\sopen\app\util\format\Date::format($receipt->__get('credit_date')), 'MONITION_NR' => $receipt->__get('monition_nr'), 'MONITION_LEVEL' => $receipt->__get('monition_level'), 'MONITION_DATE' => strftime('%d.%m.%Y'), 'TEXT1' => $receipt->__get('upper_textblock'), 'TEXT2' => $receipt->__get('lower_textblock'), 'SHIPPING_COND' => $receipt->__get('shipping_conditions'), 'PAYMENT_COND' => $receipt->__get('payment_conditions'), 'TODAY' => strftime('%d.%m.%Y'), 'NOW' => strftime('%d.%m.%Y %H:%M:%S'), 'CONTACT' => $contact, 'CONTACT_NR' => $contact->__get('id'), 'ADRESS' => array('ALTERNATIVE_SHIPPING_DRAWEE' => $alternativeShippingDrawee, 'LETTER_DRAWEE' => $contact->getLetterDrawee()->toText(), 'SHIPPING_DRAWEE' => $contact->getShippingDrawee()->toText(), 'INVOICE_DRAWEE' => $contact->getInvoiceDrawee()->toText(), 'SALUTATION' => $contact->__get('letter_salutation'), 'AP_INVOICE_DRAWEE' => $cpInvoiceDrawee, 'AP_SHIPPING_DRAWEE' => $cpShippingDrawee), 'POSDATA' => $sumTable['POSDATA'], 'POS_TABLE' => $aPositions, 'SUM_TABLE' => $sumTable, 'VALUES' => array_merge(array('vn_netto_sum' => number_format($sums['total']['sum']['netto'], 2, ',', '.'), 'vn_vat_sum' => number_format($sums['total']['sum']['vat'], 2, ',', '.'), 'vn_brutto_sum' => number_format($sums['total']['sum']['brutto'], 2, ',', '.'), 'add_perc' => $receipt->__get('add_percentage')), $aVat), 'SUMS' => $sumData, 'monition_fee' => number_format($monitionFee, 2, ',', '.'), 'total_sum' => number_format($totalSum, 2, ',', '.'), 'USER' => array('N' => $userName, 'NUPPER' => strtoupper($userName), 'NFULL' => $userContact->__get('n_fileas'), 'NFORE' => $userContact->__get('n_given'), 'NLAST' => $userContact->__get('n_family'), 'PHONE' => $userContact->__get('tel_work'), 'FAX' => $userContact->__get('tel_fax'), 'MAIL' => $userContact->__get('email')), 'INVOICE_DRAWEE' => $invoiceDrawee->toText(true), 'PAYER_NAME' => $payerName, 'P_ACC' => $payerBankAccountNumber, 'P_ACCOUNT_NAME' => $payerBankAccountName, 'P_ACCOUNT_NR' => $payerBankAccountNumber, 'P_BANK_CODE' => $payerBankCode, 'P_BANK_NAME' => $payerBankName, 'UST_ID' => $debitor->__get('ust_id')); $additionalData = $receipt->getAdditionalData(); /*if(is_array($additionalData)){ if(array_key_exists('BALANCE', $additionalData)){ if((float)$additionalData['BALANCE']<0){ $additionalData['REMINDER'] = 'Wir erinnern höflich an den noch ausstehenden Jahresbeitrag 2012:'; $additionalData['remind'] = number_format(abs((float)$additionalData['BALANCE']),2,',','.') . ' EUR'; }elseif((float)$additionalData['BALANCE']>0){ $additionalData['REMINDER'] = 'davon bereits bezahlt:'; $additionalData['remind'] = number_format(abs((float)$additionalData['BALANCE']),2,',','.') . ' EUR'; } } $result = array_merge($result, $additionalData ); }*/ if (is_array($additionalData)) { if (array_key_exists('OPEN', $additionalData)) { if ((double) $additionalData['OPEN'] > 0) { $additionalData['OPEN_EUR'] = $additionalData['OPEN_EUR'] . ' EUR'; //$additionalData['REMINDER'] = 'Wir erinnern höflich an den noch ausstehenden Jahresbeitrag 2012:'; //$additionalData['remind'] = number_format(abs((float)$additionalData['BALANCE']),2,',','.') . ' EUR'; } else { $additionalData['OPEN_EUR'] = ''; } } $result = array_merge($result, $additionalData); } $result = array_merge($result, $addData); //print_r($result); //exit; return $result; }
public function printMonitionExportPrepare($jobId, $filteredList, $filteredListData, $monitionProtocol = false, array $batchJobMonitionIds = null) { set_time_limit(0); ignore_user_abort(true); error_reporting(E_ALL); try { $job = Billing_Api_BatchJobManager::getInstance()->loadBatchJob($jobId); Billing_Api_BatchJobManager::getInstance()->startBatchJob(); $db = Tinebase_Core::getDb(); $tm = Tinebase_TransactionManager::getInstance(); $tId = $tm->startTransaction($db); $data = $job->getData(); $pagination = new Tinebase_Model_Pagination(); //require_once 'Payment/Monition.php'; $tempFilePath = CSopen::instance()->getCustomerPath() . '/customize/data/documents/temp/'; if ($monitionProtocol) { $outputFileName = $tempFilePath . 'Protokoll-Mahnung-' . $job->getId() . '.pdf'; } else { // get all open items (for debit) // grouped by debitors $filters[] = array('field' => 'job_id', 'operator' => 'equals', 'value' => $job->getId()); $sort = array('sort' => 'n_family', 'dir' => 'ASC'); if ($filteredList) { if (!is_array($filteredListData)) { $filteredListData = Zend_Json::decode($filteredListData); } $additionalFilters = $filteredListData['filter']; if (count($additionalFilters) > 0) { $filters = array_merge($filters, $additionalFilters); } $sort = array('sort' => $filteredListData['sort']['field'], 'dir' => $filteredListData['sort']['direction']); } $filter = new Billing_Model_BatchJobMonitionFilter($filters, 'AND'); // count membership matching filters $batchJobMonitionIds = $this->search($filter, new Tinebase_Model_Pagination($sort), false, true); $outputFileName = $tempFilePath . 'Vorbereitungsliste-' . $job->getId() . '.pdf'; } $contexts = array('MEMBERSHIP' => 'Beitrag', 'DONATOR' => 'Spende', 'ERP' => 'allg.'); $data = array(); $total = 0; $count = 0; //count($batchJobMonitionIds); $subSums = array(); foreach ($batchJobMonitionIds as $batchJobDataId) { $batchJobData = $this->get($batchJobDataId); // keep out item which are diffed if (!$filteredList && $batchJobData->__get('monition_lock') == 1) { continue; } $count++; $batchJobDataItems = Billing_Controller_BatchJobMonitionItem::getInstance()->getByBatchJobMonitionId($batchJobData->getId()); $contact = $batchJobData->getForeignRecord('contact_id', Addressbook_Controller_Contact::getInstance()); $strOP = ''; foreach ($batchJobDataItems as $item) { // Kontext / Fällig am / Beleg / Betrag $openItem = $item->getForeignRecord('open_item_id', Billing_Controller_OpenItem::getInstance()); /*if($openItem->__get('state') != 'OPEN'){ // tried to include open item which was already done!!! // break the job $this->cleanupJob($jobId); // break job! throw new Billing_Exception_OpenItem('Open item '.$openItem->__get('op_nr').' is already finished.'); }*/ $receipt = $openItem->getForeignRecord('receipt_id', Billing_Controller_Receipt::getInstance()); $contactNr = $batchJobData->getForeignId('contact_id'); $receiptNr = $receipt->__get('invoice_nr'); if ($receipt->getAdditionalItem('MNR')) { $contactNr = $receipt->getAdditionalItem('MNR'); } $dueDate = $openItem->__get('due_date'); $erpContext = $contexts[$receipt->__get('erp_context_id')]; $sum = $openItem->__get('open_sum'); $context = $receipt->__get('erp_context_id'); $strOP .= $receiptNr . "<text:tab/><text:tab/>" . $contactNr . "<text:tab/><text:tab/>" . $erpContext . "<text:tab/><text:tab/>" . \org\sopen\app\util\format\Date::format($dueDate) . "<text:tab/><text:tab/>" . $openItem->__get('due_days') . "<text:tab/><text:tab/>" . $openItem->getNextMonitionStage() . "<text:tab/><text:tab/>" . number_format($sum, 2, ',', '.') . "<text:line-break/>"; if (!array_key_exists($context, $subSums)) { $subSums[$context] = array('context' => $erpContext, 'method' => '', 'count' => 0, 'sum' => 0); } $subSums[$context]['sum'] += $sum; $subSums[$context]['count']++; } $usage = array(); $contactNr = $batchJobData->getForeignId('contact_id'); $usage[] = 'Adr.Nr ' . $contactNr; //$this->extractUsageFromMonitionItems( $batchJobDataItems, &$usage, $contexts); $strUsage = implode('<text:line-break/>', $usage); /* ##MNR## ##LASTNAME## ##FORENAME## ##OPENITEMS## ##AMOUNT## */ $data[] = array('MNR' => $contact->getId(), 'FORENAME' => $contact->__get('n_given'), 'LASTNAME' => $contact->__get('n_family'), 'FORENAME_PARTNER' => $contact->__get('partner_forename'), 'LASTNAME_PARTNER' => $contact->__get('partner_lastname'), 'COMPANY' => $contact->__get('org_name') . ($contact->__get('company2') ? ' ' . $contact->__get('company2') : ''), 'USAGE' => $strUsage, 'OPENITEMS' => $strOP, 'OPEN' => number_format($batchJobData->__get('open_sum'), 2, ',', '.'), 'SALDO' => number_format($batchJobData->__get('total_saldation'), 2, ',', '.'), 'TOTAL' => number_format($batchJobData->__get('total_sum'), 2, ',', '.')); $total += $batchJobData->__get('total_sum'); } $dynTable = array(); foreach ($subSums as $context => $subItem) { $dynTable[] = array('headers' => array(), 'rows' => array(array('text' => $subItem['context'], 'dcount' => $subItem['count'], 'dsum' => number_format($subItem['sum'], 2, ',', '.')))); } $fullData = array(array('REPEATABLE_DYN_TABLE' => $dynTable, 'POS_TABLE' => $data, 'total' => number_format($total, 2, ',', '.'), 'count' => $count)); $outputFileName = $tempFilePath . md5(serialize($job) . 'preparePDF' . microtime()) . '.pdf'; $templateId = Tinebase_Core::getPreference('Billing')->getValue(Billing_Preference::TEMPLATE_MONITION_PREPARE); Billing_Controller_PrintJobRecordData::getInstance()->export($fullData, $templateId, 'Vorbereitungsliste-' . $job->getId() . '.pdf', true, $outputFileName); if (!$monitionProtocol) { if (!$filteredList) { Billing_Api_BatchJobManager::getInstance()->jobAddData('preparePDF', $outputFileName); Billing_Api_BatchJobManager::getInstance()->jobAddData('preparePDFDownloadFilename', 'Vorbereitungsliste-' . $job->getId() . '.pdf'); } else { Billing_Api_BatchJobManager::getInstance()->jobAddData('filteredPreparePDF', $outputFileName); Billing_Api_BatchJobManager::getInstance()->jobAddData('filteredPreparePDFDownloadFilename', 'Gefilterte-Vorbereitungsliste-' . $job->getId() . '.pdf'); } } else { Billing_Api_BatchJobManager::getInstance()->jobAddData('protocolPDF', $outputFileName); Billing_Api_BatchJobManager::getInstance()->jobAddData('protocolPDFDownloadFilename', 'Protokoll-Monition-' . $job->getId() . '.pdf'); } $tm->commitTransaction($tId); Billing_Api_BatchJobManager::getInstance()->finish(); return array('state' => 'success', 'result' => null); } catch (Exception $e) { echo $e->__toString(); $tm->rollback($tId); Billing_Api_BatchJobManager::getInstance()->finishError($e->__toString()); return array('state' => 'failure', 'result' => null, 'errorInfo' => array('message' => $e->getMessage(), 'trace' => $e->getTrace())); } }
public function printLists($period, $definition, &$processArray) { set_time_limit(0); ignore_user_abort(true); $processArray = array(); $values = array('VOR' => array(), 'JETZT' => array(), 'NACH' => array()); $fixValues = array('prev_period' => $period - 1, 'now_period' => $period, 'next_period' => $period + 1); $periods = array('VOR' => $period - 1, 'JETZT' => $period, 'NACH' => $period + 1); $res = array('VOR' => array(), 'JETZT' => array(), 'NACH' => array()); // Mitgliederbeiträge nach Beitragsgruppen: $date = new Zend_Date(); $date->setYear($period); $beginDate = $definition->getStartDate(new Zend_Date()); $endDate = $definition->getEndDate(new Zend_Date()); /*$beginDate = clone $date; $endDate = clone $date; $beginDate->setMonth(1); $beginDate->setDay(1); $endDate->setMonth(12); $endDate->setDay(31);*/ $baseOpFilter = array(); $baseDonationFilter = array(); $baseOpFilter[] = array('field' => 'payment_date', 'operator' => 'afterOrAt', 'value' => $beginDate->toString('yyyy-MM-dd')); $baseOpFilter[] = array('field' => 'payment_date', 'operator' => 'beforeOrAt', 'value' => $endDate->toString('yyyy-MM-dd')); $baseOpFilter[] = array('field' => 'state', 'operator' => 'not', 'value' => 'OPEN'); $baseDonationFilter[] = array('field' => 'donation_date', 'operator' => 'afterOrAt', 'value' => $beginDate->toString('yyyy-MM-dd')); $baseDonationFilter[] = array('field' => 'donation_date', 'operator' => 'beforeOrAt', 'value' => $endDate->toString('yyyy-MM-dd')); $baseOpFilter = new Billing_Model_OpenItemFilter($baseOpFilter, 'AND'); $baseDonationFilter = new Donator_Model_DonationFilter($baseDonationFilter, 'AND'); $feeGroups = Membership_Controller_FeeGroup::getInstance()->getAllFeeGroups('key'); $feeGroupSum = 0; $resultValues = array(); $nowSum = $previousSum = $nextSum = $totalDonationSum = 0; $opPaging = new Tinebase_Model_Pagination(array('sort' => array('payment_date', 'pay.debitor_id'), 'dir' => 'ASC')); $bgMap = array(); foreach ($feeGroups as $feeGroup) { $opFilter = null; $opFilter = clone $baseOpFilter; $opFilter->addFilter($opFilter->createFilter('fee_group_id', 'equals', $feeGroup->__get('id'), 'rc')); $innerArray = array(); $innerArray['bg_name'] = $feeGroup->__get('name'); $bgMap[$feeGroup->__get('name')] = $feeGroup->__get('key'); foreach ($values as $key => $value) { $innerOpFilter = null; $innerOpFilter = clone $opFilter; switch ($key) { case 'VOR': $innerOpFilter->addFilter($innerOpFilter->createFilter('period', 'less', $period, 'rc')); $ids = Billing_Controller_OpenItem::getInstance()->search($innerOpFilter, $opPaging, false, true); $res['VOR'][$feeGroup->__get('name')] = $ids; case 'JETZT': $innerOpFilter->addFilter($innerOpFilter->createFilter('period', 'equals', $period, 'rc')); $ids = Billing_Controller_OpenItem::getInstance()->search($innerOpFilter, $opPaging, false, true); $res['JETZT'][$feeGroup->__get('name')] = $ids; break; case 'NACH': $innerOpFilter->addFilter($innerOpFilter->createFilter('period', 'greater', $period, 'rc')); $ids = Billing_Controller_OpenItem::getInstance()->search($innerOpFilter, $opPaging, false, true); $res['NACH'][$feeGroup->__get('name')] = $ids; } } } foreach ($res as $key => $bgOps) { foreach ($bgOps as $bgName => $ops) { $items = array(); $total = 0; foreach ($ops as $opId) { //var_dump($opId); $openItem = Billing_Controller_OpenItem::getInstance()->get($opId); $debi = $openItem->getForeignRecord('debitor_id', Billing_Controller_Debitor::getInstance()); $contact = $debi->getForeignRecord('contact_id', Addressbook_Controller_Contact::getInstance()); $openSum = $openItem->__get('open_sum'); $payedSum = $openItem->__get('payed_sum'); /*##CNR## ##COMPANY## ##LASTNAME## ##FORENAME## ##DDATE## ##USAGE## ##AMOUNT## */ $items[] = array('CNR' => $contact->__get('id'), 'COMPANY' => $contact->__get('org_name'), 'LASTNAME' => $contact->__get('n_family'), 'FORENAME' => $contact->__get('n_given'), 'SDATE' => \org\sopen\app\util\format\Date::format($openItem->__get('receipt_date')), 'PDATE' => \org\sopen\app\util\format\Date::format($openItem->__get('payment_date')), 'USAGE' => $openItem->__get('usage'), 'TOTAL' => number_format($openItem->__get('total_brutto'), 2, ',', '.'), 'PAYED' => number_format($payedSum, 2, ',', '.'), 'OPEN' => number_format($openSum, 2, ',', '.')); $total += $payedSum; } $processArray[] = array('values' => $items, 'sums' => array(), 'header' => array('BGKEY' => $bgMap[$bgName], 'BGNAME' => $bgName, 'PERIOD' => $periods[$key], 'total' => $total)); } } }
public function exportArticleSellList($data, $exportType) { $export = Billing_Custom_ArticleExportData::create($data); if ($export->hasNoGrouping() || $exportType == 'CSV') { $export->setRecordSet(Billing_Controller_ArticleSold::getInstance()->search($export->getFilter(), $export->getPagination())); } elseif ($export->hasGroupingCustomer()) { // get all customers // -> maybe a huge set // check restrictions of filter regarding customer (customer_group) /* $debitorFilter = new Billing_Model_DebitorFilter(array(),'AND'); $debFilter = null; $articleFilter = $export->getFilter(); if($articleFilter->isFilterSet('debitor_id')){ $debFilter = $articleFilter->getFilter('debitor_id'); if($debFilter->isFilterSet('id')){ $debitorFilter->addFilter($debFilter->get('id')); } if($debFilter->isFilterSet('debitor_group_id')){ $debitorFilter->addFilter($debFilter->get('debitor_group_id')); } }*/ $debitorIds = Billing_Controller_ArticleSold::getInstance()->getDebitorIds($export->getFilter()); foreach ($debitorIds as $debitorId) { $debitor = Billing_Controller_Debitor::getInstance()->get($debitorId); $export->addCustomerRecordSet(Billing_Controller_ArticleSold::getInstance()->search($export->getCustomerFilter($debitor), $export->getPagination()), $debitorId); } } switch ($exportType) { case 'PDF': $outputFileName = 'Artikel-Verkaufsliste-' . strftime('%d-%m-%Y %H-%M-%S') . '.pdf'; $templateId = Tinebase_Core::getPreference('Billing')->getValue(Billing_Preference::TEMPLATE_ARTICLE_SOLD); if ($export->hasGroupingCustomer()) { $data = array(); $aResult = $export->customerRecordsToArray(true); foreach ($aResult as $debitorId => $result) { $debitor = Billing_Controller_Debitor::getInstance()->get($debitorId); $contact = $debitor->getForeignRecord('contact_id', Addressbook_Controller_Contact::getInstance()); $data[$contact->__get('n_fileas')] = array('POS_TABLE' => $result['data'], 'customer_nr' => $debitor->__get('debitor_nr'), 'customer_name' => $contact->__get('n_fileas'), 'begin_date' => \org\sopen\app\util\format\Date::format(new Zend_Date($export->getStartDate())), 'end_date' => $export->getEndDate() ? \org\sopen\app\util\format\Date::format(new Zend_Date($export->getEndDate())) : 'heute', 'sum_total_netto' => number_format($result['total_netto'], 2, ',', '.'), 'sum_total_brutto' => number_format($result['total_brutto'], 2, ',', '.')); } ksort($data); } else { $data = array(array('POS_TABLE' => $export->toArray(true), 'begin_date' => \org\sopen\app\util\format\Date::format(new Zend_Date($export->getStartDate())), 'end_date' => $export->getEndDate() ? \org\sopen\app\util\format\Date::format(new Zend_Date($export->getEndDate())) : 'heute', 'sum_total_netto' => number_format($export->getSumTotalNetto(), 2, ',', '.'), 'sum_total_brutto' => number_format($export->getSumTotalBrutto(), 2, ',', '.'))); } Billing_Controller_PrintJobRecordData::getInstance()->export($data, $templateId, $outputFileName); break; case 'CSV': $this->exportAsCsv($export, 'Artikel-Verkaufsliste-' . strftime('%d-%m-%Y %H-%M-%S') . '.csv'); break; } }
/** * * Export to DATEV * @param string $filters Json encoded filters */ public function exportFibu($filters) { set_time_limit(0); $db = Tinebase_Core::getDb(); $tm = Tinebase_TransactionManager::getInstance(); $tId = $tm->startTransaction($db); try { $filters = Zend_Json::decode($filters); $checkFilter = new Billing_Model_OpenItemFilter($filters, 'AND'); $pagination = array('sort' => 'op_nr', 'dir' => 'ASC'); $oIController = Billing_Controller_OpenItem::getInstance(); $debController = Billing_Controller_Debitor::getInstance(); $rController = Billing_Controller_Receipt::getInstance(); $oController = Billing_Controller_Order::getInstance(); $oPController = Billing_Controller_OrderPosition::getInstance(); $aController = Billing_Controller_Article::getInstance(); $cController = Addressbook_Controller_Contact::getInstance()->_setRightChecks(false)->_setContainerACLChecks(false); // if filter contains fibu_exp_date-filter -> force reexport! if (!$checkFilter->isFilterSet('fibu_exp_date')) { $fibuFilter = array('field' => 'fibu_exp_date', 'operator' => 'isnull', 'value' => ''); $filters[] = $fibuFilter; } $filter = new Billing_Model_OpenItemFilter($filters, 'AND'); $openItemIds = $oIController->search($filter, new Tinebase_Model_Pagination($pagination), false, true); /* * - Rechnungsnummer (redundant für alle Positionen) - Rechnungsdatum (redundant für alle Positionen) - Datum Fälligkeit (redundant für alle Positionen) - Debitorennummer (redundant für alle Positionen) - Betrag netto - MWST - Betrag brutto - Artikelnummer - Artikelbezeichnung - Erlöskonto (aus Artikelstamm gemäß MWST = 0 oder > 0) * Umsatz (mit Soll/Haben-Kz) Konto Gegenkonto (ohne BU-Schl�ssel) Belegdatum Belegfeld 1 Buchungstext Kennzeichen D_Opos 299,22 1000200 440000 12.01.2012 101 Rechnung101 Forderungsart "1" D_Opos * */ $csvArray = array('Umsatz (mit Soll/Haben-Kz)', 'Konto', 'Gegenkonto (ohne BU-Schlüssel)', 'Belegdatum', 'Belegfeld', 'Buchungstext', 'Kennzeichen', 'D_Opos'); /* * * - Debitorennummer - Vorname - Name - Anrede - Titel - Firma 1 - Firma 2 - Zusatz - Straße - PLZ - Ort - Land Kontonummer Unternehmen Anrede Titel Vorname Name1 Adressattyp UST ID Stra�e Postfach Postleitzahl Ort Land Bankleitzahl 1 Bankbez. 1 Bank-Kontonummer 1 Bank-L�nderkennz. 1 IBAN-Nr. 1 SWIFT-Code 1 Bankleitzahl 2 Bankbez. 2 Bank-Kontonummer2 Bank-L�nderkennz. 2 IBAN-Nr. 2 SWIFT-Code 2 5841100 Acuarios Jandia Sotavento Beach Club B.Lehmann Lehmann & Buschmann 2 DE111667148 Wefelen 27 35627 Costa-Calma/Fuerte. Spanien 70050000 Bayern LB M�nchen 2034343 DE DE14700500000002034343 BYLADEMM 5841200 Herr Prof. Dr. Hansi Gustavo 1 DE111667148 Wefelen 29 52134 Herzogenrath 39050000 Sparkasse Aachen 47176987 */ $debsArray = array('Kontonummer', 'Unternehmen', 'Anrede', 'Titel', 'Vorname', 'Name1', 'Adressattyp', 'UST ID', 'Straße', 'Postfach', 'Postleitzahl', 'Ort', 'Land', 'Bankleitzahl 1', 'Bankbez. 1', 'Bank-Kontonummer 1', 'Bank-Länderkennz. 1', 'IBAN-Nr. 1', 'SWIFT-Code 1', 'Bankbez. 2', 'Bank-Kontonummer 2', 'Bank-Länderkennz. 2', 'IBAN-Nr. 2', 'SWIFT-Code 2'); $tempFilePath = CSopen::instance()->getCustomerPath() . '/customize/data/documents/temp/'; $itemsFilename = $tempFilePath . strftime('%Y%m%d%H%M%S') . 'items_temp.csv'; $debsFilename = $tempFilePath . strftime('%Y%m%d%H%M%S') . 'debs_temp.csv'; $zipFilename = $tempFilePath . strftime('%Y%m%d%H%M%S') . 'archive_temp.csv'; if (file_exists($itemsFilename)) { unlink($itemsFilename); } $itemsFileHandle = fopen($itemsFilename, 'w'); //$filePointer, $dataArray, $delimiter=',', $enclosure='"', $escapeEnclosure='"' Tinebase_Export_Csv::fputcsvEncoding('ISO-8859-1//TRANSLIT', $itemsFileHandle, $csvArray, chr(9), '"', ''); if (file_exists($debsFilename)) { unlink($debsFilename); } $debsFileHandle = fopen($debsFilename, 'w'); Tinebase_Export_Csv::fputcsvEncoding('ISO-8859-1//TRANSLIT', $debsFileHandle, $debsArray, chr(9), '"', ''); $zeroVat = Billing_Controller_Vat::getInstance()->getByName('0'); $creditorZeroAccount = $zeroVat->__get('credit_account'); $fibuExpDate = new Zend_Date(strftime('%Y-%m-%d')); $adType = 1; foreach ($openItemIds as $openItemId) { $oI = Billing_Controller_OpenItem::getInstance()->get($openItemId); $oI->flatten(); $receiptId = $oI->__get('receipt_id'); $receipt = $rController->get($receiptId); if (!$receipt->__get('fibu_exp_date')) { $receipt->__set('fibu_exp_date', $fibuExpDate); $receipt->flatten(); //print_r($receipt); $rController->update($receipt); } $oI->__set('fibu_exp_date', $fibuExpDate); $oIController->update($oI); $positions = $rController->getOrderPositions($receiptId); //$sums = $rController->getReceiptSumValues($receiptId); $orderId = $receipt->__get('order_id'); $order = $oController->get($orderId); $debitor = $order->__get('debitor_id'); $debitorNr = $debitor->__get('debitor_nr'); $contact = $debitor->getForeignRecord('contact_id', $cController); $debitor->flatten(); $contactId = $debitor->__get('contact_id'); $name = $contact->__get('n_fileas'); $receiptNr = $oI->__get('receipt_nr'); $adType = 1; if ($contact->__get('org_name') && $contact->getLetterDrawee()->isCompany()) { $adType = 2; } $dueDate = $receipt->__get('due_date'); if (!$debitor->__get('fibu_exp_date')) { $drawee = $contact->getInvoiceDrawee(); $postal = $drawee->getPostalAddress(); $pf = ''; $street = ''; if (strpos($postal->getStreet(), 'Post')) { $pf = $postal->getStreet(); } else { $street = $postal->getStreet(); } // export debitor $debsArray = array($debitorNr, $contact->__get('org_name'), $drawee->getSalutationText(), $drawee->getTitle(), $contact->__get('n_given'), $contact->__get('n_family'), $adType, $debitor->__get('ust_id'), $street, $pf, $postal->getPostalCode(), $postal->getLocation(), $postal->getCountryCode('DE'), $contact->__get('bank_code'), $contact->__get('bank_name'), $contact->__get('bank_account_number'), trim($contact->__get('bank_code')) ? $postal->getCountryCode() : '', '', '', '', '', '', '', '', ''); Tinebase_Export_Csv::fputcsvEncoding('ISO-8859-1//TRANSLIT', $debsFileHandle, $debsArray, chr(9), '"', ''); $debitor->__set('fibu_exp_date', new Zend_Date()); $debController->update($debitor); } // $values = array(); // $values[] = array( // 'value' => $sums['total']['sum']['netto'], // 'credit_account' => $creditorZeroAccount // ); // // foreach($sums['vat_sums'] as $vatSum){ // $values[] = array( // 'value' => $vatSum['sum']['netto'], // 'credit_account' => $vatSum['sum']['vatcreditaccount'] // ); // } //Umsatz (mit Soll/Haben-Kz) Konto Gegenkonto (ohne BU-Schl�ssel) Belegdatum Belegfeld 1 Buchungstext Kennzeichen D_Opos //299,22 1000200 440000 12.01.2012 101 Rechnung101 Forderungsart "1" D_Opos $receiptText = ''; if ($receipt->__get('type') == Billing_Model_Receipt::TYPE_INVOICE) { $receiptText = 'Rechnung'; $receiptDate = $receipt->__get('invoice_date'); $receiptNr = $receipt->__get('invoice_nr'); } else { $receiptText = 'Gutschrift'; $receiptDate = $receipt->__get('credit_date'); $receiptNr = $receipt->__get('credit_nr'); } $bookingText = $receiptText . $receiptNr; /*if($oI->__get('usage')){ $bookingText = $oI->__get('usage'); }*/ $paymentMethodId = $receipt->getForeignId('payment_method_id'); $mapPaymentMethod = array('PREPAYMENT' => 1, 'BANKTRANSFER' => 2, 'DEBIT' => 3, 'CASH' => 4, 'CREDITCARD' => 5, 'PAYPAL' => 6, 'IMMEDIATETRANSFER' => 7); $intPaymentMethod = $mapPaymentMethod[$paymentMethodId]; foreach ($positions as $position) { $brutto = $position->__get('total_brutto'); //$vatSum = $oPController->getVatSum($position); //$article = $position->getForeignRecord('article_id', $aController); //$articleName = $article->__get('name'); //$articleNr = $article->__get('article_nr'); $revAccount = $oPController->getRevenueAccountAccordingToVat($position) . '00'; $csvArray = array(number_format($brutto, 2, ',', '.'), $debitorNr, $revAccount, \org\sopen\app\util\format\Date::format($receiptDate), $receiptNr, $bookingText, 'Forderungsart ' . $intPaymentMethod, 'D_Opos'); Tinebase_Export_Csv::fputcsvEncoding('ISO-8859-1//TRANSLIT', $itemsFileHandle, $csvArray, chr(9), '"', ''); } } fclose($itemsFileHandle); fclose($debsFileHandle); // -> generate zip archive containing Debitoren.csv and Forderungen.csv $zip = new ZipArchive(); $zipFile = $zipFilename . ".zip"; if ($zip->open($zipFile, ZIPARCHIVE::CREATE) !== TRUE) { exit("cannot open <{$zipFile}>\n"); } $zip->addFile($debsFilename, 'Debitoren.csv'); $zip->addFile($itemsFilename, 'Forderungen.csv'); $zip->close(); $tm->commitTransaction($tId); } catch (Exception $e) { $tm->rollback($tId); echo $e->__toString(); exit; } header("Content-type: application/zip;\n"); header("Content-Transfer-Encoding: binary"); $len = filesize($zipFile); header("Content-Length: {$len};\n"); header("Content-Disposition: attachment; filename=\"DATEV.zip\";\n\n"); readfile($zipFile); unlink($zipFile); unlink($debsFilename); unlink($itemsFilename); }