diff --git a/app/composables/README-useFormErrors.md b/app/composables/README-useFormErrors.md
new file mode 100644
index 00000000..48acdedb
--- /dev/null
+++ b/app/composables/README-useFormErrors.md
@@ -0,0 +1,73 @@
+# useFormErrors Composable
+
+Composable untuk menangani form validation errors seperti Laravel. Mengkonversi ZodError menjadi format yang mudah digunakan di template.
+
+## Penggunaan
+
+### Basic Usage
+
+```typescript
+// Di component parent (entry.vue)
+const { errors, setFromZodError, clearErrors } = useFormErrors()
+
+// Validasi dengan Zod
+const result = schema.safeParse(data.value)
+if (!result.success) {
+ setFromZodError(result.error)
+ return
+}
+```
+
+### Di Template
+
+```vue
+
+
+```
+
+### Di Form Component
+
+```vue
+
+
+
+
+
+
+
+
+```
+
+## API Reference
+
+### Methods
+
+- `setFromZodError(zodError)` - Set errors dari ZodError
+- `setErrors(errors)` - Set errors manual
+- `setError(field, message)` - Set error untuk field tertentu
+- `clearError(field)` - Hapus error untuk field tertentu
+- `clearErrors()` - Hapus semua errors
+- `hasError(field)` - Cek apakah ada error untuk field
+- `getError(field)` - Ambil error message untuk field
+
+### Computed Properties
+
+- `hasErrors` - Boolean apakah ada error
+- `errorMessages` - Array semua error messages
+- `firstError` - Error pertama (untuk alert general)
+
+## Field Component
+
+Field component akan otomatis menampilkan error jika:
+1. Field memiliki `id` prop yang sesuai dengan field name
+2. Field menerima `errors` prop
+3. Ada error untuk field tersebut di dalam errors object
+
+Error akan ditampilkan dengan class `.field-error-info` yang sudah di-style dengan warna merah.
diff --git a/app/composables/useFormErrors.ts b/app/composables/useFormErrors.ts
new file mode 100644
index 00000000..03c95e97
--- /dev/null
+++ b/app/composables/useFormErrors.ts
@@ -0,0 +1,115 @@
+import type { ZodError } from 'zod'
+
+export interface XError {
+ message: string
+ [key: string]: any
+}
+
+export interface FormErrors {
+ [field: string]: XError
+}
+
+/**
+ * Composable untuk menangani form validation errors seperti Laravel
+ * Mengkonversi ZodError menjadi format yang mudah digunakan di template
+ */
+export function useFormErrors() {
+ const errors = ref
({})
+
+ /**
+ * Set errors dari ZodError
+ */
+ function setFromZodError(zodError: ZodError) {
+ const newErrors: FormErrors = {}
+
+ zodError.errors.forEach((error) => {
+ const field = error.path.join('.')
+ newErrors[field] = {
+ message: error.message,
+ code: error.code,
+ path: error.path,
+ }
+ })
+
+ errors.value = newErrors
+ }
+
+ /**
+ * Set errors manual (untuk error dari API response)
+ */
+ function setErrors(newErrors: FormErrors) {
+ errors.value = newErrors
+ }
+
+ /**
+ * Set error untuk field tertentu
+ */
+ function setError(field: string, message: string, extra: Record = {}) {
+ errors.value[field] = {
+ message,
+ ...extra,
+ }
+ }
+
+ /**
+ * Hapus error untuk field tertentu
+ */
+ function clearError(field: string) {
+ delete errors.value[field]
+ }
+
+ /**
+ * Hapus semua errors
+ */
+ function clearErrors() {
+ errors.value = {}
+ }
+
+ /**
+ * Cek apakah ada error untuk field tertentu
+ */
+ function hasError(field: string): boolean {
+ return !!errors.value[field]
+ }
+
+ /**
+ * Ambil error message untuk field tertentu
+ */
+ function getError(field: string): string | null {
+ return errors.value[field]?.message || null
+ }
+
+ /**
+ * Cek apakah ada error apapun
+ */
+ const hasErrors = computed(() => Object.keys(errors.value).length > 0)
+
+ /**
+ * Ambil semua error messages sebagai array
+ */
+ const errorMessages = computed(() =>
+ Object.values(errors.value).map(error => error.message),
+ )
+
+ /**
+ * Ambil error pertama (untuk menampilkan alert general)
+ */
+ const firstError = computed(() => {
+ const firstKey = Object.keys(errors.value)[0]
+ return firstKey ? errors.value[firstKey] : null
+ })
+
+ return {
+ errors: readonly(errors),
+ setFromZodError,
+ setErrors,
+ setError,
+ clearError,
+ clearErrors,
+ hasError,
+ getError,
+ hasErrors,
+ errorMessages,
+ firstError,
+ }
+}
diff --git a/app/pages/(features)/org-src/division/add.vue b/app/pages/(features)/org-src/division/add.vue
new file mode 100644
index 00000000..122e6ce3
--- /dev/null
+++ b/app/pages/(features)/org-src/division/add.vue
@@ -0,0 +1,41 @@
+
+
+
+
+
diff --git a/app/pages/(features)/org-src/division/index.vue b/app/pages/(features)/org-src/division/index.vue
new file mode 100644
index 00000000..6e08748b
--- /dev/null
+++ b/app/pages/(features)/org-src/division/index.vue
@@ -0,0 +1,41 @@
+
+
+
+
+
+ route division list
+
+
+
+