feat(pos): add write-off functionality for showcase kits
Add support for writing off showcase kits by creating a write-off document with components, converting reservations, and updating statuses. - Add `write_off_from_showcase` static method to ShowcaseManager - Add API endpoint `/pos/api/product-kits/<int:kit_id>/write-off/` - Add write-off button to POS terminal UI - Implement confirmation dialog with detailed information - Add redirect to write-off document detail page after success The write-off process includes: 1. Creating a write-off document in draft state 2. Converting existing reservations to write-off document items 3. Marking the showcase item as dismantled 4. Setting the product kit status to discontinued (if not already) Breaking Changes: No
This commit is contained in:
@@ -1923,6 +1923,7 @@ async function openEditKitModal(kitId) {
|
||||
|
||||
// По<D09F><D0BE>азываем кнопку "Разобрать" и блок добавления товаров
|
||||
document.getElementById('disassembleKitBtn').style.display = 'block';
|
||||
document.getElementById('writeOffKitBtn').style.display = 'block';
|
||||
document.getElementById('showcaseKitQuantityBlock').style.display = 'none';
|
||||
document.getElementById('addProductBlock').style.display = 'block';
|
||||
|
||||
@@ -2554,6 +2555,53 @@ document.getElementById('disassembleKitBtn').addEventListener('click', async ()
|
||||
}
|
||||
});
|
||||
|
||||
// Обработчик кнопки "Списать букет"
|
||||
document.getElementById('writeOffKitBtn').addEventListener('click', async () => {
|
||||
if (!isEditMode || !editingKitId) {
|
||||
alert('Ошибка: режим редактирования не активен');
|
||||
return;
|
||||
}
|
||||
|
||||
// Запрос подтверждения
|
||||
const confirmed = confirm(
|
||||
'Вы уверены?\n\n' +
|
||||
'Букет будет списан:\n' +
|
||||
'• Будет создан документ списания с компонентами букета\n' +
|
||||
'• Комплект будет помечен как "Снят"\n' +
|
||||
'• Будет открыта страница документа для редактирования\n\n' +
|
||||
'Продолжить?'
|
||||
);
|
||||
|
||||
if (!confirmed) {
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
const response = await fetch(`/pos/api/product-kits/${editingKitId}/write-off/`, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'X-CSRFToken': getCsrfToken()
|
||||
}
|
||||
});
|
||||
|
||||
const data = await response.json();
|
||||
|
||||
if (data.success) {
|
||||
// Закрываем модальное окно
|
||||
const modal = bootstrap.Modal.getInstance(document.getElementById('createTempKitModal'));
|
||||
modal.hide();
|
||||
|
||||
// Перенаправляем на страницу документа
|
||||
window.location.href = data.redirect_url;
|
||||
} else {
|
||||
alert(`❌ Ошибка: ${data.error}`);
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Error writing off kit:', error);
|
||||
alert('Произошла ошибка при списании букета');
|
||||
}
|
||||
});
|
||||
|
||||
// Вспомогательная функция для определения мобильного устройства
|
||||
function isMobileDevice() {
|
||||
// Проверяем по юзер-агенту и размеру экрана
|
||||
@@ -2616,8 +2664,9 @@ document.getElementById('createTempKitModal').addEventListener('hidden.bs.modal'
|
||||
document.getElementById('createTempKitModalLabel').textContent = 'Создать витринный букет из корзины';
|
||||
document.getElementById('confirmCreateTempKit').innerHTML = '<i class="bi bi-check-circle"></i> Создать и зарезервировать';
|
||||
|
||||
// Скрываем кнопку "Разобрать" и блок добавления товаров
|
||||
// Скрываем кнопки "Разобрать" и "Списать" и блок добавления товаров
|
||||
document.getElementById('disassembleKitBtn').style.display = 'none';
|
||||
document.getElementById('writeOffKitBtn').style.display = 'none';
|
||||
document.getElementById('showcaseKitQuantityBlock').style.display = 'block';
|
||||
document.getElementById('addProductBlock').style.display = 'none';
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user