31require_once DOL_DOCUMENT_ROOT .
'/societe/class/societe.class.php';
32require_once DOL_DOCUMENT_ROOT .
'/core/lib/date.lib.php';
68 "name" =>
"get_thirdparty_transactions",
69 "description" =>
"Generate a list of raw transactions (Invoices, Orders) for a specific thirdparty.",
73 "thirdparty_id" => [
"type" =>
"integer",
"description" =>
"The unique ID of the thirdparty."],
74 "thirdparty_name" => [
"type" =>
"string",
"description" =>
"The name of the thirdparty."],
75 "date_start" => [
"type" =>
"string",
"description" =>
"Start date (YYYY-MM-DD)."],
76 "date_end" => [
"type" =>
"string",
"description" =>
"End date (YYYY-MM-DD)."],
77 "transaction_type" => [
79 "enum" => [
"all",
"invoices",
"orders",
"proposals"],
80 "description" =>
"Filter by type.",
85 [
"required" => [
"thirdparty_id"]],
86 [
"required" => [
"thirdparty_name"]]
91 "name" =>
"get_sales_report",
92 "description" =>
"Generate a sales/revenue report. If a Thirdparty is provided, it returns a detailed breakdown for that customer. Otherwise, it returns a global summary.",
98 "description" =>
"Optional: The ID of the customer."
100 "date_start" => [
"type" =>
"string",
"description" =>
"Start date (YYYY-MM-DD)."],
101 "date_end" => [
"type" =>
"string",
"description" =>
"End date (YYYY-MM-DD)."],
104 "enum" => [
"thirdparty",
"product",
"month"],
105 "description" =>
"Only used if no Thirdparty is specified. Groups global results.",
106 "default" =>
"thirdparty"
109 "required" => [
"date_start",
"date_end"]
113 "name" =>
"get_purchase_report",
114 "description" =>
"Generate a purchase/expense report. If a Supplier is provided, it returns a detailed breakdown. Otherwise, it returns a global summary.",
120 "description" =>
"Optional: The ID of the supplier."
122 "date_start" => [
"type" =>
"string",
"description" =>
"Start date (YYYY-MM-DD)."],
123 "date_end" => [
"type" =>
"string",
"description" =>
"End date (YYYY-MM-DD)."],
126 "enum" => [
"supplier",
"product",
"month"],
127 "description" =>
"Only used if no Supplier is specified. Groups global results.",
128 "default" =>
"supplier"
131 "required" => [
"date_start",
"date_end"]
135 "name" =>
"get_inventory_report",
136 "description" =>
"Generate an inventory report showing current stock levels and valuation.",
140 "category_id" => [
"type" =>
"integer",
"description" =>
"Filter by category ID."],
141 "warehouse_id" => [
"type" =>
"integer",
"description" =>
"Filter by warehouse ID."],
142 "include_zero_stock" => [
"type" =>
"boolean",
"default" =>
false]
147 "name" =>
"get_financial_report",
148 "description" =>
"Generate a summary financial report (Income vs Expense) for a period.",
152 "date_start" => [
"type" =>
"string",
"description" =>
"Start date (YYYY-MM-DD)."],
153 "date_end" => [
"type" =>
"string",
"description" =>
"End date (YYYY-MM-DD)."]
155 "required" => [
"date_start",
"date_end"]
169 return [
'reporting',
'commercial',
'billing',
'stock'];
179 public function execute(
string $name, array $args)
182 case 'get_thirdparty_transactions':
184 case 'get_sales_report':
186 case 'get_purchase_report':
188 case 'get_inventory_report':
190 case 'get_financial_report':
193 return [
"error" =>
"Tool function '$name' not found."];
211 if (!empty($args[
'thirdparty_id'])) {
212 return (
int) $args[
'thirdparty_id'];
215 if (!empty($args[
'thirdparty_name'])) {
216 $sqlName = $this->db->escape($args[
'thirdparty_name']);
218 $sql =
"SELECT rowid FROM " . MAIN_DB_PREFIX .
"societe
219 WHERE nom LIKE '%" . $sqlName .
"%'
220 AND entity IN (" .
getEntity(
'societe') .
")
223 $resql = $this->db->query($sql);
224 if ($resql && $obj = $this->db->fetch_object($resql)) {
242 $langs->loadLangs(array(
"main",
"bills",
"companies",
"products"));
244 $limit = isset($args[
'limit']) ? (int) $args[
'limit'] : 50;
248 $groupBy = isset($args[
'group_by']) ? (
string) $args[
'group_by'] :
'thirdparty';
253 $dateRange =
" AND f.datef >= '" . $this->db->idate($dateStart)
254 .
"' AND f.datef <= '" . $this->db->idate($dateEnd)
255 .
"' AND f.fk_statut IN (1, 2)";
259 $sql =
"SELECT f.rowid, f.ref, f.total_ttc, f.fk_statut, f.paye, f.datef, s.nom FROM "
260 . MAIN_DB_PREFIX .
"facture as f LEFT JOIN "
261 . MAIN_DB_PREFIX .
"societe as s ON f.fk_soc = s.rowid WHERE f.entity IN ("
264 .
" AND f.fk_soc = " . (int) $socid
265 .
" ORDER BY f.datef DESC LIMIT " . ((
int) $limit);
267 $resql = $this->db->query($sql);
269 while ($r = $this->db->fetch_object($resql)) {
270 $totalSum += (float) $r->total_ttc;
272 $statusLabel = $langs->transnoentitiesnoconv(
"Unknown");
273 if ($r->fk_statut == 1 && $r->paye == 0) {
274 $statusLabel = $langs->transnoentitiesnoconv(
"BillStatusNotPaid");
275 } elseif ($r->fk_statut == 1 && $r->paye == 1) {
276 $statusLabel = $langs->transnoentitiesnoconv(
"BillStatusStarted");
277 } elseif ($r->fk_statut == 2) {
278 $statusLabel = $langs->transnoentitiesnoconv(
"BillStatusPaid");
281 $url = DOL_URL_ROOT .
"/compta/facture/card.php?id=" . $r->rowid;
282 $refHtml =
'<a href="' . $url .
'">' . $r->ref .
'</a>';
285 $langs->transnoentitiesnoconv(
"Ref") => $refHtml,
286 $langs->transnoentitiesnoconv(
"Date") =>
dol_print_date($this->db->jdate($r->datef),
'day'),
287 $langs->transnoentitiesnoconv(
"Customer") => $r->nom,
288 $langs->transnoentitiesnoconv(
"Amount") =>
price($r->total_ttc),
289 $langs->transnoentitiesnoconv(
"Status") => $statusLabel
292 $this->db->free($resql);
298 $sanitizedSqlGroup =
'';
300 $sqlJoin =
" LEFT JOIN " . MAIN_DB_PREFIX .
"societe as s ON f.fk_soc = s.rowid";
302 if ($groupBy ===
'month') {
303 $sanitizedSqlGroup =
"DATE_FORMAT(f.datef, '%Y-%m')";
304 $colName = $langs->transnoentitiesnoconv(
"Month");
305 } elseif ($groupBy ===
'product') {
307 $sanitizedSqlGroup =
"COALESCE(p.ref, fd.description, '?')";
308 $colName = $langs->transnoentitiesnoconv(
"Product");
309 $sqlJoin .=
" INNER JOIN " . MAIN_DB_PREFIX .
"facturedet as fd ON fd.fk_facture = f.rowid LEFT JOIN "
310 . MAIN_DB_PREFIX .
"product as p ON fd.fk_product = p.rowid";
313 $sanitizedSqlGroup =
"s.nom";
314 $colName = $langs->transnoentitiesnoconv(
"Customer");
319 $amountExpr = ($groupBy ===
'product') ?
"SUM(fd.total_ttc)" :
"SUM(f.total_ttc)";
320 $countExpr = ($groupBy ===
'product') ?
"COUNT(DISTINCT f.rowid)" :
"COUNT(f.rowid)";
322 $sql =
"SELECT " . $sanitizedSqlGroup .
" as group_key, "
323 . $amountExpr .
" as total_amount, "
324 . $countExpr .
" as count_inv FROM "
325 . MAIN_DB_PREFIX .
"facture as f"
327 .
" WHERE f.entity IN (" .
getEntity(
'facture') .
")"
329 .
" GROUP BY group_key ORDER BY total_amount DESC LIMIT "
330 . ((int) max(1, $limit));
332 $resql = $this->db->query($sql);
334 while ($r = $this->db->fetch_object($resql)) {
335 $totalSum += (float) $r->total_amount;
337 $colName => $r->group_key ? $r->group_key : $langs->transnoentitiesnoconv(
'Unknown'),
338 $langs->transnoentitiesnoconv(
"Number") => (int) $r->count_inv,
339 $langs->transnoentitiesnoconv(
"Amount") =>
price($r->total_amount)
342 $this->db->free($resql);
347 return [[$langs->transnoentitiesnoconv(
"Info") => $langs->transnoentitiesnoconv(
"NoRecordFound")]];
353 $langs->transnoentitiesnoconv(
"Ref") => $langs->transnoentitiesnoconv(
"Total"),
354 $langs->transnoentitiesnoconv(
"Date") =>
"",
355 $langs->transnoentitiesnoconv(
"Customer") =>
"",
356 $langs->transnoentitiesnoconv(
"Amount") =>
price($totalSum),
357 $langs->transnoentitiesnoconv(
"Status") =>
""
361 $langs->transnoentitiesnoconv(
"Total") => $langs->transnoentitiesnoconv(
"Total"),
362 $langs->transnoentitiesnoconv(
"Amount") =>
price($totalSum)
379 $langs->loadLangs(array(
"main",
"bills",
"orders",
"propal"));
383 $type = isset($args[
'transaction_type']) ? (
string) $args[
'transaction_type'] :
'all';
387 $langs->load(
"errors");
388 return [[$langs->transnoentitiesnoconv(
"Error") => $langs->transnoentitiesnoconv(
"ErrorThirdPartyNotFound")]];
394 if ($type ==
'all' || $type ==
'invoices') {
395 $sqlQueries[] =
"SELECT 'Invoice' as source_type, rowid, ref, total_ttc as amount, datef as date_entry, fk_statut
396 FROM " . MAIN_DB_PREFIX .
"facture
397 WHERE fk_soc = " . (int) $socid .
" AND entity IN (" .
getEntity(
'facture') .
")
398 AND fk_statut IN (1, 2)";
402 if ($type ==
'all' || $type ==
'orders') {
403 $sqlQueries[] =
"SELECT 'Order' as source_type, rowid, ref, total_ttc as amount, date_commande as date_entry, fk_statut
404 FROM " . MAIN_DB_PREFIX .
"commande
405 WHERE fk_soc = " . (int) $socid .
" AND entity IN (" .
getEntity(
'commande') .
")
410 if ($type ==
'all' || $type ==
'proposals') {
411 $sqlQueries[] =
"SELECT 'Proposal' as source_type, rowid, ref, total_ttc as amount, datep as date_entry, fk_statut
412 FROM " . MAIN_DB_PREFIX .
"propal
413 WHERE fk_soc = " . (int) $socid .
" AND entity IN (" .
getEntity(
'propal') .
")
417 if (empty($sqlQueries)) {
418 return [[$langs->transnoentitiesnoconv(
"Error") =>
"Invalid transaction type"]];
421 $sql =
"SELECT * FROM (";
422 $sql .= implode(
" UNION ", $sqlQueries);
423 $sql .=
") as combined_transactions ";
425 if ($dateStart > 0) {
426 $whereParts[] =
"date_entry >= '" . $this->db->idate($dateStart) .
"'";
429 $whereParts[] =
"date_entry <= '" . $this->db->idate($dateEnd) .
"'";
432 if (!empty($whereParts)) {
433 $sql .=
" WHERE " . implode(
" AND ", $whereParts);
436 $sql .=
" ORDER BY date_entry DESC";
438 $resql = $this->db->query($sql);
443 while ($r = $this->db->fetch_object($resql)) {
444 $totalAmt += (float) $r->amount;
449 if ($r->source_type ===
'Invoice') {
450 $urlPath =
"/compta/facture/card.php?id=" . $r->rowid;
451 if ($r->fk_statut == 2) {
452 $statusTxt = $langs->transnoentitiesnoconv(
"BillStatusPaid");
453 } elseif ($r->fk_statut == 1) {
454 $statusTxt = $langs->transnoentitiesnoconv(
"BillStatusNotPaid");
456 } elseif ($r->source_type ===
'Order') {
457 $urlPath =
"/commande/card.php?id=" . $r->rowid;
458 if ($r->fk_statut == 1) {
459 $statusTxt = $langs->transnoentitiesnoconv(
"StatusOrderValidated");
460 } elseif ($r->fk_statut == 2) {
461 $statusTxt = $langs->transnoentitiesnoconv(
"StatusOrderOnProcess");
462 } elseif ($r->fk_statut == 3) {
463 $statusTxt = $langs->transnoentitiesnoconv(
"StatusOrderDelivered");
465 } elseif ($r->source_type ===
'Proposal') {
466 $urlPath =
"/comm/propal/card.php?id=" . $r->rowid;
467 if ($r->fk_statut == 1) {
468 $statusTxt = $langs->transnoentitiesnoconv(
"PropalStatusValidated");
469 } elseif ($r->fk_statut == 2) {
470 $statusTxt = $langs->transnoentitiesnoconv(
"PropalStatusSigned");
471 } elseif ($r->fk_statut == 3) {
472 $statusTxt = $langs->transnoentitiesnoconv(
"PropalStatusNotSigned");
473 } elseif ($r->fk_statut == 4) {
474 $statusTxt = $langs->transnoentitiesnoconv(
"PropalStatusBilled");
478 $fullUrl = $urlPath ? DOL_URL_ROOT . $urlPath :
"";
479 $refHtml = $fullUrl ?
'<a href="' . $fullUrl .
'">' . $r->ref .
'</a>' : $r->ref;
482 $langs->transnoentitiesnoconv(
"Type") => $langs->transnoentitiesnoconv($r->source_type),
483 $langs->transnoentitiesnoconv(
"Ref") => $refHtml,
484 $langs->transnoentitiesnoconv(
"Date") =>
dol_print_date($this->db->jdate($r->date_entry),
'day'),
485 $langs->transnoentitiesnoconv(
"Amount") =>
price($r->amount),
486 $langs->transnoentitiesnoconv(
"Status") => $statusTxt
489 $this->db->free($resql);
493 return [[$langs->transnoentitiesnoconv(
"Info") => $langs->transnoentitiesnoconv(
"NoRecordFound")]];
498 $langs->transnoentitiesnoconv(
"Type") => $langs->transnoentitiesnoconv(
"Total"),
499 $langs->transnoentitiesnoconv(
"Ref") =>
"",
500 $langs->transnoentitiesnoconv(
"Date") =>
"",
501 $langs->transnoentitiesnoconv(
"Amount") =>
price($totalAmt),
502 $langs->transnoentitiesnoconv(
"Status") =>
""
518 $langs->loadLangs(array(
"main",
"bills",
"companies"));
521 $groupBy = isset($args[
'group_by']) ? (
string) $args[
'group_by'] :
'supplier';
529 $sql =
"SELECT f.rowid, f.ref, f.total_ttc, f.datef, s.nom
530 FROM " . MAIN_DB_PREFIX .
"facture_fourn as f
531 LEFT JOIN " . MAIN_DB_PREFIX .
"societe as s ON f.fk_soc = s.rowid
532 WHERE f.entity IN (" .
getEntity(
'facture_fourn') .
")
533 AND f.fk_soc = " . (int) $socid .
"
534 AND f.datef >= '" . $this->db->idate($dateStart) .
"'
535 AND f.datef <= '" . $this->db->idate($dateEnd) .
"'
537 ORDER BY f.datef DESC";
539 $resql = $this->db->query($sql);
541 while ($r = $this->db->fetch_object($resql)) {
542 $totalSum += (float) $r->total_ttc;
544 $url = DOL_URL_ROOT .
"/fourn/facture/card.php?id=" . $r->rowid;
545 $refHtml =
'<a href="' . $url .
'">' . $r->ref .
'</a>';
548 $langs->transnoentitiesnoconv(
"Ref") => $refHtml,
549 $langs->transnoentitiesnoconv(
"Date") =>
dol_print_date($this->db->jdate($r->datef),
'day'),
550 $langs->transnoentitiesnoconv(
"Supplier") => $r->nom,
551 $langs->transnoentitiesnoconv(
"Amount") =>
price($r->total_ttc)
554 $this->db->free($resql);
557 $sanitizedSqlGroup =
"";
560 if ($groupBy ===
'month') {
561 $sanitizedSqlGroup =
"DATE_FORMAT(f.datef, '%Y-%m')";
562 $colName = $langs->transnoentitiesnoconv(
"Month");
564 $sanitizedSqlGroup =
"s.nom";
565 $colName = $langs->transnoentitiesnoconv(
"Supplier");
568 $sql =
"SELECT " . $sanitizedSqlGroup .
" as group_key, SUM(f.total_ttc) as total_amount, COUNT(f.rowid) as count_inv
569 FROM " . MAIN_DB_PREFIX .
"facture_fourn as f
570 LEFT JOIN " . MAIN_DB_PREFIX .
"societe as s ON f.fk_soc = s.rowid
571 WHERE f.entity IN (" .
getEntity(
'facture_fourn') .
")
572 AND f.datef >= '" . $this->db->idate($dateStart) .
"'
573 AND f.datef <= '" . $this->db->idate($dateEnd) .
"'
576 ORDER BY total_amount DESC";
578 $resql = $this->db->query($sql);
580 while ($r = $this->db->fetch_object($resql)) {
581 $totalSum += (float) $r->total_amount;
583 $colName => $r->group_key ? $r->group_key : $langs->transnoentitiesnoconv(
'Unknown'),
584 $langs->transnoentitiesnoconv(
"Number") => $r->count_inv,
585 $langs->transnoentitiesnoconv(
"Amount") =>
price($r->total_amount)
588 $this->db->free($resql);
593 return [[$langs->transnoentitiesnoconv(
"Info") => $langs->transnoentitiesnoconv(
"NoRecordFound")]];
598 $langs->transnoentitiesnoconv(
"Amount") =>
price($totalSum)
602 $summary[$langs->transnoentitiesnoconv(
"Ref")] = $langs->transnoentitiesnoconv(
"Total");
603 $summary[$langs->transnoentitiesnoconv(
"Date")] =
"";
604 $summary[$langs->transnoentitiesnoconv(
"Supplier")] =
"";
606 $summary[($groupBy ===
'month' ? $langs->transnoentitiesnoconv(
"Month") : $langs->transnoentitiesnoconv(
"Supplier"))] = $langs->transnoentitiesnoconv(
"Total");
607 $summary[$langs->transnoentitiesnoconv(
"Number")] =
"";
624 $langs->loadLangs(array(
"products",
"stocks"));
626 $catId = isset($args[
'category_id']) ? (int) $args[
'category_id'] : 0;
627 $warehouseId = isset($args[
'warehouse_id']) ? (int) $args[
'warehouse_id'] : 0;
628 $includeZero = isset($args[
'include_zero_stock']) ? (bool) $args[
'include_zero_stock'] :
false;
630 $sql =
"SELECT p.rowid, p.ref, p.label, p.pmp, ";
632 if ($warehouseId > 0) {
633 $sql .=
" ps.reel as stock_level ";
634 $sql .=
" FROM " . MAIN_DB_PREFIX .
"product as p ";
635 $sql .=
" LEFT JOIN " . MAIN_DB_PREFIX .
"product_stock as ps ON p.rowid = ps.fk_product ";
636 $sql .=
" WHERE ps.fk_entrepot = " . (int) $warehouseId;
638 $sql .=
" p.stock as stock_level ";
639 $sql .=
" FROM " . MAIN_DB_PREFIX .
"product as p ";
640 $sql .=
" WHERE 1=1 ";
643 $sql .=
" AND p.entity IN (" .
getEntity(
'product') .
")";
646 $sql .=
" AND p.rowid IN (SELECT fk_product FROM " . MAIN_DB_PREFIX .
"categorie_product WHERE fk_categorie = " . (int) $catId .
")";
650 if ($warehouseId > 0) {
651 $sql .=
" AND ps.reel > 0";
653 $sql .=
" AND p.stock > 0";
657 $sql .=
" ORDER BY p.ref ASC LIMIT 200";
659 $resql = $this->db->query($sql);
661 $totalValuation = 0.0;
665 while ($r = $this->db->fetch_object($resql)) {
666 $stockVal = $r->stock_level * $r->pmp;
667 $totalValuation += $stockVal;
668 $totalItems += (int) $r->stock_level;
670 $url = DOL_URL_ROOT .
"/product/card.php?id=" . $r->rowid;
671 $refHtml =
'<a href="' . $url .
'">' . $r->ref .
'</a>';
674 $langs->transnoentitiesnoconv(
"Ref") => $refHtml,
675 $langs->transnoentitiesnoconv(
"Label") => $r->label,
676 $langs->transnoentitiesnoconv(
"Stock") => $r->stock_level,
677 $langs->transnoentitiesnoconv(
"PMPValue") =>
price($r->pmp),
678 $langs->transnoentitiesnoconv(
"TotalValue") =>
price($stockVal)
681 $this->db->free($resql);
685 return [[$langs->transnoentitiesnoconv(
"Info") => $langs->transnoentitiesnoconv(
"NoRecordFound")]];
689 $langs->transnoentitiesnoconv(
"Ref") => $langs->transnoentitiesnoconv(
"Total"),
690 $langs->transnoentitiesnoconv(
"Label") =>
"",
691 $langs->transnoentitiesnoconv(
"Stock") => $totalItems,
692 $langs->transnoentitiesnoconv(
"PMPValue") =>
"",
693 $langs->transnoentitiesnoconv(
"TotalValue") =>
price($totalValuation)
709 $langs->loadLangs(array(
"compta",
"bills"));
714 $sqlIncome =
"SELECT SUM(total_ttc) as total FROM " . MAIN_DB_PREFIX .
"facture
715 WHERE entity IN (" .
getEntity(
'facture') .
")
716 AND datef >= '" . $this->db->idate($dateStart) .
"'
717 AND datef <= '" . $this->db->idate($dateEnd) .
"'
718 AND fk_statut IN (1, 2)";
720 $resIncome = $this->db->query($sqlIncome);
721 $objIncome = $this->db->fetch_object($resIncome);
722 $income = $objIncome && $objIncome->total ? (float) $objIncome->total : 0.0;
725 $sqlExpense =
"SELECT SUM(total_ttc) as total FROM " . MAIN_DB_PREFIX .
"facture_fourn
726 WHERE entity IN (" .
getEntity(
'facture_fourn') .
")
727 AND datef >= '" . $this->db->idate($dateStart) .
"'
728 AND datef <= '" . $this->db->idate($dateEnd) .
"'
731 $resExpense = $this->db->query($sqlExpense);
732 $objExpense = $this->db->fetch_object($resExpense);
733 $expense = $objExpense && $objExpense->total ? (float) $objExpense->total : 0.0;
735 $net = $income - $expense;
739 $langs->transnoentitiesnoconv(
"Category") => $langs->transnoentitiesnoconv(
"Income"),
740 $langs->transnoentitiesnoconv(
"Description") => $langs->transnoentitiesnoconv(
"BillsCustomers"),
741 $langs->transnoentitiesnoconv(
"Amount") =>
price($income)
744 $langs->transnoentitiesnoconv(
"Category") => $langs->transnoentitiesnoconv(
"Expenses"),
745 $langs->transnoentitiesnoconv(
"Description") => $langs->transnoentitiesnoconv(
"BillsSuppliers"),
746 $langs->transnoentitiesnoconv(
"Amount") =>
price($expense)
749 $langs->transnoentitiesnoconv(
"Category") => $langs->transnoentitiesnoconv(
"Total"),
750 $langs->transnoentitiesnoconv(
"Description") => $langs->transnoentitiesnoconv(
"Profit"),
751 $langs->transnoentitiesnoconv(
"Amount") =>
price($net)
Class to manage Dolibarr database access.
dol_stringtotime($string, $gm=1)
Convert a string date into a GM Timestamps date Warning: YYYY-MM-DDTHH:MM:SS+02:00 (RFC3339) is not s...
price($amount, $form=0, $outlangs='', $trunc=1, $rounding=-1, $forcerounding=-1, $currency_code='')
Function to format a value into an amount for visual output Function used into PDF and HTML pages.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false, $decorate=0)
Output date in a string format according to outputlangs (or langs if not defined).
getEntity($element, $shared=1, $currentobject=null)
Get list of entity id to use.
conf($dolibarr_main_document_root, $realpathconf=null)
Load conf file (file must exists)
print $langs trans("Show") . '< td style="' . $timeColor . '" align="center"> s</td > badge status0 badge status4 badge status3 Error badge status8< td align="center">< span class="badge ' . $badge . '"></span ></td >< td align="center">< a href="#" class="button button-small" onclick="openLogModal(this)" data-req="' . dol_escape_htmltag($reqSafe) . '" data-res="' . dol_escape_htmltag($resSafe) . '" data-err="' . dol_escape_htmltag($errSafe) . '">< span class="fa fa-search-plus"></span ></a ></td ></tr >< tr >< td colspan="' . $colspan . '" class="opacitymedium"></td ></tr ></table ></div ></form > logModal none logModal none s a JSON string
buildzip.php
$conf db user
Active Directory does not allow anonymous connections.