Ignore:
Timestamp:
02/26/25 10:05:32 (5 weeks ago)
Author:
Naum Shapkarovski <naumshapkarovski@…>
Branches:
main
Children:
299af01
Parents:
5d6f37a
Message:

feat: implement employees

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/app/api/invoices/route.ts

    r5d6f37a r057453c  
    11import { NextRequest, NextResponse } from 'next/server';
    2 import { invoiceSchema, invoiceTableFiltersSchema } from 'mvpmasters-shared';
     2import { createInvoiceSchema, invoiceSchema, invoiceTableFiltersSchema } from 'src/schemas';
    33import prisma from 'src/lib/prisma';
    44import { auth } from 'src/lib/firebase-admin';
     5import { InvoiceStatus } from '@prisma/client';
    56
    67// Helper function to get userId from Authorization header
     
    4142    const invoices = await prisma.invoice.findMany({
    4243      where: {
    43         userId,
    44         status: validatedFilters.status ? { equals: validatedFilters.status } : undefined,
     44        status: validatedFilters.status
     45          ? { equals: validatedFilters.status as InvoiceStatus }
     46          : undefined,
    4547        createDate: {
    46           gte: validatedFilters.startDate,
    47           lte: validatedFilters.endDate,
     48          ...(validatedFilters.startDate && { gte: validatedFilters.startDate }),
     49          ...(validatedFilters.endDate && { lte: validatedFilters.endDate }),
    4850        },
    4951        items:
     
    7779
    7880    const body = await request.json();
    79     const validatedData = invoiceSchema.parse(body);
     81    const validatedData = createInvoiceSchema.parse(body);
     82
     83    const tenant = await prisma.tenant.findUnique({
     84      where: { id: validatedData.invoiceFrom.id },
     85    });
     86
     87    const toCustomer = await prisma.client.findUnique({
     88      where: { id: validatedData.invoiceTo.id },
     89    });
     90
     91    if (!tenant || !toCustomer) {
     92      return NextResponse.json({ error: 'Invoice sender or recipient not found' }, { status: 404 });
     93    }
     94
     95    // Update lastInvoiceNumber in tenant
     96    const updatedTenant = await prisma.tenant.update({
     97      where: { id: tenant.id },
     98      data: {
     99        lastInvoiceNumber: validatedData.invoiceNumber,
     100      },
     101    });
    80102
    81103    const invoice = await prisma.invoice.create({
    82104      data: {
    83         ...validatedData,
    84         userId,
     105        dueDate: validatedData.dueDate,
     106        status: validatedData.status,
     107        currency: validatedData.currency,
     108        quantityType: validatedData.quantityType,
     109        subTotal: validatedData.subTotal,
     110        createDate: validatedData.createDate,
     111        month: validatedData.month,
     112        discount: validatedData.discount,
     113        taxes: validatedData.taxes,
     114        totalAmount: validatedData.totalAmount,
     115        invoiceNumber: validatedData.invoiceNumber,
     116        invoiceFromId: tenant.id,
     117        invoiceToId: toCustomer.id,
    85118        items: {
    86           create: validatedData.items,
     119          create: validatedData.items.map((item) => ({
     120            title: item.title,
     121            price: item.price,
     122            total: item.total,
     123            quantity: item.quantity,
     124            description: item.description,
     125            service: {
     126              connect: { id: item.service.id },
     127            },
     128          })),
    87129        },
    88130      },
     
    100142    return NextResponse.json(invoice, { status: 201 });
    101143  } catch (error) {
     144    console.error(error);
    102145    return NextResponse.json({ error: 'Internal Server Error' }, { status: 500 });
    103146  }
Note: See TracChangeset for help on using the changeset viewer.