import { Injectable } from '@nestjs/common';
import { DatabaseService } from '../../../infrastructure/database/database.service';
import { DomainConflictError } from '../../../common/errors/domain-conflict.error';
@Injectable()
export class CheckDetailService {
constructor(private readonly database: DatabaseService) {}
async get(organizationId:string,locationId:string,checkId:string) {
const checks = await this.database.query<any>(
`select *
from checks
where id=$1 and organization_id=$2 and location_id=$3`,
[checkId,organizationId,locationId],
);
if (!checks[0]) throw new DomainConflictError('billing.check_not_found');
const items = await this.database.query<any>(
`select
ci.id,
ci.order_item_id,
ci.quantity::text,
ci.line_subtotal_minor,
ci.line_discount_minor,
ci.line_tax_minor,
ci.line_total_minor,
oi.product_name_snapshot,
s.seat_number
from check_items ci
join order_items oi on oi.id=ci.order_item_id
left join seats s on s.id=oi.seat_id
where ci.check_id=$1
order by s.seat_number nulls first, oi.created_at`,
[checkId],
);
const payments = await this.database.query<any>(
`select
p.id,
p.amount_minor,
p.tip_minor,
p.currency_code,
p.status,
t.display_name as tender_name,
p.captured_at
from payments p
join tenders t on t.id=p.tender_id
where p.check_id=$1
order by p.captured_at`,
[checkId],
);
const intents = await this.database.query<any>(
`select
pi.id,
pi.status,
pi.amount_minor,
pi.currency_code,
pi.provider_key,
pi.provider_status,
pi.uncertain_since,
t.display_name as tender_name
from payment_intents pi
join tenders t on t.id=pi.tender_id
where pi.check_id=$1
and pi.status not in ('captured','cancelled')
order by pi.created_at`,
[checkId],
);
return { ...checks[0], items, payments, paymentIntents: intents };
}
}
