Learn by Directing AI
All materials

export-certificates.ts

tsexport-certificates.ts
import { Router, Request, Response } from 'express'
import { prisma } from '../lib/db'
import { requireAuth, requireRole } from '../lib/auth'

const router = Router()

router.get('/', requireAuth, async (_req: Request, res: Response) => {
  try {
    const certificates = await prisma.exportCertificate.findMany({
      include: {
        shipment: { select: { destination: true, status: true, vessel_name: true } },
      },
      orderBy: { date_emission: 'desc' },
    })
    res.json(certificates)
  } catch (error) {
    res.status(500).json({ error: 'Failed to fetch certificates' })
  }
})

router.post('/', requireAuth, requireRole('admin'), async (req: Request, res: Response) => {
  try {
    const { shipment_id, type_certificat } = req.body

    const shipment = await prisma.shipment.findUnique({
      where: { id: shipment_id },
    })
    if (!shipment) {
      return res.status(404).json({ error: 'Shipment not found' })
    }
    if (shipment.status === 'pending') {
      return res.status(400).json({ error: 'Cannot generate certificate for pending shipment' })
    }

    const certCount = await prisma.exportCertificate.count()
    const prefix = type_certificat === 'certificate_of_origin' ? 'CO' : 'PHY'
    const numero = `CI-${prefix}-${String(2025000 + certCount + 1).padStart(7, '0')}`

    const certificate = await prisma.exportCertificate.create({
      data: {
        shipment_id,
        type_certificat,
        numero,
        date_expiration: new Date(Date.now() + 365 * 24 * 60 * 60 * 1000),
      },
    })
    res.status(201).json(certificate)
  } catch (error) {
    res.status(500).json({ error: 'Failed to generate certificate' })
  }
})

export default router