import { Injectable } from '@nestjs/common';
import { randomUUID } from 'node:crypto';
import { DatabaseService } from '../../../infrastructure/database/database.service';
import { DomainConflictError } from '../../../common/errors/domain-conflict.error';
import { assertInvoiceRenderInput } from './invoice-input-validation';
@Injectable()
export class InvoiceRenderService {
constructor(private readonly database:DatabaseService) {}
async request(input:{
organizationId:string;
invoiceId:string;
renderType:'pdf'|'zugferd_pdf'|'xml';
}) {
assertInvoiceRenderInput(input);
const inv=await this.database.query<any>(
`select * from invoices where id=$1 and organization_id=$2 and status='finalized'`,
[input.invoiceId,input.organizationId],
);
if(!inv[0]) throw new DomainConflictError('invoice.render_invalid');
const id=randomUUID();
if(input.renderType==='zugferd_pdf') {
await this.database.query(
`insert into invoice_render_jobs(
id,organization_id,invoice_id,render_type,status,last_error
) values($1,$2,$3,'zugferd_pdf','unsupported',$4)`,
[
id,input.organizationId,input.invoiceId,
'PDF/A-3 embedding requires a dedicated production renderer/validator; not synthesized by Gastro OS baseline.',
],
);
return {id,status:'unsupported'};
}
if(input.renderType==='pdf') {
await this.database.query(
`insert into invoice_render_jobs(
id,organization_id,invoice_id,render_type,status,last_error
) values($1,$2,$3,'pdf','unsupported',$4)`,
[
id,input.organizationId,input.invoiceId,
'Production invoice PDF renderer is not configured.',
],
);
return {id,status:'unsupported'};
}
return {id,status:'unsupported',reason:'use einvoice validate/generate endpoint for XML'};
}
}
