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 {
assertFiscalExportCreateInput,
assertFiscalExportListInput,
} from './fiscal-input-validation';
@Injectable()
export class FiscalExportJobService {
constructor(private readonly database:DatabaseService) {}
async create(input:{
organizationId:string;
locationId:string;
connectionId?:string;
exportType:'tse_export'|'dsfinvk';
periodStart:string;
periodEnd:string;
userId?:string;
}) {
assertFiscalExportCreateInput(input);
if(input.periodEnd<input.periodStart) throw new DomainConflictError('fiscal.export_period_invalid');
if(input.exportType==='dsfinvk') {
const id=randomUUID();
await this.database.query(
`insert into fiscal_export_jobs(
id,organization_id,location_id,integration_connection_id,export_type,
period_start,period_end,status,requested_by_user_id,last_error
) values($1,$2,$3,$4,'dsfinvk',$5,$6,'unsupported',$7,$8)`,
[
id,input.organizationId,input.locationId,input.connectionId??null,
input.periodStart,input.periodEnd,input.userId??null,
'DSFinV-K requires a dedicated production export integration; SIGN DE alone is insufficient.',
],
);
return {id,status:'unsupported'};
}
const id=randomUUID();
await this.database.query(
`insert into fiscal_export_jobs(
id,organization_id,location_id,integration_connection_id,export_type,
period_start,period_end,status,requested_by_user_id
) values($1,$2,$3,$4,'tse_export',$5,$6,'queued',$7)`,
[
id,input.organizationId,input.locationId,input.connectionId??null,
input.periodStart,input.periodEnd,input.userId??null,
],
);
return {id,status:'queued'};
}
async list(input:{organizationId:string;locationId:string}) {
assertFiscalExportListInput(input);
return this.database.query<any>(
`select *
from fiscal_export_jobs
where organization_id=$1 and location_id=$2
order by created_at desc limit 100`,
[input.organizationId,input.locationId],
);
}
}
