diff --git a/htdocs/comm/propal.php b/htdocs/comm/propal.php index 0a5e7437a1d..a2005aebde8 100644 --- a/htdocs/comm/propal.php +++ b/htdocs/comm/propal.php @@ -30,11 +30,12 @@ */ require("../main.inc.php"); -require_once(DOL_DOCUMENT_ROOT.'/comm/propal/class/propal.class.php'); -require_once(DOL_DOCUMENT_ROOT."/core/modules/propale/modules_propale.php"); -require_once(DOL_DOCUMENT_ROOT.'/comm/action/class/actioncomm.class.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/class/html.formpropal.class.php"); +require_once(DOL_DOCUMENT_ROOT.'/comm/propal/class/propal.class.php'); +require_once(DOL_DOCUMENT_ROOT.'/comm/action/class/actioncomm.class.php'); +require_once(DOL_DOCUMENT_ROOT."/core/modules/propale/modules_propale.php"); require_once(DOL_DOCUMENT_ROOT."/core/lib/propal.lib.php"); require_once(DOL_DOCUMENT_ROOT."/core/lib/functions2.lib.php"); if ($conf->projet->enabled) require_once(DOL_DOCUMENT_ROOT.'/projet/class/project.class.php'); @@ -1052,8 +1053,9 @@ else if ($action == 'down' && $user->rights->propale->creer) llxHeader('',$langs->trans('Proposal'),'EN:Commercial_Proposals|FR:Proposition_commerciale|ES:Presupuestos'); $form = new Form($db); -$htmlother = new FormOther($db); +$formother = new FormOther($db); $formfile = new FormFile($db); +$formpropal = new FormPropal($db); $companystatic=new Societe($db); $now=dol_now(); @@ -1883,7 +1885,7 @@ else print_liste_field_titre($langs->trans('Company'),$_SERVER["PHP_SELF"],'s.nom','',$param,'',$sortfield,$sortorder); print_liste_field_titre($langs->trans('Date'),$_SERVER["PHP_SELF"],'p.datep','',$param, 'align="center"',$sortfield,$sortorder); print_liste_field_titre($langs->trans('DateEndPropalShort'),$_SERVER["PHP_SELF"],'dfv','',$param, 'align="center"',$sortfield,$sortorder); - print_liste_field_titre($langs->trans('Price'),$_SERVER["PHP_SELF"],'p.total_ht','',$param, 'align="right"',$sortfield,$sortorder); + print_liste_field_titre($langs->trans('AmountHT'),$_SERVER["PHP_SELF"],'p.total_ht','',$param, 'align="right"',$sortfield,$sortorder); print_liste_field_titre($langs->trans('Author'),$_SERVER["PHP_SELF"],'u.login','',$param,'align="right"',$sortfield,$sortorder); print_liste_field_titre($langs->trans('Status'),$_SERVER["PHP_SELF"],'p.fk_statut','',$param,'align="right"',$sortfield,$sortorder); print_liste_field_titre(''); @@ -1903,7 +1905,7 @@ else print ' '.$langs->trans('Year').': '; $syear = $year; //if($syear == '') $syear = date("Y"); - $htmlother->select_year($syear,'year',1, 20, 5); + $formother->select_year($syear,'year',1, 20, 5); print ''; print ' '; print ''; @@ -1911,7 +1913,7 @@ else print ''; print ' '; print ''; - $form->select_propal_statut($viewstatut,1); + $formpropal->select_propal_statut($viewstatut,1); print ''; print ''; print ''; @@ -2015,8 +2017,9 @@ else dol_print_error($db); } } -$db->close(); + llxFooter(); +$db->close(); ?> diff --git a/htdocs/compta/propal.php b/htdocs/compta/propal.php deleted file mode 100644 index 6bf7088ec5f..00000000000 --- a/htdocs/compta/propal.php +++ /dev/null @@ -1,708 +0,0 @@ - - * Copyright (C) 2004-2010 Laurent Destailleur - * Copyright (C) 2004 Eric Seigne - * Copyright (C) 2005-2010 Regis Houssin - * Copyright (C) 2008 Raphael Bertrand (Resultic) - * Copyright (C) 2010 Juanjo Menent - * - * 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 2 of the License, or - * (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 - * along with this program. If not, see . - */ - -/** - * \file htdocs/compta/propal.php - * \ingroup propale - * \brief Page liste des propales (vision compta) - */ - -require('../main.inc.php'); -require_once(DOL_DOCUMENT_ROOT."/core/class/html.formfile.class.php"); -require_once(DOL_DOCUMENT_ROOT."/core/class/html.formother.class.php"); -require_once(DOL_DOCUMENT_ROOT."/comm/propal/class/propal.class.php"); -require_once(DOL_DOCUMENT_ROOT."/core/lib/propal.lib.php"); -if ($conf->projet->enabled) require_once(DOL_DOCUMENT_ROOT.'/projet/class/project.class.php'); -if ($conf->commande->enabled) require_once(DOL_DOCUMENT_ROOT.'/commande/class/commande.class.php'); - -$langs->load('companies'); -$langs->load('compta'); -$langs->load('orders'); -$langs->load('bills'); - -$id=GETPOST('id'); -$ref=GETPOST('ref'); -$socid=GETPOST('socid'); -$action=GETPOST('action'); - -$sortfield = GETPOST("sortfield",'alpha'); -$sortorder = GETPOST("sortorder",'alpha'); -$page = GETPOST("page",'int'); -if ($page == -1) { $page = 0; } -$offset = $conf->liste_limit * $page; -$pageprev = $page - 1; -$pagenext = $page + 1; - -$viewstatut=$_GET['viewstatut']; -$propal_statut = $_GET['propal_statut']; -if($propal_statut != '') -$viewstatut=$propal_statut; - -if (! $sortorder) $sortorder="DESC"; -if (! $sortfield) $sortfield="p.datep"; - -$module='propale'; -if (! empty($_GET["socid"])) -{ - $objectid=$_GET["socid"]; - $module='societe'; - $dbtable=''; -} -else if (! empty($id)) -{ - $objectid=$id; - $module='propale'; - $dbtable='propal'; -} - -// Security check -if ($user->societe_id) $socid=$user->societe_id; -$result = restrictedArea($user, $module, $objectid, $dbtable); - -$object = new Propal($db); - - -/******************************************************************************/ -/* Actions */ -/******************************************************************************/ - -if ($action == 'setstatut') -{ - // Close proposal - $object->id = $id; - $object->cloture($user, $_GET["statut"], $note); - -} - -// Set project -if ($action == 'classin') -{ - $object->fetch($id); - $object->setProject($_POST['projectid']); -} - - - -/* - * View - */ - -$now=gmmktime(); - -llxHeader(); - -$form = new Form($db); -$htmlother = new FormOther($db); -$formfile = new FormFile($db); -$societestatic=new Societe($db); -$propalstatic=new Propal($db); - -$now=gmmktime(); - -if ($id > 0 || ! empty($ref)) -{ - if ($mesg) print "$mesg
"; - - $product_static=new Product($db); - - $object->fetch($id,$ref); - - $societe = new Societe($db); - $societe->fetch($object->socid); - - $head = propal_prepare_head($object); - dol_fiche_head($head, 'compta', $langs->trans('Proposal'), 0, 'propal'); - - - /* - * Proposal card - */ - print ''; - - $linkback="".$langs->trans("BackToList").""; - - // Ref - print ''; - - // Ref client - print ''; - print ''; - - $rowspan=8; - - // Company - print ''; - - // Ligne info remises tiers - print ''; - - // Dates - print ''; - - if ($conf->projet->enabled) $rowspan++; - - //Local taxes - if ($mysoc->country_code=='ES') - { - if($mysoc->localtax1_assuj=="1") $rowspan++; - if($mysoc->localtax2_assuj=="1") $rowspan++; - } - - // Note - print ''; - print ''; - - // Date fin propal - print ''; - print ''; - print ''; - - // Payment term - print ''; - - // Payment mode - print ''; - print ''; - - // Project - if ($conf->projet->enabled) - { - $langs->load("projects"); - print ''; - } - else - { - print '
'.$langs->trans('Ref').''; - print $form->showrefnav($object,'ref',$linkback,1,'ref','ref',''); - print '
'; - print ''; - if ($action != 'refclient' && $object->brouillon) print ''; - print '
'; - print $langs->trans('RefCustomer').''; - print ''.img_edit($langs->trans('Modify')).'
'; - print '
'; - print $object->ref_client; - print '
'.$langs->trans('Company').''.$societe->getNomUrl(1).'
'.$langs->trans('Discounts').''; - if ($societe->remise_client) print $langs->trans("CompanyHasRelativeDiscount",$societe->remise_client); - else print $langs->trans("CompanyHasNoRelativeDiscount"); - $absolute_discount=$societe->getAvailableDiscounts(); - print '. '; - if ($absolute_discount) print $langs->trans("CompanyHasAbsoluteDiscount",price($absolute_discount),$langs->trans("Currency".$conf->currency)); - else print $langs->trans("CompanyHasNoAbsoluteDiscount"); - print '.'; - print '
'.$langs->trans('Date').''; - print dol_print_date($object->date,'daytext'); - print ''.$langs->trans('NotePublic').' :
'. nl2br($object->note_public).'
'.$langs->trans('DateEndPropal').''; - if ($object->fin_validite) - { - print dol_print_date($object->fin_validite,'daytext'); - if ($object->statut == 1 && $object->fin_validite < ($now - $conf->propal->cloture->warning_delay)) print img_warning($langs->trans("Late")); - } - else - { - print $langs->trans("Unknown"); - } - print '
'; - print ''; - if ($action != 'editconditions' && $object->brouillon) print ''; - print '
'; - print $langs->trans('PaymentConditionsShort'); - print 'id.'">'.img_edit($langs->trans('SetConditions'),1).'
'; - print '
'; - if ($action == 'editconditions') - { - $form->form_conditions_reglement($_SERVER['PHP_SELF'].'?id='.$object->id,$object->cond_reglement_id,'cond_reglement_id'); - } - else - { - $form->form_conditions_reglement($_SERVER['PHP_SELF'].'?id='.$object->id,$object->cond_reglement_id,'none'); - } - print '
'; - print ''; - if ($action != 'editmode' && $object->brouillon) print ''; - print '
'; - print $langs->trans('PaymentMode'); - print 'id.'">'.img_edit($langs->trans('SetMode'),1).'
'; - print '
'; - if ($action == 'editmode') - { - $form->form_modes_reglement($_SERVER['PHP_SELF'].'?id='.$object->id,$object->mode_reglement_id,'mode_reglement_id'); - } - else - { - $form->form_modes_reglement($_SERVER['PHP_SELF'].'?id='.$object->id,$object->mode_reglement_id,'none'); - } - print '
'; - print ''; - if (1 == 2 && $user->rights->propale->creer) - { - if ($action != 'classify') print ''; - print '
'; - print $langs->trans('Project').''.img_edit($langs->trans('SetProject')).'
'; - print '
'; - if ($action == 'classify') - { - $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, 'projectid'); - } - else - { - $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, 'none'); - } - print '
'; - if (!empty($object->fk_project)) - { - print ''; - $project = new Project($db); - $project->fetch($object->fk_project); - print ''; - print $project->ref; - print ''; - print ''; - } - else - { - print ' '; - } - } - print ''; - } - - // Amount - print ''.$langs->trans('AmountHT').''; - print ''.price($object->total_ht).''; - print ''.$langs->trans("Currency".$conf->currency).''; - - print ''.$langs->trans('AmountVAT').''.price($object->total_tva).''; - print ''.$langs->trans("Currency".$conf->currency).''; - - // Amount Local Taxes - if ($mysoc->country_code=='ES') - { - if ($mysoc->localtax1_assuj=="1") //Localtax1 RE - { - print ''.$langs->transcountry("AmountLT1",$mysoc->country_code).''; - print ''.price($object->total_localtax1).''; - print ''.$langs->trans("Currency".$conf->currency).''; - } - if ($mysoc->localtax2_assuj=="1") //Localtax2 IRPF - { - print ''.$langs->transcountry("AmountLT2",$mysoc->country_code).''; - print ''.price($object->total_localtax2).''; - print ''.$langs->trans("Currency".$conf->currency).''; - } - } - - - print ''.$langs->trans('AmountTTC').''.price($object->total_ttc).''; - print ''.$langs->trans("Currency".$conf->currency).''; - - - // Statut - print ''.$langs->trans('Status').''.$object->getLibStatut(4).''; - print '
'; - - /* - * Lines - */ - print ''; - - $sql = 'SELECT pt.rowid, pt.description, pt.price, pt.fk_product, pt.fk_remise_except,'; - $sql.= ' pt.qty, pt.tva_tx, pt.remise_percent, pt.subprice, pt.info_bits,'; - $sql.= ' pt.total_ht, pt.total_tva, pt.total_ttc,'; - $sql.= ' pt.product_type,'; - $sql.= ' p.rowid as prodid, p.label as product_label, p.ref, p.fk_product_type, '; - $sql.= ' p.description as product_desc'; - $sql.= ' FROM '.MAIN_DB_PREFIX.'propaldet as pt'; - $sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'product as p ON pt.fk_product=p.rowid'; - $sql.= ' WHERE pt.fk_propal = '.$object->id; - $sql.= ' ORDER BY pt.rang ASC, pt.rowid'; - $resql = $db->query($sql); - if ($resql) - { - $num_lignes = $db->num_rows($resql); - $i = 0; - $total = 0; - - if ($num_lignes) - { - print ''; - print ''; - print ''; - print ''; - print ''; - print ''; - print ''; - print ''; - print ''; - print ''; - print "\n"; - } - $var=true; - while ($i < $num_lignes) - { - $objp = $db->fetch_object($resql); - $var=!$var; - - // Show product and description - $type=$objp->product_type?$objp->product_type:$objp->fk_product_type; - // Try to enhance type detection using date_start and date_end for free lines where type - // was not saved. - if (! empty($objp->date_start)) $type=1; - if (! empty($objp->date_end)) $type=1; - - if ($action != 'editline' || $_GET['rowid'] != $objp->rowid) - { - print ''; - if ($objp->fk_product > 0) - { - print ''; - } - else - { - print '\n"; - } - print ''; - print '\n"; - - // Qty - print ''; - - if ($objp->remise_percent > 0) - { - print '\n"; - } - else - { - print ''; - } - print '\n"; - - print ''; - - print ''; - } - - $i++; - } - $db->free($resql); - } - else - { - dol_print_error($db); - } - - print '
'.$langs->trans('Description').''.$langs->trans('VAT').''.$langs->trans('PriceUHT').''.$langs->trans('Qty').''.$langs->trans('ReductionShort').''.$langs->trans('AmountHT').'   
'; - print ''; // ancre pour retourner sur la ligne; - - // Show product and description - $product_static->type=$objp->fk_product_type; - $product_static->id=$objp->fk_product; - $product_static->ref=$objp->ref; - $product_static->libelle=$objp->product_label; - $text=$product_static->getNomUrl(1); - $text.= ' - '.$objp->product_label; - $description=($conf->global->PRODUIT_DESC_IN_FORM?'':dol_htmlentitiesbr($objp->description)); - print $form->textwithtooltip($text,$description,3,'','',$i); - - // Show range - print_date_range($objp->date_start,$objp->date_end); - - // Add description in form - if ($conf->global->PRODUIT_DESC_IN_FORM) - { - print ($objp->description && $objp->description!=$objp->product_label)?'
'.dol_htmlentitiesbr($objp->description):''; - } - print '
'; - print ''; // ancre pour retourner sur la ligne - if (($objp->info_bits & 2) == 2) - { - print ''; - print img_object($langs->trans("ShowReduc"),'reduc').' '.$langs->trans("Discount"); - print ''; - if ($objp->description) - { - if ($objp->description == '(CREDIT_NOTE)') - { - $discount=new DiscountAbsolute($db); - $discount->fetch($objp->fk_remise_except); - print ' - '.$langs->transnoentities("DiscountFromCreditNote",$discount->getNomUrl(0)); - } - else - { - print ' - '.nl2br($objp->description); - } - } - } - else - { - if ($type==1) $text = img_object($langs->trans('Service'),'service'); - else $text = img_object($langs->trans('Product'),'product'); - print $text.' '.nl2br($objp->description); - - // Show range - print_date_range($objp->date_start,$objp->date_end); - } - print "'.vatrate($objp->tva_tx).'%'.price($objp->subprice)."'; - if (($objp->info_bits & 2) != 2) - { - print $objp->qty; - } - else print ' '; - print ''.$objp->remise_percent."% '.price($objp->total_ht)." 
'; - - - print ''; - - - /* - * Boutons Actions - */ - print '
'; - - if ($object->statut <> 4 && $user->societe_id == 0) - { - if ($object->statut == 2 && $user->rights->facture->creer) - { - print ''.$langs->trans("BuildBill").''; - } - - $arraypropal=$object->getInvoiceArrayList(); - if ($object->statut == 2 && is_array($arraypropal) && count($arraypropal) > 0) - { - print 'socid.'">'.$langs->trans("ClassifyBilled").''; - } - } - print "
"; - print "
\n"; - - - - print '
'; - - /* - * Documents generes - */ - $filename=dol_sanitizeFileName($object->ref); - $filedir=$conf->propale->dir_output . "/" . dol_sanitizeFileName($object->ref); - $urlsource=$_SERVER["PHP_SELF"]."?id=".$object->id; - $genallowed=0; - $delallowed=0; - - $var=true; - - $somethingshown=$formfile->show_documents('propal',$filename,$filedir,$urlsource,$genallowed,$delallowed); - - - /* - * Linked object block - */ - $somethingshown=$object->showLinkedObjectBlock(); - - print ''; - - // List of actions on element - include_once(DOL_DOCUMENT_ROOT.'/core/class/html.formactions.class.php'); - $formactions=new FormActions($db); - $somethingshown=$formactions->showactions($object,'propal',$socid); - - print '
'; - - -} -else -{ - /** - * - * Mode List - * - */ - - $now=dol_now(); - - $limit = $conf->liste_limit; - $offset = $limit * $page ; - $pageprev = $page - 1; - $pagenext = $page + 1; - - $year = $_REQUEST["year"]; - $month = $_REQUEST["month"]; - - $sql = "SELECT s.nom, s.rowid as socid, s.client,"; - $sql.= " p.rowid as propalid, p.ref, p.fk_statut,"; - $sql.= " p.total_ht, p.tva, p.total,"; - $sql.= " p.datep as dp,"; - $sql.= " p.fin_validite as dfin"; - $sql.= " FROM ".MAIN_DB_PREFIX."societe as s"; - $sql.= ", ".MAIN_DB_PREFIX."propal as p"; - if (!$user->rights->societe->client->voir && !$socid) $sql.= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc"; - $sql.= " WHERE p.fk_soc = s.rowid"; - $sql.= " AND p.entity = ".$conf->entity; - if (!$user->rights->societe->client->voir && !$socid) $sql.= " AND s.rowid = sc.fk_soc AND sc.fk_user = " .$user->id; - if ($socid) $sql.= " AND s.rowid = ".$socid; - if ($viewstatut <> '') $sql.= " AND p.fk_statut in ($viewstatut)"; // viewstatut peut etre combinaisons separe par virgules - if ($month > 0) - { - if ($year > 0) - $sql.= " AND date_format(p.datep, '%Y-%m') = '".$year."-".$month."'"; - else - $sql.= " AND date_format(p.datep, '%m') = '".$month."'"; - } - if ($year > 0) $sql .= " AND date_format(p.datep, '%Y') = '".$year."'"; - if (!empty($_GET['search_ref'])) - { - $sql.= " AND p.ref LIKE '%".$db->escape($_GET['search_ref'])."%'"; - } - if (!empty($_GET['search_societe'])) - { - $sql.= " AND s.nom LIKE '%".$db->escape($_GET['search_societe'])."%'"; - } - if (!empty($_GET['search_montant_ht'])) - { - $sql.= " AND p.price='".$db->escape($_GET['search_montant_ht'])."'"; - } - $sql.= " ORDER BY $sortfield $sortorder, p.rowid DESC "; - $sql.= $db->plimit($limit + 1,$offset); - - $result = $db->query($sql); - if ($result) - { - $num = $db->num_rows($result); - - print_barre_liste($langs->trans("Proposals"), $page, "propal.php","&socid=$socid&month=$month&year=$year&search_ref=$search_ref&search_societe=$search_societe&search_montant_ht=$search_montant_ht".'&viewstatut='.$viewstatut,$sortfield,$sortorder,'',$num); - - $i = 0; - $var=true; - - print ""; - print ''; - print_liste_field_titre($langs->trans("Ref"),"propal.php","p.ref","","&year=$year&viewstatut=$viewstatut",'width=20%',$sortfield,$sortorder); - print_liste_field_titre($langs->trans("Company"),"propal.php","s.nom","&viewstatut=$viewstatut","",'',$sortfield,$sortorder); - print_liste_field_titre($langs->trans("Date"),"propal.php","p.datep","&viewstatut=$viewstatut","",'align="right"',$sortfield,$sortorder); - print_liste_field_titre($langs->trans("AmountHT"),"propal.php","p.price","&viewstatut=$viewstatut","",'align="right"',$sortfield,$sortorder); - print_liste_field_titre($langs->trans("Status"),"propal.php","p.fk_statut","&viewstatut=$viewstatut","",'align="right"',$sortfield,$sortorder); - print ''; - print "\n"; - - // Lignes des champs de filtre - print ''; - - print ''; - print ''; - print ''; - print ''; - print ''; - print ''; - print ''; - print "\n"; - print ''; - - while ($i < min($num, $limit)) - { - $objp = $db->fetch_object($result); - - $var=!$var; - print ""; - print '\n"; - - // Societe - print ""; - - // Date - print "\n"; - - // Prix - print "\n"; - print "\n"; - print ""; - print "\n"; - - $i++; - } - - print "
 
'; - print ''; - print ''; - print ''; - print ''; - print $langs->trans('Month').': '; - print ' '.$langs->trans('Year').': '; - $syear = $year; - if($syear == '') - $syear = date("Y"); - $htmlother->select_year($syear,'year',1, 20, 5); - print ''; - print ''; - print ''; - $form->select_propal_statut($viewstatut); - print ''; - print '
'; - - $propalstatic->id=$objp->propalid; - $propalstatic->ref=$objp->ref; - - //Ref - print ''; - print ''; - - print ''; - - print '
'; - print $propalstatic->getNomUrl(1, '', "&socid=$socid&viewstatut=$viewstatut&sortfield=$sortfield&$sortorder"); - print ''; - if ($objp->fk_statut == 1 && $db->jdate($objp->dfin) < ($now - $conf->propal->cloture->warning_delay)) print img_warning($langs->trans("Late")); - print ''; - - $filename=dol_sanitizeFileName($objp->ref); - $filedir=$conf->propale->dir_output . '/' . dol_sanitizeFileName($objp->ref); - $urlsource=$_SERVER['PHP_SELF'].'?id='.$objp->propalid; - $formfile->show_documents('propal',$filename,$filedir,$urlsource,'','','',1,'',1); - - print '
'; - - print "
"; - $societestatic->nom=$objp->nom; - $societestatic->id=$objp->socid; - $societestatic->client=$objp->client; - print $societestatic->getNomUrl(1,'customer',44); - print ""; - $y = dol_print_date($db->jdate($objp->dp),"%Y"); - $m = dol_print_date($db->jdate($objp->dp),"%m"); - $mt = dol_print_date($db->jdate($objp->dp),"%b"); - $d = dol_print_date($db->jdate($objp->dp),"%d"); - print $d."\n"; - print " "; - print $mt."\n"; - print " "; - print $y."".price($objp->total_ht)."".$propalstatic->LibStatut($objp->fk_statut,5)." 
"; - $db->free($result); - } - else - { - dol_print_error($db); - } -} -$db->close(); - - -llxFooter(); - -?> diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index b2551cbfdc7..15ea5af4f5f 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -1967,66 +1967,6 @@ class Form return $return; } - - /** - * Return combo list of differents status of a proposal - * Values are id of table c_propalst - * - * @param selected etat pre-selectionne - * @param short Use short labels - */ - function select_propal_statut($selected='',$short=0) - { - global $langs; - - $sql = "SELECT id, code, label, active FROM ".MAIN_DB_PREFIX."c_propalst"; - $sql .= " WHERE active = 1"; - - dol_syslog("Form::select_propal_statut sql=".$sql); - $resql=$this->db->query($sql); - if ($resql) - { - print ''; - } - else - { - dol_print_error($this->db); - } - } - - /** * Return a HTML select list of bank accounts * diff --git a/htdocs/core/class/html.formpropal.class.php b/htdocs/core/class/html.formpropal.class.php new file mode 100644 index 00000000000..31d7999273d --- /dev/null +++ b/htdocs/core/class/html.formpropal.class.php @@ -0,0 +1,1903 @@ + + * + * 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 2 of the License, or + * (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 + * along with this program. If not, see . + */ + +/** + * \file htdocs/core/class/html.formpropal.class.php + * \ingroup core + * \brief File of class with all html predefined components + */ + + +/** + * Class to manage generation of HTML components for proposal management + */ +class FormPropal +{ + var $db; + var $error; + + + /** + * Constructor + * + * @param DoliDB $db Database handler + */ + public function __construct($db) + { + $this->db = $db; + } + + /** + * Return combo list of differents status of a proposal + * Values are id of table c_propalst + * + * @param string $selected Preselected value + * @param int $short Use short labels + * @return void + */ + function select_propal_statut($selected='',$short=0) + { + global $langs; + + $sql = "SELECT id, code, label, active FROM ".MAIN_DB_PREFIX."c_propalst"; + $sql .= " WHERE active = 1"; + + dol_syslog(get_class($this)."::select_propal_statut sql=".$sql); + $resql=$this->db->query($sql); + if ($resql) + { + print ''; + } + else + { + dol_print_error($this->db); + } + } + + + /** + * Return a HTML select list of bank accounts + * + * @param selected Id account pre-selected + * @param htmlname Name of select zone + * @param statut Status of searched accounts (0=open, 1=closed) + * @param filtre To filter list + * @param useempty 1=Add an empty value in list, 2=Add an empty value in list only if there is more than 2 entries. + * @param moreattrib To add more attribute on select + */ + function select_comptes($selected='',$htmlname='accountid',$statut=0,$filtre='',$useempty=0,$moreattrib='') + { + global $langs, $conf; + + $langs->load("admin"); + + $sql = "SELECT rowid, label, bank"; + $sql.= " FROM ".MAIN_DB_PREFIX."bank_account"; + $sql.= " WHERE clos = '".$statut."'"; + $sql.= " AND entity = ".$conf->entity; + if ($filtre) $sql.=" AND ".$filtre; + $sql.= " ORDER BY label"; + + dol_syslog("Form::select_comptes sql=".$sql); + $result = $this->db->query($sql); + if ($result) + { + $num = $this->db->num_rows($result); + $i = 0; + if ($num) + { + print '"; + } + else + { + print $langs->trans("NoActiveBankAccountDefined"); + } + } + else { + dol_print_error($this->db); + } + } + + /** + * Return list of categories having choosed type + * + * @param type Type de categories (0=product, 1=supplier, 2=customer, 3=member) + * @param selected Id of category preselected + * @param select_name HTML field name + * @param maxlength Maximum length for labels + * @param excludeafterid Exclude all categories after this leaf in category tree. + */ + function select_all_categories($type, $selected='', $select_name="", $maxlength=64, $excludeafterid=0) + { + global $langs; + $langs->load("categories"); + + if ($select_name=="") $select_name="catMere"; + + $cat = new Categorie($this->db); + $cate_arbo = $cat->get_full_arbo($type,$excludeafterid); + + $output = ''; + $output.= "\n"; + return $output; + } + + /** + * Show a confirmation HTML form or AJAX popup + * + * @param page Url of page to call if confirmation is OK + * @param title title + * @param question question + * @param action action + * @param formquestion an array with forms complementary inputs + * @param selectedchoice "" or "no" or "yes" + * @param useajax 0=No, 1=Yes, 2=Yes but submit page with &confirm=no if choice is No + * @param height Force height of box + * @return string 'ajax' if a confirm ajax popup is shown, 'html' if it's an html form + */ + function form_confirm($page, $title, $question, $action, $formquestion='', $selectedchoice="", $useajax=0, $height=170, $width=500) + { + print $this->formconfirm($page, $title, $question, $action, $formquestion, $selectedchoice, $useajax, $height, $width); + } + + /** + * Show a confirmation HTML form or AJAX popup + * + * @param string $page Url of page to call if confirmation is OK + * @param string $title Title + * @param string $question Question + * @param string $action Action + * @param array $formquestion An array with complementary inputs to add into forms: array(array('label'=> ,'type'=> , )) + * @param string $selectedchoice "" or "no" or "yes" + * @param int $useajax 0=No, 1=Yes, 2=Yes but submit page with &confirm=no if choice is No, 'xxx'=preoutput confirm box with div id=dialog-confirm-xxx + * @param int $height Force height of box + * @return string 'ajax' if a confirm ajax popup is shown, 'html' if it's an html form + */ + function formconfirm($page, $title, $question, $action, $formquestion='', $selectedchoice="", $useajax=0, $height=170, $width=500) + { + global $langs,$conf; + + $more=''; + $formconfirm=''; + $inputarray=array(); + + if (is_array($formquestion) && count($formquestion) > 0) + { + $more.=''."\n"; + $more.=''."\n"; + foreach ($formquestion as $key => $input) + { + if (is_array($input)) + { + if ($input['type'] == 'text') + { + $more.=''."\n"; + } + else if ($input['type'] == 'password') + { + $more.=''."\n"; + } + else if ($input['type'] == 'select') + { + $more.=''."\n"; + } + else if ($input['type'] == 'checkbox') + { + $more.=''; + $more.=''; + if ($i==0) $more.=''; + else $more.=''; + $more.=''."\n"; + } + array_push($inputarray,$input['name']); + } + } + $more.='
'.$formquestion['text'].'
'.$input['label'].'
'.$input['label'].'
'; + if (! empty($input['label'])) $more.=$input['label'].''; + $more.=$this->selectarray($input['name'],$input['values'],$input['default'],1); + $more.='
'.$input['label'].' '; + $more.=' $selval) + { + $more.='
'.$input['label'].' '; + $more.=$input['value']; + $more.='
'."\n"; + } + + $formconfirm.= "\n\n"; + + if ($useajax && $conf->use_javascript_ajax) + { + $autoOpen=true; + $dialogconfirm='dialog-confirm'; + if (! is_int($useajax)) + { + $button=$useajax; + $useajax=1; + $autoOpen=false; + $dialogconfirm.='-'.$button; + } + $pageyes=$page.'&action='.$action.'&confirm=yes'; + $pageno=($useajax == 2?$page.'&confirm=no':''); + + // New code using jQuery only + $formconfirm.= ''."\n"; + $formconfirm.= ''; + + $formconfirm.= "\n"; + } + else + { + $formconfirm.= '
'."\n"; + $formconfirm.= ''; + $formconfirm.= ''."\n"; + + $formconfirm.= ''."\n"; + + // Ligne titre + $formconfirm.= ''."\n"; + + // Ligne formulaire + if ($more) + { + $formconfirm.=''."\n"; + } + + // Ligne message + $formconfirm.= ''; + $formconfirm.= ''; + $formconfirm.= ''; + $formconfirm.= ''; + $formconfirm.= ''."\n"; + + $formconfirm.= '
'.img_picto('','recent').' '.$title.'
'."\n"; + $formconfirm.=$more; + $formconfirm.='
'.$question.''; + $newselectedchoice=empty($selectedchoice)?"no":$selectedchoice; + $formconfirm.= $this->selectyesno("confirm",$newselectedchoice); + $formconfirm.= '
'."\n"; + + if (is_array($formquestion)) + { + foreach ($formquestion as $key => $input) + { + if ($input['type'] == 'hidden') $formconfirm.= ''; + } + } + + $formconfirm.= "
\n"; + $formconfirm.= '
'; + } + + $formconfirm.= "\n"; + return $formconfirm; + } + + + /** + * Show a form to select a project + * + * @param int $page Page + * @param int $socid Id third party + * @param int $selected Id pre-selected project + * @param string $htmlname Name of select field + * @return void + */ + function form_project($page, $socid, $selected='', $htmlname='projectid') + { + global $langs; + + require_once(DOL_DOCUMENT_ROOT."/core/lib/project.lib.php"); + + $langs->load("project"); + if ($htmlname != "none") + { + print '
'; + print ''; + print ''; + print ''; + print ''; + print ''; + print '
'; + //print "$socid,$selected,$htmlname"; + select_projects($socid,$selected,$htmlname); + print '
'; + } + else + { + if ($selected) + { + $projet = new Project($this->db); + $projet->fetch($selected); + //print ''.$projet->title.''; + print $projet->getNomUrl(0,'',1); + } + else + { + print " "; + } + } + } + + /** + * Show a form to select payment conditions + * + * @param page Page + * @param selected Id condition pre-selectionne + * @param htmlname Name of select html field + * @param addempty Ajoute entree vide + * @return void + */ + function form_conditions_reglement($page, $selected='', $htmlname='cond_reglement_id', $addempty=0) + { + global $langs; + if ($htmlname != "none") + { + print '
'; + print ''; + print ''; + print ''; + print ''; + print ''; + print '
'; + $this->select_conditions_paiements($selected,$htmlname,-1,$addempty); + print '
'; + } + else + { + if ($selected) + { + $this->load_cache_conditions_paiements(); + print $this->cache_conditions_paiements[$selected]['label']; + } else { + print " "; + } + } + } + + /** + * Show a form to select a delivery delay + * + * @param page Page + * @param selected Id condition pre-selectionne + * @param htmlname Name of select html field + * @param addempty Ajoute entree vide + * @return void + */ + function form_availability($page, $selected='', $htmlname='availability', $addempty=0) + { + global $langs; + if ($htmlname != "none") + { + print '
'; + print ''; + print ''; + print ''; + print ''; + print ''; + print '
'; + $this->select_availability($selected,$htmlname,-1,$addempty); + print '
'; + } + else + { + if ($selected) + { + $this->load_cache_availability(); + print $this->cache_availability[$selected]['label']; + } else { + print " "; + } + } + } + + /** + * Show a select form to select origin + * + * @param page Page + * @param selected Id condition pre-selectionne + * @param htmlname Name of select html field + * @param addempty Add empty entry + * @return void + */ + function form_demand_reason($page, $selected='', $htmlname='demandreason', $addempty=0) + { + global $langs; + if ($htmlname != "none") + { + print '
'; + print ''; + print ''; + print ''; + print ''; + print ''; + print '
'; + $this->select_demand_reason($selected,$htmlname,-1,$addempty); + print '
'; + } + else + { + if ($selected) + { + $this->load_cache_demand_reason(); + foreach ($this->cache_demand_reason as $key => $val) + { + if ($val['id'] == $selected) + { + print $val['label']; + break; + } + } + } else { + print " "; + } + } + } + + /** + * Show a form to select a date + * + * @param page Page + * @param selected Date preselected + * @param htmlname Name of input html field + * @return void + */ + function form_date($page, $selected='', $htmlname) + { + global $langs; + + if ($htmlname != "none") + { + print '
'; + print ''; + print ''; + print ''; + print ''; + print ''; + print '
'; + print $this->select_date($selected,$htmlname,0,0,1,'form'.$htmlname); + print '
'; + } + else + { + if ($selected) + { + $this->load_cache_types_paiements(); + print $this->cache_types_paiements[$selected]['label']; + } else { + print " "; + } + } + } + + + /** + * Show a select form to choose a user + * + * @param page Page + * @param selected Id of user preselected + * @param htmlname Name of input html field + * @param exclude List of users id to exclude + * @param include List of users id to include + * @return void + */ + function form_users($page, $selected='', $htmlname='userid', $exclude='', $include='') + { + global $langs; + + if ($htmlname != "none") + { + print '
'; + print ''; + print ''; + print ''; + print ''; + print ''; + print '
'; + print $this->select_users($selected,$htmlname,1,$exclude,0,$include); + print '
'; + } + else + { + if ($selected) + { + require_once(DOL_DOCUMENT_ROOT ."/user/class/user.class.php"); + //$this->load_cache_contacts(); + //print $this->cache_contacts[$selected]; + $theuser=new User($this->db); + $theuser->fetch($selected); + print $theuser->getNomUrl(1); + } else { + print " "; + } + } + } + + + /** + * Affiche formulaire de selection des modes de reglement + * + * @param page Page + * @param selected Id mode pre-selectionne + * @param htmlname Name of select html field + * @return void + */ + function form_modes_reglement($page, $selected='', $htmlname='mode_reglement_id') + { + global $langs; + if ($htmlname != "none") + { + print '
'; + print ''; + print ''; + print ''; + print ''; + print ''; + print '
'; + $this->select_types_paiements($selected,$htmlname); + print '
'; + } + else + { + if ($selected) + { + $this->load_cache_types_paiements(); + print $this->cache_types_paiements[$selected]['label']; + } else { + print " "; + } + } + } + + + /** + * Show a select box with available absolute discounts + * + * @param string $page Page URL where form is shown + * @param int $selected Value pre-selected + * @param string $htmlname Nom du formulaire select. Si none, non modifiable + * @param int $socid Third party id + * @param float $amount Total amount available + * @param string $filter SQL filter on discounts + * @param int $maxvalue Max value for lines that can be selected + * @param string $more More string to add + * @return void + */ + function form_remise_dispo($page, $selected='', $htmlname='remise_id',$socid, $amount, $filter='', $maxvalue=0, $more='') + { + global $conf,$langs; + if ($htmlname != "none") + { + print '
'; + print ''; + print ''; + print ''; + print ''; + print ''; + print '
'; + if (! empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS)) + { + if (! $filter || $filter=="fk_facture_source IS NULL") print $langs->trans("CompanyHasAbsoluteDiscount",price($amount),$langs->transnoentities("Currency".$conf->currency)).': '; // If we want deposit to be substracted to payments only and not to total of final invoice + else print $langs->trans("CompanyHasCreditNote",price($amount),$langs->transnoentities("Currency".$conf->currency)).': '; + } + else + { + if (! $filter || $filter=="fk_facture_source IS NULL OR (fk_facture_source IS NOT NULL AND description='(DEPOSIT)')") print $langs->trans("CompanyHasAbsoluteDiscount",price($amount),$langs->transnoentities("Currency".$conf->currency)).': '; + else print $langs->trans("CompanyHasCreditNote",price($amount),$langs->transnoentities("Currency".$conf->currency)).': '; + } + $newfilter='fk_facture IS NULL AND fk_facture_line IS NULL'; // Remises disponibles + if ($filter) $newfilter.=' AND ('.$filter.')'; + $nbqualifiedlines=$this->select_remises($selected,$htmlname,$newfilter,$socid,$maxvalue); + print ''; + if ($nbqualifiedlines > 0) + { + print '   '; + } + if ($more) print $more; + print '
'; + } + else + { + if ($selected) + { + print $selected; + } + else + { + print "0"; + } + } + } + + + /** + * Affiche formulaire de selection des contacts + * + * @param page Page + * @param selected Id contact pre-selectionne + * @param htmlname Nom du formulaire select + * @return void + */ + function form_contacts($page, $societe, $selected='', $htmlname='contactidp') + { + global $langs; + + if ($htmlname != "none") + { + print '
'; + print ''; + print ''; + print ''; + print ''; + print ''; + print '
'; + $num=$this->select_contacts($societe->id, $selected, $htmlname); + if ($num==0) + { + print 'Cette societe n\'a pas de contact, veuillez en cr�er un avant de faire votre proposition commerciale
'; + print ''.$langs->trans('AddContact').''; + } + print '
'; + } + else + { + if ($selected) + { + require_once(DOL_DOCUMENT_ROOT ."/contact/class/contact.class.php"); + //$this->load_cache_contacts(); + //print $this->cache_contacts[$selected]; + $contact=new Contact($this->db); + $contact->fetch($selected); + print $contact->getFullName($langs); + } else { + print " "; + } + } + } + +/** + * Affiche formulaire de selection des tiers + * + * @param page Page + * @param selected Id contact pre-selectionne + * @param htmlname Nom du formulaire select + * @return void + */ + function form_thirdparty($page, $selected='', $htmlname='socid') + { + global $langs; + + if ($htmlname != "none") + { + print '
'; + print ''; + print ''; + print ''; + print ''; + print ''; + print '
'; + $num=$this->select_societes($selected , $htmlname); + print '
'; + } + else + { + if ($selected) + { + require_once(DOL_DOCUMENT_ROOT ."/societe/class/societe.class.php"); + $soc = new Societe($this->db); + $soc->fetch($selected); + print $soc->getNomUrl($langs); + } else { + print " "; + } + } + } + + /** + * Show form to select addresse + * + * @param page Page + * @param selected Id condition pre-selectionne + * @param htmlname Nom du formulaire select + * @param origin Origine de l'appel pour pouvoir creer un retour + * @param originid Id de l'origine + * @return void + * @deprecated + */ + function form_address($page, $selected='', $socid, $htmlname='address_id', $origin='', $originid='') + { + global $langs,$conf; + if ($htmlname != "none") + { + print '
'; + print ''; + print ''; + print ''; + print ''; + print '
'; + $this->select_address($selected, $socid, $htmlname, 1); + print ''; + $langs->load("companies"); + print '   '.$langs->trans("AddAddress").''; + print '
'; + } + else + { + if ($selected) + { + require_once(DOL_DOCUMENT_ROOT ."/societe/class/address.class.php"); + $address=new Address($this->db); + $result=$address->fetch_address($selected); + print ''.$address->label.''; + } + else + { + print " "; + } + } + } + + /** + * Retourne la liste des devises, dans la langue de l'utilisateur + * + * @param selected code devise pre-selectionne + * @param htmlname nom de la liste deroulante + * @return void + */ + function select_currency($selected='',$htmlname='currency_id') + { + print $this->selectcurrency($selected,$htmlname); + } + + /** + * Retourne la liste des devises, dans la langue de l'utilisateur + * + * @param selected code devise pre-selectionne + * @param htmlname nom de la liste deroulante + */ + function selectcurrency($selected='',$htmlname='currency_id') + { + global $conf,$langs,$user; + + $langs->load("dict"); + + $out=''; + $currencyArray=array(); + $label=array(); + + if ($selected=='euro' || $selected=='euros') $selected='EUR'; // Pour compatibilite + + $sql = "SELECT code_iso, label"; + $sql.= " FROM ".MAIN_DB_PREFIX."c_currencies"; + $sql.= " WHERE active = 1"; + $sql.= " ORDER BY code_iso ASC"; + + $resql=$this->db->query($sql); + if ($resql) + { + $out.= ''; + if ($user->admin) $out.= info_admin($langs->trans("YouCanChangeValuesForThisListFromDictionnarySetup"),1); + return $out; + } + else + { + dol_print_error($this->db); + } + } + + /** + * Output an HTML select vat rate + * + * @param htmlname Nom champ html + * @param selectedrate Forcage du taux tva pre-selectionne. Mettre '' pour aucun forcage. + * @param societe_vendeuse Objet societe vendeuse + * @param societe_acheteuse Objet societe acheteuse + * @param idprod Id product + * @param info_bits Miscellaneous information on line + * @param type ''=Unknown, 0=Product, 1=Service (Used if idprod not defined) + * Si vendeur non assujeti a TVA, TVA par defaut=0. Fin de regle. + * Si le (pays vendeur = pays acheteur) alors la TVA par defaut=TVA du produit vendu. Fin de regle. + * Si (vendeur et acheteur dans Communaute europeenne) et bien vendu = moyen de transports neuf (auto, bateau, avion), TVA par defaut=0 (La TVA doit etre paye par l'acheteur au centre d'impots de son pays et non au vendeur). Fin de regle. + * Si (vendeur et acheteur dans Communaute europeenne) et bien vendu autre que transport neuf alors la TVA par defaut=TVA du produit vendu. Fin de regle. + * Sinon la TVA proposee par defaut=0. Fin de regle. + * @deprecated + * @return void + */ + function select_tva($htmlname='tauxtva', $selectedrate='', $societe_vendeuse='', $societe_acheteuse='', $idprod=0, $info_bits=0, $type='') + { + print $this->load_tva($htmlname, $selectedrate, $societe_vendeuse, $societe_acheteuse, $idprod, $info_bits, $type); + } + + + /** + * Output an HTML select vat rate + * + * @param htmlname Nom champ html + * @param selectedrate Forcage du taux tva pre-selectionne. Mettre '' pour aucun forcage. + * @param societe_vendeuse Objet societe vendeuse + * @param societe_acheteuse Objet societe acheteuse + * @param idprod Id product + * @param info_bits Miscellaneous information on line (1 for NPR) + * @param type ''=Unknown, 0=Product, 1=Service (Used if idprod not defined) + * Si vendeur non assujeti a TVA, TVA par defaut=0. Fin de regle. + * Si le (pays vendeur = pays acheteur) alors la TVA par defaut=TVA du produit vendu. Fin de regle. + * Si (vendeur et acheteur dans Communaute europeenne) et bien vendu = moyen de transports neuf (auto, bateau, avion), TVA par defaut=0 (La TVA doit etre paye par l'acheteur au centre d'impots de son pays et non au vendeur). Fin de regle. + * Si (vendeur et acheteur dans Communaute europeenne) et bien vendu autre que transport neuf alors la TVA par defaut=TVA du produit vendu. Fin de regle. + * Sinon la TVA proposee par defaut=0. Fin de regle. + * @return void + */ + function load_tva($htmlname='tauxtva', $selectedrate='', $societe_vendeuse='', $societe_acheteuse='', $idprod=0, $info_bits=0, $type='') + { + global $langs,$conf,$mysoc; + + $return=''; + $txtva=array(); + $libtva=array(); + $nprtva=array(); + + // Define defaultnpr and defaultttx + $defaultnpr=($info_bits & 0x01); + $defaultnpr=(preg_match('/\*/',$selectedrate) ? 1 : $defaultnpr); + $defaulttx=str_replace('*','',$selectedrate); + + // Check parameters + if (is_object($societe_vendeuse) && ! $societe_vendeuse->country_code) + { + if ($societe_vendeuse->id == $mysoc->id) + { + $return.= ''.$langs->trans("ErrorYourCountryIsNotDefined").''; + } + else + { + $return.= ''.$langs->trans("ErrorSupplierCountryIsNotDefined").''; + } + return $return; + } + + //var_dump($societe_acheteuse); + //print "name=$name, selectedrate=$selectedrate, seller=".$societe_vendeuse->country_code." buyer=".$societe_acheteuse->country_code." buyer is company=".$societe_acheteuse->isACompany()." idprod=$idprod, info_bits=$info_bits type=$type"; + //exit; + + // Get list of all VAT rates to show + // First we defined code_pays to use to find list + if (is_object($societe_vendeuse)) + { + $code_pays="'".$societe_vendeuse->country_code."'"; + } + else + { + $code_pays="'".$mysoc->country_code."'"; // Pour compatibilite ascendente + } + if (! empty($conf->global->SERVICE_ARE_ECOMMERCE_200238EC)) // If option to have vat for end customer for services is on + { + if (! $societe_vendeuse->isInEEC() && $societe_acheteuse->isInEEC() && ! $societe_acheteuse->isACompany()) + { + // We also add the buyer + if (is_numeric($type)) + { + if ($type == 1) // We know product is a service + { + $code_pays.=",'".$societe_acheteuse->country_code."'"; + } + } + else if (! $idprod) // We don't know type of product + { + $code_pays.=",'".$societe_acheteuse->country_code."'"; + } + else + { + $prodstatic=new Product($this->db); + $prodstatic->fetch($idprod); + if ($prodstatic->type == 1) // We know product is a service + { + $code_pays.=",'".$societe_acheteuse->country_code."'"; + } + } + } + } + // Now we get list + $sql = "SELECT DISTINCT t.taux, t.recuperableonly"; + $sql.= " FROM ".MAIN_DB_PREFIX."c_tva as t, ".MAIN_DB_PREFIX."c_pays as p"; + $sql.= " WHERE t.fk_pays = p.rowid"; + $sql.= " AND t.active = 1"; + $sql.= " AND p.code in (".$code_pays.")"; + $sql.= " ORDER BY t.taux ASC, t.recuperableonly ASC"; + + $resql=$this->db->query($sql); + if ($resql) + { + $num = $this->db->num_rows($resql); + if ($num) + { + for ($i = 0; $i < $num; $i++) + { + $obj = $this->db->fetch_object($resql); + $txtva[$i] = $obj->taux; + $libtva[$i] = $obj->taux.'%'; + $nprtva[$i] = $obj->recuperableonly; + } + } + else + { + $return.= ''.$langs->trans("ErrorNoVATRateDefinedForSellerCountry",$code_pays).''; + } + } + else + { + $return.= ''.$this->db->error().''; + } + + // Definition du taux a pre-selectionner (si defaulttx non force et donc vaut -1 ou '') + if ($defaulttx < 0 || dol_strlen($defaulttx) == 0) + { + $defaulttx=get_default_tva($societe_vendeuse,$societe_acheteuse,$idprod); + $defaultnpr=get_default_npr($societe_vendeuse,$societe_acheteuse,$idprod); + } + + // Si taux par defaut n'a pu etre determine, on prend dernier de la liste. + // Comme ils sont tries par ordre croissant, dernier = plus eleve = taux courant + if ($defaulttx < 0 || dol_strlen($defaulttx) == 0) + { + $defaulttx = $txtva[count($txtva)-1]; + } + + $nbdetaux = count($txtva); + if ($nbdetaux > 0) + { + $return.= ''; + } + + return $return; + } + + + /** + * Show a HTML widget to input a date or combo list for day, month, years and optionnaly hours and minutes + * Fields are preselected with : + * - set_time date (Local PHP server timestamps or date format YYYY-MM-DD or YYYY-MM-DD HH:MM) + * - local date of PHP server if set_time is '' + * - Empty (fields empty) if set_time is -1 (in this case, parameter empty must also have value 1) + * + * @param set_time Pre-selected date (must be a local PHP server timestamp) + * @param prefix Prefix for fields name + * @param h 1=Show also hours + * @param m 1=Show also minutes + * @param empty 0=Fields required, 1=Empty input is allowed + * @param form_name Form name. Used by popup dates. + * @param d 1=Show days, month, years + * @param addnowbutton Add a button "Now" + * @param nooutput Do not output html string but return it + * @param disabled Disable input fields + * @param fullday When a checkbox with this html name is on, hour and day are set with 00:00 or 23:59 + * @return nothing or string if nooutput is 1 + */ + function select_date($set_time='', $prefix='re', $h=0, $m=0, $empty=0, $form_name="", $d=1, $addnowbutton=0, $nooutput=0, $disabled=0, $fullday='') + { + global $conf,$langs; + + $retstring=''; + + if($prefix=='') $prefix='re'; + if($h == '') $h=0; + if($m == '') $m=0; + if($empty == '') $empty=0; + + if (! $set_time && $empty == 0) $set_time = dol_now('tzuser'); + + // Analysis of the pre-selection date + if (preg_match('/^([0-9]+)\-([0-9]+)\-([0-9]+)\s?([0-9]+)?:?([0-9]+)?/',$set_time,$reg)) + { + // Date format 'YYYY-MM-DD' or 'YYYY-MM-DD HH:MM:SS' + $syear = $reg[1]; + $smonth = $reg[2]; + $sday = $reg[3]; + $shour = $reg[4]; + $smin = $reg[5]; + } + elseif (strval($set_time) != '' && $set_time != -1) + { + // set_time est un timestamps (0 possible) + $syear = dol_print_date($set_time, "%Y"); + $smonth = dol_print_date($set_time, "%m"); + $sday = dol_print_date($set_time, "%d"); + $shour = dol_print_date($set_time, "%H"); + $smin = dol_print_date($set_time, "%M"); + } + else + { + // Date est '' ou vaut -1 + $syear = ''; + $smonth = ''; + $sday = ''; + $shour = ''; + $smin = ''; + } + + if ($d) + { + // Show date with popup + if ($conf->use_javascript_ajax && (empty($conf->global->MAIN_POPUP_CALENDAR) || $conf->global->MAIN_POPUP_CALENDAR != "none")) + { + //print "e".$set_time." t ".$conf->format_date_short; + if (strval($set_time) != '' && $set_time != -1) + { + //$formated_date=dol_print_date($set_time,$conf->format_date_short); + $formated_date=dol_print_date($set_time,$langs->trans("FormatDateShort")); // FormatDateShort for dol_print_date/FormatDateShortJava that is same for javascript + } + + // Calendrier popup version eldy + if (empty($conf->global->MAIN_POPUP_CALENDAR) || $conf->global->MAIN_POPUP_CALENDAR == "eldy") + { + // Zone de saisie manuelle de la date + $retstring.='trans("FormatDateShortJava").'\'); "'; // FormatDateShort for dol_print_date/FormatDateShortJava that is same for javascript + $retstring.='>'; + + // Icone calendrier + if (! $disabled) + { + $retstring.=''; + } + else $retstring.=''; + + $retstring.=''."\n"; + $retstring.=''."\n"; + $retstring.=''."\n"; + } + else + { + print "Bad value of calendar"; + } + } + + // Show date with combo selects + if (empty($conf->use_javascript_ajax) || $conf->global->MAIN_POPUP_CALENDAR == "none") + { + // Day + $retstring.=''; + + if ($empty || $set_time == -1) + { + $retstring.=''; + } + + for ($day = 1 ; $day <= 31; $day++) + { + if ($day == $sday) + { + $retstring.=""; + } + + $retstring.=""; + + $retstring.=''; + if ($empty || $set_time == -1) + { + $retstring.=''; + } + + // Month + for ($month = 1 ; $month <= 12 ; $month++) + { + $retstring.='"; + } + $retstring.=""; + + // Year + if ($empty || $set_time == -1) + { + $retstring.=''; + } + else + { + $retstring.=''; + + for ($year = $syear - 5; $year < $syear + 10 ; $year++) + { + if ($year == $syear) + { + $retstring.=""; + } + $retstring.="\n"; + } + } + } + + if ($d && $h) $retstring.=' '; + + if ($h) + { + // Show hour + $retstring.=''; + if ($empty) $retstring.=''; + for ($hour = 0; $hour < 24; $hour++) + { + if (dol_strlen($hour) < 2) + { + $hour = "0" . $hour; + } + if ($hour == $shour) + { + $retstring.=""; + } + else + { + $retstring.=""; + } + } + $retstring.=""; + $retstring.="H\n"; + } + + if ($m) + { + // Show minutes + $retstring.=''; + if ($empty) $retstring.=''; + for ($min = 0; $min < 60 ; $min++) + { + if (dol_strlen($min) < 2) + { + $min = "0" . $min; + } + if ($min == $smin) + { + $retstring.=""; + } + else + { + $retstring.=""; + } + } + $retstring.=""; + $retstring.="M\n"; + } + + // Add a "Now" button + if ($conf->use_javascript_ajax && $addnowbutton) + { + // Script which will be inserted in the OnClick of the "Now" button + $reset_scripts = ""; + + // Generate the date part, depending on the use or not of the javascript calendar + if (empty($conf->global->MAIN_POPUP_CALENDAR) || $conf->global->MAIN_POPUP_CALENDAR == "eldy") + { + $base=DOL_URL_ROOT.'/core/lib/'; + $reset_scripts .= 'resetDP(\''.$base.'\',\''.$prefix.'\',\''.$langs->trans("FormatDateShortJava").'\',\''.$langs->defaultlang.'\');'; + } + else + { + $reset_scripts .= 'this.form.elements[\''.$prefix.'day\'].value=formatDate(new Date(), \'d\'); '; + $reset_scripts .= 'this.form.elements[\''.$prefix.'month\'].value=formatDate(new Date(), \'M\'); '; + $reset_scripts .= 'this.form.elements[\''.$prefix.'year\'].value=formatDate(new Date(), \'yyyy\'); '; + } + // Generate the hour part + if ($h) + { + if ($fullday) $reset_scripts .= " if (jQuery('#fullday:checked').val() == null) {"; + $reset_scripts .= 'this.form.elements[\''.$prefix.'hour\'].value=formatDate(new Date(), \'HH\'); '; + if ($fullday) $reset_scripts .= ' } '; + } + // Generate the minute part + if ($m) + { + if ($fullday) $reset_scripts .= " if (jQuery('#fullday:checked').val() == null) {"; + $reset_scripts .= 'this.form.elements[\''.$prefix.'min\'].value=formatDate(new Date(), \'mm\'); '; + if ($fullday) $reset_scripts .= ' } '; + } + // If reset_scripts is not empty, print the button with the reset_scripts in OnClick + if ($reset_scripts) + { + $retstring.=' '; + } + } + + if (! empty($nooutput)) return $retstring; + + print $retstring; + return; + } + + /** + * Function to show a form to select a duration on a page + * + * @param string $prefix prefix + * @param int $iSecond Default preselected duration (number of seconds) + * @param int $disabled Disable the combo box + * @return void + */ + function select_duration($prefix,$iSecond='',$disabled=0) + { + if ($iSecond) + { + require_once(DOL_DOCUMENT_ROOT."/core/lib/date.lib.php"); + + $hourSelected = convertSecondToTime($iSecond,'hour'); + $minSelected = convertSecondToTime($iSecond,'min'); + } + + print '"; + print "H  "; + print '"; + print "M "; + } + + + /** + * Show a select form from an array + * + * @param htmlname Name of html select area + * @param array Array with key+value + * @param id Preselected key + * @param show_empty 1 si il faut ajouter une valeur vide dans la liste, 0 sinon + * @param key_in_label 1 pour afficher la key dans la valeur "[key] value" + * @param value_as_key 1 to use value as key + * @param option Valeur de l'option en fonction du type choisi + * @param translate Translate and encode value + * @param maxlen Length maximum for labels + * @param disabled Html select box is disabled + * @return string HTML select string + */ + function selectarray($htmlname, $array, $id='', $show_empty=0, $key_in_label=0, $value_as_key=0, $option='', $translate=0, $maxlen=0, $disabled=0) + { + global $langs; + + $out='"; + return $out; + } + + /** + * Show a select form from an array + * + * @deprecated Use selectarray instead + * @return void + */ + function select_array($htmlname, $array, $id='', $show_empty=0, $key_in_label=0, $value_as_key=0, $option='', $translate=0, $maxlen=0) + { + print $this->selectarray($htmlname, $array, $id, $show_empty, $key_in_label, $value_as_key, $option, $translate, $maxlen); + } + + + /** + * Return an html string with a select combo box to choose yes or no + * + * @param string $name Name of html select field + * @param string $value Pre-selected value + * @param int $option 0 return yes/no, 1 return 1/0 + * @param bool $disabled true or false + * @return mixed See option + */ + function selectyesno($htmlname,$value='',$option=0,$disabled=false) + { + global $langs; + + $yes="yes"; $no="no"; + + if ($option) + { + $yes="1"; + $no="0"; + } + + $disabled = ($disabled ? ' disabled="disabled"' : ''); + + $resultyesno = ''."\n"; + return $resultyesno; + } + + + + /** + * Return list of export templates + * + * @param selected Id modele pre-selectionne + * @param htmlname Nom de la zone select + * @param type Type des modeles recherches + * @param useempty Affiche valeur vide dans liste + * @return void + */ + function select_export_model($selected='',$htmlname='exportmodelid',$type='',$useempty=0) + { + + $sql = "SELECT rowid, label"; + $sql.= " FROM ".MAIN_DB_PREFIX."export_model"; + $sql.= " WHERE type = '".$type."'"; + $sql.= " ORDER BY rowid"; + $result = $this->db->query($sql); + if ($result) + { + print '"; + } + else { + dol_print_error($this->db); + } + } + + /** + * Return a HTML area with the reference of object and a navigation bar for a business object + * To add a particular filter on select, you must set $object->next_prev_filter to SQL criteria. + * + * @param Object $object Object to show + * @param int $paramid Name of parameter to use to name the id into the URL link + * @param string $morehtml More html content to output just before the nav bar + * @param int $shownav Show Condition (navigation is shown if value is 1) + * @param int $fieldid Nom du champ en base a utiliser pour select next et previous + * @param string $fieldref Nom du champ objet ref (object->ref) a utiliser pour select next et previous + * @param string $morehtmlref Code html supplementaire a afficher apres ref + * @param string $moreparam More param to add in nav link url. + * @return tring Portion HTML avec ref + boutons nav + */ + function showrefnav($object,$paramid,$morehtml='',$shownav=1,$fieldid='rowid',$fieldref='ref',$morehtmlref='',$moreparam='') + { + $ret=''; + + //print "paramid=$paramid,morehtml=$morehtml,shownav=$shownav,$fieldid,$fieldref,$morehtmlref,$moreparam"; + $object->load_previous_next_ref((isset($object->next_prev_filter)?$object->next_prev_filter:''),$fieldid); + $previous_ref = $object->ref_previous?''.img_previous().'':''; + $next_ref = $object->ref_next?''.img_next().'':''; + + //print "xx".$previous_ref."x".$next_ref; + if ($previous_ref || $next_ref || $morehtml) { + $ret.=''; + $ret.='
'; + } + + $ret.=$object->$fieldref; + if ($morehtmlref) + { + $ret.=' '.$morehtmlref; + } + + if ($morehtml) + { + $ret.=''.$morehtml; + } + if ($shownav && ($previous_ref || $next_ref)) + { + $ret.=''.$previous_ref.''.$next_ref; + } + if ($previous_ref || $next_ref || $morehtml) + { + $ret.='
'; + } + return $ret; + } + + + /** + * Return HTML code to output a barcode + * + * @param Object &$object Object containing data to retrieve file name + * @param int $width Width of photo + * @return string HTML code to output barcode + */ + function showbarcode(&$object,$width=100) + { + global $conf; + + if (empty($object->barcode)) return ''; + + // Complete object if not complete + if (empty($object->barcode_type_code) || empty($object->barcode_type_coder)) + { + $object->fetch_barcode(); + } + + // Barcode image + $url=DOL_URL_ROOT.'/viewimage.php?modulepart=barcode&generator='.urlencode($object->barcode_type_coder).'&code='.urlencode($object->barcode).'&encoding='.urlencode($object->barcode_type_code); + $out =''; + $out.=''; + return $out; + } + + /** + * Return HTML code to output a photo + * + * @param string $modulepart Key to define module concerned ('societe', 'userphoto', 'memberphoto') + * @param Object $object Object containing data to retrieve file name + * @param int $width Width of photo + * @return string HTML code to output photo + */ + function showphoto($modulepart,$object,$width=100) + { + global $conf; + + $ret='';$dir='';$file='';$altfile='';$email=''; + + if ($modulepart=='societe') + { + $dir=$conf->societe->dir_output; + $smallfile=$object->logo; + $smallfile=preg_replace('/(\.png|\.gif|\.jpg|\.jpeg|\.bmp)/i','_small\\1',$smallfile); + if ($object->logo) $file=$object->id.'/logos/thumbs/'.$smallfile; + } + else if ($modulepart=='userphoto') + { + $dir=$conf->user->dir_output; + if ($object->photo) $file=get_exdir($object->id,2).$object->photo; + if (! empty($conf->global->MAIN_OLD_IMAGE_LINKS)) $altfile=$object->id.".jpg"; // For backward compatibility + $email=$object->email; + } + else if ($modulepart=='memberphoto') + { + $dir=$conf->adherent->dir_output; + if ($object->photo) $file=get_exdir($object->id,2).'photos/'.$object->photo; + if (! empty($conf->global->MAIN_OLD_IMAGE_LINKS)) $altfile=$object->id.".jpg"; // For backward compatibility + $email=$object->email; + } + + if ($dir) + { + $cache='0'; + if ($file && file_exists($dir."/".$file)) + { + // TODO Link to large image + $ret.=''; + $ret.=''; + $ret.=''; + } + else if ($altfile && file_exists($dir."/".$altfile)) + { + $ret.=''; + $ret.=''; + $ret.=''; + } + else + { + if ($conf->gravatar->enabled && $email) + { + global $dolibarr_main_url_root; + $ret.=''; + $ret.='Photo found on Gravatar'; + } + else + { + $ret.='No photo'; + } + } + } + else dol_print_error('','Call of showphoto with wrong parameters'); + + /* Disabled. lightbox seems to not work. I don't know why. + $ret.="\n\n"; + + $ret.="\n\n"; + */ + + return $ret; + } + + /** + * Return select list of groups + * + * @param string $selected Id group preselected + * @param string $htmlname Field name in form + * @param int $show_empty 0=liste sans valeur nulle, 1=ajoute valeur inconnue + * @param string $exclude Array list of groups id to exclude + * @param int $disabled If select list must be disabled + * @param string $include Array list of groups id to include + * @param int $enableonly Array list of groups id to be enabled. All other must be disabled + * @param int $force_entity Possibility to force entity + * @return void + */ + function select_dolgroups($selected='',$htmlname='groupid',$show_empty=0,$exclude='',$disabled=0,$include='',$enableonly='',$force_entity='') + { + global $conf,$user,$langs; + + // Permettre l'exclusion de groupes + if (is_array($exclude)) $excludeGroups = implode("','",$exclude); + // Permettre l'inclusion de groupes + if (is_array($include)) $includeGroups = implode("','",$include); + + $out=''; + + // On recherche les groupes + $sql = "SELECT ug.rowid, ug.nom "; + if(! empty($conf->multicompany->enabled) && $conf->entity == 1 && $user->admin && ! $user->entity) + { + $sql.= ", e.label"; + } + $sql.= " FROM ".MAIN_DB_PREFIX."usergroup as ug "; + if(! empty($conf->multicompany->enabled) && $conf->entity == 1 && $user->admin && ! $user->entity) + { + $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."entity as e on e.rowid=ug.entity"; + if ($force_entity) $sql.= " WHERE ug.entity IN (0,".$force_entity.")"; + else $sql.= " WHERE ug.entity IS NOT NULL"; + } + else + { + $sql.= " WHERE ug.entity IN (0,".$conf->entity.")"; + } + if (is_array($exclude) && $excludeGroups) $sql.= " AND ug.rowid NOT IN ('".$excludeGroups."')"; + if (is_array($include) && $includeGroups) $sql.= " AND ug.rowid IN ('".$includeGroups."')"; + $sql.= " ORDER BY ug.nom ASC"; + + dol_syslog("Form::select_dolgroups sql=".$sql); + $resql=$this->db->query($sql); + if ($resql) + { + $num = $this->db->num_rows($resql); + $i = 0; + if ($num) + { + $out.= ''; + $out.= ''; + } + $out.= ''; + } + else + { + dol_print_error($this->db); + } + + return $out; + } + +} + +?> diff --git a/htdocs/core/class/html.formsocialcontrib.class.php b/htdocs/core/class/html.formsocialcontrib.class.php index 02de9f48a9f..c5d86f2a85b 100644 --- a/htdocs/core/class/html.formsocialcontrib.class.php +++ b/htdocs/core/class/html.formsocialcontrib.class.php @@ -16,7 +16,7 @@ */ /** - * \file htdocs/core/class/html.form.class.php + * \file htdocs/core/class/html.formsocialcontrib.class.php * \ingroup core * \brief File of class with all html predefined components */ @@ -30,6 +30,17 @@ class FormSocialContrib var $db; var $error; + + /** + * Constructor + * + * @param DoliDB $db Database handler + */ + public function __construct($db) + { + $this->db = $db; + } + /** * Return list of social contributions. * Use mysoc->country_id or mysoc->country_code so they must be defined.