nid = $invoice->nid; $n->uid = $invoice->uid; $n->organization_nid = $invoice->organization_nid; $n->project_nid = $invoice->project_nid; $n->type = 'storminvoice'; $invoice->status = 'open'; if ($invoice->paymentdate) { $invoice->status = 'paid'; } else if ($invoice->duedate < time()) { $invoice->status = 'overdue'; } $rows[] = array( array( 'data' => storm_icon('invoice_status_'. check_plain($invoice->status), check_plain($invoice->status)), 'style' => 'text-align: center', ), array( 'data' => l($invoice->number, 'node/'. $invoice->nid), 'style' => 'text-align: right', ), l($invoice->organization_title, 'node/'. $invoice->organization_nid), l($invoice->project_title, 'node/'. $invoice->project_nid), l($invoice->title, 'node/'. $invoice->nid), format_date($invoice->requestdate, 'custom', 'Y-m-d'), array('data' => sprintf('%.2f', $invoice->total), 'align' => 'right'), array( 'data' => storm_icon_edit_node($n, $_GET) .' '. storm_icon_delete_node($n, $_GET), 'class' => 'storm_list_operations', ), ); } $o = theme('table', $header, $rows); $o .= theme('pager', NULL, $itemsperpage, 0); $header = array( array( 'data' => ' ', ), array( 'data' => t('Amount'), 'style' => 'text-align: right;', ), ); $header[] = array( 'data' => t(variable_get('storm_tax1_name', 'Tax 1')), 'style' => 'text-align: right;', ); $header[] = array( 'data' => t(variable_get('storm_tax2_name', 'Tax 2')), 'style' => 'text-align: right;', ); $header[] = array( 'data' => t('Total'), 'style' => 'text-align: right;', ); $rows = array(); $rows[] = array( array( 'data' => t('Total to pay'), 'style' => 'font-weight: bold;', ), array( 'data' => sprintf('%.2f', $totals_topay->amount), 'style' => 'text-align: right;', ), ); $rows[key(end($rows))][] = array( 'data' => sprintf('%.2f', $totals_topay->tax1), 'style' => 'text-align: right;', ); $rows[key(end($rows))][] = array( 'data' => sprintf('%.2f', $totals_topay->tax2), 'style' => 'text-align: right;', ); $rows[key(end($rows))][] = array( 'data' => sprintf('%.2f', $totals_topay->total), 'style' => 'text-align: right;', ); $rows[] = array( array( 'data' => t('Total paid'), 'style' => 'font-weight: bold;', ), array( 'data' => sprintf('%.2f', $totals_paid->amount), 'style' => 'text-align: right;', ), ); $rows[end(array_keys($rows))][] = array( 'data' => sprintf('%.2f', $totals_paid->tax1), 'style' => 'text-align: right;', ); $rows[end(array_keys($rows))][] = array( 'data' => sprintf('%.2f', $totals_paid->tax2), 'style' => 'text-align: right;', ); $rows[end(array_keys($rows))][] = array( 'data' => sprintf('%.2f', $totals_paid->total), 'style' => 'text-align: right;', ); $rows[] = array( array( 'data' => t('Total'), 'style' => 'font-weight: bold;', ), array( 'data' => sprintf('%.2f', $totals->amount), 'style' => 'text-align: right;', ), ); $rows[end(array_keys($rows))][] = array( 'data' => sprintf('%.2f', $totals->tax1), 'style' => 'text-align: right;', ); $rows[end(array_keys($rows))][] = array( 'data' => sprintf('%.2f', $totals->tax2), 'style' => 'text-align: right;', ); $rows[end(array_keys($rows))][] = array( 'data' => sprintf('%.2f', $totals->total), 'style' => 'text-align: right;', ); $o .= theme('table', $header, $rows); return $o; } /** * Returns the HTML code for the invoice view page * * @param $node * The node object that contains the invoice. * @param $teaser * True if the teaser is showed. * @param $page * True if the full page is showed. * @return * The node object that contains the invoice. */ function theme_storminvoice_view($node, $teaser = FALSE, $page = FALSE) { // Add generic Storm node CSS drupal_add_css(drupal_get_path('module', 'storm') . '/storm-node.css', 'module'); // Adds CSS for Storm Invoice node view drupal_add_css(drupal_get_path('module', 'storminvoice') . '/storminvoice-nodeview.css'); $node = node_prepare($node, $teaser); $l_pos = 1; // Used to increase the link position number (see issue 814820) $node->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' => $l_pos++, ); // 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' => $l_pos++, ); $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' => $l_pos++, ); } $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'), check_plain($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;', ), ); if ($node->tax1) { $header[] = array( 'data' => t(variable_get('storm_tax1_name', 'Tax 1')), //'style' => 'text-align: right;', ); } if ($node->tax2) { $header[] = array( 'data' => t(variable_get('storm_tax2_name', 'Tax 2')), //'style' => 'text-align: right;', ); } $header[] = array( 'data' => t('Total'), //'style' => 'text-align: right;', ); $where = array(); $s = "SELECT sit.description, sit.amount, "; if ($node->tax1) { $s .= "sit.tax1, "; } if ($node->tax2) { $s .= "sit.tax2, "; } $s .= "sit.total, sit.src_nid 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']); if ($node->tax1) { $invoice_items[$key]['tax1'] = sprintf("%.2f", $inv_item['tax1']); } if ($node->tax2) { $invoice_items[$key]['tax2'] = sprintf("%.2f", $inv_item['tax2']); } $invoice_items[$key]['total'] = sprintf("%.2f", $inv_item['total']); if ($invoice_items[$key]['src_nid'] != 0 AND $invoice_items[$key]['src_nid'] != NULL) { $invoice_items[$key]['description'] = l(t($invoice_items[$key]['description']), 'node/'. $inv_item['src_nid']); } unset($invoice_items[$key]['src_nid']); } $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, ); if ($node->tax1) { $node->content['group5']['tax1'] = array( '#prefix' => '
', '#suffix' => '
', '#value' => theme('storm_view_item', t(variable_get('storm_tax1_name', 'Tax 1')), sprintf('%.2f', $node->tax1)), '#weight' => 2, ); } if ($node->tax2) { $node->content['group5']['tax2'] = array( '#prefix' => '
', '#suffix' => '
', '#value' => theme('storm_view_item', t(variable_get('storm_tax2_name', '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 (isset($myorg->orglanguage)) { 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); if ($node->tax1) { $o = variable_get('storm_tax1_name', 'Tax 1'); if ($language1) $o .= "\n". variable_get('storm_tax1_name', 'Tax 1'); $pdf->MultiCell($pageWidth * .15, 0, $o, 1, 'C', 1, 0); } if ($node->tax2) { $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); if ($node->tax1) { $pdf->Cell($pageWidth * .15, $h, sprintf('%.2f', $i->tax1), 1, 0, 'R', $c); } if ($node->tax2) { $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('invoice_'. 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'); $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); 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); if ($node->tax1) { $tax1 = variable_get('storm_tax1_name', 'Tax 1'); if ($language1) $tax1 .= '
'. variable_get('storm_tax1_name', 'Tax 1'); } if ($node->tax2) { $tax2 = variable_get('storm_tax2_name', 'Tax 2'); if ($language1) $tax2 .= '
'. 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, ), ); if ($node->tax1) { $header[] = array( 'data' => $tax1, ); } if ($node->tax2) { $header[] = array( 'data' => $tax2, ); } $header[] = 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;', ), ); if ($node->tax1) { $rows[end(array_keys($rows))][] = array( 'data' => sprintf('%.2f', $i->tax1), 'style' => 'text-align: right;', ); } if ($node->tax2) { $rows[end(array_keys($rows))][] = array( 'data' => sprintf('%.2f', $i->tax2), 'style' => 'text-align: right;', ); } $rows[end(array_keys($rows))][] = 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;', ), ); if ($node->tax1) { $rows[end(array_keys($rows))][] = array( 'data' => sprintf('%.2f', $node->tax1), 'style' => 'text-align: right;', ); } if ($node->tax2) { $rows[end(array_keys($rows))][] = array( 'data' => sprintf('%.2f', $node->tax2), 'style' => 'text-align: right;', ); } $rows[end(array_keys($rows))][] = 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); } /* Code to create invoice auto_add link * Input billable and billed to determine what the link is. * * @return * html coding for the link */ function theme_storminvoice_autoadd_links($nid, $billable, $billed) { if (user_access('Storm invoice: add')) { if ($billable && !$billed) { $v = ''; $v = ''. t('Invoice this item:') .''; $v .= ''; } elseif ($billed) { $v = ''; $v .= ''. t('Item already billed.') .''; } else { $v = ''; $v .= ''. t('Item marked unbillable.') .''; } } return $v; }