Project Initialization

This commit is contained in:
Muluhabt
2026-05-12 15:17:16 +03:00
parent 33fa742e8a
commit 3b8b6979db
259 changed files with 15962 additions and 0 deletions

View File

@@ -0,0 +1,23 @@
import { Controller, Get, Param, ParseUUIDPipe } from '@nestjs/common';
import { ApiOperation, ApiTags } from '@nestjs/swagger';
import { BillingService } from './billing.service';
@ApiTags('billing')
// @UseGuards(JwtAuthGuard) — TODO: integrate @edr/auth
@Controller('billing')
export class BillingController {
constructor(private readonly billingService: BillingService) {}
@Get('invoices')
@ApiOperation({ summary: 'List all invoices' })
findAll() {
return this.billingService.findAll();
}
@Get('invoices/booking/:bookingId')
@ApiOperation({ summary: 'List invoices for a booking' })
findByBooking(@Param('bookingId', ParseUUIDPipe) bookingId: string) {
return this.billingService.findByBooking(bookingId);
}
}

View File

@@ -0,0 +1,14 @@
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { BillingController } from './billing.controller';
import { BillingService } from './billing.service';
import { Invoice } from './entities/invoice.entity';
@Module({
imports: [TypeOrmModule.forFeature([Invoice])],
controllers: [BillingController],
providers: [BillingService],
exports: [BillingService],
})
export class BillingModule {}

View File

@@ -0,0 +1,23 @@
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { Invoice } from './entities/invoice.entity';
@Injectable()
export class BillingService {
constructor(
@InjectRepository(Invoice)
private readonly invoicesRepository: Repository<Invoice>,
) {}
/** List every invoice (most recent first). */
findAll(): Promise<Invoice[]> {
return this.invoicesRepository.find({ order: { issuedAt: 'DESC' } });
}
/** List invoices for a given booking. */
findByBooking(bookingId: string): Promise<Invoice[]> {
return this.invoicesRepository.find({ where: { bookingId }, order: { issuedAt: 'DESC' } });
}
}

View File

@@ -0,0 +1,32 @@
import { BaseEntity } from '@edr/api-common';
import { Freight } from '@edr/types';
import { Column, Entity } from 'typeorm';
@Entity({ name: 'invoices' })
export class Invoice extends BaseEntity {
@Column({ name: 'booking_id', type: 'uuid' })
bookingId!: string;
@Column({ name: 'invoice_number', type: 'varchar', length: 64, unique: true })
invoiceNumber!: string;
@Column({ name: 'amount', type: 'numeric', precision: 14, scale: 2 })
amount!: number;
@Column({ name: 'currency', type: 'varchar', length: 8, default: 'ETB' })
currency!: string;
@Column({
name: 'status',
type: 'enum',
enum: Freight.PaymentStatus,
default: Freight.PaymentStatus.Pending,
})
status!: Freight.PaymentStatus;
@Column({ name: 'issued_at', type: 'timestamptz' })
issuedAt!: Date;
@Column({ name: 'due_at', type: 'timestamptz' })
dueAt!: Date;
}