Index: nv
===================================================================
--- .env	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ 	(revision )
@@ -1,17 +1,0 @@
-# FIREBASE
-NEXT_PUBLIC_FIREBASE_API_KEY=AIzaSyD4CaKEbhaZdMhYCkvyhcQLYBbrFWVCqFk
-NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN=agency-os-prod.firebaseapp.com
-NEXT_PUBLIC_FIREBASE_PROJECT_ID=agency-os-prod
-NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET=agency-os-prod.firebasestorage.app
-NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID=224615355467
-NEXT_PUBLIC_FIREBASE_APPID=1:224615355467:web:6c804b539fa76cb4c729ce
-
-# GOOGLE SERVICE ACCOUNT
-GOOGLE_APPLICATION_CREDENTIALS=/Users/naumshapkarovski/Documents/Organizations/MVP-Masters/repos.nosync/agencyos/service-account.json
-
-# DATABASE
-DATABASE_URL="postgresql://db_202425z_va_prj_agency_os_owner:9a99f3923cc7@localhost:5432/db_202425z_va_prj_agency_os"
-
-
-
-
Index: .gitignore
===================================================================
--- .gitignore	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ .gitignore	(revision 5d6f37a75130aab7d9a67b5b430603eff2c0ca6e)
@@ -21,5 +21,5 @@
 
 # environment variables
-# .env
+.env
 .env.local
 .env.development.local
Index: README.md
===================================================================
--- README.md	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ README.md	(revision 5d6f37a75130aab7d9a67b5b430603eff2c0ca6e)
@@ -1,130 +1,13 @@
-# Project Setup Guide
+## NODE.JS
 
-This guide will help you set up and run the project locally.
+- Node 16.x || 18.x
 
-## Prerequisites
+## USING YARN (Recommend)
 
-- Node.js (v16.x or v18.x)
-- Yarn (recommended) or npm
-- Access to project's database credentials
-- Google Cloud credentials
+- yarn install
+- yarn dev
 
-## Installation Steps
+## USING NPM
 
-1. **Install Dependencies**
-
-   ```bash
-   yarn install
-   # or using npm
-   npm install --legacy-peer-deps
-   ```
-
-2. **Database Connection**
-
-   Open a terminal and run the following SSH command to establish a connection to the database:
-
-   ```bash
-   ssh -L 5432:localhost:5432 t_agency_os@194.149.135.130 -N
-   ```
-
-   Keep this terminal window open while working with the application.
-
-3. **Environment Setup**
-
-   Create a `.env` file in the root directory and set the path to your service-account.json file:
-
-   ```env
-   GOOGLE_APPLICATION_CREDENTIALS="/path/to/your/service-account.json"
-   ```
-
-4. **Generate Prisma Client**
-
-   ```bash
-   yarn prisma:generate
-   ```
-
-5. **Seed Database (First-time setup)**
-
-   If you're setting up the project for the first time and the database is empty, run:
-
-   ```bash
-   yarn db:seed
-   ```
-
-   This will create an initial tenant and user in the database.
-
-6. **Start Development Server**
-   ```bash
-   yarn dev
-   ```
-   The application should now be running on `http://localhost:3000`
-
-## Authentication
-
-The application uses Firebase Authentication. You can log in with the following default credentials:
-
-- Email: naum@mvpmasters.com
-- Password: BnP2025~
-
-## Available Scripts
-
-- `yarn dev` - Start development server
-- `yarn prisma:generate` - Generate Prisma client
-- `yarn build` - Build for production
-- `yarn start` - Start production server
-- `yarn db:seed` - Seed the database with initial data
-
-## Database Features
-
-### Transactions
-
-The application uses database transactions in several key operations:
-
-- Invoice creation: When creating a new invoice, a transaction ensures that both the invoice and its items are created atomically
-- Status updates: Invoice status changes are handled within transactions to maintain data consistency
-- Client updates: When updating client information, related operations are wrapped in transactions
-
-Transactions are implemented in the following files:
-
-- `src/app/api/invoices/[id]/route.ts`: For updating and deleting invoices
-- `src/app/api/invoices/route.ts`: For creating new invoices
-
-### Triggers
-
-The system implements a sophisticated trigger system for invoice management:
-
-- `invoice_status_update_trigger`: Automatically fires when an invoice status changes
-  - Logs status changes in `InvoiceStatusHistory`
-  - Creates notifications in `InvoiceNotifications`
-  - Updates client status based on payment history
-  - Automatically extends due dates when needed
-  - Calculates and updates financial metrics
-
-The trigger is implemented in `sql/01_invoice_status_trigger.sql`.
-
-### Indexes
-
-Several optimized indexes are implemented for better query performance:
-
-- Client email lookups:
-  - `idx_client_email`: Basic email search optimization
-  - `idx_client_email_tenant`: Composite index for tenant-specific email searches
-  - `idx_client_email_lower`: Case-insensitive email searches
-- Invoice management:
-  - `idx_invoice_status_history_invoice_id`: Optimizes status history lookups
-  - `idx_invoice_status_history_changed_at`: Improves date-based queries
-  - `idx_invoice_notifications_invoice_id`: Speeds up notification retrieval
-  - `idx_invoice_notifications_processed`: Partial index for unprocessed notifications
-
-## Troubleshooting
-
-If you encounter any issues:
-
-- Ensure the SSH connection to the database is active
-- Verify your Google Cloud credentials path is correct
-- Check if all environment variables are properly set
-- Make sure the database is properly seeded if you're setting up for the first time
-
-## Support
-
-For additional help or questions, please contact the development team.
+- npm i OR npm i --legacy-peer-deps
+- npm run dev
Index: package.json
===================================================================
--- package.json	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ package.json	(revision 5d6f37a75130aab7d9a67b5b430603eff2c0ca6e)
@@ -1,7 +1,7 @@
 {
-  "name": "agencyos",
+  "name": "mvpmasters",
   "author": "MVP Masters",
   "version": "1.0.0",
-  "description": "AgencyOS",
+  "description": "MVP Masters - Admin",
   "private": true,
   "scripts": {
@@ -48,4 +48,5 @@
     "lodash": "^4.17.21",
     "mui-one-time-password-input": "^2.0.0",
+    "mvpmasters-shared": "^1.0.9",
     "next": "^13.4.19",
     "notistack": "^3.0.1",
@@ -92,6 +93,5 @@
     "eslint-plugin-unused-imports": "^3.0.0",
     "prettier": "^3.0.3",
-    "prisma": "^6.3.1",
-    "typescript": "5.7.3"
+    "prisma": "^6.3.1"
   },
   "prisma": {
Index: prisma/schema.prisma
===================================================================
--- prisma/schema.prisma	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ prisma/schema.prisma	(revision 5d6f37a75130aab7d9a67b5b430603eff2c0ca6e)
@@ -8,82 +8,70 @@
 }
 
-model Client {
-  id             String       @id @default(uuid())
-  tenantId       String       @map("tenant_id")
-  name           String
-  email          String       @unique
-  address        Json
-  logoUrl        String?      @map("logo_url")
-  phoneNumber    String?      @map("phone_number")
-  vatNumber      String?      @map("vat_number")
-  companyNumber  String?      @map("company_number")
-  representative String
-  status         ClientStatus @default(active)
-  createdAt      DateTime     @default(now()) @map("created_at")
-  updatedAt      DateTime     @updatedAt @map("updated_at")
+model Customer {
+  id              String        @id @default(uuid())
+  companyId       String?       // Optional company identifier
+  name            String
+  email           String        @unique
+  address         Json
+  logoUrl         String?
+  phoneNumber     String?
+  vatNumber       String?
+  companyNumber   String?
+  representative  String
+  status          CustomerStatus @default(active)
 
-  tenant           Tenant    @relation(fields: [tenantId], references: [id], onDelete: Cascade)
+  bankAccounts    BankAccount[] // One-to-many relation
+  invoicesSent    Invoice[] @relation("InvoiceFrom")
   invoicesReceived Invoice[] @relation("InvoiceTo")
+}
 
-  // Note: Advanced indexes (partial, functional, case-insensitive) 
-  // are handled via raw SQL in sql/02_client_email_index.sql
-
-  // Basic indexes that Prisma can handle
-  @@index([email]) // Basic email index
-  @@index([email, tenantId]) // Composite email + tenant index
-  @@index([status]) // Status index
-  @@index([tenantId]) // Tenant index for multi-tenant queries
+model BankAccount {
+  id             String   @id @default(uuid())
+  customerId     String
+  customer       Customer @relation(fields: [customerId], references: [id], onDelete: Cascade)
+  accountNumber  String?
+  bicSwift       String?
+  iban           String?
+  routingNumber  String?
+  currency       Currency
 }
 
 model Service {
-  id       String @id @default(uuid())
-  name     String
-  sprint   Float
-  hour     Float
-  month    Float
-  tenantId String @map("tenant_id")
-  tenant   Tenant @relation(fields: [tenantId], references: [id], onDelete: Cascade)
+  id          String  @id @default(uuid())
+  name        String
+  sprintPrice Float
+  hourPrice   Float
+  monthPrice  Float
 
-  lineItems LineItem[]
+  invoiceItems InvoiceItem[]
 }
 
 model Invoice {
-  id            String        @id @default(uuid())
-  sent          Int?
-  dueDate       DateTime      @map("due_date")
+  id            String         @id @default(uuid())
+  sent          Int?           // Number of times sent
+  dueDate       DateTime
   status        InvoiceStatus
   currency      Currency
-  quantityType  QuantityType  @map("quantity_type")
-  subTotal      Float         @map("sub_total")
-  issueDate     DateTime      @map("issue_date")
+  quantityType  QuantityType
+  subTotal      Float
+  createDate    DateTime
   month         Month
   discount      Float?
   taxes         Float?
-  totalAmount   Float         @map("total_amount")
-  invoiceNumber String        @unique @map("invoice_number")
-  pdfRef        String?       @map("pdf_ref")
-  createdAt     DateTime      @default(now()) @map("created_at")
-  updatedAt     DateTime      @updatedAt @map("updated_at")
+  totalAmount   Float
+  invoiceNumber String         @unique
+  pdfRef        String?
 
-  invoiceFromId String @map("tenant_id")
-  invoiceFrom   Tenant @relation(fields: [invoiceFromId], references: [id], onDelete: Cascade)
+  invoiceFromId String
+  invoiceFrom   Customer       @relation("InvoiceFrom", fields: [invoiceFromId], references: [id], onDelete: Cascade)
 
-  invoiceToId String @map("client_id")
-  invoiceTo   Client @relation("InvoiceTo", fields: [invoiceToId], references: [id], onDelete: Cascade)
+  invoiceToId   String
+  invoiceTo     Customer       @relation("InvoiceTo", fields: [invoiceToId], references: [id], onDelete: Cascade)
 
-  items LineItem[]
-
-  // Performance indexes for common queries
-  @@index([status]) // Status-based queries
-  @@index([invoiceFromId]) // Tenant-based queries
-  @@index([invoiceToId]) // Client-based queries
-  @@index([issueDate]) // Date-based queries
-  @@index([dueDate]) // Due date queries
-  @@index([status, invoiceFromId]) // Combined status + tenant
-  @@index([status, dueDate]) // Overdue invoice queries
+  items         InvoiceItem[]
 }
 
-model LineItem {
-  id          String  @id @default(uuid())
+model InvoiceItem {
+  id          String   @id @default(uuid())
   title       String
   price       Float
@@ -91,107 +79,49 @@
   quantity    Int
   description String?
-  serviceId   String  @map("service_id")
-  service     Service @relation(fields: [serviceId], references: [id], onDelete: Cascade)
-  invoiceId   String  @map("invoice_id")
-  invoice     Invoice @relation(fields: [invoiceId], references: [id], onDelete: Cascade)
+  serviceId   String
+  service     Service   @relation(fields: [serviceId], references: [id], onDelete: Cascade)
+  invoiceId   String
+  invoice     Invoice   @relation(fields: [invoiceId], references: [id], onDelete: Cascade)
 }
 
-model Tenant {
-  id                String     @id @default(cuid())
-  name              String
-  email             String     @unique
-  address           Json
-  bankAccounts      Json?      @map("bank_accounts")
-  logoUrl           String?    @map("logo_url")
-  phoneNumber       String?    @map("phone_number")
-  vatNumber         String?    @map("vat_number")
-  companyNumber     String?    @map("company_number")
-  representative    String
-  lastInvoiceNumber String     @default("0") @map("last_invoice_number")
-  createdAt         DateTime   @default(now()) @map("created_at")
-  updatedAt         DateTime   @updatedAt @map("updated_at")
-  invoicesSent      Invoice[]
-  services          Service[]
-  employees         Employee[]
-  clients           Client[]
-  users             User[]
-}
-
-model Employee {
-  id        String         @id @default(uuid())
-  name      String
-  email     String         @unique
-  status    EmployeeStatus @default(active)
-  iban      String?
-  cv        String?
-  photo     String?
-  project   String?
-  tenantId  String         @map("tenant_id")
-  tenant    Tenant         @relation(fields: [tenantId], references: [id], onDelete: Cascade)
-  createdAt DateTime       @default(now()) @map("created_at")
-  updatedAt DateTime       @updatedAt @map("updated_at")
-}
-
-model User {
-  id          String   @id @default(uuid())
-  uid         String   @unique // Firebase UID
-  email       String   @unique
-  displayName String   @map("display_name")
-  role        UserRole
-  tenantId    String   @map("tenant_id")
-  tenant      Tenant   @relation(fields: [tenantId], references: [id], onDelete: Cascade)
-  createdAt   DateTime @default(now()) @map("created_at")
-  updatedAt   DateTime @updatedAt @map("updated_at")
-}
-
-enum UserRole {
-  ADMIN   @map("ADMIN")
-  MANAGER @map("MANAGER")
-  USER    @map("USER")
-}
-
-enum ClientStatus {
-  active   @map("ACTIVE")
-  banned   @map("BANNED")
-  inactive @map("INACTIVE")
+// Enums
+enum CustomerStatus {
+  active
+  banned
+  inactive
 }
 
 enum InvoiceStatus {
-  draft      @map("DRAFT")
-  processing @map("PROCESSING")
-  pending    @map("PENDING")
-  overdue    @map("OVERDUE")
-  paid       @map("PAID")
+  DRAFT
+  PROCESSING
+  PENDING
+  OVERDUE
+  PAID
 }
 
 enum Currency {
-  EUR @map("EUR")
-  USD @map("USD")
+  EUR
+  USD
 }
 
 enum QuantityType {
-  Unit   @map("UNIT")
-  Hour   @map("HOUR")
-  Sprint @map("SPRINT")
-  Month  @map("MONTH")
+  UNIT
+  HOUR
+  SPRINT
+  MONTH
 }
 
 enum Month {
-  January   @map("JANUARY")
-  February  @map("FEBRUARY")
-  March     @map("MARCH")
-  April     @map("APRIL")
-  May       @map("MAY")
-  June      @map("JUNE")
-  July      @map("JULY")
-  August    @map("AUGUST")
-  September @map("SEPTEMBER")
-  October   @map("OCTOBER")
-  November  @map("NOVEMBER")
-  December  @map("DECEMBER")
+  JANUARY
+  FEBRUARY
+  MARCH
+  APRIL
+  MAY
+  JUNE
+  JULY
+  AUGUST
+  SEPTEMBER
+  OCTOBER
+  NOVEMBER
+  DECEMBER
 }
-
-enum EmployeeStatus {
-  active   @map("ACTIVE")
-  inactive @map("INACTIVE")
-}
Index: prisma/seed.js
===================================================================
--- prisma/seed.js	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ prisma/seed.js	(revision 5d6f37a75130aab7d9a67b5b430603eff2c0ca6e)
@@ -4,94 +4,123 @@
 
 async function main() {
-  // Clear existing data
-  await prisma.service.deleteMany();
-  await prisma.user.deleteMany();
-  await prisma.tenant.deleteMany();
+  console.log('🌱 Seeding database...');
 
-  // Define default tenant data
-  const tenantData = {
-    id: "cm7lxc3p00000pb7kmdrxsfod",
-    name: "MVP Masters",
-    email: "info@mvpmasters.com",
-    address: {
-      street: "Makedonska Treta Brigada 56",
-      city: "Skopje",
-      state: "Macedonia",
-      zip: "1000",
-      country: "Macedonia"
+  // Create Customers
+  const customer1 = await prisma.customer.create({
+    data: {
+      name: 'Acme Corp',
+      email: 'contact@acme.com',
+      street: '123 Main St',
+      city: 'New York',
+      country: 'USA',
+      state: 'NY',
+      zip: '10001',
+      phoneNumber: '+1 555-555-5555',
+      vatNumber: 'US123456789',
+      companyNumber: '123456789',
+      representative: 'John Doe',
+      status: 'ACTIVE',
+      logoUrl: 'https://example.com/logo.png',
     },
-    phoneNumber: "+389 72 233 943",
-    representative: "Naum Shapkarovski",
-    lastInvoiceNumber: "1",
-    logoUrl: "https://example.com/default-logo.png",
-    vatNumber: "VAT123456789",
-    companyNumber: "COMP123456",
-    bankAccounts: {
-      eur: {
-        accountNumber: "1234567890",
-        routingNumber: "987654321",
-        bicSwift: "DEFBANKXXX",
-        iban: "DE89370400440532013000"
-      },
-      usd: {
-        accountNumber: "0987654321",
-        routingNumber: "123456789",
-        bicSwift: "DEFBANKXXX",
-        iban: "US89370400440532013000"
-      }
-    },
-    // Add services along with the tenant creation
-    services: {
-      create: [
-        {
-          name: "Web Development",
-          sprint: 5000,
-          hour: 150,
-          month: 8000
-        },
-        {
-          name: "UI/UX Design",
-          sprint: 3000,
-          hour: 120,
-          month: 6000
-        },
-        {
-          name: "Consulting",
-          sprint: 4000,
-          hour: 200,
-          month: 7000
-        }
-      ]
-    }
-  };
-
-  // Create default tenant with services
-  const defaultTenant = await prisma.tenant.create({
-    data: tenantData,
-    include: {
-      services: true
-    }
   });
 
-  // Add default admin user
-  const defaultUser = await prisma.user.create({
+  const customer2 = await prisma.customer.create({
     data: {
-      id: 'dK2y3WezYWWltHCaBRvUFlddkOr2',
-      uid: 'dK2y3WezYWWltHCaBRvUFlddkOr2',
-      email: 'naum@mvpmasters.com',
-      displayName: 'Naum',
-      role: 'ADMIN',
-      tenantId: 'cm7lxc3p00000pb7kmdrxsfod'
-    }
+      name: 'Globex Ltd.',
+      email: 'info@globex.com',
+      street: '456 Industrial Rd',
+      city: 'Los Angeles',
+      country: 'USA',
+      state: 'CA',
+      zip: '90001',
+      phoneNumber: '+1 555-123-4567',
+      vatNumber: 'US987654321',
+      companyNumber: '987654321',
+      representative: 'Jane Smith',
+      status: 'INACTIVE',
+      logoUrl: 'https://example.com/logo2.png',
+    },
   });
 
-  console.log('🌱 Seeding database...');
-  console.log('Seeded default tenant:', defaultTenant);
-  console.log('Seeded default user:', defaultUser);
+  // Create Bank Accounts
+  await prisma.bankAccount.createMany({
+    data: [
+      {
+        customerId: customer1.id,
+        accountNumber: '1234567890',
+        bicSwift: 'ACMEUS33',
+        iban: 'US12345678901234567890',
+        routingNumber: '111000025',
+        currency: 'USD',
+      },
+      {
+        customerId: customer2.id,
+        accountNumber: '0987654321',
+        bicSwift: 'GLOBEXUS12',
+        iban: 'US09876543210987654321',
+        routingNumber: '222000033',
+        currency: 'EUR',
+      },
+    ],
+  });
+
+  // Create Services
+  const service1 = await prisma.service.create({
+    data: {
+      name: 'Web Development',
+      sprintPrice: 5000.0,
+      hourPrice: 100.0,
+      monthPrice: 20000.0,
+    },
+  });
+
+  const service2 = await prisma.service.create({
+    data: {
+      name: 'SEO Optimization',
+      sprintPrice: 3000.0,
+      hourPrice: 75.0,
+      monthPrice: 12000.0,
+    },
+  });
+
+  // Create Invoices
+  const invoice1 = await prisma.invoice.create({
+    data: {
+      dueDate: new Date('2025-03-15'),
+      status: 'PENDING',
+      currency: 'USD',
+      quantityType: 'HOUR',
+      subTotal: 5000.0,
+      createDate: new Date(),
+      month: 'FEBRUARY',
+      discount: 0.0,
+      taxes: 500.0,
+      totalAmount: 5500.0,
+      invoiceNumber: 'INV-2025-001',
+      pdfRef: 'https://example.com/invoice1.pdf',
+      invoiceFromId: customer1.id,
+      invoiceToId: customer2.id,
+    },
+  });
+
+  // Create Invoice Items
+  await prisma.invoiceItem.create({
+    data: {
+      title: 'Web Development - Sprint 1',
+      price: 5000.0,
+      total: 5000.0,
+      quantity: 1,
+      description: 'Development of the MVP frontend',
+      serviceId: service1.id,
+      invoiceId: invoice1.id,
+    },
+  });
+
+  console.log('✅ Seeding complete!');
 }
 
 main()
   .catch((e) => {
-    console.error('Error seeding database:', e);
+    console.error(e);
     process.exit(1);
   })
Index: ripts/verify-user-email.js
===================================================================
--- scripts/verify-user-email.js	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ 	(revision )
@@ -1,28 +1,0 @@
-const admin = require('firebase-admin');
-const serviceAccount = require('../service-account.json');
-
-// Initialize Firebase Admin
-admin.initializeApp({
-  credential: admin.credential.cert(serviceAccount)
-});
-
-async function verifyUserEmail() {
-  const uid = 'dK2y3WezYWWltHCaBRvUFlddkOr2';
-
-  try {
-    // Update the user's email verified status
-    await admin.auth().updateUser(uid, {
-      emailVerified: true,
-    });
-
-    // Get the updated user to confirm
-    const user = await admin.auth().getUser(uid);
-    console.log('User email verified successfully');
-    console.log('User details:', user.toJSON());
-  } catch (error) {
-    console.error('Error verifying user email:', error);
-  }
-}
-
-// Run the function
-verifyUserEmail(); 
Index: service-account.json
===================================================================
--- service-account.json	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ service-account.json	(revision 5d6f37a75130aab7d9a67b5b430603eff2c0ca6e)
@@ -1,13 +1,13 @@
 {
   "type": "service_account",
-  "project_id": "agency-os-prod",
-  "private_key_id": "1e74e55e80a03fc705c995b8d2430f6d4761a281",
-  "private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCUrVSjMy575tLw\n2bw10FkzfIRxgY0UWPvlhwH1o8iRV9PQMgPr4HmGwK9CmUIqa3LRdi4KzrrCPYoP\noBzMxJCuPSR9ii9XNdqH0uLolP05xOkfCpxUMR5dgS3ExreX+d9xwFVwjfoHRiuw\nNYoayYZrJakhmzmRAU5oiwVZzFtBilQKkvnQJbIIlovksczBE4xUlTz4xmrZWtvQ\nzEnthzxCDrdCvrw5YtafOGpPNg0rEbA9+IwykPWNR+YYVQXLuIKHNYQSV+SlmYAz\n9CdN3Yl+TIsX01aPMJ+gHPr3OhVTk3a97I6WJ7/NIIMDnEvnVU5dYn8j9GwxIWqP\nIWfs9NizAgMBAAECggEASlXLTnmlkR9ccj17A7DzGHH2SkYKwpSnBSCWUzmba0ft\nSFfpbALk4AHw3qx/z3O/iYi8Bn1MFRftslhMbfkNmYBKgVYYy1LKu0QuXTk4zqxs\nHjAQ72tLklanCo6MdrjhBh+y2D60NvTXnRd3wGLoCSRgRsQ0aRKtIEn51+b77W03\n7VLrXjoXdA6/J4X7NGXN12z4YCUnq7MjTcWoGKYnM0nnay8fFdQw598/CfZBY+zb\nYw9u9E8//OCmQ9p15nmcky+ZOq1lbjPLvOamErLHI+Z+bdRlqQugURItT6rTn4rs\nxxn+VqZ33TDo8iu5jOueEFyu6v/Irs/pQmWQjO/V6QKBgQDHDlqxeD05ac/Mus2m\ncUZesbZPEOLf1iuNRGGyZhUWIH63neCBtMxmpunG27u8Zcc4nOSDb8gVowkrBwRf\nxOT9QkW4Z++0CykMoZFrHySjrx6pgG5ylR6hutJZ8aI07uLU+H1DnkInQwmNrA38\njYu239ofZWsRYB/OXAtMLHqDtwKBgQC/NYcJkyADsZB+UNguwxwPxi2U6vaBh2a4\n+W2F0LI47tNkwXtfNPlDRdTwraoucKlPvu6gcHvSt+MQEPkx1gwdnIgiBoeooi4P\nLDUp4OKWdTPo+s4D0W8Z5h2l5/Fegu/Fn6l0iu8hldeAknttwrwTaoq7M+LeJtcX\nuW+Cjkcq5QKBgEMPi/BkIMQ56J8BhA0B9oIqfs/uUXC1l6CVHBDdIVd+BRLZJmys\nO3yN2Q58sqfK5i4ldTruqsrXTVxolcmp7LeB3zk8Et5mMCMoP3SGXnKiqcLTGOKT\naGl2Ji3VIR+SJ2s2eAUSyRivFgXbpC6khSBMFBElusd0yeJc0hWMmo3LAoGASilt\nvdX1pdkaDRQ4NTLx0GByT38uqyCkQ/xicXN3nMNs9Hhi7JN0VpZgOBVzm12RHeAV\nV98o95rhE9sxfBXkTxvmZSQZO9vjd3kTCbIy0F6XCrc0bqCtseLh/vZOVPT+IK2D\noTM9+s3ObwzhmLneDr3VHzTJupZf+NCwoneivM0CgYEAxIp4qoX/cBpUTfR2Q99r\nzaaYufgs4PcekDPXykJxrdjDmP5cOSIwyAUf6k1fTUB3qyhtlyq481K3dQBpKOP3\nbQAJrxl6w+/rNS2YIdjM9RXw1wHNiLd0RfaNtzdebdiILYzRzSLdBmtzwXKmw7Cu\ntS4FVx/E+qdHsOyggGub24k=\n-----END PRIVATE KEY-----\n",
-  "client_email": "firebase-adminsdk-fbsvc@agency-os-prod.iam.gserviceaccount.com",
-  "client_id": "102922480115315079115",
+  "project_id": "mvp-masters",
+  "private_key_id": "41113eebee172158f148448927355ce095b111f3",
+  "private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCjMylcnnaenb6k\nDRY++GyIHbyyzQc+5ChXd6ixB5x0KYLLDs/6hqgSeIjI3urLee7i05NeQYVGIXGE\nvjqOhTdjwr11hIHRcNMIAjMYaI4HNiJHweQa72ux9dB1cZpYpQQrBuG5k3Sf/WjO\ntfiPnP7a7dR00KctsL22FAm4JH+CvfTWQoLpa7n3bhQmNOXZmCLb2ZRU6AkGuYh+\nq5ko5epj7sCtyqAcefUJXysC0EpRySgbeQsXewyvBrSOx2onPnjq+q0Zw9PdVhOH\nSr3zwdQq9DDLYOH1YB1DbaOEI+8tybCT3HHIOKJpCVga/mVZtzoEBR4zbbnkzshe\nS7IDPh2NAgMBAAECggEAIqDFrzkRZsUGUTVUqc5Y6wXSRucRmULcm3iQkuWQSSaQ\nscjGEPyW93pbXbHNBJkt+rOVcpu47WFFvrqFXr29+70zqZaQ3BGSOYIL+Osgbb/L\nBMpLffqcsZE8ptrQuuvip0WJyjBTP+pLXYcHg2N2wRnTKWkne96jVlnImSmnY6RW\n57V0ch/1PjX3SUQaBST6/BkW4qeo93rDU+qhuirtWhTcP64BQyX2CYzzJayLbNuL\ndETvIOaIEw48aBbHGHsmkxUw4E0UaYctaRDAZNlmxA2hulosG6F/TiAQ6/fF+ZCC\nssk5DM5/hGb62/H+Hdoyru/OIjYqNAScgWFjPm50wQKBgQC3Q9qcdm2qzkupEOfj\n2/ATjiXwZkcOjqWFAZuwI0wh4pbuK6dwzUypicMPf9UbGbp48xJKedzXSV5cC+bs\nCubZjdp5pwDyz1gj2QrHTZ37BV93OQyFdjpKVGZHUNVXsDdRmEG3wdrA+TXbGsnU\nLcQrUjjJSlx+PKVUya8OB2PFwQKBgQDj+KMhYbGXsoWWJyV8dzl/jOHc2axW6kc5\nPvnx48sMDgCwHSDTKC5h3IOrbBXTdAlbqztLMCyd7O0OTPFFBbBz4WdICPdl3n0h\nMYySReqjW/cG+ataLRNZ3p1DtKwxLDONSEEib0XyW2x2i4S8QMwUM31hbusbtBz6\ngBnUGJ1CzQKBgQCM/4GUW3FotqtzefRPVQnSoc0Ctk35HzqtqF0WGTIb5+9jcuay\nXOGclscih6F35kWXhLwP3M5SPLqCaw3RkVmnDAKJEjoilfAkNHqceFURqkKWwaem\njx2tzl2ahNB/VK5a8p+tN1KMobAT0PpzanrBMdNK2xFqdlJld35ddsYGgQKBgQCs\n7WFJJCMj0C6XLNC5rnK2N3bpIVEiiQpH+WZ9v265kTGiZiYNJtCwOSbD9PRFdyLW\nH3iV21As55kWnPTzh5JHBLdkpDCOXIwMjtpz5odLLaqf5um9OK4SINSolDd+AWqF\nhEasST4Ezqbi8YhZiMmFlV1JeGrtk93bgyqUgathDQKBgDrnDmIUr9czUIUHIiyz\nFuUDAVqzVAGNol3KknCGfxPssGj7ln+ml7b+db44QKloWxDvtXKiUEVBzYsTsTnz\nX40/oD5FlobeEYUNSIUza/SAhf8KzX6ISo/Ogk8YMd4mvZxeeXPFQHgHd3mJR1s9\ngnNcqCHEulwV+m9E3dnNU6ds\n-----END PRIVATE KEY-----\n",
+  "client_email": "firebase-adminsdk-6i4ka@mvp-masters.iam.gserviceaccount.com",
+  "client_id": "104648727229584211592",
   "auth_uri": "https://accounts.google.com/o/oauth2/auth",
   "token_uri": "https://oauth2.googleapis.com/token",
   "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
-  "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/firebase-adminsdk-fbsvc%40agency-os-prod.iam.gserviceaccount.com",
+  "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/firebase-adminsdk-6i4ka%40mvp-masters.iam.gserviceaccount.com",
   "universe_domain": "googleapis.com"
 }
Index: l/01_invoice_status_trigger.sql
===================================================================
--- sql/01_invoice_status_trigger.sql	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ 	(revision )
@@ -1,199 +1,0 @@
--- This trigger fires when an invoice status is updated
-
--- First, create a table to log invoice status changes and history
-CREATE TABLE IF NOT EXISTS "InvoiceStatusHistory" (
-    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
-    invoice_id VARCHAR(255) NOT NULL,
-    old_status VARCHAR(50),
-    new_status VARCHAR(50) NOT NULL,
-    changed_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
-    total_amount FLOAT,
-    days_since_issue INTEGER,
-    auto_generated BOOLEAN DEFAULT FALSE,
-    FOREIGN KEY (invoice_id) REFERENCES "Invoice"(id) ON DELETE CASCADE
-);
-
--- Create a notifications table
-CREATE TABLE IF NOT EXISTS "InvoiceNotifications" (
-    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
-    invoice_id VARCHAR(255) NOT NULL,
-    notification_type VARCHAR(50) NOT NULL,
-    message TEXT NOT NULL,
-    priority VARCHAR(20) DEFAULT 'MEDIUM',
-    created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
-    processed BOOLEAN DEFAULT FALSE,
-    FOREIGN KEY (invoice_id) REFERENCES "Invoice"(id) ON DELETE CASCADE
-);
-
--- Trigger function that performs multiple operations
-CREATE OR REPLACE FUNCTION handle_invoice_status_update()
-RETURNS TRIGGER AS $$
-DECLARE
-    days_since_issue INTEGER;
-    client_total_outstanding FLOAT := 0;
-    client_invoice_count INTEGER := 0;
-    tenant_monthly_revenue FLOAT := 0;
-    notification_message TEXT;
-    priority_level VARCHAR(20) := 'MEDIUM';
-BEGIN
-    -- Only proceed if status has actually changed
-    IF OLD.status = NEW.status THEN
-        RETURN NEW;
-    END IF;
-
-    -- Calculate days since invoice was issued
-    days_since_issue := EXTRACT(DAYS FROM (NOW() - NEW.issue_date));
-
-    -- Log the status change in history
-    INSERT INTO "InvoiceStatusHistory" (
-        invoice_id, 
-        old_status, 
-        new_status, 
-        total_amount, 
-        days_since_issue,
-        auto_generated
-    ) VALUES (
-        NEW.id, 
-        OLD.status, 
-        NEW.status, 
-        NEW.total_amount, 
-        days_since_issue,
-        TRUE
-    );
-
-    -- Calculate client's total outstanding invoices
-    SELECT 
-        COALESCE(SUM(total_amount), 0),
-        COUNT(*)
-    INTO client_total_outstanding, client_invoice_count
-    FROM "Invoice" 
-    WHERE client_id = NEW.client_id 
-    AND status IN ('PENDING', 'OVERDUE', 'PROCESSING');
-
-    -- Calculate tenant's monthly revenue for current month
-    SELECT COALESCE(SUM(total_amount), 0)
-    INTO tenant_monthly_revenue
-    FROM "Invoice"
-    WHERE tenant_id = NEW.tenant_id
-    AND status = 'PAID'
-    AND EXTRACT(MONTH FROM issue_date) = EXTRACT(MONTH FROM NOW())
-    AND EXTRACT(YEAR FROM issue_date) = EXTRACT(YEAR FROM NOW());
-
-    -- Complex business logic based on status changes
-    CASE NEW.status
-        WHEN 'PAID' THEN
-            notification_message := format(
-                'Invoice %s (€%s) has been PAID! Client total outstanding: €%s across %s invoices. Monthly revenue: €%s',
-                NEW.invoice_number, 
-                to_char(NEW.total_amount, 'FM999999999.00'),
-                to_char(client_total_outstanding, 'FM999999999.00'),
-                client_invoice_count,
-                to_char(tenant_monthly_revenue, 'FM999999999.00')
-            );
-            priority_level := 'LOW';
-            
-            -- Update client status if they have no more outstanding invoices
-            IF client_total_outstanding = 0 THEN
-                UPDATE "Client" 
-                SET status = 'ACTIVE'
-                WHERE id = NEW.client_id AND status != 'ACTIVE';
-                
-                notification_message := notification_message || ' Client status updated to ACTIVE.';
-            END IF;
-
-        WHEN 'OVERDUE' THEN
-            notification_message := format(
-                'CRITICAL: Invoice %s (€%s) is now OVERDUE (%s days since issue). Client owes €%s total across %s invoices.',
-                NEW.invoice_number,
-                to_char(NEW.total_amount, 'FM999999999.00'),
-                days_since_issue,
-                to_char(client_total_outstanding, 'FM999999999.00'),
-                client_invoice_count
-            );
-            priority_level := 'HIGH';
-            
-            -- Flag client if they have too many overdue invoices
-            IF client_invoice_count > 3 THEN
-                UPDATE "Client" 
-                SET status = 'INACTIVE'
-                WHERE id = NEW.client_id;
-                
-                notification_message := notification_message || ' Client flagged as INACTIVE due to multiple overdue invoices.';
-            END IF;
-
-        WHEN 'PROCESSING' THEN
-            notification_message := format(
-                'Invoice %s (€%s) is now being processed. Days since issue: %s',
-                NEW.invoice_number,
-                to_char(NEW.total_amount, 'FM999999999.00'),
-                days_since_issue
-            );
-
-        WHEN 'PENDING' THEN
-            notification_message := format(
-                'Invoice %s (€%s) is pending payment. Client total outstanding: €%s',
-                NEW.invoice_number,
-                to_char(NEW.total_amount, 'FM999999999.00'),
-                to_char(client_total_outstanding, 'FM999999999.00')
-            );
-            
-            -- Warn if client has high outstanding amount
-            IF client_total_outstanding > 10000 THEN
-                priority_level := 'HIGH';
-                notification_message := notification_message || ' WARNING: High outstanding amount!';
-            END IF;
-
-        ELSE
-            notification_message := format(
-                'Invoice %s status changed from %s to %s',
-                NEW.invoice_number, OLD.status, NEW.status
-            );
-    END CASE;
-
-    -- Insert notification
-    INSERT INTO "InvoiceNotifications" (
-        invoice_id,
-        notification_type,
-        message,
-        priority
-    ) VALUES (
-        NEW.id,
-        'STATUS_CHANGE',
-        notification_message,
-        priority_level
-    );
-
-    -- Auto-update due date if status changes to PENDING and due date is in the past
-    IF NEW.status = 'PENDING' AND NEW.due_date < NOW() THEN
-        NEW.due_date := NOW() + INTERVAL '30 days';
-        
-        INSERT INTO "InvoiceNotifications" (
-            invoice_id,
-            notification_type,
-            message,
-            priority
-        ) VALUES (
-            NEW.id,
-            'DUE_DATE_EXTENDED',
-            format('Due date automatically extended to %s for invoice %s', NEW.due_date::DATE, NEW.invoice_number),
-            'MEDIUM'
-        );
-    END IF;
-
-    RETURN NEW;
-END;
-$$ LANGUAGE plpgsql;
-
--- Create the trigger
-DROP TRIGGER IF EXISTS invoice_status_update_trigger ON "Invoice";
-CREATE TRIGGER invoice_status_update_trigger
-    AFTER UPDATE ON "Invoice"
-    FOR EACH ROW
-    WHEN (OLD.status IS DISTINCT FROM NEW.status)
-    EXECUTE FUNCTION handle_invoice_status_update();
-
--- Create indexes for performance on new tables
-CREATE INDEX IF NOT EXISTS idx_invoice_status_history_invoice_id ON "InvoiceStatusHistory"(invoice_id);
-CREATE INDEX IF NOT EXISTS idx_invoice_status_history_changed_at ON "InvoiceStatusHistory"(changed_at);
-CREATE INDEX IF NOT EXISTS idx_invoice_notifications_invoice_id ON "InvoiceNotifications"(invoice_id);
-CREATE INDEX IF NOT EXISTS idx_invoice_notifications_processed ON "InvoiceNotifications"(processed) WHERE processed = FALSE; 
Index: l/02_client_email_index.sql
===================================================================
--- sql/02_client_email_index.sql	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ 	(revision )
@@ -1,18 +1,0 @@
--- Index Optimization for Client Email Queries
--- This creates an optimized index for queries like: SELECT * FROM "Client" WHERE email = 'test@example.com'
-
--- Drop existing index if it exists (Prisma may have created a basic one)
-DROP INDEX IF EXISTS idx_client_email_basic;
-
--- Index for client email queries
-CREATE INDEX IF NOT EXISTS idx_client_email ON "Client"(email);
-
--- Index for email + tenant lookups
-CREATE INDEX IF NOT EXISTS idx_client_email_tenant ON "Client"(email, tenant_id);
-
--- Create a case-insensitive index for email searches
--- This allows case-insensitive email lookups using functional index
-CREATE INDEX IF NOT EXISTS idx_client_email_lower ON "Client"(LOWER(email));
-
--- Update table statistics for query planner optimization
-ANALYZE "Client"; 
Index: src/api/customer.ts
===================================================================
--- src/api/customer.ts	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ src/api/customer.ts	(revision 5d6f37a75130aab7d9a67b5b430603eff2c0ca6e)
@@ -1,5 +1,5 @@
 import { useMemo } from 'react';
 // types
-import { Customer } from 'src/schemas';
+import { Customer } from 'mvpmasters-shared';
 // db
 import { endpoints, fetcher } from 'src/utils/axios';
@@ -44,22 +44,2 @@
   }
 }
-
-export async function updateCustomer(
-  id: string,
-  customerData: Partial<Customer>
-): Promise<Customer> {
-  try {
-    const response = await axios.patch<Customer>(`${endpoints.customer}/${id}`, customerData);
-
-    // Mutate the SWR cache to update the customer
-    await mutate<Customer[]>(endpoints.customer, (currentData = []) =>
-      currentData.map((customer) =>
-        customer.id === id ? { ...customer, ...response.data } : customer
-      )
-    );
-
-    return response.data;
-  } catch (error) {
-    throw error;
-  }
-}
Index: c/api/employee.ts
===================================================================
--- src/api/employee.ts	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ 	(revision )
@@ -1,45 +1,0 @@
-import { useMemo } from 'react';
-// types
-import { Employee } from 'src/schemas';
-// db
-import { endpoints, fetcher } from 'src/utils/axios';
-import axios from 'src/utils/axios';
-// swr
-import useSWR, { mutate } from 'swr';
-
-export function useGetEmployees() {
-  const collectionName = endpoints.employee;
-
-  const { data, isLoading, error, isValidating } = useSWR(collectionName, fetcher<Employee[]>, {
-    revalidateOnFocus: false,
-  });
-
-  const memoizedValue = useMemo(
-    () => ({
-      employees: data || [],
-      employeesLoading: isLoading,
-      employeesError: error,
-      employeesValidating: isValidating,
-      employeesEmpty: !isLoading && !data?.length,
-    }),
-    [data, error, isLoading, isValidating]
-  );
-
-  return memoizedValue;
-}
-
-export async function createEmployee(employeeData: Partial<Employee>): Promise<Employee> {
-  try {
-    const response = await axios.post<Employee>(endpoints.employee, employeeData);
-
-    // Mutate the SWR cache to include the new employee
-    await mutate<Employee[]>(endpoints.employee, (currentData = []) => [
-      ...currentData,
-      response.data,
-    ]);
-
-    return response.data;
-  } catch (error) {
-    throw error;
-  }
-}
Index: src/api/invoice.ts
===================================================================
--- src/api/invoice.ts	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ src/api/invoice.ts	(revision 5d6f37a75130aab7d9a67b5b430603eff2c0ca6e)
@@ -1,11 +1,8 @@
 import { useMemo } from 'react';
 // types
-import { Invoice, UpdateInvoice } from 'src/schemas';
+import { Invoice } from 'mvpmasters-shared';
 // db
 import useSWR from 'swr';
 import { endpoints, fetcher } from 'src/utils/axios';
-import axios from 'src/utils/axios';
-import { mutate } from 'swr';
-import { useSWRConfig } from 'swr';
 
 interface InvoiceFilters {
@@ -54,102 +51,26 @@
 }
 
-export function useGetInvoice({ id }: { id: string }) {
-  const path = endpoints.invoice;
+// export function useGetInvoice({ id }: { id: string }) {
+//   const collectionName = collections.invoice;
 
-  const { data, isLoading, error, isValidating } = useSWR(
-    `${path}/${id}`,
-    () => fetcher<Invoice>(`${path}/${id}`),
-    {
-      revalidateOnFocus: false,
-    }
-  );
+//   const { data, isLoading, error, isValidating } = useSWR(
+//     [collectionName, id],
+//     () => documentFetcher<Invoice>(collectionName, id),
+//     {
+//       revalidateOnFocus: false,
+//     }
+//   );
 
-  const memoizedValue = useMemo(
-    () => ({
-      currentInvoice: data || null,
-      currentInvoiceLoading: isLoading,
-      currentInvoiceError: error,
-      currentInvoiceValidating: isValidating,
-      currentInvoiceEmpty: !isLoading && !data,
-    }),
-    [data, error, isLoading, isValidating]
-  );
+//   const memoizedValue = useMemo(
+//     () => ({
+//       currentInvoice: data || null,
+//       currentInvoiceLoading: isLoading,
+//       currentInvoiceError: error,
+//       currentInvoiceValidating: isValidating,
+//       currentInvoiceEmpty: !isLoading && !data,
+//     }),
+//     [data, error, isLoading, isValidating]
+//   );
 
-  return memoizedValue;
-}
-
-// Add this interface for the create invoice payload
-interface CreateInvoicePayload {
-  issueDate: Date;
-  dueDate: Date;
-  items: any[];
-  invoiceNumber: string;
-  invoiceFrom: any;
-  invoiceTo: any;
-  currency: string;
-  quantityType: string;
-  month: string;
-  status?: string;
-  taxes?: number;
-  discount?: number;
-  totalAmount: number;
-  pdfRef?: string;
-}
-
-export async function createInvoice(data: CreateInvoicePayload): Promise<Invoice> {
-  const response = await axios.post<Invoice>(endpoints.invoice, data);
-
-  // Mutate the SWR cache to include the new invoice
-  await mutate(
-    endpoints.invoice,
-    (existingInvoices: Invoice[] = []) => [response.data, ...existingInvoices],
-    false // Set to false to avoid revalidation since we already have the new data
-  );
-
-  return response.data;
-}
-
-export async function updateInvoice(id: string, data: Partial<UpdateInvoice>) {
-  const response = await axios.patch<Invoice>(`${endpoints.invoice}/${id}`, data);
-
-  // Mutate the individual invoice cache
-  await mutate(`${endpoints.invoice}/${id}`, response.data, false);
-
-  // Mutate the invoice list cache
-  await mutate(
-    endpoints.invoice,
-    (existingInvoices: Invoice[] = []) =>
-      existingInvoices.map((invoice) => (invoice.id === id ? response.data : invoice)),
-    false
-  );
-
-  return response.data;
-}
-
-export async function deleteInvoice(id: string) {
-  const response = await axios.delete<Invoice>(`${endpoints.invoice}/${id}`);
-
-  // Mutate the invoice list cache to remove the deleted invoice
-  await mutate(
-    endpoints.invoice,
-    (existingInvoices: Invoice[] = []) => existingInvoices.filter((invoice) => invoice.id !== id),
-    false
-  );
-
-  return response.data;
-}
-
-// Update the useDeleteInvoice hook to use the new implementation
-export function useDeleteInvoice() {
-  const deleteInvoiceMutation = async (id: string) => {
-    try {
-      await deleteInvoice(id);
-      return true;
-    } catch (error) {
-      console.error('Error deleting invoice:', error);
-      throw error;
-    }
-  };
-
-  return { deleteInvoiceMutation };
-}
+//   return memoizedValue;
+// }
Index: c/api/invoice/index.ts
===================================================================
--- src/api/invoice/index.ts	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ 	(revision )
@@ -1,1 +1,0 @@
-export * from './use-fetch-analytics';
Index: c/api/invoice/use-fetch-analytics.ts
===================================================================
--- src/api/invoice/use-fetch-analytics.ts	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ 	(revision )
@@ -1,45 +1,0 @@
-import useSWR from 'swr';
-import axios from 'src/utils/axios';
-import { InvoiceStatus } from 'src/schemas';
-
-interface StatusTotals {
-  EUR: number;
-  USD: number;
-}
-
-export interface AnalyticsResults {
-  total: StatusTotals;
-  processing: StatusTotals;
-  paid: StatusTotals;
-  pending: StatusTotals;
-  overdue: StatusTotals;
-  draft: StatusTotals;
-}
-
-async function fetchAnalytics(startDate: Date) {
-  const { data } = await axios.get<AnalyticsResults>('/api/invoices/totals', {
-    params: { startDate: startDate.toISOString() },
-    withCredentials: true,
-    headers: {
-      'Content-Type': 'application/json',
-    },
-  });
-  return data;
-}
-
-export function useFetchAnalytics(startDate: Date | null) {
-  const { data, error, isLoading } = useSWR(
-    startDate ? ['invoiceTotals', startDate] : null,
-    () => startDate && fetchAnalytics(startDate),
-    {
-      revalidateOnFocus: false,
-      shouldRetryOnError: false,
-    }
-  );
-
-  return {
-    analytics: data,
-    analyticsError: error,
-    isAnalyticsLoading: isLoading,
-  };
-}
Index: src/api/service.ts
===================================================================
--- src/api/service.ts	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ src/api/service.ts	(revision 5d6f37a75130aab7d9a67b5b430603eff2c0ca6e)
@@ -1,17 +1,16 @@
 import { useMemo } from 'react';
 // types
-import { Service } from 'src/schemas';
+import { Service } from 'mvpmasters-shared';
+// db
+import { collections, collectionFetcher as fetcher } from 'src/lib/firestore';
 // swr
 import useSWR from 'swr';
-import { endpoints, fetcher } from 'src/utils/axios';
 
 export function useGetServices() {
-  const { data, isLoading, error, isValidating } = useSWR<Service[]>(
-    endpoints.service,
-    () => fetcher<Service[]>(endpoints.service),
-    {
-      revalidateOnFocus: false,
-    }
-  );
+  const collectionName = collections.service;
+
+  const { data, isLoading, error, isValidating } = useSWR(collectionName, fetcher<Service>, {
+    revalidateOnFocus: false,
+  });
 
   const memoizedValue = useMemo(
Index: src/api/settings.ts
===================================================================
--- src/api/settings.ts	(revision 5d6f37a75130aab7d9a67b5b430603eff2c0ca6e)
+++ src/api/settings.ts	(revision 5d6f37a75130aab7d9a67b5b430603eff2c0ca6e)
@@ -0,0 +1,40 @@
+import { useMemo } from 'react';
+// types
+import { Settings } from 'src/types/settings';
+// db
+import { collections, collectionFetcher as fetcher } from 'src/lib/firestore';
+// swr
+import useSWR from 'swr';
+
+export function useGetSettings() {
+  const collectionName = collections.settings;
+
+  const { data, isLoading, error, isValidating } = useSWR(collectionName, fetcher<Settings>, {
+    revalidateOnFocus: false,
+  });
+
+  const dataObject = transformArrayToObject(data);
+
+  const memoizedValue = useMemo(
+    () => ({
+      settings: dataObject || null,
+      settingsLoading: isLoading,
+      settingsError: error,
+      settingsValidating: isValidating,
+      settingsEmpty: !isLoading && !dataObject,
+    }),
+    [dataObject, error, isLoading, isValidating]
+  );
+
+  return memoizedValue;
+}
+
+const transformArrayToObject = (data?: Settings[]): Settings | undefined => {
+  if (!data) return undefined;
+
+  return data.reduce((accumulator: Settings, doc) => {
+    const { id, ...fields } = doc;
+    accumulator[id as keyof Settings] = fields;
+    return accumulator;
+  }, {} as Settings);
+};
Index: c/api/tenant.ts
===================================================================
--- src/api/tenant.ts	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ 	(revision )
@@ -1,23 +1,0 @@
-import { useMemo } from 'react';
-import { Tenant } from 'src/schemas';
-import { endpoints, fetcher } from 'src/utils/axios';
-import useSWR from 'swr';
-
-export function useGetTenant() {
-  const { data, isLoading, error, isValidating } = useSWR(endpoints.tenant, fetcher<Tenant>, {
-    revalidateOnFocus: false,
-  });
-
-  const memoizedValue = useMemo(
-    () => ({
-      settings: data || null,
-      settingsLoading: isLoading,
-      settingsError: error,
-      settingsValidating: isValidating,
-      settingsEmpty: !isLoading && !data,
-    }),
-    [data, error, isLoading, isValidating]
-  );
-
-  return memoizedValue;
-}
Index: c/api/user.ts
===================================================================
--- src/api/user.ts	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ 	(revision )
@@ -1,7 +1,0 @@
-import { AuthUserType } from 'src/auth/types';
-import axiosInstance from 'src/utils/axios';
-
-export async function getUser(): Promise<AuthUserType> {
-  const response = await axiosInstance.get('/api/user');
-  return response.data;
-}
Index: src/app/api/customers/[id]/route.ts
===================================================================
--- src/app/api/customers/[id]/route.ts	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ src/app/api/customers/[id]/route.ts	(revision 5d6f37a75130aab7d9a67b5b430603eff2c0ca6e)
@@ -1,4 +1,4 @@
 import { NextRequest, NextResponse } from 'next/server';
-import { customerSchema } from 'src/schemas';
+import { customerSchema } from 'mvpmasters-shared';
 import prisma from 'src/lib/prisma';
 import { authenticateRequest } from 'src/lib/auth-middleware';
@@ -6,22 +6,15 @@
 export async function PATCH(request: NextRequest, { params }: { params: { id: string } }) {
   try {
-    const auth = await authenticateRequest(request);
-    if (!auth || auth instanceof NextResponse) {
+    const userId = await authenticateRequest(request);
+    if (!userId) {
       return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });
     }
-
-    const { userId, tenantId } = auth;
 
     const body = await request.json();
     const validatedData = customerSchema.partial().parse(body);
 
-    console.log('validatedData', validatedData);
-
-    const customer = await prisma.client.update({
-      where: { id: params.id },
-      data: {
-        ...validatedData,
-        tenantId,
-      },
+    const customer = await prisma.customer.update({
+      where: { id: params.id, userId },
+      data: validatedData,
     });
 
Index: src/app/api/customers/route.ts
===================================================================
--- src/app/api/customers/route.ts	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ src/app/api/customers/route.ts	(revision 5d6f37a75130aab7d9a67b5b430603eff2c0ca6e)
@@ -1,7 +1,6 @@
 import { NextRequest, NextResponse } from 'next/server';
-import { customerTableFiltersSchema, newCustomerSchema } from 'src/schemas';
+import { customerTableFiltersSchema, newCustomerSchema } from 'mvpmasters-shared';
 import prisma from 'src/lib/prisma';
 import { authenticateRequest } from 'src/lib/auth-middleware';
-import { Prisma, ClientStatus } from '@prisma/client';
 
 export async function GET(request: NextRequest) {
@@ -12,5 +11,5 @@
       return authResult;
     }
-    const { userId, tenantId } = authResult;
+    const { userId } = authResult;
 
     const searchParams = request.nextUrl.searchParams;
@@ -24,31 +23,14 @@
     const validatedFilters = customerTableFiltersSchema.parse(filters);
 
-    //   const customers = await prisma.$queryRaw`
-    //   SELECT * FROM "Client"
-    //   WHERE "tenant_id" = ${tenantId}
-    //     AND LOWER(name) LIKE LOWER(${`%${validatedFilters.name}%`})
-    //     ${
-    //       validatedFilters.status
-    //         ? Prisma.sql`AND status = ${validatedFilters.status}::"CustomerStatus"`
-    //         : Prisma.sql`AND TRUE`
-    //     }
-    // `;
-
-    const customers = await prisma.client.findMany({
+    const customers = await prisma.customer.findMany({
       where: {
-        tenantId,
-        name: {
-          contains: validatedFilters.name,
-          mode: 'insensitive',
-        },
-        ...(validatedFilters.status && {
-          status: validatedFilters.status as ClientStatus,
-        }),
+        name: { contains: validatedFilters.name, mode: 'insensitive' },
+        status: validatedFilters.status ? { equals: validatedFilters.status } : undefined,
       },
     });
+    console.log('customers', customers);
 
     return NextResponse.json(customers);
   } catch (error) {
-    console.error('Error fetching customers:', error);
     return NextResponse.json({ error: 'Internal Server Error' }, { status: 500 });
   }
@@ -62,5 +44,5 @@
       return authResult;
     }
-    const { userId, tenantId } = authResult;
+    const { userId } = authResult;
 
     const body = await request.json();
@@ -68,8 +50,8 @@
     console.log('validatedData', validatedData);
 
-    const customer = await prisma.client.create({
+    const customer = await prisma.customer.create({
       data: {
         ...validatedData,
-        tenantId,
+        // userId,
       },
     });
Index: c/app/api/employees/route.ts
===================================================================
--- src/app/api/employees/route.ts	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ 	(revision )
@@ -1,68 +1,0 @@
-import { NextRequest, NextResponse } from 'next/server';
-import { employeeTableFiltersSchema, newEmployeeSchema } from 'src/schemas';
-import prisma from 'src/lib/prisma';
-import { authenticateRequest } from 'src/lib/auth-middleware';
-import { Prisma } from '@prisma/client';
-
-export async function GET(request: NextRequest) {
-  try {
-    // Authenticate the request
-    const authResult = await authenticateRequest(request);
-    if (authResult instanceof NextResponse) {
-      return authResult;
-    }
-    const { userId, tenantId } = authResult;
-
-    const searchParams = request.nextUrl.searchParams;
-    const filters = {
-      name: searchParams.get('name') || '',
-      status: searchParams.get('status') || '',
-    };
-
-    // Validate filters
-    const validatedFilters = employeeTableFiltersSchema.parse(filters);
-
-    // Replace Prisma query with raw SQL
-    const employees = await prisma.$queryRaw`
-      SELECT * FROM "Employee"
-      WHERE "tenantId" = ${tenantId}
-        AND LOWER(name) LIKE LOWER(${`%${validatedFilters.name}%`})
-        ${
-          validatedFilters.status
-            ? Prisma.sql`AND status = ${validatedFilters.status}:::"EmployeeStatus"`
-            : Prisma.sql`AND TRUE`
-        }
-    `;
-
-    return NextResponse.json(employees);
-  } catch (error) {
-    console.error('Error fetching employees:', error);
-    return NextResponse.json({ error: 'Internal Server Error' }, { status: 500 });
-  }
-}
-
-export async function POST(request: NextRequest) {
-  try {
-    // Authenticate the request
-    const authResult = await authenticateRequest(request);
-    if (authResult instanceof NextResponse) {
-      return authResult;
-    }
-    const { userId, tenantId } = authResult;
-
-    const body = await request.json();
-    const validatedData = newEmployeeSchema.parse(body);
-
-    const employee = await prisma.employee.create({
-      data: {
-        ...validatedData,
-        tenantId,
-      },
-    });
-
-    return NextResponse.json(employee, { status: 201 });
-  } catch (error) {
-    console.error('Error creating employee:', error);
-    return NextResponse.json({ error: 'Internal Server Error' }, { status: 500 });
-  }
-}
Index: src/app/api/invoices/[id]/route.ts
===================================================================
--- src/app/api/invoices/[id]/route.ts	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ src/app/api/invoices/[id]/route.ts	(revision 5d6f37a75130aab7d9a67b5b430603eff2c0ca6e)
@@ -1,16 +1,10 @@
 import { NextRequest, NextResponse } from 'next/server';
-import { updateInvoiceSchema } from 'src/schemas';
+import { invoiceSchema } from 'mvpmasters-shared';
 import prisma from 'src/lib/prisma';
 import { authenticateRequest } from 'src/lib/auth-middleware';
-import { Prisma } from '@prisma/client';
 
-export async function GET(request: NextRequest, { params }: { params: { id: string } }) {
+export async function PATCH(request: NextRequest, { params }: { params: { id: string } }) {
   try {
-    // Validate ID format
-    if (!params.id || !/^[0-9a-fA-F-]+$/.test(params.id)) {
-      return NextResponse.json({ error: 'Invalid invoice ID format' }, { status: 400 });
-    }
-
-    // Authenticate request
+    // Authenticate the request
     const authResult = await authenticateRequest(request);
     if (authResult instanceof NextResponse) {
@@ -19,181 +13,32 @@
     const { userId } = authResult;
 
-    // Fetch invoice with user check
-    const invoice = await prisma.invoice.findFirst({
-      where: {
-        id: params.id,
-        // invoiceFromId: userId,
+    const body = await request.json();
+    const validatedData = invoiceSchema.partial().parse(body);
+
+    const invoice = await prisma.invoice.update({
+      where: { id: params.id, userId },
+      data: {
+        ...validatedData,
+        items: validatedData.items
+          ? {
+              deleteMany: {},
+              create: validatedData.items,
+            }
+          : undefined,
       },
       include: {
+        items: {
+          include: {
+            service: true,
+          },
+        },
         invoiceFrom: true,
         invoiceTo: true,
-        items: true,
       },
     });
 
-    if (!invoice) {
-      return NextResponse.json({ error: 'Invoice not found or access denied' }, { status: 404 });
-    }
-
     return NextResponse.json(invoice);
   } catch (error) {
-    console.error('Error fetching invoice:', error);
-
-    if (error instanceof Prisma.PrismaClientKnownRequestError) {
-      return NextResponse.json({ error: 'Database error occurred' }, { status: 500 });
-    }
-
-    return NextResponse.json({ error: 'Internal server error' }, { status: 500 });
+    return NextResponse.json({ error: 'Internal Server Error' }, { status: 500 });
   }
 }
-
-export async function PATCH(request: NextRequest, { params }: { params: { id: string } }) {
-  try {
-    // Validate ID format
-    if (!params.id || !/^[0-9a-fA-F-]+$/.test(params.id)) {
-      return NextResponse.json({ error: 'Invalid invoice ID format' }, { status: 400 });
-    }
-
-    // Authenticate request
-    const authResult = await authenticateRequest(request);
-    if (authResult instanceof NextResponse) {
-      return authResult;
-    }
-    const { userId } = authResult;
-
-    // Parse and validate request body
-    const body = await request.json();
-
-    const validation = updateInvoiceSchema.partial().safeParse(body);
-
-    if (!validation.success) {
-      return NextResponse.json(
-        { error: 'Invalid invoice data', details: validation.error.format() },
-        { status: 400 }
-      );
-    }
-
-    // Verify invoice exists and belongs to user
-    const existingInvoice = await prisma.invoice.findFirst({
-      where: {
-        id: params.id,
-        // invoiceFromId: userId,
-      },
-    });
-
-    if (!existingInvoice) {
-      return NextResponse.json({ error: 'Invoice not found or access denied' }, { status: 404 });
-    }
-
-    // Update invoice and related data
-    const updatedInvoice = await prisma.$transaction(async (tx) => {
-      // Conditionally delete and recreate items only if they are provided
-      if (validation.data.items) {
-        await tx.lineItem.deleteMany({
-          where: { invoiceId: params.id },
-        });
-      }
-
-      // Update the invoice and create new items if provided
-      return tx.invoice.update({
-        where: { id: params.id },
-        data: {
-          invoiceNumber: validation.data.invoiceNumber,
-          issueDate: validation.data.issueDate,
-          dueDate: validation.data.dueDate,
-          status: validation.data.status,
-          currency: validation.data.currency,
-          quantityType: validation.data.quantityType,
-          subTotal: validation.data.subTotal,
-          month: validation.data.month,
-          totalAmount: validation.data.totalAmount,
-          discount: validation.data.discount,
-          taxes: validation.data.taxes,
-          pdfRef: validation.data.pdfRef,
-          invoiceTo: {
-            update: validation.data.invoiceTo,
-          },
-          items: validation.data.items
-            ? {
-                create: validation.data.items.map((item) => ({
-                  ...item,
-                  service: {
-                    connect: { id: item.service.id },
-                  },
-                })),
-              }
-            : undefined,
-        },
-        include: {
-          invoiceFrom: true,
-          invoiceTo: true,
-          items: true,
-        },
-      });
-    });
-
-    return NextResponse.json(updatedInvoice);
-  } catch (error) {
-    console.error('Error updating invoice:', error);
-
-    if (error instanceof Prisma.PrismaClientKnownRequestError) {
-      return NextResponse.json({ error: 'Database error occurred' }, { status: 500 });
-    }
-
-    return NextResponse.json({ error: 'Internal server error' }, { status: 500 });
-  }
-}
-
-export async function DELETE(request: NextRequest, { params }: { params: { id: string } }) {
-  try {
-    // Validate ID format
-    if (!params.id || !/^[0-9a-fA-F-]+$/.test(params.id)) {
-      return NextResponse.json({ error: 'Invalid invoice ID format' }, { status: 400 });
-    }
-
-    // Authenticate request
-    const authResult = await authenticateRequest(request);
-    if (authResult instanceof NextResponse) {
-      return authResult;
-    }
-    const { userId } = authResult;
-    console.log('userId', userId);
-
-    // Verify invoice exists and belongs to user
-    const existingInvoice = await prisma.invoice.findFirst({
-      where: {
-        id: params.id,
-      },
-    });
-
-    if (!existingInvoice) {
-      return NextResponse.json({ error: 'Invoice not found or access denied' }, { status: 404 });
-    }
-
-    // Delete invoice and related items in a transaction
-    await prisma.$transaction(async (tx) => {
-      // Delete related items first
-      await tx.lineItem.deleteMany({
-        where: { invoiceId: params.id },
-      });
-
-      // Delete the invoice
-      await tx.invoice.delete({
-        where: { id: params.id },
-      });
-    });
-
-    return NextResponse.json({ message: 'Invoice deleted successfully' }, { status: 200 });
-  } catch (error) {
-    console.error('Error deleting invoice:', error);
-
-    if (error instanceof Prisma.PrismaClientKnownRequestError) {
-      if (error.code === 'P2025') {
-        return NextResponse.json({ error: 'Invoice not found' }, { status: 404 });
-      }
-      return NextResponse.json({ error: 'Database error occurred' }, { status: 500 });
-    }
-
-    return NextResponse.json({ error: 'Internal server error' }, { status: 500 });
-  }
-}
Index: src/app/api/invoices/route.ts
===================================================================
--- src/app/api/invoices/route.ts	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ src/app/api/invoices/route.ts	(revision 5d6f37a75130aab7d9a67b5b430603eff2c0ca6e)
@@ -1,7 +1,6 @@
 import { NextRequest, NextResponse } from 'next/server';
-import { createInvoiceSchema, invoiceSchema, invoiceTableFiltersSchema } from 'src/schemas';
+import { invoiceSchema, invoiceTableFiltersSchema } from 'mvpmasters-shared';
 import prisma from 'src/lib/prisma';
 import { auth } from 'src/lib/firebase-admin';
-import { InvoiceStatus } from '@prisma/client';
 
 // Helper function to get userId from Authorization header
@@ -24,7 +23,7 @@
   try {
     const userId = await getUserId(request);
-    // if (!userId) {
-    //   return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });
-    // }
+    if (!userId) {
+      return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });
+    }
 
     const searchParams = request.nextUrl.searchParams;
@@ -42,10 +41,9 @@
     const invoices = await prisma.invoice.findMany({
       where: {
-        status: validatedFilters.status
-          ? { equals: validatedFilters.status as InvoiceStatus }
-          : undefined,
-        issueDate: {
-          ...(validatedFilters.startDate && { gte: validatedFilters.startDate }),
-          ...(validatedFilters.endDate && { lte: validatedFilters.endDate }),
+        userId,
+        status: validatedFilters.status ? { equals: validatedFilters.status } : undefined,
+        createDate: {
+          gte: validatedFilters.startDate,
+          lte: validatedFilters.endDate,
         },
         items:
@@ -74,57 +72,17 @@
   try {
     const userId = await getUserId(request);
-    // if (!userId) {
-    //   return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });
-    // }
+    if (!userId) {
+      return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });
+    }
 
     const body = await request.json();
-    const validatedData = createInvoiceSchema.parse(body);
-
-    const tenant = await prisma.tenant.findUnique({
-      where: { id: validatedData.invoiceFrom.id },
-    });
-
-    const toCustomer = await prisma.client.findUnique({
-      where: { id: validatedData.invoiceTo.id },
-    });
-
-    if (!tenant || !toCustomer) {
-      return NextResponse.json({ error: 'Invoice sender or recipient not found' }, { status: 404 });
-    }
-
-    // Update lastInvoiceNumber in tenant
-    const updatedTenant = await prisma.tenant.update({
-      where: { id: tenant.id },
-      data: {
-        lastInvoiceNumber: validatedData.invoiceNumber,
-      },
-    });
+    const validatedData = invoiceSchema.parse(body);
 
     const invoice = await prisma.invoice.create({
       data: {
-        dueDate: validatedData.dueDate,
-        status: validatedData.status,
-        currency: validatedData.currency,
-        quantityType: validatedData.quantityType,
-        subTotal: validatedData.subTotal,
-        issueDate: validatedData.issueDate,
-        month: validatedData.month,
-        discount: validatedData.discount,
-        taxes: validatedData.taxes,
-        totalAmount: validatedData.totalAmount,
-        invoiceNumber: validatedData.invoiceNumber,
-        invoiceFromId: tenant.id,
-        invoiceToId: toCustomer.id,
+        ...validatedData,
+        userId,
         items: {
-          create: validatedData.items.map((item) => ({
-            title: item.title,
-            price: item.price,
-            total: item.total,
-            quantity: item.quantity,
-            description: item.description,
-            service: {
-              connect: { id: item.service.id },
-            },
-          })),
+          create: validatedData.items,
         },
       },
@@ -142,5 +100,4 @@
     return NextResponse.json(invoice, { status: 201 });
   } catch (error) {
-    console.error(error);
     return NextResponse.json({ error: 'Internal Server Error' }, { status: 500 });
   }
Index: c/app/api/invoices/totals/route.ts
===================================================================
--- src/app/api/invoices/totals/route.ts	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ 	(revision )
@@ -1,71 +1,0 @@
-import { NextRequest, NextResponse } from 'next/server';
-import prisma from 'src/lib/prisma';
-import { authenticateRequest } from 'src/lib/auth-middleware';
-
-type InvoiceStatus = 'processing' | 'paid' | 'pending' | 'overdue' | 'draft';
-type CurrencyTotals = { EUR: number; USD: number };
-type Results = Record<InvoiceStatus | 'total', CurrencyTotals>;
-
-export async function GET(request: NextRequest) {
-  try {
-    // Authenticate the request
-    const authResult = await authenticateRequest(request);
-
-    if (!authResult || authResult instanceof NextResponse) {
-      return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });
-    }
-
-    const { userId, tenantId } = authResult;
-
-    const searchParams = request.nextUrl.searchParams;
-    const startDate = searchParams.get('startDate')
-      ? new Date(searchParams.get('issueDate')!)
-      : null;
-
-    if (!startDate) {
-      return NextResponse.json({ error: 'Start date is required' }, { status: 400 });
-    }
-
-    // Calculate totals using raw SQL
-    const totals = await prisma.$queryRaw`
-      SELECT 
-        status,
-        currency,
-        SUM("total_amount") as total
-      FROM "Invoice"
-      WHERE "issue_date" >= ${startDate}
-        AND "tenant_id" = ${tenantId}
-      GROUP BY status, currency
-    `;
-
-    // Format the response
-    const results: Results = {
-      total: { EUR: 0, USD: 0 },
-      processing: { EUR: 0, USD: 0 },
-      paid: { EUR: 0, USD: 0 },
-      pending: { EUR: 0, USD: 0 },
-      overdue: { EUR: 0, USD: 0 },
-      draft: { EUR: 0, USD: 0 },
-    };
-
-    // Process the results - adjusted for raw SQL response format
-    for (const row of totals as {
-      status: string;
-      currency: 'EUR' | 'USD';
-      total: string | number;
-    }[]) {
-      const { status, currency, total } = row;
-      const statusKey = status.toLowerCase() as InvoiceStatus;
-      if (statusKey in results && (currency === 'EUR' || currency === 'USD')) {
-        const amount = Number(total) || 0;
-        results[statusKey][currency] = amount;
-        results.total[currency] += amount;
-      }
-    }
-
-    return NextResponse.json(results);
-  } catch (error) {
-    console.error('Error calculating totals:', error);
-    return NextResponse.json({ error: 'Internal Server Error' }, { status: 500 });
-  }
-}
Index: c/app/api/services/route.ts
===================================================================
--- src/app/api/services/route.ts	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ 	(revision )
@@ -1,11 +1,0 @@
-import prisma from 'src/lib/prisma';
-import { NextResponse } from 'next/server';
-
-export async function GET() {
-  try {
-    const services = await prisma.service.findMany();
-    return NextResponse.json(services);
-  } catch (error) {
-    return NextResponse.json({ error: 'Failed to fetch services' }, { status: 500 });
-  }
-}
Index: c/app/api/tenant/route.ts
===================================================================
--- src/app/api/tenant/route.ts	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ 	(revision )
@@ -1,74 +1,0 @@
-import { NextRequest, NextResponse } from 'next/server';
-import prisma from 'src/lib/prisma';
-import { tenantSchema } from 'src/schemas';
-import { z } from 'zod';
-import { authenticateRequest } from 'src/lib/auth-middleware';
-
-export async function GET(request: NextRequest) {
-  try {
-    const auth = await authenticateRequest(request);
-    if (auth instanceof NextResponse) {
-      return auth; // Return error response if authentication failed
-    }
-    const { tenantId } = auth;
-
-    const tenant = await prisma.tenant.findUnique({
-      where: { id: tenantId },
-    });
-
-    if (!tenant) {
-      return NextResponse.json({ error: 'No tenant found' }, { status: 404 });
-    }
-
-    return NextResponse.json(tenant);
-  } catch (error) {
-    console.error('Error fetching tenant:', error);
-    return NextResponse.json({ error: 'Failed to fetch tenant' }, { status: 500 });
-  }
-}
-
-export async function POST(request: NextRequest) {
-  try {
-    const auth = await authenticateRequest(request);
-    if (auth instanceof NextResponse) {
-      return auth;
-    }
-    const { tenantId } = auth;
-
-    const body = await request.json();
-
-    // Validate request body
-    const validatedData = tenantSchema.parse(body);
-
-    // Check if tenant already exists
-    const existingTenant = await prisma.tenant.findUnique({
-      where: {
-        id: tenantId,
-      },
-    });
-
-    if (existingTenant) {
-      return NextResponse.json({ error: 'Tenant already exists' }, { status: 400 });
-    }
-
-    // Create new tenant with the authenticated tenantId
-    const tenant = await prisma.tenant.create({
-      data: {
-        ...validatedData,
-        id: tenantId, // Ensure the tenant is created with the authenticated tenantId
-      },
-    });
-
-    return NextResponse.json(tenant, { status: 201 });
-  } catch (error) {
-    if (error instanceof z.ZodError) {
-      return NextResponse.json(
-        { error: 'Invalid request data', details: error.errors },
-        { status: 400 }
-      );
-    }
-
-    console.error('Error creating tenant:', error);
-    return NextResponse.json({ error: 'Failed to create tenant' }, { status: 500 });
-  }
-}
Index: c/app/api/user/route.ts
===================================================================
--- src/app/api/user/route.ts	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ 	(revision )
@@ -1,30 +1,0 @@
-import { NextResponse } from 'next/server';
-import { authenticateRequest } from 'src/lib/auth-middleware';
-import { type NextRequest } from 'next/server';
-import prisma from 'src/lib/prisma';
-
-export async function GET(request: NextRequest) {
-  try {
-    const authResult = await authenticateRequest(request);
-
-    if (authResult instanceof NextResponse) {
-      return authResult;
-    }
-
-    // Get user from Prisma
-    const user = await prisma.user.findUnique({
-      where: {
-        id: authResult.userId,
-      },
-    });
-
-    if (!user) {
-      return NextResponse.json({ error: 'User not found' }, { status: 404 });
-    }
-
-    return NextResponse.json(user);
-  } catch (error) {
-    console.error(error);
-    return NextResponse.json({ error: 'Internal server error' }, { status: 500 });
-  }
-}
Index: src/app/dashboard/customer/list/page.tsx
===================================================================
--- src/app/dashboard/customer/list/page.tsx	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ src/app/dashboard/customer/list/page.tsx	(revision 5d6f37a75130aab7d9a67b5b430603eff2c0ca6e)
@@ -1,4 +1,4 @@
 // sections
-import { CustomerListView } from 'src/sections/client/view';
+import { CustomerListView } from 'src/sections/user/view';
 
 // ----------------------------------------------------------------------
Index: src/app/dashboard/customer/new/page.tsx
===================================================================
--- src/app/dashboard/customer/new/page.tsx	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ src/app/dashboard/customer/new/page.tsx	(revision 5d6f37a75130aab7d9a67b5b430603eff2c0ca6e)
@@ -1,4 +1,4 @@
 // sections
-import { CustomerCreateView } from 'src/sections/client/view';
+import { CustomerCreateView } from 'src/sections/user/view';
 
 // ----------------------------------------------------------------------
Index: c/app/dashboard/employee/list/page.tsx
===================================================================
--- src/app/dashboard/employee/list/page.tsx	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ 	(revision )
@@ -1,9 +1,0 @@
-'use client';
-
-import { EmployeeListView } from 'src/sections/employee/view';
-
-// ----------------------------------------------------------------------
-
-export default function EmployeeListPage() {
-  return <EmployeeListView />;
-}
Index: c/app/dashboard/employee/new/page.tsx
===================================================================
--- src/app/dashboard/employee/new/page.tsx	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ 	(revision )
@@ -1,9 +1,0 @@
-'use client';
-
-import { EmployeeCreateView } from 'src/sections/employee/view';
-
-// ----------------------------------------------------------------------
-
-export default function EmployeeCreatePage() {
-  return <EmployeeCreateView />;
-}
Index: c/app/error.tsx
===================================================================
--- src/app/error.tsx	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ 	(revision )
@@ -1,28 +1,0 @@
-'use client';
-
-import { useEffect } from 'react';
-
-export default function Error({
-  error,
-  reset,
-}: {
-  error: Error & { digest?: string };
-  reset: () => void;
-}) {
-  useEffect(() => {
-    // Log the error to your error reporting service
-    console.error(error);
-  }, [error]);
-
-  return (
-    <div className="flex min-h-screen flex-col items-center justify-center">
-      <h2 className="text-2xl font-bold mb-4">Something went wrong!</h2>
-      <button
-        className="px-4 py-2 bg-blue-500 text-white rounded hover:bg-blue-600"
-        onClick={() => reset()}
-      >
-        Try again
-      </button>
-    </div>
-  );
-}
Index: src/app/loading.tsx
===================================================================
--- src/app/loading.tsx	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ src/app/loading.tsx	(revision 5d6f37a75130aab7d9a67b5b430603eff2c0ca6e)
@@ -7,8 +7,4 @@
 
 export default function Loading() {
-  return (
-    <div className="flex min-h-screen items-center justify-center">
-      <div className="animate-spin rounded-full h-32 w-32 border-t-2 border-b-2 border-blue-500"></div>
-    </div>
-  );
+  return <SplashScreen />;
 }
Index: src/app/not-found.tsx
===================================================================
--- src/app/not-found.tsx	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ src/app/not-found.tsx	(revision 5d6f37a75130aab7d9a67b5b430603eff2c0ca6e)
@@ -1,5 +1,4 @@
 // sections
 import { NotFoundView } from 'src/sections/error';
-import Link from 'next/link';
 
 // ----------------------------------------------------------------------
@@ -9,13 +8,5 @@
 };
 
-export default function NotFound() {
-  return (
-    <div className="flex min-h-screen flex-col items-center justify-center">
-      <h2 className="text-2xl font-bold mb-4">Page Not Found</h2>
-      <p className="mb-4">Could not find requested resource</p>
-      <Link href="/" className="px-4 py-2 bg-blue-500 text-white rounded hover:bg-blue-600">
-        Return Home
-      </Link>
-    </div>
-  );
+export default function NotFoundPage() {
+  return <NotFoundView />;
 }
Index: src/auth/context/firebase/auth-provider.tsx
===================================================================
--- src/auth/context/firebase/auth-provider.tsx	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ src/auth/context/firebase/auth-provider.tsx	(revision 5d6f37a75130aab7d9a67b5b430603eff2c0ca6e)
@@ -21,5 +21,4 @@
 import { AuthContext } from './auth-context';
 import { ActionMapType, AuthStateType, AuthUserType } from '../../types';
-import { getUser } from 'src/api/user';
 
 // ----------------------------------------------------------------------
@@ -72,23 +71,20 @@
         if (user) {
           if (user.emailVerified) {
-            try {
-              const profile = await getUser();
-              console.log('profile', profile);
-
-              dispatch({
-                type: Types.INITIAL,
-                payload: {
-                  user: { ...profile, emailVerified: user.emailVerified },
+            const userProfile = doc(db, collections.administrator, user.uid);
+
+            const docSnap = await getDoc(userProfile);
+
+            const profile = docSnap.data();
+
+            dispatch({
+              type: Types.INITIAL,
+              payload: {
+                user: {
+                  ...user,
+                  ...profile,
+                  id: user.uid,
                 },
-              });
-            } catch (error) {
-              console.error('Failed to fetch user profile:', error);
-              dispatch({
-                type: Types.INITIAL,
-                payload: {
-                  user: null,
-                },
-              });
-            }
+              },
+            });
           } else {
             dispatch({
@@ -149,12 +145,15 @@
   const register = useCallback(
     async (email: string, password: string, firstName: string, lastName: string) => {
-      // const newUser = await createUserWithEmailAndPassword(auth, email, password);
-      // await sendEmailVerification(newUser.user);
-      // const userProfile = doc(collection(db, collections.administrator), newUser.user?.uid);
-      // await setDoc(userProfile, {
-      //   uid: newUser.user?.uid,
-      //   email,
-      //   displayName: `${firstName} ${lastName}`,
-      // });
+      const newUser = await createUserWithEmailAndPassword(auth, email, password);
+
+      await sendEmailVerification(newUser.user);
+
+      const userProfile = doc(collection(db, collections.administrator), newUser.user?.uid);
+
+      await setDoc(userProfile, {
+        uid: newUser.user?.uid,
+        email,
+        displayName: `${firstName} ${lastName}`,
+      });
     },
     []
Index: src/layouts/dashboard/config-navigation.tsx
===================================================================
--- src/layouts/dashboard/config-navigation.tsx	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ src/layouts/dashboard/config-navigation.tsx	(revision 5d6f37a75130aab7d9a67b5b430603eff2c0ca6e)
@@ -53,5 +53,5 @@
         items: [
           {
-            title: 'dashboard',
+            title: 'banking',
             path: paths.dashboard.banking,
             icon: ICONS.banking,
@@ -85,13 +85,4 @@
             ],
           },
-          {
-            title: 'Employees',
-            path: paths.dashboard.employee.list,
-            icon: <SvgColor src="/assets/icons/navbar/ic_user.svg" />,
-            children: [
-              { title: 'list', path: paths.dashboard.employee.list },
-              { title: 'create', path: paths.dashboard.employee.new },
-            ],
-          },
         ],
       },
Index: src/layouts/dashboard/nav-horizontal.tsx
===================================================================
--- src/layouts/dashboard/nav-horizontal.tsx	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ src/layouts/dashboard/nav-horizontal.tsx	(revision 5d6f37a75130aab7d9a67b5b430603eff2c0ca6e)
@@ -41,5 +41,5 @@
           data={navData}
           config={{
-            currentRole: user?.role || 'ADMIN',
+            currentRole: user?.role || 'admin',
           }}
         />
Index: src/layouts/dashboard/nav-mini.tsx
===================================================================
--- src/layouts/dashboard/nav-mini.tsx	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ src/layouts/dashboard/nav-mini.tsx	(revision 5d6f37a75130aab7d9a67b5b430603eff2c0ca6e)
@@ -51,5 +51,5 @@
           data={navData}
           config={{
-            currentRole: user?.role || 'ADMIN',
+            currentRole: user?.role || 'admin',
           }}
         />
Index: src/layouts/dashboard/nav-vertical.tsx
===================================================================
--- src/layouts/dashboard/nav-vertical.tsx	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ src/layouts/dashboard/nav-vertical.tsx	(revision 5d6f37a75130aab7d9a67b5b430603eff2c0ca6e)
@@ -58,5 +58,5 @@
         data={navData}
         config={{
-          currentRole: user?.role || 'ADMIN',
+          currentRole: user?.role || 'admin',
         }}
       />
Index: src/lib/auth-middleware.ts
===================================================================
--- src/lib/auth-middleware.ts	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ src/lib/auth-middleware.ts	(revision 5d6f37a75130aab7d9a67b5b430603eff2c0ca6e)
@@ -4,10 +4,9 @@
 export interface AuthenticatedRequest extends NextRequest {
   userId: string;
-  tenantId: string;
 }
 
 export async function authenticateRequest(
   request: NextRequest
-): Promise<{ userId: string; tenantId: string } | NextResponse> {
+): Promise<{ userId: string } | NextResponse> {
   // Get the authorization header
   const authHeader = request.headers.get('Authorization');
@@ -24,13 +23,10 @@
     const userId = decodedToken.uid;
 
-    const tenantId = decodedToken.customClaims?.tenantId || 'cm7lxc3p00000pb7kmdrxsfod';
-
-    if (!userId || !tenantId) {
+    if (!userId) {
       return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });
     }
 
-    return { userId, tenantId: 'cm7lxc3p00000pb7kmdrxsfod' };
+    return { userId };
   } catch (error) {
-    console.error('Error verifying token:', error);
     return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });
   }
Index: src/routes/paths.ts
===================================================================
--- src/routes/paths.ts	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ src/routes/paths.ts	(revision 5d6f37a75130aab7d9a67b5b430603eff2c0ca6e)
@@ -34,10 +34,4 @@
       list: `${ROOTS.DASHBOARD}/customer/list`,
     },
-    employee: {
-      root: '/dashboard/employee',
-      list: '/dashboard/employee/list',
-      new: '/dashboard/employee/new',
-      edit: (id: string) => `/dashboard/employee/${id}/edit`,
-    },
   },
 };
Index: c/schemas/customer.ts
===================================================================
--- src/schemas/customer.ts	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ 	(revision )
@@ -1,71 +1,0 @@
-import { z } from 'zod';
-
-export const customerTableFilterValueSchema = z.union([z.string(), z.array(z.string())]);
-
-export const customerTableFiltersSchema = z.object({
-  name: z.string(),
-  role: z.array(z.string()),
-  status: z.string(),
-});
-
-export const addressSchema = z.object({
-  street: z.string(),
-  city: z.string().optional(),
-  country: z.string(),
-  state: z.string().optional(),
-  zip: z.string(),
-});
-
-export const bankAccountSchema = z.object({
-  accountNumber: z.string().optional(),
-  bicSwift: z.string().optional(),
-  iban: z.string().optional(),
-  routingNumber: z.string().optional(),
-});
-
-export const customerStatusSchema = z.union([
-  z.literal('active'),
-  z.literal('banned'),
-  z.literal('inactive'),
-]);
-
-export const customerSchema = z.object({
-  id: z.string().optional(),
-  tenantId: z.string(),
-  name: z.string(),
-  email: z.string(),
-  address: addressSchema,
-  logoUrl: z.string().optional(),
-  phoneNumber: z.string().optional(),
-  vatNumber: z.string().optional(),
-  companyNumber: z.string().optional(),
-  representative: z.string(),
-  status: customerStatusSchema.optional(),
-});
-
-export const tenantSchema = customerSchema
-  .omit({
-    tenantId: true,
-    status: true,
-  })
-  .extend({
-    lastInvoiceNumber: z.string(),
-  });
-
-export const newCustomerSchema = z.object({
-  tenantId: z.string().optional(),
-  name: z.string(),
-  email: z.string(),
-  address: addressSchema,
-  logoUrl: z.any().nullable().optional(),
-  phoneNumber: z.string().optional(),
-  vatNumber: z.string().optional(),
-  companyNumber: z.string().optional(),
-  representative: z.string(),
-  status: customerStatusSchema,
-});
-
-export const updateCustomerSchema = newCustomerSchema.omit({
-  tenantId: true,
-  status: true,
-});
Index: c/schemas/employee.ts
===================================================================
--- src/schemas/employee.ts	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ 	(revision )
@@ -1,29 +1,0 @@
-import { z } from 'zod';
-
-export const employeeTableFilterValueSchema = z.union([z.string(), z.array(z.string())]);
-
-export const employeeTableFiltersSchema = z.object({
-  name: z.string(),
-  status: z.string(),
-});
-
-export const employeeStatusSchema = z.union([z.literal('active'), z.literal('inactive')]);
-
-export const employeeSchema = z.object({
-  id: z.string().optional(),
-  name: z.string(),
-  email: z.string().email(),
-  status: employeeStatusSchema.optional(),
-  iban: z.string().optional(),
-  cv: z.string().optional(),
-  photo: z.string().optional(),
-  project: z.string().optional(),
-});
-
-export const newEmployeeSchema = employeeSchema
-  .omit({
-    id: true,
-  })
-  .extend({
-    status: employeeStatusSchema,
-  });
Index: c/schemas/index.ts
===================================================================
--- src/schemas/index.ts	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ 	(revision )
@@ -1,15 +1,0 @@
-export * from './customer';
-export * from './invoice';
-
-export * from './models/customer';
-export * from './models/invoice';
-export * from './models/employee';
-
-// If not already exported, also export the schemas
-export {
-  employeeSchema,
-  employeeStatusSchema,
-  employeeTableFilterValueSchema,
-  employeeTableFiltersSchema,
-  newEmployeeSchema,
-} from './employee';
Index: c/schemas/invoice.ts
===================================================================
--- src/schemas/invoice.ts	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ 	(revision )
@@ -1,98 +1,0 @@
-import { z } from 'zod';
-import { customerSchema, tenantSchema } from './customer';
-
-export const serviceSchema = z.object({
-  id: z.string(),
-  name: z.string(),
-  sprint: z.number(),
-  hour: z.number(),
-  month: z.number(),
-});
-
-export const invoiceTableFilterValueSchema = z
-  .union([z.string(), z.array(z.string()), z.date()])
-  .nullable();
-
-export const invoiceTableFiltersSchema = z.object({
-  name: z.string(),
-  service: z.array(z.string()),
-  status: z.string(),
-  startDate: z.date().nullable(),
-  endDate: z.date().nullable(),
-});
-
-export const invoiceItemSchema = z.object({
-  title: z.string(),
-  price: z.number(),
-  total: z.number(),
-  service: serviceSchema,
-  quantity: z.number(),
-  description: z.string(),
-});
-
-export const invoiceStatusSchema = z.union([
-  z.literal('draft'),
-  z.literal('processing'),
-  z.literal('pending'),
-  z.literal('overdue'),
-  z.literal('paid'),
-]);
-
-export const monthSchema = z.union([
-  z.literal('January'),
-  z.literal('February'),
-  z.literal('March'),
-  z.literal('April'),
-  z.literal('May'),
-  z.literal('June'),
-  z.literal('July'),
-  z.literal('August'),
-  z.literal('September'),
-  z.literal('October'),
-  z.literal('November'),
-  z.literal('December'),
-]);
-
-export const invoiceSchema = z.object({
-  id: z.string(),
-  sent: z.number().optional(),
-  dueDate: z.coerce.date(),
-  status: invoiceStatusSchema,
-  currency: z.union([z.literal('EUR'), z.literal('USD')]),
-  quantityType: z.union([
-    z.literal('Unit'),
-    z.literal('Hour'),
-    z.literal('Sprint'),
-    z.literal('Month'),
-  ]),
-  subTotal: z.number(),
-  issueDate: z.coerce.date(),
-  month: monthSchema,
-  discount: z.number().optional(),
-  taxes: z.number().optional(),
-  totalAmount: z.number(),
-  invoiceNumber: z.string(),
-  items: z.array(invoiceItemSchema),
-  invoiceFrom: tenantSchema,
-  invoiceTo: customerSchema,
-  pdfRef: z.string().optional(),
-});
-
-export const updateInvoiceSchema = invoiceSchema.omit({
-  id: true,
-  sent: true,
-});
-
-export const createInvoiceSchema = invoiceSchema.omit({
-  id: true,
-  sent: true,
-});
-
-export interface InvoiceFilters {
-  name: string;
-  service: string[];
-  status: string;
-  startDate: Date | null;
-  endDate: Date | null;
-  where?: [string, string, any][];
-}
Index: c/schemas/models/customer.ts
===================================================================
--- src/schemas/models/customer.ts	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ 	(revision )
@@ -1,21 +1,0 @@
-import { z } from 'zod';
-import {
-  addressSchema,
-  bankAccountSchema,
-  customerSchema,
-  customerStatusSchema,
-  customerTableFilterValueSchema,
-  customerTableFiltersSchema,
-  newCustomerSchema,
-  tenantSchema,
-} from '../customer';
-
-export type CustomerTableFilters = z.infer<typeof customerTableFiltersSchema>;
-export type CustomerTableFilterValue = z.infer<typeof customerTableFilterValueSchema>;
-
-export type Address = z.infer<typeof addressSchema>;
-export type BankAccount = z.infer<typeof bankAccountSchema>;
-export type CustomerStatus = z.infer<typeof customerStatusSchema>;
-export type Customer = z.infer<typeof customerSchema>;
-export type NewCustomer = z.infer<typeof newCustomerSchema>;
-export type Tenant = z.infer<typeof tenantSchema>;
Index: c/schemas/models/employee.ts
===================================================================
--- src/schemas/models/employee.ts	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ 	(revision )
@@ -1,15 +1,0 @@
-import { z } from 'zod';
-import {
-  employeeSchema,
-  employeeStatusSchema,
-  employeeTableFilterValueSchema,
-  employeeTableFiltersSchema,
-  newEmployeeSchema,
-} from '../employee';
-
-export type EmployeeTableFilters = z.infer<typeof employeeTableFiltersSchema>;
-export type EmployeeTableFilterValue = z.infer<typeof employeeTableFilterValueSchema>;
-
-export type EmployeeStatus = z.infer<typeof employeeStatusSchema>;
-export type Employee = z.infer<typeof employeeSchema>;
-export type NewEmployee = z.infer<typeof newEmployeeSchema>;
Index: c/schemas/models/invoice.ts
===================================================================
--- src/schemas/models/invoice.ts	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ 	(revision )
@@ -1,23 +1,0 @@
-import { z } from 'zod';
-import {
-  createInvoiceSchema,
-  invoiceItemSchema,
-  invoiceSchema,
-  invoiceStatusSchema,
-  invoiceTableFilterValueSchema,
-  invoiceTableFiltersSchema,
-  monthSchema,
-  serviceSchema,
-  updateInvoiceSchema,
-} from '../invoice';
-
-export type InvoiceTableFilterValue = z.infer<typeof invoiceTableFilterValueSchema>;
-export type InvoiceTableFilters = z.infer<typeof invoiceTableFiltersSchema>;
-
-export type Service = z.infer<typeof serviceSchema>;
-export type InvoiceItem = z.infer<typeof invoiceItemSchema>;
-export type InvoiceStatus = z.infer<typeof invoiceStatusSchema>;
-export type Month = z.infer<typeof monthSchema>;
-export type Invoice = z.infer<typeof invoiceSchema>;
-export type CreateInvoice = z.infer<typeof createInvoiceSchema>;
-export type UpdateInvoice = z.infer<typeof updateInvoiceSchema>;
Index: c/schemas/models/user.ts
===================================================================
--- src/schemas/models/user.ts	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ 	(revision )
@@ -1,7 +1,0 @@
-import { z } from 'zod';
-import { userSchema, userRoleSchema } from '../user';
-
-export type User = z.infer<typeof userSchema>;
-export type UserRole = z.infer<typeof userRoleSchema>;
-export type NewUser = Omit<User, 'id'>;
-export type UpdateUser = Omit<User, 'id' | 'uid' | 'tenantId'>;
Index: c/schemas/user.ts
===================================================================
--- src/schemas/user.ts	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ 	(revision )
@@ -1,26 +1,0 @@
-import { z } from 'zod';
-
-export const userRoleSchema = z.union([
-  z.literal('ADMIN'),
-  z.literal('MANAGER'),
-  z.literal('USER'),
-]);
-
-export const userSchema = z.object({
-  id: z.string().optional(),
-  uid: z.string(),
-  email: z.string().email(),
-  displayName: z.string(),
-  role: userRoleSchema,
-  tenantId: z.string(),
-});
-
-export const newUserSchema = userSchema.omit({
-  id: true,
-});
-
-export const updateUserSchema = userSchema.omit({
-  id: true,
-  uid: true,
-  tenantId: true,
-});
Index: src/sections/auth/firebase/firebase-login-view.tsx
===================================================================
--- src/sections/auth/firebase/firebase-login-view.tsx	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ src/sections/auth/firebase/firebase-login-view.tsx	(revision 5d6f37a75130aab7d9a67b5b430603eff2c0ca6e)
@@ -74,5 +74,5 @@
   const renderHead = (
     <Stack spacing={2} sx={{ mb: 5 }}>
-      <Typography variant="h4">Sign in to AgencyOS</Typography>
+      <Typography variant="h4">Sign in to MVP Masters</Typography>
     </Stack>
   );
Index: c/sections/client/customer-new-edit-form.tsx
===================================================================
--- src/sections/client/customer-new-edit-form.tsx	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ 	(revision )
@@ -1,253 +1,0 @@
-import * as Yup from 'yup';
-import { useCallback, useMemo } from 'react';
-import { useForm, Controller } from 'react-hook-form';
-import { zodResolver } from '@hookform/resolvers/zod';
-// @mui
-import LoadingButton from '@mui/lab/LoadingButton';
-import Box from '@mui/material/Box';
-import Card from '@mui/material/Card';
-import Stack from '@mui/material/Stack';
-import Switch from '@mui/material/Switch';
-import Grid from '@mui/material/Unstable_Grid2';
-import Typography from '@mui/material/Typography';
-import FormControlLabel from '@mui/material/FormControlLabel';
-// utils
-import { fData } from 'src/utils/format-number';
-// routes
-import { paths } from 'src/routes/paths';
-import { useRouter } from 'src/routes/hooks';
-// types
-import { Customer, NewCustomer, newCustomerSchema } from 'src/schemas';
-// components
-import Label from 'src/components/label';
-import { useSnackbar } from 'src/components/snackbar';
-import FormProvider, { RHFTextField, RHFUploadAvatar } from 'src/components/hook-form';
-import uploadToFirebaseStorage from 'src/utils/upload-to-firebase-storage';
-import { addDoc, collection } from 'firebase/firestore';
-import { db } from 'src/lib/firebase';
-import { createCustomer } from 'src/api/customer';
-
-// ----------------------------------------------------------------------
-
-type Props = {
-  currentUser?: Customer;
-};
-
-export default function CustomerNewEditForm({ currentUser: currentCustomer }: Props) {
-  const router = useRouter();
-
-  const { enqueueSnackbar } = useSnackbar();
-
-  const defaultValues: NewCustomer = useMemo(
-    () => ({
-      name: currentCustomer?.name || '',
-      representative: currentCustomer?.representative || '',
-      email: currentCustomer?.email || '',
-      logoUrl: currentCustomer?.logoUrl || null,
-      address: currentCustomer?.address || {
-        country: '',
-        state: '',
-        street: '',
-        zip: '',
-        city: '',
-      },
-      vatNumber: currentCustomer?.vatNumber || '',
-      companyNumber: currentCustomer?.companyNumber || '',
-      id: currentCustomer?.id || '',
-      phoneNumber: currentCustomer?.phoneNumber || '',
-      status: 'active',
-    }),
-    [currentCustomer]
-  );
-
-  const methods = useForm({
-    resolver: zodResolver(newCustomerSchema),
-    defaultValues,
-  });
-
-  const {
-    reset,
-    watch,
-    control,
-    setValue,
-    handleSubmit,
-    formState: { isSubmitting },
-  } = methods;
-
-  const values = watch();
-
-  const onSubmit = handleSubmit(async (data) => {
-    try {
-      // await new Promise((resolve) => setTimeout(resolve, 500));
-      const logoFile = data.logoUrl as File & { preview: string };
-
-      const storagePath: string = `customers/${logoFile.name}`;
-      const logoUrl = await uploadToFirebaseStorage(logoFile, storagePath);
-
-      await createCustomer({ ...data, logoUrl });
-
-      reset();
-      enqueueSnackbar(currentCustomer ? 'Update success!' : 'Create success!');
-      router.push(paths.dashboard.customer.list);
-      console.info('DATA', data);
-    } catch (error) {
-      console.error(error);
-    }
-  });
-
-  const handleDrop = useCallback(
-    (acceptedFiles: File[]) => {
-      const file = acceptedFiles[0];
-
-      const newFile = Object.assign(file, {
-        preview: URL.createObjectURL(file),
-      });
-
-      if (file) {
-        setValue('logoUrl', newFile, { shouldValidate: true });
-      }
-    },
-    [setValue]
-  );
-
-  return (
-    <FormProvider methods={methods} onSubmit={onSubmit}>
-      <Grid container spacing={3}>
-        <Grid xs={12} md={4}>
-          <Card sx={{ pt: 10, pb: 5, px: 3 }}>
-            {currentCustomer && (
-              <Label
-                color={
-                  (values.status === 'active' && 'success') ||
-                  (values.status === 'banned' && 'error') ||
-                  'warning'
-                }
-                sx={{ position: 'absolute', top: 24, right: 24 }}
-              >
-                {values.status}
-              </Label>
-            )}
-
-            <Box sx={{ mb: 5 }}>
-              <RHFUploadAvatar
-                name="logoUrl"
-                maxSize={3145728}
-                onDrop={handleDrop}
-                helperText={
-                  <Typography
-                    variant="caption"
-                    sx={{
-                      mt: 3,
-                      mx: 'auto',
-                      display: 'block',
-                      textAlign: 'center',
-                      color: 'text.disabled',
-                    }}
-                  >
-                    Allowed *.jpeg, *.jpg, *.png, *.gif
-                    <br /> max size of {fData(3145728)}
-                  </Typography>
-                }
-              />
-            </Box>
-
-            {currentCustomer && (
-              <FormControlLabel
-                labelPlacement="start"
-                control={
-                  <Controller
-                    name="status"
-                    control={control}
-                    render={({ field }) => (
-                      <Switch
-                        {...field}
-                        checked={field.value !== 'active'}
-                        onChange={(event) =>
-                          field.onChange(event.target.checked ? 'banned' : 'active')
-                        }
-                      />
-                    )}
-                  />
-                }
-                label={
-                  <>
-                    <Typography variant="subtitle2" sx={{ mb: 0.5 }}>
-                      Banned
-                    </Typography>
-                    <Typography variant="body2" sx={{ color: 'text.secondary' }}>
-                      Apply disable account
-                    </Typography>
-                  </>
-                }
-                sx={{ mx: 0, mb: 3, width: 1, justifyContent: 'space-between' }}
-              />
-            )}
-          </Card>
-        </Grid>
-
-        <Grid xs={12} md={8}>
-          <Card sx={{ p: 3 }}>
-            <Box
-              rowGap={3}
-              columnGap={2}
-              display="grid"
-              gridTemplateColumns={{
-                xs: 'repeat(1, 1fr)',
-                sm: 'repeat(2, 1fr)',
-              }}
-            >
-              <RHFTextField name="name" label="Name" />
-              <RHFTextField name="email" label="Email Address" />
-              <RHFTextField name="representative" label="Representative" />
-              <RHFTextField name="phoneNumber" label="Phone Number" />
-
-              <RHFTextField name="address.country" label="Country" />
-
-              {/* <RHFAutocomplete
-                name="address.country"
-                label="Country"
-                options={countries.map((country) => country.label)}
-                getOptionLabel={(option) => option}
-                isOptionEqualToValue={(option, value) => option === value}
-                renderOption={(props, option) => {
-                  const { code, label, phone } = countries.filter(
-                    (country) => country.label === option
-                  )[0];
-
-                  if (!label) {
-                    return null;
-                  }
-
-                  return (
-                    <li {...props} key={label}>
-                      <Iconify
-                        key={label}
-                        icon={`circle-flags:${code.toLowerCase()}`}
-                        width={28}
-                        sx={{ mr: 1 }}
-                      />
-                      {label} ({code}) +{phone}
-                    </li>
-                  );
-                }}
-              /> */}
-
-              <RHFTextField name="address.state" label="State/Region" />
-              <RHFTextField name="address.city" label="City" />
-              <RHFTextField name="address.street" label="Street" />
-              <RHFTextField name="address.zip" label="Zip/Code" />
-              <RHFTextField name="vatNumber" label="VAT" />
-              <RHFTextField name="companyNumber" label="Company Number" />
-            </Box>
-
-            <Stack alignItems="flex-end" sx={{ mt: 3 }}>
-              <LoadingButton type="submit" variant="contained" loading={isSubmitting}>
-                {!currentCustomer ? 'Create Customer' : 'Save Changes'}
-              </LoadingButton>
-            </Stack>
-          </Card>
-        </Grid>
-      </Grid>
-    </FormProvider>
-  );
-}
Index: c/sections/client/customer-quick-edit-form.tsx
===================================================================
--- src/sections/client/customer-quick-edit-form.tsx	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ 	(revision )
@@ -1,188 +1,0 @@
-import * as Yup from 'yup';
-import { useMemo } from 'react';
-import { useForm } from 'react-hook-form';
-import { zodResolver } from '@hookform/resolvers/zod';
-// @mui
-import LoadingButton from '@mui/lab/LoadingButton';
-import Box from '@mui/material/Box';
-import Alert from '@mui/material/Alert';
-import Button from '@mui/material/Button';
-import Dialog from '@mui/material/Dialog';
-import MenuItem from '@mui/material/MenuItem';
-import DialogTitle from '@mui/material/DialogTitle';
-import DialogActions from '@mui/material/DialogActions';
-import DialogContent from '@mui/material/DialogContent';
-// types
-import { Customer, updateCustomerSchema } from 'src/schemas';
-// assets
-import { countries } from 'src/assets/data';
-// components
-import Iconify from 'src/components/iconify';
-import { useSnackbar } from 'src/components/snackbar';
-import FormProvider, { RHFSelect, RHFTextField, RHFAutocomplete } from 'src/components/hook-form';
-import { updateCustomer } from 'src/api/customer';
-
-// ----------------------------------------------------------------------
-
-export const USER_STATUS_OPTIONS = [
-  { value: 'active', label: 'Active' },
-  { value: 'banned', label: 'Banned' },
-  { value: 'inactive', label: 'Inactive' },
-];
-
-type Props = {
-  open: boolean;
-  onClose: VoidFunction;
-  currentCustomer?: Customer;
-};
-
-export default function CustomerQuickEditForm({ currentCustomer, open, onClose }: Props) {
-  const { enqueueSnackbar } = useSnackbar();
-
-  // @ts-ignore
-  const defaultValues: Customer = useMemo(
-    () => ({
-      name: currentCustomer?.name || '',
-      representative: currentCustomer?.representative || '',
-      email: currentCustomer?.email || '',
-      logoUrl: currentCustomer?.logoUrl || '',
-      address: {
-        country: currentCustomer?.address?.country || '',
-        state: currentCustomer?.address?.state || '',
-        street: currentCustomer?.address?.street || '',
-        zip: currentCustomer?.address?.zip || '',
-        city: currentCustomer?.address?.city || '',
-      },
-      vatNumber: currentCustomer?.vatNumber || '',
-      companyNumber: currentCustomer?.companyNumber || '',
-      id: currentCustomer?.id || '',
-      phoneNumber: currentCustomer?.phoneNumber || '',
-      status: currentCustomer?.status || '',
-    }),
-    [currentCustomer]
-  );
-
-  const methods = useForm({
-    resolver: zodResolver(updateCustomerSchema),
-    defaultValues,
-  });
-
-  const {
-    reset,
-    handleSubmit,
-    formState: { isSubmitting },
-  } = methods;
-
-  const onSubmit = handleSubmit(async (data) => {
-    try {
-      console.log('currentCustomer', currentCustomer);
-      if (!currentCustomer) return;
-      console.log('data', data);
-      await updateCustomer(currentCustomer.id!, data);
-
-      reset();
-      onClose();
-      enqueueSnackbar('Update success!');
-      console.info('DATA', data);
-    } catch (error) {
-      console.error(error);
-      enqueueSnackbar('Update failed!', { variant: 'error' });
-    }
-  });
-
-  return (
-    <Dialog
-      fullWidth
-      maxWidth={false}
-      open={open}
-      onClose={onClose}
-      PaperProps={{
-        sx: { maxWidth: 720 },
-      }}
-    >
-      <FormProvider methods={methods} onSubmit={onSubmit}>
-        <DialogTitle>Quick Update</DialogTitle>
-
-        <DialogContent>
-          {/* <Alert variant="outlined" severity="info" sx={{ mb: 3 }}>
-            Account is waiting for confirmation
-          </Alert> */}
-
-          <Box
-            rowGap={3}
-            columnGap={2}
-            display="grid"
-            sx={{ mt: 3 }}
-            gridTemplateColumns={{
-              xs: 'repeat(1, 1fr)',
-              sm: 'repeat(2, 1fr)',
-            }}
-          >
-            <RHFSelect name="status" label="Status">
-              <MenuItem key="none" value="" />
-              {USER_STATUS_OPTIONS.map((status) => (
-                <MenuItem key={status.value} value={status.value}>
-                  {status.label}
-                </MenuItem>
-              ))}
-            </RHFSelect>
-
-            <Box sx={{ display: { xs: 'none', sm: 'block' } }} />
-
-            <RHFTextField name="name" label="Name" />
-            <RHFTextField name="representative" label="Representative" />
-            <RHFTextField name="email" label="Email Address" />
-            <RHFTextField name="phoneNumber" label="Phone Number" />
-
-            <RHFTextField name="address.country" label="Country" />
-
-            {/* <RHFAutocomplete
-              name="address.country"
-              label="Country"
-              options={countries.map((country) => country.code)}
-              getOptionLabel={(option) => option}
-              renderOption={(props, option) => {
-                const { code, label, phone } = countries.filter(
-                  (country) => country.label === option
-                )[0];
-
-                if (!label) {
-                  return null;
-                }
-
-                return (
-                  <li {...props} key={label}>
-                    <Iconify
-                      key={label}
-                      icon={`circle-flags:${code.toLowerCase()}`}
-                      width={28}
-                      sx={{ mr: 1 }}
-                    />
-                    {label} ({code}) +{phone}
-                  </li>
-                );
-              }}
-            /> */}
-
-            <RHFTextField name="address.state" label="State/Region" />
-            <RHFTextField name="address.city" label="City" />
-            <RHFTextField name="address.street" label="Street" />
-            <RHFTextField name="address.zip" label="Zip/Code" />
-            <RHFTextField name="vatNumber" label="VAT" />
-            <RHFTextField name="companyNumber" label="Company Number" />
-          </Box>
-        </DialogContent>
-
-        <DialogActions>
-          <Button variant="outlined" onClick={onClose}>
-            Cancel
-          </Button>
-
-          <LoadingButton type="submit" variant="contained" loading={isSubmitting}>
-            Update
-          </LoadingButton>
-        </DialogActions>
-      </FormProvider>
-    </Dialog>
-  );
-}
Index: c/sections/client/customer-table-filters-result.tsx
===================================================================
--- src/sections/client/customer-table-filters-result.tsx	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ 	(revision )
@@ -1,109 +1,0 @@
-// @mui
-import Box from '@mui/material/Box';
-import Chip from '@mui/material/Chip';
-import Paper from '@mui/material/Paper';
-import Button from '@mui/material/Button';
-import Stack, { StackProps } from '@mui/material/Stack';
-// types
-
-// components
-import Iconify from 'src/components/iconify';
-import { CustomerTableFilterValue, CustomerTableFilters } from 'src/schemas';
-
-// ----------------------------------------------------------------------
-
-type Props = StackProps & {
-  filters: CustomerTableFilters;
-  onFilters: (name: string, value: CustomerTableFilterValue) => void;
-  //
-  onResetFilters: VoidFunction;
-  //
-  results: number;
-};
-
-export default function CustomerTableFiltersResult({
-  filters,
-  onFilters,
-  //
-  onResetFilters,
-  //
-  results,
-  ...other
-}: Props) {
-  const handleRemoveStatus = () => {
-    onFilters('status', 'all');
-  };
-
-  const handleRemoveRole = (inputValue: string) => {
-    const newValue = filters.role.filter((item) => item !== inputValue);
-    onFilters('role', newValue);
-  };
-
-  return (
-    <Stack spacing={1.5} {...other}>
-      <Box sx={{ typography: 'body2' }}>
-        <strong>{results}</strong>
-        <Box component="span" sx={{ color: 'text.secondary', ml: 0.25 }}>
-          results found
-        </Box>
-      </Box>
-
-      <Stack flexGrow={1} spacing={1} direction="row" flexWrap="wrap" alignItems="center">
-        {filters.status !== 'all' && (
-          <Block label="Status:">
-            <Chip size="small" label={filters.status} onDelete={handleRemoveStatus} />
-          </Block>
-        )}
-
-        {!!filters.role.length && (
-          <Block label="Role:">
-            {filters.role.map((item) => (
-              <Chip key={item} label={item} size="small" onDelete={() => handleRemoveRole(item)} />
-            ))}
-          </Block>
-        )}
-
-        <Button
-          color="error"
-          onClick={onResetFilters}
-          startIcon={<Iconify icon="solar:trash-bin-trash-bold" />}
-        >
-          Clear
-        </Button>
-      </Stack>
-    </Stack>
-  );
-}
-
-// ----------------------------------------------------------------------
-
-type BlockProps = StackProps & {
-  label: string;
-};
-
-function Block({ label, children, sx, ...other }: BlockProps) {
-  return (
-    <Stack
-      component={Paper}
-      variant="outlined"
-      spacing={1}
-      direction="row"
-      sx={{
-        p: 1,
-        borderRadius: 1,
-        overflow: 'hidden',
-        borderStyle: 'dashed',
-        ...sx,
-      }}
-      {...other}
-    >
-      <Box component="span" sx={{ typography: 'subtitle2' }}>
-        {label}
-      </Box>
-
-      <Stack spacing={1} direction="row" flexWrap="wrap">
-        {children}
-      </Stack>
-    </Stack>
-  );
-}
Index: c/sections/client/customer-table-row.tsx
===================================================================
--- src/sections/client/customer-table-row.tsx	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ 	(revision )
@@ -1,103 +1,0 @@
-// @mui
-import Avatar from '@mui/material/Avatar';
-import Tooltip from '@mui/material/Tooltip';
-import MenuItem from '@mui/material/MenuItem';
-import TableRow from '@mui/material/TableRow';
-import TableCell from '@mui/material/TableCell';
-import IconButton from '@mui/material/IconButton';
-// hooks
-import { useBoolean } from 'src/hooks/use-boolean';
-// types
-import { Customer } from 'src/schemas';
-// components
-import Label from 'src/components/label';
-import Iconify from 'src/components/iconify';
-import CustomPopover, { usePopover } from 'src/components/custom-popover';
-//
-import CustomerQuickEditForm from './customer-quick-edit-form';
-
-// ----------------------------------------------------------------------
-
-type Props = {
-  selected: boolean;
-  onEditRow: VoidFunction;
-  row: Customer;
-};
-
-export default function CustomerTableRow({ row, selected, onEditRow }: Props) {
-  const { name, logoUrl, representative, status, email, phoneNumber } = row;
-
-  // const confirm = useBoolean();
-
-  const quickEdit = useBoolean();
-
-  // const popover = usePopover();
-
-  return (
-    <>
-      <TableRow hover selected={selected}>
-        {/* <TableCell padding="checkbox">
-          <Checkbox checked={selected} onClick={onSelectRow} />
-        </TableCell> */}
-
-        <TableCell sx={{ display: 'flex', alignItems: 'center' }}>
-          <Avatar alt={name} src={logoUrl} sx={{ mr: 2 }} />
-          <span>{name}</span>
-        </TableCell>
-
-        <TableCell sx={{ whiteSpace: 'nowrap' }}>{representative}</TableCell>
-
-        <TableCell sx={{ whiteSpace: 'nowrap' }}>{email}</TableCell>
-
-        <TableCell>
-          <Label
-            variant="soft"
-            color={
-              (status === 'active' && 'success') ||
-              (status === 'inactive' && 'warning') ||
-              (status === 'banned' && 'error') ||
-              'default'
-            }
-          >
-            {status}
-          </Label>
-        </TableCell>
-
-        <TableCell align="right" sx={{ px: 1, whiteSpace: 'nowrap' }}>
-          <Tooltip title="Quick Edit" placement="top" arrow>
-            <IconButton color={quickEdit.value ? 'inherit' : 'default'} onClick={quickEdit.onTrue}>
-              <Iconify icon="solar:pen-bold" />
-            </IconButton>
-          </Tooltip>
-          {/* 
-          <IconButton color={popover.open ? 'inherit' : 'default'} onClick={popover.onOpen}>
-            <Iconify icon="eva:more-vertical-fill" />
-          </IconButton> */}
-        </TableCell>
-      </TableRow>
-
-      <CustomerQuickEditForm
-        currentCustomer={row}
-        open={quickEdit.value}
-        onClose={quickEdit.onFalse}
-      />
-
-      {/* <CustomPopover
-        open={popover.open}
-        onClose={popover.onClose}
-        arrow="right-top"
-        sx={{ width: 140 }}
-      >
-        <MenuItem
-          onClick={() => {
-            onEditRow();
-            popover.onClose();
-          }}
-        >
-          <Iconify icon="solar:pen-bold" />
-          Edit
-        </MenuItem>
-      </CustomPopover> */}
-    </>
-  );
-}
Index: c/sections/client/customer-table-toolbar.tsx
===================================================================
--- src/sections/client/customer-table-toolbar.tsx	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ 	(revision )
@@ -1,152 +1,0 @@
-import { useCallback } from 'react';
-// @mui
-import Stack from '@mui/material/Stack';
-import MenuItem from '@mui/material/MenuItem';
-import Checkbox from '@mui/material/Checkbox';
-import TextField from '@mui/material/TextField';
-import InputLabel from '@mui/material/InputLabel';
-import IconButton from '@mui/material/IconButton';
-import FormControl from '@mui/material/FormControl';
-import OutlinedInput from '@mui/material/OutlinedInput';
-import InputAdornment from '@mui/material/InputAdornment';
-import Select, { SelectChangeEvent } from '@mui/material/Select';
-// types
-import { CustomerTableFilters, CustomerTableFilterValue } from 'src/schemas';
-// components
-import Iconify from 'src/components/iconify';
-import CustomPopover, { usePopover } from 'src/components/custom-popover';
-
-// ----------------------------------------------------------------------
-
-type Props = {
-  filters: CustomerTableFilters;
-  onFilters: (name: string, value: CustomerTableFilterValue) => void;
-  //
-  roleOptions: string[];
-};
-
-export default function CustomerTableToolbar({
-  filters,
-  onFilters,
-  //
-  roleOptions,
-}: Props) {
-  const popover = usePopover();
-
-  const handleFilterName = useCallback(
-    (event: React.ChangeEvent<HTMLInputElement>) => {
-      onFilters('name', event.target.value);
-    },
-    [onFilters]
-  );
-
-  const handleFilterRole = useCallback(
-    (event: SelectChangeEvent<string[]>) => {
-      onFilters(
-        'role',
-        typeof event.target.value === 'string' ? event.target.value.split(',') : event.target.value
-      );
-    },
-    [onFilters]
-  );
-
-  return (
-    <>
-      <Stack
-        spacing={2}
-        alignItems={{ xs: 'flex-end', md: 'center' }}
-        direction={{
-          xs: 'column',
-          md: 'row',
-        }}
-        sx={{
-          p: 2.5,
-          pr: { xs: 2.5, md: 1 },
-        }}
-      >
-        <FormControl
-          sx={{
-            flexShrink: 0,
-            width: { xs: 1, md: 200 },
-          }}
-        >
-          <InputLabel>Role</InputLabel>
-
-          <Select
-            multiple
-            value={filters.role}
-            onChange={handleFilterRole}
-            input={<OutlinedInput label="Role" />}
-            renderValue={(selected) => selected.map((value) => value).join(', ')}
-            MenuProps={{
-              PaperProps: {
-                sx: { maxHeight: 240 },
-              },
-            }}
-          >
-            {roleOptions.map((option) => (
-              <MenuItem key={option} value={option}>
-                <Checkbox disableRipple size="small" checked={filters.role.includes(option)} />
-                {option}
-              </MenuItem>
-            ))}
-          </Select>
-        </FormControl>
-
-        <Stack direction="row" alignItems="center" spacing={2} flexGrow={1} sx={{ width: 1 }}>
-          <TextField
-            fullWidth
-            value={filters.name}
-            onChange={handleFilterName}
-            placeholder="Search..."
-            InputProps={{
-              startAdornment: (
-                <InputAdornment position="start">
-                  <Iconify icon="eva:search-fill" sx={{ color: 'text.disabled' }} />
-                </InputAdornment>
-              ),
-            }}
-          />
-
-          <IconButton onClick={popover.onOpen}>
-            <Iconify icon="eva:more-vertical-fill" />
-          </IconButton>
-        </Stack>
-      </Stack>
-
-      <CustomPopover
-        open={popover.open}
-        onClose={popover.onClose}
-        arrow="right-top"
-        sx={{ width: 140 }}
-      >
-        <MenuItem
-          onClick={() => {
-            popover.onClose();
-          }}
-        >
-          <Iconify icon="solar:printer-minimalistic-bold" />
-          Print
-        </MenuItem>
-
-        <MenuItem
-          onClick={() => {
-            popover.onClose();
-          }}
-        >
-          <Iconify icon="solar:import-bold" />
-          Import
-        </MenuItem>
-
-        <MenuItem
-          onClick={() => {
-            popover.onClose();
-          }}
-        >
-          <Iconify icon="solar:export-bold" />
-          Export
-        </MenuItem>
-      </CustomPopover>
-    </>
-  );
-}
Index: c/sections/client/view/customer-create-view.tsx
===================================================================
--- src/sections/client/view/customer-create-view.tsx	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ 	(revision )
@@ -1,41 +1,0 @@
-'use client';
-
-// @mui
-import Container from '@mui/material/Container';
-// routes
-import { paths } from 'src/routes/paths';
-// components
-import { useSettingsContext } from 'src/components/settings';
-import CustomBreadcrumbs from 'src/components/custom-breadcrumbs';
-//
-import CustomerNewEditForm from '../customer-new-edit-form';
-
-// ----------------------------------------------------------------------
-
-export default function CustomerCreateView() {
-  const settings = useSettingsContext();
-
-  return (
-    <Container maxWidth={settings.themeStretch ? false : 'lg'}>
-      <CustomBreadcrumbs
-        heading="Create a new customer"
-        links={[
-          {
-            name: 'Dashboard',
-            href: paths.dashboard.root,
-          },
-          {
-            name: 'Customer',
-            href: paths.dashboard.customer.list,
-          },
-          { name: 'New customer' },
-        ]}
-        sx={{
-          mb: { xs: 3, md: 5 },
-        }}
-      />
-
-      <CustomerNewEditForm />
-    </Container>
-  );
-}
Index: c/sections/client/view/customer-list-view.tsx
===================================================================
--- src/sections/client/view/customer-list-view.tsx	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ 	(revision )
@@ -1,335 +1,0 @@
-'use client';
-
-import isEqual from 'lodash/isEqual';
-import { useState, useCallback } from 'react';
-// @mui
-import { alpha } from '@mui/material/styles';
-import Tab from '@mui/material/Tab';
-import Tabs from '@mui/material/Tabs';
-import Card from '@mui/material/Card';
-import Table from '@mui/material/Table';
-import Button from '@mui/material/Button';
-import Container from '@mui/material/Container';
-import TableBody from '@mui/material/TableBody';
-import TableContainer from '@mui/material/TableContainer';
-// routes
-import { paths } from 'src/routes/paths';
-import { RouterLink } from 'src/routes/components';
-// hooks
-import { useBoolean } from 'src/hooks/use-boolean';
-// components
-import Label from 'src/components/label';
-import Iconify from 'src/components/iconify';
-import Scrollbar from 'src/components/scrollbar';
-import { useSettingsContext } from 'src/components/settings';
-import CustomBreadcrumbs from 'src/components/custom-breadcrumbs';
-import {
-  useTable,
-  getComparator,
-  emptyRows,
-  TableNoData,
-  TableEmptyRows,
-  TableHeadCustom,
-  TablePaginationCustom,
-} from 'src/components/table';
-// types
-import { Customer, CustomerTableFilters, CustomerTableFilterValue } from 'src/schemas';
-//
-import { useGetCustomers } from 'src/api/customer';
-import CustomerTableRow from '../customer-table-row';
-import CustomerTableFiltersResult from '../customer-table-filters-result';
-import { USER_STATUS_OPTIONS } from '../customer-quick-edit-form';
-
-// ----------------------------------------------------------------------
-
-const STATUS_OPTIONS = [{ value: 'all', label: 'All' }, ...USER_STATUS_OPTIONS];
-
-const TABLE_HEAD = [
-  { id: 'name', label: 'Name' },
-  { id: 'representative', label: 'Representative', width: 220 },
-  { id: 'email', label: 'Email' },
-  { id: 'status', label: 'Status', width: 100 },
-  { id: '', width: 88 },
-];
-
-const defaultFilters: CustomerTableFilters = {
-  name: '',
-  role: [],
-  status: 'all',
-};
-
-// ----------------------------------------------------------------------
-
-export default function CustomerListView() {
-  const table = useTable({ defaultDense: true, defaultRowsPerPage: 25 });
-
-  const settings = useSettingsContext();
-
-  // const router = useRouter();
-
-  const confirm = useBoolean();
-
-  const { customers } = useGetCustomers();
-
-  // const [tableData, setTableData] = useState(customers || []);
-
-  const [filters, setFilters] = useState(defaultFilters);
-
-  const dataFiltered = applyFilter({
-    inputData: customers,
-    comparator: getComparator(table.order, table.orderBy),
-    filters,
-  });
-
-  const dataInPage = dataFiltered.slice(
-    table.page * table.rowsPerPage,
-    table.page * table.rowsPerPage + table.rowsPerPage
-  );
-
-  const denseHeight = table.dense ? 52 : 72;
-
-  const canReset = !isEqual(defaultFilters, filters);
-
-  const notFound = (!dataFiltered.length && canReset) || !dataFiltered.length;
-
-  const handleFilters = useCallback(
-    (name: string, value: CustomerTableFilterValue) => {
-      table.onResetPage();
-      setFilters((prevState) => ({
-        ...prevState,
-        [name]: value,
-      }));
-    },
-    [table]
-  );
-
-  // const handleDeleteRow = useCallback(
-  //   (id: string) => {
-  //     const deleteRow = customers.filter((row) => row.id !== id);
-
-  //     table.onUpdatePageDeleteRow(dataInPage.length);
-  //   },
-  //   [dataInPage.length, table]
-  // );
-
-  // const handleDeleteRows = useCallback(() => {
-  //   const deleteRows = tableData.filter((row) => !table.selected.includes(row.id));
-  //   setTableData(deleteRows);
-
-  //   table.onUpdatePageDeleteRows({
-  //     totalRows: tableData.length,
-  //     totalRowsInPage: dataInPage.length,
-  //     totalRowsFiltered: dataFiltered.length,
-  //   });
-  // }, [dataFiltered.length, dataInPage.length, table, tableData]);
-
-  // const handleEditRow = useCallback(
-  //   (id: string) => {
-  //     router.push(paths.dashboard.user.edit(id));
-  //   },
-  //   [router]
-  // );
-
-  const handleFilterStatus = useCallback(
-    (event: React.SyntheticEvent, newValue: string) => {
-      handleFilters('status', newValue);
-    },
-    [handleFilters]
-  );
-
-  const handleResetFilters = useCallback(() => {
-    setFilters(defaultFilters);
-  }, []);
-
-  return (
-    <>
-      <Container maxWidth={settings.themeStretch ? false : 'lg'}>
-        <CustomBreadcrumbs
-          heading="List"
-          links={[
-            { name: 'Dashboard', href: paths.dashboard.root },
-            { name: 'Customer', href: paths.dashboard.customer.list },
-            { name: 'List' },
-          ]}
-          action={
-            <Button
-              component={RouterLink}
-              href={paths.dashboard.customer.new}
-              variant="contained"
-              startIcon={<Iconify icon="mingcute:add-line" />}
-            >
-              New Customer
-            </Button>
-          }
-          sx={{
-            mb: { xs: 3, md: 5 },
-          }}
-        />
-
-        <Card>
-          <Tabs
-            value={filters.status}
-            onChange={handleFilterStatus}
-            sx={{
-              px: 2.5,
-              boxShadow: (theme) => `inset 0 -2px 0 0 ${alpha(theme.palette.grey[500], 0.08)}`,
-            }}
-          >
-            {STATUS_OPTIONS.map((tab) => (
-              <Tab
-                key={tab.value}
-                iconPosition="end"
-                value={tab.value}
-                label={tab.label}
-                icon={
-                  <Label
-                    variant={
-                      ((tab.value === 'all' || tab.value === filters.status) && 'filled') || 'soft'
-                    }
-                    color={
-                      (tab.value === 'active' && 'success') ||
-                      (tab.value === 'pending' && 'warning') ||
-                      (tab.value === 'banned' && 'error') ||
-                      'default'
-                    }
-                  >
-                    {tab.value === 'all' && customers.length}
-
-                    {tab.value === 'active' &&
-                      customers.filter((customer) => customer.status === 'active').length}
-
-                    {tab.value === 'banned' &&
-                      customers.filter((customer) => customer.status === 'banned').length}
-
-                    {tab.value === 'inactive' &&
-                      customers.filter((customer) => customer.status === 'inactive').length}
-                  </Label>
-                }
-              />
-            ))}
-          </Tabs>
-
-          {canReset && (
-            <CustomerTableFiltersResult
-              filters={filters}
-              onFilters={handleFilters}
-              //
-              onResetFilters={handleResetFilters}
-              //
-              results={dataFiltered.length}
-              sx={{ p: 2.5, pt: 0 }}
-            />
-          )}
-
-          <TableContainer sx={{ position: 'relative', overflow: 'unset' }}>
-            <Scrollbar>
-              <Table size={table.dense ? 'small' : 'medium'} sx={{ minWidth: 960 }}>
-                <TableHeadCustom
-                  order={table.order}
-                  orderBy={table.orderBy}
-                  headLabel={TABLE_HEAD}
-                  rowCount={customers.length}
-                  numSelected={table.selected.length}
-                  onSort={table.onSort}
-                />
-
-                <TableBody>
-                  {dataFiltered
-                    .slice(
-                      table.page * table.rowsPerPage,
-                      table.page * table.rowsPerPage + table.rowsPerPage
-                    )
-                    .map((row) => (
-                      <CustomerTableRow
-                        key={row.id}
-                        row={row}
-                        selected={table.selected.includes(row.id!)}
-                        onEditRow={() => {}}
-                      />
-                    ))}
-
-                  <TableEmptyRows
-                    height={denseHeight}
-                    emptyRows={emptyRows(table.page, table.rowsPerPage, customers.length)}
-                  />
-
-                  <TableNoData notFound={notFound} />
-                </TableBody>
-              </Table>
-            </Scrollbar>
-          </TableContainer>
-
-          <TablePaginationCustom
-            count={dataFiltered.length}
-            page={table.page}
-            rowsPerPage={table.rowsPerPage}
-            onPageChange={table.onChangePage}
-            onRowsPerPageChange={table.onChangeRowsPerPage}
-            //
-            dense={table.dense}
-            onChangeDense={table.onChangeDense}
-          />
-        </Card>
-      </Container>
-
-      {/* <ConfirmDialog
-        open={confirm.value}
-        onClose={confirm.onFalse}
-        title="Delete"
-        content={
-          <>
-            Are you sure want to delete <strong> {table.selected.length} </strong> items?
-          </>
-        }
-        action={
-          <Button
-            variant="contained"
-            color="error"
-            onClick={() => {
-              handleDeleteRows();
-              confirm.onFalse();
-            }}
-          >
-            Delete
-          </Button>
-        }
-      /> */}
-    </>
-  );
-}
-
-// ----------------------------------------------------------------------
-
-function applyFilter({
-  inputData,
-  comparator,
-  filters,
-}: {
-  inputData: Customer[];
-  comparator: (a: any, b: any) => number;
-  filters: CustomerTableFilters;
-}) {
-  const { name, status, role } = filters;
-
-  const stabilizedThis = inputData.map((el, index) => [el, index] as const);
-
-  stabilizedThis.sort((a, b) => {
-    const order = comparator(a[0], b[0]);
-    if (order !== 0) return order;
-    return a[1] - b[1];
-  });
-
-  inputData = stabilizedThis.map((el) => el[0]);
-
-  if (name) {
-    inputData = inputData.filter(
-      (user) => user.name.toLowerCase().indexOf(name.toLowerCase()) !== -1
-    );
-  }
-
-  if (status !== 'all') {
-    inputData = inputData.filter((user) => user.status === status);
-  }
-
-  return inputData;
-}
Index: c/sections/client/view/index.ts
===================================================================
--- src/sections/client/view/index.ts	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ 	(revision )
@@ -1,2 +1,0 @@
-export { default as CustomerListView } from './customer-list-view';
-export { default as CustomerCreateView } from './customer-create-view';
Index: src/sections/company/company-item.tsx
===================================================================
--- src/sections/company/company-item.tsx	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ src/sections/company/company-item.tsx	(revision 5d6f37a75130aab7d9a67b5b430603eff2c0ca6e)
@@ -4,5 +4,5 @@
 import Stack, { StackProps } from '@mui/material/Stack';
 // types
-import { Customer } from 'src/schemas';
+import { Customer } from 'mvpmasters-shared';
 // components
 import Label from 'src/components/label';
Index: src/sections/company/company-list-dialog.tsx
===================================================================
--- src/sections/company/company-list-dialog.tsx	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ src/sections/company/company-list-dialog.tsx	(revision 5d6f37a75130aab7d9a67b5b430603eff2c0ca6e)
@@ -9,10 +9,9 @@
 import ListItemButton, { listItemButtonClasses } from '@mui/material/ListItemButton';
 // types
-import { Customer } from 'src/schemas';
+import { Customer } from 'mvpmasters-shared';
 // components
 import Iconify from 'src/components/iconify';
 import SearchNotFound from 'src/components/search-not-found';
 import { createFullAddress } from 'src/utils/create-full-address';
-import { Tenant } from 'src/schemas';
 
 // ----------------------------------------------------------------------
@@ -20,6 +19,5 @@
 type Props = {
   title?: string;
-  tenant?: Tenant;
-  list?: Customer[];
+  list: Customer[];
   action?: React.ReactNode;
   //
@@ -28,10 +26,9 @@
   //
   selected: (selectedId: string) => boolean;
-  onSelect: (address: Customer | Tenant | null) => void;
+  onSelect: (address: Customer | null) => void;
 };
 
 export default function AddressListDialog({
   title = 'Address Book',
-  tenant,
   list,
   action,
@@ -46,5 +43,5 @@
 
   const dataFiltered = applyFilter({
-    inputData: list || (tenant ? [tenant] : []),
+    inputData: list,
     query: searchCompany,
   });
@@ -57,5 +54,5 @@
 
   const handleSelectCompany = useCallback(
-    (company: Customer | Tenant | null) => {
+    (company: Customer | null) => {
       onSelect(company);
       setSearchCompany('');
@@ -159,5 +156,5 @@
 // ----------------------------------------------------------------------
 
-function applyFilter({ inputData, query }: { inputData: Tenant[] | Customer[]; query: string }) {
+function applyFilter({ inputData, query }: { inputData: Customer[]; query: string }) {
   if (query) {
     return inputData.filter(
Index: c/sections/employee/employee-new-edit-form.tsx
===================================================================
--- src/sections/employee/employee-new-edit-form.tsx	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ 	(revision )
@@ -1,74 +1,0 @@
-import { useCallback } from 'react';
-import { useForm } from 'react-hook-form';
-import { zodResolver } from '@hookform/resolvers/zod';
-// @mui
-import LoadingButton from '@mui/lab/LoadingButton';
-import Card from '@mui/material/Card';
-import Stack from '@mui/material/Stack';
-import Grid from '@mui/material/Unstable_Grid2';
-// routes
-import { paths } from 'src/routes/paths';
-import { useRouter } from 'src/routes/hooks';
-// types
-import { NewEmployee, newEmployeeSchema } from 'src/schemas';
-// components
-import { useSnackbar } from 'src/components/snackbar';
-import FormProvider, { RHFTextField, RHFUploadAvatar } from 'src/components/hook-form';
-import { createEmployee } from 'src/api/employee';
-
-export default function EmployeeNewEditForm() {
-  const router = useRouter();
-  const { enqueueSnackbar } = useSnackbar();
-
-  const methods = useForm<NewEmployee>({
-    resolver: zodResolver(newEmployeeSchema),
-    defaultValues: {
-      name: '',
-      email: '',
-      status: 'active' as const,
-      project: '',
-      iban: '',
-      photo: '',
-      cv: '',
-    },
-  });
-
-  const {
-    handleSubmit,
-    formState: { isSubmitting },
-  } = methods;
-
-  const onSubmit = handleSubmit(async (data) => {
-    try {
-      await createEmployee(data);
-      enqueueSnackbar('Create success!');
-      router.push(paths.dashboard.employee.list);
-    } catch (error) {
-      console.error(error);
-    }
-  });
-
-  return (
-    <FormProvider methods={methods} onSubmit={onSubmit}>
-      <Grid container spacing={3}>
-        <Grid xs={12} md={8}>
-          <Card sx={{ p: 3 }}>
-            <Stack spacing={3}>
-              <RHFTextField name="name" label="Full Name" />
-              <RHFTextField name="email" label="Email Address" />
-              <RHFTextField name="project" label="Project" />
-              <RHFTextField name="iban" label="IBAN" />
-              <RHFTextField name="cv" label="CV Link" />
-            </Stack>
-
-            <Stack alignItems="flex-end" sx={{ mt: 3 }}>
-              <LoadingButton type="submit" variant="contained" loading={isSubmitting}>
-                Create Employee
-              </LoadingButton>
-            </Stack>
-          </Card>
-        </Grid>
-      </Grid>
-    </FormProvider>
-  );
-}
Index: c/sections/employee/employee-quick-edit-form.tsx
===================================================================
--- src/sections/employee/employee-quick-edit-form.tsx	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ 	(revision )
@@ -1,110 +1,0 @@
-import * as Yup from 'yup';
-import { useMemo } from 'react';
-import { useForm } from 'react-hook-form';
-import { zodResolver } from '@hookform/resolvers/zod';
-// @mui
-import LoadingButton from '@mui/lab/LoadingButton';
-import Box from '@mui/material/Box';
-import Button from '@mui/material/Button';
-import Dialog from '@mui/material/Dialog';
-import MenuItem from '@mui/material/MenuItem';
-import DialogTitle from '@mui/material/DialogTitle';
-import DialogActions from '@mui/material/DialogActions';
-import DialogContent from '@mui/material/DialogContent';
-// types
-import { Employee, employeeSchema } from 'src/schemas';
-// components
-import { useSnackbar } from 'src/components/snackbar';
-import FormProvider, { RHFSelect, RHFTextField } from 'src/components/hook-form';
-
-// ----------------------------------------------------------------------
-
-type Props = {
-  open: boolean;
-  onClose: VoidFunction;
-  currentEmployee?: Employee;
-};
-
-export const EMPLOYEE_STATUS_OPTIONS = [
-  { value: 'active', label: 'Active' },
-  { value: 'inactive', label: 'Inactive' },
-];
-
-export default function EmployeeQuickEditForm({ currentEmployee, open, onClose }: Props) {
-  const { enqueueSnackbar } = useSnackbar();
-
-  const defaultValues = useMemo(
-    () => ({
-      name: currentEmployee?.name || '',
-      email: currentEmployee?.email || '',
-      status: currentEmployee?.status || 'active',
-      project: currentEmployee?.project || '',
-      iban: currentEmployee?.iban || '',
-    }),
-    [currentEmployee]
-  );
-
-  const methods = useForm({
-    resolver: zodResolver(employeeSchema),
-    defaultValues,
-  });
-
-  const {
-    reset,
-    handleSubmit,
-    formState: { isSubmitting },
-  } = methods;
-
-  const onSubmit = handleSubmit(async (data) => {
-    try {
-      await new Promise((resolve) => setTimeout(resolve, 500));
-      reset();
-      onClose();
-      enqueueSnackbar('Update success!');
-    } catch (error) {
-      console.error(error);
-    }
-  });
-
-  return (
-    <Dialog fullWidth maxWidth="xs" open={open} onClose={onClose}>
-      <FormProvider methods={methods} onSubmit={onSubmit}>
-        <DialogTitle>Quick Update</DialogTitle>
-
-        <DialogContent>
-          <Box
-            rowGap={3}
-            columnGap={2}
-            display="grid"
-            gridTemplateColumns={{
-              xs: 'repeat(1, 1fr)',
-            }}
-            sx={{ pt: 3 }}
-          >
-            <RHFTextField name="name" label="Full Name" />
-            <RHFTextField name="email" label="Email Address" />
-            <RHFTextField name="project" label="Project" />
-            <RHFTextField name="iban" label="IBAN" />
-            <RHFSelect name="status" label="Status">
-              {EMPLOYEE_STATUS_OPTIONS.map((status) => (
-                <MenuItem key={status.value} value={status.value}>
-                  {status.label}
-                </MenuItem>
-              ))}
-            </RHFSelect>
-          </Box>
-        </DialogContent>
-
-        <DialogActions>
-          <Button variant="outlined" onClick={onClose}>
-            Cancel
-          </Button>
-
-          <LoadingButton type="submit" variant="contained" loading={isSubmitting}>
-            Update
-          </LoadingButton>
-        </DialogActions>
-      </FormProvider>
-    </Dialog>
-  );
-}
Index: c/sections/employee/employee-table-filters-result.tsx
===================================================================
--- src/sections/employee/employee-table-filters-result.tsx	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ 	(revision )
@@ -1,86 +1,0 @@
-// @mui
-import Box from '@mui/material/Box';
-import Chip from '@mui/material/Chip';
-import Paper from '@mui/material/Paper';
-import Button from '@mui/material/Button';
-import Stack, { StackProps } from '@mui/material/Stack';
-// types
-import { EmployeeTableFilters } from 'src/schemas';
-// components
-import Iconify from 'src/components/iconify';
-
-// ----------------------------------------------------------------------
-
-interface Props extends StackProps {
-  filters: EmployeeTableFilters;
-  onFilters: (name: string, value: string | string[]) => void;
-  onResetFilters: VoidFunction;
-  results: number;
-}
-
-export default function EmployeeTableFiltersResult({
-  filters,
-  onFilters,
-  onResetFilters,
-  results,
-  ...other
-}: Props) {
-  const handleRemoveStatus = () => {
-    onFilters('status', 'all');
-  };
-
-  const handleRemoveName = () => {
-    onFilters('name', '');
-  };
-
-  return (
-    <Stack spacing={1.5} {...other}>
-      <Box sx={{ typography: 'body2' }}>
-        <strong>{results}</strong>
-        <Box component="span" sx={{ color: 'text.secondary', ml: 0.25 }}>
-          results found
-        </Box>
-      </Box>
-
-      <Stack flexGrow={1} spacing={1} direction="row" flexWrap="wrap" alignItems="center">
-        {filters.status !== 'all' && (
-          <Block label="Status:">
-            <Chip size="small" label={filters.status} onDelete={handleRemoveStatus} />
-          </Block>
-        )}
-
-        {filters.name && (
-          <Block label="Name:">
-            <Chip size="small" label={filters.name} onDelete={handleRemoveName} />
-          </Block>
-        )}
-
-        <Button
-          color="error"
-          onClick={onResetFilters}
-          startIcon={<Iconify icon="solar:trash-bin-trash-bold" />}
-        >
-          Clear
-        </Button>
-      </Stack>
-    </Stack>
-  );
-}
-
-// ----------------------------------------------------------------------
-
-type BlockProps = {
-  label: string;
-  children: React.ReactNode;
-};
-
-function Block({ label, children }: BlockProps) {
-  return (
-    <Stack direction="row" alignItems="center" sx={{ typography: 'body2' }}>
-      <Box component="span" sx={{ color: 'text.secondary' }}>
-        {label}&nbsp;
-      </Box>
-      {children}
-    </Stack>
-  );
-}
Index: c/sections/employee/employee-table-row.tsx
===================================================================
--- src/sections/employee/employee-table-row.tsx	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ 	(revision )
@@ -1,71 +1,0 @@
-// @mui
-import Avatar from '@mui/material/Avatar';
-import Tooltip from '@mui/material/Tooltip';
-import TableRow from '@mui/material/TableRow';
-import TableCell from '@mui/material/TableCell';
-import IconButton from '@mui/material/IconButton';
-// hooks
-import { useBoolean } from 'src/hooks/use-boolean';
-// types
-import { Employee } from 'src/schemas';
-// components
-import Label from 'src/components/label';
-import Iconify from 'src/components/iconify';
-//
-import EmployeeQuickEditForm from './employee-quick-edit-form';
-
-// ----------------------------------------------------------------------
-
-type Props = {
-  selected: boolean;
-  onEditRow: VoidFunction;
-  row: Employee;
-};
-
-export default function EmployeeTableRow({ row, selected, onEditRow }: Props) {
-  const { name, photo, project, status, email } = row;
-
-  const quickEdit = useBoolean();
-
-  return (
-    <>
-      <TableRow hover selected={selected}>
-        <TableCell sx={{ display: 'flex', alignItems: 'center' }}>
-          <Avatar alt={name} src={photo || ''} sx={{ mr: 2 }} />
-          <span>{name}</span>
-        </TableCell>
-
-        <TableCell sx={{ whiteSpace: 'nowrap' }}>{email}</TableCell>
-
-        <TableCell sx={{ whiteSpace: 'nowrap' }}>{project || '-'}</TableCell>
-
-        <TableCell>
-          <Label
-            variant="soft"
-            color={
-              (status === 'active' && 'success') ||
-              (status === 'inactive' && 'warning') ||
-              'default'
-            }
-          >
-            {status}
-          </Label>
-        </TableCell>
-
-        <TableCell align="right" sx={{ px: 1, whiteSpace: 'nowrap' }}>
-          <Tooltip title="Quick Edit" placement="top" arrow>
-            <IconButton color={quickEdit.value ? 'inherit' : 'default'} onClick={quickEdit.onTrue}>
-              <Iconify icon="solar:pen-bold" />
-            </IconButton>
-          </Tooltip>
-        </TableCell>
-      </TableRow>
-
-      <EmployeeQuickEditForm
-        currentEmployee={row}
-        open={quickEdit.value}
-        onClose={quickEdit.onFalse}
-      />
-    </>
-  );
-}
Index: c/sections/employee/view/employee-create-view.tsx
===================================================================
--- src/sections/employee/view/employee-create-view.tsx	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ 	(revision )
@@ -1,41 +1,0 @@
-'use client';
-
-// @mui
-import Container from '@mui/material/Container';
-// routes
-import { paths } from 'src/routes/paths';
-// components
-import { useSettingsContext } from 'src/components/settings';
-import CustomBreadcrumbs from 'src/components/custom-breadcrumbs';
-//
-import EmployeeNewEditForm from '../employee-new-edit-form';
-
-// ----------------------------------------------------------------------
-
-export default function EmployeeCreateView() {
-  const settings = useSettingsContext();
-
-  return (
-    <Container maxWidth={settings.themeStretch ? false : 'lg'}>
-      <CustomBreadcrumbs
-        heading="Create a new employee"
-        links={[
-          {
-            name: 'Dashboard',
-            href: paths.dashboard.root,
-          },
-          {
-            name: 'Employee',
-            href: paths.dashboard.employee.list,
-          },
-          { name: 'New employee' },
-        ]}
-        sx={{
-          mb: { xs: 3, md: 5 },
-        }}
-      />
-
-      <EmployeeNewEditForm />
-    </Container>
-  );
-}
Index: c/sections/employee/view/employee-list-view.tsx
===================================================================
--- src/sections/employee/view/employee-list-view.tsx	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ 	(revision )
@@ -1,265 +1,0 @@
-'use client';
-
-import isEqual from 'lodash/isEqual';
-import { useState, useCallback } from 'react';
-// @mui
-import { alpha } from '@mui/material/styles';
-import Tab from '@mui/material/Tab';
-import Tabs from '@mui/material/Tabs';
-import Card from '@mui/material/Card';
-import Table from '@mui/material/Table';
-import Button from '@mui/material/Button';
-import Container from '@mui/material/Container';
-import TableBody from '@mui/material/TableBody';
-import TableContainer from '@mui/material/TableContainer';
-// routes
-import { paths } from 'src/routes/paths';
-import { RouterLink } from 'src/routes/components';
-// hooks
-import { useBoolean } from 'src/hooks/use-boolean';
-// components
-import Label from 'src/components/label';
-import Iconify from 'src/components/iconify';
-import Scrollbar from 'src/components/scrollbar';
-import { useSettingsContext } from 'src/components/settings';
-import CustomBreadcrumbs from 'src/components/custom-breadcrumbs';
-import {
-  useTable,
-  getComparator,
-  emptyRows,
-  TableNoData,
-  TableEmptyRows,
-  TableHeadCustom,
-  TablePaginationCustom,
-} from 'src/components/table';
-// types
-import { Employee, EmployeeTableFilters, EmployeeTableFilterValue } from 'src/schemas';
-//
-import { useGetEmployees } from 'src/api/employee';
-import EmployeeTableRow from '../employee-table-row';
-import EmployeeTableFiltersResult from '../employee-table-filters-result';
-
-const STATUS_OPTIONS = [
-  { value: 'all', label: 'All' },
-  { value: 'active', label: 'Active' },
-  { value: 'inactive', label: 'Inactive' },
-];
-
-const TABLE_HEAD = [
-  { id: 'name', label: 'Name' },
-  { id: 'email', label: 'Email' },
-  { id: 'project', label: 'Project' },
-  { id: 'status', label: 'Status', width: 100 },
-  { id: '', width: 88 },
-];
-
-const defaultFilters: EmployeeTableFilters = {
-  name: '',
-  status: 'all',
-};
-
-export default function EmployeeListView() {
-  const table = useTable({ defaultDense: true });
-  const settings = useSettingsContext();
-  const { employees } = useGetEmployees();
-  const [filters, setFilters] = useState(defaultFilters);
-
-  const dataFiltered = applyFilter({
-    inputData: employees,
-    comparator: getComparator(table.order, table.orderBy),
-    filters,
-  });
-
-  const dataInPage = dataFiltered.slice(
-    table.page * table.rowsPerPage,
-    table.page * table.rowsPerPage + table.rowsPerPage
-  );
-
-  const denseHeight = table.dense ? 52 : 72;
-
-  const canReset = !isEqual(defaultFilters, filters);
-
-  const notFound = (!dataFiltered.length && canReset) || !dataFiltered.length;
-
-  const handleFilters = useCallback(
-    (name: string, value: EmployeeTableFilterValue) => {
-      table.onResetPage();
-      setFilters((prevState: EmployeeTableFilters) => ({
-        ...prevState,
-        [name]: value,
-      }));
-    },
-    [table]
-  );
-
-  const handleFilterStatus = useCallback(
-    (event: React.SyntheticEvent, newValue: string) => {
-      handleFilters('status', newValue);
-    },
-    [handleFilters]
-  );
-
-  const handleResetFilters = useCallback(() => {
-    setFilters(defaultFilters);
-  }, []);
-
-  return (
-    <>
-      <Container maxWidth={settings.themeStretch ? false : 'lg'}>
-        <CustomBreadcrumbs
-          heading="List"
-          links={[
-            { name: 'Dashboard', href: paths.dashboard.root },
-            { name: 'Employee', href: paths.dashboard.employee.list },
-            { name: 'List' },
-          ]}
-          action={
-            <Button
-              component={RouterLink}
-              href={paths.dashboard.employee.new}
-              variant="contained"
-              startIcon={<Iconify icon="mingcute:add-line" />}
-            >
-              New Employee
-            </Button>
-          }
-          sx={{
-            mb: { xs: 3, md: 5 },
-          }}
-        />
-
-        <Card>
-          <Tabs
-            value={filters.status}
-            onChange={handleFilterStatus}
-            sx={{
-              px: 2.5,
-              boxShadow: (theme) => `inset 0 -2px 0 0 ${alpha(theme.palette.grey[500], 0.08)}`,
-            }}
-          >
-            {STATUS_OPTIONS.map((tab) => (
-              <Tab
-                key={tab.value}
-                iconPosition="end"
-                value={tab.value}
-                label={tab.label}
-                icon={
-                  <Label
-                    variant={
-                      ((tab.value === 'all' || tab.value === filters.status) && 'filled') || 'soft'
-                    }
-                    color={
-                      (tab.value === 'active' && 'success') ||
-                      (tab.value === 'inactive' && 'warning') ||
-                      'default'
-                    }
-                  >
-                    {tab.value === 'all' && employees.length}
-                    {tab.value === 'active' &&
-                      employees.filter((employee) => employee.status === 'active').length}
-                    {tab.value === 'inactive' &&
-                      employees.filter((employee) => employee.status === 'inactive').length}
-                  </Label>
-                }
-              />
-            ))}
-          </Tabs>
-
-          {canReset && (
-            <EmployeeTableFiltersResult
-              filters={filters}
-              onFilters={handleFilters}
-              onResetFilters={handleResetFilters}
-              results={dataFiltered.length}
-              sx={{ p: 2.5, pt: 0 }}
-            />
-          )}
-
-          <TableContainer sx={{ position: 'relative', overflow: 'unset' }}>
-            <Scrollbar>
-              <Table size={table.dense ? 'small' : 'medium'} sx={{ minWidth: 960 }}>
-                <TableHeadCustom
-                  order={table.order}
-                  orderBy={table.orderBy}
-                  headLabel={TABLE_HEAD}
-                  rowCount={employees.length}
-                  numSelected={table.selected.length}
-                  onSort={table.onSort}
-                />
-
-                <TableBody>
-                  {dataFiltered
-                    .slice(
-                      table.page * table.rowsPerPage,
-                      table.page * table.rowsPerPage + table.rowsPerPage
-                    )
-                    .map((row) => (
-                      <EmployeeTableRow
-                        key={row.id}
-                        row={row}
-                        selected={table.selected.includes(row.id!)}
-                        onEditRow={() => {}}
-                      />
-                    ))}
-
-                  <TableEmptyRows
-                    height={denseHeight}
-                    emptyRows={emptyRows(table.page, table.rowsPerPage, employees.length)}
-                  />
-
-                  <TableNoData notFound={notFound} />
-                </TableBody>
-              </Table>
-            </Scrollbar>
-          </TableContainer>
-
-          <TablePaginationCustom
-            count={dataFiltered.length}
-            page={table.page}
-            rowsPerPage={table.rowsPerPage}
-            onPageChange={table.onChangePage}
-            onRowsPerPageChange={table.onChangeRowsPerPage}
-            dense={table.dense}
-            onChangeDense={table.onChangeDense}
-          />
-        </Card>
-      </Container>
-    </>
-  );
-}
-
-// ----------------------------------------------------------------------
-
-function applyFilter({
-  inputData,
-  comparator,
-  filters,
-}: {
-  inputData: Employee[];
-  comparator: (a: any, b: any) => number;
-  filters: EmployeeTableFilters;
-}) {
-  const { name, status } = filters;
-
-  const stabilizedThis = inputData.map((el, index) => [el, index] as const);
-
-  stabilizedThis.sort((a, b) => {
-    const order = comparator(a[0], b[0]);
-    if (order !== 0) return order;
-    return a[1] - b[1];
-  });
-
-  inputData = stabilizedThis.map((el) => el[0]);
-
-  if (name) {
-    inputData = inputData.filter(
-      (employee) => employee.name.toLowerCase().indexOf(name.toLowerCase()) !== -1
-    );
-  }
-
-  if (status !== 'all') {
-    inputData = inputData.filter((employee) => employee.status === status);
-  }
-
-  return inputData;
-}
Index: c/sections/employee/view/index.ts
===================================================================
--- src/sections/employee/view/index.ts	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ 	(revision )
@@ -1,2 +1,0 @@
-export { default as EmployeeListView } from './employee-list-view';
-export { default as EmployeeCreateView } from './employee-create-view';
Index: src/sections/invoice/invoice-details.tsx
===================================================================
--- src/sections/invoice/invoice-details.tsx	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ src/sections/invoice/invoice-details.tsx	(revision 5d6f37a75130aab7d9a67b5b430603eff2c0ca6e)
@@ -18,5 +18,5 @@
 import { fCurrency } from 'src/utils/format-number';
 // types
-import { Invoice } from 'src/schemas';
+import { Invoice } from 'mvpmasters-shared';
 // components
 import Label from 'src/components/label';
@@ -28,5 +28,4 @@
 import { getQuantityType } from 'src/utils/get-invoice-quantity-type';
 import InvoiceToolbar from './invoice-toolbar';
-import { updateInvoice } from 'src/api/invoice';
 
 // ----------------------------------------------------------------------
@@ -60,8 +59,5 @@
   const handleChangeStatus = useCallback(
     async (event: React.ChangeEvent<HTMLInputElement>) => {
-      // await updateDocument(collections.invoice, invoice.id, { status: event.target.value });
-      await updateInvoice(invoice.id, {
-        status: event.target.value as 'draft' | 'processing' | 'pending' | 'overdue' | 'paid',
-      });
+      await updateDocument(collections.invoice, invoice.id, { status: event.target.value });
       mutate([collections.invoice, invoice.id]);
     },
@@ -244,7 +240,7 @@
             {invoice.invoiceTo.name}
             <br />
-            {!!invoice.invoiceTo.companyNumber && (
+            {!!invoice.invoiceTo.companyId && (
               <>
-                Company ID: {invoice.invoiceTo.companyNumber}
+                Company ID: {invoice.invoiceTo.companyId}
                 <br />
               </>
@@ -261,5 +257,5 @@
               Date Issued
             </Typography>
-            {fDate(invoice.issueDate)}
+            {fDate(invoice.createDate.toDate())}
           </Stack>
 
@@ -268,5 +264,5 @@
               Due Date
             </Typography>
-            {fDate(invoice.dueDate)}
+            {fDate(invoice.dueDate.toDate())}
           </Stack>
         </Box>
Index: src/sections/invoice/invoice-ee-pdf.tsx
===================================================================
--- src/sections/invoice/invoice-ee-pdf.tsx	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ src/sections/invoice/invoice-ee-pdf.tsx	(revision 5d6f37a75130aab7d9a67b5b430603eff2c0ca6e)
@@ -5,5 +5,5 @@
 import { fCurrency } from 'src/utils/format-number';
 // types
-import { Invoice } from 'src/schemas';
+import { Invoice } from 'mvpmasters-shared';
 import { createFullAddress } from 'src/utils/create-full-address';
 import { getQuantityType } from 'src/utils/get-invoice-quantity-type';
@@ -129,5 +129,5 @@
     discount,
     invoiceTo,
-    issueDate,
+    createDate,
     totalAmount,
     invoiceFrom,
@@ -229,9 +229,9 @@
           <View style={styles.col6}>
             <Text style={[styles.subtitle1, styles.mb4]}>Date Issued</Text>
-            <Text style={styles.body2}>{fDate(issueDate)}</Text>
+            <Text style={styles.body2}>{fDate(createDate.toDate())}</Text>
           </View>
           <View style={styles.col6}>
             <Text style={[styles.subtitle1, styles.mb4]}>Due date</Text>
-            <Text style={styles.body2}>{fDate(dueDate)}</Text>
+            <Text style={styles.body2}>{fDate(dueDate.toDate())}</Text>
           </View>
         </View>
Index: src/sections/invoice/invoice-mk-pdf.tsx
===================================================================
--- src/sections/invoice/invoice-mk-pdf.tsx	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ src/sections/invoice/invoice-mk-pdf.tsx	(revision 5d6f37a75130aab7d9a67b5b430603eff2c0ca6e)
@@ -5,5 +5,5 @@
 import { fCurrency } from 'src/utils/format-number';
 // types
-import { Invoice } from 'src/schemas';
+import { Invoice } from 'mvpmasters-shared';
 import { createFullAddress } from 'src/utils/create-full-address';
 import { getQuantityType } from 'src/utils/get-invoice-quantity-type';
@@ -113,5 +113,5 @@
     discount,
     invoiceTo,
-    issueDate,
+    createDate,
     totalAmount,
     invoiceFrom,
@@ -179,9 +179,9 @@
           <View style={styles.col6}>
             <Text style={[styles.subtitle1, styles.mb4]}>Date Issued</Text>
-            <Text style={styles.body2}>{fDate(issueDate)}</Text>
+            <Text style={styles.body2}>{fDate(createDate.toDate())}</Text>
           </View>
           <View style={styles.col6}>
             <Text style={[styles.subtitle1, styles.mb4]}>Due date</Text>
-            <Text style={styles.body2}>{fDate(dueDate)}</Text>
+            <Text style={styles.body2}>{fDate(dueDate.toDate())}</Text>
           </View>
         </View>
Index: src/sections/invoice/invoice-new-edit-address.tsx
===================================================================
--- src/sections/invoice/invoice-new-edit-address.tsx	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ src/sections/invoice/invoice-new-edit-address.tsx	(revision 5d6f37a75130aab7d9a67b5b430603eff2c0ca6e)
@@ -7,5 +7,5 @@
 import Typography from '@mui/material/Typography';
 // hooks
-import { useGetTenant } from 'src/api/tenant';
+import { useGetSettings } from 'src/api/settings';
 import { useBoolean } from 'src/hooks/use-boolean';
 import { useResponsive } from 'src/hooks/use-responsive';
@@ -32,5 +32,5 @@
   const { invoiceFrom, invoiceTo } = values;
 
-  const { settings: tenant } = useGetTenant();
+  const { settings } = useGetSettings();
   const { customers } = useGetCustomers();
 
@@ -100,5 +100,5 @@
       </Stack>
 
-      {tenant && (
+      {settings && (
         <CompanyListDialog
           title="Companies"
@@ -106,6 +106,6 @@
           onClose={from.onFalse}
           selected={(selectedId: string) => invoiceFrom?.id === selectedId}
-          onSelect={(tenant) => setValue('invoiceFrom', tenant)}
-          tenant={tenant}
+          onSelect={(company) => setValue('invoiceFrom', company)}
+          list={[settings?.company, settings?.['company-ee']]}
           action={
             <Button
Index: src/sections/invoice/invoice-new-edit-details.tsx
===================================================================
--- src/sections/invoice/invoice-new-edit-details.tsx	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ src/sections/invoice/invoice-new-edit-details.tsx	(revision 5d6f37a75130aab7d9a67b5b430603eff2c0ca6e)
@@ -14,5 +14,5 @@
 import { fCurrency } from 'src/utils/format-number';
 // types
-import { InvoiceItem } from 'src/schemas';
+import { InvoiceItem } from 'mvpmasters-shared';
 // components
 import Iconify from 'src/components/iconify';
@@ -75,26 +75,14 @@
   const handleSelectService = useCallback(
     (index: number, option: string) => {
-      const service = invoiceServices.find((service) => service.id === option);
-      if (!service) return;
-
-      const quantityType = values.quantityType?.toLowerCase();
-      let price = 0;
-
-      switch (quantityType) {
-        case 'sprint':
-          price = service.sprint;
-          break;
-        case 'hour':
-          price = service.hour;
-          break;
-        case 'month':
-          price = service.month;
-          break;
-        default:
-          price = 0;
-      }
-
-      setValue(`items[${index}].price`, price);
-      setValue(`items[${index}].total`, values.items[index].quantity * price);
+      setValue(
+        `items[${index}].price`,
+        invoiceServices.find((service) => service.id === option)?.price?.[
+          values.quantityType?.toLowerCase() as 'sprint' | 'hour' | 'month'
+        ]
+      );
+      setValue(
+        `items[${index}].total`,
+        values.items.map((item: InvoiceItem) => item.quantity * item.price)[index]
+      );
     },
     [setValue, values.items, values.quantityType, invoiceServices]
Index: src/sections/invoice/invoice-new-edit-form.tsx
===================================================================
--- src/sections/invoice/invoice-new-edit-form.tsx	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ src/sections/invoice/invoice-new-edit-form.tsx	(revision 5d6f37a75130aab7d9a67b5b430603eff2c0ca6e)
@@ -11,5 +11,5 @@
 import { useRouter } from 'src/routes/hooks';
 // types
-import { CreateInvoice, Invoice } from 'src/schemas';
+import { Invoice } from 'mvpmasters-shared';
 // hooks
 import { useBoolean } from 'src/hooks/use-boolean';
@@ -20,13 +20,19 @@
 import uploadToFirebaseStorage from 'src/utils/upload-to-firebase-storage';
 import { pdf } from '@react-pdf/renderer';
-import { useGetTenant } from 'src/api/tenant';
-import { collections, generateId, updateDocument } from 'src/lib/firestore';
+import { useGetSettings } from 'src/api/settings';
+import {
+  collections,
+  documents,
+  firestoreBatch,
+  generateId,
+  updateDocument,
+} from 'src/lib/firestore';
 import { useGetServices } from 'src/api/service';
 import { mutate } from 'swr';
+import { Timestamp } from 'firebase/firestore';
 import InvoiceNewEditStatusDate from './invoice-new-edit-status-date';
 import InvoiceNewEditAddress from './invoice-new-edit-address';
 import InvoiceNewEditDetails from './invoice-new-edit-details';
 import InvoicePDF from './invoice-pdf';
-import { createInvoice, updateInvoice } from 'src/api/invoice';
 
 // ----------------------------------------------------------------------
@@ -52,13 +58,4 @@
 ];
 
-interface InvoiceItem {
-  service: string | null;
-  title: string;
-  price: number;
-  total: number;
-  quantity: number;
-  description: string;
-}
-
 export default function InvoiceNewEditForm({ isCopy, currentInvoice }: Props) {
   const router = useRouter();
@@ -72,7 +69,5 @@
     description: Yup.string().required('Description is required'),
     service: Yup.string().nullable(),
-    quantity: Yup.number()
-      .required('Quantity is required')
-      .min(0.5, 'Quantity must be at least 0.5'),
+    quantity: Yup.number().required('Quantity is required').min(0.5, 'Quantity must be at least 1'),
     price: Yup.number().required('Price is required').min(0, 'Price must be at least 0'),
     total: Yup.number().required('Total is required').min(0, 'Total must be at least 0'),
@@ -81,5 +76,5 @@
   const NewInvoiceSchema = Yup.object().shape({
     invoiceNumber: Yup.string().nullable().required('Invoice number is required'),
-    issueDate: Yup.mixed<any>().nullable().required('Create date is required'),
+    createDate: Yup.mixed<any>().nullable().required('Create date is required'),
     dueDate: Yup.mixed<any>()
       .required('Due date is required')
@@ -87,5 +82,5 @@
         'date-min',
         'Due date must be later than create date',
-        (value, { parent }) => value.getTime() > parent.issueDate.getTime()
+        (value, { parent }) => value.getTime() > parent.createDate.getTime()
       ),
     invoiceFrom: Yup.mixed<any>().nullable().required('Invoice from is required'),
@@ -96,5 +91,5 @@
       .required('Quantity type is required'),
     month: Yup.string().oneOf(monthNames).required('Month is required'),
-    status: Yup.string().oneOf(['draft', 'processing', 'pending', 'overdue', 'paid']).required(),
+    status: Yup.string().required(),
     totalAmount: Yup.number().required(),
     // not required
@@ -108,6 +103,5 @@
 
   const { services: invoiceServices } = useGetServices();
-  console.log('invoiceServices', invoiceServices);
-  const { settings: tenant, settingsEmpty, settingsLoading } = useGetTenant();
+  const { settings, settingsEmpty, settingsLoading } = useGetSettings();
 
   const defaultValues = useMemo(
@@ -116,9 +110,7 @@
         !isCopy && currentInvoice?.invoiceNumber
           ? currentInvoice?.invoiceNumber
-          : incrementInvoiceNumber(tenant?.lastInvoiceNumber),
-      issueDate: currentInvoice?.issueDate ? new Date(currentInvoice.issueDate) : new Date(),
-      dueDate: currentInvoice?.dueDate
-        ? new Date(currentInvoice.dueDate)
-        : new Date(Date.now() + 30 * 24 * 60 * 60 * 1000),
+          : incrementInvoiceNumber(settings?.invoice?.lastInvoiceNumber),
+      createDate: currentInvoice?.createDate?.toDate() || new Date(),
+      dueDate: currentInvoice?.dueDate?.toDate() || null,
       invoiceFrom: currentInvoice?.invoiceFrom || null,
       invoiceTo: currentInvoice?.invoiceTo || null,
@@ -146,5 +138,5 @@
       totalAmount: currentInvoice?.totalAmount || 0,
     }),
-    [currentInvoice, isCopy, tenant]
+    [currentInvoice, isCopy, settings]
   );
 
@@ -172,16 +164,6 @@
 
     try {
+      // generate collection id
       const id = generateId(collections.invoice);
-
-      // Ensure dates are valid Date objects
-      const issueDate = data.issueDate instanceof Date ? data.issueDate : new Date(data.issueDate);
-      const dueDate = data.dueDate instanceof Date ? data.dueDate : new Date(data.dueDate);
-
-      const currentTime = new Date();
-      issueDate.setHours(
-        currentTime.getHours(),
-        currentTime.getMinutes(),
-        currentTime.getSeconds()
-      );
 
       // attach serivce details
@@ -191,16 +173,21 @@
       }));
 
+      const currentTime = new Date();
+      const createDateWithCurrentTime = new Date(data.createDate); // This creates a date object using the date from data.createDate
+      // Set the time of createDateWithCurrentTime to the current hour, minutes, and seconds
+      createDateWithCurrentTime.setHours(
+        currentTime.getHours(),
+        currentTime.getMinutes(),
+        currentTime.getSeconds()
+      );
+
       // transform data
-      const writeData: CreateInvoice = {
+      const writeData = {
         ...data,
-        invoiceNumber: incrementInvoiceNumber(tenant?.lastInvoiceNumber),
+        invoiceNumber: incrementInvoiceNumber(settings?.invoice.lastInvoiceNumber),
         status: 'draft',
-        issueDate,
-        dueDate,
-        items: items.filter((item) => item.service !== null) as CreateInvoice['items'],
-        subTotal: data.totalAmount - (data.taxes || 0) - (data.discount || 0),
-        month: data.month as Invoice['month'],
-        invoiceFrom: data.invoiceFrom!,
-        invoiceTo: data.invoiceTo!,
+        createDate: Timestamp.fromDate(createDateWithCurrentTime),
+        dueDate: Timestamp.fromDate(new Date(data.dueDate)),
+        items,
       };
 
@@ -208,25 +195,23 @@
       const invoicePdf = <InvoicePDF invoice={writeData as Invoice} currentStatus="pending" />;
       const blob: Blob = await pdf(invoicePdf).toBlob();
-      const storagePath: string = `invoices/${writeData.invoiceTo.name}-${writeData.invoiceNumber}.pdf`;
+      const storagePath: string = `invoices/${writeData.invoiceTo.name}/${id}-${writeData.invoiceNumber}.pdf`;
       await uploadToFirebaseStorage(blob, storagePath);
 
       // write to DB
-      // await firestoreBatch([
-      //   {
-      //     docPath: `${collections.invoice}/${id}`,
-      //     type: 'set',
-      //     data: {
-      //       ...writeData,
-      //       pdfRef: storagePath,
-      //     },
-      //   },
-      //   {
-      //     docPath: `${collections.settings}/${documents.settingsInvoice}`,
-      //     type: 'set',
-      //     data: { lastInvoiceNumber: writeData.invoiceNumber },
-      //   },
-      // ]);
-
-      await createInvoice({ ...writeData, pdfRef: storagePath });
+      await firestoreBatch([
+        {
+          docPath: `${collections.invoice}/${id}`,
+          type: 'set',
+          data: {
+            ...writeData,
+            pdfRef: storagePath,
+          },
+        },
+        {
+          docPath: `${collections.settings}/${documents.settingsInvoice}`,
+          type: 'set',
+          data: { lastInvoiceNumber: writeData.invoiceNumber },
+        },
+      ]);
 
       loadingSave.onFalse();
@@ -244,9 +229,4 @@
     try {
       if (currentInvoice) {
-        // Ensure dates are valid Date objects
-        const issueDate =
-          data.issueDate instanceof Date ? data.issueDate : new Date(data.issueDate);
-        const dueDate = data.dueDate instanceof Date ? data.dueDate : new Date(data.dueDate);
-
         // attach serivce details
         const items = data.items.map((item) => ({
@@ -258,9 +238,7 @@
         const writeData = {
           ...data,
-          issueDate,
-          dueDate,
+          createDate: Timestamp.fromDate(new Date(data.createDate)),
+          dueDate: Timestamp.fromDate(new Date(data.dueDate)),
           items,
-          invoiceFrom: data.invoiceFrom!,
-          invoiceTo: data.invoiceTo!,
         };
 
@@ -268,50 +246,18 @@
         const invoicePdf = <InvoicePDF invoice={writeData as Invoice} currentStatus="pending" />;
         const blob: Blob = await pdf(invoicePdf).toBlob();
-        const storagePath: string = `invoices/${data.invoiceTo.name}-${data.invoiceNumber}.pdf`;
+        const storagePath: string = `invoices/${data.invoiceTo.name}/${currentInvoice.id}-${data.invoiceNumber}.pdf`;
         await uploadToFirebaseStorage(blob, storagePath);
 
         // update DB
-        // await updateDocument(collections.invoice, currentInvoice.id, {
-        //   ...writeData,
-        //   pdfRef: storagePath,
-        // });
-
-        await updateInvoice(currentInvoice.id, {
+        await updateDocument(collections.invoice, currentInvoice.id, {
           ...writeData,
           pdfRef: storagePath,
-          status: data.status as 'draft' | 'processing' | 'pending' | 'overdue' | 'paid',
-          month: data.month as
-            | 'January'
-            | 'February'
-            | 'March'
-            | 'April'
-            | 'May'
-            | 'June'
-            | 'July'
-            | 'August'
-            | 'September'
-            | 'October'
-            | 'November'
-            | 'December',
-          items: items.filter((item) => item.service !== null) as {
-            service: { id: string; month: number; name: string; sprint: number; hour: number };
-            title: string;
-            price: number;
-            total: number;
-            quantity: number;
-            description: string;
-          }[],
         });
 
         // mutate current data
-        // mutate([collections.invoice, currentInvoice.id]);
+        mutate([collections.invoice, currentInvoice.id]);
       } else {
         // generate collection id
         const id = generateId(collections.invoice);
-
-        // Ensure dates are valid Date objects
-        const issueDate =
-          data.issueDate instanceof Date ? data.issueDate : new Date(data.issueDate);
-        const dueDate = data.dueDate instanceof Date ? data.dueDate : new Date(data.dueDate);
 
         // attach serivce details
@@ -324,9 +270,7 @@
         const writeData = {
           ...data,
-          issueDate,
-          dueDate,
+          createDate: Timestamp.fromDate(new Date(data.createDate)),
+          dueDate: Timestamp.fromDate(new Date(data.dueDate)),
           items,
-          invoiceFrom: data.invoiceFrom!,
-          invoiceTo: data.invoiceTo!,
         };
 
@@ -334,24 +278,23 @@
         const invoicePdf = <InvoicePDF invoice={writeData as Invoice} currentStatus="pending" />;
         const blob: Blob = await pdf(invoicePdf).toBlob();
-        const storagePath: string = `invoices/${data.invoiceTo.name}-${data.invoiceNumber}.pdf`;
+        const storagePath: string = `invoices/${data.invoiceTo.name}/${id}-${data.invoiceNumber}.pdf`;
         await uploadToFirebaseStorage(blob, storagePath);
 
         // write to DB
-        // await firestoreBatch([
-        //   {
-        //     docPath: `${collections.invoice}/${id}`,
-        //     type: 'set',
-        //     data: {
-        //       ...writeData,
-        //       pdfRef: storagePath,
-        //     },
-        //   },
-        //   {
-        //     docPath: `${collections.settings}/${documents.settingsInvoice}`,
-        //     type: 'set',
-        //     data: { lastInvoiceNumber: writeData.invoiceNumber },
-        //   },
-        // ]);
-        await createInvoice({ ...writeData, pdfRef: storagePath });
+        await firestoreBatch([
+          {
+            docPath: `${collections.invoice}/${id}`,
+            type: 'set',
+            data: {
+              ...writeData,
+              pdfRef: storagePath,
+            },
+          },
+          {
+            docPath: `${collections.settings}/${documents.settingsInvoice}`,
+            type: 'set',
+            data: { lastInvoiceNumber: writeData.invoiceNumber },
+          },
+        ]);
 
         reset();
@@ -371,5 +314,5 @@
     <FormProvider methods={methods}>
       <Card>
-        {!!tenant && <InvoiceNewEditAddress />}
+        {settings?.company && <InvoiceNewEditAddress />}
 
         <InvoiceNewEditStatusDate isCopy={isCopy} />
Index: src/sections/invoice/invoice-new-edit-status-date.tsx
===================================================================
--- src/sections/invoice/invoice-new-edit-status-date.tsx	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ src/sections/invoice/invoice-new-edit-status-date.tsx	(revision 5d6f37a75130aab7d9a67b5b430603eff2c0ca6e)
@@ -7,5 +7,5 @@
 import { RHFSelect, RHFTextField } from 'src/components/hook-form';
 // api
-// import { useGetTenant } from 'src/api/settings';
+import { useGetSettings } from 'src/api/settings';
 // utils
 import { incrementInvoiceNumber } from 'src/utils/increment-invoice-number';
@@ -33,5 +33,5 @@
   const values = watch();
 
-  // const { settings } = useGetTenant();
+  const { settings } = useGetSettings();
 
   return (
@@ -109,5 +109,5 @@
 
       <Controller
-        name="issueDate"
+        name="createDate"
         control={control}
         render={({ field, fieldState: { error } }) => (
Index: src/sections/invoice/invoice-pdf.tsx
===================================================================
--- src/sections/invoice/invoice-pdf.tsx	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ src/sections/invoice/invoice-pdf.tsx	(revision 5d6f37a75130aab7d9a67b5b430603eff2c0ca6e)
@@ -1,3 +1,3 @@
-import { Invoice } from 'src/schemas';
+import { Invoice } from 'mvpmasters-shared';
 import InvoiceEEPDF from './invoice-ee-pdf';
 import InvoiceMKPDF from './invoice-mk-pdf';
Index: src/sections/invoice/invoice-table-filters-result.tsx
===================================================================
--- src/sections/invoice/invoice-table-filters-result.tsx	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ src/sections/invoice/invoice-table-filters-result.tsx	(revision 5d6f37a75130aab7d9a67b5b430603eff2c0ca6e)
@@ -6,5 +6,5 @@
 import Stack, { StackProps } from '@mui/material/Stack';
 // types
-import { InvoiceTableFilters, InvoiceTableFilterValue } from 'src/schemas';
+import { InvoiceTableFilters, InvoiceTableFilterValue } from 'mvpmasters-shared';
 // components
 import Iconify from 'src/components/iconify';
Index: src/sections/invoice/invoice-table-row.tsx
===================================================================
--- src/sections/invoice/invoice-table-row.tsx	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ src/sections/invoice/invoice-table-row.tsx	(revision 5d6f37a75130aab7d9a67b5b430603eff2c0ca6e)
@@ -16,5 +16,5 @@
 import { fNumber } from 'src/utils/format-number';
 // types
-import { Invoice } from 'src/schemas';
+import { Invoice } from 'mvpmasters-shared';
 // components
 import Label from 'src/components/label';
@@ -51,5 +51,5 @@
     sent,
     invoiceNumber,
-    issueDate,
+    createDate,
     dueDate,
     status,
@@ -59,6 +59,4 @@
     month,
   } = row;
-
-  console.log(issueDate);
 
   const confirmSend = useBoolean();
@@ -107,6 +105,6 @@
         <TableCell>
           <ListItemText
-            primary={format(new Date(issueDate), 'dd MMM yyyy')}
-            secondary={format(new Date(issueDate), 'p')}
+            primary={format(createDate.toDate(), 'dd MMM yyyy')}
+            secondary={format(createDate.toDate(), 'p')}
             primaryTypographyProps={{ typography: 'body2', noWrap: true }}
             secondaryTypographyProps={{
@@ -120,6 +118,6 @@
         <TableCell>
           <ListItemText
-            primary={format(new Date(dueDate), 'dd MMM yyyy')}
-            secondary={format(new Date(dueDate), 'p')}
+            primary={format(dueDate.toDate(), 'dd MMM yyyy')}
+            secondary={format(dueDate.toDate(), 'p')}
             primaryTypographyProps={{ typography: 'body2', noWrap: true }}
             secondaryTypographyProps={{
Index: src/sections/invoice/invoice-table-toolbar.tsx
===================================================================
--- src/sections/invoice/invoice-table-toolbar.tsx	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ src/sections/invoice/invoice-table-toolbar.tsx	(revision 5d6f37a75130aab7d9a67b5b430603eff2c0ca6e)
@@ -7,5 +7,5 @@
 import InputAdornment from '@mui/material/InputAdornment';
 // types
-import { InvoiceTableFilters, InvoiceTableFilterValue } from 'src/schemas';
+import { InvoiceTableFilters, InvoiceTableFilterValue } from 'mvpmasters-shared';
 // components
 import Iconify from 'src/components/iconify';
Index: src/sections/invoice/invoice-toolbar.tsx
===================================================================
--- src/sections/invoice/invoice-toolbar.tsx	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ src/sections/invoice/invoice-toolbar.tsx	(revision 5d6f37a75130aab7d9a67b5b430603eff2c0ca6e)
@@ -18,5 +18,5 @@
 import { useBoolean } from 'src/hooks/use-boolean';
 // types
-import { Invoice } from 'src/schemas';
+import { Invoice } from 'mvpmasters-shared';
 // components
 import Iconify from 'src/components/iconify';
Index: src/sections/invoice/mail-compose.tsx
===================================================================
--- src/sections/invoice/mail-compose.tsx	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ src/sections/invoice/mail-compose.tsx	(revision 5d6f37a75130aab7d9a67b5b430603eff2c0ca6e)
@@ -13,5 +13,5 @@
 import Iconify from 'src/components/iconify';
 import Editor from 'src/components/editor';
-import { Invoice } from 'src/schemas';
+import { Invoice } from 'mvpmasters-shared';
 import FormProvider from 'src/components/hook-form/form-provider';
 import { RHFTextField } from 'src/components/hook-form';
Index: src/sections/invoice/view/invoice-edit-view.tsx
===================================================================
--- src/sections/invoice/view/invoice-edit-view.tsx	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ src/sections/invoice/view/invoice-edit-view.tsx	(revision 5d6f37a75130aab7d9a67b5b430603eff2c0ca6e)
@@ -23,5 +23,4 @@
 
   const { currentInvoice } = useGetInvoice({ id });
-  console.log('currentInvoice', currentInvoice);
 
   return (
Index: src/sections/invoice/view/invoice-list-view.tsx
===================================================================
--- src/sections/invoice/view/invoice-list-view.tsx	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ src/sections/invoice/view/invoice-list-view.tsx	(revision 5d6f37a75130aab7d9a67b5b430603eff2c0ca6e)
@@ -36,9 +36,14 @@
 } from 'src/components/table';
 // types
-import { Invoice, InvoiceStatus, InvoiceTableFilters, InvoiceTableFilterValue } from 'src/schemas';
+import {
+  Invoice,
+  InvoiceStatus,
+  InvoiceTableFilters,
+  InvoiceTableFilterValue,
+} from 'mvpmasters-shared';
 //
 import deleteFromFirebaseStorage from 'src/utils/delete-from-firebase-storage';
 // fetch
-import { useDeleteInvoice, useGetInvoices } from 'src/api/invoice';
+import { useGetInvoices } from 'src/api/invoice';
 import { collections, removeDocument } from 'src/lib/firestore';
 import { mutate } from 'swr';
@@ -49,6 +54,4 @@
 import InvoiceTableToolbar from '../invoice-table-toolbar';
 import MailCompose from '../mail-compose';
-import { useFetchAnalytics } from 'src/api/invoice/use-fetch-analytics';
-import { endpoints } from 'src/utils/axios';
 
 // ----------------------------------------------------------------------
@@ -59,5 +62,5 @@
   { id: 'currency', label: 'Currency' },
   { id: 'invoicePeriod', label: 'Invoice Period' },
-  { id: 'issueDate', label: 'Create' },
+  { id: 'createDate', label: 'Create' },
   { id: 'dueDate', label: 'Due' },
   { id: 'sent', label: 'Sent', align: 'center' },
@@ -152,5 +155,5 @@
 
   const table = useTable({
-    defaultOrderBy: 'issueDate',
+    defaultOrderBy: 'createDate',
     defaultOrder: 'desc',
     defaultDense: true,
@@ -160,5 +163,9 @@
   const [filters, setFilters] = useState(defaultFilters);
 
-  const { invoices: tableData } = useGetInvoices({ startDate: filters.startDate?.toISOString() });
+  const { invoices: tableData } = useGetInvoices({
+    where: [['createDate', '>=', filters.startDate]],
+    orderBy: 'createDate',
+    direction: 'desc',
+  });
 
   const invoiceMutationKey = useMemo(
@@ -166,6 +173,6 @@
       collections.invoice,
       JSON.stringify({
-        where: [['issueDate', '>=', filters.startDate]],
-        orderBy: 'issueDate',
+        where: [['createDate', '>=', filters.startDate]],
+        orderBy: 'createDate',
         direction: 'desc',
       }),
@@ -210,21 +217,13 @@
   //   );
 
-  const {
-    analytics: analyticsData,
-    isAnalyticsLoading,
-    analyticsError,
-  } = useFetchAnalytics(filters.startDate);
-
   useEffect(() => {
-    if (analyticsData) {
-      setAnalytics(analyticsData);
+    if (tableData) {
+      const getAnalytics = async () => {
+        const analyticsStats = await getTotalAmountForAllStatuses(tableData);
+        setAnalytics(analyticsStats);
+      };
+      getAnalytics();
     }
-  }, [analyticsData]);
-
-  useEffect(() => {
-    if (analyticsError) {
-      console.error('Failed to load analytics:', analyticsError);
-    }
-  }, [analyticsError]);
+  }, [tableData]);
 
   const getPercentByStatus = (status: string) =>
@@ -270,20 +269,26 @@
   );
 
-  const { deleteInvoiceMutation } = useDeleteInvoice();
-
   const handleDeleteRow = useCallback(
     async (invoice: Invoice) => {
       const serializedParams = JSON.stringify({
-        where: [['issueDate', '>=', filters.startDate]],
-        orderBy: 'issueDate',
+        where: [['createDate', '>=', filters.startDate]],
+        orderBy: 'createDate',
         direction: 'desc',
-      });
-
-      await deleteInvoiceMutation(invoice.id);
+      }); // Get the same params as used in useGetInvoices
+
+      // Optimistically update the cache before the deletion
+      // mutate(
+      //   [collections.invoice, serializedParams],
+      //   (invoices: Invoice[] = []) => invoices.filter((row) => row.id !== invoice.id),
+      //   false
+      // );
+
+      await removeDocument(collections.invoice, invoice.id);
       await deleteFromFirebaseStorage(
-        `invoices/${invoice.invoiceTo.name}-${invoice.invoiceNumber}.pdf`
+        `invoices/${invoice.invoiceTo.name}/${invoice.id}-${invoice.invoiceNumber}.pdf`
       );
 
-      mutate(endpoints.invoice);
+      // Optionally, rollback optimistic update or refetch data
+      mutate(invoiceMutationKey);
     },
     [filters.startDate, invoiceMutationKey]
@@ -342,8 +347,4 @@
     setFilters(defaultFilters);
   }, []);
-
-  if (isAnalyticsLoading) {
-    // Show loading state
-  }
 
   return (
@@ -671,6 +672,6 @@
       inputData = inputData.filter(
         (invoice) =>
-          fTimestamp(invoice.issueDate.getTime()) >= fTimestamp(startDate.getTime()) &&
-          fTimestamp(invoice.issueDate.getTime()) <= fTimestamp(endDate.getTime())
+          fTimestamp(invoice.createDate.toMillis()) >= fTimestamp(startDate) &&
+          fTimestamp(invoice.createDate.toMillis()) <= fTimestamp(endDate)
       );
     }
Index: src/sections/user/customer-new-edit-form.tsx
===================================================================
--- src/sections/user/customer-new-edit-form.tsx	(revision 5d6f37a75130aab7d9a67b5b430603eff2c0ca6e)
+++ src/sections/user/customer-new-edit-form.tsx	(revision 5d6f37a75130aab7d9a67b5b430603eff2c0ca6e)
@@ -0,0 +1,256 @@
+import * as Yup from 'yup';
+import { useCallback, useMemo } from 'react';
+import { useForm, Controller } from 'react-hook-form';
+import { zodResolver } from '@hookform/resolvers/zod';
+// @mui
+import LoadingButton from '@mui/lab/LoadingButton';
+import Box from '@mui/material/Box';
+import Card from '@mui/material/Card';
+import Stack from '@mui/material/Stack';
+import Switch from '@mui/material/Switch';
+import Grid from '@mui/material/Unstable_Grid2';
+import Typography from '@mui/material/Typography';
+import FormControlLabel from '@mui/material/FormControlLabel';
+// utils
+import { fData } from 'src/utils/format-number';
+// routes
+import { paths } from 'src/routes/paths';
+import { useRouter } from 'src/routes/hooks';
+// types
+import { Customer, NewCustomer, newCustomerSchema } from 'mvpmasters-shared';
+// components
+import Label from 'src/components/label';
+import { useSnackbar } from 'src/components/snackbar';
+import FormProvider, { RHFTextField, RHFUploadAvatar } from 'src/components/hook-form';
+import uploadToFirebaseStorage from 'src/utils/upload-to-firebase-storage';
+import { addDoc, collection } from 'firebase/firestore';
+import { db } from 'src/lib/firebase';
+import { createCustomer } from 'src/api/customer';
+
+// ----------------------------------------------------------------------
+
+type Props = {
+  currentUser?: Customer;
+};
+
+export default function CustomerNewEditForm({ currentUser: currentCustomer }: Props) {
+  const router = useRouter();
+
+  const { enqueueSnackbar } = useSnackbar();
+
+  const defaultValues: NewCustomer = useMemo(
+    () => ({
+      name: currentCustomer?.name || '',
+      representative: currentCustomer?.representative || '',
+      email: currentCustomer?.email || '',
+      logoUrl: currentCustomer?.logoUrl || null,
+      address: currentCustomer?.address || {
+        country: '',
+        state: '',
+        street: '',
+        zip: '',
+        city: '',
+      },
+      vatNumber: currentCustomer?.vatNumber || '',
+      companyId: currentCustomer?.companyId || '',
+      companyNumber: currentCustomer?.companyNumber || '',
+      id: currentCustomer?.id || '',
+      phoneNumber: currentCustomer?.phoneNumber || '',
+      status: 'active',
+    }),
+    [currentCustomer]
+  );
+
+  const methods = useForm({
+    resolver: zodResolver(newCustomerSchema),
+    defaultValues,
+  });
+
+  const {
+    reset,
+    watch,
+    control,
+    setValue,
+    handleSubmit,
+    formState: { isSubmitting },
+  } = methods;
+
+  const values = watch();
+
+  const onSubmit = handleSubmit(async (data) => {
+    try {
+      // await new Promise((resolve) => setTimeout(resolve, 500));
+      const logoFile = data.logoUrl as File & { preview: string };
+
+      const storagePath: string = `customers/${logoFile.name}`;
+      const logoUrl = await uploadToFirebaseStorage(logoFile, storagePath);
+
+      // const customersRef = collection(db, 'customers');
+      // await addDoc(customersRef, { ...data, logoUrl });
+      await createCustomer({ ...data, logoUrl });
+
+      reset();
+      enqueueSnackbar(currentCustomer ? 'Update success!' : 'Create success!');
+      router.push(paths.dashboard.customer.list);
+      console.info('DATA', data);
+    } catch (error) {
+      console.error(error);
+    }
+  });
+
+  const handleDrop = useCallback(
+    (acceptedFiles: File[]) => {
+      const file = acceptedFiles[0];
+
+      const newFile = Object.assign(file, {
+        preview: URL.createObjectURL(file),
+      });
+
+      if (file) {
+        setValue('logoUrl', newFile, { shouldValidate: true });
+      }
+    },
+    [setValue]
+  );
+
+  return (
+    <FormProvider methods={methods} onSubmit={onSubmit}>
+      <Grid container spacing={3}>
+        <Grid xs={12} md={4}>
+          <Card sx={{ pt: 10, pb: 5, px: 3 }}>
+            {currentCustomer && (
+              <Label
+                color={
+                  (values.status === 'active' && 'success') ||
+                  (values.status === 'banned' && 'error') ||
+                  'warning'
+                }
+                sx={{ position: 'absolute', top: 24, right: 24 }}
+              >
+                {values.status}
+              </Label>
+            )}
+
+            <Box sx={{ mb: 5 }}>
+              <RHFUploadAvatar
+                name="logoUrl"
+                maxSize={3145728}
+                onDrop={handleDrop}
+                helperText={
+                  <Typography
+                    variant="caption"
+                    sx={{
+                      mt: 3,
+                      mx: 'auto',
+                      display: 'block',
+                      textAlign: 'center',
+                      color: 'text.disabled',
+                    }}
+                  >
+                    Allowed *.jpeg, *.jpg, *.png, *.gif
+                    <br /> max size of {fData(3145728)}
+                  </Typography>
+                }
+              />
+            </Box>
+
+            {currentCustomer && (
+              <FormControlLabel
+                labelPlacement="start"
+                control={
+                  <Controller
+                    name="status"
+                    control={control}
+                    render={({ field }) => (
+                      <Switch
+                        {...field}
+                        checked={field.value !== 'active'}
+                        onChange={(event) =>
+                          field.onChange(event.target.checked ? 'banned' : 'active')
+                        }
+                      />
+                    )}
+                  />
+                }
+                label={
+                  <>
+                    <Typography variant="subtitle2" sx={{ mb: 0.5 }}>
+                      Banned
+                    </Typography>
+                    <Typography variant="body2" sx={{ color: 'text.secondary' }}>
+                      Apply disable account
+                    </Typography>
+                  </>
+                }
+                sx={{ mx: 0, mb: 3, width: 1, justifyContent: 'space-between' }}
+              />
+            )}
+          </Card>
+        </Grid>
+
+        <Grid xs={12} md={8}>
+          <Card sx={{ p: 3 }}>
+            <Box
+              rowGap={3}
+              columnGap={2}
+              display="grid"
+              gridTemplateColumns={{
+                xs: 'repeat(1, 1fr)',
+                sm: 'repeat(2, 1fr)',
+              }}
+            >
+              <RHFTextField name="name" label="Name" />
+              <RHFTextField name="email" label="Email Address" />
+              <RHFTextField name="representative" label="Representative" />
+              <RHFTextField name="phoneNumber" label="Phone Number" />
+
+              <RHFTextField name="address.country" label="Country" />
+
+              {/* <RHFAutocomplete
+                name="address.country"
+                label="Country"
+                options={countries.map((country) => country.label)}
+                getOptionLabel={(option) => option}
+                isOptionEqualToValue={(option, value) => option === value}
+                renderOption={(props, option) => {
+                  const { code, label, phone } = countries.filter(
+                    (country) => country.label === option
+                  )[0];
+
+                  if (!label) {
+                    return null;
+                  }
+
+                  return (
+                    <li {...props} key={label}>
+                      <Iconify
+                        key={label}
+                        icon={`circle-flags:${code.toLowerCase()}`}
+                        width={28}
+                        sx={{ mr: 1 }}
+                      />
+                      {label} ({code}) +{phone}
+                    </li>
+                  );
+                }}
+              /> */}
+
+              <RHFTextField name="address.state" label="State/Region" />
+              <RHFTextField name="address.city" label="City" />
+              <RHFTextField name="address.street" label="Street" />
+              <RHFTextField name="address.zip" label="Zip/Code" />
+              <RHFTextField name="vatNumber" label="VAT" />
+              <RHFTextField name="companyNumber" label="Company Number" />
+            </Box>
+
+            <Stack alignItems="flex-end" sx={{ mt: 3 }}>
+              <LoadingButton type="submit" variant="contained" loading={isSubmitting}>
+                {!currentCustomer ? 'Create Customer' : 'Save Changes'}
+              </LoadingButton>
+            </Stack>
+          </Card>
+        </Grid>
+      </Grid>
+    </FormProvider>
+  );
+}
Index: src/sections/user/customer-quick-edit-form.tsx
===================================================================
--- src/sections/user/customer-quick-edit-form.tsx	(revision 5d6f37a75130aab7d9a67b5b430603eff2c0ca6e)
+++ src/sections/user/customer-quick-edit-form.tsx	(revision 5d6f37a75130aab7d9a67b5b430603eff2c0ca6e)
@@ -0,0 +1,193 @@
+import * as Yup from 'yup';
+import { useMemo } from 'react';
+import { useForm } from 'react-hook-form';
+import { zodResolver } from '@hookform/resolvers/zod';
+// @mui
+import LoadingButton from '@mui/lab/LoadingButton';
+import Box from '@mui/material/Box';
+import Alert from '@mui/material/Alert';
+import Button from '@mui/material/Button';
+import Dialog from '@mui/material/Dialog';
+import MenuItem from '@mui/material/MenuItem';
+import DialogTitle from '@mui/material/DialogTitle';
+import DialogActions from '@mui/material/DialogActions';
+import DialogContent from '@mui/material/DialogContent';
+// types
+import { Customer, customerSchema } from 'mvpmasters-shared';
+// assets
+import { countries } from 'src/assets/data';
+// components
+import Iconify from 'src/components/iconify';
+import { useSnackbar } from 'src/components/snackbar';
+import FormProvider, { RHFSelect, RHFTextField, RHFAutocomplete } from 'src/components/hook-form';
+import { doc, setDoc } from 'firebase/firestore';
+import { db } from 'src/lib/firebase';
+import { mutate } from 'swr';
+import { collections } from 'src/lib/firestore';
+
+// ----------------------------------------------------------------------
+
+export const USER_STATUS_OPTIONS = [
+  { value: 'active', label: 'Active' },
+  { value: 'banned', label: 'Banned' },
+  { value: 'inactive', label: 'Inactive' },
+];
+
+type Props = {
+  open: boolean;
+  onClose: VoidFunction;
+  currentCustomer?: Customer;
+};
+
+export default function CustomerQuickEditForm({ currentCustomer, open, onClose }: Props) {
+  const { enqueueSnackbar } = useSnackbar();
+
+  // @ts-ignore
+  const defaultValues: Customer = useMemo(
+    () => ({
+      name: currentCustomer?.name || '',
+      representative: currentCustomer?.representative || '',
+      email: currentCustomer?.email || '',
+      logoUrl: currentCustomer?.logoUrl || '',
+      address: {
+        country: currentCustomer?.address?.country || '',
+        state: currentCustomer?.address?.state || '',
+        street: currentCustomer?.address?.street || '',
+        zip: currentCustomer?.address?.zip || '',
+        city: currentCustomer?.address?.city || '',
+      },
+      vatNumber: currentCustomer?.vatNumber || '',
+      companyId: currentCustomer?.companyId || '',
+      companyNumber: currentCustomer?.companyNumber || '',
+      id: currentCustomer?.id || '',
+      phoneNumber: currentCustomer?.phoneNumber || '',
+      status: currentCustomer?.status || '',
+    }),
+    [currentCustomer]
+  );
+
+  const methods = useForm({
+    resolver: zodResolver(customerSchema),
+    defaultValues,
+  });
+
+  const {
+    reset,
+    handleSubmit,
+    formState: { isSubmitting },
+  } = methods;
+
+  const onSubmit = handleSubmit(async (data) => {
+    try {
+      if (!currentCustomer) return;
+      // await new Promise((resolve) => setTimeout(resolve, 500));
+
+      const docRef = doc(db, 'customers', currentCustomer.id!);
+      await setDoc(docRef, data, { merge: true });
+      mutate(collections.customer);
+
+      reset();
+      onClose();
+      enqueueSnackbar('Update success!');
+      console.info('DATA', data);
+    } catch (error) {
+      console.error(error);
+    }
+  });
+
+  return (
+    <Dialog
+      fullWidth
+      maxWidth={false}
+      open={open}
+      onClose={onClose}
+      PaperProps={{
+        sx: { maxWidth: 720 },
+      }}
+    >
+      <FormProvider methods={methods} onSubmit={onSubmit}>
+        <DialogTitle>Quick Update</DialogTitle>
+
+        <DialogContent>
+          {/* <Alert variant="outlined" severity="info" sx={{ mb: 3 }}>
+            Account is waiting for confirmation
+          </Alert> */}
+
+          <Box
+            rowGap={3}
+            columnGap={2}
+            display="grid"
+            sx={{ mt: 3 }}
+            gridTemplateColumns={{
+              xs: 'repeat(1, 1fr)',
+              sm: 'repeat(2, 1fr)',
+            }}
+          >
+            <RHFSelect name="status" label="Status">
+              <MenuItem key="none" value="" />
+              {USER_STATUS_OPTIONS.map((status) => (
+                <MenuItem key={status.value} value={status.value}>
+                  {status.label}
+                </MenuItem>
+              ))}
+            </RHFSelect>
+
+            <Box sx={{ display: { xs: 'none', sm: 'block' } }} />
+
+            <RHFTextField name="name" label="Name" />
+            <RHFTextField name="representative" label="Representative" />
+            <RHFTextField name="email" label="Email Address" />
+            <RHFTextField name="phoneNumber" label="Phone Number" />
+
+            <RHFTextField name="address.country" label="Country" />
+
+            {/* <RHFAutocomplete
+              name="address.country"
+              label="Country"
+              options={countries.map((country) => country.code)}
+              getOptionLabel={(option) => option}
+              renderOption={(props, option) => {
+                const { code, label, phone } = countries.filter(
+                  (country) => country.label === option
+                )[0];
+
+                if (!label) {
+                  return null;
+                }
+
+                return (
+                  <li {...props} key={label}>
+                    <Iconify
+                      key={label}
+                      icon={`circle-flags:${code.toLowerCase()}`}
+                      width={28}
+                      sx={{ mr: 1 }}
+                    />
+                    {label} ({code}) +{phone}
+                  </li>
+                );
+              }}
+            /> */}
+
+            <RHFTextField name="address.state" label="State/Region" />
+            <RHFTextField name="address.city" label="City" />
+            <RHFTextField name="address.street" label="Street" />
+            <RHFTextField name="address.zip" label="Zip/Code" />
+            <RHFTextField name="vatNumber" label="VAT" />
+            <RHFTextField name="companyNumber" label="Company Number" />
+          </Box>
+        </DialogContent>
+
+        <DialogActions>
+          <Button variant="outlined" onClick={onClose}>
+            Cancel
+          </Button>
+
+          <LoadingButton type="submit" variant="contained" loading={isSubmitting}>
+            Update
+          </LoadingButton>
+        </DialogActions>
+      </FormProvider>
+    </Dialog>
+  );
+}
Index: src/sections/user/customer-table-filters-result.tsx
===================================================================
--- src/sections/user/customer-table-filters-result.tsx	(revision 5d6f37a75130aab7d9a67b5b430603eff2c0ca6e)
+++ src/sections/user/customer-table-filters-result.tsx	(revision 5d6f37a75130aab7d9a67b5b430603eff2c0ca6e)
@@ -0,0 +1,109 @@
+// @mui
+import Box from '@mui/material/Box';
+import Chip from '@mui/material/Chip';
+import Paper from '@mui/material/Paper';
+import Button from '@mui/material/Button';
+import Stack, { StackProps } from '@mui/material/Stack';
+// types
+
+// components
+import Iconify from 'src/components/iconify';
+import { CustomerTableFilterValue, CustomerTableFilters } from 'mvpmasters-shared';
+
+// ----------------------------------------------------------------------
+
+type Props = StackProps & {
+  filters: CustomerTableFilters;
+  onFilters: (name: string, value: CustomerTableFilterValue) => void;
+  //
+  onResetFilters: VoidFunction;
+  //
+  results: number;
+};
+
+export default function CustomerTableFiltersResult({
+  filters,
+  onFilters,
+  //
+  onResetFilters,
+  //
+  results,
+  ...other
+}: Props) {
+  const handleRemoveStatus = () => {
+    onFilters('status', 'all');
+  };
+
+  const handleRemoveRole = (inputValue: string) => {
+    const newValue = filters.role.filter((item) => item !== inputValue);
+    onFilters('role', newValue);
+  };
+
+  return (
+    <Stack spacing={1.5} {...other}>
+      <Box sx={{ typography: 'body2' }}>
+        <strong>{results}</strong>
+        <Box component="span" sx={{ color: 'text.secondary', ml: 0.25 }}>
+          results found
+        </Box>
+      </Box>
+
+      <Stack flexGrow={1} spacing={1} direction="row" flexWrap="wrap" alignItems="center">
+        {filters.status !== 'all' && (
+          <Block label="Status:">
+            <Chip size="small" label={filters.status} onDelete={handleRemoveStatus} />
+          </Block>
+        )}
+
+        {!!filters.role.length && (
+          <Block label="Role:">
+            {filters.role.map((item) => (
+              <Chip key={item} label={item} size="small" onDelete={() => handleRemoveRole(item)} />
+            ))}
+          </Block>
+        )}
+
+        <Button
+          color="error"
+          onClick={onResetFilters}
+          startIcon={<Iconify icon="solar:trash-bin-trash-bold" />}
+        >
+          Clear
+        </Button>
+      </Stack>
+    </Stack>
+  );
+}
+
+// ----------------------------------------------------------------------
+
+type BlockProps = StackProps & {
+  label: string;
+};
+
+function Block({ label, children, sx, ...other }: BlockProps) {
+  return (
+    <Stack
+      component={Paper}
+      variant="outlined"
+      spacing={1}
+      direction="row"
+      sx={{
+        p: 1,
+        borderRadius: 1,
+        overflow: 'hidden',
+        borderStyle: 'dashed',
+        ...sx,
+      }}
+      {...other}
+    >
+      <Box component="span" sx={{ typography: 'subtitle2' }}>
+        {label}
+      </Box>
+
+      <Stack spacing={1} direction="row" flexWrap="wrap">
+        {children}
+      </Stack>
+    </Stack>
+  );
+}
Index: src/sections/user/customer-table-row.tsx
===================================================================
--- src/sections/user/customer-table-row.tsx	(revision 5d6f37a75130aab7d9a67b5b430603eff2c0ca6e)
+++ src/sections/user/customer-table-row.tsx	(revision 5d6f37a75130aab7d9a67b5b430603eff2c0ca6e)
@@ -0,0 +1,103 @@
+// @mui
+import Avatar from '@mui/material/Avatar';
+import Tooltip from '@mui/material/Tooltip';
+import MenuItem from '@mui/material/MenuItem';
+import TableRow from '@mui/material/TableRow';
+import TableCell from '@mui/material/TableCell';
+import IconButton from '@mui/material/IconButton';
+// hooks
+import { useBoolean } from 'src/hooks/use-boolean';
+// types
+import { Customer } from 'mvpmasters-shared';
+// components
+import Label from 'src/components/label';
+import Iconify from 'src/components/iconify';
+import CustomPopover, { usePopover } from 'src/components/custom-popover';
+//
+import CustomerQuickEditForm from './customer-quick-edit-form';
+
+// ----------------------------------------------------------------------
+
+type Props = {
+  selected: boolean;
+  onEditRow: VoidFunction;
+  row: Customer;
+};
+
+export default function CustomerTableRow({ row, selected, onEditRow }: Props) {
+  const { name, logoUrl, representative, status, email, phoneNumber } = row;
+
+  // const confirm = useBoolean();
+
+  const quickEdit = useBoolean();
+
+  // const popover = usePopover();
+
+  return (
+    <>
+      <TableRow hover selected={selected}>
+        {/* <TableCell padding="checkbox">
+          <Checkbox checked={selected} onClick={onSelectRow} />
+        </TableCell> */}
+
+        <TableCell sx={{ display: 'flex', alignItems: 'center' }}>
+          <Avatar alt={name} src={logoUrl} sx={{ mr: 2 }} />
+          <span>{name}</span>
+        </TableCell>
+
+        <TableCell sx={{ whiteSpace: 'nowrap' }}>{representative}</TableCell>
+
+        <TableCell sx={{ whiteSpace: 'nowrap' }}>{email}</TableCell>
+
+        <TableCell>
+          <Label
+            variant="soft"
+            color={
+              (status === 'active' && 'success') ||
+              (status === 'inactive' && 'warning') ||
+              (status === 'banned' && 'error') ||
+              'default'
+            }
+          >
+            {status}
+          </Label>
+        </TableCell>
+
+        <TableCell align="right" sx={{ px: 1, whiteSpace: 'nowrap' }}>
+          <Tooltip title="Quick Edit" placement="top" arrow>
+            <IconButton color={quickEdit.value ? 'inherit' : 'default'} onClick={quickEdit.onTrue}>
+              <Iconify icon="solar:pen-bold" />
+            </IconButton>
+          </Tooltip>
+          {/* 
+          <IconButton color={popover.open ? 'inherit' : 'default'} onClick={popover.onOpen}>
+            <Iconify icon="eva:more-vertical-fill" />
+          </IconButton> */}
+        </TableCell>
+      </TableRow>
+
+      <CustomerQuickEditForm
+        currentCustomer={row}
+        open={quickEdit.value}
+        onClose={quickEdit.onFalse}
+      />
+
+      {/* <CustomPopover
+        open={popover.open}
+        onClose={popover.onClose}
+        arrow="right-top"
+        sx={{ width: 140 }}
+      >
+        <MenuItem
+          onClick={() => {
+            onEditRow();
+            popover.onClose();
+          }}
+        >
+          <Iconify icon="solar:pen-bold" />
+          Edit
+        </MenuItem>
+      </CustomPopover> */}
+    </>
+  );
+}
Index: src/sections/user/customer-table-toolbar.tsx
===================================================================
--- src/sections/user/customer-table-toolbar.tsx	(revision 5d6f37a75130aab7d9a67b5b430603eff2c0ca6e)
+++ src/sections/user/customer-table-toolbar.tsx	(revision 5d6f37a75130aab7d9a67b5b430603eff2c0ca6e)
@@ -0,0 +1,152 @@
+import { useCallback } from 'react';
+// @mui
+import Stack from '@mui/material/Stack';
+import MenuItem from '@mui/material/MenuItem';
+import Checkbox from '@mui/material/Checkbox';
+import TextField from '@mui/material/TextField';
+import InputLabel from '@mui/material/InputLabel';
+import IconButton from '@mui/material/IconButton';
+import FormControl from '@mui/material/FormControl';
+import OutlinedInput from '@mui/material/OutlinedInput';
+import InputAdornment from '@mui/material/InputAdornment';
+import Select, { SelectChangeEvent } from '@mui/material/Select';
+// types
+import { CustomerTableFilters, CustomerTableFilterValue } from 'mvpmasters-shared';
+// components
+import Iconify from 'src/components/iconify';
+import CustomPopover, { usePopover } from 'src/components/custom-popover';
+
+// ----------------------------------------------------------------------
+
+type Props = {
+  filters: CustomerTableFilters;
+  onFilters: (name: string, value: CustomerTableFilterValue) => void;
+  //
+  roleOptions: string[];
+};
+
+export default function CustomerTableToolbar({
+  filters,
+  onFilters,
+  //
+  roleOptions,
+}: Props) {
+  const popover = usePopover();
+
+  const handleFilterName = useCallback(
+    (event: React.ChangeEvent<HTMLInputElement>) => {
+      onFilters('name', event.target.value);
+    },
+    [onFilters]
+  );
+
+  const handleFilterRole = useCallback(
+    (event: SelectChangeEvent<string[]>) => {
+      onFilters(
+        'role',
+        typeof event.target.value === 'string' ? event.target.value.split(',') : event.target.value
+      );
+    },
+    [onFilters]
+  );
+
+  return (
+    <>
+      <Stack
+        spacing={2}
+        alignItems={{ xs: 'flex-end', md: 'center' }}
+        direction={{
+          xs: 'column',
+          md: 'row',
+        }}
+        sx={{
+          p: 2.5,
+          pr: { xs: 2.5, md: 1 },
+        }}
+      >
+        <FormControl
+          sx={{
+            flexShrink: 0,
+            width: { xs: 1, md: 200 },
+          }}
+        >
+          <InputLabel>Role</InputLabel>
+
+          <Select
+            multiple
+            value={filters.role}
+            onChange={handleFilterRole}
+            input={<OutlinedInput label="Role" />}
+            renderValue={(selected) => selected.map((value) => value).join(', ')}
+            MenuProps={{
+              PaperProps: {
+                sx: { maxHeight: 240 },
+              },
+            }}
+          >
+            {roleOptions.map((option) => (
+              <MenuItem key={option} value={option}>
+                <Checkbox disableRipple size="small" checked={filters.role.includes(option)} />
+                {option}
+              </MenuItem>
+            ))}
+          </Select>
+        </FormControl>
+
+        <Stack direction="row" alignItems="center" spacing={2} flexGrow={1} sx={{ width: 1 }}>
+          <TextField
+            fullWidth
+            value={filters.name}
+            onChange={handleFilterName}
+            placeholder="Search..."
+            InputProps={{
+              startAdornment: (
+                <InputAdornment position="start">
+                  <Iconify icon="eva:search-fill" sx={{ color: 'text.disabled' }} />
+                </InputAdornment>
+              ),
+            }}
+          />
+
+          <IconButton onClick={popover.onOpen}>
+            <Iconify icon="eva:more-vertical-fill" />
+          </IconButton>
+        </Stack>
+      </Stack>
+
+      <CustomPopover
+        open={popover.open}
+        onClose={popover.onClose}
+        arrow="right-top"
+        sx={{ width: 140 }}
+      >
+        <MenuItem
+          onClick={() => {
+            popover.onClose();
+          }}
+        >
+          <Iconify icon="solar:printer-minimalistic-bold" />
+          Print
+        </MenuItem>
+
+        <MenuItem
+          onClick={() => {
+            popover.onClose();
+          }}
+        >
+          <Iconify icon="solar:import-bold" />
+          Import
+        </MenuItem>
+
+        <MenuItem
+          onClick={() => {
+            popover.onClose();
+          }}
+        >
+          <Iconify icon="solar:export-bold" />
+          Export
+        </MenuItem>
+      </CustomPopover>
+    </>
+  );
+}
Index: src/sections/user/view/customer-create-view.tsx
===================================================================
--- src/sections/user/view/customer-create-view.tsx	(revision 5d6f37a75130aab7d9a67b5b430603eff2c0ca6e)
+++ src/sections/user/view/customer-create-view.tsx	(revision 5d6f37a75130aab7d9a67b5b430603eff2c0ca6e)
@@ -0,0 +1,41 @@
+'use client';
+
+// @mui
+import Container from '@mui/material/Container';
+// routes
+import { paths } from 'src/routes/paths';
+// components
+import { useSettingsContext } from 'src/components/settings';
+import CustomBreadcrumbs from 'src/components/custom-breadcrumbs';
+//
+import CustomerNewEditForm from '../customer-new-edit-form';
+
+// ----------------------------------------------------------------------
+
+export default function CustomerCreateView() {
+  const settings = useSettingsContext();
+
+  return (
+    <Container maxWidth={settings.themeStretch ? false : 'lg'}>
+      <CustomBreadcrumbs
+        heading="Create a new customer"
+        links={[
+          {
+            name: 'Dashboard',
+            href: paths.dashboard.root,
+          },
+          {
+            name: 'Customer',
+            href: paths.dashboard.customer.list,
+          },
+          { name: 'New customer' },
+        ]}
+        sx={{
+          mb: { xs: 3, md: 5 },
+        }}
+      />
+
+      <CustomerNewEditForm />
+    </Container>
+  );
+}
Index: src/sections/user/view/customer-list-view.tsx
===================================================================
--- src/sections/user/view/customer-list-view.tsx	(revision 5d6f37a75130aab7d9a67b5b430603eff2c0ca6e)
+++ src/sections/user/view/customer-list-view.tsx	(revision 5d6f37a75130aab7d9a67b5b430603eff2c0ca6e)
@@ -0,0 +1,335 @@
+'use client';
+
+import isEqual from 'lodash/isEqual';
+import { useState, useCallback } from 'react';
+// @mui
+import { alpha } from '@mui/material/styles';
+import Tab from '@mui/material/Tab';
+import Tabs from '@mui/material/Tabs';
+import Card from '@mui/material/Card';
+import Table from '@mui/material/Table';
+import Button from '@mui/material/Button';
+import Container from '@mui/material/Container';
+import TableBody from '@mui/material/TableBody';
+import TableContainer from '@mui/material/TableContainer';
+// routes
+import { paths } from 'src/routes/paths';
+import { RouterLink } from 'src/routes/components';
+// hooks
+import { useBoolean } from 'src/hooks/use-boolean';
+// components
+import Label from 'src/components/label';
+import Iconify from 'src/components/iconify';
+import Scrollbar from 'src/components/scrollbar';
+import { useSettingsContext } from 'src/components/settings';
+import CustomBreadcrumbs from 'src/components/custom-breadcrumbs';
+import {
+  useTable,
+  getComparator,
+  emptyRows,
+  TableNoData,
+  TableEmptyRows,
+  TableHeadCustom,
+  TablePaginationCustom,
+} from 'src/components/table';
+// types
+import { Customer, CustomerTableFilters, CustomerTableFilterValue } from 'mvpmasters-shared';
+//
+import { useGetCustomers } from 'src/api/customer';
+import CustomerTableRow from '../customer-table-row';
+import CustomerTableFiltersResult from '../customer-table-filters-result';
+import { USER_STATUS_OPTIONS } from '../customer-quick-edit-form';
+
+// ----------------------------------------------------------------------
+
+const STATUS_OPTIONS = [{ value: 'all', label: 'All' }, ...USER_STATUS_OPTIONS];
+
+const TABLE_HEAD = [
+  { id: 'name', label: 'Name' },
+  { id: 'representative', label: 'Representative', width: 220 },
+  { id: 'email', label: 'Email' },
+  { id: 'status', label: 'Status', width: 100 },
+  { id: '', width: 88 },
+];
+
+const defaultFilters: CustomerTableFilters = {
+  name: '',
+  role: [],
+  status: 'all',
+};
+
+// ----------------------------------------------------------------------
+
+export default function CustomerListView() {
+  const table = useTable({ defaultDense: true, defaultRowsPerPage: 25 });
+
+  const settings = useSettingsContext();
+
+  // const router = useRouter();
+
+  const confirm = useBoolean();
+
+  const { customers } = useGetCustomers();
+
+  // const [tableData, setTableData] = useState(customers || []);
+
+  const [filters, setFilters] = useState(defaultFilters);
+
+  const dataFiltered = applyFilter({
+    inputData: customers,
+    comparator: getComparator(table.order, table.orderBy),
+    filters,
+  });
+
+  const dataInPage = dataFiltered.slice(
+    table.page * table.rowsPerPage,
+    table.page * table.rowsPerPage + table.rowsPerPage
+  );
+
+  const denseHeight = table.dense ? 52 : 72;
+
+  const canReset = !isEqual(defaultFilters, filters);
+
+  const notFound = (!dataFiltered.length && canReset) || !dataFiltered.length;
+
+  const handleFilters = useCallback(
+    (name: string, value: CustomerTableFilterValue) => {
+      table.onResetPage();
+      setFilters((prevState) => ({
+        ...prevState,
+        [name]: value,
+      }));
+    },
+    [table]
+  );
+
+  // const handleDeleteRow = useCallback(
+  //   (id: string) => {
+  //     const deleteRow = customers.filter((row) => row.id !== id);
+
+  //     table.onUpdatePageDeleteRow(dataInPage.length);
+  //   },
+  //   [dataInPage.length, table]
+  // );
+
+  // const handleDeleteRows = useCallback(() => {
+  //   const deleteRows = tableData.filter((row) => !table.selected.includes(row.id));
+  //   setTableData(deleteRows);
+
+  //   table.onUpdatePageDeleteRows({
+  //     totalRows: tableData.length,
+  //     totalRowsInPage: dataInPage.length,
+  //     totalRowsFiltered: dataFiltered.length,
+  //   });
+  // }, [dataFiltered.length, dataInPage.length, table, tableData]);
+
+  // const handleEditRow = useCallback(
+  //   (id: string) => {
+  //     router.push(paths.dashboard.user.edit(id));
+  //   },
+  //   [router]
+  // );
+
+  const handleFilterStatus = useCallback(
+    (event: React.SyntheticEvent, newValue: string) => {
+      handleFilters('status', newValue);
+    },
+    [handleFilters]
+  );
+
+  const handleResetFilters = useCallback(() => {
+    setFilters(defaultFilters);
+  }, []);
+
+  return (
+    <>
+      <Container maxWidth={settings.themeStretch ? false : 'lg'}>
+        <CustomBreadcrumbs
+          heading="List"
+          links={[
+            { name: 'Dashboard', href: paths.dashboard.root },
+            { name: 'Customer', href: paths.dashboard.customer.list },
+            { name: 'List' },
+          ]}
+          action={
+            <Button
+              component={RouterLink}
+              href={paths.dashboard.customer.new}
+              variant="contained"
+              startIcon={<Iconify icon="mingcute:add-line" />}
+            >
+              New Customer
+            </Button>
+          }
+          sx={{
+            mb: { xs: 3, md: 5 },
+          }}
+        />
+
+        <Card>
+          <Tabs
+            value={filters.status}
+            onChange={handleFilterStatus}
+            sx={{
+              px: 2.5,
+              boxShadow: (theme) => `inset 0 -2px 0 0 ${alpha(theme.palette.grey[500], 0.08)}`,
+            }}
+          >
+            {STATUS_OPTIONS.map((tab) => (
+              <Tab
+                key={tab.value}
+                iconPosition="end"
+                value={tab.value}
+                label={tab.label}
+                icon={
+                  <Label
+                    variant={
+                      ((tab.value === 'all' || tab.value === filters.status) && 'filled') || 'soft'
+                    }
+                    color={
+                      (tab.value === 'active' && 'success') ||
+                      (tab.value === 'pending' && 'warning') ||
+                      (tab.value === 'banned' && 'error') ||
+                      'default'
+                    }
+                  >
+                    {tab.value === 'all' && customers.length}
+
+                    {tab.value === 'active' &&
+                      customers.filter((customer) => customer.status === 'active').length}
+
+                    {tab.value === 'banned' &&
+                      customers.filter((customer) => customer.status === 'banned').length}
+
+                    {tab.value === 'inactive' &&
+                      customers.filter((customer) => customer.status === 'inactive').length}
+                  </Label>
+                }
+              />
+            ))}
+          </Tabs>
+
+          {canReset && (
+            <CustomerTableFiltersResult
+              filters={filters}
+              onFilters={handleFilters}
+              //
+              onResetFilters={handleResetFilters}
+              //
+              results={dataFiltered.length}
+              sx={{ p: 2.5, pt: 0 }}
+            />
+          )}
+
+          <TableContainer sx={{ position: 'relative', overflow: 'unset' }}>
+            <Scrollbar>
+              <Table size={table.dense ? 'small' : 'medium'} sx={{ minWidth: 960 }}>
+                <TableHeadCustom
+                  order={table.order}
+                  orderBy={table.orderBy}
+                  headLabel={TABLE_HEAD}
+                  rowCount={customers.length}
+                  numSelected={table.selected.length}
+                  onSort={table.onSort}
+                />
+
+                <TableBody>
+                  {dataFiltered
+                    .slice(
+                      table.page * table.rowsPerPage,
+                      table.page * table.rowsPerPage + table.rowsPerPage
+                    )
+                    .map((row) => (
+                      <CustomerTableRow
+                        key={row.id}
+                        row={row}
+                        selected={table.selected.includes(row.id!)}
+                        onEditRow={() => {}}
+                      />
+                    ))}
+
+                  <TableEmptyRows
+                    height={denseHeight}
+                    emptyRows={emptyRows(table.page, table.rowsPerPage, customers.length)}
+                  />
+
+                  <TableNoData notFound={notFound} />
+                </TableBody>
+              </Table>
+            </Scrollbar>
+          </TableContainer>
+
+          <TablePaginationCustom
+            count={dataFiltered.length}
+            page={table.page}
+            rowsPerPage={table.rowsPerPage}
+            onPageChange={table.onChangePage}
+            onRowsPerPageChange={table.onChangeRowsPerPage}
+            //
+            dense={table.dense}
+            onChangeDense={table.onChangeDense}
+          />
+        </Card>
+      </Container>
+
+      {/* <ConfirmDialog
+        open={confirm.value}
+        onClose={confirm.onFalse}
+        title="Delete"
+        content={
+          <>
+            Are you sure want to delete <strong> {table.selected.length} </strong> items?
+          </>
+        }
+        action={
+          <Button
+            variant="contained"
+            color="error"
+            onClick={() => {
+              handleDeleteRows();
+              confirm.onFalse();
+            }}
+          >
+            Delete
+          </Button>
+        }
+      /> */}
+    </>
+  );
+}
+
+// ----------------------------------------------------------------------
+
+function applyFilter({
+  inputData,
+  comparator,
+  filters,
+}: {
+  inputData: Customer[];
+  comparator: (a: any, b: any) => number;
+  filters: CustomerTableFilters;
+}) {
+  const { name, status, role } = filters;
+
+  const stabilizedThis = inputData.map((el, index) => [el, index] as const);
+
+  stabilizedThis.sort((a, b) => {
+    const order = comparator(a[0], b[0]);
+    if (order !== 0) return order;
+    return a[1] - b[1];
+  });
+
+  inputData = stabilizedThis.map((el) => el[0]);
+
+  if (name) {
+    inputData = inputData.filter(
+      (user) => user.name.toLowerCase().indexOf(name.toLowerCase()) !== -1
+    );
+  }
+
+  if (status !== 'all') {
+    inputData = inputData.filter((user) => user.status === status);
+  }
+
+  return inputData;
+}
Index: src/sections/user/view/index.ts
===================================================================
--- src/sections/user/view/index.ts	(revision 5d6f37a75130aab7d9a67b5b430603eff2c0ca6e)
+++ src/sections/user/view/index.ts	(revision 5d6f37a75130aab7d9a67b5b430603eff2c0ca6e)
@@ -0,0 +1,2 @@
+export { default as CustomerListView } from './customer-list-view';
+export { default as CustomerCreateView } from './customer-create-view';
Index: src/types/settings.ts
===================================================================
--- src/types/settings.ts	(revision 5d6f37a75130aab7d9a67b5b430603eff2c0ca6e)
+++ src/types/settings.ts	(revision 5d6f37a75130aab7d9a67b5b430603eff2c0ca6e)
@@ -0,0 +1,8 @@
+import { Customer } from 'mvpmasters-shared';
+
+export type Settings = {
+  company: Customer;
+  'company-ee': Customer;
+  invoice: { lastInvoiceNumber: string };
+  [key: string]: any;
+};
Index: src/utils/axios.ts
===================================================================
--- src/utils/axios.ts	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ src/utils/axios.ts	(revision 5d6f37a75130aab7d9a67b5b430603eff2c0ca6e)
@@ -45,8 +45,5 @@
 
 export const endpoints = {
-  invoice: '/api/invoices',
+  invoice: '/api/invoice',
   customer: '/api/customers',
-  tenant: '/api/tenant',
-  service: '/api/services',
-  employee: '/api/employees',
 };
Index: src/utils/create-full-address.ts
===================================================================
--- src/utils/create-full-address.ts	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ src/utils/create-full-address.ts	(revision 5d6f37a75130aab7d9a67b5b430603eff2c0ca6e)
@@ -1,3 +1,3 @@
-import { Address } from 'src/schemas';
+import { Address } from 'mvpmasters-shared';
 
 export function createFullAddress(data: Address): string {
Index: src/utils/get-invoice-quantity-type.ts
===================================================================
--- src/utils/get-invoice-quantity-type.ts	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ src/utils/get-invoice-quantity-type.ts	(revision 5d6f37a75130aab7d9a67b5b430603eff2c0ca6e)
@@ -1,3 +1,3 @@
-import { Invoice } from 'src/schemas';
+import { Invoice } from 'mvpmasters-shared';
 
 export const getQuantityType = (invoice: Invoice) => {
Index: yarn.lock
===================================================================
--- yarn.lock	(revision 658eaeeabe6b68a424a62ffd695452a6f1abb579)
+++ yarn.lock	(revision 5d6f37a75130aab7d9a67b5b430603eff2c0ca6e)
@@ -1534,4 +1534,9 @@
   integrity sha512-HxjQ8Qn+4SI3/AFv6sOrDB+g6PpUTDwSJiQqOrnneEk8L71161srI9gjzzZvYVbzHiVg/BvcH95+cK/zfIt4pg==
 
+"@fastify/busboy@^2.0.0":
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-2.1.1.tgz#b9da6a878a371829a0502c9b6c1c143ef6663f4d"
+  integrity sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==
+
 "@fastify/busboy@^3.0.0":
   version "3.1.1"
@@ -1635,4 +1640,15 @@
     tslib "^2.1.0"
 
+"@firebase/app@^0.9.25":
+  version "0.9.29"
+  resolved "https://registry.yarnpkg.com/@firebase/app/-/app-0.9.29.tgz#444280f0ddf1da4b2a974c86a6a8c6405d950fb7"
+  integrity sha512-HbKTjfmILklasIu/ij6zKnFf3SgLYXkBDVN7leJfVGmohl+zA7Ig+eXM1ZkT1pyBJ8FTYR+mlOJer/lNEnUCtw==
+  dependencies:
+    "@firebase/component" "0.6.5"
+    "@firebase/logger" "0.4.0"
+    "@firebase/util" "1.9.4"
+    idb "7.1.1"
+    tslib "^2.1.0"
+
 "@firebase/auth-compat@0.4.6":
   version "0.4.6"
@@ -1687,4 +1703,20 @@
   dependencies:
     "@firebase/util" "1.9.3"
+    tslib "^2.1.0"
+
+"@firebase/component@0.6.5":
+  version "0.6.5"
+  resolved "https://registry.yarnpkg.com/@firebase/component/-/component-0.6.5.tgz#8cc7334f2081d700f2769caaa8dae3ac4c1fe37e"
+  integrity sha512-2tVDk1ixi12sbDmmfITK8lxSjmcb73BMF6Qwc3U44hN/J1Fi1QY/Hnnb6klFlbB9/G16a3J3d4nXykye2EADTw==
+  dependencies:
+    "@firebase/util" "1.9.4"
+    tslib "^2.1.0"
+
+"@firebase/component@0.6.6":
+  version "0.6.6"
+  resolved "https://registry.yarnpkg.com/@firebase/component/-/component-0.6.6.tgz#7ad4013ff37686d355dee0694f1fa4604491b7c3"
+  integrity sha512-pp7sWqHmAAlA3os6ERgoM3k5Cxff510M9RLXZ9Mc8KFKMBc2ct3RkZTWUF7ixJNvMiK/iNgRLPDrLR2gtRJ9iQ==
+  dependencies:
+    "@firebase/util" "1.9.5"
     tslib "^2.1.0"
 
@@ -1769,4 +1801,9 @@
   resolved "https://registry.yarnpkg.com/@firebase/firestore-types/-/firestore-types-3.0.0.tgz#f3440d5a1cc2a722d361b24cefb62ca8b3577af3"
   integrity sha512-Meg4cIezHo9zLamw0ymFYBD4SMjLb+ZXIbuN7T7ddXN6MGoICmOTq3/ltdCGoDCS2u+H1XJs2u/cYp75jsX9Qw==
+
+"@firebase/firestore-types@^3.0.0":
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/@firebase/firestore-types/-/firestore-types-3.0.1.tgz#5b802f8aeffe6803f594b428054b10e25a73ae66"
+  integrity sha512-mVhPcHr5FICjF67m6JHgj+XRvAz/gZ62xifeGfcm00RFl6tNKfCzCfKeyB2BDIEc9dUnEstkmIXlmLIelOWoaA==
 
 "@firebase/firestore@4.2.0":
@@ -1784,4 +1821,18 @@
     tslib "^2.1.0"
 
+"@firebase/firestore@^4.4.0":
+  version "4.6.1"
+  resolved "https://registry.yarnpkg.com/@firebase/firestore/-/firestore-4.6.1.tgz#4a788103bca46e3ee829ddb816189f23cd26212a"
+  integrity sha512-MaBOBu+QcZOp6SJzCmigiJ4Dt0HNic91w8GghbTE9L//VW/zdO7ezXrcXRK4TjWWOcazBrJZJSHTIsFdwZyvtQ==
+  dependencies:
+    "@firebase/component" "0.6.6"
+    "@firebase/logger" "0.4.1"
+    "@firebase/util" "1.9.5"
+    "@firebase/webchannel-wrapper" "0.10.6"
+    "@grpc/grpc-js" "~1.9.0"
+    "@grpc/proto-loader" "^0.7.8"
+    tslib "^2.1.0"
+    undici "5.28.4"
+
 "@firebase/functions-compat@0.3.5":
   version "0.3.5"
@@ -1846,4 +1897,11 @@
     tslib "^2.1.0"
 
+"@firebase/logger@0.4.1":
+  version "0.4.1"
+  resolved "https://registry.yarnpkg.com/@firebase/logger/-/logger-0.4.1.tgz#b4bb0d266680210a34e7c70a8a92342391e399ab"
+  integrity sha512-tTIixB5UJbG9ZHSGZSZdX7THr3KWOLrejZ9B7jYsm6fpwgRNngKznQKA2wgYVyvBc1ta7dGFh9NtJ8n7qfiYIw==
+  dependencies:
+    tslib "^2.1.0"
+
 "@firebase/logger@0.4.4":
   version "0.4.4"
@@ -1976,8 +2034,27 @@
     tslib "^2.1.0"
 
+"@firebase/util@1.9.4":
+  version "1.9.4"
+  resolved "https://registry.yarnpkg.com/@firebase/util/-/util-1.9.4.tgz#68eee380ab7e7828ec0d8684c46a1abed2d7e334"
+  integrity sha512-WLonYmS1FGHT97TsUmRN3qnTh5TeeoJp1Gg5fithzuAgdZOUtsYECfy7/noQ3llaguios8r5BuXSEiK82+UrxQ==
+  dependencies:
+    tslib "^2.1.0"
+
+"@firebase/util@1.9.5", "@firebase/util@^1.5.1":
+  version "1.9.5"
+  resolved "https://registry.yarnpkg.com/@firebase/util/-/util-1.9.5.tgz#9321fc1695b30a9283c99f768da2e837e02cbddc"
+  integrity sha512-PP4pAFISDxsf70l3pEy34Mf3GkkUcVQ3MdKp6aSVb7tcpfUQxnsdV7twDd8EkfB6zZylH6wpUAoangQDmCUMqw==
+  dependencies:
+    tslib "^2.1.0"
+
 "@firebase/webchannel-wrapper@0.10.3":
   version "0.10.3"
   resolved "https://registry.yarnpkg.com/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.10.3.tgz#c894a21e8c911830e36bbbba55903ccfbc7a7e25"
   integrity sha512-+ZplYUN3HOpgCfgInqgdDAbkGGVzES1cs32JJpeqoh87SkRobGXElJx+1GZSaDqzFL+bYiX18qEcBK76mYs8uA==
+
+"@firebase/webchannel-wrapper@0.10.6":
+  version "0.10.6"
+  resolved "https://registry.yarnpkg.com/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.10.6.tgz#443efa9f761fd4ed8ca60c353e3a44d3a47e81f1"
+  integrity sha512-EnfRJvrnzkHwN3BPMCayCFT5lCqInzg3RdlRsDjDvB1EJli6Usj26T6lJ67BU2UcYXBS5xcp1Wj4+zRzj2NaZg==
 
 "@floating-ui/core@^1.4.2":
@@ -7397,4 +7474,9 @@
   integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
 
+moment@^2.29.4:
+  version "2.30.1"
+  resolved "https://registry.yarnpkg.com/moment/-/moment-2.30.1.tgz#f8c91c07b7a786e30c59926df530b4eac96974ae"
+  integrity sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==
+
 ms@2.0.0:
   version "2.0.0"
@@ -7434,4 +7516,17 @@
     arrify "^2.0.1"
     minimatch "^3.0.4"
+
+mvpmasters-shared@^1.0.9:
+  version "1.0.9"
+  resolved "https://registry.yarnpkg.com/mvpmasters-shared/-/mvpmasters-shared-1.0.9.tgz#964127bb04e25dcdfceab1aa490e106300bf430d"
+  integrity sha512-RluBz76NR5Q2yd25nWgKIuPAWHUa75U4uwR6e7iFw6zFIn+b83fE0upbUY7+iRFF5SSTFfj/7Uk5zZffy1HLlQ==
+  dependencies:
+    "@firebase/app" "^0.9.25"
+    "@firebase/firestore" "^4.4.0"
+    "@firebase/firestore-types" "^3.0.0"
+    "@firebase/util" "^1.5.1"
+    lodash "^4.17.21"
+    moment "^2.29.4"
+    zod "^3.22.4"
 
 nanoid@^3.3.6:
@@ -9418,8 +9513,8 @@
     is-typed-array "^1.1.9"
 
-typescript@5.7.3:
-  version "5.7.3"
-  resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.7.3.tgz#919b44a7dbb8583a9b856d162be24a54bf80073e"
-  integrity sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==
+typescript@^5.2.2:
+  version "5.2.2"
+  resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.2.2.tgz#5ebb5e5a5b75f085f22bc3f8460fba308310fa78"
+  integrity sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==
 
 unbox-primitive@^1.0.2:
@@ -9437,4 +9532,11 @@
   resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.20.0.tgz#8171bf22c1f588d1554d55bf204bc624af388433"
   integrity sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==
+
+undici@5.28.4:
+  version "5.28.4"
+  resolved "https://registry.yarnpkg.com/undici/-/undici-5.28.4.tgz#6b280408edb6a1a604a9b20340f45b422e373068"
+  integrity sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==
+  dependencies:
+    "@fastify/busboy" "^2.0.0"
 
 unicode-canonical-property-names-ecmascript@^2.0.0:
@@ -9855,2 +9957,7 @@
   resolved "https://registry.yarnpkg.com/zod/-/zod-3.20.2.tgz#068606642c8f51b3333981f91c0a8ab37dfc2807"
   integrity sha512-1MzNQdAvO+54H+EaK5YpyEy0T+Ejo/7YLHS93G3RnYWh5gaotGHwGeN/ZO687qEDU2y4CdStQYXVHIgrUl5UVQ==
+
+zod@^3.22.4:
+  version "3.23.5"
+  resolved "https://registry.yarnpkg.com/zod/-/zod-3.23.5.tgz#c7b7617d017d4a2f21852f533258d26a9a5ae09f"
+  integrity sha512-fkwiq0VIQTksNNA131rDOsVJcns0pfVUjHzLrNBiF/O/Xxb5lQyEXkhZWcJ7npWsYlvs+h0jFWXXy4X46Em1JA==
