From a9289de6168731664503a41883f55e7635d05740 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur <eldy@destailleur.fr> Date: Mon, 13 Jul 2015 11:22:18 +0200 Subject: [PATCH] Several fixes. Fix #2927 --- htdocs/commande/card.php | 12 +++-- htdocs/core/lib/pdf.lib.php | 4 +- .../expedition/doc/pdf_merou.modules.php | 4 +- htdocs/expedition/card.php | 36 ++++++++----- htdocs/expedition/class/expedition.class.php | 31 +++++++---- htdocs/expedition/shipment.php | 54 ++++++++++++++----- htdocs/install/mysql/migration/repair.sql | 1 + htdocs/langs/en_US/companies.lang | 1 + htdocs/langs/en_US/stocks.lang | 2 +- htdocs/product/class/productbatch.class.php | 17 +++--- htdocs/projet/card.php | 2 +- 11 files changed, 109 insertions(+), 55 deletions(-) diff --git a/htdocs/commande/card.php b/htdocs/commande/card.php index 82cf9bf168d..5cc0c6db9ce 100644 --- a/htdocs/commande/card.php +++ b/htdocs/commande/card.php @@ -1950,7 +1950,7 @@ if ($action == 'create' && $user->rights->commande->creer) print '<table class="nobordernopadding" width="100%"><tr><td>'; print $langs->trans('AvailabilityPeriod'); print '</td>'; - if ($action != 'editavailability' && $object->brouillon) + if ($action != 'editavailability') print '<td align="right"><a href="' . $_SERVER["PHP_SELF"] . '?action=editavailability&id=' . $object->id . '">' . img_edit($langs->trans('SetAvailability'), 1) . '</a></td>'; print '</tr></table>'; print '</td><td colspan="3">'; @@ -1966,7 +1966,7 @@ if ($action == 'create' && $user->rights->commande->creer) print '<table class="nobordernopadding" width="100%"><tr><td>'; print $langs->trans('Source'); print '</td>'; - if ($action != 'editdemandreason' && ! empty($object->brouillon)) + if ($action != 'editdemandreason') print '<td align="right"><a href="' . $_SERVER["PHP_SELF"] . '?action=editdemandreason&id=' . $object->id . '">' . img_edit($langs->trans('SetDemandReason'), 1) . '</a></td>'; print '</tr></table>'; print '</td><td colspan="3">'; @@ -1975,14 +1975,15 @@ if ($action == 'create' && $user->rights->commande->creer) } else { $form->formInputReason($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->demand_reason_id, 'none'); } - // Removed because using dictionary is an admin feature, not a user feature. Ther is already the "star" to show info to admin users. + // Removed because using dictionary is an admin feature, not a user feature. There is already the "star" to show info to admin users. // This is to avoid too heavy screens and have an uniform look and feel for all screens. // print '</td><td>'; // print '<a href="'.DOL_URL_ROOT.'/admin/dict.php?id=22&origin=order&originid='.$object->id.'">'.$langs->trans("DictionarySource").'</a>'; print '</td></tr>'; // Project - if (! empty($conf->projet->enabled)) { + if (! empty($conf->projet->enabled)) + { $langs->load('projects'); print '<tr><td height="10">'; print '<table class="nobordernopadding" width="100%"><tr><td>'; @@ -2001,7 +2002,8 @@ if ($action == 'create' && $user->rights->commande->creer) print '</td></tr>'; } - if ($soc->outstanding_limit) { + if ($soc->outstanding_limit) + { // Outstanding Bill print '<tr><td>'; print $langs->trans('OutstandingBill'); diff --git a/htdocs/core/lib/pdf.lib.php b/htdocs/core/lib/pdf.lib.php index 6be81524373..d294bac5132 100644 --- a/htdocs/core/lib/pdf.lib.php +++ b/htdocs/core/lib/pdf.lib.php @@ -353,9 +353,9 @@ function pdf_build_address($outputlangs,$sourcecompany,$targetcompany='',$target if (empty($conf->global->MAIN_PDF_DISABLESOURCEDETAILS)) { // Phone - if ($sourcecompany->phone) $stringaddress .= ($stringaddress ? "\n" : '' ).$outputlangs->transnoentities("Phone").": ".$outputlangs->convToOutputCharset($sourcecompany->phone); + if ($sourcecompany->phone) $stringaddress .= ($stringaddress ? "\n" : '' ).$outputlangs->transnoentities("PhoneShort").": ".$outputlangs->convToOutputCharset($sourcecompany->phone); // Fax - if ($sourcecompany->fax) $stringaddress .= ($stringaddress ? "\n" : '' ).$outputlangs->transnoentities("Fax").": ".$outputlangs->convToOutputCharset($sourcecompany->fax); + if ($sourcecompany->fax) $stringaddress .= ($stringaddress ? ($sourcecompany->phone ? " - " : "\n") : '' ).$outputlangs->transnoentities("Fax").": ".$outputlangs->convToOutputCharset($sourcecompany->fax); // EMail if ($sourcecompany->email) $stringaddress .= ($stringaddress ? "\n" : '' ).$outputlangs->transnoentities("Email").": ".$outputlangs->convToOutputCharset($sourcecompany->email); // Web diff --git a/htdocs/core/modules/expedition/doc/pdf_merou.modules.php b/htdocs/core/modules/expedition/doc/pdf_merou.modules.php index f26d85615e5..3f4315f640c 100644 --- a/htdocs/core/modules/expedition/doc/pdf_merou.modules.php +++ b/htdocs/core/modules/expedition/doc/pdf_merou.modules.php @@ -1,9 +1,9 @@ <?php /* Copyright (C) 2005 Rodolphe Quiedeville <rodolphe@quiedeville.org> - * Copyright (C) 2005-2012 Laurent Destailleur <eldy@users.sourceforge.net> + * Copyright (C) 2005-2015 Laurent Destailleur <eldy@users.sourceforge.net> * Copyright (C) 2005-2011 Regis Houssin <regis.houssin@capnetworks.com> * Copyright (C) 2013 Florian Henry <florian.henry@open-concept.pro> - * Copyright (C) 2015 Marcos García <marcosgdf@gmail.com> + * Copyright (C) 2015 Marcos García <marcosgdf@gmail.com> * * 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/expedition/card.php b/htdocs/expedition/card.php index 90b4589470a..51a3bc51fbe 100644 --- a/htdocs/expedition/card.php +++ b/htdocs/expedition/card.php @@ -507,6 +507,8 @@ if ($action == 'create') print '<input type="hidden" name="entrepot_id" value="'.GETPOST('entrepot_id','int').'">'; } + dol_fiche_head(''); + print '<table class="border" width="100%">'; // Ref @@ -618,6 +620,8 @@ if ($action == 'create') print "</table>"; + dol_fiche_end(); + /* * Lignes de commandes */ @@ -838,7 +842,7 @@ if ($action == 'create') } else { - print '<td></td><td></td></tr>'; + print '<td></td><td></td></tr>'; // end line and start a new one for lot/serial $subj=0; print '<input name="idl'.$indiceAsked.'" type="hidden" value="'.$line->id.'">'; foreach ($product->stock_warehouse[$warehouse_id]->detail_batch as $dbatch) @@ -855,6 +859,7 @@ if ($action == 'create') $staticwarehouse->fetch($warehouse_id); print $staticwarehouse->getNomUrl(0).' / '; + print '<!-- Show details of lot -->'; print '<input name="batchl'.$indiceAsked.'_'.$subj.'" type="hidden" value="'.$dbatch->id.'">'; print $langs->trans("DetailBatchFormat", $dbatch->batch, dol_print_date($dbatch->eatby,"day"), dol_print_date($dbatch->sellby,"day"), $dbatch->qty); if ($defaultqty<=0) { @@ -1073,8 +1078,8 @@ else if ($id || $ref) // Weight print '<tr><td>'.$form->editfieldkey("Weight",'trueWeight',$object->trueWeight,$object,$user->rights->expedition->creer).'</td><td colspan="3">'; - if($action=='edittrueWeight') { - + if ($action=='edittrueWeight') + { print '<form name="settrueweight" action="'.$_SERVER["PHP_SELF"].'" method="post">'; print '<input name="action" value="settrueWeight" type="hidden">'; print '<input name="id" value="'.$object->id.'" type="hidden">'; @@ -1086,7 +1091,8 @@ else if ($id || $ref) print '</form>'; } - else { + else + { print $object->trueWeight; print ($object->trueWeight && $object->weight_units!='')?' '.measuring_units_string($object->weight_units,"weight"):''; } @@ -1107,8 +1113,8 @@ else if ($id || $ref) // Height print '<tr><td>'.$form->editfieldkey("Height",'trueHeight',$object->trueHeight,$object,$user->rights->expedition->creer).'</td><td colspan="3">'; - if($action=='edittrueHeight') { - + if($action=='edittrueHeight') + { print '<form name="settrueHeight" action="'.$_SERVER["PHP_SELF"].'" method="post">'; print '<input name="action" value="settrueHeight" type="hidden">'; print '<input name="id" value="'.$object->id.'" type="hidden">'; @@ -1120,7 +1126,8 @@ else if ($id || $ref) print '</form>'; } - else { + else + { print $object->trueHeight; print ($object->trueHeight && $object->height_units!='')?' '.measuring_units_string($object->height_units,"size"):''; @@ -1370,8 +1377,10 @@ else if ($id || $ref) else if (count($lines[$i]->details_entrepot) > 1) { $detail = ''; - foreach ($lines[$i]->details_entrepot as $detail_entrepot) { - if ($detail_entrepot->entrepot_id > 0) { + foreach ($lines[$i]->details_entrepot as $detail_entrepot) + { + if ($detail_entrepot->entrepot_id > 0) + { $entrepot = new Entrepot($db); $entrepot->fetch($detail_entrepot->entrepot_id); $detail.= $langs->trans("DetailWarehouseFormat",$entrepot->libelle,$detail_entrepot->qty_shipped).'<br/>'; @@ -1389,7 +1398,8 @@ else if ($id || $ref) { print '<td>'; $detail = ''; - foreach ($lines[$i]->detail_batch as $dbatch) { + foreach ($lines[$i]->detail_batch as $dbatch) + { $detail.= $langs->trans("DetailBatchFormat",$dbatch->batch,dol_print_date($dbatch->eatby,"day"),dol_print_date($dbatch->sellby,"day"),$dbatch->dluo_qty).'<br/>'; } print $form->textwithtooltip($langs->trans("DetailBatchNumber"),$detail); @@ -1413,7 +1423,7 @@ else if ($id || $ref) /* * Boutons actions - */ + */ if (($user->societe_id == 0) && ($action!='presend')) { @@ -1487,7 +1497,7 @@ else if ($id || $ref) /* * Documents generated - */ + */ if ($action != 'presend') { print '<table width="100%"><tr><td width="50%" valign="top">'; @@ -1521,7 +1531,7 @@ else if ($id || $ref) /* * Action presend - */ + */ //Select mail models is same action as presend if (GETPOST('modelselected')) { $action = 'presend'; diff --git a/htdocs/expedition/class/expedition.class.php b/htdocs/expedition/class/expedition.class.php index 28d61ca45f7..ab2a25e98c4 100644 --- a/htdocs/expedition/class/expedition.class.php +++ b/htdocs/expedition/class/expedition.class.php @@ -1234,23 +1234,34 @@ class Expedition extends CommonObject $this->total_localtax1+= $tabprice[9]; $this->total_localtax2+= $tabprice[10]; + $line->detail_batch = array(); + // Eat-by date - if (! empty($conf->productbatch->enabled)) { - /* test on conf at begining of file sometimes doesn't include expeditionbatch - * May be conf is not well initialized for dark reason - */ + if (! empty($conf->productbatch->enabled) && $obj->line_id > 0) + { require_once DOL_DOCUMENT_ROOT.'/expedition/class/expeditionbatch.class.php'; - if ($originline != $obj->fk_origin_line) + + $newdetailbatch = ExpeditionLineBatch::fetchAll($this->db,$obj->line_id); + if (is_array($newdetailbatch)) { - $line->detail_batch = ExpeditionLineBatch::fetchAll($this->db,$obj->line_id); - } else { - $line->detail_batch = array_merge($line->detail_batch,ExpeditionLineBatch::fetchAll($this->db,$obj->line_id)); + if ($originline != $obj->fk_origin_line) + { + $line->detail_batch = $newdetailbatch; + } + else + { + $line->detail_batch = array_merge($line->detail_batch, $newdetailbatch); + } } } - if ($originline != $obj->fk_origin_line) { + + if ($originline != $obj->fk_origin_line) + { $this->lines[$lineindex] = $line; $lineindex++; - } else { + } + else + { $line->total_ht += $tabprice[0]; $line->total_localtax1 += $tabprice[9]; $line->total_localtax2 += $tabprice[10]; diff --git a/htdocs/expedition/shipment.php b/htdocs/expedition/shipment.php index 1d8f8c7444d..42764223f3e 100644 --- a/htdocs/expedition/shipment.php +++ b/htdocs/expedition/shipment.php @@ -238,7 +238,6 @@ if ($id > 0 || ! empty($ref)) // Date print '<tr><td>'.$langs->trans('Date').'</td>'; print '<td colspan="2">'.dol_print_date($commande->date,'daytext').'</td>'; - print '<td width="50%">'.$langs->trans('Source').' : '.$commande->getLabelSource().'</td>'; print '</tr>'; // Delivery date planned @@ -265,9 +264,9 @@ if ($id > 0 || ! empty($ref)) } print '</td>'; // Note on several rows - print '<td rowspan="'.$nbrow.'" valign="top">'.$langs->trans('NotePublic').' :<br>'; - print nl2br($commande->note_public); - print '</td>'; + //print '<td rowspan="'.$nbrow.'" valign="top">'.$langs->trans('NotePublic').' :<br>'; + //print nl2br($commande->note_public); + //print '</td>'; print '</tr>'; // Shipping Method @@ -307,7 +306,7 @@ if ($id > 0 || ! empty($ref)) print '</td></tr>'; // Mode of payment - print '<tr><td height="10">'; + print '<tr><td>'; print '<table class="nobordernopadding" width="100%"><tr><td>'; print $langs->trans('PaymentMode'); print '</td>'; @@ -324,11 +323,42 @@ if ($id > 0 || ! empty($ref)) } print '</td></tr>'; + // Availability + print '<tr><td height="10">'; + print '<table class="nobordernopadding" width="100%"><tr><td>'; + print $langs->trans('AvailabilityPeriod'); + print '</td>'; + if ($action != 'editavailability') + print '<td align="right"><a href="' . $_SERVER["PHP_SELF"] . '?action=editavailability&id=' . $object->id . '">' . img_edit($langs->trans('SetAvailability'), 1) . '</a></td>'; + print '</tr></table>'; + print '</td><td colspan="3">'; + if ($action == 'editavailability') { + $form->form_availability($_SERVER['PHP_SELF'] . '?id=' . $commande->id, $commande->availability_id, 'availability_id', 1); + } else { + $form->form_availability($_SERVER['PHP_SELF'] . '?id=' . $commande->id, $commande->availability_id, 'none', 1); + } + print '</td></tr>'; + + // Source + print '<tr><td height="10">'; + print '<table class="nobordernopadding" width="100%"><tr><td>'; + print $langs->trans('Source'); + print '</td>'; + if ($action != 'editdemandreason') + print '<td align="right"><a href="' . $_SERVER["PHP_SELF"] . '?action=editdemandreason&id=' . $object->id . '">' . img_edit($langs->trans('SetDemandReason'), 1) . '</a></td>'; + print '</tr></table>'; + print '</td><td colspan="3">'; + if ($action == 'editdemandreason') { + $form->formInputReason($_SERVER['PHP_SELF'] . '?id=' . $commande->id, $commande->demand_reason_id, 'demand_reason_id', 1); + } else { + $form->formInputReason($_SERVER['PHP_SELF'] . '?id=' . $commande->id, $commande->demand_reason_id, 'none'); + } + // Project if (! empty($conf->projet->enabled)) { $langs->load('projects'); - print '<tr><td height="10">'; + print '<tr><td>'; print '<table class="nobordernopadding" width="100%"><tr><td>'; print $langs->trans('Project'); print '</td>'; @@ -373,15 +403,14 @@ if ($id > 0 || ! empty($ref)) * Lignes de commandes avec quantite livrees et reste a livrer * Les quantites livrees sont stockees dans $commande->expeditions[fk_product] */ - print '<table class="liste" width="100%">'; + print '<table class="noborder noshadow" width="100%">'; - $sql = "SELECT cd.rowid, cd.fk_product, cd.product_type, cd.label, cd.description,"; + $sql = "SELECT cd.rowid, cd.fk_product, cd.product_type as type, cd.label, cd.description,"; $sql.= " cd.price, cd.tva_tx, cd.subprice,"; $sql.= " cd.qty,"; $sql.= ' cd.date_start,'; $sql.= ' cd.date_end,'; - $sql.= ' p.label as product_label, p.entity, p.ref, p.fk_product_type, p.rowid as prodid,'; - $sql.= ' p.description as product_desc, p.fk_product_type as product_type'; + $sql.= ' p.rowid as prodid, p.label as product_label, p.entity, p.ref, p.fk_product_type as product_type, p.description as product_desc'; $sql.= " FROM ".MAIN_DB_PREFIX."commandedet as cd"; $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."product as p ON cd.fk_product = p.rowid"; $sql.= " WHERE cd.fk_commande = ".$commande->id; @@ -419,7 +448,8 @@ if ($id > 0 || ! empty($ref)) $var=!$var; // Show product and description - $type=$objp->product_type?$objp->product_type:$objp->fk_product_type; + $type=isset($objp->type)?$objp->type:$objp->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; @@ -459,7 +489,7 @@ if ($id > 0 || ! empty($ref)) print '<a name="'.$objp->rowid.'"></a>'; // ancre pour retourner sur la ligne // Show product and description - $product_static->type=$objp->fk_product_type; + $product_static->type=$type; $product_static->id=$objp->fk_product; $product_static->ref=$objp->ref; $product_static->entity = $objp->entity; diff --git a/htdocs/install/mysql/migration/repair.sql b/htdocs/install/mysql/migration/repair.sql index 22d441d70a5..53034338932 100755 --- a/htdocs/install/mysql/migration/repair.sql +++ b/htdocs/install/mysql/migration/repair.sql @@ -54,6 +54,7 @@ delete from llx_adherent_extrafields where fk_object not in (select rowid from l delete from llx_product_extrafields where fk_object not in (select rowid from llx_product); --delete from llx_societe_commerciaux where fk_soc not in (select rowid from llx_societe); +update llx_product_batch set batch = '' where batch = 'Non défini'; -- Fix: delete category child with no category parent. drop table tmp_categorie; diff --git a/htdocs/langs/en_US/companies.lang b/htdocs/langs/en_US/companies.lang index a95eb99012d..a0edf6bbef5 100644 --- a/htdocs/langs/en_US/companies.lang +++ b/htdocs/langs/en_US/companies.lang @@ -68,6 +68,7 @@ Country=Country CountryCode=Country code CountryId=Country id Phone=Phone +PhoneShort=Phone Skype=Skype Call=Call Chat=Chat diff --git a/htdocs/langs/en_US/stocks.lang b/htdocs/langs/en_US/stocks.lang index 4db67dc6335..8a46433ff9c 100644 --- a/htdocs/langs/en_US/stocks.lang +++ b/htdocs/langs/en_US/stocks.lang @@ -134,7 +134,7 @@ IsInPackage=Contained into package ShowWarehouse=Show warehouse MovementCorrectStock=Stock correction for product %s MovementTransferStock=Stock transfer of product %s into another warehouse -WarehouseMustBeSelectedAtFirstStepWhenProductBatchModuleOn=Source warehouse must be defined here when "Product lot" module is on. It will be used to list wich lot/serial is available for product that required lot/serial data for movement. If you want to send products from different warehouses, just make the shipment into several steps. +WarehouseMustBeSelectedAtFirstStepWhenProductBatchModuleOn=Source warehouse must be defined here when "Product lot" module is on. It will be used to list which lot/serial are available for products requiring lot/serial data for movement. If you want to send products from different warehouses, just make the shipment into several steps. InventoryCodeShort=Inv./Mov. code NoPendingReceptionOnSupplierOrder=No pending reception due to open supplier order ThisSerialAlreadyExistWithDifferentDate=This lot/serial number (<strong>%s</strong>) already exists but with different eatby or sellby date (found <strong>%s</strong> but you enter <strong>%s</strong>). diff --git a/htdocs/product/class/productbatch.class.php b/htdocs/product/class/productbatch.class.php index ee49302407d..5495584ea5f 100644 --- a/htdocs/product/class/productbatch.class.php +++ b/htdocs/product/class/productbatch.class.php @@ -462,16 +462,17 @@ class Productbatch extends CommonObject /** * Return all batch detail records for given product and warehouse * - * @param DoliDB $db database object - * @param int $fk_product_stock id product_stock for objet - * @param int $with_qty doesn't return line with 0 quantity - * @return int <0 if KO, >0 if OK + * @param DoliDB $db database object + * @param int $fk_product_stock id product_stock for objet + * @param int $with_qty doesn't return line with 0 quantity + * @return int <0 if KO, >0 if OK */ public static function findAll($db,$fk_product_stock,$with_qty=0) { global $langs; $ret = array(); - $sql = "SELECT"; + + $sql = "SELECT"; $sql.= " t.rowid,"; $sql.= " t.tms,"; $sql.= " t.fk_product_stock,"; @@ -480,12 +481,10 @@ class Productbatch extends CommonObject $sql.= " t.batch,"; $sql.= " t.qty,"; $sql.= " t.import_key"; - - - $sql.= " FROM ".MAIN_DB_PREFIX.self::$_table_element." as t"; + $sql.= " FROM ".MAIN_DB_PREFIX."product_batch as t"; $sql.= " WHERE fk_product_stock=".$fk_product_stock; - if ($with_qty) $sql.= " AND qty<>0"; + dol_syslog("productbatch::findAll", LOG_DEBUG); $resql=$db->query($sql); if ($resql) diff --git a/htdocs/projet/card.php b/htdocs/projet/card.php index b0165c94760..f7e7106ce45 100644 --- a/htdocs/projet/card.php +++ b/htdocs/projet/card.php @@ -411,7 +411,7 @@ if ($action == 'create' && $user->rights->projet->creer) print '<input type="hidden" name="action" value="add">'; print '<input type="hidden" name="backtopage" value="'.$backtopage.'">'; - print dol_fiche_head(); + dol_fiche_head(); print '<table class="border" width="100%">'; -- GitLab