{"version":3,"file":"src_app_modules_features_billing_billing_module_ts.e5bef70dc5358b08.js","mappings":"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","names":["stripePromise","InvoiceStatus","ORIGIN","STRIPE_JS_URL","concat","V3_URL_REGEX","STRIPE_JS_URL_REGEX","EXISTING_SCRIPT_MESSAGE","isStripeJSURL","url","test","injectScript","params","queryString","advancedFraudSignals","script","document","createElement","src","headOrBody","head","body","Error","appendChild","stripePromise$1","onErrorListener","onLoadListener","initStripe","maybeStripe","args","startTime","stripe","apply","undefined","registerWrapper","_registerWrapper","name","version","loadCalled","getStripePromise","Promise","resolve","reject","window","Stripe","console","warn","scripts","querySelectorAll","i","length","findScript","_script$parentNode","removeEventListener","parentNode","removeChild","onLoad","onError","addEventListener","error","catch","then","StripePaymentService","constructor","urlProvider","httpClient","this","getStripeApiKey","get","ApiUrl","getStripeApiSecret","createPaymentIntent","invIds","of","forEach","id","index","location","href","i0","factory","PatientBillingService","fusionAuthService","router","patientInvoicesStore","patientIds","dataSource","SECURED_STORE","tokenRefresh","exchangeRefreshTokenForJWT","loadParams","routerService","loadUrl","postPayment","payment","post","StripePaymentComponent","stripeSettingsService","patientBillingService","EventEmitter","BehaviorSubject","openStripe","openSuccess","ngOnDestroy","$clientSecretSubscription","unsubscribe","$destroyed","next","ngOnChanges","changes","invoiceIds","currentValue","subscribe","ids","paymentIntent","_this","$invoices","invoices","initializeStripePayment","clientSecret","$loading","disabled","initialized","ngOnInit","pipe","take","apiKey","_this2","initializeStripe","options","appearance","_this3","generateTheme","elements","create","layout","defaultCollapsed","radios","spacedAccordionItems","mount","theme","localStorage","getItem","includes","variables","colorPrimary","_this4","_len","arguments","Array","_key","Date","now","loadStripe","betas","$InvoiceCode","map","invoice","invoiceNumber","join","$InvoiceAmount","balance","reduce","acc","curr","closeDrawer","closeEvent","emit","clear","makePayment","e","preventDefault","_this5","confirmPayment","confirmParams","return_url","redirect","messageContainer","querySelector","textContent","message","status","invoicesIds","value","totalPayment","amount","paymentId","isOnlinePayment","notify","selectors","ctx","CommonModule","i3","i4","DxButtonModule","DxLoadIndicatorModule","routes","path","component","PatientInvoicesComponent","fusionAuth","reportsService","pwaDetectorService","screenService","sanitizer","text","defaultFilter","statusHeaderFilter","patientsIds","Profile","data","patients","DataSource","store","selectionChanged","$SomethingSelected","selectedIds","getStatus","color","container","toUpperCase","bypassSecurityTrustHtml","printInvoice","dxDataGridComponent","instance","beginCustomLoading","generatePatientInvoices","blob","FileUtils","pay","$invoice","drawer","show","success","reload","refresh","hide","complete","DxDrawerComponent","DxDataGridComponent","i6","FlexModule","i7","i8","DxToolbarModule","DxDrawerModule","ResultsModule","styles","canActivate","FusionAuthGuard","roles","BillingRoutingModule","RouterModule","BillingModule"],"sourceRoot":"webpack:///","sources":["./node_modules/@stripe/stripe-js/dist/index.mjs","./src/app/modules/features/billing/models/invoice.status.ts","./src/app/modules/features/billing/services/stripe-payment.service.ts","./src/app/modules/features/billing/services/patient-billing.service.ts","./src/app/modules/features/billing/components/stripe-payment/stripe-payment.component.ts","./src/app/modules/features/billing/pages/patient-invoices/patient-invoices.component.ts","./src/app/modules/features/billing/billing-routing.module.ts","./src/app/modules/features/billing/billing.module.ts"],"sourcesContent":["var ORIGIN = 'https://js.stripe.com';\nvar STRIPE_JS_URL = \"\".concat(ORIGIN, \"/v3\");\nvar V3_URL_REGEX = /^https:\\/\\/js\\.stripe\\.com\\/v3\\/?(\\?.*)?$/;\nvar STRIPE_JS_URL_REGEX = /^https:\\/\\/js\\.stripe\\.com\\/(v3|[a-z]+)\\/stripe\\.js(\\?.*)?$/;\nvar EXISTING_SCRIPT_MESSAGE = 'loadStripe.setLoadParameters was called but an existing Stripe.js script already exists in the document; existing script parameters will be used';\n\nvar isStripeJSURL = function isStripeJSURL(url) {\n return V3_URL_REGEX.test(url) || STRIPE_JS_URL_REGEX.test(url);\n};\n\nvar findScript = function findScript() {\n var scripts = document.querySelectorAll(\"script[src^=\\\"\".concat(ORIGIN, \"\\\"]\"));\n\n for (var i = 0; i < scripts.length; i++) {\n var script = scripts[i];\n\n if (!isStripeJSURL(script.src)) {\n continue;\n }\n\n return script;\n }\n\n return null;\n};\n\nvar injectScript = function injectScript(params) {\n var queryString = params && !params.advancedFraudSignals ? '?advancedFraudSignals=false' : '';\n var script = document.createElement('script');\n script.src = \"\".concat(STRIPE_JS_URL).concat(queryString);\n var headOrBody = document.head || document.body;\n\n if (!headOrBody) {\n throw new Error('Expected document.body not to be null. Stripe.js requires a element.');\n }\n\n headOrBody.appendChild(script);\n return script;\n};\n\nvar registerWrapper = function registerWrapper(stripe, startTime) {\n if (!stripe || !stripe._registerWrapper) {\n return;\n }\n\n stripe._registerWrapper({\n name: 'stripe-js',\n version: \"5.7.0\",\n startTime: startTime\n });\n};\n\nvar stripePromise$1 = null;\nvar onErrorListener = null;\nvar onLoadListener = null;\n\nvar onError = function onError(reject) {\n return function () {\n reject(new Error('Failed to load Stripe.js'));\n };\n};\n\nvar onLoad = function onLoad(resolve, reject) {\n return function () {\n if (window.Stripe) {\n resolve(window.Stripe);\n } else {\n reject(new Error('Stripe.js not available'));\n }\n };\n};\n\nvar loadScript = function loadScript(params) {\n // Ensure that we only attempt to load Stripe.js at most once\n if (stripePromise$1 !== null) {\n return stripePromise$1;\n }\n\n stripePromise$1 = new Promise(function (resolve, reject) {\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n // Resolve to null when imported server side. This makes the module\n // safe to import in an isomorphic code base.\n resolve(null);\n return;\n }\n\n if (window.Stripe && params) {\n console.warn(EXISTING_SCRIPT_MESSAGE);\n }\n\n if (window.Stripe) {\n resolve(window.Stripe);\n return;\n }\n\n try {\n var script = findScript();\n\n if (script && params) {\n console.warn(EXISTING_SCRIPT_MESSAGE);\n } else if (!script) {\n script = injectScript(params);\n } else if (script && onLoadListener !== null && onErrorListener !== null) {\n var _script$parentNode;\n\n // remove event listeners\n script.removeEventListener('load', onLoadListener);\n script.removeEventListener('error', onErrorListener); // if script exists, but we are reloading due to an error,\n // reload script to trigger 'load' event\n\n (_script$parentNode = script.parentNode) === null || _script$parentNode === void 0 ? void 0 : _script$parentNode.removeChild(script);\n script = injectScript(params);\n }\n\n onLoadListener = onLoad(resolve, reject);\n onErrorListener = onError(reject);\n script.addEventListener('load', onLoadListener);\n script.addEventListener('error', onErrorListener);\n } catch (error) {\n reject(error);\n return;\n }\n }); // Resets stripePromise on error\n\n return stripePromise$1[\"catch\"](function (error) {\n stripePromise$1 = null;\n return Promise.reject(error);\n });\n};\nvar initStripe = function initStripe(maybeStripe, args, startTime) {\n if (maybeStripe === null) {\n return null;\n }\n\n var stripe = maybeStripe.apply(undefined, args);\n registerWrapper(stripe, startTime);\n return stripe;\n}; // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n\nvar stripePromise;\nvar loadCalled = false;\n\nvar getStripePromise = function getStripePromise() {\n if (stripePromise) {\n return stripePromise;\n }\n\n stripePromise = loadScript(null)[\"catch\"](function (error) {\n // clear cache on error\n stripePromise = null;\n return Promise.reject(error);\n });\n return stripePromise;\n}; // Execute our own script injection after a tick to give users time to do their\n// own script injection.\n\n\nPromise.resolve().then(function () {\n return getStripePromise();\n})[\"catch\"](function (error) {\n if (!loadCalled) {\n console.warn(error);\n }\n});\nvar loadStripe = function loadStripe() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n loadCalled = true;\n var startTime = Date.now(); // if previous attempts are unsuccessful, will re-load script\n\n return getStripePromise().then(function (maybeStripe) {\n return initStripe(maybeStripe, args, startTime);\n });\n};\n\nexport { loadStripe };\n","export enum InvoiceStatus {\r\n Open,\r\n Paid,\r\n PastDue,\r\n Voided,\r\n Rebilled,\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport {UrlProviderService} from \"../../../../shared/services/general\";\r\nimport {HttpClient} from \"@angular/common/http\";\r\nimport {CreatePaymentIntentResponse} from \"../models/stripe-checkout-session\";\r\nimport {Observable, of} from \"rxjs\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class StripePaymentService {\r\n\r\n constructor(private urlProvider: UrlProviderService, private httpClient: HttpClient) { }\r\n\r\n public getStripeApiKey() {\r\n return this.httpClient.get(`${this.urlProvider.ApiUrl}/v2/payments/stripe/key`);\r\n }\r\n\r\n public getStripeApiSecret() {\r\n return this.httpClient.get(`${this.urlProvider.ApiUrl}/v2/payments/stripe/secret`);\r\n }\r\n\r\n public createPaymentIntent(invIds: number[] | null | undefined): Observable {\r\n if (!invIds) {\r\n return of(null);\r\n }\r\n\r\n let url = `${this.urlProvider.ApiUrl}/v2/payments/stripe/checkout-session?`;\r\n\r\n invIds.forEach((id, index) => {\r\n url += `invoiceIds=${id}`;\r\n if (index < invIds.length - 1) {\r\n url += '&';\r\n }\r\n });\r\n\r\n url += `&redirectUrl=${window.location.href}`;\r\n\r\n return this.httpClient.get(url);\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport {UrlProviderService} from \"../../../../shared/services/general\";\r\nimport {FusionAuthService} from \"../../../../shared/services/fusion-auth\";\r\nimport {Router} from \"@angular/router\";\r\nimport {HttpClient} from \"@angular/common/http\";\r\nimport {BehaviorSubject} from \"rxjs\";\r\nimport DataSource from \"devextreme/data/data_source\";\r\nimport CustomStore from \"devextreme/data/custom_store\";\r\nimport {SECURED_STORE} from \"../../../../shared/utils\";\r\nimport {PaymentDto} from \"../models/payment\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class PatientBillingService {\r\n\r\n constructor(private urlProvider: UrlProviderService, private fusionAuthService: FusionAuthService, private router: Router, private httpClient: HttpClient) {\r\n }\r\n\r\n public patientInvoicesStore(patientIds: number[], dataSource: BehaviorSubject): CustomStore {\r\n let url = `/v2/patients/billing/invoices?`;\r\n\r\n patientIds.forEach((id, index) => {\r\n url += `patientIds=${id}`;\r\n if (index < patientIds.length - 1) {\r\n url += '&';\r\n }\r\n });\r\n\r\n return SECURED_STORE({\r\n tokenRefresh: this.fusionAuthService.exchangeRefreshTokenForJWT(),\r\n loadParams: null,\r\n dataSource,\r\n routerService: this.router,\r\n loadUrl: `${this.urlProvider.ApiUrl}${url}`\r\n });\r\n }\r\n\r\n public postPayment(payment: PaymentDto) {\r\n return this.httpClient.post(`${this.urlProvider.ApiUrl}/v2/patients/billing/post-payment`, payment);\r\n }\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n EventEmitter,\r\n Input,\r\n OnChanges, OnDestroy,\r\n OnInit,\r\n Output, Renderer2,\r\n SimpleChanges\r\n} from '@angular/core';\r\nimport {CommonModule} from '@angular/common';\r\nimport {DxButtonModule, DxLoadIndicatorModule, DxScrollViewModule} from \"devextreme-angular\";\r\nimport {BehaviorSubject, Observable, of, Subscription} from 'rxjs';\r\nimport {IInvoice} from \"../../models/invoice\";\r\nimport {debounceTime, map, take} from \"rxjs/operators\";\r\nimport {loadStripe, Stripe, StripeElements, StripeElementsOptionsClientSecret} from '@stripe/stripe-js';\r\nimport {StripePaymentService} from \"../../services/stripe-payment.service\";\r\nimport {CreatePaymentIntentResponse} from \"../../models/stripe-checkout-session\";\r\nimport notify from \"devextreme/ui/notify\";\r\nimport {PatientBillingService} from \"../../services/patient-billing.service\";\r\n\r\n@Component({\r\n selector: 'app-stripe-payment',\r\n standalone: true,\r\n imports: [CommonModule, DxScrollViewModule, DxButtonModule, DxLoadIndicatorModule],\r\n template: `\r\n
\r\n \r\n
\r\n
\r\n
\r\n

{{ $InvoiceCode | async }} Payment

\r\n

All transactions are secure and encrypted

\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n \r\n
\r\n \r\n

Oops!

\r\n

Stripe integration is not available at the moment.
Please, contact the laboratory staff to proceed\r\n with the payment.

\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n `,\r\n styles: ['#payments-drawer { height: 100%; }', '.payment-content {padding-left: 16px; padding-right: 16px}', '.header { display: flex; justify-content: space-between; align-items: center; }',\r\n '#error-message { color: red; font-weight: bold; margin-top: 10px; }'\r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class StripePaymentComponent implements OnInit, OnChanges, OnDestroy {\r\n @Input() invoiceIds!: BehaviorSubject;\r\n @Output() closeEvent: EventEmitter = new EventEmitter();\r\n public stripe: Stripe | null = null;\r\n private $invoices: BehaviorSubject = new BehaviorSubject(null);\r\n private elements!: StripeElements;\r\n public disabled: boolean = false;\r\n public initialized: boolean = true;\r\n\r\n payment = {\r\n openStripe: false,\r\n openSuccess: false\r\n }\r\n $loading: BehaviorSubject = new BehaviorSubject(true);\r\n private $clientSecretSubscription!: Subscription;\r\n private $destroyed: BehaviorSubject = new BehaviorSubject(false);\r\n\r\n constructor(private stripeSettingsService: StripePaymentService, private patientBillingService: PatientBillingService) {\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.$clientSecretSubscription?.unsubscribe();\r\n this.$destroyed.next(true);\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes.invoiceIds && changes.invoiceIds.currentValue) {\r\n this.invoiceIds?.subscribe((ids: number[] | null) => {\r\n if (!ids || ids.length == 0) return;\r\n this.$clientSecretSubscription = this.stripeSettingsService\r\n .createPaymentIntent(ids)\r\n .subscribe(async (paymentIntent: CreatePaymentIntentResponse | null) => {\r\n if (!paymentIntent) return;\r\n this.$invoices.next(paymentIntent.invoices);\r\n await this.initializeStripePayment(paymentIntent.clientSecret);\r\n }, error => {\r\n console.error(error)\r\n this.$loading.next(false);\r\n this.disabled = true;\r\n this.initialized = false;\r\n });\r\n });\r\n }\r\n }\r\n\r\n ngOnInit() {\r\n this.stripeSettingsService.getStripeApiKey()\r\n .pipe(take(1))\r\n .subscribe(async apiKey => {\r\n await this.initializeStripe(apiKey);\r\n });\r\n }\r\n\r\n private async initializeStripePayment(clientSecret: string) {\r\n const options = {\r\n clientSecret: clientSecret,\r\n appearance: this.generateTheme()\r\n } as StripeElementsOptionsClientSecret;\r\n this.elements = this.stripe?.elements(options) as StripeElements;\r\n if (this.elements === null || this.elements === undefined) return;\r\n const paymentElementOptions = {\r\n layout: 'tabs',\r\n defaultCollapsed: false,\r\n radios: true,\r\n spacedAccordionItems: true\r\n };\r\n // @ts-ignore\r\n const paymentElement = this.elements.create('payment',\r\n paymentElementOptions\r\n );\r\n\r\n paymentElement.mount('#payment-element');\r\n\r\n this.$loading.next(false);\r\n this.initialized = true;\r\n }\r\n\r\n private generateTheme() {\r\n const isDark = (window.localStorage.getItem('dx-theme') || \"generic.light.compact\").includes(\"dark\");\r\n\r\n return {\r\n theme: isDark ? \"night\" : \"flat\",\r\n variables: {\r\n colorPrimary: '#337ab7',\r\n }\r\n };\r\n }\r\n\r\n private async initializeStripe(apiKey: string) {\r\n this.stripe = await loadStripe(apiKey, {betas: ['custom_checkout_beta_5']});\r\n }\r\n\r\n public get $InvoiceCode(): Observable | null {\r\n return this.$invoices\r\n .pipe(\r\n map(invoices => invoices?.map(invoice => invoice.invoiceNumber).join(', ') || '')\r\n );\r\n }\r\n\r\n public get $InvoiceAmount(): Observable | null {\r\n return this.$invoices\r\n .pipe(\r\n map(invoices => invoices?.map(invoice => invoice.balance).reduce((acc, curr) => acc + curr, 0) || 0)\r\n );\r\n }\r\n\r\n public closeDrawer() {\r\n this.closeEvent.emit(false);\r\n }\r\n\r\n private clear() {\r\n this.$invoices.next(null);\r\n this.$loading.next(true);\r\n this.disabled = false;\r\n this.initialized = true;\r\n }\r\n\r\n public async makePayment(e: any) {\r\n e.preventDefault();\r\n\r\n if (!this.stripe || !this.elements) return;\r\n const elements = this.elements;\r\n\r\n const {error, paymentIntent} = await this.stripe.confirmPayment({\r\n elements,\r\n confirmParams: {\r\n return_url: window.location.href,\r\n },\r\n redirect: \"if_required\"\r\n });\r\n\r\n if (error) {\r\n const messageContainer = document.querySelector('#error-message');\r\n if (messageContainer === null) return;\r\n messageContainer.textContent = error.message || '';\r\n } else {\r\n switch (paymentIntent.status) {\r\n case 'succeeded':\r\n this.patientBillingService.postPayment({\r\n invoicesIds: this.invoiceIds.value || [],\r\n totalPayment: paymentIntent.amount / 100,\r\n paymentId: paymentIntent.id,\r\n isOnlinePayment: false\r\n })\r\n .subscribe(() => {\r\n notify('Payment successful', 'success', 3000);\r\n this.clear();\r\n this.closeEvent.emit(true);\r\n });\r\n break;\r\n case 'processing':\r\n this.patientBillingService.postPayment({\r\n invoicesIds: this.invoiceIds.value || [],\r\n totalPayment: paymentIntent.amount / 100,\r\n paymentId: paymentIntent.id,\r\n isOnlinePayment: true\r\n })\r\n .subscribe(() => {\r\n notify('Your payment will be processed as soon as possible', 'warning', 3000);\r\n this.clear();\r\n this.closeEvent.emit(true);\r\n });\r\n break;\r\n default:\r\n notify('Your payment was not successful, please try again.', 'error', 3000);\r\n break;\r\n }\r\n }\r\n }\r\n}\r\n","import {ChangeDetectionStrategy, Component, OnDestroy, OnInit, ViewChild} from '@angular/core';\r\nimport {CommonModule} from '@angular/common';\r\nimport {PatientBillingService} from \"../../services/patient-billing.service\";\r\nimport {FusionAuthService} from \"../../../../../shared/services/fusion-auth\";\r\nimport {FlexModule} from \"@angular/flex-layout\";\r\nimport DataSource from \"devextreme/data/data_source\";\r\nimport {BehaviorSubject, from, Observable, of} from \"rxjs\";\r\nimport {\r\n DxButtonModule,\r\n DxDataGridComponent,\r\n DxDataGridModule, DxDrawerComponent,\r\n DxDrawerModule,\r\n DxToolbarModule\r\n} from \"devextreme-angular\";\r\nimport {InvoiceStatus} from \"../../models/invoice.status\";\r\nimport {DomSanitizer} from \"@angular/platform-browser\";\r\nimport {take} from \"rxjs/operators\";\r\nimport {FileUtils} from \"../../../../../shared/utils\";\r\nimport {ReportsService} from \"../../../../shared/services/reports.service\";\r\nimport {PWADetectorService, ScreenService} from \"../../../../../shared/services/general\";\r\nimport {ResultsModule} from \"../../../results/results.module\";\r\nimport {StripePaymentComponent} from \"../../components/stripe-payment/stripe-payment.component\";\r\nimport {PatientInvoice} from \"../../models/invoice\";\r\n\r\n@Component({\r\n selector: 'app-patient-invoices',\r\n standalone: true,\r\n imports: [CommonModule, FlexModule, DxDataGridModule, DxButtonModule, DxToolbarModule, DxDrawerModule, ResultsModule, StripePaymentComponent],\r\n template: `\r\n
\r\n
\r\n
\r\n

Your Invoices

\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n\r\n\r\n \r\n \r\n \r\n
\r\n
\r\n `,\r\n styles: [':host { width: 200px; }', '.padding-block { padding-left: 16px !important; padding-right: 16px !important; }', ':host::ng-deep .dx-toolbar .dx-toolbar-items-container { height: 54px !important;}'],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class PatientInvoicesComponent implements OnInit, OnDestroy {\r\n @ViewChild(DxDrawerComponent, {static: true}) drawer!: DxDrawerComponent;\r\n @ViewChild(DxDataGridComponent, {static: true}) public dxDataGridComponent?: DxDataGridComponent;\r\n public $invoice: BehaviorSubject = new BehaviorSubject([]);\r\n public patientsIds!: number[];\r\n public selectedIds: number[] = [];\r\n public $SomethingSelected: BehaviorSubject = new BehaviorSubject(false);\r\n dataSource: BehaviorSubject> = new BehaviorSubject(null) as BehaviorSubject;\r\n public statusHeaderFilter = [\r\n {\r\n text: 'OPEN',\r\n value: [['status', '=', InvoiceStatus.Open], 'or', ['status', '=', InvoiceStatus.Rebilled]],\r\n },\r\n {\r\n text: 'VOIDED',\r\n value: ['status', '=', InvoiceStatus.Voided],\r\n },\r\n {\r\n text: 'PAST DUE',\r\n value: ['status', '=', InvoiceStatus.PastDue],\r\n },\r\n {\r\n text: 'PAID',\r\n value: ['status', '=', InvoiceStatus.Paid],\r\n }\r\n ];\r\n defaultFilter: any[] = [];\r\n\r\n constructor(private fusionAuth: FusionAuthService,\r\n private reportsService: ReportsService,\r\n private pwaDetectorService: PWADetectorService,\r\n private patientBillingService: PatientBillingService,\r\n public screenService: ScreenService,\r\n private sanitizer: DomSanitizer) {\r\n this.defaultFilter = [['status', 'anyof', [this.statusHeaderFilter[0].value, this.statusHeaderFilter[2].value]]];\r\n }\r\n\r\n ngOnInit(): void {\r\n this.patientsIds = this.fusionAuth.Profile?.data.patients;\r\n this.dataSource.next(new DataSource({store: this.patientBillingService.patientInvoicesStore(this.patientsIds, this.dataSource)}));\r\n }\r\n\r\n selectionChanged(ids: any[]) {\r\n this.$SomethingSelected.next(ids.length > 0);\r\n this.selectedIds = ids;\r\n }\r\n\r\n public getStatus(value: number) {\r\n let color;\r\n let status = InvoiceStatus[InvoiceStatus.Open];\r\n\r\n switch (value) {\r\n case InvoiceStatus.Paid:\r\n color = 'ocl-status-blue';\r\n status = InvoiceStatus[InvoiceStatus.Paid];\r\n break;\r\n case InvoiceStatus.PastDue:\r\n color = 'ocl-status-red';\r\n status = InvoiceStatus[InvoiceStatus.PastDue];\r\n break;\r\n case InvoiceStatus.Voided:\r\n color = 'ocl-status-black';\r\n status = InvoiceStatus[InvoiceStatus.Voided];\r\n break;\r\n default:\r\n color = 'ocl-status-green';\r\n status = InvoiceStatus[value];\r\n break;\r\n }\r\n\r\n let container = `\r\n
\r\n
\r\n ${status.toUpperCase()}
\r\n `;\r\n container += `
`;\r\n return this.sanitizer.bypassSecurityTrustHtml(container);\r\n }\r\n\r\n public printInvoice(ids: number[]) {\r\n this.dxDataGridComponent?.instance.beginCustomLoading('Generating Report');\r\n this.reportsService.generatePatientInvoices(ids)\r\n .pipe(take(1))\r\n .subscribe((blob) => FileUtils.pdfRequestHandler(blob, this, true));\r\n }\r\n\r\n public pay(invoiceIds: number[]) {\r\n this.$invoice.next(invoiceIds);\r\n this.drawer.instance?.show();\r\n }\r\n\r\n public closeDrawer(success: boolean) {\r\n if (success) {\r\n this.dataSource.value.reload();\r\n this.dxDataGridComponent?.instance.refresh();\r\n // this.dataSource.next(new DataSource({store: this.patientBillingService.patientInvoicesStore(this.patientsIds, this.dataSource)}));\r\n }\r\n this.drawer.instance?.hide();\r\n }\r\n\r\n public ngOnDestroy(): void {\r\n this.$invoice.complete();\r\n this.$SomethingSelected.complete();\r\n this.dataSource.complete();\r\n }\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { RouterModule, Routes } from '@angular/router';\r\nimport {FusionAuthGuard} from \"../../../shared/guard\";\r\nimport {PatientInvoicesComponent} from \"./pages/patient-invoices/patient-invoices.component\";\r\n\r\nconst routes: Routes = [{\r\n path: '',\r\n component: PatientInvoicesComponent,\r\n canActivate: [FusionAuthGuard],\r\n data: { roles: ['Patient'] },\r\n}];\r\n\r\n@NgModule({\r\n imports: [RouterModule.forChild(routes)],\r\n exports: [RouterModule]\r\n})\r\nexport class BillingRoutingModule { }\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\nimport { BillingRoutingModule } from './billing-routing.module';\r\n\r\n\r\n@NgModule({\r\n declarations: [],\r\n imports: [\r\n CommonModule,\r\n BillingRoutingModule\r\n ]\r\n})\r\nexport class BillingModule { }\r\n"],"x_google_ignoreList":[0]}