#1226-add-pdf-export-on-report

This commit is contained in:
Gilbert Paquin 2017-07-30 18:49:24 -04:00
parent 3fa08417e0
commit 04d9fe30eb
3 changed files with 418 additions and 274 deletions

View File

@ -14,6 +14,7 @@ class AbstractReport
public $totals = [];
public $columns = [];
public $data = [];
public $columns_labeled = [];
public function __construct($startDate, $endDate, $isExport, $options = false)
{
@ -52,9 +53,7 @@ class AbstractReport
$this->totals[$currencyId][$dimension][$field] += $value;
}
public function tableHeader()
{
$str = '';
public function tableHeaderArray() {
foreach ($this->columns as $key => $val) {
if (is_array($val)) {
@ -75,8 +74,18 @@ class AbstractReport
$class = count($class) ? implode(' ', $class) : 'group-false';
$label = trans("texts.{$field}");
$str .= "<th class=\"{$class}\">{$label}</th>";
$this->columns_labeled[] = ['label' => $label, 'class' => $class, 'key' => $field];
}
}
public function tableHeader()
{
$this->tableHeaderArray();
$str = '';
foreach ($this->columns_labeled as $field => $attr)
$str .= "<th class=\"{$attr['class']}\">{$attr['label']}</th>";
return $str;
}

View File

@ -2389,6 +2389,7 @@ $LANG = array(
'currency_peruvian_sol' => 'Peruvian Sol',
'use_english_version' => 'Make sure to use the English version of the files.<br/>We use the column headers to match the fields.',
'download_pdf' => 'Download PDF'
);

View File

@ -17,6 +17,10 @@
</style>
@foreach ($account->getFontFolders() as $font)
<script src="{{ asset('js/vfs_fonts/'.$font.'.js') }}" type="text/javascript"></script>
@endforeach
<script src="{{ asset('pdf.built.js') }}?no_cache={{ NINJA_VERSION }}" type="text/javascript"></script>
@stop
@section('content')
@ -34,6 +38,7 @@
var chartStartDate = moment("{{ $startDate }}");
var chartEndDate = moment("{{ $endDate }}");
var dateRanges = {!! $account->present()->dateRangeOptions !!};
window.invoiceFonts = {!! json_encode(Cache::get('fonts')) !!};
$(function () {
@ -106,7 +111,8 @@
{{ trans('texts.date_range') }}
</label>
<div class="col-lg-8 col-sm-8">
<div id="reportrange" style="background: #f9f9f9; cursor: pointer; padding: 9px 14px; border: 1px solid #dfe0e1; margin-top: 0px;">
<div id="reportrange"
style="background: #f9f9f9; cursor: pointer; padding: 9px 14px; border: 1px solid #dfe0e1; margin-top: 0px;">
<i class="glyphicon glyphicon-calendar fa fa-calendar"></i>&nbsp;
<span></span> <b class="caret"></b>
</div>
@ -118,7 +124,8 @@
</div>
</div>
<div id="statusField" style="display:{{ in_array($reportType, [ENTITY_INVOICE, ENTITY_PRODUCT]) ? 'block' : 'none' }}">
<div id="statusField"
style="display:{{ in_array($reportType, [ENTITY_INVOICE, ENTITY_PRODUCT]) ? 'block' : 'none' }}">
{!! Former::select('invoice_status')->label('status')
->addOption(trans('texts.all'), 'all')
->addOption(trans('texts.draft'), 'draft')
@ -157,6 +164,12 @@
<center>
@if(request()->report_type)
{!! Button::warning(trans('texts.download_pdf'))
->withAttributes(array('onclick' => 'exportPDF()'))
->appendIcon(Icon::create('save'))
->large() !!}
@endif
{!! Button::primary(trans('texts.export'))
->withAttributes(array('onclick' => 'onExportClick()'))
->appendIcon(Icon::create('export'))
@ -166,7 +179,8 @@
->submit()
->appendIcon(Icon::create('play'))
->large() !!}
</center><br/>
</center>
<br/>
{!! Former::close() !!}
@ -351,9 +365,129 @@
});
})
<?php
$summary = [];
$summary[] = array_merge([
trans("texts.totals")
], array_map(function ($key) {
return ['text' => trans("texts.{$key}"),
'style' => 'tableHeader'
];
}, array_keys(array_values(array_values($reportTotals)[0])[0])));
foreach ($reportTotals as $currencyId => $each) {
foreach ($each as $dimension => $val) {
$tmp = [];
$tmp[] = Utils::getFromCache($currencyId, 'currencies')->name . (($dimension) ? ' - ' . $dimension : '');
foreach ($val as $id => $field) $tmp[] = Utils::formatMoney($field, $currencyId);
$summary[] = $tmp;
}
}
?>
function addFont(font){
if(window.ninjaFontVfs[font.folder]){
folder = 'fonts/'+font.folder;
pdfMake.fonts[font.name] = {
normal: folder+'/'+font.normal,
italics: folder+'/'+font.italics,
bold: folder+'/'+font.bold,
bolditalics: folder+'/'+font.bolditalics
}
}
}
pdfMake.fonts = {}
fonts = window.invoiceFonts || invoice.invoice_fonts;
// Add only the loaded fonts
$.each(fonts, function(i,font){
addFont(font);
});
var dd = {!! html_entity_decode(json_encode( [
'pageOrientation' => 'landscape',
'content' => [
[
'text' => $reportTypes[$reportType],
'style' => 'header'
],
[
'style' => 'reportTable',
'table' => [
'headerRows' => 1,
'widths' => '*',
'body' => $summary
],
'layout' => 'lightHorizontalLines'
],
[
'style' => 'reportTable',
'table' => [
'headerRows' => 1,
'widths' => '*',
'body' =>
array_merge(
[array_map(function($array) {
return [
'text' => $array['label'],
'style' => 'tableHeader'
];
}, $report->columns_labeled)]
, array_map(function($row) {
return array_map(function($col) {
if(strpos($col, "<a href") !== FALSE) {
$hrefs = [];
preg_match('#<a.*href=[\'"](.*)["\'].*>(.*)<.*#', $col, $hrefs);
return [
'text' => $hrefs[2],
'link' => $hrefs[1]
];
}
return $col;
}, $row);
}, $displayData))
],
'layout' => 'lightHorizontalLines'
]
],
'styles' => [
'header' => [
'fontSize' => 18,
'bold' => true,
'margin' => [
0,
0,
0,
10
]
],
'reportTable' => [
'margin' => [
0,
5,
0,
50
]
],
'tableHeader' => [
'bold' => true,
'fontSize' => 13,
'color' => 'black'
]
],
'defaultStyle' => [
'font' => Cache::get('fonts')[0]['name']
]
] , JSON_PRETTY_PRINT)) !!}
function exportPDF() {
pdfMake.createPdf(dd).download($('#reportrange').data('daterangepicker').startDate.format('YYYY-MM-DD') + '-' + $('#reportrange').data('daterangepicker').endDate.format('YYYY-MM-DD')+'_'+'{{'-invoiceninja-'.$reportTypes[$reportType].'-report'}}');
}
</script>
@stop