INFRA-132 - Docblock formatting fixes
[civicrm-core.git] / CRM / Financial / BAO / ExportFormat.php
1 <?php
2 /*
3 +--------------------------------------------------------------------+
4 | CiviCRM version 4.6 |
5 +--------------------------------------------------------------------+
6 | Copyright CiviCRM LLC (c) 2004-2014 |
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 +--------------------------------------------------------------------+
26 */
27
28 /**
29 *
30 * @package CRM
31 * @copyright CiviCRM LLC (c) 2004-2014
32 * $Id$
33 *
34 */
35
36 /**
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
40 */
41 class CRM_Financial_BAO_ExportFormat {
42
43 /**
44 * data which the individual export formats will output in the desired format
45 * @var array
46 */
47 protected $_exportParams;
48
49 /**
50 * smarty template
51 * @var CRM_Core_Smarty
52 */
53 static protected $_template;
54
55 /**
56 * Class constructor
57 */
58 public function __construct() {
59 if (!isset(self::$_template)) {
60 self::$_template = CRM_Core_Smarty::singleton();
61 }
62 }
63
64 /**
65 * Override to assemble the appropriate subset of financial data for the specific export format
66 * @param array $exportParams
67 *
68 * @return mixed
69 */
70 public function export($exportParams) {
71 $this->_exportParams = $exportParams;
72 return $exportParams;
73 }
74
75 /**
76 * @param null $fileName
77 */
78 public function output($fileName = NULL) {
79 switch ($this->getFileExtension()) {
80 case 'csv':
81 self::createActivityExport($this->_batchIds, $fileName);
82 break;
83
84 case 'iif':
85 $tplFile = $this->getHookedTemplateFileName();
86 $out = self::getTemplate()->fetch($tplFile);
87 $fileName = $this->putFile($out);
88 self::createActivityExport($this->_batchIds, $fileName);
89 break;
90 }
91 }
92
93 /**
94 * @return string
95 */
96 public function getMimeType() {
97 return 'text/plain';
98 }
99
100 /**
101 * @return string
102 */
103 public function getFileExtension() {
104 return 'txt';
105 }
106
107 /**
108 * Override this if appropriate
109 * @return null
110 */
111 public function getTemplateFileName() {
112 return NULL;
113 }
114
115 /**
116 * @return object
117 */
118 public static function &getTemplate() {
119 return self::$_template;
120 }
121
122 /**
123 * @param $var
124 * @param null $value
125 */
126 public function assign($var, $value = NULL) {
127 self::$_template->assign($var, $value);
128 }
129
130 /*
131 * This gets called for every item of data being compiled before being sent to the exporter for output.
132 *
133 * Depending on the output format might want to override this, e.g. for IIF tabs need to be escaped etc,
134 * but for CSV it doesn't make sense because php has built in csv output functions.
135 */
136 /**
137 * @param $s
138 * @param string $type
139 *
140 * @return null
141 */
142 public static function format($s, $type = 'string') {
143 if (!empty($s)) {
144 return $s;
145 }
146 else {
147 return NULL;
148 }
149 }
150
151 public function initiateDownload() {
152 $config = CRM_Core_Config::singleton();
153 //zip files if more than one.
154 if (count($this->_downloadFile) > 1) {
155 $zip = $config->customFileUploadDir . 'Financial_Transactions_' . date('YmdHis') . '.zip';
156 $result = $this->createZip($this->_downloadFile, $zip, TRUE);
157 if ($result) {
158 header('Content-Type: application/zip');
159 header('Content-Disposition: attachment; filename=' . CRM_Utils_File::cleanFileName(basename($zip)));
160 header('Content-Length: ' . filesize($zip));
161 ob_clean();
162 flush();
163 readfile($config->customFileUploadDir . CRM_Utils_File::cleanFileName(basename($zip)));
164 unlink($zip); //delete the zip to avoid clutter.
165 CRM_Utils_System::civiExit();
166 }
167 }
168 else {
169 header('Content-Type: text/plain');
170 header('Content-Disposition: attachment; filename=' . CRM_Utils_File::cleanFileName(basename($this->_downloadFile[0])));
171 header('Content-Length: ' . filesize($this->_downloadFile[0]));
172 ob_clean();
173 flush();
174 readfile($config->customFileUploadDir . CRM_Utils_File::cleanFileName(basename($this->_downloadFile[0])));
175 CRM_Utils_System::civiExit();
176 }
177 }
178
179 /**
180 * @param $batchIds
181 * @param string $fileName
182 *
183 * @throws CRM_Core_Exception
184 */
185 public static function createActivityExport($batchIds, $fileName) {
186 $session = CRM_Core_Session::singleton();
187 $values = array();
188 $params = array('id' => $batchIds);
189 CRM_Batch_BAO_Batch::retrieve($params, $values);
190 $createdBy = CRM_Contact_BAO_Contact::displayName($values['created_id']);
191 $modifiedBy = CRM_Contact_BAO_Contact::displayName($values['modified_id']);
192
193 $values['payment_instrument_id'] = '';
194 if (isset($values['payment_instrument_id'])) {
195 $paymentInstrument = array_flip(CRM_Contribute_PseudoConstant::paymentInstrument('label'));
196 $values['payment_instrument_id'] = array_search($values['payment_instrument_id'], $paymentInstrument);
197 }
198 $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 $subject = '';
200 if (!empty($values['total'])) {
201 $subject .= ts('Total') . '[' . CRM_Utils_Money::format($values['total']) . '],';
202 }
203 if (!empty($values['item_count'])) {
204 $subject .= ' ' . ts('Count') . '[' . $values['item_count'] . '],';
205 }
206
207 //create activity.
208 $subject .= ' ' . ts('Batch') . '[' . $values['title'] . ']';
209 $activityTypes = CRM_Core_PseudoConstant::activityType(TRUE, FALSE, FALSE, 'name');
210 $activityParams = array(
211 'activity_type_id' => array_search('Export Accounting Batch', $activityTypes),
212 'subject' => $subject,
213 'status_id' => 2,
214 'activity_date_time' => date('YmdHis'),
215 'source_contact_id' => $session->get('userID'),
216 'source_record_id' => $values['id'],
217 'target_contact_id' => $session->get('userID'),
218 'details' => $details,
219 'attachFile_1' => array(
220 'uri' => $fileName,
221 'type' => 'text/csv',
222 'location' => $fileName,
223 'upload_date' => date('YmdHis'),
224 ),
225 );
226
227 CRM_Activity_BAO_Activity::create($activityParams);
228 }
229
230 /**
231 * @param array $files
232 * @param null $destination
233 * @param bool $overwrite
234 *
235 * @return bool
236 */
237 public function createZip($files = array(), $destination = NULL, $overwrite = FALSE) {
238 //if the zip file already exists and overwrite is false, return false
239 if (file_exists($destination) && !$overwrite) {
240 return FALSE;
241 }
242 $valid_files = array();
243 if (is_array($files)) {
244 foreach ($files as $file) {
245 //make sure the file exists
246 if (file_exists($file)) {
247 $validFiles[] = $file;
248 }
249 }
250 }
251 if (count($validFiles)) {
252 $zip = new ZipArchive();
253 if ($zip->open($destination, $overwrite ? ZIPARCHIVE::OVERWRITE : ZIPARCHIVE::CREATE) !== TRUE) {
254 return FALSE;
255 }
256 foreach ($validFiles as $file) {
257 $zip->addFile($file, CRM_Utils_File::cleanFileName(basename($file)));
258 }
259 $zip->close();
260 return file_exists($destination);
261 }
262 else {
263 return FALSE;
264 }
265 }
266 }