8682cb7e73
NPM Installation / build (16.x, ubuntu-latest) (push) Has been cancelled
NPM Installation / build (16.x, windows-latest) (push) Has been cancelled
NPM Installation / build (17.x, ubuntu-latest) (push) Has been cancelled
NPM Installation / build (17.x, windows-latest) (push) Has been cancelled
NPM Installation / build (18.x, ubuntu-latest) (push) Has been cancelled
NPM Installation / build (18.x, windows-latest) (push) Has been cancelled
14 lines
2.8 KiB
Vue
14 lines
2.8 KiB
Vue
<script setup>
|
|
import { onMounted, ref } from 'vue'
|
|
import BaseResponsiveDataView from '@/components/base/BaseResponsiveDataView.vue'
|
|
import { getTechnicianInventory, returnTechnicianInventory } from '@/services/warehouseService'
|
|
import { showError, showSuccess } from '@/utils/swal.js'
|
|
const loading=ref(true),items=ref([]),pagination=ref({}),modal=ref(false),selected=ref(null),form=ref({qty:1,notes:''})
|
|
const columns=[{key:'user',label:'Teknisi'},{key:'material_name',label:'Barang'},{key:'barcode',label:'Barcode'},{key:'tracking_label',label:'Tracking'},{key:'qty_label',label:'Jumlah/Sisa'},{key:'status',label:'Status'}]
|
|
async function load(q={page:1,per_page:10}){loading.value=true;try{const r=await getTechnicianInventory(q),d=r.data||{};items.value=(d.data||[]).map(x=>({...x,tracking_label:x.tracking_type==='serialized'?'Per Unit':'Quantity',qty_label:`${x.qty} ${x.unit}`}));pagination.value={current_page:d.current_page,last_page:d.last_page,per_page:d.per_page,total:d.total}}catch(e){showError(e?.response?.data?.message||'Gagal memuat peralatan teknisi.')}finally{loading.value=false}}
|
|
onMounted(load)
|
|
function openReturn(item){selected.value=item;form.value={qty:item.tracking_type==='serialized'?1:item.qty,notes:''};modal.value=true}
|
|
async function submitReturn(){try{const [prefix,id]=selected.value.id.split('-');await returnTechnicianInventory({source_type:prefix==='s'?'serialized':'quantity',source_id:Number(id),qty:form.value.qty,notes:form.value.notes});modal.value=false;showSuccess('Barang berhasil dikembalikan ke gudang.');await load()}catch(e){showError(e?.response?.data?.message||Object.values(e?.response?.data?.errors||{})?.[0]?.[0]||'Pengembalian gagal.')}}
|
|
</script>
|
|
<template><div class="brdvx-page-container"><div class="brdvx-page-header"><h5 class="mb-0">Peralatan di Teknisi</h5><small class="text-body-secondary">Barang dan material yang masih menjadi tanggung jawab masing-masing teknisi.</small></div><BaseResponsiveDataView :columns="columns" :items="items" :loading="loading" server-side :pagination="pagination" :actions="[{key:'return',label:'Kembalikan',color:'success'}]" @query-change="load" @action-click="({item})=>openReturn(item)" /></div><CModal :visible="modal" @close="modal=false"><CModalHeader><CModalTitle>Kembalikan ke Gudang</CModalTitle></CModalHeader><CModalBody><div class="d-grid gap-2"><div><strong>{{selected?.material_name}}</strong><div class="small text-body-secondary">{{selected?.barcode}} · {{selected?.user}}</div></div><CFormInput v-model="form.qty" type="number" min="0.01" :max="selected?.qty" :disabled="selected?.tracking_type==='serialized'" label="Jumlah dikembalikan"/><CFormTextarea v-model="form.notes" label="Catatan"/></div></CModalBody><CModalFooter><CButton @click="modal=false">Batal</CButton><CButton color="success" @click="submitReturn">Kembalikan</CButton></CModalFooter></CModal></template>
|