dolibarr  19.0.0-dev
propal.php
Go to the documentation of this file.
1 <?php
2 /* Copyright (C) 2004-2007 Rodolphe Quiedeville <rodolphe@quiedeville.org>
3  * Copyright (C) 2004-2009 Laurent Destailleur <eldy@users.sourceforge.net>
4  * Copyright (C) 2005-2012 Regis Houssin <regis.houssin@inodbox.com>
5  * Copyright (C) 2014 Florian Henry <florian.henry@open-concept.pro>
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 3 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program. If not, see <https://www.gnu.org/licenses/>.
19  */
20 
27 // Load Dolibarr environment
28 require '../../main.inc.php';
29 require_once DOL_DOCUMENT_ROOT.'/core/lib/product.lib.php';
30 require_once DOL_DOCUMENT_ROOT.'/comm/propal/class/propal.class.php';
31 require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php';
32 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php';
33 
34 // Load translation files required by the page
35 $langs->loadLangs(array('products', 'companies'));
36 
37 $id = GETPOST('id', 'int');
38 $ref = GETPOST('ref', 'alpha');
39 
40 // Security check
41 $fieldvalue = (!empty($id) ? $id : (!empty($ref) ? $ref : ''));
42 $fieldtype = (!empty($ref) ? 'ref' : 'rowid');
43 $socid = '';
44 if (!empty($user->socid)) {
45  $socid = $user->socid;
46 }
47 $result = restrictedArea($user, 'produit|service', $fieldvalue, 'product&product', '', '', $fieldtype);
48 
49 // Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context
50 $hookmanager->initHooks(array('productstatspropal'));
51 
52 // Load variable for pagination
53 $limit = GETPOST('limit', 'int') ?GETPOST('limit', 'int') : $conf->liste_limit;
54 $sortfield = GETPOST('sortfield', 'aZ09comma');
55 $sortorder = GETPOST('sortorder', 'aZ09comma');
56 $page = GETPOSTISSET('pageplusone') ? (GETPOST('pageplusone') - 1) : GETPOST("page", 'int');
57 if (empty($page) || $page == -1) {
58  $page = 0;
59 } // If $page is not defined, or '' or -1
60 $offset = $limit * $page;
61 $pageprev = $page - 1;
62 $pagenext = $page + 1;
63 if (!$sortorder) {
64  $sortorder = "DESC";
65 }
66 if (!$sortfield) {
67  $sortfield = "p.datep";
68 }
69 
70 $search_month = GETPOST('search_month', 'int');
71 $search_year = GETPOST('search_year', 'int');
72 
73 if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter', 'alpha')) {
74  $search_month = '';
75  $search_year = '';
76 }
77 
78 $result = restrictedArea($user, 'produit|service', $fieldvalue, 'product&product', '', '', $fieldtype);
79 
80 
81 /*
82  * View
83  */
84 
85 $propalstatic = new Propal($db);
86 $societestatic = new Societe($db);
87 
88 $form = new Form($db);
89 $formother = new FormOther($db);
90 
91 if ($id > 0 || !empty($ref)) {
92  $product = new Product($db);
93  $result = $product->fetch($id, $ref);
94 
95  $object = $product;
96 
97  $parameters = array('id' => $id);
98  $reshook = $hookmanager->executeHooks('doActions', $parameters, $product, $action); // Note that $action and $object may have been modified by some hooks
99  if ($reshook < 0) {
100  setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
101  }
102 
103  llxHeader("", "", $langs->trans("CardProduct".$product->type));
104 
105  if ($result > 0) {
106  $head = product_prepare_head($product);
107  $titre = $langs->trans("CardProduct".$product->type);
108  $picto = ($product->type == Product::TYPE_SERVICE ? 'service' : 'product');
109  print dol_get_fiche_head($head, 'referers', $titre, -1, $picto);
110 
111  $reshook = $hookmanager->executeHooks('formObjectOptions', $parameters, $product, $action); // Note that $action and $object may have been modified by hook
112  print $hookmanager->resPrint;
113  if ($reshook < 0) {
114  setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
115  }
116 
117  $linkback = '<a href="'.DOL_URL_ROOT.'/product/list.php?restore_lastsearch_values=1">'.$langs->trans("BackToList").'</a>';
118 
119  $shownav = 1;
120  if ($user->socid && !in_array('product', explode(',', $conf->global->MAIN_MODULES_FOR_EXTERNAL))) {
121  $shownav = 0;
122  }
123 
124  dol_banner_tab($object, 'ref', $linkback, $shownav, 'ref');
125 
126  print '<div class="fichecenter">';
127 
128  print '<div class="underbanner clearboth"></div>';
129  print '<table class="border tableforfield" width="100%">';
130 
131  $nboflines = show_stats_for_company($product, $socid);
132 
133  print "</table>";
134 
135  print '</div>';
136  print '<div class="clearboth"></div>';
137 
138  print dol_get_fiche_end();
139 
140 
141  if ($user->hasRight('propal', 'lire')) {
142  $sql = "SELECT DISTINCT s.nom as name, s.rowid as socid, p.rowid as propalid, p.ref, d.total_ht as amount,";
143  $sql .= " p.ref_client,";
144  $sql .= "p.datep, p.fk_statut as statut, d.rowid, d.qty";
145  if (empty($user->rights->societe->client->voir) && !$socid) {
146  $sql .= ", sc.fk_soc, sc.fk_user ";
147  }
148  $sql .= " FROM ".MAIN_DB_PREFIX."societe as s";
149  $sql .= ",".MAIN_DB_PREFIX."propal as p";
150  $sql .= ", ".MAIN_DB_PREFIX."propaldet as d";
151  if (empty($user->rights->societe->client->voir) && !$socid) {
152  $sql .= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc";
153  }
154  $sql .= " WHERE p.fk_soc = s.rowid";
155  $sql .= " AND p.entity IN (".getEntity('propal').")";
156  $sql .= " AND d.fk_propal = p.rowid";
157  $sql .= " AND d.fk_product = ".((int) $product->id);
158  if (!empty($search_month)) {
159  $sql .= ' AND MONTH(p.datep) IN ('.$db->sanitize($search_month).')';
160  }
161  if (!empty($search_year)) {
162  $sql .= ' AND YEAR(p.datep) IN ('.$db->sanitize($search_year).')';
163  }
164  if (empty($user->rights->societe->client->voir) && !$socid) {
165  $sql .= " AND s.rowid = sc.fk_soc AND sc.fk_user = ".((int) $user->id);
166  }
167  if ($socid) {
168  $sql .= " AND p.fk_soc = ".((int) $socid);
169  }
170  $sql .= $db->order($sortfield, $sortorder);
171 
172  // Calcul total qty and amount for global if full scan list
173  $total_ht = 0;
174  $total_qty = 0;
175 
176  // Count total nb of records
177  $totalofrecords = '';
178  if (!getDolGlobalInt('MAIN_DISABLE_FULL_SCANLIST')) {
179  $result = $db->query($sql);
180  $totalofrecords = $db->num_rows($result);
181  }
182 
183  $sql .= $db->plimit($limit + 1, $offset);
184 
185  $result = $db->query($sql);
186  if ($result) {
187  $num = $db->num_rows($result);
188 
189  $option = '&id='.$product->id;
190 
191  if ($limit > 0 && $limit != $conf->liste_limit) {
192  $option .= '&limit='.((int) $limit);
193  }
194  if (!empty($search_month)) {
195  $option .= '&search_month='.urlencode($search_month);
196  }
197  if (!empty($search_year)) {
198  $option .= '&search_year='.urlencode($search_year);
199  }
200 
201  print '<form method="post" action="'.$_SERVER['PHP_SELF'].'?id='.$product->id.'" name="search_form">'."\n";
202  print '<input type="hidden" name="token" value="'.newToken().'">';
203  if (!empty($sortfield)) {
204  print '<input type="hidden" name="sortfield" value="'.$sortfield.'"/>';
205  }
206  if (!empty($sortorder)) {
207  print '<input type="hidden" name="sortorder" value="'.$sortorder.'"/>';
208  }
209 
210  print_barre_liste($langs->trans("Proposals"), $page, $_SERVER["PHP_SELF"], $option, $sortfield, $sortorder, '', $num, $totalofrecords, '', 0, '', '', $limit, 0, 0, 1);
211 
212  if (!empty($page)) {
213  $option .= '&page='.urlencode($page);
214  }
215 
216  print '<div class="liste_titre liste_titre_bydiv centpercent">';
217  print '<div class="divsearchfield">';
218  print $langs->trans('Period').' ('.$langs->trans("DatePropal").') - ';
219  print $langs->trans('Month').':<input class="flat" type="text" size="4" name="search_month" value="'.$search_month.'"> ';
220  print $langs->trans('Year').':'.$formother->selectyear($search_year ? $search_year : - 1, 'search_year', 1, 20, 5);
221  print '<div style="vertical-align: middle; display: inline-block">';
222  print '<input type="image" class="liste_titre" name="button_search" src="'.img_picto($langs->trans("Search"), 'search.png', '', '', 1).'" value="'.dol_escape_htmltag($langs->trans("Search")).'" title="'.dol_escape_htmltag($langs->trans("Search")).'">';
223  print '<input type="image" class="liste_titre" name="button_removefilter" src="'.img_picto($langs->trans("Search"), 'searchclear.png', '', '', 1).'" value="'.dol_escape_htmltag($langs->trans("RemoveFilter")).'" title="'.dol_escape_htmltag($langs->trans("RemoveFilter")).'">';
224  print '</div>';
225  print '</div>';
226  print '</div>';
227 
228  $i = 0;
229  print '<div class="div-table-responsive">';
230  print '<table class="tagtable liste listwithfilterbefore" width="100%">';
231  print '<tr class="liste_titre">';
232  print_liste_field_titre("Ref", $_SERVER["PHP_SELF"], "p.rowid", "", $option, '', $sortfield, $sortorder);
233  print_liste_field_titre("Company", $_SERVER["PHP_SELF"], "s.nom", "", $option, '', $sortfield, $sortorder);
234  print_liste_field_titre("DatePropal", $_SERVER["PHP_SELF"], "p.datep", "", $option, 'align="center"', $sortfield, $sortorder);
235  print_liste_field_titre("Qty", $_SERVER["PHP_SELF"], "d.qty", "", $option, 'align="center"', $sortfield, $sortorder);
236  print_liste_field_titre("AmountHT", $_SERVER["PHP_SELF"], "d.total_ht", "", $option, 'align="right"', $sortfield, $sortorder);
237  print_liste_field_titre("Status", $_SERVER["PHP_SELF"], "p.fk_statut", "", $option, 'align="right"', $sortfield, $sortorder);
238  print "</tr>\n";
239 
240  if ($num > 0) {
241  while ($i < min($num, $limit)) {
242  $objp = $db->fetch_object($result);
243 
244  $total_ht += $objp->amount;
245  $total_qty += $objp->qty;
246 
247  $propalstatic->id = $objp->propalid;
248  $propalstatic->ref = $objp->ref;
249  $propalstatic->ref_client = $objp->ref_client;
250  $societestatic->fetch($objp->socid);
251 
252  print '<tr class="oddeven">';
253  print '<td>';
254  print $propalstatic->getNomUrl(1);
255  print "</td>\n";
256  print '<td>'.$societestatic->getNomUrl(1).'</td>';
257  print '<td class="center">';
258  print dol_print_date($db->jdate($objp->datep), 'dayhour')."</td>";
259  print "<td align=\"center\">".$objp->qty."</td>\n";
260  print '<td align="right">'.price($objp->amount).'</td>'."\n";
261  print '<td align="right">'.$propalstatic->LibStatut($objp->statut, 5).'</td>';
262  print "</tr>\n";
263  $i++;
264  }
265  }
266 
267  print '<tr class="liste_total">';
268  if ($num < $limit) {
269  print '<td class="left">'.$langs->trans("Total").'</td>';
270  } else {
271  print '<td class="left">'.$langs->trans("Totalforthispage").'</td>';
272  }
273  print '<td colspan="2"></td>';
274  print '<td class="center">'.$total_qty.'</td>';
275  print '<td align="right">'.price($total_ht).'</td>';
276  print '<td></td>';
277  print "</table>";
278  print '</div>';
279  print '</form>';
280  } else {
281  dol_print_error($db);
282  }
283  $db->free($result);
284  }
285  }
286 } else {
287  dol_print_error();
288 }
289 
290 // End of page
291 llxFooter();
292 $db->close();
if(!defined('NOREQUIRESOC')) if(!defined('NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined('NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined('NOREQUIREAJAX')) llxHeader()
Empty header.
Definition: wrapper.php:56
llxFooter()
Empty footer.
Definition: wrapper.php:70
Class to manage generation of HTML components Only common components must be here.
Classe permettant la generation de composants html autre Only common components are here.
Class to manage products or services.
const TYPE_SERVICE
Service.
Class to manage proposals.
Class to manage third parties objects (customers, suppliers, prospects...)
if(isModEnabled('facture') && $user->hasRight('facture', 'lire')) if((isModEnabled('fournisseur') &&empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD) && $user->hasRight("fournisseur", "facture", "lire"))||(isModEnabled('supplier_invoice') && $user->hasRight("supplier_invoice", "lire"))) if(isModEnabled('don') && $user->hasRight('don', 'lire')) if(isModEnabled('tax') &&!empty($user->rights->tax->charges->lire)) if(isModEnabled('facture') &&isModEnabled('commande') && $user->hasRight("commande", "lire") &&empty($conf->global->WORKFLOW_DISABLE_CREATE_INVOICE_FROM_ORDER)) $sql
Social contributions to pay.
Definition: index.php:746
if($cancel &&! $id) if($action=='add' &&! $cancel) if($action=='delete') if($id) $form
Actions.
Definition: card.php:143
dol_banner_tab($object, $paramid, $morehtml='', $shownav=1, $fieldid='rowid', $fieldref='ref', $morehtmlref='', $moreparam='', $nodbprefix=0, $morehtmlleft='', $morehtmlstatus='', $onlybanner=0, $morehtmlright='')
Show tab footer of a card.
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0)
Show tabs of a record.
dol_print_error($db='', $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
dol_get_fiche_end($notab=0)
Return tab footer of a card.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs='', $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
getDolGlobalInt($key, $default=0)
Return dolibarr global constant int value.
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.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0)
Set event messages in dol_events session object.
print_barre_liste($titre, $page, $file, $options='', $sortfield='', $sortorder='', $morehtmlcenter='', $num=-1, $totalnboflines='', $picto='generic', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limit=-1, $hideselectlimit=0, $hidenavigation=0, $pagenavastextinput=0, $morehtmlrightbeforearrow='')
Print a title with navigation controls for pagination.
GETPOSTISSET($paramname)
Return true if we are in a context of submitting the parameter $paramname from a POST of a form.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
product_prepare_head($object)
Prepare array with list of tabs.
Definition: product.lib.php:36
show_stats_for_company($product, $socid)
Show stats for company.
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.