content['links'] = array( '#prefix' => '', '#weight' => -25, ); // Bodge fix to keep html and pdf invoices working. Without language, menu items default to /storm if(!$node->language) { $node->language = 'en'; } $node->content['links']['print']['html'] = array( '#prefix' => '', '#value' => l(t('Print HTML'), 'storm/invoice/report/'. $node->nid .'/html/'. $node->language), '#weight' => $w++, ); // Display link to tcpdf library only if library is installed. $tcpdf_dir = variable_get('storminvoice_tcpdf_location', 'sites/all/libraries/tcpdf'); if(file_exists($tcpdf_dir .'/tcpdf.php')) { $node->content['links']['print']['pdf'] = array( '#prefix' => '', '#value' => l(t('Print PDF'), 'storm/invoice/report/'. $node->nid .'/pdf/'. $node->language), '#weight' => $w++, ); $node->content['links']['print']['email'] = array( '#value' => t('Send PDF via e-mail'), '#prefix' => '', '#value' => l(t('Send PDF via e-mail'), 'storm/invoice/report/'. $node->nid .'/email/'. $node->language, array('query' => drupal_get_destination())), '#weight' => $w++, ); } $node->content['group1'] = array( '#prefix' => '
', '#suffix' => '
', '#weight' => module_exists('content') ? content_extra_field_weight($node->type, 'group1') : -20, ); $node->content['group1']['number'] = array( '#prefix' => '
', '#suffix' => '
', '#value' => theme('storm_view_item', t('Number'), $node->number), '#weight' => 1, ); $node->content['group2'] = array( '#prefix' => '
', '#suffix' => '
', '#weight' => module_exists('content') ? content_extra_field_weight($node->type, 'group2') : -19, ); $node->content['group2']['organization'] = array( '#prefix' => '
', '#suffix' => '
', '#value' => theme('storm_view_item', t('Organization'), l($node->organization_title, 'node/'. $node->organization_nid)), '#weight' => 1, ); $node->content['group2']['project'] = array( '#prefix' => '
', '#suffix' => '
', '#value' => theme('storm_view_item', t('Project'), l($node->project_title, 'node/'. $node->project_nid)), '#weight' => 2, ); if($node->reference) { $node->content['group2']['reference'] = array( '#prefix' => '
', '#suffix' => '
', '#value' => theme('storm_view_item', t('Reference'), $node->reference), '#weight' => 3, ); } $node->content['group3'] = array( '#prefix' => '
', '#suffix' => '
', '#weight' => module_exists('content') ? content_extra_field_weight($node->type, 'group3') : -18, ); $node->content['group3']['requestdate'] = array( '#prefix' => '
', '#suffix' => '
', '#value' => theme('storm_view_item', t('Request date'), format_date($node->requestdate, 'custom', 'Y-m-d')), '#weight' => 1, ); $node->content['group3']['duedate'] = array( '#prefix' => '
', '#suffix' => '
', '#value' => theme('storm_view_item', t('Due date'), format_date($node->duedate, 'custom', 'Y-m-d')), '#weight' => 2, ); if($node->paymentdate) { $node->content['group3']['paymentdate'] = array( '#prefix' => '
', '#suffix' => '
', '#value' => theme('storm_view_item', t('Payment date'), $node->paymentdate? format_date($node->paymentdate, 'custom', 'Y-m-d') : ''), '#weight' => 3, ); } $status = 'open'; if ($node->paymentdate) { $status = 'paid'; } else if ($node->duedate < time()) { $status = 'overdue'; } $node->content['group3']['status'] = array( '#prefix' => '
', '#suffix' => '
', '#value' => theme('storm_view_item', t('Status'), $status), '#weight' => 4, ); // Processing for invoice items. $header = array( array( 'data' => t('Item'), ), array( 'data' => t('Amount'), //'style' => 'text-align: right;', ), array( 'data' => t('Tax 1'), //'style' => 'text-align: right;', ), array( 'data' => t('Tax 2'), //'style' => 'text-align: right;', ), array( 'data' => t('Total'), //'style' => 'text-align: right;', ), ); $where = array(); $s = "SELECT sit.description, sit.amount, sit.tax1, sit.tax2, sit.total FROM {storminvoice_items} sit WHERE sit.invoice_vid=%d ORDER BY sit.weight ASC"; $r = db_query($s, $node->vid); $invoice_items = array(); $i = 0; while ($invoice_item = db_fetch_array($r)) { $invoice_items[$i] = $invoice_item; $i++; } foreach ($invoice_items as $key => $inv_item) { // PHP4 compatibility - for D7 change this to use the original array by reference $invoice_items[$key]['amount'] = sprintf("%.2f", $inv_item['amount']); $invoice_items[$key]['tax1'] = sprintf("%.2f", $inv_item['tax1']); $invoice_items[$key]['tax2'] = sprintf("%.2f", $inv_item['tax2']); $invoice_items[$key]['total'] = sprintf("%.2f", $inv_item['total']); } $node->content['group4'] = array( '#prefix' => '
', '#value' => theme('table', $header, $invoice_items), '#suffix' => '
', '#weight' => module_exists('content') ? content_extra_field_weight($node->type, 'group4') : -17, ); $node->content['group5'] = array( '#prefix' => '
', '#suffix' => '
', '#weight' => module_exists('content') ? content_extra_field_weight($node->type, 'group5') : -16, ); $node->content['group5']['amount'] = array( '#prefix' => '
', '#suffix' => '
', '#value' => theme('storm_view_item', t('Amount'), sprintf('%.2f', $node->amount)), '#weight' => 1, ); $node->content['group5']['tax1'] = array( '#prefix' => '
', '#suffix' => '
', '#value' => theme('storm_view_item', t('Tax 1'), sprintf('%.2f', $node->tax1)), '#weight' => 2, ); $node->content['group5']['tax2'] = array( '#prefix' => '
', '#suffix' => '
', '#value' => theme('storm_view_item', t('Tax 2'), sprintf('%.2f', $node->tax2)), '#weight' => 3, ); $node->content['group5']['total'] = array( '#prefix' => '
', '#suffix' => '
', '#value' => theme('storm_view_item', t('Total'), sprintf('%.2f', $node->total)), '#weight' => 4, ); $organization = node_load($node->organization_nid); $myorg = node_load(variable_get('storm_organization_nid', 0)); if ($myorg->orglanguage != $organization->orglanguage) { $language = $organization->orglanguage .','. $myorg->orglanguage; } else { $language = $myorg->orglanguage; } if($node->content['body']['#value']) { $node->content['body_field'] = array( '#prefix' => '
', '#suffix' => '
', '#value' => theme('storm_view_item', t('Description'), $node->content['body']['#value']), '#weight' => module_exists('content') ? content_extra_field_weight($node->type, 'body_field') : -18, ); unset($node->content['body']); } return $node; } function theme_storminvoice_report($node, $report, $language) { if($report=='html') { print theme('storminvoice_report_html', $node, $language); } else if ($report=='pdf') { theme('storminvoice_report_pdf', $node, $language); } } function theme_storminvoice_report_pdf($node, $language, $output = 'screen') { $tcpdf_dir = variable_get('storminvoice_tcpdf_location', 'sites/all/libraries/tcpdf'); // Performs simple check for existance of tcpdf library . If it doesn't exist, revert to node display with message about tcpdf library. if(!file_exists($tcpdf_dir .'/tcpdf.php')) { drupal_set_message(t('The tcpdf library has not been installed. See the Storm module README.txt for more details.')); drupal_goto('node/'. $node->nid); } require_once($tcpdf_dir .'/config/lang/eng.php'); require_once($tcpdf_dir .'/tcpdf.php'); $languages = explode(',', $language); $language = $languages[0]; $language1 = ''; if (array_key_exists(1, $languages)) { $language1 = $languages[1]; } $status = 'open'; if ($node->paymentdate) { $status = 'paid'; } else if ($node->duedate < time()) { $status = 'overdue'; } $countries = stormattribute_attributes_bydomain('Country'); $countries = $countries['values']; $currencies = stormattribute_attributes_bydomain('Currency'); $currencies = $currencies['values']; $myorg = node_load(variable_get('storm_organization_nid', 0)); $mycurrency = $currencies[$myorg->currency]; $organization = node_load($node->organization_nid); $project = node_load($node->project_nid); $o = ''; $title = t('Invoice', array(), $language); $complete_title = $title .' '. $myorg->title .' : '. $organization->title .' - '. $node->number; $pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true); $pdf->SetCreator(PDF_CREATOR); $pdf->SetAuthor("Storm"); $pdf->SetTitle($complete_title); $pdf->SetSubject($title); $pdf->SetKeywords($title, $myorg->title, $organization->title, $node->number); $pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT); $pdf->setPrintHeader(false); $pdf->setPrintFooter(false); $margins = $pdf->getMargins(); $pageWidth = $pdf->getPageWidth() - $margins['left'] - $margins['right']; $pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM); $pdf->AddPage(); $pdf->setDrawColor(204, 204, 204); $pdf->setFillColor(220, 220, 220); $pdf->SetFont("times", "B", 14); $headerleft = variable_get('site_name', '') .'
'. variable_get('site_slogan', ''); $pdf->writeHTMLCell($pageWidth *.5, 0, $pdf->getX(), $pdf->getY(), $headerleft, 0 ,0 ,0, false, 'L'); $pdf->SetFont("times", "N", 10); $pdf->writeHTMLCell($pageWidth *.5, 0, $pdf->getX(), $pdf->getY(), variable_get('storm_report_header', ''), 0 ,1 ,0, false, 'R'); $pdf->SetFont("times", "B", 14); $o = $title; if ($language1) $o .= "\n". t('Invoice', array(), $language1); $pdf->MultiCell(0, 0, $o, 0 ,'C', 0, 1,$pdf->getX(), $pdf->getY() + 10); $y = $pdf->getY() + 10; $pdf->SetFont("times", "B", 10); $o = t('Bill to', array(), $language); if ($language1) $o .= "\n". t('Bill to', array(), $language1); $pdf->MultiCell($pageWidth *.4, 0, $o, 'B', 'L', 0, 1, PDF_MARGIN_LEFT, $y); $o = $organization->fullname ."\n"; $o .= $organization->address ."\n"; $o .= $organization->city ."\n"; if ($organization->zip) $o .= $organization->zip .' '; if ($organization->provstate) $o .= $organization->provstate .' '; $o .= $countries[$organization->country] ."\n";; if ($organization->taxid) { $o .= t('Tax ID', array(), $language); if ($language1) $o .= ' / '. t('Tax ID', array(), $language1); $o .= ' : '. $organization->taxid; } $pdf->SetFont("times", "N", 10); $pdf->MultiCell($pageWidth *.4, 0, $o,0 , 'L' ,0, 1, PDF_MARGIN_LEFT); $destY = $pdf->getY(); $w = ($pageWidth *.5) / 4; $pdf->SetFont("times", "B", 10); $o = t('Invoice#', array(), $language); if ($language1) $o .= "\n". t('Invoice#', array(), $language1); $pdf->MultiCell($w-2, 0, $o, 1, 'L', 1, 0, PDF_MARGIN_LEFT + $pageWidth *.5, $y); $o = t('Currency', array(), $language); if ($language1) $o .= "\n". t('Currency', array(), $language1); $pdf->MultiCell($w-3, 0, $o, 1, 'L', 1, 0); $o = t('Date', array(), $language); if ($language1) $o .= "\n". t('Date', array(), $language1); $pdf->MultiCell($w+5, 0, $o, 1, 'L', 1, 0); $o = t('Reference', array(), $language); if ($language1) $o .= "\n". t('Reference', array(), $language1); $pdf->MultiCell($w, 0, $o, 1, 'L', 1, 1); $pdf->SetFont("times", "N", 10); $h = $pdf->getY(); $pdf->MultiCell($w, 0, $node->reference?$node->reference:'-' , 1, 'L', 0, 1, PDF_MARGIN_LEFT + $pageWidth*.5 + $w*3); $h = $pdf->getY() - $h; $pdf->MultiCell($w-2, $h, $node->number, 1, 'L', 0, 0, PDF_MARGIN_LEFT + $pageWidth *.5, $pdf->getY() - $h); $pdf->MultiCell($w-3, $h, $mycurrency, 1, 'L', 0, 0); $pdf->MultiCell($w+5, $h, format_date($node->requestdate, 'custom', 'Y-m-d'), 1, 'L', 0, 1); $pdf->SetFont("times", "B", 10); $o = t('Due total', array(), $language); if ($language1) $o .= "\n". t('Due total', array(), $language1); $pdf->MultiCell($w*2 - 5, 0, $o, 1, 'L', 1, 0, PDF_MARGIN_LEFT + $pageWidth *.5); $o = t('Due date', array(), $language); if ($language1) $o .= "\n". t('Due date', array(), $language1); $pdf->MultiCell($w + 5, 0, $o, 1, 'L', 1, 0); $o = t('Terms', array(), $language); if ($language1) $o .= "\n". t('Terms', array(), $language1); $pdf->MultiCell($w, 0, $o, 1, 'L', 1, 1); $pdf->SetFont("times", "B", 10); $o = $mycurrency .' '. sprintf('%.2f', $node->total); if ($organization->currency != $myorg->currency) { $o .= "\n". $organization->currency .' '. sprintf('%.2f', $node->totalcustomercurr); } $pdf->MultiCell($w*2 - 5, 12, $o, 1, 'C', 0, 0, PDF_MARGIN_LEFT + $pageWidth *.5); $pdf->SetFont("times", "N", 10); $pdf->MultiCell($w + 5, 12, format_date($node->duedate, 'custom', 'Y-m-d'), 1, 'L', 0, 0); $pdf->MultiCell($w, 12, variable_get('storminvoice_payment_terms', ''), 1, 'L', 0, 1); $y = $pdf->getY(); if($destY > $y) $y = $destY; $pdf->setY($y+10); $pdf->setX(PDF_MARGIN_LEFT); $pdf->SetFont("times", "B", 10); $o = t('Description', array(), $language); if ($language1) $o .= "\n". t('Description', array(), $language1); $pdf->MultiCell($pageWidth * .4, 0, $o, 1, 'L', 1, 0); $o = t('Amount', array(), $language); if ($language1) $o .= "\n". t('Amount', array(), $language1); $pdf->MultiCell($pageWidth * .15, 0, $o, 1, 'C', 1, 0); $o = variable_get('storm_tax1_name', 'VAT'); if ($language1) $o .= "\n". variable_get('storm_tax1_name', 'VAT'); $pdf->MultiCell($pageWidth * .15, 0, $o, 1, 'C', 1, 0); $o = variable_get('storm_tax2_name', 'Tax 2'); if ($language1) $o .= "\n". variable_get('storm_tax2_name', 'Tax 2'); $pdf->MultiCell($pageWidth * .15, 0, $o, 1, 'C', 1, 0); $o = t('Total', array(), $language); if ($language1) $o .= "\n". t('Total', array(), $language1); $pdf->MultiCell($pageWidth * .15, 0, $o, 1, 'C', 1, 1); $pdf->SetFont("times", "N", 10); $items = storminvoice_getitems($node->vid); $rows = array(); $pdf->setFillColor(245, 245, 245); $c = 0; foreach ($items as $i) { if ($c==2) $c=0; $y = $pdf->getY(); $h = $pdf->getY(); $pdf->MultiCell($pageWidth * .4, 0, $i->description, 1, 'L', $c, 1); $h = $pdf->getY() - $h; $pdf->setY($y); $pdf->setX(PDF_MARGIN_LEFT + $pageWidth * .4); $pdf->Cell($pageWidth * .15, $h, sprintf('%.2f', $i->amount), 1, 0, 'R', $c); $pdf->Cell($pageWidth * .15, $h, sprintf('%.2f', $i->tax1), 1, 0, 'R', $c); $pdf->Cell($pageWidth * .15, $h, sprintf('%.2f', $i->tax2), 1, 0, 'R', $c); $pdf->Cell($pageWidth * .15, $h, sprintf('%.2f', $i->total), 1, 1, 'R', $c); $c++; } if ($node->taxexempt && $language1=='it') { $o = t('Tax exempt art. 7', array(), $language); if ($language1) $o .= "\n". t('Tax exempt art. 7', array(), $language1); $pdf->MultiCell($pageWidth, 0, $o,0 , 'L' ,0, 1, $pdf->getX(), $pdf->getY() + 5); } $y = $pdf->getY() + 10; $pdf->setY($y); $pdf->SetFont("times", "B", 10); $pdf->Cell($pageWidth, 5, t('Payment', array(), $language), 'B', 0, 'L'); $pdf->SetFont("times", "N", 10); $pdf->MultiCell($pageWidth, 0, variable_get('storminvoice_payment_modes', ''), 0 , 'L' , 0, 1, PDF_MARGIN_LEFT, $pdf->getY(), true, 0, true); if ($status=='paid') { $y = $pdf->getY() + 10; $pdf->setY($y); $pdf->SetFont("times", "B", 14); $pdf->Cell(0, 12, t('Paid in full', array(), $language), 0 ,1,'C'); } $filename = strtolower($title . '_' . $myorg->title . '_' . $organization->title . '_' . str_replace('/', '-', $node->number)) .'.pdf'; //Close and output PDF document if ($output == 'screen') { $pdf->Output($filename, "I"); } else if ($output == 'email') { $dir = file_directory_path().'/'; variable_set('storminvoice_email_pdf_file_path', $dir.$filename); variable_set('storminvoice_email_pdf_file_name', $filename); return $pdf->Output($dir.$filename, "S"); } } function theme_storminvoice_report_html($node, $language) { $languages = explode(',', $language); $language = $languages[0]; $language1 = ''; if (array_key_exists(1, $languages)) { $language1 = $languages[1]; } $status = 'open'; if ($node->paymentdate) { $status = 'paid'; } else if ($node->duedate < time()) { $status = 'overdue'; } $countries = stormattribute_attributes_bydomain('Country'); $currencies = stormattribute_attributes_bydomain('Currency'); $myorg = node_load(variable_get('storm_organization_nid', 0)); $mycurrency = $currencies[$myorg->currency]; $organization = node_load($node->organization_nid); $project = node_load($node->project_nid); $o = ''; $title = t('Invoice', array(), $language); if ($language1) $title .= '
'. t('Invoice', array(), $language1); $headtitle = $title . ' '. $myorg->title . ' : ' . $organization->title . ' - ' . $node->number; $o .= '
'; $o .= '
'; $o .= ''; $o .= ''; $o .= '
'; $o .= t('Bill To :', array(), $language); if ($language1) $o .= '
'. t('Bill to :', array(), $language1); $o .= '
'; $o .= ''. $organization->fullname .''; $o .= '
'; $o .= $organization->address; $o .= '
'; $o .= $organization->city; $o .= '
'; $o .= $organization->provstate .' '. $organization->zip .' '. $countries[$organization->country]; $o .= '
'; if ($organization->taxid) { $o .= t('Tax ID', array(), $language); if ($language1) $o .= ' / '. t('Tax ID', array(), $language1); $o .= ' : '. $organization->taxid; } $o .= '
'; $o .= '
'; $o .= ''; $o .= ''; $o .= ''; $o .= ''; $o .= ''; $o .= ''; $o .= ''; $o .= ''; $o .= ''; $o .= ''; $o .= ''; $o .= ''; $o .= ''; $o .= ''; $o .= ''; $o .= ''; $o .= ''; $o .= ''; $o .= ''; $o .= ''; $o .= ''; $o .= ''; $o .= '
'; $o .= t('Invoice#', array(), $language); if ($language1) $o .= '
'. t('Invoice#', array(), $language1); $o .='
'; $o .= t('Currency', array(), $language); if ($language1) $o .= '
'. t('Currency', array(), $language1); $o .= '
'; $o .= t('Date', array(), $language); if ($language1) $o .= '
'. t('Date', array(), $language1); $o .= '
'; $o .= t('Reference', array(), $language); if ($language1) $o .= '
'. t('Reference', array(), $language1); $o .= '
'. $node->number .''. $mycurrency .''. format_date($node->requestdate, 'custom', 'Y-m-d') .''. $node->reference .'
'; $o .= t('Due total', array(), $language); if ($language1) $o .= '
'. t('Due total', array(), $language1); $o .= '
'; $o .= t('Due date', array(), $language); if ($language1) $o .= '
'. t('Due date', array(), $language1); $o .= '
'; $o .= t('Terms', array(), $language); if ($language1) $o .= '
'. t('Terms', array(), $language1); $o .= '
'; $o .= $mycurrency .' '. sprintf('%.2f', $node->total); if ($organization->currency != $myorg->currency) { $o .= '
'; $o .= '('. $organization->currency .' '. sprintf('%.2f', $node->totalcustomercurr) .')'; } $o .= '
'. format_date($node->duedate, 'custom', 'Y-m-d') .''. variable_get('storminvoice_payment_terms', '') .'
'; $o .= '
'; $description = t('Description', array(), $language); if ($language1) $description .= '
'. t('Description', array(), $language1); $amount = t('Amount', array(), $language); if ($language1) $amount .= '
'. t('Amount', array(), $language1); $tax1 = variable_get('storm_tax1_name', 'VAT'); if ($language1) $tax1 .= '
'. variable_get('storm_tax1_name', 'VAT'); $tax2 = variable_get('storm_tax2_name', 'Tax 2'); if ($language1) $tax1 .= '
'. variable_get('storm_tax2_name', 'Tax 2'); $total = t('Total', array(), $language); if ($language1) $total .= '
'. t('Total', array(), $language1); $header = array( array( 'data' => $description, ), array( 'data' => $amount, ), array( 'data' => $tax1, ), array( 'data' => $tax2, ), array( 'data' => $total, ), ); $items = storminvoice_getitems($node->vid); $rows = array(); foreach ($items as $i) { $rows[] = array( array( 'data' => $i->description, ), array( 'data' => sprintf('%.2f', $i->amount), 'style' => 'text-align: right;', ), array( 'data' => sprintf('%.2f', $i->tax1), 'style' => 'text-align: right;', ), array( 'data' => sprintf('%.2f', $i->tax2), 'style' => 'text-align: right;', ), array( 'data' => sprintf('%.2f', $i->total), 'style' => 'text-align: right;', ), ); } $total = t('Total', array(), $language); if ($language1) $total .= ' / '. t('Total', array(), $language1); $rows[] = array( array( 'data' => $total, 'style' => 'font-weight: bold; text-align: center; background-color: #e9e9e9;', ), array( 'data' => sprintf('%.2f', $node->amount), 'style' => 'text-align: right;', ), array( 'data' => sprintf('%.2f', $node->tax1), 'style' => 'text-align: right;', ), array( 'data' => sprintf('%.2f', $node->tax2), 'style' => 'text-align: right;', ), array( 'data' => sprintf('%.2f', $node->total), 'style' => 'text-align: right;', ), ); $o .= '
'. theme('table', $header, $rows) .'
'; // Specific to Italian invoices if ($node->taxexempt && $language1=='it') { $o .= '
'; $o .= t('Tax exempt art. 7', array(), $language); if ($language1) $o .= '
'. t('Tax exempt art. 7', array(), $language1); $o .= '
'; } $o .= '
'; $o .= ''; $o .= ''; $o .= '
'; $o .= t('Payment', array(), $language); if ($language1) $o .= '
'. t('Payment', array(), $language1); $o .= '
'; $o .= variable_get('storminvoice_payment_modes', ''); $o .= '
'; if ($status=='paid') { $o .= ''; } return theme('storm_report', $header, $o, $title, $footer, $headtitle); }