[{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\e2e\\auth-helper.ts","messages":[{"ruleId":"react-hooks/rules-of-hooks","severity":2,"message":"React Hook \"use\" is called in function \"authenticatedPage\" that is neither a React function component nor a custom React Hook function. React component names must start with an uppercase letter. React Hook names must start with the word \"use\".","line":14,"column":15,"nodeType":"Identifier","endLine":14,"endColumn":18}],"suppressedMessages":[],"errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":"import { type Page, test as base, expect } from '@playwright/test';\n\n// Define test fixtures with authentication\nexport const expectedTest = base.extend<{\n    authenticatedPage: Page;\n}>({\n    authenticatedPage: async ({ page }, use) => {\n        // TODO: Implement authentication\n        // For now, this is a placeholder for future authentication setup\n        // Options:\n        // 1. Use API to create user and get token\n        // 2. Use Laravel's passport/sanctum for API auth\n        // 3. Use session-based auth with cookies\n        await use(page);\n    },\n});\n\nexport { expect };\n\n","usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\e2e\\example.spec.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\e2e\\members-complete.spec.ts","messages":[{"ruleId":"@typescript-eslint/no-unused-vars","severity":2,"message":"'INVALID_MEMBER' is assigned a value but never used.","line":44,"column":7,"nodeType":"Identifier","messageId":"unusedVar","endLine":44,"endColumn":21},{"ruleId":"@typescript-eslint/no-unused-vars","severity":2,"message":"'isSuccess' is assigned a value but never used.","line":426,"column":13,"nodeType":"Identifier","messageId":"unusedVar","endLine":426,"endColumn":22},{"ruleId":"@typescript-eslint/no-unused-vars","severity":2,"message":"'hasError' is assigned a value but never used.","line":877,"column":13,"nodeType":"Identifier","messageId":"unusedVar","endLine":877,"endColumn":21},{"ruleId":"@typescript-eslint/no-unused-vars","severity":2,"message":"'hasError' is assigned a value but never used.","line":921,"column":13,"nodeType":"Identifier","messageId":"unusedVar","endLine":921,"endColumn":21}],"suppressedMessages":[],"errorCount":4,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":"import { test, expect } from '@playwright/test';\n\n/**\n * MEMBERS MODULE - COMPREHENSIVE E2E TEST SUITE\n * \n * This test suite covers all functionality of the Members module including:\n * - Index page (list, search, filter, pagination, export)\n * - Create page (form validation, member creation)\n * - Edit page (pre-filled data, updates)\n * - Show page (member details, verification status)\n * - Actions (verify, delete from index and detail)\n * \n * PREREQUISITES:\n * 1. Application must be running at BASE_URL (default: http://localhost)\n * 2. Authentication middleware should be configured or disabled for testing\n * 3. Test database should be seeded with sample data\n * \n * TEST DATA:\n * - Verified members (at least 5)\n * - Unverified members (at least 3)\n * - Multiple branches (at least 2-3)\n * \n * INDONESIAN DATA CONVENTIONS:\n * - NIK (Nomor Induk Kependudukan): 16 digits\n * - Phone format: 08xxxxxxxxxx (11-13 digits)\n * - Names: Full Indonesian names (e.g., \"Budi Santoso\", \"Siti Rahayu\")\n * - Provinces: Jawa Barat, DKI Jakarta, Jawa Tengah, etc.\n */\n\n// Test data constants\nconst TEST_MEMBER = {\n  name: 'Ahmad Fauzi',\n  idNumber: '3204060609850001', // 16 digits\n  idType: 'KTP',\n  birthDate: '1985-06-06',\n  gender: 'male', // male or female\n  phone: '081234567890', // 11-13 digits\n  email: 'ahmad.fauzi@example.com',\n  address: 'Jl. Merdeka No. 123',\n  province: 'Jawa Barat',\n  city: 'Bandung',\n};\n\nconst INVALID_MEMBER = {\n  name: '', // Empty name\n  idNumber: '12345', // Less than 16 digits\n  idType: 'KTP',\n  birthDate: '2030-01-01', // Future date\n  gender: 'male',\n  phone: '0812',\n  email: 'invalid-email',\n  address: '',\n  province: '',\n};\n\ntest.describe('Members Module', () => {\n  // Skip all tests if authentication is not set up\n  test.describe.configure({ mode: 'parallel' });\n\n  /**\n   * ========================================\n   * MEMBERS INDEX PAGE TESTS\n   * ========================================\n   */\n  test.describe('Index Page', () => {\n    test.beforeEach(async ({ page }) => {\n      // Navigate to members index\n      await page.goto('/members');\n      await page.waitForLoadState('domcontentloaded');\n    });\n\n    test('should display page title and heading', async ({ page }) => {\n      // Check page title contains \"Anggota\"\n      await expect(page).toHaveTitle(/Anggota/);\n\n      // Check main heading\n      await expect(\n        page.getByRole('heading', { name: 'Manajemen Anggota' })\n      ).toBeVisible();\n\n      // Check subtitle/description\n      await expect(\n        page.getByText('Kelola anggota koperasi dan akun mereka')\n      ).toBeVisible();\n    });\n\n    test('should display Tambah Anggota button', async ({ page }) => {\n      // Check for \"Tambah Anggota\" button\n      const addButton = page.getByRole('link', { name: /tambah anggota/i });\n      await expect(addButton).toBeVisible();\n      await expect(addButton).toHaveAttribute('href', /\\/members\\/create/);\n    });\n\n    test('should display search input', async ({ page }) => {\n      // Check for search input\n      const searchInput = page.getByPlaceholder(/cari berdasarkan nama atau nik/i);\n      await expect(searchInput).toBeVisible();\n      await expect(searchInput).toHaveAttribute('type', 'text');\n    });\n\n    test('should display branch filter dropdown', async ({ page }) => {\n      // Check for branch filter\n      const branchFilter = page.getByRole('combobox', { name: /cabang/i });\n      await expect(branchFilter).toBeVisible();\n    });\n\n    test('should display status filter dropdown', async ({ page }) => {\n      // Check for status filter\n      const statusFilter = page.getByRole('combobox', { name: /status verifikasi/i });\n      await expect(statusFilter).toBeVisible();\n    });\n\n    test('should display export CSV button', async ({ page }) => {\n      // Check for export button\n      const exportButton = page.getByRole('button', { name: 'Export CSV' });\n      await expect(exportButton).toBeVisible();\n    });\n\n    test('should display members table with correct headers', async ({ page }) => {\n      // Wait for table to load\n      await page.waitForSelector('table', { timeout: 10000 });\n\n      // Check table headers\n      await expect(page.getByRole('columnheader', { name: 'Nomor Identitas' })).toBeVisible();\n      await expect(page.getByRole('columnheader', { name: 'Nama Lengkap' })).toBeVisible();\n      await expect(page.getByRole('columnheader', { name: 'Telepon' })).toBeVisible();\n      await expect(page.getByRole('columnheader', { name: 'Cabang' })).toBeVisible();\n      await expect(page.getByRole('columnheader', { name: 'Status' })).toBeVisible();\n      await expect(page.getByRole('columnheader', { name: 'Tgl Registrasi' })).toBeVisible();\n    });\n\n    test('should display member data in table rows', async ({ page }) => {\n      // Wait for table\n      await page.waitForSelector('table', { timeout: 10000 });\n\n      // Check if there are any members\n      const rows = page.locator('tbody tr');\n      const rowCount = await rows.count();\n\n      if (rowCount > 0) {\n        // Check first row has data\n        const firstRow = rows.first();\n        await expect(firstRow.locator('td').first()).not.toBeEmpty();\n      }\n    });\n\n    test('should search members by name', async ({ page }) => {\n      // Wait for table to load\n      await page.waitForSelector('table', { timeout: 10000 });\n\n      // Get initial row count\n      const initialRows = await page.locator('tbody tr').count();\n\n      if (initialRows > 0) {\n        // Search for a specific name\n        const searchInput = page.getByPlaceholder(/cari berdasarkan nama atau nik/i);\n        await searchInput.fill('Budi');\n        await page.keyboard.press('Enter');\n\n        // Wait for results\n        await page.waitForTimeout(500);\n\n        // Verify search was performed (URL should have search parameter)\n        expect(page.url()).toContain('search=');\n      }\n    });\n\n    test('should filter members by branch', async ({ page }) => {\n      // Wait for page to load\n      await page.waitForSelector('table', { timeout: 10000 });\n\n      // Click branch filter dropdown\n      const branchFilter = page.getByRole('combobox', { name: /cabang/i }).first();\n      await branchFilter.click();\n\n      // Select a branch (first available option after \"Semua Cabang\")\n      const branchOptions = page.getByRole('option').filter({ hasText: /^(?!Semua Cabang)/ });\n      const optionCount = await branchOptions.count();\n\n      if (optionCount > 0) {\n        await branchOptions.first().click();\n\n        // Wait for filter to apply\n        await page.waitForTimeout(500);\n\n        // Verify URL has branch_id parameter\n        expect(page.url()).toContain('branch_id=');\n      }\n    });\n\n    test('should filter members by verification status', async ({ page }) => {\n      // Wait for page to load\n      await page.waitForSelector('table', { timeout: 10000 });\n\n      // Click status filter dropdown\n      const statusFilter = page.getByRole('combobox', { name: /status verifikasi/i });\n      await statusFilter.click();\n\n      // Select \"Terverifikasi\" (Verified)\n      await page.getByRole('option', { name: 'Terverifikasi' }).click();\n\n      // Wait for filter to apply\n      await page.waitForTimeout(500);\n\n      // Verify URL has is_verified parameter\n      expect(page.url()).toContain('is_verified=1');\n    });\n\n    test('should export members to CSV', async ({ page }) => {\n      // Setup download handler\n      const downloadPromise = page.waitForEvent('download');\n\n      // Click export button\n      await page.getByRole('button', { name: 'Export CSV' }).click();\n\n      // Wait for download to start\n      const download = await downloadPromise;\n\n      // Verify filename\n      expect(download.suggestedFilename()).toMatch(/anggota_\\d{4}-\\d{2}-\\d{2}\\.csv/);\n    });\n\n    test('should navigate to create page', async ({ page }) => {\n      // Click \"Tambah Anggota\" button\n      await page.getByRole('link', { name: /tambah anggota/i }).click();\n\n      // Verify navigation to create page\n      await page.waitForURL(/\\/members\\/create/);\n      await expect(page.getByRole('heading', { name: 'Tambah Anggota Baru' })).toBeVisible();\n    });\n\n    test('should navigate to member detail page via ID number link', async ({ page }) => {\n      // Wait for table to load\n      await page.waitForSelector('table', { timeout: 10000 });\n\n      // Click first member's ID number link\n      const firstMemberLink = page.locator('tbody tr').first().getByRole('link', { name: /^\\d+/ });\n      const linkCount = await firstMemberLink.count();\n\n      if (linkCount > 0) {\n        await firstMemberLink.first().click();\n\n        // Verify navigation to detail page\n        await page.waitForURL(/\\/members\\/\\d+/);\n        await expect(page).toHaveTitle(/Detail/);\n      }\n    });\n\n    test('should display row actions menu', async ({ page }) => {\n      // Wait for table to load\n      await page.waitForSelector('table', { timeout: 10000 });\n\n      // Find first row action button\n      const firstRow = page.locator('tbody tr').first();\n      const actionButton = firstRow.getByRole('button').first();\n      const buttonCount = await actionButton.count();\n\n      if (buttonCount > 0) {\n        // Click action button to open dropdown\n        await actionButton.click();\n\n        // Check for menu items\n        await expect(page.getByRole('menuitem', { name: /lihat detail/i })).toBeVisible();\n        await expect(page.getByRole('menuitem', { name: /edit/i })).toBeVisible();\n        await expect(page.getByRole('menuitem', { name: /hapus/i })).toBeVisible();\n      }\n    });\n\n    test('should display pagination when data exceeds page size', async ({ page }) => {\n      // Wait for table to load\n      await page.waitForSelector('table', { timeout: 10000 });\n\n      // Check for pagination elements\n      const pagination = page.locator('nav[aria-label=\"Pagination\"]');\n      const hasPagination = await pagination.count() > 0;\n\n      if (hasPagination) {\n        await expect(pagination).toBeVisible();\n      }\n    });\n  });\n\n  /**\n   * ========================================\n   * MEMBERS CREATE PAGE TESTS\n   * ========================================\n   */\n  test.describe('Create Page', () => {\n    test.beforeEach(async ({ page }) => {\n      // Navigate to create page\n      await page.goto('/members/create');\n      await page.waitForLoadState('domcontentloaded');\n    });\n\n    test('should display page title and heading', async ({ page }) => {\n      // Check page title\n      await expect(page).toHaveTitle(/Tambah Anggota/);\n\n      // Check heading\n      await expect(\n        page.getByRole('heading', { name: 'Tambah Anggota Baru' })\n      ).toBeVisible();\n\n      // Check subtitle\n      await expect(\n        page.getByText('Isi formulir di bawah untuk mendaftarkan anggota baru')\n      ).toBeVisible();\n    });\n\n    test('should display all required form fields', async ({ page }) => {\n      // Check all required fields\n      await expect(page.getByLabel('Nama Lengkap')).toBeVisible();\n      await expect(page.getByLabel(/Nomor Identitas \\(NIK\\)/)).toBeVisible();\n      await expect(page.getByLabel('Tipe Identitas')).toBeVisible();\n      await expect(page.getByLabel('Jenis Kelamin')).toBeVisible();\n      await expect(page.getByLabel('Telepon')).toBeVisible();\n      await expect(page.getByLabel('Cabang')).toBeVisible();\n      await expect(page.getByLabel('Tanggal Lahir')).toBeVisible();\n      await expect(page.getByLabel('Alamat Lengkap')).toBeVisible();\n      await expect(page.getByLabel('Provinsi')).toBeVisible();\n\n      // Check optional fields\n      await expect(page.getByLabel('Email')).toBeVisible();\n      await expect(page.getByLabel('Kota/Kabupaten')).toBeVisible();\n    });\n\n    test('should display form action buttons', async ({ page }) => {\n      // Check buttons\n      await expect(page.getByRole('button', { name: 'Batal' })).toBeVisible();\n      await expect(page.getByRole('button', { name: 'Simpan Anggota' })).toBeVisible();\n    });\n\n    test('should validate required fields', async ({ page }) => {\n      // Try to submit form without filling required fields\n      await page.getByRole('button', { name: 'Simpan Anggota' }).click();\n\n      // Check for validation errors\n      // Note: Inertia forms might show errors differently\n      // This test checks if form doesn't submit\n      await page.waitForTimeout(500);\n\n      // Should still be on create page (validation failed)\n      expect(page.url()).toContain('/members/create');\n    });\n\n    test('should validate NIK length (must be 16 digits)', async ({ page }) => {\n      // Fill NIK with less than 16 digits\n      await page.getByLabel(/Nomor Identitas \\(NIK\\)/).fill('12345');\n      await page.getByLabel('Nama Lengkap').fill('Test User');\n\n      // Trigger validation by blurring the field\n      await page.getByLabel('Nama Lengkap').click();\n\n      // Check for error message\n      await page.waitForTimeout(500);\n      const errorMsg = page.getByText(/16 digit/i);\n      const hasError = await errorMsg.count() > 0;\n\n      if (hasError) {\n        await expect(errorMsg).toBeVisible();\n      }\n    });\n\n    test('should validate email format', async ({ page }) => {\n      // Fill invalid email\n      await page.getByLabel('Email').fill('invalid-email-format');\n      await page.getByLabel('Nama Lengkap').click();\n\n      // Check for error message\n      await page.waitForTimeout(500);\n      const errorMsg = page.getByText(/email/i);\n      const hasError = await errorMsg.count() > 0;\n\n      if (hasError) {\n        await expect(errorMsg).toBeVisible();\n      }\n    });\n\n    test('should create new member with valid data', async ({ page }) => {\n      // Fill form with valid data\n      await page.getByLabel('Nama Lengkap').fill(TEST_MEMBER.name);\n      await page.getByLabel(/Nomor Identitas \\(NIK\\)/).fill(TEST_MEMBER.idNumber);\n\n      // Select ID type\n      await page.getByLabel('Tipe Identitas').click();\n      await page.getByRole('option', { name: TEST_MEMBER.idType }).click();\n\n      // Select gender\n      await page.getByLabel('Jenis Kelamin').click();\n      await page.getByRole('option', { name: 'Laki-laki' }).click();\n\n      // Fill phone\n      await page.getByLabel('Telepon').fill(TEST_MEMBER.phone);\n\n      // Fill email\n      await page.getByLabel('Email').fill(TEST_MEMBER.email);\n\n      // Select branch (first available)\n      await page.getByLabel('Cabang').click();\n      const firstBranch = page.getByRole('option').filter({ hasText: /^(?!Pilih cabang)/ }).first();\n      const branchCount = await firstBranch.count();\n      if (branchCount > 0) {\n        await firstBranch.click();\n      }\n\n      // Fill birth date\n      await page.getByLabel('Tanggal Lahir').fill(TEST_MEMBER.birthDate);\n\n      // Fill address\n      await page.getByLabel('Alamat Lengkap').fill(TEST_MEMBER.address);\n\n      // Fill province\n      await page.getByLabel('Provinsi').fill(TEST_MEMBER.province);\n\n      // Fill city\n      await page.getByLabel('Kota/Kabupaten').fill(TEST_MEMBER.city);\n\n      // Submit form\n      await page.getByRole('button', { name: 'Simpan Anggota' }).click();\n\n      // Wait for redirect or success\n      await page.waitForTimeout(2000);\n\n      // Should redirect to detail page or stay on page with success message\n      const currentUrl = page.url();\n      const isSuccess = currentUrl.includes('/members/') || currentUrl.includes('/members/create');\n\n      // Verify toast notification (if present)\n      const toast = page.getByText(/berhasil dibuat/i);\n      const hasToast = await toast.count() > 0;\n\n      if (hasToast) {\n        await expect(toast).toBeVisible();\n      }\n    });\n\n    test('should navigate back on cancel button click', async ({ page }) => {\n      // Click cancel button\n      await page.getByRole('button', { name: 'Batal' }).click();\n\n      // Should go back to previous page or index\n      await page.waitForTimeout(500);\n      const currentUrl = page.url();\n      \n      // Either goes back to index or stays (if no history)\n      expect(currentUrl).toMatch(/\\/members(\\/create)?/);\n    });\n\n    test('should navigate back via back button', async ({ page }) => {\n      // Click back arrow button\n      const backButton = page.locator('button').filter({ hasText: '' }).first();\n      await backButton.click();\n\n      // Should return to index page\n      await page.waitForTimeout(500);\n      expect(page.url()).toContain('/members');\n    });\n  });\n\n  /**\n   * ========================================\n   * MEMBERS EDIT PAGE TESTS\n   * ========================================\n   */\n  test.describe('Edit Page', () => {\n    let memberId: string;\n\n    test.beforeEach(async ({ page }) => {\n      // Navigate to members index first\n      await page.goto('/members');\n      await page.waitForSelector('table', { timeout: 10000 });\n\n      // Get first member ID from table\n      const firstRow = page.locator('tbody tr').first();\n      const memberLink = firstRow.getByRole('link', { name: /^\\d+/ });\n      const linkCount = await memberLink.count();\n\n      if (linkCount > 0) {\n        // Extract member ID from href\n        const href = await memberLink.first().getAttribute('href');\n        if (href) {\n          memberId = href.split('/').pop() || '1';\n        }\n\n        // Click edit button from dropdown\n        const actionButton = firstRow.getByRole('button').first();\n        await actionButton.click();\n\n        await page.getByRole('menuitem', { name: /edit/i }).click();\n        await page.waitForLoadState('domcontentloaded');\n      } else {\n        // If no members, navigate to edit with ID 1 (will likely 404, but that's ok for this test)\n        await page.goto(`/members/1/edit`);\n      }\n    });\n\n    test('should display page title and heading', async ({ page }) => {\n      // Check page title\n      await expect(page).toHaveTitle(/Edit/);\n\n      // Check heading\n      await expect(\n        page.getByRole('heading', { name: 'Edit Anggota' })\n      ).toBeVisible();\n    });\n\n    test('should pre-fill form with existing member data', async ({ page }) => {\n      // Check form fields have values (pre-filled)\n      const nameInput = page.getByLabel('Nama Lengkap');\n      const nameValue = await nameInput.inputValue();\n\n      expect(nameValue.length).toBeGreaterThan(0);\n\n      // Check other fields\n      const idNumberInput = page.getByLabel(/Nomor Identitas \\(NIK\\)/);\n      const idNumberValue = await idNumberInput.inputValue();\n\n      expect(idNumberValue.length).toBeGreaterThan(0);\n    });\n\n    test('should display all form fields', async ({ page }) => {\n      // Check all required fields are present\n      await expect(page.getByLabel('Nama Lengkap')).toBeVisible();\n      await expect(page.getByLabel(/Nomor Identitas \\(NIK\\)/)).toBeVisible();\n      await expect(page.getByLabel('Tipe Identitas')).toBeVisible();\n      await expect(page.getByLabel('Jenis Kelamin')).toBeVisible();\n      await expect(page.getByLabel('Telepon')).toBeVisible();\n      await expect(page.getByLabel('Cabang')).toBeVisible();\n      await expect(page.getByLabel('Tanggal Lahir')).toBeVisible();\n      await expect(page.getByLabel('Alamat Lengkap')).toBeVisible();\n      await expect(page.getByLabel('Provinsi')).toBeVisible();\n    });\n\n    test('should update member data', async ({ page }) => {\n      // Get original name\n      const nameInput = page.getByLabel('Nama Lengkap');\n      const originalName = await nameInput.inputValue();\n\n      // Update name\n      const updatedName = originalName + ' (Updated)';\n      await nameInput.clear();\n      await nameInput.fill(updatedName);\n\n      // Submit form\n      await page.getByRole('button', { name: 'Simpan Perubahan' }).click();\n\n      // Wait for redirect or success\n      await page.waitForTimeout(2000);\n\n      // Verify toast notification (if present)\n      const toast = page.getByText(/berhasil diperbarui/i);\n      const hasToast = await toast.count() > 0;\n\n      if (hasToast) {\n        await expect(toast).toBeVisible();\n      }\n    });\n\n    test('should validate required fields on update', async ({ page }) => {\n      // Clear required field\n      await page.getByLabel('Nama Lengkap').clear();\n\n      // Try to submit\n      await page.getByRole('button', { name: 'Simpan Perubahan' }).click();\n\n      // Should show validation error\n      await page.waitForTimeout(500);\n      \n      // Should still be on edit page\n      expect(page.url()).toContain('/members/');\n    });\n\n    test('should navigate back to detail page on cancel', async ({ page }) => {\n      // Click cancel button\n      await page.getByRole('button', { name: 'Batal' }).click();\n\n      // Should return to detail page\n      await page.waitForTimeout(500);\n      expect(page.url()).toContain(`/members/${memberId}`);\n    });\n\n    test('should navigate back via back button', async ({ page }) => {\n      // Click back arrow button\n      const backButton = page.locator('button').filter({ hasText: '' }).first();\n      await backButton.click();\n\n      // Should return to detail page\n      await page.waitForTimeout(500);\n      expect(page.url()).toContain(`/members/${memberId}`);\n    });\n  });\n\n  /**\n   * ========================================\n   * MEMBERS SHOW/DETAIL PAGE TESTS\n   * ========================================\n   */\n  test.describe('Show/Detail Page', () => {\n    test.beforeEach(async ({ page }) => {\n      // Navigate to members index first\n      await page.goto('/members');\n      await page.waitForSelector('table', { timeout: 10000 });\n\n      // Click first member's detail link\n      const firstMemberLink = page.locator('tbody tr').first().getByRole('link', { name: /^\\d+/ });\n      const linkCount = await firstMemberLink.count();\n\n      if (linkCount > 0) {\n        await firstMemberLink.first().click();\n        await page.waitForLoadState('domcontentloaded');\n      } else {\n        await page.goto('/members/1');\n      }\n    });\n\n    test('should display member name and ID number', async ({ page }) => {\n      // Check for member name heading\n      const memberName = page.getByRole('heading', { level: 1 });\n      await expect(memberName).toBeVisible();\n\n      // Check for ID number\n      const idNumber = page.getByText(/\\d{16}/);\n      const hasIdNumber = await idNumber.count() > 0;\n\n      if (hasIdNumber) {\n        await expect(idNumber.first()).toBeVisible();\n      }\n    });\n\n    test('should display verification status badge', async ({ page }) => {\n      // Check for status badge\n      const badge = page.locator('[class*=\"badge\"]').or(\n        page.getByText(/Terverifikasi|Belum Verifikasi/i)\n      );\n      const hasBadge = await badge.count() > 0;\n\n      if (hasBadge) {\n        await expect(badge.first()).toBeVisible();\n      }\n    });\n\n    test('should display registration date', async ({ page }) => {\n      // Check for registration date\n      const regDate = page.getByText(/Terdaftar sejak/i);\n      await expect(regDate).toBeVisible();\n    });\n\n    test('should display member information sections', async ({ page }) => {\n      // Check for info sections\n      await expect(page.getByText('Informasi Pribadi')).toBeVisible();\n      await expect(page.getByText('Informasi Kontak')).toBeVisible();\n      await expect(page.getByText('Informasi Alamat')).toBeVisible();\n    });\n\n    test('should display edit button', async ({ page }) => {\n      // Check for edit button\n      const editButton = page.getByRole('link', { name: /edit/i });\n      await expect(editButton).toBeVisible();\n    });\n\n    test('should navigate to edit page via edit button', async ({ page }) => {\n      // Click edit button\n      await page.getByRole('link', { name: /edit/i }).click();\n\n      // Verify navigation to edit page\n      await page.waitForURL(/\\/members\\/\\d+\\/edit/);\n      await expect(page.getByRole('heading', { name: 'Edit Anggota' })).toBeVisible();\n    });\n\n    test('should navigate back to index via back button', async ({ page }) => {\n      // Click back button\n      const backButton = page.locator('button').filter({ hasText: '' }).first();\n      await backButton.click();\n\n      // Should return to index\n      await page.waitForTimeout(500);\n      expect(page.url()).toContain('/members');\n    });\n\n    test('should display stats cards', async ({ page }) => {\n      // Check for stats cards (may be empty)\n      const statsCard = page.getByText(/Akun Tabungan|Pembiayaan Aktif|Cabang/i);\n      const hasStats = await statsCard.count() > 0;\n\n      if (hasStats) {\n        await expect(statsCard.first()).toBeVisible();\n      }\n    });\n  });\n\n  /**\n   * ========================================\n   * MEMBER ACTIONS TESTS\n   * ========================================\n   */\n  test.describe('Member Actions - Index Page', () => {\n    test.beforeEach(async ({ page }) => {\n      // Navigate to members index\n      await page.goto('/members');\n      await page.waitForSelector('table', { timeout: 10000 });\n    });\n\n    test('should view member detail from actions menu', async ({ page }) => {\n      // Open actions menu for first member\n      const firstRow = page.locator('tbody tr').first();\n      const actionButton = firstRow.getByRole('button').first();\n      const buttonCount = await actionButton.count();\n\n      if (buttonCount > 0) {\n        await actionButton.click();\n\n        // Click \"Lihat Detail\" menu item\n        await page.getByRole('menuitem', { name: /lihat detail/i }).click();\n\n        // Verify navigation to detail page\n        await page.waitForURL(/\\/members\\/\\d+/);\n        await expect(page).toHaveTitle(/Detail/);\n      }\n    });\n\n    test('should edit member from actions menu', async ({ page }) => {\n      // Open actions menu for first member\n      const firstRow = page.locator('tbody tr').first();\n      const actionButton = firstRow.getByRole('button').first();\n      const buttonCount = await actionButton.count();\n\n      if (buttonCount > 0) {\n        await actionButton.click();\n\n        // Click \"Edit\" menu item\n        await page.getByRole('menuitem', { name: /edit/i }).click();\n\n        // Verify navigation to edit page\n        await page.waitForURL(/\\/members\\/\\d+\\/edit/);\n        await expect(page).toHaveTitle(/Edit/);\n      }\n    });\n\n    test('should verify unverified member from actions menu', async ({ page }) => {\n      // Look for unverified member (status badge)\n      const unverifiedBadge = page.getByText('Belum Verifikasi').first();\n      const hasUnverified = await unverifiedBadge.count() > 0;\n\n      if (hasUnverified) {\n        // Find the row containing this badge\n        const row = unverifiedBadge.locator('..').locator('..');\n        const actionButton = row.getByRole('button').first();\n        await actionButton.click();\n\n        // Click \"Verifikasi\" menu item\n        await page.getByRole('menuitem', { name: /verifikasi/i }).click();\n\n        // Wait for success\n        await page.waitForTimeout(1000);\n\n        // Verify toast notification\n        const toast = page.getByText(/berhasil diverifikasi/i);\n        const hasToast = await toast.count() > 0;\n\n        if (hasToast) {\n          await expect(toast).toBeVisible();\n        }\n      }\n    });\n\n    test('should delete member with confirmation from actions menu', async ({ page }) => {\n      // Get initial row count\n      const initialRows = await page.locator('tbody tr').count();\n\n      if (initialRows > 0) {\n        // Open actions menu for first member\n        const firstRow = page.locator('tbody tr').first();\n        const actionButton = firstRow.getByRole('button').first();\n        await actionButton.click();\n\n        // Setup dialog handler to accept confirmation\n        page.on('dialog', dialog => dialog.accept());\n\n        // Click \"Hapus\" menu item\n        await page.getByRole('menuitem', { name: /hapus/i }).click();\n\n        // Wait for deletion\n        await page.waitForTimeout(2000);\n\n        // Verify toast notification\n        const toast = page.getByText(/berhasil dihapus/i);\n        const hasToast = await toast.count() > 0;\n\n        if (hasToast) {\n          await expect(toast).toBeVisible();\n        }\n      }\n    });\n  });\n\n  /**\n   * ========================================\n   * NAVIGATION TESTS\n   * ========================================\n   */\n  test.describe('Navigation', () => {\n    test('should navigate via breadcrumb from create page', async ({ page }) => {\n      // Navigate to create page\n      await page.goto('/members/create');\n      await page.waitForLoadState('domcontentloaded');\n\n      // Click breadcrumb \"Anggota\" link\n      await page.getByRole('link', { name: 'Anggota' }).click();\n\n      // Verify navigation to index\n      await page.waitForURL(/\\/members/);\n      await expect(page.getByRole('heading', { name: 'Manajemen Anggota' })).toBeVisible();\n    });\n\n    test('should navigate via breadcrumb from edit page', async ({ page }) => {\n      // Navigate to edit page directly\n      await page.goto('/members/1/edit');\n      await page.waitForLoadState('domcontentloaded');\n\n      // Click breadcrumb \"Anggota\" link\n      await page.getByRole('link', { name: 'Anggota' }).click();\n\n      // Verify navigation to index\n      await page.waitForURL(/\\/members/);\n      await expect(page.getByRole('heading', { name: 'Manajemen Anggota' })).toBeVisible();\n    });\n\n    test('should navigate via breadcrumb from detail page', async ({ page }) => {\n      // Navigate to detail page\n      await page.goto('/members/1');\n      await page.waitForLoadState('domcontentloaded');\n\n      // Click breadcrumb \"Anggota\" link\n      await page.getByRole('link', { name: 'Anggota' }).click();\n\n      // Verify navigation to index\n      await page.waitForURL(/\\/members/);\n      await expect(page.getByRole('heading', { name: 'Manajemen Anggota' })).toBeVisible();\n    });\n  });\n\n  /**\n   * ========================================\n   * FORM VALIDATION COMPREHENSIVE TESTS\n   * ========================================\n   */\n  test.describe('Form Validation - Comprehensive', () => {\n    test.beforeEach(async ({ page }) => {\n      // Navigate to create page\n      await page.goto('/members/create');\n      await page.waitForLoadState('domcontentloaded');\n    });\n\n    test('should validate all required fields are empty', async ({ page }) => {\n      // Submit empty form\n      await page.getByRole('button', { name: 'Simpan Anggota' }).click();\n      await page.waitForTimeout(500);\n\n      // Check for validation errors (should show multiple errors)\n      const errorMessages = await page.locator('text=/wajib diisi|harus diisi|required/i').count();\n      expect(errorMessages).toBeGreaterThan(0);\n    });\n\n    test('should validate NIK is exactly 16 characters', async ({ page }) => {\n      // Test with 15 digits\n      await page.getByLabel(/Nomor Identitas \\(NIK\\)/).fill('123456789012345');\n      await page.getByLabel('Nama Lengkap').click();\n      await page.waitForTimeout(300);\n\n      // Test with 17 digits\n      await page.getByLabel(/Nomor Identitas \\(NIK\\)/).clear();\n      await page.getByLabel(/Nomor Identitas \\(NIK\\)/).fill('12345678901234567');\n      await page.getByLabel('Nama Lengkap').click();\n      await page.waitForTimeout(300);\n\n      // Check for error (inertia shows error after submission or on blur)\n      const hasError = await page.getByText(/16 digit/i).count() > 0;\n      // Error might only show after submit\n    });\n\n    test('should validate birth date is not in the future', async ({ page }) => {\n      // Set future date\n      const futureDate = new Date();\n      futureDate.setFullYear(futureDate.getFullYear() + 10);\n      const dateStr = futureDate.toISOString().split('T')[0];\n\n      await page.getByLabel('Tanggal Lahir').fill(dateStr);\n      await page.getByLabel('Nama Lengkap').click();\n      await page.waitForTimeout(300);\n\n      // Submit to trigger validation\n      await page.getByRole('button', { name: 'Simpan Anggota' }).click();\n      await page.waitForTimeout(500);\n\n      // Check for error\n      const hasError = await page.getByText(/sebelum hari ini/i).count() > 0;\n      if (hasError) {\n        await expect(page.getByText(/sebelum hari ini/i)).toBeVisible();\n      }\n    });\n\n    test('should validate email format when provided', async ({ page }) => {\n      // Fill valid data but invalid email\n      await page.getByLabel('Nama Lengkap').fill('Test User');\n      await page.getByLabel(/Nomor Identitas \\(NIK\\)/).fill('3201010101010001');\n      await page.getByLabel('Email').fill('not-an-email');\n\n      // Select branch\n      await page.getByLabel('Cabang').click();\n      const firstBranch = page.getByRole('option').filter({ hasText: /^(?!Pilih cabang)/ }).first();\n      const branchCount = await firstBranch.count();\n      if (branchCount > 0) {\n        await firstBranch.click();\n      }\n\n      // Submit to trigger validation\n      await page.getByRole('button', { name: 'Simpan Anggota' }).click();\n      await page.waitForTimeout(500);\n\n      // Check for email error\n      const hasError = await page.getByText(/email/i).count() > 0;\n      // Might show multiple \"email\" matches\n    });\n\n    test('should allow optional fields to be empty', async ({ page }) => {\n      // Fill only required fields\n      await page.getByLabel('Nama Lengkap').fill(TEST_MEMBER.name);\n      await page.getByLabel(/Nomor Identitas \\(NIK\\)/).fill(TEST_MEMBER.idNumber);\n      await page.getByLabel('Tipe Identitas').click();\n      await page.getByRole('option', { name: 'KTP' }).click();\n      await page.getByLabel('Jenis Kelamin').click();\n      await page.getByRole('option', { name: 'Laki-laki' }).click();\n      await page.getByLabel('Telepon').fill(TEST_MEMBER.phone);\n\n      // Select branch\n      await page.getByLabel('Cabang').click();\n      const firstBranch = page.getByRole('option').filter({ hasText: /^(?!Pilih cabang)/ }).first();\n      const branchCount = await firstBranch.count();\n      if (branchCount > 0) {\n        await firstBranch.click();\n      }\n\n      await page.getByLabel('Tanggal Lahir').fill(TEST_MEMBER.birthDate);\n      await page.getByLabel('Alamat Lengkap').fill(TEST_MEMBER.address);\n      await page.getByLabel('Provinsi').fill(TEST_MEMBER.province);\n\n      // Leave optional fields empty (email, city)\n\n      // Submit form\n      await page.getByRole('button', { name: 'Simpan Anggota' }).click();\n\n      // Wait for response\n      await page.waitForTimeout(2000);\n\n      // Should not show validation errors for optional fields\n      // (This is a weak assertion - ideally we'd check for specific success)\n    });\n  });\n});\n\n/**\n * SETUP INSTRUCTIONS:\n * \n * 1. Install Playwright browsers:\n *    npx playwright install\n * \n * 2. Start the Laravel application:\n *    php artisan serve\n * \n * 3. Configure BASE_URL in .env or playwright.config.ts:\n *    BASE_URL=http://localhost:8000\n * \n * 4. Run tests:\n *    npx playwright test e2e/members-complete.spec.ts\n * \n * 5. Run tests in headed mode:\n *    npx playwright test e2e/members-complete.spec.ts --headed\n * \n * 6. Run specific test:\n *    npx playwright test e2e/members-complete.spec.ts -g \"should display page title\"\n * \n * 7. Debug tests:\n *    npx playwright test e2e/members-complete.spec.ts --debug\n * \n * 8. View test report:\n *    npx playwright show-report\n * \n * AUTHENTICATION:\n * If tests fail due to authentication, you need to either:\n * - Disable auth middleware for testing (quickest)\n * - Implement auth helper in e2e/auth-helper.ts\n * - Use API tokens\n * \n * To disable auth temporarily, add to routes/web.php:\n * Route::prefix('members')->withoutMiddleware([\\App\\Http\\Middleware\\Authenticate::class])->group(function () {\n *   // member routes here\n * });\n */","usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\e2e\\members.spec.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\e2e\\seed-members.spec.ts","messages":[{"ruleId":"@typescript-eslint/no-unused-vars","severity":2,"message":"'expect' is defined but never used.","line":1,"column":16,"nodeType":"Identifier","messageId":"unusedVar","endLine":1,"endColumn":22,"suggestions":[{"messageId":"removeUnusedVar","data":{"varName":"expect"},"fix":{"range":[13,21],"text":""},"desc":"Remove unused variable \"expect\"."}]},{"ruleId":"@typescript-eslint/no-unused-vars","severity":2,"message":"'page' is defined but never used.","line":22,"column":59,"nodeType":"Identifier","messageId":"unusedVar","endLine":22,"endColumn":63},{"ruleId":"@typescript-eslint/no-unused-vars","severity":2,"message":"'page' is defined but never used.","line":340,"column":70,"nodeType":"Identifier","messageId":"unusedVar","endLine":340,"endColumn":74}],"suppressedMessages":[],"errorCount":3,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":"import { test, expect } from '@playwright/test';\n\n/**\n * SEED TEST FOR MEMBERS MODULE\n * \n * This test documents and optionally creates test data for the Members module.\n * \n * IMPORTANT: This is a documentation file. The actual seeding should be done\n * via Laravel seeders or database migrations before running E2E tests.\n * \n * RECOMMENDED APPROACH:\n * 1. Create a Laravel seeder: database/seeders/MembersTestSeeder.php\n * 2. Run: php artisan db:seed --class=MembersTestSeeder\n * 3. Then run E2E tests\n * \n * ALTERNATIVE: Use this test to create data via API (requires auth setup)\n */\n\ntest.describe('Members Module - Test Data Seed', () => {\n  test.skip(true, 'This is a documentation-only test. Use Laravel seeders instead.');\n\n  test('documents expected test data structure', async ({ page }) => {\n    /*\n    ============================================================================\n    EXPECTED TEST DATA STRUCTURE\n    ============================================================================\n    \n    This document describes the test data that should be seeded before running\n    the Members module E2E tests.\n    \n    ============================================================================\n    BRANCHES (4 records)\n    ============================================================================\n    Branch ID 1:\n      - code: \"01\"\n      - name: \"Kantor Pusat\"\n      - city: \"Jakarta\"\n      - is_headquarters: true\n      - is_active: true\n    \n    Branch ID 2:\n      - code: \"02\"\n      - name: \"Kantor Cabang Jakarta\"\n      - city: \"Jakarta Selatan\"\n      - is_headquarters: false\n      - is_active: true\n    \n    Branch ID 3:\n      - code: \"03\"\n      - name: \"Kantor Cabang Bandung\"\n      - city: \"Bandung\"\n      - is_headquarters: false\n      - is_active: true\n    \n    Branch ID 4:\n      - code: \"04\"\n      - name: \"Kantor Cabang Surabaya\"\n      - city: \"Surabaya\"\n      - is_headquarters: false\n      - is_active: true\n    \n    ============================================================================\n    VERIFIED MEMBERS (5 records)\n    ============================================================================\n    \n    Member 1:\n      - name: \"Budi Santoso\"\n      - id_number: \"3201010101010001\"\n      - id_type: \"KTP\"\n      - birth_date: \"1980-05-15\"\n      - gender: \"male\"\n      - phone: \"081234567890\"\n      - email: \"budi.santoso@example.com\"\n      - address: \"Jl. Merdeka No. 123, RT 01/RW 02\"\n      - province: \"DKI Jakarta\"\n      - city: \"Jakarta Pusat\"\n      - branch_id: 1\n      - is_verified: true\n      - registration_date: \"2023-01-15\"\n    \n    Member 2:\n      - name: \"Siti Rahayu\"\n      - id_number: \"3201010101010002\"\n      - id_type: \"KTP\"\n      - birth_date: \"1985-08-22\"\n      - gender: \"female\"\n      - phone: \"081234567891\"\n      - email: \"siti.rahayu@example.com\"\n      - address: \"Jl. Sudirman No. 456\"\n      - province: \"DKI Jakarta\"\n      - city: \"Jakarta Selatan\"\n      - branch_id: 2\n      - is_verified: true\n      - registration_date: \"2023-02-10\"\n    \n    Member 3:\n      - name: \"Agus Widodo\"\n      - id_number: \"3201010101010003\"\n      - id_type: \"KTP\"\n      - birth_date: \"1978-12-03\"\n      - gender: \"male\"\n      - phone: \"081234567892\"\n      - email: \"agus.widodo@example.com\"\n      - address: \"Jl. Asia Afrika No. 789\"\n      - province: \"Jawa Barat\"\n      - city: \"Bandung\"\n      - branch_id: 3\n      - is_verified: true\n      - registration_date: \"2023-03-05\"\n    \n    Member 4:\n      - name: \"Dewi Lestari\"\n      - id_number: \"3201010101010004\"\n      - id_type: \"KTP\"\n      - birth_date: \"1990-03-25\"\n      - gender: \"female\"\n      - phone: \"081234567893\"\n      - email: \"dewi.lestari@example.com\"\n      - address: \"Jl. Gatot Subroto No. 321\"\n      - province: \"DKI Jakarta\"\n      - city: \"Jakarta Pusat\"\n      - branch_id: 1\n      - is_verified: true\n      - registration_date: \"2023-04-20\"\n    \n    Member 5:\n      - name: \"Joko Susilo\"\n      - id_number: \"3201010101010005\"\n      - id_type: \"KTP\"\n      - birth_date: \"1982-09-18\"\n      - gender: \"male\"\n      - phone: \"081234567894\"\n      - email: \"joko.susilo@example.com\"\n      - address: \"Jl. Tunjungan No. 654\"\n      - province: \"Jawa Timur\"\n      - city: \"Surabaya\"\n      - branch_id: 4\n      - is_verified: true\n      - registration_date: \"2023-05-12\"\n    \n    ============================================================================\n    UNVERIFIED MEMBERS (3 records)\n    ============================================================================\n    \n    Member 6:\n      - name: \"Rina Marlina\"\n      - id_number: \"3201010101010006\"\n      - id_type: \"KTP\"\n      - birth_date: \"1995-06-30\"\n      - gender: \"female\"\n      - phone: \"081234567895\"\n      - email: \"rina.marlina@example.com\"\n      - address: \"Jl. Thamrin No. 111\"\n      - province: \"DKI Jakarta\"\n      - city: \"Jakarta Pusat\"\n      - branch_id: 1\n      - is_verified: false\n      - registration_date: \"2024-01-08\"\n    \n    Member 7:\n      - name: \"Dedi Kurniawan\"\n      - id_number: \"3201010101010007\"\n      - id_type: \"KTP\"\n      - birth_date: \"1988-11-14\"\n      - gender: \"male\"\n      - phone: \"081234567896\"\n      - email: \"dedi.kurniawan@example.com\"\n      - address: \"Jl. Fatmawati No. 222\"\n      - province: \"DKI Jakarta\"\n      - city: \"Jakarta Selatan\"\n      - branch_id: 2\n      - is_verified: false\n      - registration_date: \"2024-01-15\"\n    \n    Member 8:\n      - name: \"Maya Sari\"\n      - id_number: \"3201010101010008\"\n      - id_type: \"KTP\"\n      - birth_date: \"1992-04-08\"\n      - gender: \"female\"\n      - phone: \"081234567897\"\n      - email: \"maya.sari@example.com\"\n      - address: \"Jl. Cihampelas No. 333\"\n      - province: \"Jawa Barat\"\n      - city: \"Bandung\"\n      - branch_id: 3\n      - is_verified: false\n      - registration_date: \"2024-02-01\"\n    \n    ============================================================================\n    SUMMARY\n    ============================================================================\n    Total Branches: 4\n    Total Members: 8\n    - Verified: 5\n    - Unverified: 3\n    \n    Branch Distribution:\n    - Kantor Pusat: 3 members (2 verified, 1 unverified)\n    - Cabang Jakarta: 2 members (1 verified, 1 unverified)\n    - Cabang Bandung: 2 members (1 verified, 1 unverified)\n    - Cabang Surabaya: 1 member (1 verified, 0 unverified)\n    \n    Gender Distribution:\n    - Male: 4\n    - Female: 4\n    \n    ID Types:\n    - All KTP: 8\n    \n    ============================================================================\n    LARAVEL SEEDER EXAMPLE\n    ============================================================================\n    \n    Create this file: database/seeders/MembersTestSeeder.php\n    \n    <?php\n    \n    namespace Database\\Seeders;\n    \n    use App\\Models\\Branch;\n    use App\\Models\\Member;\n    use Illuminate\\Database\\Seeder;\n    \n    class MembersTestSeeder extends Seeder\n    {\n        public function run(): void\n        {\n            // Create branches\n            $branches = [\n                [\n                    'code' => '01',\n                    'name' => 'Kantor Pusat',\n                    'city' => 'Jakarta',\n                    'is_headquarters' => true,\n                    'is_active' => true,\n                ],\n                [\n                    'code' => '02',\n                    'name' => 'Kantor Cabang Jakarta',\n                    'city' => 'Jakarta Selatan',\n                    'is_headquarters' => false,\n                    'is_active' => true,\n                ],\n                [\n                    'code' => '03',\n                    'name' => 'Kantor Cabang Bandung',\n                    'city' => 'Bandung',\n                    'is_headquarters' => false,\n                    'is_active' => true,\n                ],\n                [\n                    'code' => '04',\n                    'name' => 'Kantor Cabang Surabaya',\n                    'city' => 'Surabaya',\n                    'is_headquarters' => false,\n                    'is_active' => true,\n                ],\n            ];\n    \n            $createdBranches = [];\n            foreach ($branches as $branch) {\n                $createdBranches[] = Branch::create($branch);\n            }\n    \n            // Create verified members\n            $verifiedMembers = [\n                [\n                    'name' => 'Budi Santoso',\n                    'id_number' => '3201010101010001',\n                    'id_type' => 'KTP',\n                    'birth_date' => '1980-05-15',\n                    'gender' => 'male',\n                    'phone' => '081234567890',\n                    'email' => 'budi.santoso@example.com',\n                    'address' => 'Jl. Merdeka No. 123, RT 01/RW 02',\n                    'province' => 'DKI Jakarta',\n                    'city' => 'Jakarta Pusat',\n                    'branch_id' => $createdBranches[0]->id,\n                    'is_verified' => true,\n                    'registration_date' => '2023-01-15',\n                ],\n                // ... add other verified members\n            ];\n    \n            foreach ($verifiedMembers as $member) {\n                Member::create($member);\n            }\n    \n            // Create unverified members\n            $unverifiedMembers = [\n                [\n                    'name' => 'Rina Marlina',\n                    'id_number' => '3201010101010006',\n                    'id_type' => 'KTP',\n                    'birth_date' => '1995-06-30',\n                    'gender' => 'female',\n                    'phone' => '081234567895',\n                    'email' => 'rina.marlina@example.com',\n                    'address' => 'Jl. Thamrin No. 111',\n                    'province' => 'DKI Jakarta',\n                    'city' => 'Jakarta Pusat',\n                    'branch_id' => $createdBranches[0]->id,\n                    'is_verified' => false,\n                    'registration_date' => '2024-01-08',\n                ],\n                // ... add other unverified members\n            ];\n    \n            foreach ($unverifiedMembers as $member) {\n                Member::create($member);\n            }\n        }\n    }\n    \n    ============================================================================\n    HOW TO USE\n    ============================================================================\n    \n    1. Create the seeder file:\n       php artisan make:seeder MembersTestSeeder\n    \n    2. Add the code above to the seeder\n    \n    3. Run the seeder:\n       php artisan db:seed --class=MembersTestSeeder\n    \n    4. Verify the data:\n       php artisan tinker\n       >>> Member::count()\n       => 8\n       >>> Branch::count()\n       => 4\n    \n    5. Run E2E tests:\n       npx playwright test e2e/members-complete.spec.ts\n    */\n  });\n\n  test('creates test data via API (if auth is configured)', async ({ page }) => {\n    /*\n    ============================================================================\n    API-BASED SEEDING (Alternative Approach)\n    ============================================================================\n    \n    If authentication is properly configured, you can create test data\n    via API endpoints during test setup.\n    \n    PREREQUISITES:\n    - Auth helper implemented in e2e/auth-helper.ts\n    - User with permissions to create members\n    - CSRF tokens properly configured\n    \n    EXAMPLE IMPLEMENTATION:\n    \n    import { loginAs } from './auth-helper';\n    \n    test.beforeEach(async ({ page, request }) => {\n      // Login as admin\n      await loginAs(page, 'admin@example.com', 'password');\n      \n      // Create test data via API\n      await request.post('/api/members', {\n        data: {\n          name: 'Test Member',\n          id_number: '3201010101019999',\n          // ... other fields\n        }\n      });\n    });\n    */\n  });\n});","usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\e2e\\seed.spec.ts","messages":[{"ruleId":"@typescript-eslint/no-unused-vars","severity":2,"message":"'expect' is defined but never used.","line":1,"column":16,"nodeType":"Identifier","messageId":"unusedVar","endLine":1,"endColumn":22,"suggestions":[{"messageId":"removeUnusedVar","data":{"varName":"expect"},"fix":{"range":[13,21],"text":""},"desc":"Remove unused variable \"expect\"."}]},{"ruleId":"@typescript-eslint/no-unused-vars","severity":2,"message":"'page' is defined but never used.","line":4,"column":25,"nodeType":"Identifier","messageId":"unusedVar","endLine":4,"endColumn":29}],"suppressedMessages":[],"errorCount":2,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":"import { test, expect } from '@playwright/test';\n\ntest.describe('Test group', () => {\n  test('seed', async ({ page }) => {\n    // generate code here.\n  });\n});\n","usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\e2e\\users.spec.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\eslint.config.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\playwright.config.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\actions\\App\\Http\\Controllers\\AccountingController.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\actions\\App\\Http\\Controllers\\Api\\RegionController.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\actions\\App\\Http\\Controllers\\Api\\index.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\actions\\App\\Http\\Controllers\\BranchController.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\actions\\App\\Http\\Controllers\\DailyCollectionController.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\actions\\App\\Http\\Controllers\\DashboardController.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\actions\\App\\Http\\Controllers\\FinancingController.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\actions\\App\\Http\\Controllers\\MemberController.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\actions\\App\\Http\\Controllers\\SavingsController.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\actions\\App\\Http\\Controllers\\Settings\\PasswordController.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\actions\\App\\Http\\Controllers\\Settings\\ProfileController.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\actions\\App\\Http\\Controllers\\Settings\\TwoFactorAuthenticationController.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\actions\\App\\Http\\Controllers\\Settings\\index.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\actions\\App\\Http\\Controllers\\UserController.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\actions\\App\\Http\\Controllers\\index.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\actions\\App\\Http\\index.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\actions\\App\\index.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\actions\\Fruitcake\\LaravelDebugbar\\Controllers\\AssetController.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\actions\\Fruitcake\\LaravelDebugbar\\Controllers\\CacheController.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\actions\\Fruitcake\\LaravelDebugbar\\Controllers\\OpenHandlerController.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\actions\\Fruitcake\\LaravelDebugbar\\Controllers\\QueriesController.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\actions\\Fruitcake\\LaravelDebugbar\\Controllers\\index.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\actions\\Fruitcake\\LaravelDebugbar\\index.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\actions\\Fruitcake\\index.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\actions\\Illuminate\\Routing\\RedirectController.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\actions\\Illuminate\\Routing\\index.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\actions\\Illuminate\\index.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\actions\\Laravel\\Fortify\\Http\\Controllers\\AuthenticatedSessionController.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\actions\\Laravel\\Fortify\\Http\\Controllers\\ConfirmablePasswordController.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\actions\\Laravel\\Fortify\\Http\\Controllers\\ConfirmedPasswordStatusController.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\actions\\Laravel\\Fortify\\Http\\Controllers\\ConfirmedTwoFactorAuthenticationController.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\actions\\Laravel\\Fortify\\Http\\Controllers\\EmailVerificationNotificationController.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\actions\\Laravel\\Fortify\\Http\\Controllers\\EmailVerificationPromptController.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\actions\\Laravel\\Fortify\\Http\\Controllers\\NewPasswordController.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\actions\\Laravel\\Fortify\\Http\\Controllers\\PasswordResetLinkController.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\actions\\Laravel\\Fortify\\Http\\Controllers\\RecoveryCodeController.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\actions\\Laravel\\Fortify\\Http\\Controllers\\RegisteredUserController.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\actions\\Laravel\\Fortify\\Http\\Controllers\\TwoFactorAuthenticatedSessionController.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\actions\\Laravel\\Fortify\\Http\\Controllers\\TwoFactorAuthenticationController.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\actions\\Laravel\\Fortify\\Http\\Controllers\\TwoFactorQrCodeController.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\actions\\Laravel\\Fortify\\Http\\Controllers\\TwoFactorSecretKeyController.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\actions\\Laravel\\Fortify\\Http\\Controllers\\VerifyEmailController.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\actions\\Laravel\\Fortify\\Http\\Controllers\\index.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\actions\\Laravel\\Fortify\\Http\\index.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\actions\\Laravel\\Fortify\\index.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\actions\\Laravel\\index.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\app.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\components\\alert-error.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\components\\app-content.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\components\\app-header.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\components\\app-logo-icon.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\components\\app-logo.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\components\\app-shell.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\components\\app-sidebar-header.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\components\\app-sidebar.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\components\\appearance-tabs.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\components\\breadcrumbs.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\components\\delete-user.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\components\\heading.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\components\\input-error.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\components\\members\\MemberSelector.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\components\\nav-footer.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\components\\nav-main.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\components\\nav-user.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\components\\text-link.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\components\\two-factor-recovery-codes.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\components\\two-factor-setup-modal.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\components\\ui\\__tests__\\data-table.test.tsx","messages":[{"ruleId":"@typescript-eslint/no-explicit-any","severity":2,"message":"Unexpected any. Specify a different type.","line":16,"column":23,"nodeType":"TSAnyKeyword","messageId":"unexpectedAny","endLine":16,"endColumn":26,"suggestions":[{"messageId":"suggestUnknown","fix":{"range":[350,353],"text":"unknown"},"desc":"Use `unknown` instead, this will force you to explicitly, and safely assert the type is correct."},{"messageId":"suggestNever","fix":{"range":[350,353],"text":"never"},"desc":"Use `never` instead, this is useful when instantiating generic type parameters that you don't need to know the type of."}]},{"ruleId":"@typescript-eslint/no-explicit-any","severity":2,"message":"Unexpected any. Specify a different type.","line":21,"column":23,"nodeType":"TSAnyKeyword","messageId":"unexpectedAny","endLine":21,"endColumn":26,"suggestions":[{"messageId":"suggestUnknown","fix":{"range":[462,465],"text":"unknown"},"desc":"Use `unknown` instead, this will force you to explicitly, and safely assert the type is correct."},{"messageId":"suggestNever","fix":{"range":[462,465],"text":"never"},"desc":"Use `never` instead, this is useful when instantiating generic type parameters that you don't need to know the type of."}]},{"ruleId":"@typescript-eslint/no-explicit-any","severity":2,"message":"Unexpected any. Specify a different type.","line":26,"column":23,"nodeType":"TSAnyKeyword","messageId":"unexpectedAny","endLine":26,"endColumn":26,"suggestions":[{"messageId":"suggestUnknown","fix":{"range":[578,581],"text":"unknown"},"desc":"Use `unknown` instead, this will force you to explicitly, and safely assert the type is correct."},{"messageId":"suggestNever","fix":{"range":[578,581],"text":"never"},"desc":"Use `never` instead, this is useful when instantiating generic type parameters that you don't need to know the type of."}]},{"ruleId":"@typescript-eslint/no-explicit-any","severity":2,"message":"Unexpected any. Specify a different type.","line":28,"column":8,"nodeType":"TSAnyKeyword","messageId":"unexpectedAny","endLine":28,"endColumn":11,"suggestions":[{"messageId":"suggestUnknown","fix":{"range":[623,626],"text":"unknown"},"desc":"Use `unknown` instead, this will force you to explicitly, and safely assert the type is correct."},{"messageId":"suggestNever","fix":{"range":[623,626],"text":"never"},"desc":"Use `never` instead, this is useful when instantiating generic type parameters that you don't need to know the type of."}]}],"suppressedMessages":[],"errorCount":4,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":"import { render, screen } from '@testing-library/react';\nimport { describe, it, expect, vi } from 'vitest';\nimport { DataTable } from '../data-table';\n\ninterface TestData {\n  id: number;\n  name: string;\n  email: string;\n}\n\ndescribe('DataTable', () => {\n  const mockColumns = [\n    {\n      accessorKey: 'id',\n      header: 'ID',\n      cell: ({ row }: any) => row.getValue('id'),\n    },\n    {\n      accessorKey: 'name',\n      header: 'Name',\n      cell: ({ row }: any) => row.getValue('name'),\n    },\n    {\n      accessorKey: 'email',\n      header: 'Email',\n      cell: ({ row }: any) => row.getValue('email'),\n    },\n  ] as any;\n\n  const mockData: TestData[] = [\n    { id: 1, name: 'John Doe', email: 'john@example.com' },\n    { id: 2, name: 'Jane Smith', email: 'jane@example.com' },\n    { id: 3, name: 'Bob Johnson', email: 'bob@example.com' },\n  ];\n\n  it('renders table with data', () => {\n    render(<DataTable columns={mockColumns} data={mockData} />);\n\n    // Check headers\n    expect(screen.getByText('ID')).toBeInTheDocument();\n    expect(screen.getByText('Name')).toBeInTheDocument();\n    expect(screen.getByText('Email')).toBeInTheDocument();\n\n    // Check data rows\n    expect(screen.getByText('John Doe')).toBeInTheDocument();\n    expect(screen.getByText('Jane Smith')).toBeInTheDocument();\n    expect(screen.getByText('Bob Johnson')).toBeInTheDocument();\n  });\n\n  it('renders empty state when no data', () => {\n    render(<DataTable columns={mockColumns} data={[]} />);\n\n    expect(screen.getByText('Tidak ada data yang ditampilkan')).toBeInTheDocument();\n  });\n\n  it('shows data count footer when pagination is provided', () => {\n    const mockPagination = {\n      currentPage: 1,\n      lastPage: 3,\n      onNext: vi.fn(),\n      onPrev: vi.fn(),\n    };\n\n    render(<DataTable columns={mockColumns} data={mockData} pagination={mockPagination} />);\n\n    expect(screen.getByText('3 data ditampilkan')).toBeInTheDocument();\n  });\n\n  it('does not show footer when pagination is not provided', () => {\n    render(<DataTable columns={mockColumns} data={mockData} />);\n\n    expect(screen.queryByText('3 data ditampilkan')).not.toBeInTheDocument();\n  });\n\n  it('displays loading skeleton when isLoading is true', () => {\n    const { container } = render(\n      <DataTable columns={mockColumns} data={mockData} isLoading={true} />\n    );\n\n    // Check for skeleton elements (animate-pulse class)\n    const skeletons = container.querySelectorAll('.animate-pulse');\n    expect(skeletons.length).toBeGreaterThan(0);\n  });\n\n  it('does not display skeleton when isLoading is false', () => {\n    const { container } = render(\n      <DataTable columns={mockColumns} data={mockData} isLoading={false} />\n    );\n\n    // Should have table, not just skeletons\n    const table = container.querySelector('table');\n    expect(table).toBeInTheDocument();\n  });\n});\n","usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\components\\ui\\__tests__\\status-badge.test.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\components\\ui\\alert.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\components\\ui\\avatar.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\components\\ui\\badge.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\components\\ui\\breadcrumb.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\components\\ui\\button.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\components\\ui\\card.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\components\\ui\\checkbox.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\components\\ui\\collapsible.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\components\\ui\\command.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\components\\ui\\confirm-dialog.tsx","messages":[{"ruleId":"react-hooks/set-state-in-effect","severity":2,"message":"Error: Calling setState synchronously within an effect can trigger cascading renders\n\nEffects are intended to synchronize state between React and external systems such as manually updating the DOM, state management libraries, or other platform APIs. In general, the body of an effect should do one or both of the following:\n* Update external systems with the latest state from React.\n* Subscribe for updates from some external system, calling setState in a callback function when external state changes.\n\nCalling setState synchronously within an effect body causes cascading renders that can hurt performance, and is not recommended. (https://react.dev/learn/you-might-not-need-an-effect).\n\nD:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\components\\ui\\confirm-dialog.tsx:49:13\n  47 |     useEffect(() => {\n  48 |         if (open) {\n> 49 |             setInputValue(initialInputValue);\n     |             ^^^^^^^^^^^^^ Avoid calling setState() directly within an effect\n  50 |         }\n  51 |     }, [open, initialInputValue]);\n  52 |","line":49,"column":13,"nodeType":null,"endLine":49,"endColumn":26}],"suppressedMessages":[],"errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":"import { useState, useEffect } from 'react';\nimport { Button } from '@/components/ui/button';\nimport {\n    Dialog,\n    DialogContent,\n    DialogDescription,\n    DialogFooter,\n    DialogHeader,\n    DialogTitle,\n} from '@/components/ui/dialog';\nimport { Input } from '@/components/ui/input';\nimport { Label } from '@/components/ui/label';\n\ninterface ConfirmDialogProps {\n    open: boolean;\n    onOpenChange: (open: boolean) => void;\n    title: string;\n    description: string;\n    confirmText?: string;\n    cancelText?: string;\n    onConfirm: (inputValue?: string) => void;\n    variant?: 'default' | 'destructive';\n    isLoading?: boolean;\n    requireInput?: boolean;\n    inputLabel?: string;\n    inputPlaceholder?: string;\n    inputValue?: string;\n}\n\nexport function ConfirmDialog({\n    open,\n    onOpenChange,\n    title,\n    description,\n    confirmText = 'Konfirmasi',\n    cancelText = 'Batal',\n    onConfirm,\n    variant = 'destructive',\n    isLoading = false,\n    requireInput = false,\n    inputLabel,\n    inputPlaceholder,\n    inputValue: initialInputValue = '',\n}: ConfirmDialogProps) {\n    const [inputValue, setInputValue] = useState(initialInputValue);\n\n    useEffect(() => {\n        if (open) {\n            setInputValue(initialInputValue);\n        }\n    }, [open, initialInputValue]);\n\n    const handleConfirm = () => {\n        onConfirm(inputValue);\n    };\n\n    return (\n        <Dialog open={open} onOpenChange={onOpenChange}>\n            <DialogContent className=\"sm:max-w-[425px]\">\n                <DialogHeader>\n                    <DialogTitle>{title}</DialogTitle>\n                    <DialogDescription>{description}</DialogDescription>\n                </DialogHeader>\n                {requireInput && (\n                    <div className=\"grid gap-4 py-4\">\n                        <div className=\"grid gap-2\">\n                            {inputLabel && <Label htmlFor=\"confirm-input\">{inputLabel}</Label>}\n                            <Input\n                                id=\"confirm-input\"\n                                value={inputValue}\n                                onChange={(e) => setInputValue(e.target.value)}\n                                placeholder={inputPlaceholder}\n                                autoFocus\n                            />\n                        </div>\n                    </div>\n                )}\n                <DialogFooter className=\"flex flex-row gap-2\">\n                    <Button\n                        type=\"button\"\n                        variant=\"outline\"\n                        onClick={() => onOpenChange(false)}\n                        disabled={isLoading}\n                    >\n                        {cancelText}\n                    </Button>\n                    <Button\n                        type=\"button\"\n                        variant={variant}\n                        onClick={handleConfirm}\n                        disabled={isLoading || (requireInput && !inputValue.trim())}\n                    >\n                        {confirmText}\n                    </Button>\n                </DialogFooter>\n            </DialogContent>\n        </Dialog>\n    );\n}\n","usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\components\\ui\\currency-input.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\components\\ui\\data-table.tsx","messages":[{"ruleId":"react-hooks/incompatible-library","severity":1,"message":"Compilation Skipped: Use of incompatible library\n\nThis API returns functions which cannot be memoized without leading to stale UI. To prevent this, by default React Compiler will skip memoizing this component/hook. However, you may see issues if values from this API are passed to other components/hooks that are memoized.\n\nD:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\components\\ui\\data-table.tsx:49:17\n  47 |   const [sorting, setSorting] = React.useState<SortingState>([])\n  48 |\n> 49 |   const table = useReactTable({\n     |                 ^^^^^^^^^^^^^ TanStack Table's `useReactTable()` API returns functions that cannot be memoized safely\n  50 |     data,\n  51 |     columns,\n  52 |     getCoreRowModel: getCoreRowModel(),","line":49,"column":17,"nodeType":null,"endLine":49,"endColumn":30}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"import type {\n  ColumnDef\n} from '@tanstack/react-table';\nimport {\n\n  flexRender,\n  getCoreRowModel,\n  useReactTable,\n  type SortingState,\n  getSortedRowModel,\n  getPaginationRowModel\n} from '@tanstack/react-table'\n\nimport * as React from 'react'\n\nimport {\n  Table,\n  TableBody,\n  TableCell,\n  TableHead,\n  TableHeader,\n  TableRow,\n} from '@/components/ui/table'\nimport { cn } from '@/lib/utils'\nimport { Button } from './button'\n\ninterface DataTableProps<TData, TValue> {\n  columns: ColumnDef<TData, TValue>[]\n  data: TData[]\n  isLoading?: boolean\n  pagination?: {\n    currentPage: number\n    lastPage: number\n    onNext: () => void\n    onPrev: () => void\n  }\n  className?: string\n}\n\nexport function DataTable<TData, TValue>({\n  columns,\n  data,\n  isLoading = false,\n  pagination,\n  className,\n}: DataTableProps<TData, TValue>) {\n  const [sorting, setSorting] = React.useState<SortingState>([])\n\n  const table = useReactTable({\n    data,\n    columns,\n    getCoreRowModel: getCoreRowModel(),\n    onSortingChange: setSorting,\n    getSortedRowModel: getSortedRowModel(),\n    getPaginationRowModel: getPaginationRowModel(),\n    state: {\n      sorting,\n    },\n  })\n\n  if (isLoading) {\n    return (\n      <div className={cn('w-full', className)}>\n        <div className=\"flex w-full flex-col space-y-3\">\n          <div className=\"space-y-2\">\n            <div className=\"h-10 w-full animate-pulse rounded bg-muted\" />\n            {Array.from({ length: 5 }).map((_, i) => (\n              <div\n                key={i}\n                className=\"h-16 w-full animate-pulse rounded bg-muted\"\n              />\n            ))}\n          </div>\n        </div>\n      </div>\n    )\n  }\n\n  if (!data || data.length === 0) {\n    return (\n      <div className={cn('flex flex-col items-center justify-center py-12', className)}>\n        <div className=\"text-center\">\n          <p className=\"text-sm text-muted-foreground\">\n            Tidak ada data yang ditampilkan\n          </p>\n        </div>\n      </div>\n    )\n  }\n\n  return (\n    <div className={cn('space-y-4', className)}>\n      <div className=\"rounded-md border bg-card\">\n        <Table>\n          <TableHeader>\n            {table.getHeaderGroups().map((headerGroup) => (\n              <TableRow key={headerGroup.id}>\n                {headerGroup.headers.map((header) => {\n                  return (\n                    <TableHead key={header.id} className='text-center'>\n                      {header.isPlaceholder\n                        ? null\n                        : flexRender(\n                          header.column.columnDef.header,\n                          header.getContext()\n                        )}\n                    </TableHead>\n                  )\n                })}\n              </TableRow>\n            ))}\n          </TableHeader>\n          <TableBody className='text-center'>\n            {table.getRowModel().rows?.length ? (\n              table.getRowModel().rows.map((row) => (\n                <TableRow\n                  key={row.id}\n                  data-state={row.getIsSelected() && 'selected'}\n                >\n                  {row.getVisibleCells().map((cell) => (\n                    <TableCell key={cell.id}>\n                      {flexRender(\n                        cell.column.columnDef.cell,\n                        cell.getContext()\n                      )}\n                    </TableCell>\n                  ))}\n                </TableRow>\n              ))\n            ) : null}\n          </TableBody>\n        </Table>\n      </div>\n\n      {pagination && (\n        <div className=\"flex items-center justify-between\">\n          <div className=\"flex-1 text-sm text-muted-foreground\">\n            {data.length} data ditampilkan\n          </div>\n          <div className=\"flex items-center justify-end gap-2 py-2\">\n            <Button\n              variant=\"outline\"\n              size=\"sm\"\n              onClick={() => table.previousPage()}\n              disabled={!table.getCanPreviousPage()}\n            >\n              Previous\n            </Button>\n            <Button\n              variant=\"outline\"\n              size=\"sm\"\n              onClick={() => table.nextPage()}\n              disabled={!table.getCanNextPage()}\n            >\n              Next\n            </Button>\n          </div>\n        </div>\n      )}\n    </div>\n  )\n}\n","usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\components\\ui\\dialog.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\components\\ui\\dropdown-menu.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\components\\ui\\icon.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\components\\ui\\input-group.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\components\\ui\\input-otp.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\components\\ui\\input.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\components\\ui\\label.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\components\\ui\\masked-input.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\components\\ui\\navigation-menu.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\components\\ui\\pagination.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\components\\ui\\placeholder-pattern.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\components\\ui\\popover.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\components\\ui\\searchable-select.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\components\\ui\\select.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\components\\ui\\separator.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\components\\ui\\sheet.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\components\\ui\\sidebar.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\components\\ui\\skeleton.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\components\\ui\\sonner.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\components\\ui\\spinner.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\components\\ui\\status-badge.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\components\\ui\\table.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\components\\ui\\textarea.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\components\\ui\\toggle-group.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\components\\ui\\toggle.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\components\\ui\\tooltip.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\components\\user-info.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\components\\user-menu-content.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\hooks\\use-appearance.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\hooks\\use-clipboard.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\hooks\\use-current-url.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\hooks\\use-initials.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\hooks\\use-mobile-navigation.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\hooks\\use-mobile.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\hooks\\use-permissions.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\hooks\\use-two-factor-auth.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\layouts\\app-layout.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\layouts\\app\\app-header-layout.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\layouts\\app\\app-sidebar-layout.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\layouts\\auth-layout.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\layouts\\auth\\auth-card-layout.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\layouts\\auth\\auth-simple-layout.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\layouts\\auth\\auth-split-layout.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\layouts\\settings\\layout.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\lib\\exportToCSV.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\lib\\formatters.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\lib\\helpers\\financing.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\lib\\hooks\\useBack.ts","messages":[{"ruleId":"@typescript-eslint/no-unused-vars","severity":2,"message":"'router' is defined but never used.","line":1,"column":10,"nodeType":"Identifier","messageId":"unusedVar","endLine":1,"endColumn":16,"suggestions":[{"messageId":"removeUnusedImportDeclaration","data":{"varName":"router"},"fix":{"range":[0,43],"text":""},"desc":"Remove unused import declaration."}]}],"suppressedMessages":[],"errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":"import { router } from '@inertiajs/react';\n\n/**\n * Returns a `handleBack` function that navigates to the previous page.\n *\n * Uses Inertia's router to go back so the browser history integrates\n * cleanly with Inertia's visit history. Falls back to `window.history.back()`\n * when there is no previous Inertia page (e.g. direct URL access).\n */\nexport function useBack() {\n    const handleBack = () => {\n\n        window.history.back();\n\n    };\n    // const handleBack = () => {\n    //     if (window.history.length > 1) {\n    //         router.visit(document.referrer || window.history.state?.url || '/', {\n    //             preserveState: false,\n    //         });\n    //     } else {\n    //         window.history.back();\n    //     }\n    // };\n\n    return { handleBack };\n}\n","usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\lib\\hooks\\useFilterParams.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\lib\\toast.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\lib\\utils.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\pages\\Accounting\\AccountsIndex.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\pages\\Accounting\\BalanceSheet.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\pages\\Accounting\\CreateAccount.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\pages\\Accounting\\CreateJournal.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\pages\\Accounting\\EditAccount.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\pages\\Accounting\\IncomeStatement.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\pages\\Accounting\\JournalIndex.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\pages\\Accounting\\ShowAccount.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\pages\\Accounting\\ShowJournal.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\pages\\Accounting\\TrialBalance.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\pages\\Branches\\Create.tsx","messages":[{"ruleId":"@typescript-eslint/no-unused-vars","severity":2,"message":"'form' is assigned a value but never used.","line":4,"column":9,"nodeType":"Identifier","messageId":"unusedVar","endLine":4,"endColumn":13}],"suppressedMessages":[],"errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":"import { useForm } from '@inertiajs/react'\n\nexport default function BranchesCreate() {\n  const form = useForm({})\n\n  return (\n    <div>\n      <h1>Create Branch</h1>\n      <form>Placeholder</form>\n    </div>\n  )\n}\n","usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\pages\\Branches\\Edit.tsx","messages":[{"ruleId":"@typescript-eslint/no-unused-vars","severity":2,"message":"'form' is assigned a value but never used.","line":4,"column":9,"nodeType":"Identifier","messageId":"unusedVar","endLine":4,"endColumn":13}],"suppressedMessages":[],"errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":"import { useForm } from '@inertiajs/react'\n\nexport default function BranchesEdit({ branch }) {\n  const form = useForm({})\n\n  return (\n    <div>\n      <h1>Edit Branch {branch.name}</h1>\n      <form>Placeholder</form>\n    </div>\n  )\n}\n","usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\pages\\Branches\\Index.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\pages\\Branches\\Show.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\pages\\DailyCollection\\CollectorTasks.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\pages\\DailyCollection\\Index.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\pages\\DailyCollection\\Performance.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\pages\\DailyCollection\\TellerInput.tsx","messages":[],"suppressedMessages":[{"ruleId":"react-hooks/exhaustive-deps","severity":1,"message":"React Hook useEffect has missing dependencies: 'date', 'filters.search', and 'navigate'. Either include them or remove the dependency array.","line":84,"column":8,"nodeType":"ArrayExpression","endLine":84,"endColumn":16,"suggestions":[{"desc":"Update the dependencies array to be: [date, filters.search, navigate, search]","fix":{"range":[2559,2567],"text":"[date, filters.search, navigate, search]"}}],"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\pages\\Financings\\Components\\ApprovalModal.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\pages\\Financings\\Components\\RejectModal.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\pages\\Financings\\Create.tsx","messages":[{"ruleId":"react-hooks/rules-of-hooks","severity":2,"message":"React Hook \"useBack\" is called conditionally. React Hooks must be called in the exact same order in every component render.","line":119,"column":28,"nodeType":"Identifier","endLine":119,"endColumn":35}],"suppressedMessages":[],"errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":"import { Head, Link, useForm } from '@inertiajs/react';\nimport { AlertCircle, ArrowLeft, Calculator, User } from 'lucide-react';\nimport { useMemo, useState } from 'react';\n\nimport InputError from '@/components/input-error';\nimport {\n    MemberSelector,\n    type MemberSearchResult,\n} from '@/components/members/MemberSelector';\nimport { Button } from '@/components/ui/button';\nimport { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';\nimport { CurrencyInput } from '@/components/ui/currency-input';\nimport { Label } from '@/components/ui/label';\nimport {\n    Select,\n    SelectContent,\n    SelectGroup,\n    SelectItem,\n    SelectLabel,\n    SelectTrigger,\n    SelectValue,\n} from '@/components/ui/select';\nimport { StatusBadge } from '@/components/ui/status-badge';\nimport { Textarea } from '@/components/ui/textarea';\nimport AppLayout from '@/layouts/app-layout';\nimport { formatIDR } from '@/lib/formatters';\nimport { calculateFinancing } from '@/lib/helpers/financing';\nimport { useBack } from '@/lib/hooks/useBack';\nimport { toastError, toastLoading, toastSuccess } from '@/lib/toast';\nimport financingsRoutes from '@/routes/financing';\nimport membersRoutes from '@/routes/members';\nimport type { BreadcrumbItem } from '@/types';\nimport type { FinancingProduct } from '@/types/financing';\n\ninterface PageProps {\n    products: FinancingProduct[];\n    collectors?: { id: number; name: string }[];\n    auth: {\n        user: {\n            role: string;\n        };\n    };\n}\n\nconst breadcrumbs: BreadcrumbItem[] = [\n    {\n        title: 'Pembiayaan',\n        href: financingsRoutes.index().url,\n    },\n    {\n        title: 'Ajukan Pembiayaan',\n        href: '',\n    },\n];\n\nexport default function Create({ products, collectors = [], auth }: PageProps) {\n    const isAdmin = auth.user.role === 'Administrator';\n    const isManager = auth.user.role === 'Manager' || isAdmin;\n    const isTeller = auth.user.role === 'Teller' || isManager;\n    const [selectedMember, setSelectedMember] =\n        useState<MemberSearchResult | null>(null);\n    const form = useForm({\n        member_id: '',\n        branch_id: '',\n        financing_product_id: '',\n        requested_amount: '',\n        purpose: '',\n        collector_id: '',\n        notes: '',\n    });\n\n    // Real-time calculation\n    const calculation = useMemo(() => {\n        return calculateFinancing(\n            form.data.financing_product_id,\n            form.data.requested_amount,\n            products,\n        );\n    }, [form.data.financing_product_id, form.data.requested_amount, products]);\n\n    if (!isTeller) {\n        return (\n            <AppLayout breadcrumbs={breadcrumbs}>\n                <Head title=\"Akses Ditolak\" />\n                <div className=\"flex h-full items-center justify-center\">\n                    <Card className=\"max-w-md\">\n                        <CardHeader>\n                            <CardTitle className=\"text-destructive\">\n                                Akses Ditolak\n                            </CardTitle>\n                        </CardHeader>\n                        <CardContent>\n                            <p>\n                                Anda tidak memiliki izin untuk mengajukan\n                                pembiayaan.\n                            </p>\n                        </CardContent>\n                    </Card>\n                </div>\n            </AppLayout>\n        );\n    }\n\n    const handleMemberChange = (\n        memberId: number | null,\n        memberData?: MemberSearchResult,\n    ) => {\n        if (memberId && memberData) {\n            setSelectedMember(memberData);\n            form.setData('member_id', memberId.toString());\n            form.setData('branch_id', memberData.branch_id.toString());\n        } else {\n            setSelectedMember(null);\n            form.setData('member_id', '');\n            form.setData('branch_id', '');\n        }\n    };\n\n    const { handleBack } = useBack();\n\n    const handleSubmit = (e: { preventDefault: () => void }) => {\n        e.preventDefault();\n\n        // Check if member is selected\n        if (!selectedMember) {\n            toastError('Silakan pilih anggota terlebih dahulu.');\n            return;\n        }\n\n        // Check if member has a branch assigned\n        if (!selectedMember.branch_id) {\n            toastError(\n                'Anggota ini belum memiliki cabang. Silakan hubungi administrator untuk menetapkan cabang anggota.',\n            );\n            return;\n        }\n\n        // Check if member already has active/pending financing\n        if (selectedMember.active_financings_count > 0) {\n            toastError(\n                'Anggota ini sudah memiliki pembiayaan aktif. Harap selesaikan pembiayaan yang ada terlebih dahulu.',\n            );\n            return;\n        }\n\n        // Validate calculation\n        if (calculation && !calculation.valid) {\n            toastError(calculation.error || 'Perhitungan tidak valid');\n            return;\n        }\n\n        const submitUrl = financingsRoutes.store().url;\n\n        form.post(submitUrl, {\n            onStart: () => {\n                toastLoading('Mengajukan pembiayaan...');\n            },\n            onSuccess: () => {\n                toastSuccess('Pembiayaan berhasil diajukan');\n            },\n            onError: () => {\n                toastError('Gagal mengajukan pembiayaan');\n            },\n        });\n    };\n\n    return (\n        <AppLayout breadcrumbs={breadcrumbs}>\n            <Head title=\"Ajukan Pembiayaan\" />\n\n            <div className=\"flex h-full flex-1 flex-col gap-4 rounded-xl p-4\">\n                {/* Header */}\n                <div className=\"flex items-center gap-4\">\n                    <Button variant=\"outline\" size=\"icon\" onClick={handleBack}>\n                        <ArrowLeft className=\"h-4 w-4\" />\n                    </Button>\n                    <div className=\"flex flex-col gap-1\">\n                        <h1 className=\"text-2xl font-black\">\n                            Ajukan Pembiayaan Baru\n                        </h1>\n                        <span className=\"text-sm text-muted-foreground\">\n                            Isi formulir di bawah untuk mengajukan pembiayaan\n                            baru.\n                        </span>\n                    </div>\n                </div>\n\n                <div className=\"grid gap-6 lg:grid-cols-3\">\n                    {/* Form Column */}\n                    <div className=\"lg:col-span-2\">\n                        <form onSubmit={handleSubmit} className=\"space-y-6\">\n                            {/* Member Selection Card (when no member selected) */}\n                            {!selectedMember && (\n                                <Card>\n                                    <CardHeader>\n                                        <CardTitle className=\"flex items-center gap-2\">\n                                            <User className=\"h-5 w-5\" />\n                                            Pilih Anggota\n                                        </CardTitle>\n                                    </CardHeader>\n                                    <CardContent>\n                                        <p className=\"mb-4 text-sm text-muted-foreground\">\n                                            Cari anggota untuk mengajukan\n                                            pembiayaan\n                                        </p>\n                                        <MemberSelector\n                                            value={null}\n                                            onChange={handleMemberChange}\n                                            error={form.errors.member_id}\n                                        />\n                                    </CardContent>\n                                </Card>\n                            )}\n\n                            {/* Member Info Card (when member selected) */}\n                            {selectedMember && (\n                                <Card>\n                                    <CardHeader>\n                                        <CardTitle>Informasi Anggota</CardTitle>\n                                    </CardHeader>\n                                    <CardContent className=\"space-y-3\">\n                                        <div className=\"flex justify-between\">\n                                            <span className=\"text-muted-foreground\">\n                                                Nama\n                                            </span>\n                                            <Link\n                                                href={\n                                                    membersRoutes.show({\n                                                        member: selectedMember.id,\n                                                    }).url\n                                                }\n                                                className=\"font-medium text-primary hover:underline\"\n                                            >\n                                                {selectedMember.name}\n                                            </Link>\n                                        </div>\n                                        <div className=\"flex justify-between\">\n                                            <span className=\"text-muted-foreground\">\n                                                NIK\n                                            </span>\n                                            <span className=\"font-medium\">\n                                                {selectedMember.id_number ||\n                                                    '-'}\n                                            </span>\n                                        </div>\n                                        <div className=\"flex justify-between\">\n                                            <span className=\"text-muted-foreground\">\n                                                Telepon\n                                            </span>\n                                            <span>\n                                                {selectedMember.phone || '-'}\n                                            </span>\n                                        </div>\n                                        {selectedMember.branch && (\n                                            <div className=\"flex justify-between\">\n                                                <span className=\"text-muted-foreground\">\n                                                    Cabang\n                                                </span>\n                                                <span className=\"font-medium\">\n                                                    {selectedMember.branch}\n                                                </span>\n                                            </div>\n                                        )}\n                                        {selectedMember.collectibility_score !=\n                                            null && (\n                                                <div className=\"flex justify-between\">\n                                                    <span className=\"text-muted-foreground\">\n                                                        Kolektibilitas\n                                                    </span>\n                                                    <StatusBadge\n                                                        type=\"collectibility\"\n                                                        status={selectedMember.collectibility_score.toString()}\n                                                    />\n                                                </div>\n                                            )}\n                                        {selectedMember.active_financings_count >\n                                            0 && (\n                                                <div className=\"flex gap-3 rounded-lg bg-destructive/10 p-3\">\n                                                    <AlertCircle className=\"h-5 w-5 shrink-0 text-destructive\" />\n                                                    <div>\n                                                        <div className=\"font-medium text-destructive\">\n                                                            Pembiayaan Aktif Ada\n                                                        </div>\n                                                        <div className=\"text-sm text-muted-foreground\">\n                                                            Anggota ini memiliki{' '}\n                                                            {\n                                                                selectedMember.active_financings_count\n                                                            }{' '}\n                                                            pembiayaan aktif. Tidak\n                                                            dapat mengajukan\n                                                            pembiayaan baru.\n                                                        </div>\n                                                    </div>\n                                                </div>\n                                            )}\n                                        <div className=\"pt-2\">\n                                            <Button\n                                                type=\"button\"\n                                                variant=\"outline\"\n                                                size=\"sm\"\n                                                onClick={() => {\n                                                    setSelectedMember(null);\n                                                    form.setData(\n                                                        'member_id',\n                                                        '',\n                                                    );\n                                                    // form.setData('branch_id', '');\n                                                }}\n                                            >\n                                                Ganti Anggota\n                                            </Button>\n                                        </div>\n                                    </CardContent>\n                                </Card>\n                            )}\n\n                            {/* Financing Details Form */}\n                            <Card>\n                                <CardHeader>\n                                    <CardTitle>Detail Pembiayaan</CardTitle>\n                                </CardHeader>\n                                <CardContent className=\"space-y-4\">\n                                    {!selectedMember && (\n                                        <div className=\"rounded-lg bg-muted p-8 text-center text-muted-foreground\">\n                                            <User className=\"mx-auto mb-2 h-12 w-12 opacity-50\" />\n                                            <p>\n                                                Silakan pilih anggota terlebih\n                                                dahulu\n                                            </p>\n                                        </div>\n                                    )}\n                                    {selectedMember && (\n                                        <>\n                                            {/* Financing Product */}\n                                            <div className=\"space-y-2\">\n                                                <Label htmlFor=\"financing_product_id\">\n                                                    Produk Pembiayaan{' '}\n                                                    <span className=\"text-destructive\">\n                                                        *\n                                                    </span>\n                                                </Label>\n                                                <Select\n                                                    value={\n                                                        form.data\n                                                            .financing_product_id\n                                                    }\n                                                    onValueChange={(value) =>\n                                                        form.setData(\n                                                            'financing_product_id',\n                                                            value,\n                                                        )\n                                                    }\n                                                    required\n                                                >\n                                                    <SelectTrigger>\n                                                        <SelectValue placeholder=\"Pilih produk pembiayaan\" />\n                                                    </SelectTrigger>\n                                                    <SelectContent>\n                                                        <SelectGroup>\n                                                            <SelectLabel>\n                                                                Produk Tersedia\n                                                            </SelectLabel>\n                                                            {products\n                                                                .filter(\n                                                                    (p) =>\n                                                                        p.is_active,\n                                                                )\n                                                                .map(\n                                                                    (\n                                                                        product,\n                                                                    ) => (\n                                                                        <SelectItem\n                                                                            key={\n                                                                                product.id\n                                                                            }\n                                                                            value={product.id.toString()}\n                                                                        >\n                                                                            {\n                                                                                product.code\n                                                                            }{' '}\n                                                                            -{' '}\n                                                                            {\n                                                                                product.name\n                                                                            }{' '}\n                                                                            (\n                                                                            {\n                                                                                product.margin_rate\n                                                                            }\n                                                                            %)\n                                                                        </SelectItem>\n                                                                    ),\n                                                                )}\n                                                        </SelectGroup>\n                                                    </SelectContent>\n                                                </Select>\n                                                {form.errors\n                                                    .financing_product_id && (\n                                                        <InputError\n                                                            message={\n                                                                form.errors\n                                                                    .financing_product_id\n                                                            }\n                                                        />\n                                                    )}\n                                            </div>\n\n                                            {/* Requested Amount */}\n                                            <div className=\"space-y-2\">\n                                                <Label htmlFor=\"requested_amount\">\n                                                    Jumlah Pengajuan{' '}\n                                                    <span className=\"text-destructive\">\n                                                        *\n                                                    </span>\n                                                </Label>\n\n                                                <CurrencyInput\n                                                    id=\"requested_amount\"\n                                                    prefix=\"Rp \"\n                                                    thousandSeparator=\".\"\n                                                    placeholder=\"Rp 0\"\n                                                    value={\n                                                        form.data\n                                                            .requested_amount\n                                                    }\n                                                    onValueChange={(values) => {\n                                                        form.setData(\n                                                            'requested_amount',\n                                                            values.floatValue\n                                                                ? values.floatValue.toString()\n                                                                : '',\n                                                        );\n                                                    }}\n                                                    required\n                                                />\n\n                                                {/* Quick Amount Selection */}\n                                                <div className=\"flex flex-wrap gap-2 pt-1\">\n                                                    {[\n                                                        1000000, 2000000,\n                                                        3000000, 5000000,\n                                                        10000000,\n                                                    ].map((amount) => (\n                                                        <Button\n                                                            key={amount}\n                                                            type=\"button\"\n                                                            variant=\"outline\"\n                                                            size=\"xs\"\n                                                            className={`h-7 px-2 text-xs font-semibold ${form.data\n                                                                .requested_amount ===\n                                                                amount.toString()\n                                                                ? 'border-primary bg-primary/10 text-primary hover:bg-primary/20 hover:text-primary'\n                                                                : 'text-muted-foreground'\n                                                                }`}\n                                                            onClick={() =>\n                                                                form.setData(\n                                                                    'requested_amount',\n                                                                    amount.toString(),\n                                                                )\n                                                            }\n                                                        >\n                                                            {formatIDR(amount)}\n                                                        </Button>\n                                                    ))}\n                                                </div>\n\n                                                {form.errors\n                                                    .requested_amount && (\n                                                        <InputError\n                                                            message={\n                                                                form.errors\n                                                                    .requested_amount\n                                                            }\n                                                        />\n                                                    )}\n                                                {calculation &&\n                                                    !calculation.valid && (\n                                                        <InputError\n                                                            message={\n                                                                calculation.error\n                                                            }\n                                                        />\n                                                    )}\n                                            </div>\n\n                                            {/* Purpose */}\n                                            <div className=\"space-y-2\">\n                                                <Label htmlFor=\"purpose\">\n                                                    Tujuan Pembiayaan{' '}\n                                                    <span className=\"text-destructive\">\n                                                        *\n                                                    </span>\n                                                </Label>\n                                                <Textarea\n                                                    id=\"purpose\"\n                                                    value={form.data.purpose}\n                                                    onChange={(e) =>\n                                                        form.setData(\n                                                            'purpose',\n                                                            e.target.value,\n                                                        )\n                                                    }\n                                                    placeholder=\"Jelaskan tujuan pengajuan pembiayaan...\"\n                                                    rows={3}\n                                                    required\n                                                />\n                                                {form.errors.purpose && (\n                                                    <InputError\n                                                        message={\n                                                            form.errors.purpose\n                                                        }\n                                                    />\n                                                )}\n                                            </div>\n\n                                            {/* Collector (Optional) */}\n                                            <div className=\"space-y-2\">\n                                                <Label htmlFor=\"collector_id\">\n                                                    Collector (Opsional)\n                                                </Label>\n                                                <Select\n                                                    value={\n                                                        form.data.collector_id\n                                                    }\n                                                    onValueChange={(value) =>\n                                                        form.setData(\n                                                            'collector_id',\n                                                            value,\n                                                        )\n                                                    }\n                                                >\n                                                    <SelectTrigger>\n                                                        <SelectValue placeholder=\"Pilih Collector (opsional)\" />\n                                                    </SelectTrigger>\n                                                    <SelectContent>\n                                                        <SelectGroup>\n                                                            <SelectLabel>\n                                                                Daftar Collector\n                                                            </SelectLabel>\n                                                            {collectors.map(\n                                                                (collector) => (\n                                                                    <SelectItem\n                                                                        key={\n                                                                            collector.id\n                                                                        }\n                                                                        value={collector.id.toString()}\n                                                                    >\n                                                                        {\n                                                                            collector.name\n                                                                        }\n                                                                    </SelectItem>\n                                                                ),\n                                                            )}\n                                                        </SelectGroup>\n                                                    </SelectContent>\n                                                </Select>\n                                                {form.errors.collector_id && (\n                                                    <InputError\n                                                        message={\n                                                            form.errors\n                                                                .collector_id\n                                                        }\n                                                    />\n                                                )}\n                                            </div>\n\n                                            {/* Notes (Optional) */}\n                                            <div className=\"space-y-2\">\n                                                <Label htmlFor=\"notes\">\n                                                    Catatan (Opsional)\n                                                </Label>\n                                                <Textarea\n                                                    id=\"notes\"\n                                                    value={form.data.notes}\n                                                    onChange={(e) =>\n                                                        form.setData(\n                                                            'notes',\n                                                            e.target.value,\n                                                        )\n                                                    }\n                                                    placeholder=\"Catatan tambahan...\"\n                                                    rows={2}\n                                                />\n                                                {form.errors.notes && (\n                                                    <InputError\n                                                        message={\n                                                            form.errors.notes\n                                                        }\n                                                    />\n                                                )}\n                                            </div>\n                                        </>\n                                    )}\n                                </CardContent>\n                            </Card>\n\n                            {/* Submit Button */}\n                            <div className=\"flex gap-3\">\n                                <Button\n                                    type=\"button\"\n                                    variant=\"outline\"\n                                    onClick={handleBack}\n                                    disabled={form.processing}\n                                >\n                                    Batal\n                                </Button>\n                                <Button\n                                    type=\"submit\"\n                                    disabled={\n                                        form.processing ||\n                                        !selectedMember ||\n                                        (selectedMember?.active_financings_count ??\n                                            0) > 0\n                                    }\n                                >\n                                    {form.processing\n                                        ? 'Memproses...'\n                                        : 'Ajukan Pembiayaan'}\n                                </Button>\n                            </div>\n                        </form>\n                    </div>\n\n                    {/* Calculation Preview Column */}\n                    <div className=\"lg:col-span-1\">\n                        <Card className=\"sticky top-4\">\n                            <CardHeader>\n                                <CardTitle className=\"flex items-center gap-2\">\n                                    <Calculator className=\"h-5 w-5\" />\n                                    Perhitungan\n                                </CardTitle>\n                            </CardHeader>\n                            <CardContent>\n                                {!calculation ? (\n                                    <div className=\"py-8 text-center text-muted-foreground\">\n                                        Pilih produk dan masukkan jumlah untuk\n                                        melihat perhitungan.\n                                    </div>\n                                ) : calculation.valid ? (\n                                    <div className=\"space-y-4\">\n                                        <div className=\"space-y-2\">\n                                            <div className=\"flex justify-between text-sm\">\n                                                <span className=\"text-muted-foreground\">\n                                                    Jumlah Pokok\n                                                </span>\n                                                <span className=\"font-medium\">\n                                                    {formatIDR(\n                                                        calculation.principal,\n                                                    )}\n                                                </span>\n                                            </div>\n                                            <div className=\"flex justify-between text-sm\">\n                                                <span className=\"text-muted-foreground\">\n                                                    Margin (\n                                                    {calculation.marginRate}%)\n                                                </span>\n                                                <span className=\"font-medium\">\n                                                    {formatIDR(\n                                                        calculation.margin,\n                                                    )}\n                                                </span>\n                                            </div>\n                                            <div className=\"flex justify-between border-t pt-2 text-lg font-bold\">\n                                                <span>Total Pengembalian</span>\n                                                <span>\n                                                    {formatIDR(\n                                                        calculation.total,\n                                                    )}\n                                                </span>\n                                            </div>\n                                        </div>\n\n                                        <div className=\"space-y-2 rounded-lg bg-primary/10 p-4\">\n                                            <div className=\"flex justify-between text-sm\">\n                                                <span className=\"text-muted-foreground\">\n                                                    Angsuran Harian\n                                                </span>\n                                                <span className=\"text-lg font-bold\">\n                                                    {formatIDR(\n                                                        calculation.daily,\n                                                    )}\n                                                </span>\n                                            </div>\n                                            <div className=\"flex justify-between text-sm\">\n                                                <span className=\"text-muted-foreground\">\n                                                    Jangka Waktu\n                                                </span>\n                                                <span className=\"font-medium\">\n                                                    {\n                                                        calculation.installmentCount\n                                                    }{' '}\n                                                    hari\n                                                </span>\n                                            </div>\n                                        </div>\n\n                                        <div className=\"space-y-2 border-t pt-4\">\n                                            <div className=\"mb-2 text-sm font-medium\">\n                                                Biaya-biaya:\n                                            </div>\n                                            <div className=\"flex justify-between text-xs\">\n                                                <span className=\"text-muted-foreground\">\n                                                    Admin\n                                                </span>\n                                                <span>\n                                                    {formatIDR(\n                                                        calculation.adminFee,\n                                                    )}\n                                                </span>\n                                            </div>\n                                            <div className=\"flex justify-between text-xs\">\n                                                <span className=\"text-muted-foreground\">\n                                                    Provisi (\n                                                    {products.find(\n                                                        (p) =>\n                                                            p.id.toString() ===\n                                                            form.data\n                                                                .financing_product_id,\n                                                    )?.provision_fee || 0}\n                                                    %)\n                                                </span>\n                                                <span>\n                                                    {formatIDR(\n                                                        calculation.provisiFee,\n                                                    )}\n                                                </span>\n                                            </div>\n                                            <div className=\"flex justify-between text-xs\">\n                                                <span className=\"text-muted-foreground\">\n                                                    Notaris\n                                                </span>\n                                                <span>\n                                                    {formatIDR(\n                                                        calculation.notaryFee,\n                                                    )}\n                                                </span>\n                                            </div>\n                                            <div className=\"flex justify-between text-xs\">\n                                                <span className=\"text-muted-foreground\">\n                                                    Survey\n                                                </span>\n                                                <span>\n                                                    {formatIDR(\n                                                        calculation.surveyFee,\n                                                    )}\n                                                </span>\n                                            </div>\n                                            <div className=\"mt-2 flex justify-between border-t pt-2 text-sm font-bold\">\n                                                <span>Total Biaya</span>\n                                                <span>\n                                                    {formatIDR(\n                                                        calculation.totalFees,\n                                                    )}\n                                                </span>\n                                            </div>\n                                        </div>\n\n                                        <div className=\"space-y-2 rounded-lg bg-green-100 p-4 dark:bg-green-900/20\">\n                                            <div className=\"flex justify-between text-sm\">\n                                                <span className=\"text-muted-foreground\">\n                                                    Pencairan Bersih\n                                                </span>\n                                                <span className=\"font-bold text-green-700 dark:text-green-400\">\n                                                    {formatIDR(\n                                                        calculation.totalDisbursement,\n                                                    )}\n                                                </span>\n                                            </div>\n                                            <div className=\"text-xs text-green-600 dark:text-green-500\">\n                                                Jumlah yang akan diterima\n                                                anggota setelah biaya\n                                            </div>\n                                        </div>\n                                    </div>\n                                ) : (\n                                    <div className=\"rounded-lg bg-destructive/10 p-4 text-destructive\">\n                                        {calculation.error}\n                                    </div>\n                                )}\n                            </CardContent>\n                        </Card>\n                    </div>\n                </div>\n            </div>\n        </AppLayout>\n    );\n}\n","usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\pages\\Financings\\Index.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\pages\\Financings\\Installments.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\pages\\Financings\\Payments.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\pages\\Financings\\RecordPayment.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\pages\\Financings\\Show.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\pages\\Members\\Components\\InfoField.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\pages\\Members\\Components\\InfoSection.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\pages\\Members\\Components\\ShowHeader.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\pages\\Members\\Create.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\pages\\Members\\Edit.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\pages\\Members\\Index.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\pages\\Members\\MemberDetail.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\pages\\Members\\RecentActivity.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\pages\\Members\\Show.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\pages\\Members\\StatsCard.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\pages\\Savings\\Index.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\pages\\Savings\\OpenAccount.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\pages\\Savings\\Show.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\pages\\Savings\\Transactions.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\pages\\Users\\Index.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\pages\\auth\\confirm-password.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\pages\\auth\\forgot-password.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\pages\\auth\\login.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\pages\\auth\\register.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\pages\\auth\\reset-password.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\pages\\auth\\two-factor-challenge.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\pages\\auth\\verify-email.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\pages\\dashboard.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\pages\\settings\\appearance.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\pages\\settings\\password.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\pages\\settings\\profile.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\pages\\settings\\two-factor.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\pages\\welcome.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\routes\\accounting\\accounts\\index.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\routes\\accounting\\index.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\routes\\accounting\\journal\\index.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\routes\\accounting\\reports\\balance-sheet\\index.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\routes\\accounting\\reports\\income-statement\\index.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\routes\\accounting\\reports\\index.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\routes\\accounting\\reports\\trial-balance\\index.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\routes\\api\\index.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\routes\\api\\regions\\index.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\routes\\appearance\\index.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\routes\\boost\\index.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\routes\\branches\\index.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\routes\\daily-collection\\index.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\routes\\debugbar\\cache\\index.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\routes\\debugbar\\index.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\routes\\debugbar\\queries\\index.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\routes\\financing\\index.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\routes\\financing\\payments\\index.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\routes\\index.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\routes\\login\\index.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\routes\\members\\export\\index.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\routes\\members\\index.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\routes\\password\\confirm\\index.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\routes\\password\\index.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\routes\\profile\\index.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\routes\\register\\index.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\routes\\savings\\index.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\routes\\savings\\open\\index.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\routes\\savings\\transactions\\index.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\routes\\storage\\index.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\routes\\two-factor\\index.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\routes\\two-factor\\login\\index.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\routes\\user-password\\index.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\routes\\users\\index.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\routes\\verification\\index.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\ssr.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\types\\accounting.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\types\\audit.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\types\\auth.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\types\\branch.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\types\\daily-collection.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\types\\dashboard.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\types\\financing.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\types\\index.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\types\\member.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\types\\navigation.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\types\\region.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\types\\savings.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\types\\ui.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\types\\user.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\types\\vite-env.d.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\resources\\js\\wayfinder\\index.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\vitest.config.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"D:\\Web Development Reyhan\\btm-koperasi\\vitest.setup.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]}]