3 +--------------------------------------------------------------------+
4 | CiviCRM version 4.5 |
5 +--------------------------------------------------------------------+
6 | Copyright CiviCRM LLC (c) 2004-2014 |
7 +--------------------------------------------------------------------+
8 | This file is a part of CiviCRM. |
10 | CiviCRM is free software; you can copy, modify, and distribute it |
11 | under the terms of the GNU Affero General Public License |
12 | Version 3, 19 November 2007 and the CiviCRM Licensing Exception. |
14 | CiviCRM is distributed in the hope that it will be useful, but |
15 | WITHOUT ANY WARRANTY; without even the implied warranty of |
16 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
17 | See the GNU Affero General Public License for more details. |
19 | You should have received a copy of the GNU Affero General Public |
20 | License and the CiviCRM Licensing Exception along |
21 | with this program; if not, contact CiviCRM LLC |
22 | at info[AT]civicrm[DOT]org. If you have questions about the |
23 | GNU Affero General Public License or the licensing of CiviCRM, |
24 | see the CiviCRM license FAQ at http://civicrm.org/licensing |
25 +--------------------------------------------------------------------+
31 * @copyright CiviCRM LLC (c) 2004-2014
37 * Base class for Export Formats
38 * Create a subclass for a specific format.
39 * @see http://wiki.civicrm.org/confluence/display/CRM/CiviAccounts+Specifications+-++Batches#CiviAccountsSpecifications-Batches-%C2%A0Overviewofimplementation
42 class CRM_Financial_BAO_ExportFormat
{
45 * Array of data which the individual export formats will output in the desired format
47 protected $_exportParams;
52 static protected $_template;
57 function __construct() {
58 if ( !isset( self
::$_template ) ) {
59 self
::$_template = CRM_Core_Smarty
::singleton();
63 // Override to assemble the appropriate subset of financial data for the specific export format
65 * @param $exportParams
69 function export($exportParams) {
70 $this->_exportParams
= $exportParams;
75 * @param null $fileName
77 function output($fileName = NULL) {
78 switch ($this->getFileExtension()) {
80 self
::createActivityExport($this->_batchIds
, $fileName);
84 $tplFile = $this->getHookedTemplateFileName();
85 $out = self
::getTemplate()->fetch($tplFile);
86 $fileName = $this->putFile($out);
87 self
::createActivityExport($this->_batchIds
, $fileName);
95 function getMimeType() {
102 function getFileExtension() {
106 // Override this if appropriate
110 function getTemplateFileName() {
117 static function &getTemplate() {
118 return self
::$_template;
125 function assign($var, $value = NULL) {
126 self
::$_template->assign($var, $value);
130 * This gets called for every item of data being compiled before being sent to the exporter for output.
132 * Depending on the output format might want to override this, e.g. for IIF tabs need to be escaped etc,
133 * but for CSV it doesn't make sense because php has built in csv output functions.
137 * @param string $type
141 static function format($s, $type = 'string') {
150 function initiateDownload() {
151 $config = CRM_Core_Config
::singleton();
152 //zip files if more than one.
153 if (count($this->_downloadFile
)>1) {
154 $zip = $config->customFileUploadDir
. 'Financial_Transactions_' . date('YmdHis') . '.zip';
155 $result = $this->createZip($this->_downloadFile
, $zip, TRUE);
157 header('Content-Type: application/zip');
158 header('Content-Disposition: attachment; filename=' . CRM_Utils_File
::cleanFileName(basename($zip)));
159 header('Content-Length: ' . filesize($zip));
162 readfile($config->customFileUploadDir
. CRM_Utils_File
::cleanFileName(basename($zip)));
163 unlink($zip); //delete the zip to avoid clutter.
164 CRM_Utils_System
::civiExit();
168 header('Content-Type: text/plain');
169 header('Content-Disposition: attachment; filename=' . CRM_Utils_File
::cleanFileName(basename($this->_downloadFile
[0])));
170 header('Content-Length: ' . filesize($this->_downloadFile
[0]));
173 readfile($config->customFileUploadDir
. CRM_Utils_File
::cleanFileName(basename($this->_downloadFile
[0])));
174 CRM_Utils_System
::civiExit();
182 * @throws CRM_Core_Exception
184 static function createActivityExport($batchIds, $fileName) {
185 $session = CRM_Core_Session
::singleton();
187 $params = array('id' => $batchIds);
188 CRM_Batch_BAO_Batch
::retrieve($params, $values);
189 $createdBy = CRM_Contact_BAO_Contact
::displayName($values['created_id']);
190 $modifiedBy = CRM_Contact_BAO_Contact
::displayName($values['modified_id']);
192 $values['payment_instrument_id'] = '';
193 if (isset($values['payment_instrument_id'])) {
194 $paymentInstrument = array_flip(CRM_Contribute_PseudoConstant
::paymentInstrument('label'));
195 $values['payment_instrument_id'] = array_search($values['payment_instrument_id'], $paymentInstrument);
197 $details = '<p>' . ts('Record: ') . $values['title'] . '</p><p>' . ts('Description: ') . '</p><p>' . ts('Created By: ') . $createdBy . '</p><p>' . ts('Created Date: ') . $values['created_date'] . '</p><p>' . ts('Last Modified By: ') . $modifiedBy . '</p><p>' . ts('Payment Instrument: ') . $values['payment_instrument_id'] . '</p>';
199 if (!empty($values['total'])) {
200 $subject .= ts('Total') . '['. CRM_Utils_Money
::format($values['total']) .'],';
202 if (!empty($values['item_count'])) {
203 $subject .= ' ' . ts('Count') . '['. $values['item_count'] .'],';
207 $subject .= ' ' . ts('Batch') . '['. $values['title'] .']';
208 $activityTypes = CRM_Core_PseudoConstant
::activityType(TRUE, FALSE, FALSE, 'name');
209 $activityParams = array(
210 'activity_type_id' => array_search('Export Accounting Batch', $activityTypes),
211 'subject' => $subject,
213 'activity_date_time' => date('YmdHis'),
214 'source_contact_id' => $session->get('userID'),
215 'source_record_id' => $values['id'],
216 'target_contact_id' => $session->get('userID'),
217 'details' => $details,
218 'attachFile_1' => array (
220 'type' => 'text/csv',
221 'location' => $fileName,
222 'upload_date' => date('YmdHis'),
226 CRM_Activity_BAO_Activity
::create($activityParams);
230 * @param array $files
231 * @param null $destination
232 * @param bool $overwrite
236 function createZip($files = array(), $destination = NULL, $overwrite = FALSE) {
237 //if the zip file already exists and overwrite is false, return false
238 if (file_exists($destination) && !$overwrite) {
241 $valid_files = array();
242 if (is_array($files)) {
243 foreach ($files as $file) {
244 //make sure the file exists
245 if (file_exists($file)) {
246 $validFiles[] = $file;
250 if (count($validFiles)) {
251 $zip = new ZipArchive();
252 if ($zip->open($destination,$overwrite ? ZIPARCHIVE
::OVERWRITE
: ZIPARCHIVE
::CREATE
) !== TRUE) {
255 foreach ($validFiles as $file) {
256 $zip->addFile($file, CRM_Utils_File
::cleanFileName(basename($file)));
259 return file_exists($destination);