import { Injectable } from '@nestjs/common';
import { DatabaseService } from '../../../infrastructure/database/database.service';
import { DomainConflictError } from '../../../common/errors/domain-conflict.error';
@Injectable()
export class FiscalReceiptService {
constructor(private readonly database:DatabaseService) {}
async dto(input:{organizationId:string;fiscalTransactionId:string}) {
const rows=await this.database.query<any>(
`select ft.*,fd.system_serial_number,fd.tse_serial_number,
fdm.provider_device_serial,fdm.provider_client_serial
from fiscal_transactions ft
left join fiscal_devices fd on fd.id=ft.fiscal_device_id
left join fiscal_device_mappings fdm on fdm.id=ft.fiscal_device_mapping_id
where ft.id=$1 and ft.organization_id=$2`,
[input.fiscalTransactionId,input.organizationId],
);
const t=rows[0];
if(!t) throw new DomainConflictError('fiscal.transaction_not_found');
return {
fiscalTransactionId:t.id,
fiscalStatus:t.status,
fiscalized:t.status==='completed',
failureNote:t.status==='completed'?null:'TSE not available / fiscal recovery pending',
transactionNumber:t.tse_transaction_number,
transactionStart:t.tse_start_at,
transactionEnd:t.tse_end_at,
signatureCounter:t.tse_signature_counter,
signatureValue:t.verification_value,
signatureAlgorithm:t.signature_algorithm,
signaturePublicKey:t.signature_public_key,
systemSerialNumber:t.client_serial??t.provider_client_serial??t.system_serial_number,
tseSerialNumber:t.device_serial??t.provider_device_serial??t.tse_serial_number,
qrPayload:t.qr_payload,
safeProviderReceipt:t.safe_provider_receipt_json,
};
}
}
