tra('Payment List'), 'documentation' => 'PluginPaymentlist', 'description' => tra('Show details of payments. The payments considered may be restrained by user or date.'), 'prefs' => [ 'wikiplugin_paymentlist', 'payment_feature' ], 'iconname' => 'money', 'introduced' => 16.2, 'format' => 'html', 'params' => [ 'type' => [ 'required' => false, 'name' => tra('User'), 'description' => tra('Payment type'), 'since' => 16.2, 'filter' => 'word', 'default' => 'past', 'options' => [ ['text' => tra('Past'), 'value' => 'past'], ['text' => tra('Outstanding'), 'value' => 'outstanding'], ['text' => tra('Cancelled'), 'value' => 'cancelled'], ['text' => tra('Overdue'), 'value' => 'overdue'], ['text' => tra('Authorized'), 'value' => 'authorized'], ], ], 'format' => [ 'required' => false, 'name' => tra('Output format'), 'description' => tra(''), 'since' => 16.2, 'filter' => 'word', 'default' => 'total', 'options' => [ ['text' => tra('Total'), 'value' => 'total'], ['text' => tra('Table'), 'value' => 'table'], ['text' => tra('JSON (for advanced custom usage)'), 'value' => 'json'], ], ], 'user' => [ 'required' => false, 'name' => tra('User'), 'description' => tra('Payments by a particular user'), 'since' => 16.2, 'filter' => 'username', 'default' => '', ], 'payer' => [ 'required' => false, 'name' => tra('Payer email'), 'description' => tra("Payments by anonymous where the payer's email is recorded"), 'since' => 16.2, 'filter' => 'email', 'default' => '', ], 'date_start' => [ 'required' => false, 'name' => tra('Start Date'), 'description' => tra('Date range start, accepts most date formats'), 'since' => 16.2, 'filter' => 'date', 'default' => '', ], 'date_end' => [ 'required' => false, 'name' => tra('End Date'), 'description' => tra('Date range end'), 'since' => 16.2, 'filter' => 'date', 'default' => '', ], 'filter' => [ 'required' => false, 'name' => tra('Advanced filter'), 'description' => tra('URL encoded string for advanced searching (e.g. description=Club+Membership&details=info@example.com)'), 'since' => 16.2, 'filter' => 'text', 'default' => '', ], 'offset' => [ 'required' => false, 'name' => tra('List offset'), 'description' => tra('For pagination'), 'since' => 16.2, 'filter' => 'digits', 'default' => 0, ], 'max' => [ 'required' => false, 'name' => tra('Payments per page'), 'since' => 16.2, 'filter' => 'digits', 'default' => -1, ], 'sort' => [ 'required' => false, 'name' => tra('Sort order'), 'since' => 16.2, 'filter' => 'word', 'default' => '', 'options' => [ ['text' => tra('Automatic (newest first)'), 'value' => ''], ['text' => tra('User A to Z'), 'value' => 'login_asc'], ['text' => tra('User Z to A'), 'value' => 'login_desc'], ['text' => tra('Amount low to high'), 'value' => 'amount_asc'], ['text' => tra('Amount high to low'), 'value' => 'amount_desc'], ['text' => tra('Payment: oldest first'), 'value' => 'payment_date_asc'], ['text' => tra('Payment: newest first'), 'value' => 'payment_date_desc'], ['text' => tra('Request: oldest first'), 'value' => 'request_date_asc'], ['text' => tra('Request: newest first'), 'value' => 'request_date_desc'], ], ], ] ]; } function wikiplugin_paymentlist($data, $params) { static $instance = 0; $instance++; // process defaults $default = []; $plugininfo = wikiplugin_paymentlist_info(); foreach ($plugininfo['params'] as $key => $p) { $default[$key] = $p['default']; } $params = array_merge($default, $params); $output = ''; $paymentlib = TikiLib::lib('payment'); $payments = []; $template = 'tiki-payment-list.tpl'; parse_str($params['filter'], $filter); // convert url type filter (e.g. 'description=foo' to array (description=>foo) // make date filter $date_field = $params['type'] === 'past' ? 'payment_date' : 'request_date'; $start = strtotime($params['date_start']); $end = strtotime($params['date_end']); if ($start && $end) { $filter[$date_field] = "between FROM_UNIXTIME($start) and FROM_UNIXTIME($end)"; } elseif ($start) { $filter[$date_field] = "> FROM_UNIXTIME($start)"; } elseif ($end) { $filter[$date_field] = "< FROM_UNIXTIME($end)"; } // payer filter if ($params['payer']) { if (isset($filter['details'])) { Feedback::error(tra('Note, the paymentlist "payer" parameter cannot be used when search for "details" in an advance filter.')); } else { $filter['details'] = '"payer_email":"' . $params['payer'] . '"'; } } // list management $offset_arg = "offset_{$params['type']}_$instance"; if (empty($params['offset']) && ! empty($_REQUEST[$offset_arg])) { $params['offset'] = $_REQUEST[$offset_arg]; } if ($params['type'] === 'past') { $template = 'tiki-payment-list-past.tpl'; $payments = $paymentlib->get_past($params['offset'], $params['max'], $params['user'], $filter, $params['sort']); } elseif ($params['type'] === 'outstanding') { $payments = $paymentlib->get_outstanding($params['offset'], $params['max'], $params['user'], $filter, $params['sort']); } elseif ($params['type'] === 'cancelled') { $payments = $paymentlib->get_canceled($params['offset'], $params['max'], $params['user'], $filter, $params['sort']); } elseif ($params['type'] === 'overdue') { $payments = $paymentlib->get_overdue($params['offset'], $params['max'], $params['user'], $filter, $params['sort']); } elseif ($params['type'] === 'authorized') { $payments = $paymentlib->get_authorized($params['offset'], $params['max'], $params['user'], $filter, $params['sort']); } else { Feedback::error(tr('Plugin paymentlist: Unrecognised type "%0"'), $params['type']); } if ($params['format'] === 'total') { $totals = []; foreach ($payments['data'] as $payment) { $totals[$payment['currency']] += $payment['amount']; } if (count($totals) > 0) { // multiple currencies? foreach ($totals as $currency => $amount) { $output .= "$amount $currency, "; } $output = trim($output, ', '); } else { $output = tra('No payments found'); } } elseif ($params['format'] === 'table') { if ($payments['data']) { $payments['offset'] = $params['offset']; $payments['offset_arg'] = $offset_arg; $payments['max'] = $params['max']; $smarty = TikiLib::lib('smarty'); $smarty->assign('payments', $payments); $output = $smarty->fetch($template); } else { $output = tra('No payments found'); } } elseif ($params['format'] === 'json') { $output = json_encode($payments['data']); } return $output; }