dolibarr 21.0.0-beta
charge.php
1<?php
2/* Copyright (C) 2018-2022 Thibault FOUCART <support@ptibogxiv.net>
3 * Copyright (C) 2019-2024 Frédéric France <frederic.france@free.fr>
4 * Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 3 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <https://www.gnu.org/licenses/>.
18 */
19
20// Put here all includes required by your class file
21
22// Load Dolibarr environment
23require '../main.inc.php';
24require_once DOL_DOCUMENT_ROOT.'/societe/class/societe.class.php';
25require_once DOL_DOCUMENT_ROOT.'/adherents/class/adherent.class.php';
26require_once DOL_DOCUMENT_ROOT.'/stripe/class/stripe.class.php';
27//require_once DOL_DOCUMENT_ROOT.'/core/lib/stripe.lib.php';
28require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php';
29require_once DOL_DOCUMENT_ROOT.'/commande/class/commande.class.php';
30require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php';
31if (isModEnabled('accounting')) {
32 require_once DOL_DOCUMENT_ROOT.'/accountancy/class/accountingjournal.class.php';
33}
34
43// Load translation files required by the page
44$langs->loadLangs(array('compta', 'salaries', 'bills', 'hrm', 'stripe'));
45
46// Security check
47$socid = GETPOSTINT("socid");
48if ($user->socid) {
49 $socid = $user->socid;
50}
51//$result = restrictedArea($user, 'salaries', '', '', '');
52
53$limit = GETPOSTINT('limit') ? GETPOSTINT('limit') : $conf->liste_limit;
54$rowid = GETPOST("rowid", 'alpha');
55$sortfield = GETPOST('sortfield', 'aZ09comma');
56$sortorder = GETPOST('sortorder', 'aZ09comma');
57$page = GETPOSTISSET('pageplusone') ? (GETPOSTINT('pageplusone') - 1) : GETPOSTINT("page");
58if (empty($page) || $page == -1) {
59 $page = 0;
60} // If $page is not defined, or '' or -1
61$offset = $limit * $page;
62$pageprev = $page - 1;
63$pagenext = $page + 1;
64
65$result = restrictedArea($user, 'banque');
66$optioncss = GETPOST('optioncss', 'alpha');
67
68/*
69 * View
70 */
71
72$form = new Form($db);
73$societestatic = new Societe($db);
74$memberstatic = new Adherent($db);
75$acc = new Account($db);
76$stripe = new Stripe($db);
77
78llxHeader('', $langs->trans("StripeChargeList"));
79
80if (isModEnabled('stripe') && (!getDolGlobalString('STRIPE_LIVE') || GETPOST('forcesandbox', 'alpha'))) {
81 $service = 'StripeTest';
82 $servicestatus = '0';
83 dol_htmloutput_mesg($langs->trans('YouAreCurrentlyInSandboxMode', 'Stripe'), [], 'warning');
84} else {
85 $service = 'StripeLive';
86 $servicestatus = '1';
87}
88
89$stripeacc = $stripe->getStripeAccount($service);
90/*if (empty($stripeaccount))
91{
92 print $langs->trans('ErrorStripeAccountNotDefined');
93}*/
94
95if (!$rowid) {
96 $option = array('limit' => $limit + 1);
97 $num = 0;
98
99 $param = '';
100 $totalnboflines = '';
101 $moreforfilter = '';
102 $list = null;
103 if (GETPOSTISSET('starting_after_'.$page)) {
104 $option['starting_after'] = GETPOST('starting_after_'.$page, 'alphanohtml');
105 }
106 print '<form method="POST" action="'.$_SERVER["PHP_SELF"].'">';
107 if ($optioncss != '') {
108 print '<input type="hidden" name="optioncss" value="'.$optioncss.'">';
109 }
110
111 print '<input type="hidden" name="token" value="'.newToken().'">';
112 print '<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
113 print '<input type="hidden" name="action" value="list">';
114 print '<input type="hidden" name="sortfield" value="'.$sortfield.'">';
115 print '<input type="hidden" name="sortorder" value="'.$sortorder.'">';
116 print '<input type="hidden" name="page" value="'.$page.'">';
117
118 $title = $langs->trans("StripeChargeList");
119 $title .= ($stripeacc ? ' (Stripe connection with Stripe OAuth Connect account '.$stripeacc.')' : ' (Stripe connection with keys from Stripe module setup)');
120
121 print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, '', $num, $totalnboflines, 'title_accountancy.png', 0, '', 'hidepaginationprevious', $limit);
122
123 print '<div class="div-table-responsive">';
124 print '<table class="tagtable liste'.($moreforfilter ? " listwithfilterbefore" : "").'">'."\n";
125
126 print '<tr class="liste_titre">';
127 print_liste_field_titre("StripePaymentId", $_SERVER["PHP_SELF"], "", "", "", "", $sortfield, $sortorder);
128 print_liste_field_titre("StripeCustomerId", $_SERVER["PHP_SELF"], "", "", "", "", $sortfield, $sortorder);
129 print_liste_field_titre("Customer", $_SERVER["PHP_SELF"], "", "", "", "", $sortfield, $sortorder);
130 print_liste_field_titre("Origin", $_SERVER["PHP_SELF"], "", "", "", "", $sortfield, $sortorder);
131 print_liste_field_titre("DatePayment", $_SERVER["PHP_SELF"], "", "", "", '', $sortfield, $sortorder, 'center ');
132 print_liste_field_titre("Type", $_SERVER["PHP_SELF"], "", "", "", '', $sortfield, $sortorder, 'left ');
133 print_liste_field_titre("Paid", $_SERVER["PHP_SELF"], "", "", "", '', $sortfield, $sortorder, 'right ');
134 print_liste_field_titre("Status", $_SERVER["PHP_SELF"], "", "", "", '', '', '', 'right ');
135 print "</tr>\n";
136
137 try {
138 if ($stripeacc) {
139 $list = \Stripe\Charge::all($option, array("stripe_account" => $stripeacc));
140 } else {
141 $list = \Stripe\Charge::all($option);
142 }
143
144 '@phan-var-force \Stripe\Charge $list'; // TStripeObject suggested, but is a template
145 $num = count($list->data);
146
147
148 //if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) $param .= '&contextpage='.urlencode($contextpage);
149 if ($limit > 0 && $limit != $conf->liste_limit) {
150 $param .= '&limit='.((int) $limit);
151 }
152 $param .= '&starting_after_'.($page + 1).'='.$list->data[($limit - 1)]->id;
153 //$param.='&ending_before_'.($page+1).'='.$list->data[($limit-1)]->id;
154 } catch (Exception $e) {
155 print '<tr><td colspan="8">'.$e->getMessage().'</td></td>';
156 }
157
158 //print $list;
159 $i = 0;
160 if (!empty($list)) {
161 foreach ($list->data as $charge) {
162 '@phan-var-force \Stripe\Charge $charge'; // TStripeObject suggested, but is a template
163 if ($i >= $limit) {
164 break;
165 }
166
167 if ($charge->refunded == '1') {
168 $status = img_picto($langs->trans("refunded"), 'statut6');
169 } elseif ($charge->paid == '1') {
170 $status = img_picto($langs->trans((string) $charge->status), 'statut4');
171 } else {
172 $label = $langs->trans("Message").": ".$charge->failure_message."<br>";
173 $label .= $langs->trans("Network").": ".$charge->outcome->network_status."<br>";
174 $label .= $langs->trans("Status").": ".$langs->trans((string) $charge->outcome->seller_message);
175 $status = $form->textwithpicto(img_picto($langs->trans((string) $charge->status), 'statut8'), $label, -1);
176 }
177
178 if (isset($charge->payment_method_details->type) && $charge->payment_method_details->type == 'card') {
179 $type = $langs->trans("card");
180 } elseif (isset($charge->source->type) && $charge->source->type == 'card') {
181 $type = $langs->trans("card");
182 } elseif (isset($charge->payment_method_details->type) && $charge->payment_method_details->type == 'three_d_secure') {
183 $type = $langs->trans("card3DS");
184 } elseif (isset($charge->payment_method_details->type) && $charge->payment_method_details->type == 'sepa_debit') {
185 $type = $langs->trans("sepadebit");
186 } elseif (isset($charge->payment_method_details->type) && $charge->payment_method_details->type == 'ideal') {
187 $type = $langs->trans("iDEAL");
188 }
189
190 // Why this ?
191 /*if (!empty($charge->payment_intent)) {
192 if (empty($stripeacc)) { // If the Stripe connect account not set, we use common API usage
193 $charge = \Stripe\PaymentIntent::retrieve($charge->payment_intent);
194 } else {
195 $charge = \Stripe\PaymentIntent::retrieve($charge->payment_intent, array("stripe_account" => $stripeacc));
196 }
197 }*/
198
199 // The metadata FULLTAG is defined by the online payment page
200 $FULLTAG = $charge->metadata->FULLTAG;
201
202 // Save into $tmparray all metadata
203 $tmparray = dolExplodeIntoArray($FULLTAG, '.', '=');
204 // Load origin object according to metadata
205 if (!empty($tmparray['CUS']) && $tmparray['CUS'] > 0) {
206 $societestatic->fetch($tmparray['CUS']);
207 } elseif (!empty($charge->metadata->dol_thirdparty_id) && $charge->metadata->dol_thirdparty_id > 0) {
208 $societestatic->fetch($charge->metadata->dol_thirdparty_id);
209 } else {
210 $societestatic->id = 0;
211 }
212 if (!empty($tmparray['MEM']) && $tmparray['MEM'] > 0) {
213 $memberstatic->fetch($tmparray['MEM']);
214 } else {
215 $memberstatic->id = 0;
216 }
217
218 print '<tr class="oddeven">';
219
220 if (!empty($stripeacc)) {
221 $connect = $stripeacc.'/';
222 } else {
223 $connect = '';
224 }
225
226 // Ref
227 $url = 'https://dashboard.stripe.com/'.$connect.'test/payments/'.$charge->id;
228 if ($servicestatus) {
229 $url = 'https://dashboard.stripe.com/'.$connect.'payments/'.$charge->id;
230 }
231 print "<td>";
232 print "<a href='".$url."' target='_stripe'>".img_picto($langs->trans('ShowInStripe'), 'globe')." ".$charge->id."</a>";
233 if ($charge->payment_intent) {
234 print '<br><span class="opacitymedium">'.$charge->payment_intent.'</span>';
235 }
236 print "</td>\n";
237
238 // Stripe customer
239 print "<td>";
240 if (isModEnabled('stripe') && !empty($stripeacc)) {
241 $connect = $stripeacc.'/';
242 }
243 $url = 'https://dashboard.stripe.com/'.$connect.'test/customers/'.$charge->customer;
244 if ($servicestatus) {
245 $url = 'https://dashboard.stripe.com/'.$connect.'customers/'.$charge->customer;
246 }
247 if (!empty($charge->customer)) {
248 print '<a href="'.$url.'" target="_stripe">'.img_picto($langs->trans('ShowInStripe'), 'globe').' '.$charge->customer.'</a>';
249 }
250 print "</td>\n";
251
252 // Link
253 print "<td>";
254 if ($societestatic->id > 0) {
255 print $societestatic->getNomUrl(1);
256 } elseif ($memberstatic->id > 0) {
257 print $memberstatic->getNomUrl(1);
258 }
259 print "</td>\n";
260
261 // Origin
262 print "<td>";
263 if ($charge->metadata->dol_type == "order" || $charge->metadata->dol_type == "commande") {
264 $object = new Commande($db);
265 $object->fetch($charge->metadata->dol_id);
266 if ($object->id > 0) {
267 print "<a href='".DOL_URL_ROOT."/commande/card.php?id=".$object->id."'>".img_picto('', 'order')." ".$object->ref."</a>";
268 } else {
269 print $FULLTAG;
270 }
271 } elseif ($charge->metadata->dol_type == "invoice" || $charge->metadata->dol_type == "facture") {
272 $object = new Facture($db);
273 $object->fetch($charge->metadata->dol_id);
274 if ($object->id > 0) {
275 print "<a href='".DOL_URL_ROOT."/compta/facture/card.php?facid=".$charge->metadata->dol_id."'>".img_picto('', 'bill')." ".$object->ref."</a>";
276 } else {
277 print $FULLTAG;
278 }
279 } else {
280 print $FULLTAG;
281 }
282 print "</td>\n";
283
284 // Date payment
285 print '<td class="center">'.dol_print_date($charge->created, 'dayhour')."</td>\n";
286 // Type
287 print '<td>';
288 print $type;
289 print '</td>';
290 // Amount
291 print '<td class="right"><span class="amount">'.price(($charge->amount - $charge->amount_refunded) / 100, 0, '', 1, - 1, - 1, strtoupper($charge->currency))."</span></td>";
292 // Status
293 print '<td class="right">';
294 print $status;
295 print "</td>\n";
296
297 print "</tr>\n";
298
299 $i++;
300 }
301 }
302
303 print '</table>';
304 print '</div>';
305 print '</form>';
306}
307
308// End of page
309llxFooter();
310$db->close();
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
Definition card.php:66
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader($head='', $title='', $help_url='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='', $morecssonbody='', $replacemainareaby='', $disablenofollow=0, $disablenoindex=0)
Empty header.
Definition wrapper.php:71
Class to manage bank accounts.
Class to manage members of a foundation.
Class to manage customers orders.
Class to manage invoices.
Class to manage generation of HTML components Only common components must be here.
Class to manage third parties objects (customers, suppliers, prospects...)
Stripe class @TODO No reason to extends CommonObject.
llxFooter()
Footer empty.
Definition document.php:107
dolExplodeIntoArray($string, $delimiter=';', $kv='=')
Split a string with 2 keys into key array.
print_barre_liste($title, $page, $file, $options='', $sortfield='', $sortorder='', $morehtmlcenter='', $num=-1, $totalnboflines='', $picto='generic', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limit=-1, $selectlimitsuffix=0, $hidenavigation=0, $pagenavastextinput=0, $morehtmlrightbeforearrow='')
Print a title with navigation controls for pagination.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
print_liste_field_titre($name, $file="", $field="", $begin="", $moreparam="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $tooltip="", $forcenowrapcolumntitle=0)
Show title line of an array.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
dol_htmloutput_mesg($mesgstring='', $mesgarray=array(), $style='ok', $keepembedded=0)
Print formatted messages to output (Used to show messages on html output).
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
global $conf
The following vars must be defined: $type2label $form $conf, $lang, The following vars may also be de...
Definition member.php:79
restrictedArea(User $user, $features, $object=0, $tableandshare='', $feature2='', $dbt_keyfield='fk_soc', $dbt_select='rowid', $isdraft=0, $mode=0)
Check permissions of a user to show a page and an object.