diff --git a/htdocs/comm/propal/list.php b/htdocs/comm/propal/list.php
index 040e78b7f1a..aa6df1afb2b 100644
--- a/htdocs/comm/propal/list.php
+++ b/htdocs/comm/propal/list.php
@@ -178,7 +178,7 @@ if ($reshook < 0) setEventMessages($hookmanager->error, $hookmanager->errors, 'e
include DOL_DOCUMENT_ROOT.'/core/actions_changeselectedfields.inc.php';
// Do we click on purge search criteria ?
-if (GETPOST("button_removefilter_x") || GETPOST("button_removefilter.x") || GETPOST("button_removefilter")) // Both test are required to be compatible with all browsers
+if (GETPOST("button_removefilter_x") || GETPOST("button_removefilter.x") || GETPOST("button_removefilter")) // All tests are required to be compatible with all browsers
{
$search_categ='';
$search_user='';
@@ -363,7 +363,7 @@ if ($resql)
$arrayofselected=is_array($toselect)?$toselect:array();
- $param='&socid='.$socid.'&viewstatut='.$viewstatut;
+ $param='&viewstatut='.$viewstatut;
if (! empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) $param.='&contextpage='.$contextpage;
if ($limit > 0 && $limit != $conf->liste_limit) $param.='&limit='.$limit;
if ($sall) $param.='&sall='.$sall;
@@ -377,6 +377,7 @@ if ($resql)
if ($search_montant_ht) $param.='&search_montant_ht='.$search_montant_ht;
if ($search_login) $param.='&search_login='.$search_login;
if ($search_town) $param.='&search_town='.$search_town;
+ if ($socid > 0) $param.='&socid='.$socid;
if ($optioncss != '') $param.='&optioncss='.$optioncss;
// Add $param from extra fields
foreach ($search_array_options as $key => $val)
@@ -436,8 +437,8 @@ if ($resql)
dol_fiche_head(null, '', '');
- $topicmail="SendProposalRef";
- $modelmail="propal_send";
+ $topicmail="SendSupplierProposalRef";
+ $modelmail="supplier_proposal_send";
// Cree l'objet formulaire mail
include_once DOL_DOCUMENT_ROOT.'/core/class/html.formmail.class.php';
diff --git a/htdocs/compta/index.php b/htdocs/compta/index.php
index 0d0552b41ad..add2a4cfcb1 100644
--- a/htdocs/compta/index.php
+++ b/htdocs/compta/index.php
@@ -509,10 +509,11 @@ if (! empty($conf->don->enabled) && $user->rights->societe->lire)
$i = 0;
print '
';
- print '| '.$langs->trans("BoxTitleLastModifiedDonations",$max).' | ';
- print ''.$langs->trans("AmountTTC").' | ';
- print ''.$langs->trans("DateModificationShort").' | ';
- print ' | ';
+ print '
';
+ print '| '.$langs->trans("BoxTitleLastModifiedDonations",$max).' | ';
+ print ''.$langs->trans("AmountTTC").' | ';
+ print ''.$langs->trans("DateModificationShort").' | ';
+ print ' | ';
print '
';
if ($num)
{
diff --git a/htdocs/supplier_proposal/list.php b/htdocs/supplier_proposal/list.php
index 401eef99a35..caf79597e53 100644
--- a/htdocs/supplier_proposal/list.php
+++ b/htdocs/supplier_proposal/list.php
@@ -35,7 +35,9 @@ require '../main.inc.php';
require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php';
require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
+require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
require_once DOL_DOCUMENT_ROOT.'/core/class/html.formpropal.class.php';
+require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php';
require_once DOL_DOCUMENT_ROOT.'/supplier_proposal/class/supplier_proposal.class.php';
if (! empty($conf->projet->enabled))
require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php';
@@ -49,6 +51,12 @@ $langs->load('products');
$socid=GETPOST('socid','int');
+$action=GETPOST('action','alpha');
+$massaction=GETPOST('massaction','alpha');
+$show_files=GETPOST('show_files','int');
+$confirm=GETPOST('confirm','alpha');
+$toselect = GETPOST('toselect', 'array');
+
$search_user=GETPOST('search_user','int');
$search_sale=GETPOST('search_sale','int');
$search_ref=GETPOST('sf_ref')?GETPOST('sf_ref','alpha'):GETPOST('search_ref','alpha');
@@ -65,9 +73,25 @@ $month=GETPOST("month");
$yearvalid=GETPOST("yearvalid");
$monthvalid=GETPOST("monthvalid");
+$limit = GETPOST('limit')?GETPOST('limit','int'):$conf->liste_limit;
+$sortfield = GETPOST("sortfield",'alpha');
+$sortorder = GETPOST("sortorder",'alpha');
+$page = GETPOST("page",'int');
+if ($page == -1) { $page = 0; }
+$offset = $limit * $page;
+$pageprev = $page - 1;
+$pagenext = $page + 1;
+if (! $sortfield) $sortfield='sp.date_livraison';
+if (! $sortorder) $sortorder='DESC';
+
+if ($object_statut != '') $search_status=$object_statut;
+
// Nombre de ligne pour choix de produit/service predefinis
$NBLINES=4;
+// Initialize technical object to manage hooks of thirdparties. Note that conf->hooks_modules contains array array
+$contextpage='supplierproposallist';
+
// Security check
$module='supplier_proposal';
$dbtable='';
@@ -81,24 +105,10 @@ if (! empty($socid))
}
$result = restrictedArea($user, $module, $objectid, $dbtable);
-$limit = GETPOST('limit')?GETPOST('limit','int'):$conf->liste_limit;
-$sortfield = GETPOST("sortfield",'alpha');
-$sortorder = GETPOST("sortorder",'alpha');
-$page = GETPOST("page",'int');
-if ($page == -1) { $page = 0; }
-$offset = $limit * $page;
-$pageprev = $page - 1;
-$pagenext = $page + 1;
-if (! $sortfield) $sortfield='sp.date_livraison';
-if (! $sortorder) $sortorder='DESC';
-
-if ($object_statut != '') $search_status=$object_statut;
+$diroutputmassaction=$conf->supplier_proposal->dir_output . '/temp/massgeneration/'.$user->id;
// Initialize technical object to manage hooks of thirdparties. Note that conf->hooks_modules contains array array
-$contextpage='supplierproposallist';
-
-// Initialize technical object to manage hooks of thirdparties. Note that conf->hooks_modules contains array array
-$hookmanager->initHooks(array('supplierproposallist'));
+$hookmanager->initHooks(array('supplier_proposallist'));
$extrafields = new ExtraFields($db);
// fetch optionals attributes and labels
@@ -115,11 +125,35 @@ $fieldstosearchall = array(
'p.note_public'=>'NotePublic',
);
+// TODO Use field of supplier proposal
+$arrayfields=array(
+ 'p.ref'=>array('label'=>$langs->trans("Ref"), 'checked'=>1),
+ 's.nom'=>array('label'=>$langs->trans("Supplier"), 'checked'=>1),
+ 's.town'=>array('label'=>$langs->trans("Town"), 'checked'=>1),
+ 's.zip'=>array('label'=>$langs->trans("Zip"), 'checked'=>1),
+ 'state.nom'=>array('label'=>$langs->trans("StateShort"), 'checked'=>0),
+ 'country.code_iso'=>array('label'=>$langs->trans("Country"), 'checked'=>0),
+ 'typent.code'=>array('label'=>$langs->trans("ThirdPartyType"), 'checked'=>$checkedtypetiers),
+ 'p.date'=>array('label'=>$langs->trans("Date"), 'checked'=>1),
+ 'p.fin_validite'=>array('label'=>$langs->trans("DateEnd"), 'checked'=>1),
+ 'p.total_ht'=>array('label'=>$langs->trans("AmountHT"), 'checked'=>1),
+ 'p.total_vat'=>array('label'=>$langs->trans("AmountVAT"), 'checked'=>0),
+ 'p.total_ttc'=>array('label'=>$langs->trans("AmountTTC"), 'checked'=>0),
+ 'u.login'=>array('label'=>$langs->trans("Author"), 'checked'=>1, 'position'=>10),
+ 'p.datec'=>array('label'=>$langs->trans("DateCreation"), 'checked'=>0, 'position'=>500),
+ 'p.tms'=>array('label'=>$langs->trans("DateModificationShort"), 'checked'=>0, 'position'=>500),
+ 'p.fk_statut'=>array('label'=>$langs->trans("Status"), 'checked'=>1, 'position'=>1000),
+);
+// Extra fields
+if (is_array($extrafields->attribute_label) && count($extrafields->attribute_label))
+{
+ foreach($extrafields->attribute_label as $key => $val)
+ {
+ $arrayfields["ef.".$key]=array('label'=>$extrafields->attribute_label[$key], 'checked'=>$extrafields->attribute_list[$key], 'position'=>$extrafields->attribute_pos[$key], 'enabled'=>$extrafields->attribute_perms[$key]);
+ }
+}
-// Initialize technical object to manage hooks of thirdparties. Note that conf->hooks_modules contains array array
-$hookmanager->initHooks(array('supplier_proposallist'));
-
/*
@@ -127,15 +161,15 @@ $hookmanager->initHooks(array('supplier_proposallist'));
*/
if (GETPOST('cancel')) { $action='list'; $massaction=''; }
-if (! GETPOST('confirmmassaction')) { $massaction=''; }
+if (! GETPOST('confirmmassaction') && $massaction != 'presend' && $massaction != 'confirm_presend') { $massaction=''; }
-$parameters=array();
+$parameters=array('socid'=>$socid);
$reshook=$hookmanager->executeHooks('doActions',$parameters,$object,$action); // Note that $action and $object may have been modified by some hooks
if ($reshook < 0) setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
include DOL_DOCUMENT_ROOT.'/core/actions_changeselectedfields.inc.php';
-if (GETPOST("button_removefilter_x") || GETPOST("button_removefilter.x") ||GETPOST("button_removefilter")) // All test are required to be compatible with all browsers
+if (GETPOST("button_removefilter_x") || GETPOST("button_removefilter.x") ||GETPOST("button_removefilter")) // All tests are required to be compatible with all browsers
{
$search_categ='';
$search_user='';
@@ -158,37 +192,12 @@ if ($reshook < 0) setEventMessages($hookmanager->error, $hookmanager->errors, 'e
if (empty($reshook))
{
- // Mass actions. Controls on number of lines checked
- $maxformassaction=1000;
- if (! empty($massaction) && count($toselect) < 1)
- {
- $error++;
- setEventMessages($langs->trans("NoLineChecked"), null, "warnings");
- }
- if (! $error && count($toselect) > $maxformassaction)
- {
- setEventMessages($langs->trans('TooManyRecordForMassAction',$maxformassaction), null, 'errors');
- $error++;
- }
-
- // Action to delete
- /*
- if ($action == 'confirm_delete')
- {
- $result=$object->delete($user);
- if ($result > 0)
- {
- // Delete OK
- setEventMessages("RecordDeleted", null, 'mesgs');
- header("Location: ".dol_buildpath('/mymodule/list.php',1));
- exit;
- }
- else
- {
- if (! empty($object->errors)) setEventMessages(null,$object->errors,'errors');
- else setEventMessages($object->error,null,'errors');
- }
- }*/
+ $objectclass='SupplierProposal';
+ $objectlabel='SupplierProposals';
+ $permtoread = $user->rights->supplier_proposal->lire;
+ $permtodelete = $user->rights->supplier_proposal->supprimer;
+ $uploaddir = $conf->supplier_proposal->dir_output;
+ include DOL_DOCUMENT_ROOT.'/core/actions_massactions.inc.php';
}
@@ -197,15 +206,16 @@ if (empty($reshook))
* View
*/
-llxHeader('',$langs->trans('CommRequest'),'EN:Ask_Price_Supplier|FR:Demande_de_prix_fournisseur');
+$now=dol_now();
$form = new Form($db);
$formother = new FormOther($db);
$formfile = new FormFile($db);
$formpropal = new FormPropal($db);
$companystatic=new Societe($db);
+$formcompany=new FormCompany($db);
-$now=dol_now();
+llxHeader('',$langs->trans('CommRequest'),'EN:Ask_Price_Supplier|FR:Demande_de_prix_fournisseur');
$sql = 'SELECT';
if ($sall || $search_product_category > 0) $sql = 'SELECT DISTINCT';
@@ -250,7 +260,7 @@ if ($search_author) $sql .= natural_search('u.login', $search_author);
if ($search_montant_ht) $sql.= " AND sp.total_ht='".$db->escape(price2num(trim($search_montant_ht)))."'";
if ($sall) $sql .= natural_search(array_keys($fieldstosearchall), $sall);
if ($socid) $sql.= ' AND s.rowid = '.$socid;
-if ($search_status <> '') $sql.= ' AND sp.fk_statut IN ('.$search_status.')';
+if ($search_status >= 0 && $search_status != '') $sql.= ' AND sp.fk_statut IN ('.$search_status.')';
if ($month > 0)
{
if ($year > 0 && empty($day))
@@ -283,8 +293,10 @@ if ($search_user > 0)
$sql.= " AND c.fk_c_type_contact = tc.rowid AND tc.element='supplier_proposal' AND tc.source='internal' AND c.element_id = sp.rowid AND c.fk_socpeople = ".$search_user;
}
-$sql.= ' ORDER BY '.$sortfield.' '.$sortorder.', sp.ref DESC';
+$sql.= $db->order($sortfield,$sortorder);
+$sql.=', sp.ref DESC';
+// Count total nb of records
$nbtotalofrecords = '';
if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST))
{
@@ -293,19 +305,28 @@ if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST))
}
$sql.= $db->plimit($limit + 1,$offset);
+
$result=$db->query($sql);
if ($result)
{
$objectstatic=new SupplierProposal($db);
$userstatic=new User($db);
+
+ if ($socid > 0)
+ {
+ $soc = new Societe($db);
+ $soc->fetch($socid);
+ $title = $langs->trans('ListOfProposals') . ' - '.$soc->name;
+ }
+ else
+ {
+ $title = $langs->trans('ListOfProposals');
+ }
+
$num = $db->num_rows($result);
- if ($socid)
- {
- $soc = new Societe($db);
- $soc->fetch($socid);
- }
-
+ $arrayofselected=is_array($toselect)?$toselect:array();
+
$param='';
if (! empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) $param.='&contextpage='.$contextpage;
if ($limit > 0 && $limit != $conf->liste_limit) $param.='&limit='.$limit;
@@ -320,21 +341,136 @@ if ($result)
if ($search_author) $param.='&search_author='.$search_author;
if ($socid > 0) $param.='&socid='.$socid;
if ($search_status != '') $param.='&search_status='.$search_status;
-
+ if ($optioncss != '') $param.='&optioncss='.$optioncss;
+ // Add $param from extra fields
+ foreach ($search_array_options as $key => $val)
+ {
+ $crit=$val;
+ $tmpkey=preg_replace('/search_options_/','',$key);
+ if ($val != '') $param.='&search_options_'.$tmpkey.'='.urlencode($val);
+ }
+
+ // List of mass actions available
+ $arrayofmassactions = array(
+ //'presend'=>$langs->trans("SendByMail"),
+ 'builddoc'=>$langs->trans("PDFMerge"),
+ );
+ if ($user->rights->supplier_proposal->supprimer) $arrayofmassactions['delete']=$langs->trans("Delete");
+ if ($massaction == 'presend') $arrayofmassactions=array();
+ $massactionbutton=$form->selectMassAction('', $arrayofmassactions);
+
// Lignes des champs de filtre
- print '';
+ $db->free($resql);
+
+ $parameters=array('arrayfields'=>$arrayfields, 'sql'=>$sql);
+ $reshook=$hookmanager->executeHooks('printFieldListFooter',$parameters); // Note that $action and $object may have been modified by hook
+ print $hookmanager->resPrint;
+
+ print '
'."\n";
+ print ''."\n";
- $db->free($result);
+ print ''."\n";
+
+ if ($massaction == 'builddoc' || $action == 'remove_file' || $show_files)
+ {
+ /*
+ * Show list of available documents
+ */
+ $urlsource=$_SERVER['PHP_SELF'].'?sortfield='.$sortfield.'&sortorder='.$sortorder;
+ $urlsource.=str_replace('&','&',$param);
+
+ $filedir=$diroutputmassaction;
+ $genallowed=$user->rights->propal->lire;
+ $delallowed=$user->rights->propal->lire;
+
+ print $formfile->showdocuments('massfilesarea_proposals','',$filedir,$urlsource,0,$delallowed,'',1,1,0,48,1,$param,'','');
+ }
+ else
+ {
+ print '
'.$langs->trans("ShowTempMassFilesArea").'';
+ }
+
}
else
{
diff --git a/htdocs/theme/eldy/style.css.php b/htdocs/theme/eldy/style.css.php
index 2b5719d29f5..da758b597b0 100644
--- a/htdocs/theme/eldy/style.css.php
+++ b/htdocs/theme/eldy/style.css.php
@@ -2502,10 +2502,10 @@ table.liste tr, table.noborder tr, div.noborder form {
min-height: 20px;
}
table.liste th, table.noborder th, table.noborder tr.liste_titre td, table.noborder tr.box_titre td {
- padding: 8px 2px 8px 3px; /* t r b l */
+ padding: 7px 2px 7px 3px; /* t r b l */
}
table.liste td, table.noborder td, div.noborder form div {
- padding: 8px 2px 8px 3px; /* t r b l */
+ padding: 7px 2px 7px 3px; /* t r b l */
}
div.liste_titre_bydiv .divsearchfield {
padding: 2px 1px 2px 0px; /* t r b l */
@@ -2775,7 +2775,7 @@ table.dataTable td {
padding: 5px 2px 5px 3px !important;
}
tr.even td, tr.pair td, tr.odd td, tr.impair td, form.odd div.tagtd, form.impair div.tagtd, form.pair div.tagtd, div.impair div.tagtd, div.pair div.tagtd, div.liste_titre div.tagtd {
- padding: 5px 2px 5px 3px;
+ padding: 7px 2px 7px 3px;
border-bottom: 1px solid #ddd;
}
form.pair, form.impair {
@@ -3039,7 +3039,7 @@ tr.box_pair {
}
tr.box_pair td, tr.box_impair td {
- padding: 4px;
+ /* padding: 4px; */
}
tr.box_pair:not(:last-child) td, tr.box_impair:not(:last-child) td {
border-bottom: 1px solid #ddd;
diff --git a/htdocs/theme/md/style.css.php b/htdocs/theme/md/style.css.php
index 069f34784ab..e0f9f5eebea 100644
--- a/htdocs/theme/md/style.css.php
+++ b/htdocs/theme/md/style.css.php
@@ -2926,7 +2926,7 @@ tr.box_pair td, tr.box_impair td {
padding: 4px;
}
tr.box_pair:not(:last-child) td, tr.box_impair:not(:last-child) td {
- border-bottom: 1px solid #f4f4f4;
+ border-bottom: 1px solid #eee;
}
.noborderbottom {
border-bottom: none !important;