+
+ """
+ ),
+ # Скрытые поля для хранения значений
+ dict(
+ fieldname='won',
+ label='Won',
+ fieldtype='Check',
+ insert_after='won_lost_html',
+ hidden=1,
+ default=1,
+ allow_on_submit=1
+ ),
+ dict(
+ fieldname='lost',
+ label='Lost',
+ fieldtype='Check',
+ insert_after='won',
+ hidden=1,
+ default=0,
+ allow_on_submit=1
+ ),
# New comments section after time_sheet_list
dict(
fieldname='comments_section',
@@ -789,24 +906,30 @@ def create_custom_fields():
for doctype, fields in custom_fields.items():
for field in fields:
- # Check if fieldname exists before processing
+ # Проверяем наличие fieldname перед обработкой
if 'fieldname' not in field:
print(f"Skipping field without fieldname in {doctype}: {field}")
continue
- # Check if field already exists
+ # Удаление существующего поля, если оно уже есть
if frappe.db.exists("Custom Field", {"dt": doctype, "fieldname": field['fieldname']}):
- print(f"Field {field['fieldname']} already exists in {doctype}, skipping...")
- continue
-
- # Create field only if it doesn't exist yet
+ try:
+ custom_field_name = frappe.db.get_value("Custom Field", {"dt": doctype, "fieldname": field['fieldname']}, "name")
+ frappe.delete_doc("Custom Field", custom_field_name)
+ frappe.db.commit()
+ print(f"Deleted field {field['fieldname']} in {doctype}")
+ except Exception as e:
+ print(f"Failed to delete field {field['fieldname']} in {doctype}: {e}")
+
+ # Создание нового поля
try:
create_custom_field(doctype, field)
print(f"Created field {field['fieldname']} in {doctype}")
except Exception as e:
print(f"Failed to create field {field['fieldname']} in {doctype}: {e}")
- # Register the calculation hook for existing Sales Invoices
+ # Коммит всех изменений
+ frappe.db.commit()
print("Setting up VAT calculation hooks...")
create_custom_fields()
\ No newline at end of file
diff --git a/jey_erp/public/js/sales_invoice_vat.js b/jey_erp/public/js/sales_invoice_vat.js
index 050583b..a6a0a7a 100644
--- a/jey_erp/public/js/sales_invoice_vat.js
+++ b/jey_erp/public/js/sales_invoice_vat.js
@@ -1,2 +1,53 @@
// Запускаем логику калькулятора НДС для Sales Invoice
-jey_erp.vat_calculator.init('Sales Invoice');
\ No newline at end of file
+jey_erp.vat_calculator.init('Sales Invoice');
+
+// Объединенная логика для Sales Invoice
+frappe.ui.form.on('Sales Invoice', {
+ refresh: function(frm) {
+ // Убедимся что одна из галочек won/lost всегда выбрана при загрузке формы
+ if (!frm.doc.won && !frm.doc.lost) {
+ frm.set_value('won', 1);
+ }
+
+ // Убедимся что хотя бы одна из галочек organizer/seller всегда выбрана при загрузке формы
+ if (!frm.doc.organizer && !frm.doc.seller) {
+ frm.set_value('organizer', 1);
+ }
+ },
+
+ won: function(frm) {
+ if (frm.doc.won) {
+ // Если Won выбрана, снимаем Lost
+ frm.set_value('lost', 0);
+ } else {
+ // Если Won снята, автоматически ставим Lost
+ frm.set_value('lost', 1);
+ }
+ },
+
+ lost: function(frm) {
+ if (frm.doc.lost) {
+ // Если Lost выбрана, снимаем Won
+ frm.set_value('won', 0);
+ } else {
+ // Если Lost снята, автоматически ставим Won
+ 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);
+ }
+ }
+});
\ No newline at end of file