diff --git a/.env.example b/.env.example
index 2e4ec3a..c3d4739 100644
--- a/.env.example
+++ b/.env.example
@@ -1,10 +1,10 @@
-VITE_APP_NAME=GOLSCONTROL
+VITE_APP_NAME=Ayuntamiento de Comalcalco
VITE_APP_URL=http://frontend.golscontrol.test
VITE_APP_LANG=es-MX
VITE_APP_PORT=3000
VITE_PAGINATION=25
-VITE_APP_API=http://localhost:8080 #Colocar http://localhost:8080 con el puerto del backend / http://backend.golscontrol.test
+VITE_API_URL=http://localhost:8080
VITE_APP_API_SECURE=false
VITE_MICROSERVICE_STOCK=http://localhost:3000/api
diff --git a/colors.css.example b/colors.css.example
index 449a831..8b70f7d 100644
--- a/colors.css.example
+++ b/colors.css.example
@@ -3,12 +3,12 @@
--color-page-t: #000;
--color-page-d: #292524;
--color-page-dt: #fff;
- --color-primary: #374151;
+ --color-primary: #621132;
--color-primary-t: #fff;
--color-primary-d: #1c1917;
--color-primary-dt: #fff;
- --color-secondary: #3b82f6;
- --color-secondary-t: #fff;
+ --color-secondary: #fff;
+ --color-secondary-t: #621132;
--color-secondary-d: #312e81;
--color-secondary-dt: #fff;
--color-primary-info: #06b6d4;
diff --git a/docker-compose.yml b/docker-compose.yml
index fab45f9..62b67e7 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -1,16 +1,16 @@
services:
- holos-frontend:
+ comal-pagos-frontend:
build:
context: .
dockerfile: dockerfile
ports:
- "${APP_PORT}:5173"
volumes:
- - .:/var/www/holos.frontend
- - /var/www/holos.frontend/node_modules
+ - .:/var/www/comal-pagos.frontend
+ - /var/www/comal-pagos.frontend/node_modules
networks:
- - holos-network
+ - comal-pagos-network
networks:
- holos-network:
+ comal-pagos-network:
driver: bridge
\ No newline at end of file
diff --git a/dockerfile b/dockerfile
index 80d3f3f..2194ffe 100644
--- a/dockerfile
+++ b/dockerfile
@@ -1,6 +1,6 @@
FROM node:22-alpine AS build
-WORKDIR /var/www/holos.frontend
+WORKDIR /var/www/comal-pagos.frontend
COPY package*.json ./
@@ -11,7 +11,5 @@ COPY . .
COPY install.sh /usr/local/bin/install.sh
RUN chmod +x /usr/local/bin/install.sh
-EXPOSE 3000
-
ENTRYPOINT ["/usr/local/bin/install.sh"]
CMD ["npm", "run", "dev", "--", "--host", "0.0.0.0"]
\ No newline at end of file
diff --git a/index.html b/index.html
index 0749d22..27c4303 100644
--- a/index.html
+++ b/index.html
@@ -2,7 +2,7 @@
-
+
Holos
diff --git a/install.sh b/install.sh
index 96438df..6550b1a 100755
--- a/install.sh
+++ b/install.sh
@@ -1,11 +1,11 @@
-#! /bin/bash
+#! /bin/sh
if [ ! -f .env ]; then
cp .env.example .env
fi
-if [ ! -f colors.json ]; then
- cp colors.json.example colors.json
+if [ ! -f colors.css ]; then
+ cp colors.css.example colors.css
fi
exec "$@"
diff --git a/package-lock.json b/package-lock.json
index 6a950ab..98ebc1e 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -23,6 +23,7 @@
"vue": "^3.5.13",
"vue-i18n": "^11.1.1",
"vue-multiselect": "^3.2.0",
+ "vue-qrcode-reader": "^5.7.3",
"vue-router": "^4.5.0",
"ziggy-js": "^2.5.2"
},
@@ -1224,6 +1225,18 @@
"vite": "^5.2.0 || ^6"
}
},
+ "node_modules/@types/dom-webcodecs": {
+ "version": "0.1.17",
+ "resolved": "https://registry.npmjs.org/@types/dom-webcodecs/-/dom-webcodecs-0.1.17.tgz",
+ "integrity": "sha512-IwKW5uKL0Zrv5ccUJpjIlqf7ppk2v29l/ZLQxLlwHxljBfnDD9Gxm+hzMkGM0AOAL/21H0pp7cTUYLiiVUGchA==",
+ "license": "MIT"
+ },
+ "node_modules/@types/emscripten": {
+ "version": "1.41.5",
+ "resolved": "https://registry.npmjs.org/@types/emscripten/-/emscripten-1.41.5.tgz",
+ "integrity": "sha512-cMQm7pxu6BxtHyqJ7mQZ2kXWV5SLmugybFdHCBbJ5eHzOo6VhBckEgAT3//rP5FwPHNPeEiq4SmQ5ucBwsOo4Q==",
+ "license": "MIT"
+ },
"node_modules/@types/estree": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz",
@@ -1492,6 +1505,16 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/barcode-detector": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/barcode-detector/-/barcode-detector-2.2.2.tgz",
+ "integrity": "sha512-JcSekql+EV93evfzF9zBr+Y6aRfkR+QFvgyzbwQ0dbymZXoAI9+WgT7H1E429f+3RKNncHz2CW98VQtaaKpmfQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/dom-webcodecs": "^0.1.11",
+ "zxing-wasm": "1.1.3"
+ }
+ },
"node_modules/birpc": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/birpc/-/birpc-2.3.0.tgz",
@@ -3230,6 +3253,12 @@
"queue-microtask": "^1.2.2"
}
},
+ "node_modules/sdp": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/sdp/-/sdp-3.2.1.tgz",
+ "integrity": "sha512-lwsAIzOPlH8/7IIjjz3K0zYBk7aBVVcvjMwt3M4fLxpjMYyy7i3I97SLHebgn4YBjirkzfp3RvRDWSKsh/+WFw==",
+ "license": "MIT"
+ },
"node_modules/socket.io-client": {
"version": "4.8.1",
"resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.8.1.tgz",
@@ -3641,6 +3670,19 @@
"npm": ">= 6.14.15"
}
},
+ "node_modules/vue-qrcode-reader": {
+ "version": "5.7.3",
+ "resolved": "https://registry.npmjs.org/vue-qrcode-reader/-/vue-qrcode-reader-5.7.3.tgz",
+ "integrity": "sha512-iSGko42FsEvdHyizBMBs/X+HMO9Z5ONDxjW+mQdoraOR5emRNedmjC5SEJdYzGz8ZP5ME3lwB4iHy3S7MOt5Qw==",
+ "license": "MIT",
+ "dependencies": {
+ "barcode-detector": "2.2.2",
+ "webrtc-adapter": "8.2.3"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
"node_modules/vue-router": {
"version": "4.5.1",
"resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.5.1.tgz",
@@ -3662,6 +3704,19 @@
"integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==",
"license": "MIT"
},
+ "node_modules/webrtc-adapter": {
+ "version": "8.2.3",
+ "resolved": "https://registry.npmjs.org/webrtc-adapter/-/webrtc-adapter-8.2.3.tgz",
+ "integrity": "sha512-gnmRz++suzmvxtp3ehQts6s2JtAGPuDPjA1F3a9ckNpG1kYdYuHWYpazoAnL9FS5/B21tKlhkorbdCXat0+4xQ==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "sdp": "^3.2.0"
+ },
+ "engines": {
+ "node": ">=6.0.0",
+ "npm": ">=3.10.0"
+ }
+ },
"node_modules/ws": {
"version": "8.17.1",
"resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz",
@@ -3711,6 +3766,15 @@
"@types/qs": "^6.9.17",
"qs": "~6.9.7"
}
+ },
+ "node_modules/zxing-wasm": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/zxing-wasm/-/zxing-wasm-1.1.3.tgz",
+ "integrity": "sha512-MYm9k/5YVs4ZOTIFwlRjfFKD0crhefgbnt1+6TEpmKUDFp3E2uwqGSKwQOd2hOIsta/7Usq4hnpNRYTLoljnfA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/emscripten": "^1.39.10"
+ }
}
}
}
diff --git a/package.json b/package.json
index aa208d1..633c636 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "notsoweb.frontend",
- "copyright": "Notsoweb Software Inc.",
+ "copyright": "Golsystems",
"private": true,
"version": "0.9.10",
"type": "module",
@@ -25,6 +25,7 @@
"vue": "^3.5.13",
"vue-i18n": "^11.1.1",
"vue-multiselect": "^3.2.0",
+ "vue-qrcode-reader": "^5.7.3",
"vue-router": "^4.5.0",
"ziggy-js": "^2.5.2"
},
diff --git a/public/favicon.png b/public/favicon.png
new file mode 100644
index 0000000..48446b2
Binary files /dev/null and b/public/favicon.png differ
diff --git a/public/logo.png b/public/logo.png
new file mode 100644
index 0000000..fc49e1a
Binary files /dev/null and b/public/logo.png differ
diff --git a/public/vite.svg b/public/vite.svg
deleted file mode 100644
index e7b8dfb..0000000
--- a/public/vite.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/components/App/AddressSection.vue b/src/components/App/AddressSection.vue
new file mode 100644
index 0000000..7b93af3
--- /dev/null
+++ b/src/components/App/AddressSection.vue
@@ -0,0 +1,59 @@
+
+
+
+
+
+ {{ $t('address.create.title') }}
+
+
+
+
+
diff --git a/src/components/App/CheckoutDelivery.vue b/src/components/App/CheckoutDelivery.vue
new file mode 100644
index 0000000..8190a10
--- /dev/null
+++ b/src/components/App/CheckoutDelivery.vue
@@ -0,0 +1,114 @@
+
+
+
+
+
+
Buscar Multa
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/App/ConceptSection.vue b/src/components/App/ConceptSection.vue
new file mode 100644
index 0000000..7d620a9
--- /dev/null
+++ b/src/components/App/ConceptSection.vue
@@ -0,0 +1,196 @@
+
+
+
+
+
+ {{ $t('concept.create.title') }}
+
+
+
+
+
diff --git a/src/components/App/DiscountSection.vue b/src/components/App/DiscountSection.vue
new file mode 100644
index 0000000..dc9b5f9
--- /dev/null
+++ b/src/components/App/DiscountSection.vue
@@ -0,0 +1,212 @@
+
+
+
+
+
diff --git a/src/components/App/FineSection.vue b/src/components/App/FineSection.vue
new file mode 100644
index 0000000..1d79de7
--- /dev/null
+++ b/src/components/App/FineSection.vue
@@ -0,0 +1,277 @@
+
+
+
+
+
Buscar Multa
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/App/MembershipSection.vue b/src/components/App/MembershipSection.vue
new file mode 100644
index 0000000..9e3cf89
--- /dev/null
+++ b/src/components/App/MembershipSection.vue
@@ -0,0 +1,202 @@
+
+
+
+
+
+
+
+
+
+
+ Información del Miembro
+
+
+
+
+
+
+
+
+
diff --git a/src/components/App/QRscan.vue b/src/components/App/QRscan.vue
new file mode 100644
index 0000000..d7de406
--- /dev/null
+++ b/src/components/App/QRscan.vue
@@ -0,0 +1,130 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
¡Código detectado!
+
+
+
+
+
+ {{ error }}
+
+
+
+
+
diff --git a/src/components/Holos/Logo.vue b/src/components/Holos/Logo.vue
index f6b176c..007bd8a 100644
--- a/src/components/Holos/Logo.vue
+++ b/src/components/Holos/Logo.vue
@@ -19,6 +19,6 @@ const home = () => {
class="flex w-full justify-center items-center space-x-2 cursor-pointer"
@click="home"
>
-
+
\ No newline at end of file
diff --git a/src/lang/es.js b/src/lang/es.js
index bc0039a..f86e9eb 100644
--- a/src/lang/es.js
+++ b/src/lang/es.js
@@ -80,6 +80,83 @@ export default {
description: 'Historial de acciones realizadas por los usuarios en orden cronológico.'
}
},
+ address: {
+ title: 'Direcciones',
+ name: 'Nombre de la Dirección',
+ placeholder: 'Ingrese el nombre de la dirección',
+ validation: {
+ required: 'Por favor ingresa un nombre de dirección'
+ },
+ create: {
+ title: 'Crear nueva dirección',
+ description: 'Permite crear nuevas direcciones.',
+ onSuccess: 'Dirección creada exitosamente',
+ onError: 'Error al crear la dirección'
+ },
+ edit: {
+ title: 'Editar dirección',
+ description: 'Permite editar direcciones existentes.',
+ onSuccess: 'Dirección actualizada exitosamente',
+ onError: 'Error al actualizar la dirección'
+ },
+ list: {
+ title: 'Listado de Direcciones',
+ empty: 'No hay direcciones registradas'
+ },
+ deleted: 'Dirección eliminada',
+ permissions: {
+ title: 'Permisos de dirección'
+ }
+ },
+ concept: {
+ title: 'Conceptos de Cobro',
+ direction: 'Dirección',
+ shortName: 'Nombre Corto',
+ name: 'Nombre',
+ legal: 'Instrumento Legal',
+ article: 'Articulado',
+ description: 'Contenido',
+ minimumAmountUma: 'Monto Mínimo (UMAs)',
+ maximumAmountUma: 'Monto Máximo (UMAs)',
+ minimumAmountPeso: 'Monto Mínimo (Pesos)',
+ maximumAmountPeso: 'Monto Máximo (Pesos)',
+ tabulator: 'Tabulador',
+ sizeUnit: 'Unidad de Medida',
+ costUnitUma: 'Costo Unitario (UMAs)',
+ costUnitPeso: 'Costo Unitario (Pesos)',
+ validation: {
+ required: 'Por favor complete todos los campos requeridos'
+ },
+ create: {
+ title: 'Nuevo Concepto de Cobro',
+ description: 'Permite crear nuevos conceptos de cobro.',
+ onSuccess: 'Concepto creado exitosamente',
+ onError: 'Error al crear el concepto'
+ },
+ edit: {
+ title: 'Editar concepto',
+ description: 'Permite editar conceptos existentes.',
+ onSuccess: 'Concepto actualizado exitosamente',
+ onError: 'Error al actualizar el concepto'
+ },
+ list: {
+ title: 'Listado de Conceptos',
+ empty: 'No hay conceptos registrados'
+ },
+ deleted: 'Concepto eliminado',
+ permissions: {
+ title: 'Permisos de concepto'
+ }
+ },
+ membership: {
+ title: 'Membresías',
+ create: {
+ title: 'Crear membresía',
+ description: 'Permite crear nuevas membresías.',
+ onSuccess: 'Membresía creada exitosamente',
+ onError: 'Error al crear la membresía'
+ }
+ },
app: {
theme: {
dark: 'Tema oscuro',
diff --git a/src/layouts/AppLayout.vue b/src/layouts/AppLayout.vue
index d33531b..033ff71 100644
--- a/src/layouts/AppLayout.vue
+++ b/src/layouts/AppLayout.vue
@@ -35,9 +35,34 @@ onMounted(() => {
to="dashboard.index"
/>
+
+
+
+
+
({
@@ -80,5 +81,12 @@ onMounted(() => {
:options="roles"
multiple
/>
+
diff --git a/src/pages/App/Address/Index.vue b/src/pages/App/Address/Index.vue
new file mode 100644
index 0000000..92d4181
--- /dev/null
+++ b/src/pages/App/Address/Index.vue
@@ -0,0 +1,157 @@
+
+
+
+
+
+
+
searcher.pagination(page)"
+ >
+
+ |
+ |
+
+
+
+ |
+ {{ model.name }}
+ |
+
+
+
+
+
+ |
+
+
+
+
+ {{ transl('list.empty') }}
+ |
+
+
+
{
+ const index = models.data.findIndex((m) => m.id === modelModal.id);
+ if (index > -1) {
+ models.data.splice(index, 1);
+ models.total--;
+ }
+ }
+ "
+ />
+
+
+
+
+
+
+
+
diff --git a/src/pages/App/Address/Module.js b/src/pages/App/Address/Module.js
new file mode 100644
index 0000000..e1cf973
--- /dev/null
+++ b/src/pages/App/Address/Module.js
@@ -0,0 +1,21 @@
+import { lang } from '@Lang/i18n';
+import { hasPermission } from '@Plugins/RolePermission.js';
+
+// Ruta API
+const apiTo = (name, params = {}) => route(`directions.${name}`, params)
+
+// Ruta visual
+const viewTo = ({ name = '', params = {}, query = {} }) => view({ name: `address.${name}`, params, query })
+
+// Obtener traducción del componente
+const transl = (str) => lang(`address.${str}`)
+
+// Determina si un usuario puede hacer algo no en base a los permisos
+const can = (permission) => hasPermission(`address.${permission}`)
+
+export {
+ can,
+ viewTo,
+ apiTo,
+ transl
+}
\ No newline at end of file
diff --git a/src/pages/App/Checkout/Index.vue b/src/pages/App/Checkout/Index.vue
new file mode 100644
index 0000000..69e1e36
--- /dev/null
+++ b/src/pages/App/Checkout/Index.vue
@@ -0,0 +1,9 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/pages/App/Concept/Index.vue b/src/pages/App/Concept/Index.vue
new file mode 100644
index 0000000..786d7d9
--- /dev/null
+++ b/src/pages/App/Concept/Index.vue
@@ -0,0 +1,284 @@
+
+
+
+
+
+
searcher.pagination(page)"
+ >
+
+ |
+ |
+ |
+ |
+ |
+ |
+ |
+
+
+
+ |
+ {{ model.direction?.name || "-" }}
+ |
+
+ {{ model.short_name }}
+ |
+
+ {{ model.name }}
+ |
+
+ {{ model.legal_instrument }}
+ |
+
+ {{ model.article }}
+ |
+
+ {{ model.content }}
+ |
+
+
+
+
+
+ |
+
+
+
+
+ {{ transl("list.empty") }}
+ |
+
+
+
{
+ const index = models.data.findIndex((m) => m.id === modelModal.id);
+ if (index > -1) {
+ models.data.splice(index, 1);
+ models.total--;
+ }
+ }
+ "
+ />
+
+
+
+
+
diff --git a/src/pages/App/Concept/Module.js b/src/pages/App/Concept/Module.js
new file mode 100644
index 0000000..978da68
--- /dev/null
+++ b/src/pages/App/Concept/Module.js
@@ -0,0 +1,21 @@
+import { lang } from '@Lang/i18n';
+import { hasPermission } from '@Plugins/RolePermission.js';
+
+// Ruta API
+const apiTo = (name, params = {}) => route(`charge-concepts.${name}`, params)
+
+// Ruta visual
+const viewTo = ({ name = '', params = {}, query = {} }) => view({ name: `concept.${name}`, params, query })
+
+// Obtener traducción del componente
+const transl = (str) => lang(`concept.${str}`)
+
+// Determina si un usuario puede hacer algo no en base a los permisos
+const can = (permission) => hasPermission(`concept.${permission}`)
+
+export {
+ can,
+ viewTo,
+ apiTo,
+ transl
+}
\ No newline at end of file
diff --git a/src/pages/App/Discount/Index.vue b/src/pages/App/Discount/Index.vue
new file mode 100644
index 0000000..3ee6441
--- /dev/null
+++ b/src/pages/App/Discount/Index.vue
@@ -0,0 +1,9 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/pages/App/Fine/Index.vue b/src/pages/App/Fine/Index.vue
new file mode 100644
index 0000000..3a173d5
--- /dev/null
+++ b/src/pages/App/Fine/Index.vue
@@ -0,0 +1,9 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/pages/App/Fine/Module.js b/src/pages/App/Fine/Module.js
new file mode 100644
index 0000000..60a5597
--- /dev/null
+++ b/src/pages/App/Fine/Module.js
@@ -0,0 +1,21 @@
+import { lang } from '@Lang/i18n';
+import { hasPermission } from '@Plugins/RolePermission.js';
+
+// Ruta API
+const apiTo = (name, params = {}) => route(`fines.${name}`, params)
+
+// Ruta visual
+const viewTo = ({ name = '', params = {}, query = {} }) => view({ name: `fine.${name}`, params, query })
+
+// Obtener traducción del componente
+const transl = (str) => lang(`fine.${str}`)
+
+// Determina si un usuario puede hacer algo no en base a los permisos
+const can = (permission) => hasPermission(`fine.${permission}`)
+
+export {
+ can,
+ viewTo,
+ apiTo,
+ transl
+}
diff --git a/src/pages/App/Membership/Create.vue b/src/pages/App/Membership/Create.vue
new file mode 100644
index 0000000..baef13a
--- /dev/null
+++ b/src/pages/App/Membership/Create.vue
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/App/Membership/Form.vue b/src/pages/App/Membership/Form.vue
new file mode 100644
index 0000000..54d60cf
--- /dev/null
+++ b/src/pages/App/Membership/Form.vue
@@ -0,0 +1,67 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/pages/App/Membership/Index.vue b/src/pages/App/Membership/Index.vue
new file mode 100644
index 0000000..1b28f93
--- /dev/null
+++ b/src/pages/App/Membership/Index.vue
@@ -0,0 +1,21 @@
+
+
+
+ searcher.search(x)">
+
+
+
+
+
+
diff --git a/src/pages/App/Membership/Module.js b/src/pages/App/Membership/Module.js
new file mode 100644
index 0000000..2ef8139
--- /dev/null
+++ b/src/pages/App/Membership/Module.js
@@ -0,0 +1,21 @@
+import { lang } from '@Lang/i18n';
+import { hasPermission } from '@Plugins/RolePermission.js';
+
+// Ruta API
+const apiTo = (name, params = {}) => route(`membership.${name}`, params)
+
+// Ruta visual
+const viewTo = ({ name = '', params = {}, query = {} }) => view({ name: `membership.${name}`, params, query })
+
+// Obtener traducción del componente
+const transl = (str) => lang(`membership.${str}`)
+
+// Determina si un usuario puede hacer algo no en base a los permisos
+const can = (permission) => true//hasPermission(`membership.${permission}`)
+
+export {
+ can,
+ viewTo,
+ apiTo,
+ transl
+}
\ No newline at end of file
diff --git a/src/router/Index.js b/src/router/Index.js
index 5fcdcb2..2db801c 100644
--- a/src/router/Index.js
+++ b/src/router/Index.js
@@ -48,6 +48,71 @@ const router = createRouter({
},
]
},
+ {
+ path: 'address',
+ children: [
+ {
+ path: '',
+ name: 'address.index',
+ component: () => import('@Pages/App/Address/Index.vue')
+ }
+ ]
+ },
+ {
+ path: 'concept',
+ children: [
+ {
+ path: '',
+ name: 'concept.index',
+ component: () => import('@Pages/App/Concept/Index.vue')
+ }
+ ]
+ },
+ {
+ path: 'fine',
+ children: [
+ {
+ path: '',
+ name: 'fine.index',
+ component: () => import('@Pages/App/Fine/Index.vue')
+ }
+ ]
+ },
+ {
+ path: 'discount',
+ children: [
+ {
+ path: '',
+ name: 'discount.index',
+ component: () => import('@Pages/App/Discount/Index.vue')
+ }
+ ]
+ },
+ {
+ path: 'membership',
+ children: [
+ {
+ path: '',
+ name: 'membership.index',
+ component: () => import('@Pages/App/Membership/Index.vue')
+ },
+ {
+ path: 'create',
+ name: 'membership.create',
+ component: () => import('@Pages/App/Membership/Create.vue')
+ }
+ ]
+ },
+ {
+ path: 'checkout',
+ children: [
+ {
+ path: '',
+ name: 'checkout.index',
+ component: () => import('@Pages/App/Checkout/Index.vue')
+ },
+ ]
+ }
],
},
{
diff --git a/vite.config.js b/vite.config.js
index d570e01..61d1e55 100644
--- a/vite.config.js
+++ b/vite.config.js
@@ -16,6 +16,7 @@ export default defineConfig({
'@Components': fileURLToPath(new URL('./src/components', import.meta.url)),
'@Controllers': fileURLToPath(new URL('./src/controllers', import.meta.url)),
'@Holos': fileURLToPath(new URL('./src/components/Holos', import.meta.url)),
+ '@App': fileURLToPath(new URL('./src/components/App', import.meta.url)),
'@Layouts': fileURLToPath(new URL('./src/layouts', import.meta.url)),
'@Lang': fileURLToPath(new URL('./src/lang', import.meta.url)),
'@Router': fileURLToPath(new URL('./src/router', import.meta.url)),