@hed-hog/core 0.0.400 → 0.0.401
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/dist/ai/ai.controller.d.ts +2 -0
- package/dist/ai/ai.controller.d.ts.map +1 -1
- package/dist/ai/ai.service.d.ts +86 -2
- package/dist/ai/ai.service.d.ts.map +1 -1
- package/dist/ai/ai.service.js +304 -23
- package/dist/ai/ai.service.js.map +1 -1
- package/dist/ai-instruction/ai-prompt-resolver.service.d.ts +12 -0
- package/dist/ai-instruction/ai-prompt-resolver.service.d.ts.map +1 -1
- package/dist/ai-instruction/ai-prompt-resolver.service.js +26 -0
- package/dist/ai-instruction/ai-prompt-resolver.service.js.map +1 -1
- package/dist/core.module.d.ts.map +1 -1
- package/dist/core.module.js +3 -0
- package/dist/core.module.js.map +1 -1
- package/dist/document-kit/document-kit.module.d.ts +3 -0
- package/dist/document-kit/document-kit.module.d.ts.map +1 -0
- package/dist/document-kit/document-kit.module.js +24 -0
- package/dist/document-kit/document-kit.module.js.map +1 -0
- package/dist/document-kit/document-kit.registry.d.ts +55 -0
- package/dist/document-kit/document-kit.registry.d.ts.map +1 -0
- package/dist/document-kit/document-kit.registry.js +91 -0
- package/dist/document-kit/document-kit.registry.js.map +1 -0
- package/dist/document-kit/document-kit.service.d.ts +49 -0
- package/dist/document-kit/document-kit.service.d.ts.map +1 -0
- package/dist/document-kit/document-kit.service.js +135 -0
- package/dist/document-kit/document-kit.service.js.map +1 -0
- package/dist/file/file.service.d.ts +15 -1
- package/dist/file/file.service.d.ts.map +1 -1
- package/dist/file/file.service.js +52 -24
- package/dist/file/file.service.js.map +1 -1
- package/dist/file/mcp-file-source.schema.d.ts.map +1 -1
- package/dist/file/mcp-file-source.schema.js +8 -5
- package/dist/file/mcp-file-source.schema.js.map +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/integration-profile/integration-profile.secrets.d.ts.map +1 -1
- package/dist/integration-profile/integration-profile.secrets.js +21 -0
- package/dist/integration-profile/integration-profile.secrets.js.map +1 -1
- package/dist/integration-profile/testers/ai.testers.d.ts.map +1 -1
- package/dist/integration-profile/testers/ai.testers.js +46 -8
- package/dist/integration-profile/testers/ai.testers.js.map +1 -1
- package/dist/mcp/mcp.module.d.ts.map +1 -1
- package/dist/mcp/mcp.module.js +2 -0
- package/dist/mcp/mcp.module.js.map +1 -1
- package/dist/mcp/tools/core-access-log.mcp-tools.d.ts +17 -0
- package/dist/mcp/tools/core-access-log.mcp-tools.d.ts.map +1 -0
- package/dist/mcp/tools/core-access-log.mcp-tools.js +74 -0
- package/dist/mcp/tools/core-access-log.mcp-tools.js.map +1 -0
- package/dist/mcp/tools/core-files.mcp-tools.js +4 -4
- package/dist/mcp/tools/core-files.mcp-tools.js.map +1 -1
- package/dist/meeting/meeting-provider.registry.d.ts +72 -0
- package/dist/meeting/meeting-provider.registry.d.ts.map +1 -1
- package/dist/meeting/meeting-provider.registry.js.map +1 -1
- package/dist/oauth/oauth-token-broker.service.d.ts +50 -1
- package/dist/oauth/oauth-token-broker.service.d.ts.map +1 -1
- package/dist/oauth/oauth-token-broker.service.js +105 -3
- package/dist/oauth/oauth-token-broker.service.js.map +1 -1
- package/dist/oauth/providers/microsoft-entra-id.provider.d.ts +6 -0
- package/dist/oauth/providers/microsoft-entra-id.provider.d.ts.map +1 -1
- package/dist/oauth/providers/microsoft-entra-id.provider.js +30 -4
- package/dist/oauth/providers/microsoft-entra-id.provider.js.map +1 -1
- package/dist/pdf/document/charts/chart-bar.d.ts +24 -0
- package/dist/pdf/document/charts/chart-bar.d.ts.map +1 -0
- package/dist/pdf/document/charts/chart-bar.js +117 -0
- package/dist/pdf/document/charts/chart-bar.js.map +1 -0
- package/dist/pdf/document/charts/chart-donut.d.ts +16 -0
- package/dist/pdf/document/charts/chart-donut.d.ts.map +1 -0
- package/dist/pdf/document/charts/chart-donut.js +89 -0
- package/dist/pdf/document/charts/chart-donut.js.map +1 -0
- package/dist/pdf/document/charts/chart-gauge.d.ts +15 -0
- package/dist/pdf/document/charts/chart-gauge.d.ts.map +1 -0
- package/dist/pdf/document/charts/chart-gauge.js +60 -0
- package/dist/pdf/document/charts/chart-gauge.js.map +1 -0
- package/dist/pdf/document/charts/chart-line.d.ts +29 -0
- package/dist/pdf/document/charts/chart-line.d.ts.map +1 -0
- package/dist/pdf/document/charts/chart-line.js +89 -0
- package/dist/pdf/document/charts/chart-line.js.map +1 -0
- package/dist/pdf/document/charts/chart-primitives.d.ts +64 -0
- package/dist/pdf/document/charts/chart-primitives.d.ts.map +1 -0
- package/dist/pdf/document/charts/chart-primitives.js +110 -0
- package/dist/pdf/document/charts/chart-primitives.js.map +1 -0
- package/dist/pdf/document/charts/chart-radar.d.ts +13 -0
- package/dist/pdf/document/charts/chart-radar.d.ts.map +1 -0
- package/dist/pdf/document/charts/chart-radar.js +83 -0
- package/dist/pdf/document/charts/chart-radar.js.map +1 -0
- package/dist/pdf/document/charts/chart-scale.d.ts +39 -0
- package/dist/pdf/document/charts/chart-scale.d.ts.map +1 -0
- package/dist/pdf/document/charts/chart-scale.js +118 -0
- package/dist/pdf/document/charts/chart-scale.js.map +1 -0
- package/dist/pdf/document/charts/index.d.ts +8 -0
- package/dist/pdf/document/charts/index.d.ts.map +1 -0
- package/dist/pdf/document/charts/index.js +24 -0
- package/dist/pdf/document/charts/index.js.map +1 -0
- package/dist/pdf/document/index.d.ts +8 -0
- package/dist/pdf/document/index.d.ts.map +1 -0
- package/dist/pdf/document/index.js +24 -0
- package/dist/pdf/document/index.js.map +1 -0
- package/dist/pdf/document/pdf-document.chrome.d.ts +20 -0
- package/dist/pdf/document/pdf-document.chrome.d.ts.map +1 -0
- package/dist/pdf/document/pdf-document.chrome.js +36 -0
- package/dist/pdf/document/pdf-document.chrome.js.map +1 -0
- package/dist/pdf/document/pdf-document.css.d.ts +20 -0
- package/dist/pdf/document/pdf-document.css.d.ts.map +1 -0
- package/dist/pdf/document/pdf-document.css.js +239 -0
- package/dist/pdf/document/pdf-document.css.js.map +1 -0
- package/dist/pdf/document/pdf-document.renderer.d.ts +10 -0
- package/dist/pdf/document/pdf-document.renderer.d.ts.map +1 -0
- package/dist/pdf/document/pdf-document.renderer.js +153 -0
- package/dist/pdf/document/pdf-document.renderer.js.map +1 -0
- package/dist/pdf/document/pdf-document.service.d.ts +27 -0
- package/dist/pdf/document/pdf-document.service.d.ts.map +1 -0
- package/dist/pdf/document/pdf-document.service.js +81 -0
- package/dist/pdf/document/pdf-document.service.js.map +1 -0
- package/dist/pdf/document/pdf-document.theme.d.ts +41 -0
- package/dist/pdf/document/pdf-document.theme.d.ts.map +1 -0
- package/dist/pdf/document/pdf-document.theme.js +105 -0
- package/dist/pdf/document/pdf-document.theme.js.map +1 -0
- package/dist/pdf/document/pdf-document.types.d.ts +108 -0
- package/dist/pdf/document/pdf-document.types.d.ts.map +1 -0
- package/dist/pdf/document/pdf-document.types.js +18 -0
- package/dist/pdf/document/pdf-document.types.js.map +1 -0
- package/dist/pdf/pdf.module.d.ts.map +1 -1
- package/dist/pdf/pdf.module.js +3 -2
- package/dist/pdf/pdf.module.js.map +1 -1
- package/dist/pdf/pdf.service.d.ts +69 -1
- package/dist/pdf/pdf.service.d.ts.map +1 -1
- package/dist/pdf/pdf.service.js +164 -63
- package/dist/pdf/pdf.service.js.map +1 -1
- package/dist/pdf/templates/commercial-proposal.template.d.ts +96 -0
- package/dist/pdf/templates/commercial-proposal.template.d.ts.map +1 -0
- package/dist/pdf/templates/commercial-proposal.template.js +276 -0
- package/dist/pdf/templates/commercial-proposal.template.js.map +1 -0
- package/dist/setting/favicon.controller.d.ts +26 -0
- package/dist/setting/favicon.controller.d.ts.map +1 -0
- package/dist/setting/favicon.controller.js +130 -0
- package/dist/setting/favicon.controller.js.map +1 -0
- package/dist/setting/setting.module.d.ts.map +1 -1
- package/dist/setting/setting.module.js +2 -1
- package/dist/setting/setting.module.js.map +1 -1
- package/dist/whatsapp-sender/whatsapp-sender.service.d.ts.map +1 -1
- package/dist/whatsapp-sender/whatsapp-sender.service.js +25 -2
- package/dist/whatsapp-sender/whatsapp-sender.service.js.map +1 -1
- package/hedhog/data/integration_type.yaml +6 -0
- package/hedhog/data/route.yaml +8 -0
- package/hedhog/data/setting_group.yaml +52 -0
- package/hedhog/frontend/messages/en.json +54 -1
- package/hedhog/frontend/messages/pt.json +54 -1
- package/package.json +4 -4
- package/src/ai/ai-attachment.fragments.spec.ts +56 -3
- package/src/ai/ai.service.responses.spec.ts +429 -0
- package/src/ai/ai.service.ts +409 -27
- package/src/ai-instruction/ai-prompt-resolver.service.spec.ts +44 -0
- package/src/ai-instruction/ai-prompt-resolver.service.ts +29 -0
- package/src/core.module.ts +3 -0
- package/src/document-kit/document-kit.module.ts +12 -0
- package/src/document-kit/document-kit.registry.ts +125 -0
- package/src/document-kit/document-kit.service.spec.ts +156 -0
- package/src/document-kit/document-kit.service.ts +173 -0
- package/src/file/file.service.spec.ts +168 -1
- package/src/file/file.service.ts +72 -34
- package/src/file/mcp-file-source.schema.ts +8 -5
- package/src/index.ts +5 -0
- package/src/integration-profile/integration-profile.secrets.ts +21 -0
- package/src/integration-profile/testers/ai.testers.ts +70 -5
- package/src/integration-profile/testers/remaining.testers.spec.ts +65 -1
- package/src/integration-profile/testers/tester-coverage.spec.ts +10 -0
- package/src/mcp/mcp.module.ts +2 -0
- package/src/mcp/tools/core-access-log.mcp-tools.ts +66 -0
- package/src/mcp/tools/core-files.mcp-tools.ts +4 -4
- package/src/meeting/meeting-provider.registry.ts +80 -0
- package/src/oauth/oauth-token-broker.service.spec.ts +108 -0
- package/src/oauth/oauth-token-broker.service.ts +129 -2
- package/src/oauth/providers/microsoft-entra-id.provider.spec.ts +133 -0
- package/src/oauth/providers/microsoft-entra-id.provider.ts +29 -2
- package/src/pdf/document/charts/chart-bar.ts +217 -0
- package/src/pdf/document/charts/chart-donut.ts +163 -0
- package/src/pdf/document/charts/chart-gauge.ts +94 -0
- package/src/pdf/document/charts/chart-line.ts +159 -0
- package/src/pdf/document/charts/chart-primitives.ts +188 -0
- package/src/pdf/document/charts/chart-radar.ts +136 -0
- package/src/pdf/document/charts/chart-scale.spec.ts +93 -0
- package/src/pdf/document/charts/chart-scale.ts +141 -0
- package/src/pdf/document/charts/charts.spec.ts +157 -0
- package/src/pdf/document/charts/index.ts +7 -0
- package/src/pdf/document/index.ts +7 -0
- package/src/pdf/document/pdf-document.chrome.ts +38 -0
- package/src/pdf/document/pdf-document.css.ts +238 -0
- package/src/pdf/document/pdf-document.renderer.spec.ts +129 -0
- package/src/pdf/document/pdf-document.renderer.ts +215 -0
- package/src/pdf/document/pdf-document.service.ts +77 -0
- package/src/pdf/document/pdf-document.theme.ts +146 -0
- package/src/pdf/document/pdf-document.types.ts +97 -0
- package/src/pdf/pdf.module.ts +3 -2
- package/src/pdf/pdf.service.spec.ts +131 -0
- package/src/pdf/pdf.service.ts +245 -82
- package/src/pdf/templates/commercial-proposal.template.spec.ts +177 -0
- package/src/pdf/templates/commercial-proposal.template.ts +400 -0
- package/src/setting/favicon.controller.spec.ts +92 -0
- package/src/setting/favicon.controller.ts +135 -0
- package/src/setting/setting.module.ts +2 -1
- package/src/whatsapp-sender/whatsapp-sender.service.spec.ts +73 -0
- package/src/whatsapp-sender/whatsapp-sender.service.ts +32 -2
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.escapePdfHtml = escapePdfHtml;
|
|
4
|
+
exports.commercialProposalTemplate = commercialProposalTemplate;
|
|
5
|
+
const hcode_theme_1 = require("../themes/hcode.theme");
|
|
6
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
7
|
+
// Helpers
|
|
8
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
9
|
+
function escapePdfHtml(value) {
|
|
10
|
+
return String(value !== null && value !== void 0 ? value : '')
|
|
11
|
+
.replace(/&/g, '&')
|
|
12
|
+
.replace(/</g, '<')
|
|
13
|
+
.replace(/>/g, '>')
|
|
14
|
+
.replace(/"/g, '"')
|
|
15
|
+
.replace(/'/g, ''');
|
|
16
|
+
}
|
|
17
|
+
/** Only a plain hex color reaches the CSS; anything else falls back. */
|
|
18
|
+
function safeColor(value, fallback) {
|
|
19
|
+
return /^#[0-9a-f]{3,8}$/i.test(String(value !== null && value !== void 0 ? value : '').trim()) ? value.trim() : fallback;
|
|
20
|
+
}
|
|
21
|
+
/** Font stacks end up inside a `<style>`: drop what could close it. */
|
|
22
|
+
function safeFontStack(value, fallback) {
|
|
23
|
+
const cleaned = String(value !== null && value !== void 0 ? value : '').replace(/[<>{};]/g, '').trim();
|
|
24
|
+
return cleaned || fallback;
|
|
25
|
+
}
|
|
26
|
+
function sectionNumber(index) {
|
|
27
|
+
return String(index + 1).padStart(2, '0');
|
|
28
|
+
}
|
|
29
|
+
function renderParagraphs(text) {
|
|
30
|
+
return String(text !== null && text !== void 0 ? text : '')
|
|
31
|
+
.split(/\n{2,}/)
|
|
32
|
+
.map((paragraph) => paragraph.trim())
|
|
33
|
+
.filter(Boolean)
|
|
34
|
+
.map((paragraph) => `<p>${escapePdfHtml(paragraph).replace(/\n/g, '<br>')}</p>`)
|
|
35
|
+
.join('');
|
|
36
|
+
}
|
|
37
|
+
function renderBlock(block) {
|
|
38
|
+
switch (block.type) {
|
|
39
|
+
case 'html':
|
|
40
|
+
return `<div class="rich">${block.html}</div>`;
|
|
41
|
+
case 'paragraphs':
|
|
42
|
+
return `<div class="rich">${renderParagraphs(block.text)}</div>`;
|
|
43
|
+
case 'list':
|
|
44
|
+
return `<ul class="dash-list">${block.items
|
|
45
|
+
.map((item) => `<li>${escapePdfHtml(item)}</li>`)
|
|
46
|
+
.join('')}</ul>`;
|
|
47
|
+
case 'callout':
|
|
48
|
+
return `<div class="callout ${block.tone === 'neutral' ? 'callout-neutral' : 'callout-accent'} no-break">
|
|
49
|
+
${block.title ? `<div class="label">${escapePdfHtml(block.title)}</div>` : ''}
|
|
50
|
+
${renderParagraphs(block.text)}
|
|
51
|
+
</div>`;
|
|
52
|
+
case 'table': {
|
|
53
|
+
const align = (index) => { var _a; return (((_a = block.align) === null || _a === void 0 ? void 0 : _a[index]) === 'right' ? ' class="num"' : ''); };
|
|
54
|
+
return `<table class="grid-table">
|
|
55
|
+
<thead><tr>${block.headers
|
|
56
|
+
.map((header, index) => `<th${align(index)}>${escapePdfHtml(header)}</th>`)
|
|
57
|
+
.join('')}</tr></thead>
|
|
58
|
+
<tbody>${block.rows
|
|
59
|
+
.map((row) => `<tr>${row.map((cell, index) => `<td${align(index)}>${escapePdfHtml(cell)}</td>`).join('')}</tr>`)
|
|
60
|
+
.join('')}</tbody>
|
|
61
|
+
</table>`;
|
|
62
|
+
}
|
|
63
|
+
case 'totals':
|
|
64
|
+
return `<div class="totals no-break">${block.rows
|
|
65
|
+
.map((row) => `<div class="totals-row${row.emphasis ? ' totals-strong' : ''}"><span>${escapePdfHtml(row.label)}</span><span>${escapePdfHtml(row.value)}</span></div>`)
|
|
66
|
+
.join('')}</div>`;
|
|
67
|
+
default:
|
|
68
|
+
return '';
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/** Uploaded logo when there is one, otherwise the company name as a wordmark. */
|
|
72
|
+
function renderBrand(theme) {
|
|
73
|
+
if (theme.logoOverride) {
|
|
74
|
+
return `<img class="brand-logo" src="${escapePdfHtml(theme.logoOverride)}" alt="${escapePdfHtml(theme.companyName)}">`;
|
|
75
|
+
}
|
|
76
|
+
const name = String(theme.companyName || '').trim();
|
|
77
|
+
return `<div class="wordmark"><span class="accent">${escapePdfHtml(name.slice(0, 1))}</span>${escapePdfHtml(name.slice(1))}<span class="wordmark-area"> | ${escapePdfHtml(theme.area.toUpperCase())}</span></div>`;
|
|
78
|
+
}
|
|
79
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
80
|
+
// Template
|
|
81
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
82
|
+
/**
|
|
83
|
+
* Commercial proposal — cover with the metadata table, numbered sections
|
|
84
|
+
* (`01 · ESCOPO`), borderless tables, rounded cards and a footer with the
|
|
85
|
+
* legal line and `n / N` on every page.
|
|
86
|
+
*
|
|
87
|
+
* Pure function: the caller resolves the theme (see
|
|
88
|
+
* `PdfService.loadCommercialDocumentTheme`) and the data, so the same input
|
|
89
|
+
* always renders the same document.
|
|
90
|
+
*/
|
|
91
|
+
function commercialProposalTemplate(data, theme) {
|
|
92
|
+
var _a, _b;
|
|
93
|
+
const primary = safeColor(theme.primaryColor, '#FF760C');
|
|
94
|
+
const ink = hcode_theme_1.HCODE_NEUTRALS.ink1;
|
|
95
|
+
const muted = hcode_theme_1.HCODE_NEUTRALS.ink2;
|
|
96
|
+
const line = hcode_theme_1.HCODE_NEUTRALS.line;
|
|
97
|
+
const surface = hcode_theme_1.HCODE_NEUTRALS.surface2;
|
|
98
|
+
const fontFamily = safeFontStack(theme.fontFamily, "'Inter', sans-serif");
|
|
99
|
+
const fontMono = safeFontStack(theme.fontMono, "'JetBrains Mono', monospace");
|
|
100
|
+
const sections = data.sections
|
|
101
|
+
.filter((section) => section.blocks.length > 0)
|
|
102
|
+
.map((section, index) => `<section class="section">
|
|
103
|
+
<div class="section-eyebrow">${sectionNumber(index)} · ${escapePdfHtml(section.eyebrow.toUpperCase())}</div>
|
|
104
|
+
<h2>${escapePdfHtml(section.title)}</h2>
|
|
105
|
+
${section.blocks.map(renderBlock).join('\n')}
|
|
106
|
+
</section>`)
|
|
107
|
+
.join('\n');
|
|
108
|
+
const signatories = ((_a = data.signatories) === null || _a === void 0 ? void 0 : _a.length)
|
|
109
|
+
? `<section class="section signatures no-break">
|
|
110
|
+
${data.signatureTitle ? `<h2>${escapePdfHtml(data.signatureTitle)}</h2>` : ''}
|
|
111
|
+
<div class="signature-grid">${data.signatories
|
|
112
|
+
.map((signatory) => `<div class="signature">
|
|
113
|
+
<div class="signature-line"></div>
|
|
114
|
+
<div class="label">${escapePdfHtml(signatory.party)}</div>
|
|
115
|
+
${signatory.name ? `<div class="signature-name">${escapePdfHtml(signatory.name)}</div>` : ''}
|
|
116
|
+
${signatory.role ? `<div class="signature-role">${escapePdfHtml(signatory.role)}</div>` : ''}
|
|
117
|
+
</div>`)
|
|
118
|
+
.join('')}</div>
|
|
119
|
+
</section>`
|
|
120
|
+
: '';
|
|
121
|
+
const cover = `<div class="cover">
|
|
122
|
+
<div class="cover-brand">${renderBrand(theme)}</div>
|
|
123
|
+
<div class="cover-eyebrow">${escapePdfHtml(data.eyebrow.toUpperCase())}</div>
|
|
124
|
+
<h1 class="cover-title">${escapePdfHtml(data.title)}${data.titleAccent ? `<br><span class="accent">${escapePdfHtml(data.titleAccent)}</span>` : ''}</h1>
|
|
125
|
+
${data.subtitle ? `<div class="cover-subtitle">${escapePdfHtml(data.subtitle)}</div>` : ''}
|
|
126
|
+
<table class="meta-table">
|
|
127
|
+
<tbody>${data.meta
|
|
128
|
+
.filter((item) => { var _a; return String((_a = item.value) !== null && _a !== void 0 ? _a : '').trim(); })
|
|
129
|
+
.map((item) => `<tr><th>${escapePdfHtml(item.label.toUpperCase())}</th><td>${escapePdfHtml(item.value)}</td></tr>`)
|
|
130
|
+
.join('')}</tbody>
|
|
131
|
+
</table>
|
|
132
|
+
${theme.partnerLine ? `<div class="partner-line">${escapePdfHtml(theme.partnerLine.toUpperCase())}</div>` : ''}
|
|
133
|
+
</div>`;
|
|
134
|
+
const html = `<!DOCTYPE html>
|
|
135
|
+
<html lang="${escapePdfHtml(data.locale || 'pt-BR')}">
|
|
136
|
+
<head>
|
|
137
|
+
<meta charset="UTF-8">
|
|
138
|
+
${(0, hcode_theme_1.buildFontImport)()}
|
|
139
|
+
<style>
|
|
140
|
+
:root {
|
|
141
|
+
--primary: ${primary};
|
|
142
|
+
--primary-soft: color-mix(in srgb, ${primary} 12%, #ffffff);
|
|
143
|
+
--ink: ${ink};
|
|
144
|
+
--muted: ${muted};
|
|
145
|
+
--line: ${line};
|
|
146
|
+
--surface: ${surface};
|
|
147
|
+
--font: ${fontFamily};
|
|
148
|
+
--mono: ${fontMono};
|
|
149
|
+
}
|
|
150
|
+
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
|
|
151
|
+
html, body {
|
|
152
|
+
font-family: var(--font);
|
|
153
|
+
font-size: 10.5pt;
|
|
154
|
+
line-height: 1.55;
|
|
155
|
+
color: var(--ink);
|
|
156
|
+
background: #ffffff;
|
|
157
|
+
-webkit-print-color-adjust: exact;
|
|
158
|
+
print-color-adjust: exact;
|
|
159
|
+
}
|
|
160
|
+
.accent { color: var(--primary); }
|
|
161
|
+
.no-break { break-inside: avoid; page-break-inside: avoid; }
|
|
162
|
+
.label {
|
|
163
|
+
font-family: var(--mono);
|
|
164
|
+
font-size: 7.5pt;
|
|
165
|
+
letter-spacing: 0.14em;
|
|
166
|
+
text-transform: uppercase;
|
|
167
|
+
color: var(--muted);
|
|
168
|
+
margin-bottom: 6px;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/* Cover */
|
|
172
|
+
.cover { min-height: 245mm; display: flex; flex-direction: column; break-after: page; }
|
|
173
|
+
.cover-brand { margin-bottom: 48mm; }
|
|
174
|
+
.brand-logo { max-height: 40px; max-width: 180px; object-fit: contain; }
|
|
175
|
+
.wordmark { font-size: 26pt; font-weight: 300; letter-spacing: -0.01em; line-height: 1; }
|
|
176
|
+
.wordmark-area { font-family: var(--mono); font-size: 9pt; letter-spacing: 0.2em; color: #949494; }
|
|
177
|
+
.cover-eyebrow {
|
|
178
|
+
font-family: var(--mono);
|
|
179
|
+
font-size: 8pt;
|
|
180
|
+
letter-spacing: 0.16em;
|
|
181
|
+
color: var(--muted);
|
|
182
|
+
margin-bottom: 14px;
|
|
183
|
+
}
|
|
184
|
+
.cover-title { font-size: 30pt; font-weight: 700; line-height: 1.12; letter-spacing: -0.02em; margin-bottom: 14px; }
|
|
185
|
+
.cover-subtitle { font-size: 11.5pt; color: var(--muted); margin-bottom: 28px; }
|
|
186
|
+
.meta-table { width: 100%; border-collapse: collapse; margin-top: auto; }
|
|
187
|
+
.meta-table th, .meta-table td { padding: 7px 0; border-bottom: 1px solid var(--line); text-align: left; vertical-align: top; }
|
|
188
|
+
.meta-table th {
|
|
189
|
+
width: 34%;
|
|
190
|
+
font-family: var(--mono);
|
|
191
|
+
font-size: 7.5pt;
|
|
192
|
+
font-weight: 400;
|
|
193
|
+
letter-spacing: 0.14em;
|
|
194
|
+
color: var(--muted);
|
|
195
|
+
}
|
|
196
|
+
.meta-table td { font-size: 10pt; }
|
|
197
|
+
.partner-line { margin-top: 18px; font-family: var(--mono); font-size: 7.5pt; letter-spacing: 0.16em; color: #949494; }
|
|
198
|
+
|
|
199
|
+
/* Sections */
|
|
200
|
+
.section { margin-bottom: 26px; }
|
|
201
|
+
.section-eyebrow { font-family: var(--mono); font-size: 8pt; letter-spacing: 0.16em; color: var(--primary); margin-bottom: 6px; }
|
|
202
|
+
h2 { font-size: 16pt; font-weight: 700; line-height: 1.25; letter-spacing: -0.01em; margin-bottom: 12px; break-after: avoid; }
|
|
203
|
+
.rich p { margin-bottom: 8px; }
|
|
204
|
+
.rich ul, .rich ol { margin: 0 0 8px 18px; }
|
|
205
|
+
.rich h3 { font-size: 11.5pt; margin: 12px 0 6px; }
|
|
206
|
+
.dash-list, .rich ul { list-style: none; margin-left: 0; }
|
|
207
|
+
.dash-list li, .rich ul li { position: relative; padding-left: 18px; margin-bottom: 5px; }
|
|
208
|
+
.dash-list li::before, .rich ul li::before {
|
|
209
|
+
content: '';
|
|
210
|
+
position: absolute;
|
|
211
|
+
left: 0;
|
|
212
|
+
top: 0.75em;
|
|
213
|
+
width: 9px;
|
|
214
|
+
height: 2px;
|
|
215
|
+
background: var(--primary);
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/* Cards */
|
|
219
|
+
.callout { border-radius: 10px; padding: 14px 16px; margin: 10px 0; }
|
|
220
|
+
.callout p { margin-bottom: 6px; }
|
|
221
|
+
.callout p:last-child { margin-bottom: 0; }
|
|
222
|
+
.callout-accent { background: var(--primary-soft); }
|
|
223
|
+
.callout-accent .label { color: var(--primary); }
|
|
224
|
+
.callout-neutral { background: var(--surface); }
|
|
225
|
+
|
|
226
|
+
/* Tables: horizontal rules only, no grid */
|
|
227
|
+
.grid-table { width: 100%; border-collapse: collapse; margin: 6px 0 10px; font-size: 9.5pt; }
|
|
228
|
+
.grid-table th {
|
|
229
|
+
font-family: var(--mono);
|
|
230
|
+
font-size: 7.5pt;
|
|
231
|
+
font-weight: 400;
|
|
232
|
+
letter-spacing: 0.12em;
|
|
233
|
+
text-transform: uppercase;
|
|
234
|
+
color: var(--muted);
|
|
235
|
+
text-align: left;
|
|
236
|
+
padding: 0 7px 7px;
|
|
237
|
+
border-bottom: 1px solid var(--ink);
|
|
238
|
+
}
|
|
239
|
+
.grid-table td { padding: 8px 7px; border-bottom: 1px solid var(--line); vertical-align: top; }
|
|
240
|
+
.grid-table th:first-child, .grid-table td:first-child { padding-left: 0; }
|
|
241
|
+
.grid-table th:last-child, .grid-table td:last-child { padding-right: 0; }
|
|
242
|
+
.grid-table tr { break-inside: avoid; }
|
|
243
|
+
.grid-table .num { text-align: right; white-space: nowrap; }
|
|
244
|
+
|
|
245
|
+
.totals { margin: 6px 0 10px auto; width: 60%; }
|
|
246
|
+
.totals-row { display: flex; justify-content: space-between; padding: 6px 0; border-bottom: 1px solid var(--line); font-size: 10pt; }
|
|
247
|
+
.totals-strong { border-bottom: none; border-top: 2px solid var(--ink); font-weight: 700; font-size: 12pt; color: var(--primary); }
|
|
248
|
+
|
|
249
|
+
/* Signatures */
|
|
250
|
+
.signature-grid { display: flex; gap: 32px; margin-top: 36px; }
|
|
251
|
+
.signature { flex: 1; }
|
|
252
|
+
.signature-line { border-top: 1px solid var(--ink); margin-bottom: 8px; }
|
|
253
|
+
.signature-name { font-weight: 600; }
|
|
254
|
+
.signature-role { color: var(--muted); font-size: 9.5pt; }
|
|
255
|
+
</style>
|
|
256
|
+
</head>
|
|
257
|
+
<body>
|
|
258
|
+
${cover}
|
|
259
|
+
${sections}
|
|
260
|
+
${signatories}
|
|
261
|
+
</body>
|
|
262
|
+
</html>`;
|
|
263
|
+
const footerLeft = theme.legalFooter || data.documentLabel || theme.companyName;
|
|
264
|
+
const separator = (_b = data.pageSeparator) !== null && _b !== void 0 ? _b : '/';
|
|
265
|
+
const pdfOptions = {
|
|
266
|
+
format: 'A4',
|
|
267
|
+
printBackground: true,
|
|
268
|
+
displayHeaderFooter: true,
|
|
269
|
+
headerTemplate: `<div style="position:absolute;top:0;left:0;right:0;height:6px;background:${primary};-webkit-print-color-adjust:exact;print-color-adjust:exact;"></div>`,
|
|
270
|
+
footerTemplate: `<div style="width:100%;margin:0 25mm;display:flex;justify-content:space-between;gap:16px;font-family:${escapePdfHtml(fontMono)};font-size:6.5pt;letter-spacing:0.12em;color:#949494;-webkit-print-color-adjust:exact;"><span>${escapePdfHtml(footerLeft.toUpperCase())}</span><span style="white-space:nowrap;"><span class="pageNumber"></span> ${escapePdfHtml(separator)} <span class="totalPages"></span></span></div>`,
|
|
271
|
+
margin: { top: '22mm', right: '25mm', bottom: '22mm', left: '25mm' },
|
|
272
|
+
label: 'commercial-proposal',
|
|
273
|
+
};
|
|
274
|
+
return { html, pdfOptions };
|
|
275
|
+
}
|
|
276
|
+
//# sourceMappingURL=commercial-proposal.template.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commercial-proposal.template.js","sourceRoot":"","sources":["../../../src/pdf/templates/commercial-proposal.template.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Response } from 'express';
|
|
2
|
+
import { BrandAssetService } from './brand-asset.service';
|
|
3
|
+
import { SettingService } from './setting.service';
|
|
4
|
+
/**
|
|
5
|
+
* `GET /favicon.ico` no host da API, com o icone do Branding (`icon-url`).
|
|
6
|
+
*
|
|
7
|
+
* Quem procura o favicon no dominio da API sao os clientes que so conhecem esse
|
|
8
|
+
* endereco - o conector MCP no claude.ai, por exemplo, mostra o icone do dominio
|
|
9
|
+
* do servidor ao lado do nome. Sem esta rota a resposta era o 404 JSON do Nest e
|
|
10
|
+
* o conector caia na letra inicial.
|
|
11
|
+
*
|
|
12
|
+
* O arquivo e servido daqui (e nao por redirect) porque nem todo coletor de
|
|
13
|
+
* favicon segue redirecionamento. O Content-Type e o da origem, entao um SVG
|
|
14
|
+
* configurado no Branding chega como SVG.
|
|
15
|
+
*/
|
|
16
|
+
export declare class FaviconController {
|
|
17
|
+
private readonly setting;
|
|
18
|
+
private readonly brandAsset;
|
|
19
|
+
private readonly logger;
|
|
20
|
+
private cache;
|
|
21
|
+
constructor(setting: SettingService, brandAsset: BrandAssetService);
|
|
22
|
+
favicon(res: Response): Promise<void>;
|
|
23
|
+
private loadIcon;
|
|
24
|
+
private download;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=favicon.controller.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"favicon.controller.d.ts","sourceRoot":"","sources":["../../src/setting/favicon.controller.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAenD;;;;;;;;;;;GAWG;AACH,qBACa,iBAAiB;IAK1B,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAL7B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsC;IAC7D,OAAO,CAAC,KAAK,CAA2B;gBAGrB,OAAO,EAAE,cAAc,EACvB,UAAU,EAAE,iBAAiB;IAK1C,OAAO,CAAQ,GAAG,EAAE,QAAQ;YAYpB,QAAQ;YAiCR,QAAQ;CA8CvB"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
var FaviconController_1;
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.FaviconController = void 0;
|
|
17
|
+
const api_1 = require("@hed-hog/api");
|
|
18
|
+
const common_1 = require("@nestjs/common");
|
|
19
|
+
const brand_asset_service_1 = require("./brand-asset.service");
|
|
20
|
+
const setting_service_1 = require("./setting.service");
|
|
21
|
+
/** Timeout do fetch da imagem configurada. */
|
|
22
|
+
const FETCH_TIMEOUT_MS = 5000;
|
|
23
|
+
/** Quanto tempo o binario baixado fica em memoria antes de buscar de novo. */
|
|
24
|
+
const CACHE_TTL_MS = 10 * 60000;
|
|
25
|
+
/**
|
|
26
|
+
* `GET /favicon.ico` no host da API, com o icone do Branding (`icon-url`).
|
|
27
|
+
*
|
|
28
|
+
* Quem procura o favicon no dominio da API sao os clientes que so conhecem esse
|
|
29
|
+
* endereco - o conector MCP no claude.ai, por exemplo, mostra o icone do dominio
|
|
30
|
+
* do servidor ao lado do nome. Sem esta rota a resposta era o 404 JSON do Nest e
|
|
31
|
+
* o conector caia na letra inicial.
|
|
32
|
+
*
|
|
33
|
+
* O arquivo e servido daqui (e nao por redirect) porque nem todo coletor de
|
|
34
|
+
* favicon segue redirecionamento. O Content-Type e o da origem, entao um SVG
|
|
35
|
+
* configurado no Branding chega como SVG.
|
|
36
|
+
*/
|
|
37
|
+
let FaviconController = FaviconController_1 = class FaviconController {
|
|
38
|
+
constructor(setting, brandAsset) {
|
|
39
|
+
this.setting = setting;
|
|
40
|
+
this.brandAsset = brandAsset;
|
|
41
|
+
this.logger = new common_1.Logger(FaviconController_1.name);
|
|
42
|
+
this.cache = null;
|
|
43
|
+
}
|
|
44
|
+
async favicon(res) {
|
|
45
|
+
const icon = await this.loadIcon();
|
|
46
|
+
if (!icon) {
|
|
47
|
+
throw new common_1.NotFoundException();
|
|
48
|
+
}
|
|
49
|
+
res.setHeader('Content-Type', icon.contentType);
|
|
50
|
+
res.setHeader('Cache-Control', 'public, max-age=3600');
|
|
51
|
+
res.send(icon.body);
|
|
52
|
+
}
|
|
53
|
+
async loadIcon() {
|
|
54
|
+
var _a, _b, _c;
|
|
55
|
+
const settings = await this.setting.getSettingValues([
|
|
56
|
+
'icon-url',
|
|
57
|
+
'image-url',
|
|
58
|
+
]);
|
|
59
|
+
const value = String((_a = settings['icon-url']) !== null && _a !== void 0 ? _a : '').trim() ||
|
|
60
|
+
String((_b = settings['image-url']) !== null && _b !== void 0 ? _b : '').trim();
|
|
61
|
+
const url = await this.brandAsset.resolveAssetUrl(value);
|
|
62
|
+
if (!url) {
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
if (this.cache &&
|
|
66
|
+
this.cache.url === url &&
|
|
67
|
+
this.cache.expiresAt > Date.now()) {
|
|
68
|
+
return this.cache;
|
|
69
|
+
}
|
|
70
|
+
const icon = await this.download(url);
|
|
71
|
+
if (icon) {
|
|
72
|
+
this.cache = icon;
|
|
73
|
+
return icon;
|
|
74
|
+
}
|
|
75
|
+
// Origem fora do ar: melhor o icone anterior do que nenhum.
|
|
76
|
+
return ((_c = this.cache) === null || _c === void 0 ? void 0 : _c.url) === url ? this.cache : null;
|
|
77
|
+
}
|
|
78
|
+
async download(url) {
|
|
79
|
+
var _a;
|
|
80
|
+
const dataUri = /^data:([^;,]+)(;base64)?,([\s\S]*)$/i.exec(url);
|
|
81
|
+
if (dataUri) {
|
|
82
|
+
const [, contentType, base64, payload] = dataUri;
|
|
83
|
+
return {
|
|
84
|
+
url,
|
|
85
|
+
contentType,
|
|
86
|
+
body: base64
|
|
87
|
+
? Buffer.from(payload, 'base64')
|
|
88
|
+
: Buffer.from(decodeURIComponent(payload)),
|
|
89
|
+
expiresAt: Date.now() + CACHE_TTL_MS,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
try {
|
|
93
|
+
const controller = new AbortController();
|
|
94
|
+
const timeout = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);
|
|
95
|
+
const response = await globalThis
|
|
96
|
+
.fetch(url, { signal: controller.signal })
|
|
97
|
+
.finally(() => clearTimeout(timeout));
|
|
98
|
+
const contentType = (_a = response.headers.get('content-type')) !== null && _a !== void 0 ? _a : '';
|
|
99
|
+
if (!response.ok || !contentType.startsWith('image/')) {
|
|
100
|
+
this.logger.warn(`Favicon source ${url} answered ${response.status} ${contentType || '(no content-type)'}`);
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
return {
|
|
104
|
+
url,
|
|
105
|
+
contentType,
|
|
106
|
+
body: Buffer.from(await response.arrayBuffer()),
|
|
107
|
+
expiresAt: Date.now() + CACHE_TTL_MS,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
this.logger.warn(`Could not fetch favicon source ${url}: ${error instanceof Error ? error.message : String(error)}`);
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
exports.FaviconController = FaviconController;
|
|
117
|
+
__decorate([
|
|
118
|
+
(0, api_1.Public)(),
|
|
119
|
+
(0, common_1.Get)('favicon.ico'),
|
|
120
|
+
__param(0, (0, common_1.Res)()),
|
|
121
|
+
__metadata("design:type", Function),
|
|
122
|
+
__metadata("design:paramtypes", [Object]),
|
|
123
|
+
__metadata("design:returntype", Promise)
|
|
124
|
+
], FaviconController.prototype, "favicon", null);
|
|
125
|
+
exports.FaviconController = FaviconController = FaviconController_1 = __decorate([
|
|
126
|
+
(0, common_1.Controller)(),
|
|
127
|
+
__metadata("design:paramtypes", [setting_service_1.SettingService,
|
|
128
|
+
brand_asset_service_1.BrandAssetService])
|
|
129
|
+
], FaviconController);
|
|
130
|
+
//# sourceMappingURL=favicon.controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"favicon.controller.js","sourceRoot":"","sources":["../../src/setting/favicon.controller.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setting.module.d.ts","sourceRoot":"","sources":["../../src/setting/setting.module.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"setting.module.d.ts","sourceRoot":"","sources":["../../src/setting/setting.module.ts"],"names":[],"mappings":"AAWA,qBAaa,aAAa;CAAI"}
|
|
@@ -14,6 +14,7 @@ const common_1 = require("@nestjs/common");
|
|
|
14
14
|
const auth_module_1 = require("../auth/auth.module");
|
|
15
15
|
const mail_module_1 = require("../mail/mail.module");
|
|
16
16
|
const brand_asset_service_1 = require("./brand-asset.service");
|
|
17
|
+
const favicon_controller_1 = require("./favicon.controller");
|
|
17
18
|
const setting_controller_1 = require("./setting.controller");
|
|
18
19
|
const setting_service_1 = require("./setting.service");
|
|
19
20
|
let SettingModule = class SettingModule {
|
|
@@ -29,7 +30,7 @@ exports.SettingModule = SettingModule = __decorate([
|
|
|
29
30
|
(0, common_1.forwardRef)(() => api_locale_1.LocaleModule),
|
|
30
31
|
(0, common_1.forwardRef)(() => mail_module_1.MailModule),
|
|
31
32
|
],
|
|
32
|
-
controllers: [setting_controller_1.SettingsController],
|
|
33
|
+
controllers: [setting_controller_1.SettingsController, favicon_controller_1.FaviconController],
|
|
33
34
|
providers: [setting_service_1.SettingService, brand_asset_service_1.BrandAssetService],
|
|
34
35
|
exports: [setting_service_1.SettingService, brand_asset_service_1.BrandAssetService],
|
|
35
36
|
})
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setting.module.js","sourceRoot":"","sources":["../../src/setting/setting.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,oDAAmD;AACnD,4DAA2D;AAC3D,oDAAmD;AACnD,2CAA4D;AAC5D,qDAAiD;AACjD,qDAAiD;AACjD,+DAA0D;AAC1D,6DAA0D;AAC1D,uDAAmD;AAe5C,IAAM,aAAa,GAAnB,MAAM,aAAa;CAAI,CAAA;AAAjB,sCAAa;wBAAb,aAAa;IAbzB,IAAA,eAAM,GAAE;IACR,IAAA,eAAM,EAAC;QACN,OAAO,EAAE;YACP,IAAA,mBAAU,EAAC,GAAG,EAAE,CAAC,wBAAU,CAAC;YAC5B,IAAA,mBAAU,EAAC,GAAG,EAAE,CAAC,yBAAY,CAAC;YAC9B,IAAA,mBAAU,EAAC,GAAG,EAAE,CAAC,iCAAgB,CAAC;YAClC,IAAA,mBAAU,EAAC,GAAG,EAAE,CAAC,yBAAY,CAAC;YAC9B,IAAA,mBAAU,EAAC,GAAG,EAAE,CAAC,wBAAU,CAAC;SAC7B;QACD,WAAW,EAAE,CAAC,uCAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"setting.module.js","sourceRoot":"","sources":["../../src/setting/setting.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,oDAAmD;AACnD,4DAA2D;AAC3D,oDAAmD;AACnD,2CAA4D;AAC5D,qDAAiD;AACjD,qDAAiD;AACjD,+DAA0D;AAC1D,6DAAyD;AACzD,6DAA0D;AAC1D,uDAAmD;AAe5C,IAAM,aAAa,GAAnB,MAAM,aAAa;CAAI,CAAA;AAAjB,sCAAa;wBAAb,aAAa;IAbzB,IAAA,eAAM,GAAE;IACR,IAAA,eAAM,EAAC;QACN,OAAO,EAAE;YACP,IAAA,mBAAU,EAAC,GAAG,EAAE,CAAC,wBAAU,CAAC;YAC5B,IAAA,mBAAU,EAAC,GAAG,EAAE,CAAC,yBAAY,CAAC;YAC9B,IAAA,mBAAU,EAAC,GAAG,EAAE,CAAC,iCAAgB,CAAC;YAClC,IAAA,mBAAU,EAAC,GAAG,EAAE,CAAC,yBAAY,CAAC;YAC9B,IAAA,mBAAU,EAAC,GAAG,EAAE,CAAC,wBAAU,CAAC;SAC7B;QACD,WAAW,EAAE,CAAC,uCAAkB,EAAE,sCAAiB,CAAC;QACpD,SAAS,EAAE,CAAC,gCAAc,EAAE,uCAAiB,CAAC;QAC9C,OAAO,EAAE,CAAC,gCAAc,EAAE,uCAAiB,CAAC;KAC7C,CAAC;GACW,aAAa,CAAI"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"whatsapp-sender.service.d.ts","sourceRoot":"","sources":["../../src/whatsapp-sender/whatsapp-sender.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EACL,mBAAmB,EAMpB,MAAM,gBAAgB,CAAC;AAKxB,MAAM,MAAM,kBAAkB,GAAG,OAAO,GAAG,OAAO,CAAC;AAEnD,MAAM,MAAM,aAAa,GAAG;IAC1B,mEAAmE;IACnE,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,qFAAqF;IACrF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,CAAC,EAAE,kBAAkB,CAAC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,wEAAwE;IACxE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,+EAA+E;IAC/E,QAAQ,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;CACnE,CAAC;AASF;;;;;GAKG;AACH,qBAAa,iBAAkB,SAAQ,mBAAmB;aAGtC,SAAS,EAAE,OAAO;gBADlC,OAAO,EAAE,MAAM,EACC,SAAS,EAAE,OAAO;CAIrC;AAED;;;;;;GAMG;AACH,qBACa,qBAAqB;IAK9B,OAAO,CAAC,QAAQ,CAAC,MAAM;IAJzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA0C;gBAI9C,MAAM,EAAE,aAAa;IAGlC,IAAI,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAenD,+FAA+F;IACzF,YAAY,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAoB1D;;;;;;;;OAQG;IACG,eAAe,CACnB,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;IAK9D;;;OAGG;IACH,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,GAAE,kBAA4B,GAAG,MAAM;YAsBnE,cAAc;IA0C5B,OAAO,CAAC,mBAAmB;YAUb,iBAAiB;
|
|
1
|
+
{"version":3,"file":"whatsapp-sender.service.d.ts","sourceRoot":"","sources":["../../src/whatsapp-sender/whatsapp-sender.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EACL,mBAAmB,EAMpB,MAAM,gBAAgB,CAAC;AAKxB,MAAM,MAAM,kBAAkB,GAAG,OAAO,GAAG,OAAO,CAAC;AAEnD,MAAM,MAAM,aAAa,GAAG;IAC1B,mEAAmE;IACnE,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,qFAAqF;IACrF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,CAAC,EAAE,kBAAkB,CAAC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,wEAAwE;IACxE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,+EAA+E;IAC/E,QAAQ,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;CACnE,CAAC;AASF;;;;;GAKG;AACH,qBAAa,iBAAkB,SAAQ,mBAAmB;aAGtC,SAAS,EAAE,OAAO;gBADlC,OAAO,EAAE,MAAM,EACC,SAAS,EAAE,OAAO;CAIrC;AAED;;;;;;GAMG;AACH,qBACa,qBAAqB;IAK9B,OAAO,CAAC,QAAQ,CAAC,MAAM;IAJzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA0C;gBAI9C,MAAM,EAAE,aAAa;IAGlC,IAAI,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAenD,+FAA+F;IACzF,YAAY,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAoB1D;;;;;;;;OAQG;IACG,eAAe,CACnB,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;IAK9D;;;OAGG;IACH,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,GAAE,kBAA4B,GAAG,MAAM;YAsBnE,cAAc;IA0C5B,OAAO,CAAC,mBAAmB;YAUb,iBAAiB;YAiEjB,gBAAgB;CAwG/B"}
|
|
@@ -174,9 +174,17 @@ let WhatsappSenderService = WhatsappSenderService_1 = class WhatsappSenderServic
|
|
|
174
174
|
if (!response.ok) {
|
|
175
175
|
const detail = await response.text().catch(() => '');
|
|
176
176
|
if (response.status === 401) {
|
|
177
|
-
throw new
|
|
177
|
+
throw new WhatsappSendError(`Credenciais do WhatsApp inválidas (401). Verifique o token do perfil "${profile.slug}".`, false);
|
|
178
178
|
}
|
|
179
|
-
|
|
179
|
+
// Número sem conta no WhatsApp: a Evolution responde 400 com
|
|
180
|
+
// `exists: false`. É dado do cadastro, não instabilidade — reenviar não
|
|
181
|
+
// muda nada, e o chamador precisa saber disso para não insistir.
|
|
182
|
+
if (isEvolutionNumberMissing(detail)) {
|
|
183
|
+
throw new WhatsappSendError(`O número ${target} não tem WhatsApp (Evolution: exists=false).`, false);
|
|
184
|
+
}
|
|
185
|
+
// Mesmo critério do provider oficial: 4xx é recusa estrutural, 5xx e
|
|
186
|
+
// 429 podem passar numa próxima tentativa.
|
|
187
|
+
throw new WhatsappSendError(`Evolution API recusou o envio (HTTP ${response.status}): ${detail.slice(0, 300)}`, response.status >= 500 || response.status === 429);
|
|
180
188
|
}
|
|
181
189
|
}
|
|
182
190
|
async sendWithOfficial(profile, input) {
|
|
@@ -257,6 +265,21 @@ exports.WhatsappSenderService = WhatsappSenderService = WhatsappSenderService_1
|
|
|
257
265
|
__param(0, (0, common_1.Inject)((0, common_1.forwardRef)(() => api_prisma_1.PrismaService))),
|
|
258
266
|
__metadata("design:paramtypes", [api_prisma_1.PrismaService])
|
|
259
267
|
], WhatsappSenderService);
|
|
268
|
+
/**
|
|
269
|
+
* Reconhece o 400 da Evolution para destino inexistente:
|
|
270
|
+
* `{"response":{"message":[{"exists":false,"number":"55..."}]}}`.
|
|
271
|
+
*/
|
|
272
|
+
function isEvolutionNumberMissing(detail) {
|
|
273
|
+
var _a, _b;
|
|
274
|
+
try {
|
|
275
|
+
const messages = (_b = (_a = JSON.parse(detail)) === null || _a === void 0 ? void 0 : _a.response) === null || _b === void 0 ? void 0 : _b.message;
|
|
276
|
+
return (Array.isArray(messages) &&
|
|
277
|
+
messages.some((item) => item && typeof item === 'object' && item.exists === false));
|
|
278
|
+
}
|
|
279
|
+
catch (_c) {
|
|
280
|
+
return false;
|
|
281
|
+
}
|
|
282
|
+
}
|
|
260
283
|
/** Evolution espera base64 puro; um data URL vindo do chamador quebraria o envio. */
|
|
261
284
|
function stripDataUrlPrefix(image) {
|
|
262
285
|
const match = /^data:[^;]+;base64,(.*)$/i.exec(image);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"whatsapp-sender.service.js","sourceRoot":"","sources":["../../src/whatsapp-sender/whatsapp-sender.service.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"whatsapp-sender.service.js","sourceRoot":"","sources":["../../src/whatsapp-sender/whatsapp-sender.service.ts"],"names":[],"mappings":"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"}
|