invoice pages

This commit is contained in:
Sercan Yemen 2017-08-01 14:56:39 +03:00
parent 1c66ccd9e2
commit e0253cd8d2
11 changed files with 1213 additions and 4 deletions

View File

@ -139,12 +139,12 @@ export class FuseNavigation
{
'title': 'Modern',
'type' : 'nav-item',
'url' : '/pages/invoice/modern'
'url' : '/pages/invoices/modern'
},
{
'title': 'Classic',
'title': 'Compact',
'type' : 'nav-item',
'url' : '/pages/invoice/classic'
'url' : '/pages/invoices/compact'
}
]
},

View File

@ -6,6 +6,7 @@ import { CalendarFakeDb } from './calendar';
import { TodoFakeDb } from './todo';
import { ProfileFakeDb } from './profile';
import { ContactsFakeDb } from './contacts';
import { InvoiceFakeDb } from './invoice';
export class FuseFakeDbService implements InMemoryDbService
{
@ -26,7 +27,8 @@ export class FuseFakeDbService implements InMemoryDbService
'profile-timeline' : ProfileFakeDb.timeline,
'profile-photos-videos': ProfileFakeDb.photosVideos,
'profile-about' : ProfileFakeDb.about,
'contacts' : ContactsFakeDb.contacts
'contacts' : ContactsFakeDb.contacts,
'invoice' : InvoiceFakeDb.invoice
};
}
}

View File

@ -0,0 +1,59 @@
export class InvoiceFakeDb
{
public static invoice = {
'from' : {
'title' : 'Fuse Inc.',
'address': '2810 Country Club Road Cranford, NJ 07016',
'phone' : '+66 123 455 87',
'email' : 'hello@fuseinc.com',
'website': 'www.fuseinc.com'
},
'client' : {
'title' : 'John Doe',
'address': '9301 Wood Street Philadelphia, PA 19111',
'phone' : '+55 552 455 87',
'email' : 'johndoe@mail.com'
},
'number' : 'P9-0004',
'date' : 'Jul 19, 2015',
'dueDate' : 'Aug 24, 2015',
'services': [
{
'title' : 'Prototype & Design',
'detail' : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus accumsan, quam sed eleifend imperdiet.',
'unit' : 'Hour',
'unitPrice': '12.00',
'quantity' : '240',
'total' : '2880'
},
{
'title' : 'Coding',
'detail' : 'Vestibulum ligula sem, rutrum et libero id, porta vehicula metus. Cras dapibus neque sit amet laoreet vestibulum.',
'unit' : 'Hour',
'unitPrice': '10.50',
'quantity' : '350',
'total' : '3675'
},
{
'title' : 'Testing',
'detail' : 'Pellentesque luctus efficitur neque in finibus. Integer ut nunc in augue maximus porttitor id id nulla. In vitae erat.',
'unit' : 'Hour',
'unitPrice': '4.00',
'quantity' : '50',
'total' : '200'
},
{
'title' : 'Documentation & Training',
'detail' : 'Pellentesque luctus efficitur neque in finibus. Integer ut nunc in augue maximus porttitor id id nulla. In vitae erat.',
'unit' : 'Hour',
'unitPrice': '6.50',
'quantity' : '260',
'total' : '1690'
}
],
'subtotal': '8445',
'tax' : '675.60',
'discount': '120.60',
'total' : '9000'
};
}

View File

@ -0,0 +1,147 @@
<div id="invoice" class="compact page-layout blank" fxLayout="row" perfect-scrollbar>
<div class="invoice-container">
<!-- INVOICE -->
<div class="card">
<div class="header">
<div class="invoice-date">{{invoice.date}}</div>
<div fxLayout="row" fxLayoutAlign="space-between stretch">
<div class="client">
<div class="invoice-number" fxLayout="row" fxLayoutAlign="start center">
<span class="title">INVOICE</span>
<span class="number">{{invoice.number}}</span>
</div>
<div class="due-date" fxLayout="row" fxLayoutAlign="start center">
<span class="title">DUE DATE</span>
<span class="date">{{invoice.dueDate}}</span>
</div>
<div class="info">
<div class="title">{{invoice.client.title}}</div>
<div *ngIf="invoice?.client.address" class="address">{{invoice.client.address}}</div>
<div *ngIf="invoice?.client.phone" class="phone">{{invoice.client.phone}}</div>
<div *ngIf="invoice?.client.email" class="email">{{invoice.client.email}}</div>
<div *ngIf="invoice?.client.website" class="website">{{invoice.client.website}}</div>
</div>
</div>
<div class="issuer md-accent-bg" fxLayout="row" fxLayoutAlign="start center">
<div class="logo" fxLayout="row" fxLayoutAlign="center center">
<span>F</span>
</div>
<div class="info">
<div class="title">{{invoice.from.title}}</div>
<div *ngIf="invoice?.from.address" class="address">{{invoice.from.address}}</div>
<div *ngIf="invoice?.from.phone" class="phone">{{invoice.from.phone}}</div>
<div *ngIf="invoice?.from.email" class="email">{{invoice.from.email}}</div>
<div *ngIf="invoice?.from.website" class="website">{{invoice.from.website}}</div>
</div>
</div>
</div>
</div>
<div class="content">
<table class="simple invoice-table">
<thead>
<tr>
<th>SERVICE</th>
<th>UNIT</th>
<th class="text-right">UNIT PRICE</th>
<th class="text-right">QUANTITY</th>
<th class="text-right">TOTAL</th>
</tr>
</thead>
<tbody>
<tr *ngFor="let service of invoice.services">
<td>
<div class="title">
{{service.title}}
</div>
</td>
<td>
{{service.unit}}
</td>
<td class="text-right">
{{service.unitPrice | currency:'USD':true}}
</td>
<td class="text-right">
{{service.quantity}}
</td>
<td class="text-right">
{{service.total | currency:'USD':true}}
</td>
</tr>
<!-- Double the invoice data for demo purposes -->
<tr *ngFor="let service of invoice.services">
<td>
<div class="title">
{{service.title}}
</div>
</td>
<td>
{{service.unit}}
</td>
<td class="text-right">
{{service.unitPrice | currency:'USD':true}}
</td>
<td class="text-right">
{{service.quantity}}
</td>
<td class="text-right">
{{service.total | currency:'USD':true}}
</td>
</tr>
</tbody>
</table>
<table class="simple invoice-table-footer">
<tbody>
<tr class="subtotal">
<td>SUBTOTAL</td>
<td>{{invoice.subtotal | currency:'USD':true}}</td>
</tr>
<tr class="tax">
<td>TAX</td>
<td>{{invoice.tax | currency:'USD':true}}</td>
</tr>
<tr class="discount">
<td>DISCOUNT</td>
<td>-{{invoice.discount | currency:'USD':true}}</td>
</tr>
<tr class="total">
<td>TOTAL</td>
<td>{{invoice.total | currency:'USD':true}}</td>
</tr>
</tbody>
</table>
</div>
<div class="footer">
<div class="note">Please pay within 15 days. Thank you for your business.</div>
<div fxLayout="row" fxLayoutAlign="start start">
<div class="logo md-accent-bg" fxLayout="row" fxLayoutAlign="center center">
<div>F</div>
</div>
<div class="small-note">
In condimentum malesuada efficitur. Mauris volutpat placerat auctor. Ut ac congue dolor. Quisque
scelerisque lacus sed feugiat fermentum. Cras aliquet facilisis pellentesque. Nunc hendrerit
quam at leo commodo, a suscipit tellus dapibus. Etiam at felis volutpat est mollis lacinia.
Mauris placerat sem sit amet velit mollis, in porttitor ex finibus. Proin eu nibh id libero
tincidunt lacinia et eget eros.
</div>
</div>
</div>
</div>
<!-- / INVOICE -->
<!-- Use the following element to add breaks to your pages -->
<!-- This will make sure that the section after this element will be printed on a new page -->
<div class="page-break"></div>
</div>
</div>

View File

@ -0,0 +1,358 @@
@import "src/app/core/scss/fuse";
:host {
#invoice {
&.compact {
padding: 0;
overflow: auto;
.invoice-container {
padding: 64px;
.card {
width: 1020px;
min-width: 1020px;
max-width: 1020px;
padding: 64px 88px;
overflow: hidden;
background: #FFFFFF;
@include mat-elevation(7);
.header {
.invoice-date {
font-size: 14px;
color: rgba(0, 0, 0, 0.54);
margin-bottom: 32px;
}
.client {
.invoice-number {
font-size: 18px;
padding-bottom: 2px;
.title {
color: rgba(0, 0, 0, 0.54);
}
.number {
padding-left: 6px;
}
}
.due-date {
font-size: 18px;
padding-bottom: 16px;
.title {
color: rgba(0, 0, 0, 0.54);
}
.date {
padding-left: 6px;
}
}
.info {
color: rgba(0, 0, 0, 0.54);
line-height: 22px;
}
}
.issuer {
margin-right: -88px;
padding-right: 66px;
.logo {
width: 96px;
height: 96px;
font-size: 72px;
border-right: 1px solid rgba(255, 255, 255, 0.7);
}
.info {
padding: 16px;
}
}
}
.content {
.invoice-table {
margin-top: 64px;
font-size: 15px;
thead {
tr {
th {
&:first-child {
padding-left: 8px;
}
&:last-child {
padding-right: 8px;
}
}
}
}
tbody {
tr {
td {
&:first-child {
padding-left: 8px;
}
&:last-child {
padding-right: 8px;
}
}
}
}
.title {
font-size: 16px;
}
.detail {
margin-top: 8px;
font-size: 12px;
color: rgba(0, 0, 0, 0.54);
max-width: 360px;
}
}
.invoice-table-footer {
margin: 32px 0 72px 0;
tr {
td {
text-align: right;
font-size: 16px;
font-weight: 500;
color: rgba(0, 0, 0, 0.54);
border-bottom: none;
padding: 4px 8px;
&:first-child {
text-align: left;
}
}
&.discount {
td {
padding-bottom: 32px;
}
}
&.total {
td {
padding: 24px 8px;
border-top: 1px solid rgba(0, 0, 0, 0.12);
font-size: 35px;
font-weight: 300;
color: rgba(0, 0, 0, 1);
}
}
}
}
}
.footer {
.note {
font-size: 15px;
font-weight: 500;
margin-bottom: 24px;
}
// IE10 fix
.logo, .small-note {
-ms-flex: 0 1 auto;
}
.logo {
width: 32px;
min-width: 32px;
height: 32px;
font-size: 17px;
font-weight: 500;
margin-right: 24px;
border-radius: 2px;
overflow: hidden;
}
.small-note {
font-size: 12px;
font-weight: 500;
color: rgba(0, 0, 0, 0.54);
line-height: 18px;
}
}
}
}
}
}
/* PRINT STYLES */
@media print {
/* Invoice Specific Styles */
#invoice {
&.compact {
.invoice-container {
padding: 0;
.card {
width: 100%;
min-width: 0;
background: none;
padding: 0;
box-shadow: none;
.header {
.invoice-date {
margin-bottom: 16pt;
}
.issuer {
padding-right: 0;
margin-right: 0;
}
}
.content {
.invoice-table {
margin-top: 16pt;
thead {
tr {
th {
font-size: 10pt;
max-width: 60pt;
&:first-child {
padding-left: 0;
}
&:last-child {
padding-right: 0;
}
}
}
}
tbody {
tr {
td {
&:first-child {
padding-left: 0;
}
&:last-child {
padding-right: 0;
}
}
}
}
.title {
font-size: 10pt;
}
.detail {
margin-top: 4pt;
font-size: 9pt;
max-width: none;
}
}
.invoice-table-footer {
margin: 16pt 0;
tr {
td {
font-size: 13pt;
padding: 4pt 4pt;
&:first-child {
text-align: left;
padding-left: 0;
}
&:last-child {
padding-right: 0;
}
}
&.discount {
td {
padding-bottom: 16pt;
}
}
&.total {
td {
padding: 16pt 4pt 0 4pt;
font-size: 16pt;
&:first-child {
padding-left: 0;
}
&:last-child {
padding-right: 0;
}
}
}
}
}
}
.footer {
.note {
font-size: 10pt;
margin-bottom: 8pt;
}
.logo {
font-size: 14pt;
margin-right: 8pt;
}
.small-note {
font-size: 8pt;
line-height: normal;
}
}
}
}
}
}
}
}

View File

@ -0,0 +1,21 @@
import { Component } from '@angular/core';
import { InvoiceService } from '../invoice.service';
@Component({
selector : 'fuse-invoice-compact',
templateUrl: './compact.component.html',
styleUrls : ['./compact.component.scss']
})
export class InvoiceCompactComponent
{
invoice: any;
constructor(private invoiceService: InvoiceService)
{
this.invoiceService.invoiceOnChanged
.subscribe((invoice) => {
this.invoice = invoice;
});
}
}

View File

@ -0,0 +1,53 @@
import { Injectable } from '@angular/core';
import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router';
import { Observable } from 'rxjs/Observable';
import { Http } from '@angular/http';
import { BehaviorSubject } from 'rxjs/BehaviorSubject';
@Injectable()
export class InvoiceService implements Resolve<any>
{
invoice: any;
invoiceOnChanged: BehaviorSubject<any> = new BehaviorSubject({});
constructor(private http: Http)
{
}
/**
* Resolve
* @param {ActivatedRouteSnapshot} route
* @param {RouterStateSnapshot} state
* @returns {Observable<any> | Promise<any> | any}
*/
resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<any> | Promise<any> | any
{
return new Promise((resolve, reject) => {
Promise.all([
this.getInvoice()
]).then(
() => {
resolve();
},
reject
);
});
}
/**
* Get invoice
*/
getInvoice(): Promise<any[]>
{
return new Promise((resolve, reject) => {
this.http.get('api/invoice')
.subscribe(timeline => {
this.invoice = timeline.json().data;
this.invoiceOnChanged.next(this.invoice);
resolve(this.invoice);
}, reject);
});
}
}

View File

@ -0,0 +1,169 @@
<div id="invoice" class="modern page-layout blank" fxLayout="row" perfect-scrollbar>
<div class="invoice-container">
<!-- INVOICE -->
<div class="card">
<div class="header" fxLayout="row" fxLayoutAlign="space-between start">
<div class="ids" fxLayout="column">
<div fxLayout="row" class="seller" fxLayoutAlign="start center">
<div class="logo md-accent-bg" fxLayout="row" fxLayoutAlign="center center">
<div>F</div>
</div>
<div class="divider"></div>
<div class="detail">
<div class="title">{{invoice.from.title}}</div>
<div *ngIf="invoice?.from.address" class="address">
{{invoice.from.address}}
</div>
<div *ngIf="invoice?.from.phone" class="phone">
<span>Phone:</span>
{{invoice.from.phone}}
</div>
<div *ngIf="invoice?.from.email" class="email">
<span>Email:</span>
{{invoice.from.email}}
</div>
<div *ngIf="invoice?.from.website" class="website">
<span>Web:</span>
{{invoice.from.website}}
</div>
</div>
</div>
<div fxLayout="row" class="client" fxLayoutAlign="start center">
<div class="label" fxLayout="row" fxLayoutAlign="end center">
<div>CLIENT</div>
</div>
<div class="divider"></div>
<div class="detail">
<div class="title">{{invoice.client.title}}</div>
<div *ngIf="invoice?.client.address" class="address">
{{invoice.client.address}}
</div>
<div *ngIf="invoice?.client.phone" class="phone">
<span>Phone:</span>
{{invoice.client.phone}}
</div>
<div *ngIf="invoice?.client.email" class="email">
<span>Email:</span>
{{invoice.client.email}}
</div>
<div *ngIf="invoice?.client.website" class="website">
<span>Web:</span>
{{invoice.client.website}}
</div>
</div>
</div>
</div>
<table class="summary">
<tr class="code">
<td class="label">INVOICE</td>
<td class="value">{{invoice.number}}</td>
</tr>
<tr>
<td class="label">INVOICE DATE</td>
<td class="value">{{invoice.date}}</td>
</tr>
<tr>
<td class="label">DUE DATE</td>
<td class="value">{{invoice.dueDate}}</td>
</tr>
<tr>
<td class="label">TOTAL DUE</td>
<td class="value">{{invoice.total | currency:'USD':true}}</td>
</tr>
</table>
</div>
<div class="content">
<table class="simple invoice-table">
<thead>
<tr>
<th>SERVICE</th>
<th>UNIT</th>
<th class="text-right">UNIT PRICE</th>
<th class="text-right">QUANTITY</th>
<th class="text-right">TOTAL</th>
</tr>
</thead>
<tbody>
<tr *ngFor="let service of invoice.services">
<td>
<div class="title">{{service.title}}</div>
<div class="detail">{{service.detail}}</div>
</td>
<td>
{{service.unit}}
</td>
<td class="text-right">
{{service.unitPrice | currency:'USD':true}}
</td>
<td class="text-right">
{{service.quantity}}
</td>
<td class="text-right">
{{service.total | currency:'USD':true}}
</td>
</tr>
</tbody>
</table>
<table class="simple invoice-table-footer">
<tbody>
<tr class="subtotal">
<td>SUBTOTAL</td>
<td>{{invoice.subtotal | currency:'USD':true}}</td>
</tr>
<tr class="tax">
<td>TAX</td>
<td>{{invoice.tax | currency:'USD':true}}</td>
</tr>
<tr class="discount">
<td>DISCOUNT</td>
<td>-{{invoice.discount | currency:'USD':true}}</td>
</tr>
<tr class="total">
<td>TOTAL</td>
<td>{{invoice.total | currency:'USD':true}}</td>
</tr>
</tbody>
</table>
</div>
<div class="footer">
<div class="note">Please pay within 15 days. Thank you for your business.</div>
<div fxLayout="row" fxLayoutAlign="start start">
<div class="logo md-accent-bg" fxLayout="row" fxLayoutAlign="center center">
<div>F</div>
</div>
<div class="small-note">
In condimentum malesuada efficitur. Mauris volutpat placerat auctor. Ut ac congue dolor. Quisque
scelerisque lacus sed feugiat fermentum. Cras aliquet facilisis pellentesque. Nunc hendrerit
quam at leo commodo, a suscipit tellus dapibus. Etiam at felis volutpat est mollis lacinia.
Mauris placerat sem sit amet velit mollis, in porttitor ex finibus. Proin eu nibh id libero
tincidunt lacinia et eget eros.
</div>
</div>
</div>
</div>
<!-- / INVOICE -->
<!-- Use the following element to add breaks to your pages -->
<!-- This will make sure that the section after this element will be printed on a new page -->
<div class="page-break"></div>
</div>
</div>

View File

@ -0,0 +1,359 @@
@import "src/app/core/scss/fuse";
:host {
#invoice {
&.modern {
padding: 0;
overflow: auto;
.invoice-container {
padding: 64px;
.card {
width: 1020px;
min-width: 1020px;
max-width: 1020px;
padding: 88px;
overflow: hidden;
background: #FFFFFF;
@include mat-elevation(7);
.header {
.ids {
line-height: 22px;
color: rgba(0, 0, 0, 0.54);
.detail {
width: 160px;
}
.seller {
margin-bottom: 80px;
.logo {
width: 156px;
height: 156px;
font-size: 115px;
}
}
.client {
.label {
width: 156px;
font-size: 24px;
font-weight: 300;
}
}
.divider {
width: 1px;
margin: 0 48px;
background-color: rgba(0, 0, 0, 0.12);
height: 144px;
}
}
.summary {
font-size: 15px;
.label {
color: rgba(0, 0, 0, 0.54);
text-align: right;
padding-right: 16px;
}
.value {
color: rgba(0, 0, 0, 1);
}
.code {
font-size: 35px;
font-weight: 300;
td {
padding-bottom: 32px;
}
}
}
}
.content {
.invoice-table {
margin-top: 96px;
font-size: 15px;
.title {
font-size: 17px;
}
.detail {
margin-top: 8px;
font-size: 12px;
color: rgba(0, 0, 0, 0.54);
max-width: 360px;
}
}
.invoice-table-footer {
margin: 32px 0 96px 0;
tr {
td {
text-align: right;
font-size: 17px;
font-weight: 500;
color: rgba(0, 0, 0, 0.54);
border-bottom: none;
padding: 8px 8px;
&:first-child {
text-align: left;
}
}
&.discount {
td {
padding-bottom: 32px;
}
}
&.total {
td {
padding: 32px 8px;
border-top: 1px solid rgba(0, 0, 0, 0.12);
font-size: 35px;
font-weight: 300;
color: rgba(0, 0, 0, 1);
}
}
}
}
}
.footer {
.note {
font-size: 15px;
font-weight: 500;
margin-bottom: 24px;
}
// IE10 fix
.logo, .small-note {
-ms-flex: 0 1 auto;
}
.logo {
width: 32px;
min-width: 32px;
height: 32px;
font-size: 17px;
font-weight: 500;
margin-right: 24px;
border-radius: 2px;
overflow: hidden;
}
.small-note {
font-size: 12px;
font-weight: 500;
color: rgba(0, 0, 0, 0.54);
line-height: 18px;
}
}
}
}
}
}
/* PRINT STYLES */
@media print {
/* Invoice Specific Styles */
#invoice {
&.modern {
.invoice-container {
padding: 0;
.card {
width: 100%;
min-width: 0;
background: none;
padding: 0;
box-shadow: none;
.header {
.ids {
.detail {
width: 120pt;
}
.seller {
margin-bottom: 8pt;
.logo {
width: 60pt;
height: 60pt;
font-size: 40pt;
}
}
.client {
.label {
width: 60pt;
font-size: 16pt;
}
}
.divider {
margin: 0 12pt;
height: 100pt;
}
}
.summary {
font-size: 10pt;
.code {
font-size: 18pt;
td {
padding-bottom: 10pt;
}
}
}
}
.content {
.invoice-table {
margin-top: 16pt;
thead {
tr {
th {
font-size: 10pt;
max-width: 60pt;
&:first-child {
padding-left: 0;
}
&:last-child {
padding-right: 0;
}
}
}
}
tbody {
tr {
td {
&:first-child {
padding-left: 0;
}
&:last-child {
padding-right: 0;
}
}
}
}
.title {
font-size: 10pt;
}
.detail {
margin-top: 4pt;
font-size: 9pt;
max-width: none;
}
}
.invoice-table-footer {
margin: 16pt 0;
tr {
td {
font-size: 13pt;
padding: 4pt 4pt;
&:first-child {
text-align: left;
padding-left: 0;
}
&:last-child {
padding-right: 0;
}
}
&.discount {
td {
padding-bottom: 16pt;
}
}
&.total {
td {
padding: 16pt 4pt 0 4pt;
font-size: 16pt;
&:first-child {
padding-left: 0;
}
&:last-child {
padding-right: 0;
}
}
}
}
}
}
.footer {
.note {
font-size: 10pt;
margin-bottom: 8pt;
}
.logo {
font-size: 14pt;
margin-right: 8pt;
}
.small-note {
font-size: 8pt;
line-height: normal;
}
}
}
}
}
}
}
}

View File

@ -0,0 +1,21 @@
import { Component } from '@angular/core';
import { InvoiceService } from '../invoice.service';
@Component({
selector : 'fuse-invoice-modern',
templateUrl: './modern.component.html',
styleUrls : ['./modern.component.scss']
})
export class InvoiceModernComponent
{
invoice: any;
constructor(private invoiceService: InvoiceService)
{
this.invoiceService.invoiceOnChanged
.subscribe((invoice) => {
this.invoice = invoice;
});
}
}

View File

@ -12,10 +12,13 @@ import { LockComponent } from './authentication/lock/lock.component';
import { ComingSoonComponent } from './coming-soon/coming-soon.component';
import { Error404Component } from './errors/404/error-404.component';
import { Error500Component } from './errors/500/error-500.component';
import { InvoiceModernComponent } from './invoices/modern/modern.component';
import { MaintenanceComponent } from './maintenance/maintenance.component';
import { ProfileComponent } from './profile/profile.component';
import { ProfileModule } from './profile/profile.module';
import { ProfileService } from './profile/profile.service';
import { InvoiceCompactComponent } from './invoices/compact/compact.component';
import { InvoiceService } from './invoices/invoice.service';
const routes = [
{
@ -58,6 +61,20 @@ const routes = [
path : 'pages/errors/error-500',
component: Error500Component
},
{
path : 'pages/invoices/compact',
component: InvoiceCompactComponent,
resolve : {
invoice: InvoiceService
}
},
{
path : 'pages/invoices/modern',
component: InvoiceModernComponent,
resolve : {
invoice: InvoiceService
}
},
{
path : 'pages/maintenance',
component: MaintenanceComponent
@ -88,9 +105,12 @@ const routes = [
ComingSoonComponent,
Error404Component,
Error500Component,
InvoiceCompactComponent,
InvoiceModernComponent,
MaintenanceComponent
],
providers : [
InvoiceService,
ProfileService
]
})