From 2d7ff5d4cf48018a83c60c47fe0d381eb5902d7a Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Tue, 12 Mar 2024 12:32:57 +0530 Subject: [PATCH 01/90] fix: Book depreciation until the asset disposal date and removed unwanted commits (cherry picked from commit dedae4fecf1e445e82869207f08b3dd04b1d6e17) --- erpnext/assets/doctype/asset/depreciation.py | 3 +-- .../asset_depreciation_schedule/asset_depreciation_schedule.py | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/erpnext/assets/doctype/asset/depreciation.py b/erpnext/assets/doctype/asset/depreciation.py index 42a93a85e36..b968736cee7 100644 --- a/erpnext/assets/doctype/asset/depreciation.py +++ b/erpnext/assets/doctype/asset/depreciation.py @@ -242,9 +242,7 @@ def make_depreciation_entry( debit_account, accounting_dimensions, ) - frappe.db.commit() except Exception as e: - frappe.db.rollback() depreciation_posting_error = e asset.set_status() @@ -523,6 +521,7 @@ def depreciate_asset(asset_doc, date, notes): make_depreciation_entry_for_all_asset_depr_schedules(asset_doc, date) + asset_doc.reload() cancel_depreciation_entries(asset_doc, date) diff --git a/erpnext/assets/doctype/asset_depreciation_schedule/asset_depreciation_schedule.py b/erpnext/assets/doctype/asset_depreciation_schedule/asset_depreciation_schedule.py index 77469df8955..6e165089334 100644 --- a/erpnext/assets/doctype/asset_depreciation_schedule/asset_depreciation_schedule.py +++ b/erpnext/assets/doctype/asset_depreciation_schedule/asset_depreciation_schedule.py @@ -327,7 +327,7 @@ class AssetDepreciationSchedule(Document): schedule_date = get_last_day(schedule_date) # if asset is being sold or scrapped - if date_of_disposal: + if date_of_disposal and getdate(schedule_date) >= getdate(date_of_disposal): from_date = add_months( getdate(asset_doc.available_for_use_date), (asset_doc.number_of_depreciations_booked * row.frequency_of_depreciation), From 5310ec38ca68d72909f4a0783d90c7a6a99600bb Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Wed, 20 Mar 2024 13:18:23 +0530 Subject: [PATCH 02/90] fix: pick list not picked qty less than 1 (cherry picked from commit 1a9ae33110371655e9ef88d6904c0c03f985ec90) --- erpnext/stock/doctype/pick_list/pick_list.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/stock/doctype/pick_list/pick_list.py b/erpnext/stock/doctype/pick_list/pick_list.py index 627520c1dcd..4eab7e8a0cf 100644 --- a/erpnext/stock/doctype/pick_list/pick_list.py +++ b/erpnext/stock/doctype/pick_list/pick_list.py @@ -778,7 +778,7 @@ def get_available_item_locations( if picked_item_details: for location in list(locations): - if location["qty"] < 1: + if location["qty"] < 0: locations.remove(location) total_qty_available = sum(location.get("qty") for location in locations) From d287ed5e47c31b790b169872b62bbb90b79c3bfb Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Wed, 20 Mar 2024 14:56:07 +0530 Subject: [PATCH 03/90] fix: Cannot read properties of undefined (reading 'rate') (cherry picked from commit ac92a229149292f41dfc5f9f96e3e9d4bbce8b64) --- erpnext/public/js/controllers/transaction.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/erpnext/public/js/controllers/transaction.js b/erpnext/public/js/controllers/transaction.js index 9e3fac15305..40c67927e18 100644 --- a/erpnext/public/js/controllers/transaction.js +++ b/erpnext/public/js/controllers/transaction.js @@ -1266,8 +1266,11 @@ erpnext.TransactionController = class TransactionController extends erpnext.taxe calculate_stock_uom_rate(doc, cdt, cdn) { let item = frappe.get_doc(cdt, cdn); - item.stock_uom_rate = flt(item.rate)/flt(item.conversion_factor); - refresh_field("stock_uom_rate", item.name, item.parentfield); + + if (item?.rate) { + item.stock_uom_rate = flt(item.rate) / flt(item.conversion_factor); + refresh_field("stock_uom_rate", item.name, item.parentfield); + } } service_stop_date(frm, cdt, cdn) { var child = locals[cdt][cdn]; From cf49cec20366fc98491f0987e3891fce93fb1d94 Mon Sep 17 00:00:00 2001 From: barredterra <14891507+barredterra@users.noreply.github.com> Date: Tue, 19 Mar 2024 12:29:50 +0100 Subject: [PATCH 04/90] fix: translatability of bom configurator labels (cherry picked from commit 4cfe99d74f2390a87410723aaedcc3d72dab1545) --- .../js/bom_configurator/bom_configurator.bundle.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/erpnext/public/js/bom_configurator/bom_configurator.bundle.js b/erpnext/public/js/bom_configurator/bom_configurator.bundle.js index 454a2a4709f..5061be9d20a 100644 --- a/erpnext/public/js/bom_configurator/bom_configurator.bundle.js +++ b/erpnext/public/js/bom_configurator/bom_configurator.bundle.js @@ -107,7 +107,7 @@ class BOMConfigurator { this.frm?.doc.docstatus === 0 ? [ { - label: __(frappe.utils.icon("edit", "sm") + " Qty"), + label: `${frappe.utils.icon("edit", "sm")} ${__("Qty")}`, click: function (node) { let view = frappe.views.trees["BOM Configurator"]; view.events.edit_qty(node, view); @@ -115,7 +115,7 @@ class BOMConfigurator { btnClass: "hidden-xs", }, { - label: __(frappe.utils.icon("add", "sm") + " Raw Material"), + label: `${frappe.utils.icon("add", "sm")} ${__("Raw Material")}`, click: function (node) { let view = frappe.views.trees["BOM Configurator"]; view.events.add_item(node, view); @@ -126,7 +126,7 @@ class BOMConfigurator { btnClass: "hidden-xs", }, { - label: __(frappe.utils.icon("add", "sm") + " Sub Assembly"), + label: `${frappe.utils.icon("add", "sm")} ${__("Sub Assembly")}`, click: function (node) { let view = frappe.views.trees["BOM Configurator"]; view.events.add_sub_assembly(node, view); @@ -156,7 +156,7 @@ class BOMConfigurator { btnClass: "hidden-xs expand-all-btn", }, { - label: __(frappe.utils.icon("move", "sm") + " Sub Assembly"), + label: `${frappe.utils.icon("move", "sm")} ${__("Sub Assembly")}`, click: function (node) { let view = frappe.views.trees["BOM Configurator"]; view.events.convert_to_sub_assembly(node, view); @@ -167,7 +167,7 @@ class BOMConfigurator { btnClass: "hidden-xs", }, { - label: __(frappe.utils.icon("delete", "sm") + __(" Item")), + label: `${frappe.utils.icon("delete", "sm")} ${__("Item")}`, click: function (node) { let view = frappe.views.trees["BOM Configurator"]; view.events.delete_node(node, view); From a95bb27c65ad3c57b71ec4ea0b2ef9872e665be4 Mon Sep 17 00:00:00 2001 From: Gursheen Anand Date: Wed, 20 Mar 2024 16:09:14 +0530 Subject: [PATCH 05/90] fix: use Text Editor for rendering tax breakup table (cherry picked from commit 1c639838736dee633c435ec728e4b7319cbd9748) # Conflicts: # erpnext/buying/doctype/purchase_order/purchase_order.json # erpnext/buying/doctype/supplier_quotation/supplier_quotation.json --- erpnext/accounts/doctype/pos_invoice/pos_invoice.json | 4 ++-- erpnext/accounts/doctype/pos_invoice/pos_invoice.py | 2 +- .../accounts/doctype/purchase_invoice/purchase_invoice.json | 4 ++-- .../accounts/doctype/purchase_invoice/purchase_invoice.py | 2 +- erpnext/accounts/doctype/sales_invoice/sales_invoice.json | 6 +++--- erpnext/accounts/doctype/sales_invoice/sales_invoice.py | 2 +- erpnext/buying/doctype/purchase_order/purchase_order.json | 6 +++++- erpnext/buying/doctype/purchase_order/purchase_order.py | 3 ++- .../doctype/supplier_quotation/supplier_quotation.json | 6 +++++- .../buying/doctype/supplier_quotation/supplier_quotation.py | 2 +- erpnext/selling/doctype/quotation/quotation.json | 4 ++-- erpnext/selling/doctype/quotation/quotation.py | 2 +- erpnext/selling/doctype/sales_order/sales_order.json | 4 ++-- erpnext/selling/doctype/sales_order/sales_order.py | 4 +++- erpnext/stock/doctype/delivery_note/delivery_note.json | 4 ++-- erpnext/stock/doctype/delivery_note/delivery_note.py | 4 ++-- .../stock/doctype/purchase_receipt/purchase_receipt.json | 4 ++-- erpnext/stock/doctype/purchase_receipt/purchase_receipt.py | 2 +- 18 files changed, 38 insertions(+), 27 deletions(-) diff --git a/erpnext/accounts/doctype/pos_invoice/pos_invoice.json b/erpnext/accounts/doctype/pos_invoice/pos_invoice.json index 955b66a1b81..d7b173667ec 100644 --- a/erpnext/accounts/doctype/pos_invoice/pos_invoice.json +++ b/erpnext/accounts/doctype/pos_invoice/pos_invoice.json @@ -775,7 +775,7 @@ }, { "fieldname": "other_charges_calculation", - "fieldtype": "Long Text", + "fieldtype": "Text Editor", "label": "Taxes and Charges Calculation", "no_copy": 1, "oldfieldtype": "HTML", @@ -1563,7 +1563,7 @@ "icon": "fa fa-file-text", "is_submittable": 1, "links": [], - "modified": "2023-11-20 12:27:12.848149", + "modified": "2024-03-20 16:00:34.268756", "modified_by": "Administrator", "module": "Accounts", "name": "POS Invoice", diff --git a/erpnext/accounts/doctype/pos_invoice/pos_invoice.py b/erpnext/accounts/doctype/pos_invoice/pos_invoice.py index 9b0b3ecfab7..eb96cd12094 100644 --- a/erpnext/accounts/doctype/pos_invoice/pos_invoice.py +++ b/erpnext/accounts/doctype/pos_invoice/pos_invoice.py @@ -109,7 +109,7 @@ class POSInvoice(SalesInvoice): loyalty_redemption_cost_center: DF.Link | None naming_series: DF.Literal["ACC-PSINV-.YYYY.-"] net_total: DF.Currency - other_charges_calculation: DF.LongText | None + other_charges_calculation: DF.TextEditor | None outstanding_amount: DF.Currency packed_items: DF.Table[PackedItem] paid_amount: DF.Currency diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json index d6e606f73b5..9e8bf78a2f1 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json @@ -760,7 +760,7 @@ }, { "fieldname": "other_charges_calculation", - "fieldtype": "Long Text", + "fieldtype": "Text Editor", "label": "Taxes and Charges Calculation", "no_copy": 1, "oldfieldtype": "HTML", @@ -1637,7 +1637,7 @@ "idx": 204, "is_submittable": 1, "links": [], - "modified": "2024-03-11 14:46:30.298184", + "modified": "2024-03-20 15:57:00.736868", "modified_by": "Administrator", "module": "Accounts", "name": "Purchase Invoice", diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py index ee3ec82ea89..2072217247d 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py @@ -147,7 +147,7 @@ class PurchaseInvoice(BuyingController): net_total: DF.Currency on_hold: DF.Check only_include_allocated_payments: DF.Check - other_charges_calculation: DF.LongText | None + other_charges_calculation: DF.TextEditor | None outstanding_amount: DF.Currency paid_amount: DF.Currency party_account_currency: DF.Link | None diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json index 4f6e5ba9206..2792c18b862 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json @@ -944,7 +944,7 @@ }, { "fieldname": "other_charges_calculation", - "fieldtype": "Long Text", + "fieldtype": "Text Editor", "hide_days": 1, "hide_seconds": 1, "label": "Taxes and Charges Calculation", @@ -2184,7 +2184,7 @@ "link_fieldname": "consolidated_invoice" } ], - "modified": "2024-03-15 16:44:17.778370", + "modified": "2024-03-20 16:02:52.237732", "modified_by": "Administrator", "module": "Accounts", "name": "Sales Invoice", @@ -2239,4 +2239,4 @@ "title_field": "title", "track_changes": 1, "track_seen": 1 -} +} \ No newline at end of file diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py index 02a61d1cd9c..e04685e43da 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py @@ -146,7 +146,7 @@ class SalesInvoice(SellingController): naming_series: DF.Literal["ACC-SINV-.YYYY.-", "ACC-SINV-RET-.YYYY.-"] net_total: DF.Currency only_include_allocated_payments: DF.Check - other_charges_calculation: DF.LongText | None + other_charges_calculation: DF.TextEditor | None outstanding_amount: DF.Currency packed_items: DF.Table[PackedItem] paid_amount: DF.Currency diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.json b/erpnext/buying/doctype/purchase_order/purchase_order.json index f74df6630e9..b57a887d900 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.json +++ b/erpnext/buying/doctype/purchase_order/purchase_order.json @@ -641,7 +641,7 @@ }, { "fieldname": "other_charges_calculation", - "fieldtype": "Long Text", + "fieldtype": "Text Editor", "label": "Taxes and Charges Calculation", "no_copy": 1, "oldfieldtype": "HTML", @@ -1275,7 +1275,11 @@ "idx": 105, "is_submittable": 1, "links": [], +<<<<<<< HEAD "modified": "2023-10-01 20:58:07.851037", +======= + "modified": "2024-03-20 16:03:31.611808", +>>>>>>> 1c63983873 (fix: use Text Editor for rendering tax breakup table) "modified_by": "Administrator", "module": "Buying", "name": "Purchase Order", diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.py b/erpnext/buying/doctype/purchase_order/purchase_order.py index 9ca20a9ba2f..09ff381feff 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.py +++ b/erpnext/buying/doctype/purchase_order/purchase_order.py @@ -57,6 +57,7 @@ class PurchaseOrder(BuyingController): additional_discount_percentage: DF.Float address_display: DF.SmallText | None advance_paid: DF.Currency + advance_payment_status: DF.Literal["Not Initiated", "Initiated", "Partially Paid", "Fully Paid"] amended_from: DF.Link | None apply_discount_on: DF.Literal["", "Grand Total", "Net Total"] apply_tds: DF.Check @@ -109,7 +110,7 @@ class PurchaseOrder(BuyingController): net_total: DF.Currency order_confirmation_date: DF.Date | None order_confirmation_no: DF.Data | None - other_charges_calculation: DF.LongText | None + other_charges_calculation: DF.TextEditor | None party_account_currency: DF.Link | None payment_schedule: DF.Table[PaymentSchedule] payment_terms_template: DF.Link | None diff --git a/erpnext/buying/doctype/supplier_quotation/supplier_quotation.json b/erpnext/buying/doctype/supplier_quotation/supplier_quotation.json index d3c80cc49e7..2d2633feff5 100644 --- a/erpnext/buying/doctype/supplier_quotation/supplier_quotation.json +++ b/erpnext/buying/doctype/supplier_quotation/supplier_quotation.json @@ -462,7 +462,7 @@ }, { "fieldname": "other_charges_calculation", - "fieldtype": "Long Text", + "fieldtype": "Markdown Editor", "label": "Taxes and Charges Calculation", "no_copy": 1, "oldfieldtype": "HTML", @@ -928,7 +928,11 @@ "index_web_pages_for_search": 1, "is_submittable": 1, "links": [], +<<<<<<< HEAD "modified": "2023-11-20 11:15:30.083077", +======= + "modified": "2024-03-20 16:03:59.069145", +>>>>>>> 1c63983873 (fix: use Text Editor for rendering tax breakup table) "modified_by": "Administrator", "module": "Buying", "name": "Supplier Quotation", diff --git a/erpnext/buying/doctype/supplier_quotation/supplier_quotation.py b/erpnext/buying/doctype/supplier_quotation/supplier_quotation.py index e2b737ba6fe..b716f7f0427 100644 --- a/erpnext/buying/doctype/supplier_quotation/supplier_quotation.py +++ b/erpnext/buying/doctype/supplier_quotation/supplier_quotation.py @@ -71,7 +71,7 @@ class SupplierQuotation(BuyingController): naming_series: DF.Literal["PUR-SQTN-.YYYY.-"] net_total: DF.Currency opportunity: DF.Link | None - other_charges_calculation: DF.LongText | None + other_charges_calculation: DF.MarkdownEditor | None plc_conversion_rate: DF.Float price_list_currency: DF.Link | None pricing_rules: DF.Table[PricingRuleDetail] diff --git a/erpnext/selling/doctype/quotation/quotation.json b/erpnext/selling/doctype/quotation/quotation.json index 8c816cf6e4e..982e7326775 100644 --- a/erpnext/selling/doctype/quotation/quotation.json +++ b/erpnext/selling/doctype/quotation/quotation.json @@ -557,7 +557,7 @@ }, { "fieldname": "other_charges_calculation", - "fieldtype": "Long Text", + "fieldtype": "Text Editor", "label": "Taxes and Charges Calculation", "no_copy": 1, "oldfieldtype": "HTML", @@ -1073,7 +1073,7 @@ "idx": 82, "is_submittable": 1, "links": [], - "modified": "2023-06-03 16:21:04.980033", + "modified": "2024-03-20 16:04:21.567847", "modified_by": "Administrator", "module": "Selling", "name": "Quotation", diff --git a/erpnext/selling/doctype/quotation/quotation.py b/erpnext/selling/doctype/quotation/quotation.py index 5541cc711e7..4835c0c27d3 100644 --- a/erpnext/selling/doctype/quotation/quotation.py +++ b/erpnext/selling/doctype/quotation/quotation.py @@ -78,7 +78,7 @@ class Quotation(SellingController): opportunity: DF.Link | None order_lost_reason: DF.SmallText | None order_type: DF.Literal["", "Sales", "Maintenance", "Shopping Cart"] - other_charges_calculation: DF.LongText | None + other_charges_calculation: DF.TextEditor | None packed_items: DF.Table[PackedItem] party_name: DF.DynamicLink | None payment_schedule: DF.Table[PaymentSchedule] diff --git a/erpnext/selling/doctype/sales_order/sales_order.json b/erpnext/selling/doctype/sales_order/sales_order.json index 01d047ceadb..1c144749074 100644 --- a/erpnext/selling/doctype/sales_order/sales_order.json +++ b/erpnext/selling/doctype/sales_order/sales_order.json @@ -776,7 +776,7 @@ }, { "fieldname": "other_charges_calculation", - "fieldtype": "Long Text", + "fieldtype": "Text Editor", "hide_days": 1, "hide_seconds": 1, "label": "Taxes and Charges Calculation", @@ -1644,7 +1644,7 @@ "idx": 105, "is_submittable": 1, "links": [], - "modified": "2023-10-18 12:41:54.813462", + "modified": "2024-03-20 16:04:43.627183", "modified_by": "Administrator", "module": "Selling", "name": "Sales Order", diff --git a/erpnext/selling/doctype/sales_order/sales_order.py b/erpnext/selling/doctype/sales_order/sales_order.py index aafacdfa907..3c7215cae30 100755 --- a/erpnext/selling/doctype/sales_order/sales_order.py +++ b/erpnext/selling/doctype/sales_order/sales_order.py @@ -66,6 +66,7 @@ class SalesOrder(SellingController): additional_discount_percentage: DF.Float address_display: DF.SmallText | None advance_paid: DF.Currency + advance_payment_status: DF.Literal["Not Requested", "Requested", "Partially Paid", "Fully Paid"] amended_from: DF.Link | None amount_eligible_for_commission: DF.Currency apply_discount_on: DF.Literal["", "Grand Total", "Net Total"] @@ -122,7 +123,7 @@ class SalesOrder(SellingController): naming_series: DF.Literal["SAL-ORD-.YYYY.-"] net_total: DF.Currency order_type: DF.Literal["", "Sales", "Maintenance", "Shopping Cart"] - other_charges_calculation: DF.LongText | None + other_charges_calculation: DF.TextEditor | None packed_items: DF.Table[PackedItem] party_account_currency: DF.Link | None payment_schedule: DF.Table[PaymentSchedule] @@ -155,6 +156,7 @@ class SalesOrder(SellingController): "", "Draft", "On Hold", + "To Pay", "To Deliver and Bill", "To Bill", "To Deliver", diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.json b/erpnext/stock/doctype/delivery_note/delivery_note.json index d07a825331d..87c333370b2 100644 --- a/erpnext/stock/doctype/delivery_note/delivery_note.json +++ b/erpnext/stock/doctype/delivery_note/delivery_note.json @@ -680,7 +680,7 @@ }, { "fieldname": "other_charges_calculation", - "fieldtype": "Long Text", + "fieldtype": "Text Editor", "label": "Taxes and Charges Calculation", "no_copy": 1, "oldfieldtype": "HTML", @@ -1397,7 +1397,7 @@ "idx": 146, "is_submittable": 1, "links": [], - "modified": "2024-03-05 11:58:47.784349", + "modified": "2024-03-20 16:05:02.854990", "modified_by": "Administrator", "module": "Stock", "name": "Delivery Note", diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.py b/erpnext/stock/doctype/delivery_note/delivery_note.py index 4c2c023b6ae..fb19d0ec20b 100644 --- a/erpnext/stock/doctype/delivery_note/delivery_note.py +++ b/erpnext/stock/doctype/delivery_note/delivery_note.py @@ -76,7 +76,7 @@ class DeliveryNote(SellingController): ignore_pricing_rule: DF.Check in_words: DF.Data | None incoterm: DF.Link | None - installation_status: DF.Literal + installation_status: DF.Literal[None] instructions: DF.Text | None inter_company_reference: DF.Link | None is_internal_customer: DF.Check @@ -90,7 +90,7 @@ class DeliveryNote(SellingController): named_place: DF.Data | None naming_series: DF.Literal["MAT-DN-.YYYY.-", "MAT-DN-RET-.YYYY.-"] net_total: DF.Currency - other_charges_calculation: DF.LongText | None + other_charges_calculation: DF.TextEditor | None packed_items: DF.Table[PackedItem] per_billed: DF.Percent per_installed: DF.Percent diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.json b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.json index a1810221219..b926e9826eb 100755 --- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.json +++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.json @@ -651,7 +651,7 @@ }, { "fieldname": "other_charges_calculation", - "fieldtype": "Long Text", + "fieldtype": "Text Editor", "label": "Taxes and Charges Calculation", "no_copy": 1, "oldfieldtype": "HTML", @@ -1252,7 +1252,7 @@ "idx": 261, "is_submittable": 1, "links": [], - "modified": "2023-12-18 17:26:41.279663", + "modified": "2024-03-20 16:05:31.713453", "modified_by": "Administrator", "module": "Stock", "name": "Purchase Receipt", diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py index e249cf386fa..ed43d553713 100644 --- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py +++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py @@ -86,7 +86,7 @@ class PurchaseReceipt(BuyingController): named_place: DF.Data | None naming_series: DF.Literal["MAT-PRE-.YYYY.-", "MAT-PR-RET-.YYYY.-"] net_total: DF.Currency - other_charges_calculation: DF.LongText | None + other_charges_calculation: DF.TextEditor | None per_billed: DF.Percent per_returned: DF.Percent plc_conversion_rate: DF.Float From 501b09a170c94e803ac8f7a682ddd5b6f45e32c9 Mon Sep 17 00:00:00 2001 From: Ankush Menat Date: Wed, 20 Mar 2024 16:56:30 +0530 Subject: [PATCH 06/90] fix: style for tax breakup (cherry picked from commit 967540da18351705dfdcf7bebae62d5445eec7e2) --- erpnext/public/scss/erpnext.scss | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/erpnext/public/scss/erpnext.scss b/erpnext/public/scss/erpnext.scss index e45ae5038f5..03dd31104e1 100644 --- a/erpnext/public/scss/erpnext.scss +++ b/erpnext/public/scss/erpnext.scss @@ -548,3 +548,7 @@ body[data-route="pos"] { align-items: center; justify-content: center; } + +.frappe-control[data-fieldname="other_charges_calculation"] .ql-editor { + white-space: normal; +} From 03fc3cec70c5e84a002d59c257be68bb09181fe1 Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Sat, 3 Feb 2024 11:58:11 +0530 Subject: [PATCH 07/90] refactor: more options for 'status' and move it to top (cherry picked from commit 0d65d878deb717b80a22cae4d152d07289acae58) --- .../transaction_deletion_record.json | 22 ++++++++++++++----- .../transaction_deletion_record.py | 2 +- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.json b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.json index 23e59472a6d..8f3a5d05666 100644 --- a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.json +++ b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.json @@ -7,10 +7,12 @@ "engine": "InnoDB", "field_order": [ "company", + "column_break_txbg", + "status", + "section_break_tbej", "doctypes", "doctypes_to_be_ignored", - "amended_from", - "status" + "amended_from" ], "fields": [ { @@ -46,18 +48,27 @@ { "fieldname": "status", "fieldtype": "Select", - "hidden": 1, "label": "Status", - "options": "Draft\nCompleted" + "options": "Queued\nRunning\nFailed\nCompleted\nCancelled", + "read_only": 1 + }, + { + "fieldname": "column_break_txbg", + "fieldtype": "Column Break" + }, + { + "fieldname": "section_break_tbej", + "fieldtype": "Section Break" } ], "index_web_pages_for_search": 1, "is_submittable": 1, "links": [], - "modified": "2021-08-04 20:15:59.071493", + "modified": "2024-02-03 12:42:21.628177", "modified_by": "Administrator", "module": "Setup", "name": "Transaction Deletion Record", + "naming_rule": "Expression (old style)", "owner": "Administrator", "permissions": [ { @@ -76,5 +87,6 @@ ], "sort_field": "modified", "sort_order": "DESC", + "states": [], "track_changes": 1 } \ No newline at end of file diff --git a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py index 88c4b078977..cbe7e05adb4 100644 --- a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py +++ b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py @@ -26,7 +26,7 @@ class TransactionDeletionRecord(Document): company: DF.Link doctypes: DF.Table[TransactionDeletionRecordItem] doctypes_to_be_ignored: DF.Table[TransactionDeletionRecordItem] - status: DF.Literal["Draft", "Completed"] + status: DF.Literal["Queued", "Running", "Completed"] # end: auto-generated types def __init__(self, *args, **kwargs): From 529abd619a6329ebdcc4785ff7e464a94cc8a1e8 Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Sat, 3 Feb 2024 12:46:12 +0530 Subject: [PATCH 08/90] refactor: set status and trigger job on submit (cherry picked from commit 6fbb67b1d2da1fe9aa1879ce354f5702150584c8) --- .../transaction_deletion_record.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py index cbe7e05adb4..073eec29a36 100644 --- a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py +++ b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py @@ -26,7 +26,7 @@ class TransactionDeletionRecord(Document): company: DF.Link doctypes: DF.Table[TransactionDeletionRecordItem] doctypes_to_be_ignored: DF.Table[TransactionDeletionRecordItem] - status: DF.Literal["Queued", "Running", "Completed"] + status: DF.Literal["Queued", "Running", "Failed", "Completed", "Cancelled"] # end: auto-generated types def __init__(self, *args, **kwargs): @@ -52,6 +52,16 @@ class TransactionDeletionRecord(Document): if not self.doctypes_to_be_ignored: self.populate_doctypes_to_be_ignored_table() + def before_save(self): + self.status = "" + + def on_submit(self): + self.db_set("status", "Queued") + + def on_cancel(self): + self.db_set("status", "Cancelled") + + def start_deletion_process(self): self.delete_bins() self.delete_lead_addresses() self.reset_company_values() From 9c5108e4925023b0cad13e335d0dc66f81bd58bb Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Sat, 3 Feb 2024 14:29:04 +0530 Subject: [PATCH 09/90] refactor: tasks section and UI niceties (cherry picked from commit d0dc2c6e77c4e04e8d74a36a632ad6f2189dfedc) --- .../transaction_deletion_record.json | 53 ++++++++++++++++++- .../transaction_deletion_record.py | 19 +++++++ 2 files changed, 71 insertions(+), 1 deletion(-) diff --git a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.json b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.json index 8f3a5d05666..a9e04d3892e 100644 --- a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.json +++ b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.json @@ -9,6 +9,12 @@ "company", "column_break_txbg", "status", + "tasks_section", + "delete_bin_data", + "delete_leads_and_addresses", + "reset_company_default_values", + "clear_notifications", + "delete_transactions", "section_break_tbej", "doctypes", "doctypes_to_be_ignored", @@ -59,12 +65,57 @@ { "fieldname": "section_break_tbej", "fieldtype": "Section Break" + }, + { + "fieldname": "tasks_section", + "fieldtype": "Section Break", + "label": "Tasks" + }, + { + "default": "0", + "fieldname": "delete_bin_data", + "fieldtype": "Check", + "label": "Delete Bins", + "no_copy": 1, + "read_only": 1 + }, + { + "default": "0", + "fieldname": "delete_leads_and_addresses", + "fieldtype": "Check", + "label": "Delete Leads and Addresses", + "no_copy": 1, + "read_only": 1 + }, + { + "default": "0", + "fieldname": "clear_notifications", + "fieldtype": "Check", + "label": "Clear Notifications", + "no_copy": 1, + "read_only": 1 + }, + { + "default": "0", + "fieldname": "reset_company_default_values", + "fieldtype": "Check", + "label": "Reset Company Default Values", + "no_copy": 1, + "read_only": 1 + }, + { + "default": "0", + "fieldname": "delete_transactions", + "fieldtype": "Check", + "label": "Delete Transactions", + "no_copy": 1, + "read_only": 1 } ], "index_web_pages_for_search": 1, "is_submittable": 1, "links": [], - "modified": "2024-02-03 12:42:21.628177", + "modified": "2024-02-03 14:40:40.207482", "modified_by": "Administrator", "module": "Setup", "name": "Transaction Deletion Record", diff --git a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py index 073eec29a36..f1f6a5b90d3 100644 --- a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py +++ b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py @@ -23,9 +23,14 @@ class TransactionDeletionRecord(Document): ) amended_from: DF.Link | None + clear_notifications: DF.Check company: DF.Link + delete_bin_data: DF.Check + delete_leads_and_addresses: DF.Check + delete_transactions: DF.Check doctypes: DF.Table[TransactionDeletionRecordItem] doctypes_to_be_ignored: DF.Table[TransactionDeletionRecordItem] + reset_company_default_values: DF.Check status: DF.Literal["Queued", "Running", "Failed", "Completed", "Cancelled"] # end: auto-generated types @@ -52,8 +57,16 @@ class TransactionDeletionRecord(Document): if not self.doctypes_to_be_ignored: self.populate_doctypes_to_be_ignored_table() + def reset_task_flags(self): + self.clear_notifications = 0 + self.delete_bin_data = 0 + self.delete_leads_and_addresses = 0 + self.delete_transactions = 0 + self.reset_company_default_values = 0 + def before_save(self): self.status = "" + self.reset_task_flags() def on_submit(self): self.db_set("status", "Queued") @@ -61,11 +74,13 @@ class TransactionDeletionRecord(Document): def on_cancel(self): self.db_set("status", "Cancelled") + @frappe.whitelist() def start_deletion_process(self): self.delete_bins() self.delete_lead_addresses() self.reset_company_values() clear_notifications() + self.db_set("clear_notifications", 1) self.delete_company_transactions() def populate_doctypes_to_be_ignored_table(self): @@ -79,6 +94,7 @@ class TransactionDeletionRecord(Document): (select name from tabWarehouse where company=%s)""", self.company, ) + self.db_set("delete_bin_data", 1) def delete_lead_addresses(self): """Delete addresses to which leads are linked""" @@ -117,12 +133,14 @@ class TransactionDeletionRecord(Document): leads=",".join(leads) ) ) + self.db_set("delete_leads_and_addresses", 1) def reset_company_values(self): company_obj = frappe.get_doc("Company", self.company) company_obj.total_monthly_sales = 0 company_obj.sales_monthly_history = None company_obj.save() + self.db_set("reset_company_default_values", 1) def delete_company_transactions(self): doctypes_to_be_ignored_list = self.get_doctypes_to_be_ignored_list() @@ -156,6 +174,7 @@ class TransactionDeletionRecord(Document): if naming_series: if "#" in naming_series: self.update_naming_series(naming_series, docfield["parent"]) + self.db_set("delete_transactions", 1) def get_doctypes_to_be_ignored_list(self): singles = frappe.get_all("DocType", filters={"issingle": 1}, pluck="name") From f9321767a6b594d9dfc032418b870c802a692895 Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Sat, 3 Feb 2024 14:49:18 +0530 Subject: [PATCH 10/90] refactor: UI trigger (cherry picked from commit 8944ab8b6ad1da2acdd5a852a17fc72e11d84695) --- .../transaction_deletion_record.js | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.js b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.js index 527c753d6a9..671f927106d 100644 --- a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.js +++ b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.js @@ -24,6 +24,17 @@ frappe.ui.form.on("Transaction Deletion Record", { refresh: function (frm) { frm.fields_dict["doctypes_to_be_ignored"].grid.set_column_disp("no_of_docs", false); frm.refresh_field("doctypes_to_be_ignored"); + + if (frm.doc.docstatus==1 && ['Queued', 'Failed'].find(x => x == frm.doc.status)) { + let execute_btn = __("Start / Resume") + + frm.add_custom_button(execute_btn, () => { + frm.call({ + method: 'start_deletion_process', + doc: frm.doc + }); + }); + } }, }); From 17ed1bb12cc53d0214f10ef3cb1a7b391d0a5914 Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Sat, 3 Feb 2024 20:21:30 +0530 Subject: [PATCH 11/90] refactor: use flags to decide on current stage (cherry picked from commit 6a77d86a53580b670937b92bcbde69ea920dbb9e) --- .../transaction_deletion_record.js | 12 +- .../transaction_deletion_record.json | 10 +- .../transaction_deletion_record.py | 196 ++++++++++-------- .../transaction_deletion_record_item.json | 19 +- .../transaction_deletion_record_item.py | 2 + 5 files changed, 141 insertions(+), 98 deletions(-) diff --git a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.js b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.js index 671f927106d..1a8b52f46bd 100644 --- a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.js +++ b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.js @@ -16,9 +16,15 @@ frappe.ui.form.on("Transaction Deletion Record", { }); } - frm.get_field("doctypes_to_be_ignored").grid.cannot_add_rows = true; - frm.fields_dict["doctypes_to_be_ignored"].grid.set_column_disp("no_of_docs", false); - frm.refresh_field("doctypes_to_be_ignored"); + + frm.get_field('doctypes_to_be_ignored').grid.cannot_add_rows = true; + frm.fields_dict['doctypes_to_be_ignored'].grid.set_column_disp('no_of_docs', false); + frm.fields_dict['doctypes_to_be_ignored'].grid.set_column_disp('done', false); + frm.refresh_field('doctypes_to_be_ignored'); + + frm.get_field('doctypes').grid.cannot_add_rows = true; + frm.fields_dict['doctypes'].grid.set_column_disp('no_of_docs', true); + frm.refresh_field('doctypes'); }, refresh: function (frm) { diff --git a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.json b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.json index a9e04d3892e..6a848413ffc 100644 --- a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.json +++ b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.json @@ -15,6 +15,7 @@ "reset_company_default_values", "clear_notifications", "delete_transactions", + "initialize_doctypes_table", "section_break_tbej", "doctypes", "doctypes_to_be_ignored", @@ -110,12 +111,19 @@ "label": "Delete Transactions", "no_copy": 1, "read_only": 1 + }, + { + "default": "0", + "fieldname": "initialize_doctypes_table", + "fieldtype": "Check", + "label": "Initialize Summary Table", + "read_only": 1 } ], "index_web_pages_for_search": 1, "is_submittable": 1, "links": [], - "modified": "2024-02-03 14:40:40.207482", + "modified": "2024-02-03 20:48:34.107577", "modified_by": "Administrator", "module": "Setup", "name": "Transaction Deletion Record", diff --git a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py index f1f6a5b90d3..5a5a827d304 100644 --- a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py +++ b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py @@ -30,6 +30,7 @@ class TransactionDeletionRecord(Document): delete_transactions: DF.Check doctypes: DF.Table[TransactionDeletionRecordItem] doctypes_to_be_ignored: DF.Table[TransactionDeletionRecordItem] + initialize_doctypes_table: DF.Check reset_company_default_values: DF.Check status: DF.Literal["Queued", "Running", "Failed", "Completed", "Cancelled"] # end: auto-generated types @@ -79,8 +80,10 @@ class TransactionDeletionRecord(Document): self.delete_bins() self.delete_lead_addresses() self.reset_company_values() - clear_notifications() - self.db_set("clear_notifications", 1) + if not self.clear_notifications: + clear_notifications() + self.db_set("clear_notifications", 1) + self.initialize_doctypes_to_be_deleted_table() self.delete_company_transactions() def populate_doctypes_to_be_ignored_table(self): @@ -89,92 +92,108 @@ class TransactionDeletionRecord(Document): self.append("doctypes_to_be_ignored", {"doctype_name": doctype}) def delete_bins(self): - frappe.db.sql( - """delete from `tabBin` where warehouse in - (select name from tabWarehouse where company=%s)""", - self.company, - ) - self.db_set("delete_bin_data", 1) + if not self.delete_bin_data: + frappe.db.sql( + """delete from `tabBin` where warehouse in + (select name from tabWarehouse where company=%s)""", + self.company, + ) + self.db_set("delete_bin_data", 1) def delete_lead_addresses(self): """Delete addresses to which leads are linked""" - leads = frappe.get_all("Lead", filters={"company": self.company}) - leads = ["'%s'" % row.get("name") for row in leads] - addresses = [] - if leads: - addresses = frappe.db.sql_list( - """select parent from `tabDynamic Link` where link_name - in ({leads})""".format( - leads=",".join(leads) - ) - ) - - if addresses: - addresses = ["%s" % frappe.db.escape(addr) for addr in addresses] - - frappe.db.sql( - """delete from `tabAddress` where name in ({addresses}) and - name not in (select distinct dl1.parent from `tabDynamic Link` dl1 - inner join `tabDynamic Link` dl2 on dl1.parent=dl2.parent - and dl1.link_doctype<>dl2.link_doctype)""".format( - addresses=",".join(addresses) - ) - ) - - frappe.db.sql( - """delete from `tabDynamic Link` where link_doctype='Lead' - and parenttype='Address' and link_name in ({leads})""".format( + if not self.delete_leads_and_addresses: + leads = frappe.get_all("Lead", filters={"company": self.company}) + leads = ["'%s'" % row.get("name") for row in leads] + addresses = [] + if leads: + addresses = frappe.db.sql_list( + """select parent from `tabDynamic Link` where link_name + in ({leads})""".format( leads=",".join(leads) ) ) - frappe.db.sql( - """update `tabCustomer` set lead_name=NULL where lead_name in ({leads})""".format( - leads=",".join(leads) + if addresses: + addresses = ["%s" % frappe.db.escape(addr) for addr in addresses] + + frappe.db.sql( + """delete from `tabAddress` where name in ({addresses}) and + name not in (select distinct dl1.parent from `tabDynamic Link` dl1 + inner join `tabDynamic Link` dl2 on dl1.parent=dl2.parent + and dl1.link_doctype<>dl2.link_doctype)""".format( + addresses=",".join(addresses) + ) + ) + + frappe.db.sql( + """delete from `tabDynamic Link` where link_doctype='Lead' + and parenttype='Address' and link_name in ({leads})""".format( + leads=",".join(leads) + ) + ) + + frappe.db.sql( + """update `tabCustomer` set lead_name=NULL where lead_name in ({leads})""".format( + leads=",".join(leads) + ) ) - ) - self.db_set("delete_leads_and_addresses", 1) + self.db_set("delete_leads_and_addresses", 1) def reset_company_values(self): - company_obj = frappe.get_doc("Company", self.company) - company_obj.total_monthly_sales = 0 - company_obj.sales_monthly_history = None - company_obj.save() - self.db_set("reset_company_default_values", 1) + if not self.reset_company_default_values: + company_obj = frappe.get_doc("Company", self.company) + company_obj.total_monthly_sales = 0 + company_obj.sales_monthly_history = None + company_obj.save() + self.db_set("reset_company_default_values", 1) + + def initialize_doctypes_to_be_deleted_table(self): + if not self.initialize_doctypes_table: + doctypes_to_be_ignored_list = self.get_doctypes_to_be_ignored_list() + docfields = self.get_doctypes_with_company_field(doctypes_to_be_ignored_list) + tables = self.get_all_child_doctypes() + for docfield in docfields: + if docfield["parent"] != self.doctype: + no_of_docs = self.get_number_of_docs_linked_with_specified_company( + docfield["parent"], docfield["fieldname"] + ) + if no_of_docs > 0: + # Initialize + self.populate_doctypes_table(tables, docfield["parent"], docfield["fieldname"], 0) + self.db_set("initialize_doctypes_table", 1) def delete_company_transactions(self): - doctypes_to_be_ignored_list = self.get_doctypes_to_be_ignored_list() - docfields = self.get_doctypes_with_company_field(doctypes_to_be_ignored_list) + if not self.delete_transactions: + doctypes_to_be_ignored_list = self.get_doctypes_to_be_ignored_list() + docfields = self.get_doctypes_with_company_field(doctypes_to_be_ignored_list) - tables = self.get_all_child_doctypes() - for docfield in docfields: - if docfield["parent"] != self.doctype: - no_of_docs = self.get_number_of_docs_linked_with_specified_company( - docfield["parent"], docfield["fieldname"] - ) - - if no_of_docs > 0: - self.delete_version_log(docfield["parent"], docfield["fieldname"]) - - reference_docs = frappe.get_all( - docfield["parent"], filters={docfield["fieldname"]: self.company} + tables = self.get_all_child_doctypes() + for docfield in self.doctypes: + if docfield.doctype_name != self.doctype: + no_of_docs = self.get_number_of_docs_linked_with_specified_company( + docfield.doctype_name, docfield.docfield_name ) - reference_doc_names = [r.name for r in reference_docs] + if no_of_docs > 0: + reference_docs = frappe.get_all( + docfield.doctype_name, filters={docfield.docfield_name: self.company}, limit=self.batch_size + ) + reference_doc_names = [r.name for r in reference_docs] - self.delete_communications(docfield["parent"], reference_doc_names) - self.delete_comments(docfield["parent"], reference_doc_names) - self.unlink_attachments(docfield["parent"], reference_doc_names) + self.delete_version_log(docfield.doctype_name, reference_doc_names) + self.delete_communications(docfield.doctype_name, reference_doc_names) + self.delete_comments(docfield.doctype_name, reference_doc_names) + self.unlink_attachments(docfield.doctype_name, reference_doc_names) - self.populate_doctypes_table(tables, docfield["parent"], no_of_docs) + self.delete_child_tables(docfield.doctype_name, reference_doc_names) + self.delete_docs_linked_with_specified_company(docfield.doctype_name, docfield.docfield_name) - self.delete_child_tables(docfield["parent"], docfield["fieldname"]) - self.delete_docs_linked_with_specified_company(docfield["parent"], docfield["fieldname"]) - - naming_series = frappe.db.get_value("DocType", docfield["parent"], "autoname") - if naming_series: - if "#" in naming_series: - self.update_naming_series(naming_series, docfield["parent"]) - self.db_set("delete_transactions", 1) + naming_series = frappe.db.get_value("DocType", docfield.doctype_name, "autoname") + # TODO: do this at the end of each doctype + if naming_series: + if "#" in naming_series: + self.update_naming_series(naming_series, docfield.doctype_name) + self.db_set("delete_transactions", 1) def get_doctypes_to_be_ignored_list(self): singles = frappe.get_all("DocType", filters={"issingle": 1}, pluck="name") @@ -203,22 +222,21 @@ class TransactionDeletionRecord(Document): def get_number_of_docs_linked_with_specified_company(self, doctype, company_fieldname): return frappe.db.count(doctype, {company_fieldname: self.company}) - def populate_doctypes_table(self, tables, doctype, no_of_docs): + def populate_doctypes_table(self, tables, doctype, fieldname, no_of_docs): + self.flags.ignore_validate_update_after_submit = True if doctype not in tables: - self.append("doctypes", {"doctype_name": doctype, "no_of_docs": no_of_docs}) - - def delete_child_tables(self, doctype, company_fieldname): - parent_docs_to_be_deleted = frappe.get_all( - doctype, {company_fieldname: self.company}, pluck="name" - ) + self.append( + "doctypes", {"doctype_name": doctype, "docfield_name": fieldname, "no_of_docs": no_of_docs} + ) + self.save(ignore_permissions=True) + def delete_child_tables(self, doctype, reference_doc_names): child_tables = frappe.get_all( "DocField", filters={"fieldtype": "Table", "parent": doctype}, pluck="options" ) - for batch in create_batch(parent_docs_to_be_deleted, self.batch_size): - for table in child_tables: - frappe.db.delete(table, {"parent": ["in", batch]}) + for table in child_tables: + frappe.db.delete(table, {"parent": ["in", reference_doc_names]}) def delete_docs_linked_with_specified_company(self, doctype, company_fieldname): frappe.db.delete(doctype, {company_fieldname: self.company}) @@ -242,17 +260,11 @@ class TransactionDeletionRecord(Document): frappe.db.sql("""update `tabSeries` set current = %s where name=%s""", (last, prefix)) - def delete_version_log(self, doctype, company_fieldname): - dt = qb.DocType(doctype) - names = qb.from_(dt).select(dt.name).where(dt[company_fieldname] == self.company).run(as_list=1) - names = [x[0] for x in names] - - if names: - versions = qb.DocType("Version") - for batch in create_batch(names, self.batch_size): - qb.from_(versions).delete().where( - (versions.ref_doctype == doctype) & (versions.docname.isin(batch)) - ).run() + def delete_version_log(self, doctype, docnames): + versions = qb.DocType("Version") + qb.from_(versions).delete().where( + (versions.ref_doctype == doctype) & (versions.docname.isin(docnames)) + ).run() def delete_communications(self, doctype, reference_doc_names): communications = frappe.get_all( diff --git a/erpnext/setup/doctype/transaction_deletion_record_item/transaction_deletion_record_item.json b/erpnext/setup/doctype/transaction_deletion_record_item/transaction_deletion_record_item.json index be0be945c4e..4e5e1846999 100644 --- a/erpnext/setup/doctype/transaction_deletion_record_item/transaction_deletion_record_item.json +++ b/erpnext/setup/doctype/transaction_deletion_record_item/transaction_deletion_record_item.json @@ -6,7 +6,9 @@ "engine": "InnoDB", "field_order": [ "doctype_name", - "no_of_docs" + "docfield_name", + "no_of_docs", + "done" ], "fields": [ { @@ -22,12 +24,24 @@ "fieldtype": "Data", "in_list_view": 1, "label": "Number of Docs" + }, + { + "default": "0", + "fieldname": "done", + "fieldtype": "Check", + "in_list_view": 1, + "label": "Done" + }, + { + "fieldname": "docfield_name", + "fieldtype": "Data", + "label": "DocField Name" } ], "index_web_pages_for_search": 1, "istable": 1, "links": [], - "modified": "2021-05-08 23:10:46.166744", + "modified": "2024-02-03 21:06:32.274445", "modified_by": "Administrator", "module": "Setup", "name": "Transaction Deletion Record Item", @@ -35,5 +49,6 @@ "permissions": [], "sort_field": "modified", "sort_order": "DESC", + "states": [], "track_changes": 1 } \ No newline at end of file diff --git a/erpnext/setup/doctype/transaction_deletion_record_item/transaction_deletion_record_item.py b/erpnext/setup/doctype/transaction_deletion_record_item/transaction_deletion_record_item.py index f154cdb2474..ce716ac477c 100644 --- a/erpnext/setup/doctype/transaction_deletion_record_item/transaction_deletion_record_item.py +++ b/erpnext/setup/doctype/transaction_deletion_record_item/transaction_deletion_record_item.py @@ -15,7 +15,9 @@ class TransactionDeletionRecordItem(Document): if TYPE_CHECKING: from frappe.types import DF + docfield_name: DF.Data | None doctype_name: DF.Link + done: DF.Check no_of_docs: DF.Data | None parent: DF.Data parentfield: DF.Data From 195bffdf44c2e5e6a316d8154b8f83b1c8305e5a Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Sun, 4 Feb 2024 08:09:53 +0530 Subject: [PATCH 12/90] refactor: reorder flags in Tasks section (cherry picked from commit cccb2d5141e30234dd9d3f7ff877c9aaaa44879e) --- .../transaction_deletion_record.json | 4 ++-- .../transaction_deletion_record.py | 5 ++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.json b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.json index 6a848413ffc..dc35fe59553 100644 --- a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.json +++ b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.json @@ -14,8 +14,8 @@ "delete_leads_and_addresses", "reset_company_default_values", "clear_notifications", - "delete_transactions", "initialize_doctypes_table", + "delete_transactions", "section_break_tbej", "doctypes", "doctypes_to_be_ignored", @@ -123,7 +123,7 @@ "index_web_pages_for_search": 1, "is_submittable": 1, "links": [], - "modified": "2024-02-03 20:48:34.107577", + "modified": "2024-02-04 08:09:26.784109", "modified_by": "Administrator", "module": "Setup", "name": "Transaction Deletion Record", diff --git a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py index 5a5a827d304..96e5bf97891 100644 --- a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py +++ b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py @@ -170,7 +170,7 @@ class TransactionDeletionRecord(Document): tables = self.get_all_child_doctypes() for docfield in self.doctypes: - if docfield.doctype_name != self.doctype: + if docfield.doctype_name != self.doctype and not docfield.done: no_of_docs = self.get_number_of_docs_linked_with_specified_company( docfield.doctype_name, docfield.docfield_name ) @@ -193,6 +193,9 @@ class TransactionDeletionRecord(Document): if naming_series: if "#" in naming_series: self.update_naming_series(naming_series, docfield.doctype_name) + + else: + frappe.db.set_value(docfield.doctype, docfield.name, "done", 1) self.db_set("delete_transactions", 1) def get_doctypes_to_be_ignored_list(self): From 2bb1bfc4a04398200592deace1ac0e73ce027375 Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Sun, 4 Feb 2024 08:25:18 +0530 Subject: [PATCH 13/90] refactor: chained callback (cherry picked from commit b12ca65fcc76c85c9a26fb9d6d2e252ede4a3e70) --- .../transaction_deletion_record.py | 24 +++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py index 96e5bf97891..9911d44fc3c 100644 --- a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py +++ b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py @@ -75,22 +75,37 @@ class TransactionDeletionRecord(Document): def on_cancel(self): self.db_set("status", "Cancelled") + def chain_callback(self, method): + frappe.enqueue( + "frappe.utils.background_jobs.run_doc_method", + doctype=self.doctype, + name=self.name, + doc_method=method, + queue="long", + enqueue_after_commit=True, + ) + @frappe.whitelist() def start_deletion_process(self): self.delete_bins() self.delete_lead_addresses() self.reset_company_values() + self.delete_notifications() + self.initialize_doctypes_to_be_deleted_table() + self.delete_company_transactions() + + def delete_notifications(self): if not self.clear_notifications: clear_notifications() self.db_set("clear_notifications", 1) - self.initialize_doctypes_to_be_deleted_table() - self.delete_company_transactions() + self.chain_callback("initialize_doctypes_to_be_deleted_table") def populate_doctypes_to_be_ignored_table(self): doctypes_to_be_ignored_list = get_doctypes_to_be_ignored() for doctype in doctypes_to_be_ignored_list: self.append("doctypes_to_be_ignored", {"doctype_name": doctype}) + @frappe.whitelist() def delete_bins(self): if not self.delete_bin_data: frappe.db.sql( @@ -99,6 +114,7 @@ class TransactionDeletionRecord(Document): self.company, ) self.db_set("delete_bin_data", 1) + self.chain_callback(method="delete_lead_addresses") def delete_lead_addresses(self): """Delete addresses to which leads are linked""" @@ -139,6 +155,7 @@ class TransactionDeletionRecord(Document): ) ) self.db_set("delete_leads_and_addresses", 1) + self.chain_callback(method="reset_company_values") def reset_company_values(self): if not self.reset_company_default_values: @@ -147,6 +164,7 @@ class TransactionDeletionRecord(Document): company_obj.sales_monthly_history = None company_obj.save() self.db_set("reset_company_default_values", 1) + self.chain_callback(method="delete_notifications") def initialize_doctypes_to_be_deleted_table(self): if not self.initialize_doctypes_table: @@ -162,6 +180,7 @@ class TransactionDeletionRecord(Document): # Initialize self.populate_doctypes_table(tables, docfield["parent"], docfield["fieldname"], 0) self.db_set("initialize_doctypes_table", 1) + self.chain_callback(method="delete_company_transactions") def delete_company_transactions(self): if not self.delete_transactions: @@ -194,6 +213,7 @@ class TransactionDeletionRecord(Document): if "#" in naming_series: self.update_naming_series(naming_series, docfield.doctype_name) + self.chain_callback(method="delete_company_transactions") else: frappe.db.set_value(docfield.doctype, docfield.name, "done", 1) self.db_set("delete_transactions", 1) From c3dd68ecc3b3da68e1e9909da6e711a3d34da92c Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Sun, 4 Feb 2024 10:57:34 +0530 Subject: [PATCH 14/90] refactor: use separate child table for summary (cherry picked from commit 49d3bcbc8df8fe9457cce55793896146705b50e5) --- .../__init__.py | 0 .../transaction_deletion_record_details.json | 59 +++++++++++++++++++ .../transaction_deletion_record_details.py | 26 ++++++++ .../transaction_deletion_record.js | 12 ++++ .../transaction_deletion_record.json | 4 +- .../transaction_deletion_record.py | 43 ++++++++------ .../transaction_deletion_record_item.json | 25 +------- .../transaction_deletion_record_item.py | 3 - 8 files changed, 126 insertions(+), 46 deletions(-) create mode 100644 erpnext/accounts/doctype/transaction_deletion_record_details/__init__.py create mode 100644 erpnext/accounts/doctype/transaction_deletion_record_details/transaction_deletion_record_details.json create mode 100644 erpnext/accounts/doctype/transaction_deletion_record_details/transaction_deletion_record_details.py diff --git a/erpnext/accounts/doctype/transaction_deletion_record_details/__init__.py b/erpnext/accounts/doctype/transaction_deletion_record_details/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/erpnext/accounts/doctype/transaction_deletion_record_details/transaction_deletion_record_details.json b/erpnext/accounts/doctype/transaction_deletion_record_details/transaction_deletion_record_details.json new file mode 100644 index 00000000000..e8a5eb6c432 --- /dev/null +++ b/erpnext/accounts/doctype/transaction_deletion_record_details/transaction_deletion_record_details.json @@ -0,0 +1,59 @@ +{ + "actions": [], + "allow_rename": 1, + "creation": "2024-02-04 10:53:32.307930", + "doctype": "DocType", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "doctype_name", + "docfield_name", + "no_of_docs", + "done" + ], + "fields": [ + { + "fieldname": "doctype_name", + "fieldtype": "Link", + "in_list_view": 1, + "label": "DocType", + "options": "DocType", + "read_only": 1, + "reqd": 1 + }, + { + "fieldname": "docfield_name", + "fieldtype": "Data", + "in_list_view": 1, + "label": "DocField", + "read_only": 1 + }, + { + "fieldname": "no_of_docs", + "fieldtype": "Int", + "in_list_view": 1, + "label": "No of Docs", + "read_only": 1 + }, + { + "default": "0", + "fieldname": "done", + "fieldtype": "Check", + "in_list_view": 1, + "label": "Done", + "read_only": 1 + } + ], + "index_web_pages_for_search": 1, + "istable": 1, + "links": [], + "modified": "2024-02-04 10:55:52.060417", + "modified_by": "Administrator", + "module": "Accounts", + "name": "Transaction Deletion Record Details", + "owner": "Administrator", + "permissions": [], + "sort_field": "modified", + "sort_order": "DESC", + "states": [] +} \ No newline at end of file diff --git a/erpnext/accounts/doctype/transaction_deletion_record_details/transaction_deletion_record_details.py b/erpnext/accounts/doctype/transaction_deletion_record_details/transaction_deletion_record_details.py new file mode 100644 index 00000000000..bc5b5c41fdd --- /dev/null +++ b/erpnext/accounts/doctype/transaction_deletion_record_details/transaction_deletion_record_details.py @@ -0,0 +1,26 @@ +# Copyright (c) 2024, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +# import frappe +from frappe.model.document import Document + + +class TransactionDeletionRecordDetails(Document): + # begin: auto-generated types + # This code is auto-generated. Do not modify anything in this block. + + from typing import TYPE_CHECKING + + if TYPE_CHECKING: + from frappe.types import DF + + docfield_name: DF.Data | None + doctype_name: DF.Link + done: DF.Check + no_of_docs: DF.Int + parent: DF.Data + parentfield: DF.Data + parenttype: DF.Data + # end: auto-generated types + + pass diff --git a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.js b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.js index 1a8b52f46bd..c6bb3781bfc 100644 --- a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.js +++ b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.js @@ -41,6 +41,18 @@ frappe.ui.form.on("Transaction Deletion Record", { }); }); } + + if (frm.doc.docstatus==1 && ['Queued', 'Failed'].find(x => x == frm.doc.status)) { + let execute_btn = __("Start Chain of Events") + + frm.add_custom_button(execute_btn, () => { + frm.call({ + method: 'delete_bins', + doc: frm.doc + }); + }); + } + }, }); diff --git a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.json b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.json index dc35fe59553..bbc571a0816 100644 --- a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.json +++ b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.json @@ -34,7 +34,7 @@ "fieldname": "doctypes", "fieldtype": "Table", "label": "Summary", - "options": "Transaction Deletion Record Item", + "options": "Transaction Deletion Record Details", "read_only": 1 }, { @@ -123,7 +123,7 @@ "index_web_pages_for_search": 1, "is_submittable": 1, "links": [], - "modified": "2024-02-04 08:09:26.784109", + "modified": "2024-02-04 10:55:09.430373", "modified_by": "Administrator", "module": "Setup", "name": "Transaction Deletion Record", diff --git a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py index 9911d44fc3c..60976aa572b 100644 --- a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py +++ b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py @@ -18,6 +18,9 @@ class TransactionDeletionRecord(Document): if TYPE_CHECKING: from frappe.types import DF + from erpnext.accounts.doctype.transaction_deletion_record_details.transaction_deletion_record_details import ( + TransactionDeletionRecordDetails, + ) from erpnext.setup.doctype.transaction_deletion_record_item.transaction_deletion_record_item import ( TransactionDeletionRecordItem, ) @@ -28,7 +31,7 @@ class TransactionDeletionRecord(Document): delete_bin_data: DF.Check delete_leads_and_addresses: DF.Check delete_transactions: DF.Check - doctypes: DF.Table[TransactionDeletionRecordItem] + doctypes: DF.Table[TransactionDeletionRecordDetails] doctypes_to_be_ignored: DF.Table[TransactionDeletionRecordItem] initialize_doctypes_table: DF.Check reset_company_default_values: DF.Check @@ -37,7 +40,7 @@ class TransactionDeletionRecord(Document): def __init__(self, *args, **kwargs): super(TransactionDeletionRecord, self).__init__(*args, **kwargs) - self.batch_size = 5000 + self.batch_size = 5 def validate(self): frappe.only_for("System Manager") @@ -75,7 +78,7 @@ class TransactionDeletionRecord(Document): def on_cancel(self): self.db_set("status", "Cancelled") - def chain_callback(self, method): + def chain_call(self, method): frappe.enqueue( "frappe.utils.background_jobs.run_doc_method", doctype=self.doctype, @@ -98,7 +101,7 @@ class TransactionDeletionRecord(Document): if not self.clear_notifications: clear_notifications() self.db_set("clear_notifications", 1) - self.chain_callback("initialize_doctypes_to_be_deleted_table") + self.chain_call("initialize_doctypes_to_be_deleted_table") def populate_doctypes_to_be_ignored_table(self): doctypes_to_be_ignored_list = get_doctypes_to_be_ignored() @@ -114,7 +117,7 @@ class TransactionDeletionRecord(Document): self.company, ) self.db_set("delete_bin_data", 1) - self.chain_callback(method="delete_lead_addresses") + self.chain_call(method="delete_lead_addresses") def delete_lead_addresses(self): """Delete addresses to which leads are linked""" @@ -155,7 +158,7 @@ class TransactionDeletionRecord(Document): ) ) self.db_set("delete_leads_and_addresses", 1) - self.chain_callback(method="reset_company_values") + self.chain_call(method="reset_company_values") def reset_company_values(self): if not self.reset_company_default_values: @@ -164,7 +167,7 @@ class TransactionDeletionRecord(Document): company_obj.sales_monthly_history = None company_obj.save() self.db_set("reset_company_default_values", 1) - self.chain_callback(method="delete_notifications") + self.chain_call(method="delete_notifications") def initialize_doctypes_to_be_deleted_table(self): if not self.initialize_doctypes_table: @@ -180,7 +183,7 @@ class TransactionDeletionRecord(Document): # Initialize self.populate_doctypes_table(tables, docfield["parent"], docfield["fieldname"], 0) self.db_set("initialize_doctypes_table", 1) - self.chain_callback(method="delete_company_transactions") + self.chain_call(method="delete_company_transactions") def delete_company_transactions(self): if not self.delete_transactions: @@ -203,20 +206,24 @@ class TransactionDeletionRecord(Document): self.delete_communications(docfield.doctype_name, reference_doc_names) self.delete_comments(docfield.doctype_name, reference_doc_names) self.unlink_attachments(docfield.doctype_name, reference_doc_names) - self.delete_child_tables(docfield.doctype_name, reference_doc_names) - self.delete_docs_linked_with_specified_company(docfield.doctype_name, docfield.docfield_name) - + self.delete_docs_linked_with_specified_company(docfield.doctype_name, reference_doc_names) + processed = int(docfield.no_of_docs) + len(reference_doc_names) + frappe.db.set_value(docfield.doctype, docfield.name, "no_of_docs", processed) + else: naming_series = frappe.db.get_value("DocType", docfield.doctype_name, "autoname") - # TODO: do this at the end of each doctype if naming_series: if "#" in naming_series: self.update_naming_series(naming_series, docfield.doctype_name) - - self.chain_callback(method="delete_company_transactions") - else: frappe.db.set_value(docfield.doctype, docfield.name, "done", 1) - self.db_set("delete_transactions", 1) + + pending_doctypes = frappe.db.get_all( + docfield.doctype, filters={"parent": self.name, "done": 0}, pluck="doctype_name" + ) + if pending_doctypes: + self.chain_call(method="delete_company_transactions") + else: + self.db_set("delete_transactions", 1) def get_doctypes_to_be_ignored_list(self): singles = frappe.get_all("DocType", filters={"issingle": 1}, pluck="name") @@ -261,8 +268,8 @@ class TransactionDeletionRecord(Document): for table in child_tables: frappe.db.delete(table, {"parent": ["in", reference_doc_names]}) - def delete_docs_linked_with_specified_company(self, doctype, company_fieldname): - frappe.db.delete(doctype, {company_fieldname: self.company}) + def delete_docs_linked_with_specified_company(self, doctype, reference_doc_names): + frappe.db.delete(doctype, {"name": ("in", reference_doc_names)}) def update_naming_series(self, naming_series, doctype_name): if "." in naming_series: diff --git a/erpnext/setup/doctype/transaction_deletion_record_item/transaction_deletion_record_item.json b/erpnext/setup/doctype/transaction_deletion_record_item/transaction_deletion_record_item.json index 4e5e1846999..89db63694c2 100644 --- a/erpnext/setup/doctype/transaction_deletion_record_item/transaction_deletion_record_item.json +++ b/erpnext/setup/doctype/transaction_deletion_record_item/transaction_deletion_record_item.json @@ -5,10 +5,7 @@ "editable_grid": 1, "engine": "InnoDB", "field_order": [ - "doctype_name", - "docfield_name", - "no_of_docs", - "done" + "doctype_name" ], "fields": [ { @@ -18,30 +15,12 @@ "label": "DocType", "options": "DocType", "reqd": 1 - }, - { - "fieldname": "no_of_docs", - "fieldtype": "Data", - "in_list_view": 1, - "label": "Number of Docs" - }, - { - "default": "0", - "fieldname": "done", - "fieldtype": "Check", - "in_list_view": 1, - "label": "Done" - }, - { - "fieldname": "docfield_name", - "fieldtype": "Data", - "label": "DocField Name" } ], "index_web_pages_for_search": 1, "istable": 1, "links": [], - "modified": "2024-02-03 21:06:32.274445", + "modified": "2024-02-04 10:56:27.413691", "modified_by": "Administrator", "module": "Setup", "name": "Transaction Deletion Record Item", diff --git a/erpnext/setup/doctype/transaction_deletion_record_item/transaction_deletion_record_item.py b/erpnext/setup/doctype/transaction_deletion_record_item/transaction_deletion_record_item.py index ce716ac477c..906660739e4 100644 --- a/erpnext/setup/doctype/transaction_deletion_record_item/transaction_deletion_record_item.py +++ b/erpnext/setup/doctype/transaction_deletion_record_item/transaction_deletion_record_item.py @@ -15,10 +15,7 @@ class TransactionDeletionRecordItem(Document): if TYPE_CHECKING: from frappe.types import DF - docfield_name: DF.Data | None doctype_name: DF.Link - done: DF.Check - no_of_docs: DF.Data | None parent: DF.Data parentfield: DF.Data parenttype: DF.Data From efebec3f953008dede5deeb2e9c0b01ca8eda84e Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Sun, 4 Feb 2024 15:26:33 +0530 Subject: [PATCH 15/90] chore: remove unwanted UI code (cherry picked from commit b98a5e4edcd896b05e4e7fd5874c56ceb9d95bf0) --- .../transaction_deletion_record.js | 29 +++---------------- 1 file changed, 4 insertions(+), 25 deletions(-) diff --git a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.js b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.js index c6bb3781bfc..027bbcb4b20 100644 --- a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.js +++ b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.js @@ -10,40 +10,19 @@ frappe.ui.form.on("Transaction Deletion Record", { callback: function (r) { doctypes_to_be_ignored_array = r.message; populate_doctypes_to_be_ignored(doctypes_to_be_ignored_array, frm); - frm.fields_dict["doctypes_to_be_ignored"].grid.set_column_disp("no_of_docs", false); - frm.refresh_field("doctypes_to_be_ignored"); - }, + frm.refresh_field('doctypes_to_be_ignored'); + } }); } frm.get_field('doctypes_to_be_ignored').grid.cannot_add_rows = true; - frm.fields_dict['doctypes_to_be_ignored'].grid.set_column_disp('no_of_docs', false); - frm.fields_dict['doctypes_to_be_ignored'].grid.set_column_disp('done', false); - frm.refresh_field('doctypes_to_be_ignored'); - frm.get_field('doctypes').grid.cannot_add_rows = true; - frm.fields_dict['doctypes'].grid.set_column_disp('no_of_docs', true); - frm.refresh_field('doctypes'); }, - refresh: function (frm) { - frm.fields_dict["doctypes_to_be_ignored"].grid.set_column_disp("no_of_docs", false); - frm.refresh_field("doctypes_to_be_ignored"); - + refresh: function(frm) { if (frm.doc.docstatus==1 && ['Queued', 'Failed'].find(x => x == frm.doc.status)) { - let execute_btn = __("Start / Resume") - - frm.add_custom_button(execute_btn, () => { - frm.call({ - method: 'start_deletion_process', - doc: frm.doc - }); - }); - } - - if (frm.doc.docstatus==1 && ['Queued', 'Failed'].find(x => x == frm.doc.status)) { - let execute_btn = __("Start Chain of Events") + let execute_btn = __("Start Deletion") frm.add_custom_button(execute_btn, () => { frm.call({ From c827be43450233b17e8a408b427a67e72a1798dc Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Sun, 4 Feb 2024 15:29:39 +0530 Subject: [PATCH 16/90] refactor: make Excluded doctype table read only (cherry picked from commit 7c4cff2649daa52d6cabf8a046b3867ab60e0da6) --- .../transaction_deletion_record.js | 4 +--- .../transaction_deletion_record.json | 5 +++-- .../transaction_deletion_record.py | 1 + 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.js b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.js index 027bbcb4b20..ed70ebb5f70 100644 --- a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.js +++ b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.js @@ -15,9 +15,6 @@ frappe.ui.form.on("Transaction Deletion Record", { }); } - - frm.get_field('doctypes_to_be_ignored').grid.cannot_add_rows = true; - }, refresh: function(frm) { @@ -25,6 +22,7 @@ frappe.ui.form.on("Transaction Deletion Record", { let execute_btn = __("Start Deletion") frm.add_custom_button(execute_btn, () => { + // Entry point for chain of events frm.call({ method: 'delete_bins', doc: frm.doc diff --git a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.json b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.json index bbc571a0816..bd45b1c109d 100644 --- a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.json +++ b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.json @@ -41,7 +41,8 @@ "fieldname": "doctypes_to_be_ignored", "fieldtype": "Table", "label": "Excluded DocTypes", - "options": "Transaction Deletion Record Item" + "options": "Transaction Deletion Record Item", + "read_only": 1 }, { "fieldname": "amended_from", @@ -123,7 +124,7 @@ "index_web_pages_for_search": 1, "is_submittable": 1, "links": [], - "modified": "2024-02-04 10:55:09.430373", + "modified": "2024-02-04 15:28:29.532826", "modified_by": "Administrator", "module": "Setup", "name": "Transaction Deletion Record", diff --git a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py index 60976aa572b..0d553ca19e1 100644 --- a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py +++ b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py @@ -110,6 +110,7 @@ class TransactionDeletionRecord(Document): @frappe.whitelist() def delete_bins(self): + # This methid is the entry point for the chain of events that follow if not self.delete_bin_data: frappe.db.sql( """delete from `tabBin` where warehouse in From cbaee05740aba9f45c3b37b395c4fc1a126930da Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Sun, 4 Feb 2024 15:37:21 +0530 Subject: [PATCH 17/90] refactor: validate status before running events (cherry picked from commit 86b5e2e2779eb498a8525ca07c6e25335e6f2f5d) --- .../transaction_deletion_record.py | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py index 0d553ca19e1..63b28017685 100644 --- a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py +++ b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py @@ -6,7 +6,7 @@ import frappe from frappe import _, qb from frappe.desk.notifications import clear_notifications from frappe.model.document import Document -from frappe.utils import cint, create_batch +from frappe.utils import cint, create_batch, get_link_to_form class TransactionDeletionRecord(Document): @@ -40,7 +40,7 @@ class TransactionDeletionRecord(Document): def __init__(self, *args, **kwargs): super(TransactionDeletionRecord, self).__init__(*args, **kwargs) - self.batch_size = 5 + self.batch_size = 5000 def validate(self): frappe.only_for("System Manager") @@ -98,6 +98,7 @@ class TransactionDeletionRecord(Document): self.delete_company_transactions() def delete_notifications(self): + self.validate_doc_status() if not self.clear_notifications: clear_notifications() self.db_set("clear_notifications", 1) @@ -108,9 +109,19 @@ class TransactionDeletionRecord(Document): for doctype in doctypes_to_be_ignored_list: self.append("doctypes_to_be_ignored", {"doctype_name": doctype}) + def validate_doc_status(self): + if self.status != "Running": + frappe.throw( + _("{0} is not running. Cannot trigger events for this Document").format( + get_link_to_form("Transaction Deletion Record", self.name) + ) + ) + @frappe.whitelist() def delete_bins(self): # This methid is the entry point for the chain of events that follow + self.db_set("status", "Running") + if not self.delete_bin_data: frappe.db.sql( """delete from `tabBin` where warehouse in @@ -122,6 +133,7 @@ class TransactionDeletionRecord(Document): def delete_lead_addresses(self): """Delete addresses to which leads are linked""" + self.validate_doc_status() if not self.delete_leads_and_addresses: leads = frappe.get_all("Lead", filters={"company": self.company}) leads = ["'%s'" % row.get("name") for row in leads] @@ -162,6 +174,7 @@ class TransactionDeletionRecord(Document): self.chain_call(method="reset_company_values") def reset_company_values(self): + self.validate_doc_status() if not self.reset_company_default_values: company_obj = frappe.get_doc("Company", self.company) company_obj.total_monthly_sales = 0 @@ -171,6 +184,7 @@ class TransactionDeletionRecord(Document): self.chain_call(method="delete_notifications") def initialize_doctypes_to_be_deleted_table(self): + self.validate_doc_status() if not self.initialize_doctypes_table: doctypes_to_be_ignored_list = self.get_doctypes_to_be_ignored_list() docfields = self.get_doctypes_with_company_field(doctypes_to_be_ignored_list) @@ -187,6 +201,7 @@ class TransactionDeletionRecord(Document): self.chain_call(method="delete_company_transactions") def delete_company_transactions(self): + self.validate_doc_status() if not self.delete_transactions: doctypes_to_be_ignored_list = self.get_doctypes_to_be_ignored_list() docfields = self.get_doctypes_with_company_field(doctypes_to_be_ignored_list) @@ -212,6 +227,7 @@ class TransactionDeletionRecord(Document): processed = int(docfield.no_of_docs) + len(reference_doc_names) frappe.db.set_value(docfield.doctype, docfield.name, "no_of_docs", processed) else: + # reset naming series naming_series = frappe.db.get_value("DocType", docfield.doctype_name, "autoname") if naming_series: if "#" in naming_series: @@ -224,6 +240,7 @@ class TransactionDeletionRecord(Document): if pending_doctypes: self.chain_call(method="delete_company_transactions") else: + self.db_set("status", "Completed") self.db_set("delete_transactions", 1) def get_doctypes_to_be_ignored_list(self): From f67c4474023ca55b681b5b95cc1b0819b861a615 Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Sun, 4 Feb 2024 16:11:42 +0530 Subject: [PATCH 18/90] chore: show correct status in list view (cherry picked from commit 1014940953ed54f31a170e0e99d03c1c5f1cd022) --- .../transaction_deletion_record_list.js | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record_list.js b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record_list.js index 08a35df2c17..7c7b8ff25a7 100644 --- a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record_list.js +++ b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record_list.js @@ -1,12 +1,16 @@ // Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors // License: GNU General Public License v3. See license.txt -frappe.listview_settings["Transaction Deletion Record"] = { - get_indicator: function (doc) { - if (doc.docstatus == 0) { - return [__("Draft"), "red"]; - } else { - return [__("Completed"), "green"]; - } +frappe.listview_settings['Transaction Deletion Record'] = { + add_fields: ["status"], + get_indicator: function(doc) { + let colors = { + 'Queued': 'orange', + 'Completed': 'green', + 'Running': 'blue', + 'Failed': 'red', + }; + let status = doc.status; + return [__(status), colors[status], 'status,=,'+status]; }, }; From db9cc5350d86b15e5c51d539235a115658a88d6d Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Mon, 5 Feb 2024 10:21:12 +0530 Subject: [PATCH 19/90] refactor: reset all flags and remove unwanted code (cherry picked from commit 2dbe68a09d0bf9a13ef0d3bb8f071a7634291766) --- .../transaction_deletion_record.json | 4 +++- .../transaction_deletion_record.py | 19 ++++++++++--------- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.json b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.json index bd45b1c109d..aa06d14b170 100644 --- a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.json +++ b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.json @@ -57,6 +57,7 @@ "fieldname": "status", "fieldtype": "Select", "label": "Status", + "no_copy": 1, "options": "Queued\nRunning\nFailed\nCompleted\nCancelled", "read_only": 1 }, @@ -118,13 +119,14 @@ "fieldname": "initialize_doctypes_table", "fieldtype": "Check", "label": "Initialize Summary Table", + "no_copy": 1, "read_only": 1 } ], "index_web_pages_for_search": 1, "is_submittable": 1, "links": [], - "modified": "2024-02-04 15:28:29.532826", + "modified": "2024-02-05 10:25:28.462255", "modified_by": "Administrator", "module": "Setup", "name": "Transaction Deletion Record", diff --git a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py index 63b28017685..5f430b85f58 100644 --- a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py +++ b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py @@ -58,6 +58,15 @@ class TransactionDeletionRecord(Document): ) def before_submit(self): + if queued_docs := frappe.db.get_all( + "Transaction Deletion Record", filters={"company": self.company, "status": "Queued"} + ): + frappe.throw( + _("There is another document: {0} Queued. Cannot queue multi docs for one company.").format( + self.queued_docs + ) + ) + if not self.doctypes_to_be_ignored: self.populate_doctypes_to_be_ignored_table() @@ -66,6 +75,7 @@ class TransactionDeletionRecord(Document): self.delete_bin_data = 0 self.delete_leads_and_addresses = 0 self.delete_transactions = 0 + self.initialize_doctypes_table = 0 self.reset_company_default_values = 0 def before_save(self): @@ -88,15 +98,6 @@ class TransactionDeletionRecord(Document): enqueue_after_commit=True, ) - @frappe.whitelist() - def start_deletion_process(self): - self.delete_bins() - self.delete_lead_addresses() - self.reset_company_values() - self.delete_notifications() - self.initialize_doctypes_to_be_deleted_table() - self.delete_company_transactions() - def delete_notifications(self): self.validate_doc_status() if not self.clear_notifications: From 90ad3d3176f7c86ffb6f6954f6eca1ee49964a3f Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Mon, 5 Feb 2024 10:42:59 +0530 Subject: [PATCH 20/90] refactor: no copy on summary table and more validations (cherry picked from commit 55e93b3fe14b492e2f648b6ee860e902d87013e6) --- .../transaction_deletion_record.json | 3 ++- .../transaction_deletion_record.py | 14 ++++++++++---- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.json b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.json index aa06d14b170..6e057ace4a6 100644 --- a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.json +++ b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.json @@ -34,6 +34,7 @@ "fieldname": "doctypes", "fieldtype": "Table", "label": "Summary", + "no_copy": 1, "options": "Transaction Deletion Record Details", "read_only": 1 }, @@ -126,7 +127,7 @@ "index_web_pages_for_search": 1, "is_submittable": 1, "links": [], - "modified": "2024-02-05 10:25:28.462255", + "modified": "2024-02-05 10:36:34.229864", "modified_by": "Administrator", "module": "Setup", "name": "Transaction Deletion Record", diff --git a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py index 5f430b85f58..c2c173e0514 100644 --- a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py +++ b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py @@ -6,7 +6,7 @@ import frappe from frappe import _, qb from frappe.desk.notifications import clear_notifications from frappe.model.document import Document -from frappe.utils import cint, create_batch, get_link_to_form +from frappe.utils import cint, comma_and, create_batch, get_link_to_form class TransactionDeletionRecord(Document): @@ -59,11 +59,16 @@ class TransactionDeletionRecord(Document): def before_submit(self): if queued_docs := frappe.db.get_all( - "Transaction Deletion Record", filters={"company": self.company, "status": "Queued"} + "Transaction Deletion Record", + filters={"company": self.company, "status": ("in", ["Running", "Queued"]), "docstatus": 1}, + pluck="name", ): frappe.throw( - _("There is another document: {0} Queued. Cannot queue multi docs for one company.").format( - self.queued_docs + _( + "Cannot queue multi docs for one company. {0} is already queued/running for company: {1}" + ).format( + comma_and([get_link_to_form("Transaction Deletion Record", x) for x in queued_docs]), + frappe.bold(self.company), ) ) @@ -80,6 +85,7 @@ class TransactionDeletionRecord(Document): def before_save(self): self.status = "" + self.doctypes.clear() self.reset_task_flags() def on_submit(self): From d35bef12b6fefe2212438bc9e2da9883872d1a3c Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Mon, 5 Feb 2024 11:52:00 +0530 Subject: [PATCH 21/90] refactor: validations to prevent duplicate jobs (cherry picked from commit 31a2da552b0773f8b7caf510fa06e54cdc1f2e9c) --- .../transaction_deletion_record.py | 75 +++++++++++++++---- 1 file changed, 59 insertions(+), 16 deletions(-) diff --git a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py index c2c173e0514..71892bbba1a 100644 --- a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py +++ b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py @@ -7,6 +7,7 @@ from frappe import _, qb from frappe.desk.notifications import clear_notifications from frappe.model.document import Document from frappe.utils import cint, comma_and, create_batch, get_link_to_form +from frappe.utils.background_jobs import get_job, is_job_enqueued class TransactionDeletionRecord(Document): @@ -41,6 +42,15 @@ class TransactionDeletionRecord(Document): def __init__(self, *args, **kwargs): super(TransactionDeletionRecord, self).__init__(*args, **kwargs) self.batch_size = 5000 + # Tasks are listged by their execution order + self.task_to_internal_method_map = { + "Delete Bins": "delete_bins", + "Delete Leads and Addresses": "delete_lead_addresses", + "Reset Company Values": "reset_company_values", + "Clear Notifications": "delete_notifications", + "Initialize Summary Table": "initialize_doctypes_to_be_deleted_table", + "Delete Transactions": "delete_company_transactions", + } def validate(self): frappe.only_for("System Manager") @@ -57,6 +67,16 @@ class TransactionDeletionRecord(Document): title=_("Not Allowed"), ) + def generate_job_name_for_task(self, task=None): + method = self.task_to_internal_method_map[task] + return f"{self.name}_{method}" + + def generate_job_name_for_all_tasks(self): + job_names = [] + for method in self.task_to_internal_method_map.values(): + job_names.append(self.generate_job_name_for_task) + return job_names + def before_submit(self): if queued_docs := frappe.db.get_all( "Transaction Deletion Record", @@ -65,7 +85,7 @@ class TransactionDeletionRecord(Document): ): frappe.throw( _( - "Cannot queue multi docs for one company. {0} is already queued/running for company: {1}" + "Cannot enqueue multi docs for one company. {0} is already queued/running for company: {1}" ).format( comma_and([get_link_to_form("Transaction Deletion Record", x) for x in queued_docs]), frappe.bold(self.company), @@ -94,28 +114,47 @@ class TransactionDeletionRecord(Document): def on_cancel(self): self.db_set("status", "Cancelled") - def chain_call(self, method): - frappe.enqueue( - "frappe.utils.background_jobs.run_doc_method", - doctype=self.doctype, - name=self.name, - doc_method=method, - queue="long", - enqueue_after_commit=True, - ) + def chain_call(self, task=None): + if task and task in self.task_to_internal_method_map: + method = self.task_to_internal_method_map[task] + job_id = self.generate_job_name_for_task(task) + + frappe.enqueue( + "frappe.utils.background_jobs.run_doc_method", + doctype=self.doctype, + name=self.name, + doc_method=method, + job_id=job_id, + queue="long", + enqueue_after_commit=True, + ) def delete_notifications(self): self.validate_doc_status() if not self.clear_notifications: clear_notifications() self.db_set("clear_notifications", 1) - self.chain_call("initialize_doctypes_to_be_deleted_table") + self.chain_call(task="Initialize Summary Table") def populate_doctypes_to_be_ignored_table(self): doctypes_to_be_ignored_list = get_doctypes_to_be_ignored() for doctype in doctypes_to_be_ignored_list: self.append("doctypes_to_be_ignored", {"doctype_name": doctype}) + def validate_running_task_for_doc(self, job_names: list = None): + # at most only one task should be runnning + running_tasks = [] + for x in job_names: + if is_job_enqueued(x): + running_tasks.append(get_job(x).get_id()) + + if running_tasks: + frappe.throw( + _("{0} is already running for {1}").format( + comma_and([get_link_to_form("RQ Job", x) for x in running_tasks]), self.name + ) + ) + def validate_doc_status(self): if self.status != "Running": frappe.throw( @@ -123,6 +162,9 @@ class TransactionDeletionRecord(Document): get_link_to_form("Transaction Deletion Record", self.name) ) ) + # make sure that job none of tasks are already running + job_names = self.generate_job_name_for_all_tasks() + self.validate_running_task_for_doc(job_names=job_names) @frappe.whitelist() def delete_bins(self): @@ -136,7 +178,7 @@ class TransactionDeletionRecord(Document): self.company, ) self.db_set("delete_bin_data", 1) - self.chain_call(method="delete_lead_addresses") + self.chain_call(task="Delete Leads and Addresses") def delete_lead_addresses(self): """Delete addresses to which leads are linked""" @@ -178,7 +220,7 @@ class TransactionDeletionRecord(Document): ) ) self.db_set("delete_leads_and_addresses", 1) - self.chain_call(method="reset_company_values") + self.chain_call(task="Reset Company Values") def reset_company_values(self): self.validate_doc_status() @@ -188,7 +230,7 @@ class TransactionDeletionRecord(Document): company_obj.sales_monthly_history = None company_obj.save() self.db_set("reset_company_default_values", 1) - self.chain_call(method="delete_notifications") + self.chain_call(task="Clear Notifications") def initialize_doctypes_to_be_deleted_table(self): self.validate_doc_status() @@ -205,7 +247,7 @@ class TransactionDeletionRecord(Document): # Initialize self.populate_doctypes_table(tables, docfield["parent"], docfield["fieldname"], 0) self.db_set("initialize_doctypes_table", 1) - self.chain_call(method="delete_company_transactions") + self.chain_call(task="Delete Transactions") def delete_company_transactions(self): self.validate_doc_status() @@ -245,7 +287,8 @@ class TransactionDeletionRecord(Document): docfield.doctype, filters={"parent": self.name, "done": 0}, pluck="doctype_name" ) if pending_doctypes: - self.chain_call(method="delete_company_transactions") + # as method is enqueued after commit, calling itself will not make validate_doc_status to throw + self.chain_call(task="Delete Transactions") else: self.db_set("status", "Completed") self.db_set("delete_transactions", 1) From 049c54bb32df217c61f073fb340a8de742db40f0 Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Mon, 5 Feb 2024 17:35:14 +0530 Subject: [PATCH 22/90] chore: hide docfield in list view (cherry picked from commit 98afb4d468145ac2270362841468f2ccb05b501f) --- .../transaction_deletion_record_details.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/erpnext/accounts/doctype/transaction_deletion_record_details/transaction_deletion_record_details.json b/erpnext/accounts/doctype/transaction_deletion_record_details/transaction_deletion_record_details.json index e8a5eb6c432..fe4b0852ac1 100644 --- a/erpnext/accounts/doctype/transaction_deletion_record_details/transaction_deletion_record_details.json +++ b/erpnext/accounts/doctype/transaction_deletion_record_details/transaction_deletion_record_details.json @@ -24,7 +24,6 @@ { "fieldname": "docfield_name", "fieldtype": "Data", - "in_list_view": 1, "label": "DocField", "read_only": 1 }, @@ -47,7 +46,7 @@ "index_web_pages_for_search": 1, "istable": 1, "links": [], - "modified": "2024-02-04 10:55:52.060417", + "modified": "2024-02-05 17:35:09.556054", "modified_by": "Administrator", "module": "Accounts", "name": "Transaction Deletion Record Details", From d4c2e6c77de67acac06ff5d54b149b3945555f0b Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Mon, 5 Feb 2024 20:35:29 +0530 Subject: [PATCH 23/90] refactor: make sure only one task is running for doc (cherry picked from commit 78c9cc63b1011761dd3fed84edb5c0b41ff9f3f5) --- .../transaction_deletion_record.js | 2 +- .../transaction_deletion_record.py | 48 ++++++++++++------- 2 files changed, 33 insertions(+), 17 deletions(-) diff --git a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.js b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.js index ed70ebb5f70..ccf09a6c38b 100644 --- a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.js +++ b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.js @@ -24,7 +24,7 @@ frappe.ui.form.on("Transaction Deletion Record", { frm.add_custom_button(execute_btn, () => { // Entry point for chain of events frm.call({ - method: 'delete_bins', + method: 'process_tasks', doc: frm.doc }); }); diff --git a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py index 71892bbba1a..be161e30322 100644 --- a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py +++ b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py @@ -1,6 +1,7 @@ # Copyright (c) 2021, Frappe Technologies Pvt. Ltd. and contributors # For license information, please see license.txt +from collections import OrderedDict import frappe from frappe import _, qb @@ -42,15 +43,17 @@ class TransactionDeletionRecord(Document): def __init__(self, *args, **kwargs): super(TransactionDeletionRecord, self).__init__(*args, **kwargs) self.batch_size = 5000 - # Tasks are listged by their execution order - self.task_to_internal_method_map = { - "Delete Bins": "delete_bins", - "Delete Leads and Addresses": "delete_lead_addresses", - "Reset Company Values": "reset_company_values", - "Clear Notifications": "delete_notifications", - "Initialize Summary Table": "initialize_doctypes_to_be_deleted_table", - "Delete Transactions": "delete_company_transactions", - } + # Tasks are listed by their execution order + self.task_to_internal_method_map = OrderedDict( + { + "Delete Bins": "delete_bins", + "Delete Leads and Addresses": "delete_lead_addresses", + "Reset Company Values": "reset_company_values", + "Clear Notifications": "delete_notifications", + "Initialize Summary Table": "initialize_doctypes_to_be_deleted_table", + "Delete Transactions": "delete_company_transactions", + } + ) def validate(self): frappe.only_for("System Manager") @@ -71,10 +74,19 @@ class TransactionDeletionRecord(Document): method = self.task_to_internal_method_map[task] return f"{self.name}_{method}" + def generate_job_name_for_next_tasks(self, task=None): + job_names = [] + current_task_idx = list(self.task_to_internal_method_map).index(task) + for idx, task in enumerate(self.task_to_internal_method_map.keys(), 0): + # generate job_name for next tasks + if idx > current_task_idx: + job_names.append(self.generate_job_name_for_task(task)) + return job_names + def generate_job_name_for_all_tasks(self): job_names = [] - for method in self.task_to_internal_method_map.values(): - job_names.append(self.generate_job_name_for_task) + for task in self.task_to_internal_method_map.keys(): + job_names.append(self.generate_job_name_for_task(task)) return job_names def before_submit(self): @@ -116,6 +128,10 @@ class TransactionDeletionRecord(Document): def chain_call(self, task=None): if task and task in self.task_to_internal_method_map: + # make sure that none of next tasks are already running + job_names = self.generate_job_name_for_next_tasks(task=task) + self.validate_running_task_for_doc(job_names=job_names) + method = self.task_to_internal_method_map[task] job_id = self.generate_job_name_for_task(task) @@ -162,15 +178,15 @@ class TransactionDeletionRecord(Document): get_link_to_form("Transaction Deletion Record", self.name) ) ) - # make sure that job none of tasks are already running - job_names = self.generate_job_name_for_all_tasks() - self.validate_running_task_for_doc(job_names=job_names) @frappe.whitelist() - def delete_bins(self): - # This methid is the entry point for the chain of events that follow + def process_tasks(self): + # This method is the entry point for the chain of events that follow self.db_set("status", "Running") + self.chain_call(task="Delete Bins") + def delete_bins(self): + self.validate_doc_status() if not self.delete_bin_data: frappe.db.sql( """delete from `tabBin` where warehouse in From b31e43e3db2ea92850f5426d68173e7cf4a99179 Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Wed, 7 Feb 2024 20:54:29 +0530 Subject: [PATCH 24/90] refactor: barebones hook on all doctypes with 'company' field (cherry picked from commit ec194ef076037b16edea68728069b3308a9a4216) --- erpnext/hooks.py | 5 ++++- .../transaction_deletion_record.py | 21 +++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/erpnext/hooks.py b/erpnext/hooks.py index 369704812e4..e463116f291 100644 --- a/erpnext/hooks.py +++ b/erpnext/hooks.py @@ -312,7 +312,10 @@ period_closing_doctypes = [ doc_events = { "*": { - "validate": "erpnext.support.doctype.service_level_agreement.service_level_agreement.apply", + "validate": [ + "erpnext.support.doctype.service_level_agreement.service_level_agreement.apply", + "erpnext.setup.doctype.transaction_deletion_record.transaction_deletion_record.check_for_running_deletion_job", + ], }, tuple(period_closing_doctypes): { "validate": "erpnext.accounts.doctype.accounting_period.accounting_period.validate_accounting_period_on_doc_save", diff --git a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py index be161e30322..5a49a7d1d7f 100644 --- a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py +++ b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py @@ -450,3 +450,24 @@ def get_doctypes_to_be_ignored(): doctypes_to_be_ignored.extend(frappe.get_hooks("company_data_to_be_ignored") or []) return doctypes_to_be_ignored + + +def check_for_running_deletion_job(doc, method=None): + df = qb.DocType("DocField") + if ( + not_allowed := qb.from_(df) + .select(df.parent) + .where((df.fieldname == "company") & (df.parent == doc.doctype)) + .run() + ): + if running_deletion_jobs := frappe.db.get_all( + "Transaction Deletion Record", + filters={"docstatus": 1, "company": doc.company, "status": "Running"}, + ): + frappe.throw( + _( + "Transaction Deletion job {0} is running for this Company. Cannot make any transactions until the deletion job is completed" + ).format( + get_link_to_form("Transaction Deletion Record", running_deletion_jobs[0].name) + ) + ) From 3de53999ce7ebf0aad29e61965a17a1d04b23455 Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Thu, 8 Feb 2024 16:08:59 +0530 Subject: [PATCH 25/90] refactor: better method naming (cherry picked from commit 30463657bf7f44321b690a79c94e24d6286d486e) --- .../transaction_deletion_record.py | 30 ++++++++++++------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py index 5a49a7d1d7f..170b1bfe72d 100644 --- a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py +++ b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py @@ -126,31 +126,40 @@ class TransactionDeletionRecord(Document): def on_cancel(self): self.db_set("status", "Cancelled") - def chain_call(self, task=None): + def enqueue_task(self, task: str | None = None): if task and task in self.task_to_internal_method_map: # make sure that none of next tasks are already running job_names = self.generate_job_name_for_next_tasks(task=task) self.validate_running_task_for_doc(job_names=job_names) - method = self.task_to_internal_method_map[task] + # method = self.task_to_internal_method_map[task] + # Generate Job Id to uniquely identify each task for this document job_id = self.generate_job_name_for_task(task) frappe.enqueue( "frappe.utils.background_jobs.run_doc_method", doctype=self.doctype, name=self.name, - doc_method=method, + doc_method="execute_task", job_id=job_id, queue="long", enqueue_after_commit=True, + task_to_execute=task, ) + def execute_task(self, task_to_execute: str | None = None): + if task_to_execute: + pass + method = self.task_to_internal_method_map[task_to_execute] + if task := getattr(self, method, None): + task() + def delete_notifications(self): self.validate_doc_status() if not self.clear_notifications: clear_notifications() self.db_set("clear_notifications", 1) - self.chain_call(task="Initialize Summary Table") + self.enqueue_task(task="Initialize Summary Table") def populate_doctypes_to_be_ignored_table(self): doctypes_to_be_ignored_list = get_doctypes_to_be_ignored() @@ -183,7 +192,7 @@ class TransactionDeletionRecord(Document): def process_tasks(self): # This method is the entry point for the chain of events that follow self.db_set("status", "Running") - self.chain_call(task="Delete Bins") + self.enqueue_task(task="Delete Bins") def delete_bins(self): self.validate_doc_status() @@ -194,7 +203,7 @@ class TransactionDeletionRecord(Document): self.company, ) self.db_set("delete_bin_data", 1) - self.chain_call(task="Delete Leads and Addresses") + self.enqueue_task(task="Delete Leads and Addresses") def delete_lead_addresses(self): """Delete addresses to which leads are linked""" @@ -236,7 +245,7 @@ class TransactionDeletionRecord(Document): ) ) self.db_set("delete_leads_and_addresses", 1) - self.chain_call(task="Reset Company Values") + self.enqueue_task(task="Reset Company Values") def reset_company_values(self): self.validate_doc_status() @@ -246,7 +255,7 @@ class TransactionDeletionRecord(Document): company_obj.sales_monthly_history = None company_obj.save() self.db_set("reset_company_default_values", 1) - self.chain_call(task="Clear Notifications") + self.enqueue_task(task="Clear Notifications") def initialize_doctypes_to_be_deleted_table(self): self.validate_doc_status() @@ -263,7 +272,7 @@ class TransactionDeletionRecord(Document): # Initialize self.populate_doctypes_table(tables, docfield["parent"], docfield["fieldname"], 0) self.db_set("initialize_doctypes_table", 1) - self.chain_call(task="Delete Transactions") + self.enqueue_task(task="Delete Transactions") def delete_company_transactions(self): self.validate_doc_status() @@ -304,7 +313,8 @@ class TransactionDeletionRecord(Document): ) if pending_doctypes: # as method is enqueued after commit, calling itself will not make validate_doc_status to throw - self.chain_call(task="Delete Transactions") + # recursively call this task to delete all transactions + self.enqueue_task(task="Delete Transactions") else: self.db_set("status", "Completed") self.db_set("delete_transactions", 1) From 3f45f63ff88bc663841e4649a1f144a7871ac8b8 Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Tue, 19 Mar 2024 11:18:11 +0530 Subject: [PATCH 26/90] chore: code cleanup (cherry picked from commit eea260b9f9c4a4a3a5a716b1d74a45c7569d4f98) --- .../transaction_deletion_record.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py index 170b1bfe72d..039d9a58413 100644 --- a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py +++ b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py @@ -132,7 +132,6 @@ class TransactionDeletionRecord(Document): job_names = self.generate_job_name_for_next_tasks(task=task) self.validate_running_task_for_doc(job_names=job_names) - # method = self.task_to_internal_method_map[task] # Generate Job Id to uniquely identify each task for this document job_id = self.generate_job_name_for_task(task) @@ -149,7 +148,6 @@ class TransactionDeletionRecord(Document): def execute_task(self, task_to_execute: str | None = None): if task_to_execute: - pass method = self.task_to_internal_method_map[task_to_execute] if task := getattr(self, method, None): task() @@ -309,7 +307,9 @@ class TransactionDeletionRecord(Document): frappe.db.set_value(docfield.doctype, docfield.name, "done", 1) pending_doctypes = frappe.db.get_all( - docfield.doctype, filters={"parent": self.name, "done": 0}, pluck="doctype_name" + "Transaction Deletion Record Details", + filters={"parent": self.name, "done": 0}, + pluck="doctype_name", ) if pending_doctypes: # as method is enqueued after commit, calling itself will not make validate_doc_status to throw From 02c3303feecaf4fd9ba6c70b054ac2abe463c8df Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Tue, 19 Mar 2024 17:39:20 +0530 Subject: [PATCH 27/90] refactor: exception propogation (cherry picked from commit 4a55240e630fedf1590a2c324528fd5934066d37) --- .../transaction_deletion_record.json | 9 ++++++++- .../transaction_deletion_record.py | 13 ++++++++++++- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.json b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.json index 6e057ace4a6..8291a4ffc24 100644 --- a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.json +++ b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.json @@ -10,6 +10,7 @@ "column_break_txbg", "status", "tasks_section", + "error_log", "delete_bin_data", "delete_leads_and_addresses", "reset_company_default_values", @@ -122,12 +123,18 @@ "label": "Initialize Summary Table", "no_copy": 1, "read_only": 1 + }, + { + "depends_on": "eval: doc.error_log", + "fieldname": "error_log", + "fieldtype": "Long Text", + "label": "Error Log" } ], "index_web_pages_for_search": 1, "is_submittable": 1, "links": [], - "modified": "2024-02-05 10:36:34.229864", + "modified": "2024-03-19 17:04:49.369734", "modified_by": "Administrator", "module": "Setup", "name": "Transaction Deletion Record", diff --git a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py index 039d9a58413..b1e75117ad4 100644 --- a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py +++ b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py @@ -35,6 +35,7 @@ class TransactionDeletionRecord(Document): delete_transactions: DF.Check doctypes: DF.Table[TransactionDeletionRecordDetails] doctypes_to_be_ignored: DF.Table[TransactionDeletionRecordItem] + error_log: DF.LongText | None initialize_doctypes_table: DF.Check reset_company_default_values: DF.Check status: DF.Literal["Queued", "Running", "Failed", "Completed", "Cancelled"] @@ -146,11 +147,21 @@ class TransactionDeletionRecord(Document): task_to_execute=task, ) + # todo: add a non-background job based approach as well + def execute_task(self, task_to_execute: str | None = None): if task_to_execute: method = self.task_to_internal_method_map[task_to_execute] if task := getattr(self, method, None): - task() + try: + task() + except Exception as err: + frappe.db.rollback() + traceback = frappe.get_traceback(with_context=True) + if traceback: + message = "Traceback:
" + traceback + frappe.db.set_value(self.doctype, self.name, "error_log", message) + frappe.db.set_value(self.doctype, self.name, "status", "Failed") def delete_notifications(self): self.validate_doc_status() From aceee829d20ac19101fc214d3419bb8b28148d43 Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Tue, 19 Mar 2024 17:41:37 +0530 Subject: [PATCH 28/90] refactor: minor UI tweaks (cherry picked from commit 0455d0c46c8a171c0bbbd6f1730f671263cfedc4) --- .../transaction_deletion_record.js | 16 +++++++--------- .../transaction_deletion_record.py | 1 + 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.js b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.js index ccf09a6c38b..d543baa3cf6 100644 --- a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.js +++ b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.js @@ -10,26 +10,24 @@ frappe.ui.form.on("Transaction Deletion Record", { callback: function (r) { doctypes_to_be_ignored_array = r.message; populate_doctypes_to_be_ignored(doctypes_to_be_ignored_array, frm); - frm.refresh_field('doctypes_to_be_ignored'); - } + frm.refresh_field("doctypes_to_be_ignored"); + }, }); } - }, - refresh: function(frm) { - if (frm.doc.docstatus==1 && ['Queued', 'Failed'].find(x => x == frm.doc.status)) { - let execute_btn = __("Start Deletion") + refresh: function (frm) { + if (frm.doc.docstatus == 1 && ["Queued", "Failed"].find((x) => x == frm.doc.status)) { + let execute_btn = frm.doc.status == "Queued" ? __("Start Deletion") : __("Retry"); frm.add_custom_button(execute_btn, () => { // Entry point for chain of events frm.call({ - method: 'process_tasks', - doc: frm.doc + method: "process_tasks", + doc: frm.doc, }); }); } - }, }); diff --git a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py index b1e75117ad4..1959a7d86d9 100644 --- a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py +++ b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py @@ -329,6 +329,7 @@ class TransactionDeletionRecord(Document): else: self.db_set("status", "Completed") self.db_set("delete_transactions", 1) + self.db_set("error_log", None) def get_doctypes_to_be_ignored_list(self): singles = frappe.get_all("DocType", filters={"issingle": 1}, pluck="name") From ae6260f717f7a78dec2e029b9cd6cf6d56b02aa2 Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Tue, 19 Mar 2024 17:49:05 +0530 Subject: [PATCH 29/90] chore: move status and error log to their own section (cherry picked from commit 3cec62d4f872a66557e1b9e56a2207f194e5439f) --- .../transaction_deletion_record.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.json b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.json index 8291a4ffc24..688b14a808a 100644 --- a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.json +++ b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.json @@ -7,10 +7,10 @@ "engine": "InnoDB", "field_order": [ "company", - "column_break_txbg", + "section_break_qpwb", "status", - "tasks_section", "error_log", + "tasks_section", "delete_bin_data", "delete_leads_and_addresses", "reset_company_default_values", @@ -63,10 +63,6 @@ "options": "Queued\nRunning\nFailed\nCompleted\nCancelled", "read_only": 1 }, - { - "fieldname": "column_break_txbg", - "fieldtype": "Column Break" - }, { "fieldname": "section_break_tbej", "fieldtype": "Section Break" @@ -129,12 +125,16 @@ "fieldname": "error_log", "fieldtype": "Long Text", "label": "Error Log" + }, + { + "fieldname": "section_break_qpwb", + "fieldtype": "Section Break" } ], "index_web_pages_for_search": 1, "is_submittable": 1, "links": [], - "modified": "2024-03-19 17:04:49.369734", + "modified": "2024-03-19 17:47:04.490196", "modified_by": "Administrator", "module": "Setup", "name": "Transaction Deletion Record", From 29804f6a416e5028c75b9650ad9eb3c32ec947b5 Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Wed, 20 Mar 2024 14:10:08 +0530 Subject: [PATCH 30/90] chore: rename entry point (cherry picked from commit 5fe0b20be108ce55a9519af5c953f7aebeaca93b) --- .../transaction_deletion_record/transaction_deletion_record.js | 2 +- .../transaction_deletion_record/transaction_deletion_record.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.js b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.js index d543baa3cf6..9aa02784165 100644 --- a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.js +++ b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.js @@ -23,7 +23,7 @@ frappe.ui.form.on("Transaction Deletion Record", { frm.add_custom_button(execute_btn, () => { // Entry point for chain of events frm.call({ - method: "process_tasks", + method: "start_deletion_tasks", doc: frm.doc, }); }); diff --git a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py index 1959a7d86d9..e8ffe55a2b7 100644 --- a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py +++ b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py @@ -198,7 +198,7 @@ class TransactionDeletionRecord(Document): ) @frappe.whitelist() - def process_tasks(self): + def start_deletion_tasks(self): # This method is the entry point for the chain of events that follow self.db_set("status", "Running") self.enqueue_task(task="Delete Bins") From 1104deb58e6459441cd48924148a42b90914b058 Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Wed, 20 Mar 2024 14:32:27 +0530 Subject: [PATCH 31/90] refactor: link running doc validation to company master (cherry picked from commit 5a3afea8c772b7167839593ba88f3582a381259c) --- erpnext/setup/doctype/company/company.js | 2 +- erpnext/setup/doctype/company/company.py | 41 ++++++------------- .../transaction_deletion_record.py | 32 ++++++++++----- 3 files changed, 34 insertions(+), 41 deletions(-) diff --git a/erpnext/setup/doctype/company/company.js b/erpnext/setup/doctype/company/company.js index e10b1caaf84..670d898b8df 100644 --- a/erpnext/setup/doctype/company/company.js +++ b/erpnext/setup/doctype/company/company.js @@ -168,7 +168,7 @@ frappe.ui.form.on("Company", { delete_company_transactions: function (frm) { frappe.call({ - method: "erpnext.setup.doctype.company.company.is_deletion_job_running", + method: "erpnext.setup.doctype.transaction_deletion_record.transaction_deletion_record.is_deletion_doc_running", args: { company: frm.doc.name, }, diff --git a/erpnext/setup/doctype/company/company.py b/erpnext/setup/doctype/company/company.py index a91fd01c911..7d2d7679b02 100644 --- a/erpnext/setup/doctype/company/company.py +++ b/erpnext/setup/doctype/company/company.py @@ -12,7 +12,6 @@ from frappe.contacts.address_and_contact import load_address_and_contact from frappe.custom.doctype.property_setter.property_setter import make_property_setter from frappe.desk.page.setup_wizard.setup_wizard import make_records from frappe.utils import cint, formatdate, get_link_to_form, get_timestamp, today -from frappe.utils.background_jobs import get_job, is_job_enqueued from frappe.utils.nestedset import NestedSet, rebuild_tree from erpnext.accounts.doctype.account.account import get_account_currency @@ -904,37 +903,21 @@ def get_default_company_address(name, sort_key="is_primary_address", existing_ad return None -def generate_id_for_deletion_job(company): - return "delete_company_transactions_" + company - - -@frappe.whitelist() -def is_deletion_job_running(company): - job_id = generate_id_for_deletion_job(company) - if is_job_enqueued(job_id): - job_name = get_job(job_id).get_id() # job name will have site prefix - frappe.throw( - _("A Transaction Deletion Job: {0} is already running for {1}").format( - frappe.bold(get_link_to_form("RQ Job", job_name)), frappe.bold(company) - ) - ) - - @frappe.whitelist() def create_transaction_deletion_request(company): - is_deletion_job_running(company) - job_id = generate_id_for_deletion_job(company) + from erpnext.setup.doctype.transaction_deletion_record.transaction_deletion_record import ( + is_deletion_doc_running, + ) + + is_deletion_doc_running(company) tdr = frappe.get_doc({"doctype": "Transaction Deletion Record", "company": company}) - tdr.insert() + tdr.submit() + tdr.start_deletion_tasks() - frappe.enqueue( - "frappe.utils.background_jobs.run_doc_method", - doctype=tdr.doctype, - name=tdr.name, - doc_method="submit", - job_id=job_id, - queue="long", - enqueue_after_commit=True, + frappe.msgprint( + _("A Transaction Deletion Document: {0} is triggered for {0}").format( + get_link_to_form("Transaction Deletion Record", tdr.name) + ), + frappe.bold(company), ) - frappe.msgprint(_("A Transaction Deletion Job is triggered for {0}").format(frappe.bold(company))) diff --git a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py index e8ffe55a2b7..4ee91306ee9 100644 --- a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py +++ b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py @@ -474,7 +474,25 @@ def get_doctypes_to_be_ignored(): return doctypes_to_be_ignored +@frappe.whitelist() +def is_deletion_doc_running(company: str | None = None, err_msg: str | None = None): + if company: + if running_deletion_jobs := frappe.db.get_all( + "Transaction Deletion Record", + filters={"docstatus": 1, "company": company, "status": "Running"}, + ): + if not err_msg: + err_msg = "" + frappe.throw( + title=_("Deletion in Progress!"), + msg=_("Transaction Deletion Document: {0} is running for this Company. {1}").format( + get_link_to_form("Transaction Deletion Record", running_deletion_jobs[0].name), err_msg + ), + ) + + def check_for_running_deletion_job(doc, method=None): + # Check if DocType has 'company' field df = qb.DocType("DocField") if ( not_allowed := qb.from_(df) @@ -482,14 +500,6 @@ def check_for_running_deletion_job(doc, method=None): .where((df.fieldname == "company") & (df.parent == doc.doctype)) .run() ): - if running_deletion_jobs := frappe.db.get_all( - "Transaction Deletion Record", - filters={"docstatus": 1, "company": doc.company, "status": "Running"}, - ): - frappe.throw( - _( - "Transaction Deletion job {0} is running for this Company. Cannot make any transactions until the deletion job is completed" - ).format( - get_link_to_form("Transaction Deletion Record", running_deletion_jobs[0].name) - ) - ) + is_deletion_doc_running( + doc.company, _("Cannot make any transactions until the deletion job is completed") + ) From 40574f0d72d024b0945114bf47bae05aefd6a632 Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Wed, 20 Mar 2024 14:59:19 +0530 Subject: [PATCH 32/90] refactor: ability to process in single transaction (cherry picked from commit a158b825d7eb359a66743b3e6972aa1b81389df0) --- .../transaction_deletion_record.json | 11 ++++++-- .../transaction_deletion_record.py | 26 ++++++++++--------- 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.json b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.json index 688b14a808a..e03e1695e0e 100644 --- a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.json +++ b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.json @@ -20,7 +20,8 @@ "section_break_tbej", "doctypes", "doctypes_to_be_ignored", - "amended_from" + "amended_from", + "process_in_single_transaction" ], "fields": [ { @@ -129,12 +130,18 @@ { "fieldname": "section_break_qpwb", "fieldtype": "Section Break" + }, + { + "default": "0", + "fieldname": "process_in_single_transaction", + "fieldtype": "Check", + "label": "Process in Single Transaction" } ], "index_web_pages_for_search": 1, "is_submittable": 1, "links": [], - "modified": "2024-03-19 17:47:04.490196", + "modified": "2024-03-20 14:58:15.086360", "modified_by": "Administrator", "module": "Setup", "name": "Transaction Deletion Record", diff --git a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py index 4ee91306ee9..00fad5f0fa6 100644 --- a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py +++ b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py @@ -37,6 +37,7 @@ class TransactionDeletionRecord(Document): doctypes_to_be_ignored: DF.Table[TransactionDeletionRecordItem] error_log: DF.LongText | None initialize_doctypes_table: DF.Check + process_in_single_transaction: DF.Check reset_company_default_values: DF.Check status: DF.Literal["Queued", "Running", "Failed", "Completed", "Cancelled"] # end: auto-generated types @@ -136,18 +137,19 @@ class TransactionDeletionRecord(Document): # Generate Job Id to uniquely identify each task for this document job_id = self.generate_job_name_for_task(task) - frappe.enqueue( - "frappe.utils.background_jobs.run_doc_method", - doctype=self.doctype, - name=self.name, - doc_method="execute_task", - job_id=job_id, - queue="long", - enqueue_after_commit=True, - task_to_execute=task, - ) - - # todo: add a non-background job based approach as well + if self.process_in_single_transaction: + self.execute_task(task_to_execute=task) + else: + frappe.enqueue( + "frappe.utils.background_jobs.run_doc_method", + doctype=self.doctype, + name=self.name, + doc_method="execute_task", + job_id=job_id, + queue="long", + enqueue_after_commit=True, + task_to_execute=task, + ) def execute_task(self, task_to_execute: str | None = None): if task_to_execute: From 5bbccf1fbddb8dba14f79925349651cb88a00d18 Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Wed, 20 Mar 2024 15:16:33 +0530 Subject: [PATCH 33/90] refactor(test): test cases modified to handle new approach (cherry picked from commit 81309576b0cb41ac2c91cf1abbf79b4655c7697d) --- erpnext/setup/demo.py | 2 ++ .../test_transaction_deletion_record.py | 3 +++ 2 files changed, 5 insertions(+) diff --git a/erpnext/setup/demo.py b/erpnext/setup/demo.py index 688d45a5a77..f48402e175b 100644 --- a/erpnext/setup/demo.py +++ b/erpnext/setup/demo.py @@ -181,8 +181,10 @@ def get_random_date(start_date, start_range, end_range): def create_transaction_deletion_record(company): transaction_deletion_record = frappe.new_doc("Transaction Deletion Record") transaction_deletion_record.company = company + transaction_deletion_record.process_in_single_transaction = True transaction_deletion_record.save(ignore_permissions=True) transaction_deletion_record.submit() + transaction_deletion_record.start_deletion_tasks() def clear_masters(): diff --git a/erpnext/setup/doctype/transaction_deletion_record/test_transaction_deletion_record.py b/erpnext/setup/doctype/transaction_deletion_record/test_transaction_deletion_record.py index 844e7865e3e..432438bcfee 100644 --- a/erpnext/setup/doctype/transaction_deletion_record/test_transaction_deletion_record.py +++ b/erpnext/setup/doctype/transaction_deletion_record/test_transaction_deletion_record.py @@ -29,6 +29,7 @@ class TestTransactionDeletionRecord(FrappeTestCase): for i in range(5): create_task("Dunder Mifflin Paper Co") tdr = create_transaction_deletion_doc("Dunder Mifflin Paper Co") + tdr.reload() for doctype in tdr.doctypes: if doctype.doctype_name == "Task": self.assertEqual(doctype.no_of_docs, 5) @@ -60,7 +61,9 @@ def create_company(company_name): def create_transaction_deletion_doc(company): tdr = frappe.get_doc({"doctype": "Transaction Deletion Record", "company": company}) tdr.insert() + tdr.process_in_single_transaction = True tdr.submit() + tdr.start_deletion_tasks() return tdr From e7d2451f602ecd3424173e03e546e74edb182cd9 Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Wed, 20 Mar 2024 16:01:09 +0530 Subject: [PATCH 34/90] chore: fix linting issue in JS (cherry picked from commit 02c522b7cddf0b1ae4bcc1d05e156a5b7aa09f2f) --- .../transaction_deletion_record_list.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record_list.js b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record_list.js index 7c7b8ff25a7..285cb6dd221 100644 --- a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record_list.js +++ b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record_list.js @@ -1,16 +1,16 @@ // Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors // License: GNU General Public License v3. See license.txt -frappe.listview_settings['Transaction Deletion Record'] = { +frappe.listview_settings["Transaction Deletion Record"] = { add_fields: ["status"], - get_indicator: function(doc) { + get_indicator: function (doc) { let colors = { - 'Queued': 'orange', - 'Completed': 'green', - 'Running': 'blue', - 'Failed': 'red', + Queued: "orange", + Completed: "green", + Running: "blue", + Failed: "red", }; let status = doc.status; - return [__(status), colors[status], 'status,=,'+status]; + return [__(status), colors[status], "status,=," + status]; }, }; From 8e5d481cba2b756abc79973acd5972017fc8e23e Mon Sep 17 00:00:00 2001 From: Gursheen Kaur Anand <40693548+GursheenK@users.noreply.github.com> Date: Wed, 20 Mar 2024 20:03:03 +0530 Subject: [PATCH 35/90] chore: resolve conflicts --- erpnext/buying/doctype/purchase_order/purchase_order.json | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.json b/erpnext/buying/doctype/purchase_order/purchase_order.json index b57a887d900..8f4b035361a 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.json +++ b/erpnext/buying/doctype/purchase_order/purchase_order.json @@ -1275,11 +1275,7 @@ "idx": 105, "is_submittable": 1, "links": [], -<<<<<<< HEAD - "modified": "2023-10-01 20:58:07.851037", -======= "modified": "2024-03-20 16:03:31.611808", ->>>>>>> 1c63983873 (fix: use Text Editor for rendering tax breakup table) "modified_by": "Administrator", "module": "Buying", "name": "Purchase Order", @@ -1334,4 +1330,4 @@ "timeline_field": "supplier", "title_field": "supplier_name", "track_changes": 1 -} \ No newline at end of file +} From 9c204b71063ddf5d9c30e3633b51d9621e816521 Mon Sep 17 00:00:00 2001 From: Gursheen Kaur Anand <40693548+GursheenK@users.noreply.github.com> Date: Wed, 20 Mar 2024 20:04:44 +0530 Subject: [PATCH 36/90] chore: resolve conflicts --- .../doctype/supplier_quotation/supplier_quotation.json | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/erpnext/buying/doctype/supplier_quotation/supplier_quotation.json b/erpnext/buying/doctype/supplier_quotation/supplier_quotation.json index 2d2633feff5..9f89078de67 100644 --- a/erpnext/buying/doctype/supplier_quotation/supplier_quotation.json +++ b/erpnext/buying/doctype/supplier_quotation/supplier_quotation.json @@ -928,11 +928,7 @@ "index_web_pages_for_search": 1, "is_submittable": 1, "links": [], -<<<<<<< HEAD - "modified": "2023-11-20 11:15:30.083077", -======= "modified": "2024-03-20 16:03:59.069145", ->>>>>>> 1c63983873 (fix: use Text Editor for rendering tax breakup table) "modified_by": "Administrator", "module": "Buying", "name": "Supplier Quotation", @@ -1000,4 +996,4 @@ "states": [], "timeline_field": "supplier", "title_field": "title" -} \ No newline at end of file +} From 4b973b2f861d70ad9ed3a89345d816cf8e882274 Mon Sep 17 00:00:00 2001 From: Gursheen Anand Date: Wed, 20 Mar 2024 18:45:04 +0530 Subject: [PATCH 37/90] fix: validate gl for previous fiscal year (cherry picked from commit a1d108c062831b2301b2b62b09dad35e8bbd1959) --- .../doctype/period_closing_voucher/period_closing_voucher.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/erpnext/accounts/doctype/period_closing_voucher/period_closing_voucher.py b/erpnext/accounts/doctype/period_closing_voucher/period_closing_voucher.py index 2a84d971f44..76c0a093861 100644 --- a/erpnext/accounts/doctype/period_closing_voucher/period_closing_voucher.py +++ b/erpnext/accounts/doctype/period_closing_voucher/period_closing_voucher.py @@ -141,7 +141,8 @@ class PeriodClosingVoucher(AccountsController): previous_fiscal_year = get_fiscal_year(last_year_closing, company=self.company, boolean=True) if previous_fiscal_year and not frappe.db.exists( - "GL Entry", {"posting_date": ("<=", last_year_closing), "company": self.company} + "GL Entry", + {"posting_date": ("<=", last_year_closing), "company": self.company, "is_cancelled": 0}, ): return From b7dc28fff9556367e866a82ff5ad0a1a50ca6009 Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Thu, 21 Mar 2024 10:29:56 +0530 Subject: [PATCH 38/90] refactor: config changes in Transaction Deletion Record (cherry picked from commit 4ba67fb3ec9668dc743e24aad43ed17f286f48de) --- .../transaction_deletion_record.json | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.json b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.json index e03e1695e0e..b9f911dbe8c 100644 --- a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.json +++ b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.json @@ -135,13 +135,16 @@ "default": "0", "fieldname": "process_in_single_transaction", "fieldtype": "Check", - "label": "Process in Single Transaction" + "hidden": 1, + "label": "Process in Single Transaction", + "no_copy": 1, + "read_only": 1 } ], "index_web_pages_for_search": 1, "is_submittable": 1, "links": [], - "modified": "2024-03-20 14:58:15.086360", + "modified": "2024-03-21 10:29:19.456413", "modified_by": "Administrator", "module": "Setup", "name": "Transaction Deletion Record", From 357a1c9752e9c4f92d7e1784b22268a04222e12b Mon Sep 17 00:00:00 2001 From: barredterra <14891507+barredterra@users.noreply.github.com> Date: Thu, 21 Mar 2024 11:57:22 +0100 Subject: [PATCH 39/90] refactor(Item Price): validate dates (cherry picked from commit cbcc47b5c4ae190f3951a772bb88f81acfa8fc3a) # Conflicts: # erpnext/stock/doctype/item_price/item_price.py --- erpnext/stock/doctype/item_price/item_price.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/erpnext/stock/doctype/item_price/item_price.py b/erpnext/stock/doctype/item_price/item_price.py index 89a130a6bf4..1a224141750 100644 --- a/erpnext/stock/doctype/item_price/item_price.py +++ b/erpnext/stock/doctype/item_price/item_price.py @@ -7,7 +7,6 @@ from frappe import _, bold from frappe.model.document import Document from frappe.query_builder import Criterion from frappe.query_builder.functions import Cast_ -from frappe.utils import getdate class ItemPriceDuplicateItem(frappe.ValidationError): @@ -46,7 +45,7 @@ class ItemPrice(Document): def validate(self): self.validate_item() - self.validate_dates() + self.validate_from_to_dates("valid_from", "valid_upto") self.update_price_list_details() self.update_item_details() self.check_duplicates() @@ -56,11 +55,14 @@ class ItemPrice(Document): if not frappe.db.exists("Item", self.item_code): frappe.throw(_("Item {0} not found.").format(self.item_code)) +<<<<<<< HEAD def validate_dates(self): if self.valid_from and self.valid_upto: if getdate(self.valid_from) > getdate(self.valid_upto): frappe.throw(_("Valid From Date must be lesser than Valid Upto Date.")) +======= +>>>>>>> cbcc47b5c4 (refactor(Item Price): validate dates) def update_price_list_details(self): if self.price_list: price_list_details = frappe.db.get_value( From df6226f07fa82b51922aaf539d18226f4e031049 Mon Sep 17 00:00:00 2001 From: barredterra <14891507+barredterra@users.noreply.github.com> Date: Thu, 21 Mar 2024 14:16:27 +0100 Subject: [PATCH 40/90] chore: resolve conflicts --- erpnext/stock/doctype/item_price/item_price.py | 8 -------- 1 file changed, 8 deletions(-) diff --git a/erpnext/stock/doctype/item_price/item_price.py b/erpnext/stock/doctype/item_price/item_price.py index 1a224141750..25a28b436ff 100644 --- a/erpnext/stock/doctype/item_price/item_price.py +++ b/erpnext/stock/doctype/item_price/item_price.py @@ -55,14 +55,6 @@ class ItemPrice(Document): if not frappe.db.exists("Item", self.item_code): frappe.throw(_("Item {0} not found.").format(self.item_code)) -<<<<<<< HEAD - def validate_dates(self): - if self.valid_from and self.valid_upto: - if getdate(self.valid_from) > getdate(self.valid_upto): - frappe.throw(_("Valid From Date must be lesser than Valid Upto Date.")) - -======= ->>>>>>> cbcc47b5c4 (refactor(Item Price): validate dates) def update_price_list_details(self): if self.price_list: price_list_details = frappe.db.get_value( From c2242406f42df4dabd298fd5a0291f1084fa3bbe Mon Sep 17 00:00:00 2001 From: Dany Robert Date: Tue, 12 Mar 2024 12:52:19 +0530 Subject: [PATCH 41/90] fix: wrong buying amount if delivered and billed qty varies (cherry picked from commit b8da0d9334919e283724f2e02ce3dd3a9780d9a9) --- erpnext/accounts/report/gross_profit/gross_profit.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/erpnext/accounts/report/gross_profit/gross_profit.py b/erpnext/accounts/report/gross_profit/gross_profit.py index a4c137889ba..2b851050639 100644 --- a/erpnext/accounts/report/gross_profit/gross_profit.py +++ b/erpnext/accounts/report/gross_profit/gross_profit.py @@ -669,20 +669,20 @@ class GrossProfitGenerator(object): elif row.sales_order and row.so_detail: incoming_amount = self.get_buying_amount_from_so_dn(row.sales_order, row.so_detail, item_code) if incoming_amount: - return incoming_amount + return flt(row.qty) * incoming_amount else: return flt(row.qty) * self.get_average_buying_rate(row, item_code) return flt(row.qty) * self.get_average_buying_rate(row, item_code) def get_buying_amount_from_so_dn(self, sales_order, so_detail, item_code): - from frappe.query_builder.functions import Sum + from frappe.query_builder.functions import Avg delivery_note_item = frappe.qb.DocType("Delivery Note Item") query = ( frappe.qb.from_(delivery_note_item) - .select(Sum(delivery_note_item.incoming_rate * delivery_note_item.stock_qty)) + .select(Avg(delivery_note_item.incoming_rate)) .where(delivery_note_item.docstatus == 1) .where(delivery_note_item.item_code == item_code) .where(delivery_note_item.against_sales_order == sales_order) From f5008a14676a724dbf39518c0393e58db8ab08e5 Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Thu, 21 Mar 2024 20:56:52 +0530 Subject: [PATCH 42/90] test: buying amt calculation if DN and SI differ in qty (cherry picked from commit ccb51ded957fb4fd16f4dd7ce7c7e285f6ef1a81) --- .../report/gross_profit/test_gross_profit.py | 92 +++++++++++++++++++ 1 file changed, 92 insertions(+) diff --git a/erpnext/accounts/report/gross_profit/test_gross_profit.py b/erpnext/accounts/report/gross_profit/test_gross_profit.py index 82fe1a0ba12..aa820aa4c73 100644 --- a/erpnext/accounts/report/gross_profit/test_gross_profit.py +++ b/erpnext/accounts/report/gross_profit/test_gross_profit.py @@ -460,3 +460,95 @@ class TestGrossProfit(FrappeTestCase): } gp_entry = [x for x in data if x.parent_invoice == sinv.name] self.assertDictContainsSubset(expected_entry, gp_entry[0]) + + def test_different_rates_in_si_and_dn(self): + from erpnext.selling.doctype.sales_order.test_sales_order import make_sales_order + + """ + Test gp calculation when invoice and delivery note differ in qty and aren't connected + SO -- INV + | + DN + """ + se = make_stock_entry( + company=self.company, + item_code=self.item, + target=self.warehouse, + qty=3, + basic_rate=700, + do_not_submit=True, + ) + item = se.items[0] + se.append( + "items", + { + "item_code": item.item_code, + "s_warehouse": item.s_warehouse, + "t_warehouse": item.t_warehouse, + "qty": 10, + "basic_rate": 700, + "conversion_factor": item.conversion_factor or 1.0, + "transfer_qty": flt(item.qty) * (flt(item.conversion_factor) or 1.0), + "serial_no": item.serial_no, + "batch_no": item.batch_no, + "cost_center": item.cost_center, + "expense_account": item.expense_account, + }, + ) + se = se.save().submit() + + so = make_sales_order( + customer=self.customer, + company=self.company, + warehouse=self.warehouse, + item=self.item, + rate=800, + qty=10, + do_not_save=False, + do_not_submit=False, + ) + + from erpnext.selling.doctype.sales_order.sales_order import ( + make_delivery_note, + make_sales_invoice, + ) + + dn1 = make_delivery_note(so.name) + dn1.items[0].qty = 4 + dn1.items[0].rate = 800 + dn1.save().submit() + + dn2 = make_delivery_note(so.name) + dn2.items[0].qty = 6 + dn2.items[0].rate = 800 + dn2.save().submit() + + sinv = make_sales_invoice(so.name) + sinv.items[0].qty = 4 + sinv.items[0].rate = 800 + sinv.save().submit() + + filters = frappe._dict( + company=self.company, from_date=nowdate(), to_date=nowdate(), group_by="Invoice" + ) + + columns, data = execute(filters=filters) + expected_entry = { + "parent_invoice": sinv.name, + "currency": "INR", + "sales_invoice": self.item, + "customer": self.customer, + "posting_date": frappe.utils.datetime.date.fromisoformat(nowdate()), + "item_code": self.item, + "item_name": self.item, + "warehouse": "Stores - _GP", + "qty": 4.0, + "avg._selling_rate": 800.0, + "valuation_rate": 700.0, + "selling_amount": 3200.0, + "buying_amount": 2800.0, + "gross_profit": 400.0, + "gross_profit_%": 12.5, + } + gp_entry = [x for x in data if x.parent_invoice == sinv.name] + self.assertDictContainsSubset(expected_entry, gp_entry[0]) From fd02060cd28f2714d49280b7b1f80ed9535dba96 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Thu, 21 Mar 2024 21:04:03 +0530 Subject: [PATCH 43/90] fix: rate not fetching from the item price (cherry picked from commit d893a465d79b2e301b49b093f05d21d9eb196c9d) --- erpnext/stock/get_item_details.py | 1 - 1 file changed, 1 deletion(-) diff --git a/erpnext/stock/get_item_details.py b/erpnext/stock/get_item_details.py index 85da0348265..a82ce223270 100644 --- a/erpnext/stock/get_item_details.py +++ b/erpnext/stock/get_item_details.py @@ -821,7 +821,6 @@ def get_price_list_rate(args, item_doc, out=None): ): if args.price_list and args.rate: insert_item_price(args) - return out out.price_list_rate = ( flt(price_list_rate) * flt(args.plc_conversion_rate) / flt(args.conversion_rate) From f66cf7d838c0008d64a15de5dada4f35e710b6ee Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Fri, 22 Mar 2024 08:51:57 +0530 Subject: [PATCH 44/90] perf: add in some indexes (backport #40590) (#40605) perf: add in some indexes (#40590) `Sales Invoice Item.purchase_order` `Delivery Note Item.purchase_order` Signed-off-by: Akhil Narang (cherry picked from commit 1cd38c860a5da2ab33d4da0a5f29bf95c788e59a) Co-authored-by: Akhil Narang --- .../selling/doctype/sales_order_item/sales_order_item.json | 5 +++-- .../stock/doctype/delivery_note_item/delivery_note_item.json | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/erpnext/selling/doctype/sales_order_item/sales_order_item.json b/erpnext/selling/doctype/sales_order_item/sales_order_item.json index 9599980418f..d451768eaab 100644 --- a/erpnext/selling/doctype/sales_order_item/sales_order_item.json +++ b/erpnext/selling/doctype/sales_order_item/sales_order_item.json @@ -834,7 +834,8 @@ "label": "Purchase Order", "options": "Purchase Order", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "search_index": 1 }, { "fieldname": "column_break_89", @@ -909,7 +910,7 @@ "idx": 1, "istable": 1, "links": [], - "modified": "2024-01-25 14:24:00.330219", + "modified": "2024-03-21 18:15:56.625005", "modified_by": "Administrator", "module": "Selling", "name": "Sales Order Item", diff --git a/erpnext/stock/doctype/delivery_note_item/delivery_note_item.json b/erpnext/stock/doctype/delivery_note_item/delivery_note_item.json index 247672fe126..b8164b25753 100644 --- a/erpnext/stock/doctype/delivery_note_item/delivery_note_item.json +++ b/erpnext/stock/doctype/delivery_note_item/delivery_note_item.json @@ -796,7 +796,8 @@ "label": "Purchase Order", "options": "Purchase Order", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "search_index": 1 }, { "fieldname": "column_break_82", @@ -912,7 +913,7 @@ "index_web_pages_for_search": 1, "istable": 1, "links": [], - "modified": "2024-02-04 14:10:31.750340", + "modified": "2024-03-21 18:15:07.603672", "modified_by": "Administrator", "module": "Stock", "name": "Delivery Note Item", From 6e6ca42261e0b183aa50553a476d27c9fa600c0f Mon Sep 17 00:00:00 2001 From: David Date: Mon, 18 Mar 2024 23:05:58 +0100 Subject: [PATCH 45/90] fix: permissions during bulk transaction logs (cherry picked from commit 49dd4c1ef3fcb6f710c185c50188d0bee4ea2dcd) --- erpnext/utilities/bulk_transaction.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/utilities/bulk_transaction.py b/erpnext/utilities/bulk_transaction.py index 9678488a261..155eebe0e93 100644 --- a/erpnext/utilities/bulk_transaction.py +++ b/erpnext/utilities/bulk_transaction.py @@ -164,7 +164,7 @@ def create_log(doc_name, e, from_doctype, to_doctype, status, log_date=None, res transaction_log.from_doctype = from_doctype transaction_log.to_doctype = to_doctype transaction_log.retried = restarted - transaction_log.save() + transaction_log.save(ignore_permissions=True) def show_job_status(fail_count, deserialized_data_count, to_doctype): From 0393855243571531fd68f5652a4ba25cae84154a Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Fri, 15 Sep 2023 21:24:53 +0530 Subject: [PATCH 46/90] refactor: primitive summary for p&l and balance sheet (cherry picked from commit eb4c476490ea32cd94e0b6cc3715abe99f1d4e0a) --- erpnext/accounts/report/balance_sheet/balance_sheet.py | 6 +++--- .../profit_and_loss_statement/profit_and_loss_statement.py | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/erpnext/accounts/report/balance_sheet/balance_sheet.py b/erpnext/accounts/report/balance_sheet/balance_sheet.py index b225aac7b56..5d6ca23a6b2 100644 --- a/erpnext/accounts/report/balance_sheet/balance_sheet.py +++ b/erpnext/accounts/report/balance_sheet/balance_sheet.py @@ -97,11 +97,11 @@ def execute(filters=None): chart = get_chart_data(filters, columns, asset, liability, equity) - report_summary = get_report_summary( + report_summary, primitive_summary = get_report_summary( period_list, asset, liability, equity, provisional_profit_loss, currency, filters ) - return columns, data, message, chart, report_summary + return columns, data, message, chart, report_summary, primitive_summary def get_provisional_profit_loss( @@ -217,7 +217,7 @@ def get_report_summary( "datatype": "Currency", "currency": currency, }, - ] + ], (net_asset - net_liability + net_equity) def get_chart_data(filters, columns, asset, liability, equity): diff --git a/erpnext/accounts/report/profit_and_loss_statement/profit_and_loss_statement.py b/erpnext/accounts/report/profit_and_loss_statement/profit_and_loss_statement.py index 0b7ce518918..12a855457ed 100644 --- a/erpnext/accounts/report/profit_and_loss_statement/profit_and_loss_statement.py +++ b/erpnext/accounts/report/profit_and_loss_statement/profit_and_loss_statement.py @@ -66,11 +66,11 @@ def execute(filters=None): currency = filters.presentation_currency or frappe.get_cached_value( "Company", filters.company, "default_currency" ) - report_summary = get_report_summary( + report_summary, primitive_summary = get_report_summary( period_list, filters.periodicity, income, expense, net_profit_loss, currency, filters ) - return columns, data, None, chart, report_summary + return columns, data, None, chart, report_summary, primitive_summary def get_report_summary( @@ -123,7 +123,7 @@ def get_report_summary( "datatype": "Currency", "currency": currency, }, - ] + ], net_profit def get_net_profit_loss(income, expense, period_list, company, currency=None, consolidated=False): From 884a18f8f1114d2cd565cbaa1e050292aa792745 Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Fri, 15 Sep 2023 21:38:15 +0530 Subject: [PATCH 47/90] feat: bisect doctype (cherry picked from commit decdbd278200bb83baa7c5f08bd706c1c7c5406a) --- .../bisect_accounting_statements/__init__.py | 0 .../bisect_accounting_statements.js | 8 +++ .../bisect_accounting_statements.json | 54 +++++++++++++++++++ .../bisect_accounting_statements.py | 9 ++++ .../test_bisect_accounting_statements.py | 9 ++++ 5 files changed, 80 insertions(+) create mode 100644 erpnext/accounts/doctype/bisect_accounting_statements/__init__.py create mode 100644 erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.js create mode 100644 erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.json create mode 100644 erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py create mode 100644 erpnext/accounts/doctype/bisect_accounting_statements/test_bisect_accounting_statements.py diff --git a/erpnext/accounts/doctype/bisect_accounting_statements/__init__.py b/erpnext/accounts/doctype/bisect_accounting_statements/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.js b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.js new file mode 100644 index 00000000000..7e1fb48fe3c --- /dev/null +++ b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.js @@ -0,0 +1,8 @@ +// Copyright (c) 2023, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt + +// frappe.ui.form.on("Bisect Accounting Statements", { +// refresh(frm) { + +// }, +// }); diff --git a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.json b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.json new file mode 100644 index 00000000000..1ffa3adcb3d --- /dev/null +++ b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.json @@ -0,0 +1,54 @@ +{ + "actions": [], + "allow_rename": 1, + "creation": "2023-09-15 21:28:28.054773", + "default_view": "List", + "doctype": "DocType", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "from", + "column_break_qxbi", + "to" + ], + "fields": [ + { + "fieldname": "from", + "fieldtype": "Date", + "label": "From" + }, + { + "fieldname": "to", + "fieldtype": "Date", + "label": "To" + }, + { + "fieldname": "column_break_qxbi", + "fieldtype": "Column Break" + } + ], + "hide_toolbar": 1, + "index_web_pages_for_search": 1, + "issingle": 1, + "links": [], + "modified": "2023-09-15 21:36:21.516679", + "modified_by": "Administrator", + "module": "Accounts", + "name": "Bisect Accounting Statements", + "owner": "Administrator", + "permissions": [ + { + "create": 1, + "delete": 1, + "email": 1, + "print": 1, + "read": 1, + "role": "System Manager", + "share": 1, + "write": 1 + } + ], + "sort_field": "modified", + "sort_order": "DESC", + "states": [] +} \ No newline at end of file diff --git a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py new file mode 100644 index 00000000000..8ab97b47a86 --- /dev/null +++ b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py @@ -0,0 +1,9 @@ +# Copyright (c) 2023, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +# import frappe +from frappe.model.document import Document + + +class BisectAccountingStatements(Document): + pass diff --git a/erpnext/accounts/doctype/bisect_accounting_statements/test_bisect_accounting_statements.py b/erpnext/accounts/doctype/bisect_accounting_statements/test_bisect_accounting_statements.py new file mode 100644 index 00000000000..56ecc94a18e --- /dev/null +++ b/erpnext/accounts/doctype/bisect_accounting_statements/test_bisect_accounting_statements.py @@ -0,0 +1,9 @@ +# Copyright (c) 2023, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt + +# import frappe +from frappe.tests.utils import FrappeTestCase + + +class TestBisectAccountingStatements(FrappeTestCase): + pass From b6c2dbe5810bae0296f94dfd14b802085ed73a3c Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Mon, 18 Sep 2023 12:35:24 +0530 Subject: [PATCH 48/90] refactor: some logic (cherry picked from commit 4c8a8c3bcd9bf21918a78de244789c7de76cede9) --- .../bisect_accounting_statements.js | 22 +++++++-- .../bisect_accounting_statements.json | 48 ++++++++++++++----- .../bisect_accounting_statements.py | 17 ++++++- 3 files changed, 67 insertions(+), 20 deletions(-) diff --git a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.js b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.js index 7e1fb48fe3c..96b9709beed 100644 --- a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.js +++ b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.js @@ -1,8 +1,20 @@ // Copyright (c) 2023, Frappe Technologies Pvt. Ltd. and contributors // For license information, please see license.txt -// frappe.ui.form.on("Bisect Accounting Statements", { -// refresh(frm) { - -// }, -// }); +frappe.ui.form.on("Bisect Accounting Statements", { + refresh(frm) { + frm.add_custom_button(__('Bisect'), () => + frm.trigger("bisect") + ); + frm.change_custom_button_type(__('Bisect'), null, 'primary'); + }, + bisect(frm) { + frm.call({ + doc: frm.doc, + method: 'bisect', + callback: (r) => { + console.log(r); + } + }); + } +}); diff --git a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.json b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.json index 1ffa3adcb3d..de7eba7c63c 100644 --- a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.json +++ b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.json @@ -7,31 +7,53 @@ "editable_grid": 1, "engine": "InnoDB", "field_order": [ - "from", + "from_date", "column_break_qxbi", - "to" + "to_date", + "section_break_3x70", + "period_from", + "column_break_5ett", + "period_to" ], "fields": [ - { - "fieldname": "from", - "fieldtype": "Date", - "label": "From" - }, - { - "fieldname": "to", - "fieldtype": "Date", - "label": "To" - }, { "fieldname": "column_break_qxbi", "fieldtype": "Column Break" + }, + { + "fieldname": "from_date", + "fieldtype": "Date", + "label": "From Date" + }, + { + "fieldname": "to_date", + "fieldtype": "Date", + "label": "To Date" + }, + { + "fieldname": "section_break_3x70", + "fieldtype": "Section Break" + }, + { + "fieldname": "period_from", + "fieldtype": "Date", + "label": "Period From" + }, + { + "fieldname": "column_break_5ett", + "fieldtype": "Column Break" + }, + { + "fieldname": "period_to", + "fieldtype": "Date", + "label": "Period To" } ], "hide_toolbar": 1, "index_web_pages_for_search": 1, "issingle": 1, "links": [], - "modified": "2023-09-15 21:36:21.516679", + "modified": "2023-09-16 08:02:33.472406", "modified_by": "Administrator", "module": "Accounts", "name": "Bisect Accounting Statements", diff --git a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py index 8ab97b47a86..2e209d2a637 100644 --- a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py +++ b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py @@ -1,9 +1,22 @@ # Copyright (c) 2023, Frappe Technologies Pvt. Ltd. and contributors # For license information, please see license.txt -# import frappe +from math import ceil, floor + +import frappe +from dateutil.relativedelta import relativedelta from frappe.model.document import Document +from frappe.utils import getdate class BisectAccountingStatements(Document): - pass + @frappe.whitelist() + def bisect(self): + cur_frm_date, cur_to_date = getdate(self.from_date), getdate(self.to_date) + while True: + delta = cur_to_date - cur_frm_date + if delta.days == 0: + return + cur_floor = floor(delta.days / 2) + cur_to_date = cur_frm_date + relativedelta(days=+cur_floor) + print((cur_frm_date, cur_to_date), delta, cur_floor) From ce039f279bb9d9579c99620997cfc36bb74d92d0 Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Mon, 25 Sep 2023 10:35:54 +0530 Subject: [PATCH 49/90] refactor: Depth First Search(DFS) (cherry picked from commit 5a25c80f2eb434313b65b1b3b08bd0ea5e393461) --- .../bisect_accounting_statements.py | 21 ++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py index 2e209d2a637..6be28c87bc6 100644 --- a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py +++ b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py @@ -1,7 +1,7 @@ # Copyright (c) 2023, Frappe Technologies Pvt. Ltd. and contributors # For license information, please see license.txt -from math import ceil, floor +from math import floor import frappe from dateutil.relativedelta import relativedelta @@ -12,11 +12,18 @@ from frappe.utils import getdate class BisectAccountingStatements(Document): @frappe.whitelist() def bisect(self): - cur_frm_date, cur_to_date = getdate(self.from_date), getdate(self.to_date) - while True: + period_list = [(getdate(self.from_date), getdate(self.to_date))] + dates = [] + while period_list: + cur_frm_date, cur_to_date = period_list.pop() delta = cur_to_date - cur_frm_date - if delta.days == 0: - return + if not delta.days > 0: + continue + cur_floor = floor(delta.days / 2) - cur_to_date = cur_frm_date + relativedelta(days=+cur_floor) - print((cur_frm_date, cur_to_date), delta, cur_floor) + next_to_date = cur_frm_date + relativedelta(days=+cur_floor) + left = (cur_frm_date, next_to_date) + period_list.append(left) + next_frm_date = cur_frm_date + relativedelta(days=+(cur_floor + 1)) + right = (next_frm_date, cur_to_date) + period_list.append(right) From 1f235a7ba3de0f81fcc80bb2b93afa4b54ba16d9 Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Mon, 25 Sep 2023 10:39:39 +0530 Subject: [PATCH 50/90] refactor: simplify DFS (cherry picked from commit 26503a205f07a80f124c3dc5a59c039ed8ea708b) --- .../bisect_accounting_statements.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py index 6be28c87bc6..73a9e719609 100644 --- a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py +++ b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py @@ -21,9 +21,7 @@ class BisectAccountingStatements(Document): continue cur_floor = floor(delta.days / 2) - next_to_date = cur_frm_date + relativedelta(days=+cur_floor) - left = (cur_frm_date, next_to_date) + left = (cur_frm_date, (cur_frm_date + relativedelta(days=+cur_floor))) + right = ((cur_frm_date + relativedelta(days=+(cur_floor + 1))), cur_to_date) period_list.append(left) - next_frm_date = cur_frm_date + relativedelta(days=+(cur_floor + 1)) - right = (next_frm_date, cur_to_date) period_list.append(right) From ed64d691fcfbe8b165016947a35e746284fd6163 Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Mon, 25 Sep 2023 11:05:30 +0530 Subject: [PATCH 51/90] refactor: support for BFS and DFS (cherry picked from commit 03a38ed0257cdee5ae1ec645877691ed1292ba9c) --- .../bisect_accounting_statements.json | 27 ++++------ .../bisect_accounting_statements.py | 50 +++++++++++++++---- 2 files changed, 50 insertions(+), 27 deletions(-) diff --git a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.json b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.json index de7eba7c63c..b2f3c4bb90b 100644 --- a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.json +++ b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.json @@ -10,10 +10,8 @@ "from_date", "column_break_qxbi", "to_date", - "section_break_3x70", - "period_from", - "column_break_5ett", - "period_to" + "column_break_iwny", + "algorithm" ], "fields": [ { @@ -31,29 +29,22 @@ "label": "To Date" }, { - "fieldname": "section_break_3x70", - "fieldtype": "Section Break" + "default": "BFS", + "fieldname": "algorithm", + "fieldtype": "Select", + "label": "Algorithm", + "options": "BFS\nDFS" }, { - "fieldname": "period_from", - "fieldtype": "Date", - "label": "Period From" - }, - { - "fieldname": "column_break_5ett", + "fieldname": "column_break_iwny", "fieldtype": "Column Break" - }, - { - "fieldname": "period_to", - "fieldtype": "Date", - "label": "Period To" } ], "hide_toolbar": 1, "index_web_pages_for_search": 1, "issingle": 1, "links": [], - "modified": "2023-09-16 08:02:33.472406", + "modified": "2023-09-25 10:50:53.887235", "modified_by": "Administrator", "module": "Accounts", "name": "Bisect Accounting Statements", diff --git a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py index 73a9e719609..bdd18095359 100644 --- a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py +++ b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py @@ -1,6 +1,7 @@ # Copyright (c) 2023, Frappe Technologies Pvt. Ltd. and contributors # For license information, please see license.txt +from collections import deque from math import floor import frappe @@ -10,18 +11,49 @@ from frappe.utils import getdate class BisectAccountingStatements(Document): - @frappe.whitelist() - def bisect(self): - period_list = [(getdate(self.from_date), getdate(self.to_date))] + def bfs(self): + period_list = deque([(getdate(self.from_date), getdate(self.to_date))]) + periods = [] dates = [] + while period_list: + cur_frm_date, cur_to_date = period_list.popleft() + delta = cur_to_date - cur_frm_date + periods.append((cur_frm_date, cur_to_date, delta)) + if delta.days == 0: + continue + else: + cur_floor = floor(delta.days / 2) + left = (cur_frm_date, (cur_frm_date + relativedelta(days=+cur_floor))) + right = ((cur_frm_date + relativedelta(days=+(cur_floor + 1))), cur_to_date) + period_list.append(left) + period_list.append(right) + return periods + + def dfs(self): + period_list = [(getdate(self.from_date), getdate(self.to_date))] + periods = [] while period_list: cur_frm_date, cur_to_date = period_list.pop() delta = cur_to_date - cur_frm_date - if not delta.days > 0: + periods.append((cur_frm_date, cur_to_date, delta)) + if delta.days == 0: continue + else: + cur_floor = floor(delta.days / 2) + left = (cur_frm_date, (cur_frm_date + relativedelta(days=+cur_floor))) + right = ((cur_frm_date + relativedelta(days=+(cur_floor + 1))), cur_to_date) + period_list.append(left) + period_list.append(right) + return periods - cur_floor = floor(delta.days / 2) - left = (cur_frm_date, (cur_frm_date + relativedelta(days=+cur_floor))) - right = ((cur_frm_date + relativedelta(days=+(cur_floor + 1))), cur_to_date) - period_list.append(left) - period_list.append(right) + @frappe.whitelist() + def bisect(self): + if self.algorithm == "BFS": + periods = self.bfs() + + if self.algorithm == "DFS": + periods = self.dfs() + + print("Periods: ", len(periods)) + for x in periods: + print(x) From 80b77ffc876927ee45c15773cac97b790a4562db Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Mon, 25 Sep 2023 11:13:50 +0530 Subject: [PATCH 52/90] refactor: date validation (cherry picked from commit 2de3e6ce6d38cfc8b520365de79044d616fbd24b) --- .../bisect_accounting_statements.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py index bdd18095359..e032083f903 100644 --- a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py +++ b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py @@ -6,6 +6,7 @@ from math import floor import frappe from dateutil.relativedelta import relativedelta +from frappe import _ from frappe.model.document import Document from frappe.utils import getdate @@ -57,3 +58,14 @@ class BisectAccountingStatements(Document): print("Periods: ", len(periods)) for x in periods: print(x) + + def validate(self): + self.validate_dates() + + def validate_dates(self): + if getdate(self.from_date) > getdate(self.to_date): + frappe.throw( + _("From Date: {0} cannot be greater than To date: {1}").format( + frappe.bold(self.from_date), frappe.bold(self.to_date) + ) + ) From 62987372bac88788fe8e461ef6be694083955630 Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Mon, 25 Sep 2023 12:16:27 +0530 Subject: [PATCH 53/90] refactor: more buttons (cherry picked from commit a4270291511954b0e68fc126626967f4939c7617) --- .../bisect_accounting_statements.js | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.js b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.js index 96b9709beed..69bd56e73f2 100644 --- a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.js +++ b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.js @@ -3,10 +3,21 @@ frappe.ui.form.on("Bisect Accounting Statements", { refresh(frm) { + frm.add_custom_button(__('Bisect Left'), () => + frm.trigger("bisect_left") + ); + + frm.add_custom_button(__('Bisect Right'), () => + frm.trigger("bisect_right") + ); + + frm.add_custom_button(__('Up'), () => + frm.trigger("move_up") + ); frm.add_custom_button(__('Bisect'), () => frm.trigger("bisect") ); - frm.change_custom_button_type(__('Bisect'), null, 'primary'); + // frm.change_custom_button_type(__('Bisect'), null, 'primary'); }, bisect(frm) { frm.call({ From 9f859c2bd3e0ad24f67a19529599bd75cf21c242 Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Mon, 25 Sep 2023 12:16:47 +0530 Subject: [PATCH 54/90] refactor: introduce `node` class (cherry picked from commit d53b34c0ce9f469fec79b0cbc08e4cbc47344b46) --- .../bisect_accounting_statements.py | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py index e032083f903..3582033abce 100644 --- a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py +++ b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py @@ -1,6 +1,7 @@ # Copyright (c) 2023, Frappe Technologies Pvt. Ltd. and contributors # For license information, please see license.txt +import datetime from collections import deque from math import floor @@ -11,6 +12,36 @@ from frappe.model.document import Document from frappe.utils import getdate +class Node(object): + def __init__(self): + self.parent = None + self.left_child = None + self.right_child = None + + self.current_period = None + self.difference = 0.0 + self.profit_and_loss_summary = 0.0 + self.balance_sheet_summary = 0.0 + + def update_parent(self): + pass + + def update_left_child(self): + pass + + def update_right_child(self): + pass + + def make_node( + self, + parent: int = None, + period: (datetime, datetime) = None, + left: int = None, + right: int = None, + ): + current_period = period + + class BisectAccountingStatements(Document): def bfs(self): period_list = deque([(getdate(self.from_date), getdate(self.to_date))]) From 40176a6b416b70fcd271d1ea752cf67a518e75bb Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Mon, 25 Sep 2023 20:59:39 +0530 Subject: [PATCH 55/90] refactor: ability to build and load tree from DB (cherry picked from commit b2dde55f2ccf337e2b07aac8b62c24791c4975c9) --- .../bisect_accounting_statements.js | 8 +- .../bisect_accounting_statements.json | 43 +++- .../bisect_accounting_statements.py | 227 ++++++++++++------ 3 files changed, 205 insertions(+), 73 deletions(-) diff --git a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.js b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.js index 69bd56e73f2..732b2b0f9cd 100644 --- a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.js +++ b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.js @@ -14,15 +14,15 @@ frappe.ui.form.on("Bisect Accounting Statements", { frm.add_custom_button(__('Up'), () => frm.trigger("move_up") ); - frm.add_custom_button(__('Bisect'), () => - frm.trigger("bisect") + frm.add_custom_button(__('Build Tree'), () => + frm.trigger("build_tree") ); // frm.change_custom_button_type(__('Bisect'), null, 'primary'); }, - bisect(frm) { + build_tree(frm) { frm.call({ doc: frm.doc, - method: 'bisect', + method: 'build_tree', callback: (r) => { console.log(r); } diff --git a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.json b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.json index b2f3c4bb90b..e0b84adeeb5 100644 --- a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.json +++ b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.json @@ -11,7 +11,14 @@ "column_break_qxbi", "to_date", "column_break_iwny", - "algorithm" + "algorithm", + "section_break_lwr2", + "current_from_date", + "column_break_uuic", + "current_to_date", + "section_break_zbty", + "current_node", + "tree" ], "fields": [ { @@ -38,13 +45,45 @@ { "fieldname": "column_break_iwny", "fieldtype": "Column Break" + }, + { + "fieldname": "section_break_zbty", + "fieldtype": "Section Break" + }, + { + "fieldname": "tree", + "fieldtype": "JSON", + "label": "Tree" + }, + { + "fieldname": "current_node", + "fieldtype": "JSON", + "label": "Current Node" + }, + { + "fieldname": "section_break_lwr2", + "fieldtype": "Section Break" + }, + { + "fieldname": "current_from_date", + "fieldtype": "Date", + "label": "Current From Date" + }, + { + "fieldname": "current_to_date", + "fieldtype": "Date", + "label": "Current To Date" + }, + { + "fieldname": "column_break_uuic", + "fieldtype": "Column Break" } ], "hide_toolbar": 1, "index_web_pages_for_search": 1, "issingle": 1, "links": [], - "modified": "2023-09-25 10:50:53.887235", + "modified": "2023-09-25 17:05:13.384320", "modified_by": "Administrator", "module": "Accounts", "name": "Bisect Accounting Statements", diff --git a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py index 3582033abce..7c68f18775e 100644 --- a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py +++ b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py @@ -2,6 +2,7 @@ # For license information, please see license.txt import datetime +import json from collections import deque from math import floor @@ -10,85 +11,162 @@ from dateutil.relativedelta import relativedelta from frappe import _ from frappe.model.document import Document from frappe.utils import getdate +from frappe.utils.data import DATETIME_FORMAT, guess_date_format class Node(object): - def __init__(self): - self.parent = None - self.left_child = None - self.right_child = None - - self.current_period = None - self.difference = 0.0 - self.profit_and_loss_summary = 0.0 - self.balance_sheet_summary = 0.0 - - def update_parent(self): - pass - - def update_left_child(self): - pass - - def update_right_child(self): - pass - - def make_node( + def __init__( self, parent: int = None, period: (datetime, datetime) = None, left: int = None, right: int = None, ): - current_period = period + self.parent = parent + self.left_child = left + self.right_child = right + + self.period = period + self.difference = 0.0 + self.profit_and_loss_summary = 0.0 + self.balance_sheet_summary = 0.0 + + def as_dict(self): + return dict( + parent=self.parent, + left_child=self.left_child, + right_child=self.right_child, + period=(self.period[0].strftime(DATETIME_FORMAT), self.period[1].strftime(DATETIME_FORMAT)), + difference=self.difference, + profit_and_loss_summary=self.profit_and_loss_summary, + balance_sheet_summary=self.balance_sheet_summary, + ) + + def __repr__(self): + return f"Node (parent: {self.parent}, left_child: {self.left_child}, right_child: {self.right_child}, period: {self.period})" + + +class BTree(object): + def __init__(self): + self.btree = [] + self.current_node = None + + def as_list(self): + lst = [] + for x in self.btree: + lst.append(x.as_dict()) + return lst + + def bfs(self, from_date: datetime, to_date: datetime): + root_node = Node(parent=None, period=(getdate(from_date), getdate(to_date))) + root_node.parent = None + + # add root node to tree + self.btree.append(root_node) + cur_node = root_node + period_list = deque([root_node]) + + periods = [] + while period_list: + cur_node = period_list.popleft() + cur_node_index = len(self.btree) - 1 + + delta = cur_node.period[1] - cur_node.period[0] + if delta.days == 0: + continue + else: + cur_floor = floor(delta.days / 2) + left = (cur_node.period[0], (cur_node.period[0] + relativedelta(days=+cur_floor))) + left_node = Node(parent=cur_node_index, period=left) + self.btree.append(left_node) + cur_node.left_child = len(self.btree) - 1 + period_list.append(left_node) + + right = ((cur_node.period[0] + relativedelta(days=+(cur_floor + 1))), cur_node.period[1]) + right_node = Node(parent=cur_node_index, period=right) + self.btree.append(right_node) + cur_node.right_child = len(self.btree) - 1 + period_list.append(right_node) + + def dfs(self, from_date: datetime, to_date: datetime): + root_node = Node(parent=None, period=(getdate(from_date), getdate(to_date))) + root_node.parent = None + + # add root node to tree + self.btree.append(root_node) + cur_node = root_node + period_list = [root_node] + + periods = [] + while period_list: + cur_node = period_list.pop() + cur_node_index = len(self.btree) - 1 + + delta = cur_node.period[1] - cur_node.period[0] + if delta.days == 0: + continue + else: + cur_floor = floor(delta.days / 2) + left = (cur_node.period[0], (cur_node.period[0] + relativedelta(days=+cur_floor))) + left_node = Node(parent=cur_node_index, period=left) + self.btree.append(left_node) + cur_node.left_child = len(self.btree) - 1 + period_list.append(left_node) + + right = ((cur_node.period[0] + relativedelta(days=+(cur_floor + 1))), cur_node.period[1]) + right_node = Node(parent=cur_node_index, period=right) + self.btree.append(right_node) + cur_node.right_child = len(self.btree) - 1 + period_list.append(right_node) + + def load_tree(self, tree: list, current_node: dict): + self.btree = [] + tree = json.loads(tree) + for x in tree: + x = frappe._dict(x) + n = Node(x.parent, x.period, x.left_child, x.right_child) + n.period = x.period + n.difference = x.difference + x.profit_and_loss_summary = x.profit_and_loss_summary + x.balance_sheet_summary = x.balance_sheet_summary + self.btree.append(n) + + current_node = frappe._dict(json.loads(current_node)) + n = Node( + current_node.parent, current_node.period, current_node.left_child, current_node.right_child + ) + n.period = current_node.period + n.difference = current_node.difference + n.profit_and_loss_summary = current_node.profit_and_loss_summary + n.balance_sheet_summary = current_node.balance_sheet_summary + self.current_node = n + + def build_tree(self, from_date: datetime, to_date: datetime, alogrithm: str): + if alogrithm == "BFS": + self.bfs(from_date, to_date) + + if alogrithm == "DFS": + self.dfs(from_date, to_date) + + # set root as current node + self.current_node = self.btree[0] + + def bisec_left(self): + pass + + def bisect_right(self): + pass + + def move_up(self): + pass class BisectAccountingStatements(Document): - def bfs(self): - period_list = deque([(getdate(self.from_date), getdate(self.to_date))]) - periods = [] - dates = [] - while period_list: - cur_frm_date, cur_to_date = period_list.popleft() - delta = cur_to_date - cur_frm_date - periods.append((cur_frm_date, cur_to_date, delta)) - if delta.days == 0: - continue - else: - cur_floor = floor(delta.days / 2) - left = (cur_frm_date, (cur_frm_date + relativedelta(days=+cur_floor))) - right = ((cur_frm_date + relativedelta(days=+(cur_floor + 1))), cur_to_date) - period_list.append(left) - period_list.append(right) - return periods - - def dfs(self): - period_list = [(getdate(self.from_date), getdate(self.to_date))] - periods = [] - while period_list: - cur_frm_date, cur_to_date = period_list.pop() - delta = cur_to_date - cur_frm_date - periods.append((cur_frm_date, cur_to_date, delta)) - if delta.days == 0: - continue - else: - cur_floor = floor(delta.days / 2) - left = (cur_frm_date, (cur_frm_date + relativedelta(days=+cur_floor))) - right = ((cur_frm_date + relativedelta(days=+(cur_floor + 1))), cur_to_date) - period_list.append(left) - period_list.append(right) - return periods - - @frappe.whitelist() - def bisect(self): - if self.algorithm == "BFS": - periods = self.bfs() - - if self.algorithm == "DFS": - periods = self.dfs() - - print("Periods: ", len(periods)) - for x in periods: - print(x) + def __init__(self, *args, **kwargs): + super(BisectAccountingStatements, self).__init__(*args, **kwargs) + if self.tree and self.current_node: + self.tree_instance = BTree() + self.tree_instance.load_tree(self.tree, self.current_node) def validate(self): self.validate_dates() @@ -100,3 +178,18 @@ class BisectAccountingStatements(Document): frappe.bold(self.from_date), frappe.bold(self.to_date) ) ) + + @frappe.whitelist() + def build_tree(self): + self.tree_instance = BTree() + self.tree_instance.build_tree(self.from_date, self.to_date, self.algorithm) + print("printing tree") + for x in self.tree_instance.btree: + print(x) + + print("Root", self.tree_instnace.current_node) + + self.tree = json.dumps(self.tree_instance.as_list()) + self.current_node = json.dumps(self.tree_intance.btree[0].as_dict()) + + print(guess_date_format(json.loads(self.current_node)["period"][0])) From fd566f134d76c4611e317a22fd62bd5445447979 Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Mon, 25 Sep 2023 21:16:18 +0530 Subject: [PATCH 56/90] refactor: add basic navigation 1. remove unnecessary columns 2. added basic tree navigation (cherry picked from commit 705ef4f5a31aac60ac879adecbede33ffd573588) --- .../bisect_accounting_statements.js | 27 ++++++++++++ .../bisect_accounting_statements.json | 24 +---------- .../bisect_accounting_statements.py | 42 ++++++++++++++++--- 3 files changed, 65 insertions(+), 28 deletions(-) diff --git a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.js b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.js index 732b2b0f9cd..4e478ee4ab5 100644 --- a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.js +++ b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.js @@ -19,6 +19,33 @@ frappe.ui.form.on("Bisect Accounting Statements", { ); // frm.change_custom_button_type(__('Bisect'), null, 'primary'); }, + bisect_left(frm) { + frm.call({ + doc: frm.doc, + method: 'bisect_left', + callback: (r) => { + console.log(r); + } + }); + }, + bisect_right(frm) { + frm.call({ + doc: frm.doc, + method: 'bisect_right', + callback: (r) => { + console.log(r); + } + }); + }, + move_up(frm) { + frm.call({ + doc: frm.doc, + method: 'move_up', + callback: (r) => { + console.log(r); + } + }); + }, build_tree(frm) { frm.call({ doc: frm.doc, diff --git a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.json b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.json index e0b84adeeb5..c5715fe2ea7 100644 --- a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.json +++ b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.json @@ -12,10 +12,6 @@ "to_date", "column_break_iwny", "algorithm", - "section_break_lwr2", - "current_from_date", - "column_break_uuic", - "current_to_date", "section_break_zbty", "current_node", "tree" @@ -59,31 +55,13 @@ "fieldname": "current_node", "fieldtype": "JSON", "label": "Current Node" - }, - { - "fieldname": "section_break_lwr2", - "fieldtype": "Section Break" - }, - { - "fieldname": "current_from_date", - "fieldtype": "Date", - "label": "Current From Date" - }, - { - "fieldname": "current_to_date", - "fieldtype": "Date", - "label": "Current To Date" - }, - { - "fieldname": "column_break_uuic", - "fieldtype": "Column Break" } ], "hide_toolbar": 1, "index_web_pages_for_search": 1, "issingle": 1, "links": [], - "modified": "2023-09-25 17:05:13.384320", + "modified": "2023-09-25 21:15:47.905386", "modified_by": "Administrator", "module": "Accounts", "name": "Bisect Accounting Statements", diff --git a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py index 7c68f18775e..accc8a9b42b 100644 --- a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py +++ b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py @@ -124,8 +124,12 @@ class BTree(object): tree = json.loads(tree) for x in tree: x = frappe._dict(x) - n = Node(x.parent, x.period, x.left_child, x.right_child) - n.period = x.period + n = Node(x.parent, None, x.left_child, x.right_child) + date_format = guess_date_format(x.period[0]) + n.period = ( + datetime.datetime.strptime(x.period[0], date_format), + datetime.datetime.strptime(x.period[1], date_format), + ) n.difference = x.difference x.profit_and_loss_summary = x.profit_and_loss_summary x.balance_sheet_summary = x.balance_sheet_summary @@ -187,9 +191,37 @@ class BisectAccountingStatements(Document): for x in self.tree_instance.btree: print(x) - print("Root", self.tree_instnace.current_node) + print("Root", self.tree_instance.current_node) self.tree = json.dumps(self.tree_instance.as_list()) - self.current_node = json.dumps(self.tree_intance.btree[0].as_dict()) + self.current_node = json.dumps(self.tree_instance.btree[0].as_dict()) - print(guess_date_format(json.loads(self.current_node)["period"][0])) + @frappe.whitelist() + def bisect_left(self): + if self.tree_instance.current_node is not None: + if self.tree_instance.current_node.left_child is not None: + self.current_node = self.tree_instance.btree[self.tree_instance.current_node.left_child] + self.current_node = json.dumps(self.current_node.as_dict()) + self.save() + else: + frappe.msgprint("No more children on Left") + + @frappe.whitelist() + def bisect_right(self): + if self.tree_instance.current_node is not None: + if self.tree_instance.current_node.right_child is not None: + self.current_node = self.tree_instance.btree[self.tree_instance.current_node.right_child] + self.current_node = json.dumps(self.current_node.as_dict()) + self.save() + else: + frappe.msgprint("No more children on Right") + + @frappe.whitelist() + def move_up(self): + if self.tree_instance.current_node is not None: + if self.tree_instance.current_node.parent is not None: + self.current_node = self.tree_instance.btree[self.tree_instance.current_node.parent] + self.current_node = json.dumps(self.current_node.as_dict()) + self.save() + else: + frappe.msgprint("Reached Root") From 0bce5d6057150ed6255bbe81071a6b8cb047b769 Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Mon, 25 Sep 2023 22:01:07 +0530 Subject: [PATCH 57/90] chore: remove unwanted code (cherry picked from commit de2eba0d98409083c43affb485f4a44241e79b87) --- .../bisect_accounting_statements.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py index accc8a9b42b..950d5afab31 100644 --- a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py +++ b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py @@ -66,7 +66,6 @@ class BTree(object): cur_node = root_node period_list = deque([root_node]) - periods = [] while period_list: cur_node = period_list.popleft() cur_node_index = len(self.btree) - 1 @@ -97,7 +96,6 @@ class BTree(object): cur_node = root_node period_list = [root_node] - periods = [] while period_list: cur_node = period_list.pop() cur_node_index = len(self.btree) - 1 From bfccfa4af1e9698bbdfd07dadfbad73a926695b5 Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Mon, 25 Sep 2023 22:06:05 +0530 Subject: [PATCH 58/90] feat: nodes doctype (cherry picked from commit 85f2a6dd545a6e55d3c4d7fe64bea39a3122598c) --- erpnext/accounts/doctype/nodes/__init__.py | 0 erpnext/accounts/doctype/nodes/nodes.js | 8 ++ erpnext/accounts/doctype/nodes/nodes.json | 89 ++++++++++++++++++++ erpnext/accounts/doctype/nodes/nodes.py | 9 ++ erpnext/accounts/doctype/nodes/test_nodes.py | 9 ++ 5 files changed, 115 insertions(+) create mode 100644 erpnext/accounts/doctype/nodes/__init__.py create mode 100644 erpnext/accounts/doctype/nodes/nodes.js create mode 100644 erpnext/accounts/doctype/nodes/nodes.json create mode 100644 erpnext/accounts/doctype/nodes/nodes.py create mode 100644 erpnext/accounts/doctype/nodes/test_nodes.py diff --git a/erpnext/accounts/doctype/nodes/__init__.py b/erpnext/accounts/doctype/nodes/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/erpnext/accounts/doctype/nodes/nodes.js b/erpnext/accounts/doctype/nodes/nodes.js new file mode 100644 index 00000000000..bd74d68637a --- /dev/null +++ b/erpnext/accounts/doctype/nodes/nodes.js @@ -0,0 +1,8 @@ +// Copyright (c) 2023, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt + +// frappe.ui.form.on("Nodes", { +// refresh(frm) { + +// }, +// }); diff --git a/erpnext/accounts/doctype/nodes/nodes.json b/erpnext/accounts/doctype/nodes/nodes.json new file mode 100644 index 00000000000..1238c8136af --- /dev/null +++ b/erpnext/accounts/doctype/nodes/nodes.json @@ -0,0 +1,89 @@ +{ + "actions": [], + "autoname": "autoincrement", + "creation": "2023-09-25 22:01:33.961832", + "default_view": "List", + "doctype": "DocType", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "root", + "left_child", + "right_child", + "period_from_date", + "period_to_date", + "difference", + "balance_sheet_summary", + "profit_loss_summary" + ], + "fields": [ + { + "fieldname": "root", + "fieldtype": "Link", + "label": "Root", + "options": "Nodes" + }, + { + "fieldname": "left_child", + "fieldtype": "Link", + "label": "Left Child", + "options": "Nodes" + }, + { + "fieldname": "right_child", + "fieldtype": "Link", + "label": "Right Child", + "options": "Nodes" + }, + { + "fieldname": "period_from_date", + "fieldtype": "Datetime", + "label": "Period_from_date" + }, + { + "fieldname": "period_to_date", + "fieldtype": "Datetime", + "label": "Period To Date" + }, + { + "fieldname": "difference", + "fieldtype": "Float", + "label": "Difference" + }, + { + "fieldname": "balance_sheet_summary", + "fieldtype": "Float", + "label": "Balance Sheet Summary" + }, + { + "fieldname": "profit_loss_summary", + "fieldtype": "Float", + "label": "Profit and Loss Summary" + } + ], + "index_web_pages_for_search": 1, + "links": [], + "modified": "2023-09-25 22:05:49.577861", + "modified_by": "Administrator", + "module": "Accounts", + "name": "Nodes", + "naming_rule": "Autoincrement", + "owner": "Administrator", + "permissions": [ + { + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "share": 1, + "write": 1 + } + ], + "sort_field": "modified", + "sort_order": "DESC", + "states": [] +} \ No newline at end of file diff --git a/erpnext/accounts/doctype/nodes/nodes.py b/erpnext/accounts/doctype/nodes/nodes.py new file mode 100644 index 00000000000..67d5d69bfe7 --- /dev/null +++ b/erpnext/accounts/doctype/nodes/nodes.py @@ -0,0 +1,9 @@ +# Copyright (c) 2023, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +# import frappe +from frappe.model.document import Document + + +class Nodes(Document): + pass diff --git a/erpnext/accounts/doctype/nodes/test_nodes.py b/erpnext/accounts/doctype/nodes/test_nodes.py new file mode 100644 index 00000000000..feeef765e03 --- /dev/null +++ b/erpnext/accounts/doctype/nodes/test_nodes.py @@ -0,0 +1,9 @@ +# Copyright (c) 2023, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt + +# import frappe +from frappe.tests.utils import FrappeTestCase + + +class TestNodes(FrappeTestCase): + pass From a14eceb41a639bd6da3201b34602e0afeac0a417 Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Tue, 26 Sep 2023 08:43:59 +0530 Subject: [PATCH 59/90] chore: use doctype as btree (cherry picked from commit 9d2025636689cf0c6f44f9784537d9eb132b820c) --- .../bisect_accounting_statements.py | 51 +++++++++++++------ 1 file changed, 35 insertions(+), 16 deletions(-) diff --git a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py index 950d5afab31..53319b3c58c 100644 --- a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py +++ b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py @@ -58,33 +58,51 @@ class BTree(object): return lst def bfs(self, from_date: datetime, to_date: datetime): - root_node = Node(parent=None, period=(getdate(from_date), getdate(to_date))) - root_node.parent = None + node = frappe.new_doc("Nodes") + node.period_from_date = from_date + node.period_to_date = to_date + node.root = None + node.insert() - # add root node to tree - self.btree.append(root_node) - cur_node = root_node - period_list = deque([root_node]) + period_list = deque([node]) while period_list: cur_node = period_list.popleft() - cur_node_index = len(self.btree) - 1 - delta = cur_node.period[1] - cur_node.period[0] + print(cur_node.as_dict()) + delta = cur_node.period_to_date - cur_node.period_from_date if delta.days == 0: continue else: cur_floor = floor(delta.days / 2) - left = (cur_node.period[0], (cur_node.period[0] + relativedelta(days=+cur_floor))) - left_node = Node(parent=cur_node_index, period=left) - self.btree.append(left_node) - cur_node.left_child = len(self.btree) - 1 + left = ( + cur_node.period_from_date, + (cur_node.period_from_date + relativedelta(days=+cur_floor)), + ) + left_node = frappe.get_doc( + { + "doctype": "Nodes", + "period_from_date": cur_node.period_from_date, + "period_to_date": left, + "root": cur_node.name, + } + ).insert() + cur_node.left_child = left_node.name period_list.append(left_node) - right = ((cur_node.period[0] + relativedelta(days=+(cur_floor + 1))), cur_node.period[1]) - right_node = Node(parent=cur_node_index, period=right) - self.btree.append(right_node) - cur_node.right_child = len(self.btree) - 1 + right = ( + (cur_node.period_from_date + relativedelta(days=+(cur_floor + 1))), + cur_node.period_to_date, + ) + right_node = frappe.get_doc( + { + "doctype": "Nodes", + "period_from_date": right, + "period_to_date": cur_node.period_to_date, + "root": cur_node.name, + } + ).insert() + cur_node.right_child = right_node period_list.append(right_node) def dfs(self, from_date: datetime, to_date: datetime): @@ -144,6 +162,7 @@ class BTree(object): self.current_node = n def build_tree(self, from_date: datetime, to_date: datetime, alogrithm: str): + frappe.db.delete("Nodes") if alogrithm == "BFS": self.bfs(from_date, to_date) From 59ce9ccc8e71f9aa3ef048a38165a1dda5c92490 Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Tue, 26 Sep 2023 12:28:38 +0530 Subject: [PATCH 60/90] refactor: use DB to store tree and state (cherry picked from commit 99fbd8ad186c989faa86863d5902a3b4d2015505) --- .../bisect_accounting_statements.json | 19 +- .../bisect_accounting_statements.py | 304 +++++++----------- 2 files changed, 115 insertions(+), 208 deletions(-) diff --git a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.json b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.json index c5715fe2ea7..0de820a80f1 100644 --- a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.json +++ b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.json @@ -13,8 +13,7 @@ "column_break_iwny", "algorithm", "section_break_zbty", - "current_node", - "tree" + "current_node" ], "fields": [ { @@ -23,12 +22,12 @@ }, { "fieldname": "from_date", - "fieldtype": "Date", + "fieldtype": "Datetime", "label": "From Date" }, { "fieldname": "to_date", - "fieldtype": "Date", + "fieldtype": "Datetime", "label": "To Date" }, { @@ -46,22 +45,18 @@ "fieldname": "section_break_zbty", "fieldtype": "Section Break" }, - { - "fieldname": "tree", - "fieldtype": "JSON", - "label": "Tree" - }, { "fieldname": "current_node", - "fieldtype": "JSON", - "label": "Current Node" + "fieldtype": "Link", + "label": "Current Node", + "options": "Nodes" } ], "hide_toolbar": 1, "index_web_pages_for_search": 1, "issingle": 1, "links": [], - "modified": "2023-09-25 21:15:47.905386", + "modified": "2023-09-26 12:09:23.649156", "modified_by": "Administrator", "module": "Accounts", "name": "Bisect Accounting Statements", diff --git a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py index 53319b3c58c..8730772e29d 100644 --- a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py +++ b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py @@ -2,7 +2,6 @@ # For license information, please see license.txt import datetime -import json from collections import deque from math import floor @@ -11,184 +10,10 @@ from dateutil.relativedelta import relativedelta from frappe import _ from frappe.model.document import Document from frappe.utils import getdate -from frappe.utils.data import DATETIME_FORMAT, guess_date_format - - -class Node(object): - def __init__( - self, - parent: int = None, - period: (datetime, datetime) = None, - left: int = None, - right: int = None, - ): - self.parent = parent - self.left_child = left - self.right_child = right - - self.period = period - self.difference = 0.0 - self.profit_and_loss_summary = 0.0 - self.balance_sheet_summary = 0.0 - - def as_dict(self): - return dict( - parent=self.parent, - left_child=self.left_child, - right_child=self.right_child, - period=(self.period[0].strftime(DATETIME_FORMAT), self.period[1].strftime(DATETIME_FORMAT)), - difference=self.difference, - profit_and_loss_summary=self.profit_and_loss_summary, - balance_sheet_summary=self.balance_sheet_summary, - ) - - def __repr__(self): - return f"Node (parent: {self.parent}, left_child: {self.left_child}, right_child: {self.right_child}, period: {self.period})" - - -class BTree(object): - def __init__(self): - self.btree = [] - self.current_node = None - - def as_list(self): - lst = [] - for x in self.btree: - lst.append(x.as_dict()) - return lst - - def bfs(self, from_date: datetime, to_date: datetime): - node = frappe.new_doc("Nodes") - node.period_from_date = from_date - node.period_to_date = to_date - node.root = None - node.insert() - - period_list = deque([node]) - - while period_list: - cur_node = period_list.popleft() - - print(cur_node.as_dict()) - delta = cur_node.period_to_date - cur_node.period_from_date - if delta.days == 0: - continue - else: - cur_floor = floor(delta.days / 2) - left = ( - cur_node.period_from_date, - (cur_node.period_from_date + relativedelta(days=+cur_floor)), - ) - left_node = frappe.get_doc( - { - "doctype": "Nodes", - "period_from_date": cur_node.period_from_date, - "period_to_date": left, - "root": cur_node.name, - } - ).insert() - cur_node.left_child = left_node.name - period_list.append(left_node) - - right = ( - (cur_node.period_from_date + relativedelta(days=+(cur_floor + 1))), - cur_node.period_to_date, - ) - right_node = frappe.get_doc( - { - "doctype": "Nodes", - "period_from_date": right, - "period_to_date": cur_node.period_to_date, - "root": cur_node.name, - } - ).insert() - cur_node.right_child = right_node - period_list.append(right_node) - - def dfs(self, from_date: datetime, to_date: datetime): - root_node = Node(parent=None, period=(getdate(from_date), getdate(to_date))) - root_node.parent = None - - # add root node to tree - self.btree.append(root_node) - cur_node = root_node - period_list = [root_node] - - while period_list: - cur_node = period_list.pop() - cur_node_index = len(self.btree) - 1 - - delta = cur_node.period[1] - cur_node.period[0] - if delta.days == 0: - continue - else: - cur_floor = floor(delta.days / 2) - left = (cur_node.period[0], (cur_node.period[0] + relativedelta(days=+cur_floor))) - left_node = Node(parent=cur_node_index, period=left) - self.btree.append(left_node) - cur_node.left_child = len(self.btree) - 1 - period_list.append(left_node) - - right = ((cur_node.period[0] + relativedelta(days=+(cur_floor + 1))), cur_node.period[1]) - right_node = Node(parent=cur_node_index, period=right) - self.btree.append(right_node) - cur_node.right_child = len(self.btree) - 1 - period_list.append(right_node) - - def load_tree(self, tree: list, current_node: dict): - self.btree = [] - tree = json.loads(tree) - for x in tree: - x = frappe._dict(x) - n = Node(x.parent, None, x.left_child, x.right_child) - date_format = guess_date_format(x.period[0]) - n.period = ( - datetime.datetime.strptime(x.period[0], date_format), - datetime.datetime.strptime(x.period[1], date_format), - ) - n.difference = x.difference - x.profit_and_loss_summary = x.profit_and_loss_summary - x.balance_sheet_summary = x.balance_sheet_summary - self.btree.append(n) - - current_node = frappe._dict(json.loads(current_node)) - n = Node( - current_node.parent, current_node.period, current_node.left_child, current_node.right_child - ) - n.period = current_node.period - n.difference = current_node.difference - n.profit_and_loss_summary = current_node.profit_and_loss_summary - n.balance_sheet_summary = current_node.balance_sheet_summary - self.current_node = n - - def build_tree(self, from_date: datetime, to_date: datetime, alogrithm: str): - frappe.db.delete("Nodes") - if alogrithm == "BFS": - self.bfs(from_date, to_date) - - if alogrithm == "DFS": - self.dfs(from_date, to_date) - - # set root as current node - self.current_node = self.btree[0] - - def bisec_left(self): - pass - - def bisect_right(self): - pass - - def move_up(self): - pass +from frappe.utils.data import guess_date_format class BisectAccountingStatements(Document): - def __init__(self, *args, **kwargs): - super(BisectAccountingStatements, self).__init__(*args, **kwargs) - if self.tree and self.current_node: - self.tree_instance = BTree() - self.tree_instance.load_tree(self.tree, self.current_node) - def validate(self): self.validate_dates() @@ -200,45 +25,132 @@ class BisectAccountingStatements(Document): ) ) + def bfs(self, from_date: datetime, to_date: datetime): + # Make Root node + node = frappe.new_doc("Nodes") + node.root = None + node.period_from_date = from_date + node.period_to_date = to_date + node.insert() + + period_queue = deque([node]) + while period_queue: + cur_node = period_queue.popleft() + delta = cur_node.period_to_date - cur_node.period_from_date + if delta.days == 0: + continue + else: + cur_floor = floor(delta.days / 2) + next_to_date = cur_node.period_from_date + relativedelta(days=+cur_floor) + left_node = frappe.new_doc("Nodes") + left_node.period_from_date = cur_node.period_from_date + left_node.period_to_date = next_to_date + left_node.root = cur_node.name + left_node.insert() + cur_node.left_child = left_node.name + period_queue.append(left_node) + + next_from_date = cur_node.period_from_date + relativedelta(days=+(cur_floor + 1)) + right_node = frappe.new_doc("Nodes") + right_node.period_from_date = next_from_date + right_node.period_to_date = cur_node.period_to_date + right_node.root = cur_node.name + right_node.insert() + cur_node.right_child = right_node.name + period_queue.append(right_node) + + cur_node.save() + + def dfs(self, from_date: datetime, to_date: datetime): + # Make Root node + node = frappe.new_doc("Nodes") + node.root = None + node.period_from_date = from_date + node.period_to_date = to_date + node.insert() + + period_stack = [node] + while period_stack: + cur_node = period_stack.pop() + delta = cur_node.period_to_date - cur_node.period_from_date + if delta.days == 0: + continue + else: + cur_floor = floor(delta.days / 2) + next_to_date = cur_node.period_from_date + relativedelta(days=+cur_floor) + left_node = frappe.new_doc("Nodes") + left_node.period_from_date = cur_node.period_from_date + left_node.period_to_date = next_to_date + left_node.root = cur_node.name + left_node.insert() + cur_node.left_child = left_node.name + period_stack.append(left_node) + + next_from_date = cur_node.period_from_date + relativedelta(days=+(cur_floor + 1)) + right_node = frappe.new_doc("Nodes") + right_node.period_from_date = next_from_date + right_node.period_to_date = cur_node.period_to_date + right_node.root = cur_node.name + right_node.insert() + cur_node.right_child = right_node.name + period_stack.append(right_node) + + cur_node.save() + @frappe.whitelist() def build_tree(self): - self.tree_instance = BTree() - self.tree_instance.build_tree(self.from_date, self.to_date, self.algorithm) - print("printing tree") - for x in self.tree_instance.btree: - print(x) + frappe.db.delete("Nodes") - print("Root", self.tree_instance.current_node) + # Convert str to datetime format + dt_format = guess_date_format(self.from_date) + from_date = datetime.datetime.strptime(self.from_date, dt_format) + to_date = datetime.datetime.strptime(self.to_date, dt_format) - self.tree = json.dumps(self.tree_instance.as_list()) - self.current_node = json.dumps(self.tree_instance.btree[0].as_dict()) + if self.algorithm == "BFS": + self.bfs(from_date, to_date) + + if self.algorithm == "DFS": + self.dfs(from_date, to_date) + + # set root as current node + root = frappe.db.get_all("Nodes", filters={"root": ["is", "not set"]})[0] + frappe.db.set_single_value("Bisect Accounting Statements", "current_node", root.name) @frappe.whitelist() def bisect_left(self): - if self.tree_instance.current_node is not None: - if self.tree_instance.current_node.left_child is not None: - self.current_node = self.tree_instance.btree[self.tree_instance.current_node.left_child] - self.current_node = json.dumps(self.current_node.as_dict()) + if self.current_node is not None: + cur_node = frappe.get_doc("Nodes", self.current_node) + if cur_node.left_child is not None: + lft_node = frappe.get_doc("Nodes", cur_node.left_child) + self.current_node = cur_node.left_child + self.from_date = lft_node.period_from_date + self.to_date = lft_node.period_to_date self.save() else: frappe.msgprint("No more children on Left") @frappe.whitelist() def bisect_right(self): - if self.tree_instance.current_node is not None: - if self.tree_instance.current_node.right_child is not None: - self.current_node = self.tree_instance.btree[self.tree_instance.current_node.right_child] - self.current_node = json.dumps(self.current_node.as_dict()) + if self.current_node is not None: + cur_node = frappe.get_doc("Nodes", self.current_node) + if cur_node.right_child is not None: + rgt_node = frappe.get_doc("Nodes", cur_node.right_child) + self.current_node = cur_node.right_child + self.from_date = rgt_node.period_from_date + self.to_date = rgt_node.period_to_date self.save() else: frappe.msgprint("No more children on Right") @frappe.whitelist() def move_up(self): - if self.tree_instance.current_node is not None: - if self.tree_instance.current_node.parent is not None: - self.current_node = self.tree_instance.btree[self.tree_instance.current_node.parent] - self.current_node = json.dumps(self.current_node.as_dict()) + if self.current_node is not None: + cur_node = frappe.get_doc("Nodes", self.current_node) + if cur_node.root is not None: + root = frappe.get_doc("Nodes", cur_node.root) + self.current_node = cur_node.root + self.from_date = root.period_from_date + self.to_date = root.period_to_date self.save() else: frappe.msgprint("Reached Root") From a25f6493de841559f5d8bd58a157cbb7b1f83180 Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Tue, 26 Sep 2023 20:33:13 +0530 Subject: [PATCH 61/90] refactor: calculate summary on tree navigation (cherry picked from commit f7b7b2b438c3c5496097de1a740d6d4ede09605b) --- .../bisect_accounting_statements.js | 3 +- .../bisect_accounting_statements.json | 77 ++++++++++++++++++- .../bisect_accounting_statements.py | 29 +++++-- 3 files changed, 99 insertions(+), 10 deletions(-) diff --git a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.js b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.js index 4e478ee4ab5..7abe4f87aef 100644 --- a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.js +++ b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.js @@ -17,7 +17,6 @@ frappe.ui.form.on("Bisect Accounting Statements", { frm.add_custom_button(__('Build Tree'), () => frm.trigger("build_tree") ); - // frm.change_custom_button_type(__('Bisect'), null, 'primary'); }, bisect_left(frm) { frm.call({ @@ -54,5 +53,5 @@ frappe.ui.form.on("Bisect Accounting Statements", { console.log(r); } }); - } + }, }); diff --git a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.json b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.json index 0de820a80f1..c76ef4d06f3 100644 --- a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.json +++ b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.json @@ -7,13 +7,26 @@ "editable_grid": 1, "engine": "InnoDB", "field_order": [ + "company", + "column_break_hcam", "from_date", "column_break_qxbi", "to_date", "column_break_iwny", "algorithm", "section_break_zbty", - "current_node" + "current_node", + "sandbox", + "section_break_hmsy", + "current_from_date", + "column_break_uqyd", + "current_to_date", + "section_break_hbyo", + "p_l_summary", + "column_break_aivo", + "b_s_summary", + "column_break_gvwx", + "difference" ], "fields": [ { @@ -50,13 +63,73 @@ "fieldtype": "Link", "label": "Current Node", "options": "Nodes" + }, + { + "fieldname": "sandbox", + "fieldtype": "HTML", + "label": "sandbox" + }, + { + "fieldname": "section_break_hmsy", + "fieldtype": "Section Break" + }, + { + "fieldname": "current_from_date", + "fieldtype": "Datetime", + "label": "Current From Date" + }, + { + "fieldname": "current_to_date", + "fieldtype": "Datetime", + "label": "Current To Date" + }, + { + "fieldname": "column_break_uqyd", + "fieldtype": "Column Break" + }, + { + "fieldname": "section_break_hbyo", + "fieldtype": "Section Break" + }, + { + "fieldname": "p_l_summary", + "fieldtype": "Data", + "label": "P&L Summary" + }, + { + "fieldname": "b_s_summary", + "fieldtype": "Data", + "label": "Balance Sheet Summary" + }, + { + "fieldname": "difference", + "fieldtype": "Data", + "label": "Difference" + }, + { + "fieldname": "column_break_aivo", + "fieldtype": "Column Break" + }, + { + "fieldname": "column_break_gvwx", + "fieldtype": "Column Break" + }, + { + "fieldname": "company", + "fieldtype": "Link", + "label": "Company", + "options": "Company" + }, + { + "fieldname": "column_break_hcam", + "fieldtype": "Column Break" } ], "hide_toolbar": 1, "index_web_pages_for_search": 1, "issingle": 1, "links": [], - "modified": "2023-09-26 12:09:23.649156", + "modified": "2023-09-26 21:07:14.290963", "modified_by": "Administrator", "module": "Accounts", "name": "Bisect Accounting Statements", diff --git a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py index 8730772e29d..d2b60a42251 100644 --- a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py +++ b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py @@ -116,6 +116,20 @@ class BisectAccountingStatements(Document): root = frappe.db.get_all("Nodes", filters={"root": ["is", "not set"]})[0] frappe.db.set_single_value("Bisect Accounting Statements", "current_node", root.name) + def get_report_summary(self): + filters = { + "company": self.company, + "filter_based_on": "Date Range", + "period_start_date": self.current_from_date, + "period_end_date": self.current_to_date, + "periodicity": "Yearly", + } + pl_summary = frappe.get_doc("Report", "Profit and Loss Statement") + self.p_l_summary = pl_summary.execute_script_report(filters=filters)[5] + bs_summary = frappe.get_doc("Report", "Balance Sheet") + self.b_s_summary = bs_summary.execute_script_report(filters=filters)[5] + self.difference = abs(self.p_l_summary - self.b_s_summary) + @frappe.whitelist() def bisect_left(self): if self.current_node is not None: @@ -123,8 +137,9 @@ class BisectAccountingStatements(Document): if cur_node.left_child is not None: lft_node = frappe.get_doc("Nodes", cur_node.left_child) self.current_node = cur_node.left_child - self.from_date = lft_node.period_from_date - self.to_date = lft_node.period_to_date + self.current_from_date = lft_node.period_from_date + self.current_to_date = lft_node.period_to_date + self.get_report_summary() self.save() else: frappe.msgprint("No more children on Left") @@ -136,8 +151,9 @@ class BisectAccountingStatements(Document): if cur_node.right_child is not None: rgt_node = frappe.get_doc("Nodes", cur_node.right_child) self.current_node = cur_node.right_child - self.from_date = rgt_node.period_from_date - self.to_date = rgt_node.period_to_date + self.current_from_date = rgt_node.period_from_date + self.current_to_date = rgt_node.period_to_date + self.get_report_summary() self.save() else: frappe.msgprint("No more children on Right") @@ -149,8 +165,9 @@ class BisectAccountingStatements(Document): if cur_node.root is not None: root = frappe.get_doc("Nodes", cur_node.root) self.current_node = cur_node.root - self.from_date = root.period_from_date - self.to_date = root.period_to_date + self.current_from_date = root.period_from_date + self.current_to_date = root.period_to_date + self.get_report_summary() self.save() else: frappe.msgprint("Reached Root") From c678134de6cdc9060e1a9b551fbb78ced097f7ce Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Tue, 26 Sep 2023 21:29:54 +0530 Subject: [PATCH 62/90] chore: hide some internal fields (cherry picked from commit bd3dc6482e9621132a64fecc7e2f203b64812068) --- .../bisect_accounting_statements.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.json b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.json index c76ef4d06f3..d413f70c15e 100644 --- a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.json +++ b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.json @@ -61,12 +61,14 @@ { "fieldname": "current_node", "fieldtype": "Link", + "hidden": 1, "label": "Current Node", "options": "Nodes" }, { "fieldname": "sandbox", "fieldtype": "HTML", + "hidden": 1, "label": "sandbox" }, { @@ -129,7 +131,7 @@ "index_web_pages_for_search": 1, "issingle": 1, "links": [], - "modified": "2023-09-26 21:07:14.290963", + "modified": "2023-09-26 21:25:48.779453", "modified_by": "Administrator", "module": "Accounts", "name": "Bisect Accounting Statements", From f376659785c2c56e4f2c4c9582e08dc88a0813f4 Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Wed, 27 Sep 2023 09:35:25 +0530 Subject: [PATCH 63/90] refactor: working heatmap (cherry picked from commit 16db6c2f47ec7b803c765d9e04c5f50c4bd6b95f) --- .../bisect_accounting_statements.js | 58 +++++++++++++++---- .../bisect_accounting_statements.json | 30 +++++----- 2 files changed, 63 insertions(+), 25 deletions(-) diff --git a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.js b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.js index 7abe4f87aef..1c1e3cc6ca5 100644 --- a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.js +++ b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.js @@ -2,27 +2,58 @@ // For license information, please see license.txt frappe.ui.form.on("Bisect Accounting Statements", { + onload(frm) { + frm.trigger("render_heatmap"); + }, refresh(frm) { - frm.add_custom_button(__('Bisect Left'), () => - frm.trigger("bisect_left") - ); + frm.add_custom_button(__('Bisect Left'), () => { + frm.trigger("bisect_left"); + }); - frm.add_custom_button(__('Bisect Right'), () => - frm.trigger("bisect_right") - ); + frm.add_custom_button(__('Bisect Right'), () => { + frm.trigger("bisect_right"); + }); - frm.add_custom_button(__('Up'), () => - frm.trigger("move_up") - ); - frm.add_custom_button(__('Build Tree'), () => - frm.trigger("build_tree") - ); + frm.add_custom_button(__('Up'), () => { + frm.trigger("move_up"); + }); + frm.add_custom_button(__('Build Tree'), () => { + frm.trigger("build_tree"); + }); + }, + render_heatmap(frm) { + let bisect_heatmap = frm.get_field("bisect_heatmap").$wrapper; + bisect_heatmap.addClass("bisect_heatmap_location"); + + // milliseconds in a day + let msiad=24*60*60*1000; + let datapoints = {}; + let fr_dt = new Date(frm.doc.current_from_date).getTime(); + let to_dt = new Date(frm.doc.current_to_date).getTime(); + for(let x=fr_dt; x <= to_dt; x+=msiad){ + let epoch_in_seconds = x/1000; + datapoints[epoch_in_seconds] = 1; + } + console.log(datapoints); + + new frappe.Chart(".bisect_heatmap_location", { + type: "heatmap", + title: "Bisecting On", + data: { + dataPoints: datapoints, + start: new Date(frm.doc.from_date), + end: new Date(frm.doc.to_date), + }, + countLabel: 'Difference', + discreteDomains: 1 + }); }, bisect_left(frm) { frm.call({ doc: frm.doc, method: 'bisect_left', callback: (r) => { + frm.trigger("render_heatmap"); console.log(r); } }); @@ -32,6 +63,7 @@ frappe.ui.form.on("Bisect Accounting Statements", { doc: frm.doc, method: 'bisect_right', callback: (r) => { + frm.trigger("render_heatmap"); console.log(r); } }); @@ -41,6 +73,7 @@ frappe.ui.form.on("Bisect Accounting Statements", { doc: frm.doc, method: 'move_up', callback: (r) => { + frm.trigger("render_heatmap"); console.log(r); } }); @@ -50,6 +83,7 @@ frappe.ui.form.on("Bisect Accounting Statements", { doc: frm.doc, method: 'build_tree', callback: (r) => { + frm.trigger("render_heatmap"); console.log(r); } }); diff --git a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.json b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.json index d413f70c15e..9a7242fe922 100644 --- a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.json +++ b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.json @@ -14,13 +14,14 @@ "to_date", "column_break_iwny", "algorithm", - "section_break_zbty", + "section_break_8ph9", "current_node", - "sandbox", "section_break_hmsy", "current_from_date", "column_break_uqyd", "current_to_date", + "section_break_ngid", + "bisect_heatmap", "section_break_hbyo", "p_l_summary", "column_break_aivo", @@ -54,10 +55,6 @@ "fieldname": "column_break_iwny", "fieldtype": "Column Break" }, - { - "fieldname": "section_break_zbty", - "fieldtype": "Section Break" - }, { "fieldname": "current_node", "fieldtype": "Link", @@ -65,12 +62,6 @@ "label": "Current Node", "options": "Nodes" }, - { - "fieldname": "sandbox", - "fieldtype": "HTML", - "hidden": 1, - "label": "sandbox" - }, { "fieldname": "section_break_hmsy", "fieldtype": "Section Break" @@ -125,13 +116,26 @@ { "fieldname": "column_break_hcam", "fieldtype": "Column Break" + }, + { + "fieldname": "section_break_ngid", + "fieldtype": "Section Break" + }, + { + "fieldname": "section_break_8ph9", + "fieldtype": "Section Break" + }, + { + "fieldname": "bisect_heatmap", + "fieldtype": "HTML", + "label": "Heatmap" } ], "hide_toolbar": 1, "index_web_pages_for_search": 1, "issingle": 1, "links": [], - "modified": "2023-09-26 21:25:48.779453", + "modified": "2023-09-27 12:10:40.044935", "modified_by": "Administrator", "module": "Accounts", "name": "Bisect Accounting Statements", From 5674ea450de24599d3d395a6d1d63722d030bb37 Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Wed, 27 Sep 2023 14:40:57 +0530 Subject: [PATCH 64/90] chore: hide internal fields and better painting logic for heatmap (cherry picked from commit f6831fba1370e569299c63f592fcd2a09a1dbc76) --- .../bisect_accounting_statements.js | 15 ++++++++---- .../bisect_accounting_statements.json | 24 ++++++++++++------- 2 files changed, 26 insertions(+), 13 deletions(-) diff --git a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.js b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.js index 1c1e3cc6ca5..c00e49d3805 100644 --- a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.js +++ b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.js @@ -28,11 +28,18 @@ frappe.ui.form.on("Bisect Accounting Statements", { // milliseconds in a day let msiad=24*60*60*1000; let datapoints = {}; - let fr_dt = new Date(frm.doc.current_from_date).getTime(); - let to_dt = new Date(frm.doc.current_to_date).getTime(); + let fr_dt = new Date(frm.doc.from_date).getTime(); + let to_dt = new Date(frm.doc.to_date).getTime(); + let bisect_start = new Date(frm.doc.current_from_date).getTime(); + let bisect_end = new Date(frm.doc.current_to_date).getTime(); + for(let x=fr_dt; x <= to_dt; x+=msiad){ let epoch_in_seconds = x/1000; - datapoints[epoch_in_seconds] = 1; + if ((bisect_start <= x) && (x <= bisect_end )) { + datapoints[epoch_in_seconds] = 1.0; + } else { + datapoints[epoch_in_seconds] = 0.0; + } } console.log(datapoints); @@ -45,7 +52,7 @@ frappe.ui.form.on("Bisect Accounting Statements", { end: new Date(frm.doc.to_date), }, countLabel: 'Difference', - discreteDomains: 1 + discreteDomains: 1, }); }, bisect_left(frm) { diff --git a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.json b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.json index 9a7242fe922..84d021d7da5 100644 --- a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.json +++ b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.json @@ -58,23 +58,25 @@ { "fieldname": "current_node", "fieldtype": "Link", - "hidden": 1, "label": "Current Node", "options": "Nodes" }, { "fieldname": "section_break_hmsy", - "fieldtype": "Section Break" + "fieldtype": "Section Break", + "hidden": 1 }, { "fieldname": "current_from_date", "fieldtype": "Datetime", - "label": "Current From Date" + "label": "Current From Date", + "read_only": 1 }, { "fieldname": "current_to_date", "fieldtype": "Datetime", - "label": "Current To Date" + "label": "Current To Date", + "read_only": 1 }, { "fieldname": "column_break_uqyd", @@ -87,17 +89,20 @@ { "fieldname": "p_l_summary", "fieldtype": "Data", - "label": "P&L Summary" + "label": "P&L Summary", + "read_only": 1 }, { "fieldname": "b_s_summary", "fieldtype": "Data", - "label": "Balance Sheet Summary" + "label": "Balance Sheet Summary", + "read_only": 1 }, { "fieldname": "difference", "fieldtype": "Data", - "label": "Difference" + "label": "Difference", + "read_only": 1 }, { "fieldname": "column_break_aivo", @@ -123,7 +128,8 @@ }, { "fieldname": "section_break_8ph9", - "fieldtype": "Section Break" + "fieldtype": "Section Break", + "hidden": 1 }, { "fieldname": "bisect_heatmap", @@ -135,7 +141,7 @@ "index_web_pages_for_search": 1, "issingle": 1, "links": [], - "modified": "2023-09-27 12:10:40.044935", + "modified": "2023-09-27 14:32:09.962067", "modified_by": "Administrator", "module": "Accounts", "name": "Bisect Accounting Statements", From b686e1f972db2fc6e72e7c171d4e5f5b302842ae Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Wed, 27 Sep 2023 14:44:48 +0530 Subject: [PATCH 65/90] chore: rename btree and remove debugging statements (cherry picked from commit 6492019383a56669869457d3b6b8cdb2083f7df7) --- .../bisect_accounting_statements.js | 5 ---- .../bisect_accounting_statements.json | 7 ++--- .../bisect_accounting_statements.py | 28 +++++++++---------- .../{nodes => bisect_nodes}/__init__.py | 0 .../nodes.js => bisect_nodes/bisect_nodes.js} | 2 +- .../bisect_nodes.json} | 12 ++++---- .../nodes.py => bisect_nodes/bisect_nodes.py} | 2 +- .../test_bisect_nodes.py} | 2 +- 8 files changed, 26 insertions(+), 32 deletions(-) rename erpnext/accounts/doctype/{nodes => bisect_nodes}/__init__.py (100%) rename erpnext/accounts/doctype/{nodes/nodes.js => bisect_nodes/bisect_nodes.js} (80%) rename erpnext/accounts/doctype/{nodes/nodes.json => bisect_nodes/bisect_nodes.json} (88%) rename erpnext/accounts/doctype/{nodes/nodes.py => bisect_nodes/bisect_nodes.py} (86%) rename erpnext/accounts/doctype/{nodes/test_nodes.py => bisect_nodes/test_bisect_nodes.py} (80%) diff --git a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.js b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.js index c00e49d3805..e9fc330a709 100644 --- a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.js +++ b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.js @@ -41,7 +41,6 @@ frappe.ui.form.on("Bisect Accounting Statements", { datapoints[epoch_in_seconds] = 0.0; } } - console.log(datapoints); new frappe.Chart(".bisect_heatmap_location", { type: "heatmap", @@ -61,7 +60,6 @@ frappe.ui.form.on("Bisect Accounting Statements", { method: 'bisect_left', callback: (r) => { frm.trigger("render_heatmap"); - console.log(r); } }); }, @@ -71,7 +69,6 @@ frappe.ui.form.on("Bisect Accounting Statements", { method: 'bisect_right', callback: (r) => { frm.trigger("render_heatmap"); - console.log(r); } }); }, @@ -81,7 +78,6 @@ frappe.ui.form.on("Bisect Accounting Statements", { method: 'move_up', callback: (r) => { frm.trigger("render_heatmap"); - console.log(r); } }); }, @@ -91,7 +87,6 @@ frappe.ui.form.on("Bisect Accounting Statements", { method: 'build_tree', callback: (r) => { frm.trigger("render_heatmap"); - console.log(r); } }); }, diff --git a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.json b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.json index 84d021d7da5..f62d39377e5 100644 --- a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.json +++ b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.json @@ -59,7 +59,7 @@ "fieldname": "current_node", "fieldtype": "Link", "label": "Current Node", - "options": "Nodes" + "options": "Bisect Nodes" }, { "fieldname": "section_break_hmsy", @@ -128,8 +128,7 @@ }, { "fieldname": "section_break_8ph9", - "fieldtype": "Section Break", - "hidden": 1 + "fieldtype": "Section Break" }, { "fieldname": "bisect_heatmap", @@ -141,7 +140,7 @@ "index_web_pages_for_search": 1, "issingle": 1, "links": [], - "modified": "2023-09-27 14:32:09.962067", + "modified": "2023-09-27 15:05:44.285832", "modified_by": "Administrator", "module": "Accounts", "name": "Bisect Accounting Statements", diff --git a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py index d2b60a42251..58b87486287 100644 --- a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py +++ b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py @@ -27,7 +27,7 @@ class BisectAccountingStatements(Document): def bfs(self, from_date: datetime, to_date: datetime): # Make Root node - node = frappe.new_doc("Nodes") + node = frappe.new_doc("Bisect Nodes") node.root = None node.period_from_date = from_date node.period_to_date = to_date @@ -42,7 +42,7 @@ class BisectAccountingStatements(Document): else: cur_floor = floor(delta.days / 2) next_to_date = cur_node.period_from_date + relativedelta(days=+cur_floor) - left_node = frappe.new_doc("Nodes") + left_node = frappe.new_doc("Bisect Nodes") left_node.period_from_date = cur_node.period_from_date left_node.period_to_date = next_to_date left_node.root = cur_node.name @@ -51,7 +51,7 @@ class BisectAccountingStatements(Document): period_queue.append(left_node) next_from_date = cur_node.period_from_date + relativedelta(days=+(cur_floor + 1)) - right_node = frappe.new_doc("Nodes") + right_node = frappe.new_doc("Bisect Nodes") right_node.period_from_date = next_from_date right_node.period_to_date = cur_node.period_to_date right_node.root = cur_node.name @@ -63,7 +63,7 @@ class BisectAccountingStatements(Document): def dfs(self, from_date: datetime, to_date: datetime): # Make Root node - node = frappe.new_doc("Nodes") + node = frappe.new_doc("Bisect Nodes") node.root = None node.period_from_date = from_date node.period_to_date = to_date @@ -78,7 +78,7 @@ class BisectAccountingStatements(Document): else: cur_floor = floor(delta.days / 2) next_to_date = cur_node.period_from_date + relativedelta(days=+cur_floor) - left_node = frappe.new_doc("Nodes") + left_node = frappe.new_doc("Bisect Nodes") left_node.period_from_date = cur_node.period_from_date left_node.period_to_date = next_to_date left_node.root = cur_node.name @@ -87,7 +87,7 @@ class BisectAccountingStatements(Document): period_stack.append(left_node) next_from_date = cur_node.period_from_date + relativedelta(days=+(cur_floor + 1)) - right_node = frappe.new_doc("Nodes") + right_node = frappe.new_doc("Bisect Nodes") right_node.period_from_date = next_from_date right_node.period_to_date = cur_node.period_to_date right_node.root = cur_node.name @@ -99,7 +99,7 @@ class BisectAccountingStatements(Document): @frappe.whitelist() def build_tree(self): - frappe.db.delete("Nodes") + frappe.db.delete("Bisect Nodes") # Convert str to datetime format dt_format = guess_date_format(self.from_date) @@ -113,7 +113,7 @@ class BisectAccountingStatements(Document): self.dfs(from_date, to_date) # set root as current node - root = frappe.db.get_all("Nodes", filters={"root": ["is", "not set"]})[0] + root = frappe.db.get_all("Bisect Nodes", filters={"root": ["is", "not set"]})[0] frappe.db.set_single_value("Bisect Accounting Statements", "current_node", root.name) def get_report_summary(self): @@ -133,9 +133,9 @@ class BisectAccountingStatements(Document): @frappe.whitelist() def bisect_left(self): if self.current_node is not None: - cur_node = frappe.get_doc("Nodes", self.current_node) + cur_node = frappe.get_doc("Bisect Nodes", self.current_node) if cur_node.left_child is not None: - lft_node = frappe.get_doc("Nodes", cur_node.left_child) + lft_node = frappe.get_doc("Bisect Nodes", cur_node.left_child) self.current_node = cur_node.left_child self.current_from_date = lft_node.period_from_date self.current_to_date = lft_node.period_to_date @@ -147,9 +147,9 @@ class BisectAccountingStatements(Document): @frappe.whitelist() def bisect_right(self): if self.current_node is not None: - cur_node = frappe.get_doc("Nodes", self.current_node) + cur_node = frappe.get_doc("Bisect Nodes", self.current_node) if cur_node.right_child is not None: - rgt_node = frappe.get_doc("Nodes", cur_node.right_child) + rgt_node = frappe.get_doc("Bisect Nodes", cur_node.right_child) self.current_node = cur_node.right_child self.current_from_date = rgt_node.period_from_date self.current_to_date = rgt_node.period_to_date @@ -161,9 +161,9 @@ class BisectAccountingStatements(Document): @frappe.whitelist() def move_up(self): if self.current_node is not None: - cur_node = frappe.get_doc("Nodes", self.current_node) + cur_node = frappe.get_doc("Bisect Nodes", self.current_node) if cur_node.root is not None: - root = frappe.get_doc("Nodes", cur_node.root) + root = frappe.get_doc("Bisect Nodes", cur_node.root) self.current_node = cur_node.root self.current_from_date = root.period_from_date self.current_to_date = root.period_to_date diff --git a/erpnext/accounts/doctype/nodes/__init__.py b/erpnext/accounts/doctype/bisect_nodes/__init__.py similarity index 100% rename from erpnext/accounts/doctype/nodes/__init__.py rename to erpnext/accounts/doctype/bisect_nodes/__init__.py diff --git a/erpnext/accounts/doctype/nodes/nodes.js b/erpnext/accounts/doctype/bisect_nodes/bisect_nodes.js similarity index 80% rename from erpnext/accounts/doctype/nodes/nodes.js rename to erpnext/accounts/doctype/bisect_nodes/bisect_nodes.js index bd74d68637a..6dea25fc924 100644 --- a/erpnext/accounts/doctype/nodes/nodes.js +++ b/erpnext/accounts/doctype/bisect_nodes/bisect_nodes.js @@ -1,7 +1,7 @@ // Copyright (c) 2023, Frappe Technologies Pvt. Ltd. and contributors // For license information, please see license.txt -// frappe.ui.form.on("Nodes", { +// frappe.ui.form.on("Bisect Nodes", { // refresh(frm) { // }, diff --git a/erpnext/accounts/doctype/nodes/nodes.json b/erpnext/accounts/doctype/bisect_nodes/bisect_nodes.json similarity index 88% rename from erpnext/accounts/doctype/nodes/nodes.json rename to erpnext/accounts/doctype/bisect_nodes/bisect_nodes.json index 1238c8136af..db417047950 100644 --- a/erpnext/accounts/doctype/nodes/nodes.json +++ b/erpnext/accounts/doctype/bisect_nodes/bisect_nodes.json @@ -1,7 +1,7 @@ { "actions": [], "autoname": "autoincrement", - "creation": "2023-09-25 22:01:33.961832", + "creation": "2023-09-27 14:56:38.112462", "default_view": "List", "doctype": "DocType", "editable_grid": 1, @@ -21,19 +21,19 @@ "fieldname": "root", "fieldtype": "Link", "label": "Root", - "options": "Nodes" + "options": "Bisect Nodes" }, { "fieldname": "left_child", "fieldtype": "Link", "label": "Left Child", - "options": "Nodes" + "options": "Bisect Nodes" }, { "fieldname": "right_child", "fieldtype": "Link", "label": "Right Child", - "options": "Nodes" + "options": "Bisect Nodes" }, { "fieldname": "period_from_date", @@ -63,10 +63,10 @@ ], "index_web_pages_for_search": 1, "links": [], - "modified": "2023-09-25 22:05:49.577861", + "modified": "2023-09-27 15:09:27.715523", "modified_by": "Administrator", "module": "Accounts", - "name": "Nodes", + "name": "Bisect Nodes", "naming_rule": "Autoincrement", "owner": "Administrator", "permissions": [ diff --git a/erpnext/accounts/doctype/nodes/nodes.py b/erpnext/accounts/doctype/bisect_nodes/bisect_nodes.py similarity index 86% rename from erpnext/accounts/doctype/nodes/nodes.py rename to erpnext/accounts/doctype/bisect_nodes/bisect_nodes.py index 67d5d69bfe7..0d176f974a8 100644 --- a/erpnext/accounts/doctype/nodes/nodes.py +++ b/erpnext/accounts/doctype/bisect_nodes/bisect_nodes.py @@ -5,5 +5,5 @@ from frappe.model.document import Document -class Nodes(Document): +class BisectNodes(Document): pass diff --git a/erpnext/accounts/doctype/nodes/test_nodes.py b/erpnext/accounts/doctype/bisect_nodes/test_bisect_nodes.py similarity index 80% rename from erpnext/accounts/doctype/nodes/test_nodes.py rename to erpnext/accounts/doctype/bisect_nodes/test_bisect_nodes.py index feeef765e03..5399df139f1 100644 --- a/erpnext/accounts/doctype/nodes/test_nodes.py +++ b/erpnext/accounts/doctype/bisect_nodes/test_bisect_nodes.py @@ -5,5 +5,5 @@ from frappe.tests.utils import FrappeTestCase -class TestNodes(FrappeTestCase): +class TestBisectNodes(FrappeTestCase): pass From 1a08482655419f8daacdc56b33c8c7aba983397b Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Wed, 27 Sep 2023 15:10:42 +0530 Subject: [PATCH 66/90] chore: hide internal variables section (cherry picked from commit c4c3090f46af16f52b34dab116b49856b9da2025) --- .../bisect_accounting_statements.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.json b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.json index f62d39377e5..4ad03528c51 100644 --- a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.json +++ b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.json @@ -128,7 +128,8 @@ }, { "fieldname": "section_break_8ph9", - "fieldtype": "Section Break" + "fieldtype": "Section Break", + "hidden": 1 }, { "fieldname": "bisect_heatmap", @@ -140,7 +141,7 @@ "index_web_pages_for_search": 1, "issingle": 1, "links": [], - "modified": "2023-09-27 15:05:44.285832", + "modified": "2023-09-27 15:10:36.394474", "modified_by": "Administrator", "module": "Accounts", "name": "Bisect Accounting Statements", From 348359ad5a4094b7bada94a1b69a701ee4352ae3 Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Wed, 27 Sep 2023 15:27:27 +0530 Subject: [PATCH 67/90] chore: code cleanup (cherry picked from commit 5e2d21c033fdf6147ec58286d08cac75d6fedf23) --- .../bisect_accounting_statements.js | 2 +- .../bisect_accounting_statements.py | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.js b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.js index e9fc330a709..486630e1624 100644 --- a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.js +++ b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.js @@ -50,7 +50,7 @@ frappe.ui.form.on("Bisect Accounting Statements", { start: new Date(frm.doc.from_date), end: new Date(frm.doc.to_date), }, - countLabel: 'Difference', + countLabel: 'Bisecting', discreteDomains: 1, }); }, diff --git a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py index 58b87486287..0a1de6414fe 100644 --- a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py +++ b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py @@ -114,7 +114,11 @@ class BisectAccountingStatements(Document): # set root as current node root = frappe.db.get_all("Bisect Nodes", filters={"root": ["is", "not set"]})[0] - frappe.db.set_single_value("Bisect Accounting Statements", "current_node", root.name) + self.get_report_summary() + self.current_node = root.name + self.current_from_date = self.from_date + self.current_to_date = self.to_date + self.save() def get_report_summary(self): filters = { From 6ff311c4e975b76a07eeff6b226c5fe9b51e323e Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Wed, 27 Sep 2023 15:41:53 +0530 Subject: [PATCH 68/90] chore: add screen freeze on wait (cherry picked from commit 395299803f3d5818fa0e17bac95f515fe06b2a09) --- .../bisect_accounting_statements.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.js b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.js index 486630e1624..519246b9bb4 100644 --- a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.js +++ b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.js @@ -58,6 +58,8 @@ frappe.ui.form.on("Bisect Accounting Statements", { frm.call({ doc: frm.doc, method: 'bisect_left', + freeze: true, + freeze_message: __("Bisecting Left ..."), callback: (r) => { frm.trigger("render_heatmap"); } @@ -66,6 +68,8 @@ frappe.ui.form.on("Bisect Accounting Statements", { bisect_right(frm) { frm.call({ doc: frm.doc, + freeze: true, + freeze_message: __("Bisecting Right ..."), method: 'bisect_right', callback: (r) => { frm.trigger("render_heatmap"); @@ -75,6 +79,8 @@ frappe.ui.form.on("Bisect Accounting Statements", { move_up(frm) { frm.call({ doc: frm.doc, + freeze: true, + freeze_message: __("Moving up in tree ..."), method: 'move_up', callback: (r) => { frm.trigger("render_heatmap"); @@ -84,6 +90,8 @@ frappe.ui.form.on("Bisect Accounting Statements", { build_tree(frm) { frm.call({ doc: frm.doc, + freeze: true, + freeze_message: __("Rebuilding BTree for period ..."), method: 'build_tree', callback: (r) => { frm.trigger("render_heatmap"); From 509d6e3ca947be20ef0dfd8066b7a7c5441a4274 Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Wed, 27 Sep 2023 15:53:19 +0530 Subject: [PATCH 69/90] chore: UI cleanup (cherry picked from commit ea3071db6643f7802611e7a0ae8857d75583dd96) --- .../bisect_accounting_statements.json | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.json b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.json index 4ad03528c51..a9fa7f0695b 100644 --- a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.json +++ b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.json @@ -16,12 +16,12 @@ "algorithm", "section_break_8ph9", "current_node", + "section_break_ngid", + "bisect_heatmap", "section_break_hmsy", "current_from_date", "column_break_uqyd", "current_to_date", - "section_break_ngid", - "bisect_heatmap", "section_break_hbyo", "p_l_summary", "column_break_aivo", @@ -63,19 +63,18 @@ }, { "fieldname": "section_break_hmsy", - "fieldtype": "Section Break", - "hidden": 1 + "fieldtype": "Section Break" }, { "fieldname": "current_from_date", "fieldtype": "Datetime", - "label": "Current From Date", + "label": "Bisecting From", "read_only": 1 }, { "fieldname": "current_to_date", "fieldtype": "Datetime", - "label": "Current To Date", + "label": "Bisecting To", "read_only": 1 }, { @@ -141,7 +140,7 @@ "index_web_pages_for_search": 1, "issingle": 1, "links": [], - "modified": "2023-09-27 15:10:36.394474", + "modified": "2023-09-27 15:52:14.083727", "modified_by": "Administrator", "module": "Accounts", "name": "Bisect Accounting Statements", From 415be361b4531dde577d23ca5e8dc952c83070a1 Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Wed, 27 Sep 2023 16:05:14 +0530 Subject: [PATCH 70/90] refactor: adding labels to important section (cherry picked from commit 993e2bfbf9f75958d5283fcbbcaa5e6f80e88f86) --- .../bisect_accounting_statements.js | 1 - .../bisect_accounting_statements.json | 37 ++++++++++++++++--- 2 files changed, 31 insertions(+), 7 deletions(-) diff --git a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.js b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.js index 519246b9bb4..ece0fb33e54 100644 --- a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.js +++ b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.js @@ -44,7 +44,6 @@ frappe.ui.form.on("Bisect Accounting Statements", { new frappe.Chart(".bisect_heatmap_location", { type: "heatmap", - title: "Bisecting On", data: { dataPoints: datapoints, start: new Date(frm.doc.from_date), diff --git a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.json b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.json index a9fa7f0695b..b66c17b6489 100644 --- a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.json +++ b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.json @@ -19,14 +19,19 @@ "section_break_ngid", "bisect_heatmap", "section_break_hmsy", + "bisecting_from", "current_from_date", "column_break_uqyd", + "bisecting_to", "current_to_date", "section_break_hbyo", + "heading_cppb", "p_l_summary", "column_break_aivo", + "balance_sheet_summary", "b_s_summary", "column_break_gvwx", + "difference_heading", "difference" ], "fields": [ @@ -68,13 +73,11 @@ { "fieldname": "current_from_date", "fieldtype": "Datetime", - "label": "Bisecting From", "read_only": 1 }, { "fieldname": "current_to_date", "fieldtype": "Datetime", - "label": "Bisecting To", "read_only": 1 }, { @@ -88,19 +91,16 @@ { "fieldname": "p_l_summary", "fieldtype": "Data", - "label": "P&L Summary", "read_only": 1 }, { "fieldname": "b_s_summary", "fieldtype": "Data", - "label": "Balance Sheet Summary", "read_only": 1 }, { "fieldname": "difference", "fieldtype": "Data", - "label": "Difference", "read_only": 1 }, { @@ -134,13 +134,38 @@ "fieldname": "bisect_heatmap", "fieldtype": "HTML", "label": "Heatmap" + }, + { + "fieldname": "heading_cppb", + "fieldtype": "Heading", + "label": "Profit and Loss Summary" + }, + { + "fieldname": "balance_sheet_summary", + "fieldtype": "Heading", + "label": "Balance Sheet Summary" + }, + { + "fieldname": "difference_heading", + "fieldtype": "Heading", + "label": "Difference" + }, + { + "fieldname": "bisecting_from", + "fieldtype": "Heading", + "label": "Bisecting From" + }, + { + "fieldname": "bisecting_to", + "fieldtype": "Heading", + "label": "Bisecting To" } ], "hide_toolbar": 1, "index_web_pages_for_search": 1, "issingle": 1, "links": [], - "modified": "2023-09-27 15:52:14.083727", + "modified": "2023-09-27 16:08:18.155873", "modified_by": "Administrator", "module": "Accounts", "name": "Bisect Accounting Statements", From 6b1b2e863a0813b38b866a5eedf581d6d0ce82c2 Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Wed, 27 Sep 2023 16:22:20 +0530 Subject: [PATCH 71/90] chore: change data type for summary fields (cherry picked from commit 228aa1a244632505bb466f1252c14ce5950b1ef7) --- .../bisect_accounting_statements.json | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.json b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.json index b66c17b6489..d70ae1f90e4 100644 --- a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.json +++ b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.json @@ -7,6 +7,7 @@ "editable_grid": 1, "engine": "InnoDB", "field_order": [ + "section_break_cvfg", "company", "column_break_hcam", "from_date", @@ -90,17 +91,17 @@ }, { "fieldname": "p_l_summary", - "fieldtype": "Data", + "fieldtype": "Float", "read_only": 1 }, { "fieldname": "b_s_summary", - "fieldtype": "Data", + "fieldtype": "Float", "read_only": 1 }, { "fieldname": "difference", - "fieldtype": "Data", + "fieldtype": "Float", "read_only": 1 }, { @@ -159,13 +160,17 @@ "fieldname": "bisecting_to", "fieldtype": "Heading", "label": "Bisecting To" + }, + { + "fieldname": "section_break_cvfg", + "fieldtype": "Section Break" } ], "hide_toolbar": 1, "index_web_pages_for_search": 1, "issingle": 1, "links": [], - "modified": "2023-09-27 16:08:18.155873", + "modified": "2023-09-27 16:22:10.670836", "modified_by": "Administrator", "module": "Accounts", "name": "Bisect Accounting Statements", From a59dc8b40cfe07dffa63a3668ebb243e337092ab Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Fri, 1 Dec 2023 16:50:17 +0530 Subject: [PATCH 72/90] chore: restrict only to administrator and type info (cherry picked from commit 90c6d4dc85701902ad9d12b31716db098831dc10) --- .../bisect_accounting_statements.json | 5 +++-- .../bisect_accounting_statements.py | 20 +++++++++++++++++++ .../doctype/bisect_nodes/bisect_nodes.json | 5 +++-- .../doctype/bisect_nodes/bisect_nodes.py | 19 ++++++++++++++++++ 4 files changed, 45 insertions(+), 4 deletions(-) diff --git a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.json b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.json index d70ae1f90e4..e129fa60c2c 100644 --- a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.json +++ b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.json @@ -170,7 +170,7 @@ "index_web_pages_for_search": 1, "issingle": 1, "links": [], - "modified": "2023-09-27 16:22:10.670836", + "modified": "2023-12-01 16:49:54.073890", "modified_by": "Administrator", "module": "Accounts", "name": "Bisect Accounting Statements", @@ -182,11 +182,12 @@ "email": 1, "print": 1, "read": 1, - "role": "System Manager", + "role": "Administrator", "share": 1, "write": 1 } ], + "read_only": 1, "sort_field": "modified", "sort_order": "DESC", "states": [] diff --git a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py index 0a1de6414fe..e2a67d14b79 100644 --- a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py +++ b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py @@ -14,6 +14,26 @@ from frappe.utils.data import guess_date_format class BisectAccountingStatements(Document): + # begin: auto-generated types + # This code is auto-generated. Do not modify anything in this block. + + from typing import TYPE_CHECKING + + if TYPE_CHECKING: + from frappe.types import DF + + algorithm: DF.Literal["BFS", "DFS"] + b_s_summary: DF.Float + company: DF.Link | None + current_from_date: DF.Datetime | None + current_node: DF.Link | None + current_to_date: DF.Datetime | None + difference: DF.Float + from_date: DF.Datetime | None + p_l_summary: DF.Float + to_date: DF.Datetime | None + # end: auto-generated types + def validate(self): self.validate_dates() diff --git a/erpnext/accounts/doctype/bisect_nodes/bisect_nodes.json b/erpnext/accounts/doctype/bisect_nodes/bisect_nodes.json index db417047950..f352d7a31a1 100644 --- a/erpnext/accounts/doctype/bisect_nodes/bisect_nodes.json +++ b/erpnext/accounts/doctype/bisect_nodes/bisect_nodes.json @@ -63,7 +63,7 @@ ], "index_web_pages_for_search": 1, "links": [], - "modified": "2023-09-27 15:09:27.715523", + "modified": "2023-12-01 16:49:57.146867", "modified_by": "Administrator", "module": "Accounts", "name": "Bisect Nodes", @@ -78,11 +78,12 @@ "print": 1, "read": 1, "report": 1, - "role": "System Manager", + "role": "Administrator", "share": 1, "write": 1 } ], + "read_only": 1, "sort_field": "modified", "sort_order": "DESC", "states": [] diff --git a/erpnext/accounts/doctype/bisect_nodes/bisect_nodes.py b/erpnext/accounts/doctype/bisect_nodes/bisect_nodes.py index 0d176f974a8..e49eabbff55 100644 --- a/erpnext/accounts/doctype/bisect_nodes/bisect_nodes.py +++ b/erpnext/accounts/doctype/bisect_nodes/bisect_nodes.py @@ -6,4 +6,23 @@ from frappe.model.document import Document class BisectNodes(Document): + # begin: auto-generated types + # This code is auto-generated. Do not modify anything in this block. + + from typing import TYPE_CHECKING + + if TYPE_CHECKING: + from frappe.types import DF + + balance_sheet_summary: DF.Float + difference: DF.Float + left_child: DF.Link | None + name: DF.Int | None + period_from_date: DF.Datetime | None + period_to_date: DF.Datetime | None + profit_loss_summary: DF.Float + right_child: DF.Link | None + root: DF.Link | None + # end: auto-generated types + pass From 0305aafff8045894dbe53501fe4676468a431ac3 Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Fri, 1 Dec 2023 17:07:39 +0530 Subject: [PATCH 73/90] refactor: save results in node (cherry picked from commit ca14ae8f1bc69539ca3a2f49f92e2b6c667a40b3) --- .../bisect_accounting_statements.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py index e2a67d14b79..216f5530846 100644 --- a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py +++ b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py @@ -154,6 +154,13 @@ class BisectAccountingStatements(Document): self.b_s_summary = bs_summary.execute_script_report(filters=filters)[5] self.difference = abs(self.p_l_summary - self.b_s_summary) + def update_node(self): + current_node = frappe.get_doc("Bisect Nodes", self.current_node) + current_node.balance_sheet_summary = self.b_s_summary + current_node.profit_loss_summary = self.p_l_summary + current_node.difference = self.difference + current_node.save() + @frappe.whitelist() def bisect_left(self): if self.current_node is not None: @@ -164,6 +171,7 @@ class BisectAccountingStatements(Document): self.current_from_date = lft_node.period_from_date self.current_to_date = lft_node.period_to_date self.get_report_summary() + self.update_node() self.save() else: frappe.msgprint("No more children on Left") @@ -178,6 +186,7 @@ class BisectAccountingStatements(Document): self.current_from_date = rgt_node.period_from_date self.current_to_date = rgt_node.period_to_date self.get_report_summary() + self.update_node() self.save() else: frappe.msgprint("No more children on Right") @@ -192,6 +201,7 @@ class BisectAccountingStatements(Document): self.current_from_date = root.period_from_date self.current_to_date = root.period_to_date self.get_report_summary() + self.update_node() self.save() else: frappe.msgprint("Reached Root") From 067f101c9962edcbd6b5868994304ba3dd290e1c Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Fri, 1 Dec 2023 17:46:28 +0530 Subject: [PATCH 74/90] refactor: flag to differentiate generated and default values (cherry picked from commit 0925706d5efac2cbdfe5240e0310c1a9738a3560) --- .../accounts/doctype/bisect_nodes/bisect_nodes.json | 11 +++++++++-- erpnext/accounts/doctype/bisect_nodes/bisect_nodes.py | 1 + 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/erpnext/accounts/doctype/bisect_nodes/bisect_nodes.json b/erpnext/accounts/doctype/bisect_nodes/bisect_nodes.json index f352d7a31a1..03fad261c3c 100644 --- a/erpnext/accounts/doctype/bisect_nodes/bisect_nodes.json +++ b/erpnext/accounts/doctype/bisect_nodes/bisect_nodes.json @@ -14,7 +14,8 @@ "period_to_date", "difference", "balance_sheet_summary", - "profit_loss_summary" + "profit_loss_summary", + "generated" ], "fields": [ { @@ -59,11 +60,17 @@ "fieldname": "profit_loss_summary", "fieldtype": "Float", "label": "Profit and Loss Summary" + }, + { + "default": "0", + "fieldname": "generated", + "fieldtype": "Check", + "label": "Generated" } ], "index_web_pages_for_search": 1, "links": [], - "modified": "2023-12-01 16:49:57.146867", + "modified": "2023-12-01 17:46:12.437996", "modified_by": "Administrator", "module": "Accounts", "name": "Bisect Nodes", diff --git a/erpnext/accounts/doctype/bisect_nodes/bisect_nodes.py b/erpnext/accounts/doctype/bisect_nodes/bisect_nodes.py index e49eabbff55..f50776641d0 100644 --- a/erpnext/accounts/doctype/bisect_nodes/bisect_nodes.py +++ b/erpnext/accounts/doctype/bisect_nodes/bisect_nodes.py @@ -16,6 +16,7 @@ class BisectNodes(Document): balance_sheet_summary: DF.Float difference: DF.Float + generated: DF.Check left_child: DF.Link | None name: DF.Int | None period_from_date: DF.Datetime | None From b371369699217ae49e7eb5d1138e5d9f91e029c5 Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Fri, 1 Dec 2023 17:52:36 +0530 Subject: [PATCH 75/90] refactor: cache results (cherry picked from commit 14c8c8c33d8f8df636ed5b3de589cc872f6aaf7b) --- .../bisect_accounting_statements.py | 31 +++++++++++++++---- 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py index 216f5530846..1d6fd621aa0 100644 --- a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py +++ b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py @@ -66,6 +66,7 @@ class BisectAccountingStatements(Document): left_node.period_from_date = cur_node.period_from_date left_node.period_to_date = next_to_date left_node.root = cur_node.name + left_node.generated = False left_node.insert() cur_node.left_child = left_node.name period_queue.append(left_node) @@ -75,6 +76,7 @@ class BisectAccountingStatements(Document): right_node.period_from_date = next_from_date right_node.period_to_date = cur_node.period_to_date right_node.root = cur_node.name + right_node.generated = False right_node.insert() cur_node.right_child = right_node.name period_queue.append(right_node) @@ -102,6 +104,7 @@ class BisectAccountingStatements(Document): left_node.period_from_date = cur_node.period_from_date left_node.period_to_date = next_to_date left_node.root = cur_node.name + left_node.generated = False left_node.insert() cur_node.left_child = left_node.name period_stack.append(left_node) @@ -111,6 +114,7 @@ class BisectAccountingStatements(Document): right_node.period_from_date = next_from_date right_node.period_to_date = cur_node.period_to_date right_node.root = cur_node.name + right_node.generated = False right_node.insert() cur_node.right_child = right_node.name period_stack.append(right_node) @@ -159,8 +163,26 @@ class BisectAccountingStatements(Document): current_node.balance_sheet_summary = self.b_s_summary current_node.profit_loss_summary = self.p_l_summary current_node.difference = self.difference + current_node.generated = True current_node.save() + def current_node_has_summary_info(self): + "Assertion method" + return frappe.db.get_value("Bisect Nodes", self.current_node, "generated") + + def fetch_summary_info_from_current_node(self): + current_node = frappe.get_doc("Bisect Nodes", self.current_node) + self.p_l_summary = current_node.balance_sheet_summary + self.b_s_summary = current_node.profit_loss_summary + self.difference = abs(self.p_l_summary - self.b_s_summary) + + def fetch_or_calculate(self): + if self.current_node_has_summary_info(): + self.fetch_summary_info_from_current_node() + else: + self.get_report_summary() + self.update_node() + @frappe.whitelist() def bisect_left(self): if self.current_node is not None: @@ -170,8 +192,7 @@ class BisectAccountingStatements(Document): self.current_node = cur_node.left_child self.current_from_date = lft_node.period_from_date self.current_to_date = lft_node.period_to_date - self.get_report_summary() - self.update_node() + self.fetch_or_calculate() self.save() else: frappe.msgprint("No more children on Left") @@ -185,8 +206,7 @@ class BisectAccountingStatements(Document): self.current_node = cur_node.right_child self.current_from_date = rgt_node.period_from_date self.current_to_date = rgt_node.period_to_date - self.get_report_summary() - self.update_node() + self.fetch_or_calculate() self.save() else: frappe.msgprint("No more children on Right") @@ -200,8 +220,7 @@ class BisectAccountingStatements(Document): self.current_node = cur_node.root self.current_from_date = root.period_from_date self.current_to_date = root.period_to_date - self.get_report_summary() - self.update_node() + self.fetch_or_calculate() self.save() else: frappe.msgprint("Reached Root") From e7b3ef0c905c9df792d9ba3eb1f29114fd7e13d2 Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Wed, 27 Dec 2023 17:31:34 +0530 Subject: [PATCH 76/90] chore: resolve linter issues (cherry picked from commit 0890b414b14d67803abe2ee5be72ebdcf9f6bee4) --- .../bisect_accounting_statements.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py index 1d6fd621aa0..da273b9f891 100644 --- a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py +++ b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py @@ -195,7 +195,7 @@ class BisectAccountingStatements(Document): self.fetch_or_calculate() self.save() else: - frappe.msgprint("No more children on Left") + frappe.msgprint(_("No more children on Left")) @frappe.whitelist() def bisect_right(self): @@ -209,7 +209,7 @@ class BisectAccountingStatements(Document): self.fetch_or_calculate() self.save() else: - frappe.msgprint("No more children on Right") + frappe.msgprint(_("No more children on Right")) @frappe.whitelist() def move_up(self): @@ -223,4 +223,4 @@ class BisectAccountingStatements(Document): self.fetch_or_calculate() self.save() else: - frappe.msgprint("Reached Root") + frappe.msgprint(_("Reached Root")) From 345d5a657a40fc1dad6ee8c855bc6877e214ea1d Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Fri, 22 Mar 2024 14:03:43 +0530 Subject: [PATCH 77/90] chore: resolve JS linter issue --- .../bisect_accounting_statements.js | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.js b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.js index ece0fb33e54..f3532e5be61 100644 --- a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.js +++ b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.js @@ -6,18 +6,18 @@ frappe.ui.form.on("Bisect Accounting Statements", { frm.trigger("render_heatmap"); }, refresh(frm) { - frm.add_custom_button(__('Bisect Left'), () => { + frm.add_custom_button(__("Bisect Left"), () => { frm.trigger("bisect_left"); }); - frm.add_custom_button(__('Bisect Right'), () => { + frm.add_custom_button(__("Bisect Right"), () => { frm.trigger("bisect_right"); }); - frm.add_custom_button(__('Up'), () => { + frm.add_custom_button(__("Up"), () => { frm.trigger("move_up"); }); - frm.add_custom_button(__('Build Tree'), () => { + frm.add_custom_button(__("Build Tree"), () => { frm.trigger("build_tree"); }); }, @@ -26,16 +26,16 @@ frappe.ui.form.on("Bisect Accounting Statements", { bisect_heatmap.addClass("bisect_heatmap_location"); // milliseconds in a day - let msiad=24*60*60*1000; + let msiad = 24 * 60 * 60 * 1000; let datapoints = {}; let fr_dt = new Date(frm.doc.from_date).getTime(); let to_dt = new Date(frm.doc.to_date).getTime(); let bisect_start = new Date(frm.doc.current_from_date).getTime(); let bisect_end = new Date(frm.doc.current_to_date).getTime(); - for(let x=fr_dt; x <= to_dt; x+=msiad){ - let epoch_in_seconds = x/1000; - if ((bisect_start <= x) && (x <= bisect_end )) { + for (let x = fr_dt; x <= to_dt; x += msiad) { + let epoch_in_seconds = x / 1000; + if (bisect_start <= x && x <= bisect_end) { datapoints[epoch_in_seconds] = 1.0; } else { datapoints[epoch_in_seconds] = 0.0; @@ -49,19 +49,19 @@ frappe.ui.form.on("Bisect Accounting Statements", { start: new Date(frm.doc.from_date), end: new Date(frm.doc.to_date), }, - countLabel: 'Bisecting', + countLabel: "Bisecting", discreteDomains: 1, }); }, bisect_left(frm) { frm.call({ doc: frm.doc, - method: 'bisect_left', + method: "bisect_left", freeze: true, freeze_message: __("Bisecting Left ..."), callback: (r) => { frm.trigger("render_heatmap"); - } + }, }); }, bisect_right(frm) { @@ -69,10 +69,10 @@ frappe.ui.form.on("Bisect Accounting Statements", { doc: frm.doc, freeze: true, freeze_message: __("Bisecting Right ..."), - method: 'bisect_right', + method: "bisect_right", callback: (r) => { frm.trigger("render_heatmap"); - } + }, }); }, move_up(frm) { @@ -80,10 +80,10 @@ frappe.ui.form.on("Bisect Accounting Statements", { doc: frm.doc, freeze: true, freeze_message: __("Moving up in tree ..."), - method: 'move_up', + method: "move_up", callback: (r) => { frm.trigger("render_heatmap"); - } + }, }); }, build_tree(frm) { @@ -91,10 +91,10 @@ frappe.ui.form.on("Bisect Accounting Statements", { doc: frm.doc, freeze: true, freeze_message: __("Rebuilding BTree for period ..."), - method: 'build_tree', + method: "build_tree", callback: (r) => { frm.trigger("render_heatmap"); - } + }, }); }, }); From 4636ef0a29cf7e60a41d9efd98c8744530f93e9b Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Fri, 22 Mar 2024 15:03:38 +0530 Subject: [PATCH 78/90] fix: rate reset to zero (cherry picked from commit 6821baa850e4f820bdd274b5113a34e3fea3daba) --- erpnext/stock/get_item_details.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/erpnext/stock/get_item_details.py b/erpnext/stock/get_item_details.py index a82ce223270..e13d7a354ad 100644 --- a/erpnext/stock/get_item_details.py +++ b/erpnext/stock/get_item_details.py @@ -822,6 +822,9 @@ def get_price_list_rate(args, item_doc, out=None): if args.price_list and args.rate: insert_item_price(args) + if not price_list_rate: + return out + out.price_list_rate = ( flt(price_list_rate) * flt(args.plc_conversion_rate) / flt(args.conversion_rate) ) From f25b5bdfab25944fd000ecbf830cc089906ea295 Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Fri, 22 Mar 2024 16:11:05 +0530 Subject: [PATCH 79/90] refactor: reset flag for old records (cherry picked from commit a88bf8419e7c9987d81b7d0c1d05f45be26d65cc) # Conflicts: # erpnext/patches.txt --- erpnext/patches.txt | 4 ++++ erpnext/patches/v14_0/update_flag_for_return_invoices.py | 8 ++++++++ 2 files changed, 12 insertions(+) diff --git a/erpnext/patches.txt b/erpnext/patches.txt index c024c86c5e5..4242e1bdae4 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -353,8 +353,12 @@ erpnext.patches.v14_0.update_zero_asset_quantity_field execute:frappe.db.set_single_value("Buying Settings", "project_update_frequency", "Each Transaction") erpnext.patches.v14_0.update_total_asset_cost_field erpnext.patches.v14_0.create_accounting_dimensions_in_reconciliation_tool +<<<<<<< HEAD erpnext.patches.v15_0.allow_on_submit_dimensions_for_repostable_doctypes erpnext.patches.v14_0.update_flag_for_return_invoices +======= +erpnext.patches.v14_0.update_flag_for_return_invoices #2024-03-22 +>>>>>>> a88bf8419e (refactor: reset flag for old records) # below migration patch should always run last erpnext.patches.v14_0.migrate_gl_to_payment_ledger erpnext.stock.doctype.delivery_note.patches.drop_unused_return_against_index # 2023-12-20 diff --git a/erpnext/patches/v14_0/update_flag_for_return_invoices.py b/erpnext/patches/v14_0/update_flag_for_return_invoices.py index feb43beacf8..bea99575425 100644 --- a/erpnext/patches/v14_0/update_flag_for_return_invoices.py +++ b/erpnext/patches/v14_0/update_flag_for_return_invoices.py @@ -12,6 +12,10 @@ def execute(): creation_date = "2024-01-25" si = qb.DocType("Sales Invoice") + + # unset flag, as migration would have set it for all records, as the field was introduced with default '1' + qb.update(si).set(si.update_outstanding_for_self, False).run() + if cr_notes := ( qb.from_(si) .select(si.name) @@ -37,6 +41,10 @@ def execute(): ).run() pi = qb.DocType("Purchase Invoice") + + # unset flag, as migration would have set it for all records, as the field was introduced with default '1' + qb.update(pi).set(pi.update_outstanding_for_self, False).run() + if dr_notes := ( qb.from_(pi) .select(pi.name) From d238cdbdd59a47bb81a0e395108cf5cb12fd539e Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Fri, 22 Mar 2024 17:50:51 +0530 Subject: [PATCH 80/90] refactor: hide on print formats (cherry picked from commit fdcdc8a56ea8892f197dd2a45b175d20137953f6) --- erpnext/accounts/doctype/sales_invoice/sales_invoice.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json index 2792c18b862..4a3e1758752 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json @@ -2171,7 +2171,8 @@ "fieldname": "update_outstanding_for_self", "fieldtype": "Check", "label": "Update Outstanding for Self", - "no_copy": 1 + "no_copy": 1, + "print_hide": 1 } ], "icon": "fa fa-file-text", @@ -2184,7 +2185,7 @@ "link_fieldname": "consolidated_invoice" } ], - "modified": "2024-03-20 16:02:52.237732", + "modified": "2024-03-22 17:50:34.395602", "modified_by": "Administrator", "module": "Accounts", "name": "Sales Invoice", From 9ec24bcc6c8b1680a4b89dffb3fda072878df933 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Thu, 21 Mar 2024 20:28:16 +0530 Subject: [PATCH 81/90] fix: use serial/batch fields for subcontracting receipt and in transit stock entry (cherry picked from commit 3423334e4fedd47cecc0690a18bf67bc0b739fb3) --- erpnext/controllers/accounts_controller.py | 6 + erpnext/controllers/stock_controller.py | 62 +++-- .../controllers/subcontracting_controller.py | 81 +++++- .../tests/test_subcontracting_controller.py | 241 +++++++++++++++++- erpnext/stock/deprecated_serial_batch.py | 2 + .../stock/doctype/stock_entry/stock_entry.py | 4 +- .../subcontracting_receipt.py | 4 +- .../test_subcontracting_receipt.py | 9 + 8 files changed, 388 insertions(+), 21 deletions(-) diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index ddc3acf6556..fe4500a41e5 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -380,6 +380,12 @@ class AccountsController(TransactionBase): for bundle in bundles: frappe.delete_doc("Serial and Batch Bundle", bundle.name) + batches = frappe.get_all( + "Batch", filters={"reference_doctype": self.doctype, "reference_name": self.name} + ) + for row in batches: + frappe.delete_doc("Batch", row.name) + def validate_return_against_account(self): if ( self.doctype in ["Sales Invoice", "Purchase Invoice"] and self.is_return and self.return_against diff --git a/erpnext/controllers/stock_controller.py b/erpnext/controllers/stock_controller.py index 2b607eafdf8..1104204d856 100644 --- a/erpnext/controllers/stock_controller.py +++ b/erpnext/controllers/stock_controller.py @@ -48,7 +48,9 @@ class StockController(AccountsController): super(StockController, self).validate() if self.docstatus == 0: - self.validate_duplicate_serial_and_batch_bundle() + for table_name in ["items", "packed_items", "supplied_items"]: + self.validate_duplicate_serial_and_batch_bundle(table_name) + if not self.get("is_return"): self.validate_inspection() self.validate_serialized_batch() @@ -58,12 +60,19 @@ class StockController(AccountsController): self.validate_internal_transfer() self.validate_putaway_capacity() - def validate_duplicate_serial_and_batch_bundle(self): - if sbb_list := [ - item.get("serial_and_batch_bundle") - for item in self.items - if item.get("serial_and_batch_bundle") - ]: + def validate_duplicate_serial_and_batch_bundle(self, table_name): + if not self.get(table_name): + return + + sbb_list = [] + for item in self.get(table_name): + if item.get("serial_and_batch_bundle"): + sbb_list.append(item.get("serial_and_batch_bundle")) + + if item.get("rejected_serial_and_batch_bundle"): + sbb_list.append(item.get("rejected_serial_and_batch_bundle")) + + if sbb_list: SLE = frappe.qb.DocType("Stock Ledger Entry") data = ( frappe.qb.from_(SLE) @@ -188,7 +197,7 @@ class StockController(AccountsController): not row.serial_and_batch_bundle and not row.get("rejected_serial_and_batch_bundle") ): bundle_details = { - "item_code": row.item_code, + "item_code": row.get("rm_item_code") or row.item_code, "posting_date": self.posting_date, "posting_time": self.posting_time, "voucher_type": self.doctype, @@ -200,7 +209,7 @@ class StockController(AccountsController): "do_not_submit": True, } - if row.qty: + if row.get("qty") or row.get("consumed_qty"): self.update_bundle_details(bundle_details, table_name, row) self.create_serial_batch_bundle(bundle_details, row) @@ -219,6 +228,12 @@ class StockController(AccountsController): type_of_transaction = "Inward" if not self.is_return: type_of_transaction = "Outward" + elif table_name == "supplied_items": + qty = row.consumed_qty + warehouse = self.supplier_warehouse + type_of_transaction = "Outward" + if self.is_return: + type_of_transaction = "Inward" else: type_of_transaction = get_type_of_transaction(self, row) @@ -550,13 +565,30 @@ class StockController(AccountsController): ) def delete_auto_created_batches(self): - for row in self.items: - if row.serial_and_batch_bundle: - frappe.db.set_value( - "Serial and Batch Bundle", row.serial_and_batch_bundle, {"is_cancelled": 1} - ) + for table_name in ["items", "packed_items", "supplied_items"]: + if not self.get(table_name): + continue - row.db_set("serial_and_batch_bundle", None) + for row in self.get(table_name): + update_values = {} + if row.get("batch_no"): + update_values["batch_no"] = None + + if row.serial_and_batch_bundle: + update_values["serial_and_batch_bundle"] = None + frappe.db.set_value( + "Serial and Batch Bundle", row.serial_and_batch_bundle, {"is_cancelled": 1} + ) + + if update_values: + row.db_set(update_values) + + if table_name == "items" and row.get("rejected_serial_and_batch_bundle"): + frappe.db.set_value( + "Serial and Batch Bundle", row.rejected_serial_and_batch_bundle, {"is_cancelled": 1} + ) + + row.db_set("rejected_serial_and_batch_bundle", None) def set_serial_and_batch_bundle(self, table_name=None, ignore_validate=False): if not table_name: diff --git a/erpnext/controllers/subcontracting_controller.py b/erpnext/controllers/subcontracting_controller.py index e66fe8bcdec..ffc7f919d95 100644 --- a/erpnext/controllers/subcontracting_controller.py +++ b/erpnext/controllers/subcontracting_controller.py @@ -379,10 +379,10 @@ class SubcontractingController(StockController): if row.serial_no: details.serial_no.extend(get_serial_nos(row.serial_no)) - if row.batch_no: + elif row.batch_no: details.batch_no[row.batch_no] += row.qty - if voucher_bundle_data: + elif voucher_bundle_data: bundle_key = (row.rm_item_code, row.main_item_code, row.t_warehouse, row.voucher_no) bundle_data = voucher_bundle_data.get(bundle_key, frappe._dict()) @@ -392,6 +392,9 @@ class SubcontractingController(StockController): if bundle_data.batch_nos: for batch_no, qty in bundle_data.batch_nos.items(): + if qty < 0: + qty = abs(qty) + if qty > 0: details.batch_no[batch_no] += qty bundle_data.batch_nos[batch_no] -= qty @@ -545,17 +548,24 @@ class SubcontractingController(StockController): rm_obj.reference_name = item_row.name + use_serial_batch_fields = frappe.db.get_single_value("Stock Settings", "use_serial_batch_fields") + if self.doctype == self.subcontract_data.order_doctype: rm_obj.required_qty = qty rm_obj.amount = rm_obj.required_qty * rm_obj.rate else: rm_obj.consumed_qty = qty rm_obj.required_qty = bom_item.required_qty or qty + rm_obj.serial_and_batch_bundle = None setattr( rm_obj, self.subcontract_data.order_field, item_row.get(self.subcontract_data.order_field) ) - if self.doctype == "Subcontracting Receipt": + if use_serial_batch_fields: + rm_obj.use_serial_batch_fields = 1 + self.__set_batch_nos(bom_item, item_row, rm_obj, qty) + + if self.doctype == "Subcontracting Receipt" and not use_serial_batch_fields: args = frappe._dict( { "item_code": rm_obj.rm_item_code, @@ -581,6 +591,68 @@ class SubcontractingController(StockController): rm_obj.rate = get_incoming_rate(args) + def __set_batch_nos(self, bom_item, item_row, rm_obj, qty): + key = (rm_obj.rm_item_code, item_row.item_code, item_row.get(self.subcontract_data.order_field)) + + if self.available_materials.get(key) and self.available_materials[key]["batch_no"]: + new_rm_obj = None + for batch_no, batch_qty in self.available_materials[key]["batch_no"].items(): + if batch_qty >= qty or ( + rm_obj.consumed_qty == 0 + and self.backflush_based_on == "BOM" + and len(self.available_materials[key]["batch_no"]) == 1 + ): + if rm_obj.consumed_qty == 0: + self.__set_consumed_qty(rm_obj, qty) + + self.__set_batch_no_as_per_qty(item_row, rm_obj, batch_no, qty) + self.available_materials[key]["batch_no"][batch_no] -= qty + return + + elif qty > 0 and batch_qty > 0: + qty -= batch_qty + new_rm_obj = self.append(self.raw_material_table, bom_item) + new_rm_obj.serial_and_batch_bundle = None + new_rm_obj.use_serial_batch_fields = 1 + new_rm_obj.reference_name = item_row.name + self.__set_batch_no_as_per_qty(item_row, new_rm_obj, batch_no, batch_qty) + self.available_materials[key]["batch_no"][batch_no] = 0 + + if new_rm_obj: + self.remove(rm_obj) + elif abs(qty) > 0: + self.__set_consumed_qty(rm_obj, qty) + + else: + self.__set_consumed_qty(rm_obj, qty, bom_item.required_qty or qty) + self.__set_serial_nos(item_row, rm_obj) + + def __set_consumed_qty(self, rm_obj, consumed_qty, required_qty=0): + rm_obj.required_qty = required_qty + rm_obj.consumed_qty = consumed_qty + + def __set_serial_nos(self, item_row, rm_obj): + key = (rm_obj.rm_item_code, item_row.item_code, item_row.get(self.subcontract_data.order_field)) + if self.available_materials.get(key) and self.available_materials[key]["serial_no"]: + used_serial_nos = self.available_materials[key]["serial_no"][0 : cint(rm_obj.consumed_qty)] + rm_obj.serial_no = "\n".join(used_serial_nos) + + # Removed the used serial nos from the list + for sn in used_serial_nos: + self.available_materials[key]["serial_no"].remove(sn) + + def __set_batch_no_as_per_qty(self, item_row, rm_obj, batch_no, qty): + rm_obj.update( + { + "consumed_qty": qty, + "batch_no": batch_no, + "required_qty": qty, + self.subcontract_data.order_field: item_row.get(self.subcontract_data.order_field), + } + ) + + self.__set_serial_nos(item_row, rm_obj) + def __get_qty_based_on_material_transfer(self, item_row, transfer_item): key = (item_row.item_code, item_row.get(self.subcontract_data.order_field)) @@ -1076,6 +1148,9 @@ def make_rm_stock_entry( "serial_and_batch_bundle": rm_item.get("serial_and_batch_bundle"), "main_item_code": fg_item_code, "allow_alternative_item": item_wh.get(rm_item_code, {}).get("allow_alternative_item"), + "use_serial_batch_fields": rm_item.get("use_serial_batch_fields"), + "serial_no": rm_item.get("serial_no") if rm_item.get("use_serial_batch_fields") else None, + "batch_no": rm_item.get("batch_no") if rm_item.get("use_serial_batch_fields") else None, } } diff --git a/erpnext/controllers/tests/test_subcontracting_controller.py b/erpnext/controllers/tests/test_subcontracting_controller.py index 95a7bcb3982..7374e1e587f 100644 --- a/erpnext/controllers/tests/test_subcontracting_controller.py +++ b/erpnext/controllers/tests/test_subcontracting_controller.py @@ -140,6 +140,7 @@ class TestSubcontractingController(FrappeTestCase): - Create partial SCR against the SCO and check serial nos and batch no. """ + frappe.db.set_single_value("Stock Settings", "use_serial_batch_fields", 0) set_backflush_based_on("Material Transferred for Subcontract") service_items = [ { @@ -202,6 +203,8 @@ class TestSubcontractingController(FrappeTestCase): if value.get(field): self.assertEqual(value.get(field), transferred_detais.get(field)) + frappe.db.set_single_value("Stock Settings", "use_serial_batch_fields", 1) + def test_subcontracting_with_same_components_different_fg(self): """ - Set backflush based on Material Transfer. @@ -211,6 +214,7 @@ class TestSubcontractingController(FrappeTestCase): - Create partial SCR against the SCO and check serial nos. """ + frappe.db.set_single_value("Stock Settings", "use_serial_batch_fields", 0) set_backflush_based_on("Material Transferred for Subcontract") service_items = [ { @@ -278,6 +282,8 @@ class TestSubcontractingController(FrappeTestCase): self.assertEqual(value.qty, 6) self.assertEqual(sorted(value.serial_no), sorted(transferred_detais.get("serial_no")[6:12])) + frappe.db.set_single_value("Stock Settings", "use_serial_batch_fields", 1) + def test_return_non_consumed_materials(self): """ - Set backflush based on Material Transfer. @@ -288,6 +294,7 @@ class TestSubcontractingController(FrappeTestCase): - After that return the non consumed material back to the store from supplier's warehouse. """ + frappe.db.set_single_value("Stock Settings", "use_serial_batch_fields", 0) set_backflush_based_on("Material Transferred for Subcontract") service_items = [ { @@ -333,6 +340,7 @@ class TestSubcontractingController(FrappeTestCase): get_serial_nos(doc.items[0].serial_no), itemwise_details.get(doc.items[0].item_code)["serial_no"][5:6], ) + frappe.db.set_single_value("Stock Settings", "use_serial_batch_fields", 1) def test_item_with_batch_based_on_bom(self): """ @@ -578,6 +586,7 @@ class TestSubcontractingController(FrappeTestCase): - Create SCR for remaining qty against the SCO and change the qty manually. """ + frappe.db.set_single_value("Stock Settings", "use_serial_batch_fields", 0) set_backflush_based_on("Material Transferred for Subcontract") service_items = [ { @@ -643,6 +652,8 @@ class TestSubcontractingController(FrappeTestCase): self.assertEqual(value.qty, details.qty) self.assertEqual(sorted(value.serial_no), sorted(details.serial_no)) + frappe.db.set_single_value("Stock Settings", "use_serial_batch_fields", 1) + def test_incorrect_serial_no_components_based_on_material_transfer(self): """ - Set backflush based on Material Transferred for Subcontract. @@ -652,6 +663,7 @@ class TestSubcontractingController(FrappeTestCase): - System should throw the error and not allowed to save the SCR. """ + frappe.db.set_single_value("Stock Settings", "use_serial_batch_fields", 0) serial_no = "ABC" if not frappe.db.exists("Serial No", serial_no): frappe.get_doc( @@ -712,6 +724,7 @@ class TestSubcontractingController(FrappeTestCase): scr1.save() self.delete_bundle_from_scr(scr1) scr1.delete() + frappe.db.set_single_value("Stock Settings", "use_serial_batch_fields", 1) @staticmethod def delete_bundle_from_scr(scr): @@ -844,6 +857,223 @@ class TestSubcontractingController(FrappeTestCase): for item in sco.get("supplied_items"): self.assertEqual(item.supplied_qty, 0.0) + def test_sco_with_material_transfer_with_use_serial_batch_fields(self): + """ + - Set backflush based on Material Transfer. + - Create SCO for the item Subcontracted Item SA1 and Subcontracted Item SA5. + - Transfer the components from Stores to Supplier warehouse with batch no and serial nos. + - Transfer extra item Subcontracted SRM Item 4 for the subcontract item Subcontracted Item SA5. + - Create partial SCR against the SCO and check serial nos and batch no. + """ + + set_backflush_based_on("Material Transferred for Subcontract") + service_items = [ + { + "warehouse": "_Test Warehouse - _TC", + "item_code": "Subcontracted Service Item 1", + "qty": 5, + "rate": 100, + "fg_item": "Subcontracted Item SA1", + "fg_item_qty": 5, + }, + { + "warehouse": "_Test Warehouse - _TC", + "item_code": "Subcontracted Service Item 5", + "qty": 6, + "rate": 100, + "fg_item": "Subcontracted Item SA5", + "fg_item_qty": 6, + }, + ] + sco = get_subcontracting_order(service_items=service_items) + rm_items = get_rm_items(sco.supplied_items) + rm_items.append( + { + "main_item_code": "Subcontracted Item SA5", + "item_code": "Subcontracted SRM Item 4", + "qty": 6, + } + ) + itemwise_details = make_stock_in_entry(rm_items=rm_items) + + for item in rm_items: + item["sco_rm_detail"] = sco.items[0].name if item.get("qty") == 5 else sco.items[1].name + + make_stock_transfer_entry( + sco_no=sco.name, + rm_items=rm_items, + itemwise_details=copy.deepcopy(itemwise_details), + ) + + scr1 = make_subcontracting_receipt(sco.name) + scr1.remove(scr1.items[1]) + scr1.save() + scr1.submit() + + for key, value in get_supplied_items(scr1).items(): + transferred_detais = itemwise_details.get(key) + + for field in ["qty", "serial_no", "batch_no"]: + if value.get(field): + data = value.get(field) + if field == "serial_no": + data = sorted(data) + + self.assertEqual(data, transferred_detais.get(field)) + + scr2 = make_subcontracting_receipt(sco.name) + scr2.save() + scr2.submit() + + for key, value in get_supplied_items(scr2).items(): + transferred_detais = itemwise_details.get(key) + + for field in ["qty", "serial_no", "batch_no"]: + if value.get(field): + data = value.get(field) + if field == "serial_no": + data = sorted(data) + + self.assertEqual(data, transferred_detais.get(field)) + + def test_subcontracting_with_same_components_different_fg_with_serial_batch_fields(self): + """ + - Set backflush based on Material Transfer. + - Create SCO for the item Subcontracted Item SA2 and Subcontracted Item SA3. + - Transfer the components from Stores to Supplier warehouse with serial nos. + - Transfer extra qty of components for the item Subcontracted Item SA2. + - Create partial SCR against the SCO and check serial nos. + """ + + set_backflush_based_on("Material Transferred for Subcontract") + service_items = [ + { + "warehouse": "_Test Warehouse - _TC", + "item_code": "Subcontracted Service Item 2", + "qty": 5, + "rate": 100, + "fg_item": "Subcontracted Item SA2", + "fg_item_qty": 5, + }, + { + "warehouse": "_Test Warehouse - _TC", + "item_code": "Subcontracted Service Item 3", + "qty": 6, + "rate": 100, + "fg_item": "Subcontracted Item SA3", + "fg_item_qty": 6, + }, + ] + sco = get_subcontracting_order(service_items=service_items) + rm_items = get_rm_items(sco.supplied_items) + rm_items[0]["qty"] += 1 + itemwise_details = make_stock_in_entry(rm_items=rm_items) + + for item in rm_items: + item["sco_rm_detail"] = sco.items[0].name if item.get("qty") == 5 else sco.items[1].name + item["use_serial_batch_fields"] = 1 + + make_stock_transfer_entry( + sco_no=sco.name, + rm_items=rm_items, + itemwise_details=copy.deepcopy(itemwise_details), + ) + + scr1 = make_subcontracting_receipt(sco.name) + scr1.items[0].qty = 3 + scr1.remove(scr1.items[1]) + scr1.save() + scr1.submit() + + for key, value in get_supplied_items(scr1).items(): + transferred_detais = itemwise_details.get(key) + + self.assertEqual(value.qty, 4) + self.assertEqual(sorted(value.serial_no), sorted(transferred_detais.get("serial_no")[0:4])) + + scr2 = make_subcontracting_receipt(sco.name) + scr2.items[0].qty = 2 + scr2.remove(scr2.items[1]) + scr2.save() + scr2.submit() + + for key, value in get_supplied_items(scr2).items(): + transferred_detais = itemwise_details.get(key) + + self.assertEqual(value.qty, 2) + self.assertEqual(sorted(value.serial_no), sorted(transferred_detais.get("serial_no")[4:6])) + + scr3 = make_subcontracting_receipt(sco.name) + scr3.save() + scr3.submit() + + for key, value in get_supplied_items(scr3).items(): + transferred_detais = itemwise_details.get(key) + + self.assertEqual(value.qty, 6) + self.assertEqual(sorted(value.serial_no), sorted(transferred_detais.get("serial_no")[6:12])) + + def test_return_non_consumed_materials_with_serial_batch_fields(self): + """ + - Set backflush based on Material Transfer. + - Create SCO for item Subcontracted Item SA2. + - Transfer the components from Stores to Supplier warehouse with serial nos. + - Transfer extra qty of component for the subcontracted item Subcontracted Item SA2. + - Create SCR for full qty against the SCO and change the qty of raw material. + - After that return the non consumed material back to the store from supplier's warehouse. + """ + + set_backflush_based_on("Material Transferred for Subcontract") + service_items = [ + { + "warehouse": "_Test Warehouse - _TC", + "item_code": "Subcontracted Service Item 2", + "qty": 5, + "rate": 100, + "fg_item": "Subcontracted Item SA2", + "fg_item_qty": 5, + }, + ] + sco = get_subcontracting_order(service_items=service_items) + rm_items = get_rm_items(sco.supplied_items) + rm_items[0]["qty"] += 1 + itemwise_details = make_stock_in_entry(rm_items=rm_items) + + for item in rm_items: + item["use_serial_batch_fields"] = 1 + item["sco_rm_detail"] = sco.items[0].name + + make_stock_transfer_entry( + sco_no=sco.name, + rm_items=rm_items, + itemwise_details=copy.deepcopy(itemwise_details), + ) + + scr1 = make_subcontracting_receipt(sco.name) + scr1.save() + scr1.supplied_items[0].consumed_qty = 5 + scr1.supplied_items[0].serial_no = "\n".join( + sorted(itemwise_details.get("Subcontracted SRM Item 2").get("serial_no")[0:5]) + ) + scr1.submit() + + for key, value in get_supplied_items(scr1).items(): + transferred_detais = itemwise_details.get(key) + self.assertTrue(value.use_serial_batch_fields) + self.assertEqual(value.qty, 5) + self.assertEqual(sorted(value.serial_no), sorted(transferred_detais.get("serial_no")[0:5])) + + sco.load_from_db() + self.assertEqual(sco.supplied_items[0].consumed_qty, 5) + doc = get_materials_from_supplier(sco.name, [d.name for d in sco.supplied_items]) + self.assertEqual(doc.items[0].qty, 1) + self.assertEqual(doc.items[0].s_warehouse, "_Test Warehouse 1 - _TC") + self.assertEqual(doc.items[0].t_warehouse, "_Test Warehouse - _TC") + self.assertEqual( + get_serial_nos(doc.items[0].serial_no), + itemwise_details.get(doc.items[0].item_code)["serial_no"][5:6], + ) + def add_second_row_in_scr(scr): item_dict = {} @@ -914,6 +1144,7 @@ def update_item_details(child_row, details): else child_row.get("consumed_qty") ) + details.use_serial_batch_fields = child_row.get("use_serial_batch_fields") if child_row.serial_and_batch_bundle: doc = frappe.get_doc("Serial and Batch Bundle", child_row.serial_and_batch_bundle) for row in doc.get("entries"): @@ -945,6 +1176,7 @@ def make_stock_transfer_entry(**args): "rate": row.rate or 100, "stock_uom": row.stock_uom or "Nos", "warehouse": row.warehouse or "_Test Warehouse - _TC", + "use_serial_batch_fields": row.get("use_serial_batch_fields"), } item_details = args.itemwise_details.get(row.item_code) @@ -960,9 +1192,12 @@ def make_stock_transfer_entry(**args): if batch_qty >= row.qty: batches[batch_no] = row.qty item_details.batch_no[batch_no] -= row.qty + if row.get("use_serial_batch_fields"): + item["batch_no"] = batch_no + break - if serial_nos or batches: + if not row.get("use_serial_batch_fields") and (serial_nos or batches): item["serial_and_batch_bundle"] = make_serial_batch_bundle( frappe._dict( { @@ -978,6 +1213,9 @@ def make_stock_transfer_entry(**args): ) ).name + if serial_nos and row.get("use_serial_batch_fields"): + item["serial_no"] = "\n".join(serial_nos) + items.append(item) ste_dict = make_rm_stock_entry(args.sco_no, items) @@ -1132,6 +1370,7 @@ def get_rm_items(supplied_items): "rate": item.rate, "stock_uom": item.stock_uom, "warehouse": item.reserve_warehouse, + "use_serial_batch_fields": 0, } ) diff --git a/erpnext/stock/deprecated_serial_batch.py b/erpnext/stock/deprecated_serial_batch.py index 1aa8134b485..0b3243f857e 100644 --- a/erpnext/stock/deprecated_serial_batch.py +++ b/erpnext/stock/deprecated_serial_batch.py @@ -246,6 +246,8 @@ class DeprecatedBatchNoValuation: if self.sle.serial_and_batch_bundle: query = query.where(bundle.name != self.sle.serial_and_batch_bundle) + query = query.where(bundle.voucher_type != "Pick List") + for d in query.run(as_dict=True): self.non_batchwise_balance_value += flt(d.batch_value) self.non_batchwise_balance_qty += flt(d.batch_qty) diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.py b/erpnext/stock/doctype/stock_entry/stock_entry.py index c317a889ec6..e4c9ded2cc4 100644 --- a/erpnext/stock/doctype/stock_entry/stock_entry.py +++ b/erpnext/stock/doctype/stock_entry/stock_entry.py @@ -2635,7 +2635,9 @@ def make_stock_in_entry(source_name, target_doc=None): def set_missing_values(source, target): target.stock_entry_type = "Material Transfer" target.set_missing_values() - target.make_serial_and_batch_bundle_for_transfer() + + if not frappe.db.get_single_value("Stock Settings", "use_serial_batch_fields"): + target.make_serial_and_batch_bundle_for_transfer() def update_item(source_doc, target_doc, source_parent): target_doc.t_warehouse = "" diff --git a/erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.py b/erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.py index 8d82709e75f..d61473a434b 100644 --- a/erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.py +++ b/erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.py @@ -149,7 +149,9 @@ class SubcontractingReceipt(SubcontractingController): self.update_prevdoc_status() self.set_subcontracting_order_status() self.set_consumed_qty_in_subcontract_order() - self.make_bundle_using_old_serial_batch_fields() + + for table_name in ["items", "supplied_items"]: + self.make_bundle_using_old_serial_batch_fields(table_name) self.update_stock_ledger() self.make_gl_entries() self.repost_future_sle_and_gle() diff --git a/erpnext/subcontracting/doctype/subcontracting_receipt/test_subcontracting_receipt.py b/erpnext/subcontracting/doctype/subcontracting_receipt/test_subcontracting_receipt.py index 3e74ac91f4b..4f4a1bd5f46 100644 --- a/erpnext/subcontracting/doctype/subcontracting_receipt/test_subcontracting_receipt.py +++ b/erpnext/subcontracting/doctype/subcontracting_receipt/test_subcontracting_receipt.py @@ -292,6 +292,7 @@ class TestSubcontractingReceipt(FrappeTestCase): self.assertRaises(OverAllowanceError, make_return_subcontracting_receipt, **args) def test_subcontracting_receipt_no_gl_entry(self): + frappe.db.set_single_value("Stock Settings", "use_serial_batch_fields", 0) sco = get_subcontracting_order() rm_items = get_rm_items(sco.supplied_items) itemwise_details = make_stock_in_entry(rm_items=rm_items) @@ -327,8 +328,10 @@ class TestSubcontractingReceipt(FrappeTestCase): # Service Cost(100 * 10) + Raw Materials Cost(100 * 10) + Additional Costs(10 * 10) = 2100 self.assertEqual(stock_value_difference, 2100) self.assertFalse(get_gl_entries("Subcontracting Receipt", scr.name)) + frappe.db.set_single_value("Stock Settings", "use_serial_batch_fields", 1) def test_subcontracting_receipt_gl_entry(self): + frappe.db.set_single_value("Stock Settings", "use_serial_batch_fields", 0) sco = get_subcontracting_order( company="_Test Company with perpetual inventory", warehouse="Stores - TCP1", @@ -387,6 +390,7 @@ class TestSubcontractingReceipt(FrappeTestCase): scr.reload() scr.cancel() self.assertTrue(get_gl_entries("Subcontracting Receipt", scr.name)) + frappe.db.set_single_value("Stock Settings", "use_serial_batch_fields", 1) def test_supplied_items_consumed_qty(self): # Set Backflush Based On as "Material Transferred for Subcontracting" to transfer RM's more than the required qty @@ -664,6 +668,7 @@ class TestSubcontractingReceipt(FrappeTestCase): ) def test_subcontracting_receipt_valuation_for_fg_with_auto_created_serial_batch_bundle(self): + frappe.db.set_single_value("Stock Settings", "use_serial_batch_fields", 0) set_backflush_based_on("BOM") fg_item = make_item( @@ -760,9 +765,11 @@ class TestSubcontractingReceipt(FrappeTestCase): frappe.db.set_single_value( "Stock Settings", "auto_create_serial_and_batch_bundle_for_outward", 0 ) + frappe.db.set_single_value("Stock Settings", "use_serial_batch_fields", 1) def test_subcontracting_receipt_raw_material_rate(self): # Step - 1: Set Backflush Based On as "BOM" + frappe.db.set_single_value("Stock Settings", "use_serial_batch_fields", 0) set_backflush_based_on("BOM") # Step - 2: Create FG and RM Items @@ -820,6 +827,8 @@ class TestSubcontractingReceipt(FrappeTestCase): self.assertEqual(rm_item.rate, 100) self.assertEqual(rm_item.amount, rm_item.consumed_qty * rm_item.rate) + frappe.db.set_single_value("Stock Settings", "use_serial_batch_fields", 1) + def test_quality_inspection_for_subcontracting_receipt(self): from erpnext.stock.doctype.quality_inspection.test_quality_inspection import ( create_quality_inspection, From 996f7d30b9bd564725a22d465c66dc3a361f7bc0 Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Fri, 22 Mar 2024 21:08:11 +0530 Subject: [PATCH 82/90] chore: resolve conflict --- erpnext/patches.txt | 4 ---- 1 file changed, 4 deletions(-) diff --git a/erpnext/patches.txt b/erpnext/patches.txt index 4242e1bdae4..9fffbae4c8b 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -353,12 +353,8 @@ erpnext.patches.v14_0.update_zero_asset_quantity_field execute:frappe.db.set_single_value("Buying Settings", "project_update_frequency", "Each Transaction") erpnext.patches.v14_0.update_total_asset_cost_field erpnext.patches.v14_0.create_accounting_dimensions_in_reconciliation_tool -<<<<<<< HEAD erpnext.patches.v15_0.allow_on_submit_dimensions_for_repostable_doctypes -erpnext.patches.v14_0.update_flag_for_return_invoices -======= erpnext.patches.v14_0.update_flag_for_return_invoices #2024-03-22 ->>>>>>> a88bf8419e (refactor: reset flag for old records) # below migration patch should always run last erpnext.patches.v14_0.migrate_gl_to_payment_ledger erpnext.stock.doctype.delivery_note.patches.drop_unused_return_against_index # 2023-12-20 From a638c9c8afeacdc3ea54bca47c52100130aea962 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Sun, 24 Mar 2024 17:44:37 +0530 Subject: [PATCH 83/90] fix: Batch No is mandatory while making manufacture entry (cherry picked from commit 43fd60a8779a54124ec275c14eb120fa3ac44394) --- .../doctype/work_order/test_work_order.py | 46 +++++++++++++++++++ .../doctype/work_order/work_order.py | 17 +++++++ .../stock/doctype/stock_entry/stock_entry.js | 4 +- .../stock/doctype/stock_entry/stock_entry.py | 1 + 4 files changed, 67 insertions(+), 1 deletion(-) diff --git a/erpnext/manufacturing/doctype/work_order/test_work_order.py b/erpnext/manufacturing/doctype/work_order/test_work_order.py index 309408992d4..d4180a0eb1f 100644 --- a/erpnext/manufacturing/doctype/work_order/test_work_order.py +++ b/erpnext/manufacturing/doctype/work_order/test_work_order.py @@ -1207,6 +1207,51 @@ class TestWorkOrder(FrappeTestCase): except frappe.MandatoryError: self.fail("Batch generation causing failing in Work Order") + @change_settings("Manufacturing Settings", {"make_serial_no_batch_from_work_order": 1}) + def test_auto_serial_no_batch_creation(self): + from erpnext.manufacturing.doctype.bom.test_bom import create_nested_bom + + fg_item = frappe.generate_hash(length=20) + child_item = frappe.generate_hash(length=20) + + bom_tree = {fg_item: {child_item: {}}} + + create_nested_bom(bom_tree, prefix="") + + item = frappe.get_doc("Item", fg_item) + item.update( + { + "has_serial_no": 1, + "has_batch_no": 1, + "serial_no_series": f"SN-TEST-{item.name}.#####", + "create_new_batch": 1, + "batch_number_series": f"BATCH-TEST-{item.name}.#####", + } + ) + item.save() + + try: + wo_order = make_wo_order_test_record(item=fg_item, batch_size=5, qty=10, skip_transfer=True) + serial_nos = self.get_serial_nos_for_fg(wo_order.name) + + stock_entry = frappe.get_doc(make_stock_entry(wo_order.name, "Manufacture", 10)) + stock_entry.set_work_order_details() + stock_entry.set_serial_no_batch_for_finished_good() + for row in stock_entry.items: + if row.item_code == fg_item: + self.assertTrue(row.serial_and_batch_bundle) + self.assertEqual( + sorted(get_serial_nos_from_bundle(row.serial_and_batch_bundle)), sorted(serial_nos) + ) + + sn_doc = frappe.get_doc("Serial and Batch Bundle", row.serial_and_batch_bundle) + for row in sn_doc.entries: + self.assertTrue(row.serial_no) + self.assertTrue(row.batch_no) + + except frappe.MandatoryError: + self.fail("Batch generation causing failing in Work Order") + def get_serial_nos_for_fg(self, work_order): serial_nos = [] for row in frappe.get_all("Serial No", filters={"work_order": work_order}): @@ -2269,6 +2314,7 @@ def make_wo_order_test_record(**args): wo_order.planned_start_date = args.planned_start_date or now() wo_order.transfer_material_against = args.transfer_material_against or "Work Order" wo_order.from_wip_warehouse = args.from_wip_warehouse or 0 + wo_order.batch_size = args.batch_size or 0 if args.source_warehouse: for item in wo_order.get("required_items"): diff --git a/erpnext/manufacturing/doctype/work_order/work_order.py b/erpnext/manufacturing/doctype/work_order/work_order.py index 024a631ab11..e4d09bd42b8 100644 --- a/erpnext/manufacturing/doctype/work_order/work_order.py +++ b/erpnext/manufacturing/doctype/work_order/work_order.py @@ -536,6 +536,12 @@ class WorkOrder(Document): "Item", self.production_item, ["serial_no_series", "item_name", "description"], as_dict=1 ) + batches = [] + if self.has_batch_no: + batches = frappe.get_all( + "Batch", filters={"reference_name": self.name}, order_by="creation", pluck="name" + ) + serial_nos = [] if item_details.serial_no_series: serial_nos = get_available_serial_nos(item_details.serial_no_series, self.qty) @@ -556,10 +562,20 @@ class WorkOrder(Document): "description", "status", "work_order", + "batch_no", ] serial_nos_details = [] + index = 0 for serial_no in serial_nos: + index += 1 + batch_no = None + if batches and self.batch_size: + batch_no = batches[0] + + if index % self.batch_size == 0: + batches.remove(batch_no) + serial_nos_details.append( ( serial_no, @@ -574,6 +590,7 @@ class WorkOrder(Document): item_details.description, "Inactive", self.name, + batch_no, ) ) diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.js b/erpnext/stock/doctype/stock_entry/stock_entry.js index ac2fe5814d3..96a92096437 100644 --- a/erpnext/stock/doctype/stock_entry/stock_entry.js +++ b/erpnext/stock/doctype/stock_entry/stock_entry.js @@ -1081,7 +1081,9 @@ erpnext.stock.StockEntry = class StockEntry extends erpnext.stock.StockControlle cint(frappe.user_defaults?.use_serial_batch_fields) === 1 ) { this.frm.doc.items.forEach((item) => { - frappe.model.set_value(item.doctype, item.name, "use_serial_batch_fields", 1); + if (!item.serial_and_batch_bundle) { + frappe.model.set_value(item.doctype, item.name, "use_serial_batch_fields", 1); + } }); } } diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.py b/erpnext/stock/doctype/stock_entry/stock_entry.py index e4c9ded2cc4..e6214290fda 100644 --- a/erpnext/stock/doctype/stock_entry/stock_entry.py +++ b/erpnext/stock/doctype/stock_entry/stock_entry.py @@ -2536,6 +2536,7 @@ class StockEntry(StockController): ) d.serial_and_batch_bundle = id + d.use_serial_batch_fields = 0 def get_available_serial_nos(self) -> List[str]: serial_nos = [] From f08715972abdf2ba4b72fd5d8de2f48fff209f50 Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Sun, 24 Mar 2024 19:02:38 +0530 Subject: [PATCH 84/90] fix: Add default finance book check in P&L statement (cherry picked from commit 5be3417fdf09327f9ce2e5b5cff1928a96c0c07b) --- .../profit_and_loss_statement/profit_and_loss_statement.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/erpnext/accounts/report/profit_and_loss_statement/profit_and_loss_statement.js b/erpnext/accounts/report/profit_and_loss_statement/profit_and_loss_statement.js index 2ffd3b310f9..98c6656ca3f 100644 --- a/erpnext/accounts/report/profit_and_loss_statement/profit_and_loss_statement.js +++ b/erpnext/accounts/report/profit_and_loss_statement/profit_and_loss_statement.js @@ -24,3 +24,10 @@ frappe.query_reports["Profit and Loss Statement"]["filters"].push({ fieldtype: "Check", default: 1, }); + +frappe.query_reports["Profit and Loss Statement"]["filters"].push({ + fieldname: "include_default_book_entries", + label: __("Include Default FB Entries"), + fieldtype: "Check", + default: 1, +}); From 17a087663bfcefbc491963d031ec78b72905a144 Mon Sep 17 00:00:00 2001 From: SelenSoft <161182841+selensoftr@users.noreply.github.com> Date: Tue, 26 Mar 2024 01:27:51 +0300 Subject: [PATCH 85/90] fix: Turkish translations (#40650) Co-authored-by: barredterra <14891507+barredterra@users.noreply.github.com> --- erpnext/translations/tr.csv | 2226 ++++++++++++++++++++++------------- 1 file changed, 1427 insertions(+), 799 deletions(-) diff --git a/erpnext/translations/tr.csv b/erpnext/translations/tr.csv index c908d878a0a..0f10aa59cf1 100644 --- a/erpnext/translations/tr.csv +++ b/erpnext/translations/tr.csv @@ -72,7 +72,7 @@ Accounting,Muhasebe, Accounting Entry for Asset,Varlık Muhasebe Kaydı, Accounting Entry for Stock,Stok Muhasebe Kaydı, Accounting Entry for {0}: {1} can only be made in currency: {2},{1} sadece para için yapılabilir: {0} Muhasebe Kayıt {2}, -Accounting Ledger,muhasebe defteri, +Accounting Ledger,Muhasebe Defteri, Accounting journal entries.,Muhasebe yevmiye kayıtları., Accounts,Hesaplar, Accounts Manager,Hesap Yöneticisi, @@ -123,7 +123,7 @@ Add Timeslots,Zaman Dilimi Ekle, Add Users to Marketplace,Kullanıcıları Pazaryerine Ekle, Add a new address,yeni bir adres ekleyin, Add cards or custom sections on homepage,Ana sayfaya kart veya özel bölüm ekleme, -Add more items or open full form,Daha fazla ürün ekle veya Tam formu aç, +Add more items or open full form,Daha fazla ürün ekle veya Tüm Formu aç, Add notes,Not Ekle, Add the rest of your organization as your users. You can also add invite Customers to your portal by adding them from Contacts,"Kuruluşunuzun geri kalanını kullanıcı olarak ekleyin. Ayrıca, müşterileri portalınıza ilave ederek, bunları kişilerden ekleyerek de ekleyebilirsiniz.", Add/Remove Recipients,Alıcıları Ekle/Kaldır, @@ -186,7 +186,7 @@ All communications including and above this shall be moved into the new Issue,"B All items have already been transferred for this Work Order.,Bu İş Emri için tüm öğeler zaten aktarıldı., All other ITC,Diğer Tüm ITC, All the mandatory Task for employee creation hasn't been done yet.,Çalışan yaratmak için tüm zorunlu görev henüz yapılmamış., -Allocate Payment Amount,Ödeme Tutarı ayır, +Allocate Payment Amount,Ödeme Tutarı Ayır, Allocated Amount,Ayrılan Tutar, Allocating leaves...,İzinler tahsis ediliyor ..., Already record exists for the item {0},Zaten {0} öğesi için kayıt var, @@ -226,8 +226,8 @@ Appointment Confirmation,Randevu onayı, Appointment Duration (mins),Randevu Süresi (dk.), Appointment Type,Randevu Türü, Appointment {0} and Sales Invoice {1} cancelled,Randevu {0} ve Satış Faturası {1} iptal edildi, -Appointments and Encounters,Randevular ve Karşılaşmalar, -Appointments and Patient Encounters,Randevular ve Hasta Buluşmaları, +Appointments and Encounters,Randevular ve Muayeneleri, +Appointments and Patient Encounters,Randevular ve Hasta Muayeneleri, Appraisal {0} created for Employee {1} in the given date range,Verilen aralıkta çalışan {1} için çalıştırılan değerlendirme {0}, Approving Role cannot be same as role the rule is Applicable To,Onaylayan Rol kuralın geçerli olduğu rolle aynı olamaz, Approving User cannot be same as user the rule is Applicable To,Onaylayan Kullanıcı kuralın Uygulandığı Kullanıcı ile aynı olamaz, @@ -263,7 +263,7 @@ Asset scrapped via Journal Entry {0},"Varlık, Yevmiye Kaydı {0} ile hurda edil "Asset {0} cannot be scrapped, as it is already {1}","{0} varlığı hurda edilemez, {1} da var olarak gözüküyor", Asset {0} does not belong to company {1},"Varlık {0}, {1} firmasına ait değil", Asset {0} must be submitted,{0} ın varlığı onaylanmalı, -Assets,Varlıklar, +Assets,Aktifler, Assign To,Ata, Associate,Ortak, At least one mode of payment is required for POS invoice.,Ödeme en az bir mod POS fatura için gereklidir., @@ -271,10 +271,10 @@ Atleast one item should be entered with negative quantity in return document,En Atleast one of the Selling or Buying must be selected,Satış veya Alıştan en az biri seçilmelidir, Atleast one warehouse is mandatory,En az bir depo zorunludur, Attach Logo,Logo Ekle, -Attachment,Ek dosya, -Attachments,Ek dosyalar, +Attachment,Belge Eki, +Attachments,Belge Ekleri, Attendance can not be marked for future dates,İlerideki tarihler için katılım işaretlenemez, -Attendance date can not be less than employee's joining date,Seyirci tarih çalışanın katılmadan tarihten daha az olamaz, +Attendance date can not be less than employee's joining date,Katılım tarihi çalışanın işe giriş tarihinden önce olamaz, Attendance for employee {0} is already marked,Çalışan {0} için devam zaten işaretlenmiştir, Attendance has been marked successfully.,Mevcudiyet başarıyla işaretlendi, Attendance not submitted for {0} as {1} on leave.,"Katılım, {0} için ayrılmadan önce {1} olarak gönderilmedi.", @@ -381,7 +381,7 @@ Budget cannot be assigned against Group Account {0},Bütçe Grubu Hesabı karş Buildings,Binalar, Bundle items at time of sale.,Satış zamanı toplam Ürünler., Business Development Manager,İş Geliştirme Yöneticisi, -Buy,Satın al, +Buy,Alış, Buying,Satınalma, Buying Amount,Alış Tutarı, Buying Price List,Alış Fiyat Listesi, @@ -401,7 +401,7 @@ Campaign,Kampanya, Can be approved by {0},{0} tarafından onaylandı, "Can not filter based on Account, if grouped by Account","Hesap, olarak gruplandırıldı ise Hesaba tabanlı yönetim yönetimi", "Can not filter based on Voucher No, if grouped by Voucher","Dekont, olarak gruplandırıldıysa, Makbuz numarasına dayalı yönetim yönetimi", -"Can not mark Inpatient Record Discharged, there are Unbilled Invoices {0}","Yatan Kayıt Deşarjı işaretlenemiyor, Faturalandırılmamış Faturalar var {0}", +"Can not mark Inpatient Record Discharged, there are Unbilled Invoices {0}","Yatan Hasta Kaydı Taburcu Edildi olarak işaretlenemiyor, Faturalanmamış Faturalar Var {0}", Can only make payment against unbilled {0},Sadece karşı ödeme yapamazsınız faturalanmamış {0}, Can refer row only if the charge type is 'On Previous Row Amount' or 'Previous Row Total',Eğer ücret tipi 'Önceki Satır Tutarında' veya 'Önceki Satır Toplamı' ise referans verebilir, "Can't change valuation method, as there are transactions against some items which does not have it's own valuation method",Kendi değerleme yöntemine sahip olmayan bazı ürünlere karşı işlemler olduğu için değerleme kullanımı değiştiremezsiniz, @@ -431,7 +431,7 @@ Cannot deactivate or cancel BOM as it is linked with other BOMs,Devre dışı hi "Cannot declare as lost, because Quotation has been made.",Kayıp olarak Kotasyon yapıldığı için ilan edilemez., Cannot deduct when category is for 'Valuation' or 'Valuation and Total',Kategori 'Değerleme' veya 'Toplam ve Değerleme' olduğu zaman çıkarılamaz, Cannot deduct when category is for 'Valuation' or 'Vaulation and Total',Kategori 'Değerleme' veya 'Değerlendirme ve Toplam' için olduğunda düşülemez, -"Cannot delete Serial No {0}, as it is used in stock transactions","Silinemiyor Seri No {0}, hisse senedi işlemleri kullanılıyor gibi", +"Cannot delete Serial No {0}, as it is used in stock transactions","{0} Seri Numarası stok işlemlerinde kullanıldığından silinemiyor", Cannot enroll more than {0} students for this student group.,Bu öğrenci grubu için {0} gelen göre daha fazla kayıt olamaz., Cannot produce more Item {0} than Sales Order quantity {1},Satış Sipariş Miktarı {1} den fazla Ürün {0} üretilemez, Cannot promote Employee with status Left,Çalışan durumu sata tanıtılamaz, @@ -452,9 +452,9 @@ Cart,Araba, Cart is Empty,Sepet boş, Case No(s) already in use. Try from Case No {0},Konu Numarası/numaraları zaten kullanımda. Konu No {0} olarak deneyin., Cash,Nakit, -Cash Flow Statement,Nakit Akım Tablosu, -Cash Flow from Financing,Finansman Nakit Akışı, -Cash Flow from Investing,Yatırım Nakit Akışı, +Cash Flow Statement,Nakit Akış Tablosu, +Cash Flow from Financing,Finansmandan Nakit Akışı, +Cash Flow from Investing,Yatırımdan Nakit Akışı, Cash Flow from Operations,Faaliyetlerden Nakit Akışı, Cash In Hand,Eldeki Nakit, Cash or Bank Account is mandatory for making payment entry,Kasa veya Banka Hesabı ödeme kaydı yapmak için zorunludur, @@ -493,18 +493,18 @@ City/Town,İl / İlçe, Clay,Kil, Clear filters,Filtreleri temizle, Clear values,Değerleri temizle, -Clearance Date,Gümrükleme Tarih, -Clearance Date not mentioned,Gümrükleme Tarih belirtilmeyen, -Clearance Date updated,Gümrükleme Tarihi güncellendi, +Clearance Date,Ödeme Tarihi, +Clearance Date not mentioned,Ödeme Tarihi belirtilmedi, +Clearance Date updated,Ödeme Tarihi güncellendi, Client,Client, Client ID,Client ID, Client Secret,Client Secret, -Clinical Procedure,Klinik Prosedür, +Clinical Procedure,Klinik Prosedürü, Clinical Procedure Template,Klinik Prosedür Şablonu, Close Balance Sheet and book Profit or Loss.,Bilançoyu Kapat ve Kar veya Zararı ayır., Close Loan,Krediyi Kapat, Close the POS,POSu kapat, -Closed,Kapalı, +Closed,Kapandı, Closed order cannot be cancelled. Unclose to cancel.,Kapalı sipariş iptal edilemez. İptal etmek için açın., Closing (Cr),Kapanış (Alacak), Closing (Dr),Kapanış (Borç), @@ -544,16 +544,16 @@ Connect Shopify with ERPNext,ERPNext ile Shopify'ı bağlayın, Connect to Quickbooks,Quickbooks'a bağlan, Connected to QuickBooks,QuickBooks’a bağlandı, Connecting to QuickBooks,QuickBooks'a Bağlanma, -Consultation,İstişare, -Consultations,İstişareler, +Consultation,Konsültasyon, +Consultations,Konsültasyonlar, Consulting,Danışmanlık, -Consumable,Tüketilir, +Consumable,Tüketilelir, Consumed,Tüketilen, Consumed Amount,Tüketilen Tutar, Consumed Qty,Tüketilen Miktar, Consumer Products,Tüketici Ürünleri, -Contact,İlgili Kişiler, -Contact Us,Bize ulaşın, +Contact,Kişi, +Contact Us,Bize Ulaşın, Content,İçerik, Content Masters,İçerik Masters, Content Type,İçerik Türü, @@ -575,7 +575,7 @@ Cost Center with existing transactions can not be converted to group,Mevcut işl Cost Center with existing transactions can not be converted to ledger,Mevcut işlemleri olan Masraf Merkezi gruba çevrilemez, Cost Centers,Maliyet Merkezleri, Cost Updated,Maliyet Güncellendi, -Cost as on,olarak Maliyet, +Cost as on,Maliyet şu şekilde, Cost of Delivered Items,Teslim edilen Ürün Maliyeti, Cost of Goods Sold,Satılan Malın Maliyeti, Cost of Issued Items,Verilen Ürün Maliyeti, @@ -590,12 +590,12 @@ Could not retrieve information for {0}.,{0} için bilgi alınamadı., Could not solve criteria score function for {0}. Make sure the formula is valid.,{0} için ölçüt puanı işlevi çözülemedi. Formülün mevcut olduğundan emin olun., Could not solve weighted score function. Make sure the formula is valid.,Ağırlıklı skorları çözemedim. Formülün mevcut olduğundan emin olun., Could not submit some Salary Slips,Bazı Maaş Balıkları gönderilemedi, -"Could not update stock, invoice contains drop shipping item.","Stok güncellemesi yapılamaz, faturanın damla nakliye öğesini içerir.", +"Could not update stock, invoice contains drop shipping item.","Stok güncellemesi yapılamaz, faturanın damla sevkiyat öğesini içerir.", Country wise default Address Templates,Ülke bilgisi varsayılan adres şablonları, Course Code: ,Kurs Kodu: , Course Enrollment {0} does not exists,{0} ders kaydı mevcut değil, Course Schedule,Kurs Programı, -Course: ,Ders: , +Course: ,Kurs: , Cr,Alacak, Create,Oluştur, Create BOM,Malzeme Listesi Oluştur, @@ -672,41 +672,41 @@ Current Assets,Mevcut Varlıklar, Current BOM and New BOM can not be same,Cari BOM ve Yeni BOM aynı olamaz, Current Liabilities,Cari Borçlar/Pasif, Current Qty,Güncel Mik, -Current invoice {0} is missing,Şu fatura {0} eksik, +Current invoice {0} is missing,Geçerli fatura {0} eksik, Custom HTML,Özel HTML, -Custom?,Özel mi?, +Custom?,Özel, Customer,Müşteri, Customer Addresses And Contacts,Müşteri Adresleri ve İrtibatları, Customer Contact,Müşteri İrtibatı, Customer Database.,Müşteri Veritabanı., Customer Group,Müşteri Grubu, -Customer LPO,Müşteri LPO'sı, +Customer LPO,Müşteri LPO, Customer LPO No.,Müşteri LPO No., Customer Name,Müşteri Adı, Customer POS Id,Müşteri POS Kimliği, Customer Service,Müşteri Hizmetleri, -Customer and Supplier,Müşteri ve tedarikçi, -Customer is required,Müşteri dahil, +Customer and Supplier,Müşteri ve Tedarikçi, +Customer is required,Müşteri gerekli, Customer isn't enrolled in any Loyalty Program,Müşteri kaydı bir Sadakat Programına kayıtlı değil, Customer required for 'Customerwise Discount','Müşteri indirimi' için olması gereken müşteri, Customer {0} does not belong to project {1},Müşteri {0} projeye ait değil {1}, Customer {0} is created.,Müşteri {0} kaydedildi., -Customers in Queue,Kuyruk Müşterileri, +Customers in Queue,Kuyruktaki Müşteriler, Customize Homepage Sections,Ana Sayfa Bölümlerini Özelleştir, -Customizing Forms,Özelleştirme Formları, +Customizing Forms,Formları Özelleştirme, Daily Project Summary for {0},{0} Günlük Proje Özeti, Daily Reminders,Günlük Hatırlatmalar, Data Import and Export,İçeri/Dışarı Aktar, -Data Import and Settings,Veri Alma ve Ayarlar, -Database of potential customers.,Potansiyel depolama birimleri., +Data Import and Settings,Veri Aktarımı ve Ayarları, +Database of potential customers.,Potansiyel müşterinin veritabanı., Date Format,Tarih Biçimi, Date Of Retirement must be greater than Date of Joining,Emeklilik Tarihi ulaşım hatları büyük olmalıdır, Date of Birth,Doğum Tarihi, Date of Birth cannot be greater than today.,Tarihi doğum gerçeklerinden daha büyük olamaz., Date of Commencement should be greater than Date of Incorporation,Başlangıç tarihi kuruluşunun daha büyük olması gerekir., -Date of Joining,Katılma Tarihi, +Date of Joining,Katılım Tarihi, Date of Joining must be greater than Date of Birth,Katılım Tarihi Doğum Tarihinden büyük olmalıdır, -Date of Transaction,işlem tarihi, +Date of Transaction,İşlem tarihi, Day,Gün, Debit,Borç, Debit ({0}),Borç ({0}), @@ -719,18 +719,18 @@ Debit and Credit not equal for {0} #{1}. Difference is {2}.,Borç ve Kredi {0} # Debtors,Borçlular, Debtors ({0}),Borçlular ({0}), Declare Lost,Kayıp Beyanı, -Default Activity Cost exists for Activity Type - {0},Standart Etkinliği Maliyet Faaliyet Türü için var - {0}, -Default BOM ({0}) must be active for this item or its template,Standart BOM ({0}) Bu öğe veya şablon için aktif olmalıdır, +Default Activity Cost exists for Activity Type - {0},Varsayılan Etkinliği Maliyet Faaliyet Türü için var - {0}, +Default BOM ({0}) must be active for this item or its template,Varsayılan BOM ({0}) Bu öğe veya şablon için aktif olmalıdır, Default BOM for {0} not found,{0} bulunamadı için varsayılan BOM, Default BOM not found for Item {0} and Project {1},Öğe {0} ve Proje {1} için varsayılan BOM bulunamadı, -Default Letter Head,Mektubu Başkanı Standart, +Default Letter Head,Varsayılan Antetli Kağıt, Default Tax Template,Varsayılan Vergi Şablonu, Default Unit of Measure for Item {0} cannot be changed directly because you have already made some transaction(s) with another UOM. You will need to create a new Item to use a different Default UOM.,Zaten başka Ölçü Birimi bazı işlem (ler) yapıldığı için Öğe için Ölçü Varsayılan Birim {0} doğrudan değiştirilemez. Farklı Standart Ölçü Birimi kullanmak için yeni bir öğe oluşturmanız gerekir., Default Unit of Measure for Variant '{0}' must be same as in Template '{1}',Varyant için Ölçü Varsayılan Birim '{0}' Şablon aynı olmalıdır '{1}', Default settings for buying transactions.,Alış İşlemleri için varsayılan ayarlar., Default settings for selling transactions.,Satış İşlemleri için varsayılan ayarlar., Default tax templates for sales and purchase are created.,Satışlar ve satınalma alımları için varsayılan vergi şablonları ayrılır., -Defaults,Standart Değerler, +Defaults,Varsayılan Değerler, Defense,Savunma, Define Project type.,Proje çıkarmayı tanımlayın., Define budget for a financial year.,Bir mali yıl için bütçeyi tanımlayın., @@ -752,7 +752,7 @@ Delivery Notes {0} must be cancelled before cancelling this Sales Order,Satış Delivery Notes {0} updated,{0} Satış İrsaliyesi güncellendi, Delivery Status,Teslimat Durumu, Delivery Trip,Teslimat Yolculuğu, -Delivery warehouse required for stock item {0},Teslim depo stok kalemi için gerekli {0}, +Delivery warehouse required for stock item {0},{0} stok kalemi için teslimat deposu gerekli, Department,Departman, Department Stores,Departman Mağazaları, Depreciation,Amortisman, @@ -771,7 +771,7 @@ Detailed Reason,Ayrıntılı Sebep, Details,Ayrıntılar, Details of Outward Supplies and inward supplies liable to reverse charge,Dışa Sarf Malzemelerinin ve geri beslemeden sorumlu olan iç sarf malzemelerinin ayrıntıları, Details of the operations carried out.,Operasyonların detayları gerçekleştirdi., -Diagnosis,tanı, +Diagnosis,Teşhis, Did not find any item called {0},{0} bilgisayarı bulunamadı, Diff Qty,Fark Miktarı, Difference Account,Fark Hesabı, @@ -785,8 +785,8 @@ Disable,Devre Dışı Bırak, Disabled template must not be default template,Engelli kalıpları varsayılan kalıpları, Disburse Loan,Kredi Kredisi, Disbursed,Önceki dönemlerde toplananlar, -Disc,Disk, -Discharge,Deşarj, +Disc,İnd., +Discharge,Tediye, Discount,İndirim, Discount Percentage can be applied either against a Price List or for all Price List.,İndirim Yüzdesi bir Fiyat veya bütün fiyat listelerine karşı uygulanabilir., Discount must be less than 100,İndirim 100'den az olmalı, @@ -868,7 +868,7 @@ Employee {0} of grade {1} have no default leave policy,{1} notunun {0} çalışa Enable / disable currencies.,/ Para birimlerini etkinleştirir/devre dışı bırakır., Enabled,Etkin, "Enabling 'Use for Shopping Cart', as Shopping Cart is enabled and there should be at least one Tax Rule for Shopping Cart","Etkinleştirme Alışveriş Sepeti etkin olarak, 'Alışveriş Sepeti için kullan' ve Alışveriş Sepeti için en az bir vergi Kural olmalıdır", -End Date,Bitiş tarihi, +End Date,Bitiş Tarihi, End Date can not be less than Start Date,"Bitiş Tarihi, Başlangıç Tarihinden az olamaz", End Date cannot be before Start Date.,"Bitiş Tarihi, Başlangıç Tarihi'nden önce olamaz.", End Year,bitiş yılı, @@ -876,11 +876,11 @@ End Year cannot be before Start Year,Yıl Sonu Başlangıç Yıl önce olamaz, End on,Bitiş tarihi, Ends On date cannot be before Next Contact Date.,"Bitiş Tarihi, Sonraki İletişim Tarihi'nden önce olamaz.", Energy,Enerji, -Engineer,mühendis, +Engineer,Mühendis, Enough Parts to Build,Yeter Parçaları İnşa, -Enroll,ayrılmak, -Enrolling student,kayıtlıunan öğrenci, -Enrolling students,öğrencileri kaydetme, +Enroll,Kaydol, +Enrolling student,Kaydolan Öğrenci, +Enrolling students,Öğrencileri Kaydetme, Enter depreciation details,Amortisman bilgileri girin, Enter the Bank Guarantee Number before submittting.,Göndermeden önce Banka Garanti Numarasını girin., Enter the name of the Beneficiary before submittting.,Gönderilmeden önce Faydalanıcının adını girin., @@ -899,7 +899,7 @@ Exchange Gain/Loss,Kambiyo Kâr / Zarar, Exchange Rate Revaluation master.,Döviz Kuru Yeniden Değerleme ana., Exchange Rate must be same as {0} {1} ({2}),Döviz Kuru aynı olmalıdır {0} {1} ({2}), Excise Invoice,Tüketim Fatura, -Execution,Yerine Geliştirme, +Execution,Uygulama, Executive Search,Arama Yürütücü, Expand All,Tümünü Genişlet, Expected Delivery Date,Beklenen Teslim Tarihi, @@ -908,29 +908,29 @@ Expected End Date,Beklenen Bitiş Tarihi, Expected Hrs,Beklenen Saat, Expected Start Date,Beklenen Başlangıç Tarihi, Expense,Gider, -Expense / Difference account ({0}) must be a 'Profit or Loss' account,"Gider / Fark hesabı({0}), bir 'Kar veya Zarar' hesabı olmalıdır", -Expense Account,Gider Hesabı, -Expense Claim,Gider Talebi, -Expense Claims,Gider İddiaları, +Expense / Difference account ({0}) must be a 'Profit or Loss' account,"Masraf / Fark hesabı({0}), bir 'Kar veya Zarar' hesabı olmalıdır", +Expense Account,Masraf Hesabı, +Expense Claim,Masraf Talebi, +Expense Claims,Masraf Talepleri, Expense account is mandatory for item {0},Ürün {0} için gider hesabının yükümlüleri, Expenses,Giderler, Expenses Included In Asset Valuation,Varlık Değerlemesine Dahil Olan Giderler, -Expenses Included In Valuation,Değerlemeye dahil giderler, +Expenses Included In Valuation,Değerlemeye Dahil Edilen Giderler, Expired Batches,Süresi biten Toplu İşler, Expires On,Tarihinde sona eriyor, -Expiring On,süresi doldu, +Expiring On,Sona Erme Tarihi, Expiry (In Days),(Gün) Son Kullanım, Explore,Keşfet!, Export E-Invoices,E-Faturaları Dışa Aktar, -Extra Large,ekstra büyük, +Extra Large,Ekstra büyük, Extra Small,Çok küçük, Fail,Başarısız, Failed,Başarısız, -Failed to create website,Web sitesi oluşturulamadı, -Failed to install presets,Önayarlar yüklenemedi, -Failed to login,giriş yapılamadı, -Failed to setup company,kurulum şirketi başarısız oldu, -Failed to setup defaults,varsayılanlar ayarlanamadı, +Failed to create website,Websitesi oluşturulamadı, +Failed to install presets,Ön ayarlar yüklenemedi, +Failed to login,Giriş yapılamadı, +Failed to setup company,Şirket kurulumu başarısız oldu, +Failed to setup defaults,Varsayılanlar ayarlanamadı, Failed to setup post company fixtures,Şirket armatürleri ayarlanamadı, Fax,Fax, Fee,Ücret, @@ -938,7 +938,7 @@ Fee Created,Ücretlendirildi, Fee Creation Failed,Ücret Oluşturma Başarısız Oldu, Fee Creation Pending,Ücret Oluşturma Bekliyor, Fee Records Created - {0},Ücret Kayıtları düzenlendi - {0}, -Feedback,Geri bildirim, +Feedback,Geri Bildirim, Fees,Harçlar, Female,Kadın, Fetch Data,Veriyi getir, @@ -1020,9 +1020,9 @@ From Time cannot be greater than To Time.,Zaman zaman daha büyük olamaz., From and To dates required,tarih aralığı gerekli, From value must be less than to value in row {0},"Değerden, {0} bilgisindeki değerden az olmalıdır", From {0} | {1} {2},Gönderen {0} | {1} {2}, -Fulfillment,yerine getirme, +Fulfillment,Yerine Getirme, Full Name,Tam Adı, -Fully Depreciated,Değer kaybı, +Fully Depreciated,Tamamen Amortismanlı, Furnitures and Fixtures,Döşeme ve demirbaşlar, "Further accounts can be made under Groups, but entries can be made against non-Groups","Ek hesaplar Gruplar altında yapılabilir, ancak girişler olmayan Gruplar karşı yapılabilir", Further cost centers can be made under Groups but entries can be made against non-Groups,"Daha fazla masraf Gruplar altında yapılabilir, ancak girişleri olmayan Gruplar karşı yapılabilir", @@ -1032,7 +1032,7 @@ GSTR3B-Form,GSTR3B-Formu, Gain/Loss on Asset Disposal,Varlık Bertaraf Kâr / Zarar, Gantt Chart,Gantt şeması, Gantt chart of all tasks.,Bütün görevlerinin Gantt Şeması., -Gender,Cinsiyet, +Gender,Cinsiyeti, General,Genel, General Ledger,Genel Muhasebe, Generate Material Requests (MRP) and Work Orders.,Malzeme Talepleri (MRP) ve İş Emirleri Oluşturun., @@ -1048,29 +1048,29 @@ Get Suppliers,Tedarikçileri Getir, Get Suppliers By,Tedarikçiye göre Getir, Get Updates,Güncellemeler Al, Get customers from,Müşterileri şu adresten Getir:, -Get from Patient Encounter,Hasta Envanterinden Getir, +Get from Patient Encounter,Hasta Muayenesinden Getir, Getting Started,Başlarken, GitHub Sync ID,GitHub Senkronizasyon Kimliği, -Global settings for all manufacturing processes.,Tüm üretim süreçleri için genel ayarlar., +Global settings for all manufacturing processes.,Tüm Üretim Süreçleri için genel ayarlar., Go to the Desktop and start using ERPNext,Masaüstüne gidip ERPNext'i kullanmaya başlayabilirsiniz, GoCardless SEPA Mandate,GoCardless SEPA Yetkisi, GoCardless payment gateway settings,GoCardless ödeme ağ özellikleri ayarları, -Goal and Procedure,Hedef ve çember, -Goals cannot be empty,Hedefleri boş olamaz, +Goal and Procedure,Hedef ve Prosedür, +Goals cannot be empty,Hedefler boş olamaz, Goods In Transit,Transit Ürünler, Goods Transferred,Edilen Mallar'ı transfer et, Goods and Services Tax (GST India),Mal ve Hizmet Vergisi (GST Hindistan), Goods are already received against the outward entry {0},{0} dış girişine karşı ürünler zaten alınmış, -Government,Devlet, +Government,Kamu / Devlet, Grand Total,Genel Toplam, Grant,İzin ver, Grant Application,Uygulamaya izin ver, -Grant Leaves,İzin ver, +Grant Leaves,İzinlere izin ver, Grant information.,Bilgi ver., Grocery,Bakkal, -Gross Profit,Brüt Kar, -Gross Profit %,Brüt Kar %, -Gross Profit / Loss,Brüt Kar / Zarar, +Gross Profit,Brüt Kâr, +Gross Profit %,Brüt Kâr %, +Gross Profit / Loss,Brüt Kâr / Zarar, Gross Purchase Amount,Brüt Alış Tutarı, Gross Purchase Amount is mandatory,Brüt Alış Tutarı zorunludur, Group by Account,Hesaba göre Gruplandır, @@ -1097,9 +1097,9 @@ Head of Marketing and Sales,Satış ve Pazarlama Müdürü, Health Care,Sağlık Hizmeti, Healthcare,Sağlık Hizmeti, Healthcare (beta),Sağlık (beta), -Healthcare Practitioner,Sağlık Uygulayıcısı, -Healthcare Practitioner not available on {0},Sağlık Uygulanıcısı {0} tarihinde mevcut değil, -Healthcare Practitioner {0} not available on {1},{1} üzerinde Sağlık Uygulayıcısı {0} mevcut değil, +Healthcare Practitioner,Sağlık Personeli, +Healthcare Practitioner not available on {0},Sağlık Personeli {0} tarihinde mevcut değil, +Healthcare Practitioner {0} not available on {1},{1} üzerinde Sağlık Personeli {0} mevcut değil, Healthcare Service Unit,Sağlık Hizmet Birimi, Healthcare Service Unit Tree,Sağlık birim ağacı hizmeti, Healthcare Service Unit Type,Sağlık Hizmeti Birim Türü, @@ -1151,7 +1151,7 @@ In Stock Qty,Stok Miktarı, In Stock: ,Stokta var: , In Value,Giriş Maliyeti, "In the case of multi-tier program, Customers will be auto assigned to the concerned tier as per their spent","Çok katmanlı program söz konusu olduğunda, Müşteriler harcanan esasa göre ilgili kademeye otomatik olarak atanacaktır.", -Inactive,etkisiz, +Inactive,Pasif, Incentives,Teşvikler, Include Default FB Entries,Varsayılan Defter Girişlerini Dahil et, Include Exploded Items,Patlatılmış Öğeleri Dahil et, @@ -1185,7 +1185,7 @@ Integrated Tax,Entegre Vergi, Inter-State Supplies,Ülkeler arası Tedarik, Internet Publishing,İnternet Yayıncılığı, Intra-State Supplies,Devlet İçi Malzemeler, -Introduction,Giriş, +Introduction,Tanıtım/Giriş, Invalid Attribute,Geçersiz Özellik, Invalid Blanket Order for the selected Customer and Item,Seçilen Müşteri ve Ürün için Geçersiz Açık Sipariş, Invalid Company for Inter Company Transaction.,Şirketler Arası İşlem için Geçersiz Şirket., @@ -1205,7 +1205,7 @@ Investments,Yatırımlar, Invoice,Fatura, Invoice Created,Oluşturulan Fatura, Invoice Discounting,Fatura İndirimi, -Invoice Patient Registration,Fatura Hasta Kayıt, +Invoice Patient Registration,Fatura Hasta Kaydı, Invoice Posting Date,Fatura Gönderme Tarihi, Invoice Type,Fatura Türü, Invoice already created for all billing hours,"Fatura, tüm faturalandırma saatleri için zaten oluşturuldu", @@ -1259,7 +1259,7 @@ Item variant {0} exists with same attributes,Ürün çeşidi {0} aynı büyümey Item {0} does not exist,Ürün {0} yok, Item {0} does not exist in the system or has expired,Ürün {0} sistemi yoktur veya süresi dolmuştur, Item {0} has already been returned,Ürün {0} zaten iade edilmiş, -Item {0} has been disabled,{0} devredışı bırakılmış, +Item {0} has been disabled,{0} Devre dışı bırakılmış, Item {0} has reached its end of life on {1},Ürün {0} {1}de kullanım süresinin sonuna gelmiştir., Item {0} ignored since it is not a stock item,Stok ürün arızası Ürün {0} yok sayıldı, "Item {0} is a template, please select one of its variants","{0} Öğe bir şablon, türevleri birini seçiniz", @@ -1313,7 +1313,7 @@ Latest,Son, Latest price updated in all BOMs,Tüm BOM'larda güncellenen son fiyat, Lead,Müşteri Adayı, Lead Count,Müşteri Adayı Sayısı, -Lead Owner,Müşteri Adayı Sahibi, +Lead Owner,Aday Sahibi, Lead Owner cannot be same as the Lead,Müşteri Aday Kaydı Sahibi Müşteri Adayı olamaz, Lead Time Days,Teslim zamanı Günü, Lead to Quotation,Müşteri Adayından Teklif Oluştur, @@ -1333,12 +1333,12 @@ Level,Seviye, Liability,Borç, Limit Crossed,Limit Çapraz, Link to Material Request,Malzeme Talebi Bağlantısı, -List of all share transactions,Tüm hisse senedi işlemlerinin listesi, +List of all share transactions,Tüm hisse işlemlerinin listesi, List of available Shareholders with folio numbers,Folio numaraları ile mevcut Hissedarların listesi, Loading Payment System,Ödeme Sistemi Yükleniyor, Loan,Kredi, Loan Start Date and Loan Period are mandatory to save the Invoice Discounting,Fatura İndirimi’nin kaydedilmesi için Kredi Başlangıç Tarihi ve Kredi Süresi zorunludur, -Loans (Liabilities),Krediler (Yükümlülükler), +Loans (Liabilities),Krediler (Borçlar), Loans and Advances (Assets),Krediler ve Avanslar (Varlıklar), Local,Yerel, Logs for maintaining sms delivery status,Sms teslim durumunu korumak için günlükleri, @@ -1423,11 +1423,11 @@ Maximum Samples - {0} have already been retained for Batch {1} and Item {2} in B Maximum discount for Item {0} is {1}%,{0} Öğesi için maksimum indirim %{1}, Medical Code,Tıbbi kod, Medical Code Standard,Tıbbi Kod Standardı, -Medical Department,Tıp Bölümü, +Medical Department,Tıbbi Bölüm, Medical Record,Tıbbi kayıt, Medium,Orta, Member Activity,Üye Etkinliği, -Member ID,Kullanıcı Kimliği, +Member ID,Üye ID, Member Name,Üye Adı, Member information.,Üye Bilgisi., Membership,Üyelik, @@ -1485,13 +1485,13 @@ Negative Quantity is not allowed,Negatif Miktara izin verilmez, Negative Valuation Rate is not allowed,Negatif Değerleme Oranına izin verilmez, Negotiation/Review,Müzakere / İnceleme, Net Asset value as on,Net Aktif değeri olarak, -Net Cash from Financing,Finansmandan Elde Edilen Net Nakit, -Net Cash from Investing,Yatırımdan Elde Edilen Net Nakit, -Net Cash from Operations,Faaliyetlerden Elde Edilen Net Nakit, +Net Cash from Financing,Finansmandan Gelen Net Nakit, +Net Cash from Investing,Yatırımdan Gelen Net Nakit, +Net Cash from Operations,Faaliyetlerden Gelen Net Nakit, Net Change in Accounts Payable,Borç Hesabı Net Değişim, Net Change in Accounts Receivable,Alacak Hesabı Net Değişim, -Net Change in Cash,Nakit Net Değişim, -Net Change in Equity,Özkaynak Net Değişim, +Net Change in Cash,Nakit Net Değişimi, +Net Change in Equity,Özkaynak Net Değişimi, Net Change in Fixed Asset,Sabit Kıymet Net Değişim, Net Change in Inventory,Envanter Net Değişim, Net ITC Available(A) - (B),Net ITC Mevcut (A) - (B), @@ -1523,7 +1523,7 @@ Next Contact By cannot be same as the Lead Email Address,Sonraki İletişim Soru Next Contact Date cannot be in the past,Sonraki İletişim Tarihi olamaz, Next Steps,Sonraki Adımlar, No Action,İşlem yok, -No Customers yet!,Henüz müşteri yok!, +No Customers yet!,Henüz Müşteri yok!, No Data,Hiç Veri yok, No Delivery Note selected for Customer {},Müşteri için {} dağıtım Notu çalıştırmadı, No Item with Barcode {0},Barkodlu Ürün Yok {0}, @@ -1614,7 +1614,7 @@ Open BOM {0},{0} Açık BOM Malzeme Listesi, Open Item {0},{0} Açık Öğe, Open Notifications,Açık Bildirimler, Open Orders,Açık Siparişler, -Open a new ticket,Yeni bir bilet aç, +Open a new ticket,Yeni bir çağrı aç, Opening,Açılış, Opening (Cr),Açılış (Alacak), Opening (Dr),Açılış (Borç), @@ -1659,8 +1659,8 @@ Ordered Qty,Sipariş Miktarı, "Ordered Qty: Quantity ordered for purchase, but not received.","Sipariş Edilen Miktar: Satın alınmak için sipariş verilmiş, ancak teslim alınmamış miktar", Orders,Siparişler, Orders released for production.,Üretim için verilen emirler., -Organization,Organizasyon, -Organization Name,Kuruluş adı, +Organization,Kurum Bilgisi, +Organization Name,İşletme Adı, Other,Diğer, Other Reports,Diğer Raporlar, "Other outward supplies(Nil rated,Exempted)","Diğer dış sarf malzemeleri (Nil puan, Muaf)", @@ -1685,8 +1685,8 @@ POS Profile is required to use Point-of-Sale,"POS Profili, Satış Noktasını K POS Profile required to make POS Entry,POS Profil POS Girişi yapmak için gerekli, POS Settings,POS Ayarları, Packed quantity must equal quantity for Item {0} in row {1},{1} Paketli miktar satır {1} deki Ürün {0} a eşit olmalıdır, -Packing Slip,Sevk İrsaliyesi, -Packing Slip(s) cancelled,Sevk İrsaliyesi iptal edildi, +Packing Slip,Paketleme Fişi, +Packing Slip(s) cancelled,Paketleme Fişi iptal edildi, Paid,Ödendi, Paid Amount,Ödenen Tutar, Paid Amount cannot be greater than total negative outstanding amount {0},"Ödenen Tutar, toplam negatif ödenmemiş miktardan daha fazla olamaz {0}", @@ -1706,7 +1706,7 @@ Party is mandatory,Cari zorunludur, Past Due Date,Son Tarih, Patient,Hasta, Patient Appointment,Hasta Randevusu, -Patient Encounter,Hasta Encounter, +Patient Encounter,Hasta Muayenesi, Patient not found,Hasta bulunamadı, Pay Remaining,Kalan Öde, Pay {0} {1},{0} {1} öde, @@ -1732,7 +1732,7 @@ Payment Request,Ödeme Talebi, Payment Request for {0},{0} için Ödeme İsteği, Payment Tems,Ödeme Koşulları, Payment Term,Ödeme Vadesi, -Payment Terms,Ödeme Vadeleri, +Payment Terms,Ödeme Vadesi, Payment Terms Template,Ödeme Vadesi Şablonu, Payment Terms based on conditions,Koşullara göre Ödeme Vadesi, Payment Type,Ödeme Tipi, @@ -1933,7 +1933,7 @@ Posting Time,Gönderim Saati, Posting date and posting time is mandatory,Gönderme tarihi ve gönderme zamanı zorunludur, Posting timestamp must be after {0},Gönderme zamanı damgası {0}'dan sonra olmalıdır, Potential opportunities for selling.,Satış için potansiyel fırsatlar., -Practitioner Schedule,Uygulayıcı Takvimi, +Practitioner Schedule,Pratisyen Takvimi, Pre Sales,Ön Satış, Preference,Tercihler, Prescribed Procedures,Öngörülen Prosedürler, @@ -1969,7 +1969,7 @@ Print settings updated in respective print format,"Yazdırma ayarları, ilgili b Print taxes with zero amount,Sıfır etkileme vergileri yazdırın, Printing and Branding,Baskı ve Markalaşma, Private Equity,Özel Sermaye, -Procedure,Ameliyat, +Procedure,Prosedür, Process Day Book Data,Günlük Defter Verisini İşle, Process Master Data,Ana Verileri İşle, Processing Chart of Accounts and Parties,Hesap Planını ve Tarafları İşleme, @@ -1984,15 +1984,15 @@ Product Search,Ürün Arama, Production,Üretim, Production Item,Üretim Kalemi, Products,Ürünler, -Profit and Loss,Kar ve Zarar, -Profit for the year,Yılın karı, +Profit and Loss,Kâr ve Zarar, +Profit for the year,Yıllık Kâr, Program,Program, Program in the Fee Structure and Student Group {0} are different.,Ücret Yapısı ve Öğrenci Grubu {0} kalma programı., Program {0} does not exist.,{0} programı mevcut değil., Program: ,Program: , Progress % for a task cannot be more than 100.,Bir görev için ilerleme% 100'den fazla olamaz., Project Collaboration Invitation,Proje Ortak Çalışma Daveti, -Project Id,Proje Kimliği, +Project Id,Proje No, Project Manager,Proje Yöneticisi, Project Name,Proje Adı, Project Start Date,Proje Başlangıç Tarihi, @@ -2007,10 +2007,10 @@ Projected,Öngörülen, Projected Qty,Öngörülen Miktar, Projected Quantity Formula,Öngörülen Miktar Formülü, Projects,Projeler, -Proposal Writing,Teklifi Yazma, +Proposal Writing,Teklif Yazma, Proposal/Price Quote,Teklif / Fiyat Teklifi, Prospecting,Bilgi Toplama, -Provisional Profit / Loss (Credit),Geçici Kar / Zarar (Kredi), +Provisional Profit / Loss (Credit),Geçici Kar / Zarar (Alacak), Publications,Yayınlar, Publish Items on Website,Web sitesinde ürünleri yayınlayın, Published,Yayınlandı, @@ -2072,7 +2072,7 @@ Queued for updating latest price in all Bill of Materials. It may take a few min Quick Journal Entry,Hızlı Yevmiye Girişi, Quot Count,Teklif Sayısı, Quot/Lead %,Teklif/Müşteri Adayı yüzdesi, -Quotation,Fiyat Teklifi, +Quotation,Satış Teklifi, Quotation {0} is cancelled,Teklif {0} iptal edildi, Quotation {0} not of type {1},Teklif {0} {1} türü, Quotations,Fiyat Teklifleri, @@ -2082,8 +2082,8 @@ Quotations: ,Fiyat Teklifleri, Quotes to Leads or Customers.,Müşterilere veya Adaylara verilen Teklifler., RFQs are not allowed for {0} due to a scorecard standing of {1},{1} puan kartının statüsü nedeniyle {0} için tekliflere izin verilmiyor., Range,Aralık, -Rate,Birim Fiyat, -Rate:,Puan:, +Rate,Oran, +Rate:,Oran:, Rating,Değerlendirme, Raw Material,Hammadde, Raw Materials,Hammaddeler, @@ -2095,7 +2095,7 @@ Reading Uploaded File,Yüklenen Dosyayı Okuma, Real Estate,Gayrimenkul, Reason For Putting On Hold,Beklemeye Alma Nedeni, Reason for Hold,Bekletme Nedeni, -Reason for hold: ,Bekletme nedeni:, +Reason for hold: ,Bekletme nedeni: , Receipt,Makbuz, Receipt document must be submitted,Fiş belge teslim edilmelidir, Receivable,Alacak, @@ -2163,10 +2163,10 @@ Requested Qty,İstenen Miktar, Requesting Site,Site Talep ediyor, Requesting payment against {0} {1} for amount {2},"karşı ödeme talep {0}, {1} miktarda {2}", Requestor,Talep eden, -Required On,Gerekli Açık, -Required Qty,Gerekli Miktar, -Required Quantity,Gerekli Miktar, -Reschedule,Yeniden Planlama, +Required On,İhtiyaç Tarihi, +Required Qty,İhtiyaç Miktarı, +Required Quantity,İhtiyaç Miktar, +Reschedule,Yeniden Planla, Research,Araştırma, Research & Development,Araştırma ve Geliştirme, Researcher,Araştırmacı, @@ -2203,7 +2203,7 @@ Review Invitation Sent,Gönderilen Davetiyeyi İnceleme, Review and Action,İnceleme ve İşlem, Rooms Booked,Rezervasyonlu Odalar, Root Company,Kök Şirketi, -Root Type,Kök Tipi, +Root Type,Kök Türü, Root Type is mandatory,Kök Tipi zorunludur, Root cannot be edited.,Kök düzenlenemez., Root cannot have a parent cost center,Kökün ana maliyet merkezi olamaz, @@ -2282,7 +2282,7 @@ Row {0}: {1} must be greater than 0,{0} bilgisi: {1} 0'dan büyük olmalı, Row {0}: {1} {2} does not match with {3},Satır {0}: {1} {2} ile eşleşmiyor {3}, Row {0}:Start Date must be before End Date,Satır {0}: Başlangıç tarihi bitiş tarihinden önce olmalıdır, Rows with duplicate due dates in other rows were found: {0},Diğer satırlardaki yinelenen teslim dosyalarına sahip satırlar bulundu: {0}, -Rules for adding shipping costs.,Nakliye masraflarını yükleme Kuralları., +Rules for adding shipping costs.,Sevkiyat masraflarını yükleme Kuralları., Rules for applying pricing and discount.,Fiyatlandırma ve indirim için kurallar., S.O. No.,Satış Siparişi No, SGST Amount,SGST Tutarı, @@ -2353,9 +2353,9 @@ Secured Loans,Teminatlı Krediler, Securities & Commodity Exchanges,Teminatlar ve Emtia Borsaları, Securities and Deposits,Teminatlar ve Mevduatlar, See All Articles,Tüm Makaleleri Gör, -See all open tickets,Tüm açık biletlere bakın, -See past orders,Geçmiş satınalmalara bakın, -See past quotations,Geçmiş alıntılara bakın, +See all open tickets,Tüm açık çağrılara bak, +See past orders,Geçmiş satınalmalara bak, +See past quotations,Geçmiş tekliflere bak, Select,Seç, Select Alternate Item,Alternatif Öğe Seç, Select Attribute Values,Özel Değerlerini Seç, @@ -2393,7 +2393,7 @@ Select the program first,Önce programını seçin, Select to add Serial Number.,Seri numarasını dahil etmek için seçin., Select your Domains,Çalışma alanlarınızı seçin, Selected Price List should have buying and selling fields checked.,Seçilen Fiyat Listesi alım satım merkezlerine sahip olmalıdır., -Sell,Sat, +Sell,Satış, Selling,Satış, Selling Amount,Satış Tutarı, Selling Price List,Satış Fiyatı Listesi, @@ -2403,7 +2403,7 @@ Send Grant Review Email,Hibe incelemesi E-postasını gönder, Send Now,Şimdi Gönder, Send SMS,SMS Gönder, Send mass SMS to your contacts,Kişilerinize toplu SMS Gönder, -Sensitivity,Duyarlılık, +Sensitivity,Hassasiyet, Sent,Gönderildi, Serial No and Batch,Seri No ve Parti (Batch), Serial No is mandatory for Item {0},Ürün {0} için Seri no cezaları, @@ -2457,10 +2457,10 @@ Setting up Employees,Personel Oluşturma, Setting up Taxes,Vergileri Ayarla, Setting up company,Şirket Kurulumu, Settings,Ayarlar, -"Settings for online shopping cart such as shipping rules, price list etc.","Böyle nakliye kuralları, fiyat listesi vb gibi online alışveriş sepeti için ayarlar", +"Settings for online shopping cart such as shipping rules, price list etc.","Böyle Sevkiyat kuralları, fiyat listesi vb gibi online alışveriş sepeti için ayarlar", Settings for website homepage,Web sitesi ana sayfası için ayarlar, Settings for website product listing,Web sitesi ürün listeleme ayarları, -Settled,hayalet, +Settled,Uzlaştı, Setup Gateway accounts.,Kur Gateway hesapları., Setup SMS gateway settings,Kurulum SMS ağ ayarları ayarları, Setup cheque dimensions for printing,Baskı için Kurulum onay dosyaları, @@ -2475,10 +2475,10 @@ Share Type,Paylaşım Türü, Shareholder,Hissedar, Ship To State,Eyalete Gönderim, Shipments,Gönderiler, -Shipping Address,Nakliye Adresi, -"Shipping Address does not have country, which is required for this Shipping Rule","Nakliye Adresi, bu Nakliye Kuralı için gerekli olan ülke içermiyor", -Shipping rule only applicable for Buying,Nakliye kuralları yalnızca Alış için geçerlidir, -Shipping rule only applicable for Selling,Nakliye kurallarının yalnızca Satış için geçerlidir, +Shipping Address,Sevkiyat Adresi, +"Shipping Address does not have country, which is required for this Shipping Rule","Sevkiyat Adresi, bu Sevkiyat Kuralı için gerekli olan ülke içermiyor", +Shipping rule only applicable for Buying,Sevkiyat kuralları yalnızca Alış için geçerlidir, +Shipping rule only applicable for Selling,Sevkiyat kurallarının yalnızca Satış için geçerlidir, Shopify Supplier,Shopify tedarikçisi, Shopping Cart,Alışveriş Sepeti, Shopping Cart Settings,Alışveriş Sepeti Ayarları, @@ -2491,16 +2491,16 @@ Show Opening Entries,Açılış Kayıtlarını Göster, Show Payment Details,Ödeme Ayrıntılarını Göster, Show Return Entries,İade Kayıtlarını Göster, Show Variant Attributes,Varyant Özelliklerini Göster, -Show Variants,Göster Varyantlar, +Show Variants,Varyantları Göster, Show closed,Kapalı olanları Göster, Show exploded view,Genişletilmiş görünüm gösterisi, -Show only POS,Sadece POS göster, +Show only POS,Sadece POSu göster, Show unclosed fiscal year's P&L balances,Kapatılmamış mali yılın K&Z bakiyelerini göster, Show zero values,Sıfır değerleri göster, Silt,Alüvyon, Single Variant,Tek Varyant, Single unit of an Item.,Bir Öğenin tek birimi., -"Skipping Leave Allocation for the following employees, as Leave Allocation records already exists against them. {0}","Atlama Ayrıştırma kayıtları zaten onlara karşı olduklarında, aşağıdaki çalışanlar için Ayrılmayı Bırakma. {0}", +"Skipping Leave Allocation for the following employees, as Leave Allocation records already exists against them. {0}","Atlama Ayrıştırma kayıtları zaten onlara karşı olduklarında, aşağıdaki çalışanlar için İzin Tahsisatını Atla. {0}", Slideshow,Slayt Gösterisi, Slots for {0} are not added to the schedule,{0} için yuvalar programa eklenmez, Small,Küçük, @@ -2520,15 +2520,15 @@ Source Warehouse,Kaynak Depo, Source and Target Location cannot be same,Kaynak ve Hedef Konum aynı olamaz, Source and target warehouse cannot be same for row {0},Kaynak ve hedef depo Satır {0} için aynu olamaz, Source and target warehouse must be different,Kaynak ve hedef depo farklı olmalıdır, -Source of Funds (Liabilities),Fon kaynakları (Yükümlülükler), +Source of Funds (Liabilities),Fon Kaynakları (Borçlar), Source warehouse is mandatory for row {0},Satır {0} Kaynak deposu verileri, Specified BOM {0} does not exist for Item {1},Ürün için yok Belirtilen BOM {0} {1}, Split,Böl, Split Batch,Batch/Parti Böl, Split Issue,Sorunu Böl, Sports,Spor, -Standard Buying,Standart Alış, -Standard Selling,Standart Satış, +Standard Buying,Varsayılan Alış, +Standard Selling,Varsayılan Satış, Standard contract terms for Sales or Purchase.,Satış veya Satınalma için standart sözleşme hükümleri., Start Date,Başlangıç Tarihi, Start Date of Agreement can't be greater than or equal to End Date.,"Anlaşmanın Başlangıç Tarihi, Bitiş Tarihinden büyük veya ona eşit olamaz.", @@ -2537,7 +2537,7 @@ Start date should be less than end date for Item {0},Başlangıç tarihi Ürün Start date should be less than end date for task {0},{0} görevi için başlangıç tarihi bitiş süreleri daha az olmalıdır, Start day is greater than end day in task '{0}',"Başlangıç gününde, '{0}' Görev bitiş tarihinden daha büyük", Start on,Başla, -State,Durumu, +State,Eyalet, State/UT Tax,Eyalet / UT Vergisi, Statement of Account,Hesap Beyanı, Status must be one of {0},Durum aşağıdakilerden biri olmalıdır: {0}, @@ -2559,7 +2559,7 @@ Stock Ledger Entries and GL Entries are reposted for the selected Purchase Recei Stock Levels,Stok Seviyeleri, Stock Liabilities,Stok Yükümlülükleri, Stock Qty,Stok Miktarı, -Stock Received But Not Billed,Alınmış ancak faturasız stok, +Stock Received But Not Billed,Stok Alındı Ancak Faturalandırılmadı, Stock Reports,Stok Raporları, Stock Summary,Stok Özeti, Stock Transactions,Stok İşlemleri, @@ -2578,20 +2578,20 @@ Student,Öğrenci, Student Activity,Öğrenci Etkinliği, Student Address,Öğrenci Adresi, Student Admissions,Öğrenci Kabulleri, -Student Attendance,Öğrenci Seyirci, +Student Attendance,Öğrenci Katılımı, "Student Batches help you track attendance, assessments and fees for students","Öğrenci Partileri Eğer öğrenciler için kazanma, değerlendirme ve ücretler izlemenize yardımcı olur", Student Email Address,Öğrenci E-posta Adresi, Student Email ID,Öğrenci E-posta Kimliği, -Student Group,öğrenci grubu, +Student Group,Çğrenci grubu, Student Group Strength,Öğrenci Grubu Gücü, Student Group is already updated.,Öğrenci Grubu zaten güncellendi., -Student Group: ,Öğrenci Grubu:, +Student Group: ,Öğrenci Grubu: , Student ID,Öğrenci Kimliği, Student ID: ,Öğrenci Kimliği:, Student LMS Activity,Öğrenci LMS Etkinliği, Student Mobile No.,Öğrenci Cep No, -Student Name,Öğrenci adı, -Student Name: ,Öğrenci adı:, +Student Name,Öğrenci Adı, +Student Name: ,Öğrenci adı: , Student Report Card,Öğrenci Rapor Kartı, Student is already enrolled.,Öğrenci zaten kayıtlıdır., Student {0} - {1} appears Multiple times in row {2} & {3},Öğrenci {0} - {1} satırda birden çok kez görünür {2} {3}, @@ -2600,15 +2600,15 @@ Student {0} exist against student applicant {1},Öğrenci {0} öğrenci başvuru "Students are at the heart of the system, add all your students","Öğrencilerin kalbinin atılması, tüm öğrencilerin alınması sağlanır", Sub Assemblies,Alt Kurullar, Sub Type,Alt Tür, -Sub-contracting,Alt sözleşme, -Subcontract,Taşeronluk, +Sub-contracting,Taşeron / Alt sözleşme, +Subcontract,Fason, Subject,Konu, Submit,Gönder/İşle, Submit this Work Order for further processing.,Daha fazla işlem için bu İş Emrini gönderin., Subscription,Abonelik, Subscription Management,Abonelik Yönetimi, Subscriptions,Abonelikler, -Subtotal,Ara toplam, +Subtotal,Ara Toplam, Successful,Başarılı, Successfully Reconciled,Başarıyla Uzlaştırıldı, Successfully Set Supplier,Tedarikçi Başarıyla Ayarlandı, @@ -2616,7 +2616,7 @@ Successfully created payment entries,Başarıyla ödeme girişleri oluşturuldu, Successfully deleted all transactions related to this company!,Başarıyla bu şirket ile ilgili tüm işlemleri silindi!, Sum of Scores of Assessment Criteria needs to be {0}.,Değerlendirme Kriterleri Puanlarının Toplamı {0} olması gerekir., Sum of points for all goals should be 100. It is {0},Tüm hedefler için puan toplamı It is 100. olmalıdır {0}, -Summary,özet, +Summary,Özet, Summary for this month and pending activities,Bu ay ve bekleyen aktiviteler için Özet, Summary for this week and pending activities,Bu hafta ve bekleyen aktiviteler için Özet, Sunday,Pazar, @@ -2643,7 +2643,7 @@ Supply Type,Tedarik Türü, Support,Destek, Support Analytics,Destek Analizi, Support Settings,Destek Ayarları, -Support Tickets,Destek Biletleri, +Support Tickets,Destek Çağrıları, Support queries from customers.,Müşterilerden gelen destek sorguları., Susceptible,Duyarlı, Sync has been temporarily disabled because maximum retries have been exceeded,Maksimum deneme sayısının aşıldığı için geçici olarak devre dışı bırakıldı, @@ -2724,7 +2724,7 @@ The shares don't exist with the {0},{0} ile paylaşımlar mevcut değil, "There are inconsistencies between the rate, no of shares and the amount calculated","Oran, ödeme miktarı ve hesaplanan tutarlar arasında tutarsızlıklar vardır", There can be multiple tiered collection factor based on the total spent. But the conversion factor for redemption will always be same for all the tier.,"Toplam harcanan toplam baz alarak çok sesli toplama faktörü olabilir. Ancak, itfa için dönüştürme faktörü, tüm katmanlar için her zaman aynı olacaktır.", There can only be 1 Account per Company in {0} {1},Sadece Şirketin başına 1 Hesap olabilir {0} {1}, -"There can only be one Shipping Rule Condition with 0 or blank value for ""To Value""","Sadece ""değerini"" için 0 veya boş değere sahip bir Nakliye Kural Durumu olabilir", +"There can only be one Shipping Rule Condition with 0 or blank value for ""To Value""","Sadece ""değerini"" için 0 veya boş değere sahip bir Sevkiyat Kural Durumu olabilir", There is not enough leave balance for Leave Type {0},İzin tipi{0} için yeterli izin bakiyesi yok, There is nothing to edit.,Düzenlenecek bir şey yok, There isn't any item variant for the selected item,Seçilen öğe için herhangi bir öğe tahmini yok, @@ -2752,7 +2752,7 @@ This is based on stock movement. See {0} for details,Bu stok hareketleri devam e This is based on the Time Sheets created against this project,"Bu, bu projeye karşı potansiyel Zaman postalarını yönlendiriyor", This is based on the attendance of this Student,"Bu, bu Öğrencinin katılımıyla artar", This is based on transactions against this Customer. See timeline below for details,"Bu, bu Müşteriye karşı işlemlere ayrılmıştır. Ayrıntılar için aşağıdaki zaman geçişini bakın", -This is based on transactions against this Healthcare Practitioner.,"Bu, bu Sağlık Hizmeti Uygulayıcısına yapılan işlemlere bağlıdır.", +This is based on transactions against this Healthcare Practitioner.,"Bu, bu Sağlık Personeline yapılan işlemlere bağlıdır.", This is based on transactions against this Patient. See timeline below for details,"Bu, bu Hastaya karşı işlemlere göre yapılır. Ayrıntılar için aşağıdaki zaman aralarına bakın", This is based on transactions against this Sales Person. See timeline below for details,"Bu, bu Satış Kişisine karşı yapılan işlemlere göre yapılır. Ayrıntılar için aşağıdaki zaman aralarına bakın", This is based on transactions against this Supplier. See timeline below for details,Bu Satıcıya karşı işlemleri ayarlamak. Ayrıntılar için aşağıdaki zaman geçişini bakın, @@ -2830,7 +2830,7 @@ Total Payment Amount in Payment Schedule must be equal to Grand / Rounded Total, Total Payments,Toplam Ödeme, Total Qty,Toplam Mik, Total Quantity,Toplam Miktar, -Total Revenue,toplam Gelir, +Total Revenue,Toplam Gelir, Total Student,Toplam Öğrenci, Total Target,Toplam Hedef, Total Tax,Toplam Vergi, @@ -2874,16 +2874,16 @@ Transporter ID,Nakliyeci Kimliği, Transporter Name,Nakliyeci Adı, Travel Expenses,Seyahat Giderleri, Tree Type,Ağaç Tipi, -Tree of Bill of Materials,Malzeme Listesi Ağacı, +Tree of Bill of Materials,BOM Malzeme Listesi Ağacı, Tree of Item Groups.,Ürün Grupları Ağacı, -Tree of Procedures,mahkumlar ağacı, -Tree of Quality Procedures.,Kalite Ağacı hükümleri., +Tree of Procedures,Prosedür Ağacı, +Tree of Quality Procedures.,Kalite Prosedürleri Ağacı., Tree of financial Cost Centers.,Finansal Maliyet Merkezleri Ağacı., -Tree of financial accounts.,mali hesap Ağaçlarının., +Tree of financial accounts.,Mali Hesap Ağacı., Treshold {0}% appears more than once,"Eşik {0},% kereden fazla görünür", Trial Period End Date Cannot be before Trial Period Start Date,Deneme Süresi Bitiş Tarihi Deneme Süresi Başlangıç Tarihinden önce olamaz, -Trialling,deneme, -Type of Business,İş türü, +Trialling,Deneme, +Type of Business,İş Türü, Types of activities for Time Logs,Zaman Kayıtları operasyon Türleri, UOM,Birim, UOM Conversion factor is required in row {0},Ölçü Birimi Dönüşüm tüketimi satırı {0} da gereklidir, @@ -2894,7 +2894,7 @@ Unable to find score starting at {0}. You need to have standing scores covering Unable to find variable: ,işletim bulunamadı:, Unblock Invoice,Faturanın Engellenmesini Kaldır, Uncheck all,Tümünü karıştırma, -Unclosed Fiscal Years Profit / Loss (Credit),Kapanmamış Mali Yıl Kâr / Zarar (Kredi), +Unclosed Fiscal Years Profit / Loss (Credit),Kapanmamış Mali Yıl Kâr / Zarar (Alacak), Unit,Birim, Unit of Measure,Ölçü Birimi, Unit of Measure {0} has been entered more than once in Conversion Factor Table,Ölçü Birimi {0} Dönüşüm katsayısı tablosunda birden fazla kez girildi., @@ -2916,27 +2916,27 @@ Update rate as per last purchase,Son Alışa göre fiyatı güncelle, Update stock must be enable for the purchase invoice {0},Satınalma faturası {0} satınalma faturası için etkinleştirilmelidir, Updating Variants...,Varyantlar Güncelleniyor..., Upload your letter head and logo. (you can edit them later).,Mektup baş ve logo yükleyin. (Daha sonra bunları düzenleyebilirsiniz)., -Upper Income,üst gelir, +Upper Income,Üst Gelir, Use Sandbox,Kullanım Sandbox, User,Kullanıcı, -User ID,Kullanıcı kimliği, +User ID,Kullanıcı ID, User ID not set for Employee {0},Çalışan {0} için kullanıcı sıfatı ayarlanmamış, User Remark,Kullanıcı Açıklaması, User has not applied rule on the invoice {0},Kullanıcı {0} faturasına kural uygulamasıydı, User {0} already exists,{0} kullanıcı zaten mevcut, -User {0} created,{0}görüşmeler, +User {0} created,Kullanıcı {0} oluşturdu, User {0} does not exist,Kullanıcı {0} yok, User {0} doesn't have any default POS Profile. Check Default at Row {1} for this User.,{0} kullanıcısının varsayılan POS Profili yok. Bu Kullanıcı için Satır {1} 'te varsayılan'ı temizleme., User {0} is already assigned to Employee {1},Kullanıcı {0} zaten çalışan {1} e atanmış, -User {0} is already assigned to Healthcare Practitioner {1},"{0} kullanıcı, Sağlık Uzmanına {1} atandı", +User {0} is already assigned to Healthcare Practitioner {1},"{0} kullanıcı, Sağlık Personeline {1} atandı", Users,Kullanıcılar, Utility Expenses,Yardımcı Giderleri, Valid From Date must be lesser than Valid Upto Date.,"Tarihten geçerli Tarih, geçerlie Kadar hüküm olandan daha az olmalıdır.", -Valid Till,Kadar geçerli, +Valid Till,Geçerlilik Tarihi, Valid from and valid upto fields are mandatory for the cumulative,Kümülatif alanlar için geçerli ve geçerli alanlar, Valid from date must be less than valid upto date,Tarihten itibaren geçerli olan tarihten geçerli olandan az olmalıdır, Valid till date cannot be before transaction date,geçerli tarihe kadar işlem tarihi öncesi olamaz, -Validity,geçerlilik, +Validity,Geçerlilik, Validity period of this quotation has ended.,Bu fiyat teklifinin geçerlilik süresi sona erdi., Valuation Rate,Değerleme Oranı, Valuation Rate is mandatory if Opening Stock entered,Açılış Stoğu girilirse Değerleme Oranı zorunludur, @@ -2948,14 +2948,14 @@ Value must be between {0} and {1},Değer {0} ve {1} arasında olmalıdır, "Values of exempt, nil rated and non-GST inward supplies","Muaf, sıfır değer ve GST dışı iç arz değerleri", Variance,Varyans, Variance ({}),Varyans ({}), -Variant,sahip olmak, -Variant Attributes,Varyant Nitelikler, -Variant Based On cannot be changed,Temel Değişken değiştirilemez, +Variant,Varyant, +Variant Attributes,Varyant Nitelikleri, +Variant Based On cannot be changed,Varyant Tabanı Değiştirilemez, Variant Details Report,Varyant Detayları Raporu, Variant creation has been queued.,Varyant oluşturma işlemi kayda alındı., -Vehicle Expenses,araç giderleri, +Vehicle Expenses,Araç Giderleri, Vehicle No,Araç No, -Vehicle Type,araç tipi, +Vehicle Type,Araç Tipi, Vehicle/Bus Number,Araç / Otobüs Numarası, Venture Capital,Girişim Sermayesi, View Chart of Accounts,Hesapların Grafiği Görüntüle, @@ -2964,18 +2964,18 @@ View Form,Form Görüntüle, View Lab Tests,Lab Testlerini Görüntüle, View Leads,Adaylerı Göster, View Ledger,Defteri Göster, -View Now,Şimdi Görüntüle, +View Now,Şimdi Göster, View a list of all the help videos,Tüm yardım videolarının bir listesini alma, View in Cart,Sepet Görüntüle, Visit report for maintenance call.,Bakım araması için ziyaret raporu., Visit the forums,Forumları ziyaret et, -Vital Signs,Hayati geçirmek, +Vital Signs,Yaşamsal Bulgular, Volunteer,Gönüllü, Volunteer Type information.,Gönüllü Türü bilgileri., Volunteer information.,Gönüllü bilgi., Voucher #,#, -Voucher No,Föy No, -Voucher Type,Föy Türü, +Voucher No,Fiş No, +Voucher Type,Fiş Türü, WIP Warehouse,Yarı Mamül Depo, Warehouse can not be deleted as stock ledger entry exists for this warehouse.,Bu depo için defter girdisi mevcutken depo silinemez., Warehouse cannot be changed for Serial No.,Depo Seri No için değiştirilemez, @@ -2998,10 +2998,10 @@ Warning: Invalid attachment {0},Uyarı: Geçersiz İnceleme {0}, Warning: Material Requested Qty is less than Minimum Order Qty,Uyarı: İstenen Ürün Miktarı Minimum Sipariş Miktarından az, Warning: Sales Order {0} already exists against Customer's Purchase Order {1},Uyarı: Satış Sipariş {0} zaten Müşterinin Satınalma Emri karşı var {1}, Warning: System will not check overbilling since amount for Item {0} in {1} is zero,Uyarı: {1} deki {0} ürün bedeli sıfır olduğu için sistem fazla faturasını ödemeyi kontrol etmeyecektir, -Warranty,garanti, +Warranty,Garanti, Warranty Claim,Garanti Talebi, Warranty Claim against Serial No.,Seri No'ya karşı Garanti Talebi, -Website,Web sitesi, +Website,Website, Website Image should be a public file or website URL,Web Sitesi Resim kamu dosyası veya web sitesi URL'si olmalıdır, Website Image {0} attached to Item {1} cannot be found,Öğe {1} bağlı Web Sitesi Resmi {0} bulunamıyor, Website Manager,Web Yöneticisi, @@ -3061,21 +3061,21 @@ You need to enable Shopping Cart,Alışveriş sepetini etkinleştirmeniz gerekli You will lose records of previously generated invoices. Are you sure you want to restart this subscription?,geçmişteki faturaların kayıtlarını kaybedersiniz. Bu aboneliği tekrar başlatmak istediğinizden emin misiniz?, Your Organization,Kuruluşunuz, Your cart is Empty,Sepetiniz boş, -Your email address...,E..., +Your email address...,Email adresiniz..., Your order is out for delivery!,Siparişiniz için teslimat için teslimat!, -Your tickets,Biletleriniz, +Your tickets,Çağrılarınız, ZIP Code,Posta kodu, [Error],[Hata], [{0}](#Form/Item/{0}) is out of stock,[{0}](#Form/Item/{0}) stokta yok, `Freeze Stocks Older Than` should be smaller than %d days.,`%d'den Eski Stokları Dondur' günden daha kısa olmalıdır., based_on,temel_olarak, cannot be greater than 100,100'den daha büyük olamaz, -disabled user,engelli kullanıcı, +disabled user,kullanıcı devredışı, "e.g. ""Build tools for builders""","örnekleme: ""Yazılım Çözümleri""", "e.g. ""Primary School"" or ""University""","örnekleme, "İlköğretim Okulu" ya da "Üniversite"", "e.g. Bank, Cash, Credit Card","Örnek: Banka, Nakit, Kredi Kartı", hidden,gizli, -modified,ilerlemek, +modified,düzenlendi, old_parent,eski_ebeveyn, on,üzerinde, {0} '{1}' is disabled,{0} '{1}' devre dışı, @@ -3092,7 +3092,7 @@ on,üzerinde, {0} Student Groups created.,Öğrenci Grupları {0} kuruldu., {0} Students have been enrolled,{0} öğrenci kaydoldu, {0} against Bill {1} dated {2},{0} Fatura Karşısı {1} tarihli {2}, -{0} against Purchase Order {1},{0} Satınalma siparişine karşı{1}, +{0} against Purchase Order {1},{0} Satınalma Siparişine karşı{1}, {0} against Sales Invoice {1},{0} Satış Faturasına karşı {1}, {0} against Sales Order {1},{0} Satış Siparişine karşı {1}, {0} asset cannot be transferred,{0} varlığını aktaramaz, @@ -3101,7 +3101,7 @@ on,üzerinde, "{0} currently has a {1} Supplier Scorecard standing, and Purchase Orders to this supplier should be issued with caution.",{0} şu anda bir {1} Tedarikçi Puan Kartına sahip ve bu tedarikçiye Satınalma Siparişleri çalıştırma., "{0} currently has a {1} Supplier Scorecard standing, and RFQs to this supplier should be issued with caution.",{0} şu anda bir {1} Tedarikçi Puan Kartına sahip ve bu tedarikçinin RFQ'ları dikkatli bir şekilde çıkarılıyor., {0} does not belong to Company {1},{0} Şirket {1}E ait değildir, -{0} does not have a Healthcare Practitioner Schedule. Add it in Healthcare Practitioner master,"{0}, bir Sağlık Hizmeti Uygulayıcısı Programına sahip değil. Sağlık Uygulayıcısı ana bölüm ekle", +{0} does not have a Healthcare Practitioner Schedule. Add it in Healthcare Practitioner master,"{0}, bir Sağlık Personeli Programına sahip değil. Sağlık Hizmeti Pratisyeni Verisine onu ekle", {0} entered twice in Item Tax,{0} iki kere ürün vergisi girildi, {0} for {1},{0} için {1}, {0} has been submitted successfully,{0} başarıyla gönderildi, @@ -3119,8 +3119,8 @@ on,üzerinde, {0} is on hold till {1},"{0}, {1} geçen zamana kadar beklemede", {0} item found.,{0} öğe bulundu., {0} items found.,{0} öğe bulundu., -{0} items in progress,{0} ürün işleminde, -{0} items produced,{0} ürün üretimi, +{0} items in progress,{0} ürün devam ediyor, +{0} items produced,{0} ürün üretildi, {0} must appear only once,{0} sadece bir kez yer almalıdır, {0} must be negative in return document,{0} iade belgesinde negatif olmalı, {0} not allowed to transact with {1}. Please change the Company.,"{0}, {1} ile işlem yapmasına izin verilmiyor. Lütfen Şirketi kurallarına uyun.", @@ -3132,15 +3132,15 @@ on,üzerinde, {0} units of {1} needed in {2} on {3} {4} for {5} to complete this transaction.,Bu işlemi gerçekleştirmek için {2} içinde {3} {4} üstünde {5} için {0} miktar {1} gerekli., {0} units of {1} needed in {2} to complete this transaction.,Bu işlemi yapmak için {2} içinde {0} birim {1} gerekli., {0} valid serial nos for Item {1},Ürün {1} için {0} geçerli bir seri numarası, -{0} variants created.,{0} geçmiş., -{0} {1} created,{0} {1} kuruluş, +{0} variants created.,{0} varyant oluşturdu., +{0} {1} created,{0} {1} oluşturdu, {0} {1} does not exist,{0} {1} mevcut değil, -{0} {1} has been modified. Please refresh.,"{0}, {1} düzenlendi. Lütfen yenileyin.", -{0} {1} has not been submitted so the action cannot be completed,"{0} {1} verildi, bu nedenle eylem tamamlanamadı", +{0} {1} has been modified. Please refresh.,"{0}, {1} düzenledi. Lütfen yenileyin.", +{0} {1} has not been submitted so the action cannot be completed,{0} {1} gönderilmediğinden işlem tamamlanamıyor, "{0} {1} is associated with {2}, but Party Account is {3}","{0} {1}, {2} dosyaları, ancak Cari Hesabı {3}", {0} {1} is cancelled or closed,{0} {1} iptal edildi veya kapatıldı, -{0} {1} is cancelled or stopped,{0} {1}iptal edilmiş veya durdurulmuş, -{0} {1} is cancelled so the action cannot be completed,"{0} {1} iptal edildi, bu nedenle eylem tamamlanamadı", +{0} {1} is cancelled or stopped,{0} {1} iptal edilmiş veya durdurulmuş, +{0} {1} is cancelled so the action cannot be completed,{0} {1} iptal edildi bu nedenle eylem tamamlanamadı, {0} {1} is closed,{0} {1} kapatıldı, {0} {1} is disabled,{0} {1} devre dışı, {0} {1} is frozen,{0} {1} donduruldu, @@ -3151,10 +3151,10 @@ on,üzerinde, {0} {1} is not submitted,{0} {1} teslim edilmedi, {0} {1} is {2},"{0} {1}, {2}", {0} {1} must be submitted,{0} {1} teslim edilmelidir, -{0} {1} not in any active Fiscal Year.,{0} {1} Aktif mali dönem içinde değil., -{0} {1} status is {2},{0} {1} durum {2} olduğu, -{0} {1}: 'Profit and Loss' type account {2} not allowed in Opening Entry,{0} {1}: 'Kar ve Zarar' türü hesabı {2} Entry Açılışına izin verilmez, -{0} {1}: Account {2} does not belong to Company {3},{0} {1}: Hesap {2} Şirkete ait olmayan {3}, +{0} {1} not in any active Fiscal Year.,{0} {1} Aktif Mali Yıl içinde değil., +{0} {1} status is {2},{0} {1} durumu {2} dir, +{0} {1}: 'Profit and Loss' type account {2} not allowed in Opening Entry,{0} {1}: 'Kâr ve Zarar' tipi hesaba {2} Açılış Kaydında izin verilmiyor, +{0} {1}: Account {2} does not belong to Company {3},{0} {1}: Hesap {2} Şirket {3}'e ait değil, {0} {1}: Account {2} is inactive,{0} {1}: Hesap {2} etkin değil, {0} {1}: Accounting Entry for {2} can only be made in currency: {3},{0} {1}: {2} için muhasebe kaydı yalnızca bu para birimi ile yapılabilir: {3}, {0} {1}: Cost Center is mandatory for Item {2},Ürün{2} için {0} {1}: Maliyert Merkezi yaptırımları, @@ -3192,10 +3192,10 @@ Personal,Kişisel, Post,Gönder, Postal Code,Posta Kodu, Provider,Sağlayıcı, -Read Only,Tuz Okunur, -Recipient,alıcı, -Reviews,yorumlar, -Sender,Sevkiyatçı, +Read Only,Salt Okunur, +Recipient,Alıcı, +Reviews,Yorumlar, +Sender,Gönderici, There were errors while sending email. Please try again.,E-posta gönderirken hatalar vardı. Lütfen tekrar deneyin., Values Changed,Değerler Değişti, or,veya, @@ -3206,9 +3206,9 @@ Allocated amount cannot be negative,Tahsis edilen miktarlar olamaz, Import Successful,Başarılı İç Aktar, Please save first,lütfen önce kaydet, Price not found for item {0} in price list {1},{0} kaleminde {1} fiyat listelerinde fiyat bulunamadı, -Warehouse Type,Depo türü, +Warehouse Type,Depo Tipi, 'Date' is required,'Tarih' gerekli, -Budgets,bütçeler, +Budgets,Bütçeler, Bundle Qty,Paket Adet, Company GSTIN,şirket GSTIN, Company field is required,Şirket alanı alanı, @@ -3218,17 +3218,17 @@ Invalid GSTIN! The input you've entered doesn't match the GSTIN format for UIN H Invoice Grand Total,Fatura Genel Toplamı, Last carbon check date cannot be a future date,Son karbon tarihi kontrol kaynağı bir tarih olamaz, Make Stock Entry,Stok Hareketi Yap, -Quality Feedback,Kalite geribildirimi, -Quality Feedback Template,Kalite Geribildirim Şablonu, +Quality Feedback,Kalite Geri Bildirimi, +Quality Feedback Template,Kalite Geri Bildirim Şablonu, Rules for applying different promotional schemes.,Farklı promosyon programlarını uygulama kuralları., -Show {0},Göster {0} , +Show {0},{0} Göster, Target Details,Hedef Detayları, {0} already has a Parent Procedure {1}.,{0} zaten bir {1} veli yapıya sahip., API,API, Annual,Yıllık, Change,Değiştir, Contact Email,İletişim E-Posta, -From Date,Baş. Tarihi, +From Date,Başlama Tarihi, Group By,Gruplama Ölçütü, Invalid URL,Geçersiz URL, Landscape,Landscape, @@ -3369,10 +3369,10 @@ Delivered Quantity,Teslim edilen miktar, Delivery Notes,İrsaliyeler, Depreciated Amount,Amortisman Tutarı, Description,Açıklama, -Designation,Atama, +Designation,Ünvanı, Difference Value,Fark Değeri, Dimension Filter,Boyut Filtresi, -Disabled,Devredışı, +Disabled,Devre dışı, Disbursement and Repayment,Masraf ve Geri Ödeme, Distance cannot be greater than 4000 kms,Mesafe 4000 km'den büyük olamaz, Do you want to submit the material request,Malzeme talebini göndermek ister misiniz, @@ -3469,7 +3469,7 @@ Last Issue,Son Konu, Latest Age,En Son Yaş, Leaves Taken,Alınan İzin, Less Than Amount,Tutardan Az, -Liabilities,Yükümlülükler, +Liabilities,Pasifler, Loading...,Yükleniyor..., Loan Applications from customers and employees.,Müşterilerden ve çalışanlardan kredi uygulamaları., Loan Processes,Kredi Süreçleri, @@ -3482,7 +3482,7 @@ Make Journal Entry,Yevmiye Kaydı Yap, Make Purchase Invoice,Satınalma Faturası Oluşturma, Manufactured,üretilmiş, Mark Work From Home,İşi Evden İşaretle, -Master,Ana Kaynak, +Master,Ana Veriler, Max strength cannot be less than zero.,Maksimum güç sıfırdan az olamaz., Maximum attempts for this quiz reached!,Bu sınav için maksimum deneme yapıldı!, Message,Mesaj, @@ -3492,9 +3492,9 @@ Mobile Number,Cep Numarası, Month,Ay, Name,Adı, Near you,Sana yakın, -Net Profit/Loss,Net Kar/Zarar, +Net Profit/Loss,Net Kâr/Zarar, New Expense,Yeni Gider, -New Invoice,yeni fatura, +New Invoice,Yeni Fatura, New Payment,Yeni Ödeme, New release date should be in the future,Yeni çıkış tarihi olmalı, No Account matched these filters: {},Bu filtrelerle doldurma Hesap yok: {}, @@ -3512,25 +3512,25 @@ Non stock items,Stokta olmayan ürünler, Not Allowed,İzin verilmedi, Not allowed to create accounting dimension for {0},{0} için hesaplama boyutu oluşturmaya izin verilmiyor, Not permitted. Please disable the Lab Test Template,İzin verilmedi. Lütfen Laboratuvar Test Şablonunu devre dışı bırakın, -Note,Olumsuz, -Notes: ,Notlar:, -On Converting Opportunity,Fırsat Dönüştürme Üzerine, -On Purchase Order Submission,Satınalma Siparişi Gönderme İşleminde, -On Sales Order Submission,Satış Siparişi Gönderme, -On Task Completion,Görev Tamamlandıktan Sonra, -On {0} Creation,{0} Yaratılışında, +Note,Not, +Notes: ,Notlar: , +On Converting Opportunity,Fırsat Dönüşümünde, +On Purchase Order Submission,Satınalma Siparişi Gönderiminde, +On Sales Order Submission,Satış Siparişi Gönderiminde, +On Task Completion,Görev Tamamlandığında, +On {0} Creation,{0} Oluşturulduğunda, Only .csv and .xlsx files are supported currently,Şu anda yalnızca .csv ve .xlsx dosyaları desteklenmektedir, Open,Açık, Open Contact,Kişiyi Aç, Open Lead,Açık Aday, Opening and Closing,Açılış ve Kapanış, -Operating Cost as per Work Order / BOM,İş Emri / Ürün Ağacına göre İşletme Maliyeti, +Operating Cost as per Work Order / BOM,İş Emri/BOM'a Göre İşletme Maliyeti, Order Amount,Sipariş Tutarı, Page {0} of {1},{1} {0} Sayfası, -Paid amount cannot be less than {0},Ücretli tutarlar {0} 'dan az olamaz, -Parent Company must be a group company,Ana Şirket bir grup şirket olmalıdır, -Passing Score value should be between 0 and 100,Geçen puan değeri 0 ile 100 arasında olmalıdır, -Patient History,Hasta Öyküsü, +Paid amount cannot be less than {0},Ödenen tutar {0}'dan az olamaz, +Parent Company must be a group company,Ana Şirket bir grup şirketi olmalıdır, +Passing Score value should be between 0 and 100,Geçme puanı 0 ile 100 arasında olmalıdır, +Patient History,Hasta Geçmişi, Pause,Durdur, Pay,Ödeme yap, Payment Document Type,Ödeme Belgesi Türü, @@ -3576,7 +3576,7 @@ Priority,Öncelik, Priority has been changed to {0}.,Öncelik {0} olarak değiştirildi., Priority {0} has been repeated.,{0} önceliği tekrarlandı., Processing XML Files,XML Dosyalarını İşleme, -Profitability,Karlılık, +Profitability,Kârlılık, Project,Proje, Provide the academic year and set the starting and ending date.,Akademik yıl dönümü ve başlangıç ve bitiş tarihini ayarlayın., Public token is missing for this bank,Bu banka için genel belirteç eksik, @@ -3609,7 +3609,7 @@ Recruitment,İşe Alım, Red,Kırmızı, Release date must be in the future,Çıkış tarihi olmalı, Relieving Date must be greater than or equal to Date of Joining,"Rahatlama Tarihi, Katılım Tarihinden büyük veya ona eşit olmalıdır", -Rename,Yeniden adlandır, +Rename,Yeniden Adlandır, Rename Not Allowed,Yeniden Adlandırmaya İzin Verilmiyor, Report Item,Öğeyi Bildir, Report this Item,Bu öğeyi bildirin, @@ -3620,8 +3620,8 @@ Resetting Service Level Agreement.,Servis Seviyesi Sözleşmesini Sıfırlama., Return amount cannot be greater unclaimed amount,Garanti gereksinimleri olmayan tutarlarından fazla olamaz, Review,Gözden geçir, Room,Oda, -Room Type,Oda tipi, -Row # ,Satır #, +Room Type,Oda Tipi, +Row # ,Satır No, Row #{0}: Accepted Warehouse and Supplier Warehouse cannot be same,Satır # {0}: Kabul Edilen Depo ve Tedarikçi Deposu aynı olamaz, Row #{0}: Cannot delete item {1} which has already been billed.,Satır # {0}: Faturalandırılan {1} öğesi silinemiyor., Row #{0}: Cannot delete item {1} which has already been delivered,Satır # {0}: geçmişte yayınlanmış {1} öğesi silinemiyor, @@ -3675,11 +3675,11 @@ Shift Management,Vardiya Yönetimi, Show Future Payments,Gelecekteki Ödemeleri Göster, Show Linked Delivery Notes,Bağlı İrsaliyeleri Göster, Show Sales Person,Satış Elemanını Göster, -Show Stock Ageing Data,Stok Yaşlandırma Verisini Göster, -Show Warehouse-wise Stock,Depo-Stok Stokunu Göster, +Show Stock Ageing Data,Stok Yaşlandırmayı Göster, +Show Warehouse-wise Stock,Depo bazında Stoğu Göster, Size,Boyut, Something went wrong while evaluating the quiz.,Sınavı değerlendirirken bir şey ters gitti., -Sr,Kıdemli, +Sr,Sr, Start,Başlangıç, Start Date cannot be before the current date,"Başlangıç Tarihi, geçerli karşılaştırma önce olamaz", Start Time,Başlangıç Zamanı, @@ -3774,7 +3774,7 @@ You must be a registered supplier to generate e-Way Bill,E-Way Bill'i oluşt You need to login as a Marketplace User before you can add any reviews.,Herhangi bir inceleme ekleyebilmeniz için daha önce bir Marketplace Kullanıcısı olarak giriş yapmanız gerekir., Your Featured Items,Seçtiğiniz Öğeler, Your Items,Öğeleriniz, -Your Profile,senin profil, +Your Profile,Profiliniz, Your rating:,Dereceniz:, and,ve, e-Way Bill already exists for this document,e-İrsaliye bu belge için zaten var, @@ -3782,9 +3782,9 @@ woocommerce - {0},WooCommerce - {0}, {0} Coupon used are {1}. Allowed quantity is exhausted,{0} Kullanılan kupon {1}. İzin verilen miktar tükendi, {0} Operations: {1},{0} İşlemler: {1}, {0} bank transaction(s) created,{0} banka işlemi oluşturuldu, -{0} bank transaction(s) created and {1} errors,{0} banka işlemi oluşturuldu ve {1} hatalar, +{0} bank transaction(s) created and {1} errors,{0} banka işlemi oluşturuldu ve {1} hata, {0} can not be greater than {1},"{0}, {1} 'den büyük olamaz", -{0} conversations,{0} ileti dizisi, +{0} conversations,{0} sohbetler, {0} is not a company bank account,{0} bir şirket banka hesabı değil, {0} is not a group node. Please select a group node as parent cost center,{0} bir grup düğümü değil. Lütfen ana maliyet merkezi olarak bir grup düğümü seçin, {0} is not the default supplier for any items.,"{0}, hiçbir ürün için yerel tedarikçi değildir.", @@ -3792,18 +3792,18 @@ woocommerce - {0},WooCommerce - {0}, {0}: {1} must be less than {2},{0}: {1} {2} 'den küçük olmalı, {} is required to generate E-Way Bill JSON,e-Way Bill JSON'u oluşturmak için gerekli {}, "Invalid lost reason {0}, please create a new lost reason","Geçersiz kayıp neden {0}, lütfen yeni bir kayıp neden oluşturun", -Profit This Year,Bu Yıl Kâr, +Profit This Year,Bu Yılki Kâr, Total Expense,Toplam Gider, -Total Expense This Year,Bu Yıl Toplam Gider, -Total Income,toplam gelir, -Total Income This Year,Bu Yıl Toplam Gelir, +Total Expense This Year,Bu Yılki Toplam Gider, +Total Income,Toplam Gelir, +Total Income This Year,Bu Yılki Toplam Gelir, Barcode,Barkod, Clear,Açık, Comments,Yorumlar, DocType,Belge Türü, Download,İndir, -Left,Sol, -Link,bağlantı, +Left,Ayrıldı, +Link,Bağlantı, New,Yeni, Print,Yazdır, Reference Name,Referans Adı, @@ -3855,7 +3855,7 @@ Operation Id,Operasyon Kimliği, Partially ordered,Yoğun Sıralı, Please select company first,İlk Şirket seçiniz, Please select patient,Lütfen hastayı seçin, -Printed On ,Basım tarihi, +Printed On ,Basım Tarihi, Projected qty,Öngörülen Adet, Sales person,Satış Personeli, Serial No {0} Created,Seri No {0} Oluşturuldu, @@ -3877,9 +3877,6 @@ Percentage,Yüzde, Failed to setup defaults for country {0}. Please contact support@erpnext.com,{0} ülke için varsayılanlar ayarlanamadı. Lütfen support@erpnext.com ile iletişim geçin, Row #{0}: Item {1} is not a Serialized/Batched Item. It cannot have a Serial No/Batch No against it.,Satır # {0}: {1} öğe bir Seri / Toplu İş Öğesi değil. Seri No / Parti No'ya karşı olamaz., Please set {0},Lütfen {0} ayarınız, -Please set {0},Lütfen {0} ayarlayın, -Draft,Taslak, -Cancelled,İptal edildi, Please setup Instructor Naming System in Education > Education Settings,Lütfen Eğitim> Eğitim Yönetimi bölümü Eğitmen Adlandırma Sistemini kurun, Please set Naming Series for {0} via Setup > Settings > Naming Series,Lütfen Kurulum> Ayarlar> Adlandırma Serisi aracılığıyla {0} için Adlandırma Serisini ayarlayın, UOM Conversion factor ({0} -> {1}) not found for item: {2},{2} bileşeni için UOM Dönüşüm faktörü ({0} -> {1}) bulunamadı., @@ -3963,14 +3960,14 @@ The root account {0} must be a group,Kök hesap {0} bir grup olmalıdır, Shipping rule not applicable for country {0} in Shipping Address,Gönderim Adresindeki {0} ülke için gönderi düzenlemesi geçerli değil, Get Payments from,Ödemeleri yaptırın alın, Set Shipping Address or Billing Address,Gönderim Adresini veya Fatura Adresini Ayarlayın, -Consultation Setup,Danışma Kurulumu, -Fee Validity,Ücret geçerliliği, +Consultation Setup,Konsültasyon Ayarları, +Fee Validity,Ücret Geçerliliği, Laboratory Setup,Laboratuvar Kurulumu, -Dosage Form,Dozaj formülü, +Dosage Form,Dozaj Formu, Records and History,Kayıtlar ve Tarih, -Patient Medical Record,Hasta Tıbbi Kayıt, +Patient Medical Record,Hasta Tıbbi Kaydı, Rehabilitation,Rehabilitasyon, -Exercise Type,Egzersiz Tipi, +Exercise Type,Egzersiz Türü, Exercise Difficulty Level,Egzersiz Zorluk Seviyesi, Therapy Type,Tedavi Türü, Therapy Plan,Terapi Planı, @@ -3997,19 +3994,19 @@ Please set a Customer linked to the Patient,Lütfen Hastaya bağlı bir müşter Customer Not Found,Müşteri Bulunamadı, Please Configure Clinical Procedure Consumable Item in ,Lütfen Klinik vida Sarf Malzemesini Yapılandırın, Missing Configuration,Eksik Yapılandırma, -Out Patient Consulting Charge Item,Out Hasta Danışmanlık Ücreti Öğesi, +Out Patient Consulting Charge Item,Ayakta Hasta Muayene Ücreti Öğesi, Inpatient Visit Charge Item,Yatan Hasta Ziyaret Ücreti, OP Consulting Charge,OP Danışmanlık Ücreti, -Inpatient Visit Charge,Yatan Ziyaret Ücreti, +Inpatient Visit Charge,Yatan Hasta Muayene Ücreti, Appointment Status,Randevu Durumu, -Test: ,Ölçek:, -Collection Details: ,Koleksiyon Ayrıntıları:, +Test: ,Test: , +Collection Details: ,Koleksiyon Ayrıntıları: , {0} out of {1},{0} / {1}, Select Therapy Type,Tedavi Türünü Seçin, {0} sessions completed,{0} imzalama tamamlandı, {0} session completed,{0} imzalama tamamlandı, - out of {0},{0} üzerinden, -Therapy Sessions,Terapi Seanları, +out of {0},{0} üzerinden, +Therapy Sessions,Terapi Seansları, Add Exercise Step,Egzersiz Adımı Ekle, Edit Exercise Step,Egzersiz Adımını Düzenleyin, Patient Appointments,Hasta Randevuları, @@ -4017,18 +4014,18 @@ Item with Item Code {0} already exists,Öğe Kodu {0} olan öğe zaten var, Registration Fee cannot be negative or zero,Kayıt Ücreti negatif veya sıfır olamaz, Configure a service Item for {0},{0} için bir hizmet Öğesi yapılandırmanın, Temperature: ,Sıcaklık:, -Pulse: ,Nabiz:, -Respiratory Rate: ,solunum hızı:, -BP: ,BP:, -BMI: ,BMI:, -Note: ,Olumsuz:, -Check Availability,Uygunluk kontrol et, +Pulse: ,Nabız: , +Respiratory Rate: ,Solunum Hızı: , +BP: ,BP: , +BMI: ,BMI: , +Note: ,Not: , +Check Availability,Uygunluğu Kontrol et, Please select Patient first,Lütfen önce Hastayı seçin, Please select a Mode of Payment first,Lütfen önce bir Ödeme Modu seçin, Please set the Paid Amount first,Lütfen önce Ödenen Tutarı ayarı, Not Therapies Prescribed,Reçetesiz Terapiler, There are no Therapies prescribed for Patient {0},Hasta için reçete edilmiş hiçbir Terapi yoktur {0}, -Appointment date and Healthcare Practitioner are Mandatory,Randevu tarihi ve Sağlık Hekimi Zorunludur, +Appointment date and Healthcare Practitioner are Mandatory,Randevu tarihi ve Sağlık Personeli Zorunludur, No Prescribed Procedures found for the selected Patient,Seçilen Hasta için Reçeteli bulunmaması, Please select a Patient first,Lütfen önce bir Hasta seçin, There are no procedure prescribed for ,Herhangi bir cerrahi yoktur., @@ -4036,14 +4033,14 @@ Prescribed Therapies,Reçeteli Tedaviler, Appointment overlaps with ,Randevu şununla sınırlıyor:, {0} has appointment scheduled with {1} at {2} having {3} minute(s) duration.,"{0}, {1} ile {2} için {3} dakikayı misafir etmeyi planladı.", Appointments Overlapping,Çakışan Randevüleri, -Consulting Charges: {0},Danışmanlık Masrafları: {0}, +Consulting Charges: {0},Muayene Ücretleri: {0}, Appointment Cancelled. Please review and cancel the invoice {0},Randevu İptal Edildi. Lütfen faturayı talep edin ve iptal edin {0}, Appointment Cancelled.,Randevu İptal Edildi., Fee Validity {0} updated.,Ücret yaptırımı {0} güncellendi., -Practitioner Schedule Not Found,Uygulayıcı Programı Bulunamadı, +Practitioner Schedule Not Found,Pratisyen Programı Bulunamadı, {0} is on a Half day Leave on {1},"{0}, {1} Yarım Gün İzinde", -{0} is on Leave on {1},"{0}, {1} tarihinde Ayrılmada", -{0} does not have a Healthcare Practitioner Schedule. Add it in Healthcare Practitioner,{0} bir Sağlık Hizmetleri Uygulayıcı Programına sahip değil. Sağlık Uzmanına Ekle, +{0} is on Leave on {1},"{0}, {1} tarihinde İzinde", +{0} does not have a Healthcare Practitioner Schedule. Add it in Healthcare Practitioner,{0} bir Sağlık Personeli Programına sahip değil. Sağlık Uzmanına Ekle, Healthcare Service Units,Sağlık Hizmet Birimleri, Complete and Consume,Tamamla ve Tüket, Complete {0} and Consume Stock?,{0} Tamamlanıp Stok Tüketilsin mi?, @@ -4062,30 +4059,30 @@ Drug(s) Prescribed.,Reçeteli İlaç (lar)., Test(s) Prescribed.,Test (ler) önerilebilir., Procedure(s) Prescribed.,Öngörülen işlemler (ler)., Counts Completed: {0},Tamamlanan Sayımlar: {0}, -Patient Assessment,Hasta değerlendirmesi, -Assessments,değerlendirmeler, +Patient Assessment,Hasta Değerlendirmesi, +Assessments,Değerlendirmeler, Heads (or groups) against which Accounting Entries are made and balances are maintained.,Kafaları (veya grupları) kendisine karşı Muhasebe Girişleri yapılır ve bilançoları korunur., Account Name,Hesap Adı, -Inter Company Account,Şirket Hesabı, +Inter Company Account,Şirketlerarası Hesap, Parent Account,Ana Hesap, -Setting Account Type helps in selecting this Account in transactions.,Hesap Türünü ayarlar işlemlerinde bu hesabın kullanımıen yardımcı olur, +Setting Account Type helps in selecting this Account in transactions.,Hesap Türünün Ayarlanması işlemlerde bu Hesabın seçilmesine yardımcı olur, Chargeable,ücretli, -Rate at which this tax is applied,Vergi uygulama oranı, +Rate at which this tax is applied,Bu verginin uygulanma oranı, Frozen,Dondurulmuş, -"If the account is frozen, entries are allowed to restricted users.","Hesap donmuşsa, girilenler zorla açılır.", -Balance must be,Bakiye şu olmalı, -Lft,Lft, -Rgt,sağ, -Old Parent,Eski yapı, -Include in gross,Brüt dahil, +"If the account is frozen, entries are allowed to restricted users.","Hesabın dondurulması halinde, kısıtlı kullanıcılara giriş yapılmasına izin verilir.", +Balance must be,Bakiye modu, +Lft,Sol, +Rgt,Sağ, +Old Parent,Yaşlı Ebeveyn, +Include in gross,Brüt'e dahil et, Auditor,Denetçi, Accounting Dimension,Muhasebe Boyutu, -Dimension Name,boyut adı, -Dimension Defaults,Boyut varsayılanları, +Dimension Name,Boyut Adı, +Dimension Defaults,Boyut Varsayılanları, Accounting Dimension Detail,Muhasebe Boyut Detayı, Default Dimension,Varsayılan Boyut, -Mandatory For Balance Sheet,Bilanço Zorunlu, -Mandatory For Profit and Loss Account,Kar Zarar Hesabı İçin Zorunlu, +Mandatory For Balance Sheet,Bilanço için Zorunlu, +Mandatory For Profit and Loss Account,Kar ve Zarar Hesabı için Zorunlu, Accounting Period,Muhasebe Dönemi, Period Name,Dönem Adı, Closed Documents,Kapalı Belgeler, @@ -4096,20 +4093,20 @@ Users with this role are allowed to set frozen accounts and create / modify acco Determine Address Tax Category From,Adres Vergi Kategorisini Kimden Belirle, Over Billing Allowance (%),Fazla Fatura Ödeneği (%), Credit Controller,Kredi Kontrolü, -Check Supplier Invoice Number Uniqueness,Kullanıcı tedarikçisi Fatura Numarasını Kontrol Edin, +Check Supplier Invoice Number Uniqueness,Tedarikçi Fatura Numarasının Benzersizliğini Kontrol et, Make Payment via Journal Entry,Devmiye Kayıtları yoluyla Ödeme Yap, Unlink Payment on Cancellation of Invoice,Fatura İptaline İlişkin Ödeme süresini kaldır, -Book Asset Depreciation Entry Automatically,Varlık Amortisman Kaydı Otomatik Olarak Kaydedin, +Book Asset Depreciation Entry Automatically,Varlık Amortisman Kaydını Otomatik olarak Kaydet, Automatically Add Taxes and Charges from Item Tax Template,Öğe Vergisi Şablonundan Otomatik Olarak Vergi ve Masraf Ekleme, Automatically Fetch Payment Terms,Ödeme Şifrelerini Otomatik Olarak Al, -Show Payment Schedule in Print,Ödeme Programının Baskıda Göster, +Show Payment Schedule in Print,Ödeme Planını Baskıda Göster, Currency Exchange Settings,Döviz Kuru Ayarları, Allow Stale Exchange Rates,Eski Döviz Kurlarına İzin Ver, Stale Days,Eski Günler, Report Settings,Rapor Ayarları, Use Custom Cash Flow Format,Özel Nakit Akışı Biçimini Kullan, Allowed To Transact With,İle İşlem Yapmaya İzin Verildi, -SWIFT number,SWIFT numarası, +SWIFT number,SWIFT Numarası, Branch Code,Şube Kodu, Address and Contact,Adresler ve Kontaklar, Address HTML,Adres HTML'si, @@ -4148,8 +4145,8 @@ Charges Incurred,Yapılan Ücretler, Fixed Deposit Number,Sabit Mevduat Numarası, Account Currency,Hesabın Döviz Cinsi, Select the Bank Account to reconcile.,Mutabakata var olacak Banka Hesabını Seçin., -Include Reconciled Entries,Mutabık girdileri dahil edin, -Get Payment Entries,Ödeme Girişleri alınsın, +Include Reconciled Entries,Mutabakatı Yapılan Girişleri Dahil Et, +Get Payment Entries,Ödeme Kayıtlarını Getir, Payment Entries,Ödeme Girişleri, Update Clearance Date,Temizleme Tarihini Güncelle, Bank Reconciliation Detail,Banka Mutabakat Ayrıntısı, @@ -4300,13 +4297,13 @@ Year Start Date,Yıl Başlangıç Tarihi, Year End Date,Yıl Bitiş Tarihi, Companies,Şirketler, Auto Created,Otomatik Yapılandırıldı, -Stock User,Hisse Senedi Kullanıcısı, +Stock User,Stok Kullanıcısı, Fiscal Year Company,Mali Yıl Şirketi, Debit Amount,Borç Tutarı, Credit Amount,Kredi Tutarı, Debit Amount in Account Currency,Hesap Para Bankamatik Tutarı, Credit Amount in Account Currency,Hesap Para Birimi Kredi Tutarı, -Voucher Detail No,Föy Detay no, +Voucher Detail No,Fiş Detay No, Is Opening,Açılış mı, Is Advance,Avans mı, To Rename,Yeniden Adlandırılacak, @@ -4434,7 +4431,7 @@ Payment Entry Reference,Ödeme giriş Referansı, Allocated,Ayrılan, Payment Gateway Account,Ödeme Gateway Hesabı, Payment Account,Ödeme Hesabı, -Default Payment Request Message,Standart Ödeme Talebi Mesajı, +Default Payment Request Message,Varsayılan Ödeme Talebi Mesajı, PMO-,PMO-, Payment Order Type,Ödeme Emri Türü, Payment Order Reference,Ödeme Sipariş Referansı, @@ -4470,8 +4467,8 @@ Make Sales Invoice,Satış Faturası Oluşturma, Mute Email,E-postayı Sessize Al, payment_url,payment_url, Payment Gateway Details,Ödeme Gateway Detayları, -Payment Schedule,Ödeme Planla, -Invoice Portion,Fatura Porsiyonu, +Payment Schedule,Ödeme Planı, +Invoice Portion,Fatura Dilimi, Payment Amount,Ödeme Tutarı, Payment Term Name,Ödeme Süresi Adı, Due Date Based On,Vade Tarihine göre, @@ -4559,7 +4556,7 @@ Discount Type,İndirim Türü, ACC-PINV-.YYYY.-,ACC-PINV-.YYYY.-, Tax Withholding Category,Vergi Stopajı Kategorisi, Edit Posting Date and Time,İşlem Tarihi ve Saatini Düzenle, -Is Paid,Ücretli/Ödendi mi, +Is Paid,Ödendi mi, Is Return (Debit Note),Iade mi (Borç dekontu), Apply Tax Withholding Amount,Vergi Stopaj Tutarını Uygula, Accounting Dimensions ,Muhasebe Boyutları, @@ -4567,7 +4564,7 @@ Supplier Invoice Details,Tedarikçi Fatura Ayrıntıları, Supplier Invoice Date,Tedarikçi Fatura Tarihi, Return Against Purchase Invoice,Karşı Satınalma Fatura Dönüş, Select Supplier Address,Tedarikçi Adresi Seç, -Contact Person,İrtibat Kişi, +Contact Person,İlgili Kişi, Select Shipping Address,Teslimat Adresi Seç, Currency and Price List,Fiyat Listesi ve Para Birimi, Price List Currency,Fiyat Listesi Para Birimi, @@ -4582,7 +4579,7 @@ Supplied Items,Verilen Öğeler, Total (Company Currency),Toplam (Şirket Dövizi), Net Total (Company Currency),Net Toplam (Şirket Dövizi), Total Net Weight,Toplam Net Ağırlık, -Shipping Rule,Nakliye Kuralı, +Shipping Rule,Sevkiyat Kuralı, Purchase Taxes and Charges Template,Alış Vergisi ve Harçlar Şablonu, Purchase Taxes and Charges,Alış Vergisi ve Harçları, Tax Breakup,Vergi Kırılımı, @@ -4594,7 +4591,7 @@ Taxes and Charges Added,Eklenen Vergi ve Harçlar, Taxes and Charges Deducted,Düşülen Vergi ve Harçlar, Total Taxes and Charges,Toplam Vergi ve Harçlar, Additional Discount,Ek İndirim, -Apply Additional Discount On,Ek İndirim Uygula şuna göre, +Apply Additional Discount On,Ek İndirim Uygulama Modu, Additional Discount Amount (Company Currency),Ek İndirim Tutarı (Şirket Para Birimi), Additional Discount Percentage,Ek İndirim Yüzdesi, Additional Discount Amount,Ek İndirim Tutarı, @@ -4614,7 +4611,7 @@ Advances,Avanslar, Terms,Vade ve Şartlar, Terms and Conditions1,Şartlar ve Koşullar 1, Group same items,Aynı Ögeleri Grupla, -Print Language,Baskı Dili, +Print Language,Yazdırma Dili, "Once set, this invoice will be on hold till the set date","Ayarlandıktan sonra, bu fatura yazılan tarihe kadar beklemeye alınır.", Credit To,Alacak Yeri, Party Account Currency,Cari Hesabı Dövizi, @@ -4770,11 +4767,11 @@ Folio no.,Folyo serisi., Address and Contacts,Adres ve Kişiler, Contact List,Kişi Listesi, Hidden list maintaining the list of contacts linked to Shareholder,Hissedar ile bağlantılı alıcıları koruyan gizli liste, -Specify conditions to calculate shipping amount,Nakliye masraflarını karşılamak için koşullar, +Specify conditions to calculate shipping amount,Sevkiyat masraflarını karşılamak için koşullar, Shipping Rule Label,Kargo Kural Etiketi, example: Next Day Shipping,Örnek: Bir sonraki gün sevkiyat, -Shipping Rule Type,Nakliye Kuralı Türü, -Shipping Account,Nakliye Hesabı, +Shipping Rule Type,Sevkiyat Kuralı Türü, +Shipping Account,Sevkiyat Hesabı, Calculate Based On,Şuna Göre Hesapla, Fixed,Sabit, Net Weight,Net Ağırlık, @@ -4783,10 +4780,10 @@ Shipping Rule Conditions,Kargo Kural Koşulları, Restrict to Countries,Ülkelere Kısıtla, Valid for Countries,Ülkeler için geçerli, Shipping Rule Condition,Kargo Kural Şartları, -A condition for a Shipping Rule,Nakliye Kuralı için şart, +A condition for a Shipping Rule,Sevkiyat Kuralı için şart, From Value,Baş. Değeri, To Value,Bitiş Değeri, -Shipping Rule Country,Nakliye Kural Ülke, +Shipping Rule Country,Sevkiyat Kural Ülke, Subscription Period,Abonelik Süresi, Subscription Start Date,Abonelik Başlangıç Tarihi, Cancelation Date,İptal Tarihi, @@ -5006,8 +5003,8 @@ Purpose,Amaç, Stock Manager,Stok Yöneticisi, Asset Movement Item,Varlık Hareketi Öğesi, Source Location,Kaynak Konum, -From Employee,çalışanlardan, -Target Location,hedef konum, +From Employee,Talep eden Personel, +Target Location,Hedef Konum, To Employee,çalışanlara, Asset Repair,Varlık Tamiri, ACC-ASR-.YYYY.-,ACC-ASR-.YYYY.-, @@ -5028,9 +5025,9 @@ Is Container,Konteyner mu, Check if it is a hydroponic unit,Hidroponik bir ünite olup olmadığını kontrol edin, Location Details,Konum Detayları, Latitude,Enlem, -Longitude,boylam, +Longitude,Boylam, Area,alan, -Area UOM,Alan UOM, +Area UOM,Alan Birimi, Tree Details,ağaç Detayları, Maintenance Team Member,Bakım Ekibi Üyesi, Team Member,takım üyesi, @@ -5039,15 +5036,15 @@ Buying Settings,Satınalma Ayarları, Settings for Buying Module,Modülü satınalmak için Ayarlar, Supplier Naming By,Tedarikçi Adlandırma, Default Supplier Group,Varsayılan Tedarikçi Grubu, -Default Buying Price List,Standart Alış Fiyat Listesi, -Backflush Raw Materials of Subcontract Based On,Taşeronluk Hammadde Maliyetini Şuna göre yap, +Default Buying Price List,Varsayılan Alış Fiyat Listesi, +Backflush Raw Materials of Subcontract Based On,Taşerona Dayalı Hammadde Maliyetini Şuna göre yap, Material Transferred for Subcontract,Taşeron için Transfer Edilen Malzeme, Over Transfer Allowance (%),Aşırı Transfer Ödeneği (%), Percentage you are allowed to transfer more against the quantity ordered. For example: If you have ordered 100 units. and your Allowance is 10% then you are allowed to transfer 110 units.,"Yüzde, sipariş edilen miktara karşı daha fazla transfer yapmanıza izin verilir. Örneğin: 100 birim sipariş ettiyseniz. Harcırahınız %10'dur ve 110 birim aktarmanıza izin verilecektir.", PUR-ORD-.YYYY.-,PUR-ORD-.YYYY.-, Get Items from Open Material Requests,Açık Malzeme Talepleri Öğeleri Alındı, Fetch items based on Default Supplier.,Varsayılan tedarikçiye göre öğeleri getirin., -Required By,Gerekli, +Required By,Gerekli tarih, Order Confirmation No,Sipariş Onay No, Order Confirmation Date,Sipariş Onay Tarihi, Customer Mobile No,Müşteri Mobil No, @@ -5059,7 +5056,7 @@ Purchase Order Pricing Rule,Satınalma Siparişi Fiyatlandırma Kuralı, Set Reserve Warehouse,Rezerv Deposunu Ayarla, In Words will be visible once you save the Purchase Order.,Alış Siparişini kaydettiğinizde Yazıyla görünür olacaktır., Advance Paid,Ödenen Avans, -Tracking,Takip etme, +Tracking,Takip, % Billed,% Faturalandı, % Received,% Alındı, Ref SQ,Ref SQ, @@ -5073,7 +5070,7 @@ Supplier Quotation Item,Tedarikçi Teklif ürünü, Against Blanket Order,Açık Siparişe Karşı, Blanket Order,Açık Sipariş, Blanket Order Rate,Açık Sipariş Oranı, -Returned Qty,İade edilen Adet, +Returned Qty,İade edilen Miktar, Purchase Order Item Supplied,Tedarik Edilen Satınalma Siparişi Ürünü, BOM Detail No,BOM Detay yok, Stock Uom,Stok Ölçü Birimi, @@ -5096,12 +5093,12 @@ Name and Type,Adı ve Türü, SUP-.YYYY.-,SUP-.YYYY.-, Default Bank Account,Varsayılan Banka Hesabı, Is Transporter,Nakliyeci mi, -Represents Company,Şirketi Temsil eder, +Represents Company,Şirketi Temsil Ediyor, Supplier Type,Tedarikçi Türü, Allow Purchase Invoice Creation Without Purchase Order,Satınalma Siparişi olmadan Satınalma Faturası Oluşturmaya İzin Ver, Allow Purchase Invoice Creation Without Purchase Receipt,Satınalma İrsaliye olmadan Satınalma Faturası Oluşturmaya İzin Ver, -Warn RFQs,RFQ'ları Uyar, -Warn POs,Dikkatli Uyarılar Uyar, +Warn RFQs,RFQs Uyarısı, +Warn POs,Satınalma Sipariş Uyarısı, Prevent RFQs,RFQ'ları Önle, Prevent POs,PO'ları Önle, Billing Currency,Fatura Para Birimi, @@ -5109,7 +5106,7 @@ Default Payment Terms Template,Varsayılan Ödeme Vadesi Şablonu, Block Supplier,Tedarikçiyi Engelle, Hold Type,Tutma Tipi, Leave blank if the Supplier is blocked indefinitely,tedarikçi süresiz olarak engellendiyse boş bırakma, -Default Payable Accounts,Standart Borç Hesapları, +Default Payable Accounts,Varsayılan Borç Hesapları, Mention if non-standard payable account,Standart dışı borç hesabı varsa belirtin, Default Tax Withholding Config,Varsayılan Vergi Durdurma Yapılandırması, Supplier Details,Tedarikçi Ayrıntıları, @@ -5120,13 +5117,13 @@ Link to material requests,Malzeme taleplerine bağlantı, Rounding Adjustment (Company Currency,Yuvarlama Ayarı (Şirket Kuru, Auto Repeat Section,Otomatik Tekrar Bölümü, Is Subcontracted,Taşerona verildi, -Lead Time in days,Teslim Süresi gün olarak, +Lead Time in days,Teslimat Süresi gün olarak, Supplier Score,Tedarikçi Puanı, Indicator Color,Gösterge Rengi, Evaluation Period,Değerlendirme Süresi, -Per Week,Haftada, -Per Month,onun ay, -Per Year,Yıl başına, +Per Week,Haftalık, +Per Month,Aylık, +Per Year,Yıllık, Scoring Setup,Puanlama Ayarları, Weighting Function,Ağırlıklandırma İşlevi, "Scorecard variables can be used, as well as:\n{total_score} (the total score from that period),\n{period_number} (the number of periods to present day)\n","Puan kartı değişkenleri yanı sıra: {total_score} (o dönem toplam puanı), {period_number} (mevcut gün genel sayısı)", @@ -5146,20 +5143,20 @@ Criteria Formula,Kriterler Formülü, Criteria Weight,Ölçütler Ağırlık, Supplier Scorecard Period,tedarikçisi Puan Kartı Dönemi, PU-SSP-.YYYY.-,PU-SSP-.YYYY.-, -Period Score,Dönem Notu, +Period Score,Dönem Skoru, Calculations,Hesaplamalar, Criteria,Kriterler, -Variables,değişkenler, +Variables,Değişkenler, Supplier Scorecard Setup,tedarikçisi Puan Kartı Kurulumu, Supplier Scorecard Scoring Criteria,Tedarikçi Puan Kartı Puanlama Kriterleri, -Score,Gol, +Score,Skor, Supplier Scorecard Scoring Standing,tedarikçi Puan Kartı Puanlama, Standing Name,Daimi Adı, -Purple,mor, -Yellow,sari, +Purple,Mor, +Yellow,Sarı, Orange,Portakal, Min Grade,Asgari Not, -Max Grade,Maksimum Sınıf, +Max Grade,Maksimum Not, Warn Purchase Orders,Satınalma Siparişlerini Uyarın, Prevent Purchase Orders,Satınalma Siparişlerini Önleme, Employee ,Çalışan, @@ -5169,24 +5166,24 @@ Parameter Name,Parametre Adı, Supplier Scorecard Standing,Tedarikçi Puan Kartı Durumu, Notify Other,Diğerini bildir, Supplier Scorecard Variable,Tedarikçi Puan Kartı Değişkeni, -Call Log,çağrı geçmişi, -Received By,gözaltına alındı, -Caller Information,Arayan bilgisi, -Contact Name,İrtibat İsmi, +Call Log,Çağrı Geçmişi, +Received By,Tarafından alındı, +Caller Information,Arayan Bilgisi, +Contact Name,Kişi Adı, Lead ,Müşteri Adayı , Lead Name,Müşteri Aday Adı, -Ringing,Ringing, -Missed,Kaçırılan, -Call Duration in seconds,Saniye süresi Çağrı Süresi, -Recording URL,URL kaydetme, +Ringing,Çalıyor..., +Missed,Kaçırıldı, +Call Duration in seconds,Çağrı Süresi saniye oalrak, +Recording URL,URL kaydediliyor, Communication Medium,Haberleşme Orta, Communication Medium Type,İletişim Orta İpucu, -Voice,ses, +Voice,Ses, Catch All,Tümünü Yakala, "If there is no assigned timeslot, then communication will be handled by this group","Atanan zaman dilimi yoksa, iletişim bu grup tarafından gerçekleştirilecektir.", Timeslots,Zaman dilimleri, Communication Medium Timeslot,İletişim Orta Zaman Çizelgesi, -Employee Group,Çalışan Grubu, +Employee Group,Personel Grubu, Appointment,Randevu, Scheduled Time,Planlanmış Zaman, Unverified,Doğrulanmamış, @@ -5201,7 +5198,7 @@ Enable Appointment Scheduling,Randevu Zamanlamayı Etkinleştirme, Agent Details,Temsilci Detayları, Availability Of Slots,Yuvaların Kullanılabilirliği, Number of Concurrent Appointments,Eşzamanlı Randevu Sayısı, -Agents,Ajanlar, +Agents,Temsilciler, Appointment Details,Randevu Detayları, Appointment Duration (In Minutes),Randevu Süresi (Dakika), Notify Via Email,E-posta ile Bildir, @@ -5212,43 +5209,43 @@ Success Redirect URL,Başarı Yönlendirme URL'si, "Leave blank for home.\nThis is relative to site URL, for example ""about"" will redirect to ""https://yoursitename.com/about""","Ev için boş bırakın. Bu site URL'sine göredir, örneğin "yaklaşık", "https://alanadınız.com.tr/about" teslim yönlendirmeleri", Appointment Booking Slots,Randevu Rezervasyon Slotları, Day Of Week,Haftanın günü, -From Time ,Baş. Süresi, +From Time ,Baş. Zamanı, Campaign Email Schedule,Kampanya E-posta Programı, -Send After (days),Sonra Gönder (gün), +Send After (days),(x Gün) Sonra Gönder, Signed,İmzalandı, Party User,Cari Kullanıcısı, Unsigned,İmzalanmadı, -Fulfilment Status,Yerine Getirilme Durumu, +Fulfilment Status,Karşılanma Durumu, N/A,N / A, -Unfulfilled,yerine getirilmemiş, -Partially Fulfilled,Kısmen Yerine Getirildi, -Fulfilled,Karşılanan, +Unfulfilled,Karşılanmamış, +Partially Fulfilled,Kısmen Karşılandı, +Fulfilled,Karşılandı, Lapsed,Süresi dolmuş, -Contract Period,Sözleşme süresi, +Contract Period,Sözleşme Dönemi, Signee Details,Signee Ayrıntıları, Signee,İmza Atan, Signed On,İmzalama tarihi, Contract Details,Sözleşme Detayları, Contract Template,Sözleşme Şablonu, -Contract Terms,Sözleşme koşulları, -Fulfilment Details,Yerine Getirme Detayları, +Contract Terms,Sözleşme Hükümleri, +Fulfilment Details,Gereksinim Detayları, Requires Fulfilment,Yerine Getirilmesi Gerekir, Fulfilment Deadline,Son Teslim Tarihi, -Fulfilment Terms,Yerine Getirme Koşulları, -Contract Fulfilment Checklist,Sözleşme Yerine Getirilmesi Kontrol Listesi, -Requirement,Gereklilik, -Contract Terms and Conditions,Sözleşme Hüküm ve Hükümleri, -Fulfilment Terms and Conditions,Yerine Getirme Hükümleri ve Hükümleri, -Contract Template Fulfilment Terms,Sözleşme Şablonu Yerine Getirilmesi Şartları, +Fulfilment Terms,Yerine Getirme Şartları, +Contract Fulfilment Checklist,Sözleşme Karşılanma Kontrol Listesi, +Requirement,Gereksinim, +Contract Terms and Conditions,Sözleşme Şartları ve Koşulları, +Fulfilment Terms and Conditions,Yerine Getirilme Şartları ve Koşulları, +Contract Template Fulfilment Terms,Sözleşme Şablonu Karşılanma Şartları, Email Campaign,E-posta Kampanyası, -Email Campaign For ,E-posta Kampanyası, -Lead is an Organization,Kurşun bir Teşkilattır, -CRM-LEAD-.YYYY.-,CRM-KURŞUN-.YYYY.-, +Email Campaign For ,E-posta Kampanyası , +Lead is an Organization,Aday bir İşletmedir, +CRM-LEAD-.YYYY.-,CRM-ADAY-.YYYY.-, Person Name,Kişi Adı, Lost Quotation,Teklif Kaybedildi, -Interested,İlgili, +Interested,İlgilenildi, Converted,Dönüştürüldü, -Do Not Contact,İletişime Geçme, +Do Not Contact,İletişime Geçmeyin!, From Customer,Müşteriden, Campaign Name,Kampanya Adı, Follow Up,Takip et, @@ -5261,10 +5258,10 @@ Lead Type,Aday Tipi, Channel Partner,Kanal Ortağı, Consultant,Danışman, Market Segment,Pazar Segmenti, -Industry,Sanayi, -Request Type,İstek Türü, +Industry,Sektör, +Request Type,Talep Türü, Product Enquiry,Ürün Sorgulama, -Request for Information,Bilgi İsteği, +Request for Information,Bilgi Talebi, Suggestions,Öneriler, Blog Subscriber,Blog Abonesi, LinkedIn Settings,LinkedIn Ayarları, @@ -5301,11 +5298,11 @@ Social Media Post,Sosyal Medya Gönderisi, Post Status,Gönderim Durumu, Posted,Gönderildi, Share On,Paylaş, -Twitter,twitter, +Twitter,Twitter, LinkedIn,LinkedIn, Twitter Post Id,Twitter Gönderim Kimliği, LinkedIn Post Id,LinkedIn Gönderim Kimliği, -Tweet,Civildamak, +Tweet,Tweet, Twitter Settings,Twitter Ayarları, API Secret Key,API Gizli Anahtarı, Term Name,Dönem Adı, @@ -5313,22 +5310,22 @@ Term Start Date,Dönem Başlangıç Tarihi, Term End Date,Dönem Bitiş Tarihi, Academics User,Akademik Kullanıcı, Academic Year Name,Akademik Yıl Adı, -Article,makale, +Article,Makale, LMS User,LMS Kullanıcısı, Assessment Criteria Group,Değerlendirme Ölçüleri Grup, Assessment Group Name,Değerlendirme Grubu Adı, Parent Assessment Group,Veli Değerlendirme Grubu, Assessment Name,Değerlendirme Adı, Grading Scale,Notlandırma cihazı, -Examiner,müfettiş, -Examiner Name,sınav adı, -Supervisor,süpervizör, +Examiner,Sınav görevlisi, +Examiner Name,Sınav görevlisi adı, +Supervisor,Süpervizör, Supervisor Name,Süpervizör Adı, -Evaluate,değerlendirme, +Evaluate,Değerlendir, Maximum Assessment Score,Maksimum Değerlendirme Puanı, Assessment Plan Criteria,Değerlendirme Planı Kriterleri, Maximum Score,Maksimum Skor, -Grade,sınıf, +Grade,Not, Assessment Result Detail,Değerlendirme Sonuçlarının Ayrıntıları, Assessment Result Tool,Değerlendirme Sonucu Aracı, Result HTML,sonuç HTML, @@ -5336,32 +5333,32 @@ Content Activity,İçerik Etkinliği, Last Activity ,oğlu Aktivite, Content Question,İçerik Sorusu, Question Link,Soru Bağlantısı, -Course Name,Ders Adı, -Topics,başlıklar, -Hero Image,Kahraman Resmi, +Course Name,Kurs Adı, +Topics,Başlıklar, +Hero Image,Hero Resmi, Default Grading Scale,Varsayılan Derecelendirme Ölçeği, Education Manager,Eğitim Yöneticisi, Course Activity,Kurs Etkinliği, -Course Enrollment,Kür Kayıt, +Course Enrollment,Kurs Kayıt, Activity Date,Faaliyet Tarihi, -Course Assessment Criteria,Ders Değerlendirme Kriterleri, +Course Assessment Criteria,Kurs Değerlendirme Kriterleri, Weightage,Ağırlık, Course Content,Kurs içeriği, -Quiz,bilgi yarışması, -Program Enrollment,programı kayıdı, -Enrollment Date,başvuru tarihi, +Quiz,Quiz Sınav, +Program Enrollment,Programı Kaydı, +Enrollment Date,Başvuru Tarihi, Instructor Name,Öğretim Elemanının Adı, EDU-CSH-.YYYY.-,EDU-CSH-.YYYY.-, Course Scheduling Tool,Ders Planlama Aracı, Course Start Date,Kurs Başlangıç Tarihi, -To TIme,Zamana, +To TIme,Bitiş Zamanı, Course End Date,Kurs Bitiş Tarihi, -Course Topic,Ders Konusu, +Course Topic,Kurs Konusu, Topic Name,Konu Adı, Education Settings,Eğitim Ayarları, Current Academic Year,Mevcut Akademik Yıl, Current Academic Term,Mevcut Akademik Dönem, -Attendance Freeze Date,Seyirci Dondurma Tarihi, +Attendance Freeze Date,Katılım Dondurma Tarihi, Validate Batch for Students in Student Group,Öğrenci Topluluğundaki Öğrenciler İçin Toplu İşi Doğrula, "For Batch based Student Group, the Student Batch will be validated for every Student from the Program Enrollment.","Toplu İş Tabanlı Öğrenci Grubu için, Öğrenci Toplu işlemi, Program Kayıttan her Öğrenci için geçerli olmayacaktır.", Validate Enrolled Course for Students in Student Group,Kayıtlı Dersi Grubu Öğrenci Öğrencileri için Doğrula, @@ -5371,12 +5368,12 @@ Make Academic Term Mandatory,Akademik Şartı Zorunlu Yap, Skip User creation for new Student,Yeni Öğrenci için Kullanıcı oluşturmayı atla, "By default, a new User is created for every new Student. If enabled, no new User will be created when a new Student is created.","Varsayılan olarak, her yeni Öğrenci için yeni bir Kullanıcı oluşturur. Etkinleştirilirse, yeni bir Öğrenci oluşturulduğunda yeni Kullanıcı oluşturulmayacaktır.", Instructor Records to be created by,Öğretmen Kayıtları tarafından oluşturulacak, -Employee Number,çalışan sayısı, +Employee Number,Personel Sayısı, Fee Category,Ücret Kategorisi, Fee Component,Ücret Bileşeni, Fees Category,Ücretler Kategorisi, -Fee Schedule,ücret Tarifesi, -Fee Structure,ücret Yapısı, +Fee Schedule,Ücret Tarifesi, +Fee Structure,Ücret Yapısı, EDU-FSH-.YYYY.-,EDU-FSH .YYYY.-, Fee Creation Status,Ücret Oluşturma Durumu, In Process,Devam ediyor, @@ -5411,12 +5408,12 @@ Guardian Of ,Velinin, Students,Öğrenciler, Guardian Interests,Veli İlgi Alanları, Guardian Interest,Veli İlgi Alanı, -Interest,Faiz, +Interest,İlgi Alanı, Guardian Student,Veli Öğrenci, EDU-INS-.YYYY.-,EDU-INS-.YYYY.-, Instructor Log,Eğitmen Günlüğü, Other details,Diğer Detaylar, -Option,seçenek, +Option,Seçenek, Is Correct,Doğru, Program Name,Programın Adı, Program Abbreviation,Program Kısaltma, @@ -5425,8 +5422,8 @@ Is Published,Yayınlandı, Allow Self Enroll,Kendi Kendine Kayda İzin Ver, Is Featured,Özellikli, Intro Video,Tanıtım Videoları, -Program Course,programı Ders, -School House,okul evi, +Program Course,Program Kursu, +School House,Okul Evi, Boarding Student,Yatılı Öğrenci, Check this if the Student is residing at the Institute's Hostel.,Öğrenci Enstitü Pansiyonunda ikamet ediyorsa bunu kontrol edin., Walking,Yürüme, @@ -5461,44 +5458,44 @@ Grading Basis,Derecelendirme Tabanı, Latest Highest Score,En Son En Yüksek Puan, Latest Attempt,Son Girişim, Quiz Activity,Sınav Etkinliği, -Enrollment,kayıt, -Pass,geçiş, +Enrollment,Kayıt, +Pass,Geçti, Quiz Question,Sınav Sorusu, Quiz Result,Sınav Sonucu, -Selected Option,Seçili Seçenek, +Selected Option,Seçilen Seçenek, Correct,Doğru, -Wrong,yanlış, -Room Name,oda ismi, -Room Number,Oda numarası, +Wrong,Yanlış, +Room Name,Oda Adı, +Room Number,Oda Numarası, Seating Capacity,oturma kapasitesi, -House Name,Evin adı, +House Name,Evin Adı, EDU-STU-.YYYY.-,EDU-STU-.YYYY.-, Student Mobile Number,Öğrenci Cep Numarası, -Blood Group,kan grubu, -A+,+, +Blood Group,Kan Grubu, +A+,A+, A-,A-, B+,B+, B-,B-, -O+,O +, -O-,Ö-, +O+,0+, +O-,0-, AB+,AB+, AB-,AB-, -Nationality,milliyet, -Home Address,Ev adresi, -Guardian Details,Guardian Detayları, +Nationality,Milliyet, +Home Address,Ev Adresi, +Guardian Details,Veli Detayları, Guardians,Veliler, -Sibling Details,kardeş Detaylar, -Siblings,kardeşler, -Exit,Çıkış, -Date of Leaving,Ayrılış tarihi, +Sibling Details,Kardeş Detaylar, +Siblings,Kardeşler, +Exit,Çıkış (Ayrılma), +Date of Leaving,Ayrılma Tarihi, Leaving Certificate Number,Sertifika Numarası Ayrılıyor, -Reason For Leaving,Ayrılma sebebi, +Reason For Leaving,Ayrılma Nedeni, Student Admission,Öğrenci Kabulü, Admission Start Date,Kabul Başlangıç Tarihi, Admission End Date,Kabul Bitiş Tarihi, Eligibility and Details,Uygunluk ve Ayrıntılar, Student Admission Program,Öğrenci Kabul Programı, -Minimum Age,asgari yaş, +Minimum Age,Minimum Yaş, Maximum Age,Maksimum Yaş, Application Fee,başvuru ücreti, Naming Series (for Student Applicant),Seri İsimlendirme (Öğrenci Başvurusu için), @@ -5519,7 +5516,7 @@ Get Courses,Kursları alın, Separate course based Group for every Batch,Her Toplu İş için Ayrılmış Kurs Tabanlı Grup, Leave unchecked if you don't want to consider batch while making course based groups. ,"Kurs temelli gruplar yaparken toplu düşünmeyi sonlandırın, gecen.", Student Group Creation Tool Course,Öğrenci Grubu Oluşturma Aracı Kursu, -Course Code,Kür kodu, +Course Code,Kurs kodu, Student Group Instructor,Öğrenci Grubu Eğitimi, Student Group Student,Öğrenci Öğrenci Grubu, Group Roll Number,Grup Rulosu Numarası, @@ -5585,30 +5582,30 @@ Exotel Settings,Exotel Ayarları, Account SID,Hesap SID'si, API Token,API Simgesi, GoCardless Mandate,GoCardless Yetkisi, -Mandate,manda, +Mandate,Mandate, GoCardless Customer,GoCardless Müşterisi, GoCardless Settings,GoCardsız Ayarları, Webhooks Secret,Web kancaları Sırrı, -Plaid Settings,Ekose Ayarları, -Synchronize all accounts every hour,Tüm hesapları her saat başı senkronizasyon et, -Plaid Client ID,Ekose Müşteri Kimliği, -Plaid Secret,Ekose Sırrı, -Plaid Environment,Ekose Çevre, -sandbox,kum havuzu, -development,gelişme, +Plaid Settings,Plaid Ayarları, +Synchronize all accounts every hour,Tüm hesapları her saat başı senkronize et, +Plaid Client ID,Plaid Client ID, +Plaid Secret,Plaid Secret, +Plaid Environment,Plaid Environment, +sandbox,sandbox, +development,geliştirme, production,üretim, QuickBooks Migrator,QuickBooks Migrator, Application Settings,Uygulama Ayarları, Token Endpoint,Token Bitiş Noktası, -Scope,kapsama, +Scope,Kapsam, Authorization Settings,Yetkilendirme Ayarları, Authorization Endpoint,Yetkilendirme Bitiş Noktası, Authorization URL,Yetkilendirme URL'si, Quickbooks Company ID,Quickbooks Şirket Kimliği, Company Settings,Firma Ayarları, Default Shipping Account,Varsayılan Kargo Hesabı, -Default Warehouse,Standart Depo, -Default Cost Center,Standart Maliyet Merkezi, +Default Warehouse,Varsayılan Depo, +Default Cost Center,Varsayılan Maliyet Merkezi, Undeposited Funds Account,Belirtilmemiş Fon Hesabı, Shopify Log,Shopify Günlüğü, Shopify Settings,Shopify Ayarları, @@ -5618,7 +5615,7 @@ App Type,Uygulama Türü, Last Sync Datetime,Son Senkronizasyon Tarihi, Shop URL,Mağaza URL'si, eg: frappe.myshopify.com,örnekleme: frappe.myshopify.com, -Shared secret,Paylaşılan sır, +Shared secret,Paylaşılan secret, Webhooks Details,Webhooks Ayrıntılar, Webhooks,Webhooks, Customer Settings,Müşteri Ayarları, @@ -5710,7 +5707,7 @@ Change In Item,Öğede Değişim, Codification Table,Kodlama Tablosu, Complaints,şikayetçi, Dosage Strength,Dozaj Mukavemeti, -Strength,kuvvet, +Strength,Mukavemet, Drug Prescription,İlaç Reçetesi, Drug Name / Description,İlaç Adı / Açıklama, Dosage,Dozaj, @@ -5719,7 +5716,7 @@ Interval,Aralık, Interval UOM,Aralık Birimi, Hour,Saat, Update Schedule,Programı Güncelle, -Exercise,Egzersiz yapmak, +Exercise,Egzersiz, Difficulty Level,Zorluk seviyesi, Counts Target,Hedefi Sayar, Counts Completed,Tamamlanan Sayımlar, @@ -5735,19 +5732,19 @@ Exercise Type Step,Egzersiz Türü Adım, Max number of visit,Maks Ziyaret Sayısı, Visited yet,Henüz ziyaret edilmedi, Reference Appointments,Referans Randevuları, -Valid till,Kadar geçerli, +Valid till,Geçerlilik tarihi, Fee Validity Reference,Ücret geçerlilik Referansı, Basic Details,Temel Ayrıntılar, HLC-PRAC-.YYYY.-,HLC-PRAC-.YYYY.-, -Mobile,seyyar, -Phone (R),Telefon (Sağ), +Mobile,Cep Telefonu, +Phone (R),Telefon (R), Phone (Office),Telefon (Ofis), Employee and User Details,Çalışan ve Kullanıcı Ayrıntıları, Hospital,Hastane, -Appointments,randevular, -Practitioner Schedules,Uygulayıcı Takvimi, +Appointments,Randevular, +Practitioner Schedules,Pratisyen Takvimi, Charges,Masraflar, -Out Patient Consulting Charge,Dışarıdan Hasta Danışma Ücreti, +Out Patient Consulting Charge,Dışarıdan Hasta Muayene Ücreti, Default Currency,Varsayılan Para Birimi, Healthcare Schedule Time Slot,Sağlık Programı Zaman Aralığı, Parent Service Unit,Ana Hizmet Birimi, @@ -5756,7 +5753,7 @@ Allow Appointments,Randevulara İzin Ver, Allow Overlap,Çakışmaya İzin Ver, Inpatient Occupancy,Yatan Doluluk, Occupancy Status,Doluluk Durumu, -Vacant,boş, +Vacant,Boş, Occupied,Meşgul, Item Details,Ürün Detayları, UOM Conversion in Hours,Saatlerde UOM Dönüşüm, @@ -5772,17 +5769,17 @@ Collect Fee for Patient Registration,Hasta Kaydı için Toplama Ücreti, Checking this will create new Patients with a Disabled status by default and will only be enabled after invoicing the Registration Fee.,"Bunun işaretlenmesi, varsayılan olarak Devre Dışı maliyetlerine sahip yeni Hastalar oluşturacak ve yalnızca Kayıt Ücreti faturalandırma sonrasında etkinleştirilecektir.", Registration Fee,kayıt ücreti, Automate Appointment Invoicing,Randevu Faturalandırmasını Otomatikleştirme, -Manage Appointment Invoice submit and cancel automatically for Patient Encounter,Randevu Faturasını Yönetme Hasta Karşılaşma için otomatik olarak gönder ve iptal et, +Manage Appointment Invoice submit and cancel automatically for Patient Encounter,Randevu Faturasını Yönetme Hasta Muayenesi için otomatik olarak gönder ve iptal et, Enable Free Follow-ups,Ücretsiz Takipleri Etkinleştirin, -Number of Patient Encounters in Valid Days,Uygulama Günlerindeki Hasta Karşılaşma Sayısı, -The number of free follow ups (Patient Encounters in valid days) allowed,İzin verilen ücretsiz takip sayısı (geçerli günlerdeki Hasta Karşılaşmaları), +Number of Patient Encounters in Valid Days,Geçerli Günlerde Hasta Muayene Sayısı, +The number of free follow ups (Patient Encounters in valid days) allowed,İzin verilen ücretsiz takip sayısı (geçerli günlerdeki Hasta Muayeneleri), Valid Number of Days,geçerli gün sayısı, Time period (Valid number of days) for free consultations,Ücretsiz danışmanlık için süre (Geçerli gün sayısı), Default Healthcare Service Items,Varsayılan Sağlık Hizmeti Öğeleri, "You can configure default Items for billing consultation charges, procedure consumption items and inpatient visits","Faturalama süreleri, işletim tüketim kalemleri ve yatan hasta ziyaretleri için varsayılan Öğeleri yapılandırabilirsiniz.", Clinical Procedure Consumable Item,Klinik çevre Sarf Malzemesi, Default Accounts,Varsayılan Hesaplar, -Default income accounts to be used if not set in Healthcare Practitioner to book Appointment charges.,Randevu ücretleri için Sağlık Uygulandığında belirtilmemişse varsayılan gelir hesapları., +Default income accounts to be used if not set in Healthcare Practitioner to book Appointment charges.,Randevu ücretlerini almak için Sağlık Personelinde ayarlanmamışsa kullanılacak varsayılan gelir hesapları., Default receivable accounts to be used to book Appointment charges.,Randevu ücretlerini sınırlama için kullanılacak varsayılan alacak hesapları., Out Patient SMS Alerts,Out Hasta SMS Uyarıları, Patient Registration,Hasta Kaydı, @@ -5805,18 +5802,18 @@ Custom Signature in Print,Baskıda Özel İmza, Laboratory SMS Alerts,Laboratuvar SMS Uyarıları, Result Printed Message,Sonuç Yazdırılan Mesaj, Result Emailed Message,Sonuç E-postayla Gönderilen Mesaj, -Check In,giriş, -Check Out,çıkış yapmak, +Check In,Check In, +Check Out,Check Out, HLC-INP-.YYYY.-,HLC-GİRİŞ-.YYYY.-, A Positive,Pozitif, -A Negative,Bir Negatif, +A Negative,A Negatif, AB Positive,AB Pozitif, AB Negative,AB Negatif, B Positive,B Pozitif, B Negative,B Negatif, -O Positive,Olumsuz, +O Positive,O Pozitif, O Negative,O Negatif, -Date of birth,doğum tarihi, +Date of birth,Doğum Tarihi, Admission Scheduled,Kabulü Planlanmış, Discharge Scheduled,Planlanan Deşarj, Discharged,taburcu, @@ -5831,22 +5828,22 @@ Submitted Date,Teslim Tarihi, Approved Date,Onaylanmış Tarih, Sample ID,Örnek Kimlik Numarası, Lab Technician,laboratuvar teknisyeni, -Report Preference,Tercih Raporu, +Report Preference,Rapor Tercihi, Test Name,Test Adı, Test Template,Test Şablonu, Test Group,Test Grubu, Custom Result,Özel Sonuç, LabTest Approver,LabTest Onaylayıcısı, Add Test,Test Ekle, -Normal Range,normal aralık, +Normal Range,Normal Aralık, Result Format,Sonuç Biçimi, -Single,Tek, -Compound,ulaştırmak, +Single,Bekar, +Compound,Bileşik, Descriptive,Tanımlayıcı, -Grouped,gruplanmış, -No Result,sonuç yok, +Grouped,Gruplanmış, +No Result,Sonuç yok, This value is updated in the Default Sales Price List.,Bu değer Varsayılan Satış Fiyatı Listesinde güncellenir., -Lab Routine,Laboratuar rutini, +Lab Routine,Laboratuar Rutini, Result Value,Sonuç Değeri, Require Result Value,Sonuç Değerini Gerektir, Normal Test Template,Normal Test Şablonu, @@ -5856,20 +5853,20 @@ Middle Name (optional),İkinci İsim (isteğe bağlı), Inpatient Status,Yatan Hasta Durumu, "If ""Link Customer to Patient"" is checked in Healthcare Settings and an existing Customer is not selected then, a Customer will be created for this Patient for recording transactions in Accounts module.","Sağlık Yapılandırmasında "Müşteriyi Hastaya Bağla" İşaretlenmişse ve mevcut bir Müşteri tercihiyse, Hesaplar evinde kaydedilmesi için bu Hasta için bir Müşteri oluşturulacaktır.", Personal and Social History,Kişisel ve Sosyal Tarih, -Marital Status,Medeni durum, +Marital Status,Medeni Durumu, Married,Evli, -Divorced,Ayrılmış, -Widow,sıkıcı, -Patient Relation,Hasta ilişkisi, +Divorced,Boşanmış, +Widow,Dul, +Patient Relation,Hasta İlişkisi, "Allergies, Medical and Surgical History","Alerjiler, Tıp ve Cerrahi Tarihi", Allergies,Alerjiler, -Medication,ilaç, -Medical History,tıbbi geçmiş, -Surgical History,Cerrahi Tarih, -Risk Factors,risk kuşağı, +Medication,İlaç, +Medical History,Tıbbi Geçmişi, +Surgical History,Cerrahi Geçmişi, +Risk Factors,Risk Faktörleri, Occupational Hazards and Environmental Factors,Mesleki Tehlikeler ve Çevresel Faktörler, Other Risk Factors,Diğer Risk Faktörleri, -Patient Details,Hasta Ayrıntıları, +Patient Details,Hasta Detayları, Additional information regarding the patient,Hastaya ilişkin ek bilgiler, HLC-APP-.YYYY.-,HLC-UYGULAMA-.YYYY.-, Patient Age,Hasta Yaşı, @@ -5880,7 +5877,7 @@ Appointment Datetime,Randevu Tarih Saati, Duration (In Minutes),Süre (Dakika Olarak), Reference Sales Invoice,Referans Satış Faturası, More Info,Daha Fazla Bilgi, -Referring Practitioner,Yönlendiren Uygulayıcı, +Referring Practitioner,Yönlendiren Pratisyen, HLC-PA-.YYYY.-,HLC-PA-.YYYY.-, Assessment Template,Değerlendirme Şablonu, Assessment Datetime,Değerlendirme Tarihi, @@ -5897,34 +5894,34 @@ Patient Assessment Template,Hasta Değerlendirme Şablonu, Assessment Parameters,Değerlendirme Parametreleri, Parameters,Parametreler, Assessment Scale,Değerlendirme Ölçeği, -Scale Minimum,Asgari Ölçek, +Scale Minimum,Minimum Ölçek, Scale Maximum,Maksimum Ölçek, HLC-ENC-.YYYY.-,HLC-ENC-.YYYY.-, -Encounter Date,Karşılaşma Tarihi, -Encounter Time,Karşılaşma Zamanı, -Encounter Impression,Karşılaşma İzlenim, +Encounter Date,Muayenesi Tarihi, +Encounter Time,Muayenesi Zamanı, +Encounter Impression,Muayene İzlenimi, Symptoms,Semptomlar, -In print,yazıcıda, +In print,Basılı olarak, Medical Coding,Tıbbi Kodlama, -Procedures,muayenehaneler, +Procedures,Prosedürler, Therapies,Terapiler, -Review Details,Ayrıntıları inceleme, -Patient Encounter Diagnosis,Hasta Karşılaşma Teşhisi, -Patient Encounter Symptom,Hasta Karşılaşma Semptomu, +Review Details,Ayrıntıları İncele, +Patient Encounter Diagnosis,Hasta Muayene Teşhisi, +Patient Encounter Symptom,Hasta Muayene Semptomu, HLC-PMR-.YYYY.-,HLC-FTR-.YYYY.-, Attach Medical Record,Tıbbi Kayıt Ekleyin, Spouse,Eş, -Family,aile, +Family,Aile, Schedule Details,Program Ayrıntıları, Schedule Name,Program Adı, -Time Slots,Zaman dilimleri, -Practitioner Service Unit Schedule,Uygulayıcı Hizmet Birimi Takvimi, -Procedure Name,tutuklu adı, +Time Slots,Zaman Dilimleri, +Practitioner Service Unit Schedule,Pratisyen Hizmet Birimi Takvimi, +Procedure Name,Prosedür Adı, Appointment Booked,Randevu Alındı, -Procedure Created,Oluşturulan daire, +Procedure Created,Prosedür Oluşturuldu, HLC-SC-.YYYY.-,HLC-SC-.YYYY.-, -Collected By,tarafından toplanan, -Particulars,Detaylar, +Collected By,Toplayan, +Particulars,Ayrıntılar, Result Component,Sonuç Bileşenleri, HLC-THP-.YYYY.-,HLC-THP-.YYYY.-, Therapy Plan Details,Tedavi Planı Ayrıntıları, @@ -5951,11 +5948,11 @@ Furry,Kürklü, Cuts,Keser, Abdomen,Karın bölgesi, Bloated,Şişmiş, -Fluid,Elinde bulundurmak, +Fluid,Akışkan, Constipated,Kabız, Reflexes,Refleksler, Hyper,Aşırı, -Very Hyper,Çok hiper, +Very Hyper,Çok Aşırı, One Sided,Tek taraflı, Blood Pressure (systolic),Kan Basıncı (sistolik), Blood Pressure (diastolic),Kan Basıncı (diyastolik), @@ -5963,11 +5960,11 @@ Blood Pressure,Kan basıncı, "Normal resting blood pressure in an adult is approximately 120 mmHg systolic, and 80 mmHg diastolic, abbreviated ""120/80 mmHg""",Yetişkinlerde normal istirahat tansiyonu sistolik olarak yaklaşık 120 mmHg ve "120/80 mmHg" olarak kısaltılan 80 mmHg diastoliktir, Nutrition Values,Beslenme Değerleri, Height (In Meter),Yükseklik (Metrede), -Weight (In Kilogram),Ağırlık (Kilogram ölçüsü), +Weight (In Kilogram),Ağırlık (Kg), BMI,BMI, -Hotel Room,otel odası, +Hotel Room,Otel Odası, Hotel Room Type,Otel Oda Tipi, -Capacity,kapasite, +Capacity,Kapasite, Extra Bed Capacity,Ekstra Yatak Kapasitesi, Hotel Manager,otel yöneticisi, Hotel Room Amenity,Otel Odası İmkanları, @@ -5978,28 +5975,28 @@ Hotel Room Pricing,Otel Odası Fiyatlandırması, Hotel Room Pricing Item,Otel Oda Fiyatlandırması Öğesi, Hotel Room Pricing Package,Otel Odası Fiyatlandırma Paketi, Hotel Room Reservation,Otel Odaları Rezervasyonu, -Guest Name,misafir adı, +Guest Name,Misafir Adı, Late Checkin,Geç Checkin, -Booked,ayrılmış, +Booked,Ayrılmış, Hotel Reservation User,Otel Rezervasyonu Kullanıcısı, Hotel Room Reservation Item,Otel Odasında Rezervasyon Öğesi, Hotel Settings,Otel Ayarları, -Default Taxes and Charges,Standart Vergi ve Harçlar, +Default Taxes and Charges,Varsayılan Vergi ve Harçlar, Default Invoice Naming Series,Varsayılan Fatura Adlandırma Dizisi, -HR,İK, +HR,İnsan Kaynakları, Date on which this component is applied,Bu ürünün kesinlik tarihi, -Salary Slip,Bordro, +Salary Slip,Maaş Bordrosu, HR User,İK Kullanıcısı, Job Applicant,İş Başvuru Sahiibi, -Body,vücut, +Body,Vücut, Appraisal Template,Değerlendirme Şablonu, Parent Department,Ana Bölüm, Leave Block List,izin engel listesi, Days for which Holidays are blocked for this department.,Bu çıkış için tatillerin kaldırıldığı günler., -Leave Approver,İzin Onaylayan, -Expense Approver,Gider Onaylayan, -Required Skills,İstenen yetenekler, -Skills,Beceri, +Leave Approver,İzin Onaylayıcı, +Expense Approver,Masraf Onaylayıcı, +Required Skills,İstenen Yetenekler, +Skills,Beceriler, Driver,Şoför, HR-DRI-.YYYY.-,HR-DRI-.YYYY.-, Suspended,Askıya alındı, @@ -6008,30 +6005,30 @@ Applicable for external driver,Harici sürücü için geçerli, Cellphone Number,Cep Telefonu Numarası, License Details,Ehliyet Bilgileri, License Number,Ehliyet Numarası, -Issuing Date,Veriliş tarihi, +Issuing Date,Veriliş Tarihi, Driving License Categories,Ehliyet Kategorileri, Driving License Category,Ehliyet Kategorisi, Fleet Manager,Filo Yöneticisi, Driver licence class,Ehliyet Sınıfı, -HR-EMP-,İK-EMP-, +HR-EMP-,İK-PER-, Employment Type,İstihdam Tipi, -Emergency Contact,Acil Durum İrtibat Kişisi, -Emergency Contact Name,Acil Durum İletişim Adı, +Emergency Contact,Acil Durum İletişim, +Emergency Contact Name,Acil Durum Kişi Adı, Emergency Phone,Acil Telefon, -ERPNext User,ERPNext Kullanıcı, +ERPNext User,ERPNext Kullanıcısı, "System User (login) ID. If set, it will become default for all HR forms.","Sistem kullanıcı (giriş) kimliği, bütün İK formları için geçerli olacaktır.", Create User Permission,Kullanıcı İzni Yarat, This will restrict user access to other employee records,"Bu, diğer çalışan kayıtlarına kullanıcı erişimlerini kısıtlamalar", -Joining Details,Ayrıntıları Birleştirme, +Joining Details,İşe Başlama Ayrıntıları, Offer Date,Teklif Tarihi, Confirmation Date,Onay Tarihi, Contract End Date,Sözleşme Bitiş Tarihi, -Notice (days),Bildirimi (gün), -Date Of Retirement,Emeklilik Tarihiniz, -Department and Grade,Bölüm ve sınıf, -Reports to,raporlar, -Attendance and Leave Details,Katılım ve Ayrıntı Ayrıntıları, -Attendance Device ID (Biometric/RF tag ID),Seyirci Cihaz Kimliği (Biyometrik / RF etiket numarası), +Notice (days),Bildirim (gün), +Date Of Retirement,Emeklilik Tarihi, +Department and Grade,Bölüm ve Sınıf, +Reports to,Rapor verilen kişi, +Attendance and Leave Details,Katılım ve İzin Ayrıntıları, +Attendance Device ID (Biometric/RF tag ID),PDKS Cihaz Kimliği (Biyometrik / RF Tag ID), Applicable Holiday List,Uygulanabilir Tatil Listesi, Default Shift,Varsayılan Vardiya, Salary Mode,Maaş Modu, @@ -6044,32 +6041,32 @@ Personal Email,Kişisel E-posta, Permanent Address Is,kKlıcı Adres, Rented,Kiralanmış, Owned,Sahipli, -Permanent Address,Kalıcı Adres, +Permanent Address,Daimi Adres, Prefered Contact Email,Tercih Edilen E-posta İletişim, Company Email,Şirket e-posta, Provide Email Address registered in company,şirket şirket E-posta Adresi bağlantısı, -Current Address Is,Güncel Adres, -Current Address,Mevcut Adres, +Current Address Is,Güncel Adres mi, +Current Address,Güncel Adres, Personal Bio,Kişisel biyo, -Bio / Cover Letter,Biyo / Kapak Mektubu, +Bio / Cover Letter,Biyografi / Kapak Mektubu, Short biography for website and other publications.,Web sitesi ve diğer yayınlar için kısa biyografi., Passport Number,Pasaport Numarası, -Date of Issue,Veriliş tarihi, -Place of Issue,Verildiği yer, -Widowed,sıkıcı, +Date of Issue,Veriliş Tarihi, +Place of Issue,Verildiği Yer, +Widowed,Dul, Family Background,Aile Geçmişi, "Here you can maintain family details like name and occupation of parent, spouse and children","Burada ebeveyn, eş ve Avrupalıların isim ve meslekleri gibi aile özelliklerini muhafaza edebilir", Health Details,Sağlık Bilgileri, "Here you can maintain height, weight, allergies, medical concerns etc","Burada boy, kilo, bakımı, bakım endişeleri vb muhafaza edebilirsiniz", Educational Qualification,Eğitim Yeterliliği, Previous Work Experience,Önceki İş Deneyimi, -External Work History,Dış Çalışma Geçmişi, +External Work History,Şirket Dışı Çalışma Geçmişi, History In Company,Şirketteki Geçmişi, -Internal Work History,İç Çalışma Geçmişi, +Internal Work History,Şirket içi Çalışma Geçmişi, Resignation Letter Date,İstifa Mektubu Tarihi, Relieving Date,Ayrılma Tarihi, Reason for Leaving,Ayrılma Nedeni, -Leave Encashed?,İzin Tahsil Edilmiş mi?, +Leave Encashed?,İzin Nakde Dönüştürüldü mü?, Encashment Date,Nakit Çekim Tarihi, New Workplace,Yeni İş Yeri, Returned Amount,İade Edilen Tutar, @@ -6087,43 +6084,43 @@ Class / Percentage,Sınıf / Yüzde, Major/Optional Subjects,Ana / Opsiyonel Konular, Employee External Work History,Çalışan Harici İş Geçmişi, Total Experience,Toplam Deneyim, -Default Leave Policy,Varsayılan Ayrılma Politikası, +Default Leave Policy,Varsayılan İzin Politikası, Employee Group Table,Çalışan Grup Masası, -ERPNext User ID,ERPNext Kullanıcı Kimliği, +ERPNext User ID,ERPNext Kullanıcı ID, Employee Internal Work History,Çalışan Dahili İş Geçmişi, -Activities,faaliyetler, +Activities,Faaliyetler, Employee Onboarding Activity,Çalışan Katılımı Etkinliği, -Employee Promotion Detail,Çalışan Tanıtım Detayı, +Employee Promotion Detail,Çalışan Promosyon Detayı, Employee Transfer Property,Çalışan Transfer Mülkiyeti, -Unclaimed amount,Talep edilmeyen tutarlar, +Unclaimed amount,Talep edilmeyen tutar, Holiday List Name,Tatil Listesi Adı, Total Holidays,Toplam Tatiller, Add Weekly Holidays,Haftalık Tatilleri Ekle, Weekly Off,Haftalık İzin, -Add to Holidays,tatillere ekle, -Holidays,Bayram, -Clear Table,Temizle Tablo, +Add to Holidays,Tatillere Ekle, +Holidays,Tatiller, +Clear Table,Tabloyu Temizle, Retirement Age,Emeklilik yaşı, Enter retirement age in years,yaşlılar emeklilik yaşına girin, Stop Birthday Reminders,Doğum günü hatırlatıcılarını durdur, Leave Settings,İzin Ayarları, Accepted,Kabül Edildi, Printing Details,Baskı Detayları, -Job Title,İş Unvanı, +Job Title,İş Ünvanı, Allocation,Tahsis, -Select Employees,Seçin çalışanlar, +Select Employees,Çalışanları Seç, Allocate,atama yap, -Max Leaves Allowed,İzin sınırı Maksimum Yaprak, +Max Leaves Allowed,İzin verilen Maksimum İzin, Maximum Continuous Days Applicable,Maksimum Sürekli Günler Uygulanabilir, Select Payroll Period,Bordro Dönemi seçin, Abbr,Kısaltma, Condition and Formula,Durum ve Formül, Total Working Hours,Toplam Çalışma Saatleri, -Hour Rate,Saat Hızı, +Hour Rate,Saat Oranı, Bank Account No.,Banka Hesap No, -Earning & Deduction,Kazanma & Kesintisi, +Earning & Deduction,Kazanç ve Kesinti, Loan repayment,Kredi geri ödeme, -Employee Loan,Çalışan Kredi, +Employee Loan,Personel Kredisi, Total Principal Amount,Toplam Anapara Tutarı, Total Interest Amount,Toplam Faiz Tutarı, Total Loan Repayment,Toplam Kredi Geri Ödeme, @@ -6131,7 +6128,7 @@ net pay info,net ücret bilgisi, Gross Pay - Total Deduction - Loan Repayment,Brüt Ücret - Toplam Kesintisi - Kredi Geri Ödeme, Net Pay (in words) will be visible once you save the Salary Slip.,Net Ödeme (Yazıyla) Maaş Makbuzunu kaydettiğinizde başarma, Staffing Plan Details,Kadro Planı Detayları, -Optional,isteğe bağlı, +Optional,İsteğe bağlı, Costing,Maliyetlendirme, Vehicle,Araç, License Plate,Plaka, @@ -6156,7 +6153,7 @@ last Odometer Value ,son Kilometre Sayacı Değeri, Service Detail,Hizmet Detayı, Hub Tracked Item,Hub İzlenen Öğe, Hub Node,Hub Düğüm, -Image List,Görüntü Listesi, +Image List,Resim Listesi, Item Manager,Ürün Yöneticisi, Hub User,Hub Kullanıcısı, Hub Password,Hub Parolası, @@ -6165,22 +6162,22 @@ Marketplace Settings,Pazar Yeri Ayarları, Disable Marketplace,Marketplace'i Devre Dışı Bırak, Marketplace URL (to hide and update label),Pazar yeri URL'si (etiketi gizlemek ve güncellemek için), Registered,Kayıtlı, -Sync in Progress,Senkronizasyon Devam Ediyor, +Sync in Progress,Senkronizasyon Devam ediyor, Hub Seller Name,Hub Satıcı Adı, -Custom Data,özel veri, +Custom Data,özel Veri, Repay From Salary,Maaşdan Öde, Regular Payment,Düzenli Ödeme, Loan Closure,Kredi Kapanışı, Rate of Interest (%) Yearly,Yıllık Faiz Oranı (%), MAT-MSH-.YYYY.-,MAT-MSH-.YYYY.-, -Generate Schedule,Program Oluşturmanın, +Generate Schedule,Program Oluştur, Schedules,programlı, Maintenance Schedule Detail,Bakım Programı Detayı, Scheduled Date,Program Tarihi, Actual Date,Gerçek Tarih, Maintenance Schedule Item,Bakım Programı Ürünü, Random,Rastgele, -No of Visits,ziyaret sayısı, +No of Visits,Ziyaret Sayısı, MAT-MVS-.YYYY.-,MAT-MVS-.YYYY.-, Maintenance Date,Bakım Tarihi, Maintenance Time,Bakım Zamanı, @@ -6198,7 +6195,7 @@ Against Document Detail No,Karşılık Belge Detay No., MFG-BLR-.YYYY.-,MFG-BLR-.YYYY.-, Order Type,Sipariş Türü, Blanket Order Item,Battaniye sipariş öğesi, -Ordered Quantity,Sipariş Edilen Miktar, +Ordered Quantity,Sipariş Miktarı, Item to be manufactured or repacked,Üretilecek veya yeniden paketlenecek Ürün, Quantity of item obtained after manufacturing / repacking from given quantities of raw materials,Belirli miktarlarda ham maddeden üretim / yeniden paketleme sonrasında elde edilen ürün miktarı, Set rate of sub-assembly item based on BOM,BOM'a dayalı alt montaj malzemesinin ayarlarını ayarlama, @@ -6388,10 +6385,10 @@ Certification Status,Sertifika Durumu, Yet to appear,Henüz görünmedi, Certified,Sertifikalı, Not Certified,Sertifikalı değil, -USD,Amerikan Doları, +USD,USD, INR,INR, Certified Consultant,Sertifikalı Danışman, -Name of Consultant,danışmanın adı, +Name of Consultant,Danışmanın Adı, Certification Validity,Belgelendirme geçerliliği, Discuss ID,Kimliği tartışmak, GitHub ID,GitHub Kimliği, @@ -6487,7 +6484,7 @@ Billing Rate,Fatura Oranı, Costing Rate,Maliyet Oranı, title,Başlık, Projects User,Projeler Kullanıcısı, -Default Costing Rate,Standart Maliyetlendirme Oranı, +Default Costing Rate,Varsayılan Maliyetlendirme Oranı, Default Billing Rate,Varsayılan Fatura Oranı, Dependent Task,Bağımlı Görev, Project Type,Proje Tipi, @@ -6496,8 +6493,8 @@ Task Completion,Görev Tamamlama, Task Progress,Görev İlerlemesi, % Completed,% Tamamlandı, From Template,Proje Şablonundan, -Project will be accessible on the website to these users,Proje internet siteleri şu kullanıcılar için erişilebilir olacak, -Copied From,Kopyalanacak, +Project will be accessible on the website to these users,Şu kullanıcılar projeye web sitesinden erişebilecek, +Copied From,Şurdan Kopyalanacak, Start and End Dates,Başlangıç ve Tarihler Sonu, Actual Time in Hours (via Timesheet),Gerçek Zaman (Saat olarak), Costing and Billing,Maliyet ve Faturalandırma, @@ -6509,7 +6506,7 @@ Total Billable Amount (via Timesheet),Toplam Faturalandırılabilir Tutar (Çal Total Billed Amount (via Sales Invoice),Toplam Faturalandırılan Tutar (Sat Faturaları ile), Total Consumed Material Cost (via Stock Entry),Toplam Tüketim Maliyeti Maliyeti (Stok Hareketi ile), Gross Margin,Brut Marj, -Gross Margin %,Brüt Kar Marji%, +Gross Margin %,Brüt Kâr Marjı %, Monitor Progress,İlerlemeyi Görüntüle, Collect Progress,İlerlemeyi Topla, Frequency To Collect Progress,İlerleme Sıklığı Frekansı, @@ -6522,8 +6519,8 @@ Message will be sent to the users to get their status on the Project,Projedeki d Projects Manager,Proje Yöneticisi, Project Template,Proje Şablonu, Project Template Task,Proje Şablonu Görevi, -Begin On (Days),Başla (Günler), -Duration (Days),Süre (Günler), +Begin On (Days),Başlama (Gün), +Duration (Days),Süre (Gün), Project Update,Proje Güncellemesi, Project User,Proje Kullanıcısı, View attachments,Ekleri Göster, @@ -6534,7 +6531,7 @@ Ignore Employee Time Overlap,Çalışan Zamanı Çakışmasını Yoksay, Weight,Ağırlık, Parent Task,Ana Görev, Timeline,Zaman cetveli, -Expected Time (in hours),Beklenen Zaman (Saat), +Expected Time (in hours),Beklenen Süre (saat), % Progress,İlerleme % Yüzdesi, Is Milestone,Kilometre taşı, Task Description,Görev Tanımı, @@ -6542,7 +6539,6 @@ Dependencies,Bağımlılıklar, Dependent Tasks,Bağımlı Görevler, Depends on Tasks,Görevler bağlıdır, Actual Start Date (via Timesheet),Gerçek başlangış tarihi (Zaman Tablosu'ndan), -Actual Time in Hours (via Timesheet),Gerçek Zaman (Saat olarak), Actual End Date (via Timesheet),Gerçek bitiş tarihi (Zaman Tablosu'ndan), Total Expense Claim (via Expense Claim),(Gider İstem yoluyla) Toplam Gider İddiası, Review Date,inceleme tarihi, @@ -6558,7 +6554,7 @@ Total Costing Amount,Toplam Maliyet Tutarı, Total Billable Amount,Toplam Faturalandırılabilir Tutar, Total Billed Amount,Toplam Faturalı Tutar, % Amount Billed,% Faturalanan Tutar, -Hrs,saat, +Hrs,Saat, Costing Amount,Maliyet Tutarı, Corrective/Preventive,Önleyici / Düzeltici, Corrective,Düzeltici, @@ -6568,24 +6564,24 @@ Resolutions,Kararlar, Quality Action Resolution,Kalite Eylem Çözünürlüğü, Quality Feedback Parameter,Kalite Geribildirim Parametresi, Quality Feedback Template Parameter,Kalite Geribildirim Şablon Parametresi, -Quality Goal,kalite hedefi, +Quality Goal,Kalite Hedefi, Monitoring Frequency,Frekans izleme, -Weekday,çalışma günü, +Weekday,Çalışma günü, Objectives,Hedefler, Quality Goal Objective,Kalite Hedef Amaç, -Objective,amaç, +Objective,Amaç, Agenda,Gündem, Minutes,Dakikalar, Quality Meeting Agenda,Kalite Toplantı Gündemi, Quality Meeting Minutes,Kalite Toplantı Tutanakları, -Minute,Dakikalar, -Parent Procedure,yapı hükümleri, -Processes,süreçler, +Minute,Dakika, +Parent Procedure,Üst Prosedür, +Processes,Süreçler, Quality Procedure Process,Kalite hükümleriü Süreci, -Process Description,süreç anlatımı, +Process Description,Süreç Açıklaması, Link existing Quality Procedure.,Mevcut kalite hükümlerini birleştirme., Additional Information,Ek Bilgi, -Quality Review Objective,Kalite incelemesi Amaç, +Quality Review Objective,Kalite İnceleme Amacı, DATEV Settings,DATEV Ayarları, Regional,Bölgesel, Consultant ID,Danışman Kimliği, @@ -6601,9 +6597,9 @@ GSTR 3B Report,GSTR 3B Raporu, January,Ocak, February,Şubat, March,Mart, -April,nisan, +April,Nisan, August,Ağustos, -September,eylül, +September,Eylül, October,Ekim, November,Kasım, December,Aralık, @@ -6663,7 +6659,7 @@ From Lead,Bu Müşteri Adayından, Account Manager,Muhasebe Yöneticisi, Allow Sales Invoice Creation Without Sales Order,Satış Siparişi olmadan Satış Faturası Oluşturmaya İzin ver, Allow Sales Invoice Creation Without Delivery Note,İrsaliye olmadan Satış Faturası Oluşturmaya İzin ver, -Default Price List,Standart Fiyat Listesi, +Default Price List,Varsayılan Fiyat Listesi, Primary Address and Contact Detail,Birincil Adres ve İletişim Ayrıntısı, "Select, to make the customer searchable with these fields",Müşteriyi bu alanlarla aranabilir yapmak için seçin, Customer Primary Contact,Müşteri Birincil İletişim, @@ -6671,16 +6667,16 @@ Customer Primary Contact,Müşteri Birincil İletişim, Customer Primary Address,Müşteri Birincil Adres, "Reselect, if the chosen address is edited after save",Seçilen adres kaydedildikten sonra düzenlenirse yeniden seçin, Primary Address,Birincil Adres, -Mention if non-standard receivable account,Standart dışı alacak hesabı varsa belirtiniz, -Credit Limit and Payment Terms,Kredi Limiti ve Ödeme Biletleri, +Mention if non-standard receivable account ,Varsayılan dışı alacak hesabı varsa belirtiniz, +Credit Limit and Payment Terms,Kredi Limiti ve Ödeme Vadeleri, Additional information regarding the customer.,Müşteri ile ilgili ek bilgi., Sales Partner and Commission,Satış Ortağı ve Komisyon, Commission Rate,Komisyon Oranı, Sales Team Details,Satış Ekibi Ayrıntıları, Customer POS id,Müşteri POS kimliği, Customer Credit Limit,Müşteri Kredi Limiti, -Bypass Credit Limit Check at Sales Order,Siparişinde kontör limitini atla, -Industry Type,Sanayi Tipi, +Bypass Credit Limit Check at Sales Order,Satış Siparişinde Kredi Limit Kontrolünü Atla, +Industry Type,Sektör Tipi, MAT-INS-.YYYY.-,MAT-INS-.YYYY.-, Installation Date,Kurulum Tarihi, Installation Time,Kurulum Zamanı, @@ -6706,10 +6702,10 @@ Quotation To,Teklif Kime, Rate at which customer's currency is converted to company's base currency,Müşterinin para biriminin şirketin temel para birimine dönüştürme oranı, Rate at which Price list currency is converted to company's base currency,Fiyat listesi para biriminin şirketin temel para birimine dönüştürme oranı, Additional Discount and Coupon Code,Ek İndirim ve Kupon Kodu, -Referral Sales Partner,Tavsiye Satış Ortağı, +Referral Sales Partner,Referans Satış Ortağı, In Words will be visible once you save the Quotation.,fiyat tekliflerini saklayacağınızda görünür olacaktır, Term Details,Dönem Ayrıntıları, -Quotation Item,Teklif Ürünü, +Quotation Item,Teklif Kalemi, Against Doctype,Belge Türüne Karşı, Against Docname,Belge Adına Karşı, Additional Notes,Ek Notlar, @@ -6745,22 +6741,22 @@ Settings for Selling Module,Modülü Satış için Ayarlar, Customer Naming By,Müşteri Adlandırma buna göre, Campaign Naming By,Adlandırma Şekli, Default Customer Group,Varsayılan Müşteri Grubu, -Default Territory,Standart Bölge, +Default Territory,Varsayılan Bölge, Close Opportunity After Days,Fırsatı Gün Sonra Kapat, Default Quotation Validity Days,Varsayılan Teklif Geçerlilik Günü, Sales Update Frequency,Satış Güncelleme Sıklığı, -Each Transaction,Her İşlem, +Each Transaction,Her bir İşlem, SMS Center,SMS Merkezi, Send To,Gönder, -All Contact,Tüm İrtibatlar, +All Contact,Tüm Kişiler, All Customer Contact,Tüm Müşteri İrtibatları, All Supplier Contact,Tüm Tedarikçi İrtibatları, All Sales Partner Contact,Tüm Satış Ortağı İrtibatları, All Lead (Open),Tüm Müşteri Adayları (Açık), All Employee (Active),Tüm Çalışanlar (Aktif), All Sales Person,Bütün Satıcılar, -Create Receiver List,alıcı listesi oluşturma, -Receiver List,Alıcı listesi, +Create Receiver List,Alıcı Listesi Oluştur, +Receiver List,Alıcı Listesi, Messages greater than 160 characters will be split into multiple messages,160 karakterden daha büyük mesajlar birden fazla mesaja bölünecektir, Total Characters,Toplam Karakter, Total Message(s),Toplam Mesaj, @@ -6783,67 +6779,67 @@ Legal Entity / Subsidiary with a separate Chart of Accounts belonging to the Org Change Abbreviation,Değişim Kısaltma, Parent Company,Ana Şirket, Default Values,Varsayılan Değerler, -Default Holiday List,Tatil Listesini Standart, -Default Selling Terms,Varsayılan Satış Koşulları, -Default Buying Terms,Varsayılan Alış Koşulları, -Create Chart Of Accounts Based On,Hesaplar Tabanlı Grafik oluşturma üzerine, -Standard Template,Standart Şablon, +Default Holiday List,Varsayılan Tatil Listesi, +Default Selling Terms,Varsayılan Satış Koşulu, +Default Buying Terms,Varsayılan Alış Koşulu, +Create Chart Of Accounts Based On,Hesap Planını Buna Göre Oluştur, +Standard Template,Varsayılan Şablon, Existing Company,Mevcut Şirket, -Chart Of Accounts Template,Hesaplar Şablon Grafik, +Chart Of Accounts Template,Hesap Planı Şablonu, Existing Company ,Mevcut Şirket , Date of Establishment,Kuruluş tarihi, Sales Settings,Satış Ayarları, Monthly Sales Target,Aylık Satış Hedefi, Sales Monthly History,Satış Aylık Tarihi, Transactions Annual History,İşlemler Yıllık Geçmişi, -Total Monthly Sales,Toplam Aylık Satışlar, -Default Cash Account,Standart Kasa Hesabı, -Default Receivable Account,Standart Alacak Hesabı, +Total Monthly Sales,Toplam Aylık Satış, +Default Cash Account,Varsayılan Kasa Hesabı, +Default Receivable Account,Varsayılan Alacak Hesabı, Round Off Cost Center,Yuvarlama Maliyet Merkezi, Discount Allowed Account,İndirim İzinli Hesap, Discount Received Account,Alınan indirim Hesabı, Exchange Gain / Loss Account,Kambiyo Kâr / Zarar Hesabı, Unrealized Exchange Gain/Loss Account,Gerçekleşmemiş Döviz Kazası / Zarar Hesabı, Allow Account Creation Against Child Company,Alt Şirkete Karşı Hesap Oluşturmaya İzin Verin, -Default Payable Account,Standart Ödenecek Hesap, +Default Payable Account,Varsayılan Ödenecek Hesap, Default Employee Advance Account,Varsayılan Çalışan Vadeli Hesap, Default Cost of Goods Sold Account,Ürünler Satılan Hesabı Varsayılan Maliyeti, -Default Income Account,Standart Gelir Hesabı, +Default Income Account,Varsayılan Gelir Hesabı, Default Deferred Revenue Account,Varsayılan Ertelenmiş Gelir Hesabı, Default Deferred Expense Account,Varsayılan Ertelenmiş Gider Hesabı, -Default Payroll Payable Account,Standart Bordro Ödenecek Hesabı, +Default Payroll Payable Account,Varsayılan Bordro Ödenecek Hesabı, Default Expense Claim Payable Account,Varsayılan Gider Talebi Ödenecek Hesap, Stock Settings,Stok Ayarları, Enable Perpetual Inventory,Sürekli Envanteri Etkinleştir, Default Inventory Account,Varsayılan Envanter Hesabı, Stock Adjustment Account,Stok Düzeltme Hesabı, Fixed Asset Depreciation Settings,Sabit Kıymet Değer Kaybı Ayarları, -Series for Asset Depreciation Entry (Journal Entry),Varlık Amortismanı Girişi Dizisi (Yevmiye Kaydı), -Gain/Loss Account on Asset Disposal,Varlık Bertaraf Kar / Zarar Hesabı, +Series for Asset Depreciation Entry (Journal Entry),Varlık Amortisman Girişi Serisi (Yevmiye Kaydı), +Gain/Loss Account on Asset Disposal,Varlık Elden Çıkarma Kazanç/Zarar Hesabı, Asset Depreciation Cost Center,Varlık Değer Kaybı Maliyet Merkezi, Budget Detail,Bütçe Detayı, Exception Budget Approver Role,İstisna Bütçe Onaylayan Rolü, Company Info,Şirket Bilgisi, -For reference only.,Başvuru için sadece., -Company Logo,Şirket logosu, -Date of Incorporation,Kuruluş tarihi, -Date of Commencement,Başlama tarihi, +For reference only.,Yalnız Referans için., +Company Logo,Şirket Logosu, +Date of Incorporation,Katılım Tarihi, +Date of Commencement,Başlama Tarihi, Phone No,Telefon No, -Company Description,şirket tanımı, +Company Description,Şirket Tanımı, Registration Details,Kayıt Detayları, Company registration numbers for your reference. Tax numbers etc.,Referans için şirket kayıt numaraları. vergi numaraları vb., Delete Company Transactions,Şirket İşlemleri Sil, -Currency Exchange,Döviz, +Currency Exchange,Döviz Kuru, Specify Exchange Rate to convert one currency into another,Döviz Kuru içine başka bir para birimini kullandığınız, -From Currency,Para biriminden, +From Currency,Para Biriminden, To Currency,Para Birimine, -For Buying,Almak için, -For Selling,Satmak için, +For Buying,Alış için, +For Selling,Satış için, Customer Group Name,Müşteri Grup Adı, Parent Customer Group,Ana Müşteri Grubu, Only leaf nodes are allowed in transaction,İşlemde yalnızca yaprak düğümlere izin verilir, -Mention if non-standard receivable account applicable,Standart dışı alacak hesabı varsa belirtiniz, -Credit Limits,Kredi limitleri, +Mention if non-standard receivable account applicable,Standart dışı alacak hesabının geçerli olup olmadığını belirtin, +Credit Limits,Kredi Limitleri, Email Digest,E-Posta Bülteni, Send regular summary reports via Email.,E-posta yoluyla düzenli özetler gönderir., Email Digest Settings,E-Mail Bülteni Ayarları, @@ -6866,7 +6862,7 @@ New Purchase Orders,Yeni Satınalma Siparişleri, Sales Orders to Deliver,Teslim edilecek Satış Siparişleri, Purchase Orders to Receive,Teslim alınacak Satınalma Siparişleri, New Purchase Invoice,Yeni Satınalma Faturası, -New Quotations,Yeni Fiyat Teklifi, +New Quotations,Yeni Satış Teklifi, Open Quotations,Açık Teklifler, Open Issues,Açık Sorunlar, Open Projects,Açık Projeler, @@ -6899,7 +6895,7 @@ Change the starting / current sequence number of an existing series.,Varolan bir Quotation Lost Reason,Teklif Kayıp Nedeni, A third party distributor / dealer / commission agent / affiliate / reseller who sells the companies products for a commission.,Bir komisyon için kuruluşlar birimleri şeytan bir üçüncü taraf sağlayıcı / bayi / komisyon ajan / ortaklık / bayi., Sales Partner Name,Satış Ortağı Adı, -Partner Type,Ortak Türü, +Partner Type,Cari Türü, Address & Contacts,Adresler ve Kontaklar, Address Desc,Azalan Adres, Contact Desc,İrtibat Azalt, @@ -6909,7 +6905,7 @@ Show In Website,Web sitesinde Göster, Referral Code,Yönlendirme Kodu, To Track inbound purchase,Gelen alımları takip etmek, Logo,Logo, -Partner website,Ortak web sitesi, +Partner website,Cari web sitesi, All Sales Transactions can be tagged against multiple **Sales Persons** so that you can set and monitor targets.,Ayarlamak ve motive etmek böylece tüm satış işlemlerini birdenbire ** Satış Kişilerin ** karşı etiketlenmiş olabilir., Name and Employee ID,İsim ve Çalışan Kimliği, Sales Person Name,Satış Personeli Adı, @@ -6923,8 +6919,8 @@ Target Detail,Hedef Detayı, Target Qty,Hedef Miktarı, Target Amount,Hedef Miktarı, Target Distribution,Hedef Dağıtımı, -"Standard Terms and Conditions that can be added to Sales and Purchases.\n\nExamples:\n\n1. Validity of the offer.\n1. Payment Terms (In Advance, On Credit, part advance etc).\n1. What is extra (or payable by the Customer).\n1. Safety / usage warning.\n1. Warranty if any.\n1. Returns Policy.\n1. Terms of shipping, if applicable.\n1. Ways of addressing disputes, indemnity, liability, etc.\n1. Address and Contact of your Company.","Standart Şartlar ve Satış ve Alımlar eklenebilir Koşullar.\n\n Örnekler: \n\n 1. Teklifin geçerliliği.\n 1. Ödeme Koşulları (Kredi On geçen, bölüm avans vb).\n 1. Ne ekstra (veya müşteri tarafından) verilir).\n 1. Güvenlik / kullanım tahsilat uyarısı.\n 1. Garanti alınırlar.\n 1. Politikası gider.\n 1. Nakliye koşulları, varsa.\n 1. Vb adresleme uyuşmazlıkların, tazminat, sorumluluk, \n 1 Yolları. Adres ve Şirket İletişim.", -Applicable Modules,uygulanabilir modülleri, +"Standard Terms and Conditions that can be added to Sales and Purchases.\n\nExamples:\n\n1. Validity of the offer.\n1. Payment Terms (In Advance, On Credit, part advance etc).\n1. What is extra (or payable by the Customer).\n1. Safety / usage warning.\n1. Warranty if any.\n1. Returns Policy.\n1. Terms of shipping, if applicable.\n1. Ways of addressing disputes, indemnity, liability, etc.\n1. Address and Contact of your Company.","Satış ve Satınalma İşlemlerine eklenebilecek Standart Şartlar ve Koşullar.\n\nÖrnekler:\n\n1. Teklifin geçerliliği.\n1. Ödeme Koşulları (Peşin, Kredili, Kısmi Avans vb.).\n1. Ekstra nedir (veya Müşteri tarafından ödenebilir).\n1. Güvenlik / kullanım uyarısı.\n1. Varsa Garanti.\n1. İade Politikası.\n1. Varsa Nakliye Şartları.\n1. Anlaşmazlıkları, tazminatı, sorumluluğu vb. ele alma yolları\n1. Şirketinizin Adresi ve İletişim Bilgileri.", +Applicable Modules,Uygulanabilir Modüller, Terms and Conditions Help,Şartlar ve Koşullar Yardım, Classification of Customers by region,Bölgelere göre Müşteriler yerleşimi, Territory Name,Bölge Adı, @@ -6934,7 +6930,7 @@ For reference,Referans için, Territory Targets,Bölge Hedefleri, Set Item Group-wise budgets on this Territory. You can also include seasonality by setting the Distribution.,Bu bölge grubu Ürün bütçeleri ayarlanır. Dağıtımı ayarlayarak dönemsellik de çalıştırma., UOM Name,Ölçü Birimi, -Check this to disallow fractions. (for Nos),Kesirlere izin vermek için ayrılmak (Numaralar için), +Check this to disallow fractions. (for Nos),Kesirlere izin vermemek için bunu işaretleyin. (Nos için), Website Item Group,Web Sitesi Ürün Grubu, Cross Listing of Item in multiple groups,Öğenin birden çok grupta Çapraz Listelenmesi, Default settings for Shopping Cart,Alışveriş Sepeti Varsayılan ayarları, @@ -6955,7 +6951,7 @@ Payment Success Url,Ödeme Başarı URL'si, After payment completion redirect user to selected page.,Ödemeyi aldıktan sonra kullanıcıyı seçilen sayfaya yönlendirin., Batch Details,Batch Ayrıntıları, Batch ID,Batch ID, -image,görüntü, +image,resim, Parent Batch,Ana Batch, Manufacturing Date,Üretim Tarihi, Batch Quantity,Batch Miktarı, @@ -6967,12 +6963,12 @@ Bin,Kutu, Reserved Quantity,Ayrılan Miktar, Actual Quantity,Gerçek Miktar, Requested Quantity,istenen Miktar, -Reserved Qty for sub contract,Alt sözleşme için ayrılan miktar, +Reserved Qty for sub contract,Taşeron sözleşmesi için ayrılan miktar, Moving Average Rate,Hareketli Ortalama Kuru, FCFS Rate,FCFS Oranı, -Customs Tariff Number,Gümrük Tarife numarası, +Customs Tariff Number,Gümrük Tarife No, Tariff Number,Tarife Numarası, -Delivery To,Teslim, +Delivery To,Teslimat Yeri, MAT-DN-.YYYY.-,MAT-DN-.YYYY.-, Is Return,İade mi, Issue Credit Note,Alacak Dekontu Ver, @@ -7008,8 +7004,8 @@ Leave blank to use the standard Delivery Note format,Standart İrsaliye formatı Send with Attachment,Ek ile Gönder, Delay between Delivery Stops,Teslimat Durakları arasındaki gecikme, Delivery Stop,Teslimat Durdur, -Lock,kilit, -Visited,Ziyaret, +Lock,Kilitle, +Visited,Ziyaret edildi, Order Information,Sipariş Bilgisi, Contact Information,iletişim bilgileri, Email sent to,E-posta Gönderilen, @@ -7037,7 +7033,7 @@ Variant Of,Varyantı, Is Item from Hub,Hub'dan Öğe Var mı, Default Unit of Measure,Varsayılan Ölçü Birimi, Maintain Stock,Stok Takibi Yap, -Standard Selling Rate,Standart Satış Oranı, +Standard Selling Rate,Varsayılan Satış Oranı, Auto Create Assets on Purchase,Satınalmada Varlıkları Otomatik Oluştur, Asset Naming Series,Öğe Adlandırma Dizisi, Over Delivery/Receipt Allowance (%),Fazla Alış/Satış İrsaliyesi Ödeneği (%), @@ -7051,7 +7047,7 @@ Moving Average,Hareketli Ortalama, Warranty Period (in days),Garanti Süresi (gün), Auto re-order,Otomatik Yeniden Sipariş, Reorder level based on Warehouse,Depo bazlı Yeniden sipariş seviyesi, -Will also apply for variants unless overrridden,Geçersiz kılınmadığı sürece varyantlar için de geçerli olacaktır., +Will also apply for variants unless overrridden,Geçersiz kılınmadığı sürece varyantlar için de geçerli olacak, Units of Measure,Ölçü Birimleri, Will also apply for variants,Varyantlar için de geçerli olacak, Serial Nos and Batches,Seri No ve Batches (Parti), @@ -7067,11 +7063,11 @@ Has Serial No,Seri Numarası Var, Serial Number Series,Seri Numarası Serisi, "Example: ABCD.#####\nIf series is set and Serial No is not mentioned in transactions, then automatic serial number will be created based on this series. If you always want to explicitly mention Serial Nos for this item. leave this blank.","Örnek:. Seri ayarladı ve Seri No belirtilen istenen ABCD ##### \n, daha sonra otomatik seri numarası bu seriye dayalı olarak oluşturulur. Her zaman geniş bu öğe için seri No konuşmak istiyorum. Bu boş bırakın.", Variants,Varyantlar, -Has Variants,Varyantları Var, -"If this item has variants, then it cannot be selected in sales orders etc.","Bu öğeyi görmeleri varsa, o zaman satış siparişleri vb seçilemez", +Has Variants,Varyanta Sahip, +"If this item has variants, then it cannot be selected in sales orders etc.","Bu ürünün varyantları varsa satış siparişlerinde vb. seçilemez.", Variant Based On,Varyant Tabanlı, Item Attribute,Ürün Özelliği, -"Sales, Purchase, Accounting Defaults","Satış, Satınalma, Varsayılan Muhasebeleri", +"Sales, Purchase, Accounting Defaults","Satış, Satınalma, Muhasebe Varsayılanları", Item Defaults,Ürün Varsayılanları, "Purchase, Replenishment Details","Satınalma, Yenileme Detayları", Is Purchase Item,Satınalma Kalemi mi, @@ -7088,12 +7084,12 @@ Sales Details,Satış Ayrıntıları, Default Sales Unit of Measure,Varsayılan Öğe Satış Birimi, Is Sales Item,Satış Kalemi mi, Max Discount (%),Maksimum İndirim (%), -No of Months,Ayların Sayısı, -Customer Items,Müşteri Öğeleri, +No of Months,Ay Sayısı, +Customer Items,Müşteri Ürünleri, Inspection Criteria,Muayene Kriterleri, Inspection Required before Purchase,Satınalma öncesi Muayene Gerekli, Inspection Required before Delivery,Teslimat öncesi Muayene Gerekli, -Default BOM,Standart Ürün Ağacı, +Default BOM,Varsayılan Ürün Ağacı, Supply Raw Materials for Purchase,Satınalma için Hammadde Temini, If subcontracted to a vendor,Bir satıcıya taşero edildi mi, Customer Code,Müşteri Kodu, @@ -7110,7 +7106,7 @@ List this Item in multiple groups on the website.,Bu ürünü web sitesinde grup Copy From Item Group,Ürün Grubundan kopyalayın, Website Content,Web sitesi içeriği, You can use any valid Bootstrap 4 markup in this field. It will be shown on your Item Page.,Bu alanda geçerli bir Bootstrap 4 dizsi kullanabilirsiniz. Öğe Sayfanızda gösterilecek., -Total Projected Qty,Tahmini toplam Adet, +Total Projected Qty,Tahmini Toplam Miktar, Hub Publishing Details,Hub Yayınlama Ayrıntıları, Publish in Hub,Hubta Yayınla, Publish Item to hub.erpnext.com,Hub.erpnext.com için Öğe Yayınla, @@ -7139,24 +7135,24 @@ UPC-A,UPC-A, Item Customer Detail,Ürün Müşteri Detayı, "For the convenience of customers, these codes can be used in print formats like Invoices and Delivery Notes","Müşterilerinin rahatlığı için, bu kodlar faturalarda ve irsaliyelerde olduğu gibi basılı formatta kullanılabilir.", Ref Code,Referans Kodu, -Item Default,öğe girişi, +Item Default,Öğe Varsayılanı, Purchase Defaults,Satınalma Varsayılanları, -Default Buying Cost Center,Standart Alış Maliyet Merkezi, -Default Supplier,standart tedarikçi, -Default Expense Account,Standart Gider Hesabı, +Default Buying Cost Center,Varsayılan Alış Maliyet Merkezi, +Default Supplier,Varsayılan Tedarikçi, +Default Expense Account,Varsayılan Gider Hesabı, Sales Defaults,Satış Varsayılanları, -Default Selling Cost Center,Standart Satış Maliyet Merkezi, +Default Selling Cost Center,Varsayılan Satış Maliyet Merkezi, Item Manufacturer,Ürün Üreticisi, Item Price,Ürün Fiyatı, -Packing Unit,Paketleme birimi, +Packing Unit,Paketleme Birimi, Quantity that must be bought or sold per UOM,UOM başına satın alınması veya satılması gereken miktar, Item Quality Inspection Parameter,Ürün Kalite Kontrol Parametreleri, -Acceptance Criteria,Kabil Kriterleri, +Acceptance Criteria,Kabül Kriterleri, Item Reorder,Ürün Yeniden Sipariş, Check in (group),Check-in (grup), Request for,Talep şunun için, Re-order Level,Yeniden Sipariş Seviyesi, -Re-order Qty,Yeniden Sipariş Adet, +Re-order Qty,Yeniden Sipariş Mik, Item Supplier,Ürün Tedarikçisi, Item Variant,Öğe Varyantı, Item Variant Attribute,Öğe Varyant Özellik, @@ -7196,29 +7192,29 @@ To Warehouse (Optional),Depo (İsteğe bağlı), Actual Batch Quantity,Gerçek Parti Miktarı, Prevdoc DocType,Önceki Doküman, Parent Detail docname,Ana Detay belgesi adı, -"Generate packing slips for packages to be delivered. Used to notify package number, package contents and its weight.","Teslim edilecek paketler için sevk irsaliyeleri oluşturun. Paket numarasını, paket içeriğini ve ağırlığını bildirmek için kullanılır.", -Indicates that the package is a part of this delivery (Only Draft),Paketin bu teslimatın bir parçası olduğunu gösterir (Sadece Taslak), +"Generate packing slips for packages to be delivered. Used to notify package number, package contents and its weight.","Teslim edilecek paketler için Paketleme Fişi oluşturun. Paket numarasını, paket içeriğini ve ağırlığını bildirmek için kullanılır.", +Indicates that the package is a part of this delivery (Only Draft),Paketin bu teslimatın bir parçası olduğunu belirtir (Yalnızca Taslak), MAT-PAC-.YYYY.-,MAT-PAC-.YYYY.-, -From Package No.,Ambalaj Numarasından., -Identification of the package for the delivery (for print),(Baskı için) teslimat için ambalajın maliyeti, -To Package No.,ambalaj numarası, -If more than one package of the same type (for print),(Baskı için) aynı ambalajdan birden fazla varsa, -Package Weight Details,Ambalaj Ağırlığı Detayları, +From Package No.,Başlangıç Paket No., +Identification of the package for the delivery (for print),Teslimat için paketin tanımlanması (baskı için), +To Package No.,Bitiş Paket No., +If more than one package of the same type (for print),Aynı türden birden fazla paket varsa (baskı için), +Package Weight Details,Paket Ağırlığı Detayları, The net weight of this package. (calculated automatically as sum of net weight of items),Bu paketin net ağırlığı (Ürünlerin net toplamından otomatik olarak çıkarılması), Net Weight UOM,Net Ağırlık Ölçü Birimi, Gross Weight,Brüt Ağırlık, -The gross weight of the package. Usually net weight + packaging material weight. (for print),Paketin ağır ağırlığı. Genellikle net ağırlık + ambalaj ürün ağırlığı. (Baskı için), -Gross Weight UOM,Brüt Ağırlık Ölçü Birimi, -Packing Slip Item,Sevk İrsaliyesi Kalemi, +The gross weight of the package. Usually net weight + packaging material weight. (for print),Paketin brüt ağırlığı. Genellikle net ağırlık + ambalaj malzemesi ağırlığı. (baskı için), +Gross Weight UOM,Brüt Ağırlık Birimi, +Packing Slip Item,Paketleme Fişi Kalemi, DN Detail,DN Detay, -STO-PICK-.YYYY.-,STO SEÇME-.YYYY.-, +STO-PICK-.YYYY.-,STO-PICK-.YYYY.-, Material Transfer for Manufacture,Üretim için Malzeme Transferi, Qty of raw materials will be decided based on the qty of the Finished Goods Item,"Hammadde miktarına, Mamul Madde miktarına göre karar verecek.", Parent Warehouse,Ana Depo, Items under this warehouse will be suggested,Bu depodaki ürünler önerilecek, -Get Item Locations,Öğe Konumlarını Alın, -Item Locations,Öğe Konumları, -Pick List Item,Liste Öğesini Seç, +Get Item Locations,Malzeme Konumlarını Getir, +Item Locations,Malzeme Konumları, +Pick List Item,Pick List Öğesini Seç, Picked Qty,Toplanan Miktar, Price List Master,Fiyat Listesi Master, Price List Name,Fiyat Listesi Adı, @@ -7230,7 +7226,7 @@ Supplier Delivery Note,Tedarikçi İrsaliyesi, Time at which materials were received,Malzemelerin alındığı zaman, Return Against Purchase Receipt,İrsaliye Karşılığında İade, Rate at which supplier's currency is converted to company's base currency,Tedarikçinin para biriminin şirketin temel para birimine dönüştürme oranı, -Sets 'Accepted Warehouse' in each row of the items table.,Kalemler tablosunun her tablosunda 'Kabil Edilen Depo' ayarlar., +Sets 'Accepted Warehouse' in each row of the items table.,Kalemler tablosunun her tablosunda 'Kabül Edilen Depo' ayarlar., Sets 'Rejected Warehouse' in each row of the items table.,Kalemler tablosunun her tablosunda 'Reddedilen Depo' ayarlar., Raw Materials Consumed,Tüketilen Hammaddeler, Get Current Stock,Mevcut Stoğu Al, @@ -7254,16 +7250,16 @@ Sample Size,Numune Miktarı, Inspected By,Denetleyen, Readings,Okumalar, Quality Inspection Reading,Kalite Kontrol Okuma, -Reading 1,1 Okuma, -Reading 2,2 Okuma, -Reading 3,3 Okuma, -Reading 4,4 Okuma, -Reading 5,5 Okuma, -Reading 6,6 Okuma, -Reading 7,7 Okuma, -Reading 8,8 Okuma, -Reading 9,9 Okuma, -Reading 10,10 Okuma, +Reading 1,Okuma 1, +Reading 2,Okuma 2, +Reading 3,Okuma 3, +Reading 4,Okuma 4, +Reading 5,Okuma 5, +Reading 6,Okuma 6, +Reading 7,Okuma 7, +Reading 8,Okuma 8, +Reading 9,Okuma 9, +Reading 10,Okuma 10, Quality Inspection Template Name,Kalite Kontrol Şablonu Adı, Quick Stock Balance,Hızlı Stok Bakiyesi, Available Quantity,Mevcut Miktar, @@ -7276,9 +7272,9 @@ Creation Date,Oluşturulma Tarihi, Creation Time,Oluşturma Zamanı, Asset Details,Varlık Ayrıntıları, Asset Status,Varlık Durumu, -Delivery Document Type,Teslim Belgesi Türü, -Delivery Document No,Teslim Belgesi No, -Delivery Time,İrsaliye Zamanı, +Delivery Document Type,Teslimat Belge Türü, +Delivery Document No,Teslimat Belge No, +Delivery Time,Teslimat Zamanı, Invoice Details,Fatura Detayları, Warranty / AMC Details,Garanti / AMC Detayları, Warranty Expiry Date,Garanti Son Kullanım Tarihi, @@ -7297,7 +7293,7 @@ Repack,Yeniden Paketle, Send to Subcontractor,Taşeron'a Gönder, Delivery Note No,İrsaliye No, Sales Invoice No,Satış Fatura No, -Purchase Receipt No,Satın alma makbuzu numarası, +Purchase Receipt No,Alış İrsaliye No, Inspection Required,Muayene Gerekli, From BOM,İlgili BOM, For Quantity,Miktar, @@ -7305,17 +7301,17 @@ As per Stock UOM,Stok Birimine göre, Including items for sub assemblies,Alt montajlar için öğeler dahil, Default Source Warehouse,Varsayılan Kaynak Depo, Source Warehouse Address,Kaynak Depo Adresi, -Default Target Warehouse,Standart Hedef Depo, +Default Target Warehouse,Varsayılan Hedef Depo, Target Warehouse Address,Hedef Depo Adresi, Update Rate and Availability,Oranı ve Kullanılabilirliği Güncelle, Total Incoming Value,Toplam Gelen Değeri, Total Outgoing Value,Toplam Giden Değeri, -Total Value Difference (Out - In),Toplam Değer Farkı (Dış - Giriş), -Additional Costs,Ek geçitler, -Total Additional Costs,Toplam Ek Maliyetler, +Total Value Difference (Out - In),Toplam Değer Farkı (Giden - Gelen), +Additional Costs,Ek Maliyetler, +Total Additional Costs,Toplam Ek Maliyet, Customer or Supplier Details,Müşteri ya da Tedarikçi Detayları, Per Transferred,Transfer başına, -Stock Entry Detail,Stok Hareketi Detayı, +Stock Entry Detail,Stok Hareket Detayı, Basic Rate (as per Stock UOM),Temel Oran (Stok Birimine göre), Basic Amount,Temel Tutar, Additional Cost,Ek Maliyet, @@ -7332,23 +7328,23 @@ Outgoing Rate,Giden Oranı, Actual Qty After Transaction,İşlem sonrası gerçek Adet, Stock Value Difference,Stok Değer Farkı, Stock Queue (FIFO),Stok Kuyruğu (FIFO), -Is Cancelled,İptal edilmiş, +Is Cancelled,İptal edildi mi, Stock Reconciliation,Stok Mutabakatı, This tool helps you to update or fix the quantity and valuation of stock in the system. It is typically used to synchronise the system values and what actually exists in your warehouses.,"Bu araç, güncellemek veya sistem stok miktarı ve değerleme düzeltmeleri için yardımcı olur. Genellikle sistem değerleri ve ne aslında depolarda var eşitlemek için kullanılır.", MAT-RECO-.YYYY.-,MAT-Reco-.YYYY.-, Reconciliation JSON,Mutabakat JSON, Stock Reconciliation Item,Stok Mutabakat Kalemi, Before reconciliation,Mutabakat öncesi, -Current Serial No,servis seri no, +Current Serial No,Güncel Seri No, Current Valuation Rate,Güncel Değerleme Oranı, Current Amount,Güncel Tutar, Quantity Difference,Miktar Farkı, Amount Difference,Tutar Farkı, Item Naming By,Ürün Adlandırma, -Default Item Group,Standart Ürün Grubu, +Default Item Group,Varsayılan Ürün Grubu, Default Stock UOM,Varsayılan Stok Ölçü Birimi, Sample Retention Warehouse,Numune Alma Deposu, -Default Valuation Method,Standart Değerleme Yöntemi, +Default Valuation Method,Varsayılan Değerleme Yöntemi, Show Barcode Field,Göster Barkod Alanı, Convert Item Description to Clean HTML,Açıklama Öğesini Temiz HTML'ye Dönüştür, Allow Negative Stock,Negatif Stoğa İzin ver, @@ -7373,30 +7369,30 @@ Raised By (Email),Talep eden (Email), Issue Type,Sorun Tipi, Issue Split From,Sorunun Ayrıldığı Yer, Service Level,Hizmet Seviyesi, -Response By,Yanıtla, -Response By Variance,Varyans Yanıtı, +Response By,Yanıtlayan, +Response By Variance,Varyansa Göre Yanıt, Ongoing,Devam ediyor, Resolution By,Çözen, -Resolution By Variance,Varyans ile Çözünürlük, +Resolution By Variance,Varyansa Göre Çözüm, Service Level Agreement Creation,Hizmet Seviyesi Anlaşması Oluşturma, First Responded On,İlk Yanıt Tarihi, -Resolution Details,Karar Detayları, +Resolution Details,Çözüm Detayları, Opening Date,Açılış Tarihi, Opening Time,Açılış Zamanı, -Resolution Date,Karar Tarihi, +Resolution Date,Çözüm Tarihi, Via Customer Portal,Müşteri Portalı üzerinden, Support Team,Destek Ekibi, Issue Priority,Sorun Önceliği, -Service Day,Hizmet günü, -Workday,Çalışma günü, +Service Day,Hizmet Günü, +Workday,Çalışma Günü, Default Priority,Varsayılan Öncelik, Priorities,Öncelikler, Support Hours,Destek Saatleri, -Support and Resolution,Destek ve Çözünürlük, +Support and Resolution,Destek ve Çözüm, Default Service Level Agreement,Varsayılan Servis Seviyesi Sözleşmesi, Entity,Tüzel, Agreement Details,Anlaşma Detayları, -Response and Resolution Time,Tepki ve Çözünürlük Zamanı, +Response and Resolution Time,Yanıt ve Çözüm Zamanı, Service Level Priority,Servis Seviyesi Önceliği, Resolution Time,Çözünürlük Zamanı, Support Search Source,Arama Kaynağı Desteği, @@ -7417,7 +7413,7 @@ Result Route Field,Sonuç Rota Alanı, Service Level Agreements,Hizmet Seviyesi Anlaşmaları, Track Service Level Agreement,Servis Seviyesi Sözleşmesini İzleyin, Allow Resetting Service Level Agreement,Servis Seviyesi Sözleşmesinin Sıfırlanmasına İzin Ver, -Close Issue After Days,Gün Sonra Kapat Sayı, +Close Issue After Days,Sorunu Kapat (gün sonra), Auto close Issue after 7 days,Sorunu 7 gün sonra otomatik olarak kapat, Support Portal,Destek Portalı, Get Started Sections,Başlarken Bölümleri, @@ -7456,11 +7452,11 @@ Asset Depreciation Ledger,Varlık Değer Kaybı Defteri, Asset Depreciations and Balances,Varlık Değer Kayıpları ve Hesapları, Available Stock for Packing Items,Ambalajlama Ürünleri İçin Kullanılabilir Stok, Bank Clearance Summary,Banka Gümrükleme Özeti, -Batch Item Expiry Status,Batch Öğesi Süre Sonu Durumu, -Batch-Wise Balance History,Batch bazlı Bakiye Geçmişi, +Batch Item Expiry Status,Parti Öğesi Süre Sonu Durumu, +Batch-Wise Balance History,Parti bazlı Bakiye Geçmişi, BOM Explorer,BOM Gezgini, BOM Search,Ürün Ağacı Arama, -BOM Stock Calculated,BOM Hisse Senedi Hesaplanan, +BOM Stock Calculated,BOM Stoğu Hesaplandı, BOM Variance Report,BOM Varyans Raporu, Campaign Efficiency,Kampanya Verimliliği, Cash Flow,Nakit Akışı, @@ -7476,8 +7472,8 @@ Customer-wise Item Price,Müşteri-bilge Öğe Fiyat, Customers Without Any Sales Transactions,Satış İşlemi olmayan Müşteriler, Daily Timesheet Summary,Günlük Zaman Çizelgesi Özeti, DATEV,DATEV, -Delayed Item Report,Gecikmeli Ürün Raporu, -Delayed Order Report,Gecikmeli Sipariş Raporu, +Delayed Item Report,Geciken Ürün Raporu, +Delayed Order Report,Geciken Sipariş Raporu, Delivered Items To Be Billed,Fatura Teslim Edilecek Ürünler, Delivery Note Trends,İrsaliye Trendleri, Electronic Invoice Register,Elektronik Fatura Kaydı, @@ -7486,7 +7482,7 @@ Employee Birthday,Personel Doğum Günü, Employee Information,Personel Bilgileri, Employee Leave Balance,Personelin Kalan İzni, Employee Leave Balance Summary,Personel İzin Bakiyesi Özeti, -Eway Bill,Eway Bill, +Eway Bill,Konşimento, Expiring Memberships,Süregelen Üyelikler, Fichier des Ecritures Comptables [FEC],Uyumlu Fichier des Ecritures [FEC], Final Assessment Grades,Final Değerlendirme Notları, @@ -7511,9 +7507,9 @@ Item Prices,Ürün Fiyatları, Item Shortage Report,Ürün Yetersizliği Raporu, Item Variant Details,Öğe Varyant Detayları, Item-wise Price List Rate,Ürün bazında Fiyat Listesi Oranı, -Item-wise Purchase History,Ürün bazında Alış Geçmişi, -Item-wise Purchase Register,Ürün bazında Alış Kaydı, -Item-wise Sales History,Ürün bazında Satış Geçmişi, +Item-wise Purchase History,Ürün Satınalma Geçmişi, +Item-wise Purchase Register,Ürün bazında Satınalma Kaydı, +Item-wise Sales History,Ürün Satış Geçmişi, Item-wise Sales Register,Ürün bazında Satış Kaydı, Items To Be Requested,Talep Edilecek Ürünler, Reserved,Ayrılmış, @@ -7527,7 +7523,7 @@ Open Work Orders,İş Emirlerini Aç, Qty to Deliver,Teslim Edilecek Miktar, Patient Appointment Analytics,Hasta Randevu Analizi, Payment Period Based On Invoice Date,Fatura Tarihine göre Ödeme Dönemi, -Pending SO Items For Purchase Request,Satınalma Talebi bekleyen PO Ürünleri, +Pending SO Items For Purchase Request,Satınalma Talebi Bekleyen PO Ürünleri, Procurement Tracker,Tedarik Takibi, Product Bundle Balance,Ürün Bundle Bakiyesi, Production Analytics,Üretim Analitiği, @@ -7541,32 +7537,32 @@ Purchase Analytics,Satınalma Analizi, Purchase Invoice Trends,Satınalma Faturası Analizi, Qty to Receive,Alınacak Miktar, Received Qty Amount,Alınan Miktar Tutarı, -Billed Qty,Faturalı Miktar, +Billed Qty,Faturalanan Miktar, Purchase Order Trends,Satınalma Sipariş Analizi, Purchase Receipt Trends,Satınalma İrsaliyesi Analizi, Purchase Register,Satınalma Kaydı, Quotation Trends,Teklif Analizi, -Received Items To Be Billed,Faturalanacak Malzemeler, +Received Items To Be Billed,Faturalanacak Kalemler, Qty to Order,Sipariş Miktarı, Requested Items To Be Transferred,Aktarılması istenen Ürünler, -Qty to Transfer,Transfer Yapılacak Miktar, +Qty to Transfer,Aktarılacak Miktar, Sales Analytics,Satış Analizleri, Sales Invoice Trends,Satış Faturası Analizi, Sales Order Trends,Satış Siparişi Analizi, Sales Partner Commission Summary,Satış Ortağı Komisyonu Özeti, Sales Partner Target Variance based on Item Group,Ürün Grubuna göre Satış Ortağı Hedef Varyansı, Sales Partner Transaction Summary,Satış Ortağı İşlem Özeti, -Sales Partners Commission,Satış Ortakları Komisyonu, +Sales Partners Commission,Satış Ortağı Komisyonu, Invoiced Amount (Exclusive Tax),Faturalanan Tutar (Hariç Vergi), Average Commission Rate,Ortalama Komisyon Oranı, Sales Payment Summary,Satış Ödeme Özeti, Sales Person Commission Summary,Satış Personeli Komisyonu Özeti, Sales Person Target Variance Based On Item Group,Ürün Grubuna göre Satış Elemanı Hedef Sapması, -Sales Person-wise Transaction Summary,Satış Personeli bilgisi İşlem Özeti, +Sales Person-wise Transaction Summary,Satış Personeli İşlem Özeti, Sales Register,Satış Kaydı, Serial No Service Contract Expiry,Seri No Hizmet Sözleşmesi Vadesi, Serial No Status,Seri No Durumu, -Serial No Warranty Expiry,Seri No Garanti Bitiş tarihi, +Serial No Warranty Expiry,Seri No Garanti Bitiş Tarihi, Stock Ageing,Stok Yaşlandırma, Stock and Account Value Comparison,Stok ve Hesap Değeri Karşılaştırması, Stock Projected Qty,Stok Öngörülen Miktarı, @@ -7591,8 +7587,8 @@ Warehouse wise Item Balance Age and Value,Depo bazında Öğe Bakiye Yaşı ve D Work Order Stock Report,İş Emri Stok Raporu, Work Orders in Progress,Devam eden İş Emirleri, Automatically Process Deferred Accounting Entry,Ertelenmiş Muhasebe Girişini Otomatik Olarak İşle, -Bank Clearance,Banka Gümrükleme, -Bank Clearance Detail,Banka Gümrükleme Detayı, +Bank Clearance,Banka Ödeme, +Bank Clearance Detail,Banka Ödeme Detayı, Update Cost Center Name / Number,Maliyet Merkezi Adını / Sunucunu Güncelleme, Journal Entry Template,Yevmiye Kaydı Şablonu, Template Title,Şablon Başlığı, @@ -7615,8 +7611,8 @@ Backdated Stock Entry,Geriye dönük Stok Hareketi, Row #{}: Currency of {} - {} doesn't matches company currency.,Satır # {}: {} - {} para birimi şirket para birimiyle eşleşmiyor., {} Assets created for {},{} İçin Ortamlar {} Varlıklar, {0} Number {1} is already used in {2} {3},{0} {1} sayısı zaten {2} {3} içinde kullanılıyor, -Update Bank Clearance Dates,Banka Gümrük Tarihlerini Güncelleme, -Healthcare Practitioner: ,Sağlık Hekimi:, +Update Bank Clearance Dates,Banka Ödeme Tarihlerini Güncelle, +Healthcare Practitioner: ,Sağlık Personeli:, Lab Test Conducted: ,Yapılan Laboratuvar Testi: , Lab Test Event: ,Laboratuvar Test Etkinliği: , Lab Test Result: ,Laboratuvar Test Sonucu: , @@ -7637,10 +7633,10 @@ Submit Journal Entries,Yevmiye Kayıtlarını Gönderin, If this is unchecked Journal Entries will be saved in a Draft state and will have to be submitted manually,Bu işaretlenmezse Yevmiye Kayıtları Taslak durumuna kaydedilir ve manuel olarak gönderilmesi gerekir, Enable Distributed Cost Center,Dağıtılmış Maliyet Merkezini Etkinleştirin, Distributed Cost Center,Dağıtılmış Maliyet Merkezi, -Dunning,ihtar, +Dunning,İhtarname, DUNN-.MM.-.YY.-,DUNN-.MM .-. YY.-, Overdue Days,Gecikmiş Günler, -Dunning Type,İhtar türü, +Dunning Type,İhtar Türü, Dunning Fee,İhtar Ücreti, Dunning Amount,İhtar Tutarı, Resolved,Çözüldü, @@ -7656,18 +7652,18 @@ Letter or Email Closing Text,Mektup veya E-posta Kapanış Metni, Body and Closing Text Help,Gövde ve Kapanış Metni Yardımı, Overdue Interval,Gecikme Aralığı, Dunning Letter,İhtarname, -"This section allows the user to set the Body and Closing text of the Dunning Letter for the Dunning Type based on language, which can be used in Print.","Bu bölüm, kullanıcılar, Baskıda yapılandırmaları dile bağlı olarak İhtar için İhtar Mektubunun Ana ve Kapanış görüntüsünün türünü düzenlemesine olanak tanır.", +"This section allows the user to set the Body and Closing text of the Dunning Letter for the Dunning Type based on language, which can be used in Print.","Bu bölüm, kullanıcının Yazdır'da kullanılabilecek dile bağlı olarak İhtar Mektubunun Gövde ve Kapanış metnini İhtar Türü için ayarlamasına olanak tanır.", Reference Detail No,Referans Detay No, Custom Remarks,Özel Açıklamalar, Please select a Company first.,Lütfen önce bir Şirket seçin., -"Row #{0}: Reference Document Type must be one of Sales Order, Sales Invoice, Journal Entry or Dunning","Satır # {0}: Referans Belge Türü, Satış Siparişi, Satış Faturası, Yevmiye Kaydı veya İhtarlardan biri olmalıdır", -POS Closing Entry,POS Kapanış Girişi, -POS Opening Entry,POS Açılış Girişi, +"Row #{0}: Reference Document Type must be one of Sales Order, Sales Invoice, Journal Entry or Dunning","Satır No {0}: Referans Belge Türü, Satış Siparişi, Satış Faturası, Yevmiye Kaydı veya İhtarlardan biri olmalıdır", +POS Closing Entry,POS Kapanış Kaydı, +POS Opening Entry,POS Açılış Kaydı, POS Transactions,POS İşlemleri, -POS Closing Entry Detail,POS Kapanış Giriş Detayı, +POS Closing Entry Detail,POS Kapanış Kaydı Detayı, Opening Amount,Açılış Tutarı, Closing Amount,Kapanış Tutarı, -POS Closing Entry Taxes,POS Kapanış Giriş Vergileri, +POS Closing Entry Taxes,POS Kapanış Kaydı Vergileri, POS Invoice,POS Faturası, ACC-PSINV-.YYYY.-,ACC-PSTERS-.YYYY.-, Consolidated Sales Invoice,Konsolide Satış Faturası, @@ -7784,7 +7780,7 @@ Configure the default Price List when creating a new Purchase transaction. Item "If this option is configured 'Yes', ERPNext will prevent you from creating a Purchase Invoice without creating a Purchase Receipt first. This configuration can be overridden for a particular supplier by enabling the 'Allow Purchase Invoice Creation Without Purchase Receipt' checkbox in the Supplier master.","Bu seçenek 'Evet' olarak yapılandırırsa, ERPNext, önce bir Satınalma Fişi oluşturmadan bir Satınalma Faturası oluşturmanızı engeller. Bu koruma, belirli bir tedarikçi için Tedarikçi ana sayfasındaki 'Satınalma Fişi Olmadan Satınalma Faturası Oluşturmaya İzin Ver' onay kutusu etkinleştirilerek geçersiz kılınabilir.", Quantity & Stock,Miktar ve Stok, Call Details,Çağrı Ayrıntıları, -Authorised By,tarafından yetkilendirildi, +Authorised By,Yetkilendiren, Signee (Company),İmza Sahibi (Şirket), Signed By (Company),İmzalayan (Şirket), First Response Time,İlk Yanıt Süresi, @@ -7796,7 +7792,7 @@ Add to Topics,Konulara Ekle, Add Article to Topics,Konulara Makale Ekle, This article is already added to the existing topics,Bu makale zaten mevcut üzerine eklendi, Add to Programs,Programlara Ekle, -Programs,programlı, +Programs,Programlar, ...Adding Course to Programs,... Programlara Ders Ekleme, Add Course to Programs,Programlara Ders Ekle, This course is already added to the existing programs,Bu kurs zaten mevcut programlara eklendi, @@ -7823,37 +7819,37 @@ Failed Import Log,Günlüğü İçe Aktarma Başarısız, Fixed Error Log,Sabit Hata Günlüğü, Company {0} already exists. Continuing will overwrite the Company and Chart of Accounts,"{0} şirketi zaten var. Devam etmek, Şirket ve Hesap Planının üzerine yazacaktır.", Meta Data,Meta Verileri, -Unresolve,Çünkü, +Unresolve,Çözümlemeyi kaldır, Create Document,Belge Oluştur, Mark as unresolved,Çözümlenmemiş olarak işaretle, TaxJar Settings,TaxJar Ayarları, Sandbox Mode,Korumalı Alan Modu, Enable Tax Calculation,Vergi Hesaplamasını Etkinleştir, Create TaxJar Transaction,TaxJar İşlemi Oluşturma, -Credentials,kimlik bilgileri, +Credentials,Kimlik Bilgileri, Live API Key,Canlı API Anahtarı, Sandbox API Key,Sandbox API Anahtarı, Configuration,Yapılandırma, Tax Account Head,Vergi Hesap Başkanı, Shipping Account Head,Sevkiyat Hesap Başkanı, -Practitioner Name,Uygulayıcı Adı, +Practitioner Name,Pratisyen Adı, Enter a name for the Clinical Procedure Template,Klinik muhafaza Şablonu için bir ad girin, Set the Item Code which will be used for billing the Clinical Procedure.,Klinik bölümleri faturalandırmak için kullanım Ürün Kodunu ayarlayın., Select an Item Group for the Clinical Procedure Item.,Klinik göz Öğesi için bir Öğe Grubu seçin., Clinical Procedure Rate,Klinik çevre Oranı, Check this if the Clinical Procedure is billable and also set the rate.,Klinik bölümlerin faturalandırılabilir olup olmadığı kontrol edin ve maliyet de ayarı., -Check this if the Clinical Procedure utilises consumables. Click ,Klinik çevre sarf malzemelerini kullanansa bunu kontrol edin. Tıklayın, +Check this if the Clinical Procedure utilises consumables. Click ,Klinik çevre sarf malzemelerini kullanansa bunu kontrol edin, Daha fazlasını öğrenmek için tıklayın, to know more,daha fazlasını bilmek, "You can also set the Medical Department for the template. After saving the document, an Item will automatically be created for billing this Clinical Procedure. You can then use this template while creating Clinical Procedures for Patients. Templates save you from filling up redundant data every single time. You can also create templates for other operations like Lab Tests, Therapy Sessions, etc.","Ayrıca şablon için Tıp Departmanını da ayarlayabilirsiniz. Belgeyi kaydettikten sonra, bu Klinik davanın faturalandırılması için otomatik olarak bir Öğe oluşturulacaktır. Daha sonra Hastalar için Klinik gözlemler oluştururken bu şablonu kullanabilirsiniz. Şablonlar sizi her fırsatta gereksiz verileri doldurmaktan kurtarır. Ayrıca Laboratuar Testleri, Terapi Oturumları vb. Gibi diğer yapılar için şablonlar oluşturabilirsiniz.", Descriptive Test Result,Tanımlayıcı Test Sonucu, Allow Blank,Boşluğa İzin Ver, Descriptive Test Template,Tanımlayıcı Test Şablonu, "If you want to track Payroll and other HRMS operations for a Practitoner, create an Employee and link it here.","Bir Pratisyen için Bordro ve diğer İKYS'leri takip etmek istiyor, bir çalışanı çalıştırıyor ve burada bulunuyor.", -Set the Practitioner Schedule you just created. This will be used while booking appointments.,"Yeni oluşturacağınız Uygulayıcı Program ayarını yapın. Bu, randevu almaktır.", -Create a service item for Out Patient Consulting.,Out Patient Consulting için bir hizmet kalemi oluşturun., -"If this Healthcare Practitioner works for the In-Patient Department, create a service item for Inpatient Visits.","Bu Sağlık Bakımı Uygulayıcısı Yatan Hasta Departmanı için çalışıyorsa, Yatan Hasta Ziyaretleri için bir hizmet öğesi oluşturun.", -Set the Out Patient Consulting Charge for this Practitioner.,Bu Uygulayıcı için Hasta Danışma Ücretini Belirleyin., -"If this Healthcare Practitioner also works for the In-Patient Department, set the inpatient visit charge for this Practitioner.","Bu Sağlık Bakımı Uygulayıcısı aynı zamanda Yatan Hasta Bölümü için çalışıyorsa, bu Uygulayıcı için yatarak hasta ziyareti ücretini ayarlar.", +Set the Practitioner Schedule you just created. This will be used while booking appointments.,"Yeni oluşturduğunuz Pratisyen Programını ayarlayın. Bu, randevu alınırken kullanılacaktır.", +Create a service item for Out Patient Consulting.,Ayakta Hasta Danışmanlığı için bir hizmet öğesi oluşturun., +"If this Healthcare Practitioner works for the In-Patient Department, create a service item for Inpatient Visits.","Bu Sağlık Personeli Yatan Hasta Departmanı için çalışıyorsa, Yatan Hasta Ziyaretleri için bir hizmet öğesi oluşturun.", +Set the Out Patient Consulting Charge for this Practitioner.,Bu Pratisyen için Hasta Muayene Ücretini Belirleyin., +"If this Healthcare Practitioner also works for the In-Patient Department, set the inpatient visit charge for this Practitioner.","Bu Sağlık Personeli aynı zamanda Yatılı Hasta Departmanında da çalışıyorsa, bu Pratisyen için yatan hasta ziyaret ücretini belirleyin.", "If checked, a customer will be created for every Patient. Patient Invoices will be created against this Customer. You can also select existing Customer while creating a Patient. This field is checked by default.","İşaretlenirse, her Hasta için bir müşteri oluşturur. Bu Müşteriye karşı Hastaları Fatura oluşturacaktır. Bir Hasta oluştururken mevcut Müşteriyi de idare eder. Bu alan değişken olarak işaretlidir.", Collect Registration Fee,Kayıt Ücretini Toplayın, "If your Healthcare facility bills registrations of Patients, you can check this and set the Registration Fee in the field below. Checking this will create new Patients with a Disabled status by default and will only be enabled after invoicing the Registration Fee.","Sağlık hizmetiz Hasta kayıtlarını faturalandırıyorsa, bunu kontrol edebilir ve aşağıdaki alanda Kayıt Ücretini belirleyebilirsiniz. Bunun işaretlenmesi, varsayılan olarak Devre Dışı maliyetlerine sahip yeni Hastalar oluşturacak ve yalnızca Kayıt Ücreti faturalandırma sonrasında etkinleştirilecektir.", @@ -7868,12 +7864,12 @@ Admission Order Details,Kabul Sipariş Ayrıntıları, Admission Ordered For,Kabul İçin Sipariş Verildi, Expected Length of Stay,Beklenen Kalma Süresi, Admission Service Unit Type,Kabul Hizmet Birimi Türü, -Healthcare Practitioner (Primary),Sağlık Hekimi (Birincil), -Healthcare Practitioner (Secondary),Sağlık Hekimi (İkincil), +Healthcare Practitioner (Primary),Sağlık Personeli (Birincil), +Healthcare Practitioner (Secondary),Sağlık Personeli (İkincil), Admission Instruction,Kabul Talimatı, Chief Complaint,Baş Şikayet, Medications,İlaçlar, -Investigations,incelemeler, +Investigations,Tahliller, Discharge Detials,Deşarj Detayları, Discharge Ordered Date,Tahliye Sipariş Tarihi, Discharge Instructions,Deşarj Talimatları, @@ -7887,7 +7883,7 @@ HLC-LAB-.YYYY.-,HLC-LAB-.YYYY.-, Expected Result Date,Beklenen Sonuç Tarihi, Expected Result Time,Beklenen Sonuç Süresi, Printed on,baskı tarihi, -Requesting Practitioner,Uygulayıcı İstiyor, +Requesting Practitioner,Pratisyen İstiyor, Requesting Department,Talep Eden Departmanı, Employee (Lab Technician),Çalışan (Laboratuvar Teknisyeni), Lab Technician Name,Laboratuvar Teknisyeni Adı, @@ -7901,7 +7897,7 @@ Result Legend Print,Sonuç Gösterge Baskısı, Print Position,Baskı Pozisyonu, Both,Her ikisi de, Result Legend,Açıklama Sonuçları, -Lab Tests,laboratuvar testi, +Lab Tests,Lab Testleri, No Lab Tests found for the Patient {0},Hasta için Laboratuar Testi bulunamadı {0}, "Did not send SMS, missing patient mobile number or message content.","SMS, eksik hasta cep telefonu numarası veya mesaj içeriği gönderilirdi.", No Lab Tests created,Laboratuvar testi oluşturmadı, @@ -7911,7 +7907,7 @@ Add New Line,Yeni Satır Ekle, Secondary UOM,İkincil UOM, "Single: Results which require only a single input.\n
\nCompound: Results which require multiple event inputs.\n
\nDescriptive: Tests which have multiple result components with manual result entry.\n
\nGrouped: Test templates which are a group of other test templates.\n
\nNo Result: Tests with no results, can be ordered and billed but no Lab Test will be created. e.g.. Sub Tests for Grouped results",Tekli : Yalnızca tek bir giriş gereksinimleri sonuçları.
Bileşik : Birden çok olay girişi gereksinimleri sonuçları.
Tanımlayıcı : Manuel sonuç girişi olan birden fazla sonuç sonucu olan testleri.
Gruplanmış : Diğer test şablonlarından oluşan test şablonları.
Sonuç Yok : Sonuçsuz bölümleri sipariş edilebilir ve faturalandırılabilir ancak Laboratuar Testi oluşturulmayacaktır. . Örneğin. Gruplandırılmış sonuçlar için Alt Testler, "If unchecked, the item will not be available in Sales Invoices for billing but can be used in group test creation. ","İşaretlenmemişse, öğe faturalama için Satış Faturalarında bulunmayacaktır ancak grup testi oluşturmada kullanılabilir.", -Description ,Açıklama, +Description ,Açıklama , Descriptive Test,Tanımlayıcı Testi, Group Tests,Grup Testleri, Instructions to be printed on the worksheet,Çalışma dosyası yazdırılacak belgeler, @@ -7920,17 +7916,17 @@ Normal Test Result,Normal Test Sonucu, Secondary UOM Result,İkincil UOM Sonucu, Italic,italik, Underline,Altını çizmek, -Organism,organizma, +Organism,Organizma, Organism Test Item,Organizma Test Öğesi, Colony Population,Koloni Popülasyonu, Colony UOM,Koloni UOM, Tobacco Consumption (Past),Tütün Tüketimi (Geçmiş), -Tobacco Consumption (Present),Tütün Tüketimi (Mevcut), +Tobacco Consumption (Present),Tütün Tüketimi (Günümüzde), Alcohol Consumption (Past),Alkol Tüketimi (Geçmiş), -Alcohol Consumption (Present),Alkol Tüketimi (Mevcut), +Alcohol Consumption (Present),Alkol Tüketimi (Günümüzde), Billing Item,Fatura Öğesi, Medical Codes,Tıbbi Kodlar, -Clinical Procedures,Klinik çevreler, +Clinical Procedures,Klinik Prosedürleri, Order Admission,Sipariş Kabulü, Scheduling Patient Admission,Hasta Kabulünün Planlanması, Order Discharge,Sipariş Tahliyesi, @@ -8003,9 +7999,9 @@ Manufacturing Section,Üretim Bölümü, Configure the default Price List when creating a new Sales transaction. Item prices will be fetched from this Price List.,Yeni bir Satış işlemi oluştururken varsayılan Fiyat Listesini yapılandırın. Ürün fiyatları bu Fiyat Listesinden alınacaktır., "If this option is configured 'Yes', ERPNext will prevent you from creating a Sales Invoice or Delivery Note without creating a Sales Order first. This configuration can be overridden for a particular Customer by enabling the 'Allow Sales Invoice Creation Without Sales Order' checkbox in the Customer master.","Bu seçenek 'Evet' olarak yapılandırılırsa, ERPNext, önce bir Satış Siparişi oluşturmadan bir Satış Faturası veya İrsaliye oluşturmanızı engeller. Bu yapılandırma, Müşteri ana sayfasında 'Satış Siparişi Olmadan Satış Faturası Oluşturulmasına İzin Ver' onay kutusu etkinleştirilerek belirli bir Müşteri için geçersiz kılınabilir.", "If this option is configured 'Yes', ERPNext will prevent you from creating a Sales Invoice without creating a Delivery Note first. This configuration can be overridden for a particular Customer by enabling the 'Allow Sales Invoice Creation Without Delivery Note' checkbox in the Customer master.","Bu seçenek 'Evet' olarak yapılandırılırsa, ERPNext önce İrsaliye oluşturmadan Satış Faturası oluşturmanızı engeller. Bu yapılandırma, belirli bir Müşteri için Müşteri ana sayfasındaki 'İrsaliye Olmadan Satış Faturası Oluşturulmasına İzin Ver' onay kutusu etkinleştirilerek geçersiz kılınabilir.", -Default Warehouse for Sales Return,Satış beyannamesi için varsayılan Depo, -Default In Transit Warehouse,Transit Depo Temerrüt, -Enable Perpetual Inventory For Non Stock Items,Stok Dışı Kalemler İçin Sürekli Envanteri Etkinleştirin, +Default Warehouse for Sales Return,Satış İadesi için Varsayılan Depo, +Default In Transit Warehouse,Varsayılan Transit Depo, +Enable Perpetual Inventory For Non Stock Items,Stokta Olmayan Ürünler İçin Sürekli Envanteri Etkinleştir, HRA Settings,HRA Ayarları, Basic Component,Temel Bileşenler, HRA Component,HRA Bileşenleri, @@ -8043,11 +8039,11 @@ User Resolution Time,Kullanıcı Çözüm Süresi, SLA is on hold since {0},"SLA, {0} yolcularından beri beklemede", Pause SLA On Status,Durum Açıkken SLA'yı Duraklat, Pause SLA On,SLA'yı Duraklat, -Greetings Section,Selamlar Bölümü, -Greeting Title,Tebrik Başlığı, -Greeting Subtitle,Karşılama Altyazısı, -Youtube ID,Youtube kesin, -Youtube Statistics,Youtube İstatistikleri, +Greetings Section,Selamlaşma Bölümü, +Greeting Title,Selamlama Başlığı, +Greeting Subtitle,Selamlama Altyazısı, +Youtube ID,Youtube ID, +Youtube Statistics,Youtube İstatistiği, Views,Görüntüleme, Dislikes,Beğenmeme sayısı, Video Settings,Video Ayarları, @@ -8055,16 +8051,16 @@ Enable YouTube Tracking,YouTube izlemeyi Etkinleştirin, 30 mins,30 dakika, 1 hr,1 saat, 6 hrs,6 saat, -Patient Progress,Hasta idaresi, +Patient Progress,Hasta İlerlemesi, Targetted,Hedeflenen, Score Obtained,Elde Edilen Puan, -Sessions,oturumlar, +Sessions,Oturumlar, Average Score,ortalama değil, Select Assessment Template,Değerlendirme Şablonunu Seçin, out of ,dışında, Select Assessment Parameter,Değerlendirme Parametrelerini Seçin, Gender: ,Cinsiyet:, -Contact: ,iletişim:, +Contact: ,İletişim: , Total Therapy Sessions: ,Toplam Terapi Seansları:, Monthly Therapy Sessions: ,Aylık Terapi Seansları:, Patient Profile,Hasta Profili, @@ -8106,13 +8102,13 @@ Total Delivered Amount,Toplam Teslimat Tutarı, Downtime Analysis,Kesinti Analizi, Machine,Makina, Downtime (In Hours),Arıza Süresi (Saat Olarak), -Employee Analytics,Çalışan Analitiği, +Employee Analytics,Personel Analitiği, """From date"" can not be greater than or equal to ""To date""","""Başlangıç tarihi"", ""Son tarih""; e eşit veya ondan büyük olamaz", Exponential Smoothing Forecasting,Üstel Düzeltme Tahmini, First Response Time for Issues,Sorunlar için İlk Yanıt Süresi, First Response Time for Opportunity,Fırsat için İlk Yanıt Süresi, Depreciatied Amount,Amortisman Tutarı, -Period Based On,Tarihe göre Dönem, +Period Based On,Döneme göre, Date Based On,Tarihe göre, {0} and {1} are mandatory,{0} ve {1} zorunludur, Consider Accounting Dimensions,Muhasebe Boyutlarını Dikkate al, @@ -8131,17 +8127,17 @@ Order Qty,Sipariş Miktarı, Raw Material Code,Hammadde Kodu, Raw Material Name,Hammadde Adı, Allotted Qty,Ayrılan Miktar, -Expected Arrival Date,Beklenilen tarihi, +Expected Arrival Date,Beklenen Varış Tarihi, Arrival Quantity,Varış Miktarı, Raw Material Warehouse,Hammadde Deposu, -Order By,tarafından sipariş, +Order By,Sipariş Veren, Include Sub-assembly Raw Materials,Alt Montaj ilk madde ve malzemeleri Dahil Et, Program wise Fee Collection,Program bazında Ücret Toplama, Fees Collected,Toplanan Ücretler, Project Summary,Proje Açıklaması, Total Tasks,Toplam Görev, Tasks Completed,Tamamlanan Görevler, -Tasks Overdue,Gecikmiş Görevler, +Tasks Overdue,Geciken Görevler, Completion,Tamamlanma, Purchase Order Analysis,Satınalma Siparişi Analizi, From and To Dates are required.,Başlangıç ve Bitiş Tarihleri gereklidir., @@ -8159,15 +8155,15 @@ Sales Order Analysis,Satış Siparişi Analizi, Amount Delivered,Teslim Edilen Miktar, Delay (in Days),Gecikme (Gün olarak), Group by Sales Order,Satış Siparişine Göre Gruplama, - Sales Value,Satış Değeri, +Sales Value,Satış Değeri, Stock Qty vs Serial No Count,Stok Adedi ve Seri No Sayısı Karşılaştırması, Serial No Count,Seri No Sayısı, Work Order Summary,İş Emri Özeti, -Produce Qty,adet üretim, -Lead Time (in mins),Teslim Süresi (dakika ölçüsü), +Produce Qty,Miktarı Üret, +Lead Time (in mins),Teslim Süresi (dk), Charts Based On,Dayalı Grafikler, YouTube Interactions,YouTube Etkileşimleri, -Published Date,yayınlanma tarihi, +Published Date,Yayınlanma Tarihi, Barnch,Barnch, Select a Company,Şirket Seçin, Opportunity {0} created,{0} birlikteliği, @@ -8185,7 +8181,7 @@ Program and Course,Program ve Kurslar, Mandatory Fields,Zorunlu alanlar, Student {0}: {1} does not belong to Student Group {2},"Öğrenci {0}: {1}, {2} Öğrenci Grubuna ait değil", Student Attendance record {0} already exists against the Student {1},Öğrenci Katılım kaydı {0} Öğrenci aleyhine zaten mevcut {1}, -Course and Fee,Kür ve Ücret, +Course and Fee,Kurs ve Ücret, Not eligible for the admission in this program as per Date Of Birth,Doğum Tarihine göre bu programa giriş için uygun değil, Topic {0} has been added to all the selected courses successfully.,"{0} barındırılan, seçilen tüm kurslara başarıyla eklendi.", Courses updated,Kurslar güncellendi, @@ -8220,7 +8216,7 @@ Incorrect Date,Yanlış Tarih, Invalid Gross Purchase Amount,Geçersiz Brüt Satınalma Tutarı, There are active maintenance or repairs against the asset. You must complete all of them before cancelling the asset.,Varlığa karşı aktif bakım veya onarımlar var. Varlığını iptal etmeden önce hepsini tamamlamanız gerekir., % Complete,% Tamamlayınız, -Back to Course,Kırsa Dön, +Back to Course,Kursa Dön, Finish Topic,Konuyu Bitir, Mins,Dakikalar, by,tarafından, @@ -8400,7 +8396,7 @@ Preview Email,E-posta Önizlemesi, Please select a Supplier,Lütfen bir Tedarikçi seçiniz, Supplier Lead Time (days),Tedarikçi Teslimat Süresi (gün), "Home, Work, etc.","Ev, İş vb.", -Exit Interview Held On,Çıkış Mülakat Bekleme Tarihi, +Exit Interview Held On,Çıkış Görüşmesi Tarihi, Sets 'Target Warehouse' in each row of the Items table.,Kalemler tablosunun her tablosunda 'Hedef Depo' ayarlar., Sets 'Source Warehouse' in each row of the Items table.,Kalemler tablosunun her tablosunda 'Kaynak Depo' ayarlar., POS Register,POS Kaydı, @@ -8422,7 +8418,6 @@ Future Posting Not Allowed,Hayatına Göndermeye İzin Verilmiyor, you must select Capital Work in Progress Account in accounts table,hesaplarda Sermaye Yarı Mamul Hesabını seçmelisiniz, You can also set default CWIP account in Company {},"Ayrıca, Şirket içinde genel CWIP hesabı da ayarlayabilirsiniz {}", The Request for Quotation can be accessed by clicking on the following button,Teklif Talebine aşağıdaki butona tıklanarak erişim sağlanır., -Regards,Saygılarımızla, Please click on the following button to set your new password,Yeni şifrenizi belirlemek için lütfen aşağıdaki düğmeyi tıklayın, Update Password,Şifreyi güncelle, Row #{}: Selling rate for item {} is lower than its {}. Selling {} should be atleast {},"Satır # {}: {} öğenin satış oranı, {} değerinden düşüktür. {} Satışı en az {} olmalıdır", @@ -8434,21 +8429,22 @@ Import Chart of Accounts from CSV / Excel files,Hesap Planını CSV / Excel dosy Completed Qty cannot be greater than 'Qty to Manufacture',Tamamlanan Miktar "Üretilecek Miktar" dan büyük olamaz, "Row {0}: For Supplier {1}, Email Address is Required to send an email","Satır {0}: Tedarikçi {1} için, e-posta aramak için E-posta Adresi Gereklidir", "If enabled, the system will post accounting entries for inventory automatically","Etkinleştiriliyorse, sistem envanteri için muhasebe girişlerini otomatik olarak yetkilendiriyor", -Accounts Frozen Till Date,Tarihe Kadar Dondurulan Hesaplar, +Accounts Frozen Till Date,Hesaplar Bugüne Kadar Donduruldu, Accounting entries are frozen up to this date. Nobody can create or modify entries except users with the role specified below,Muhasebe girişleri bu tarihe kadar dondurulmuştur. Aşağıda belirtilen role sahip kullanıcılar dışında hiç kimse giremez oluşturamaz veya değiştiremez, -Role Allowed to Set Frozen Accounts and Edit Frozen Entries,Dondurulmuş Hesapları Ayarlama ve Dondurulmuş Girişleri Düzenleme Rolü, +Role Allowed to Set Frozen Accounts and Edit Frozen Entries,Dondurulmuş Hesapları Ayarlama ve Dondurulmuş Girişleri Düzenlemeye İzin Verilen Rol, Address used to determine Tax Category in transactions,İşlemlerde Kategori Vergisini belirlemek için kullanılan adres, "The percentage you are allowed to bill more against the amount ordered. For example, if the order value is $100 for an item and tolerance is set as 10%, then you are allowed to bill up to $110 ","Sipariş verilen tutara göre daha fazla faturalandırma izninizin olduğu yüzde. Örneğin, bir öğe için sipariş değeri 100 $ ise ve tolerans% 10 olarak ayarlanmışsa, 110 $ 'a kadar faturalandırmanıza izin verilir", This role is allowed to submit transactions that exceed credit limits,"Bu rolün, kredi limitlerini aşan işlemlerin gönderilmesine izin verilir.", "If ""Months"" is selected, a fixed amount will be booked as deferred revenue or expense for each month irrespective of the number of days in a month. It will be prorated if deferred revenue or expense is not booked for an entire month",""Aylar" Kullanırken, bir aydaki gün kullanımlarında her ay için ertelenmiş gelir veya gider olarak sabit bir tutması gerekir. Ertelenmiş gelir veya giderler tüm bir ay rezerv içine olmayacakse, yaşayacak olacaktır.", "If this is unchecked, direct GL entries will be created to book deferred revenue or expense","Bu işaretlenmemişse, ertelenmiş gelir veya giderleri sınırlaması için doğrudan GL girişleri oluşturulacaktır.", -Show Inclusive Tax in Print,Baskıda Kapsayıcı Vergiyi Göster, +Show Inclusive Tax in Print,Dahil Edilen Vergiyi Baskıda Göster, +Percentage you are allowed to order beyond the Blanket Order quantity.,Blanket Sipariş miktarının ötesinde sipariş vermenize izin verilen yüzde., Only select this if you have set up the Cash Flow Mapper documents,Bunu yalnızca Nakit Akışı Eşleştiricisi belgelerini kurduysanız seçin, Payment Channel,Ödeme Kanalı, -Is Purchase Order Required for Purchase Invoice & Receipt Creation?,Satınalma Faturası ve İrsaliye oluşturmak için Satınalma Siparişi gerekiyor mu?, +Is Purchase Order Required for Purchase Invoice & Receipt Creation?,Alış Faturası ve İrsaliyesi oluşturmak için Satınalma Siparişi gerekli mi?, Is Purchase Receipt Required for Purchase Invoice Creation?,Satınalma Faturası oluşturmak için Satınalma İrsaliyesi gerekli mi?, -Maintain Same Rate Throughout the Purchase Cycle,Satınalma Döngüsü Boyunca Aynı Oranı Koruyun, -Allow Item To Be Added Multiple Times in a Transaction,Bir İşlemde Öğenin Birden Fazla Kez Eklenmesi İzin Ver, +Maintain Same Rate Throughout the Purchase Cycle,Satınalma Döngüsü Boyunca Aynı Oranı Koru, +Allow Item To Be Added Multiple Times in a Transaction,Bir İşlemde Öğenin Birden Fazla Kez Eklenmesine İzin Ver, Suppliers,Tedarikçiler, Send Emails to Suppliers,Tedarikçilere E-posta Gönder, Select a Supplier,Bir tedarikçi Seçin, @@ -8467,11 +8463,11 @@ HLC-IME-.YYYY.-,HLC-IME-.YYYY.-, Item Code (Drug),Ürün Kodu (İlaç), Medication Orders,İlaç Siparişleri, Get Pending Medication Orders,Bekleyen İlaç Siparişlerini Alın, -Inpatient Medication Orders,Yatarak Tedavi Talimatı, +Inpatient Medication Orders,Yatan Tedavi Talimatı, Medication Warehouse,İlaç Deposu, Warehouse from where medication stock should be consumed,İlaç stoğunun tüketilmesi gereken depo, Fetching Pending Medication Orders,Bekleyen İlaç Siparişleri Alınıyor, -Inpatient Medication Entry Detail,Yatarak Tedavi Edilen İlaç Giriş Detayı, +Inpatient Medication Entry Detail,Yatan Tedavi Edilen İlaç Giriş Detayı, Medication Details,İlaç Detayları, Drug Code,İlaç Kodu, Drug Name,İlaç Adı, @@ -8507,10 +8503,10 @@ Auto close Opportunity after the no. of days mentioned above,No'dan sonra Otomat Is Sales Order Required for Sales Invoice & Delivery Note Creation?,Satış Faturası ve İrsaliye Oluşturulması için Satış Siparişi Gerekiyor mu?, Is Delivery Note Required for Sales Invoice Creation?,Satış Faturası Oluşturmak için İrsaliye Gerekli mi?, How often should Project and Company be updated based on Sales Transactions?,Satış İşlemlerine göre Proje ve Şirket hangi sıklıkta güncellenmelidir?, -Allow User to Edit Price List Rate in Transactions,Kullanıcının İşlemlerinde Fiyat Listesi Oranını Düzenlemesine İzin Ver, +Allow User to Edit Price List Rate in Transactions,Kullanıcının İşlemlerde Fiyat Listesi Oranını Düzenlemesine İzin Ver, Allow Item to Be Added Multiple Times in a Transaction,Bir İşlemde Öğenin Birden Fazla Kez Eklenmesi İzin Ver, Allow Multiple Sales Orders Against a Customer's Purchase Order,Müşterinin Satınalma Siparişine Karşı Birden Fazla Satış Siparişine İzin Ver, -Validate Selling Price for Item Against Purchase Rate or Valuation Rate,Alış Fiyatı veya Değerleme Oranına Karşı Ürün için Satış Fiyatını Doğrula, +Validate Selling Price for Item Against Purchase Rate or Valuation Rate,Öğenin Satış Fiyatını Satınalma Oranına veya Değerleme Oranına Karşı Doğrula, Hide Customer's Tax ID from Sales Transactions,Müşterinin Vergi Numarasını Satış İşlemlerinden Gizle, "The percentage you are allowed to receive or deliver more against the quantity ordered. For example, if you have ordered 100 units, and your Allowance is 10%, then you are allowed to receive 110 units.","Sipariş edilen miktara göre daha fazla alma veya teslimat yapmanıza izin verilen yüzde. Örneğin, 100 birim sipariş ettiyseniz ve Ödeneğiniz %10 ise, 110 birim almanıza izin verilir.", Action If Quality Inspection Is Not Submitted,Kalite Denetimi Gönderilmezse Yapılacak İşlem, @@ -8564,7 +8560,7 @@ Creating {} out of {} {},{} / {} {} Oluşturuluyor, Item {0} {1},öğe {0} {1}, Last Stock Transaction for item {0} under warehouse {1} was on {2}.,{1} depolama verileri {0} öğesi için son Stok İşlemi {2} tarihinde yapıldı., Stock Transactions for Item {0} under warehouse {1} cannot be posted before this time.,{1}depo verileri {0} Öğesi için Stok İşlemleri bu süreden önce deftere aktarılamaz., -Posting future stock transactions are not allowed due to Immutable Ledger,Immutable Ledger nedeniyle kaynakları hisse senedi işlemlerinin kaydedilmesine izin verilmiyor, +Posting future stock transactions are not allowed due to Immutable Ledger,Immutable Ledger nedeniyle kaynakları Stok işlemlerinin kaydedilmesine izin verilmiyor, A BOM with name {0} already exists for item {1}.,{1} öğe için {0} adlı bir malzeme listesi zaten var., {0}{1} Did you rename the item? Please contact Administrator / Tech support,{0} {1} Öğeyi yeniden adlandırdınız mı? Lütfen Yönetici / Teknik destek ile iletişim geçin, At row #{0}: the sequence id {1} cannot be less than previous row sequence id {2},"{0}. Satırda: {1} sıralı kimlik, önceki satır dizisi kimliğinden {2} küçük olamaz", @@ -8580,12 +8576,12 @@ From Time cannot be after the current time.,From Time zaman sınırı sonra olam To Time cannot be after the current time.,To Time zaman sınırı sonra olamaz., Stock Entry {0} created and ,{0} Stok Hareketi kaydı ve, Inpatient Medication Orders updated successfully,Yatan Hasta İlaç Tedbirleri başarıyla güncellendi, -Row {0}: Cannot create Inpatient Medication Entry against cancelled Inpatient Medication Order {1},Satır {0}: İptal edilen Yatarak İlaç Emri {1} için Yatan Hasta İlaç Girişi yaratılamıyor, +Row {0}: Cannot create Inpatient Medication Entry against cancelled Inpatient Medication Order {1},Satır {0}: İptal edilen Yatan İlaç Emri {1} için Yatan Hasta İlaç Girişi yaratılamıyor, Row {0}: This Medication Order is already marked as completed,Satır {0}: Bu İlaç Tedavisi Siparişi zaten tamamlandı olarak işaretlendi, Quantity not available for {0} in warehouse {1},{1}haftasında {0} için miktar mevcut değil, Please enable Allow Negative Stock in Stock Settings or create Stock Entry to proceed.,Devam etmek için lütfen Stok Yapılandırmalarında Negatif Stoka İzin Sürümünü etkinleştirin veya Stok Hareketi oluşturun., No Inpatient Record found against patient {0},Hastaya karşı Yatan Hasta Kaydı bulunamadı {0}, -An Inpatient Medication Order {0} against Patient Encounter {1} already exists.,Hasta Karşılaşmasına karşı {0} Yatarak Tedavi Emri {1} zaten mevcut., +An Inpatient Medication Order {0} against Patient Encounter {1} already exists.,Hasta Muayenesine karşı {0} Yatan Tedavi Emri {1} zaten mevcut., Allow In Returns,İadelere İzin Ver, Hide Unavailable Items,Kullanılamayan Öğeleri Gizle, Apply Discount on Discounted Rate,İndirimli Fiyata İndirim Uygulayın, @@ -8596,20 +8592,20 @@ Therapy Types,Tedavi Türleri, Therapy Plan Template Detail,Tedavi Planı Şablon Detayı, Non Conformance,Uygunsuzluk, Process Owner,İşlem Sahibi, -Corrective Action,Düzeltici eylem, -Preventive Action,Önleyici eylemleyici, -Problem,sorun, -Responsible,sorumluluk sahibi, -Completion By,tamamlayan, +Corrective Action,Düzeltici İşlem, +Preventive Action,Önleyici İşlem, +Problem,Problem, +Responsible,Sorumluluk sahibi, +Completion By,Tamamlayan, Process Owner Full Name,İşlem Sahibinin Tam Adı, Right Index,Sağ Dizin, Left Index,Sol Dizin, -Sub Procedure,Alt çember, +Sub Procedure,Alt Prosedür, Passed,Geçti, -Print Receipt,Makbuzu yazdır, -Edit Receipt,Makbuzu düzenleyici, -Focus on search input,Arama girdisine odaklanın, -Focus on Item Group filter,Öğe Grubu odaklarının odak noktası, +Print Receipt,Makbuz Yazdır, +Edit Receipt,Makbuz Düzenle, +Focus on search input,Arama girdisine odaklan, +Focus on Item Group filter,Öğe Grubu filtresine odaklan, Checkout Order / Submit Order / New Order,Ödeme Siparişi / Sipariş Gönder / Yeni Sipariş, Add Order Discount,Sipariş İndirimi Ekle, Item Code: {0} is not available under warehouse {1}.,"Ürün Kodu: {0}, {1} deposunda bulunur.", @@ -8625,7 +8621,7 @@ Open Form View,Form Görünümünü Aç, POS invoice {0} created succesfully,POS faturası {0} başarıyla kuruldu, Stock quantity not enough for Item Code: {0} under warehouse {1}. Available quantity {2}.,Stok miktarı Ürün Kodu için yeterli değil: {1} altında {0} deposu. Mevcut miktar {2}., Serial No: {0} has already been transacted into another POS Invoice.,Seri No: {0} zaten başka bir POS Faturasına dönüştürüldü., -Balance Serial No,Denge Seri No, +Balance Serial No,Balance Seri No, Warehouse: {0} does not belong to {1},"Depo: {0}, {1} yerleşimi ait değil", Please select batches for batched item {0},Lütfen {0} toplu öğe için gruplar seçin, Please select quantity on row {0},Lütfen {0}. Satırdaki miktarı seçin, @@ -8670,12 +8666,12 @@ Please ensure {} account is a Receivable account. ,Lütfen {} hesabının bir Al Change the account type to Receivable or select a different account.,Hesap oluşturma Alacak olarak iletmek veya farklı bir hesap seçin., {} can't be cancelled since the Loyalty Points earned has been redeemed. First cancel the {} No {},Kazanılan Sadakat Puanları yöneticinin {} iptal etmesi mümkün değil. Önce {} Hayır {} 'ı iptal edin, already exists,zaten var, -POS Closing Entry {} against {} between selected period,Seçilen dönemler arasında {} karşısında POS Kapanış Girişi {}, +POS Closing Entry {} against {} between selected period,Seçilen dönemler arasında {} karşısında POS Kapanış Kaydı {}, POS Invoice is {},POS Faturası {}, POS Profile doesn't matches {},POS Profili {} ile eşleşmiyor, POS Invoice is not {},POS Faturası {} değil, POS Invoice isn't created by user {},POS Faturası kullanıcı tarafından oluşturulmaz {}, -Row #{}: {},Kürek çekme #{}: {}, +Row #{}: {},Satır no{}: {}, Invalid POS Invoices,Geçersiz POS Faturaları, Please add the account to root level Company - {},Lütfen hesabın kök bölgesindeki Şirkete ekleyin - {}, "While creating account for Child Company {0}, parent account {1} not found. Please create the parent account in corresponding COA","Alt Şirket {0} için hesap oluştururken, {1} ebeveyn hesabı bulunamadı. Lütfen ilgili COA'da üst hesabı oluşturun", @@ -8700,8 +8696,8 @@ Therapy Sessions Overlapping,Çakışan Terapi Seansları, Therapy Plans,Tedavi Planları, "Item Code, warehouse, quantity are required on row {0}","{0}. Satırda Öğe Kodu, depo, miktar gerekli", Get Items from Material Requests against this Supplier,Bu Tedarikçiye karşın Malzeme Taleplerinden Ürünleri Getir, -Enable European Access,Avrupa Erişimini Etkinleştirin, -Creating Purchase Order ...,Satınalma Siparişi Oluşturuyor ..., +Enable European Access,Avrupa Erişimini Etkinleştir, +Creating Purchase Order ...,Satınalma Siparişi Oluşturuluyor ..., "Select a Supplier from the Default Suppliers of the items below. On selection, a Purchase Order will be made against items belonging to the selected Supplier only.","Aşağıdaki seçenekler varsayılan tedarikçilerinden bir tedarikçi seçin. Seçim üzerine, yalnızca seçilen tedarikçiye ait ürünler için bir Satınalma Siparişi verecek.", Row #{}: You must select {} serial numbers for item {}.,Satır # {}: {} öğe için {} seri numaralarını seçmelisiniz., qty,Miktar, @@ -8716,7 +8712,7 @@ Auto Insert Item Price If Missing,Eksikse Öğe Fiyatını Otomatik Ekle, Update Existing Price List Rate,Mevcut Fiyat Listesi Oranını Güncelle, Stock Transactions Settings,Stok İşlem Ayarları, Role Allowed to Over Deliver/Receive,Aşırı Teslim Etmeye/Almaya İzin Verilen Rol, -Let's Set Up the Assets Module.,Assets Modülünü Kuralım!, +Let's Set Up the Assets Module.,Varlık Modülünü Kuralım!, "Assets, Depreciations, Repairs, and more.","Varlıklar, Amortismanlar, Onarımlar ve daha fazlası.", Review Fixed Asset Accounts,Sabit Kıymet Hesaplarını İnceleyin, Define Asset Category,Varlık Kategorisini Tanımla, @@ -8768,13 +8764,12 @@ Bill for Rejected Quantity in Purchase Invoice,Alış Faturasında Reddedilen Mi "If checked, Rejected Quantity will be included while making Purchase Invoice from Purchase Receipt.",İşaretlenirse Satınalma İrsaliyesinden Satınalma Faturası yapılırken Reddedilen Miktar dahil edilecektir., Disable Last Purchase Rate,Son Satınalma Oranını Devre Dışı Bırak, Role Allowed to Override Stop Action,Durdurma Eylemini Geçersiz kılma izni olan Rol, -"Review Stock Settings\n\nIn ERPNext, the Stock module\u2019s features are configurable as per your business needs. Stock Settings is the place where you can set your preferences for:\n- Default values for Item and Pricing\n- Default valuation method for inventory valuation\n- Set preference for serialization and batching of item\n- Set tolerance for over-receipt and delivery of items","# Stok Ayarlarını İnceleyin\n\nERPNext'te, Stok modülünün\u2019 özellikleri iş ihtiyaçlarınıza göre yapılandırılabilir. Stok Ayarları, şunlar için tercihlerinizi ayarlayabileceğiniz yerdir:\n- Öğe ve Fiyatlandırma için varsayılan değerler\n- Envanter değerlemesi için varsayılan değerleme yöntemi\n- Kalemlerin serileştirilmesi ve gruplandırılması için tercihi ayarlayın\n- Kalemlerin fazla girişi ve teslimatı için toleransı ayarlayın", +"Review Stock Settings\n\nIn ERPNext, the Stock module\u2019s features are configurable as per your business needs. Stock Settings is the place where you can set your preferences for:\n- Default values for Item and Pricing\n- Default valuation method for inventory valuation\n- Set preference for serialization and batching of item\n- Set tolerance for over-receipt and delivery of items","Stok Ayarlarını İnceleyin\n\nERPNext'te, Stok modülünün\u2019 özellikleri iş ihtiyaçlarınıza göre yapılandırılabilir. Stok Ayarları, şunlar için tercihlerinizi ayarlayabileceğiniz yerdir:\n- Öğe ve Fiyatlandırma için varsayılan değerler\n- Envanter değerlemesi için varsayılan değerleme yöntemi\n- Kalemlerin serileştirilmesi ve gruplandırılması için tercihi ayarlayın\n- Kalemlerin fazla girişi ve teslimatı için toleransı ayarlayın", Auto close Opportunity Replied after the no. of days mentioned above,Yukarıda belirtilen gün sayısından sonra Yanıtlanan Fırsatı Otomatik Kapat, Carry Forward Communication and Comments,İletişimi ve Yorumları Devret, -All the Comments and Emails will be copied from one document to another newly created document(Lead -> Opportunity -> Quotation) throughout the CRM documents.,"Tüm Yorumlar ve E-postalar, CRM belgeleri boyunca bir belgeden yeni oluşturulan başka bir belgeye (Yol -> Fırsat -> Teklif) kopyalanacaktır.", +All the Comments and Emails will be copied from one document to another newly created document(Lead -> Opportunity -> Quotation) throughout the CRM documents.,"Tüm Yorumlar ve E-postalar, CRM belgeleri boyunca bir belgeden yeni oluşturulan başka bir belgeye (Aday Müşteri -> Fırsat -> Teklif) kopyalanacaktır.", Allow Continuous Material Consumption,Sürekli Malzeme Tüketimi Sağlayın, Allow material consumptions without immediately manufacturing finished goods against a Work Order,Bir İş Emrine göre bitmiş ürünleri hemen üretmeden malzeme tüketimine izin verin, -Allow material consumptions without immediately manufacturing finished goods against a Work Order,Bir İş Emrine göre bitmiş ürünleri hemen üretmeden malzeme tüketimine izin verin, Add Corrective Operation Cost in Finished Good Valuation,Mamul Değerlemede Düzeltici Operasyon Maliyetini Ekleyin, Allow Excess Material Transfer,Fazla Malzeme Aktarımına İzin Ver, Allow transferring raw materials even after the Required Quantity is fulfilled,Gerekli Miktar yerine getirildikten sonra bile hammadde transferine izin ver, @@ -8807,7 +8802,6 @@ Additional Info,Ek Bilgi, Prospect,Potansiyel Müşteri, Workstation Type,İş İstasyonu Türü, Work Order Consumed Materials,İş Emri Sarf Malzemeleri, -Planned End Date,Planlanan Bitiş Tarihi, Inventory Settings,Envanter Ayarları, CRM Settings,CRM Ayarları, Operations & Materials,Operasyonlar ve Malzemeler, @@ -8830,16 +8824,16 @@ Show Barcode Field in Stock Transactions,Stok İşlemlerinde Barkod Alanı Göst Convert Item Description to Clean HTML in Transactions,İşlemlerde Öğe Açıklamasını Temiz HTML'ye Dönüştür, Operation time does not depend on quantity to produce,Operasyon süresi üretilecek miktara bağlı değildir, Set Operating Cost Based On BOM Quantity,BOM Ürün reçetesi miktarına göre Operasyon Maliyetini Belirle, -Allow Lead Duplication based on Emails,E-postaya dayalı Aday Çoğaltmaya İzin ver, -Close Replied Opportunity After Days,Cevaplanan Fırsatı Kapat (gün sonra), +Allow Lead Duplication based on Emails,E-postaya dayalı Aday Çoğaltılmasına İzin ver, +Close Replied Opportunity After Days,Yanıtlanan Fırsatı Kapat (gün sonra), Is Cash or Non Trade Discount,Nakit veya Ticari olmayan İndirim, Primary Address and Contact,Birincil Adres ve İletişim, Auto Creation of Contact,Kişinin Otomatik Oluşturulması, Control Historical Stock Transactions,Geçmiş Stok İşlemlerini Kontrol Et, -No stock transactions can be created or modified before this date.,Bu tarihten önce hisse senedi hareketleri oluşturulamaz veya değiştirilemez., +No stock transactions can be created or modified before this date.,Bu tarihten önce Stok hareketleri oluşturulamaz veya değiştirilemez., Role Allowed to Create/Edit Back-dated Transactions,Geriye Dönük İşlemleri Oluşturma / Düzenleme İzni Rolü, "If mentioned, the system will allow only the users with this Role to create or modify any stock transaction earlier than the latest stock transaction for a specific item and warehouse. If set as blank, it allows all users to create/edit back-dated transactions.","Belirtilirse, sistem yalnızca bu Role sahip kullanıcıların belirli bir kalem ve depo için en son stok işleminden önceki herhangi bir stok işlemini oluşturmasına veya değiştirmesine izin verecektir. Boş olarak ayarlanırsa, tüm kullanıcıların geçmiş tarihli oluşturmasına/düzenlemesine izin verir. işlemler.", -Stock transactions that are older than the mentioned days cannot be modified.,Belirtilen günlerden daha eski olan hisse senedi işlemleri değiştirilemez., +Stock transactions that are older than the mentioned days cannot be modified.,Belirtilen günlerden daha eski olan Stok işlemleri değiştirilemez., "The percentage you are allowed to transfer more against the quantity ordered. For example, if you have ordered 100 units, and your Allowance is 10%, then you are allowed transfer 110 units.","Sipariş edilen miktara göre daha fazla transfer etmenize izin verilen yüzde. Örneğin, 100 birim sipariş ettiyseniz ve Ödeneğiniz %10 ise, 110 birim transfer etmenize izin verilir.", Qty As Per BOM,BOMa göre Mik, Distribute Manually,Manuel olarak Dağıt, @@ -8848,19 +8842,19 @@ Get Raw Materials for Purchase,Satınalma için Hammaddeleri Getir, Get Raw Materials for Transfer,Transfer için Hammaddeleri Getir, Production Plan Item Reference,Üretim Planı Öge Referansı, Include Safety Stock in Required Qty Calculation,Emniyet Stokunu Gerekli Miktar Hesaplamasına Dahil Et, -Calculate Product Bundle Price based on Child Item,Ürün Paketi Fiyatını Alt Öğeye Göre Hesapla, +Calculate Product Bundle Price based on Child Item,Bundle Ürün Fiyatını Alt Öğeye Göre Hesapla, Customer Defaults,Müşteri Varsayılanları, Item Price Settings,Ürün Fiyat Ayarları, Standard Selling,Standart Satış, Terms Template,Şartlar Şablonu, Quotation Number,Teklif Numarası, -Min Qty (As Per Stock UOM),Min Mik (Stok birimine göre), -Max Qty (As Per Stock UOM),Max Mik (Stok birimine göre), +Min Qty (As Per Stock UOM),Min Mik (Stok Birimine göre), +Max Qty (As Per Stock UOM),Max Mik (Stok Birimine göre), Action If Same Rate is Not Maintained,Aynı Oran Sağlanmazsa Yapılacak İşlem, -Calculate Product Bundle Price based on Child Items' Rates,Alt Öğelerin Fiyatlarına Göre Ürün Paketi Fiyatını Hesaplayın, +Calculate Product Bundle Price based on Child Items' Rates,Bundle Ürün Fiyatını Alt Öğelerin Oranlarına Göre Hesapla, Transaction Settings,İşlem Ayarları, Sales Update Frequency in Company and Project,Şirket ve Projede Satış Güncelleme Sıklığı, -Allow Item to be Added Multiple Times in a Transaction,Bir İşlemde Birden Fazla Öğe Eklenmesine İzin Verme, +Allow Item to be Added Multiple Times in a Transaction,Bir İşlemde Birden Fazla Öğe Eklenmesine İzin Ver, Enable Discount Accounting for Selling,Satış için İskonto Muhasebesini Etkinleştirin, "If enabled, additional ledger entries will be made for discounts in a separate Discount Account","Etkinleştirilirse, indirimler için ayrı bir İndirim Hesabında ek defter girişleri yapılır", Setting the account as a Company Account is necessary for Bank Reconciliation,Hesabın Şirket Hesabı olarak ayarlanması Banka Mutabakatı için gereklidir, @@ -8873,7 +8867,7 @@ Show Net Values in Party Account,Cari Hesabındaki Net Değerleri Göster, Begin typing for results.,Sonuçlar için yazmaya başlayın., Invoice Portion (%),Fatura Porsiyonu (%), Discount Settings,İndirim Ayarları, -Payment Terms Status for Sales Order,Satış Siparişi için Ödeme Koşulları Durumu, +Payment Terms Status for Sales Order,Satış Siparişi için Ödeme Vadesi Durumu, Assembly Items,Montaj Öğeleri, Materials & Operations,Malzemeler ve Operasyonlar, Sub Assembly Items,Alt Montaj Öğeleri, @@ -8941,7 +8935,6 @@ Fetch Timesheet,Zaman Çizelgesini Getir, Dispatch Address Name,Sevk Adresi Adı, Permission Manager,İzin Yöneticisi, Warehouse Wise Stock Balance,Stok Bakiyesi Depo bazında, -Review Stock Settings,Stok Ayarlarını İnceleyin, Delayed Tasks Summary,Geciken Görevler Özeti, Rate of Stock UOM,Stok Birimi Oranı, Provisional Expense Account,Geçici Gider Hesabı, @@ -8960,43 +8953,678 @@ System Logs,Sistem Logları, KSA VAT Setting,KSA KDV Ayarları, KSA VAT Report,KSA KDV Raporu, UAE VAT 201,Birleşik Arap Emirlikleri KDV 201, -Add Comment,Yorum Ekle, -Maintenance,Bakım, -More...,Daha..., -Notes,Notlar, -Payment Gateway,Ödeme Ağ Geçidi, -Payment Gateway Name,Ödeme Ağ Geçidi Adı, -Payments,Ödemeler, -Plan Name,Plan Adı, -Portal,Portal, Profile,Profil, -Scan Barcode,Barkod Tara, -Some information is missing,Bazı bilgiler eksik, -Successful,Başarılı, -Tools,Araçlar, -Use Sandbox,Kullanım Sandbox, Busy,Meşgul, Completed By,Tarafından tamamlanmıştır, -Payment Failed,Ödeme başarısız, Column {0},{0} sütunu, Field Mapping,Alan Eşleme, Not Specified,Belirtilmemiş, Update Type,Güncelleme Türü, -Dr,Borç, -End Time,Bitiş Zamanı, Fetching...,Getiriliyor ..., "It seems that there is an issue with the server's stripe configuration. In case of failure, the amount will get refunded to your account.","Sunucunun şerit yapılandırmasında bir sorun var gibi görünüyor. Arıza durumunda, tutar hesabınıza iade edilir.", Looks like someone sent you to an incomplete URL. Please ask them to look into it.,Birisi eksik URL'ye gönderdi benziyor. içine bakmak için isteyin., -Master,Ana Kaynak, Pay,Ödeme, You can also copy-paste this link in your browser,Ayrıca bu linki kopyalayıp tarayıcınıza yapıştırabilirsiniz, -Verified By,Onaylayan Kişi, Invalid naming series (. missing) for {0},{0} için geçersiz adlandırma serisi (. Eksik), -Phone Number,Telefon Numarası, Account SID,Hesap SID, -Global Defaults,Genel Varsayılanlar, -Is Mandatory,Zorunludur, WhatsApp,WhatsApp, Make a call,Arama yap, Approve,Onayla, Reject,Reddet, +Shortcuts,Kısa Yollar, +Your Shortcuts,Kısa Yollarınız, +Show Tour,Turu Göster, +Chart Of Accounts,Hesap Planı, +Permitted Data Type,İzin Verilen Veri Türü, +Reports & Masters,Raporlar & Ana Veriler, +Masters & Reports,Ana Veriler ve Raporlar, +"ERPNext sets up a simple chart of accounts for each Company you create, but you can modify it according to business and legal requirements.","ERPNext, oluşturduğunuz her Şirket için basit bir hesap planı oluşturur, ancak bunu ticari ve yasal gereksinimlere göre değiştirebilirsiniz." +Watch Tutorial,Eğitimi izleyin, +"An individual who works and is recognized for his rights and duties in your company is your Employee. You can manage the Employee master. It captures the demographic, personal and professional details, joining and leave details, etc.","Şirketinizde çalışan, hakları ve görevleri ile tanınan bir kişi Çalışanınızdır. Çalışan yöneticisini yönetebilirsiniz. Demografik, kişisel ve mesleki ayrıntıları, katılma ve ayrılma ayrıntılarını vb. yakalar.", +Payroll,Bordro, +Let's Set Up the Payroll Module.,Bordro Modülünü Kuralım., +"Salary, Compensation, and more.","Maaş, Tazminat ve daha fazlası.", +Create Salary Component,Maaş Bileşeni Oluştur, +Create Payroll Period,Bordro Dönemi Oluştur, +Create Income Tax Slab,Gelir Vergisi Levhası Oluştur, +Create Salary Structure,Maaş Yapısı Oluştur, +Assign Salary Structure,Maaş Yapısını Atayın, +Create Salary Slip,Maaş Bordrosu Oluştur, +Payroll Settings,Bordro Ayarları, +Salary Register,Maaş Kaydı, +Salary Structure,Maaş Yapısı, +Show Income Tax Slab List,Gelir Vergisi Levha Listesini Göster, +Masters,Ana Veriler, +Patient Care Type,Hasta Bakım Türü, +Service Request,Servis Talebi, +Medication Request,İlaç Talebi, +Inpatient,Yatan Hasta, +Rehabilitation and Physiotherapy,Rehabilitasyon ve Fizyoterapi, +Experimental,Deneysel, +Intervention,Müdahale, +Preventive,Önleyici, +Diagnostic,Tanı, +Diagnotics,Teşhis, +Diagnostic Report,Teşhis Raporu, +Observation,Gözlem, +Observation Template,Gözlem Şablonu, +Service Units,Servis Birimleri, +Nursing,Hemşirelik, +Nursing Task,Hemşirelik Görevi, +Healthcare Activity,Sağlık Faaliyeti, +Nursing Checklist Template,Hemşirelik Kontrol Listesi Şablonu, +Terminology Mapping,Terminoloji Eşlemesi, +Code Value,Kod Değeri, +Code System,Kod Sistemi, +Definition,Tanım, +Treatment Plan Template,Tedavi Planı Şablonu, +Diagnosis Trends,Tanı Eğilimleri, +Diagnoses,Teşhisler, +Symptoms,Belirtiler, +Identification Number (UID),Kimlik Numarası (TCKN), +Patient History Settings,Hasta Geçmişi Ayarları, +Department wise Patient Appointments,Departman bazında Hasta Randevuları, +In-Patient Status,Yatılı Hasta Durumu, +Clinical Procedures Status,Klinik Prosedür Durumu, +Let's Set Up the Healthcare Module.,Haydi Sağlık Modülünü Kuralım., +"Patients, Practitioner Schedules, Settings, and more.","Hastalar, Pratisyen Programları, Ayarlar ve daha fazlası.", +Create Patient,Hasta Oluştur, +Create Practitioner Schedule,Pratisyen Programı Oluşturun, +Introduction to Healthcare Practitioner,Sağlık Personeline Giriş, +Create Healthcare Practitioner,Sağlık Personeli Oluşturun, +Explore Healthcare Settings,Sağlık Hizmeti Ayarlarını Keşfedin, +Explore Clinical Procedure Templates,Klinik Prosedür Şablonlarını Keşfedin, +Show Hasta List,{0} Listesini Göster, +Total Patients,Toplam Hasta, +Total Patients Admitted,Kabul Edilen Toplam Hasta, +Open Appointments,Açık Randevular, +Appointments To Bill,Faturalanacak Randevular, +Total Outgoing Bills,Toplam Giden Fatura, +Total Incoming Bills,Toplam Gelen Fatura, +Total Incoming Payment,Toplam Gelen Ödeme, +Total Outgoing Payment,Toplam Yapılan Ödeme, +{} Open,{} Açık, +{} Active,{} Aktif, +{} Vacant,{} Boş, +{} Assigned,{} Atandı, +{} Available,{} Mevcut, +{} Pending,{} Bekliyor, +{} Unclaimed,{} Talep edilmedi, +{} To Bill,{} Faturalanacak, +{} To Receive,{} Teslim alınacak, +{} To Deliver,{} Teslim edilecek, +{} To Receive,{} Teslim Alınacak, +{} To Deliver,{} Teslim Edilecek, +{} Available,{} Mevcut, +Tax Masters,Vergi Ana Verileri, +Take a walk through Stock Settings,Stok Ayarlarında bir gezintiye çıkın, +Total Stock Value,Toplam Stok Değeri, +Total Warehouses,Toplam Depolar, +Total Active Items,Toplam Aktif Ürünler, +Quick Access,Hızlı Erişim, +Learn Inventory Management,Envanter Yönetimini Öğrenin, +Items Catalogue,Ürün Kataloğu, +Get Started,Başlarken, +Visit LMS Portal,LMS Portalını ziyaret edin, +Create a Course,Kurs Oluştur, +Setup a Home Page,Bir Ana Sayfa Oluşturun, +LMS Setting,LMS Ayarları, +Documentation,Dokümantasyon, +Video Tutorials,Video Eğitimleri, +Signups,Kayıtlar, +Enrollments,Başvurular, +Statistics,İstatistik, +Course Completed,Kurs Tamamlandı, +Evaluation,Değerlendirme, +{} Completed,{} Tamamlandı, +{} Enrolled,{} Kayıtlı, +{} Granted,{} Verildi, +{} Passed,{} Geçti, +{} Published,{} Yayınlandı, +Course,Kurs, +Course Data,Kurs Verileri, +Course Stats,Kurs İstatistikleri, +Lesson,Ders, +Evaluation Request,Değerlendirme Talebi, +Quiz Submission,Sınav Gönderimi, +Let's begin your journey with ERPNext,Haydi ERPNext ile yolculuğa başlayalım!, +"Item, Customer, Supplier and Quotation","Ürün, Müşteri, Tedarikçi ve Teklif", +Create an Item,Bir Öğe Oluşturun, +Create a new Item ,Bir Öğe Oluşturun, +Create a Customer,Müşteri Oluşturun, +Create Your First Sales Invoice ,İlk Satış Faturanızı Oluşturun, +"Item is a product or a service offered by your company, or something you buy as a part of your supplies or raw materials.","Ürün, şirketiniz tarafından sunulan bir ürün veya hizmettir ya da malzeme veya hammaddelerinizin bir parçası olarak satın aldığınız bir şeydir.\n Items are integral to everything you do in ERPNext - from billing, purchasing to managing inventory. Everything you buy or sell, whether it is a physical product or a service is an Item. Items can be stock, non-stock, variants, serialized, batched, assets, etc.","Öğeler, faturalandırma, satın alma ve envanter yönetimine kadar ERPNext'te yaptığınız her şeyin ayrılmaz bir parçasıdır. İster fiziksel bir ürün ister hizmet olsun, satın aldığınız veya sattığınız her şey bir Öğedir. Öğeler stok, stok dışı, varyantlar, serileştirilmiş olabilir, toplu, varlıklar vb.", +Check Stock Ledger,Stok Defterini Kontrol Edin, +Learn Project Management,Proje Yönetimini Öğren, +Users List,Kullanıcı Listesi, +No filters selected,Hiçbir filtre seçilmedi, +Partnership,Ortaklık, +Proprietorship,Sahiplik, +Internal Customer,Dahili Müşteri, +Allowed Items,İzin Verilen Öğeler, +Party Specific Item,Partiye Özel Öğe, +Portal Users,Portal Kullanıcıları, +Customer Portal Users,Müşteri Portalı Kullanıcıları, +Show Title in Link Fields,Bağlantı Alanlarında Başlığı Göster, +Translate Link Fields,Bağlantı Alanlarını Çevir, +Learn Procurement,Satınalmayı Öğren, +Learn Sales Management,Satış Yönetimini Öğren, +Let’s walk-through few Buying Settings,Birkaç Satınalma Ayarını gözden geçirelim, +Let’s walk-through Selling Settings,Satış Ayarlarını gözden geçirelim, +Allow Negative rates for Items,Öğeler için Negatif oranlara izin ver, +Allow Sales Order Creation For Expired Quotation,Süresi Dolmuş Teklif İçin Müşteri Siparişi Oluşturulmasına İzin Ver, +Don't Reserve Sales Order Qty on Sales Return,Satış İadesinde Satış Siparişi Adetini Ayırmayın, +Percentage you are allowed to sell beyond the Blanket Order quantity.,Tam Sipariş miktarının ötesinde satış yapmanıza izin verilen yüzde., +Set Operating Cost / Scrape Items From Sub-assemblies,İşletim Maliyetini Ayarlama / Alt Montajlardan Öğeleri Kazı, +"In the case of 'Use Multi-Level BOM' in a work order, if the user wishes to add sub-assembly costs to Finished Goods items without using a job card as well the scrap items, then this option needs to be enable.","Bir iş emrinde 'Çok Düzeyli Malzeme Listesi Kullan' durumunda, kullanıcı iş kartı kullanmadan Mamul kalemlerine ve hurda kalemlere alt montaj maliyetlerini eklemek isterse bu seçeneğin etkinleştirilmesi gerekir.", +Create and send emails to a specific group of subscribers periodically.,Belirli aralıklarla belirli bir abone grubuna e-posta oluşturun ve gönderin., +Enable Provisional Accounting For Non Stock Items,Stok Dışı Kalemler için Geçici Muhasebeyi Etkinleştir, +Book Advance Payments in Separate Party Account,Avans Ödemelerini Ayrı Taraf Hesabında Ayırın, +"Enabling this option will allow you to record -

1. Advances Received in a Liability Account instead of the Asset Account

2. Advances Paid in an Asset Account instead of the Liability Account","Bu seçeneğin etkinleştirilmesi aşağıdakileri kaydetmenize olanak tanır -

1. Varlık Hesabı yerine Pasif Hesabından Alınan Avanslar

2. Pasif Hesabı yerine Varlık Hesabına Ödenen Avanslar", +"# Buying Settings\n\n\nBuying module\u2019s features are highly configurable as per your business needs. Buying Settings is the place where you can set your preferences for:\n\n- Supplier naming and default values\n- Billing and shipping preference in buying transactions\n\n\n","Satın Alma Ayarları\n\n\nSatın Alma modülünün özellikleri iş ihtiyaçlarınıza göre son derece yapılandırılabilir. Satın Alma Ayarları, aşağıdaki tercihlerinizi ayarlayabileceğiniz yerdir:\n\n- Tedarikçi adı ve varsayılan değerler\n- Faturalandırma ve satınalma işlemlerinde gönderim tercihi\n\n\n", +Create a new Item,Yeni bir Ürün Oluştur, +"# Create an Item\n\nItem is a product or a service offered by your company, or something you buy as a part of your supplies or raw materials.\n\nItems are integral to everything you do in ERPNext - from billing, purchasing to managing inventory. Everything you buy or sell, whether it is a physical product or a service is an Item. Items can be stock, non-stock, variants, serialized, batched, assets, etc.\n","Bir Öğe Oluşturun\n\nÖğe, şirketiniz tarafından sunulan bir ürün veya hizmettir ya da sarf malzemelerinizin veya hammaddelerinizin bir parçası olarak satın aldığınız bir şeydir.\n\nÖğeler, faturalandırmadan satın alma işlemine kadar ERPNext'te yaptığınız her şeyin ayrılmaz bir parçasıdır. envanteri yönetmek. İster fiziksel bir ürün ister hizmet olsun, satın aldığınız veya sattığınız her şey bir Öğedir. Öğeler stok, stok dışı, varyantlar, serileştirilmiş, toplu, varlıklar vb. olabilir.\n" +Exchange Rate Revaluation Settings,Döviz Kuru Yeniden Değerleme Ayarları, +Add Columns in Transaction Currency,İşlem Para Biriminde Sütun Ekle, +Ignore Exchange Rate Revaluation Journals,Döviz Kuru Yeniden Değerleme Günlüklerini Yoksay, +Auto Create Exchange Rate Revaluation,Döviz Kuru Yeniden Değerlemesini Otomatik Oluştur, +Fixed Asset Defaults,Sabit Kıymet Varsayılanları, +Fixed Asset Accounts,Sabit Kıymet Hesapları, +Asset Activity,Varlık Etkinliği, +Asset Capitalization,Varlık Kapitalizasyonu, +Learn Accounting,Muhasebeyi Öğrenin, +Buying and Selling,Alış ve Satış, +Buying & Selling Settings,Alış ve Satış Ayarları, +Ignore Closing Balance,Kapanış Bakiyesini Yoksay, +Purchase Value,Alış Değeri, +Manage,Yönet, +Create a Reminder,Bir Hatırlatıcı Oluştur, +Remind Me In,Bana Hatırlat, +Remind At,Hatırlatma Zamanı, +Delete Transactions,İşlemleri Sil, +Submit ERR Journals?,ERR Günlükleri Gönderilsin mi?, +Subcontracting Order,Fason Siparişi, +Subcontracting Receipt,Fason İrsaliyesi, +Deferred Accounting,Ertelenmiş Muhasebe, +Period Closing Entry For Current Period,Cari Dönem için Dönem Kapanış Kaydı, +With Period Closing Entry For Opening Balances,Açılış Bakiyeleri için Dönem Kapanış Kaydı ile, +Show net values in opening and closing columns,Net değerleri açılış ve kapanış sütunlarında göster, +Total Asset,Toplam Aktif, +Total Liability,Toplam Pasif, +Total Equity,Toplam Sermaye, +Report View,Rapor Görünümü, +Growth View,Büyüme Görünümü, +Margin View,Marj Görünümü, +Select View,Görünüm Seçin, +Date Range,Tarih Aralığı, +Helpdesk,Yardım Masası, +Visit Helpdesk,Yardım Masasını Ziyaret edin, +Helpdesk Configuration,Yardım Masası Yapılandırması, +Ticket Configuration,Ticket Yapılandırması, +Ticket Type,Çağrı Türü, +Support Policy,Destek Politikası, +Agent Configuration,Temsilci Yapılandırması, +Agent,Temsilci, +Team,Takım, +Helpdesk Reports,Yardım Masası Raporları, +Ticket Analytics,Çağrı Analitiği, +Ticket Summary,Çağrı Özeti, +Workflow,İş Akışı, +Branding,Markalaşma, +Misc,Muhtelif, +SLAs,SLA'lar, +Track SLA,SLA'yı İzle, +Allow Resetting SLA,SLA'nın Sıfırlanmasına İzin ver, +Öncelik,Öncelik, +Default priority,Varsayılan Öncelik, +Default ticket type,Varsayılan Çağrı türü, +Ticket type is mandatory,Çağrı türü zorunludur, +Team Restrictions,Takım Kısıtlamaları, +Restrict tickets by Team,Çağrıları Takıma göre kısıtla, +Suggest Articles in New TIcket Page,Yeni Çağrı Sayfasında Ürün/Hizmet Öner, +Prefer knowledge base,Bilgi tabanını tercih et, +Skip e-mail workflow,E-posta iş akışını atla, +"This field is used to skip email-related workflows for tickets. If this field is checked, no emails will be sent related to tickets, such as new ticket creation, status updates, or notifications.","Bu alan, Çağrılar için e-posta ile ilgili iş akışlarını atlamak için kullanılır. Bu alan işaretlenirse, yeni çağrı oluşturma, durum güncellemeleri veya bildirimler gibi destek bildirimleriyle ilgili hiçbir e-posta gönderilmez.", +Instantly send e-mail,Anında e-posta gönder, +"This field is used to send an email instantly without adding it into the queue. If this field is checked, the email will be sent immediately after clicking the "Send" button, instead of being added to the email queue for later processing.","Bu alan, bir e-postayı kuyruğa eklemeden anında göndermek için kullanılır. Bu alan işaretlenirse, e-posta daha sonra işlenmek üzere e-posta kuyruğuna eklenmek yerine "Gönder" düğmesine tıklandıktan hemen sonra gönderilir.", +Toasts,Bildirim, +Suppress default email toast,Varsayılan e-posta bildirimini durdur, +Is setup complete,Kurulum tamamlandı mı, +Is name setup skipped,Ad kurulumu atlandı mı, +Service Level Name,Hizmet Seviyesi Adı, +enabled,etkinleştirildi, +Assignment Conditions,Atama Koşulları +Default SLA,Varsayılan SLA +"Simple Python Expression, Example: doc.status == 'Open' and doc.ticket_type == 'Bug'","Basit Python İfadesi, Örnek: doc.status == 'Aç' ve doc.ticket_type =='Bug'", +condition,koşul, +Response and Resolution,Yanıt ve Çözüm, +Apply SLA for Resolution Time,Çözüm Süresi için SLA'yı Uygulayın, +priorities,öncelikler, +Status Details,Durum Ayrıntıları, +SLA Fulfilled On,SLA'nın Gerçekleştiği Tarih, +SLA Paused On,SLA Duraklatıldığı Tarih, +User Category,Kullanıcı Grubu, +Ignore Restrictions,Kısıtlamaları Yoksay, +Do not apply filters and restrictions to agents of this team,Bu ekibin temsilcilerine filtre ve kısıtlama uygulamayın, +Channels,Kanallar, +Hiring vs Attrition Count,İşe Alım ve Yıpranma Sayısı, +Hiring Count,İşe Alım Sayısı, +Attrition Count,Yıpranma Sayısı, +Onboarding Activities,Katılım Faaliyetleri, +Onboarding Begins On,Katılım Tarihinde Başlıyor, +Round Name,Tur Adı, +Interviewers,Görüşmeciler, +Expected Skillset,Beklenen Beceri Seti, +Expected Average Rating,Beklenen Ortalama Derecelendirme, +Department Wise Openings,Departman Bazında Açılışlar, +Let's Set Up the Human Resource Module.,İnsan Kaynakları Modülünü Kuralım., +"Employee, Leaves, and more.","Personel, İzinler ve daha fazlası.", +HR Settings,İK Ayarları, +HR Dashboard,İK Kontrol Paneli, +Recruitment Dashboard,İşe Alım Kontrol Paneli, +Employee Lifecycle Dashboard,Personel Yaşam Döngüsü Kontrol Paneli, +Attendance Dashboard,Katılım Kontrol Paneli, +Expense Claims Dashboard,Gider Talepleri Kontrol Paneli, +Leaves,İzinler, +No leaves have been allocated.,İzin tahsisi yapılmadı., +Dates & Reason,Tarihi ve Nedeni, +Approval,Onay, +leave application,İzin Uygulaması, +Leave Application,İzin Uygulaması, +Compensatory Leave Request,Telafi İzin Talebi, +Employee Grade,Personel Derecesi, +Create Holiday List,Tatil Listesi Oluşturun, +Create Leave Type,İzin Türü Oluştur, +Create Leave Allocation,İzin Tahsisi Oluşturun, +Create Leave Application,İzin Başvurusu Oluşturun, +Monthly Attendance Sheet,Aylık Devam Tablosu, +Recruitment Analytics,İşe Alım Analitiği, +Employee Advance Summary,Personel Avansı Özeti, +Employee Exits,Personel Çıkışları, +Travel Request,Seyahat Talebi, +Employees Working on a Holiday,Tatilde Çalışan Personeller, +Daily Work Summary Replies,Günlük Çalışma Özeti Yanıtları, +Daily Work Summary Group,Günlük İş Özeti Grubu, +Daily Work Summary,Günlük İş Özeti, +Team Updates,Takım Güncellemeleri, +Attendance,Katılım, +Attendance Request,Katılım Talebi, +Employee Checkin,Personel Giriş, +Attendance Date,Katılım Tarihi, +Shift,Vardiya, +Shifts,Vardiyalar, +Late Entry,Geç Giriş, +Early Exit,Erken Çıkış, +Present,Geldi, +Absent,Gelmedi, +On Leave,İzinli, +Work From Home,Evden Çalışma, +On Duty,Görevde, +Include Holidays,Tatilleri Dahil Et, +Note: Shift will not be overwritten in existing attendance records,Not: Mevcut yoklama kayıtlarında vardiyanın üzerine yazılmayacaktır, +Explanation,Açıklama, +Company Details,Şirket Detayları, +Administrative Assistant,İdari Asistan, +Business Analyst,İş Analisti, +Chief Executive Officer,CEO, +Chief Financial Officer,CFO Mali İşler Direktörü, +Chief Operating Officer,COO Baş İşletme Görevlisi, +Chief Technology Officer,Teknolojiden Sorumlu Başkan, +Customer Service Representative,Müşteri Hizmetleri Temsilcisi, +Executive Assistant,Yönetici Asistanı, +Finance Manager,Finans Yöneticisi, +Managing Director,Genel Müdür, +Marketing Manager,Pazarlama Müdürü, +Marketing Specialist,Pazarlama Uzmanı, +President,Başkan, +Product Manager,Ürün Müdürü, +Sales Representative,Satış Temsilcisi, +Vice President,Başkan Vekili, +Attendance & Leaves,Devam ve İzinler, +Joining,Katılma, +Log Type,Kayıt Türü, +Location / Device ID,Konum / Cihaz Kimliği, +Skip Auto Attendance,Otomatik Katılımı Atla, +Cost to Company (CTC),Şirkete Maliyeti (CTC), +Salary Currency,Maaş Para Birimi, +Passport Details,Pasaport Detayları, +I am looking for a job,İş arıyorum, +Profile Complete,Profil Tamamlandı, +Education Details,Eğitim detayları, +Institution Name,Kurum Adı, +Degree Type,Derece Türü, +Field of Major/Study,Anadal/Çalışma Alanı, +Work Experience Details,İş tecrübesi detayları +Work Experience,İş deneyimi, +Hide my Private Information from others,Özel Bilgilerimi başkalarından gizle, +Private Information includes your Grade and Work Environment Preferences,Özel Bilgiler Notunuzu ve Çalışma Ortamı Tercihlerinizi içerir, +Volunteering or Internship,Gönüllülük veya Staj, +I am currently working here,Şu anda burada çalışıyorum, +Certification Details,Sertifika Detayları, +Certification Name,Sertifika Adı, +Skill Details,Beceri Detayları, +Skill,Yetenek, +Career Preference Details,Kariyer Tercih Detayları, +Preferred Functions,Tercih Edilen İşlevler, +Preferred Location,Tercih edilen Konum, +Preferred Industries,Tercih edilen Sektörler, +Dream Companies,Hayalinizdeki Şirketler, +Work Environment,İş Ortamı, +Attire Preference,Kıyafet Tercihi, +Casual Wear,Rahat kıyafet, +Formal Wear,Resmi Kıyafet, +Collaboration Preference,İşbirliği Tercihi, +collaboration,işbirliği, +Role Preference,Rol Tercihi +Clearly Defined Role,Açıkça Tanımlanmış Rol, +Location Preference,Konum Tercihi, +Travel,Seyahat, +Individual Work,Bireysel Çalışma +Team Work,Takım Çalışması, +Both Individual and Team Work,Hem Bireysel Hem Takım Çalışması, +Unstructured Role,Yapılandırılmamış Rol, +Office close to Home,Eve yakın Ofis, +Corporate Organization,Kurumsal Organizasyon, +Startup Organization,Başlangıç Organizasyonu, +Time Preference,Zaman Tercihi, +Flexible Time,Esnek Zaman, +Fixed 9-5,Sabit 9-5, +Company Type,Şirket Türü, +BOM Creator,BOM Oluşturucu, +Learn Manufacturing,İmalatı Öğrenin, +Plant Floor,Fabrika Katı, +Floor Name,Kat Adı, +Voucher Subtype,Fiş Altürü, +Credit (Transaction),Alacak (İşlem), +Debit (Transaction),Borç (İşlem), +Transaction Currency,İşlem Para Birimi, +Sort Ascending,Artan Sıralama, +Sort Descending,Azalan Sıralama, +Reset sorting,Sıralamayı sıfırla, +Remove column,Sütunu kaldır, +Manual Inspection,Manuel Muayene, +Reading Value,Okuma Değeri, +Outgoing Salary,Giden Maaş, +Ledgers,Defterler, +Financial Reports,Finansal Raporlar, +Salary Slip List,Maaş Bordrosu Listesi, +Consider Rejected Warehouses,Reddedilen Depoları Göz önünde bulundurun, +Enable it if users want to consider rejected materials to dispatch.,Kullanıcılar reddedilen materyallerin gönderilmesini dikkate almak istiyorsa bunu etkinleştirin., +Scan Mode,Tarama Modu, +"If checked, picked qty won't automatically be fulfilled on submit of pick list.",İşaretlenirse seçilen miktar çeki listesinin gönderilmesi sırasında otomatik olarak yerine getirilmeyecektir., +Group Same Items,Aynı Ögeleri Grupla, +Prompt Qty,İstem Miktarı, +Claims,Talepler, +Shift & Attendance,Vardiya ve İşe Devamlılık, +Shift Type,Vardiya Tipi, +Shift Assignment,Vardiya Ataması, +Shift Request,Vardiya Talebi, +Employee Attendance Tool,Çalışan Katılım Aracı, +Upload Attendance,Katılımı Yükle, +Shift Attendance,Vardiya Katılımı, +Employee Hours Utilization Based On Timesheet,Zaman Çizelgesine Göre Çalışan Saatleri Kullanımı, +Project Profitability,Proje Karlılığı, +Employees working on a holiday,Tatilde Çalışan Personeller, +Expense Claim Type,Masraf Talebi Türü, +Additional Salary,Ek Maaş, +Purpose of Travel,Seyahat Amacı, +Personel Avansı Özeti,Personel Avansı Özeti, +Unpaid Expense Claim,Ödenmemiş Masraf Talebi, +Vehicle Service Item,Araç Servis Kalemi, +Vehicle Log,Araç Günlüğü, +Expense Date,Masraf Tarihi, +Taxes & Charges,Vergiler ve Harçlar, +Expense Taxes and Charges,Masraf Vergileri ve Harçları, +Sanctioned Amount,Onaylanan Tutar, +Expenses & Advances,Masraflar ve Avanslar, +Unclaimed Amount,Talep Edilmeyen Tutar, +Employee Settings,Çalışan Ayarları, +Employee Naming By,Çalışan İsimlendirmesi, +Adlandırma Serisi,Adlandırma Serisi, +Employee records are created using the selected option,Seçilen seçenek kullanılarak çalışan kayıtları oluşturulur, +Standard Working Hours,Standart Çalışma Saatleri, +Retirement Age (In Years),Emeklilik Yaşı (Yıl Olarak), +Reminders,Hatırlatıcılar, +Work Anniversaries,Çalışma Yıldönümleri, +Work Anniversaries ,Çalışma Yıl Dönümleri, +Birthdays,Doğum Günleri, +Set the frequency for holiday reminders,Tatil hatırlatıcılarının sıklığını ayarlayın, +Leave and Expense Claim Settings,İzin ve Masraf Talebi Ayarları, +Send Leave Notification,İzin Bildirimi Gönder, +Leave Approval Notification Template,İzin Onay Bildirim Şablonu, +Leave Status Notification Template,İzin Durumu Bildirimi Şablonu, +Leave Approver Mandatory In Leave Application,İzin Başvurusunda İzin Onaylayıcı Zorunlu, +Restrict Backdated Leave Application,Geçmiş Tarihli İzin Başvurusunu Kısıtla, +Expense Approver Mandatory In Expense Claim,Masraf Talebinde Masraf Onaylayıcı Zorunlu, +Show Leaves Of All Department Members In Calendar,Tüm Departman Üyelerinin İzinlerini Takvimde Göster, +Auto Leave Encashment,Otomatik İzin Nakit Ödemesi, +Leave Allocation,İzin Tahsisi, +Leave Policy Assignment,Politika Ataması, +Leave Control Panel,İzin Kontrol Paneli, +Leave Encashment,İzin Nakde Dönüştürme, +Leave Type,İzin Türü, +Leave Period,İzin Dönemi, +Leave Policy,İzin Politikası, +Leave Type Name,İzin Türü Adı, +Maximum Leave Allocation Allowed,İzin Verilen Maksimum İzin Tahsisi, +Applicable After (Working Days),Şu Süreden Sonra Geçerlidir (İş Günleri), +Maximum Consecutive Leaves Allowed,İzin Verilen Maksimum Ardışık İzinler, +Attendance for the following dates will be skipped/overwritten on submission, +Attendance Warnings,Katılım Uyarıları, +Action on Submission,Teslim Edildiğinde Yapılacak İşlem, +Existing Record,Mevcut Kayıt, +Is Carry Forward,Devredillir mi, +Is Leave Without Pay,Ücretsiz İzin mi, +Is Partially Paid Leave,Kısmi Ücretli İzin mi, +Is Optional Leave,İsteğe Bağlı İzin mi, +Consolidate Leave Types,İzin Türlerini Birleştirin, +Aggregate a group of Items into another Item. This is useful if you are maintaining the stock of the packed items and not the bundled item,Bir grup Öğeyi başka bir Öğede birleştirin. Bu, paketlenmiş öğelerin değil, paketlenmiş öğelerin stokunu tutuyorsanız kullanışlıdır., +"These leaves are holidays permitted by the company however, availing it is optional for an Employee.",Bu izinler şirket tarafından izin verilen tatillerdir ancak bu izinlerden yararlanmak Çalışan için isteğe bağlıdır., +Allow Negative Balance,Eksi Bakiyeye İzin Ver, +Allow Over Allocation,Fazla Tahsise İzin Ver, +Allows allocating more leaves than the number of days in the allocation period.,Tahsis dönemindeki gün sayısından daha fazla izin tahsis edilmesine olanak sağlar., +Fraction of Daily Salary per Leave,İzin Başına Günlük Maaş Kesri, +"For a day of leave taken, if you still pay (say) 50% of the daily salary, then enter 0.50 in this field.","Bir günlük izin için hala günlük maaşın %50'sini ödüyorsanız (diyelim) bu alana 0,50 girin.", +Include holidays within leaves as leaves,Tatilleri izin içine izin olarak dahil et, +Please set a default Holiday List for Company {0},Lütfen {1} Şirketİ için varsayılan bir Tatil Listesi ayarlayın, +Auto Create Subcontracting Order,Otomatik Taşeron Siparişi Oluştur, +Auto Create Purchase Receipt,Otomatik Satınalma İrsaliyesi Oluştur, +Subcontracting Order (Draft) will be auto-created on submission of Purchase Order.,Taşeron Siparişi (Taslak) Satınalma Siparişinin gönderilmesi üzerine otomatik olarak oluşturulacaktır., +Purchase Receipt (Draft) will be auto-created on submission of Subcontracting Receipt.,Satınalma İrsaliyesi (Taslak) Fason Sözleşme Fişinin teslim edilmesi üzerine otomatik olarak oluşturulacaktır., +Blanket Order Allowance (%),Blanket Sipariş Ödeneği (%), +Update frequency of Project,Projenin güncelleme sıklığı, +Use Transaction Date Exchange Rate,İşlem Tarihi Döviz Kurunu Kullanın, +"While making Purchase Invoice from Purchase Order, use Exchange Rate on Invoice's transaction date rather than inheriting it from Purchase Order. Only applies for Purchase Invoice.","Satınalma Siparişinden Satınalma Faturası oluştururken, Satın Alma Siparişinden devralmak yerine, Faturanın işlem tarihindeki Döviz Kurunu kullanın. Yalnızca Satınalma Faturası için geçerlidir.", +How often should Project be updated of Total Purchase Cost ?,Projenin Toplam Satınalma Maliyeti ne sıklıkta güncellenmeli? +Delete Accounting and Stock Ledger Entries on deletion of Transaction,İşlem silinirken Muhasebe ve Stok Kayıtlarını da Sil, +Invoicing Features,Faturalama Özellikleri, +Enabling ensure each Purchase Invoice has a unique value in Supplier Invoice No. field,Tedarikçi Fatura No alanında her Satınalma Faturasının benzersiz bir değere sahip olmasını sağla, +Invoice Cancellation,Fatura İptali, +Learn about {0},Ortak Taraf hakkında bilgi edinin, +Automatically Fetch Payment Terms from Order,Ödeme Vadesini Siparişten Otomatik Getir, +Payment Terms from orders will be fetched into the invoices as is,Siparişlerdeki Ödeme Vadesi olduğu gibi faturalara yansıtılacaktır, +Enable Common Party Accounting,Ortak Cari Muhasebesini Etkinleştir, +Allow multi-currency invoices against single party account ,Tek Cari hesabına karşı çoklu para birimindeki faturalara izin ver, +Enabling this will allow creation of multi-currency invoices against single party account in company currency,Bunun etkinleştirilmesi Tek Taraf hesabına karşı şirket para biriminde çok para biriminde faturaların oluşturulmasına olanak tanır, +Show Taxes as Table in Print,Vergileri Basılı Tablo Olarak Göster, +Payment Reconciliations,Ödeme Mutabakatları, +Auto Reconcile Payments,Otomatik Ödeme Mutabakatı, +Book Tax Loss on Early Payment Discount,Erken Ödeme İndirimi ile Vergi Kaybını Kaydet, +Split Early Payment Discount Loss into Income and Tax Loss,Erken Ödeme İndirimi Zararını Gelir ve Vergi Zararına Böl, +Round Tax Amount Row-wise,Yuvarlak Vergi Tutarı Satır Bazında, +Tax Amount will be rounded on a row(items) level,Vergi Tutarı satır (öğeler) düzeyinde yuvarlanacaktır, +Invoice and Billing,Fatura ve Faturalandırma, +Credit Limit Settings,Kredi Limiti Ayarları, +Role Allowed to Over Bill ,Fazla Faturalandırmaya İzin Verilen Rol, +Users with this role are allowed to over bill above the allowance percentage,Bu role sahip kullanıcıların tahsisat yüzdesinin üzerinde fazla faturalandırma yapmasına izin verilir. +Role allowed to bypass Credit Limit,Kredi Limitini Aşmasına İzin verilen Rol, +POS Setting,POS Ayarları, +Create Ledger Entries for Change Amount,Değişiklik Tutarı için Defter Girişlerini Oluştur, +"If enabled, ledger entries will be posted for change amount in POS transactions",Etkinleştirilirse POS işlemlerinde değişiklik tutarı için genel muhasebe girişleri yayınlanır, +Tax Settings,Vergi Ayarları, +Asset Settings,Varlık Ayarları, +Accounts Closing,Hesap Kapanışı, +Period Closing Settings,Dönem Kapanış Ayarları, +Ignore Account Closing Balance,Hesap Kapanış Bakiyesini Yoksay, +Financial reports will be generated using GL Entry doctypes (should be enabled if Period Closing Voucher is not posted for all years sequentially or missing) ,Mali raporlar GL Giriş belge türleri kullanılarak oluşturulacaktır (Dönem Kapanış Fişinin tüm yıllar boyunca sırayla kaydedilmemesi veya eksik olması durumunda etkinleştirilmelidir), +Show Balances in Chart Of Accounts,Bakiyeleri Hesap Planında Göster, +Enable Automatic Party Matching,Otomatik Cari Eşleştirmeyi Etkinleştir, +Auto match and set the Party in Bank Transactions,Otomatik Cari Eşleştirmeyi Etkinleştir, +Remarks Column Length,Açıklamalar Sütun Uzunluğu, +Truncates 'Remarks' column to set character length,Karakter uzunluğunu ayarlamak için 'Açıklamalar' sütununu kısaltır, +Accounts Receivable/Payable,Alacak/Borç Hesapları, +Journals,Yevmiyeler, +Stock Movement,Stok Hareketi, +Merge Similar Account Heads,Benzer Hesap Başlıklarını Birleştir, +Rows with Same Account heads will be merged on Ledger,Aynı Hesap başlıklarına sahip satırlar Defterde birleştirilecek, +Carry Forward,Devretme, +Maximum Carry Forwarded Leaves,Maksimum Devredilen İzin, +Expire Carry Forwarded Leaves (Days),Devredilen İzinlerin Geçerlilik Süresi (Gün), +Calculated in days,Gün cinsinden hesaplanır, +Is Compensatory,Telafi Edici, +Encashment,Nakit paraya çevirme, +Allow Encashment,Nakde Dönüştürmeye İzin Ver, +Earned Leave,Kazanılmış İzin, +Is Earned Leave,Kazanılmış İzin mi, +Shift Settings,Vardiya Ayarları, +Allow Multiple Shift Assignments for Same Date,Aynı Tarih için Çoklu Vardiya Atamasına İzin Ver, +Hiring Settings,İşe Alım Ayarları, +Check Vacancies On Job Offer Creation,İş Teklifi Oluşturma Sırasında Açık Pozisyonları Kontrol Edin, +Send Interview Reminder,Mülakat Hatırlatıcısı Gönder, +Send Interview Feedback Reminder,Mülakat Geribildirim Hatırlatıcısı Gönder, +Employee Exit Settings,Personel Çıkış Ayarları, +Exit Questionnaire Web Form,Çıkış Anketi Web Formu, +Exit Questionnaire Notification Template,Çıkış Anketi Bildirim Şablonu, +Salary Component,Maaş Bileşeni, +Income Tax Slab,Gelir Vergisi Levhası, +Payroll Period,Bordro Dönemi, +Salary Structure Assignment,Maaş Yapısı Ataması, +Payroll Reports,Bordro Raporları, +Bank Remittance,Banka Havalesi, +Salary Payments Based On Payment Mode,Ödeme Şekline Göre Maaş Ödemeleri, +Salary Payments via ECS,ECS Üzerinden Maaş Ödemeleri, +Income Tax Computation,Gelir Vergisi Hesaplama, +Deduction Reports,Kesinti Raporları, +Income Tax Deductions,Gelir Vergisi Kesintileri, +Accounting Reports,Muhasebe Raporları, +Employee Incentive,Personel Teşviki, +Retention Bonus,Elde Tutma Bonusu, +Transactions & Reports,İşlemler & Raporlar, +Salary Payout,Maaş Ödemesi, +Tax & Benefits,Vergi ve Avantajlar, +Benefits,Faydalar, +Employee Benefit Application,Personellere Sağlanan Fayda Uygulaması, +Employee Benefit Claim,Personellere Sağlanan Fayda Talebi, +Exemption,Muafiyet, +Employee Tax Exemption Declaration,Personel Vergi Muafiyeti Beyannamesi +Employee Tax Exemption Proof Submission,Personel Vergi Muafiyeti Belgesinin İbrazı, +Tax Setup,Vergi Kurulumu, +Employee Tax Exemption Sub Category,Personel Vergi Muafiyeti Alt Kategorisi, +Onboarding,İşe Alım, +Employee Onboarding Template,Personel İşe Alım Şablonu, +Employee Onboarding,Personel İşe Alımı, +Employee Skill Map,Personel Beceri Haritası, +Journey,Yolculuk, +Employee Promotion,Personel Promosyonu, +Employee Transfer,Personel Transferi, +Grievance,Şikayet, +Grievance Type,Şikayet Türü, +Employee Grievance,Personel Şikayeti, +Training,Eğitim, +Training Type,Eğitim Türü, +Training Program,Eğitim Programı, +Training Event,Eğitim Etkinliği, +Training Feedback,Eğitim Geri Bildirimi, +Training Result,Eğitim Sonucu, +Employee Separation Template,Personel İşten Ayrılma Şablonu, +Employee Separation,Personel İşten Ayrılma, +Full and Final Settlement,Tam ve Nihai Mutabakat, +Exit Interview,İşten Ayrılma Mülakatı, +Separation Activities,İşten Ayrılma Faaliyetleri, +Separation Begins On,İşten Ayrılma Başlama Tarihi, +Activity Name,Etkinlik Adı, +Questionnaire Email Sent,Anket E-postası Gönderildi, +Final Decision,Nihai Karar, +Employee Retained,Çalışan Tutuldu, +Exit Confirmed,Çıkış Onaylandı, +Reports To,Rapor Verilen Kişi, +Notify users by email,Kullanıcıları e-postayla bilgilendir, +Exit Interview Summary,Çıkış Mülakatı Özeti, +Get Job Requisitions,İş Taleplerini Getir, +Staffing Plan,İstihdam Planı, +Staffing Details,İstihdam Detayları, +Vacancies,Boş Pozisyonlar, +Estimated Cost Per Position,Pozisyon Başına Tahmini Maliyet, +Total Estimated Cost,Toplam Tahmini Maliyet, +Number Of Positions,Pozisyon Sayısı, +Total Estimated Budget,Toplam Tahmini Bütçe, +Jobs,İşler, +Job Requisition,İş Talebi, +Job Opening,İş Açılışı, +Job Offer,İş Teklifi, +Employee Referral,Çalışan Tavsiyesi, +Interviews,Mülakatlar, +Interview Type,Mülakat Türü, +Interview Round,Mülakat Turu, +Interview,Mülakat, +Interview Feedback,Mülakat Geri Bildirimi, +Appointment Letter Template,Randevu Mektubu Şablonu, +Appointment Letter,Randevu Mektubu, +Appraisal,Değerlendirme, +Appraisal Overview,Değerlendirmeye Genel Bakış, +Appraisal Cycle,Değerlendirme Döngüsü +Employee Performance Feedback,Çalışan Performans Geri Bildirimi, +Employee Feedback Criteria,Çalışan Geri Bildirim Kriterleri, +Promotion,Promosyon, +Summarized View,Özet Görünüm, +Trainings (This Week),Eğitimler (Bu Hafta), +Interviews (This Week),Mülakatlar (Bu Hafta) +Exits (This Month),Çıkışlar (Bu Ay), +New Hires (This Month),Yeni Alımlar (Bu Ay), +Onboardings (This Month),İşe Alımlar (Bu Ay), +Separations (This Month),Ayrılışlar (Bu Ay), +Promotions (This Month),Promosyonlar (Bu Ay), +Transfers (This Month),Transferler (Bu Ay), +Trainings (This Month),Eğitimler (Bu Ay), +Y-O-Y Transfers,Y-O-Y Transferler, +Y-O-Y Promotions,Y-O-Y Promosyonlar, +Trainer Name,Eğitmen Adı, +Trainer Email,Eğitmen E-postası, +Contact Number,İletişim numarası, +Event Name,Etkinlik adı, +Event Status,Etkinlik Durumu, +Has Certificate,Sertifikası Var, +Attendees,Katılımcılar, +Employees,Personeller, +Agent Name,Temsilci Adı, +Do not restrict tickets without a Team,Takım olmadan çağrı kısıtlaması yapma, +New Lead (Last 1 Month),Yeni Potansiyel Müşteri (Son 1 Ay), +New Opportuni̇ty (Last 1 Month),Yeni Fırsat (Son 1 Ay), +Won Opportuni̇ty (Last 1 Month),Kazanılan Fırsat (Son 1 Ay), +Open Opportuni̇ty,Açık Fırsat, +Incoming Leads,Gelen Potansiyel Müşteriler, +Opportunity Trends,Fırsat Trendleri, +Won Opportunities,Kazanılan Fırsatlar, +Territory Wise Opportunity Count,Bölge Bilge Fırsat Sayısı, +Opportunities via Campaigns,Kampanyadan Gelen Fırsatlar, +Opportunity List,Fırsat Listesi, +Parent Document Type,Ana Belge Türü, +Nothing left to redo,Yeniden yapılacak hiçbir şey kalmadı, +TRY,TL, +June,Haziran, +July,Temmuz, +Jan,Ocak, +Feb,Şubat, +Mar,Mart, +Apr,Nisan, +May,Mayıs, +Jun,Haziran, +Jul,Temmuz, +Aug,Ağustos, +Sep,Eylül, +Oct,Ekim, +Nov,Kasım, +Dec,Aralık, +Advance,Peşinat, +Advanced,Gelişmiş, +Reference No,Referans No, From 008894d32b2038f7bd3ddd0804935e19abf2df16 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Tue, 26 Mar 2024 11:38:09 +0530 Subject: [PATCH 86/90] fix: item not coming in quick entry (cherry picked from commit dcbb54c41f28e3f7b200ffd82ff8486df78f9e63) --- erpnext/stock/doctype/stock_entry/stock_entry.js | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.js b/erpnext/stock/doctype/stock_entry/stock_entry.js index 96a92096437..8348804ae57 100644 --- a/erpnext/stock/doctype/stock_entry/stock_entry.js +++ b/erpnext/stock/doctype/stock_entry/stock_entry.js @@ -408,12 +408,26 @@ frappe.ui.form.on("Stock Entry", { erpnext.accounts.dimensions.update_dimension(frm, frm.doctype); } + frm.events.set_route_options_for_new_doc(frm); + }, + + set_route_options_for_new_doc(frm) { + let batch_no_field = frm.get_docfield("items", "batch_no"); + if (batch_no_field) { + batch_no_field.get_route_options_for_new_doc = function (row) { + return { + item: row.doc.item_code, + }; + }; + } + let sbb_field = frm.get_docfield("items", "serial_and_batch_bundle"); if (sbb_field) { sbb_field.get_route_options_for_new_doc = (row) => { return { item_code: row.doc.item_code, voucher_type: frm.doc.doctype, + warehouse: row.doc.s_warehouse || row.doc.t_warehouse, }; }; } From 79d047802a8a532b9d24b3d1e99f2a45ef205717 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Tue, 26 Mar 2024 14:30:50 +0530 Subject: [PATCH 87/90] fix: existing batch from different warehouse not showing in the dropdown (cherry picked from commit 662cf21afb90014ed291ee147256bb10f5b3fa31) --- erpnext/controllers/queries.py | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/erpnext/controllers/queries.py b/erpnext/controllers/queries.py index a7b2d572733..03be518ab91 100644 --- a/erpnext/controllers/queries.py +++ b/erpnext/controllers/queries.py @@ -364,16 +364,26 @@ def get_batch_no(doctype, txt, searchfield, start, page_len, filters): filtered_batches = get_filterd_batches(batches) if filters.get("is_inward"): - filtered_batches.extend(get_empty_batches(filters)) + filtered_batches.extend(get_empty_batches(filters, start, page_len, filtered_batches, txt)) return filtered_batches -def get_empty_batches(filters): +def get_empty_batches(filters, start, page_len, filtered_batches=None, txt=None): + query_filter = {"item": filters.get("item_code")} + if txt: + query_filter["name"] = ("like", "%{0}%".format(txt)) + + exclude_batches = [batch[0] for batch in filtered_batches] if filtered_batches else [] + if exclude_batches: + query_filter["name"] = ("not in", exclude_batches) + return frappe.get_all( "Batch", fields=["name", "batch_qty"], - filters={"item": filters.get("item_code"), "batch_qty": 0.0}, + filters=query_filter, + limit_start=start, + limit_page_length=page_len, as_list=1, ) From 68d57c39476ad29bc75aec697b381e56c9d73296 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Tue, 26 Mar 2024 18:16:37 +0530 Subject: [PATCH 88/90] fix: incorrect total qty in job card (cherry picked from commit c3546cf8e20279b23e6bb3fe78cffc01922f9205) --- erpnext/manufacturing/doctype/job_card/job_card.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/manufacturing/doctype/job_card/job_card.py b/erpnext/manufacturing/doctype/job_card/job_card.py index 6144aad7bdd..f8f18f27d5b 100644 --- a/erpnext/manufacturing/doctype/job_card/job_card.py +++ b/erpnext/manufacturing/doctype/job_card/job_card.py @@ -490,7 +490,7 @@ class JobCard(Document): { "to_time": get_datetime(args.get("complete_time")), "operation": args.get("sub_operation"), - "completed_qty": args.get("completed_qty") or 0.0, + "completed_qty": (args.get("completed_qty") if last_row.idx == row.idx else 0.0), } ) elif args.get("start_time"): From 23ae82d28262363894d75e8e3f61618ca5b4bee6 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Tue, 26 Mar 2024 18:19:27 +0530 Subject: [PATCH 89/90] fix: validation error for the subcontracting receipt (cherry picked from commit 016585c2480b14b69656cfdfe807906e47d20ee7) --- erpnext/stock/serial_batch_bundle.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/erpnext/stock/serial_batch_bundle.py b/erpnext/stock/serial_batch_bundle.py index 7b42103bdeb..9625b20da41 100644 --- a/erpnext/stock/serial_batch_bundle.py +++ b/erpnext/stock/serial_batch_bundle.py @@ -888,11 +888,11 @@ class SerialBatchCreation: return doc def validate_qty(self, doc): - if doc.type_of_transaction == "Outward": + if doc.type_of_transaction == "Outward" and self.actual_qty and doc.total_qty: precision = doc.precision("total_qty") - total_qty = abs(flt(doc.total_qty, precision)) - required_qty = abs(flt(self.actual_qty, precision)) + total_qty = flt(abs(doc.total_qty), precision) + required_qty = flt(abs(self.actual_qty), precision) if required_qty - total_qty > 0: msg = f"For the item {bold(doc.item_code)}, the Avaliable qty {bold(total_qty)} is less than the Required Qty {bold(required_qty)} in the warehouse {bold(doc.warehouse)}. Please add sufficient qty in the warehouse." From afa930ff48fe8672d27d1c0aa2e1d40cb57fd8a6 Mon Sep 17 00:00:00 2001 From: Raffael Meyer <14891507+barredterra@users.noreply.github.com> Date: Wed, 27 Mar 2024 00:21:16 +0100 Subject: [PATCH 90/90] fix: remove faulty translation (#40667) --- erpnext/translations/tr.csv | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/erpnext/translations/tr.csv b/erpnext/translations/tr.csv index 0f10aa59cf1..e030efd6e86 100644 --- a/erpnext/translations/tr.csv +++ b/erpnext/translations/tr.csv @@ -7838,8 +7838,6 @@ Set the Item Code which will be used for billing the Clinical Procedure.,Klinik Select an Item Group for the Clinical Procedure Item.,Klinik göz Öğesi için bir Öğe Grubu seçin., Clinical Procedure Rate,Klinik çevre Oranı, Check this if the Clinical Procedure is billable and also set the rate.,Klinik bölümlerin faturalandırılabilir olup olmadığı kontrol edin ve maliyet de ayarı., -Check this if the Clinical Procedure utilises consumables. Click ,Klinik çevre sarf malzemelerini kullanansa bunu kontrol edin, Daha fazlasını öğrenmek için tıklayın, - to know more,daha fazlasını bilmek, "You can also set the Medical Department for the template. After saving the document, an Item will automatically be created for billing this Clinical Procedure. You can then use this template while creating Clinical Procedures for Patients. Templates save you from filling up redundant data every single time. You can also create templates for other operations like Lab Tests, Therapy Sessions, etc.","Ayrıca şablon için Tıp Departmanını da ayarlayabilirsiniz. Belgeyi kaydettikten sonra, bu Klinik davanın faturalandırılması için otomatik olarak bir Öğe oluşturulacaktır. Daha sonra Hastalar için Klinik gözlemler oluştururken bu şablonu kullanabilirsiniz. Şablonlar sizi her fırsatta gereksiz verileri doldurmaktan kurtarır. Ayrıca Laboratuar Testleri, Terapi Oturumları vb. Gibi diğer yapılar için şablonlar oluşturabilirsiniz.", Descriptive Test Result,Tanımlayıcı Test Sonucu, Allow Blank,Boşluğa İzin Ver, @@ -9093,7 +9091,6 @@ Create an Item,Bir Öğe Oluşturun, Create a new Item ,Bir Öğe Oluşturun, Create a Customer,Müşteri Oluşturun, Create Your First Sales Invoice ,İlk Satış Faturanızı Oluşturun, -"Item is a product or a service offered by your company, or something you buy as a part of your supplies or raw materials.","Ürün, şirketiniz tarafından sunulan bir ürün veya hizmettir ya da malzeme veya hammaddelerinizin bir parçası olarak satın aldığınız bir şeydir.\n Items are integral to everything you do in ERPNext - from billing, purchasing to managing inventory. Everything you buy or sell, whether it is a physical product or a service is an Item. Items can be stock, non-stock, variants, serialized, batched, assets, etc.","Öğeler, faturalandırma, satın alma ve envanter yönetimine kadar ERPNext'te yaptığınız her şeyin ayrılmaz bir parçasıdır. İster fiziksel bir ürün ister hizmet olsun, satın aldığınız veya sattığınız her şey bir Öğedir. Öğeler stok, stok dışı, varyantlar, serileştirilmiş olabilir, toplu, varlıklar vb.", Check Stock Ledger,Stok Defterini Kontrol Edin, Learn Project Management,Proje Yönetimini Öğren, Users List,Kullanıcı Listesi, @@ -9186,7 +9183,7 @@ Prefer knowledge base,Bilgi tabanını tercih et, Skip e-mail workflow,E-posta iş akışını atla, "This field is used to skip email-related workflows for tickets. If this field is checked, no emails will be sent related to tickets, such as new ticket creation, status updates, or notifications.","Bu alan, Çağrılar için e-posta ile ilgili iş akışlarını atlamak için kullanılır. Bu alan işaretlenirse, yeni çağrı oluşturma, durum güncellemeleri veya bildirimler gibi destek bildirimleriyle ilgili hiçbir e-posta gönderilmez.", Instantly send e-mail,Anında e-posta gönder, -"This field is used to send an email instantly without adding it into the queue. If this field is checked, the email will be sent immediately after clicking the "Send" button, instead of being added to the email queue for later processing.","Bu alan, bir e-postayı kuyruğa eklemeden anında göndermek için kullanılır. Bu alan işaretlenirse, e-posta daha sonra işlenmek üzere e-posta kuyruğuna eklenmek yerine "Gönder" düğmesine tıklandıktan hemen sonra gönderilir.", +"This field is used to send an email instantly without adding it into the queue. If this field is checked, the email will be sent immediately after clicking the ""Send"" button, instead of being added to the email queue for later processing.","Bu alan, bir e-postayı kuyruğa eklemeden anında göndermek için kullanılır. Bu alan işaretlenirse, e-posta daha sonra işlenmek üzere e-posta kuyruğuna eklenmek yerine ""Gönder"" düğmesine tıklandıktan hemen sonra gönderilir.", Toasts,Bildirim, Suppress default email toast,Varsayılan e-posta bildirimini durdur, Is setup complete,Kurulum tamamlandı mı, @@ -9418,7 +9415,7 @@ Is Leave Without Pay,Ücretsiz İzin mi, Is Partially Paid Leave,Kısmi Ücretli İzin mi, Is Optional Leave,İsteğe Bağlı İzin mi, Consolidate Leave Types,İzin Türlerini Birleştirin, -Aggregate a group of Items into another Item. This is useful if you are maintaining the stock of the packed items and not the bundled item,Bir grup Öğeyi başka bir Öğede birleştirin. Bu, paketlenmiş öğelerin değil, paketlenmiş öğelerin stokunu tutuyorsanız kullanışlıdır., +Aggregate a group of Items into another Item. This is useful if you are maintaining the stock of the packed items and not the bundled item,"Bir grup Öğeyi başka bir Öğede birleştirin. Bu, paketlenmiş öğelerin değil, paketlenmiş öğelerin stokunu tutuyorsanız kullanışlıdır.", "These leaves are holidays permitted by the company however, availing it is optional for an Employee.",Bu izinler şirket tarafından izin verilen tatillerdir ancak bu izinlerden yararlanmak Çalışan için isteğe bağlıdır., Allow Negative Balance,Eksi Bakiyeye İzin Ver, Allow Over Allocation,Fazla Tahsise İzin Ver,