Merge pull request #10439 from jitendrapurohit/CRM-20657
[civicrm-core.git] / CRM / Financial / BAO / ExportFormat.php
CommitLineData
03e04002 1<?php
2/*
3 +--------------------------------------------------------------------+
7e9e8871 4 | CiviCRM version 4.7 |
03e04002 5 +--------------------------------------------------------------------+
0f03f337 6 | Copyright CiviCRM LLC (c) 2004-2017 |
03e04002 7 +--------------------------------------------------------------------+
8 | This file is a part of CiviCRM. |
9 | |
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. |
13 | |
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. |
18 | |
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 +--------------------------------------------------------------------+
d25dd0ee 26 */
03e04002 27
28/**
29 *
30 * @package CRM
0f03f337 31 * @copyright CiviCRM LLC (c) 2004-2017
03e04002 32 */
33
34/**
35 * Base class for Export Formats
36 * Create a subclass for a specific format.
37 * @see http://wiki.civicrm.org/confluence/display/CRM/CiviAccounts+Specifications+-++Batches#CiviAccountsSpecifications-Batches-%C2%A0Overviewofimplementation
38 */
9b05de29 39abstract class CRM_Financial_BAO_ExportFormat {
03e04002 40
d424ffde 41 /**
fe482240 42 * data which the individual export formats will output in the desired format.
d424ffde 43 * @var array
03e04002 44 */
45 protected $_exportParams;
46
d424ffde 47 /**
fe482240 48 * smarty template.
d424ffde 49 * @var CRM_Core_Smarty
03e04002 50 */
51 static protected $_template;
52
53 /**
fe482240 54 * Class constructor.
03e04002 55 */
00be9182 56 public function __construct() {
481a74f4 57 if (!isset(self::$_template)) {
03e04002 58 self::$_template = CRM_Core_Smarty::singleton();
59 }
60 }
61
e0ef6999 62 /**
fe482240 63 * Override to assemble the appropriate subset of financial data for the specific export format.
100fef9d 64 * @param array $exportParams
e0ef6999
EM
65 *
66 * @return mixed
67 */
00be9182 68 public function export($exportParams) {
03e04002 69 $this->_exportParams = $exportParams;
70 return $exportParams;
71 }
72
e0ef6999 73 /**
b6a80401 74 * Exports sbatches in $this->_batchIds, and saves to file.
2f7f541b 75 *
b6a80401 76 * @param string $fileName - use this file name (if applicable)
e0ef6999 77 */
00be9182 78 public function output($fileName = NULL) {
b6a80401
JV
79 // Default behaviour, override if needed:
80 self::createActivityExport($this->_batchIds, $fileName);
03e04002 81 }
82
9b05de29
JV
83 /**
84 * Abstract function that generates exports, and downloads them as zip file.
85 *
86 * @param $exportDaos array with DAO's for queries to be exported.
87 */
88 public abstract function makeExport($exportDaos);
89
e0ef6999
EM
90 /**
91 * @return string
92 */
00be9182 93 public function getMimeType() {
03e04002 94 return 'text/plain';
95 }
96
e0ef6999 97 /**
57bd5cda
JV
98 * Returns some kind of identification for your export format.
99 *
100 * This does not really has to be a file extension, you can name your
101 * file as you wish as you override output.
102 *
e0ef6999
EM
103 * @return string
104 */
57bd5cda 105 public abstract function getFileExtension();
03e04002 106
e0ef6999
EM
107 /**
108 * @return object
109 */
00be9182 110 public static function &getTemplate() {
03e04002 111 return self::$_template;
112 }
113
e0ef6999
EM
114 /**
115 * @param $var
116 * @param null $value
117 */
00be9182 118 public function assign($var, $value = NULL) {
03e04002 119 self::$_template->assign($var, $value);
120 }
121
122 /*
123 * This gets called for every item of data being compiled before being sent to the exporter for output.
124 *
125 * Depending on the output format might want to override this, e.g. for IIF tabs need to be escaped etc,
126 * but for CSV it doesn't make sense because php has built in csv output functions.
127 */
e0ef6999
EM
128 /**
129 * @param $s
130 * @param string $type
131 *
132 * @return null
133 */
00be9182 134 public static function format($s, $type = 'string') {
03e04002 135 if (!empty($s)) {
136 return $s;
137 }
138 else {
139 return NULL;
140 }
141 }
142
00be9182 143 public function initiateDownload() {
03e04002 144 $config = CRM_Core_Config::singleton();
cded2ebf 145 // zip files if more than one.
045f52a3 146 if (count($this->_downloadFile) > 1) {
f4114c3e 147 $zip = $config->customFileUploadDir . 'Financial_Transactions_' . date('YmdHis') . '.zip';
03e04002 148 $result = $this->createZip($this->_downloadFile, $zip, TRUE);
149 if ($result) {
d42a224c
CW
150 CRM_Utils_System::setHttpHeader('Content-Type', 'application/zip');
151 CRM_Utils_System::setHttpHeader('Content-Disposition', 'attachment; filename=' . CRM_Utils_File::cleanFileName(basename($zip)));
152 CRM_Utils_System::setHttpHeader('Content-Length', '' . filesize($zip));
03e04002 153 ob_clean();
154 flush();
f4114c3e 155 readfile($config->customFileUploadDir . CRM_Utils_File::cleanFileName(basename($zip)));
03e04002 156 unlink($zip); //delete the zip to avoid clutter.
157 CRM_Utils_System::civiExit();
158 }
159 }
160 else {
d42a224c
CW
161 CRM_Utils_System::setHttpHeader('Content-Type', 'text/plain');
162 CRM_Utils_System::setHttpHeader('Content-Disposition', 'attachment; filename=' . CRM_Utils_File::cleanFileName(basename($this->_downloadFile[0])));
163 CRM_Utils_System::setHttpHeader('Content-Length', '' . filesize($this->_downloadFile[0]));
03e04002 164 ob_clean();
165 flush();
f4114c3e 166 readfile($config->customFileUploadDir . CRM_Utils_File::cleanFileName(basename($this->_downloadFile[0])));
03e04002 167 CRM_Utils_System::civiExit();
168 }
169 }
170
e0ef6999
EM
171 /**
172 * @param $batchIds
100fef9d 173 * @param string $fileName
e0ef6999
EM
174 *
175 * @throws CRM_Core_Exception
176 */
00be9182 177 public static function createActivityExport($batchIds, $fileName) {
03e04002 178 $session = CRM_Core_Session::singleton();
179 $values = array();
180 $params = array('id' => $batchIds);
181 CRM_Batch_BAO_Batch::retrieve($params, $values);
182 $createdBy = CRM_Contact_BAO_Contact::displayName($values['created_id']);
183 $modifiedBy = CRM_Contact_BAO_Contact::displayName($values['modified_id']);
184
185 $values['payment_instrument_id'] = '';
186 if (isset($values['payment_instrument_id'])) {
187 $paymentInstrument = array_flip(CRM_Contribute_PseudoConstant::paymentInstrument('label'));
188 $values['payment_instrument_id'] = array_search($values['payment_instrument_id'], $paymentInstrument);
189 }
536f0e02 190 $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 Method:') . ' ' . $values['payment_instrument_id'] . '</p>';
03e04002 191 $subject = '';
a7488080 192 if (!empty($values['total'])) {
86bfa4f6 193 $subject .= ts('Total') . '[' . CRM_Utils_Money::format($values['total']) . '],';
03e04002 194 }
a7488080 195 if (!empty($values['item_count'])) {
86bfa4f6 196 $subject .= ' ' . ts('Count') . '[' . $values['item_count'] . '],';
03e04002 197 }
198
cded2ebf 199 // create activity.
86bfa4f6 200 $subject .= ' ' . ts('Batch') . '[' . $values['title'] . ']';
03e04002 201 $activityTypes = CRM_Core_PseudoConstant::activityType(TRUE, FALSE, FALSE, 'name');
202 $activityParams = array(
203 'activity_type_id' => array_search('Export Accounting Batch', $activityTypes),
204 'subject' => $subject,
205 'status_id' => 2,
206 'activity_date_time' => date('YmdHis'),
207 'source_contact_id' => $session->get('userID'),
208 'source_record_id' => $values['id'],
209 'target_contact_id' => $session->get('userID'),
210 'details' => $details,
045f52a3 211 'attachFile_1' => array(
03e04002 212 'uri' => $fileName,
213 'type' => 'text/csv',
214 'location' => $fileName,
215 'upload_date' => date('YmdHis'),
216 ),
217 );
218
219 CRM_Activity_BAO_Activity::create($activityParams);
220 }
221
e0ef6999
EM
222 /**
223 * @param array $files
224 * @param null $destination
225 * @param bool $overwrite
226 *
227 * @return bool
228 */
00be9182 229 public function createZip($files = array(), $destination = NULL, $overwrite = FALSE) {
cded2ebf 230 // if the zip file already exists and overwrite is false, return false
03e04002 231 if (file_exists($destination) && !$overwrite) {
232 return FALSE;
233 }
234 $valid_files = array();
235 if (is_array($files)) {
236 foreach ($files as $file) {
cded2ebf 237 // make sure the file exists
03e04002 238 if (file_exists($file)) {
239 $validFiles[] = $file;
240 }
241 }
242 }
243 if (count($validFiles)) {
244 $zip = new ZipArchive();
045f52a3 245 if ($zip->open($destination, $overwrite ? ZIPARCHIVE::OVERWRITE : ZIPARCHIVE::CREATE) !== TRUE) {
03e04002 246 return FALSE;
247 }
248 foreach ($validFiles as $file) {
249 $zip->addFile($file, CRM_Utils_File::cleanFileName(basename($file)));
250 }
251 $zip->close();
252 return file_exists($destination);
253 }
254 else {
045f52a3
TO
255 return FALSE;
256 }
03e04002 257 }
96025800 258
232624b1 259}