openDoc('Impreso de Factura'); $out->setPica(56,95,1,0,5); // $swDialog=false // $outNav->setAutoPrint($aida['servidor impresora '.$tipo][0], $aida['nombre impresora'.$tipo][1], $swDialog); // fuente para los datos de la cabecera $out->setFont('cab', 'Arial', 75); $out->setFont('can', 'Arial', 75, 0, 'B'); // fuente para los datos del cuerpo $out->setFont('cue', 'Arial', 75); $out->setFont('cuc', 'Arial', 65); // para códigos $out->setFont('cun', 'Arial', 75, 0, 'B'); $out->setFont('ccn', 'Arial', 63.5, 0, 'B'); // fuentes para los datos de la empresa $out->setFont('emp', 'Arial', 50); $out->setFont('emn', 'Arial', 50, 0, 'B'); // fuente para los datos del pie $out->setFont('pie', 'Arial', 40); $out->setFont('sig', 'Arial', 30); // generar el logo de Minit de forma vectorial function logoMinit (& $out, $y, $x) { $color1 = 'c50041'; $color2 = 'df0283'; $color3 = '5b609f'; // círculo grande exterior $out->printCircle($y, $x, 7.4, 20, $color1); $out->printCircle($y, $x, 7.6, 20, $color1); $out->printCircle($y, $x, 7.8, 20, $color1); $out->printCircle($y, $x, 8.0, 20, $color1); $out->printCircle($y, $x, 8.2, 20, $color1); $out->printCircle($y, $x, 8.4, 20, $color1); $out->printCircle($y, $x, 8.6, 20, $color1); $out->printCircle($y, $x, 8.8, 20, $color1); $out->printCircle($y, $x, 9.0, 15, $color1); // círculo pequeño interior $y0 = $y - 0.7; $x0 = $x - 3.0; $out->printCircle($y0, $x0, 0.0, 20, $color2); $out->printCircle($y0, $x0, 0.2, 20, $color2); $out->printCircle($y0, $x0, 0.4, 10, $color2); $out->printCircle($y0, $x0, 0.6, 10, $color2); $out->printCircle($y0, $x0, 0.8, 12, $color2); // nombre de la empresa $out->setFont('logo', 'Arial', 90); $out->printText('logo', 'MINIT', $y+0.5, $x-2.3, 0, 'L', $color3); } // abrimos 'head' $out->openHead(); // datos de la empresa de fra. logoMinit($out, 5, 12); // fijos de la cabecera $out->printBox (-0.3, 40, 0.9, 84, 5, '000000', 'e4e4e4'); $out->printText('can', 'FACTURA / INVOICE', 0, 44); $aCuen = array(); $cuencif = ($idi!='en'?'CIF ':'VAT NR. ') . $cuencif; foreach (array('nomb','nom2','dir1','dir2','dir3','dir4','cif') as $suf) { if (trim(${'cuen'.$suf}) != '') $aCuen[] = trim(${'cuen'.$suf}); } $out->printFramedText('cab', implode("\n",$aCuen), 1.3, 44, 6, 50, 0.9); // fijos de la cabecera $out->printBox ( 7.0, 40, 10.0, 84, 5, '000000', 'e4e4e4'); $out->printBox (10.0, 40, 11.5, 84, 5); $out->printLine( 8.5, 40, 8.5, 84, 1); $out->printLine( 7.0, 62, 10.0, 62, 1); $out->printText('can', $idi!='en'?'Nº FACTURA':'INVOICE NUMBER', 7.3, 41, 21, 'C'); $out->printText('can', $idi!='en'?'FECHA':'DATE', 7.3, 63, 21, 'C'); $out->printText('can', $idi!='en'?'FORMA DE PAGO':'PAYMENT METHOD', 10.3, 41); $out->printText('cab', '$cfacseri." - ".trim($cfacnume)', 8.8, 41, 21, 'C'); $out->printText('cab', '$cfacfech', 8.8, 63, 21, 'C'); $out->printText('cab', '($pacofpa1=="4" && "'.$idi.'"=="en")?"BANK TRANSFER":$fpagnom1', 10.3, 63, 21, 'C'); $out->printText('cab', ($idi!='en'?'Página':'Page').': #qq/#qt', 13.0, 1); $out->printText('can', '"BIC/Swift: ".$domicban', 13.0, 18); $out->printText('cab', '$domiban1', 12.0, 44); $out->printText('can', '"IBAN: ".$domidomi', 13.0, 44); // ********************************************************************************************************************* // fijos del cuerpo de fra. $out->printBox(14.0, 0, 48.0, 84, 5); $out->printBox(14.0, 0, 15.5, 84, 5, '000000', 'e4e4e4'); $out->printText('can', $idi!='en'?'Unidades':'Units', 14.3, 0.5, 8.5, 'C'); $out->printText('can', $idi!='en'?'Descripción':'Description', 14.3, 10, 47, 'C'); $out->printText('can', $idi!='en'?'Precio':'Unit price', 14.3, 60, 10, 'C'); $out->printText('can', $idi!='en'?'Importe €':'Amount €', 14.3, 71, 13, 'C'); $out->printLine(14, 9.5, 48, 9.5, 1); $out->printLine(14, 59.5, 48, 59.5, 1); $out->printLine(14, 70.5, 48, 70.5, 1); // fijos del pie $out->printBox (48, 0, 49.0, 40, 5); $out->printBox (48, 40, 51.5, 84, 5, '000000', 'e4e4e4'); $out->printText('emn', 'MINIT Spain, S.A.U.', 49.4, 0); $out->printText('emp', 'C/Roselló, 56', 50.0, 0); $out->printText('emp', '08940 Cornellá de Llobregat', 50.6, 0); $out->printText('emp', 'Barcelona', 51.2, 0); $out->printText('emp', 'España', 51.8, 0); $out->printText('emp', 'Tel.: 34 934 743 659', 52.4, 0); $out->printText('emp', 'Fax: 34 934 740 029', 53.0, 0); $out->printText('pie', 'Australia, Belgium, Canada, Czech Republic, Denmark, Estonia, Finland, France, Germany, Hong Kong, Ireland, Japan, Luxemburg,', 53.8, 0); $out->printText('pie', 'Netherlands, New Zealand, Norway, Portugal, Singapore, Slovakia, Spain, Sweden, Switzerland', 54.3, 0); $out->printText('pie', 'Sociedad Unipersonal inscrita en el R.M. de Barcelona el 30/09/70, Tomo 22.760, Hoja 42.136, Sección 2ª de Sociedades CIF: ES A28163681', 45, 87, 0, 'L', '000000', false, 90); $out->printImage('', '../signatureDone.jpg', 52.25, 73, 2); $out->printText('sig', 'Printed from digitally signed file',54.20, 70); // cerramos 'head' $out->closeHead(); // obtenemos todos los campos/valores, y reclasificamos según plantilla $aaVal = $out->getAAVal(); $aOrd = array(); // array de "orden" (índice=$qqq, value=cod-esta-1/2/3[país orígen/tienda/esta-3]) $aaLin = array(); // nueva array de lineas a montar $totL = '0'; // total de las líneas, para comparar con la base imponible (y si son diferentes, sacar "manipulación") // el segundo dígito de la plantilla nos indica si hemos de sacar un resumen de importes/pesos por país de orígen al final $aaRes = array(); // array (opcional) de resúmen por países/partidas arancelarias $swRes = ($numimpre>=10 && $numimpre<=19); $qqq = -1; $albaranAnt = ''; foreach ($aaVal['lfaccoda'] as $q => $coda) { // contador, manual porque a veces generamos líneas extras por cambio de albarán $qqq ++; //acumulamos $cant = toOperableNum($aaVal['lfaccant'][$q]); $prec = toOperableNum($aaVal['lfacprec'][$q]); $impo = toOperableNum($aaVal['lfacimpo'][$q]); $peso = toOperableNum($aaVal['lfacpeso'][$q]); $impo = is_numeric($impo) ? $impo : '0'; //$prec = bccomp($cant,0,8)!=0 ? bcdiv($impo, $cant, 8) : 0; $totL = bcadd($totL, $impo, 2); // el tercer dígito (último) de la plantilla nos indica la ordenación/agrupación // caso simple: ordenación original tal cual if ($numimpre%10 == 0) { if (trim($aaVal['lfacalba'][$q])!=$albaranAnt && trim($aaVal['lfacalba'][$q])!=0 && $aaVal['lfactior'][$q]=='AV') { $albaranAnt = trim($aaVal['lfacalba'][$q]); $aOrd [$qqq] = str_pad('zzzzzz',30).str_pad($qqq,7,'0',STR_PAD_LEFT); $aaLin[$qqq] = array( 'coda' => '', 'cant' => 0, 'nomb' => 'Según albarán nº '.$albaranAnt, 'prec' => 0, 'impo' => 0, 'aran' => '', 'peso' => 0, ); $qqq++; } $aOrd [$qqq] = str_pad('zzzzzz',30).str_pad($qqq,7,'0',STR_PAD_LEFT);// para forzar que se conserve el orden original $aaLin[$qqq] = array( 'coda' => $coda, 'cant' => $cant, 'nomb' => $aaVal['lfacnomb'][$q], 'prec' => $prec, 'impo' => $impo, 'aran' => $aaVal['lfacaran'][$q], 'peso' => $peso, ); } // caso resumido por familias if ($numimpre%10 == 1) { if (bccomp($cant,0,8)!=0 || bccomp($impo,0,2)!=0) { // saltamos las líneas sin cantidades ni importes $fam = $aaVal['lfacfami'][$q]; if (! array_key_exists($fam, $aaLin)) { $aaLin[$fam] = array( 'coda' => $fam, 'cant' => 0, 'nomb' => $aaVal['lfacfano'][$q], 'prec' => 0, 'impo' => 0, 'aran' => $fam, 'peso' => $peso, // no se usa, pero lo ponemos por completitud macro-meta-chripiriti-flaútica ); // el array de orden lo llenamos de forma trivial para que no nos moleste la agrupación $aOrd[$fam] = str_pad('zzzzzz',30).$fam; } // acumulamos $aaLin[$fam]['cant'] = bcadd($aaLin[$fam]['cant'], $cant, 8); $aaLin[$fam]['impo'] = bcadd($aaLin[$fam]['impo'], $impo, 2); $aaLin[$fam]['prec'] = bcdiv($aaLin[$fam]['impo'], $aaLin[$fam]['cant'], 8); } } // caso reordenado por cod-esta-3 (país de procedencia), y agrupado por artículo if ($numimpre%10 == 2) { // índice para las tablas, código de artículo si hay, o nº de registro si no hay $codaExt = $coda=='' ? str_pad('zzzzzz',30).str_pad($qqq+10000000,7,'0',STR_PAD_LEFT) : $coda; //if (bccomp($cant,0,8)!=0 || bccomp($impo,0,2)!=0) { // saltamos las líneas sin cantidades ni importes if (! array_key_exists($codaExt, $aaLin)) { $aaLin[$codaExt] = array( 'coda' => $coda, 'cant' => 0, 'nomb' => $aaVal['lfacnomb'][$q], 'prec' => 0, 'impo' => 0, 'aran' => $aaVal['lfacaran'][$q], 'peso' => 0, ); // orden por cod-esta-3 $est3 = $aaVal['lfacest3'][$q]; if ($coda=='') { $aOrd[$codaExt] = $codaExt; } else { $aOrd[$codaExt] = str_pad(($est3!='' ? $est3 : 'zzzzzz'),30) // si no hay cod-esta-3, lo enviamos al final (lineas de texto incluidas) .str_pad($qqq,7,'0',STR_PAD_LEFT); // para forzar que los códigos iguales conserven el orden original } } // acumulamos $aaLin[$codaExt]['cant'] = bcadd($aaLin[$codaExt]['cant'], $cant, 8); $aaLin[$codaExt]['impo'] = bcadd($aaLin[$codaExt]['impo'], $impo, 2); if (bccomp($aaLin[$codaExt]['prec'],0,8)!=0 && bccomp($aaLin[$codaExt]['prec'],$prec,8)!=0) { $aaLin[$codaExt]['prec'] = bcdiv($aaLin[$codaExt]['impo'], $aaLin[$codaExt]['cant'], 8); } else { $aaLin[$codaExt]['prec'] = $prec; } $aaLin[$codaExt]['peso'] = bcadd($aaLin[$codaExt]['peso'], $peso, 8); // si no hay peso, añadimos un '*' a la partida arancelaria, como aviso de peso nulo en alguna línea if (bccomp($peso,0,8)==0 && bccomp($cant,0,8)!=0) $aaLin[$codaExt]['aran'] = '*'.$aaLin[$codaExt]['aran']; //} } // caso reordenado por cod-esta-3 (país de procedencia), SIN AGRUPAR, antiguo obsoleteado /* if ($numimpre%10 == 2) { $nomb = $aaVal['lfacnomb'][$q]; if (substr($nomb,0,12) == "S/Referencia") { continue; $aOrd[$qqq] = str_pad('', 30) // caso línea de texto de "S/Referencia" (deben ir al principio de todo) .str_pad($qqq,7,'0',STR_PAD_LEFT); // para forzar que los códigos iguales conserven el orden original } else { $est3 = $aaVal['lfacest3'][$q]; $aOrd[$qqq] = str_pad(($est3!='' ? $est3 : 'zzzzzz'),30) // si no hay cod-esta-3, lo enviamos al final (lineas de texto incluidas) .str_pad($qqq,7,'0',STR_PAD_LEFT); // para forzar que los códigos iguales conserven el orden original } // si no hay peso, añadimos un '*' para explicitarlo $aran = $aaVal['lfacaran'][$q]; if (bccomp($peso,0,8)==0 && bccomp($cant,0,8)!=0) $aran = '*'.$aran; $aaLin[$qqq] = array( 'coda' => $coda, 'cant' => $cant, 'nomb' => $aaVal['lfacnomb'][$q], 'prec' => $prec, 'impo' => $impo, 'aran' => $aran, 'peso' => $peso, ); } */ // caso resumido por GRUPOS DE CUENTAS DE FRA. if ($numimpre%10 == 3) { if (bccomp($cant,0,8)!=0 || bccomp($impo,0,2)!=0) { // saltamos las líneas sin cantidades ni importes $gru = $aaVal['lfacgruc'][$q]; $key = 'zzzzzz'.$gru; if (! array_key_exists($key, $aaLin)) { $aaLin[$key] = array( 'coda' => $gru, 'cant' => 0, 'nomb' => $aaVal['lfacgrun'][$q], 'prec' => 0, 'impo' => 0, 'aran' => $gru, 'peso' => $peso, // no se usa, pero lo ponemos por completitud macro-meta-chripiti-flautica ); } // el array de orden lo llenamos de forma trivial para que no nos moleste la agrupación $aOrd[$key] = str_pad('zzzzzz',30).$gru; // acumulamos $aaLin[$key]['cant'] = bcadd($aaLin[$key]['cant'], $cant, 8); $aaLin[$key]['impo'] = bcadd($aaLin[$key]['impo'], $impo, 2); $aaLin[$key]['prec'] = bccomp($aaLin[$key]['cant'],0,8)!=0 ? bcdiv($aaLin[$key]['impo'], $aaLin[$key]['cant'], 8) : '0'; } } // caso resumido por cod-esta-1 if ($numimpre%10 == 4) { if (bccomp($cant,0,8)!=0 || bccomp($impo,0,2)!=0) { // saltamos las líneas sin cantidades ni importes $gru = $aaVal['lfacsta1'][$q]; $key = 'zzzzzz'.$gru; if (! array_key_exists($key, $aaLin)) { $aaLin[$key] = array( 'coda' => $gru, 'cant' => 0, 'nomb' => $aaVal['lfacest1'][$q], 'prec' => 0, 'impo' => 0, 'aran' => $gru, 'peso' => $peso, // no se usa, pero lo ponemos por completitud macro-meta-chripiti-flautica ); } // el array de orden lo llenamos de forma trivial para que no nos moleste la agrupación $aOrd[$key] = str_pad('zzzzzz',30).$gru; // acumulamos $aaLin[$key]['cant'] = bcadd($aaLin[$key]['cant'], $cant, 8); $aaLin[$key]['impo'] = bcadd($aaLin[$key]['impo'], $impo, 2); $aaLin[$key]['prec'] = bccomp($aaLin[$key]['cant'],0,8)!=0 ? bcdiv($aaLin[$key]['impo'], $aaLin[$key]['cant'], 8) : '0'; } } // caso reordenado por cod-esta-2 (tienda), y agrupado por artículo if ($numimpre%10 == 5) { // índice para las tablas, código de artículo si hay, o nº de registro si no hay $codaExt = $coda=='' ? str_pad('zzzzzz',30).str_pad($qqq+10000000,7,'0',STR_PAD_LEFT) : $coda; if (! array_key_exists($codaExt, $aaLin)) { $aaLin[$codaExt] = array( 'coda' => $coda, 'cant' => 0, 'nomb' => $aaVal['lfacnomb'][$q], 'prec' => 0, 'impo' => 0, 'aran' => $aaVal['lfacaran'][$q], 'peso' => 0, ); // orden por cod-esta-1 $est2 = $aaVal['lfacest2'][$q]; if ($coda=='') { $aOrd[$codaExt] = $codaExt; } else { $aOrd[$codaExt] = str_pad(($est2!='' ? $est2 : 'zzzzzz'),30) // si no hay cod-esta-2, lo enviamos al final (lineas de texto incluidas) .str_pad($qqq,7,'0',STR_PAD_LEFT); // para forzar que los códigos iguales conserven el orden original } } // acumulamos $aaLin[$codaExt]['cant'] = bcadd($aaLin[$codaExt]['cant'], $cant, 8); $aaLin[$codaExt]['impo'] = bcadd($aaLin[$codaExt]['impo'], $impo, 2); if (bccomp($aaLin[$codaExt]['prec'],0,8)!=0 && bccomp($aaLin[$codaExt]['prec'],$prec,8)!=0) { $aaLin[$codaExt]['prec'] = bcdiv($aaLin[$codaExt]['impo'], $aaLin[$codaExt]['cant'], 8); } else { $aaLin[$codaExt]['prec'] = $prec; } $aaLin[$codaExt]['peso'] = bcadd($aaLin[$codaExt]['peso'], $peso, 8); // si no hay peso, añadimos un '*' a la partida arancelaria, como aviso de peso nulo en alguna línea if (bccomp($peso,0,8)==0 && bccomp($cant,0,8)!=0) $aaLin[$codaExt]['aran'] = '*'.$aaLin[$codaExt]['aran']; } // caso de resúmen final de importes/pesos por país/partida arancelaria if ($swRes && (bccomp($impo,0,2)!=0 || bccomp($peso,0,3)!=0)) { $key = str_pad($aaVal['lfacest3'][$q],30) . $aaVal['lfacaran'][$q]; if (! array_key_exists($key, $aaRes)) { $aaRes[$key] = array( 'impo' => 0, 'peso' => 0, ); } // acumulamos $aaRes[$key]['impo'] = bcadd($aaRes[$key]['impo'], $impo, 2); $aaRes[$key]['peso'] = bcadd($aaRes[$key]['peso'], $peso, 3); } } // abrimos 'body-auto' $out->setBody(16, 47); $out->openBody(); // para 'debug' del array de ordenacion if (false) { foreach ($aaLin as $key => $aLin) { $out->printText('cuc', $key.'->'.$aLin['impo'], 0, 10); $out->skipLineBody(); } } // ordenamos el array "$aaOrd" por cod-esta-3 (manteniendo las 'key' que son los punteros al array "$aaLin") asort($aOrd); ksort($aaRes); // título del código estadístico $estTit = ($idi!='en' ? 'País: ' : 'Country: '); if ($numimpre%10 == 4) { $estTit = ($idi!='en' ? 'Grupo: ' : 'Group: '); } if ($numimpre%10 == 5) { $estTit = ($idi!='en' ? 'Destino: ' : 'Destination: '); } // datos variables del cuerpo $estXant = ''; foreach ($aOrd as $key => $estX) { $estX = trim(substr($estX,0,30)); // quitamos el $qqq del final $estX = $estX=='' ? 'Missing!' : $estX; if ($estXant !== $estX) { if ($estX != 'zzzzzz') { $out->printText('cun', $estTit.$estX, 0, 10); // avanzamos línea $out->skipLineBody(); } $estXant = $estX; } $aLin = $aaLin[$key]; $out->printText('cue', toNumEdited($aLin['cant'],2,true,0), 0, 1, 8, 'R'); $nomb = substr(rtrim($aLin['nomb']),0,30); //$codi = ltrim($nacicodi!='TURQ' ? $aLin['coda'] : $aLin['aran']); $codi = ltrim($numimpre%10!=2&&$numimpre%10!=4 ? $aLin['coda'] : $aLin['aran']); $font = (substr($nomb,0,12) == "S/Referencia") ? 'cun' : 'cue'; $nomb = (substr($nomb,0,12) == "S/Referencia") ? trim(substr($nomb,12)) : $nomb; if ($out->getTextWidth($font, $nomb.' '.$codi, false) > 47) $font = 'cuc'; $out->printText($font, $nomb, 0, 10); $out->printText('cuc', $codi, 0, 47, 12, 'R'); //$prec = $aLin['prec']; //$prec = substr($prec,-4,2)=="00"?(substr($prec,-6,2)=="00"?substr($prec,0,-6):substr($prec,0,-4)):substr($prec,0,-2); $out->printText('cue', toNumEdited($aLin['prec'],6,true,2), 0, 60, 10, 'R'); $out->printText('cue', toNumEdited($aLin['impo'],2,true), 0, 71, 13, 'R'); // avanzamos línea $out->skipLineBody(); // si el 'nomb' tiene más de 30/60 dígitos, sacamos otra(s) línea(s) debajo if (strlen(rtrim($aLin['nomb'])) > 30) { $nomb = substr(rtrim($aLin['nomb']),30,30); $out->printText($font, $nomb, 0, 10); $out->skipLineBody(); if (strlen(rtrim($aLin['nomb'])) > 60) { $nomb = substr(rtrim($aLin['nomb']),60,30); $out->printText($font, $nomb, 0, 10); $out->skipLineBody(); } } } // datos resúmen por país/partida arancelaria $paisAnt = ''; $totImpo = 0; $totPeso = 0; $togImpo = 0; $togPeso = 0; foreach ($aaRes as $key => $aRes) { $pais = trim(substr($key,0,30)); $aran = trim(substr($key,30)); $pais = $pais=='' ? 'Missing!' : $pais; if ($paisAnt != $pais) { if ($paisAnt != '') { $out->printText('cun', $idi!='en'?'Total País: ':'Total Country:', 0, 10); $out->printText('ccn', toNumEdited($totImpo,2).' €', 0, 33, 10, 'R'); $out->printText('ccn', toNumEdited($totPeso,3).' Kg (Net)', 0, 50, 9, 'R'); $out->skipLineBody(); } $paisAnt = $pais; $totImpo = 0; $totPeso = 0; $out->skipLineBody(); $out->printText('cun', ($idi!='en'?'País: ':'Country: ').$pais, 0, 10); $out->skipLineBody(); } $out->printText('cuc', 'Intrastat '.$aran, 0, 10); $out->printText('cuc', toNumEdited($aRes['impo'],2).' €', 0, 33, 10, 'R'); $out->printText('cuc', toNumEdited($aRes['peso'],3).' Kg (Net)', 0, 50, 9, 'R'); // acumulamos $totImpo = bcadd($totImpo, $aRes['impo'], 2); $totPeso = bcadd($totPeso, $aRes['peso'], 3); $togImpo = bcadd($togImpo, $aRes['impo'], 2); $togPeso = bcadd($togPeso, $aRes['peso'], 3); // avanzamos línea $out->skipLineBody(); } if ($paisAnt != '') { $out->printText('cun', $idi!='en'?'Total País: ':'Total Country:', 0, 10); $out->printText('ccn', toNumEdited($totImpo,2).' €', 0, 33, 10, 'R'); $out->printText('ccn', toNumEdited($totPeso,3).' Kg (Net)', 0, 50, 9, 'R'); $out->skipLineBody(2); $out->printText('cun', $idi!='en'?'Total Intrastat: ':'Total Intrastat:', 0, 10); $out->printText('ccn', toNumEdited($togImpo,2).' €', 0, 33, 10, 'R'); $out->printText('ccn', toNumEdited($togPeso,3).' Kg (Net)', 0, 50, 9, 'R'); $out->skipLineBody(); } // datos fijos para Suiza if ($nacicodi == 'SUIZ') { $out->skipLineBody(); $nomb = "The exporter of the products covered by this document (Customs authorization No. ........)" ." declares that, except where otherwise clearly indicated, these products are of ECC preferential origin."; $aNomb = $out->makeAText('cun', $nomb, 49); $out->printText('cun', $aNomb, 0, 10); $out->skipLineBody(count($aNomb)); } // si el total líneas es diferente a la base imponible, sacamos "manipulación" $basI = toOperableNum($totabase); if (false) { // activar solo para 'debug' $out->printText('cue', 'base['.$basI.']', 0, 12); $out->printText('cue', 'lins['.$totL.']', 1, 12); $out->skipLineBody(2); } if (bccomp($totL, $basI, 2) != 0) { $out->skipLineBody(2); $out->printText('cun', $idi!='en'?'Manipulación':'Handling charges', 0, 10); $out->printText('cue', bcsub($basI, $totL, 2), 0, 71, 13, 'R'); $out->skipLineBody(); } // observaciones $cfactex1 = trim($cfactex1); $cfactex2 = trim($cfactex2); $cfactex3 = trim($cfactex3); if ($cfactex1 || $cfactex2 || $cfactex3) { $nomb = $cfactex1."\n".$cfactex2."\n".$cfactex3; $aNomb = $out->makeAText('cun', $nomb, 49); $out->skipLineBody(); $out->printBox(-0.5, 10.25, count($aNomb)+0.5, 58.75, 5, '000000', 'ebebeb'); $out->printText('cun', $aNomb, 0, 11); //$out->skipLineBody(count($aNomb)+1); } // cerramos 'body' de las lineas de detalle $ultLinea = $out->closeBody(); // datos pie $q0 = 48.3; // parametros de líneas irpf/base/iva/total $qD = 1; $fs = 'cab'; $fn = 'can'; $out->printText('cab', $idi!='en'?'Fecha pago':'Due date', $q0-0.15, 1); $out->printText('cab', '$pacofec1', $q0-0.15, 15); // campos numéricos "operables" $baseirpf = toOperableNum($baseirpf); $ttpcirpf = toOperableNum($ttpcirpf); $totairpf = toOperableNum($totairpf); $totairpf = bcmul($totairpf, '-1', 2); $totabase = toOperableNum($totabase); $ttpcivaS = bccomp(toOperableNum($ttpciva1),0,2)!=0 ? toOperableNum($ttpciva1) : (bccomp(toOperableNum($ttpciva2),0,2)!=0 ? toOperableNum($ttpciva2) : toOperableNum($ttpciva3)); $totaivaS = bcadd(bcadd(toOperableNum($totaiva1),toOperableNum($totaiva2),2),toOperableNum($totaiva3),2); $totfirpf = toOperableNum($totfirpf); // irpf if ($totairpf != 0) { $out->setFont('cab8', 'Arial', 62); $out->setFont('can8', 'Arial', 62, 0, 'B'); $fs = 'cab8'; $fn = 'can8'; $out->printText($fs, $idi!='en'?'Retención IRPF':'Holding tax', $q0, 40.5); $out->printText($fs, toNumEdited($baseirpf,2)." x ".toNumEdited($ttpcirpf,2)." %", $q0, 65, 7, 'R'); $out->printText($fs, toNumEdited($totairpf,2), $q0, 69, 15, 'R'); $q0 = 49; $qD = 0.8; } $out->printText($fs, $idi!='en'?'BASE IMPONIBLE':'TAX BASE', $q0+0*$qD, 40.5); if ($totaivaS != 0) { $out->printText($fs, $idi!='en'?($igic ? $igic:'IVA'):'VAT',$q0+1*$qD, 40.5); } $out->printText($fn, 'TOTAL', $q0+2*$qD, 40.5); if (bccomp($ttpcivaS,0,2) == 0) { if ($sericomu != 'N') { $out->printText('can', 'VAT Exempted. R.D. 1624/92', $q0+3.5, 40.5); } else { if ($igic) { $out->printText('can', 'IVA EXENTO POR EXPORTACION. R.D. 1624/92', $q0+3.5, 40.5); } } } $out->printText($fs, toNumEdited($totabase,2), $q0+0*$qD, 69, 15, 'R'); if ($ttpcivaS != 0) { $out->printText($fs, toNumEdited($ttpcivaS,2)." %", $q0+1*$qD, 65, 7, 'R'); $out->printText($fs, toNumEdited($totaivaS,2), $q0+1*$qD, 69, 15, 'R'); } $out->printText($fn, toNumEdited($totfirpf,2), $q0+2*$qD, 69, 15, 'R'); $out->closeDoc(); // para convertir un string numérico editado en español, a formato "operable" // (con punto decimal, sin separación de miles, y sin espacios laterales) function toOperableNum ($num) { return strtr(trim($num), array('.'=>'', ','=>'.')); } // edita una cadena numérica al formato de edición visualizable // $num -> cadena del valor numérico a editar // $dec: -> valor numérico con los decimales de la salida a ver // $swCleanCero-> indicador de si hay que dejar los valores cero en blanco (false=no) // $minDec: -> minimiza decimales al valor $minDecs (si es -1 o null, no minimiza) // (solo tiene efecto si '$dec' es mayor que cero) function toNumEdited ($num, $dec, $swCleanCero=false, $minDec=null) { // controlamos el FORMATO 1 if ($minDec === null) { $minDec = -1; } // si los ceros no hay que verlos, lo testamos antes que nada if ($swCleanCero) if (bccomp(trim($num),'0',$dec)==0) return ''; // partimos la parte entera y la decimal $t = explode('.', trim($num)); if (strlen($t[0])==0) // si la parte entera está vacía, le ponemos un '0' $t[0] = '0'; if (count($t)==1) // si no hay decimales, los creamos $t[1] = '0'; // añadimos puntos a la parte entera $t[0] = toMilEdited($t[0]); // componemos el resultado $sal = $t[0]; // cogemos la parte entera if ($dec > 0) { $saldec = substr($t[1],0,$dec); // reducimos la parte decimal al número de decimales $saldec = str_pad($saldec,$dec,'0'); // ampliamos la parte decimal al número de decimales if ($minDec>=0 && $minDec < $dec) // minimizamos los decimales while (strlen($saldec)>$minDec && substr($saldec,-1)=='0') $saldec = substr($saldec,0,-1); if ($saldec!='') $sal .= ',' . $saldec; // añadimos la parte decimal (si hay) } // si estamos en inglés, reconvertimos global $idi; if ($idi == 'en') { $sal = strtr($sal, array('.'=>',', ','=>'.')); } return $sal; } // función para añadir los puntos de miles a un string numérico function toMilEdited ($num) { while (preg_match('!(-?\d+)(\d\d\d)!', $num)) $num = preg_replace('!(-?\d+)(\d\d\d)!', '$1.$2', $num); return $num; } ?>