whale-code 6.5.8 → 6.5.10

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.
Files changed (101) hide show
  1. package/dist/cli/services/agent-loop.js +26 -2
  2. package/dist/cli/services/agent-loop.js.map +1 -1
  3. package/dist/cli/services/config-store.js +2 -3
  4. package/dist/cli/services/config-store.js.map +1 -1
  5. package/dist/cli/services/hooks.js +2 -1
  6. package/dist/cli/services/hooks.js.map +1 -1
  7. package/dist/cli/services/telemetry-spans.js +1 -0
  8. package/dist/cli/services/telemetry-spans.js.map +1 -1
  9. package/dist/cli/services/telemetry.d.ts +23 -0
  10. package/dist/cli/services/telemetry.js +45 -1
  11. package/dist/cli/services/telemetry.js.map +1 -1
  12. package/dist/server/handlers/__test-utils__/test-db.d.ts +17 -3
  13. package/dist/server/handlers/__test-utils__/test-db.js +113 -14
  14. package/dist/server/handlers/__test-utils__/test-db.js.map +1 -1
  15. package/dist/server/handlers/affiliates.d.ts +9 -0
  16. package/dist/server/handlers/affiliates.js +197 -0
  17. package/dist/server/handlers/affiliates.js.map +1 -0
  18. package/dist/server/handlers/api-docs.d.ts +4 -2
  19. package/dist/server/handlers/api-docs.js +204 -1681
  20. package/dist/server/handlers/api-docs.js.map +1 -1
  21. package/dist/server/handlers/campaigns.d.ts +9 -0
  22. package/dist/server/handlers/campaigns.js +237 -0
  23. package/dist/server/handlers/campaigns.js.map +1 -0
  24. package/dist/server/handlers/catalog-schemas.js +9 -9
  25. package/dist/server/handlers/catalog-schemas.js.map +1 -1
  26. package/dist/server/handlers/catalog.js +1 -1
  27. package/dist/server/handlers/catalog.js.map +1 -1
  28. package/dist/server/handlers/comms-documents.js +28 -2
  29. package/dist/server/handlers/comms-documents.js.map +1 -1
  30. package/dist/server/handlers/comms-pdf-generation.js +25 -3
  31. package/dist/server/handlers/comms-pdf-generation.js.map +1 -1
  32. package/dist/server/handlers/comms-pdf-helpers.js +4 -4
  33. package/dist/server/handlers/comms-pdf-helpers.js.map +1 -1
  34. package/dist/server/handlers/comms.d.ts +100 -0
  35. package/dist/server/handlers/comms.js +146 -12
  36. package/dist/server/handlers/comms.js.map +1 -1
  37. package/dist/server/handlers/coupons.d.ts +9 -0
  38. package/dist/server/handlers/coupons.js +220 -0
  39. package/dist/server/handlers/coupons.js.map +1 -0
  40. package/dist/server/handlers/embeddings.js +1 -1
  41. package/dist/server/handlers/embeddings.js.map +1 -1
  42. package/dist/server/handlers/enrichment.js +2 -622
  43. package/dist/server/handlers/enrichment.js.map +1 -1
  44. package/dist/server/handlers/fulfillment.d.ts +9 -0
  45. package/dist/server/handlers/fulfillment.js +209 -0
  46. package/dist/server/handlers/fulfillment.js.map +1 -0
  47. package/dist/server/handlers/google-ads.d.ts +24 -0
  48. package/dist/server/handlers/google-ads.js +2199 -0
  49. package/dist/server/handlers/google-ads.js.map +1 -0
  50. package/dist/server/handlers/invoices.d.ts +9 -0
  51. package/dist/server/handlers/invoices.js +252 -0
  52. package/dist/server/handlers/invoices.js.map +1 -0
  53. package/dist/server/handlers/loyalty.d.ts +9 -0
  54. package/dist/server/handlers/loyalty.js +197 -0
  55. package/dist/server/handlers/loyalty.js.map +1 -0
  56. package/dist/server/handlers/meta-ads-graph-api.js +18 -3
  57. package/dist/server/handlers/meta-ads-graph-api.js.map +1 -1
  58. package/dist/server/handlers/phone.d.ts +9 -0
  59. package/dist/server/handlers/phone.js +197 -0
  60. package/dist/server/handlers/phone.js.map +1 -0
  61. package/dist/server/handlers/pipeline.d.ts +9 -0
  62. package/dist/server/handlers/pipeline.js +277 -0
  63. package/dist/server/handlers/pipeline.js.map +1 -0
  64. package/dist/server/handlers/qr-codes.d.ts +9 -0
  65. package/dist/server/handlers/qr-codes.js +198 -0
  66. package/dist/server/handlers/qr-codes.js.map +1 -0
  67. package/dist/server/handlers/reviews.d.ts +9 -0
  68. package/dist/server/handlers/reviews.js +171 -0
  69. package/dist/server/handlers/reviews.js.map +1 -0
  70. package/dist/server/handlers/segments.d.ts +9 -0
  71. package/dist/server/handlers/segments.js +229 -0
  72. package/dist/server/handlers/segments.js.map +1 -0
  73. package/dist/server/handlers/social.d.ts +9 -0
  74. package/dist/server/handlers/social.js +81 -0
  75. package/dist/server/handlers/social.js.map +1 -0
  76. package/dist/server/handlers/tax.d.ts +9 -0
  77. package/dist/server/handlers/tax.js +182 -0
  78. package/dist/server/handlers/tax.js.map +1 -0
  79. package/dist/server/handlers/wallet.d.ts +9 -0
  80. package/dist/server/handlers/wallet.js +203 -0
  81. package/dist/server/handlers/wallet.js.map +1 -0
  82. package/dist/server/handlers/webhooks-mgmt.d.ts +9 -0
  83. package/dist/server/handlers/webhooks-mgmt.js +181 -0
  84. package/dist/server/handlers/webhooks-mgmt.js.map +1 -0
  85. package/dist/server/handlers/wholesale.d.ts +9 -0
  86. package/dist/server/handlers/wholesale.js +219 -0
  87. package/dist/server/handlers/wholesale.js.map +1 -0
  88. package/dist/server/index.js +20 -9
  89. package/dist/server/index.js.map +1 -1
  90. package/dist/server/lib/clickhouse-buffer.js +1 -0
  91. package/dist/server/lib/clickhouse-buffer.js.map +1 -1
  92. package/dist/server/lib/coa-renderer.d.ts +1 -1
  93. package/dist/server/lib/coa-renderer.js +32 -10
  94. package/dist/server/lib/coa-renderer.js.map +1 -1
  95. package/dist/server/server-worker.d.ts +1 -0
  96. package/dist/server/server-worker.js +464 -3
  97. package/dist/server/server-worker.js.map +1 -1
  98. package/dist/server/tool-router.js +118 -4
  99. package/dist/server/tool-router.js.map +1 -1
  100. package/package.json +26 -3
  101. package/vendor/ink/package.json +0 -2
@@ -1 +1 @@
1
- {"version":3,"file":"comms-documents.js","names":["sanitizeFilterValue","escapeCSV","fillTemplate","renderHtmlToPdf","generateThumbnail","handleDocumentsAdvanced","handleDocumentsCrud","sb","args","storeId","handleDocuments","sid","action","docType","document_type","name","success","error","extMap","csv","json","text","markdown","html","pdf","mimeMap","ext","mime","safeName","replace","fileName","Date","now","storagePath","uploadBuffer","htmlContent","content","pdfBuffer","format","landscape","Uint8Array","err","Error","message","String","headers","rows","lines","map","join","row","Array","isArray","push","h","jsonData","data","JSON","stringify","TextEncoder","encode","uploadErr","storage","from","upload","contentType","upsert","urlData","getPublicUrl","fileUrl","publicUrl","sizeBytes","length","record","insertErr","insert","store_id","file_name","file_url","file_size","file_type","document_name","source_name","document_date","toISOString","split","metadata","size_bytes","select","single","endsWith","id","catch","type","url","size","query","eq","sn","ilike","order","ascending","limit","count","documents","d","reference","reference_number","created","created_at","confirm","delete","deleted","description","schema","template_id","or","templates","t","fields","templateId","template","tErr","tData","date","docName","template_name","from_template","stores","profiles","p","category","sample_type","has_config","Object","keys","config"],"sources":["../../../src/server/handlers/comms-documents.ts"],"sourcesContent":["// comms-documents.ts — Document CRUD handler (create, find, delete, templates, bulk_generate)\nimport type { SupabaseClient } from \"@supabase/supabase-js\";\nimport { sanitizeFilterValue, escapeCSV, fillTemplate } from \"../lib/utils.js\";\nimport { renderHtmlToPdf } from \"../lib/react-pdf-layout.js\";\nimport { generateThumbnail } from \"./comms-shared.js\";\nimport { handleDocumentsAdvanced } from \"./comms-documents-advanced.js\";\n\ntype HandlerResult = { success: boolean; data?: unknown; error?: string };\n\nexport async function handleDocumentsCrud(\n sb: SupabaseClient, args: Record<string, unknown>, storeId: string,\n /** Reference to the full handleDocuments for recursive calls */\n handleDocuments: (sb: SupabaseClient, args: Record<string, unknown>, storeId?: string) => Promise<HandlerResult>,\n): Promise<HandlerResult> {\n const sid = storeId;\n const action = args.action as string;\n\n switch (action) {\n case \"create\": {\n const docType = (args.document_type as string) || \"text\";\n const name = args.name as string;\n if (!name) return { success: false, error: \"name is required\" };\n\n const extMap: Record<string, string> = { csv: \"csv\", json: \"json\", text: \"txt\", markdown: \"md\", html: \"html\", pdf: \"pdf\" };\n const mimeMap: Record<string, string> = {\n csv: \"text/csv\", json: \"application/json\", text: \"text/plain\",\n markdown: \"text/markdown\", html: \"text/html\", pdf: \"application/pdf\",\n };\n const ext = extMap[docType] || \"txt\";\n const mime = mimeMap[docType] || \"text/plain\";\n const safeName = name.replace(/[^a-zA-Z0-9_\\-]/g, \"_\");\n const fileName = `${safeName}_${Date.now()}.${ext}`;\n const storagePath = `${sid}/${fileName}`;\n\n let uploadBuffer: Uint8Array;\n\n if (docType === \"pdf\") {\n const htmlContent = (args.html as string) || (args.content as string);\n if (!htmlContent) return { success: false, error: \"html or content (HTML string) is required for PDF documents\" };\n try {\n const pdfBuffer = await renderHtmlToPdf(htmlContent, {\n format: (args.format as string) || \"A4\",\n landscape: (args.landscape as boolean) || false,\n });\n uploadBuffer = new Uint8Array(pdfBuffer);\n } catch (err) {\n return { success: false, error: `PDF generation failed: ${err instanceof Error ? err.message : String(err)}` };\n }\n } else {\n let content: string;\n if (docType === \"csv\") {\n const headers = args.headers as string[];\n const rows = args.rows as unknown[][];\n if (!headers || !rows) return { success: false, error: \"headers and rows required for CSV\" };\n const lines = [headers.map(escapeCSV).join(\",\")];\n for (const row of rows) {\n if (Array.isArray(row)) {\n lines.push(row.map(escapeCSV).join(\",\"));\n } else {\n lines.push(headers.map(h => escapeCSV((row as Record<string, unknown>)[h])).join(\",\"));\n }\n }\n content = lines.join(\"\\n\");\n } else if (docType === \"json\") {\n const jsonData = args.data || args.content;\n content = typeof jsonData === \"string\" ? jsonData : JSON.stringify(jsonData, null, 2);\n } else {\n content = (args.content as string) || \"\";\n }\n uploadBuffer = new TextEncoder().encode(content);\n }\n\n const { error: uploadErr } = await sb.storage\n .from(\"documents\")\n .upload(storagePath, uploadBuffer, { contentType: mime, upsert: true });\n if (uploadErr) return { success: false, error: `Upload failed: ${uploadErr.message}` };\n\n const { data: urlData } = sb.storage.from(\"documents\").getPublicUrl(storagePath);\n const fileUrl = urlData.publicUrl;\n const sizeBytes = uploadBuffer.length;\n\n const { data: record, error: insertErr } = await sb.from(\"store_documents\").insert({\n store_id: sid,\n document_type: docType,\n file_name: fileName,\n file_url: fileUrl,\n file_size: sizeBytes,\n file_type: mime,\n document_name: name,\n source_name: \"Documents Edge Function\",\n document_date: new Date().toISOString().split(\"T\")[0],\n data: { document_type: docType },\n metadata: { size_bytes: sizeBytes },\n }).select(\"id, document_name, file_url, created_at\").single();\n\n if (insertErr) return { success: false, error: insertErr.message };\n if (fileUrl.endsWith('.pdf')) await generateThumbnail(sb, record.id, fileUrl).catch(() => {});\n return { success: true, data: { id: record.id, name: record.document_name, type: docType, url: record.file_url, file_name: fileName, size: sizeBytes } };\n }\n\n case \"find\": {\n let query = sb.from(\"store_documents\")\n .select(\"id, document_type, document_name, reference_number, file_url, file_type, file_size, created_at, metadata\");\n query = query.eq(\"store_id\", sid);\n if (args.document_type) query = query.eq(\"document_type\", args.document_type as string);\n if (args.name) { const sn = sanitizeFilterValue(args.name as string); query = query.ilike(\"document_name\", `%${sn}%`); }\n query = query.order(\"created_at\", { ascending: false }).limit(args.limit as number || 50);\n\n const { data, error } = await query;\n if (error) return { success: false, error: error.message };\n return {\n success: true,\n data: {\n count: data?.length || 0,\n documents: (data || []).map(d => ({\n id: d.id, type: d.document_type, name: d.document_name,\n reference: d.reference_number, url: d.file_url,\n size: d.file_size, created: d.created_at,\n })),\n },\n };\n }\n\n case \"delete\": {\n if (!args.confirm) return { success: false, error: \"Set confirm: true to delete\" };\n let query = sb.from(\"store_documents\").delete().eq(\"store_id\", sid);\n if (args.document_type) query = query.eq(\"document_type\", args.document_type as string);\n if (args.name) { const sn = sanitizeFilterValue(args.name as string); query = query.ilike(\"document_name\", `%${sn}%`); }\n const { data, error } = await query.select(\"id\");\n if (error) return { success: false, error: error.message };\n return { success: true, data: { deleted: data?.length || 0 } };\n }\n\n case \"create_template\": {\n if (!args.name) return { success: false, error: \"name is required\" };\n if (!args.document_type) return { success: false, error: \"document_type is required\" };\n const { data, error } = await sb.from(\"document_templates\").insert({\n store_id: sid || null,\n name: args.name as string,\n description: (args.description as string) || null,\n document_type: args.document_type as string,\n content: (args.content as string) || null,\n headers: (args.headers as string[]) || null,\n schema: (args.schema as unknown[]) || [],\n metadata: (args.data as Record<string, unknown>) || {},\n }).select(\"id, name, document_type, created_at\").single();\n if (error) return { success: false, error: error.message };\n return { success: true, data: { template_id: data.id, name: data.name, type: data.document_type } };\n }\n\n case \"list_templates\": {\n let query = sb.from(\"document_templates\")\n .select(\"id, name, description, document_type, headers, schema, created_at\")\n .eq(\"is_active\", true);\n if (sid) query = query.or(`store_id.eq.${sid},store_id.is.null`);\n if (args.document_type) query = query.eq(\"document_type\", args.document_type as string);\n if (args.limit) query = query.limit(args.limit as number);\n query = query.order(\"created_at\", { ascending: false });\n\n const { data, error } = await query;\n if (error) return { success: false, error: error.message };\n return {\n success: true,\n data: {\n count: data?.length || 0,\n templates: (data || []).map(t => ({\n id: t.id, name: t.name, description: t.description,\n type: t.document_type, headers: t.headers,\n fields: (t.schema as unknown[])?.length || 0,\n })),\n },\n };\n }\n\n case \"from_template\": {\n const templateId = args.template_id as string;\n if (!templateId) return { success: false, error: \"template_id is required\" };\n\n const { data: template, error: tErr } = await sb.from(\"document_templates\")\n .select(\"*\").eq(\"id\", templateId).or(`store_id.eq.${sid},store_id.is.null`).single();\n if (tErr || !template) return { success: false, error: \"Template not found\" };\n\n const tData = { ...(template.metadata as Record<string, unknown>), ...(args.data as Record<string, unknown> || {}), date: new Date().toISOString().split(\"T\")[0] };\n const docType = template.document_type as string;\n const docName = (args.name as string) || fillTemplate(template.name, tData);\n\n let content: string;\n if (docType === \"csv\") {\n const headers = template.headers as string[] || [];\n const rows = args.rows as unknown[][];\n if (!rows) return { success: false, error: \"rows required for CSV template\" };\n const lines = [headers.map(escapeCSV).join(\",\")];\n for (const row of rows) {\n if (Array.isArray(row)) lines.push(row.map(escapeCSV).join(\",\"));\n else lines.push(headers.map(h => escapeCSV((row as Record<string, unknown>)[h])).join(\",\"));\n }\n content = lines.join(\"\\n\");\n } else if (docType === \"json\") {\n content = template.content ? fillTemplate(template.content as string, tData) : JSON.stringify(tData, null, 2);\n } else {\n content = template.content ? fillTemplate(template.content as string, tData) : \"\";\n }\n\n const extMap: Record<string, string> = { csv: \"csv\", json: \"json\", text: \"txt\", markdown: \"md\", html: \"html\" };\n const mimeMap: Record<string, string> = {\n csv: \"text/csv\", json: \"application/json\", text: \"text/plain\",\n markdown: \"text/markdown\", html: \"text/html\",\n };\n const ext = extMap[docType] || \"txt\";\n const mime = mimeMap[docType] || \"text/plain\";\n const safeName = docName.replace(/[^a-zA-Z0-9_\\-]/g, \"_\");\n const fileName = `${safeName}_${Date.now()}.${ext}`;\n const storagePath = `${sid}/${fileName}`;\n\n const { error: uploadErr } = await sb.storage\n .from(\"documents\")\n .upload(storagePath, new TextEncoder().encode(content), { contentType: mime, upsert: true });\n if (uploadErr) return { success: false, error: `Upload failed: ${uploadErr.message}` };\n\n const { data: urlData } = sb.storage.from(\"documents\").getPublicUrl(storagePath);\n const sizeBytes = new TextEncoder().encode(content).length;\n\n const { data: record, error: insertErr } = await sb.from(\"store_documents\").insert({\n store_id: sid,\n document_type: docType,\n file_name: fileName,\n file_url: urlData.publicUrl,\n file_size: sizeBytes,\n file_type: mime,\n document_name: docName,\n source_name: \"Documents Edge Function\",\n document_date: new Date().toISOString().split(\"T\")[0],\n data: { template_id: template.id, template_name: template.name },\n metadata: { size_bytes: sizeBytes, from_template: true },\n }).select(\"id, document_name, file_url, created_at\").single();\n\n if (insertErr) return { success: false, error: insertErr.message };\n if (urlData.publicUrl.endsWith('.pdf')) await generateThumbnail(sb, record.id, urlData.publicUrl).catch(() => {});\n return { success: true, data: { id: record.id, name: record.document_name, type: docType, template: template.name, url: record.file_url, size: sizeBytes } };\n }\n\n case \"list_stores\": {\n const { data, error } = await sb.from(\"stores\")\n .select(\"id, store_name, slug, status, created_at\")\n .eq(\"id\", sid)\n .order(\"store_name\");\n if (error) return { success: false, error: error.message };\n return { success: true, data: { count: data?.length || 0, stores: data } };\n }\n\n case \"list_profiles\": {\n const { data, error } = await sb.from(\"document_profiles\")\n .select(\"id, name, category, sample_type, config, template_id, is_active, created_at\")\n .eq(\"is_active\", true)\n .eq(\"owner_store_id\", sid)\n .order(\"name\");\n if (error) return { success: false, error: error.message };\n return {\n success: true,\n data: {\n count: data?.length || 0,\n profiles: (data || []).map(p => ({\n id: p.id, name: p.name, category: p.category,\n sample_type: p.sample_type, template_id: p.template_id,\n has_config: Object.keys((p.config as object) || {}).length > 0,\n })),\n },\n };\n }\n\n case \"generate\": {\n const templateId = args.template_id as string;\n if (!templateId) return { success: false, error: \"template_id is required. Use list_profiles to find available templates.\" };\n return handleDocuments(sb, { ...args, action: \"from_template\" }, storeId);\n }\n\n case \"bulk_generate\":\n case \"deliver_documents\":\n case \"list_customer_documents\":\n return handleDocumentsAdvanced(sb, args, storeId, handleDocuments) as any;\n\n default:\n return null as any; // handled by caller\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"comms-documents.js","names":["sanitizeFilterValue","escapeCSV","fillTemplate","renderHtmlToPdf","generateThumbnail","handleDocumentsAdvanced","handleDocumentsCrud","sb","args","storeId","handleDocuments","sid","action","docType","document_type","name","success","error","extMap","csv","json","text","markdown","html","pdf","mimeMap","ext","mime","safeName","replace","fileName","Date","now","storagePath","uploadBuffer","htmlContent","content","pdfBuffer","format","landscape","Uint8Array","err","Error","message","String","headers","rows","lines","map","join","row","Array","isArray","push","h","jsonData","data","JSON","stringify","TextEncoder","encode","uploadErr","storage","from","upload","contentType","upsert","urlData","getPublicUrl","fileUrl","publicUrl","sizeBytes","length","record","insertErr","insert","store_id","file_name","file_url","file_size","file_type","document_name","source_name","document_date","toISOString","split","metadata","size_bytes","select","single","endsWith","id","catch","type","url","size","query","eq","sn","ilike","order","ascending","limit","count","documents","d","reference","reference_number","created","created_at","force","confirm","docId","delete","deleted","description","schema","template_id","or","templates","t","fields","templateId","template","tErr","tData","date","docName","template_name","from_template","stores","profiles","p","category","sample_type","has_config","Object","keys","config"],"sources":["../../../src/server/handlers/comms-documents.ts"],"sourcesContent":["// comms-documents.ts — Document CRUD handler (create, find, delete, templates, bulk_generate)\nimport type { SupabaseClient } from \"@supabase/supabase-js\";\nimport { sanitizeFilterValue, escapeCSV, fillTemplate } from \"../lib/utils.js\";\nimport { renderHtmlToPdf } from \"../lib/react-pdf-layout.js\";\nimport { generateThumbnail } from \"./comms-shared.js\";\nimport { handleDocumentsAdvanced } from \"./comms-documents-advanced.js\";\n\ntype HandlerResult = { success: boolean; data?: unknown; error?: string };\n\nexport async function handleDocumentsCrud(\n sb: SupabaseClient, args: Record<string, unknown>, storeId: string,\n /** Reference to the full handleDocuments for recursive calls */\n handleDocuments: (sb: SupabaseClient, args: Record<string, unknown>, storeId?: string) => Promise<HandlerResult>,\n): Promise<HandlerResult> {\n const sid = storeId;\n const action = args.action as string;\n\n switch (action) {\n case \"create\": {\n const docType = (args.document_type as string) || \"text\";\n const name = args.name as string;\n if (!name) return { success: false, error: \"name is required\" };\n\n const extMap: Record<string, string> = { csv: \"csv\", json: \"json\", text: \"txt\", markdown: \"md\", html: \"html\", pdf: \"pdf\" };\n const mimeMap: Record<string, string> = {\n csv: \"text/csv\", json: \"application/json\", text: \"text/plain\",\n markdown: \"text/markdown\", html: \"text/html\", pdf: \"application/pdf\",\n };\n const ext = extMap[docType] || \"txt\";\n const mime = mimeMap[docType] || \"text/plain\";\n const safeName = name.replace(/[^a-zA-Z0-9_\\-]/g, \"_\");\n const fileName = `${safeName}_${Date.now()}.${ext}`;\n const storagePath = `${sid}/${fileName}`;\n\n let uploadBuffer: Uint8Array;\n\n if (docType === \"pdf\") {\n const htmlContent = (args.html as string) || (args.content as string);\n if (!htmlContent) return { success: false, error: \"html or content (HTML string) is required for PDF documents\" };\n try {\n const pdfBuffer = await renderHtmlToPdf(htmlContent, {\n format: (args.format as string) || \"A4\",\n landscape: (args.landscape as boolean) || false,\n });\n uploadBuffer = new Uint8Array(pdfBuffer);\n } catch (err) {\n return { success: false, error: `PDF generation failed: ${err instanceof Error ? err.message : String(err)}` };\n }\n } else {\n let content: string;\n if (docType === \"csv\") {\n const headers = args.headers as string[];\n const rows = args.rows as unknown[][];\n if (!headers || !rows) return { success: false, error: \"headers and rows required for CSV\" };\n const lines = [headers.map(escapeCSV).join(\",\")];\n for (const row of rows) {\n if (Array.isArray(row)) {\n lines.push(row.map(escapeCSV).join(\",\"));\n } else {\n lines.push(headers.map(h => escapeCSV((row as Record<string, unknown>)[h])).join(\",\"));\n }\n }\n content = lines.join(\"\\n\");\n } else if (docType === \"json\") {\n const jsonData = args.data || args.content;\n content = typeof jsonData === \"string\" ? jsonData : JSON.stringify(jsonData, null, 2);\n } else {\n content = (args.content as string) || \"\";\n }\n uploadBuffer = new TextEncoder().encode(content);\n }\n\n const { error: uploadErr } = await sb.storage\n .from(\"documents\")\n .upload(storagePath, uploadBuffer, { contentType: mime, upsert: true });\n if (uploadErr) return { success: false, error: `Upload failed: ${uploadErr.message}` };\n\n const { data: urlData } = sb.storage.from(\"documents\").getPublicUrl(storagePath);\n const fileUrl = urlData.publicUrl;\n const sizeBytes = uploadBuffer.length;\n\n const { data: record, error: insertErr } = await sb.from(\"store_documents\").insert({\n store_id: sid,\n document_type: docType,\n file_name: fileName,\n file_url: fileUrl,\n file_size: sizeBytes,\n file_type: mime,\n document_name: name,\n source_name: \"Documents Edge Function\",\n document_date: new Date().toISOString().split(\"T\")[0],\n data: { document_type: docType },\n metadata: { size_bytes: sizeBytes },\n }).select(\"id, document_name, file_url, created_at\").single();\n\n if (insertErr) return { success: false, error: insertErr.message };\n if (fileUrl.endsWith('.pdf')) await generateThumbnail(sb, record.id, fileUrl).catch(() => {});\n return { success: true, data: { id: record.id, name: record.document_name, type: docType, url: record.file_url, file_name: fileName, size: sizeBytes } };\n }\n\n case \"find\": {\n let query = sb.from(\"store_documents\")\n .select(\"id, document_type, document_name, reference_number, file_url, file_type, file_size, created_at, metadata\");\n query = query.eq(\"store_id\", sid);\n if (args.document_type) query = query.eq(\"document_type\", args.document_type as string);\n if (args.name) { const sn = sanitizeFilterValue(args.name as string); query = query.ilike(\"document_name\", `%${sn}%`); }\n query = query.order(\"created_at\", { ascending: false }).limit(args.limit as number || 50);\n\n const { data, error } = await query;\n if (error) return { success: false, error: error.message };\n return {\n success: true,\n data: {\n count: data?.length || 0,\n documents: (data || []).map(d => ({\n id: d.id, type: d.document_type, name: d.document_name,\n reference: d.reference_number, url: d.file_url,\n size: d.file_size, created: d.created_at,\n })),\n },\n };\n }\n\n case \"delete\": {\n if (!args.force && !args.confirm) return { success: false, error: \"Set force: true to confirm deletion\" };\n\n // Single document delete by ID (preferred)\n if (args.query) {\n const docId = args.query as string;\n const { data, error } = await sb.from(\"store_documents\")\n .delete()\n .eq(\"id\", docId)\n .eq(\"store_id\", sid)\n .select(\"id\");\n if (error) return { success: false, error: error.message };\n if (!data?.length) return { success: false, error: \"Document not found or does not belong to this store\" };\n return { success: true, data: { deleted: 1, id: docId } };\n }\n\n // Bulk delete by filters\n let query = sb.from(\"store_documents\").delete().eq(\"store_id\", sid);\n if (args.document_type) query = query.eq(\"document_type\", args.document_type as string);\n if (args.name) { const sn = sanitizeFilterValue(args.name as string); query = query.ilike(\"document_name\", `%${sn}%`); }\n const { data, error } = await query.select(\"id\");\n if (error) return { success: false, error: error.message };\n return { success: true, data: { deleted: data?.length || 0 } };\n }\n\n case \"create_template\": {\n if (!args.name) return { success: false, error: \"name is required\" };\n if (!args.document_type) return { success: false, error: \"document_type is required\" };\n const { data, error } = await sb.from(\"document_templates\").insert({\n store_id: sid || null,\n name: args.name as string,\n description: (args.description as string) || null,\n document_type: args.document_type as string,\n content: (args.content as string) || null,\n headers: (args.headers as string[]) || null,\n schema: (args.schema as unknown[]) || [],\n metadata: (args.data as Record<string, unknown>) || {},\n }).select(\"id, name, document_type, created_at\").single();\n if (error) return { success: false, error: error.message };\n return { success: true, data: { template_id: data.id, name: data.name, type: data.document_type } };\n }\n\n case \"list_templates\": {\n let query = sb.from(\"document_templates\")\n .select(\"id, name, description, document_type, headers, schema, created_at\")\n .eq(\"is_active\", true);\n if (sid) query = query.or(`store_id.eq.${sid},store_id.is.null`);\n if (args.document_type) query = query.eq(\"document_type\", args.document_type as string);\n if (args.limit) query = query.limit(args.limit as number);\n query = query.order(\"created_at\", { ascending: false });\n\n const { data, error } = await query;\n if (error) return { success: false, error: error.message };\n return {\n success: true,\n data: {\n count: data?.length || 0,\n templates: (data || []).map(t => ({\n id: t.id, name: t.name, description: t.description,\n type: t.document_type, headers: t.headers,\n fields: (t.schema as unknown[])?.length || 0,\n })),\n },\n };\n }\n\n case \"from_template\": {\n const templateId = args.template_id as string;\n if (!templateId) return { success: false, error: \"template_id is required\" };\n\n const { data: template, error: tErr } = await sb.from(\"document_templates\")\n .select(\"*\").eq(\"id\", templateId).or(`store_id.eq.${sid},store_id.is.null`).single();\n if (tErr || !template) return { success: false, error: \"Template not found\" };\n\n const tData = { ...(template.metadata as Record<string, unknown>), ...(args.data as Record<string, unknown> || {}), date: new Date().toISOString().split(\"T\")[0] };\n const docType = template.document_type as string;\n const docName = (args.name as string) || fillTemplate(template.name, tData);\n\n let content: string;\n if (docType === \"csv\") {\n const headers = template.headers as string[] || [];\n const rows = args.rows as unknown[][];\n if (!rows) return { success: false, error: \"rows required for CSV template\" };\n const lines = [headers.map(escapeCSV).join(\",\")];\n for (const row of rows) {\n if (Array.isArray(row)) lines.push(row.map(escapeCSV).join(\",\"));\n else lines.push(headers.map(h => escapeCSV((row as Record<string, unknown>)[h])).join(\",\"));\n }\n content = lines.join(\"\\n\");\n } else if (docType === \"json\") {\n content = template.content ? fillTemplate(template.content as string, tData) : JSON.stringify(tData, null, 2);\n } else {\n content = template.content ? fillTemplate(template.content as string, tData) : \"\";\n }\n\n const extMap: Record<string, string> = { csv: \"csv\", json: \"json\", text: \"txt\", markdown: \"md\", html: \"html\" };\n const mimeMap: Record<string, string> = {\n csv: \"text/csv\", json: \"application/json\", text: \"text/plain\",\n markdown: \"text/markdown\", html: \"text/html\",\n };\n const ext = extMap[docType] || \"txt\";\n const mime = mimeMap[docType] || \"text/plain\";\n const safeName = docName.replace(/[^a-zA-Z0-9_\\-]/g, \"_\");\n const fileName = `${safeName}_${Date.now()}.${ext}`;\n const storagePath = `${sid}/${fileName}`;\n\n const { error: uploadErr } = await sb.storage\n .from(\"documents\")\n .upload(storagePath, new TextEncoder().encode(content), { contentType: mime, upsert: true });\n if (uploadErr) return { success: false, error: `Upload failed: ${uploadErr.message}` };\n\n const { data: urlData } = sb.storage.from(\"documents\").getPublicUrl(storagePath);\n const sizeBytes = new TextEncoder().encode(content).length;\n\n const { data: record, error: insertErr } = await sb.from(\"store_documents\").insert({\n store_id: sid,\n document_type: docType,\n file_name: fileName,\n file_url: urlData.publicUrl,\n file_size: sizeBytes,\n file_type: mime,\n document_name: docName,\n source_name: \"Documents Edge Function\",\n document_date: new Date().toISOString().split(\"T\")[0],\n data: { template_id: template.id, template_name: template.name },\n metadata: { size_bytes: sizeBytes, from_template: true },\n }).select(\"id, document_name, file_url, created_at\").single();\n\n if (insertErr) return { success: false, error: insertErr.message };\n if (urlData.publicUrl.endsWith('.pdf')) await generateThumbnail(sb, record.id, urlData.publicUrl).catch(() => {});\n return { success: true, data: { id: record.id, name: record.document_name, type: docType, template: template.name, url: record.file_url, size: sizeBytes } };\n }\n\n case \"list_stores\": {\n const { data, error } = await sb.from(\"stores\")\n .select(\"id, store_name, slug, status, created_at\")\n .eq(\"id\", sid)\n .order(\"store_name\");\n if (error) return { success: false, error: error.message };\n return { success: true, data: { count: data?.length || 0, stores: data } };\n }\n\n case \"list_profiles\": {\n const { data, error } = await sb.from(\"document_profiles\")\n .select(\"id, name, category, sample_type, config, template_id, is_active, created_at\")\n .eq(\"is_active\", true)\n .eq(\"owner_store_id\", sid)\n .order(\"name\");\n if (error) return { success: false, error: error.message };\n return {\n success: true,\n data: {\n count: data?.length || 0,\n profiles: (data || []).map(p => ({\n id: p.id, name: p.name, category: p.category,\n sample_type: p.sample_type, template_id: p.template_id,\n has_config: Object.keys((p.config as object) || {}).length > 0,\n })),\n },\n };\n }\n\n case \"generate\": {\n const templateId = args.template_id as string;\n if (!templateId) return { success: false, error: \"template_id is required. Use list_profiles to find available templates.\" };\n return handleDocuments(sb, { ...args, action: \"from_template\" }, storeId);\n }\n\n case \"bulk_generate\":\n case \"deliver_documents\":\n case \"list_customer_documents\":\n return handleDocumentsAdvanced(sb, args, storeId, handleDocuments) as any;\n\n default:\n return null as any; // handled by caller\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -55,15 +55,30 @@ export async function handlePdfGeneration(sb, args, storeId) {
55
55
  cannabinoids: _cfgRanges,
56
56
  ...profileDataOnly
57
57
  } = profileConfig;
58
+ const rawOverrides = args.data || {};
59
+ // Normalize common field name aliases to what the COA renderer expects
60
+ const userOverrides = {
61
+ ...rawOverrides
62
+ };
63
+ if (userOverrides.dateCompleted && !userOverrides.dateTested) {
64
+ userOverrides.dateTested = userOverrides.dateCompleted;
65
+ delete userOverrides.dateCompleted;
66
+ }
67
+ if (userOverrides.clientLicense && !userOverrides.licenseNumber) {
68
+ userOverrides.licenseNumber = userOverrides.clientLicense;
69
+ delete userOverrides.clientLicense;
70
+ }
58
71
  let mergedData = {
59
72
  ...mergedConstants,
60
73
  ...profileDataOnly,
61
74
  ...profileClientData,
62
75
  ...clientData,
63
- ...(args.data || {}),
76
+ ...userOverrides,
64
77
  date: new Date().toISOString().slice(0, 10),
65
78
  approvalDate: new Date().toISOString().slice(0, 10)
66
79
  };
80
+ // Track if user explicitly set sampleName (so productName doesn't clobber it)
81
+ if (userOverrides.sampleName) mergedData._sampleNameExplicit = true;
67
82
 
68
83
  // 5. Apply generation rules
69
84
  mergedData = applyGenerationRules(tpl.generation_rules, mergedData);
@@ -143,10 +158,16 @@ export async function handlePdfGeneration(sb, args, storeId) {
143
158
  mergedData.testsBatch = true;
144
159
  }
145
160
 
146
- // 7c. Generate QR code
161
+ // 7c. Resolve product name: productName override → sampleName from profile
162
+ if (mergedData.productName && !mergedData._sampleNameExplicit) {
163
+ mergedData.sampleName = mergedData.productName;
164
+ }
165
+
166
+ // 7d. Generate QR code
147
167
  if (tpl.slug?.startsWith("cannabis-coa") && !mergedData.qrCodeDataUrl) {
148
168
  const productSlug = (mergedData.sampleName || "certificate").toLowerCase().replace(/[^a-z0-9]+/g, "_").replace(/^_|_$/g, "");
149
- const coaUrl = `https://quantixanalytics.com/coa/${sid}/${productSlug}`;
169
+ const coaUrl = `https://www.quantixanalytics.com/coa/${sid}/${productSlug}`;
170
+ mergedData._coaVerificationUrl = coaUrl;
150
171
  try {
151
172
  mergedData.qrCodeDataUrl = await QRCode.toDataURL(coaUrl, {
152
173
  width: 120,
@@ -232,6 +253,7 @@ export async function handlePdfGeneration(sb, args, storeId) {
232
253
  document_date: new Date().toISOString().split("T")[0],
233
254
  customer_id: args.customer_id || null,
234
255
  client_store_id: resolvedClientStoreId,
256
+ qr_code_url: mergedData._coaVerificationUrl || null,
235
257
  data: {
236
258
  template_id: tpl.id,
237
259
  template_slug: tpl.slug,
@@ -1 +1 @@
1
- {"version":3,"file":"comms-pdf-generation.js","names":["fillTemplate","applyGenerationRules","generateCannabinoidData","applyCalculations","runValidation","generateFullPanelData","renderLayoutToPdf","renderLabelToPdf","renderCOAToPdf","QRCode","generateThumbnail","loadProfileData","loadCustomerData","buildCoaMetadata","handlePdfGeneration","sb","args","storeId","sid","action","templateId","template_id","templateSlug","template_slug","success","error","tplQuery","from","select","eq","or","data","tpl","tplErr","limit","single","profileConfig","profileConstants","profileClientData","resolvedClientStoreId","clientData","tplConstants","constants","mergedConstants","cannabinoidCfg","cannabinoids","undefined","_cfgRanges","profileDataOnly","mergedData","date","Date","toISOString","slice","approvalDate","generation_rules","Array","isArray","row","key","name","replace","percentWeight","calculations","rows","rowCtx","rowCalcs","row_calculations","computed","Object","assign","fullPanel","microbialResults","heavyMetalsResults","mycotoxinResults","pesticidesCat1","pesticidesCat2","testsResidualSolvents","residualSolventsResults","totalPages","complianceResults","heavyMetals","status","microbial","pesticides","mycotoxins","residualSolvents","length","testsCannabinoids","moisture","testsMoisture","dateTested","testsBatch","slug","startsWith","qrCodeDataUrl","productSlug","sampleName","toLowerCase","coaUrl","toDataURL","width","margin","validationResults","validation_rules","errors","filter","v","severity","passed","warnings","force","map","e","message","join","pdfBuffer","layout","isLabel","version","elements","field","items","page_config","styles","err","Error","String","productName","docName","safeName","fileName","now","storagePath","bucketName","uploadErr","storage","upload","Uint8Array","contentType","upsert","urlData","getPublicUrl","coaMetadata","record","insertErr","insert","store_id","document_type","file_name","file_url","publicUrl","file_size","file_type","document_name","source_name","document_date","split","customer_id","client_store_id","id","profile_id","metadata","catch","url","template","size","w","query","order","count","templates","t","description","type","category","profiles","p","sample_type","default_size"],"sources":["../../../src/server/handlers/comms-pdf-generation.ts"],"sourcesContent":["// comms-pdf-generation.ts — PDF template generation (generate_pdf, list_pdf_templates, list_document_profiles)\nimport type { SupabaseClient } from \"@supabase/supabase-js\";\nimport { fillTemplate } from \"../lib/utils.js\";\nimport {\n applyGenerationRules,\n generateCannabinoidData,\n applyCalculations,\n runValidation,\n generateFullPanelData,\n} from \"../lib/pdf-renderer.js\";\nimport { renderLayoutToPdf, renderLabelToPdf } from \"../lib/react-pdf-layout.js\";\nimport { renderCOAToPdf } from \"../lib/coa-renderer.js\";\nimport type { COAData } from \"../lib/coa-renderer.js\";\nimport QRCode from \"qrcode\";\nimport { generateThumbnail } from \"./comms-shared.js\";\nimport { loadProfileData, loadCustomerData, buildCoaMetadata } from \"./comms-pdf-helpers.js\";\n\ntype HandlerResult = { success: boolean; data?: unknown; error?: string };\n\nexport async function handlePdfGeneration(\n sb: SupabaseClient, args: Record<string, unknown>, storeId: string,\n): Promise<HandlerResult | null> {\n const sid = storeId;\n const action = args.action as string;\n\n switch (action) {\n case \"generate_pdf\": {\n const templateId = args.template_id as string | undefined;\n const templateSlug = args.template_slug as string | undefined;\n if (!templateId && !templateSlug) return { success: false, error: \"template_id or template_slug required\" };\n\n // 1. Load pdf_template\n let tplQuery = sb.from(\"pdf_templates\").select(\"*\").eq(\"is_active\", true);\n if (templateId) tplQuery = tplQuery.eq(\"id\", templateId);\n else tplQuery = tplQuery.eq(\"slug\", templateSlug as string);\n tplQuery = tplQuery.or(`store_id.eq.${sid},store_id.is.null`);\n const { data: tpl, error: tplErr } = await tplQuery.limit(1).single();\n if (tplErr || !tpl) return { success: false, error: `Template not found: ${templateId || templateSlug}` };\n\n // 2. Load profile + client data\n const { profileConfig, profileConstants, profileClientData, resolvedClientStoreId } =\n await loadProfileData(sb, args, sid);\n\n // 3. Load customer data\n const clientData = await loadCustomerData(sb, args);\n\n // 4. Merge data\n const tplConstants = (tpl.constants || {}) as Record<string, unknown>;\n const mergedConstants = { ...tplConstants, ...profileConstants };\n const cannabinoidCfg = (profileConfig.cannabinoids ?? undefined) as Record<string, unknown> | undefined;\n const { cannabinoids: _cfgRanges, ...profileDataOnly } = profileConfig;\n let mergedData: Record<string, unknown> = {\n ...mergedConstants,\n ...profileDataOnly,\n ...profileClientData,\n ...clientData,\n ...(args.data as Record<string, unknown> || {}),\n date: new Date().toISOString().slice(0, 10),\n approvalDate: new Date().toISOString().slice(0, 10),\n };\n\n // 5. Apply generation rules\n mergedData = applyGenerationRules(tpl.generation_rules as any, mergedData);\n\n // 6. Generate cannabinoid data\n if (cannabinoidCfg && !mergedData.cannabinoids) {\n mergedData.cannabinoids = generateCannabinoidData(cannabinoidCfg as any, mergedConstants);\n }\n\n // 6b. Flatten cannabinoid rows into top-level keys\n if (Array.isArray(mergedData.cannabinoids)) {\n for (const row of mergedData.cannabinoids as { name: string; percentWeight: number }[]) {\n const key = row.name.replace(/-/g, \"_\").replace(/[^a-zA-Z0-9_]/g, \"\");\n if (key && row.percentWeight !== undefined) {\n mergedData[key] = row.percentWeight;\n }\n }\n }\n\n // 7. Apply calculations\n mergedData = applyCalculations(tpl.calculations as any, mergedConstants, mergedData);\n\n // Per-row calculations\n if (Array.isArray(mergedData.cannabinoids)) {\n const rows = mergedData.cannabinoids as Record<string, unknown>[];\n for (const row of rows) {\n const rowCtx = { ...mergedConstants, ...row };\n const rowCalcs = (tpl.row_calculations || tpl.calculations) as any;\n if (rowCalcs) {\n const computed = applyCalculations(rowCalcs, mergedConstants, rowCtx);\n Object.assign(row, computed);\n }\n }\n }\n\n // 7b. Generate full panel data\n if (mergedData.fullPanel && !mergedData.microbialResults) {\n const tplConstants = (tpl.constants || {}) as Record<string, unknown>;\n const fullPanel = generateFullPanelData(tplConstants);\n mergedData.microbialResults = fullPanel.microbialResults;\n mergedData.heavyMetalsResults = fullPanel.heavyMetalsResults;\n mergedData.mycotoxinResults = fullPanel.mycotoxinResults;\n mergedData.pesticidesCat1 = fullPanel.pesticidesCat1;\n mergedData.pesticidesCat2 = fullPanel.pesticidesCat2;\n mergedData.testsResidualSolvents = fullPanel.residualSolventsResults;\n mergedData.totalPages = 5;\n mergedData.complianceResults = mergedData.complianceResults || {\n heavyMetals: { status: \"PASS\" }, microbial: { status: \"PASS\" },\n pesticides: { status: \"PASS\" }, mycotoxins: { status: \"PASS\" },\n residualSolvents: { status: \"PASS\" },\n };\n }\n\n // 7b2. Auto-set test status flags\n if (mergedData.cannabinoids && (mergedData.cannabinoids as unknown[]).length > 0) {\n mergedData.testsCannabinoids = true;\n }\n if (mergedData.moisture !== undefined && mergedData.moisture !== null) {\n mergedData.testsMoisture = true;\n }\n if (mergedData.dateTested) {\n mergedData.testsBatch = true;\n }\n\n // 7c. Generate QR code\n if ((tpl.slug as string)?.startsWith(\"cannabis-coa\") && !mergedData.qrCodeDataUrl) {\n const productSlug = ((mergedData.sampleName as string) || \"certificate\")\n .toLowerCase().replace(/[^a-z0-9]+/g, \"_\").replace(/^_|_$/g, \"\");\n const coaUrl = `https://quantixanalytics.com/coa/${sid}/${productSlug}`;\n try {\n mergedData.qrCodeDataUrl = await QRCode.toDataURL(coaUrl, { width: 120, margin: 1 });\n } catch { /* skip QR if generation fails */ }\n }\n\n // 8. Validate\n const validationResults = runValidation(tpl.validation_rules as any, mergedData);\n const errors = validationResults.filter(v => v.severity === \"error\" && !v.passed);\n const warnings = validationResults.filter(v => v.severity === \"warning\" && !v.passed);\n\n if (errors.length > 0 && !args.force) {\n return {\n success: false,\n error: `Validation failed: ${errors.map(e => e.message).join(\"; \")}`,\n data: { errors, warnings },\n };\n }\n\n // 9-10. Render PDF\n let pdfBuffer: Buffer;\n try {\n if ((tpl.slug as string)?.startsWith(\"cannabis-coa\")) {\n pdfBuffer = await renderCOAToPdf(mergedData as unknown as COAData);\n } else {\n const layout = tpl.layout as any;\n const isLabel = layout?.version === 1 && Array.isArray(layout?.elements) && layout.elements[0]?.field;\n\n if (isLabel) {\n const items = Array.isArray(mergedData.items)\n ? mergedData.items as Record<string, unknown>[]\n : [mergedData];\n pdfBuffer = await renderLabelToPdf(layout, tpl.page_config as any, items);\n } else {\n pdfBuffer = await renderLayoutToPdf(\n tpl.layout as any, tpl.page_config as any, tpl.styles as any, mergedData,\n );\n }\n }\n } catch (err) {\n return { success: false, error: `PDF generation failed: ${err instanceof Error ? err.message : String(err)}` };\n }\n\n // 11. Upload to storage\n const sampleName = (mergedData.sampleName as string) || (mergedData.productName as string) || \"\";\n const docName = (args.name as string) || (sampleName ? `${sampleName} COA` : fillTemplate(tpl.name || \"Document\", mergedData));\n const safeName = docName.replace(/[^a-zA-Z0-9_\\-]/g, \"_\");\n const fileName = `${safeName}_${Date.now()}.pdf`;\n const storagePath = `${sid}/${fileName}`;\n const bucketName = \"store-documents\";\n\n const { error: uploadErr } = await sb.storage\n .from(bucketName)\n .upload(storagePath, new Uint8Array(pdfBuffer), { contentType: \"application/pdf\", upsert: true });\n if (uploadErr) return { success: false, error: `Upload failed: ${uploadErr.message}` };\n\n const { data: urlData } = sb.storage.from(bucketName).getPublicUrl(storagePath);\n\n // 12. Build COA metadata\n const coaMetadata = buildCoaMetadata(tpl, mergedData, pdfBuffer, sampleName);\n\n // 13. Insert store_documents record\n const { data: record, error: insertErr } = await sb.from(\"store_documents\").insert({\n store_id: sid,\n document_type: tpl.document_type || \"pdf\",\n file_name: fileName,\n file_url: urlData.publicUrl,\n file_size: pdfBuffer.length,\n file_type: \"application/pdf\",\n document_name: docName,\n source_name: \"PDF Template Engine\",\n document_date: new Date().toISOString().split(\"T\")[0],\n customer_id: (args.customer_id as string) || null,\n client_store_id: resolvedClientStoreId,\n data: { template_id: tpl.id, template_slug: tpl.slug, profile_id: args.profile_id || null },\n metadata: coaMetadata,\n }).select(\"id, document_name, file_url, created_at\").single();\n\n if (insertErr) return { success: false, error: insertErr.message };\n await generateThumbnail(sb, record.id, urlData.publicUrl).catch(() => {});\n\n return {\n success: true,\n data: {\n id: record.id,\n name: record.document_name,\n url: record.file_url,\n template: tpl.name,\n size: pdfBuffer.length,\n warnings: warnings.map(w => w.message),\n },\n };\n }\n\n case \"list_pdf_templates\": {\n let query = sb.from(\"pdf_templates\")\n .select(\"id, slug, name, description, document_type, version, created_at\")\n .eq(\"is_active\", true)\n .or(`store_id.eq.${sid},store_id.is.null`)\n .order(\"name\");\n if (args.document_type) query = query.eq(\"document_type\", args.document_type as string);\n if (args.limit) query = query.limit(args.limit as number);\n const { data, error } = await query;\n if (error) return { success: false, error: error.message };\n return {\n success: true,\n data: {\n count: data?.length || 0,\n templates: (data || []).map(t => ({\n id: t.id, slug: t.slug, name: t.name,\n description: t.description, type: t.document_type, version: t.version,\n })),\n },\n };\n }\n\n case \"list_document_profiles\": {\n let query = sb.from(\"document_profiles\")\n .select(\"id, name, category, sample_type, default_size, client_store_id, template_id, created_at\")\n .eq(\"is_active\", true)\n .eq(\"owner_store_id\", sid)\n .order(\"name\");\n if (args.template_id) query = query.eq(\"template_id\", args.template_id as string);\n if (args.category) query = query.eq(\"category\", args.category as string);\n if (args.limit) query = query.limit(args.limit as number);\n const { data, error } = await query;\n if (error) return { success: false, error: error.message };\n return {\n success: true,\n data: {\n count: data?.length || 0,\n profiles: (data || []).map(p => ({\n id: p.id, name: p.name, category: p.category,\n sample_type: p.sample_type, default_size: p.default_size,\n client_store_id: p.client_store_id,\n })),\n },\n };\n }\n\n case \"list_clients\":\n case \"list_customers\":\n return { success: false, error: \"Use the 'customers' tool instead. Clients are customers.\" };\n\n default:\n return null; // Not handled here\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"comms-pdf-generation.js","names":["fillTemplate","applyGenerationRules","generateCannabinoidData","applyCalculations","runValidation","generateFullPanelData","renderLayoutToPdf","renderLabelToPdf","renderCOAToPdf","QRCode","generateThumbnail","loadProfileData","loadCustomerData","buildCoaMetadata","handlePdfGeneration","sb","args","storeId","sid","action","templateId","template_id","templateSlug","template_slug","success","error","tplQuery","from","select","eq","or","data","tpl","tplErr","limit","single","profileConfig","profileConstants","profileClientData","resolvedClientStoreId","clientData","tplConstants","constants","mergedConstants","cannabinoidCfg","cannabinoids","undefined","_cfgRanges","profileDataOnly","rawOverrides","userOverrides","dateCompleted","dateTested","clientLicense","licenseNumber","mergedData","date","Date","toISOString","slice","approvalDate","sampleName","_sampleNameExplicit","generation_rules","Array","isArray","row","key","name","replace","percentWeight","calculations","rows","rowCtx","rowCalcs","row_calculations","computed","Object","assign","fullPanel","microbialResults","heavyMetalsResults","mycotoxinResults","pesticidesCat1","pesticidesCat2","testsResidualSolvents","residualSolventsResults","totalPages","complianceResults","heavyMetals","status","microbial","pesticides","mycotoxins","residualSolvents","length","testsCannabinoids","moisture","testsMoisture","testsBatch","productName","slug","startsWith","qrCodeDataUrl","productSlug","toLowerCase","coaUrl","_coaVerificationUrl","toDataURL","width","margin","validationResults","validation_rules","errors","filter","v","severity","passed","warnings","force","map","e","message","join","pdfBuffer","layout","isLabel","version","elements","field","items","page_config","styles","err","Error","String","docName","safeName","fileName","now","storagePath","bucketName","uploadErr","storage","upload","Uint8Array","contentType","upsert","urlData","getPublicUrl","coaMetadata","record","insertErr","insert","store_id","document_type","file_name","file_url","publicUrl","file_size","file_type","document_name","source_name","document_date","split","customer_id","client_store_id","qr_code_url","id","profile_id","metadata","catch","url","template","size","w","query","order","count","templates","t","description","type","category","profiles","p","sample_type","default_size"],"sources":["../../../src/server/handlers/comms-pdf-generation.ts"],"sourcesContent":["// comms-pdf-generation.ts — PDF template generation (generate_pdf, list_pdf_templates, list_document_profiles)\nimport type { SupabaseClient } from \"@supabase/supabase-js\";\nimport { fillTemplate } from \"../lib/utils.js\";\nimport {\n applyGenerationRules,\n generateCannabinoidData,\n applyCalculations,\n runValidation,\n generateFullPanelData,\n} from \"../lib/pdf-renderer.js\";\nimport { renderLayoutToPdf, renderLabelToPdf } from \"../lib/react-pdf-layout.js\";\nimport { renderCOAToPdf } from \"../lib/coa-renderer.js\";\nimport type { COAData } from \"../lib/coa-renderer.js\";\nimport QRCode from \"qrcode\";\nimport { generateThumbnail } from \"./comms-shared.js\";\nimport { loadProfileData, loadCustomerData, buildCoaMetadata } from \"./comms-pdf-helpers.js\";\n\ntype HandlerResult = { success: boolean; data?: unknown; error?: string };\n\nexport async function handlePdfGeneration(\n sb: SupabaseClient, args: Record<string, unknown>, storeId: string,\n): Promise<HandlerResult | null> {\n const sid = storeId;\n const action = args.action as string;\n\n switch (action) {\n case \"generate_pdf\": {\n const templateId = args.template_id as string | undefined;\n const templateSlug = args.template_slug as string | undefined;\n if (!templateId && !templateSlug) return { success: false, error: \"template_id or template_slug required\" };\n\n // 1. Load pdf_template\n let tplQuery = sb.from(\"pdf_templates\").select(\"*\").eq(\"is_active\", true);\n if (templateId) tplQuery = tplQuery.eq(\"id\", templateId);\n else tplQuery = tplQuery.eq(\"slug\", templateSlug as string);\n tplQuery = tplQuery.or(`store_id.eq.${sid},store_id.is.null`);\n const { data: tpl, error: tplErr } = await tplQuery.limit(1).single();\n if (tplErr || !tpl) return { success: false, error: `Template not found: ${templateId || templateSlug}` };\n\n // 2. Load profile + client data\n const { profileConfig, profileConstants, profileClientData, resolvedClientStoreId } =\n await loadProfileData(sb, args, sid);\n\n // 3. Load customer data\n const clientData = await loadCustomerData(sb, args);\n\n // 4. Merge data\n const tplConstants = (tpl.constants || {}) as Record<string, unknown>;\n const mergedConstants = { ...tplConstants, ...profileConstants };\n const cannabinoidCfg = (profileConfig.cannabinoids ?? undefined) as Record<string, unknown> | undefined;\n const { cannabinoids: _cfgRanges, ...profileDataOnly } = profileConfig;\n const rawOverrides = (args.data as Record<string, unknown>) || {};\n // Normalize common field name aliases to what the COA renderer expects\n const userOverrides = { ...rawOverrides };\n if (userOverrides.dateCompleted && !userOverrides.dateTested) {\n userOverrides.dateTested = userOverrides.dateCompleted;\n delete userOverrides.dateCompleted;\n }\n if (userOverrides.clientLicense && !userOverrides.licenseNumber) {\n userOverrides.licenseNumber = userOverrides.clientLicense;\n delete userOverrides.clientLicense;\n }\n let mergedData: Record<string, unknown> = {\n ...mergedConstants,\n ...profileDataOnly,\n ...profileClientData,\n ...clientData,\n ...userOverrides,\n date: new Date().toISOString().slice(0, 10),\n approvalDate: new Date().toISOString().slice(0, 10),\n };\n // Track if user explicitly set sampleName (so productName doesn't clobber it)\n if (userOverrides.sampleName) mergedData._sampleNameExplicit = true;\n\n // 5. Apply generation rules\n mergedData = applyGenerationRules(tpl.generation_rules as any, mergedData);\n\n // 6. Generate cannabinoid data\n if (cannabinoidCfg && !mergedData.cannabinoids) {\n mergedData.cannabinoids = generateCannabinoidData(cannabinoidCfg as any, mergedConstants);\n }\n\n // 6b. Flatten cannabinoid rows into top-level keys\n if (Array.isArray(mergedData.cannabinoids)) {\n for (const row of mergedData.cannabinoids as { name: string; percentWeight: number }[]) {\n const key = row.name.replace(/-/g, \"_\").replace(/[^a-zA-Z0-9_]/g, \"\");\n if (key && row.percentWeight !== undefined) {\n mergedData[key] = row.percentWeight;\n }\n }\n }\n\n // 7. Apply calculations\n mergedData = applyCalculations(tpl.calculations as any, mergedConstants, mergedData);\n\n // Per-row calculations\n if (Array.isArray(mergedData.cannabinoids)) {\n const rows = mergedData.cannabinoids as Record<string, unknown>[];\n for (const row of rows) {\n const rowCtx = { ...mergedConstants, ...row };\n const rowCalcs = (tpl.row_calculations || tpl.calculations) as any;\n if (rowCalcs) {\n const computed = applyCalculations(rowCalcs, mergedConstants, rowCtx);\n Object.assign(row, computed);\n }\n }\n }\n\n // 7b. Generate full panel data\n if (mergedData.fullPanel && !mergedData.microbialResults) {\n const tplConstants = (tpl.constants || {}) as Record<string, unknown>;\n const fullPanel = generateFullPanelData(tplConstants);\n mergedData.microbialResults = fullPanel.microbialResults;\n mergedData.heavyMetalsResults = fullPanel.heavyMetalsResults;\n mergedData.mycotoxinResults = fullPanel.mycotoxinResults;\n mergedData.pesticidesCat1 = fullPanel.pesticidesCat1;\n mergedData.pesticidesCat2 = fullPanel.pesticidesCat2;\n mergedData.testsResidualSolvents = fullPanel.residualSolventsResults;\n mergedData.totalPages = 5;\n mergedData.complianceResults = mergedData.complianceResults || {\n heavyMetals: { status: \"PASS\" }, microbial: { status: \"PASS\" },\n pesticides: { status: \"PASS\" }, mycotoxins: { status: \"PASS\" },\n residualSolvents: { status: \"PASS\" },\n };\n }\n\n // 7b2. Auto-set test status flags\n if (mergedData.cannabinoids && (mergedData.cannabinoids as unknown[]).length > 0) {\n mergedData.testsCannabinoids = true;\n }\n if (mergedData.moisture !== undefined && mergedData.moisture !== null) {\n mergedData.testsMoisture = true;\n }\n if (mergedData.dateTested) {\n mergedData.testsBatch = true;\n }\n\n // 7c. Resolve product name: productName override → sampleName from profile\n if (mergedData.productName && !mergedData._sampleNameExplicit) {\n mergedData.sampleName = mergedData.productName as string;\n }\n\n // 7d. Generate QR code\n if ((tpl.slug as string)?.startsWith(\"cannabis-coa\") && !mergedData.qrCodeDataUrl) {\n const productSlug = ((mergedData.sampleName as string) || \"certificate\")\n .toLowerCase().replace(/[^a-z0-9]+/g, \"_\").replace(/^_|_$/g, \"\");\n const coaUrl = `https://www.quantixanalytics.com/coa/${sid}/${productSlug}`;\n mergedData._coaVerificationUrl = coaUrl;\n try {\n mergedData.qrCodeDataUrl = await QRCode.toDataURL(coaUrl, { width: 120, margin: 1 });\n } catch { /* skip QR if generation fails */ }\n }\n\n // 8. Validate\n const validationResults = runValidation(tpl.validation_rules as any, mergedData);\n const errors = validationResults.filter(v => v.severity === \"error\" && !v.passed);\n const warnings = validationResults.filter(v => v.severity === \"warning\" && !v.passed);\n\n if (errors.length > 0 && !args.force) {\n return {\n success: false,\n error: `Validation failed: ${errors.map(e => e.message).join(\"; \")}`,\n data: { errors, warnings },\n };\n }\n\n // 9-10. Render PDF\n let pdfBuffer: Buffer;\n try {\n if ((tpl.slug as string)?.startsWith(\"cannabis-coa\")) {\n pdfBuffer = await renderCOAToPdf(mergedData as unknown as COAData);\n } else {\n const layout = tpl.layout as any;\n const isLabel = layout?.version === 1 && Array.isArray(layout?.elements) && layout.elements[0]?.field;\n\n if (isLabel) {\n const items = Array.isArray(mergedData.items)\n ? mergedData.items as Record<string, unknown>[]\n : [mergedData];\n pdfBuffer = await renderLabelToPdf(layout, tpl.page_config as any, items);\n } else {\n pdfBuffer = await renderLayoutToPdf(\n tpl.layout as any, tpl.page_config as any, tpl.styles as any, mergedData,\n );\n }\n }\n } catch (err) {\n return { success: false, error: `PDF generation failed: ${err instanceof Error ? err.message : String(err)}` };\n }\n\n // 11. Upload to storage\n const sampleName = (mergedData.sampleName as string) || (mergedData.productName as string) || \"\";\n const docName = (args.name as string) || (sampleName ? `${sampleName} COA` : fillTemplate(tpl.name || \"Document\", mergedData));\n const safeName = docName.replace(/[^a-zA-Z0-9_\\-]/g, \"_\");\n const fileName = `${safeName}_${Date.now()}.pdf`;\n const storagePath = `${sid}/${fileName}`;\n const bucketName = \"store-documents\";\n\n const { error: uploadErr } = await sb.storage\n .from(bucketName)\n .upload(storagePath, new Uint8Array(pdfBuffer), { contentType: \"application/pdf\", upsert: true });\n if (uploadErr) return { success: false, error: `Upload failed: ${uploadErr.message}` };\n\n const { data: urlData } = sb.storage.from(bucketName).getPublicUrl(storagePath);\n\n // 12. Build COA metadata\n const coaMetadata = buildCoaMetadata(tpl, mergedData, pdfBuffer, sampleName);\n\n // 13. Insert store_documents record\n const { data: record, error: insertErr } = await sb.from(\"store_documents\").insert({\n store_id: sid,\n document_type: tpl.document_type || \"pdf\",\n file_name: fileName,\n file_url: urlData.publicUrl,\n file_size: pdfBuffer.length,\n file_type: \"application/pdf\",\n document_name: docName,\n source_name: \"PDF Template Engine\",\n document_date: new Date().toISOString().split(\"T\")[0],\n customer_id: (args.customer_id as string) || null,\n client_store_id: resolvedClientStoreId,\n qr_code_url: (mergedData._coaVerificationUrl as string) || null,\n data: { template_id: tpl.id, template_slug: tpl.slug, profile_id: args.profile_id || null },\n metadata: coaMetadata,\n }).select(\"id, document_name, file_url, created_at\").single();\n\n if (insertErr) return { success: false, error: insertErr.message };\n await generateThumbnail(sb, record.id, urlData.publicUrl).catch(() => {});\n\n return {\n success: true,\n data: {\n id: record.id,\n name: record.document_name,\n url: record.file_url,\n template: tpl.name,\n size: pdfBuffer.length,\n warnings: warnings.map(w => w.message),\n },\n };\n }\n\n case \"list_pdf_templates\": {\n let query = sb.from(\"pdf_templates\")\n .select(\"id, slug, name, description, document_type, version, created_at\")\n .eq(\"is_active\", true)\n .or(`store_id.eq.${sid},store_id.is.null`)\n .order(\"name\");\n if (args.document_type) query = query.eq(\"document_type\", args.document_type as string);\n if (args.limit) query = query.limit(args.limit as number);\n const { data, error } = await query;\n if (error) return { success: false, error: error.message };\n return {\n success: true,\n data: {\n count: data?.length || 0,\n templates: (data || []).map(t => ({\n id: t.id, slug: t.slug, name: t.name,\n description: t.description, type: t.document_type, version: t.version,\n })),\n },\n };\n }\n\n case \"list_document_profiles\": {\n let query = sb.from(\"document_profiles\")\n .select(\"id, name, category, sample_type, default_size, client_store_id, template_id, created_at\")\n .eq(\"is_active\", true)\n .eq(\"owner_store_id\", sid)\n .order(\"name\");\n if (args.template_id) query = query.eq(\"template_id\", args.template_id as string);\n if (args.category) query = query.eq(\"category\", args.category as string);\n if (args.limit) query = query.limit(args.limit as number);\n const { data, error } = await query;\n if (error) return { success: false, error: error.message };\n return {\n success: true,\n data: {\n count: data?.length || 0,\n profiles: (data || []).map(p => ({\n id: p.id, name: p.name, category: p.category,\n sample_type: p.sample_type, default_size: p.default_size,\n client_store_id: p.client_store_id,\n })),\n },\n };\n }\n\n case \"list_clients\":\n case \"list_customers\":\n return { success: false, error: \"Use the 'customers' tool instead. Clients are customers.\" };\n\n default:\n return null; // Not handled here\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -28,10 +28,9 @@ export async function loadProfileData(sb, args, sid) {
28
28
  };
29
29
  }
30
30
  }
31
- if (profile.name && !profileConstants.sampleName) {
32
- profileClientData.sampleName = profile.name;
33
- }
34
- if (profile.sample_type) profileClientData.sampleType = profile.sample_type;
31
+ // Profile name is a category (e.g. "THCA Flower"), not a sample name.
32
+ // sampleName must come from user data (productName or sampleName override).
33
+ if (profile.sample_type) profileClientData.sampleType = profile.sample_type;else if (profile.name) profileClientData.sampleType = profile.name;
35
34
  if (profile.default_size) profileClientData.sampleSize = profile.default_size;
36
35
  }
37
36
  }
@@ -69,6 +68,7 @@ export function buildCoaMetadata(tpl, mergedData, pdfBuffer, sampleName) {
69
68
  };
70
69
  if (tpl.slug?.startsWith("cannabis-coa")) {
71
70
  coaMetadata.sample_name = sampleName;
71
+ coaMetadata.product_name = mergedData.productName || sampleName;
72
72
  coaMetadata.sample_id = mergedData.sampleId || null;
73
73
  coaMetadata.sample_type = mergedData.sampleType || mergedData.strain || null;
74
74
  coaMetadata.sample_size = mergedData.sampleSize || null;
@@ -1 +1 @@
1
- {"version":3,"file":"comms-pdf-helpers.js","names":["loadProfileData","sb","args","sid","profileConfig","profileConstants","profileClientData","resolvedClientStoreId","profile_id","data","profile","from","select","eq","single","cfg","config","constants","client_store_id","clientStore","clientName","legal_name","store_name","clientAddress","address","city","state","zip","filter","Boolean","join","licenseNumber","distributor_license_number","clientPhone","phone","clientEmail","email","name","sampleName","sample_type","sampleType","default_size","sampleSize","loadCustomerData","customer_id","rel","pu","platform_users","prof","id","maybeSingle","first_name","last_name","street_address","postal_code","clientLicense","drivers_license_number","clientMedicalCard","medical_card_number","buildCoaMetadata","tpl","mergedData","pdfBuffer","coaMetadata","size_bytes","length","from_pdf_template","template_version","version","slug","startsWith","sample_name","sample_id","sampleId","strain","sample_size","batch_number","batchId","lab_name","labName","lab_contact","labContact","lab_website","labWebsite","lab_director","labDirector","director_title","directorTitle","logo_url","logoUrl","signature_url","signatureUrl","client_name","client_address","date_collected","dateCollected","date_received","dateReceived","date_tested","dateTested","date_reported","dateReported","status","thc_total","totalTHC","cbd_total","totalCBD","cannabinoids_total","totalCannabinoids","moisture","cannabinoids","Array","isArray","Object","fromEntries","c","percentWeight","map","cannabinoids_detailed","percent","mg_per_g","mgPerG","lod","loq","result","String","fullPanel","test_panels","microbial","heavy_metals","mycotoxins","pesticides","residual_solvents","safety_tests"],"sources":["../../../src/server/handlers/comms-pdf-helpers.ts"],"sourcesContent":["// comms-pdf-helpers.ts — Profile/customer data loading + COA metadata builder for PDF generation\nimport type { SupabaseClient } from \"@supabase/supabase-js\";\n\nexport async function loadProfileData(sb: SupabaseClient, args: Record<string, unknown>, sid: string) {\n let profileConfig: Record<string, unknown> = {};\n let profileConstants: Record<string, unknown> = {};\n let profileClientData: Record<string, unknown> = {};\n let resolvedClientStoreId: string | null = null;\n\n if (args.profile_id) {\n const { data: profile } = await sb.from(\"document_profiles\")\n .select(\"*\").eq(\"id\", args.profile_id as string).eq(\"is_active\", true).single();\n if (profile) {\n const cfg = (profile.config || {}) as Record<string, unknown>;\n profileConfig = cfg;\n profileConstants = (cfg.constants || {}) as Record<string, unknown>;\n resolvedClientStoreId = profile.client_store_id || null;\n if (profile.client_store_id) {\n const { data: clientStore } = await sb.from(\"stores\")\n .select(\"store_name, legal_name, address, city, state, zip, distributor_license_number, phone, email\")\n .eq(\"id\", profile.client_store_id).single();\n if (clientStore) {\n profileClientData = {\n clientName: clientStore.legal_name || clientStore.store_name,\n clientAddress: [clientStore.address, clientStore.city, clientStore.state, clientStore.zip].filter(Boolean).join(\", \") || null,\n licenseNumber: clientStore.distributor_license_number || null,\n clientPhone: clientStore.phone || null,\n clientEmail: clientStore.email || null,\n };\n }\n }\n if (profile.name && !profileConstants.sampleName) {\n profileClientData.sampleName = profile.name;\n }\n if (profile.sample_type) profileClientData.sampleType = profile.sample_type;\n if (profile.default_size) profileClientData.sampleSize = profile.default_size;\n }\n }\n return { profileConfig, profileConstants, profileClientData, resolvedClientStoreId };\n}\n\nexport async function loadCustomerData(sb: SupabaseClient, args: Record<string, unknown>): Promise<Record<string, unknown>> {\n if (!args.customer_id) return {};\n const { data: rel } = await sb.from(\"user_creation_relationships\")\n .select(\"id, store_id, platform_users!inner(first_name, last_name, email, phone)\")\n .eq(\"id\", args.customer_id as string).single();\n if (!rel) return {};\n const pu = (rel as any).platform_users;\n const { data: prof } = await sb.from(\"store_customer_profiles\")\n .select(\"street_address, city, state, postal_code, drivers_license_number, medical_card_number\")\n .eq(\"relationship_id\", rel.id).maybeSingle();\n return {\n clientName: [pu.first_name, pu.last_name].filter(Boolean).join(\" \"),\n clientEmail: pu.email,\n clientPhone: pu.phone,\n clientAddress: prof ? [prof.street_address, prof.city, prof.state, prof.postal_code].filter(Boolean).join(\", \") : null,\n clientLicense: prof?.drivers_license_number || null,\n clientMedicalCard: prof?.medical_card_number || null,\n };\n}\n\nexport function buildCoaMetadata(\n tpl: Record<string, unknown>, mergedData: Record<string, unknown>,\n pdfBuffer: Buffer, sampleName: string,\n): Record<string, unknown> {\n const coaMetadata: Record<string, unknown> = {\n size_bytes: pdfBuffer.length,\n from_pdf_template: true,\n template_version: tpl.version,\n };\n if ((tpl.slug as string)?.startsWith(\"cannabis-coa\")) {\n coaMetadata.sample_name = sampleName;\n coaMetadata.sample_id = mergedData.sampleId || null;\n coaMetadata.sample_type = mergedData.sampleType || mergedData.strain || null;\n coaMetadata.sample_size = mergedData.sampleSize || null;\n coaMetadata.batch_number = mergedData.batchId || null;\n coaMetadata.lab_name = mergedData.labName || null;\n coaMetadata.lab_contact = mergedData.labContact || null;\n coaMetadata.lab_website = mergedData.labWebsite || null;\n coaMetadata.lab_director = mergedData.labDirector || null;\n coaMetadata.director_title = mergedData.directorTitle || null;\n coaMetadata.logo_url = mergedData.logoUrl || null;\n coaMetadata.signature_url = mergedData.signatureUrl || null;\n coaMetadata.client_name = mergedData.clientName || null;\n coaMetadata.client_address = mergedData.clientAddress || null;\n coaMetadata.date_collected = mergedData.dateCollected || null;\n coaMetadata.date_received = mergedData.dateReceived || null;\n coaMetadata.date_tested = mergedData.dateTested || null;\n coaMetadata.date_reported = mergedData.dateReported || null;\n coaMetadata.status = \"Pass\";\n coaMetadata.thc_total = mergedData.totalTHC || null;\n coaMetadata.cbd_total = mergedData.totalCBD || null;\n coaMetadata.cannabinoids_total = mergedData.totalCannabinoids || null;\n coaMetadata.moisture = mergedData.moisture || null;\n const cannabinoids = mergedData.cannabinoids as Array<Record<string, unknown>> | undefined;\n if (Array.isArray(cannabinoids)) {\n coaMetadata.cannabinoids = Object.fromEntries(\n cannabinoids.filter((c) => typeof c.percentWeight === \"number\" && c.percentWeight > 0)\n .map((c) => [c.name as string, c.percentWeight as number]),\n );\n coaMetadata.cannabinoids_detailed = cannabinoids.map((c) => ({\n name: c.name, percent: c.percentWeight, mg_per_g: c.mgPerG, lod: c.lod, loq: c.loq, result: String(c.result ?? c.percentWeight),\n }));\n }\n if (mergedData.fullPanel) {\n coaMetadata.test_panels = {\n cannabinoids: true, microbial: true, heavy_metals: true,\n mycotoxins: true, pesticides: true, residual_solvents: true,\n };\n coaMetadata.safety_tests = {\n microbial: \"Pass\", heavy_metals: \"Pass\", mycotoxins: \"Pass\",\n pesticides: \"Pass\", residual_solvents: \"Pass\",\n };\n }\n }\n return coaMetadata;\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"comms-pdf-helpers.js","names":["loadProfileData","sb","args","sid","profileConfig","profileConstants","profileClientData","resolvedClientStoreId","profile_id","data","profile","from","select","eq","single","cfg","config","constants","client_store_id","clientStore","clientName","legal_name","store_name","clientAddress","address","city","state","zip","filter","Boolean","join","licenseNumber","distributor_license_number","clientPhone","phone","clientEmail","email","sample_type","sampleType","name","default_size","sampleSize","loadCustomerData","customer_id","rel","pu","platform_users","prof","id","maybeSingle","first_name","last_name","street_address","postal_code","clientLicense","drivers_license_number","clientMedicalCard","medical_card_number","buildCoaMetadata","tpl","mergedData","pdfBuffer","sampleName","coaMetadata","size_bytes","length","from_pdf_template","template_version","version","slug","startsWith","sample_name","product_name","productName","sample_id","sampleId","strain","sample_size","batch_number","batchId","lab_name","labName","lab_contact","labContact","lab_website","labWebsite","lab_director","labDirector","director_title","directorTitle","logo_url","logoUrl","signature_url","signatureUrl","client_name","client_address","date_collected","dateCollected","date_received","dateReceived","date_tested","dateTested","date_reported","dateReported","status","thc_total","totalTHC","cbd_total","totalCBD","cannabinoids_total","totalCannabinoids","moisture","cannabinoids","Array","isArray","Object","fromEntries","c","percentWeight","map","cannabinoids_detailed","percent","mg_per_g","mgPerG","lod","loq","result","String","fullPanel","test_panels","microbial","heavy_metals","mycotoxins","pesticides","residual_solvents","safety_tests"],"sources":["../../../src/server/handlers/comms-pdf-helpers.ts"],"sourcesContent":["// comms-pdf-helpers.ts — Profile/customer data loading + COA metadata builder for PDF generation\nimport type { SupabaseClient } from \"@supabase/supabase-js\";\n\nexport async function loadProfileData(sb: SupabaseClient, args: Record<string, unknown>, sid: string) {\n let profileConfig: Record<string, unknown> = {};\n let profileConstants: Record<string, unknown> = {};\n let profileClientData: Record<string, unknown> = {};\n let resolvedClientStoreId: string | null = null;\n\n if (args.profile_id) {\n const { data: profile } = await sb.from(\"document_profiles\")\n .select(\"*\").eq(\"id\", args.profile_id as string).eq(\"is_active\", true).single();\n if (profile) {\n const cfg = (profile.config || {}) as Record<string, unknown>;\n profileConfig = cfg;\n profileConstants = (cfg.constants || {}) as Record<string, unknown>;\n resolvedClientStoreId = profile.client_store_id || null;\n if (profile.client_store_id) {\n const { data: clientStore } = await sb.from(\"stores\")\n .select(\"store_name, legal_name, address, city, state, zip, distributor_license_number, phone, email\")\n .eq(\"id\", profile.client_store_id).single();\n if (clientStore) {\n profileClientData = {\n clientName: clientStore.legal_name || clientStore.store_name,\n clientAddress: [clientStore.address, clientStore.city, clientStore.state, clientStore.zip].filter(Boolean).join(\", \") || null,\n licenseNumber: clientStore.distributor_license_number || null,\n clientPhone: clientStore.phone || null,\n clientEmail: clientStore.email || null,\n };\n }\n }\n // Profile name is a category (e.g. \"THCA Flower\"), not a sample name.\n // sampleName must come from user data (productName or sampleName override).\n if (profile.sample_type) profileClientData.sampleType = profile.sample_type;\n else if (profile.name) profileClientData.sampleType = profile.name;\n if (profile.default_size) profileClientData.sampleSize = profile.default_size;\n }\n }\n return { profileConfig, profileConstants, profileClientData, resolvedClientStoreId };\n}\n\nexport async function loadCustomerData(sb: SupabaseClient, args: Record<string, unknown>): Promise<Record<string, unknown>> {\n if (!args.customer_id) return {};\n const { data: rel } = await sb.from(\"user_creation_relationships\")\n .select(\"id, store_id, platform_users!inner(first_name, last_name, email, phone)\")\n .eq(\"id\", args.customer_id as string).single();\n if (!rel) return {};\n const pu = (rel as any).platform_users;\n const { data: prof } = await sb.from(\"store_customer_profiles\")\n .select(\"street_address, city, state, postal_code, drivers_license_number, medical_card_number\")\n .eq(\"relationship_id\", rel.id).maybeSingle();\n return {\n clientName: [pu.first_name, pu.last_name].filter(Boolean).join(\" \"),\n clientEmail: pu.email,\n clientPhone: pu.phone,\n clientAddress: prof ? [prof.street_address, prof.city, prof.state, prof.postal_code].filter(Boolean).join(\", \") : null,\n clientLicense: prof?.drivers_license_number || null,\n clientMedicalCard: prof?.medical_card_number || null,\n };\n}\n\nexport function buildCoaMetadata(\n tpl: Record<string, unknown>, mergedData: Record<string, unknown>,\n pdfBuffer: Buffer, sampleName: string,\n): Record<string, unknown> {\n const coaMetadata: Record<string, unknown> = {\n size_bytes: pdfBuffer.length,\n from_pdf_template: true,\n template_version: tpl.version,\n };\n if ((tpl.slug as string)?.startsWith(\"cannabis-coa\")) {\n coaMetadata.sample_name = sampleName;\n coaMetadata.product_name = (mergedData.productName as string) || sampleName;\n coaMetadata.sample_id = mergedData.sampleId || null;\n coaMetadata.sample_type = mergedData.sampleType || mergedData.strain || null;\n coaMetadata.sample_size = mergedData.sampleSize || null;\n coaMetadata.batch_number = mergedData.batchId || null;\n coaMetadata.lab_name = mergedData.labName || null;\n coaMetadata.lab_contact = mergedData.labContact || null;\n coaMetadata.lab_website = mergedData.labWebsite || null;\n coaMetadata.lab_director = mergedData.labDirector || null;\n coaMetadata.director_title = mergedData.directorTitle || null;\n coaMetadata.logo_url = mergedData.logoUrl || null;\n coaMetadata.signature_url = mergedData.signatureUrl || null;\n coaMetadata.client_name = mergedData.clientName || null;\n coaMetadata.client_address = mergedData.clientAddress || null;\n coaMetadata.date_collected = mergedData.dateCollected || null;\n coaMetadata.date_received = mergedData.dateReceived || null;\n coaMetadata.date_tested = mergedData.dateTested || null;\n coaMetadata.date_reported = mergedData.dateReported || null;\n coaMetadata.status = \"Pass\";\n coaMetadata.thc_total = mergedData.totalTHC || null;\n coaMetadata.cbd_total = mergedData.totalCBD || null;\n coaMetadata.cannabinoids_total = mergedData.totalCannabinoids || null;\n coaMetadata.moisture = mergedData.moisture || null;\n const cannabinoids = mergedData.cannabinoids as Array<Record<string, unknown>> | undefined;\n if (Array.isArray(cannabinoids)) {\n coaMetadata.cannabinoids = Object.fromEntries(\n cannabinoids.filter((c) => typeof c.percentWeight === \"number\" && c.percentWeight > 0)\n .map((c) => [c.name as string, c.percentWeight as number]),\n );\n coaMetadata.cannabinoids_detailed = cannabinoids.map((c) => ({\n name: c.name, percent: c.percentWeight, mg_per_g: c.mgPerG, lod: c.lod, loq: c.loq, result: String(c.result ?? c.percentWeight),\n }));\n }\n if (mergedData.fullPanel) {\n coaMetadata.test_panels = {\n cannabinoids: true, microbial: true, heavy_metals: true,\n mycotoxins: true, pesticides: true, residual_solvents: true,\n };\n coaMetadata.safety_tests = {\n microbial: \"Pass\", heavy_metals: \"Pass\", mycotoxins: \"Pass\",\n pesticides: \"Pass\", residual_solvents: \"Pass\",\n };\n }\n }\n return coaMetadata;\n}\n"],"mappings":"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","ignoreList":[]}