@orechio/platform-angular 0.7.1 → 0.7.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/{orechio-platform-angular-billing-billing-format-0nlddK-x.mjs → orechio-platform-angular-billing-billing-format-C8QPXulm.mjs} +124 -2
- package/fesm2022/orechio-platform-angular-billing-billing-format-C8QPXulm.mjs.map +1 -0
- package/fesm2022/{orechio-platform-angular-billing-checkout.page-CHU_Drpu.mjs → orechio-platform-angular-billing-checkout.page-Dr6ZGDkd.mjs} +13 -7
- package/fesm2022/orechio-platform-angular-billing-checkout.page-Dr6ZGDkd.mjs.map +1 -0
- package/fesm2022/{orechio-platform-angular-billing-invoice.page-BVyWur3o.mjs → orechio-platform-angular-billing-invoice.page-CWThsx-_.mjs} +10 -9
- package/fesm2022/orechio-platform-angular-billing-invoice.page-CWThsx-_.mjs.map +1 -0
- package/fesm2022/{orechio-platform-angular-billing-invoices.page-BiEm3hRf.mjs → orechio-platform-angular-billing-invoices.page-DytE1Lcz.mjs} +7 -6
- package/fesm2022/orechio-platform-angular-billing-invoices.page-DytE1Lcz.mjs.map +1 -0
- package/fesm2022/{orechio-platform-angular-billing-pix-panel.component-B608dQmc.mjs → orechio-platform-angular-billing-pix-panel.component-DrfNi22S.mjs} +27 -5
- package/fesm2022/orechio-platform-angular-billing-pix-panel.component-DrfNi22S.mjs.map +1 -0
- package/fesm2022/{orechio-platform-angular-billing-profile.page-Baa6uoM6.mjs → orechio-platform-angular-billing-profile.page-DRkoYOZa.mjs} +50 -23
- package/fesm2022/orechio-platform-angular-billing-profile.page-DRkoYOZa.mjs.map +1 -0
- package/fesm2022/{orechio-platform-angular-billing-subscription.page-9NF8bWhu.mjs → orechio-platform-angular-billing-subscription.page-Dbk-Znvg.mjs} +6 -6
- package/fesm2022/orechio-platform-angular-billing-subscription.page-Dbk-Znvg.mjs.map +1 -0
- package/fesm2022/orechio-platform-angular-billing.mjs +5 -5
- package/fesm2022/orechio-platform-angular.mjs +8 -4
- package/fesm2022/orechio-platform-angular.mjs.map +1 -1
- package/package.json +1 -1
- package/types/orechio-platform-angular.d.ts +8 -4
- package/fesm2022/orechio-platform-angular-billing-billing-format-0nlddK-x.mjs.map +0 -1
- package/fesm2022/orechio-platform-angular-billing-checkout.page-CHU_Drpu.mjs.map +0 -1
- package/fesm2022/orechio-platform-angular-billing-invoice.page-BVyWur3o.mjs.map +0 -1
- package/fesm2022/orechio-platform-angular-billing-invoices.page-BiEm3hRf.mjs.map +0 -1
- package/fesm2022/orechio-platform-angular-billing-pix-panel.component-B608dQmc.mjs.map +0 -1
- package/fesm2022/orechio-platform-angular-billing-profile.page-Baa6uoM6.mjs.map +0 -1
- package/fesm2022/orechio-platform-angular-billing-subscription.page-9NF8bWhu.mjs.map +0 -1
|
@@ -166,6 +166,114 @@ function moeda(valor) {
|
|
|
166
166
|
function data(iso) {
|
|
167
167
|
return iso ? new Date(iso).toLocaleDateString('pt-BR') : '';
|
|
168
168
|
}
|
|
169
|
+
/**
|
|
170
|
+
* O vencimento para a tela: "02/10/2026". É uma DATA, sem hora: a Platform a manda como meia-noite
|
|
171
|
+
* UTC ("2026-10-02T00:00:00Z") ou "2026-10-02", e passar por `new Date()` a deslocaria para o dia
|
|
172
|
+
* anterior no fuso do navegador (Manaus, Brasília). Lê os 10 primeiros caracteres AAAA-MM-DD e
|
|
173
|
+
* formata por PARTES DO TEXTO. Formato inesperado volta como veio.
|
|
174
|
+
*/
|
|
175
|
+
function dataDoVencimento(valor) {
|
|
176
|
+
const partes = /^(\d{4})-(\d{2})-(\d{2})(?![\d])/.exec(valor.trim());
|
|
177
|
+
if (!partes)
|
|
178
|
+
return valor;
|
|
179
|
+
const [, ano, mes, dia] = partes;
|
|
180
|
+
return `${dia}/${mes}/${ano}`;
|
|
181
|
+
}
|
|
182
|
+
const FUSO_DE_BRASILIA = 'America/Sao_Paulo';
|
|
183
|
+
const SUFIXO_DE_BRASILIA = '(horário de Brasília)';
|
|
184
|
+
/** "AAAA-MM-DD HH:mm[:ss]" — o `expirationDate` do ASAAS: sem fuso, já em horário de Brasília. */
|
|
185
|
+
const SEM_FUSO = /^(\d{4})-(\d{2})-(\d{2})[ T](\d{2}):(\d{2})(?::(\d{2})(?:\.\d+)?)?$/;
|
|
186
|
+
/** O mesmo, com fuso explícito: `Z` ou `±hh:mm` / `±hhmm`. */
|
|
187
|
+
const COM_FUSO = /^\d{4}-\d{2}-\d{2}[ T]\d{2}:\d{2}(?::\d{2}(?:\.\d+)?)?(?:Z|[+-]\d{2}:?\d{2})$/i;
|
|
188
|
+
/**
|
|
189
|
+
* A validade do PIX para a tela: "02/10/2026 às 23:59 (horário de Brasília)".
|
|
190
|
+
*
|
|
191
|
+
* O valor do ASAAS NÃO passa por `new Date()`: sem fuso, o construtor o leria no fuso do
|
|
192
|
+
* navegador e a hora exibida se deslocaria. Ele é formatado por PARTES DO TEXTO. Só o valor
|
|
193
|
+
* com fuso explícito é convertido (para America/Sao_Paulo). Formato não reconhecido volta como
|
|
194
|
+
* veio — nunca "Invalid Date".
|
|
195
|
+
*/
|
|
196
|
+
function validadeDoPix(valor) {
|
|
197
|
+
const texto = valor.trim();
|
|
198
|
+
const semFuso = SEM_FUSO.exec(texto);
|
|
199
|
+
if (semFuso) {
|
|
200
|
+
const [, ano, mes, dia, hora, minuto] = semFuso;
|
|
201
|
+
return dataValida(+ano, +mes, +dia, +hora, +minuto)
|
|
202
|
+
? `${dia}/${mes}/${ano} às ${hora}:${minuto} ${SUFIXO_DE_BRASILIA}`
|
|
203
|
+
: valor;
|
|
204
|
+
}
|
|
205
|
+
if (COM_FUSO.test(texto)) {
|
|
206
|
+
const instante = new Date(texto.replace(' ', 'T'));
|
|
207
|
+
if (Number.isNaN(instante.getTime()))
|
|
208
|
+
return valor;
|
|
209
|
+
const partes = Object.fromEntries(new Intl.DateTimeFormat('pt-BR', {
|
|
210
|
+
timeZone: FUSO_DE_BRASILIA,
|
|
211
|
+
day: '2-digit',
|
|
212
|
+
month: '2-digit',
|
|
213
|
+
year: 'numeric',
|
|
214
|
+
hour: '2-digit',
|
|
215
|
+
minute: '2-digit',
|
|
216
|
+
hourCycle: 'h23',
|
|
217
|
+
})
|
|
218
|
+
.formatToParts(instante)
|
|
219
|
+
.map((parte) => [parte.type, parte.value]));
|
|
220
|
+
return `${partes['day']}/${partes['month']}/${partes['year']} às ${partes['hour']}:${partes['minute']} ${SUFIXO_DE_BRASILIA}`;
|
|
221
|
+
}
|
|
222
|
+
return valor;
|
|
223
|
+
}
|
|
224
|
+
function dataValida(ano, mes, dia, hora, minuto) {
|
|
225
|
+
if (mes < 1 || mes > 12 || hora > 23 || minuto > 59 || dia < 1)
|
|
226
|
+
return false;
|
|
227
|
+
return dia <= new Date(Date.UTC(ano, mes, 0)).getUTCDate();
|
|
228
|
+
}
|
|
229
|
+
// ── máscaras (perfil de cobrança) ────────────────────────────────────────────
|
|
230
|
+
function soDigitos(valor) {
|
|
231
|
+
return valor.replace(/\D/g, '');
|
|
232
|
+
}
|
|
233
|
+
/** Junta os grupos de dígitos com os separadores, parando no primeiro grupo vazio. */
|
|
234
|
+
function agrupar(digitos, grupos, separadores) {
|
|
235
|
+
let saida = '';
|
|
236
|
+
let posicao = 0;
|
|
237
|
+
for (let i = 0; i < grupos.length; i++) {
|
|
238
|
+
const grupo = digitos.slice(posicao, posicao + grupos[i]);
|
|
239
|
+
if (!grupo)
|
|
240
|
+
break;
|
|
241
|
+
saida += (i === 0 ? '' : separadores[i - 1]) + grupo;
|
|
242
|
+
posicao += grupos[i];
|
|
243
|
+
}
|
|
244
|
+
return saida;
|
|
245
|
+
}
|
|
246
|
+
/** CPF `000.000.000-00`, progressivo enquanto se digita. */
|
|
247
|
+
function mascararCpf(valor) {
|
|
248
|
+
return agrupar(soDigitos(valor).slice(0, 11), [3, 3, 3, 2], ['.', '.', '-']);
|
|
249
|
+
}
|
|
250
|
+
/** CNPJ `00.000.000/0000-00`, progressivo enquanto se digita. */
|
|
251
|
+
function mascararCnpj(valor) {
|
|
252
|
+
return agrupar(soDigitos(valor).slice(0, 14), [2, 3, 3, 4, 2], ['.', '.', '/', '-']);
|
|
253
|
+
}
|
|
254
|
+
/** O documento conforme o tipo escolhido. */
|
|
255
|
+
function mascararDocumento(tipo, valor) {
|
|
256
|
+
return tipo === 'Cpf' ? mascararCpf(valor) : mascararCnpj(valor);
|
|
257
|
+
}
|
|
258
|
+
/** CEP `00000-000`. */
|
|
259
|
+
function mascararCep(valor) {
|
|
260
|
+
return agrupar(soDigitos(valor).slice(0, 8), [5, 3], ['-']);
|
|
261
|
+
}
|
|
262
|
+
/** Telefone `(00) 0000-0000` (10 dígitos) ou celular `(00) 00000-0000` (11). */
|
|
263
|
+
function mascararTelefone(valor) {
|
|
264
|
+
const digitos = soDigitos(valor).slice(0, 11);
|
|
265
|
+
if (!digitos)
|
|
266
|
+
return '';
|
|
267
|
+
const ddd = digitos.slice(0, 2);
|
|
268
|
+
if (digitos.length <= 2)
|
|
269
|
+
return `(${ddd}`;
|
|
270
|
+
const numero = digitos.slice(2);
|
|
271
|
+
const tamanhoDoPrimeiroBloco = digitos.length > 10 ? 5 : 4;
|
|
272
|
+
const corpo = numero.length > tamanhoDoPrimeiroBloco
|
|
273
|
+
? `${numero.slice(0, tamanhoDoPrimeiroBloco)}-${numero.slice(tamanhoDoPrimeiroBloco)}`
|
|
274
|
+
: numero;
|
|
275
|
+
return `(${ddd}) ${corpo}`;
|
|
276
|
+
}
|
|
169
277
|
const STATUS_DA_FATURA = {
|
|
170
278
|
Created: 'Em emissão',
|
|
171
279
|
Pending: 'Em aberto',
|
|
@@ -188,7 +296,21 @@ const ESTILO_BASE = `
|
|
|
188
296
|
.orechio-billing form { display: flex; flex-direction: column; gap: var(--orechio-space-2, 0.5rem); }
|
|
189
297
|
.orechio-billing__muted { color: var(--orechio-color-text-muted, #666); }
|
|
190
298
|
.orechio-billing__error { color: var(--orechio-color-danger, #b00020); }
|
|
299
|
+
.orechio-billing__acao {
|
|
300
|
+
align-self: flex-start;
|
|
301
|
+
display: inline-block;
|
|
302
|
+
padding: var(--orechio-space-2, 0.5rem) var(--orechio-space-4, 1rem);
|
|
303
|
+
border-radius: var(--orechio-radius, 0.375rem);
|
|
304
|
+
background: var(--orechio-color-primary, #1a56db);
|
|
305
|
+
color: var(--orechio-color-on-primary, #fff);
|
|
306
|
+
font-weight: 600;
|
|
307
|
+
text-decoration: none;
|
|
308
|
+
}
|
|
309
|
+
.orechio-billing__acao:hover,
|
|
310
|
+
.orechio-billing__acao:focus-visible {
|
|
311
|
+
background: var(--orechio-color-primary-hover, var(--orechio-color-primary, #1446b0));
|
|
312
|
+
}
|
|
191
313
|
`;
|
|
192
314
|
|
|
193
|
-
export { BillingClient as B, STATUS_DA_FATURA as S, BillingErrorComponent as a, data as d, moeda as m };
|
|
194
|
-
//# sourceMappingURL=orechio-platform-angular-billing-billing-format-
|
|
315
|
+
export { BillingClient as B, STATUS_DA_FATURA as S, BillingErrorComponent as a, mascararTelefone as b, mascararDocumento as c, data as d, mascararCpf as e, mascararCnpj as f, moeda as g, dataDoVencimento as h, mascararCep as m, soDigitos as s, validadeDoPix as v };
|
|
316
|
+
//# sourceMappingURL=orechio-platform-angular-billing-billing-format-C8QPXulm.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orechio-platform-angular-billing-billing-format-C8QPXulm.mjs","sources":["../../../projects/platform-angular/billing/src/billing-client.ts","../../../projects/platform-angular/billing/src/billing-errors.ts","../../../projects/platform-angular/billing/src/billing-error.component.ts","../../../projects/platform-angular/billing/src/billing-format.ts"],"sourcesContent":["import { HttpClient, HttpErrorResponse, HttpParams } from '@angular/common/http';\r\nimport { Injectable, inject } from '@angular/core';\r\nimport { Observable, catchError, throwError } from 'rxjs';\r\nimport { ProblemDetails, normalizeProblemDetails } from '@orechio/platform-angular';\r\nimport { ORECHIO_BILLING_CONFIG } from './billing-config';\r\nimport {\r\n BillingAddressRequest,\r\n BillingContactRequest,\r\n BillingCycle,\r\n BillingProfile,\r\n CheckoutResult,\r\n CreateBillingProfileRequest,\r\n InvoiceDetail,\r\n InvoicesPage,\r\n Plan,\r\n PricingPreview,\r\n RefreshedPayment,\r\n Subscription,\r\n} from './billing-models';\r\n\r\n/**\r\n * O cliente do BFF de cobrança (`Orechio.Platform.Bff.Account` 0.2.0,\r\n * `MapOrechioBillingEndpoints`). Same-origin, só com o BFF do host — mesmo desenho do\r\n * `AccountClient`, e o erro sai pelo mesmo `normalizeProblemDetails`.\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class BillingClient {\r\n private readonly http = inject(HttpClient);\r\n private readonly config = inject(ORECHIO_BILLING_CONFIG);\r\n\r\n getSubscription(): Observable<Subscription> {\r\n return this.falha(this.http.get<Subscription>(this.url('/subscription')));\r\n }\r\n\r\n getProfile(): Observable<BillingProfile> {\r\n return this.falha(this.http.get<BillingProfile>(this.url('/profile')));\r\n }\r\n\r\n createProfile(request: CreateBillingProfileRequest): Observable<{ id: string }> {\r\n return this.falha(this.http.post<{ id: string }>(this.url('/profile'), request));\r\n }\r\n\r\n updateProfileContact(request: BillingContactRequest): Observable<void> {\r\n return this.falha(this.http.patch<void>(this.url('/profile/contact'), request));\r\n }\r\n\r\n updateProfileAddress(request: BillingAddressRequest): Observable<void> {\r\n return this.falha(this.http.patch<void>(this.url('/profile/address'), request));\r\n }\r\n\r\n listPlans(): Observable<Plan[]> {\r\n return this.falha(this.http.get<Plan[]>(this.url('/plans')));\r\n }\r\n\r\n previewPricing(planId: string, branchCount: number, cycle: BillingCycle): Observable<PricingPreview> {\r\n const params = new HttpParams({ fromObject: { planId, branchCount, cycle } });\r\n return this.falha(this.http.get<PricingPreview>(this.url('/pricing/preview'), { params }));\r\n }\r\n\r\n /**\r\n * Checkout PIX. O corpo é o `CheckoutRequest` da Platform (`cycle`, `method`), sem\r\n * `applicationId`: com o token de produto, a Platform usa o app do token.\r\n */\r\n checkout(cycle: BillingCycle): Observable<CheckoutResult> {\r\n return this.falha(this.http.post<CheckoutResult>(this.url('/checkout'), { cycle, method: 'pix' }));\r\n }\r\n\r\n listInvoices(page = 1, pageSize = 20): Observable<InvoicesPage> {\r\n const params = new HttpParams({ fromObject: { page, pageSize } });\r\n return this.falha(this.http.get<InvoicesPage>(this.url('/invoices'), { params }));\r\n }\r\n\r\n getInvoice(id: string): Observable<InvoiceDetail> {\r\n return this.falha(this.http.get<InvoiceDetail>(this.url(`/invoices/${encodeURIComponent(id)}`)));\r\n }\r\n\r\n refreshInvoicePix(id: string): Observable<RefreshedPayment> {\r\n return this.falha(this.http.post<RefreshedPayment>(this.url(`/invoices/${encodeURIComponent(id)}/refresh`), null));\r\n }\r\n\r\n private url(path: string): string {\r\n return `${this.config.basePath}${path}`;\r\n }\r\n\r\n private falha<T>(chamada: Observable<T>): Observable<T> {\r\n return chamada.pipe(\r\n catchError((error: HttpErrorResponse) =>\r\n throwError((): ProblemDetails => normalizeProblemDetails(error)),\r\n ),\r\n );\r\n }\r\n}\r\n","import { ProblemDetails } from '@orechio/platform-angular';\r\n\r\nexport interface MensagemDeErro {\r\n texto: string;\r\n /** Só para code desconhecido: é o que o suporte cruza com o log dos dois lados. */\r\n correlationId?: string;\r\n}\r\n\r\nconst ENDERECO_INCOMPLETO = 'Preencha o endereço completo.';\r\nconst DOCUMENTO_INVALIDO = 'CPF ou CNPJ inválido.';\r\nconst DOCUMENTO_TRAVADO =\r\n 'O documento e o nome já foram usados em uma cobrança e não podem mais ser alterados.';\r\nconst PLANO_INDISPONIVEL = 'O plano da assinatura não está disponível. Fale com o suporte.';\r\nconst SO_O_TITULAR = 'Só o titular da conta pode ver e pagar a cobrança.';\r\n\r\n/**\r\n * Os codes que as rotas de cobrança da Platform e do BFF emitem de fato\r\n * (`Commerce*Endpoints`, handlers de `Billing/`, value objects de perfil,\r\n * `PermissionAuthorization`, `Bff.Account`).\r\n */\r\nconst MENSAGENS: Record<string, string> = {\r\n 'session.missing': 'Sua sessão expirou. Entre novamente para continuar.',\r\n 'platform.unavailable':\r\n 'O serviço de cobrança está indisponível no momento. Tente novamente em instantes.',\r\n 'http.0': 'Sem conexão com o servidor. Verifique sua internet e tente novamente.',\r\n rate_limit_exceeded: 'Muitas tentativas. Aguarde alguns minutos e tente novamente.',\r\n\r\n 'access.platform_only': SO_O_TITULAR,\r\n 'permission.denied': SO_O_TITULAR,\r\n\r\n 'subscription.not_found': 'Nenhuma assinatura encontrada para esta conta.',\r\n\r\n 'billing_profile.not_found': 'Cadastre os dados de cobrança antes de pagar.',\r\n 'billing_profile.already_exists': 'Os dados de cobrança já estão cadastrados.',\r\n 'billing_profile.legal_name_required': 'Informe o nome completo ou a razão social.',\r\n 'billing_profile.billing_email_required': 'Informe o e-mail de cobrança.',\r\n 'billing_profile.billing_email_invalid': 'Informe um e-mail de cobrança válido.',\r\n 'billing_profile.mobile_phone_too_long': 'O celular informado é longo demais.',\r\n 'billing_profile.document_type_locked': DOCUMENTO_TRAVADO,\r\n 'billing_profile.document_number_locked': DOCUMENTO_TRAVADO,\r\n 'billing_profile.legal_name_locked': DOCUMENTO_TRAVADO,\r\n 'tax_document.value_required': 'Informe o CPF ou o CNPJ.',\r\n 'tax_document.length_invalid': DOCUMENTO_INVALIDO,\r\n 'tax_document.checksum_invalid': DOCUMENTO_INVALIDO,\r\n 'address.postal_code_invalid': 'CEP inválido.',\r\n 'address.state_invalid': 'UF inválida. Use a sigla do estado, como SP.',\r\n 'address.street_required': ENDERECO_INCOMPLETO,\r\n 'address.number_required': ENDERECO_INCOMPLETO,\r\n 'address.neighborhood_required': ENDERECO_INCOMPLETO,\r\n 'address.city_required': ENDERECO_INCOMPLETO,\r\n\r\n 'checkout.subscription_not_eligible':\r\n 'Não há pagamento de assinatura a fazer agora. Veja as faturas em aberto.',\r\n 'checkout.open_invoice_exists':\r\n 'Já existe uma fatura em aberto. Pague a fatura em aberto em vez de gerar uma nova cobrança.',\r\n 'checkout.pending_other_method':\r\n 'Já existe uma cobrança em aberto por outro meio de pagamento. Veja as faturas.',\r\n 'checkout.credit_card_not_supported': 'Pagamento por cartão ainda não está disponível.',\r\n 'checkout.invoice_in_inconsistent_state':\r\n 'A cobrança anterior ficou incompleta. Tente novamente em alguns minutos.',\r\n 'billing.cycle_invalid': 'Escolha um ciclo de cobrança válido.',\r\n 'pricing_preview.cycle_invalid': 'Escolha um ciclo de cobrança válido.',\r\n 'plan.not_found': PLANO_INDISPONIVEL,\r\n 'plan.not_available': PLANO_INDISPONIVEL,\r\n 'subscription.plan_inactive': PLANO_INDISPONIVEL,\r\n\r\n 'invoice.not_found': 'Fatura não encontrada.',\r\n 'invoice.payment_unavailable':\r\n 'Esta cobrança não está mais disponível para pagamento. Fale com o suporte.',\r\n 'invoice.refresh_not_allowed': 'Esta fatura não está mais em aberto.',\r\n 'invoice.refresh_pix_only': 'Só é possível gerar QR para faturas PIX.',\r\n 'invoice.no_external_payment':\r\n 'Esta fatura ainda não tem cobrança gerada. Tente novamente em alguns minutos.',\r\n};\r\n\r\nconst GENERICA =\r\n 'Não foi possível concluir a operação. Tente novamente; se continuar, informe o código de atendimento ao suporte.';\r\n\r\n/**\r\n * O texto de tela para um erro do BFF, escolhido por `code`. O corpo do erro (`message`) nunca\r\n * vira texto: ele é escrito para log, não para o cliente.\r\n */\r\nexport function mensagemDeErro(problema: ProblemDetails): MensagemDeErro {\r\n const conhecida = MENSAGENS[problema.code];\r\n if (conhecida) return { texto: conhecida };\r\n\r\n return problema.correlationId\r\n ? { texto: GENERICA, correlationId: problema.correlationId }\r\n : { texto: GENERICA };\r\n}\r\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\r\nimport { ProblemDetails } from '@orechio/platform-angular';\r\nimport { mensagemDeErro } from './billing-errors';\r\n\r\n@Component({\r\n selector: 'orechio-billing-error',\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n template: `\r\n <div class=\"orechio-billing__error\" role=\"alert\">\r\n <p>{{ mensagem().texto }}</p>\r\n @if (mensagem().correlationId; as id) {\r\n <p>Código de atendimento: <code>{{ id }}</code></p>\r\n }\r\n </div>\r\n `,\r\n styles: `.orechio-billing__error { color: var(--orechio-color-danger, #b00020); }`,\r\n})\r\nexport class BillingErrorComponent {\r\n readonly problema = input.required<ProblemDetails>();\r\n protected readonly mensagem = computed(() => mensagemDeErro(this.problema()));\r\n}\r\n","import { InvoiceStatus } from './billing-models';\r\n\r\nconst MOEDA = new Intl.NumberFormat('pt-BR', { style: 'currency', currency: 'BRL' });\r\n\r\nexport function moeda(valor: number): string {\r\n return MOEDA.format(valor);\r\n}\r\n\r\nexport function data(iso: string | null | undefined): string {\r\n return iso ? new Date(iso).toLocaleDateString('pt-BR') : '';\r\n}\r\n\r\n/**\r\n * O vencimento para a tela: \"02/10/2026\". É uma DATA, sem hora: a Platform a manda como meia-noite\r\n * UTC (\"2026-10-02T00:00:00Z\") ou \"2026-10-02\", e passar por `new Date()` a deslocaria para o dia\r\n * anterior no fuso do navegador (Manaus, Brasília). Lê os 10 primeiros caracteres AAAA-MM-DD e\r\n * formata por PARTES DO TEXTO. Formato inesperado volta como veio.\r\n */\r\nexport function dataDoVencimento(valor: string): string {\r\n const partes = /^(\\d{4})-(\\d{2})-(\\d{2})(?![\\d])/.exec(valor.trim());\r\n if (!partes) return valor;\r\n const [, ano, mes, dia] = partes;\r\n return `${dia}/${mes}/${ano}`;\r\n}\r\n\r\nconst FUSO_DE_BRASILIA = 'America/Sao_Paulo';\r\nconst SUFIXO_DE_BRASILIA = '(horário de Brasília)';\r\n\r\n/** \"AAAA-MM-DD HH:mm[:ss]\" — o `expirationDate` do ASAAS: sem fuso, já em horário de Brasília. */\r\nconst SEM_FUSO = /^(\\d{4})-(\\d{2})-(\\d{2})[ T](\\d{2}):(\\d{2})(?::(\\d{2})(?:\\.\\d+)?)?$/;\r\n/** O mesmo, com fuso explícito: `Z` ou `±hh:mm` / `±hhmm`. */\r\nconst COM_FUSO = /^\\d{4}-\\d{2}-\\d{2}[ T]\\d{2}:\\d{2}(?::\\d{2}(?:\\.\\d+)?)?(?:Z|[+-]\\d{2}:?\\d{2})$/i;\r\n\r\n/**\r\n * A validade do PIX para a tela: \"02/10/2026 às 23:59 (horário de Brasília)\".\r\n *\r\n * O valor do ASAAS NÃO passa por `new Date()`: sem fuso, o construtor o leria no fuso do\r\n * navegador e a hora exibida se deslocaria. Ele é formatado por PARTES DO TEXTO. Só o valor\r\n * com fuso explícito é convertido (para America/Sao_Paulo). Formato não reconhecido volta como\r\n * veio — nunca \"Invalid Date\".\r\n */\r\nexport function validadeDoPix(valor: string): string {\r\n const texto = valor.trim();\r\n\r\n const semFuso = SEM_FUSO.exec(texto);\r\n if (semFuso) {\r\n const [, ano, mes, dia, hora, minuto] = semFuso;\r\n return dataValida(+ano, +mes, +dia, +hora, +minuto)\r\n ? `${dia}/${mes}/${ano} às ${hora}:${minuto} ${SUFIXO_DE_BRASILIA}`\r\n : valor;\r\n }\r\n\r\n if (COM_FUSO.test(texto)) {\r\n const instante = new Date(texto.replace(' ', 'T'));\r\n if (Number.isNaN(instante.getTime())) return valor;\r\n\r\n const partes = Object.fromEntries(\r\n new Intl.DateTimeFormat('pt-BR', {\r\n timeZone: FUSO_DE_BRASILIA,\r\n day: '2-digit',\r\n month: '2-digit',\r\n year: 'numeric',\r\n hour: '2-digit',\r\n minute: '2-digit',\r\n hourCycle: 'h23',\r\n })\r\n .formatToParts(instante)\r\n .map((parte) => [parte.type, parte.value]),\r\n );\r\n return `${partes['day']}/${partes['month']}/${partes['year']} às ${partes['hour']}:${partes['minute']} ${SUFIXO_DE_BRASILIA}`;\r\n }\r\n\r\n return valor;\r\n}\r\n\r\nfunction dataValida(ano: number, mes: number, dia: number, hora: number, minuto: number): boolean {\r\n if (mes < 1 || mes > 12 || hora > 23 || minuto > 59 || dia < 1) return false;\r\n return dia <= new Date(Date.UTC(ano, mes, 0)).getUTCDate();\r\n}\r\n\r\n// ── máscaras (perfil de cobrança) ────────────────────────────────────────────\r\n\r\nexport function soDigitos(valor: string): string {\r\n return valor.replace(/\\D/g, '');\r\n}\r\n\r\n/** Junta os grupos de dígitos com os separadores, parando no primeiro grupo vazio. */\r\nfunction agrupar(digitos: string, grupos: readonly number[], separadores: readonly string[]): string {\r\n let saida = '';\r\n let posicao = 0;\r\n for (let i = 0; i < grupos.length; i++) {\r\n const grupo = digitos.slice(posicao, posicao + grupos[i]);\r\n if (!grupo) break;\r\n saida += (i === 0 ? '' : separadores[i - 1]) + grupo;\r\n posicao += grupos[i];\r\n }\r\n return saida;\r\n}\r\n\r\n/** CPF `000.000.000-00`, progressivo enquanto se digita. */\r\nexport function mascararCpf(valor: string): string {\r\n return agrupar(soDigitos(valor).slice(0, 11), [3, 3, 3, 2], ['.', '.', '-']);\r\n}\r\n\r\n/** CNPJ `00.000.000/0000-00`, progressivo enquanto se digita. */\r\nexport function mascararCnpj(valor: string): string {\r\n return agrupar(soDigitos(valor).slice(0, 14), [2, 3, 3, 4, 2], ['.', '.', '/', '-']);\r\n}\r\n\r\n/** O documento conforme o tipo escolhido. */\r\nexport function mascararDocumento(tipo: 'Cpf' | 'Cnpj', valor: string): string {\r\n return tipo === 'Cpf' ? mascararCpf(valor) : mascararCnpj(valor);\r\n}\r\n\r\n/** CEP `00000-000`. */\r\nexport function mascararCep(valor: string): string {\r\n return agrupar(soDigitos(valor).slice(0, 8), [5, 3], ['-']);\r\n}\r\n\r\n/** Telefone `(00) 0000-0000` (10 dígitos) ou celular `(00) 00000-0000` (11). */\r\nexport function mascararTelefone(valor: string): string {\r\n const digitos = soDigitos(valor).slice(0, 11);\r\n if (!digitos) return '';\r\n\r\n const ddd = digitos.slice(0, 2);\r\n if (digitos.length <= 2) return `(${ddd}`;\r\n\r\n const numero = digitos.slice(2);\r\n const tamanhoDoPrimeiroBloco = digitos.length > 10 ? 5 : 4;\r\n const corpo =\r\n numero.length > tamanhoDoPrimeiroBloco\r\n ? `${numero.slice(0, tamanhoDoPrimeiroBloco)}-${numero.slice(tamanhoDoPrimeiroBloco)}`\r\n : numero;\r\n return `(${ddd}) ${corpo}`;\r\n}\r\n\r\nexport const STATUS_DA_FATURA: Record<InvoiceStatus, string> = {\r\n Created: 'Em emissão',\r\n Pending: 'Em aberto',\r\n Paid: 'Paga',\r\n Overdue: 'Vencida',\r\n Refunded: 'Estornada',\r\n Cancelled: 'Cancelada',\r\n};\r\n\r\nexport const ESTILO_BASE = `\r\n .orechio-billing {\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--orechio-space-3, 0.75rem);\r\n max-width: 40rem;\r\n margin: 0 auto;\r\n padding: var(--orechio-space-6, 1.5rem);\r\n color: var(--orechio-color-text, inherit);\r\n font-family: var(--orechio-font-body, inherit);\r\n }\r\n .orechio-billing form { display: flex; flex-direction: column; gap: var(--orechio-space-2, 0.5rem); }\r\n .orechio-billing__muted { color: var(--orechio-color-text-muted, #666); }\r\n .orechio-billing__error { color: var(--orechio-color-danger, #b00020); }\r\n .orechio-billing__acao {\r\n align-self: flex-start;\r\n display: inline-block;\r\n padding: var(--orechio-space-2, 0.5rem) var(--orechio-space-4, 1rem);\r\n border-radius: var(--orechio-radius, 0.375rem);\r\n background: var(--orechio-color-primary, #1a56db);\r\n color: var(--orechio-color-on-primary, #fff);\r\n font-weight: 600;\r\n text-decoration: none;\r\n }\r\n .orechio-billing__acao:hover,\r\n .orechio-billing__acao:focus-visible {\r\n background: var(--orechio-color-primary-hover, var(--orechio-color-primary, #1446b0));\r\n }\r\n`;\r\n"],"names":[],"mappings":"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"}
|
|
@@ -2,8 +2,8 @@ import * as i0 from '@angular/core';
|
|
|
2
2
|
import { inject, signal, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
3
3
|
import { Router, ActivatedRoute, RouterLink } from '@angular/router';
|
|
4
4
|
import { forkJoin } from 'rxjs';
|
|
5
|
-
import { B as BillingClient,
|
|
6
|
-
import { P as PixPanelComponent } from './orechio-platform-angular-billing-pix-panel.component-
|
|
5
|
+
import { B as BillingClient, g as moeda, a as BillingErrorComponent } from './orechio-platform-angular-billing-billing-format-C8QPXulm.mjs';
|
|
6
|
+
import { P as PixPanelComponent } from './orechio-platform-angular-billing-pix-panel.component-DrfNi22S.mjs';
|
|
7
7
|
|
|
8
8
|
const STATUS_COM_CHECKOUT = ['Trial', 'PendingPayment', 'Grace', 'Suspended'];
|
|
9
9
|
const CICLOS = [
|
|
@@ -31,6 +31,10 @@ class CheckoutPage {
|
|
|
31
31
|
...(ngDevMode ? [{ debugName: "pix" }] : /* istanbul ignore next */ []));
|
|
32
32
|
invoiceUrl = signal(null, /* @ts-ignore */
|
|
33
33
|
...(ngDevMode ? [{ debugName: "invoiceUrl" }] : /* istanbul ignore next */ []));
|
|
34
|
+
valor = signal(null, /* @ts-ignore */
|
|
35
|
+
...(ngDevMode ? [{ debugName: "valor" }] : /* istanbul ignore next */ []));
|
|
36
|
+
vencimento = signal(null, /* @ts-ignore */
|
|
37
|
+
...(ngDevMode ? [{ debugName: "vencimento" }] : /* istanbul ignore next */ []));
|
|
34
38
|
erro = signal(null, /* @ts-ignore */
|
|
35
39
|
...(ngDevMode ? [{ debugName: "erro" }] : /* istanbul ignore next */ []));
|
|
36
40
|
rotulo(ciclo) {
|
|
@@ -70,6 +74,8 @@ class CheckoutPage {
|
|
|
70
74
|
next: (resultado) => {
|
|
71
75
|
this.enviando.set(false);
|
|
72
76
|
this.invoiceUrl.set(resultado.invoiceUrl ?? null);
|
|
77
|
+
this.valor.set(resultado.amount);
|
|
78
|
+
this.vencimento.set(resultado.dueDate);
|
|
73
79
|
if (resultado.pix)
|
|
74
80
|
this.pix.set(resultado.pix);
|
|
75
81
|
else
|
|
@@ -99,7 +105,7 @@ class CheckoutPage {
|
|
|
99
105
|
|
|
100
106
|
@if (pix(); as dados) {
|
|
101
107
|
<p>Pague o PIX abaixo. A assinatura é atualizada assim que o pagamento for confirmado.</p>
|
|
102
|
-
<orechio-billing-pix [pix]="dados" [invoiceUrl]="invoiceUrl()" />
|
|
108
|
+
<orechio-billing-pix [pix]="dados" [invoiceUrl]="invoiceUrl()" [valor]="valor()" [vencimento]="vencimento()" />
|
|
103
109
|
<a routerLink="..">Voltar para a assinatura</a>
|
|
104
110
|
} @else if (inelegivel()) {
|
|
105
111
|
<p>Não há pagamento de assinatura a fazer agora.</p>
|
|
@@ -134,7 +140,7 @@ class CheckoutPage {
|
|
|
134
140
|
<orechio-billing-error [problema]="problema" />
|
|
135
141
|
}
|
|
136
142
|
</section>
|
|
137
|
-
`, isInline: true, styles: [".orechio-billing{display:flex;flex-direction:column;gap:var(--orechio-space-3, .75rem);max-width:40rem;margin:0 auto;padding:var(--orechio-space-6, 1.5rem);color:var(--orechio-color-text, inherit);font-family:var(--orechio-font-body, inherit)}.orechio-billing form{display:flex;flex-direction:column;gap:var(--orechio-space-2, .5rem)}.orechio-billing__muted{color:var(--orechio-color-text-muted, #666)}.orechio-billing__error{color:var(--orechio-color-danger, #b00020)}\n"], dependencies: [{ kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "browserUrl", "routerLink"] }, { kind: "component", type: BillingErrorComponent, selector: "orechio-billing-error", inputs: ["problema"] }, { kind: "component", type: PixPanelComponent, selector: "orechio-billing-pix", inputs: ["pix", "invoiceUrl"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
143
|
+
`, isInline: true, styles: [".orechio-billing{display:flex;flex-direction:column;gap:var(--orechio-space-3, .75rem);max-width:40rem;margin:0 auto;padding:var(--orechio-space-6, 1.5rem);color:var(--orechio-color-text, inherit);font-family:var(--orechio-font-body, inherit)}.orechio-billing form{display:flex;flex-direction:column;gap:var(--orechio-space-2, .5rem)}.orechio-billing__muted{color:var(--orechio-color-text-muted, #666)}.orechio-billing__error{color:var(--orechio-color-danger, #b00020)}.orechio-billing__acao{align-self:flex-start;display:inline-block;padding:var(--orechio-space-2, .5rem) var(--orechio-space-4, 1rem);border-radius:var(--orechio-radius, .375rem);background:var(--orechio-color-primary, #1a56db);color:var(--orechio-color-on-primary, #fff);font-weight:600;text-decoration:none}.orechio-billing__acao:hover,.orechio-billing__acao:focus-visible{background:var(--orechio-color-primary-hover, var(--orechio-color-primary, #1446b0))}\n"], dependencies: [{ kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "browserUrl", "routerLink"] }, { kind: "component", type: BillingErrorComponent, selector: "orechio-billing-error", inputs: ["problema"] }, { kind: "component", type: PixPanelComponent, selector: "orechio-billing-pix", inputs: ["pix", "invoiceUrl", "valor", "vencimento"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
138
144
|
}
|
|
139
145
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.2", ngImport: i0, type: CheckoutPage, decorators: [{
|
|
140
146
|
type: Component,
|
|
@@ -144,7 +150,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.2", ngImpor
|
|
|
144
150
|
|
|
145
151
|
@if (pix(); as dados) {
|
|
146
152
|
<p>Pague o PIX abaixo. A assinatura é atualizada assim que o pagamento for confirmado.</p>
|
|
147
|
-
<orechio-billing-pix [pix]="dados" [invoiceUrl]="invoiceUrl()" />
|
|
153
|
+
<orechio-billing-pix [pix]="dados" [invoiceUrl]="invoiceUrl()" [valor]="valor()" [vencimento]="vencimento()" />
|
|
148
154
|
<a routerLink="..">Voltar para a assinatura</a>
|
|
149
155
|
} @else if (inelegivel()) {
|
|
150
156
|
<p>Não há pagamento de assinatura a fazer agora.</p>
|
|
@@ -179,8 +185,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.2", ngImpor
|
|
|
179
185
|
<orechio-billing-error [problema]="problema" />
|
|
180
186
|
}
|
|
181
187
|
</section>
|
|
182
|
-
`, styles: [".orechio-billing{display:flex;flex-direction:column;gap:var(--orechio-space-3, .75rem);max-width:40rem;margin:0 auto;padding:var(--orechio-space-6, 1.5rem);color:var(--orechio-color-text, inherit);font-family:var(--orechio-font-body, inherit)}.orechio-billing form{display:flex;flex-direction:column;gap:var(--orechio-space-2, .5rem)}.orechio-billing__muted{color:var(--orechio-color-text-muted, #666)}.orechio-billing__error{color:var(--orechio-color-danger, #b00020)}\n"] }]
|
|
188
|
+
`, styles: [".orechio-billing{display:flex;flex-direction:column;gap:var(--orechio-space-3, .75rem);max-width:40rem;margin:0 auto;padding:var(--orechio-space-6, 1.5rem);color:var(--orechio-color-text, inherit);font-family:var(--orechio-font-body, inherit)}.orechio-billing form{display:flex;flex-direction:column;gap:var(--orechio-space-2, .5rem)}.orechio-billing__muted{color:var(--orechio-color-text-muted, #666)}.orechio-billing__error{color:var(--orechio-color-danger, #b00020)}.orechio-billing__acao{align-self:flex-start;display:inline-block;padding:var(--orechio-space-2, .5rem) var(--orechio-space-4, 1rem);border-radius:var(--orechio-radius, .375rem);background:var(--orechio-color-primary, #1a56db);color:var(--orechio-color-on-primary, #fff);font-weight:600;text-decoration:none}.orechio-billing__acao:hover,.orechio-billing__acao:focus-visible{background:var(--orechio-color-primary-hover, var(--orechio-color-primary, #1446b0))}\n"] }]
|
|
183
189
|
}] });
|
|
184
190
|
|
|
185
191
|
export { CheckoutPage };
|
|
186
|
-
//# sourceMappingURL=orechio-platform-angular-billing-checkout.page-
|
|
192
|
+
//# sourceMappingURL=orechio-platform-angular-billing-checkout.page-Dr6ZGDkd.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orechio-platform-angular-billing-checkout.page-Dr6ZGDkd.mjs","sources":["../../../projects/platform-angular/billing/src/pages/checkout.page.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, OnInit, inject, signal } from '@angular/core';\r\nimport { ActivatedRoute, Router, RouterLink } from '@angular/router';\r\nimport { forkJoin } from 'rxjs';\r\nimport { ProblemDetails } from '@orechio/platform-angular';\r\nimport { BillingClient } from '../billing-client';\r\nimport { BillingErrorComponent } from '../billing-error.component';\r\nimport { ESTILO_BASE, moeda } from '../billing-format';\r\nimport { BillingCycle, PixData, PricingPreview, Subscription, SubscriptionStatus } from '../billing-models';\r\nimport { PixPanelComponent } from '../pix-panel.component';\r\n\r\nconst STATUS_COM_CHECKOUT: SubscriptionStatus[] = ['Trial', 'PendingPayment', 'Grace', 'Suspended'];\r\n\r\nconst CICLOS: { valor: BillingCycle; rotulo: string }[] = [\r\n { valor: 'Monthly', rotulo: 'Mensal' },\r\n { valor: 'Yearly', rotulo: 'Anual' },\r\n];\r\n\r\n/**\r\n * Pagar a assinatura (ADR-021 §3.5, item 3): o plano ATUAL — trocar de plano é v2 —, o preço\r\n * de cada ciclo vindo de `pricing/preview`, e o checkout PIX.\r\n */\r\n@Component({\r\n selector: 'orechio-billing-checkout',\r\n standalone: true,\r\n imports: [RouterLink, BillingErrorComponent, PixPanelComponent],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n template: `\r\n <section class=\"orechio-billing\">\r\n <h1>Pagar assinatura</h1>\r\n\r\n @if (pix(); as dados) {\r\n <p>Pague o PIX abaixo. A assinatura é atualizada assim que o pagamento for confirmado.</p>\r\n <orechio-billing-pix [pix]=\"dados\" [invoiceUrl]=\"invoiceUrl()\" [valor]=\"valor()\" [vencimento]=\"vencimento()\" />\r\n <a routerLink=\"..\">Voltar para a assinatura</a>\r\n } @else if (inelegivel()) {\r\n <p>Não há pagamento de assinatura a fazer agora.</p>\r\n <a routerLink=\"../invoices\">Ver faturas</a>\r\n } @else if (previas().length) {\r\n <h2>{{ previas()[0].planName }}</h2>\r\n\r\n <fieldset>\r\n <legend>Ciclo de cobrança</legend>\r\n @for (previa of previas(); track previa.cycle) {\r\n <label>\r\n <input\r\n type=\"radio\"\r\n name=\"ciclo\"\r\n [value]=\"previa.cycle\"\r\n [checked]=\"ciclo() === previa.cycle\"\r\n (change)=\"ciclo.set(previa.cycle)\"\r\n />\r\n {{ rotulo(previa.cycle) }} — {{ moeda(previa.total) }}\r\n </label>\r\n }\r\n </fieldset>\r\n\r\n <button type=\"button\" data-gerar-pix (click)=\"pagar()\" [disabled]=\"enviando()\">\r\n {{ enviando() ? 'Gerando PIX…' : 'Gerar PIX' }}\r\n </button>\r\n } @else if (!erro()) {\r\n <p class=\"orechio-billing__muted\">Carregando…</p>\r\n }\r\n\r\n @if (erro(); as problema) {\r\n <orechio-billing-error [problema]=\"problema\" />\r\n }\r\n </section>\r\n `,\r\n styles: ESTILO_BASE,\r\n})\r\nexport class CheckoutPage implements OnInit {\r\n private readonly client = inject(BillingClient);\r\n private readonly router = inject(Router);\r\n private readonly route = inject(ActivatedRoute);\r\n\r\n protected readonly moeda = moeda;\r\n protected readonly previas = signal<PricingPreview[]>([]);\r\n protected readonly ciclo = signal<BillingCycle>('Monthly');\r\n protected readonly inelegivel = signal(false);\r\n protected readonly enviando = signal(false);\r\n protected readonly pix = signal<PixData | null>(null);\r\n protected readonly invoiceUrl = signal<string | null>(null);\r\n protected readonly valor = signal<number | null>(null);\r\n protected readonly vencimento = signal<string | null>(null);\r\n protected readonly erro = signal<ProblemDetails | null>(null);\r\n\r\n protected rotulo(ciclo: BillingCycle): string {\r\n return CICLOS.find((c) => c.valor === ciclo)?.rotulo ?? ciclo;\r\n }\r\n\r\n ngOnInit(): void {\r\n forkJoin({ assinatura: this.client.getSubscription(), perfil: this.client.getProfile() }).subscribe({\r\n next: ({ assinatura, perfil }) => {\r\n // O checkout serve Trial, PendingPayment, Grace e Suspended (`InitiateCheckoutCommand`,\r\n // passo 4; os dois últimos desde a BILLING-2b, e só sem fatura aberta — ver `pagar`).\r\n // Checado antes do perfil: não se pede cadastro para um pagamento que não existe.\r\n if (!STATUS_COM_CHECKOUT.includes(assinatura.status)) {\r\n this.inelegivel.set(true);\r\n return;\r\n }\r\n\r\n // O checkout recusa sem perfil (`billing_profile.not_found`). Mandar para o perfil\r\n // ANTES poupa o cliente de escolher o ciclo para receber um erro.\r\n if (!perfil.exists || !perfil.isComplete) {\r\n void this.router.navigate(['../profile'], {\r\n relativeTo: this.route,\r\n queryParams: { next: 'checkout' },\r\n });\r\n return;\r\n }\r\n\r\n this.ciclo.set(assinatura.cycle);\r\n this.carregarPrecos(assinatura);\r\n },\r\n error: (problema: ProblemDetails) => this.erro.set(problema),\r\n });\r\n }\r\n\r\n protected pagar(): void {\r\n if (this.enviando()) return;\r\n this.enviando.set(true);\r\n this.erro.set(null);\r\n\r\n this.client.checkout(this.ciclo()).subscribe({\r\n next: (resultado) => {\r\n this.enviando.set(false);\r\n this.invoiceUrl.set(resultado.invoiceUrl ?? null);\r\n this.valor.set(resultado.amount);\r\n this.vencimento.set(resultado.dueDate);\r\n if (resultado.pix) this.pix.set(resultado.pix);\r\n else this.erro.set({ code: 'checkout.pix_missing', status: 200 });\r\n },\r\n error: (problema: ProblemDetails) => {\r\n this.enviando.set(false);\r\n // Em Grace/Suspended com fatura aberta a Platform recusa: a aberta é a que se paga.\r\n if (problema.code === 'checkout.open_invoice_exists') {\r\n void this.router.navigate(['../invoices'], { relativeTo: this.route });\r\n return;\r\n }\r\n this.erro.set(problema);\r\n },\r\n });\r\n }\r\n\r\n private carregarPrecos(assinatura: Subscription): void {\r\n forkJoin(\r\n CICLOS.map(({ valor }) =>\r\n this.client.previewPricing(assinatura.planId, assinatura.branchCountSnapshot, valor),\r\n ),\r\n ).subscribe({\r\n next: (previas) => this.previas.set(previas),\r\n error: (problema: ProblemDetails) => this.erro.set(problema),\r\n });\r\n }\r\n}\r\n"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
2
|
import { inject, signal, computed, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
3
3
|
import { ActivatedRoute, RouterLink } from '@angular/router';
|
|
4
|
-
import { B as BillingClient, S as STATUS_DA_FATURA,
|
|
5
|
-
import { P as PixPanelComponent } from './orechio-platform-angular-billing-pix-panel.component-
|
|
4
|
+
import { B as BillingClient, S as STATUS_DA_FATURA, g as moeda, d as data, h as dataDoVencimento, a as BillingErrorComponent } from './orechio-platform-angular-billing-billing-format-C8QPXulm.mjs';
|
|
5
|
+
import { P as PixPanelComponent } from './orechio-platform-angular-billing-pix-panel.component-DrfNi22S.mjs';
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
8
|
* Detalhe de fatura. O detalhe da Platform não traz dado de pagamento (`InvoiceDetailDto`):
|
|
@@ -15,6 +15,7 @@ class InvoicePage {
|
|
|
15
15
|
status = STATUS_DA_FATURA;
|
|
16
16
|
moeda = moeda;
|
|
17
17
|
data = data;
|
|
18
|
+
dataDoVencimento = dataDoVencimento;
|
|
18
19
|
fatura = signal(null, /* @ts-ignore */
|
|
19
20
|
...(ngDevMode ? [{ debugName: "fatura" }] : /* istanbul ignore next */ []));
|
|
20
21
|
pix = signal(null, /* @ts-ignore */
|
|
@@ -61,7 +62,7 @@ class InvoicePage {
|
|
|
61
62
|
<section class="orechio-billing">
|
|
62
63
|
@if (fatura(); as f) {
|
|
63
64
|
<h1>Fatura {{ f.number }}</h1>
|
|
64
|
-
<p>{{ status[f.status] }} — {{ moeda(f.amount) }} — vence em {{
|
|
65
|
+
<p>{{ status[f.status] }} — {{ moeda(f.amount) }} — vence em {{ dataDoVencimento(f.dueDate) }}</p>
|
|
65
66
|
<p class="orechio-billing__muted">
|
|
66
67
|
{{ f.planNameAtTime }}, de {{ data(f.periodStartsAt) }} a {{ data(f.periodEndsAt) }}
|
|
67
68
|
</p>
|
|
@@ -79,7 +80,7 @@ class InvoicePage {
|
|
|
79
80
|
}
|
|
80
81
|
|
|
81
82
|
@if (pix(); as dados) {
|
|
82
|
-
<orechio-billing-pix [pix]="dados" [invoiceUrl]="invoiceUrl()" />
|
|
83
|
+
<orechio-billing-pix [pix]="dados" [invoiceUrl]="invoiceUrl()" [valor]="f.amount" [vencimento]="f.dueDate" />
|
|
83
84
|
}
|
|
84
85
|
} @else if (!erro()) {
|
|
85
86
|
<p class="orechio-billing__muted">Carregando…</p>
|
|
@@ -91,7 +92,7 @@ class InvoicePage {
|
|
|
91
92
|
|
|
92
93
|
<a routerLink="..">Voltar para as faturas</a>
|
|
93
94
|
</section>
|
|
94
|
-
`, isInline: true, styles: [".orechio-billing{display:flex;flex-direction:column;gap:var(--orechio-space-3, .75rem);max-width:40rem;margin:0 auto;padding:var(--orechio-space-6, 1.5rem);color:var(--orechio-color-text, inherit);font-family:var(--orechio-font-body, inherit)}.orechio-billing form{display:flex;flex-direction:column;gap:var(--orechio-space-2, .5rem)}.orechio-billing__muted{color:var(--orechio-color-text-muted, #666)}.orechio-billing__error{color:var(--orechio-color-danger, #b00020)}\n"], dependencies: [{ kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "browserUrl", "routerLink"] }, { kind: "component", type: BillingErrorComponent, selector: "orechio-billing-error", inputs: ["problema"] }, { kind: "component", type: PixPanelComponent, selector: "orechio-billing-pix", inputs: ["pix", "invoiceUrl"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
95
|
+
`, isInline: true, styles: [".orechio-billing{display:flex;flex-direction:column;gap:var(--orechio-space-3, .75rem);max-width:40rem;margin:0 auto;padding:var(--orechio-space-6, 1.5rem);color:var(--orechio-color-text, inherit);font-family:var(--orechio-font-body, inherit)}.orechio-billing form{display:flex;flex-direction:column;gap:var(--orechio-space-2, .5rem)}.orechio-billing__muted{color:var(--orechio-color-text-muted, #666)}.orechio-billing__error{color:var(--orechio-color-danger, #b00020)}.orechio-billing__acao{align-self:flex-start;display:inline-block;padding:var(--orechio-space-2, .5rem) var(--orechio-space-4, 1rem);border-radius:var(--orechio-radius, .375rem);background:var(--orechio-color-primary, #1a56db);color:var(--orechio-color-on-primary, #fff);font-weight:600;text-decoration:none}.orechio-billing__acao:hover,.orechio-billing__acao:focus-visible{background:var(--orechio-color-primary-hover, var(--orechio-color-primary, #1446b0))}\n"], dependencies: [{ kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "browserUrl", "routerLink"] }, { kind: "component", type: BillingErrorComponent, selector: "orechio-billing-error", inputs: ["problema"] }, { kind: "component", type: PixPanelComponent, selector: "orechio-billing-pix", inputs: ["pix", "invoiceUrl", "valor", "vencimento"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
95
96
|
}
|
|
96
97
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.2", ngImport: i0, type: InvoicePage, decorators: [{
|
|
97
98
|
type: Component,
|
|
@@ -99,7 +100,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.2", ngImpor
|
|
|
99
100
|
<section class="orechio-billing">
|
|
100
101
|
@if (fatura(); as f) {
|
|
101
102
|
<h1>Fatura {{ f.number }}</h1>
|
|
102
|
-
<p>{{ status[f.status] }} — {{ moeda(f.amount) }} — vence em {{
|
|
103
|
+
<p>{{ status[f.status] }} — {{ moeda(f.amount) }} — vence em {{ dataDoVencimento(f.dueDate) }}</p>
|
|
103
104
|
<p class="orechio-billing__muted">
|
|
104
105
|
{{ f.planNameAtTime }}, de {{ data(f.periodStartsAt) }} a {{ data(f.periodEndsAt) }}
|
|
105
106
|
</p>
|
|
@@ -117,7 +118,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.2", ngImpor
|
|
|
117
118
|
}
|
|
118
119
|
|
|
119
120
|
@if (pix(); as dados) {
|
|
120
|
-
<orechio-billing-pix [pix]="dados" [invoiceUrl]="invoiceUrl()" />
|
|
121
|
+
<orechio-billing-pix [pix]="dados" [invoiceUrl]="invoiceUrl()" [valor]="f.amount" [vencimento]="f.dueDate" />
|
|
121
122
|
}
|
|
122
123
|
} @else if (!erro()) {
|
|
123
124
|
<p class="orechio-billing__muted">Carregando…</p>
|
|
@@ -129,8 +130,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.2", ngImpor
|
|
|
129
130
|
|
|
130
131
|
<a routerLink="..">Voltar para as faturas</a>
|
|
131
132
|
</section>
|
|
132
|
-
`, styles: [".orechio-billing{display:flex;flex-direction:column;gap:var(--orechio-space-3, .75rem);max-width:40rem;margin:0 auto;padding:var(--orechio-space-6, 1.5rem);color:var(--orechio-color-text, inherit);font-family:var(--orechio-font-body, inherit)}.orechio-billing form{display:flex;flex-direction:column;gap:var(--orechio-space-2, .5rem)}.orechio-billing__muted{color:var(--orechio-color-text-muted, #666)}.orechio-billing__error{color:var(--orechio-color-danger, #b00020)}\n"] }]
|
|
133
|
+
`, styles: [".orechio-billing{display:flex;flex-direction:column;gap:var(--orechio-space-3, .75rem);max-width:40rem;margin:0 auto;padding:var(--orechio-space-6, 1.5rem);color:var(--orechio-color-text, inherit);font-family:var(--orechio-font-body, inherit)}.orechio-billing form{display:flex;flex-direction:column;gap:var(--orechio-space-2, .5rem)}.orechio-billing__muted{color:var(--orechio-color-text-muted, #666)}.orechio-billing__error{color:var(--orechio-color-danger, #b00020)}.orechio-billing__acao{align-self:flex-start;display:inline-block;padding:var(--orechio-space-2, .5rem) var(--orechio-space-4, 1rem);border-radius:var(--orechio-radius, .375rem);background:var(--orechio-color-primary, #1a56db);color:var(--orechio-color-on-primary, #fff);font-weight:600;text-decoration:none}.orechio-billing__acao:hover,.orechio-billing__acao:focus-visible{background:var(--orechio-color-primary-hover, var(--orechio-color-primary, #1446b0))}\n"] }]
|
|
133
134
|
}] });
|
|
134
135
|
|
|
135
136
|
export { InvoicePage };
|
|
136
|
-
//# sourceMappingURL=orechio-platform-angular-billing-invoice.page-
|
|
137
|
+
//# sourceMappingURL=orechio-platform-angular-billing-invoice.page-CWThsx-_.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orechio-platform-angular-billing-invoice.page-CWThsx-_.mjs","sources":["../../../projects/platform-angular/billing/src/pages/invoice.page.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, OnInit, computed, inject, signal } from '@angular/core';\r\nimport { ActivatedRoute, RouterLink } from '@angular/router';\r\nimport { ProblemDetails } from '@orechio/platform-angular';\r\nimport { BillingClient } from '../billing-client';\r\nimport { BillingErrorComponent } from '../billing-error.component';\r\nimport { ESTILO_BASE, STATUS_DA_FATURA, data, dataDoVencimento, moeda } from '../billing-format';\r\nimport { InvoiceDetail, PixData } from '../billing-models';\r\nimport { PixPanelComponent } from '../pix-panel.component';\r\n\r\n/**\r\n * Detalhe de fatura. O detalhe da Platform não traz dado de pagamento (`InvoiceDetailDto`):\r\n * o QR vem do refresh, que a Platform aceita para fatura PIX `Pending` ou `Overdue`\r\n * (`RefreshPaymentDataCommand`, passo 2) — o que inclui a fatura de renovação.\r\n */\r\n@Component({\r\n selector: 'orechio-billing-invoice',\r\n standalone: true,\r\n imports: [RouterLink, BillingErrorComponent, PixPanelComponent],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n template: `\r\n <section class=\"orechio-billing\">\r\n @if (fatura(); as f) {\r\n <h1>Fatura {{ f.number }}</h1>\r\n <p>{{ status[f.status] }} — {{ moeda(f.amount) }} — vence em {{ dataDoVencimento(f.dueDate) }}</p>\r\n <p class=\"orechio-billing__muted\">\r\n {{ f.planNameAtTime }}, de {{ data(f.periodStartsAt) }} a {{ data(f.periodEndsAt) }}\r\n </p>\r\n\r\n <ul>\r\n @for (item of f.items; track item.order) {\r\n <li>{{ item.description }} — {{ item.quantity }} × {{ moeda(item.unitAmount) }} = {{ moeda(item.totalAmount) }}</li>\r\n }\r\n </ul>\r\n\r\n @if (podeGerarQr()) {\r\n <button type=\"button\" data-gerar-qr (click)=\"gerarQr()\" [disabled]=\"gerando()\">\r\n {{ gerando() ? 'Gerando…' : 'Gerar novo QR' }}\r\n </button>\r\n }\r\n\r\n @if (pix(); as dados) {\r\n <orechio-billing-pix [pix]=\"dados\" [invoiceUrl]=\"invoiceUrl()\" [valor]=\"f.amount\" [vencimento]=\"f.dueDate\" />\r\n }\r\n } @else if (!erro()) {\r\n <p class=\"orechio-billing__muted\">Carregando…</p>\r\n }\r\n\r\n @if (erro(); as problema) {\r\n <orechio-billing-error [problema]=\"problema\" />\r\n }\r\n\r\n <a routerLink=\"..\">Voltar para as faturas</a>\r\n </section>\r\n `,\r\n styles: ESTILO_BASE,\r\n})\r\nexport class InvoicePage implements OnInit {\r\n private readonly client = inject(BillingClient);\r\n private readonly route = inject(ActivatedRoute);\r\n\r\n protected readonly status = STATUS_DA_FATURA;\r\n protected readonly moeda = moeda;\r\n protected readonly data = data;\r\n protected readonly dataDoVencimento = dataDoVencimento;\r\n protected readonly fatura = signal<InvoiceDetail | null>(null);\r\n protected readonly pix = signal<PixData | null>(null);\r\n protected readonly invoiceUrl = signal<string | null>(null);\r\n protected readonly gerando = signal(false);\r\n protected readonly erro = signal<ProblemDetails | null>(null);\r\n protected readonly podeGerarQr = computed(() => {\r\n const f = this.fatura();\r\n return !!f && f.paymentMethod === 'Pix' && (f.status === 'Pending' || f.status === 'Overdue');\r\n });\r\n\r\n ngOnInit(): void {\r\n const id = this.route.snapshot.paramMap.get('id') ?? '';\r\n this.client.getInvoice(id).subscribe({\r\n next: (fatura) => this.fatura.set(fatura),\r\n error: (problema: ProblemDetails) => this.erro.set(problema),\r\n });\r\n }\r\n\r\n protected gerarQr(): void {\r\n const f = this.fatura();\r\n if (!f || this.gerando()) return;\r\n\r\n this.gerando.set(true);\r\n this.erro.set(null);\r\n this.client.refreshInvoicePix(f.id).subscribe({\r\n next: (pix) => {\r\n this.gerando.set(false);\r\n // O refresh traz o PIX e o `invoiceUrl` juntos: o link acompanha o QR que está na tela.\r\n this.invoiceUrl.set(pix.invoiceUrl ?? null);\r\n this.pix.set(pix);\r\n },\r\n error: (problema: ProblemDetails) => {\r\n this.gerando.set(false);\r\n this.erro.set(problema);\r\n },\r\n });\r\n }\r\n}\r\n"],"names":[],"mappings":";;;;;;AASA;;;;AAIG;MA2CU,WAAW,CAAA;AACL,IAAA,MAAM,GAAG,MAAM,CAAC,aAAa,CAAC;AAC9B,IAAA,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC;IAE5B,MAAM,GAAG,gBAAgB;IACzB,KAAK,GAAG,KAAK;IACb,IAAI,GAAG,IAAI;IACX,gBAAgB,GAAG,gBAAgB;IACnC,MAAM,GAAG,MAAM,CAAuB,IAAI;+EAAC;IAC3C,GAAG,GAAG,MAAM,CAAiB,IAAI;4EAAC;IAClC,UAAU,GAAG,MAAM,CAAgB,IAAI;mFAAC;IACxC,OAAO,GAAG,MAAM,CAAC,KAAK;gFAAC;IACvB,IAAI,GAAG,MAAM,CAAwB,IAAI;6EAAC;AAC1C,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;AAC7C,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE;QACvB,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,aAAa,KAAK,KAAK,KAAK,CAAC,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC;IAC/F,CAAC;oFAAC;IAEF,QAAQ,GAAA;AACN,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE;QACvD,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC;AACnC,YAAA,IAAI,EAAE,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;AACzC,YAAA,KAAK,EAAE,CAAC,QAAwB,KAAK,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC;AAC7D,SAAA,CAAC;IACJ;IAEU,OAAO,GAAA;AACf,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE;AACvB,QAAA,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE;YAAE;AAE1B,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AACtB,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;QACnB,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC;AAC5C,YAAA,IAAI,EAAE,CAAC,GAAG,KAAI;AACZ,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;;gBAEvB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,IAAI,IAAI,CAAC;AAC3C,gBAAA,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;YACnB,CAAC;AACD,YAAA,KAAK,EAAE,CAAC,QAAwB,KAAI;AAClC,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;AACvB,gBAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC;YACzB,CAAC;AACF,SAAA,CAAC;IACJ;uGA5CW,WAAW,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAX,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,WAAW,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EArCZ,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkCT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,o6BAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EApCS,UAAU,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,aAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,OAAA,EAAA,MAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,YAAA,EAAA,YAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,qBAAqB,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,iBAAiB,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,KAAA,EAAA,YAAA,EAAA,OAAA,EAAA,YAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAuCnD,WAAW,EAAA,UAAA,EAAA,CAAA;kBA1CvB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,yBAAyB,EAAA,UAAA,EACvB,IAAI,EAAA,OAAA,EACP,CAAC,UAAU,EAAE,qBAAqB,EAAE,iBAAiB,CAAC,EAAA,eAAA,EAC9C,uBAAuB,CAAC,MAAM,EAAA,QAAA,EACrC,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkCT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,o6BAAA,CAAA,EAAA;;;;;"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
2
|
import { inject, signal, computed, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
3
3
|
import { RouterLink } from '@angular/router';
|
|
4
|
-
import { B as BillingClient, S as STATUS_DA_FATURA,
|
|
4
|
+
import { B as BillingClient, S as STATUS_DA_FATURA, g as moeda, d as data, h as dataDoVencimento, a as BillingErrorComponent } from './orechio-platform-angular-billing-billing-format-C8QPXulm.mjs';
|
|
5
5
|
|
|
6
6
|
const TAMANHO_DA_PAGINA = 20;
|
|
7
7
|
class InvoicesPage {
|
|
@@ -9,6 +9,7 @@ class InvoicesPage {
|
|
|
9
9
|
status = STATUS_DA_FATURA;
|
|
10
10
|
moeda = moeda;
|
|
11
11
|
data = data;
|
|
12
|
+
dataDoVencimento = dataDoVencimento;
|
|
12
13
|
pagina = signal(null, /* @ts-ignore */
|
|
13
14
|
...(ngDevMode ? [{ debugName: "pagina" }] : /* istanbul ignore next */ []));
|
|
14
15
|
erro = signal(null, /* @ts-ignore */
|
|
@@ -42,7 +43,7 @@ class InvoicesPage {
|
|
|
42
43
|
@for (fatura of p.invoices; track fatura.id) {
|
|
43
44
|
<li>
|
|
44
45
|
<a [routerLink]="fatura.id">Fatura {{ fatura.number }}</a>
|
|
45
|
-
— {{ status[fatura.status] }} — {{ moeda(fatura.amount) }} — vence em {{
|
|
46
|
+
— {{ status[fatura.status] }} — {{ moeda(fatura.amount) }} — vence em {{ dataDoVencimento(fatura.dueDate) }}
|
|
46
47
|
</li>
|
|
47
48
|
}
|
|
48
49
|
</ul>
|
|
@@ -61,7 +62,7 @@ class InvoicesPage {
|
|
|
61
62
|
<p class="orechio-billing__muted">Carregando…</p>
|
|
62
63
|
}
|
|
63
64
|
</section>
|
|
64
|
-
`, isInline: true, styles: [".orechio-billing{display:flex;flex-direction:column;gap:var(--orechio-space-3, .75rem);max-width:40rem;margin:0 auto;padding:var(--orechio-space-6, 1.5rem);color:var(--orechio-color-text, inherit);font-family:var(--orechio-font-body, inherit)}.orechio-billing form{display:flex;flex-direction:column;gap:var(--orechio-space-2, .5rem)}.orechio-billing__muted{color:var(--orechio-color-text-muted, #666)}.orechio-billing__error{color:var(--orechio-color-danger, #b00020)}\n"], dependencies: [{ kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "browserUrl", "routerLink"] }, { kind: "component", type: BillingErrorComponent, selector: "orechio-billing-error", inputs: ["problema"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
65
|
+
`, isInline: true, styles: [".orechio-billing{display:flex;flex-direction:column;gap:var(--orechio-space-3, .75rem);max-width:40rem;margin:0 auto;padding:var(--orechio-space-6, 1.5rem);color:var(--orechio-color-text, inherit);font-family:var(--orechio-font-body, inherit)}.orechio-billing form{display:flex;flex-direction:column;gap:var(--orechio-space-2, .5rem)}.orechio-billing__muted{color:var(--orechio-color-text-muted, #666)}.orechio-billing__error{color:var(--orechio-color-danger, #b00020)}.orechio-billing__acao{align-self:flex-start;display:inline-block;padding:var(--orechio-space-2, .5rem) var(--orechio-space-4, 1rem);border-radius:var(--orechio-radius, .375rem);background:var(--orechio-color-primary, #1a56db);color:var(--orechio-color-on-primary, #fff);font-weight:600;text-decoration:none}.orechio-billing__acao:hover,.orechio-billing__acao:focus-visible{background:var(--orechio-color-primary-hover, var(--orechio-color-primary, #1446b0))}\n"], dependencies: [{ kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "browserUrl", "routerLink"] }, { kind: "component", type: BillingErrorComponent, selector: "orechio-billing-error", inputs: ["problema"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
65
66
|
}
|
|
66
67
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.2", ngImport: i0, type: InvoicesPage, decorators: [{
|
|
67
68
|
type: Component,
|
|
@@ -79,7 +80,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.2", ngImpor
|
|
|
79
80
|
@for (fatura of p.invoices; track fatura.id) {
|
|
80
81
|
<li>
|
|
81
82
|
<a [routerLink]="fatura.id">Fatura {{ fatura.number }}</a>
|
|
82
|
-
— {{ status[fatura.status] }} — {{ moeda(fatura.amount) }} — vence em {{
|
|
83
|
+
— {{ status[fatura.status] }} — {{ moeda(fatura.amount) }} — vence em {{ dataDoVencimento(fatura.dueDate) }}
|
|
83
84
|
</li>
|
|
84
85
|
}
|
|
85
86
|
</ul>
|
|
@@ -98,8 +99,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.2", ngImpor
|
|
|
98
99
|
<p class="orechio-billing__muted">Carregando…</p>
|
|
99
100
|
}
|
|
100
101
|
</section>
|
|
101
|
-
`, styles: [".orechio-billing{display:flex;flex-direction:column;gap:var(--orechio-space-3, .75rem);max-width:40rem;margin:0 auto;padding:var(--orechio-space-6, 1.5rem);color:var(--orechio-color-text, inherit);font-family:var(--orechio-font-body, inherit)}.orechio-billing form{display:flex;flex-direction:column;gap:var(--orechio-space-2, .5rem)}.orechio-billing__muted{color:var(--orechio-color-text-muted, #666)}.orechio-billing__error{color:var(--orechio-color-danger, #b00020)}\n"] }]
|
|
102
|
+
`, styles: [".orechio-billing{display:flex;flex-direction:column;gap:var(--orechio-space-3, .75rem);max-width:40rem;margin:0 auto;padding:var(--orechio-space-6, 1.5rem);color:var(--orechio-color-text, inherit);font-family:var(--orechio-font-body, inherit)}.orechio-billing form{display:flex;flex-direction:column;gap:var(--orechio-space-2, .5rem)}.orechio-billing__muted{color:var(--orechio-color-text-muted, #666)}.orechio-billing__error{color:var(--orechio-color-danger, #b00020)}.orechio-billing__acao{align-self:flex-start;display:inline-block;padding:var(--orechio-space-2, .5rem) var(--orechio-space-4, 1rem);border-radius:var(--orechio-radius, .375rem);background:var(--orechio-color-primary, #1a56db);color:var(--orechio-color-on-primary, #fff);font-weight:600;text-decoration:none}.orechio-billing__acao:hover,.orechio-billing__acao:focus-visible{background:var(--orechio-color-primary-hover, var(--orechio-color-primary, #1446b0))}\n"] }]
|
|
102
103
|
}] });
|
|
103
104
|
|
|
104
105
|
export { InvoicesPage };
|
|
105
|
-
//# sourceMappingURL=orechio-platform-angular-billing-invoices.page-
|
|
106
|
+
//# sourceMappingURL=orechio-platform-angular-billing-invoices.page-DytE1Lcz.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orechio-platform-angular-billing-invoices.page-DytE1Lcz.mjs","sources":["../../../projects/platform-angular/billing/src/pages/invoices.page.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, OnInit, computed, inject, signal } from '@angular/core';\r\nimport { RouterLink } from '@angular/router';\r\nimport { ProblemDetails } from '@orechio/platform-angular';\r\nimport { BillingClient } from '../billing-client';\r\nimport { BillingErrorComponent } from '../billing-error.component';\r\nimport { ESTILO_BASE, STATUS_DA_FATURA, data, dataDoVencimento, moeda } from '../billing-format';\r\nimport { InvoicesPage as PaginaDeFaturas } from '../billing-models';\r\n\r\nconst TAMANHO_DA_PAGINA = 20;\r\n\r\n@Component({\r\n selector: 'orechio-billing-invoices',\r\n standalone: true,\r\n imports: [RouterLink, BillingErrorComponent],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n template: `\r\n <section class=\"orechio-billing\">\r\n <h1>Faturas</h1>\r\n\r\n @if (erro(); as problema) {\r\n <orechio-billing-error [problema]=\"problema\" />\r\n } @else if (pagina(); as p) {\r\n @if (p.invoices.length === 0) {\r\n <p class=\"orechio-billing__muted\">Nenhuma fatura ainda.</p>\r\n } @else {\r\n <ul>\r\n @for (fatura of p.invoices; track fatura.id) {\r\n <li>\r\n <a [routerLink]=\"fatura.id\">Fatura {{ fatura.number }}</a>\r\n — {{ status[fatura.status] }} — {{ moeda(fatura.amount) }} — vence em {{ dataDoVencimento(fatura.dueDate) }}\r\n </li>\r\n }\r\n </ul>\r\n\r\n <nav>\r\n @if (p.page > 1) {\r\n <button type=\"button\" (click)=\"carregar(p.page - 1)\">Anteriores</button>\r\n }\r\n @if (temProxima()) {\r\n <button type=\"button\" (click)=\"carregar(p.page + 1)\">Próximas</button>\r\n }\r\n </nav>\r\n }\r\n <a routerLink=\"..\">Voltar para a assinatura</a>\r\n } @else {\r\n <p class=\"orechio-billing__muted\">Carregando…</p>\r\n }\r\n </section>\r\n `,\r\n styles: ESTILO_BASE,\r\n})\r\nexport class InvoicesPage implements OnInit {\r\n private readonly client = inject(BillingClient);\r\n\r\n protected readonly status = STATUS_DA_FATURA;\r\n protected readonly moeda = moeda;\r\n protected readonly data = data;\r\n protected readonly dataDoVencimento = dataDoVencimento;\r\n protected readonly pagina = signal<PaginaDeFaturas | null>(null);\r\n protected readonly erro = signal<ProblemDetails | null>(null);\r\n protected readonly temProxima = computed(() => {\r\n const p = this.pagina();\r\n return !!p && p.page * p.pageSize < p.total;\r\n });\r\n\r\n ngOnInit(): void {\r\n this.carregar(1);\r\n }\r\n\r\n protected carregar(pagina: number): void {\r\n this.client.listInvoices(pagina, TAMANHO_DA_PAGINA).subscribe({\r\n next: (resultado) => this.pagina.set(resultado),\r\n error: (problema: ProblemDetails) => this.erro.set(problema),\r\n });\r\n }\r\n}\r\n"],"names":[],"mappings":";;;;;AAQA,MAAM,iBAAiB,GAAG,EAAE;MA2Cf,YAAY,CAAA;AACN,IAAA,MAAM,GAAG,MAAM,CAAC,aAAa,CAAC;IAE5B,MAAM,GAAG,gBAAgB;IACzB,KAAK,GAAG,KAAK;IACb,IAAI,GAAG,IAAI;IACX,gBAAgB,GAAG,gBAAgB;IACnC,MAAM,GAAG,MAAM,CAAyB,IAAI;+EAAC;IAC7C,IAAI,GAAG,MAAM,CAAwB,IAAI;6EAAC;AAC1C,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAK;AAC5C,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE;AACvB,QAAA,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,KAAK;IAC7C,CAAC;mFAAC;IAEF,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IAClB;AAEU,IAAA,QAAQ,CAAC,MAAc,EAAA;QAC/B,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC,SAAS,CAAC;AAC5D,YAAA,IAAI,EAAE,CAAC,SAAS,KAAK,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC;AAC/C,YAAA,KAAK,EAAE,CAAC,QAAwB,KAAK,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC;AAC7D,SAAA,CAAC;IACJ;uGAvBW,YAAY,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAZ,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAY,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,0BAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EApCb,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCT,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,o6BAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAnCS,UAAU,kPAAE,qBAAqB,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAsChC,YAAY,EAAA,UAAA,EAAA,CAAA;kBAzCxB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,0BAA0B,EAAA,UAAA,EACxB,IAAI,EAAA,OAAA,EACP,CAAC,UAAU,EAAE,qBAAqB,CAAC,EAAA,eAAA,EAC3B,uBAAuB,CAAC,MAAM,EAAA,QAAA,EACrC,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiCT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,o6BAAA,CAAA,EAAA;;;;;"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
2
|
import { input, signal, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
3
|
+
import { g as moeda, h as dataDoVencimento, v as validadeDoPix } from './orechio-platform-angular-billing-billing-format-C8QPXulm.mjs';
|
|
3
4
|
|
|
4
5
|
/**
|
|
5
6
|
* O QR e o copia-e-cola, como a Platform os devolveu. O `encodedImage` é PNG em base64
|
|
@@ -11,6 +12,15 @@ class PixPanelComponent {
|
|
|
11
12
|
/** Página de pagamento do ASAAS, aberta em nova aba; sem ela, o link não aparece. */
|
|
12
13
|
invoiceUrl = input(null, /* @ts-ignore */
|
|
13
14
|
...(ngDevMode ? [{ debugName: "invoiceUrl" }] : /* istanbul ignore next */ []));
|
|
15
|
+
/** Valor da fatura; sem ele, a linha "Valor" não aparece. */
|
|
16
|
+
valor = input(null, /* @ts-ignore */
|
|
17
|
+
...(ngDevMode ? [{ debugName: "valor" }] : /* istanbul ignore next */ []));
|
|
18
|
+
/** Vencimento da fatura (data sem hora); sem ele, a linha "Vencimento" não aparece. */
|
|
19
|
+
vencimento = input(null, /* @ts-ignore */
|
|
20
|
+
...(ngDevMode ? [{ debugName: "vencimento" }] : /* istanbul ignore next */ []));
|
|
21
|
+
moeda = moeda;
|
|
22
|
+
dataDoVencimento = dataDoVencimento;
|
|
23
|
+
validadeDoPix = validadeDoPix;
|
|
14
24
|
copiado = signal(false, /* @ts-ignore */
|
|
15
25
|
...(ngDevMode ? [{ debugName: "copiado" }] : /* istanbul ignore next */ []));
|
|
16
26
|
semAreaDeTransferencia = signal(false, /* @ts-ignore */
|
|
@@ -24,8 +34,14 @@ class PixPanelComponent {
|
|
|
24
34
|
areaDeTransferencia.writeText(this.pix().payload).then(() => this.copiado.set(true), () => this.semAreaDeTransferencia.set(true));
|
|
25
35
|
}
|
|
26
36
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.2", ngImport: i0, type: PixPanelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
27
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.2", type: PixPanelComponent, isStandalone: true, selector: "orechio-billing-pix", inputs: { pix: { classPropertyName: "pix", publicName: "pix", isSignal: true, isRequired: true, transformFunction: null }, invoiceUrl: { classPropertyName: "invoiceUrl", publicName: "invoiceUrl", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
|
|
37
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.2", type: PixPanelComponent, isStandalone: true, selector: "orechio-billing-pix", inputs: { pix: { classPropertyName: "pix", publicName: "pix", isSignal: true, isRequired: true, transformFunction: null }, invoiceUrl: { classPropertyName: "invoiceUrl", publicName: "invoiceUrl", isSignal: true, isRequired: false, transformFunction: null }, valor: { classPropertyName: "valor", publicName: "valor", isSignal: true, isRequired: false, transformFunction: null }, vencimento: { classPropertyName: "vencimento", publicName: "vencimento", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
|
|
28
38
|
<div class="orechio-billing-pix">
|
|
39
|
+
@if (valor() !== null && valor() !== undefined) {
|
|
40
|
+
<p data-valor>Valor: {{ moeda(valor()!) }}</p>
|
|
41
|
+
}
|
|
42
|
+
@if (vencimento(); as data) {
|
|
43
|
+
<p data-vencimento>Vencimento: {{ dataDoVencimento(data) }}</p>
|
|
44
|
+
}
|
|
29
45
|
<img data-qr [src]="'data:image/png;base64,' + pix().encodedImage" alt="QR Code PIX" width="240" height="240" />
|
|
30
46
|
|
|
31
47
|
<p>Ou copie o código PIX e cole no app do seu banco:</p>
|
|
@@ -38,7 +54,7 @@ class PixPanelComponent {
|
|
|
38
54
|
}
|
|
39
55
|
|
|
40
56
|
@if (pix().expirationDate; as validade) {
|
|
41
|
-
<p class="orechio-billing-pix__aviso">
|
|
57
|
+
<p class="orechio-billing-pix__aviso">QR válido até {{ validadeDoPix(validade) }}.</p>
|
|
42
58
|
}
|
|
43
59
|
|
|
44
60
|
@if (invoiceUrl(); as url) {
|
|
@@ -53,6 +69,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.2", ngImpor
|
|
|
53
69
|
type: Component,
|
|
54
70
|
args: [{ selector: 'orechio-billing-pix', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: `
|
|
55
71
|
<div class="orechio-billing-pix">
|
|
72
|
+
@if (valor() !== null && valor() !== undefined) {
|
|
73
|
+
<p data-valor>Valor: {{ moeda(valor()!) }}</p>
|
|
74
|
+
}
|
|
75
|
+
@if (vencimento(); as data) {
|
|
76
|
+
<p data-vencimento>Vencimento: {{ dataDoVencimento(data) }}</p>
|
|
77
|
+
}
|
|
56
78
|
<img data-qr [src]="'data:image/png;base64,' + pix().encodedImage" alt="QR Code PIX" width="240" height="240" />
|
|
57
79
|
|
|
58
80
|
<p>Ou copie o código PIX e cole no app do seu banco:</p>
|
|
@@ -65,7 +87,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.2", ngImpor
|
|
|
65
87
|
}
|
|
66
88
|
|
|
67
89
|
@if (pix().expirationDate; as validade) {
|
|
68
|
-
<p class="orechio-billing-pix__aviso">
|
|
90
|
+
<p class="orechio-billing-pix__aviso">QR válido até {{ validadeDoPix(validade) }}.</p>
|
|
69
91
|
}
|
|
70
92
|
|
|
71
93
|
@if (invoiceUrl(); as url) {
|
|
@@ -75,7 +97,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.2", ngImpor
|
|
|
75
97
|
}
|
|
76
98
|
</div>
|
|
77
99
|
`, styles: [".orechio-billing-pix{display:flex;flex-direction:column;align-items:flex-start;gap:var(--orechio-space-2, .5rem)}.orechio-billing-pix__codigo{word-break:break-all}.orechio-billing-pix__aviso{color:var(--orechio-color-text-muted, #666)}\n"] }]
|
|
78
|
-
}], propDecorators: { pix: [{ type: i0.Input, args: [{ isSignal: true, alias: "pix", required: true }] }], invoiceUrl: [{ type: i0.Input, args: [{ isSignal: true, alias: "invoiceUrl", required: false }] }] } });
|
|
100
|
+
}], propDecorators: { pix: [{ type: i0.Input, args: [{ isSignal: true, alias: "pix", required: true }] }], invoiceUrl: [{ type: i0.Input, args: [{ isSignal: true, alias: "invoiceUrl", required: false }] }], valor: [{ type: i0.Input, args: [{ isSignal: true, alias: "valor", required: false }] }], vencimento: [{ type: i0.Input, args: [{ isSignal: true, alias: "vencimento", required: false }] }] } });
|
|
79
101
|
|
|
80
102
|
export { PixPanelComponent as P };
|
|
81
|
-
//# sourceMappingURL=orechio-platform-angular-billing-pix-panel.component-
|
|
103
|
+
//# sourceMappingURL=orechio-platform-angular-billing-pix-panel.component-DrfNi22S.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orechio-platform-angular-billing-pix-panel.component-DrfNi22S.mjs","sources":["../../../projects/platform-angular/billing/src/pix-panel.component.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, input, signal } from '@angular/core';\r\nimport { dataDoVencimento, moeda, validadeDoPix } from './billing-format';\r\nimport { PixData } from './billing-models';\r\n\r\n/**\r\n * O QR e o copia-e-cola, como a Platform os devolveu. O `encodedImage` é PNG em base64\r\n * (ASAAS); o `payload` é o código que o app do banco aceita colado.\r\n */\r\n@Component({\r\n selector: 'orechio-billing-pix',\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n template: `\r\n <div class=\"orechio-billing-pix\">\r\n @if (valor() !== null && valor() !== undefined) {\r\n <p data-valor>Valor: {{ moeda(valor()!) }}</p>\r\n }\r\n @if (vencimento(); as data) {\r\n <p data-vencimento>Vencimento: {{ dataDoVencimento(data) }}</p>\r\n }\r\n <img data-qr [src]=\"'data:image/png;base64,' + pix().encodedImage\" alt=\"QR Code PIX\" width=\"240\" height=\"240\" />\r\n\r\n <p>Ou copie o código PIX e cole no app do seu banco:</p>\r\n <code class=\"orechio-billing-pix__codigo\">{{ pix().payload }}</code>\r\n <button type=\"button\" data-copiar (click)=\"copiar()\">\r\n {{ copiado() ? 'Código copiado' : 'Copiar código' }}\r\n </button>\r\n @if (semAreaDeTransferencia()) {\r\n <p class=\"orechio-billing-pix__aviso\">Selecione o código acima e copie manualmente.</p>\r\n }\r\n\r\n @if (pix().expirationDate; as validade) {\r\n <p class=\"orechio-billing-pix__aviso\">QR válido até {{ validadeDoPix(validade) }}.</p>\r\n }\r\n\r\n @if (invoiceUrl(); as url) {\r\n <a data-invoice-url [href]=\"url\" target=\"_blank\" rel=\"noopener noreferrer\">\r\n Pagar pelo site do ASAAS\r\n </a>\r\n }\r\n </div>\r\n `,\r\n styles: `\r\n .orechio-billing-pix { display: flex; flex-direction: column; align-items: flex-start; gap: var(--orechio-space-2, 0.5rem); }\r\n .orechio-billing-pix__codigo { word-break: break-all; }\r\n .orechio-billing-pix__aviso { color: var(--orechio-color-text-muted, #666); }\r\n `,\r\n})\r\nexport class PixPanelComponent {\r\n readonly pix = input.required<PixData>();\r\n /** Página de pagamento do ASAAS, aberta em nova aba; sem ela, o link não aparece. */\r\n readonly invoiceUrl = input<string | null | undefined>(null);\r\n\r\n /** Valor da fatura; sem ele, a linha \"Valor\" não aparece. */\r\n readonly valor = input<number | null | undefined>(null);\r\n /** Vencimento da fatura (data sem hora); sem ele, a linha \"Vencimento\" não aparece. */\r\n readonly vencimento = input<string | null | undefined>(null);\r\n\r\n protected readonly moeda = moeda;\r\n protected readonly dataDoVencimento = dataDoVencimento;\r\n protected readonly validadeDoPix = validadeDoPix;\r\n protected readonly copiado = signal(false);\r\n protected readonly semAreaDeTransferencia = signal(false);\r\n\r\n protected copiar(): void {\r\n const areaDeTransferencia = globalThis.navigator?.clipboard;\r\n if (!areaDeTransferencia) {\r\n this.semAreaDeTransferencia.set(true);\r\n return;\r\n }\r\n\r\n areaDeTransferencia.writeText(this.pix().payload).then(\r\n () => this.copiado.set(true),\r\n () => this.semAreaDeTransferencia.set(true),\r\n );\r\n }\r\n}\r\n"],"names":[],"mappings":";;;;AAIA;;;AAGG;MAyCU,iBAAiB,CAAA;IACnB,GAAG,GAAG,KAAK,CAAC,QAAQ;4EAAW;;IAE/B,UAAU,GAAG,KAAK,CAA4B,IAAI;mFAAC;;IAGnD,KAAK,GAAG,KAAK,CAA4B,IAAI;8EAAC;;IAE9C,UAAU,GAAG,KAAK,CAA4B,IAAI;mFAAC;IAEzC,KAAK,GAAG,KAAK;IACb,gBAAgB,GAAG,gBAAgB;IACnC,aAAa,GAAG,aAAa;IAC7B,OAAO,GAAG,MAAM,CAAC,KAAK;gFAAC;IACvB,sBAAsB,GAAG,MAAM,CAAC,KAAK;+FAAC;IAE/C,MAAM,GAAA;AACd,QAAA,MAAM,mBAAmB,GAAG,UAAU,CAAC,SAAS,EAAE,SAAS;QAC3D,IAAI,CAAC,mBAAmB,EAAE;AACxB,YAAA,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,IAAI,CAAC;YACrC;QACF;AAEA,QAAA,mBAAmB,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,CACpD,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAC5B,MAAM,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,IAAI,CAAC,CAC5C;IACH;uGA3BW,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAjB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,iBAAiB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,EAAA,GAAA,EAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EApClB,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,+OAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAOU,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAxC7B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,qBAAqB,cACnB,IAAI,EAAA,eAAA,EACC,uBAAuB,CAAC,MAAM,EAAA,QAAA,EACrC,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,+OAAA,CAAA,EAAA;;;;;"}
|