fixed win and loss

This commit is contained in:
Ali 2025-09-01 21:38:34 +04:00
parent c1029e14f4
commit 5f77a084cc
2 changed files with 78 additions and 80 deletions

View File

@ -152,7 +152,7 @@ def create_custom_fields():
depends_on='eval:doc.company_main_activity && ["92000", "9200003", "9200004", "9200001", "9200002", "9200005"].includes(doc.company_main_activity)', depends_on='eval:doc.company_main_activity && ["92000", "9200003", "9200004", "9200001", "9200002", "9200005"].includes(doc.company_main_activity)',
allow_on_submit=1 allow_on_submit=1
), ),
# Won and Lost checkboxes after section_break_42 (в ряд) # Won and Lost checkboxes after section_break_42 (только HTML для v15)
dict( dict(
fieldname='won_lost_html', fieldname='won_lost_html',
fieldtype='HTML', fieldtype='HTML',
@ -169,58 +169,6 @@ def create_custom_fields():
<span>Lost</span> <span>Lost</span>
</label> </label>
</div> </div>
<script>
(function() {
// Ждем полной загрузки страницы и инициализации Frappe
setTimeout(function() {
if (typeof frappe === 'undefined' || !cur_frm) {
// Если Frappe еще не готов, ждем еще
setTimeout(arguments.callee, 500);
return;
}
const wonCheckbox = document.querySelector('.won-checkbox');
const lostCheckbox = document.querySelector('.lost-checkbox');
if (!wonCheckbox || !lostCheckbox) return;
// Синхронизация с текущими значениями полей
wonCheckbox.checked = cur_frm.doc.won ? true : false;
lostCheckbox.checked = cur_frm.doc.lost ? true : false;
// Обеспечиваем что всегда выбрана одна галочка
if (!wonCheckbox.checked && !lostCheckbox.checked) {
wonCheckbox.checked = true;
cur_frm.set_value('won', 1);
}
wonCheckbox.addEventListener('change', function() {
if (this.checked) {
lostCheckbox.checked = false;
cur_frm.set_value('lost', 0);
cur_frm.set_value('won', 1);
} else {
lostCheckbox.checked = true;
cur_frm.set_value('lost', 1);
cur_frm.set_value('won', 0);
}
});
lostCheckbox.addEventListener('change', function() {
if (this.checked) {
wonCheckbox.checked = false;
cur_frm.set_value('won', 0);
cur_frm.set_value('lost', 1);
} else {
wonCheckbox.checked = true;
cur_frm.set_value('won', 1);
cur_frm.set_value('lost', 0);
}
});
}, 1000); // Даем время на инициализацию Frappe
})();
</script>
""" """
), ),
# Скрытые поля для хранения значений # Скрытые поля для хранения значений

View File

@ -1,53 +1,103 @@
// Запускаем логику калькулятора НДС для Sales Invoice // Запускаем логику калькулятора НДС для Sales Invoice
jey_erp.vat_calculator.init('Sales Invoice'); jey_erp.vat_calculator.init('Sales Invoice');
// Объединенная логика для Sales Invoice // Логика для HTML галочек Won/Lost (совместимость с v15)
frappe.ui.form.on('Sales Invoice', { frappe.ui.form.on('Sales Invoice', {
refresh: function(frm) { refresh: function(frm) {
// Убедимся что одна из галочек won/lost всегда выбрана при загрузке формы // Убедимся что одна из галочек всегда выбрана при загрузке формы
if (!frm.doc.won && !frm.doc.lost) { if (!frm.doc.won && !frm.doc.lost) {
frm.set_value('won', 1); frm.set_value('won', 1);
} }
// Убедимся что хотя бы одна из галочек organizer/seller всегда выбрана при загрузке формы // Настройка HTML чекбоксов после загрузки формы
if (!frm.doc.organizer && !frm.doc.seller) { setTimeout(function() {
frm.set_value('organizer', 1); setup_won_lost_html_checkboxes(frm);
} }, 1000);
}, },
won: function(frm) { won: function(frm) {
// Синхронизируем HTML чекбоксы при изменении скрытых полей
update_html_checkboxes(frm);
if (frm.doc.won) { if (frm.doc.won) {
// Если Won выбрана, снимаем Lost
frm.set_value('lost', 0); frm.set_value('lost', 0);
} else { } else {
// Если Won снята, автоматически ставим Lost
frm.set_value('lost', 1); frm.set_value('lost', 1);
} }
}, },
lost: function(frm) { lost: function(frm) {
// Синхронизируем HTML чекбоксы при изменении скрытых полей
update_html_checkboxes(frm);
if (frm.doc.lost) { if (frm.doc.lost) {
// Если Lost выбрана, снимаем Won
frm.set_value('won', 0); frm.set_value('won', 0);
} else { } else {
// Если Lost снята, автоматически ставим Won
frm.set_value('won', 1); frm.set_value('won', 1);
} }
},
organizer: function(frm) {
// Если пытаются выключить organizer, но seller уже выключена - не позволяем
if (!frm.doc.organizer && !frm.doc.seller) {
frappe.msgprint(__('At least one option (Organizer or Seller) must be selected'));
frm.set_value('organizer', 1);
}
},
seller: function(frm) {
// Если пытаются выключить seller, но organizer уже выключена - не позволяем
if (!frm.doc.seller && !frm.doc.organizer) {
frappe.msgprint(__('At least one option (Organizer or Seller) must be selected'));
frm.set_value('seller', 1);
}
} }
}); });
// Функция настройки HTML чекбоксов
function setup_won_lost_html_checkboxes(frm) {
const wonCheckbox = document.querySelector('.won-checkbox');
const lostCheckbox = document.querySelector('.lost-checkbox');
if (!wonCheckbox || !lostCheckbox) return;
// Синхронизация с текущими значениями полей
wonCheckbox.checked = frm.doc.won ? true : false;
lostCheckbox.checked = frm.doc.lost ? true : false;
// Обеспечиваем что всегда выбрана одна галочка
if (!wonCheckbox.checked && !lostCheckbox.checked) {
wonCheckbox.checked = true;
frm.set_value('won', 1);
}
// Удаляем старые обработчики событий
wonCheckbox.removeEventListener('change', wonCheckbox._changeHandler);
lostCheckbox.removeEventListener('change', lostCheckbox._changeHandler);
// Добавляем новые обработчики событий
wonCheckbox._changeHandler = function() {
if (this.checked) {
lostCheckbox.checked = false;
frm.set_value('lost', 0);
frm.set_value('won', 1);
} else {
lostCheckbox.checked = true;
frm.set_value('lost', 1);
frm.set_value('won', 0);
}
};
lostCheckbox._changeHandler = function() {
if (this.checked) {
wonCheckbox.checked = false;
frm.set_value('won', 0);
frm.set_value('lost', 1);
} else {
wonCheckbox.checked = true;
frm.set_value('won', 1);
frm.set_value('lost', 0);
}
};
wonCheckbox.addEventListener('change', wonCheckbox._changeHandler);
lostCheckbox.addEventListener('change', lostCheckbox._changeHandler);
}
// Функция синхронизации HTML чекбоксов со скрытыми полями
function update_html_checkboxes(frm) {
setTimeout(function() {
const wonCheckbox = document.querySelector('.won-checkbox');
const lostCheckbox = document.querySelector('.lost-checkbox');
if (wonCheckbox && lostCheckbox) {
wonCheckbox.checked = frm.doc.won ? true : false;
lostCheckbox.checked = frm.doc.lost ? true : false;
}
}, 100);
}// Запускаем логику калькулятора НДС для Sales Invoice
jey_erp.vat_calculator.init('Sales Invoice');