dealflow-tracker / script.js
kaoshaos's picture
сделай сайт для учета сделок по продажам, додумай сам как сделать лучше, реализуй с помощью веб-технологий вроде HTML, CSS, JavaScript, PHPи базой данный SQL на первой странице должны быть представлены общая сумма на затраты на закупки, общая сумма продаж, маржинальность сделок, информация по сделками краткий список последних сделок, график статистики по продажам, сделки должны иметь собственный номер которые начинаются с MT сделки должны иметь статусы активные, в ожидании, завершены, отменены. В системе должен быть реализован поиск по сделками клиентам и поставщикам. В системе должна быть возможность учитывать клиентов поставщиков и сделки продаж по ним. при создании сделок должно открываться новое окно в котором будет табличная форма с редактируемыми полями "порядковый номер", "наименование товара", "количество", "цена за единицу с ндс 5%", "общая стоимость с ндс 5%", "накрутка в процентах", "наименование товара закупки", "цена закупки за шт.", "общая цена закупки за шт.", "поставщик товара", Столбец цена за единицу с ндс 5% должна зависеть от цена закупки за шт. и увеличиваться на процент указанный в столбике накрутка в процентах, при этом должна быть возможность менять цены в столбике "цена за единицу с ндс 5%" вручную если необходимо, должна быть возможность массовой работы с товарами на пример все проставить накрутку 30%, должна быть возможность указать что товар доставлен поставив галочку, должна быть возможность массовой загрузки товаров в таблицу с помощью excel, должен быть доступен импорт товаров путем скачивания таблицы excel на компьютер, должна быть возможность указывать поставщиков для каждой сделки, должна быть возможность добавлять множество сделок клиенту, у каждого клиента должна быть карточка в которой будет указаны какие сделки с ним совершались и какие товары он покупал, должна быть взаимосвязь между сделками клиентами и поставщиками, должна быть возможность хранить и заполнять данные о клиенте и поставщике такие как контактные данные почта телефон лицо для связи, должно быть место куда можно записать какие то комментарии, все расчеты должны быть в рублях, язык интерфейса русский
0c47432 verified
// Global functions for deal management
function openDealModal() {
const modal = document.querySelector('custom-deal-modal').shadowRoot.getElementById('dealModal');
modal.classList.remove('hidden');
document.body.classList.add('overflow-hidden');
feather.replace();
}
function closeDealModal() {
const modal = document.querySelector('custom-deal-modal').shadowRoot.getElementById('dealModal');
modal.classList.add('hidden');
document.body.classList.remove('overflow-hidden');
}
function createNewDeal() {
// Get all form data
const client = document.querySelector('custom-deal-modal').shadowRoot.getElementById('client').value;
const dealDate = document.querySelector('custom-deal-modal').shadowRoot.getElementById('dealDate').value;
const supplier = document.querySelector('custom-deal-modal').shadowRoot.getElementById('supplier').value;
const status = document.querySelector('custom-deal-modal').shadowRoot.getElementById('status').value;
const notes = document.querySelector('custom-deal-modal').shadowRoot.getElementById('notes').value;
// Get product table data
const productTable = document.querySelector('custom-product-table').shadowRoot.querySelector('#productTable');
const rows = productTable.querySelectorAll('tbody tr');
const items = [];
rows.forEach((row, index) => {
items.push({
item_number: index + 1,
product_name: row.querySelector('input[type="text"]').value,
quantity: parseInt(row.querySelector('.qty').value),
purchase_price: parseFloat(row.querySelector('.purchase-price').value),
margin: parseFloat(row.querySelector('.margin').value),
sale_price: parseFloat(row.querySelector('.sale-price').value),
supplier_id: row.querySelector('select').value,
delivered: row.querySelector('input[type="checkbox"]').checked
});
});
// Create deal object
const deal = {
client_id: client,
deal_date: dealDate,
supplier_id: supplier,
status: status,
notes: notes,
items: items
};
// Send to API
fetch('/api/deals.php', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(deal)
})
.then(response => response.json())
.then(data => {
if(data.success) {
alert(`Сделка ${data.deal_number} успешно создана!`);
closeDealModal();
window.location.reload();
} else {
alert('Ошибка при создании сделки: ' + data.error);
}
})
.catch(error => {
console.error('Error:', error);
alert('Произошла ошибка при создании сделки');
});
}
function applyMarginToAll() {
const margin = prompt('Введите наценку в процентах:', '30');
if (margin && !isNaN(margin)) {
const productTable = document.querySelector('custom-product-table').shadowRoot.querySelector('#productTable');
const rows = productTable.querySelectorAll('tbody tr');
rows.forEach(row => {
const purchasePrice = parseFloat(row.querySelector('.purchase-price').value);
const salePriceCell = row.querySelector('.sale-price');
const marginCell = row.querySelector('.margin');
if (purchasePrice && !isNaN(purchasePrice)) {
const newSalePrice = purchasePrice * (1 + (parseFloat(margin)/100));
salePriceCell.value = newSalePrice.toFixed(2);
marginCell.value = margin;
}
});
}
}
// Initialize app when DOM is loaded
document.addEventListener('DOMContentLoaded', function() {
feather.replace();
// Close modal when clicking outside
document.addEventListener('click', function(event) {
const modal = document.querySelector('custom-deal-modal');
if (modal && !modal.contains(event.target) && event.target.closest('custom-deal-modal') === null) {
closeDealModal();
}
});
});