fixed win and loss
This commit is contained in:
parent
c1029e14f4
commit
5f77a084cc
|
|
@ -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>
|
|
||||||
"""
|
"""
|
||||||
),
|
),
|
||||||
# Скрытые поля для хранения значений
|
# Скрытые поля для хранения значений
|
||||||
|
|
|
||||||
|
|
@ -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');
|
||||||
Loading…
Reference in New Issue