dolibarr/htdocs/core/boxes/box_services_contracts.php

238 lines
9.1 KiB
PHP
Raw Permalink Normal View History

<?php
/* Copyright (C) 2003 Rodolphe Quiedeville <rodolphe@quiedeville.org>
2017-06-22 09:04:29 +00:00
* Copyright (C) 2005-2017 Laurent Destailleur <eldy@users.sourceforge.net>
2018-10-27 12:43:12 +00:00
* Copyright (C) 2005-2011 Regis Houssin <regis.houssin@inodbox.com>
* Copyright (C) 2017 Nicolas Zabouri <info@inovea-conseil.com>
* Copyright (C) 2024-2026 MDW <mdeweerd@users.noreply.github.com>
2003-08-29 20:44:42 +00:00
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
2003-08-29 20:44:42 +00:00
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
2019-09-23 19:55:30 +00:00
* along with this program. If not, see <https://www.gnu.org/licenses/>.
2003-08-29 20:44:42 +00:00
*/
2005-01-31 12:21:44 +00:00
/**
* \file htdocs/core/boxes/box_services_contracts.php
* \ingroup product,services
2017-06-22 09:04:29 +00:00
* \brief Widget of sells products
2008-11-16 23:43:10 +00:00
*/
2005-01-31 12:21:44 +00:00
include_once DOL_DOCUMENT_ROOT.'/core/boxes/modules_boxes.php';
2003-08-29 20:44:42 +00:00
2012-01-26 12:49:15 +00:00
/**
2017-07-31 11:48:00 +00:00
* Class to manage the box to show last contracted products/services lines
2012-01-26 12:49:15 +00:00
*/
2012-02-20 08:42:57 +00:00
class box_services_contracts extends ModeleBoxes
{
public $boxcode = "lastproductsincontract";
public $boximg = "object_product";
public $boxlabel = "BoxLastProductsInContract";
2025-12-16 15:05:27 +00:00
public $depends = array("service", "contract");
2005-02-27 17:57:21 +00:00
2017-06-12 12:09:00 +00:00
/**
* Constructor
*
* @param DoliDB $db Database handler
* @param string $param More parameters
*/
public function __construct($db, $param) // @phpstan-ignore constructor.unusedParameter
2017-06-12 12:09:00 +00:00
{
global $user;
2017-06-12 12:09:00 +00:00
$this->db = $db;
2017-06-12 12:09:00 +00:00
2023-06-19 21:05:59 +00:00
$this->hidden = !($user->hasRight('service', 'lire') && $user->hasRight('contrat', 'lire'));
$this->urltoaddentry = DOL_URL_ROOT.'/contrat/card.php?action=create';
$this->msgNoRecords = 'NoContractedProducts';
2017-06-12 12:09:00 +00:00
}
2008-11-16 23:43:10 +00:00
/**
2011-11-23 17:28:14 +00:00
* Load data into info_box_contents array to show array later.
*
* @param int $max Maximum number of records to load
* @return void
2008-11-16 23:43:10 +00:00
*/
2019-02-27 23:15:32 +00:00
public function loadBox($max = 5)
2008-11-16 23:43:10 +00:00
{
2019-09-23 16:39:21 +00:00
global $user, $langs, $conf;
$this->max = $max;
include_once DOL_DOCUMENT_ROOT.'/contrat/class/contrat.class.php';
2019-09-23 16:39:21 +00:00
$form = new Form($this->db);
2017-07-31 11:48:00 +00:00
2024-06-08 17:34:54 +00:00
$this->info_box_head = array(
'text' => $langs->trans("BoxLastProductsInContract", $max).'<a class="paddingleft valignmiddle" href="'.DOL_URL_ROOT.'/contrat/list.php?sortfield=c.tms&sortorder=DESC"><span class="badge">...</span></a>'
);
2023-10-11 17:32:04 +00:00
if ($user->hasRight('service', 'lire') && $user->hasRight('contrat', 'lire')) {
$contractstatic = new Contrat($this->db);
$contractlinestatic = new ContratLigne($this->db);
$thirdpartytmp = new Societe($this->db);
$productstatic = new Product($this->db);
2016-06-27 11:57:10 +00:00
2018-10-21 10:03:22 +00:00
$sql = "SELECT s.nom as name, s.rowid as socid, s.email, s.client, s.fournisseur, s.code_client, s.code_fournisseur, s.code_compta, s.code_compta_fournisseur,";
$sql .= " c.rowid, c.ref, c.statut as contract_status, c.ref_customer, c.ref_supplier,";
$sql .= " cd.rowid as cdid, cd.label, cd.description, cd.tms as datem, cd.statut as contractline_status, cd.product_type as type, cd.date_fin_validite as date_line,";
2021-03-16 16:47:24 +00:00
$sql .= " p.rowid as product_id, p.ref as product_ref, p.label as product_label, p.fk_product_type as product_type, p.entity as product_entity, p.tobuy, p.tosell";
$sql .= " FROM (".MAIN_DB_PREFIX."societe as s";
$sql .= " INNER JOIN ".MAIN_DB_PREFIX."contrat as c ON s.rowid = c.fk_soc";
$sql .= " INNER JOIN ".MAIN_DB_PREFIX."contratdet as cd ON c.rowid = cd.fk_contrat";
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."product as p ON cd.fk_product = p.rowid";
2025-01-13 10:58:16 +00:00
if (empty($user->socid) && !$user->hasRight('societe', 'client', 'voir')) {
$sql .= " INNER JOIN ".MAIN_DB_PREFIX."societe_commerciaux as sc ON s.rowid = sc.fk_soc AND sc.fk_user = ".((int) $user->id);
2021-02-23 21:03:23 +00:00
}
$sql .= ")";
$sql .= " WHERE c.entity = ".((int) $conf->entity);
2021-02-23 21:03:23 +00:00
if ($user->socid) {
$sql .= " AND s.rowid = ".((int) $user->socid);
2021-02-23 21:03:23 +00:00
}
$sql .= $this->db->order("c.tms", "DESC");
$sql .= $this->db->plimit($max, 0);
2008-11-16 23:43:10 +00:00
2019-09-23 16:39:21 +00:00
$result = $this->db->query($sql);
2021-02-23 21:03:23 +00:00
if ($result) {
2019-09-23 16:39:21 +00:00
$num = $this->db->num_rows($result);
$now = dol_now();
2008-11-16 23:43:10 +00:00
$i = 0;
2021-02-23 21:03:23 +00:00
while ($i < $num) {
$late = '';
2019-09-23 16:39:21 +00:00
$objp = $this->db->fetch_object($result);
$datem = $this->db->jdate($objp->datem);
$contractlinestatic->id = $objp->cdid;
$contractlinestatic->fk_contrat = $objp->rowid;
$contractlinestatic->label = $objp->label;
$contractlinestatic->description = $objp->description;
$contractlinestatic->type = $objp->type;
$contractlinestatic->fk_product = $objp->product_id;
$contractlinestatic->product_ref = $objp->product_ref;
2020-10-19 15:10:38 +00:00
$contractlinestatic->product_type = $objp->product_type;
$contractlinestatic->statut = $objp->contractline_status;
$contractstatic->id = $objp->rowid;
$contractstatic->ref = $objp->ref;
$contractstatic->ref_customer = $objp->ref_customer;
$contractstatic->ref_supplier = $objp->ref_supplier;
$contractstatic->statut = $objp->contract_status;
2024-06-08 17:34:54 +00:00
$contractstatic->status = $objp->contract_status;
2016-06-27 11:57:10 +00:00
$thirdpartytmp->name = $objp->name;
$thirdpartytmp->id = $objp->socid;
2018-10-21 10:03:22 +00:00
$thirdpartytmp->email = $objp->email;
$thirdpartytmp->client = $objp->client;
$thirdpartytmp->fournisseur = $objp->fournisseur;
$thirdpartytmp->code_client = $objp->code_client;
$thirdpartytmp->code_fournisseur = $objp->code_fournisseur;
$thirdpartytmp->code_compta = $objp->code_compta;
2024-06-08 17:34:54 +00:00
$thirdpartytmp->code_compta_client = $objp->code_compta;
2018-10-21 10:03:22 +00:00
$thirdpartytmp->code_compta_fournisseur = $objp->code_compta_fournisseur;
2016-06-27 11:57:10 +00:00
$dateline = $this->db->jdate($objp->date_line);
if ($contractstatic->status == Contrat::STATUS_VALIDATED && $objp->contractline_status == ContratLigne::STATUS_OPEN && !empty($dateline) && ($dateline + getWarningDelay('contract', 'services', 'expires')) < $now) {
2021-02-23 21:03:23 +00:00
$late = img_warning($langs->trans("Late"));
}
2008-11-16 23:43:10 +00:00
2017-07-31 11:48:00 +00:00
// Label
2021-02-23 21:03:23 +00:00
if ($objp->product_id > 0) {
$productstatic->id = $objp->product_id;
$productstatic->type = $objp->product_type;
$productstatic->ref = $objp->product_ref;
2021-03-16 16:47:24 +00:00
$productstatic->entity = $objp->product_entity;
$productstatic->label = $objp->product_label;
2020-02-24 05:55:08 +00:00
$productstatic->status = $objp->tosell;
$productstatic->status_buy = $objp->tobuy;
$text = $productstatic->getNomUrl(1, '', 20);
2021-02-23 21:03:23 +00:00
if ($objp->product_label) {
2017-07-31 11:48:00 +00:00
$text .= ' - ';
//$productstatic->ref=$objp->label;
//$text .= $productstatic->getNomUrl(0,'',16);
2020-10-15 18:28:27 +00:00
$text .= $objp->product_label;
2017-07-31 11:48:00 +00:00
}
$description = $objp->description;
$s = $form->textwithtooltip($text, $description, 3, 0, '', '', 0, '');
2020-05-21 13:05:19 +00:00
} else {
2017-07-31 11:48:00 +00:00
$s = img_object($langs->trans("ShowProductOrService"), ($objp->product_type ? 'service' : 'product')).' '.dol_htmlentitiesbr($objp->description);
}
2019-02-09 14:24:21 +00:00
$this->info_box_contents[$i][] = array(
'td' => 'class="tdoverflowmax150 maxwidth150onsmartphone"',
'text' => $s,
'asis' => 1
);
2016-06-27 11:57:10 +00:00
2019-02-09 14:24:21 +00:00
$this->info_box_contents[$i][] = array(
'td' => 'class="nowraponall"',
'text' => $contractstatic->getNomUrl(1),
'asis' => 1
);
2019-02-09 14:24:21 +00:00
$this->info_box_contents[$i][] = array(
'td' => 'class="tdoverflowmax150 maxwidth150onsmartphone"',
'text' => $thirdpartytmp->getNomUrl(1),
'asis' => 1
);
2019-02-09 14:24:21 +00:00
$this->info_box_contents[$i][] = array(
2022-06-28 10:26:49 +00:00
'td' => 'class="center nowraponall" title="'.dol_escape_htmltag($langs->trans("DateModification").': '.dol_print_date($datem, 'dayhour', 'tzuserrel')).'"',
2021-05-24 22:29:32 +00:00
'text' => dol_print_date($datem, 'day', 'tzuserrel'),
'text2' => $late,
);
2019-02-09 14:24:21 +00:00
$this->info_box_contents[$i][] = array(
'td' => 'class="right" width="18"',
'text' => $contractlinestatic->getLibStatut(3)
2008-11-16 23:43:10 +00:00
);
2008-11-16 23:43:10 +00:00
$i++;
}
2013-06-07 22:52:02 +00:00
2019-09-23 16:39:21 +00:00
$this->db->free($result);
2020-05-21 13:05:19 +00:00
} else {
2019-02-09 14:24:21 +00:00
$this->info_box_contents[0][0] = array(
'td' => '',
'maxlength' => 500,
'text' => ($this->db->error().' sql='.$sql),
);
2008-11-16 23:43:10 +00:00
}
2020-05-21 13:05:19 +00:00
} else {
$this->info_box_contents[0][0] = array(
2023-12-05 14:21:26 +00:00
'td' => 'class="nohover left"',
'text' => '<span class="opacitymedium">'.$langs->trans("ReadPermissionNotAllowed").'</span>'
);
2008-11-16 23:43:10 +00:00
}
}
2011-11-23 17:28:14 +00:00
/**
* Method to show box. Called when the box needs to be displayed.
2011-11-23 17:28:14 +00:00
*
* @param ?array<array{text?:string,sublink?:string,subtext?:string,subpicto?:?string,picto?:string,nbcol?:int,limit?:int,subclass?:string,graph?:int<0,1>,target?:string}> $head Array with properties of box title
* @param ?array<array{tr?:string,td?:string,target?:string,text?:string,text2?:string,textnoformat?:string,tooltip?:string,logo?:string,url?:string,maxlength?:int,asis?:int<0,1>}> $contents Array with properties of box lines
* @param int<0,1> $nooutput No print, only return string
2017-06-12 12:09:00 +00:00
* @return string
2011-11-23 17:28:14 +00:00
*/
public function showBox($head = null, $contents = null, $nooutput = 0)
{
return parent::showBox($this->info_box_head, $this->info_box_contents, $nooutput);
}
2003-08-29 20:44:42 +00:00
}