FIX Some troubles into weight and volume calculation when unit differs.

NEW Introduce a function showDimensionInBestUnit
This commit is contained in:
Laurent Destailleur 2016-02-25 13:46:38 +01:00
parent b46c23ab35
commit a95240e33d
7 changed files with 316 additions and 157 deletions

View File

@ -3408,6 +3408,42 @@ function price2num($amount,$rounding='',$alreadysqlnb=0)
return $amount;
}
/**
* Output a dimension with best unit
* @param float $dimension Dimension
* @param int $unit Unit of dimension (0, -3, ...)
* @param string $type 'weight', 'volume', ...
*/
function showDimensionInBestUnit($dimension, $unit, $type, $outputlangs)
{
if ($dimension < 1/10000)
{
$dimension = $dimension * 1000000;
$unit = $unit - 6;
}
elseif ($dimension < 1/10)
{
$dimension = $dimension * 1000;
$unit = $unit - 3;
}
elseif ($dimension > 100000000)
{
$dimension = $dimension / 1000000;
$unit = $unit + 6;
}
elseif ($dimension > 100000)
{
$dimension = $dimension / 1000;
$unit = $unit + 3;
}
$ret=price($dimension, 0, $outputlangs, 0, 0).' '.measuring_units_string($unit, $type);
return $ret;
}
/**
* Return localtax rate for a particular vat, when selling a product with vat $vatrate, from a $thirdparty_buyer to a $thirdparty_seller
* Note: This function applies same rules than get_default_tva

View File

@ -337,7 +337,7 @@ function show_stats_for_company($product,$socid)
* @param int $unit Unit key (-3,0,3,98,99...)
* @param string $measuring_style Style of unit: weight, volume,...
* @return string Unit string
* @see load_measuring_units
* @see formproduct->load_measuring_units
*/
function measuring_units_string($unit,$measuring_style='')
{
@ -346,41 +346,41 @@ function measuring_units_string($unit,$measuring_style='')
$measuring_units=array();
if ($measuring_style == 'weight')
{
$measuring_units[3] = $langs->trans("WeightUnitton");
$measuring_units[0] = $langs->trans("WeightUnitkg");
$measuring_units[-3] = $langs->trans("WeightUnitg");
$measuring_units[-6] = $langs->trans("WeightUnitmg");
$measuring_units[99] = $langs->trans("WeightUnitpound");
$measuring_units[3] = $langs->transnoentitiesnoconv("WeightUnitton");
$measuring_units[0] = $langs->transnoentitiesnoconv("WeightUnitkg");
$measuring_units[-3] = $langs->transnoentitiesnoconv("WeightUnitg");
$measuring_units[-6] = $langs->transnoentitiesnoconv("WeightUnitmg");
$measuring_units[99] = $langs->transnoentitiesnoconv("WeightUnitpound");
}
else if ($measuring_style == 'size')
{
$measuring_units[0] = $langs->trans("SizeUnitm");
$measuring_units[-1] = $langs->trans("SizeUnitdm");
$measuring_units[-2] = $langs->trans("SizeUnitcm");
$measuring_units[-3] = $langs->trans("SizeUnitmm");
$measuring_units[98] = $langs->trans("SizeUnitfoot");
$measuring_units[99] = $langs->trans("SizeUnitinch");
$measuring_units[0] = $langs->transnoentitiesnoconv("SizeUnitm");
$measuring_units[-1] = $langs->transnoentitiesnoconv("SizeUnitdm");
$measuring_units[-2] = $langs->transnoentitiesnoconv("SizeUnitcm");
$measuring_units[-3] = $langs->transnoentitiesnoconv("SizeUnitmm");
$measuring_units[98] = $langs->transnoentitiesnoconv("SizeUnitfoot");
$measuring_units[99] = $langs->transnoentitiesnoconv("SizeUnitinch");
}
else if ($measuring_style == 'surface')
{
$measuring_units[0] = $langs->trans("SurfaceUnitm2");
$measuring_units[-2] = $langs->trans("SurfaceUnitdm2");
$measuring_units[-4] = $langs->trans("SurfaceUnitcm2");
$measuring_units[-6] = $langs->trans("SurfaceUnitmm2");
$measuring_units[98] = $langs->trans("SurfaceUnitfoot2");
$measuring_units[99] = $langs->trans("SurfaceUnitinch2");
$measuring_units[0] = $langs->transnoentitiesnoconv("SurfaceUnitm2");
$measuring_units[-2] = $langs->transnoentitiesnoconv("SurfaceUnitdm2");
$measuring_units[-4] = $langs->transnoentitiesnoconv("SurfaceUnitcm2");
$measuring_units[-6] = $langs->transnoentitiesnoconv("SurfaceUnitmm2");
$measuring_units[98] = $langs->transnoentitiesnoconv("SurfaceUnitfoot2");
$measuring_units[99] = $langs->transnoentitiesnoconv("SurfaceUnitinch2");
}
else if ($measuring_style == 'volume')
{
$measuring_units[0] = $langs->trans("VolumeUnitm3");
$measuring_units[-3] = $langs->trans("VolumeUnitdm3");
$measuring_units[-6] = $langs->trans("VolumeUnitcm3");
$measuring_units[-9] = $langs->trans("VolumeUnitmm3");
$measuring_units[88] = $langs->trans("VolumeUnitfoot3");
$measuring_units[89] = $langs->trans("VolumeUnitinch3");
$measuring_units[97] = $langs->trans("VolumeUnitounce");
$measuring_units[98] = $langs->trans("VolumeUnitlitre");
$measuring_units[99] = $langs->trans("VolumeUnitgallon");
$measuring_units[0] = $langs->transnoentitiesnoconv("VolumeUnitm3");
$measuring_units[-3] = $langs->transnoentitiesnoconv("VolumeUnitdm3");
$measuring_units[-6] = $langs->transnoentitiesnoconv("VolumeUnitcm3");
$measuring_units[-9] = $langs->transnoentitiesnoconv("VolumeUnitmm3");
$measuring_units[88] = $langs->transnoentitiesnoconv("VolumeUnitfoot3");
$measuring_units[89] = $langs->transnoentitiesnoconv("VolumeUnitinch3");
$measuring_units[97] = $langs->transnoentitiesnoconv("VolumeUnitounce");
$measuring_units[98] = $langs->transnoentitiesnoconv("VolumeUnitlitre");
$measuring_units[99] = $langs->transnoentitiesnoconv("VolumeUnitgallon");
}
return $measuring_units[$unit];

View File

@ -63,18 +63,20 @@ class pdf_rouget extends ModelePdfExpedition
$this->option_logo = 1;
// Recupere emmetteur
// Get source company
$this->emetteur=$mysoc;
if (! $this->emetteur->country_code) $this->emetteur->country_code=substr($langs->defaultlang,-2); // By default if not defined
// Defini position des colonnes
// Define position of columns
$this->posxdesc=$this->marge_gauche+1;
$this->posxqtyordered=$this->page_largeur - $this->marge_droite - 70;
$this->posxqtytoship=$this->page_largeur - $this->marge_droite - 35;
$this->posxpicture=$this->posxqtyordered - (empty($conf->global->MAIN_DOCUMENTS_WITH_PICTURE_WIDTH)?20:$conf->global->MAIN_DOCUMENTS_WITH_PICTURE_WIDTH); // width of images
$this->posxweightvol=$this->page_largeur - $this->marge_droite - 80;
$this->posxqtyordered=$this->page_largeur - $this->marge_droite - 60;
$this->posxqtytoship=$this->page_largeur - $this->marge_droite - 30;
$this->posxpicture=$this->posxweightvol - (empty($conf->global->MAIN_DOCUMENTS_WITH_PICTURE_WIDTH)?20:$conf->global->MAIN_DOCUMENTS_WITH_PICTURE_WIDTH); // width of images
if ($this->page_largeur < 210) // To work with US executive format
{
$this->posxweightvol-=20;
$this->posxpicture-=20;
$this->posxqtyordered-=20;
$this->posxqtytoship-=20;
@ -92,7 +94,7 @@ class pdf_rouget extends ModelePdfExpedition
* @param int $hideref Do not show ref
* @return int 1=OK, 0=KO
*/
function write_file(&$object,$outputlangs,$srctemplatepath='',$hidedetails=0,$hidedesc=0,$hideref=0)
function write_file($object,$outputlangs,$srctemplatepath='',$hidedetails=0,$hidedesc=0,$hideref=0)
{
global $user,$conf,$langs,$hookmanager;
@ -123,27 +125,15 @@ class pdf_rouget extends ModelePdfExpedition
{
if (empty($object->lines[$i]->fk_product)) continue;
$objphoto->fetch($object->lines[$i]->fk_product);
//var_dump($objphoto->ref);exit;
if (! empty($conf->global->PRODUCT_USE_OLD_PATH_FOR_PHOTO))
{
$pdir[0] = get_exdir($objphoto->id,2,0,0,$objphoto,'product') . $objphoto->id ."/photos/";
$pdir[1] = get_exdir(0,0,0,0,$objphoto,'product') . dol_sanitizeFileName($objphoto->ref).'/';
}
else
{
$pdir[0] = get_exdir(0,0,0,0,$objphoto,'product') . dol_sanitizeFileName($objphoto->ref).'/'; // default
$pdir[1] = get_exdir($objphoto->id,2,0,0,$objphoto,'product') . $objphoto->id ."/photos/"; // alternative
}
$arephoto = false;
foreach ($pdir as $midir)
{
if (! $arephoto)
{
$dir = $conf->product->dir_output.'/'.$midir;
foreach ($objphoto->liste_photos($dir,1) as $key => $obj)
$objphoto = new Product($this->db);
$objphoto->fetch($object->lines[$i]->fk_product);
$pdir = get_exdir($object->lines[$i]->fk_product,2,0,0,$objphoto,'product') . $object->lines[$i]->fk_product ."/photos/";
$dir = $conf->product->dir_output.'/'.$pdir;
$realpath='';
foreach ($objphoto->liste_photos($dir,1) as $key => $obj)
{
if (empty($conf->global->CAT_HIGH_QUALITY_IMAGES)) // If CAT_HIGH_QUALITY_IMAGES not defined, we use thumb if defined and then original photo
{
@ -162,16 +152,14 @@ class pdf_rouget extends ModelePdfExpedition
}
$realpath = $dir.$filename;
$arephoto = true;
}
}
break;
}
if ($realpath && $arephoto) $realpatharray[$i]=$realpath;
if ($realpath) $realpatharray[$i]=$realpath;
}
}
if (count($realpatharray) == 0) $this->posxpicture=$this->posxqtyordered;
if (count($realpatharray) == 0) $this->posxpicture=$this->posxweightvol;
if ($conf->expedition->dir_output)
{
@ -210,9 +198,12 @@ class pdf_rouget extends ModelePdfExpedition
global $action;
$reshook=$hookmanager->executeHooks('beforePDFCreation',$parameters,$object,$action); // Note that $action and $object may have been modified by some hooks
// Set nblignes with the new facture lines content after hook
$nblignes = count($object->lines);
$pdf=pdf_getInstance($this->format);
$default_font_size = pdf_getPDFFontSize($outputlangs);
$heightforinfotot = 0; // Height reserved to output the info and total part
$heightforinfotot = 30; // Height reserved to output the info and total part
$heightforfreetext= (isset($conf->global->MAIN_PDF_FREETEXT_HEIGHT)?$conf->global->MAIN_PDF_FREETEXT_HEIGHT:5); // Height reserved to output the free text on last page
$heightforfooter = $this->marge_basse + 8; // Height reserved to output the footer (value include bottom margin)
$pdf->SetAutoPageBreak(1,0);
@ -380,7 +371,7 @@ class pdf_rouget extends ModelePdfExpedition
if (isset($imglinesize['width']) && isset($imglinesize['height']))
{
$curX = $this->posxpicture-1;
$pdf->Image($realpatharray[$i], $curX + (($this->posxqtyordered-$this->posxpicture-$imglinesize['width'])/2), $curY, $imglinesize['width'], $imglinesize['height'], '', '', '', 2, 300); // Use 300 dpi
$pdf->Image($realpatharray[$i], $curX + (($this->posxweightvol-$this->posxpicture-$imglinesize['width'])/2), $curY, $imglinesize['width'], $imglinesize['height'], '', '', '', 2, 300); // Use 300 dpi
// $pdf->Image does not increase value return by getY, so we save it manually
$posYAfterImage=$curY+$imglinesize['height'];
}
@ -389,7 +380,6 @@ class pdf_rouget extends ModelePdfExpedition
$curX = $this->posxdesc-1;
$pdf->startTransaction();
// Description de la ligne produit
pdf_writelinedesc($pdf,$object,$i,$outputlangs,$this->posxpicture-$curX,3,$curX,$curY,$hideref,$hidedesc);
$pageposafter=$pdf->getPage();
@ -445,6 +435,20 @@ class pdf_rouget extends ModelePdfExpedition
$pdf->SetFont('','', $default_font_size - 1); // On repositionne la police par defaut
$pdf->SetXY($this->posxweightvol, $curY);
$weighttxt='';
if ($object->lines[$i]->fk_product_type == 0 && $object->lines[$i]->weight)
{
$weighttxt=$object->lines[$i]->weight*$object->lines[$i]->qty_shipped.' '.measuring_units_string($object->lines[$i]->weight_units,"weight");
}
$voltxt='';
if ($object->lines[$i]->fk_product_type == 0 && $object->lines[$i]->volume)
{
$voltxt=$object->lines[$i]->volume*$object->lines[$i]->qty_shipped.' '.measuring_units_string($object->lines[$i]->volume_units,"volume");
}
$pdf->MultiCell(($this->posxqtyordered - $this->posxweightvol), 3, $weighttxt.(($weighttxt && $voltxt)?', ':'').$voltxt,'','C');
$pdf->SetXY($this->posxqtyordered, $curY);
$pdf->MultiCell(($this->posxqtytoship - $this->posxqtyordered), 3, $object->lines[$i]->qty_asked,'','C');
@ -501,15 +505,18 @@ class pdf_rouget extends ModelePdfExpedition
// Show square
if ($pagenb == 1)
{
$this->_tableau($pdf, $tab_top, $this->page_hauteur - $tab_top - $heightforfooter - $heightforfreetext - $heightforinfotot, 0, $outputlangs, 0, 0);
$bottomlasttab=$this->page_hauteur - $heightforfooter - $heightforfreetext - $heightforinfotot + 1;
$this->_tableau($pdf, $tab_top, $this->page_hauteur - $tab_top - $heightforinfotot - $heightforfreetext - $heightforfooter, 0, $outputlangs, 0, 0);
$bottomlasttab=$this->page_hauteur - $heightforinfotot - $heightforfreetext - $heightforfooter + 1;
}
else
{
$this->_tableau($pdf, $tab_top_newpage, $this->page_hauteur - $tab_top_newpage - $heightforfooter - $heightforfreetext - $heightforinfotot, 0, $outputlangs, 1, 0);
$bottomlasttab=$this->page_hauteur - $heightforfooter - $heightforfreetext - $heightforinfotot + 1;
$this->_tableau($pdf, $tab_top_newpage, $this->page_hauteur - $tab_top_newpage - $heightforinfotot - $heightforfreetext - $heightforfooter, 0, $outputlangs, 1, 0);
$bottomlasttab=$this->page_hauteur - $heightforinfotot - $heightforfreetext - $heightforfooter + 1;
}
// Affiche zone totaux
$posy=$this->_tableau_tot($pdf, $object, $deja_regle, $bottomlasttab, $outputlangs);
// Pied de page
$this->_pagefoot($pdf,$object,$outputlangs);
if (method_exists($pdf,'AliasNbPages')) $pdf->AliasNbPages();
@ -519,11 +526,6 @@ class pdf_rouget extends ModelePdfExpedition
$pdf->Output($file,'F');
// Add pdfgeneration hook
if (! is_object($hookmanager))
{
include_once DOL_DOCUMENT_ROOT.'/core/class/hookmanager.class.php';
$hookmanager=new HookManager($this->db);
}
$hookmanager->initHooks(array('pdfgeneration'));
$parameters=array('file'=>$file,'object'=>$object,'outputlangs'=>$outputlangs);
global $action;
@ -532,7 +534,7 @@ class pdf_rouget extends ModelePdfExpedition
if (! empty($conf->global->MAIN_UMASK))
@chmod($file, octdec($conf->global->MAIN_UMASK));
return 1;
return 1; // No error
}
else
{
@ -549,6 +551,89 @@ class pdf_rouget extends ModelePdfExpedition
return 0; // Erreur par defaut
}
/**
* Show total to pay
*
* @param PDF $pdf Object PDF
* @param Facture $object Object invoice
* @param int $deja_regle Montant deja regle
* @param int $posy Position depart
* @param Translate $outputlangs Objet langs
* @return int Position pour suite
*/
function _tableau_tot(&$pdf, $object, $deja_regle, $posy, $outputlangs)
{
global $conf,$mysoc;
$sign=1;
$default_font_size = pdf_getPDFFontSize($outputlangs);
$tab2_top = $posy;
$tab2_hl = 4;
$pdf->SetFont('','', $default_font_size - 1);
// Tableau total
$col1x = $this->posxweightvol-50; $col2x = $this->posxweightvol;
/*if ($this->page_largeur < 210) // To work with US executive format
{
$col2x-=20;
}*/
$largcol2 = ($this->posxqtyordered - $this->posxweightvol);
$useborder=0;
$index = 0;
$totalWeighttoshow='';
$totalVolumetoshow='';
// Load dim data
$tmparray=$object->getTotalWeightVolume();
$totalWeight=$tmparray['weight'];
$totalVolume=$tmparray['volume'];
// Set trueVolume and volume_units not currently stored into database
if ($object->trueWidth && $object->trueHeight && $object->trueDepth)
{
$object->trueVolume=price(($object->trueWidth * $object->trueHeight * $object->trueDepth), 0, $outputlangs, 0, 0);
$object->volume_units=$object->size_units * 3;
}
if ($totalWeight!='') $totalWeighttoshow=showDimensionInBestUnit($totalWeight, 0, "weight", $outputlangs);
if ($totalVolume!='') $totalVolumetoshow=showDimensionInBestUnit($totalVolume, 0, "volume", $outputlangs);
if ($object->trueWeight) $totalWeighttoshow=showDimensionInBestUnit($object->trueWeight, $object->weight_units, "weight", $outputlangs);
if ($object->trueVolume) $totalVolumetoshow=showDimensionInBestUnit($object->trueVolume, $object->volume_units, "volume", $outputlangs);
// Total Weight
if ($totalWeighttoshow)
{
$pdf->SetFillColor(255,255,255);
$pdf->SetXY($col1x, $tab2_top + $tab2_hl * $index);
$pdf->MultiCell($col2x-$col1x, $tab2_hl, $outputlangs->transnoentities("Weigth"), 0, 'L', 1);
$pdf->SetXY($col2x-20, $tab2_top + $tab2_hl * $index);
$pdf->MultiCell($largcol2+20, $tab2_hl, $totalWeighttoshow, 0, 'R', 1);
$index++;
}
if ($totalVolumetoshow)
{
// Total Volume
$pdf->SetFillColor(255,255,255);
$pdf->SetXY($col1x, $tab2_top + $tab2_hl * $index);
$pdf->MultiCell($col2x-$col1x, $tab2_hl, $outputlangs->transnoentities("Volume"), 0, 'L', 1);
$pdf->SetXY($col2x-20, $tab2_top + $tab2_hl * $index);
$pdf->MultiCell($largcol2+20, $tab2_hl, $totalVolumetoshow, 0, 'R', 1);
$index++;
}
$pdf->SetTextColor(0,0,0);
return ($tab2_top + ($tab2_hl * $index));
}
/**
* Show table for lines
*
@ -573,13 +658,13 @@ class pdf_rouget extends ModelePdfExpedition
// Amount in (at tab_top - 1)
$pdf->SetTextColor(0,0,0);
$pdf->SetFont('','',$default_font_size - 1);
$pdf->SetFont('','',$default_font_size - 2);
// Output Rect
$this->printRect($pdf,$this->marge_gauche, $tab_top, $this->page_largeur-$this->marge_gauche-$this->marge_droite, $tab_height, $hidetop, $hidebottom); // Rect prend une longueur en 3eme param et 4eme param
$pdf->SetDrawColor(128,128,128);
$pdf->SetFont('','',$default_font_size - 1);
$pdf->SetFont('','', $default_font_size - 1);
if (empty($hidetop))
{
@ -589,10 +674,17 @@ class pdf_rouget extends ModelePdfExpedition
$pdf->MultiCell($this->posxqtyordered - $this->posxdesc, 2, $outputlangs->transnoentities("Description"), '', 'L');
}
$pdf->line($this->posxweightvol-1, $tab_top, $this->posxweightvol-1, $tab_top + $tab_height);
if (empty($hidetop))
{
$pdf->SetXY($this->posxweightvol-1, $tab_top+1);
$pdf->MultiCell(($this->posxqtyordered - $this->posxweightvol), 2, $outputlangs->transnoentities("WeightVolShort"),'','C');
}
$pdf->line($this->posxqtyordered-1, $tab_top, $this->posxqtyordered-1, $tab_top + $tab_height);
if (empty($hidetop))
{
$pdf->SetXY($this->posxqtyordered, $tab_top+1);
$pdf->SetXY($this->posxqtyordered-1, $tab_top+1);
$pdf->MultiCell(($this->posxqtytoship - $this->posxqtyordered), 2, $outputlangs->transnoentities("QtyOrdered"),'','C');
}
@ -616,12 +708,14 @@ class pdf_rouget extends ModelePdfExpedition
function _pagehead(&$pdf, $object, $showaddress, $outputlangs)
{
global $conf,$langs,$mysoc;
$default_font_size = pdf_getPDFFontSize($outputlangs);
$langs->load("orders");
$default_font_size = pdf_getPDFFontSize($outputlangs);
pdf_pagehead($pdf,$outputlangs,$this->page_hauteur);
//Affiche le filigrane brouillon - Print Draft Watermark
// Show Draft Watermark
if($object->statut==0 && (! empty($conf->global->SHIPPING_DRAFT_WATERMARK)) )
{
pdf_watermark($pdf,$outputlangs,$this->page_hauteur,$this->page_largeur,'mm',$conf->global->SHIPPING_DRAFT_WATERMARK);
@ -631,8 +725,10 @@ class pdf_rouget extends ModelePdfExpedition
$pdf->SetTextColor(0,0,60);
$pdf->SetFont('','B', $default_font_size + 3);
$posx=$this->page_largeur-$this->marge_droite-100;
$w = 110;
$posy=$this->marge_haute;
$posx=$this->page_largeur-$this->marge_droite-$w;
$pdf->SetXY($this->marge_gauche,$posy);
@ -649,14 +745,14 @@ class pdf_rouget extends ModelePdfExpedition
{
$pdf->SetTextColor(200,0,0);
$pdf->SetFont('','B', $default_font_size - 2);
$pdf->MultiCell(100, 3, $outputlangs->transnoentities("ErrorLogoFileNotFound",$logo), 0, 'L');
$pdf->MultiCell(100, 3, $outputlangs->transnoentities("ErrorGoToGlobalSetup"), 0, 'L');
$pdf->MultiCell($w, 3, $outputlangs->transnoentities("ErrorLogoFileNotFound",$logo), 0, 'L');
$pdf->MultiCell($w, 3, $outputlangs->transnoentities("ErrorGoToGlobalSetup"), 0, 'L');
}
}
else
{
$text=$this->emetteur->name;
$pdf->MultiCell(100, 4, $outputlangs->convToOutputCharset($text), 0, 'L');
$pdf->MultiCell($w, 4, $outputlangs->convToOutputCharset($text), 0, 'L');
}
// Show barcode
@ -685,14 +781,14 @@ class pdf_rouget extends ModelePdfExpedition
}
$posx=$this->page_largeur - 100 - $this->marge_droite;
$posx=$this->page_largeur - $w - $this->marge_droite;
$posy=$this->marge_haute;
$pdf->SetFont('','B', $default_font_size + 2);
$pdf->SetXY($posx,$posy);
$pdf->SetTextColor(0,0,60);
$title=$outputlangs->transnoentities("SendingSheet");
$pdf->MultiCell(100, 4, $title, '', 'R');
$pdf->MultiCell($w, 4, $title, '', 'R');
$posy+=1;
$pdf->SetFont('','', $default_font_size + 1);
@ -700,7 +796,7 @@ class pdf_rouget extends ModelePdfExpedition
$posy+=4;
$pdf->SetXY($posx,$posy);
$pdf->SetTextColor(0,0,60);
$pdf->MultiCell(100, 4, $outputlangs->transnoentities("RefSending") ." : ".$object->ref, '', 'R');
$pdf->MultiCell($w, 4, $outputlangs->transnoentities("RefSending") ." : ".$object->ref, '', 'R');
// Date planned delivery
if (! empty($object->date_delivery))
@ -708,7 +804,7 @@ class pdf_rouget extends ModelePdfExpedition
$posy+=4;
$pdf->SetXY($posx,$posy);
$pdf->SetTextColor(0,0,60);
$pdf->MultiCell(100, 4, $outputlangs->transnoentities("DateDeliveryPlanned")." : ".dol_print_date($object->date_delivery,"day",false,$outputlangs,true), '', 'R');
$pdf->MultiCell($w, 4, $outputlangs->transnoentities("DateDeliveryPlanned")." : ".dol_print_date($object->date_delivery,"day",false,$outputlangs,true), '', 'R');
}
if (! empty($object->client->code_client))
@ -716,7 +812,7 @@ class pdf_rouget extends ModelePdfExpedition
$posy+=4;
$pdf->SetXY($posx,$posy);
$pdf->SetTextColor(0,0,60);
$pdf->MultiCell(100, 3, $outputlangs->transnoentities("CustomerCode")." : " . $outputlangs->transnoentities($object->client->code_client), '', 'R');
$pdf->MultiCell($w, 3, $outputlangs->transnoentities("CustomerCode")." : " . $outputlangs->transnoentities($object->client->code_client), '', 'R');
}
@ -744,11 +840,11 @@ class pdf_rouget extends ModelePdfExpedition
$text=$linkedobject->ref;
if ($linkedobject->ref_client) $text.=' ('.$linkedobject->ref_client.')';
$Yoff = $Yoff+8;
$pdf->SetXY($this->page_largeur - $this->marge_droite - 100,$Yoff);
$pdf->MultiCell(100, 2, $outputlangs->transnoentities("RefOrder") ." : ".$outputlangs->transnoentities($text), 0, 'R');
$pdf->SetXY($this->page_largeur - $this->marge_droite - $w,$Yoff);
$pdf->MultiCell($w, 2, $outputlangs->transnoentities("RefOrder") ." : ".$outputlangs->transnoentities($text), 0, 'R');
$Yoff = $Yoff+3;
$pdf->SetXY($this->page_largeur - $this->marge_droite - 60,$Yoff);
$pdf->MultiCell(60, 2, $outputlangs->transnoentities("OrderDate")." : ".dol_print_date($linkedobject->date,"day",false,$outputlangs,true), 0, 'R');
$pdf->SetXY($this->page_largeur - $this->marge_droite - $w,$Yoff);
$pdf->MultiCell($w, 2, $outputlangs->transnoentities("OrderDate")." : ".dol_print_date($linkedobject->date,"day",false,$outputlangs,true), 0, 'R');
}
}
@ -761,18 +857,20 @@ class pdf_rouget extends ModelePdfExpedition
if (! empty($origin) && is_object($object->$origin)) $arrayidcontact=$object->$origin->getIdContact('internal','SALESREPFOLL');
if (count($arrayidcontact) > 0)
{
$object->fetch_user($arrayidcontact[0]);
$object->fetch_user(reset($arrayidcontact));
$carac_emetteur .= ($carac_emetteur ? "\n" : '' ).$outputlangs->transnoentities("Name").": ".$outputlangs->convToOutputCharset($object->user->getFullName($outputlangs))."\n";
}
$carac_emetteur .= pdf_build_address($outputlangs, $this->emetteur, $object->client);
// Show sender
$posy=!empty($conf->global->MAIN_PDF_USE_ISO_LOCATION) ? 40 : 42;
$posx=$this->marge_gauche;
$posy=42;
$hautcadre=40;
if (! empty($conf->global->MAIN_INVERT_SENDER_RECIPIENT)) $posx=$this->page_largeur-$this->marge_droite-80;
$hautcadre=!empty($conf->global->MAIN_PDF_USE_ISO_LOCATION) ? 38 : 40;
$widthrecbox=!empty($conf->global->MAIN_PDF_USE_ISO_LOCATION) ? 92 : 82;
// Show sender frame
$pdf->SetTextColor(0,0,0);
$pdf->SetFont('','', $default_font_size - 2);
@ -780,19 +878,19 @@ class pdf_rouget extends ModelePdfExpedition
$pdf->MultiCell(66,5, $outputlangs->transnoentities("Sender").":", 0, 'L');
$pdf->SetXY($posx,$posy);
$pdf->SetFillColor(230,230,230);
$pdf->MultiCell(82, $hautcadre, "", 0, 'R', 1);
$pdf->MultiCell($widthrecbox, $hautcadre, "", 0, 'R', 1);
$pdf->SetTextColor(0,0,60);
// Show sender name
$pdf->SetXY($posx+2,$posy+3);
$pdf->SetTextColor(0,0,60);
$pdf->SetFont('','B',$default_font_size);
$pdf->MultiCell(80, 3, $outputlangs->convToOutputCharset($this->emetteur->name), 0, 'L');
$pdf->MultiCell($widthrecbox-2, 4, $outputlangs->convToOutputCharset($this->emetteur->name), 0, 'L');
$posy=$pdf->getY();
// Show sender information
$pdf->SetFont('','', $default_font_size - 1);
$pdf->SetXY($posx+2,$posy);
$pdf->MultiCell(80, 4, $carac_emetteur, 0, 'L');
$pdf->SetFont('','', $default_font_size - 1);
$pdf->MultiCell($widthrecbox-2, 4, $carac_emetteur, 0, 'L');
// If SHIPPING contact defined, we use it
@ -817,24 +915,23 @@ class pdf_rouget extends ModelePdfExpedition
$carac_client=pdf_build_address($outputlangs,$this->emetteur,$object->client,(!empty($object->contact)?$object->contact:null),$usecontact,'targetwithdetails');
// Show recipient
$widthrecbox=100;
$widthrecbox=!empty($conf->global->MAIN_PDF_USE_ISO_LOCATION) ? 92 : 100;
if ($this->page_largeur < 210) $widthrecbox=84; // To work with US executive format
$posy=42;
$posy=!empty($conf->global->MAIN_PDF_USE_ISO_LOCATION) ? 40 : 42;
$posx=$this->page_largeur - $this->marge_droite - $widthrecbox;
if (! empty($conf->global->MAIN_INVERT_SENDER_RECIPIENT)) $posx=$this->marge_gauche;
// Show recipient frame
$pdf->SetTextColor(0,0,0);
$pdf->SetFont('','', $default_font_size - 2);
$pdf->SetXY($posx,$posy-5);
$pdf->MultiCell($widthrecbox, 4, $outputlangs->transnoentities("Recipient").":", 0, 'L');
$pdf->SetXY($posx+2,$posy-5);
$pdf->MultiCell($widthrecbox, 5, $outputlangs->transnoentities("Recipient").":", 0, 'L');
$pdf->Rect($posx, $posy, $widthrecbox, $hautcadre);
$pdf->SetTextColor(0,0,0);
// Show recipient name
$pdf->SetXY($posx+2,$posy+3);
$pdf->SetFont('','B', $default_font_size);
$pdf->MultiCell($widthrecbox, 4, $carac_client_name, 0, 'L');
$pdf->MultiCell($widthrecbox, 2, $carac_client_name, 0, 'L');
$posy = $pdf->getY();
@ -844,6 +941,7 @@ class pdf_rouget extends ModelePdfExpedition
$pdf->MultiCell($widthrecbox, 4, $carac_client, 0, 'L');
}
$pdf->SetTextColor(0,0,0);
}
/**
@ -853,7 +951,7 @@ class pdf_rouget extends ModelePdfExpedition
* @param Object $object Object to show
* @param Translate $outputlangs Object lang for output
* @param int $hidefreetext 1=Hide free text
* @return void
* @return int Return height of bottom margin including footer text
*/
function _pagefoot(&$pdf,$object,$outputlangs,$hidefreetext=0)
{

View File

@ -86,7 +86,6 @@ class pdf_crabe extends ModelePDFFactures
$this->name = "crabe";
$this->description = $langs->trans('PDFCrabeDescription');
// Dimension page pour format A4
$this->type = 'pdf';
$formatarray=pdf_getFormat();
$this->page_largeur = $formatarray['width'];
@ -673,20 +672,20 @@ class pdf_crabe extends ModelePDFFactures
if (! empty($conf->global->MAIN_UMASK))
@chmod($file, octdec($conf->global->MAIN_UMASK));
return 1; // Pas d'erreur
return 1; // No error
}
else
{
$this->error=$langs->trans("ErrorCanNotCreateDir",$dir);
$this->error=$langs->transnoentities("ErrorCanNotCreateDir",$dir);
return 0;
}
}
else
{
$this->error=$langs->trans("ErrorConstantNotDefined","FAC_OUTPUTDIR");
$this->error=$langs->transnoentities("ErrorConstantNotDefined","FAC_OUTPUTDIR");
return 0;
}
$this->error=$langs->trans("ErrorUnknown");
$this->error=$langs->transnoentities("ErrorUnknown");
return 0; // Erreur par defaut
}

View File

@ -1251,44 +1251,13 @@ else if ($id || $ref)
}
// Calculate true totalWeight and totalVolume for all products
// Calculate totalWeight and totalVolume for all products
// by adding weight and volume of each product line.
$totalWeight = '';
$totalVolume = '';
$weightUnit=0;
$volumeUnit=0;
for ($i = 0 ; $i < $num_prod ; $i++)
{
$weightUnit=0;
$volumeUnit=0;
if (! empty($lines[$i]->weight_units)) $weightUnit = $lines[$i]->weight_units;
if (! empty($lines[$i]->volume_units)) $volumeUnit = $lines[$i]->volume_units;
// TODO Use a function addvalueunits(val1,unit1,val2,unit2)=>(val,unit)
if ($lines[$i]->weight_units < 50)
{
$trueWeightUnit=pow(10,$weightUnit);
$totalWeight += $lines[$i]->weight*$lines[$i]->qty_shipped*$trueWeightUnit;
}
else
{
$trueWeightUnit=$weightUnit;
$totalWeight += $lines[$i]->weight*$lines[$i]->qty_shipped;
}
if ($lines[$i]->volume_units < 50)
{
//print $lines[$i]->volume."x".$lines[$i]->volume_units."x".($lines[$i]->volume_units < 50)."x".$volumeUnit;
$trueVolumeUnit=pow(10,$volumeUnit);
//print $lines[$i]->volume;
$totalVolume += $lines[$i]->volume*$lines[$i]->qty_shipped*$trueVolumeUnit;
}
else
{
$trueVolumeUnit=$volumeUnit;
$totalVolume += $lines[$i]->volume*$lines[$i]->qty_shipped;
}
}
$tmparray=$object->getTotalWeightVolume();
$totalWeight=$tmparray['weight'];
$totalVolume=$tmparray['volume'];
print '<table class="border" width="100%">';
$linkback = '<a href="'.DOL_URL_ROOT.'/expedition/list.php">'.$langs->trans("BackToList").'</a>';
@ -1391,7 +1360,8 @@ else if ($id || $ref)
if ($totalWeight > 0)
{
if (!empty($object->trueWeight)) print ' ('.$langs->trans("SumOfProductWeights").': ';
print $totalWeight.' '.measuring_units_string(0,"weight");
//print $totalWeight.' '.measuring_units_string(0,"weight");
print showDimensionInBestUnit($totalWeight, 0, "weight", $langs);
//if (empty($object->trueWeight)) print ' ('.$langs->trans("Calculated").')';
if (!empty($object->trueWeight)) print ')';
}
@ -1438,18 +1408,27 @@ else if ($id || $ref)
print '</td>';
print '<td colspan="3">';
$calculatedVolume=0;
if ($object->trueWidth && $object->trueHeight && $object->trueDepth) $calculatedVolume=($object->trueWidth * $object->trueHeight * $object->trueDepth);
$volumeUnit=0;
if ($object->trueWidth && $object->trueHeight && $object->trueDepth)
{
$calculatedVolume=($object->trueWidth * $object->trueHeight * $object->trueDepth);
$volumeUnit=$object->size_units * 3;
}
// If sending volume not defined we use sum of products
if ($calculatedVolume > 0)
{
print $calculatedVolume.' ';
if ($volumeUnit < 50) print measuring_units_string(0,"volume");
else print measuring_units_string($volumeUnit,"volume");
if ($volumeUnit < 50)
{
//print $calculatedVolume.' '.measuring_units_string($volumeUnit,"volume");
print showDimensionInBestUnit($calculatedVolume, $volumeUnit, "volume", $langs);
}
else print $calculatedVolume.' '.measuring_units_string($volumeUnit,"volume");
}
if ($totalVolume > 0)
{
if ($calculatedVolume) print ' ('.$langs->trans("SumOfProductVolumes").': ';
print $totalVolume.' '.measuring_units_string(0,"volume");
//print $totalVolume.' '.measuring_units_string(0,"volume");
print showDimensionInBestUnit($totalVolume, 0, "volume", $langs);
//if (empty($calculatedVolume)) print ' ('.$langs->trans("Calculated").')';
if ($calculatedVolume) print ')';
}

View File

@ -1003,7 +1003,7 @@ class Expedition extends CommonObject
if (isset($this->trueWeight)) $this->weight=trim($this->trueWeight);
if (isset($this->note_private)) $this->note=trim($this->note_private);
if (isset($this->note_public)) $this->note=trim($this->note_public);
if (isset($this->model_pdf)) $this->model_pdf=trim($this->model_pdf);
if (isset($this->modelpdf)) $this->modelpdf=trim($this->modelpdf);
@ -1035,7 +1035,7 @@ class Expedition extends CommonObject
$sql.= " weight=".(($this->trueWeight != '')?$this->trueWeight:"null").",";
$sql.= " note_private=".(isset($this->note_private)?"'".$this->db->escape($this->note_private)."'":"null").",";
$sql.= " note_public=".(isset($this->note_public)?"'".$this->db->escape($this->note_public)."'":"null").",";
$sql.= " model_pdf=".(isset($this->model_pdf)?"'".$this->db->escape($this->model_pdf)."'":"null").",";
$sql.= " model_pdf=".(isset($this->modelpdf)?"'".$this->db->escape($this->modelpdf)."'":"null").",";
$sql.= " entity=".$conf->entity;
$sql.= " WHERE rowid=".$this->id;
@ -1742,6 +1742,52 @@ class Expedition extends CommonObject
}
/**
* Return into unit=0, the calculated total of weight and volume of all lines * qty
* Calculate by adding weight and volume of each product line.
*
* @return array array('weight'=>...,'volume'=>...)
*/
function getTotalWeightVolume()
{
$weightUnit=0;
$volumeUnit=0;
$totalWeight = '';
$totalVolume = '';
foreach ($this->lines as $line)
{
$weightUnit=0;
$volumeUnit=0;
if (! empty($line->weight_units)) $weightUnit = $line->weight_units;
if (! empty($line->volume_units)) $volumeUnit = $line->volume_units;
//var_dump($line->volume_units);
if ($line->weight_units < 50) // >50 means a standard unit (power of 10 of official unit) > 50 means an exotic unit (like inch)
{
$trueWeightUnit=pow(10,$weightUnit);
$totalWeight += $line->weight*$line->qty_shipped*$trueWeightUnit;
}
else
{
$totalWeight += $line->weight*$line->qty_shipped; // This may be wrong if we mix different units
}
if ($line->volume_units < 50) // >50 means a standard unit (power of 10 of official unit) > 50 means an exotic unit (like inch)
{
//print $line->volume."x".$line->volume_units."x".($line->volume_units < 50)."x".$volumeUnit;
$trueVolumeUnit=pow(10,$volumeUnit);
//print $line->volume;
$totalVolume += $line->volume*$line->qty_shipped*$trueVolumeUnit;
}
else
{
$totalVolume += $line->volume*$line->qty_shipped; // This may be wrong if we mix different units
}
}
return array('weight'=>$totalWeight, 'volume'=>$totalVolume);
}
/**
* Forge an set tracking url
*

View File

@ -70,6 +70,7 @@ ProductQtyInSuppliersOrdersRunning=Product quantity into opened suppliers orders
ProductQtyInShipmentAlreadySent=Product quantity from opened customer order already sent
ProductQtyInSuppliersShipmentAlreadyRecevied=Product quantity from opened supplier order already received
NoProductToShipFoundIntoStock=No product to ship found into warehouse <b>%s</b>. Correct stock or go back to choose another warehouse.
WeightVolShort=Weight/Vol.
# Sending methods
SendingMethodCATCH=Catch by customer