132 lines
4.7 KiB
JavaScript
Vendored
132 lines
4.7 KiB
JavaScript
Vendored
const App = {
|
|
setup() {
|
|
const state = Vue.reactive({
|
|
company: {
|
|
name: '',
|
|
emailAddress: '',
|
|
phoneNumber: '',
|
|
street: '',
|
|
city: '',
|
|
state: '',
|
|
zipCode: '',
|
|
country: ''
|
|
},
|
|
companyAddress: '',
|
|
warehouse: '',
|
|
number: '',
|
|
date: '',
|
|
pdfTransactionList: [],
|
|
isDownloading: false,
|
|
mappedItems: [],
|
|
movementTotal: 0
|
|
});
|
|
|
|
const services = {
|
|
getPDFData: async (id) => {
|
|
try {
|
|
const response = await AxiosManager.get('/StockCount/GetStockCountSingle?id=' + id, {});
|
|
return response;
|
|
} catch (error) {
|
|
throw error;
|
|
}
|
|
},
|
|
};
|
|
|
|
const methods = {
|
|
populatePDFData: async (id) => {
|
|
const response = await services.getPDFData(id);
|
|
state.pdfData = response?.data?.content?.data || {};
|
|
state.pdfTransactionList = response?.data?.content?.transactionList || [];
|
|
methods.bindPDFControls();
|
|
},
|
|
|
|
bindPDFControls: () => {
|
|
const company = StorageManager.getCompany() || state.company;
|
|
state.company = {
|
|
name: company.name,
|
|
emailAddress: company.emailAddress,
|
|
phoneNumber: company.phoneNumber,
|
|
street: company.street,
|
|
city: company.city,
|
|
state: company.state,
|
|
zipCode: company.zipCode,
|
|
country: company.country
|
|
};
|
|
state.companyAddress = [
|
|
company.street,
|
|
company.city,
|
|
company.state,
|
|
company.zipCode,
|
|
company.country
|
|
].filter(Boolean).join(', ');
|
|
|
|
const pdfData = state.pdfData;
|
|
state.warehouse = pdfData?.warehouse?.name || '';
|
|
|
|
state.number = pdfData?.number || '';
|
|
state.date = DateFormatManager.formatToLocale(pdfData?.countDate) || '';
|
|
|
|
state.mappedItems = (state.pdfTransactionList || []).map(item => ({
|
|
product: `${item.product?.number || ''} ${item.product?.name || ''}`.trim(),
|
|
systemStock: item.qtySCSys || 0,
|
|
counted: item.qtySCCount || 0,
|
|
adjustment: item.stock || 0,
|
|
}));
|
|
|
|
let movementTotal = (state.pdfTransactionList || []).reduce((sum, item) => sum + (item.qtySCCount || 0), 0);
|
|
state.movementTotal = NumberFormatManager.formatToLocale(movementTotal);
|
|
}
|
|
};
|
|
|
|
const handler = {
|
|
downloadPDF: async () => {
|
|
state.isDownloading = true;
|
|
await new Promise(resolve => setTimeout(resolve, 500));
|
|
|
|
try {
|
|
const { jsPDF } = window.jspdf;
|
|
const doc = new jsPDF('p', 'mm', 'a4');
|
|
const content = document.getElementById('content');
|
|
|
|
await html2canvas(content, {
|
|
scale: 2,
|
|
useCORS: true
|
|
}).then(canvas => {
|
|
const imgData = canvas.toDataURL('image/png');
|
|
const imgWidth = 210;
|
|
const pageHeight = 297;
|
|
const imgHeight = (canvas.height * imgWidth) / canvas.width;
|
|
let position = 0;
|
|
|
|
doc.addImage(imgData, 'PNG', 0, position, imgWidth, imgHeight);
|
|
doc.save(`stock-count-${state.number || 'unknown'}.pdf`);
|
|
});
|
|
} catch (error) {
|
|
console.error('Error generating PDF:', error);
|
|
} finally {
|
|
state.isDownloading = false;
|
|
}
|
|
},
|
|
};
|
|
|
|
Vue.onMounted(async () => {
|
|
try {
|
|
await SecurityManager.authorizePage(['StockCounts']);
|
|
var urlParams = new URLSearchParams(window.location.search);
|
|
var id = urlParams.get('id');
|
|
await methods.populatePDFData(id ?? '');
|
|
} catch (e) {
|
|
console.error('page init error:', e);
|
|
} finally {
|
|
|
|
}
|
|
});
|
|
|
|
return {
|
|
state,
|
|
handler,
|
|
};
|
|
}
|
|
};
|
|
|
|
Vue.createApp(App).mount('#app'); |