diff --git a/ChangeLog b/ChangeLog index 6c13b73daf1..dafb9ae8fa1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -5,6 +5,7 @@ English Dolibarr ChangeLog ***** ChangeLog for 3.7 compared to 3.6.* ***** For users: +- New: Can add product into category from category card. - New: PDF event report show project and status of event. - New: Can filter on status on interventions. - New: Add help info of field type into dictionary of payment types. diff --git a/build.xml b/build.xml index fc267bf196e..570821a7c7b 100644 --- a/build.xml +++ b/build.xml @@ -1,6 +1,6 @@ - +fdfds diff --git a/htdocs/categories/categorie.php b/htdocs/categories/categorie.php index 52e352779ba..c74eefdc430 100644 --- a/htdocs/categories/categorie.php +++ b/htdocs/categories/categorie.php @@ -207,8 +207,7 @@ if (empty($reshook)) } else { - setEventMessage($cat->error,'errors'); - setEventMessage($cat->errors,'errors'); + setEventMessages($cat->error,$this->errors,'errors'); } } } @@ -628,7 +627,7 @@ function formCategory($db,$object,$typeid,$socid=0,$showclassifyform=1) // Form to add record into a category if ($showclassifyform) { - print '
'; + print ''; print ''; print ''; print ''; diff --git a/htdocs/categories/viewcat.php b/htdocs/categories/viewcat.php index 29ed8a5d6b8..14a63ffc837 100644 --- a/htdocs/categories/viewcat.php +++ b/htdocs/categories/viewcat.php @@ -38,6 +38,7 @@ $type=GETPOST('type'); $action=GETPOST('action'); $confirm=GETPOST('confirm'); $removeelem = GETPOST('removeelem','int'); +$elemid=GETPOST('elemid'); if ($id == "") { @@ -120,6 +121,33 @@ if ($user->rights->categorie->supprimer && $action == 'confirm_delete' && $confi } } +if ($type==0 && $elemid && $action == 'addintocategory' && ($user->rights->produit->creer || $user->rights->service->creer)) +{ + require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php'; + $newobject = new Product($db); + $result = $newobject->fetch($elemid); + $elementtype = 'product'; + + // TODO Add into categ + $result=$object->add_type($newobject,$elementtype); + if ($result >= 0) + { + setEventMessage($langs->trans("WasAddedSuccessfully",$newobject->ref)); + } + else + { + if ($cat->error == 'DB_ERROR_RECORD_ALREADY_EXISTS') + { + setEventMessage($langs->trans("ObjectAlreadyLinkedToCategory"),'warnings'); + } + else + { + setEventMessages($object->error,$object->errors,'errors'); + } + } + +} + /* @@ -144,6 +172,7 @@ dol_fiche_head($head, 'card', $title, 0, 'category'); /* * Confirmation suppression */ + if ($action == 'delete') { print $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id.'&type='.$type,$langs->trans('DeleteCategory'),$langs->trans('ConfirmDeleteCategory'),'confirm_delete'); @@ -251,10 +280,9 @@ else print "\n"; } -// List of products +// List of products or services (type is type of category) if ($object->type == 0) { - $prods = $object->getObjectsInCateg("product"); if ($prods < 0) { @@ -262,6 +290,29 @@ if ($object->type == 0) } else { + $showclassifyform=1; $typeid=0; + + // Form to add record into a category + if ($showclassifyform) + { + print '
'; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print '
'; + print $langs->trans("AddProductServiceIntoCategory").'  '; + print $form->select_produits('','elemid','',0,0,-1,2,'',1); + print ''; + print '
'; + print '
'; + } + print "
"; print "\n"; print '\n"; diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 4dece372561..e088f764040 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -1809,13 +1809,15 @@ function img_picto($titlealt, $picto, $options = '', $pictoisfullpath = false, $ } else { - // By default, we search $url/theme/$theme/img/$picto + // We forge fullpathpicto for image to $path/img/$picto. By default, we take DOL_URL_ROOT/theme/$conf->theme/img/$picto $url = DOL_URL_ROOT; $theme = $conf->theme; $path = 'theme/'.$theme; - if (! empty($conf->global->MAIN_OVERWRITE_THEME_RES)) $path = $conf->global->MAIN_OVERWRITE_THEME_RES.'/theme/'.$conf->global->MAIN_OVERWRITE_THEME_RES; - //if (! empty($conf->global->MAIN_FORCETHEMEDIR)) $path = preg_replace('/^\//', '', $conf->global->MAIN_FORCETHEMEDIR).'/'.$path; // TODO What if there is both FORCETHEMDIR and OVERWRITE_THEM_RES + if (! empty($conf->global->MAIN_OVERWRITE_THEME_PATH)) $path = $conf->global->MAIN_OVERWRITE_THEME_PATH.'/theme/'.$theme; // If the theme does not have the same name as the module + else if (! empty($conf->global->MAIN_OVERWRITE_THEME_RES)) $path = $conf->global->MAIN_OVERWRITE_THEME_RES.'/theme/'.$conf->global->MAIN_OVERWRITE_THEME_RES; // To allow an external module to overwrite image resources whatever is activated theme + else if (! empty($conf->modules_parts['theme']) && array_key_exists($theme, $conf->modules_parts['theme'])) $path = $theme.'/theme/'.$theme; // If the theme have the same name as the module + // If we ask an image into $url/$mymodule/img (instead of default path) if (preg_match('/^([^@]+)@([^@]+)$/i',$picto,$regs)) { @@ -1825,10 +1827,10 @@ function img_picto($titlealt, $picto, $options = '', $pictoisfullpath = false, $ // Clean parameters if (! preg_match('/(\.png|\.gif)$/i',$picto)) $picto .= '.png'; // If alt path are defined, define url where img file is, according to physical path - foreach ($conf->file->dol_document_root as $type => $dirroot) // ex: array(["main"]=>"/home/maindir/htdocs", ["alt0"]=>"/home/moddir/htdocs", ...) + foreach ($conf->file->dol_document_root as $type => $dirroot) // ex: array(["main"]=>"/home/maindir/htdocs", ["alt0"]=>"/home/moddir0/htdocs", ...) { if ($type == 'main') continue; - if (file_exists($dirroot.'/'.$path.'/img/'.$picto)) + if (file_exists($dirroot.'/'.$path.'/img/'.$picto)) // This need a lot of time, that's why enabling alternative dir like "custom" dir is not recommanded { $url=DOL_URL_ROOT.$conf->file->dol_url_root[$type]; break; @@ -4145,7 +4147,11 @@ function setEventMessages($mesg, $mesgs, $style='mesgs') { if (! in_array((string) $style, array('mesgs','warnings','errors'))) dol_print_error('','Bad parameter for setEventMessage'); if (empty($mesgs)) setEventMessage($mesg, $style); - else setEventMessage($mesgs, $style); + else + { + if (! empty($mesg) && ! in_array($mesg, $mesgs)) setEventMessage($mesg, $style); // Add message string if not already into array + setEventMessage($mesgs, $style); + } } /** diff --git a/htdocs/core/tpl/contacts.tpl.php b/htdocs/core/tpl/contacts.tpl.php index fda7aa00832..acc0cd6b502 100644 --- a/htdocs/core/tpl/contacts.tpl.php +++ b/htdocs/core/tpl/contacts.tpl.php @@ -1,6 +1,6 @@ - * Copyright (C) 2013 Laurent Destailleur +/* Copyright (C) 2012 Regis Houssin + * Copyright (C) 2013-2014 Laurent Destailleur * * 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 @@ -209,7 +209,7 @@ $userstatic=new User($db); ?> statut >= 0) echo ''; ?> -
+
 "> diff --git a/htdocs/langs/en_US/categories.lang b/htdocs/langs/en_US/categories.lang index fb9ad8a3b6d..3ee731f0824 100644 --- a/htdocs/langs/en_US/categories.lang +++ b/htdocs/langs/en_US/categories.lang @@ -111,3 +111,4 @@ ExtraFieldsCategories=Complementary attributes CategoriesSetup=Categories setup CategorieRecursiv=Link with parent category automatically CategorieRecursivHelp=If activated, product will also linked to parent category when adding into a subcategory +AddProductServiceIntoCategory=Add the following product/service \ No newline at end of file diff --git a/htdocs/product/price.php b/htdocs/product/price.php index 6971a5bb125..801573a316f 100644 --- a/htdocs/product/price.php +++ b/htdocs/product/price.php @@ -341,21 +341,23 @@ if ($isphoto) { print ''; // MultiPrix -if (! empty($conf->global->PRODUIT_MULTIPRICES)) { - if (! empty($socid)) { +if (! empty($conf->global->PRODUIT_MULTIPRICES)) +{ + if (! empty($socid)) + { $soc = new Societe($db); $soc->id = $socid; $soc->fetch($socid); print '
'; - if ($object->multiprices_base_type ["$soc->price_level"] == 'TTC') { + if ($object->multiprices_base_type["$soc->price_level"] == 'TTC') { print ''; // TVA - print ''; + print ''; } else { @@ -393,12 +396,12 @@ if (! empty($conf->global->PRODUIT_MULTIPRICES)) { print ''; if ($object->multiprices_base_type ["$i"] == 'TTC') { - print ''; diff --git a/htdocs/projet/class/task.class.php b/htdocs/projet/class/task.class.php index 13360110310..62052ebaa29 100644 --- a/htdocs/projet/class/task.class.php +++ b/htdocs/projet/class/task.class.php @@ -285,8 +285,8 @@ class Task extends CommonObject $sql.= " description=".(isset($this->description)?"'".$this->db->escape($this->description)."'":"null").","; $sql.= " duration_effective=".(isset($this->duration_effective)?$this->duration_effective:"null").","; $sql.= " planned_workload=".(isset($this->planned_workload)?$this->planned_workload:"0").","; - $sql.= " dateo=".($this->date_start!=''?$this->db->idate($this->date_start):'null').","; - $sql.= " datee=".($this->date_end!=''?$this->db->idate($this->date_end):'null').","; + $sql.= " dateo=".($this->date_start!=''?"'".$this->db->idate($this->date_start)."'":'null').","; + $sql.= " datee=".($this->date_end!=''?"'".$this->db->idate($this->date_end)."'":'null').","; $sql.= " progress=".$this->progress.","; $sql.= " rang=".((!empty($this->rang))?$this->rang:"0"); $sql.= " WHERE rowid=".$this->id; diff --git a/htdocs/projet/contact.php b/htdocs/projet/contact.php index b570d5720d9..bc8f5b3098c 100644 --- a/htdocs/projet/contact.php +++ b/htdocs/projet/contact.php @@ -1,6 +1,6 @@ - * Copyright (C) 2012 Laurent Destailleur +/* Copyright (C) 2010 Regis Houssin + * Copyright (C) 2012-2014 Laurent Destailleur * * 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 diff --git a/htdocs/projet/tasks.php b/htdocs/projet/tasks.php index d1d5092628e..7aea9314e5a 100644 --- a/htdocs/projet/tasks.php +++ b/htdocs/projet/tasks.php @@ -1,6 +1,6 @@ - * Copyright (C) 2004-2013 Laurent Destailleur + * Copyright (C) 2004-2014 Laurent Destailleur * Copyright (C) 2005-2012 Regis Houssin * * This program is free software; you can redistribute it and/or modify diff --git a/htdocs/projet/tasks/task.php b/htdocs/projet/tasks/task.php index 8e5b664759e..da200d565b6 100644 --- a/htdocs/projet/tasks/task.php +++ b/htdocs/projet/tasks/task.php @@ -58,9 +58,11 @@ $projectstatic = new Project($db); // fetch optionals attributes and labels $extralabels=$extrafields->fetch_name_optionals_label($object->table_element); + + /* * Actions -*/ + */ if ($action == 'update' && ! $_POST["cancel"] && $user->rights->projet->creer) { @@ -91,11 +93,10 @@ if ($action == 'update' && ! $_POST["cancel"] && $user->rights->projet->creer) $ret = $extrafields->setOptionalsFromPost($extralabels,$object); $result=$object->update($user); - + if ($result < 0) { - setEventMessage($object->error,'errors'); - setEventMessage($object->errors,'errors'); + setEventMessages($object->error,$object->errors,'errors'); } } else @@ -121,8 +122,7 @@ if ($action == 'confirm_delete' && $confirm == "yes" && $user->rights->projet->s } else { - $langs->load("errors"); - setEventMessage($langs->trans($object->error), 'errors'); + setEventMessages($object->error,$object->errors,'errors'); $action=''; } } diff --git a/htdocs/theme/eldy/style.css.php b/htdocs/theme/eldy/style.css.php index 5b0e64525f6..a7e60a6cdcd 100644 --- a/htdocs/theme/eldy/style.css.php +++ b/htdocs/theme/eldy/style.css.php @@ -105,7 +105,7 @@ $colorbacklineimpairhover=(230+round(($isred+$isgreen+$isblue)/9)).','.(230+roun $colorbacklinepair1='255,255,255'; // line pair $colorbacklinepair2='255,255,255'; // line pair $colorbacklinepairhover=(230+round(($isred+$isgreen+$isblue)/9)).','.(230+round(($isred+$isgreen+$isblue)/9)).','.(230+round(($isred+$isgreen+$isblue)/9)); -$colorbackbody='#fcfcfc'; +$colorbackbody='#f9f9f9'; $colortext='40,40,40'; $fontsize='12'; $fontsizesmaller='11'; @@ -123,8 +123,7 @@ if (empty($conf->global->THEME_ELDY_ENABLE_PERSONALIZED)) $conf->global->THEME_ELDY_BACKTABCARD2='210,210,210'; // card $conf->global->THEME_ELDY_BACKTABCARD1='234,234,234'; $conf->global->THEME_ELDY_BACKTABACTIVE='234,234,234'; - //$conf->global->THEME_ELDY_BACKBODY='#ffffff url('.$img_head.') 0 0 no-repeat;'; - $conf->global->THEME_ELDY_BACKBODY='#fcfcfc;'; + $conf->global->THEME_ELDY_BACKBODY='#f9f9f9;'; $conf->global->THEME_ELDY_LINEPAIR1='242,242,242'; $conf->global->THEME_ELDY_LINEPAIR2='248,248,248'; $conf->global->THEME_ELDY_LINEPAIRHOVER='238,246,252'; @@ -820,7 +819,7 @@ foreach($mainmenuusedarray as $val) .bodylogin { - background: #f9f9f9; + background: #f0f0f0; } .login_vertical_align { padding: 10px;
'.$langs->trans("ProductsAndServices")."
' . $langs->trans("SellingPrice") . '' . price($object->multiprices_ttc ["$soc->price_level"]); } else { print '' . price($object->multiprices ["$soc->price_level"]); } - if ($object->multiprices_base_type ["$soc->price_level"]) { + if ($object->multiprices_base_type["$soc->price_level"]) { print ' ' . $langs->trans($object->multiprices_base_type ["$soc->price_level"]); } else { print ' ' . $langs->trans($object->price_base_type); @@ -364,15 +366,16 @@ if (! empty($conf->global->PRODUIT_MULTIPRICES)) { // Prix mini print '
' . $langs->trans("MinPrice") . ''; - if ($object->multiprices_base_type ["$soc->price_level"] == 'TTC') { - print price($object->multiprices_min_ttc ["$soc->price_level"]) . ' ' . $langs->trans($object->multiprices_base_type ["$soc->price_level"]); + if ($object->multiprices_base_type["$soc->price_level"] == 'TTC') + { + print price($object->multiprices_min_ttc["$soc->price_level"]) . ' ' . $langs->trans($object->multiprices_base_type["$soc->price_level"]); } else { - print price($object->multiprices_min ["$soc->price_level"]) . ' ' . $langs->trans($object->multiprices_base_type ["$soc->price_level"]); + print price($object->multiprices_min["$soc->price_level"]) . ' ' . $langs->trans(empty($object->multiprices_base_type["$soc->price_level"])?'HT':$object->multiprices_base_type["$soc->price_level"]); } print '
' . $langs->trans("VATRate") . '' . vatrate($object->multiprices_tva_tx ["$soc->price_level"], true) . '
' . $langs->trans("VATRate") . '' . vatrate($object->multiprices_tva_tx["$soc->price_level"], true) . '
' . price($object->multiprices_ttc ["$i"]); + print '' . price($object->multiprices_ttc["$i"]); } else { - print '' . price($object->multiprices ["$i"]); + print '' . price($object->multiprices["$i"]); } - if ($object->multiprices_base_type ["$i"]) { + if ($object->multiprices_base_type["$i"]) { print ' ' . $langs->trans($object->multiprices_base_type ["$i"]); } else { print ' ' . $langs->trans($object->price_base_type); @@ -408,9 +411,9 @@ if (! empty($conf->global->PRODUIT_MULTIPRICES)) { // Prix mini print '
' . $langs->trans("MinPrice") . ' ' . $i . ''; if ($object->multiprices_base_type ["$i"] == 'TTC') { - print price($object->multiprices_min_ttc ["$i"]) . ' ' . $langs->trans($object->multiprices_base_type ["$i"]); + print price($object->multiprices_min_ttc["$i"]) . ' ' . $langs->trans($object->multiprices_base_type["$i"]); } else { - print price($object->multiprices_min ["$i"]) . ' ' . $langs->trans($object->multiprices_base_type ["$i"]); + print price($object->multiprices_min["$i"]) . ' ' . $langs->trans(empty($object->multiprices_base_type["$i"])?'HT':$object->multiprices_base_type["$i"]); } print '