feature-comercial-module #9
0
install.sh
Executable file → Normal file
0
install.sh
Executable file → Normal file
0
src/components/Holos/Inbox.vue
Executable file → Normal file
0
src/components/Holos/Inbox.vue
Executable file → Normal file
0
src/components/Holos/Inbox/Item.vue
Executable file → Normal file
0
src/components/Holos/Inbox/Item.vue
Executable file → Normal file
0
src/components/Holos/Inbox/ItemTitle.vue
Executable file → Normal file
0
src/components/Holos/Inbox/ItemTitle.vue
Executable file → Normal file
0
src/components/Holos/Inbox/Menu/Item.vue
Executable file → Normal file
0
src/components/Holos/Inbox/Menu/Item.vue
Executable file → Normal file
0
src/components/Holos/Inbox/Menu/Static.vue
Executable file → Normal file
0
src/components/Holos/Inbox/Menu/Static.vue
Executable file → Normal file
0
src/controllers/PrintController.js
Executable file → Normal file
0
src/controllers/PrintController.js
Executable file → Normal file
@ -15,6 +15,7 @@ import IconButton from '@Holos/Button/Icon.vue';
|
|||||||
import Button from '@Holos/Button/Button.vue';
|
import Button from '@Holos/Button/Button.vue';
|
||||||
import GoogleIcon from '@Shared/GoogleIcon.vue';
|
import GoogleIcon from '@Shared/GoogleIcon.vue';
|
||||||
|
|
||||||
|
import Badge from '@Components/ui/Tags/Badge.vue';
|
||||||
/** Definiciones */
|
/** Definiciones */
|
||||||
const route = useRoute();
|
const route = useRoute();
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
@ -247,12 +248,12 @@ onMounted(() => {
|
|||||||
<div class="space-y-1">
|
<div class="space-y-1">
|
||||||
<p class="text-sm font-medium text-gray-600 dark:text-gray-400">Ubicación</p>
|
<p class="text-sm font-medium text-gray-600 dark:text-gray-400">Ubicación</p>
|
||||||
<p class="text-base text-gray-900 dark:text-gray-100">
|
<p class="text-base text-gray-900 dark:text-gray-100">
|
||||||
{{ warehouse.address || 'Guadalajara, Zona Industrial' }}
|
{{ warehouse.address || 'Sin dirección' }}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Categoría -->
|
<!-- Categoría -->
|
||||||
<div class="space-y-2">
|
<div class="space-y-2" v-if="warehouse.classifications && warehouse.classifications.length">
|
||||||
<p class="text-sm font-medium text-gray-600 dark:text-gray-400">Clasificaciones</p>
|
<p class="text-sm font-medium text-gray-600 dark:text-gray-400">Clasificaciones</p>
|
||||||
<div class="flex flex-wrap gap-2">
|
<div class="flex flex-wrap gap-2">
|
||||||
<span v-for="classification in warehouse.classifications" :key="classification.id"
|
<span v-for="classification in warehouse.classifications" :key="classification.id"
|
||||||
@ -262,7 +263,7 @@ onMounted(() => {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="space-y-2">
|
<div class="space-y-2" v-if="warehouse.classifications && warehouse.classifications.length">
|
||||||
<p class="text-sm font-medium text-gray-600 dark:text-gray-400">Subclasificaciones</p>
|
<p class="text-sm font-medium text-gray-600 dark:text-gray-400">Subclasificaciones</p>
|
||||||
<div class="flex flex-wrap gap-2">
|
<div class="flex flex-wrap gap-2">
|
||||||
<span v-for="child in getAllChildren(warehouse.classifications)" :key="child.id"
|
<span v-for="child in getAllChildren(warehouse.classifications)" :key="child.id"
|
||||||
@ -275,12 +276,9 @@ onMounted(() => {
|
|||||||
<!-- Estado -->
|
<!-- Estado -->
|
||||||
<div class="space-y-2">
|
<div class="space-y-2">
|
||||||
<p class="text-sm font-medium text-gray-600 dark:text-gray-400">Estado</p>
|
<p class="text-sm font-medium text-gray-600 dark:text-gray-400">Estado</p>
|
||||||
<span class="inline-flex items-center px-3 py-1 rounded-full text-sm font-medium"
|
<Badge :color="warehouse.is_active ? 'green' : 'red'">
|
||||||
:class="warehouse.is_active
|
|
||||||
? 'bg-blue-100 text-blue-800 dark:bg-blue-900 dark:text-blue-200'
|
|
||||||
: 'bg-red-100 text-red-800 dark:bg-red-900 dark:text-red-200'">
|
|
||||||
{{ warehouse.is_active ? 'Activo' : 'Inactivo' }}
|
{{ warehouse.is_active ? 'Activo' : 'Inactivo' }}
|
||||||
</span>
|
</Badge>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -323,6 +321,55 @@ onMounted(() => {
|
|||||||
</CardContent>
|
</CardContent>
|
||||||
</Card>
|
</Card>
|
||||||
|
|
||||||
|
<!-- Stock by Products -->
|
||||||
|
<Card>
|
||||||
|
<CardHeader>
|
||||||
|
<CardTitle class="flex items-center space-x-2">
|
||||||
|
<GoogleIcon class="w-6 h-6 text-primary" name="inventory" />
|
||||||
|
<span>Stock por Productos</span>
|
||||||
|
</CardTitle>
|
||||||
|
<CardDescription>
|
||||||
|
Inventario actual de productos en este almacén
|
||||||
|
</CardDescription>
|
||||||
|
</CardHeader>
|
||||||
|
<CardContent>
|
||||||
|
<div v-for="warehouseStock in stockByWarehouse" :key="warehouseStock.warehouse" class="space-y-4">
|
||||||
|
<h4
|
||||||
|
class="font-semibold text-gray-900 dark:text-gray-100 border-b border-gray-200 dark:border-gray-700 pb-2">
|
||||||
|
{{ warehouseStock.warehouse }}
|
||||||
|
</h4>
|
||||||
|
|
||||||
|
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4">
|
||||||
|
<div v-for="product in warehouseStock.products" :key="product.code"
|
||||||
|
class="bg-gray-50 dark:bg-gray-800 rounded-lg p-4 hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors">
|
||||||
|
|
||||||
|
<div class="flex items-center justify-between mb-2">
|
||||||
|
<span
|
||||||
|
class="text-xs font-mono text-gray-500 bg-white dark:bg-gray-900 px-2 py-1 rounded">
|
||||||
|
{{ product.code }}
|
||||||
|
</span>
|
||||||
|
<span class="text-sm font-bold text-gray-900 dark:text-gray-100">
|
||||||
|
{{ product.stock }} unidades
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h5 class="font-medium text-gray-900 dark:text-gray-100 mb-2 text-sm">
|
||||||
|
{{ product.name }}
|
||||||
|
</h5>
|
||||||
|
|
||||||
|
<div class="flex items-center justify-between">
|
||||||
|
<span class="text-xs text-gray-600 dark:text-gray-400">Valor total:</span>
|
||||||
|
<span class="text-sm font-semibold text-green-600 dark:text-green-400">
|
||||||
|
{{ formatCurrency(product.value) }}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</CardContent>
|
||||||
|
</Card>
|
||||||
|
|
||||||
<!-- Recent Movements -->
|
<!-- Recent Movements -->
|
||||||
<Card>
|
<Card>
|
||||||
<CardHeader>
|
<CardHeader>
|
||||||
@ -389,68 +436,7 @@ onMounted(() => {
|
|||||||
</CardContent>
|
</CardContent>
|
||||||
</Card>
|
</Card>
|
||||||
|
|
||||||
<!-- Stock by Products -->
|
|
||||||
<Card>
|
|
||||||
<CardHeader>
|
|
||||||
<CardTitle class="flex items-center space-x-2">
|
|
||||||
<GoogleIcon class="w-6 h-6 text-primary" name="inventory" />
|
|
||||||
<span>Stock por Productos</span>
|
|
||||||
</CardTitle>
|
|
||||||
<CardDescription>
|
|
||||||
Inventario actual de productos en este almacén
|
|
||||||
</CardDescription>
|
|
||||||
</CardHeader>
|
|
||||||
<CardContent>
|
|
||||||
<div v-for="warehouseStock in stockByWarehouse" :key="warehouseStock.warehouse" class="space-y-4">
|
|
||||||
<h4
|
|
||||||
class="font-semibold text-gray-900 dark:text-gray-100 border-b border-gray-200 dark:border-gray-700 pb-2">
|
|
||||||
{{ warehouseStock.warehouse }}
|
|
||||||
</h4>
|
|
||||||
|
|
||||||
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4">
|
|
||||||
<div v-for="product in warehouseStock.products" :key="product.code"
|
|
||||||
class="bg-gray-50 dark:bg-gray-800 rounded-lg p-4 hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors">
|
|
||||||
|
|
||||||
<div class="flex items-center justify-between mb-2">
|
|
||||||
<span
|
|
||||||
class="text-xs font-mono text-gray-500 bg-white dark:bg-gray-900 px-2 py-1 rounded">
|
|
||||||
{{ product.code }}
|
|
||||||
</span>
|
|
||||||
<span class="text-sm font-bold text-gray-900 dark:text-gray-100">
|
|
||||||
{{ product.stock }} unidades
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<h5 class="font-medium text-gray-900 dark:text-gray-100 mb-2 text-sm">
|
|
||||||
{{ product.name }}
|
|
||||||
</h5>
|
|
||||||
|
|
||||||
<div class="flex items-center justify-between">
|
|
||||||
<span class="text-xs text-gray-600 dark:text-gray-400">Valor total:</span>
|
|
||||||
<span class="text-sm font-semibold text-green-600 dark:text-green-400">
|
|
||||||
{{ formatCurrency(product.value) }}
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Progress bar for stock level -->
|
|
||||||
<div class="mt-3">
|
|
||||||
<div
|
|
||||||
class="flex items-center justify-between text-xs text-gray-600 dark:text-gray-400 mb-1">
|
|
||||||
<span>Stock</span>
|
|
||||||
<span>{{ Math.round((product.stock / 100) * 100) }}%</span>
|
|
||||||
</div>
|
|
||||||
<div class="w-full bg-gray-200 dark:bg-gray-700 rounded-full h-2">
|
|
||||||
<div class="h-2 rounded-full transition-all duration-300" :class="product.stock > 50 ? 'bg-green-500' :
|
|
||||||
product.stock > 20 ? 'bg-yellow-500' : 'bg-red-500'"
|
|
||||||
:style="`width: ${Math.min(100, (product.stock / 100) * 100)}%`">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</CardContent>
|
|
||||||
</Card>
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user