Merge branch 'develop' of https://github.com/frappe/erpnext into lead_details_qb

This commit is contained in:
Deepesh Garg 2023-10-09 19:23:16 +05:30
commit 6d43f90dc2
143 changed files with 1551 additions and 1388 deletions

View File

@ -35,13 +35,13 @@ class TestBankClearance(unittest.TestCase):
from lending.loan_management.doctype.loan.test_loan import (
create_loan,
create_loan_accounts,
create_loan_type,
create_loan_product,
create_repayment_entry,
make_loan_disbursement_entry,
)
def create_loan_masters():
create_loan_type(
create_loan_product(
"Clearance Loan",
2000000,
13.5,

View File

@ -352,10 +352,11 @@ frappe.ui.form.on("Bank Statement Import", {
export_errored_rows(frm) {
open_url_post(
"/api/method/frappe.core.doctype.data_import.data_import.download_errored_template",
"/api/method/erpnext.accounts.doctype.bank_statement_import.bank_statement_import.download_errored_template",
{
data_import_name: frm.doc.name,
}
},
true
);
},

View File

@ -410,7 +410,7 @@ def add_vouchers():
def create_loan_and_repayment():
from lending.loan_management.doctype.loan.test_loan import (
create_loan,
create_loan_type,
create_loan_product,
create_repayment_entry,
make_loan_disbursement_entry,
)
@ -420,7 +420,7 @@ def create_loan_and_repayment():
from erpnext.setup.doctype.employee.test_employee import make_employee
create_loan_type(
create_loan_product(
"Personal Loan",
500000,
8.4,
@ -441,7 +441,7 @@ def create_loan_and_repayment():
"applicant_type": "Employee",
"company": "_Test Company",
"applicant": applicant,
"loan_type": "Personal Loan",
"loan_product": "Personal Loan",
"loan_amount": 5000,
"repayment_method": "Repay Fixed Amount per Period",
"monthly_repayment_amount": 500,

View File

@ -9,6 +9,7 @@
"disabled",
"service_provider",
"api_endpoint",
"access_key",
"url",
"column_break_3",
"help",
@ -84,12 +85,18 @@
"fieldname": "disabled",
"fieldtype": "Check",
"label": "Disabled"
},
{
"depends_on": "eval:doc.service_provider == 'exchangerate.host';",
"fieldname": "access_key",
"fieldtype": "Data",
"label": "Access Key"
}
],
"index_web_pages_for_search": 1,
"issingle": 1,
"links": [],
"modified": "2023-01-09 12:19:03.955906",
"modified": "2023-10-04 15:30:25.333860",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Currency Exchange Settings",

View File

@ -18,11 +18,21 @@ class CurrencyExchangeSettings(Document):
def set_parameters_and_result(self):
if self.service_provider == "exchangerate.host":
if not self.access_key:
frappe.throw(
_("Access Key is required for Service Provider: {0}").format(
frappe.bold(self.service_provider)
)
)
self.set("result_key", [])
self.set("req_params", [])
self.api_endpoint = "https://api.exchangerate.host/convert"
self.append("result_key", {"key": "result"})
self.append("req_params", {"key": "access_key", "value": self.access_key})
self.append("req_params", {"key": "amount", "value": "1"})
self.append("req_params", {"key": "date", "value": "{transaction_date}"})
self.append("req_params", {"key": "from", "value": "{from_currency}"})
self.append("req_params", {"key": "to", "value": "{to_currency}"})

View File

@ -53,7 +53,15 @@ frappe.ui.form.on("Journal Entry", {
erpnext.accounts.unreconcile_payments.add_unreconcile_btn(frm);
},
before_save: function(frm) {
if ((frm.doc.docstatus == 0) && (!frm.doc.is_system_generated)) {
let payment_entry_references = frm.doc.accounts.filter(elem => (elem.reference_type == "Payment Entry"));
if (payment_entry_references.length > 0) {
let rows = payment_entry_references.map(x => "#"+x.idx);
frappe.throw(__("Rows: {0} have 'Payment Entry' as reference_type. This should not be set manually.", [frappe.utils.comma_and(rows)]));
}
}
},
make_inter_company_journal_entry: function(frm) {
var d = new frappe.ui.Dialog({
title: __("Select Company"),

View File

@ -268,8 +268,7 @@
"fieldname": "email_to",
"fieldtype": "Data",
"in_global_search": 1,
"label": "To",
"options": "Email"
"label": "To"
},
{
"depends_on": "eval: doc.payment_channel != \"Phone\"",
@ -340,8 +339,8 @@
},
{
"fieldname": "payment_url",
"hidden": 1,
"fieldtype": "Data",
"hidden": 1,
"length": 500,
"options": "URL",
"read_only": 1
@ -396,7 +395,7 @@
"index_web_pages_for_search": 1,
"is_submittable": 1,
"links": [],
"modified": "2023-09-16 14:15:02.510890",
"modified": "2023-09-27 09:51:42.277638",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Payment Request",

View File

@ -8,6 +8,7 @@
"transaction_date",
"posting_date",
"fiscal_year",
"year_start_date",
"amended_from",
"company",
"column_break1",
@ -100,16 +101,22 @@
"fieldtype": "Text",
"label": "Error Message",
"read_only": 1
},
{
"fieldname": "year_start_date",
"fieldtype": "Date",
"label": "Year Start Date"
}
],
"icon": "fa fa-file-text",
"idx": 1,
"is_submittable": 1,
"links": [],
"modified": "2022-07-20 14:51:04.714154",
"modified": "2023-09-11 20:19:11.810533",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Period Closing Voucher",
"naming_rule": "Expression (old style)",
"owner": "Administrator",
"permissions": [
{
@ -144,5 +151,6 @@
"search_fields": "posting_date, fiscal_year",
"sort_field": "modified",
"sort_order": "DESC",
"states": [],
"title_field": "closing_account_head"
}

View File

@ -95,15 +95,23 @@ class PeriodClosingVoucher(AccountsController):
self.check_if_previous_year_closed()
pce = frappe.db.sql(
"""select name from `tabPeriod Closing Voucher`
where posting_date > %s and fiscal_year = %s and docstatus = 1 and company = %s""",
(self.posting_date, self.fiscal_year, self.company),
pcv = frappe.qb.DocType("Period Closing Voucher")
existing_entry = (
frappe.qb.from_(pcv)
.select(pcv.name)
.where(
(pcv.posting_date >= self.posting_date)
& (pcv.fiscal_year == self.fiscal_year)
& (pcv.docstatus == 1)
& (pcv.company == self.company)
)
.run()
)
if pce and pce[0][0]:
if existing_entry and existing_entry[0][0]:
frappe.throw(
_("Another Period Closing Entry {0} has been made after {1}").format(
pce[0][0], self.posting_date
existing_entry[0][0], self.posting_date
)
)
@ -130,18 +138,27 @@ class PeriodClosingVoucher(AccountsController):
frappe.enqueue(
process_gl_entries,
gl_entries=gl_entries,
voucher_name=self.name,
timeout=3000,
)
frappe.enqueue(
process_closing_entries,
gl_entries=gl_entries,
closing_entries=closing_entries,
voucher_name=self.name,
company=self.company,
closing_date=self.posting_date,
queue="long",
timeout=3000,
)
frappe.msgprint(
_("The GL Entries will be processed in the background, it can take a few minutes."),
alert=True,
)
else:
process_gl_entries(gl_entries, closing_entries, self.name, self.company, self.posting_date)
process_gl_entries(gl_entries, self.name)
process_closing_entries(gl_entries, closing_entries, self.name, self.company, self.posting_date)
def get_grouped_gl_entries(self, get_opening_entries=False):
closing_entries = []
@ -322,17 +339,12 @@ class PeriodClosingVoucher(AccountsController):
return query.run(as_dict=1)
def process_gl_entries(gl_entries, closing_entries, voucher_name, company, closing_date):
from erpnext.accounts.doctype.account_closing_balance.account_closing_balance import (
make_closing_entries,
)
def process_gl_entries(gl_entries, voucher_name):
from erpnext.accounts.general_ledger import make_gl_entries
try:
if gl_entries:
make_gl_entries(gl_entries, merge_entries=False)
make_closing_entries(gl_entries + closing_entries, voucher_name, company, closing_date)
frappe.db.set_value("Period Closing Voucher", voucher_name, "gle_processing_status", "Completed")
except Exception as e:
frappe.db.rollback()
@ -340,6 +352,19 @@ def process_gl_entries(gl_entries, closing_entries, voucher_name, company, closi
frappe.db.set_value("Period Closing Voucher", voucher_name, "gle_processing_status", "Failed")
def process_closing_entries(gl_entries, closing_entries, voucher_name, company, closing_date):
from erpnext.accounts.doctype.account_closing_balance.account_closing_balance import (
make_closing_entries,
)
try:
if gl_entries + closing_entries:
make_closing_entries(gl_entries + closing_entries, voucher_name, company, closing_date)
except Exception as e:
frappe.db.rollback()
frappe.log_error(e)
def make_reverse_gl_entries(voucher_type, voucher_no):
from erpnext.accounts.general_ledger import make_reverse_gl_entries

View File

@ -10,7 +10,7 @@ from frappe.utils import today
from erpnext.accounts.doctype.finance_book.test_finance_book import create_finance_book
from erpnext.accounts.doctype.journal_entry.test_journal_entry import make_journal_entry
from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice
from erpnext.accounts.utils import get_fiscal_year, now
from erpnext.accounts.utils import get_fiscal_year
class TestPeriodClosingVoucher(unittest.TestCase):

View File

@ -48,6 +48,20 @@ class ProcessStatementOfAccounts(Document):
def get_report_pdf(doc, consolidated=True):
statement_dict = get_statement_dict(doc)
if not bool(statement_dict):
return False
elif consolidated:
delimiter = '<div style="page-break-before: always;"></div>' if doc.include_break else ""
result = delimiter.join(list(statement_dict.values()))
return get_pdf(result, {"orientation": doc.orientation})
else:
for customer, statement_html in statement_dict.items():
statement_dict[customer] = get_pdf(statement_html, {"orientation": doc.orientation})
return statement_dict
def get_statement_dict(doc, get_statement_dict=False):
statement_dict = {}
ageing = ""
@ -78,18 +92,11 @@ def get_report_pdf(doc, consolidated=True):
if not res:
continue
statement_dict[entry.customer] = get_html(doc, filters, entry, col, res, ageing)
statement_dict[entry.customer] = (
[res, ageing] if get_statement_dict else get_html(doc, filters, entry, col, res, ageing)
)
if not bool(statement_dict):
return False
elif consolidated:
delimiter = '<div style="page-break-before: always;"></div>' if doc.include_break else ""
result = delimiter.join(list(statement_dict.values()))
return get_pdf(result, {"orientation": doc.orientation})
else:
for customer, statement_html in statement_dict.items():
statement_dict[customer] = get_pdf(statement_html, {"orientation": doc.orientation})
return statement_dict
return statement_dict
def set_ageing(doc, entry):
@ -102,7 +109,8 @@ def set_ageing(doc, entry):
"range2": 60,
"range3": 90,
"range4": 120,
"customer": entry.customer,
"party_type": "Customer",
"party": [entry.customer],
}
)
col1, ageing = get_ageing(ageing_filters)
@ -145,7 +153,8 @@ def get_gl_filters(doc, entry, tax_id, presentation_currency):
def get_ar_filters(doc, entry):
return {
"report_date": doc.posting_date if doc.posting_date else None,
"customer": entry.customer,
"party_type": "Customer",
"party": [entry.customer],
"customer_name": entry.customer_name if entry.customer_name else None,
"payment_terms_template": doc.payment_terms_template if doc.payment_terms_template else None,
"sales_partner": doc.sales_partner if doc.sales_partner else None,

View File

@ -4,39 +4,107 @@
import unittest
import frappe
from frappe.tests.utils import FrappeTestCase
from frappe.utils import add_days, getdate, today
from erpnext.accounts.doctype.process_statement_of_accounts.process_statement_of_accounts import (
get_statement_dict,
send_emails,
)
from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice
from erpnext.accounts.test.accounts_mixin import AccountsTestMixin
class TestProcessStatementOfAccounts(unittest.TestCase):
class TestProcessStatementOfAccounts(AccountsTestMixin, FrappeTestCase):
def setUp(self):
self.create_company()
self.create_customer()
self.create_customer(customer_name="Other Customer")
self.clear_old_entries()
self.si = create_sales_invoice()
self.process_soa = create_process_soa()
create_sales_invoice(customer="Other Customer")
def test_process_soa_for_gl(self):
"""Tests the utils for Statement of Accounts(General Ledger)"""
process_soa = create_process_soa(
name="_Test Process SOA for GL",
customers=[{"customer": "_Test Customer"}, {"customer": "Other Customer"}],
)
statement_dict = get_statement_dict(process_soa, get_statement_dict=True)
# Checks if the statements are filtered based on the Customer
self.assertIn("Other Customer", statement_dict)
self.assertIn("_Test Customer", statement_dict)
# Checks if the correct number of receivable entries exist
# 3 rows for opening and closing and 1 row for SI
receivable_entries = statement_dict["_Test Customer"][0]
self.assertEqual(len(receivable_entries), 4)
# Checks the amount for the receivable entry
self.assertEqual(receivable_entries[1].voucher_no, self.si.name)
self.assertEqual(receivable_entries[1].balance, 100)
def test_process_soa_for_ar(self):
"""Tests the utils for Statement of Accounts(Accounts Receivable)"""
process_soa = create_process_soa(name="_Test Process SOA for AR", report="Accounts Receivable")
statement_dict = get_statement_dict(process_soa, get_statement_dict=True)
# Checks if the statements are filtered based on the Customer
self.assertNotIn("Other Customer", statement_dict)
self.assertIn("_Test Customer", statement_dict)
# Checks if the correct number of receivable entries exist
receivable_entries = statement_dict["_Test Customer"][0]
self.assertEqual(len(receivable_entries), 1)
# Checks the amount for the receivable entry
self.assertEqual(receivable_entries[0].voucher_no, self.si.name)
self.assertEqual(receivable_entries[0].total_due, 100)
# Checks the ageing summary for AR
ageing_summary = statement_dict["_Test Customer"][1][0]
expected_summary = frappe._dict(
range1=100,
range2=0,
range3=0,
range4=0,
range5=0,
)
self.check_ageing_summary(ageing_summary, expected_summary)
def test_auto_email_for_process_soa_ar(self):
send_emails(self.process_soa.name, from_scheduler=True)
self.process_soa.load_from_db()
self.assertEqual(self.process_soa.posting_date, getdate(add_days(today(), 7)))
process_soa = create_process_soa(
name="_Test Process SOA", enable_auto_email=1, report="Accounts Receivable"
)
send_emails(process_soa.name, from_scheduler=True)
process_soa.load_from_db()
self.assertEqual(process_soa.posting_date, getdate(add_days(today(), 7)))
def check_ageing_summary(self, ageing, expected_ageing):
for age_range in expected_ageing:
self.assertEqual(expected_ageing[age_range], ageing.get(age_range))
def tearDown(self):
frappe.delete_doc_if_exists("Process Statement Of Accounts", "Test Process SOA")
frappe.db.rollback()
def create_process_soa():
frappe.delete_doc_if_exists("Process Statement Of Accounts", "Test Process SOA")
def create_process_soa(**args):
args = frappe._dict(args)
frappe.delete_doc_if_exists("Process Statement Of Accounts", args.name)
process_soa = frappe.new_doc("Process Statement Of Accounts")
soa_dict = {
"name": "Test Process SOA",
"company": "_Test Company",
}
soa_dict = frappe._dict(
name=args.name,
company=args.company or "_Test Company",
customers=args.customers or [{"customer": "_Test Customer"}],
enable_auto_email=1 if args.enable_auto_email else 0,
frequency=args.frequency or "Weekly",
report=args.report or "General Ledger",
from_date=args.from_date or getdate(today()),
to_date=args.to_date or getdate(today()),
posting_date=args.posting_date or getdate(today()),
include_ageing=1,
)
process_soa.update(soa_dict)
process_soa.set("customers", [{"customer": "_Test Customer"}])
process_soa.enable_auto_email = 1
process_soa.frequency = "Weekly"
process_soa.report = "Accounts Receivable"
process_soa.save()
return process_soa

View File

@ -65,6 +65,25 @@ erpnext.accounts.PurchaseInvoice = class PurchaseInvoice extends erpnext.buying.
erpnext.accounts.ledger_preview.show_stock_ledger_preview(this.frm);
}
if (this.frm.doc.repost_required && this.frm.doc.docstatus===1) {
this.frm.set_intro(__("Accounting entries for this invoice need to be reposted. Please click on 'Repost' button to update."));
this.frm.add_custom_button(__('Repost Accounting Entries'),
() => {
this.frm.call({
doc: this.frm.doc,
method: 'repost_accounting_entries',
freeze: true,
freeze_message: __('Reposting...'),
callback: (r) => {
if (!r.exc) {
frappe.msgprint(__('Accounting Entries are reposted.'));
me.frm.refresh();
}
}
});
}).removeClass('btn-default').addClass('btn-warning');
}
if(!doc.is_return && doc.docstatus == 1 && doc.outstanding_amount != 0){
if(doc.on_hold) {
this.frm.add_custom_button(
@ -460,6 +479,12 @@ cur_frm.set_query("expense_account", "items", function(doc) {
}
});
cur_frm.set_query("wip_composite_asset", "items", function() {
return {
filters: {'is_composite_asset': 1, 'docstatus': 0 }
}
});
cur_frm.cscript.expense_account = function(doc, cdt, cdn){
var d = locals[cdt][cdn];
if(d.idx == 1 && d.expense_account){

View File

@ -166,6 +166,7 @@
"against_expense_account",
"column_break_63",
"unrealized_profit_loss_account",
"repost_required",
"subscription_section",
"subscription",
"auto_repeat",
@ -191,8 +192,7 @@
"inter_company_invoice_reference",
"is_old_subcontracting_flow",
"remarks",
"connections_tab",
"column_break_38"
"connections_tab"
],
"fields": [
{
@ -990,6 +990,7 @@
"print_hide": 1
},
{
"allow_on_submit": 1,
"fieldname": "cash_bank_account",
"fieldtype": "Link",
"label": "Cash/Bank Account",
@ -1053,6 +1054,7 @@
"fieldtype": "Column Break"
},
{
"allow_on_submit": 1,
"depends_on": "eval:flt(doc.write_off_amount)!=0",
"fieldname": "write_off_account",
"fieldtype": "Link",
@ -1217,6 +1219,7 @@
"read_only": 1
},
{
"allow_on_submit": 1,
"default": "No",
"fieldname": "is_opening",
"fieldtype": "Select",
@ -1349,6 +1352,7 @@
"options": "Project"
},
{
"allow_on_submit": 1,
"depends_on": "eval:doc.is_internal_supplier",
"description": "Unrealized Profit/Loss account for intra-company transfers",
"fieldname": "unrealized_profit_loss_account",
@ -1381,6 +1385,7 @@
"depends_on": "eval:doc.is_subcontracted",
"fieldname": "supplier_warehouse",
"fieldtype": "Link",
"ignore_user_permissions": 1,
"label": "Supplier Warehouse",
"no_copy": 1,
"options": "Warehouse",
@ -1504,10 +1509,6 @@
"fieldname": "column_break_6",
"fieldtype": "Column Break"
},
{
"fieldname": "column_break_38",
"fieldtype": "Column Break"
},
{
"fieldname": "column_break_50",
"fieldtype": "Column Break"
@ -1578,13 +1579,22 @@
"fieldname": "use_company_roundoff_cost_center",
"fieldtype": "Check",
"label": "Use Company Default Round Off Cost Center"
},
{
"default": "0",
"fieldname": "repost_required",
"fieldtype": "Check",
"hidden": 1,
"label": "Repost Required",
"options": "Account",
"read_only": 1
}
],
"icon": "fa fa-file-text",
"idx": 204,
"is_submittable": 1,
"links": [],
"modified": "2023-07-25 17:22:59.145031",
"modified": "2023-10-01 21:01:47.282533",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Purchase Invoice",

View File

@ -11,6 +11,9 @@ from frappe.utils import cint, cstr, flt, formatdate, get_link_to_form, getdate,
import erpnext
from erpnext.accounts.deferred_revenue import validate_service_stop_date
from erpnext.accounts.doctype.gl_entry.gl_entry import update_outstanding_amt
from erpnext.accounts.doctype.repost_accounting_ledger.repost_accounting_ledger import (
validate_docs_for_deferred_accounting,
)
from erpnext.accounts.doctype.sales_invoice.sales_invoice import (
check_if_return_invoice_linked_with_payment_entry,
get_total_in_party_account_currency,
@ -484,6 +487,11 @@ class PurchaseInvoice(BuyingController):
_("Stock cannot be updated against Purchase Receipt {0}").format(item.purchase_receipt)
)
def validate_for_repost(self):
self.validate_write_off_account()
self.validate_expense_account()
validate_docs_for_deferred_accounting([], [self.name])
def on_submit(self):
super(PurchaseInvoice, self).on_submit()
@ -522,6 +530,18 @@ class PurchaseInvoice(BuyingController):
self.process_common_party_accounting()
def on_update_after_submit(self):
if hasattr(self, "repost_required"):
fields_to_check = [
"cash_bank_account",
"write_off_account",
"unrealized_profit_loss_account",
]
child_tables = {"items": ("expense_account",), "taxes": ("account_head",)}
self.needs_repost = self.check_if_fields_updated(fields_to_check, child_tables)
self.validate_for_repost()
self.db_set("repost_required", self.needs_repost)
def make_gl_entries(self, gl_entries=None, from_repost=False):
if not gl_entries:
gl_entries = self.get_gl_entries()

View File

@ -1744,7 +1744,6 @@ class TestPurchaseInvoice(unittest.TestCase, StockTestMixin):
pi = make_purchase_invoice(
company="_Test Company",
customer="_Test Supplier",
do_not_save=True,
do_not_submit=True,
rate=1000,
@ -1862,7 +1861,6 @@ class TestPurchaseInvoice(unittest.TestCase, StockTestMixin):
pi = make_purchase_invoice(
company="_Test Company",
customer="_Test Supplier",
do_not_save=True,
do_not_submit=True,
rate=1000,
@ -1892,6 +1890,32 @@ class TestPurchaseInvoice(unittest.TestCase, StockTestMixin):
clear_dimension_defaults("Branch")
disable_dimension()
def test_repost_accounting_entries(self):
pi = make_purchase_invoice(
rate=1000,
price_list_rate=1000,
qty=1,
)
expected_gle = [
["_Test Account Cost for Goods Sold - _TC", 1000, 0.0, nowdate()],
["Creditors - _TC", 0.0, 1000, nowdate()],
]
check_gl_entries(self, pi.name, expected_gle, nowdate())
pi.items[0].expense_account = "Service - _TC"
pi.save()
pi.load_from_db()
self.assertTrue(pi.repost_required)
pi.repost_accounting_entries()
expected_gle = [
["Creditors - _TC", 0.0, 1000, nowdate()],
["Service - _TC", 1000, 0.0, nowdate()],
]
check_gl_entries(self, pi.name, expected_gle, nowdate())
pi.load_from_db()
self.assertFalse(pi.repost_required)
def set_advance_flag(company, flag, default_account):
frappe.db.set_value(

View File

@ -77,6 +77,7 @@
"manufacturer_part_no",
"accounting",
"expense_account",
"wip_composite_asset",
"col_break5",
"is_fixed_asset",
"asset_location",
@ -473,6 +474,7 @@
"label": "Accounting"
},
{
"allow_on_submit": 1,
"fieldname": "expense_account",
"fieldtype": "Link",
"label": "Expense Head",
@ -902,12 +904,18 @@
"no_copy": 1,
"options": "Serial and Batch Bundle",
"print_hide": 1
},
{
"fieldname": "wip_composite_asset",
"fieldtype": "Link",
"label": "WIP Composite Asset",
"options": "Asset"
}
],
"idx": 1,
"istable": 1,
"links": [],
"modified": "2023-07-26 12:54:53.178156",
"modified": "2023-10-03 21:01:01.824892",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Purchase Invoice Item",

View File

@ -86,6 +86,7 @@
"fieldtype": "Column Break"
},
{
"allow_on_submit": 1,
"columns": 2,
"fieldname": "account_head",
"fieldtype": "Link",
@ -97,6 +98,7 @@
"reqd": 1
},
{
"allow_on_submit": 1,
"default": ":Company",
"fieldname": "cost_center",
"fieldtype": "Link",

View File

@ -55,7 +55,7 @@
"index_web_pages_for_search": 1,
"is_submittable": 1,
"links": [],
"modified": "2023-07-27 15:47:58.975034",
"modified": "2023-09-26 14:21:27.362567",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Repost Accounting Ledger",
@ -77,5 +77,6 @@
],
"sort_field": "modified",
"sort_order": "DESC",
"states": []
"states": [],
"track_changes": 1
}

View File

@ -21,29 +21,8 @@ class RepostAccountingLedger(Document):
def validate_for_deferred_accounting(self):
sales_docs = [x.voucher_no for x in self.vouchers if x.voucher_type == "Sales Invoice"]
docs_with_deferred_revenue = frappe.db.get_all(
"Sales Invoice Item",
filters={"parent": ["in", sales_docs], "docstatus": 1, "enable_deferred_revenue": True},
fields=["parent"],
as_list=1,
)
purchase_docs = [x.voucher_no for x in self.vouchers if x.voucher_type == "Purchase Invoice"]
docs_with_deferred_expense = frappe.db.get_all(
"Purchase Invoice Item",
filters={"parent": ["in", purchase_docs], "docstatus": 1, "enable_deferred_expense": 1},
fields=["parent"],
as_list=1,
)
if docs_with_deferred_revenue or docs_with_deferred_expense:
frappe.throw(
_("Documents: {0} have deferred revenue/expense enabled for them. Cannot repost.").format(
frappe.bold(
comma_and([x[0] for x in docs_with_deferred_expense + docs_with_deferred_revenue])
)
)
)
validate_docs_for_deferred_accounting(sales_docs, purchase_docs)
def validate_for_closed_fiscal_year(self):
if self.vouchers:
@ -139,14 +118,17 @@ class RepostAccountingLedger(Document):
return rendered_page
def on_submit(self):
job_name = "repost_accounting_ledger_" + self.name
frappe.enqueue(
method="erpnext.accounts.doctype.repost_accounting_ledger.repost_accounting_ledger.start_repost",
account_repost_doc=self.name,
is_async=True,
job_name=job_name,
)
frappe.msgprint(_("Repost has started in the background"))
if len(self.vouchers) > 1:
job_name = "repost_accounting_ledger_" + self.name
frappe.enqueue(
method="erpnext.accounts.doctype.repost_accounting_ledger.repost_accounting_ledger.start_repost",
account_repost_doc=self.name,
is_async=True,
job_name=job_name,
)
frappe.msgprint(_("Repost has started in the background"))
else:
start_repost(self.name)
@frappe.whitelist()
@ -181,3 +163,26 @@ def start_repost(account_repost_doc=str) -> None:
doc.make_gl_entries()
frappe.db.commit()
def validate_docs_for_deferred_accounting(sales_docs, purchase_docs):
docs_with_deferred_revenue = frappe.db.get_all(
"Sales Invoice Item",
filters={"parent": ["in", sales_docs], "docstatus": 1, "enable_deferred_revenue": True},
fields=["parent"],
as_list=1,
)
docs_with_deferred_expense = frappe.db.get_all(
"Purchase Invoice Item",
filters={"parent": ["in", purchase_docs], "docstatus": 1, "enable_deferred_expense": 1},
fields=["parent"],
as_list=1,
)
if docs_with_deferred_revenue or docs_with_deferred_expense:
frappe.throw(
_("Documents: {0} have deferred revenue/expense enabled for them. Cannot repost.").format(
frappe.bold(comma_and([x[0] for x in docs_with_deferred_expense + docs_with_deferred_revenue]))
)
)

View File

@ -99,7 +99,7 @@
"index_web_pages_for_search": 1,
"is_submittable": 1,
"links": [],
"modified": "2022-11-08 07:38:40.079038",
"modified": "2023-09-26 14:21:35.719727",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Repost Payment Ledger",
@ -155,5 +155,6 @@
],
"sort_field": "modified",
"sort_order": "DESC",
"states": []
"states": [],
"track_changes": 1
}

View File

@ -11,13 +11,13 @@ from frappe.utils import add_days, cint, cstr, flt, formatdate, get_link_to_form
import erpnext
from erpnext.accounts.deferred_revenue import validate_service_stop_date
from erpnext.accounts.doctype.accounting_dimension.accounting_dimension import (
get_accounting_dimensions,
)
from erpnext.accounts.doctype.loyalty_program.loyalty_program import (
get_loyalty_program_details_with_points,
validate_loyalty_points,
)
from erpnext.accounts.doctype.repost_accounting_ledger.repost_accounting_ledger import (
validate_docs_for_deferred_accounting,
)
from erpnext.accounts.doctype.tax_withholding_category.tax_withholding_category import (
get_party_tax_withholding_details,
)
@ -168,6 +168,12 @@ class SalesInvoice(SellingController):
self.validate_account_for_change_amount()
self.validate_income_account()
def validate_for_repost(self):
self.validate_write_off_account()
self.validate_account_for_change_amount()
self.validate_income_account()
validate_docs_for_deferred_accounting([self.name], [])
def validate_fixed_asset(self):
for d in self.get("items"):
if d.is_fixed_asset and d.meta.get_field("asset") and d.asset:
@ -517,90 +523,21 @@ class SalesInvoice(SellingController):
def on_update_after_submit(self):
if hasattr(self, "repost_required"):
needs_repost = 0
# Check if any field affecting accounting entry is altered
doc_before_update = self.get_doc_before_save()
accounting_dimensions = get_accounting_dimensions() + ["cost_center", "project"]
# Check if opening entry check updated
if doc_before_update.get("is_opening") != self.is_opening:
needs_repost = 1
if not needs_repost:
# Parent Level Accounts excluding party account
for field in (
"additional_discount_account",
"cash_bank_account",
"account_for_change_amount",
"write_off_account",
"loyalty_redemption_account",
"unrealized_profit_loss_account",
):
if doc_before_update.get(field) != self.get(field):
needs_repost = 1
break
# Check for parent accounting dimensions
for dimension in accounting_dimensions:
if doc_before_update.get(dimension) != self.get(dimension):
needs_repost = 1
break
# Check for child tables
if self.check_if_child_table_updated(
"items",
doc_before_update,
("income_account", "expense_account", "discount_account"),
accounting_dimensions,
):
needs_repost = 1
if self.check_if_child_table_updated(
"taxes", doc_before_update, ("account_head",), accounting_dimensions
):
needs_repost = 1
self.validate_accounts()
# validate if deferred revenue is enabled for any item
# Don't allow to update the invoice if deferred revenue is enabled
if needs_repost:
for item in self.get("items"):
if item.enable_deferred_revenue:
frappe.throw(
_(
"Deferred Revenue is enabled for item {0}. You cannot update the invoice after submission."
).format(item.item_code)
)
self.db_set("repost_required", needs_repost)
def check_if_child_table_updated(
self, child_table, doc_before_update, fields_to_check, accounting_dimensions
):
# Check if any field affecting accounting entry is altered
for index, item in enumerate(self.get(child_table)):
for field in fields_to_check:
if doc_before_update.get(child_table)[index].get(field) != item.get(field):
return True
for dimension in accounting_dimensions:
if doc_before_update.get(child_table)[index].get(dimension) != item.get(dimension):
return True
return False
@frappe.whitelist()
def repost_accounting_entries(self):
if self.repost_required:
self.docstatus = 2
self.make_gl_entries_on_cancel()
self.docstatus = 1
self.make_gl_entries()
self.db_set("repost_required", 0)
else:
frappe.throw(_("No updates pending for reposting"))
fields_to_check = [
"additional_discount_account",
"cash_bank_account",
"account_for_change_amount",
"write_off_account",
"loyalty_redemption_account",
"unrealized_profit_loss_account",
]
child_tables = {
"items": ("income_account", "expense_account", "discount_account"),
"taxes": ("account_head",),
}
self.needs_repost = self.check_if_fields_updated(fields_to_check, child_tables)
self.validate_for_repost()
self.db_set("repost_required", self.needs_repost)
def set_paid_amount(self):
paid_amount = 0.0

View File

@ -95,30 +95,27 @@ frappe.query_reports["Accounts Payable"] = {
"options": "Payment Terms Template"
},
{
"fieldname": "party_type",
"fieldname":"party_type",
"label": __("Party Type"),
"fieldtype": "Link",
"options": "Party Type",
get_query: () => {
return {
filters: {
'account_type': 'Payable'
}
};
},
on_change: () => {
"fieldtype": "Autocomplete",
options: get_party_type_options(),
on_change: function() {
frappe.query_report.set_filter_value('party', "");
let party_type = frappe.query_report.get_filter_value('party_type');
frappe.query_report.toggle_filter_display('supplier_group', frappe.query_report.get_filter_value('party_type') !== "Supplier");
}
},
{
"fieldname":"party",
"label": __("Party"),
"fieldtype": "Dynamic Link",
"options": "party_type",
"fieldtype": "MultiSelectList",
get_data: function(txt) {
if (!frappe.query_report.filters) return;
let party_type = frappe.query_report.get_filter_value('party_type');
if (!party_type) return;
return frappe.db.get_link_options(party_type, txt);
},
},
{
"fieldname": "supplier_group",
@ -167,3 +164,15 @@ frappe.query_reports["Accounts Payable"] = {
}
erpnext.utils.add_dimensions('Accounts Payable', 9);
function get_party_type_options() {
let options = [];
frappe.db.get_list(
"Party Type", {filters:{"account_type": "Payable"}, fields:['name']}
).then((res) => {
res.forEach((party_type) => {
options.push(party_type.name);
});
});
return options;
}

View File

@ -34,7 +34,7 @@ class TestAccountsReceivable(AccountsTestMixin, FrappeTestCase):
filters = {
"company": self.company,
"party_type": "Supplier",
"party": self.supplier,
"party": [self.supplier],
"report_date": today(),
"range1": 30,
"range2": 60,

View File

@ -72,10 +72,27 @@ frappe.query_reports["Accounts Payable Summary"] = {
}
},
{
"fieldname":"supplier",
"label": __("Supplier"),
"fieldtype": "Link",
"options": "Supplier"
"fieldname":"party_type",
"label": __("Party Type"),
"fieldtype": "Autocomplete",
options: get_party_type_options(),
on_change: function() {
frappe.query_report.set_filter_value('party', "");
frappe.query_report.toggle_filter_display('supplier_group', frappe.query_report.get_filter_value('party_type') !== "Supplier");
}
},
{
"fieldname":"party",
"label": __("Party"),
"fieldtype": "MultiSelectList",
get_data: function(txt) {
if (!frappe.query_report.filters) return;
let party_type = frappe.query_report.get_filter_value('party_type');
if (!party_type) return;
return frappe.db.get_link_options(party_type, txt);
},
},
{
"fieldname":"payment_terms_template",
@ -105,3 +122,15 @@ frappe.query_reports["Accounts Payable Summary"] = {
}
erpnext.utils.add_dimensions('Accounts Payable Summary', 9);
function get_party_type_options() {
let options = [];
frappe.db.get_list(
"Party Type", {filters:{"account_type": "Payable"}, fields:['name']}
).then((res) => {
res.forEach((party_type) => {
options.push(party_type.name);
});
});
return options;
}

View File

@ -1,6 +1,8 @@
// Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
// License: GNU General Public License v3. See license.txt
frappe.provide("erpnext.utils");
frappe.query_reports["Accounts Receivable"] = {
"filters": [
{
@ -38,30 +40,27 @@ frappe.query_reports["Accounts Receivable"] = {
}
},
{
"fieldname": "party_type",
"fieldname":"party_type",
"label": __("Party Type"),
"fieldtype": "Link",
"options": "Party Type",
"Default": "Customer",
get_query: () => {
return {
filters: {
'account_type': 'Receivable'
}
};
},
on_change: () => {
"fieldtype": "Autocomplete",
options: get_party_type_options(),
on_change: function() {
frappe.query_report.set_filter_value('party', "");
let party_type = frappe.query_report.get_filter_value('party_type');
frappe.query_report.toggle_filter_display('customer_group', frappe.query_report.get_filter_value('party_type') !== "Customer");
}
},
{
"fieldname":"party",
"label": __("Party"),
"fieldtype": "Dynamic Link",
"options": "party_type",
"fieldtype": "MultiSelectList",
get_data: function(txt) {
if (!frappe.query_report.filters) return;
let party_type = frappe.query_report.get_filter_value('party_type');
if (!party_type) return;
return frappe.db.get_link_options(party_type, txt);
},
},
{
"fieldname": "party_account",
@ -194,3 +193,16 @@ frappe.query_reports["Accounts Receivable"] = {
}
erpnext.utils.add_dimensions('Accounts Receivable', 9);
function get_party_type_options() {
let options = [];
frappe.db.get_list(
"Party Type", {filters:{"account_type": "Receivable"}, fields:['name']}
).then((res) => {
res.forEach((party_type) => {
options.push(party_type.name);
});
});
return options;
}

View File

@ -801,7 +801,7 @@ class ReceivablePayableReport(object):
self.qb_selection_filter.append(self.filters.party_type == self.ple.party_type)
if self.filters.get("party"):
self.qb_selection_filter.append(self.filters.party == self.ple.party)
self.qb_selection_filter.append(self.ple.party.isin(self.filters.party))
if self.filters.party_account:
self.qb_selection_filter.append(self.ple.account == self.filters.party_account)

View File

@ -573,7 +573,7 @@ class TestAccountsReceivable(AccountsTestMixin, FrappeTestCase):
filters = {
"company": self.company,
"party_type": "Customer",
"party": self.customer,
"party": [self.customer],
"report_date": today(),
"range1": 30,
"range2": 60,
@ -605,3 +605,41 @@ class TestAccountsReceivable(AccountsTestMixin, FrappeTestCase):
for field in expected:
with self.subTest(field=field):
self.assertEqual(report_output.get(field), expected.get(field))
def test_multi_select_party_filter(self):
self.customer1 = self.customer
self.create_customer("_Test Customer 2")
self.customer2 = self.customer
self.create_customer("_Test Customer 3")
self.customer3 = self.customer
filters = {
"company": self.company,
"party_type": "Customer",
"party": [self.customer1, self.customer3],
"report_date": today(),
"range1": 30,
"range2": 60,
"range3": 90,
"range4": 120,
}
si1 = self.create_sales_invoice(no_payment_schedule=True, do_not_submit=True)
si1.customer = self.customer1
si1.save().submit()
si2 = self.create_sales_invoice(no_payment_schedule=True, do_not_submit=True)
si2.customer = self.customer2
si2.save().submit()
si3 = self.create_sales_invoice(no_payment_schedule=True, do_not_submit=True)
si3.customer = self.customer3
si3.save().submit()
# check invoice grand total and invoiced column's value for 3 payment terms
report = execute(filters)
expected_output = {self.customer1, self.customer3}
self.assertEqual(len(report[1]), 2)
output_for = set([x.party for x in report[1]])
self.assertEqual(output_for, expected_output)

View File

@ -72,10 +72,27 @@ frappe.query_reports["Accounts Receivable Summary"] = {
}
},
{
"fieldname":"customer",
"label": __("Customer"),
"fieldtype": "Link",
"options": "Customer"
"fieldname":"party_type",
"label": __("Party Type"),
"fieldtype": "Autocomplete",
options: get_party_type_options(),
on_change: function() {
frappe.query_report.set_filter_value('party', "");
frappe.query_report.toggle_filter_display('customer_group', frappe.query_report.get_filter_value('party_type') !== "Customer");
}
},
{
"fieldname":"party",
"label": __("Party"),
"fieldtype": "MultiSelectList",
get_data: function(txt) {
if (!frappe.query_report.filters) return;
let party_type = frappe.query_report.get_filter_value('party_type');
if (!party_type) return;
return frappe.db.get_link_options(party_type, txt);
},
},
{
"fieldname":"customer_group",
@ -133,3 +150,15 @@ frappe.query_reports["Accounts Receivable Summary"] = {
}
erpnext.utils.add_dimensions('Accounts Receivable Summary', 9);
function get_party_type_options() {
let options = [];
frappe.db.get_list(
"Party Type", {filters:{"account_type": "Receivable"}, fields:['name']}
).then((res) => {
res.forEach((party_type) => {
options.push(party_type.name);
});
});
return options;
}

View File

@ -99,13 +99,11 @@ class AccountsReceivableSummary(ReceivablePayableReport):
# Add all amount columns
for k in list(self.party_total[d.party]):
if k not in ["currency", "sales_person"]:
self.party_total[d.party][k] += d.get(k, 0.0)
if isinstance(self.party_total[d.party][k], float):
self.party_total[d.party][k] += d.get(k) or 0.0
# set territory, customer_group, sales person etc
self.set_party_details(d)
self.party_total[d.party].update({"party_type": d.party_type})
def init_party_total(self, row):
self.party_total.setdefault(
@ -124,6 +122,7 @@ class AccountsReceivableSummary(ReceivablePayableReport):
"total_due": 0.0,
"future_amount": 0.0,
"sales_person": [],
"party_type": row.party_type,
}
),
)
@ -133,13 +132,12 @@ class AccountsReceivableSummary(ReceivablePayableReport):
for key in ("territory", "customer_group", "supplier_group"):
if row.get(key):
self.party_total[row.party][key] = row.get(key)
self.party_total[row.party][key] = row.get(key, "")
if row.sales_person:
self.party_total[row.party].sales_person.append(row.sales_person)
self.party_total[row.party].sales_person.append(row.get("sales_person", ""))
if self.filters.sales_partner:
self.party_total[row.party]["default_sales_partner"] = row.get("default_sales_partner")
self.party_total[row.party]["default_sales_partner"] = row.get("default_sales_partner", "")
def get_columns(self):
self.columns = []

View File

@ -112,7 +112,7 @@ frappe.require("assets/erpnext/js/financial_statements.js", function() {
"to_fiscal_year": data.fiscal_year
};
if(data.based_on == 'cost_center'){
if(data.based_on == 'Cost Center'){
frappe.route_options["cost_center"] = data.account
} else {
frappe.route_options["project"] = data.account

View File

@ -148,6 +148,15 @@ frappe.ui.form.on('Asset', {
if (frm.doc.docstatus == 0) {
frm.toggle_reqd("finance_books", frm.doc.calculate_depreciation);
if (frm.doc.is_composite_asset && !frm.doc.capitalized_in) {
$('.primary-action').prop('hidden', true);
$('.form-message').text('Capitalize this asset to confirm');
frm.add_custom_button(__("Capitalize Asset"), function() {
frm.trigger("create_asset_capitalization");
});
}
}
},
@ -169,7 +178,7 @@ frappe.ui.form.on('Asset', {
frm.set_df_property('purchase_invoice', 'read_only', 1);
frm.set_df_property('purchase_receipt', 'read_only', 1);
}
else if (frm.doc.is_existing_asset) {
else if (frm.doc.is_existing_asset || frm.doc.is_composite_asset) {
frm.toggle_reqd('purchase_receipt', 0);
frm.toggle_reqd('purchase_invoice', 0);
}
@ -239,7 +248,7 @@ frappe.ui.form.on('Asset', {
datatable.style.setStyle(`.dt-scrollable`, {'font-size': '0.75rem', 'margin-bottom': '1rem', 'margin-left': '0.35rem', 'margin-right': '0.35rem'});
datatable.style.setStyle(`.dt-header`, {'margin-left': '0.35rem', 'margin-right': '0.35rem'});
datatable.style.setStyle(`.dt-cell--header`, {'color': 'var(--text-muted)'});
datatable.style.setStyle(`.dt-cell--header .dt-cell__content`, {'color': 'var(--gray-600)', 'font-size': 'var(--text-sm)'});
datatable.style.setStyle(`.dt-cell`, {'color': 'var(--text-color)'});
datatable.style.setStyle(`.dt-cell--col-1`, {'text-align': 'center'});
datatable.style.setStyle(`.dt-cell--col-2`, {'font-weight': 600});
@ -340,7 +349,8 @@ frappe.ui.form.on('Asset', {
method: "erpnext.assets.doctype.asset.asset.get_item_details",
args: {
item_code: frm.doc.item_code,
asset_category: frm.doc.asset_category
asset_category: frm.doc.asset_category,
gross_purchase_amount: frm.doc.gross_purchase_amount
},
callback: function(r, rt) {
if(r.message) {
@ -352,7 +362,17 @@ frappe.ui.form.on('Asset', {
is_existing_asset: function(frm) {
frm.trigger("toggle_reference_doc");
// frm.toggle_reqd("next_depreciation_date", (!frm.doc.is_existing_asset && frm.doc.calculate_depreciation));
},
is_composite_asset: function(frm) {
if(frm.doc.is_composite_asset) {
frm.set_value('gross_purchase_amount', 0);
frm.set_df_property('gross_purchase_amount', 'read_only', 1);
} else {
frm.set_df_property('gross_purchase_amount', 'read_only', 0);
}
frm.trigger("toggle_reference_doc");
},
make_sales_invoice: function(frm) {
@ -402,6 +422,19 @@ frappe.ui.form.on('Asset', {
});
},
create_asset_capitalization: function(frm) {
frappe.call({
args: {
"asset": frm.doc.name,
},
method: "erpnext.assets.doctype.asset.asset.create_asset_capitalization",
callback: function(r) {
var doclist = frappe.model.sync(r.message);
frappe.set_route("Form", doclist[0].doctype, doclist[0].name);
}
});
},
split_asset: function(frm) {
const title = __('Split Asset');
@ -465,9 +498,11 @@ frappe.ui.form.on('Asset', {
},
gross_purchase_amount: function(frm) {
frm.doc.finance_books.forEach(d => {
frm.events.set_depreciation_rate(frm, d);
})
if (frm.doc.finance_books) {
frm.doc.finance_books.forEach(d => {
frm.events.set_depreciation_rate(frm, d);
})
}
},
purchase_receipt: (frm) => {
@ -546,7 +581,21 @@ frappe.ui.form.on('Asset', {
}
});
}
}
},
set_salvage_value_percentage_or_expected_value_after_useful_life: function(frm, row, salvage_value_percentage_changed, expected_value_after_useful_life_changed) {
if (expected_value_after_useful_life_changed) {
frappe.flags.from_set_salvage_value_percentage_or_expected_value_after_useful_life = true;
const new_salvage_value_percentage = flt((row.expected_value_after_useful_life * 100) / frm.doc.gross_purchase_amount, precision("salvage_value_percentage", row));
frappe.model.set_value(row.doctype, row.name, "salvage_value_percentage", new_salvage_value_percentage);
frappe.flags.from_set_salvage_value_percentage_or_expected_value_after_useful_life = false;
} else if (salvage_value_percentage_changed) {
frappe.flags.from_set_salvage_value_percentage_or_expected_value_after_useful_life = true;
const new_expected_value_after_useful_life = flt(frm.doc.gross_purchase_amount * (row.salvage_value_percentage / 100), precision('gross_purchase_amount'));
frappe.model.set_value(row.doctype, row.name, "expected_value_after_useful_life", new_expected_value_after_useful_life);
frappe.flags.from_set_salvage_value_percentage_or_expected_value_after_useful_life = false;
}
},
});
frappe.ui.form.on('Asset Finance Book', {
@ -557,9 +606,19 @@ frappe.ui.form.on('Asset Finance Book', {
expected_value_after_useful_life: function(frm, cdt, cdn) {
const row = locals[cdt][cdn];
if (!frappe.flags.from_set_salvage_value_percentage_or_expected_value_after_useful_life) {
frm.events.set_salvage_value_percentage_or_expected_value_after_useful_life(frm, row, false, true);
}
frm.events.set_depreciation_rate(frm, row);
},
salvage_value_percentage: function(frm, cdt, cdn) {
const row = locals[cdt][cdn];
if (!frappe.flags.from_set_salvage_value_percentage_or_expected_value_after_useful_life) {
frm.events.set_salvage_value_percentage_or_expected_value_after_useful_life(frm, row, true, false);
}
},
frequency_of_depreciation: function(frm, cdt, cdn) {
const row = locals[cdt][cdn];
frm.events.set_depreciation_rate(frm, row);

View File

@ -14,6 +14,7 @@
"asset_owner",
"asset_owner_company",
"is_existing_asset",
"is_composite_asset",
"supplier",
"customer",
"image",
@ -72,7 +73,8 @@
"purchase_receipt_amount",
"default_finance_book",
"depr_entry_posting_status",
"amended_from"
"amended_from",
"capitalized_in"
],
"fields": [
{
@ -199,7 +201,7 @@
"fieldtype": "Date",
"label": "Purchase Date",
"read_only": 1,
"read_only_depends_on": "eval:!doc.is_existing_asset",
"read_only_depends_on": "eval:!doc.is_existing_asset && !doc.is_composite_asset",
"reqd": 1
},
{
@ -237,10 +239,12 @@
"default": "0",
"fieldname": "calculate_depreciation",
"fieldtype": "Check",
"label": "Calculate Depreciation"
"label": "Calculate Depreciation",
"read_only_depends_on": "eval:doc.is_composite_asset && !doc.gross_purchase_amount"
},
{
"default": "0",
"depends_on": "eval:!doc.is_composite_asset",
"fieldname": "is_existing_asset",
"fieldtype": "Check",
"label": "Is Existing Asset"
@ -478,7 +482,7 @@
"fieldname": "asset_quantity",
"fieldtype": "Int",
"label": "Asset Quantity",
"read_only_depends_on": "eval:!doc.is_existing_asset"
"read_only_depends_on": "eval:!doc.is_existing_asset && !doc.is_composite_asset"
},
{
"fieldname": "depr_entry_posting_status",
@ -507,6 +511,21 @@
"fieldname": "is_fully_depreciated",
"fieldtype": "Check",
"label": "Is Fully Depreciated"
},
{
"default": "0",
"depends_on": "eval:!doc.is_existing_asset",
"fieldname": "is_composite_asset",
"fieldtype": "Check",
"label": "Is Composite Asset"
},
{
"fieldname": "capitalized_in",
"fieldtype": "Link",
"hidden": 1,
"label": "Capitalized In",
"options": "Asset Capitalization",
"read_only": 1
}
],
"idx": 72,
@ -545,7 +564,7 @@
"table_fieldname": "accounts"
}
],
"modified": "2023-07-28 20:12:44.819616",
"modified": "2023-10-03 23:28:26.732269",
"modified_by": "Administrator",
"module": "Assets",
"name": "Asset",

View File

@ -198,7 +198,9 @@ class Asset(AccountsController):
self.asset_category = frappe.get_cached_value("Item", self.item_code, "asset_category")
if self.item_code and not self.get("finance_books"):
finance_books = get_item_details(self.item_code, self.asset_category)
finance_books = get_item_details(
self.item_code, self.asset_category, self.gross_purchase_amount
)
self.set("finance_books", finance_books)
def validate_finance_books(self):
@ -226,7 +228,7 @@ class Asset(AccountsController):
if not self.asset_category:
self.asset_category = frappe.get_cached_value("Item", self.item_code, "asset_category")
if not flt(self.gross_purchase_amount):
if not flt(self.gross_purchase_amount) and not self.is_composite_asset:
frappe.throw(_("Gross Purchase Amount is mandatory"), frappe.MandatoryError)
if is_cwip_accounting_enabled(self.asset_category):
@ -766,6 +768,15 @@ def create_asset_repair(asset, asset_name):
return asset_repair
@frappe.whitelist()
def create_asset_capitalization(asset):
asset_capitalization = frappe.new_doc("Asset Capitalization")
asset_capitalization.update(
{"target_asset": asset, "capitalization_method": "Choose a WIP composite asset"}
)
return asset_capitalization
@frappe.whitelist()
def create_asset_value_adjustment(asset, asset_category, company):
asset_value_adjustment = frappe.new_doc("Asset Value Adjustment")
@ -797,7 +808,7 @@ def transfer_asset(args):
@frappe.whitelist()
def get_item_details(item_code, asset_category):
def get_item_details(item_code, asset_category, gross_purchase_amount):
asset_category_doc = frappe.get_doc("Asset Category", asset_category)
books = []
for d in asset_category_doc.finance_books:
@ -807,7 +818,11 @@ def get_item_details(item_code, asset_category):
"depreciation_method": d.depreciation_method,
"total_number_of_depreciations": d.total_number_of_depreciations,
"frequency_of_depreciation": d.frequency_of_depreciation,
"start_date": nowdate(),
"daily_depreciation": d.daily_depreciation,
"salvage_value_percentage": d.salvage_value_percentage,
"expected_value_after_useful_life": flt(gross_purchase_amount)
* flt(d.salvage_value_percentage / 100),
"depreciation_start_date": d.depreciation_start_date or nowdate(),
}
)

View File

@ -1744,6 +1744,7 @@ def create_asset(**args):
"location": args.location or "Test Location",
"asset_owner": args.asset_owner or "Company",
"is_existing_asset": args.is_existing_asset or 1,
"is_composite_asset": args.is_composite_asset or 0,
"asset_quantity": args.get("asset_quantity") or 1,
"depr_entry_posting_status": args.depr_entry_posting_status or "",
}

View File

@ -75,13 +75,14 @@
"in_create": 1,
"index_web_pages_for_search": 1,
"links": [],
"modified": "2023-08-01 11:09:52.584482",
"modified": "2023-09-29 15:56:17.608643",
"modified_by": "Administrator",
"module": "Assets",
"name": "Asset Activity",
"owner": "Administrator",
"permissions": [
{
"delete": 1,
"email": 1,
"read": 1,
"report": 1,
@ -89,6 +90,7 @@
"share": 1
},
{
"delete": 1,
"email": 1,
"read": 1,
"report": 1,
@ -96,6 +98,7 @@
"share": 1
},
{
"delete": 1,
"email": 1,
"read": 1,
"report": 1,

View File

@ -16,9 +16,15 @@ erpnext.assets.AssetCapitalization = class AssetCapitalization extends erpnext.s
refresh() {
this.show_general_ledger();
if ((this.frm.doc.stock_items && this.frm.doc.stock_items.length) || !this.frm.doc.target_is_fixed_asset) {
this.show_stock_ledger();
}
if (this.frm.doc.stock_items && !this.frm.doc.stock_items.length && this.frm.doc.target_asset && this.frm.doc.capitalization_method === "Choose a WIP composite asset") {
this.set_consumed_stock_items_tagged_to_wip_composite_asset(this.frm.doc.target_asset);
this.get_target_asset_details();
}
}
setup_queries() {
@ -35,18 +41,9 @@ erpnext.assets.AssetCapitalization = class AssetCapitalization extends erpnext.s
});
me.frm.set_query("target_asset", function() {
var filters = {};
if (me.frm.doc.target_item_code) {
filters['item_code'] = me.frm.doc.target_item_code;
}
filters['status'] = ["not in", ["Draft", "Scrapped", "Sold", "Capitalized", "Decapitalized"]];
filters['docstatus'] = 1;
return {
filters: filters
};
filters: {'is_composite_asset': 1, 'docstatus': 0 }
}
});
me.frm.set_query("asset", "asset_items", function() {
@ -128,6 +125,39 @@ erpnext.assets.AssetCapitalization = class AssetCapitalization extends erpnext.s
return this.get_target_item_details();
}
target_asset() {
if (this.frm.doc.target_asset && this.frm.doc.capitalization_method === "Choose a WIP composite asset") {
this.set_consumed_stock_items_tagged_to_wip_composite_asset(this.frm.doc.target_asset);
this.get_target_asset_details();
}
}
set_consumed_stock_items_tagged_to_wip_composite_asset(asset) {
var me = this;
if (asset) {
return me.frm.call({
method: "erpnext.assets.doctype.asset_capitalization.asset_capitalization.get_items_tagged_to_wip_composite_asset",
args: {
asset: asset,
},
callback: function (r) {
if (!r.exc && r.message) {
me.frm.clear_table("stock_items");
for (let item of r.message) {
me.frm.add_child("stock_items", item);
}
refresh_field("stock_items");
me.calculate_totals();
}
}
});
}
}
item_code(doc, cdt, cdn) {
var row = frappe.get_doc(cdt, cdn);
if (cdt === "Asset Capitalization Stock Item") {
@ -242,6 +272,26 @@ erpnext.assets.AssetCapitalization = class AssetCapitalization extends erpnext.s
}
}
get_target_asset_details() {
var me = this;
if (me.frm.doc.target_asset) {
return me.frm.call({
method: "erpnext.assets.doctype.asset_capitalization.asset_capitalization.get_target_asset_details",
child: me.frm.doc,
args: {
asset: me.frm.doc.target_asset,
company: me.frm.doc.company,
},
callback: function (r) {
if (!r.exc) {
me.frm.refresh_fields();
}
}
});
}
}
get_consumed_stock_item_details(row) {
var me = this;

View File

@ -8,24 +8,25 @@
"engine": "InnoDB",
"field_order": [
"title",
"company",
"naming_series",
"entry_type",
"target_item_code",
"target_asset",
"target_item_name",
"target_is_fixed_asset",
"target_has_batch_no",
"target_has_serial_no",
"column_break_9",
"target_asset_name",
"capitalization_method",
"target_item_code",
"target_asset_location",
"target_asset",
"target_asset_name",
"target_warehouse",
"target_qty",
"target_stock_uom",
"target_batch_no",
"target_serial_no",
"column_break_5",
"company",
"finance_book",
"posting_date",
"posting_time",
@ -57,12 +58,13 @@
"label": "Title"
},
{
"depends_on": "eval:(doc.target_item_code && !doc.__islocal && doc.capitalization_method !== 'Choose a WIP composite asset') || ((doc.entry_type=='Capitalization' && doc.capitalization_method=='Create a new composite asset') || doc.entry_type=='Decapitalization')",
"fieldname": "target_item_code",
"fieldtype": "Link",
"in_standard_filter": 1,
"label": "Target Item Code",
"options": "Item",
"reqd": 1
"mandatory_depends_on": "eval:(doc.entry_type=='Capitalization' && doc.capitalization_method=='Create a new composite asset') || doc.entry_type=='Decapitalization'",
"options": "Item"
},
{
"depends_on": "eval:doc.target_item_code && doc.target_item_name != doc.target_item_code",
@ -86,16 +88,18 @@
"fieldtype": "Column Break"
},
{
"depends_on": "eval:(doc.target_asset && !doc.__islocal) || (doc.entry_type=='Capitalization' && doc.capitalization_method=='Choose a WIP composite asset')",
"fieldname": "target_asset",
"fieldtype": "Link",
"in_standard_filter": 1,
"label": "Target Asset",
"mandatory_depends_on": "eval:doc.entry_type=='Capitalization' && doc.capitalization_method=='Choose a WIP composite asset'",
"no_copy": 1,
"options": "Asset",
"read_only": 1
"read_only_depends_on": "eval:(doc.entry_type=='Decapitalization') || (doc.entry_type=='Capitalization' && doc.capitalization_method=='Create a new composite asset')"
},
{
"depends_on": "eval:doc.entry_type=='Capitalization'",
"depends_on": "eval:(doc.target_asset_name && !doc.__islocal) || (doc.target_asset && doc.entry_type=='Capitalization' && doc.capitalization_method=='Choose a WIP composite asset')",
"fetch_from": "target_asset.asset_name",
"fieldname": "target_asset_name",
"fieldtype": "Data",
@ -186,12 +190,14 @@
},
{
"default": "1",
"depends_on": "eval:doc.entry_type=='Decapitalization'",
"fieldname": "target_qty",
"fieldtype": "Float",
"label": "Target Qty",
"read_only_depends_on": "eval:doc.entry_type=='Capitalization'"
},
{
"depends_on": "eval:doc.entry_type=='Decapitalization'",
"fetch_from": "target_item_code.stock_uom",
"fieldname": "target_stock_uom",
"fieldtype": "Link",
@ -331,18 +337,26 @@
"read_only": 1
},
{
"depends_on": "eval:doc.entry_type=='Capitalization'",
"depends_on": "eval:doc.entry_type=='Capitalization' && doc.capitalization_method=='Create a new composite asset'",
"fieldname": "target_asset_location",
"fieldtype": "Link",
"label": "Target Asset Location",
"mandatory_depends_on": "eval:doc.entry_type=='Capitalization'",
"mandatory_depends_on": "eval:doc.entry_type=='Capitalization' && doc.capitalization_method=='Create a new composite asset'",
"options": "Location"
},
{
"depends_on": "eval:doc.entry_type=='Capitalization'",
"fieldname": "capitalization_method",
"fieldtype": "Select",
"label": "Capitalization Method",
"mandatory_depends_on": "eval:doc.entry_type=='Capitalization'",
"options": "\nCreate a new composite asset\nChoose a WIP composite asset"
}
],
"index_web_pages_for_search": 1,
"is_submittable": 1,
"links": [],
"modified": "2023-06-22 14:17:07.995120",
"modified": "2023-10-03 22:55:59.461456",
"modified_by": "Administrator",
"module": "Assets",
"name": "Asset Capitalization",

View File

@ -53,6 +53,7 @@ class AssetCapitalization(StockController):
self.validate_posting_time()
self.set_missing_values(for_validate=True)
self.validate_target_item()
self.validate_target_asset()
self.validate_consumed_stock_item()
self.validate_consumed_asset_item()
self.validate_service_item()
@ -67,12 +68,12 @@ class AssetCapitalization(StockController):
def before_submit(self):
self.validate_source_mandatory()
if self.entry_type == "Capitalization":
self.create_target_asset()
self.create_target_asset()
def on_submit(self):
self.update_stock_ledger()
self.make_gl_entries()
self.update_target_asset()
def on_cancel(self):
self.ignore_linked_doctypes = (
@ -94,6 +95,11 @@ class AssetCapitalization(StockController):
if self.meta.has_field(k) and (not self.get(k) or k in force_fields):
self.set(k, v)
target_asset_details = get_target_asset_details(self.target_asset, self.company)
for k, v in target_asset_details.items():
if self.meta.has_field(k) and (not self.get(k) or k in force_fields):
self.set(k, v)
for d in self.stock_items:
args = self.as_dict()
args.update(d.as_dict())
@ -155,6 +161,33 @@ class AssetCapitalization(StockController):
self.validate_item(target_item)
def validate_target_asset(self):
if self.target_asset:
target_asset = self.get_asset_for_validation(self.target_asset)
if not target_asset.is_composite_asset:
frappe.throw(_("Target Asset {0} needs to be composite asset").format(target_asset.name))
if target_asset.item_code != self.target_item_code:
frappe.throw(
_("Asset {0} does not belong to Item {1}").format(self.target_asset, self.target_item_code)
)
if target_asset.status in ("Scrapped", "Sold", "Capitalized", "Decapitalized"):
frappe.throw(
_("Target Asset {0} cannot be {1}").format(target_asset.name, target_asset.status)
)
if target_asset.docstatus == 1:
frappe.throw(_("Target Asset {0} cannot be submitted").format(target_asset.name))
elif target_asset.docstatus == 2:
frappe.throw(_("Target Asset {0} cannot be cancelled").format(target_asset.name))
if target_asset.company != self.company:
frappe.throw(
_("Target Asset {0} does not belong to company {1}").format(target_asset.name, self.company)
)
def validate_consumed_stock_item(self):
for d in self.stock_items:
if d.item_code:
@ -179,7 +212,23 @@ class AssetCapitalization(StockController):
)
asset = self.get_asset_for_validation(d.asset)
self.validate_asset(asset)
if asset.status in ("Draft", "Scrapped", "Sold", "Capitalized", "Decapitalized"):
frappe.throw(
_("Row #{0}: Consumed Asset {1} cannot be {2}").format(d.idx, asset.name, asset.status)
)
if asset.docstatus == 0:
frappe.throw(_("Row #{0}: Consumed Asset {1} cannot be Draft").format(d.idx, asset.name))
elif asset.docstatus == 2:
frappe.throw(_("Row #{0}: Consumed Asset {1} cannot be cancelled").format(d.idx, asset.name))
if asset.company != self.company:
frappe.throw(
_("Row #{0}: Consumed Asset {1} does not belong to company {2}").format(
d.idx, asset.name, self.company
)
)
def validate_service_item(self):
for d in self.service_items:
@ -214,21 +263,12 @@ class AssetCapitalization(StockController):
def get_asset_for_validation(self, asset):
return frappe.db.get_value(
"Asset", asset, ["name", "item_code", "company", "status", "docstatus"], as_dict=1
"Asset",
asset,
["name", "item_code", "company", "status", "docstatus", "is_composite_asset"],
as_dict=1,
)
def validate_asset(self, asset):
if asset.status in ("Draft", "Scrapped", "Sold", "Capitalized", "Decapitalized"):
frappe.throw(_("Asset {0} is {1}").format(asset.name, asset.status))
if asset.docstatus == 0:
frappe.throw(_("Asset {0} is Draft").format(asset.name))
if asset.docstatus == 2:
frappe.throw(_("Asset {0} is cancelled").format(asset.name))
if asset.company != self.company:
frappe.throw(_("Asset {0} does not belong to company {1}").format(asset.name, self.company))
@frappe.whitelist()
def set_warehouse_details(self):
for d in self.get("stock_items"):
@ -495,16 +535,25 @@ class AssetCapitalization(StockController):
)
def create_target_asset(self):
if (
self.entry_type != "Capitalization"
or self.capitalization_method != "Create a new composite asset"
):
return
total_target_asset_value = flt(self.total_value, self.precision("total_value"))
asset_doc = frappe.new_doc("Asset")
asset_doc.company = self.company
asset_doc.item_code = self.target_item_code
asset_doc.is_existing_asset = 1
asset_doc.is_composite_asset = 1
asset_doc.location = self.target_asset_location
asset_doc.available_for_use_date = self.posting_date
asset_doc.purchase_date = self.posting_date
asset_doc.gross_purchase_amount = total_target_asset_value
asset_doc.purchase_receipt_amount = total_target_asset_value
asset_doc.purchase_receipt_amount = total_target_asset_value
asset_doc.capitalized_in = self.name
asset_doc.flags.ignore_validate = True
asset_doc.flags.asset_created_via_asset_capitalization = True
asset_doc.insert()
@ -528,6 +577,28 @@ class AssetCapitalization(StockController):
).format(get_link_to_form("Asset", asset_doc.name))
)
def update_target_asset(self):
if (
self.entry_type != "Capitalization"
or self.capitalization_method != "Choose a WIP composite asset"
):
return
total_target_asset_value = flt(self.total_value, self.precision("total_value"))
asset_doc = frappe.get_doc("Asset", self.target_asset)
asset_doc.gross_purchase_amount = total_target_asset_value
asset_doc.purchase_receipt_amount = total_target_asset_value
asset_doc.capitalized_in = self.name
asset_doc.flags.ignore_validate = True
asset_doc.save()
frappe.msgprint(
_(
"Asset {0} has been updated. Please set the depreciation details if any and submit it."
).format(get_link_to_form("Asset", asset_doc.name))
)
def restore_consumed_asset_items(self):
for item in self.asset_items:
asset = frappe.get_doc("Asset", item.asset)
@ -612,6 +683,33 @@ def get_target_item_details(item_code=None, company=None):
return out
@frappe.whitelist()
def get_target_asset_details(asset=None, company=None):
out = frappe._dict()
# Get Asset Details
asset_details = frappe._dict()
if asset:
asset_details = frappe.db.get_value("Asset", asset, ["asset_name", "item_code"], as_dict=1)
if not asset_details:
frappe.throw(_("Asset {0} does not exist").format(asset))
# Re-set item code from Asset
out.target_item_code = asset_details.item_code
# Set Asset Details
out.asset_name = asset_details.asset_name
if asset_details.item_code:
out.target_fixed_asset_account = get_asset_category_account(
"fixed_asset_account", item=asset_details.item_code, company=company
)
else:
out.target_fixed_asset_account = None
return out
@frappe.whitelist()
def get_consumed_stock_item_details(args):
if isinstance(args, str):
@ -760,3 +858,30 @@ def get_service_item_details(args):
)
return out
@frappe.whitelist()
def get_items_tagged_to_wip_composite_asset(asset):
fields = [
"item_code",
"item_name",
"batch_no",
"serial_no",
"stock_qty",
"stock_uom",
"warehouse",
"cost_center",
"qty",
"valuation_rate",
"amount",
]
pi_items = frappe.get_all(
"Purchase Invoice Item", filters={"wip_composite_asset": asset}, fields=fields
)
pr_items = frappe.get_all(
"Purchase Receipt Item", filters={"wip_composite_asset": asset}, fields=fields
)
return pi_items + pr_items

View File

@ -58,6 +58,7 @@ class TestAssetCapitalization(unittest.TestCase):
# Create and submit Asset Captitalization
asset_capitalization = create_asset_capitalization(
entry_type="Capitalization",
capitalization_method="Create a new composite asset",
target_item_code="Macbook Pro",
target_asset_location="Test Location",
stock_qty=stock_qty,
@ -147,6 +148,7 @@ class TestAssetCapitalization(unittest.TestCase):
# Create and submit Asset Captitalization
asset_capitalization = create_asset_capitalization(
entry_type="Capitalization",
capitalization_method="Create a new composite asset",
target_item_code="Macbook Pro",
target_asset_location="Test Location",
stock_qty=stock_qty,
@ -211,6 +213,77 @@ class TestAssetCapitalization(unittest.TestCase):
self.assertFalse(get_actual_gle_dict(asset_capitalization.name))
self.assertFalse(get_actual_sle_dict(asset_capitalization.name))
def test_capitalization_with_wip_composite_asset(self):
company = "_Test Company with perpetual inventory"
set_depreciation_settings_in_company(company=company)
stock_rate = 1000
stock_qty = 2
stock_amount = 2000
total_amount = 2000
wip_composite_asset = create_asset(
asset_name="Asset Capitalization WIP Composite Asset",
is_composite_asset=1,
warehouse="Stores - TCP1",
company=company,
)
# Create and submit Asset Captitalization
asset_capitalization = create_asset_capitalization(
entry_type="Capitalization",
capitalization_method="Choose a WIP composite asset",
target_asset=wip_composite_asset.name,
target_asset_location="Test Location",
stock_qty=stock_qty,
stock_rate=stock_rate,
service_expense_account="Expenses Included In Asset Valuation - TCP1",
company=company,
submit=1,
)
# Test Asset Capitalization values
self.assertEqual(asset_capitalization.entry_type, "Capitalization")
self.assertEqual(asset_capitalization.capitalization_method, "Choose a WIP composite asset")
self.assertEqual(asset_capitalization.target_qty, 1)
self.assertEqual(asset_capitalization.stock_items[0].valuation_rate, stock_rate)
self.assertEqual(asset_capitalization.stock_items[0].amount, stock_amount)
self.assertEqual(asset_capitalization.stock_items_total, stock_amount)
self.assertEqual(asset_capitalization.total_value, total_amount)
self.assertEqual(asset_capitalization.target_incoming_rate, total_amount)
# Test Target Asset values
target_asset = frappe.get_doc("Asset", asset_capitalization.target_asset)
self.assertEqual(target_asset.gross_purchase_amount, total_amount)
self.assertEqual(target_asset.purchase_receipt_amount, total_amount)
# Test General Ledger Entries
expected_gle = {
"_Test Fixed Asset - TCP1": 2000,
"_Test Warehouse - TCP1": -2000,
}
actual_gle = get_actual_gle_dict(asset_capitalization.name)
self.assertEqual(actual_gle, expected_gle)
# Test Stock Ledger Entries
expected_sle = {
("Capitalization Source Stock Item", "_Test Warehouse - TCP1"): {
"actual_qty": -stock_qty,
"stock_value_difference": -stock_amount,
}
}
actual_sle = get_actual_sle_dict(asset_capitalization.name)
self.assertEqual(actual_sle, expected_sle)
# Cancel Asset Capitalization and make test entries and status are reversed
asset_capitalization.cancel()
self.assertFalse(get_actual_gle_dict(asset_capitalization.name))
self.assertFalse(get_actual_sle_dict(asset_capitalization.name))
def test_decapitalization_with_depreciation(self):
# Variables
purchase_date = "2020-01-01"
@ -347,6 +420,7 @@ def create_asset_capitalization(**args):
asset_capitalization.update(
{
"entry_type": args.entry_type or "Capitalization",
"capitalization_method": args.capitalization_method or None,
"company": company,
"posting_date": args.posting_date or now.strftime("%Y-%m-%d"),
"posting_time": args.posting_time or now.strftime("%H:%M:%S.%f"),

View File

@ -12,6 +12,7 @@
"column_break_5",
"frequency_of_depreciation",
"depreciation_start_date",
"salvage_value_percentage",
"expected_value_after_useful_life",
"value_after_depreciation",
"rate_of_depreciation"
@ -91,12 +92,17 @@
"fieldname": "daily_depreciation",
"fieldtype": "Check",
"label": "Daily Depreciation"
},
{
"fieldname": "salvage_value_percentage",
"fieldtype": "Percent",
"label": "Salvage Value Percentage"
}
],
"index_web_pages_for_search": 1,
"istable": 1,
"links": [],
"modified": "2023-08-10 22:10:36.576199",
"modified": "2023-09-29 15:39:52.740594",
"modified_by": "Administrator",
"module": "Assets",
"name": "Asset Finance Book",

View File

@ -177,7 +177,7 @@ class AssetRepair(AccountsController):
"item_code": stock_item.item_code,
"qty": stock_item.consumed_quantity,
"basic_rate": stock_item.valuation_rate,
"serial_no": stock_item.serial_and_batch_bundle,
"serial_and_batch_bundle": stock_item.serial_and_batch_bundle,
"cost_center": self.cost_center,
"project": self.project,
},

View File

@ -477,6 +477,7 @@
"depends_on": "eval:doc.is_subcontracted",
"fieldname": "supplier_warehouse",
"fieldtype": "Link",
"ignore_user_permissions": 1,
"label": "Supplier Warehouse",
"options": "Warehouse"
},
@ -1274,7 +1275,7 @@
"idx": 105,
"is_submittable": 1,
"links": [],
"modified": "2023-09-13 16:21:07.361700",
"modified": "2023-10-01 20:58:07.851037",
"modified_by": "Administrator",
"module": "Buying",
"name": "Purchase Order",

View File

@ -88,7 +88,7 @@ frappe.ui.form.on("Supplier", {
}, __("View"));
frm.add_custom_button(__('Accounts Payable'), function () {
frappe.set_route('query-report', 'Accounts Payable', { supplier: frm.doc.name });
frappe.set_route('query-report', 'Accounts Payable', { party_type: "Supplier", party: frm.doc.name });
}, __("View"));
frm.add_custom_button(__('Bank Account'), function () {

View File

@ -35,8 +35,12 @@ def get_data(filters):
sq_item.parent,
sq_item.item_code,
sq_item.qty,
sq.currency,
sq_item.stock_qty,
sq_item.amount,
sq_item.base_rate,
sq_item.base_amount,
sq.price_list_currency,
sq_item.uom,
sq_item.stock_uom,
sq_item.request_for_quotation,
@ -105,7 +109,11 @@ def prepare_data(supplier_quotation_data, filters):
"qty": data.get("qty"),
"price": flt(data.get("amount") * exchange_rate, float_precision),
"uom": data.get("uom"),
"price_list_currency": data.get("price_list_currency"),
"currency": data.get("currency"),
"stock_uom": data.get("stock_uom"),
"base_amount": flt(data.get("base_amount"), float_precision),
"base_rate": flt(data.get("base_rate"), float_precision),
"request_for_quotation": data.get("request_for_quotation"),
"valid_till": data.get("valid_till"),
"lead_time_days": data.get("lead_time_days"),
@ -183,6 +191,8 @@ def prepare_chart_data(suppliers, qty_list, supplier_qty_price_map):
def get_columns(filters):
currency = frappe.get_cached_value("Company", filters.get("company"), "default_currency")
group_by_columns = [
{
"fieldname": "supplier_name",
@ -203,11 +213,18 @@ def get_columns(filters):
columns = [
{"fieldname": "uom", "label": _("UOM"), "fieldtype": "Link", "options": "UOM", "width": 90},
{"fieldname": "qty", "label": _("Quantity"), "fieldtype": "Float", "width": 80},
{
"fieldname": "currency",
"label": _("Currency"),
"fieldtype": "Link",
"options": "Currency",
"width": 110,
},
{
"fieldname": "price",
"label": _("Price"),
"fieldtype": "Currency",
"options": "Company:company:default_currency",
"options": "currency",
"width": 110,
},
{
@ -221,9 +238,23 @@ def get_columns(filters):
"fieldname": "price_per_unit",
"label": _("Price per Unit (Stock UOM)"),
"fieldtype": "Currency",
"options": "Company:company:default_currency",
"options": "currency",
"width": 120,
},
{
"fieldname": "base_amount",
"label": _("Price ({0})").format(currency),
"fieldtype": "Currency",
"options": "price_list_currency",
"width": 180,
},
{
"fieldname": "base_rate",
"label": _("Price Per Unit ({0})").format(currency),
"fieldtype": "Currency",
"options": "price_list_currency",
"width": 180,
},
{
"fieldname": "quotation",
"label": _("Supplier Quotation"),

View File

@ -243,13 +243,38 @@ class AccountsController(TransactionBase):
_doc.cancel()
_doc.delete()
def on_trash(self):
# delete references in 'Repost Payment Ledger'
rpi = frappe.qb.DocType("Repost Payment Ledger Items")
frappe.qb.from_(rpi).delete().where(
(rpi.voucher_type == self.doctype) & (rpi.voucher_no == self.name)
).run()
def _remove_references_in_repost_doctypes(self):
repost_doctypes = ["Repost Payment Ledger Items", "Repost Accounting Ledger Items"]
for _doctype in repost_doctypes:
dt = frappe.qb.DocType(_doctype)
rows = (
frappe.qb.from_(dt)
.select(dt.name, dt.parent, dt.parenttype)
.where((dt.voucher_type == self.doctype) & (dt.voucher_no == self.name))
.run(as_dict=True)
)
if rows:
references_map = frappe._dict()
for x in rows:
references_map.setdefault((x.parenttype, x.parent), []).append(x.name)
for doc, rows in references_map.items():
repost_doc = frappe.get_doc(doc[0], doc[1])
for row in rows:
if _doctype == "Repost Payment Ledger Items":
repost_doc.remove(repost_doc.get("repost_vouchers", {"name": row})[0])
else:
repost_doc.remove(repost_doc.get("vouchers", {"name": row})[0])
repost_doc.flags.ignore_validate_update_after_submit = True
repost_doc.flags.ignore_links = True
repost_doc.save(ignore_permissions=True)
def on_trash(self):
self._remove_references_in_repost_doctypes()
self._remove_references_in_unreconcile()
# delete sl and gl entries on deletion of transaction
@ -1466,7 +1491,7 @@ class AccountsController(TransactionBase):
"account": self.additional_discount_account,
"against": supplier_or_customer,
dr_or_cr: self.base_discount_amount,
"cost_center": self.cost_center,
"cost_center": self.cost_center or erpnext.get_default_cost_center(self.company),
},
item=self,
)
@ -2186,6 +2211,45 @@ class AccountsController(TransactionBase):
_("Select finance book for the item {0} at row {1}").format(item.item_code, item.idx)
)
def check_if_fields_updated(self, fields_to_check, child_tables):
# Check if any field affecting accounting entry is altered
doc_before_update = self.get_doc_before_save()
accounting_dimensions = get_accounting_dimensions() + ["cost_center", "project"]
# Check if opening entry check updated
needs_repost = doc_before_update.get("is_opening") != self.is_opening
if not needs_repost:
# Parent Level Accounts excluding party account
fields_to_check += accounting_dimensions
for field in fields_to_check:
if doc_before_update.get(field) != self.get(field):
needs_repost = 1
break
if not needs_repost:
# Check for child tables
for table in child_tables:
needs_repost = check_if_child_table_updated(
doc_before_update.get(table), self.get(table), child_tables[table]
)
if needs_repost:
break
return needs_repost
@frappe.whitelist()
def repost_accounting_entries(self):
if self.repost_required:
repost_ledger = frappe.new_doc("Repost Accounting Ledger")
repost_ledger.company = self.company
repost_ledger.append("vouchers", {"voucher_type": self.doctype, "voucher_no": self.name})
repost_ledger.insert()
repost_ledger.submit()
self.db_set("repost_required", 0)
else:
frappe.throw(_("No updates pending for reposting"))
@frappe.whitelist()
def get_tax_rate(account_head):
@ -3191,6 +3255,23 @@ def update_child_qty_rate(parent_doctype, trans_items, parent_doctype_name, chil
parent.create_stock_reservation_entries()
def check_if_child_table_updated(
child_table_before_update, child_table_after_update, fields_to_check
):
accounting_dimensions = get_accounting_dimensions() + ["cost_center", "project"]
# Check if any field affecting accounting entry is altered
for index, item in enumerate(child_table_after_update):
for field in fields_to_check:
if child_table_before_update[index].get(field) != item.get(field):
return True
for dimension in accounting_dimensions:
if child_table_before_update[index].get(dimension) != item.get(dimension):
return True
return False
@erpnext.allow_regional
def validate_regional(doc):
pass

View File

@ -288,7 +288,9 @@ class SellingController(StockController):
last_valuation_rate_in_sales_uom = last_valuation_rate * (item.conversion_factor or 1)
if flt(item.base_net_rate) < flt(last_valuation_rate_in_sales_uom):
throw_message(item.idx, item.item_name, last_valuation_rate_in_sales_uom, "valuation rate")
throw_message(
item.idx, item.item_name, last_valuation_rate_in_sales_uom, "valuation rate (Moving Average)"
)
def get_item_list(self):
il = []

View File

@ -804,7 +804,7 @@ class SubcontractingController(StockController):
{
"item_code": item.rm_item_code,
"warehouse": self.supplier_warehouse,
"actual_qty": -1 * flt(item.consumed_qty),
"actual_qty": -1 * flt(item.consumed_qty, item.precision("consumed_qty")),
"dependant_sle_voucher_detail_no": item.reference_name,
},
)

View File

@ -190,7 +190,9 @@ class calculate_taxes_and_totals(object):
item.net_rate = item.rate
if not item.qty and self.doc.get("is_return"):
if (
not item.qty and self.doc.get("is_return") and self.doc.get("doctype") != "Purchase Receipt"
):
item.amount = flt(-1 * item.rate, item.precision("amount"))
elif not item.qty and self.doc.get("is_debit_note"):
item.amount = flt(item.rate, item.precision("amount"))

View File

@ -379,7 +379,7 @@ def get_lead_details(lead, posting_date=None, company=None):
}
)
set_address_details(out, lead, "Lead")
set_address_details(out, lead, "Lead", company=company)
taxes_and_charges = set_taxes(
None,

View File

@ -228,7 +228,7 @@
},
{
"default": "0",
"description": "If enabled, the system won't create material requests for the available items.",
"description": "If enabled, the system will create material requests even if the stock exists in the 'Raw Materials Warehouse'.",
"fieldname": "ignore_existing_ordered_qty",
"fieldtype": "Check",
"label": "Ignore Available Stock"
@ -422,7 +422,7 @@
"index_web_pages_for_search": 1,
"is_submittable": 1,
"links": [],
"modified": "2023-07-28 13:37:43.926686",
"modified": "2023-09-29 11:41:03.246059",
"modified_by": "Administrator",
"module": "Manufacturing",
"name": "Production Plan",

View File

@ -8,6 +8,7 @@ import json
import frappe
from frappe import _, msgprint
from frappe.model.document import Document
from frappe.query_builder import Case
from frappe.query_builder.functions import IfNull, Sum
from frappe.utils import (
add_days,
@ -1509,6 +1510,10 @@ def get_items_for_material_requests(doc, warehouses=None, get_parent_warehouse_d
def get_materials_from_other_locations(item, warehouses, new_mr_items, company):
from erpnext.stock.doctype.pick_list.pick_list import get_available_item_locations
stock_uom, purchase_uom = frappe.db.get_value(
"Item", item.get("item_code"), ["stock_uom", "purchase_uom"]
)
locations = get_available_item_locations(
item.get("item_code"), warehouses, item.get("quantity"), company, ignore_validation=True
)
@ -1519,6 +1524,10 @@ def get_materials_from_other_locations(item, warehouses, new_mr_items, company):
if required_qty <= 0:
return
conversion_factor = 1.0
if purchase_uom != stock_uom and purchase_uom == item["uom"]:
conversion_factor = get_uom_conversion_factor(item["item_code"], item["uom"])
new_dict = copy.deepcopy(item)
quantity = required_qty if d.get("qty") > required_qty else d.get("qty")
@ -1531,25 +1540,14 @@ def get_materials_from_other_locations(item, warehouses, new_mr_items, company):
}
)
required_qty -= quantity
required_qty -= quantity / conversion_factor
new_mr_items.append(new_dict)
# raise purchase request for remaining qty
if required_qty:
stock_uom, purchase_uom = frappe.db.get_value(
"Item", item["item_code"], ["stock_uom", "purchase_uom"]
)
if purchase_uom != stock_uom and purchase_uom == item["uom"]:
conversion_factor = get_uom_conversion_factor(item["item_code"], item["uom"])
if not (conversion_factor or frappe.flags.show_qty_in_stock_uom):
frappe.throw(
_("UOM Conversion factor ({0} -> {1}) not found for item: {2}").format(
purchase_uom, stock_uom, item["item_code"]
)
)
required_qty = required_qty / conversion_factor
precision = frappe.get_precision("Material Request Plan Item", "quantity")
if flt(required_qty, precision) > 0:
required_qty = required_qty
if frappe.db.get_value("UOM", purchase_uom, "must_be_whole_number"):
required_qty = ceil(required_qty)
@ -1620,18 +1618,33 @@ def get_reserved_qty_for_production_plan(item_code, warehouse):
table = frappe.qb.DocType("Production Plan")
child = frappe.qb.DocType("Material Request Plan Item")
completed_production_plans = get_completed_production_plans()
case = Case()
query = (
frappe.qb.from_(table)
.inner_join(child)
.on(table.name == child.parent)
.select(Sum(child.quantity * IfNull(child.conversion_factor, 1.0)))
.select(
Sum(
child.quantity
* IfNull(
case.when(child.material_request_type == "Purchase", child.conversion_factor).else_(1.0), 1.0
)
)
)
.where(
(table.docstatus == 1)
& (child.item_code == item_code)
& (child.warehouse == warehouse)
& (table.status.notin(["Completed", "Closed"]))
)
).run()
)
if completed_production_plans:
query = query.where(table.name.notin(completed_production_plans))
query = query.run()
if not query:
return 0.0
@ -1639,7 +1652,9 @@ def get_reserved_qty_for_production_plan(item_code, warehouse):
reserved_qty_for_production_plan = flt(query[0][0])
reserved_qty_for_production = flt(
get_reserved_qty_for_production(item_code, warehouse, check_production_plan=True)
get_reserved_qty_for_production(
item_code, warehouse, completed_production_plans, check_production_plan=True
)
)
if reserved_qty_for_production > reserved_qty_for_production_plan:
@ -1648,6 +1663,25 @@ def get_reserved_qty_for_production_plan(item_code, warehouse):
return reserved_qty_for_production_plan - reserved_qty_for_production
def get_completed_production_plans():
table = frappe.qb.DocType("Production Plan")
child = frappe.qb.DocType("Production Plan Item")
query = (
frappe.qb.from_(table)
.inner_join(child)
.on(table.name == child.parent)
.select(table.name)
.where(
(table.docstatus == 1)
& (table.status.notin(["Completed", "Closed"]))
& (child.ordered_qty >= child.planned_qty)
)
).run(as_dict=True)
return list(set([d.name for d in query]))
def get_raw_materials_of_sub_assembly_items(
item_details, company, bom_no, include_non_stock_items, sub_assembly_items, planned_qty=1
):

View File

@ -6,6 +6,7 @@ from frappe.utils import add_to_date, flt, getdate, now_datetime, nowdate
from erpnext.controllers.item_variant import create_variant
from erpnext.manufacturing.doctype.production_plan.production_plan import (
get_completed_production_plans,
get_items_for_material_requests,
get_sales_orders,
get_warehouse_list,
@ -1050,6 +1051,102 @@ class TestProductionPlan(FrappeTestCase):
self.assertEqual(after_qty, before_qty)
def test_resered_qty_for_production_plan_for_work_order(self):
from erpnext.stock.utils import get_or_make_bin
bin_name = get_or_make_bin("Raw Material Item 1", "_Test Warehouse - _TC")
before_qty = flt(frappe.db.get_value("Bin", bin_name, "reserved_qty_for_production_plan"))
pln = create_production_plan(item_code="Test Production Item 1")
bin_name = get_or_make_bin("Raw Material Item 1", "_Test Warehouse - _TC")
after_qty = flt(frappe.db.get_value("Bin", bin_name, "reserved_qty_for_production_plan"))
self.assertEqual(after_qty - before_qty, 1)
pln.make_work_order()
work_orders = []
for row in frappe.get_all("Work Order", filters={"production_plan": pln.name}, fields=["name"]):
wo_doc = frappe.get_doc("Work Order", row.name)
wo_doc.source_warehouse = "_Test Warehouse - _TC"
wo_doc.wip_warehouse = "_Test Warehouse 1 - _TC"
wo_doc.fg_warehouse = "_Test Warehouse - _TC"
for d in wo_doc.required_items:
d.source_warehouse = "_Test Warehouse - _TC"
make_stock_entry(
item_code=d.item_code,
qty=d.required_qty,
rate=100,
target="_Test Warehouse - _TC",
)
wo_doc.submit()
work_orders.append(wo_doc)
bin_name = get_or_make_bin("Raw Material Item 1", "_Test Warehouse - _TC")
after_qty = flt(frappe.db.get_value("Bin", bin_name, "reserved_qty_for_production_plan"))
self.assertEqual(after_qty, before_qty)
rm_work_order = None
for wo_doc in work_orders:
for d in wo_doc.required_items:
if d.item_code == "Raw Material Item 1":
rm_work_order = wo_doc
break
if rm_work_order:
s = frappe.get_doc(make_se_from_wo(rm_work_order.name, "Material Transfer for Manufacture", 1))
s.submit()
bin_name = get_or_make_bin("Raw Material Item 1", "_Test Warehouse - _TC")
after_qty = flt(frappe.db.get_value("Bin", bin_name, "reserved_qty_for_production_plan"))
self.assertEqual(after_qty, before_qty)
def test_resered_qty_for_production_plan_for_less_rm_qty(self):
from erpnext.stock.utils import get_or_make_bin
bin_name = get_or_make_bin("Raw Material Item 1", "_Test Warehouse - _TC")
before_qty = flt(frappe.db.get_value("Bin", bin_name, "reserved_qty_for_production_plan"))
pln = create_production_plan(item_code="Test Production Item 1", planned_qty=10)
bin_name = get_or_make_bin("Raw Material Item 1", "_Test Warehouse - _TC")
after_qty = flt(frappe.db.get_value("Bin", bin_name, "reserved_qty_for_production_plan"))
self.assertEqual(after_qty - before_qty, 10)
pln.make_work_order()
plans = []
for row in frappe.get_all("Work Order", filters={"production_plan": pln.name}, fields=["name"]):
wo_doc = frappe.get_doc("Work Order", row.name)
wo_doc.source_warehouse = "_Test Warehouse - _TC"
wo_doc.wip_warehouse = "_Test Warehouse 1 - _TC"
wo_doc.fg_warehouse = "_Test Warehouse - _TC"
for d in wo_doc.required_items:
d.source_warehouse = "_Test Warehouse - _TC"
d.required_qty -= 5
make_stock_entry(
item_code=d.item_code,
qty=d.required_qty,
rate=100,
target="_Test Warehouse - _TC",
)
wo_doc.submit()
plans.append(pln.name)
bin_name = get_or_make_bin("Raw Material Item 1", "_Test Warehouse - _TC")
after_qty = flt(frappe.db.get_value("Bin", bin_name, "reserved_qty_for_production_plan"))
self.assertEqual(after_qty, before_qty)
completed_plans = get_completed_production_plans()
for plan in plans:
self.assertTrue(plan in completed_plans)
def test_resered_qty_for_production_plan_for_material_requests_with_multi_UOM(self):
from erpnext.stock.utils import get_or_make_bin
@ -1177,6 +1274,64 @@ class TestProductionPlan(FrappeTestCase):
if row.item_code == "SubAssembly2 For SUB Test":
self.assertEqual(row.quantity, 10)
def test_transfer_and_purchase_mrp_for_purchase_uom(self):
from erpnext.manufacturing.doctype.bom.test_bom import create_nested_bom
from erpnext.stock.doctype.warehouse.test_warehouse import create_warehouse
bom_tree = {
"Test FG Item INK PEN": {
"Test RM Item INK": {},
}
}
parent_bom = create_nested_bom(bom_tree, prefix="")
if not frappe.db.exists("UOM Conversion Detail", {"parent": "Test RM Item INK", "uom": "Kg"}):
doc = frappe.get_doc("Item", "Test RM Item INK")
doc.purchase_uom = "Kg"
doc.append("uoms", {"uom": "Kg", "conversion_factor": 0.5})
doc.save()
wh1 = create_warehouse("PNE Warehouse", company="_Test Company")
wh2 = create_warehouse("MBE Warehouse", company="_Test Company")
mrp_warhouse = create_warehouse("MRPBE Warehouse", company="_Test Company")
make_stock_entry(
item_code="Test RM Item INK",
qty=2,
rate=100,
target=wh1,
)
make_stock_entry(
item_code="Test RM Item INK",
qty=2,
rate=100,
target=wh2,
)
plan = create_production_plan(
item_code=parent_bom.item,
planned_qty=10,
do_not_submit=1,
warehouse="_Test Warehouse - _TC",
)
plan.for_warehouse = mrp_warhouse
items = get_items_for_material_requests(
plan.as_dict(), warehouses=[{"warehouse": wh1}, {"warehouse": wh2}]
)
for row in items:
row = frappe._dict(row)
if row.material_request_type == "Material Transfer":
self.assertTrue(row.from_warehouse in [wh1, wh2])
self.assertEqual(row.quantity, 2)
if row.material_request_type == "Purchase":
self.assertTrue(row.warehouse == mrp_warhouse)
self.assertEqual(row.quantity, 12)
def create_production_plan(**args):
"""

View File

@ -358,10 +358,10 @@ class WorkOrder(Document):
else:
self.update_work_order_qty_in_so()
self.update_ordered_qty()
self.update_reserved_qty_for_production()
self.update_completed_qty_in_material_request()
self.update_planned_qty()
self.update_ordered_qty()
self.create_job_card()
def on_cancel(self):
@ -1513,22 +1513,26 @@ def create_pick_list(source_name, target_doc=None, for_qty=None):
def get_reserved_qty_for_production(
item_code: str, warehouse: str, check_production_plan: bool = False
item_code: str,
warehouse: str,
completed_production_plans: list = None,
check_production_plan: bool = False,
) -> float:
"""Get total reserved quantity for any item in specified warehouse"""
wo = frappe.qb.DocType("Work Order")
wo_item = frappe.qb.DocType("Work Order Item")
if check_production_plan:
qty_field = wo_item.required_qty
else:
qty_field = Case()
qty_field = qty_field.when(wo.skip_transfer == 0, wo_item.required_qty - wo_item.transferred_qty)
qty_field = qty_field.else_(wo_item.required_qty - wo_item.consumed_qty)
query = (
frappe.qb.from_(wo)
.from_(wo_item)
.select(
Sum(
Case()
.when(wo.skip_transfer == 0, wo_item.required_qty - wo_item.transferred_qty)
.else_(wo_item.required_qty - wo_item.consumed_qty)
)
)
.select(Sum(qty_field))
.where(
(wo_item.item_code == item_code)
& (wo_item.parent == wo.name)
@ -1545,6 +1549,9 @@ def get_reserved_qty_for_production(
if check_production_plan:
query = query.where(wo.production_plan.isnotnull())
if completed_production_plans:
query = query.where(wo.production_plan.notin(completed_production_plans))
return query.run()[0][0] or 0.0

View File

@ -70,6 +70,7 @@ class Project(Document):
tmp_task_details.append(template_task_details)
task = self.create_task_from_template(template_task_details)
project_tasks.append(task)
self.dependency_mapping(tmp_task_details, project_tasks)
def create_task_from_template(self, task_details):
@ -108,36 +109,28 @@ class Project(Document):
def dependency_mapping(self, template_tasks, project_tasks):
for project_task in project_tasks:
if project_task.get("template_task"):
template_task = frappe.get_doc("Task", project_task.template_task)
else:
template_task = list(filter(lambda x: x.subject == project_task.subject, template_tasks))[0]
template_task = frappe.get_doc("Task", template_task.name)
template_task = frappe.get_doc("Task", project_task.template_task)
self.check_depends_on_value(template_task, project_task, project_tasks)
self.check_for_parent_tasks(template_task, project_task, project_tasks)
def check_depends_on_value(self, template_task, project_task, project_tasks):
if template_task.get("depends_on") and not project_task.get("depends_on"):
project_template_map = {pt.template_task: pt for pt in project_tasks}
for child_task in template_task.get("depends_on"):
child_task_subject = frappe.db.get_value("Task", child_task.task, "subject")
corresponding_project_task = list(
filter(lambda x: x.subject == child_task_subject, project_tasks)
)
if len(corresponding_project_task):
if project_template_map and project_template_map.get(child_task.task):
project_task.reload() # reload, as it might have been updated in the previous iteration
project_task.append("depends_on", {"task": corresponding_project_task[0].name})
project_task.append("depends_on", {"task": project_template_map.get(child_task.task).name})
project_task.save()
def check_for_parent_tasks(self, template_task, project_task, project_tasks):
if template_task.get("parent_task") and not project_task.get("parent_task"):
parent_task_subject = frappe.db.get_value("Task", template_task.get("parent_task"), "subject")
corresponding_project_task = list(
filter(lambda x: x.subject == parent_task_subject, project_tasks)
)
if len(corresponding_project_task):
project_task.parent_task = corresponding_project_task[0].name
project_task.save()
for pt in project_tasks:
if pt.template_task == template_task.parent_task:
project_task.parent_task = pt.name
project_task.save()
break
def is_row_updated(self, row, existing_task_data, fields):
if self.get("__islocal") or not existing_task_data:

View File

@ -60,7 +60,6 @@
"fieldname": "subject",
"fieldtype": "Data",
"in_global_search": 1,
"in_list_view": 1,
"in_standard_filter": 1,
"label": "Subject",
"reqd": 1,
@ -140,7 +139,6 @@
"fieldname": "parent_task",
"fieldtype": "Link",
"ignore_user_permissions": 1,
"in_list_view": 1,
"label": "Parent Task",
"options": "Task",
"search_index": 1
@ -398,7 +396,7 @@
"is_tree": 1,
"links": [],
"max_attachments": 5,
"modified": "2023-09-06 13:52:05.861175",
"modified": "2023-09-28 13:52:05.861175",
"modified_by": "Administrator",
"module": "Projects",
"name": "Task",

View File

@ -135,7 +135,15 @@ erpnext.taxes_and_totals = class TaxesAndTotals extends erpnext.payments {
}
else {
// allow for '0' qty on Credit/Debit notes
let qty = item.qty || (me.frm.doc.is_debit_note ? 1 : -1);
let qty = flt(item.qty);
if (!qty) {
qty = (me.frm.doc.is_debit_note ? 1 : -1);
if (me.frm.doc.doctype !== "Purchase Receipt" && me.frm.doc.is_return === 1) {
// In case of Purchase Receipt, qty can be 0 if all items are rejected
qty = flt(item.qty);
}
}
item.net_amount = item.amount = flt(item.rate * qty, precision("amount", item));
}

View File

@ -6,8 +6,10 @@ erpnext.financial_statements = {
if (data && column.fieldname=="account") {
value = data.account_name || value;
column.link_onclick =
"erpnext.financial_statements.open_general_ledger(" + JSON.stringify(data) + ")";
if (data.account) {
column.link_onclick =
"erpnext.financial_statements.open_general_ledger(" + JSON.stringify(data) + ")";
}
column.is_tree = true;
}

View File

@ -10,7 +10,7 @@ from erpnext import get_region
def check_deletion_permission(doc, method):
region = get_region(doc.company)
if region in ["Nepal", "France"] and doc.docstatus != 0:
if region in ["Nepal"] and doc.docstatus != 0:
frappe.throw(_("Deletion is not permitted for country {0}").format(region))
@ -20,7 +20,7 @@ def create_transaction_log(doc, method):
Called on submit of Sales Invoice and Payment Entry.
"""
region = get_region()
if region not in ["France", "Germany"]:
if region not in ["Germany"]:
return
data = str(doc.as_dict())

View File

@ -1,5 +0,0 @@
{% if address_line1 %}{{ address_line1 }}{% endif -%}
{% if address_line2 %}<br>{{ address_line2 }}{% endif -%}
{% if pincode %}<br>{{ pincode }}{% endif -%}
{% if city %} {{ city }}{% endif -%}
{% if country %}<br>{{ country }}{% endif -%}

View File

@ -1,30 +0,0 @@
# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors
# License: GNU General Public License v3. See license.txt
import frappe
from frappe.custom.doctype.custom_field.custom_field import create_custom_fields
def setup(company=None, patch=True):
make_custom_fields()
add_custom_roles_for_reports()
def make_custom_fields():
custom_fields = {
"Company": [
dict(fieldname="siren_number", label="SIREN Number", fieldtype="Data", insert_after="website")
]
}
create_custom_fields(custom_fields)
def add_custom_roles_for_reports():
report_name = "Fichier des Ecritures Comptables [FEC]"
if not frappe.db.get_value("Custom Role", dict(report=report_name)):
frappe.get_doc(
dict(doctype="Custom Role", report=report_name, roles=[dict(role="Accounts Manager")])
).insert()

View File

@ -1,8 +0,0 @@
# Copyright (c) 2018, Frappe Technologies and contributors
# For license information, please see license.txt
# don't remove this function it is used in tests
def test_method():
"""test function"""
return "overridden"

View File

@ -1,97 +0,0 @@
// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors
// For license information, please see license.txt
frappe.query_reports["Fichier des Ecritures Comptables [FEC]"] = {
"filters": [
{
"fieldname": "company",
"label": __("Company"),
"fieldtype": "Link",
"options": "Company",
"default": frappe.defaults.get_user_default("Company"),
"reqd": 1
},
{
"fieldname": "fiscal_year",
"label": __("Fiscal Year"),
"fieldtype": "Link",
"options": "Fiscal Year",
"default": erpnext.utils.get_fiscal_year(frappe.datetime.get_today()),
"reqd": 1
}
],
onload: function(query_report) {
query_report.page.add_inner_button(__("Export"), function() {
fec_export(query_report);
});
query_report.add_make_chart_button = function() {
//
};
query_report.export_report = function() {
fec_export(query_report);
};
}
};
let fec_export = function(query_report) {
const fiscal_year = query_report.get_values().fiscal_year;
const company = query_report.get_values().company;
frappe.db.get_value("Company", company, "siren_number", (value) => {
const company_data = value.siren_number;
if (company_data === null || company_data === undefined) {
frappe.msgprint(__("Please register the SIREN number in the company information file"));
} else {
frappe.db.get_value("Fiscal Year", fiscal_year, "year_end_date", (r) => {
const fy = r.year_end_date;
const title = company_data + "FEC" + moment(fy).format('YYYYMMDD');
const column_row = query_report.columns.map(col => col.label);
const column_data = query_report.get_data_for_csv(false);
const result = [column_row].concat(column_data);
downloadify(result, null, title);
});
}
});
};
let downloadify = function(data, roles, title) {
if (roles && roles.length && !has_common(roles, roles)) {
frappe.msgprint(__("Export not allowed. You need {0} role to export.", [frappe.utils.comma_or(roles)]));
return;
}
const filename = title + ".txt";
let csv_data = to_tab_csv(data);
const a = document.createElement('a');
if ("download" in a) {
// Used Blob object, because it can handle large files
let blob_object = new Blob([csv_data], {
type: 'text/csv;charset=UTF-8'
});
a.href = URL.createObjectURL(blob_object);
a.download = filename;
} else {
// use old method
a.href = 'data:attachment/csv,' + encodeURIComponent(csv_data);
a.download = filename;
a.target = "_blank";
}
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
};
let to_tab_csv = function(data) {
let res = [];
$.each(data, function(i, row) {
res.push(row.join("\t"));
});
return res.join("\n");
};

View File

@ -1,19 +0,0 @@
{
"add_total_row": 0,
"apply_user_permissions": 0,
"creation": "2018-01-10 15:10:16.650129",
"disabled": 0,
"docstatus": 0,
"doctype": "Report",
"idx": 0,
"is_standard": "Yes",
"modified": "2018-01-11 10:27:25.595485",
"modified_by": "Administrator",
"module": "Regional",
"name": "Fichier des Ecritures Comptables [FEC]",
"owner": "Administrator",
"ref_doctype": "GL Entry",
"report_name": "Fichier des Ecritures Comptables [FEC]",
"report_type": "Script Report",
"roles": []
}

View File

@ -1,339 +0,0 @@
# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors
# For license information, please see license.txt
import re
import frappe
from frappe import _
from frappe.utils import format_datetime
COLUMNS = [
{
"label": "JournalCode",
"fieldname": "JournalCode",
"fieldtype": "Data",
"width": 90,
},
{
"label": "JournalLib",
"fieldname": "JournalLib",
"fieldtype": "Data",
"width": 90,
},
{
"label": "EcritureNum",
"fieldname": "EcritureNum",
"fieldtype": "Data",
"width": 90,
},
{
"label": "EcritureDate",
"fieldname": "EcritureDate",
"fieldtype": "Data",
"width": 90,
},
{
"label": "CompteNum",
"fieldname": "CompteNum",
"fieldtype": "Link",
"options": "Account",
"width": 100,
},
{
"label": "CompteLib",
"fieldname": "CompteLib",
"fieldtype": "Link",
"options": "Account",
"width": 200,
},
{
"label": "CompAuxNum",
"fieldname": "CompAuxNum",
"fieldtype": "Data",
"width": 90,
},
{
"label": "CompAuxLib",
"fieldname": "CompAuxLib",
"fieldtype": "Data",
"width": 90,
},
{
"label": "PieceRef",
"fieldname": "PieceRef",
"fieldtype": "Data",
"width": 90,
},
{
"label": "PieceDate",
"fieldname": "PieceDate",
"fieldtype": "Data",
"width": 90,
},
{
"label": "EcritureLib",
"fieldname": "EcritureLib",
"fieldtype": "Data",
"width": 90,
},
{
"label": "Debit",
"fieldname": "Debit",
"fieldtype": "Data",
"width": 90,
},
{
"label": "Credit",
"fieldname": "Credit",
"fieldtype": "Data",
"width": 90,
},
{
"label": "EcritureLet",
"fieldname": "EcritureLet",
"fieldtype": "Data",
"width": 90,
},
{
"label": "DateLet",
"fieldname": "DateLet",
"fieldtype": "Data",
"width": 90,
},
{
"label": "ValidDate",
"fieldname": "ValidDate",
"fieldtype": "Data",
"width": 90,
},
{
"label": "Montantdevise",
"fieldname": "Montantdevise",
"fieldtype": "Data",
"width": 90,
},
{
"label": "Idevise",
"fieldname": "Idevise",
"fieldtype": "Data",
"width": 90,
},
]
def execute(filters=None):
validate_filters(filters)
return COLUMNS, get_result(
company=filters["company"],
fiscal_year=filters["fiscal_year"],
)
def validate_filters(filters):
if not filters.get("company"):
frappe.throw(_("{0} is mandatory").format(_("Company")))
if not filters.get("fiscal_year"):
frappe.throw(_("{0} is mandatory").format(_("Fiscal Year")))
def get_gl_entries(company, fiscal_year):
gle = frappe.qb.DocType("GL Entry")
sales_invoice = frappe.qb.DocType("Sales Invoice")
purchase_invoice = frappe.qb.DocType("Purchase Invoice")
journal_entry = frappe.qb.DocType("Journal Entry")
payment_entry = frappe.qb.DocType("Payment Entry")
customer = frappe.qb.DocType("Customer")
supplier = frappe.qb.DocType("Supplier")
employee = frappe.qb.DocType("Employee")
debit = frappe.query_builder.functions.Sum(gle.debit).as_("debit")
credit = frappe.query_builder.functions.Sum(gle.credit).as_("credit")
debit_currency = frappe.query_builder.functions.Sum(gle.debit_in_account_currency).as_(
"debitCurr"
)
credit_currency = frappe.query_builder.functions.Sum(gle.credit_in_account_currency).as_(
"creditCurr"
)
query = (
frappe.qb.from_(gle)
.left_join(sales_invoice)
.on(gle.voucher_no == sales_invoice.name)
.left_join(purchase_invoice)
.on(gle.voucher_no == purchase_invoice.name)
.left_join(journal_entry)
.on(gle.voucher_no == journal_entry.name)
.left_join(payment_entry)
.on(gle.voucher_no == payment_entry.name)
.left_join(customer)
.on(gle.party == customer.name)
.left_join(supplier)
.on(gle.party == supplier.name)
.left_join(employee)
.on(gle.party == employee.name)
.select(
gle.posting_date.as_("GlPostDate"),
gle.name.as_("GlName"),
gle.account,
gle.transaction_date,
debit,
credit,
debit_currency,
credit_currency,
gle.voucher_type,
gle.voucher_no,
gle.against_voucher_type,
gle.against_voucher,
gle.account_currency,
gle.against,
gle.party_type,
gle.party,
sales_invoice.name.as_("InvName"),
sales_invoice.title.as_("InvTitle"),
sales_invoice.posting_date.as_("InvPostDate"),
purchase_invoice.name.as_("PurName"),
purchase_invoice.title.as_("PurTitle"),
purchase_invoice.posting_date.as_("PurPostDate"),
journal_entry.cheque_no.as_("JnlRef"),
journal_entry.posting_date.as_("JnlPostDate"),
journal_entry.title.as_("JnlTitle"),
payment_entry.name.as_("PayName"),
payment_entry.posting_date.as_("PayPostDate"),
payment_entry.title.as_("PayTitle"),
customer.customer_name,
customer.name.as_("cusName"),
supplier.supplier_name,
supplier.name.as_("supName"),
employee.employee_name,
employee.name.as_("empName"),
)
.where((gle.company == company) & (gle.fiscal_year == fiscal_year))
.groupby(gle.voucher_type, gle.voucher_no, gle.account)
.orderby(gle.posting_date, gle.voucher_no)
)
return query.run(as_dict=True)
def get_result(company, fiscal_year):
data = get_gl_entries(company, fiscal_year)
result = []
company_currency = frappe.get_cached_value("Company", company, "default_currency")
accounts = frappe.get_all(
"Account", filters={"Company": company}, fields=["name", "account_number"]
)
for d in data:
JournalCode = re.split("-|/|[0-9]", d.get("voucher_no"))[0]
if d.get("voucher_no").startswith("{0}-".format(JournalCode)) or d.get("voucher_no").startswith(
"{0}/".format(JournalCode)
):
EcritureNum = re.split("-|/", d.get("voucher_no"))[1]
else:
EcritureNum = re.search(r"{0}(\d+)".format(JournalCode), d.get("voucher_no"), re.IGNORECASE)[1]
EcritureDate = format_datetime(d.get("GlPostDate"), "yyyyMMdd")
account_number = [
account.account_number for account in accounts if account.name == d.get("account")
]
if account_number[0] is not None:
CompteNum = account_number[0]
else:
frappe.throw(
_(
"Account number for account {0} is not available.<br> Please setup your Chart of Accounts correctly."
).format(d.get("account"))
)
if d.get("party_type") == "Customer":
CompAuxNum = d.get("cusName")
CompAuxLib = d.get("customer_name")
elif d.get("party_type") == "Supplier":
CompAuxNum = d.get("supName")
CompAuxLib = d.get("supplier_name")
elif d.get("party_type") == "Employee":
CompAuxNum = d.get("empName")
CompAuxLib = d.get("employee_name")
elif d.get("party_type") == "Student":
CompAuxNum = d.get("stuName")
CompAuxLib = d.get("student_name")
elif d.get("party_type") == "Member":
CompAuxNum = d.get("memName")
CompAuxLib = d.get("member_name")
else:
CompAuxNum = ""
CompAuxLib = ""
ValidDate = format_datetime(d.get("GlPostDate"), "yyyyMMdd")
PieceRef = d.get("voucher_no") or "Sans Reference"
# EcritureLib is the reference title unless it is an opening entry
if d.get("is_opening") == "Yes":
EcritureLib = _("Opening Entry Journal")
if d.get("voucher_type") == "Sales Invoice":
EcritureLib = d.get("InvTitle")
elif d.get("voucher_type") == "Purchase Invoice":
EcritureLib = d.get("PurTitle")
elif d.get("voucher_type") == "Journal Entry":
EcritureLib = d.get("JnlTitle")
elif d.get("voucher_type") == "Payment Entry":
EcritureLib = d.get("PayTitle")
else:
EcritureLib = d.get("voucher_type")
PieceDate = format_datetime(d.get("GlPostDate"), "yyyyMMdd")
debit = "{:.2f}".format(d.get("debit")).replace(".", ",")
credit = "{:.2f}".format(d.get("credit")).replace(".", ",")
Idevise = d.get("account_currency")
if Idevise != company_currency:
Montantdevise = (
"{:.2f}".format(d.get("debitCurr")).replace(".", ",")
if d.get("debitCurr") != 0
else "{:.2f}".format(d.get("creditCurr")).replace(".", ",")
)
else:
Montantdevise = (
"{:.2f}".format(d.get("debit")).replace(".", ",")
if d.get("debit") != 0
else "{:.2f}".format(d.get("credit")).replace(".", ",")
)
row = [
JournalCode,
d.get("voucher_type"),
EcritureNum,
EcritureDate,
CompteNum,
d.get("account"),
CompAuxNum,
CompAuxLib,
PieceRef,
PieceDate,
EcritureLib,
debit,
credit,
"",
"",
ValidDate,
Montantdevise,
Idevise,
]
result.append(row)
return result

View File

@ -138,7 +138,7 @@ frappe.ui.form.on("Customer", {
// custom buttons
frm.add_custom_button(__('Accounts Receivable'), function () {
frappe.set_route('query-report', 'Accounts Receivable', {customer:frm.doc.name});
frappe.set_route('query-report', 'Accounts Receivable', { party_type: "Customer", party: frm.doc.name });
}, __('View'));
frm.add_custom_button(__('Accounting Ledger'), function () {

View File

@ -235,6 +235,7 @@
},
{
"collapsible": 1,
"collapsible_depends_on": "eval: doc.margin_type || doc.discount_amount",
"fieldname": "discount_and_margin",
"fieldtype": "Section Break",
"label": "Discount and Margin"
@ -666,7 +667,7 @@
"idx": 1,
"istable": 1,
"links": [],
"modified": "2023-02-06 11:00:07.042364",
"modified": "2023-09-26 13:42:11.410294",
"modified_by": "Administrator",
"module": "Selling",
"name": "Quotation Item",

View File

@ -121,6 +121,7 @@ class TestCurrencyExchange(unittest.TestCase):
# Update Currency Exchange Rate
settings = frappe.get_single("Currency Exchange Settings")
settings.service_provider = "exchangerate.host"
settings.access_key = "12345667890"
settings.save()
# Update exchange

View File

@ -616,6 +616,7 @@
"fieldname": "relieving_date",
"fieldtype": "Date",
"label": "Relieving Date",
"no_copy": 1,
"mandatory_depends_on": "eval:doc.status == \"Left\"",
"oldfieldname": "relieving_date",
"oldfieldtype": "Date"
@ -822,7 +823,7 @@
"idx": 24,
"image_field": "image",
"links": [],
"modified": "2023-03-30 15:57:05.174592",
"modified": "2023-10-04 10:57:05.174592",
"modified_by": "Administrator",
"module": "Setup",
"name": "Employee",
@ -870,4 +871,4 @@
"sort_order": "DESC",
"states": [],
"title_field": "employee_name"
}
}

View File

@ -157,9 +157,14 @@
},
"Botswana": {
"Botswana Tax": {
"Botswana Tax 14%": {
"account_name": "VAT",
"tax_rate": 12.00
"tax_rate": 14.00
},
"Botswana Tax 12%": {
"account_name": "VAT",
"tax_rate": 12.00,
"default": 1
}
},

View File

@ -37,6 +37,12 @@ frappe.ui.form.on("Purchase Receipt", {
}
});
frm.set_query("wip_composite_asset", "items", function() {
return {
filters: {'is_composite_asset': 1, 'docstatus': 0 }
}
});
frm.set_query("taxes_and_charges", function() {
return {
filters: {'company': frm.doc.company }

View File

@ -464,6 +464,7 @@
"depends_on": "eval:doc.is_subcontracted",
"fieldname": "supplier_warehouse",
"fieldtype": "Link",
"ignore_user_permissions": 1,
"label": "Supplier Warehouse",
"no_copy": 1,
"oldfieldname": "supplier_warehouse",
@ -1241,7 +1242,7 @@
"idx": 261,
"is_submittable": 1,
"links": [],
"modified": "2023-07-04 17:23:17.025390",
"modified": "2023-10-01 21:00:44.556816",
"modified_by": "Administrator",
"module": "Stock",
"name": "Purchase Receipt",

View File

@ -956,6 +956,10 @@ def update_billing_percentage(pr_doc, update_modified=True, adjust_incoming_rate
total_amount += total_billable_amount
total_billed_amount += flt(item.billed_amt)
if pr_doc.get("is_return") and not total_amount and total_billed_amount:
total_amount = total_billed_amount
if adjust_incoming_rate:
adjusted_amt = 0.0
if item.billed_amt and item.amount:

View File

@ -2060,6 +2060,32 @@ class TestPurchaseReceipt(FrappeTestCase):
company.enable_provisional_accounting_for_non_stock_items = 0
company.save()
def test_purchase_return_status_with_debit_note(self):
pr = make_purchase_receipt(rejected_qty=10, received_qty=10, rate=100, do_not_save=1)
pr.items[0].qty = 0
pr.items[0].stock_qty = 0
pr.submit()
return_pr = make_purchase_receipt(
is_return=1,
return_against=pr.name,
qty=0,
rejected_qty=10 * -1,
received_qty=10 * -1,
do_not_save=1,
)
return_pr.items[0].qty = 0.0
return_pr.items[0].stock_qty = 0.0
return_pr.submit()
self.assertEqual(return_pr.status, "To Bill")
pi = make_purchase_invoice(return_pr.name)
pi.submit()
return_pr.reload()
self.assertEqual(return_pr.status, "Completed")
def prepare_data_for_internal_transfer():
from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_internal_supplier

View File

@ -117,6 +117,7 @@
"accounting_details_section",
"expense_account",
"item_tax_rate",
"wip_composite_asset",
"column_break_102",
"provisional_expense_account",
"accounting_dimensions_section",
@ -1056,12 +1057,18 @@
"fieldname": "add_serial_batch_bundle",
"fieldtype": "Button",
"label": "Add Serial / Batch No"
},
{
"fieldname": "wip_composite_asset",
"fieldtype": "Link",
"label": "WIP Composite Asset",
"options": "Asset"
}
],
"idx": 1,
"istable": 1,
"links": [],
"modified": "2023-08-11 16:16:16.504549",
"modified": "2023-10-03 21:11:50.547261",
"modified_by": "Administrator",
"module": "Stock",
"name": "Purchase Receipt Item",

View File

@ -1464,8 +1464,6 @@ def get_valuation_rate(
if not company:
company = frappe.get_cached_value("Warehouse", warehouse, "company")
last_valuation_rate = None
# Get moving average rate of a specific batch number
if warehouse and serial_and_batch_bundle:
batch_obj = BatchNoValuation(
@ -1482,21 +1480,18 @@ def get_valuation_rate(
return batch_obj.get_incoming_rate()
# Get valuation rate from last sle for the same item and warehouse
if not last_valuation_rate or last_valuation_rate[0][0] is None:
last_valuation_rate = frappe.db.sql(
"""select valuation_rate
from `tabStock Ledger Entry` force index (item_warehouse)
where
item_code = %s
AND warehouse = %s
AND valuation_rate >= 0
AND is_cancelled = 0
AND NOT (voucher_no = %s AND voucher_type = %s)
order by posting_date desc, posting_time desc, name desc limit 1""",
(item_code, warehouse, voucher_no, voucher_type),
)
if last_valuation_rate:
if last_valuation_rate := frappe.db.sql(
"""select valuation_rate
from `tabStock Ledger Entry` force index (item_warehouse)
where
item_code = %s
AND warehouse = %s
AND valuation_rate >= 0
AND is_cancelled = 0
AND NOT (voucher_no = %s AND voucher_type = %s)
order by posting_date desc, posting_time desc, name desc limit 1""",
(item_code, warehouse, voucher_no, voucher_type),
):
return flt(last_valuation_rate[0][0])
# If negative stock allowed, and item delivered without any incoming entry,

View File

@ -14,6 +14,3 @@ class TestInit(unittest.TestCase):
def test_regional_overrides(self):
frappe.flags.country = "Maldives"
self.assertEqual(test_method(), "original")
frappe.flags.country = "France"
self.assertEqual(test_method(), "overridden")

View File

@ -286,7 +286,6 @@ Auto Repeat,Outo Herhaal,
Auto repeat document updated,Outo-herhaal dokument opgedateer,
Automotive,Automotive,
Available,beskikbaar,
Available Leaves,Beskikbare blare,
Available Qty,Beskikbare hoeveelheid,
Available Selling,Beskikbaar verkoop,
Available for use date is required,Beskikbaar vir gebruik datum is nodig,
@ -1122,7 +1121,6 @@ Hub Category,Hub Kategorie,
Hub Sync ID,Hub-sinkronisasie-ID,
Human Resource,Menslike hulpbronne,
Human Resources,Menslike hulpbronne,
IFSC Code,IFSC-kode,
IGST Amount,IGST Bedrag,
IP Address,IP adres,
ITC Available (whether in full op part),ITC beskikbaar (of dit volledig is),
@ -1666,7 +1664,6 @@ Organization Name,Organisasie Naam,
Other,ander,
Other Reports,Ander verslae,
"Other outward supplies(Nil rated,Exempted)","Ander voorrade (nul beoordeel, vrygestel)",
Others,ander,
Out Qty,Uit Aantal,
Out Value,Uitwaarde,
Out of Order,Buite werking,
@ -2812,7 +2809,6 @@ Total (Credit),Totaal (Krediet),
Total (Without Tax),Totaal (Sonder Belasting),
Total Achieved,Totaal behaal,
Total Actual,Totaal Werklik,
Total Allocated Leaves,Totale toegekende blare,
Total Amount,Totale bedrag,
Total Amount Credited,Totale bedrag gekrediteer,
Total Applicable Charges in Purchase Receipt Items table must be same as Total Taxes and Charges,Totale Toepaslike Koste in Aankoopontvangste-items moet dieselfde wees as Totale Belasting en Heffings,
@ -2922,7 +2918,6 @@ Updating Variants...,Dateer variante op ...,
Upload your letter head and logo. (you can edit them later).,Laai jou briefhoof en logo op. (jy kan dit later wysig).,
Upper Income,Boonste Inkomste,
Use Sandbox,Gebruik Sandbox,
Used Leaves,Gebruikte Blare,
User,gebruiker,
User ID,Gebruikers-ID,
User ID not set for Employee {0},Gebruiker ID nie ingestel vir Werknemer {0},
@ -7949,12 +7944,10 @@ Payroll Cost Center,Loonkostekoste,
Approvers,Betogers,
The first Approver in the list will be set as the default Approver.,Die eerste goedkeuring in die lys sal as die standaard goedkeuring gestel word.,
Shift Request Approver,Goedkeuring vir skofversoek,
PAN Number,PAN-nommer,
Provident Fund Account,Voorsorgfondsrekening,
MICR Code,MICR-kode,
Repay unclaimed amount from salary,Betaal onopgeëiste bedrag terug van die salaris,
Deduction from salary,Aftrekking van salaris,
Expired Leaves,Verlore blare,
If this is not checked the loan by default will be considered as a Demand Loan,"As dit nie gekontroleer word nie, sal die lening by verstek as &#39;n vraaglening beskou word",
This account is used for booking loan repayments from the borrower and also disbursing loans to the borrower,Hierdie rekening word gebruik om lenings van die lener terug te betaal en ook om lenings aan die lener uit te betaal,
This account is capital account which is used to allocate capital for loan disbursal account ,Hierdie rekening is &#39;n kapitaalrekening wat gebruik word om kapitaal toe te ken vir die uitbetaling van lenings,
@ -8748,3 +8741,5 @@ Global Defaults,Globale verstek,
Is Mandatory,Is verpligtend,
WhatsApp,WhatsApp,
Make a call,Maak &#39;n oproep,
Approve,goed te keur,
Reject,verwerp,

Can't render this file because it is too large.

View File

@ -286,7 +286,6 @@ Auto Repeat,ራስ ቀጥል,
Auto repeat document updated,በቀጥታ ተዘምኗል,
Automotive,አውቶሞቲቭ,
Available,ይገኛል,
Available Leaves,የሚገኝ ቅጠሎች,
Available Qty,ይገኛል ብዛት,
Available Selling,ሊሸጥ የሚቻል,
Available for use date is required,ለመጠቀም ቀን ሊገኝ ይችላል,
@ -1122,7 +1121,6 @@ Hub Category,Hub ምድብ,
Hub Sync ID,የሃብ ማመሳሰል መታወቂያ,
Human Resource,የሰው ኃይል,
Human Resources,የሰው ሀይል አስተዳደር,
IFSC Code,የ IFSC ኮድ,
IGST Amount,IGST ሂሳብ,
IP Address,የአይፒ አድራሻ,
ITC Available (whether in full op part),ITC አለ (በሙሉ ኦፕሬም ክፍል ውስጥም ቢሆን),
@ -1666,7 +1664,6 @@ Organization Name,የድርጅት ስም,
Other,ሌላ,
Other Reports,ሌሎች ሪፖርቶች,
"Other outward supplies(Nil rated,Exempted)",ሌሎች የውጪ አቅርቦቶች (ኒል ደረጃ የተሰጠው ፣ ነፃ ...),
Others,ሌሎች,
Out Qty,ብዛት ውጪ,
Out Value,ውጪ ዋጋ,
Out of Order,ከትዕዛዝ ውጪ,
@ -2812,7 +2809,6 @@ Total (Credit),ጠቅላላ (ምንጭ),
Total (Without Tax),ጠቅላላ (ያለ ግብር),
Total Achieved,ጠቅላላ አሳክቷል,
Total Actual,ትክክለኛ ጠቅላላ,
Total Allocated Leaves,ጠቅላላ ድጐማዎችን,
Total Amount,አጠቃላይ ድምሩ,
Total Amount Credited,ጠቅላላ መጠን ተቀጠረ,
Total Applicable Charges in Purchase Receipt Items table must be same as Total Taxes and Charges,የግዢ ደረሰኝ ንጥሎች ሰንጠረዥ ውስጥ ጠቅላላ የሚመለከታቸው ክፍያዎች ጠቅላላ ግብሮች እና ክፍያዎች እንደ አንድ አይነት መሆን አለበት,
@ -2922,7 +2918,6 @@ Updating Variants...,ተለዋጮችን ማዘመን ...,
Upload your letter head and logo. (you can edit them later).,የእርስዎን ደብዳቤ ራስ እና አርማ ይስቀሉ. (ቆይተው አርትዕ ማድረግ ይችላሉ).,
Upper Income,የላይኛው ገቢ,
Use Sandbox,ይጠቀሙ ማጠሪያ,
Used Leaves,ጥቅም ላይ የዋሉ ቅጠሎች,
User,ተጠቃሚው,
User ID,የተጠቃሚው መለያ,
User ID not set for Employee {0},የተጠቃሚ መታወቂያ ሰራተኛ ለ ካልተዋቀረ {0},
@ -7949,12 +7944,10 @@ Payroll Cost Center,የደመወዝ ክፍያ ዋጋ ማእከል,
Approvers,አወዛጋቢ,
The first Approver in the list will be set as the default Approver.,በዝርዝሩ ውስጥ የመጀመሪያው አጽዳቂ እንደ ነባሪው ማጽደቂያ ይቀመጣል።,
Shift Request Approver,የሺፍት ጥያቄ ማጽደቅ,
PAN Number,የፓን ቁጥር,
Provident Fund Account,የፕሮቪደንት ፈንድ ሂሳብ,
MICR Code,MICR ኮድ,
Repay unclaimed amount from salary,ከደመወዝ ያልተጠየቀውን መጠን ይክፈሉ,
Deduction from salary,ከደመወዝ መቀነስ,
Expired Leaves,ጊዜው ያለፈባቸው ቅጠሎች,
If this is not checked the loan by default will be considered as a Demand Loan,ይህ ካልተረጋገጠ ብድሩ በነባሪነት እንደ ብድር ይቆጠራል,
This account is used for booking loan repayments from the borrower and also disbursing loans to the borrower,ይህ ሂሳብ ከተበዳሪው የብድር ክፍያዎችን ለማስያዝ እና እንዲሁም ለተበዳሪው ብድሮችን ለማሰራጨት ያገለግላል,
This account is capital account which is used to allocate capital for loan disbursal account ,ይህ አካውንት ለብድር ማስከፈያ ሂሳብ ካፒታል ለመመደብ የሚያገለግል የካፒታል ሂሳብ ነው,
@ -8748,3 +8741,5 @@ Global Defaults,ዓለም አቀፍ ነባሪዎች,
Is Mandatory,አስገዳጅ ነው,
WhatsApp,ዋትስአፕ,
Make a call,ደውል,
Approve,ማጽደቅ,
Reject,አይቀበሉ,

Can't render this file because it is too large.

View File

@ -286,7 +286,6 @@ Auto Repeat,تكرار تلقائي,
Auto repeat document updated,تكرار تلقائي للمستندات المحدثة,
Automotive,سيارات,
Available,متاح,
Available Leaves,المغادارت والاجازات المتاحة,
Available Qty,الكمية المتاحة,
Available Selling,المبيعات المتاحة,
Available for use date is required,مطلوب تاريخ متاح للاستخدام,
@ -1122,7 +1121,6 @@ Hub Category,فئة المحور,
Hub Sync ID,معرف مزامنة المحور,
Human Resource,Human Resource,
Human Resources,الموارد البشرية,
IFSC Code,رمز IFSC,
IGST Amount,كمية IGST,
IP Address,عنوان IP,
ITC Available (whether in full op part),مركز التجارة الدولية متاح (سواء في جزء المرجع الكامل),
@ -1666,7 +1664,6 @@ Organization Name,اسم المنظمة,
Other,آخر,
Other Reports,تقارير أخرى,
"Other outward supplies(Nil rated,Exempted)",اللوازم الخارجية الأخرى (بدون تقييم ، معفاة),
Others,بدلات أخرى,
Out Qty,كمية خارجة,
Out Value,القيمة الخارجه,
Out of Order,خارج عن السيطرة,
@ -2812,7 +2809,6 @@ Total (Credit),الإجمالي (الائتمان),
Total (Without Tax),الإجمالي (بدون ضريبة),
Total Achieved,الإجمالي المحقق,
Total Actual,الإجمالي الفعلي,
Total Allocated Leaves,مجموع الأوراق المخصصة,
Total Amount,الاعتماد الأساسي,
Total Amount Credited,مجموع المبلغ المعتمد,
Total Applicable Charges in Purchase Receipt Items table must be same as Total Taxes and Charges,مجموع الرسوم المطبقة في شراء طاولة إيصال عناصر يجب أن يكون نفس مجموع الضرائب والرسوم,
@ -2922,7 +2918,6 @@ Updating Variants...,جارٍ تحديث المتغيرات ...,
Upload your letter head and logo. (you can edit them later).,تحميل رئيس رسالتكم والشعار. (يمكنك تحريرها لاحقا).,
Upper Income,أعلى دخل,
Use Sandbox,استخدام ساندبوكس,
Used Leaves,مغادرات مستخدمة,
User,المستعمل,
User ID,تعريف المستخدم,
User ID not set for Employee {0},هوية المستخدم لم يتم تعيين موظف ل {0},
@ -7949,12 +7944,10 @@ Payroll Cost Center,مركز تكلفة الرواتب,
Approvers,الموافقون,
The first Approver in the list will be set as the default Approver.,سيتم تعيين الموافق الأول في القائمة باعتباره الموافق الافتراضي.,
Shift Request Approver,الموافق على طلب التحول,
PAN Number,رقم PAN,
Provident Fund Account,حساب صندوق الادخار,
MICR Code,كود MICR,
Repay unclaimed amount from salary,سداد المبلغ غير المطالب به من الراتب,
Deduction from salary,خصم من الراتب,
Expired Leaves,أوراق منتهية الصلاحية,
If this is not checked the loan by default will be considered as a Demand Loan,إذا لم يتم التحقق من ذلك ، فسيتم اعتبار القرض بشكل افتراضي كقرض تحت الطلب,
This account is used for booking loan repayments from the borrower and also disbursing loans to the borrower,يستخدم هذا الحساب لحجز أقساط سداد القرض من المقترض وأيضًا صرف القروض للمقترض,
This account is capital account which is used to allocate capital for loan disbursal account ,هذا الحساب هو حساب رأس المال الذي يستخدم لتخصيص رأس المال لحساب صرف القرض,
@ -8748,3 +8741,5 @@ Global Defaults,افتراضيات العالمية,
Is Mandatory,إلزامي,
WhatsApp,ال WhatsApp,
Make a call,إجراء مكالمة,
Approve,وافق,
Reject,رفض,

Can't render this file because it is too large.

View File

@ -286,7 +286,6 @@ Auto Repeat,Автоматично повтаряне,
Auto repeat document updated,Автоматичното повторение на документа е актуализиран,
Automotive,автомобилен,
Available,Наличен,
Available Leaves,Налични листа,
Available Qty,В наличност Количество,
Available Selling,Налични продажби,
Available for use date is required,Необходима е дата за употреба,
@ -1122,7 +1121,6 @@ Hub Category,Категория хъб,
Hub Sync ID,Идент,
Human Resource,Човешки ресурси,
Human Resources,Човешки ресурси,
IFSC Code,Кодекс на IFSC,
IGST Amount,IGST Сума,
IP Address,IP адрес,
ITC Available (whether in full op part),Наличен ITC (независимо дали в пълната част),
@ -1666,7 +1664,6 @@ Organization Name,Наименование на организацията,
Other,Друг,
Other Reports,Други справки,
"Other outward supplies(Nil rated,Exempted)","Други външни доставки (с нулева оценка, освободени)",
Others,Други,
Out Qty,Изх. Количество,
Out Value,Изх. стойност,
Out of Order,Извънредно,
@ -2812,7 +2809,6 @@ Total (Credit),Общо (кредит),
Total (Without Tax),Общо (без данъци),
Total Achieved,Общо постигнати,
Total Actual,Общо Край,
Total Allocated Leaves,Общо разпределени листа,
Total Amount,Обща сума,
Total Amount Credited,Общата сума е кредитирана,
Total Applicable Charges in Purchase Receipt Items table must be same as Total Taxes and Charges,"Общо приложими такси в Покупка получаване артикули маса трябва да са същите, както Общо данъци и такси",
@ -2922,7 +2918,6 @@ Updating Variants...,Актуализиране на варианти ...,
Upload your letter head and logo. (you can edit them later).,Качете ваш дизайн за заглавно писмо и лого. (Можете да ги редактирате по-късно).,
Upper Income,Upper подоходно,
Use Sandbox,Използвайте Sandbox,
Used Leaves,Използвани листа,
User,потребител,
User ID,User ID,
User ID not set for Employee {0},User ID не е конфигуриран за служител {0},
@ -7949,12 +7944,10 @@ Payroll Cost Center,Център за разходи за заплати,
Approvers,Одобряващи,
The first Approver in the list will be set as the default Approver.,Първият одобряващ в списъка ще бъде зададен като одобряващ по подразбиране.,
Shift Request Approver,Одобряващ заявка за смяна,
PAN Number,Номер на PAN,
Provident Fund Account,Провиден фонд,
MICR Code,MICR код,
Repay unclaimed amount from salary,Изплатете непотърсена сума от заплата,
Deduction from salary,Приспадане от заплата,
Expired Leaves,Листа с изтекъл срок на годност,
If this is not checked the loan by default will be considered as a Demand Loan,"Ако това не е отметнато, заемът по подразбиране ще се счита за кредит за търсене",
This account is used for booking loan repayments from the borrower and also disbursing loans to the borrower,"Тази сметка се използва за резервиране на изплащане на заеми от кредитополучателя, както и за изплащане на заеми на кредитополучателя",
This account is capital account which is used to allocate capital for loan disbursal account ,"Тази сметка е капиталова сметка, която се използва за разпределяне на капитал за сметка за оттегляне на заеми",
@ -8748,3 +8741,5 @@ Global Defaults,Глобални настройки по подразбиран
Is Mandatory,Задължително,
WhatsApp,WhatsApp,
Make a call,Обадете се,
Approve,одобрявам,
Reject,Отхвърляне,

Can't render this file because it is too large.

View File

@ -286,7 +286,6 @@ Auto Repeat,অটো পুনরাবৃত্তি,
Auto repeat document updated,স্বতঃ পুনরাবৃত্ত নথি আপডেট করা হয়েছে,
Automotive,স্বয়ংচালিত,
Available,উপলভ্য,
Available Leaves,উপলব্ধ পাতা,
Available Qty,প্রাপ্তিসাধ্য Qty,
Available Selling,উপলভ্য বিক্রি,
Available for use date is required,ব্যবহারের তারিখের জন্য উপলভ্য প্রয়োজন,
@ -1122,7 +1121,6 @@ Hub Category,হাব বিভাগ,
Hub Sync ID,হাব সিঙ্ক আইডি,
Human Resource,মানব সম্পদ,
Human Resources,মানব সম্পদ,
IFSC Code,আইএফসিসি কোড,
IGST Amount,IGST পরিমাণ,
IP Address,আইপি ঠিকানা,
ITC Available (whether in full op part),আইটিসি উপলব্ধ (সম্পূর্ণ বিকল্প অংশে থাকুক না কেন),
@ -1666,7 +1664,6 @@ Organization Name,প্রতিষ্ঠানের নাম,
Other,অন্যান্য,
Other Reports,অন্যান্য রিপোর্ট,
"Other outward supplies(Nil rated,Exempted)","অন্যান্য বাহ্যিক সরবরাহ (নিল রেটড, অব্যাহতিপ্রাপ্ত)",
Others,অন্যরা,
Out Qty,Qty আউট,
Out Value,আউট মূল্য,
Out of Order,অর্ডার আউট,
@ -2812,7 +2809,6 @@ Total (Credit),মোট (ক্রেডিট),
Total (Without Tax),মোট (কর ছাড়),
Total Achieved,মোট অর্জন,
Total Actual,প্রকৃত মোট,
Total Allocated Leaves,মোট বরাদ্দ পাতা,
Total Amount,মোট পরিমাণ,
Total Amount Credited,মোট পরিমাণ কৃতিত্ব,
Total Applicable Charges in Purchase Receipt Items table must be same as Total Taxes and Charges,ক্রয় রশিদ সামগ্রী টেবিলের মোট প্রযোজ্য চার্জ মোট কর ও চার্জ হিসাবে একই হতে হবে,
@ -2922,7 +2918,6 @@ Updating Variants...,বৈকল্পিকগুলি আপডেট কর
Upload your letter head and logo. (you can edit them later).,আপনার চিঠি মাথা এবং লোগো আপলোড করুন. (আপনি তাদের পরে সম্পাদনা করতে পারেন).,
Upper Income,আপার আয়,
Use Sandbox,ব্যবহারের স্যান্ডবক্স,
Used Leaves,ব্যবহৃত পাখি,
User,ব্যবহারকারী,
User ID,ব্যবহারকারী আইডি,
User ID not set for Employee {0},ইউজার আইডি কর্মচারী জন্য নির্ধারণ করে না {0},
@ -7949,12 +7944,10 @@ Payroll Cost Center,বেতন ব্যয় কেন্দ্র,
Approvers,বিতর্ক,
The first Approver in the list will be set as the default Approver.,তালিকার প্রথম অনুমোদিতটি ডিফল্ট অনুমোদনকারী হিসাবে সেট করা হবে।,
Shift Request Approver,শিফট অনুরোধ অনুমোদনকারী,
PAN Number,প্যান নম্বর,
Provident Fund Account,প্রভিডেন্ট ফান্ড অ্যাকাউন্ট,
MICR Code,এমআইসিআর কোড,
Repay unclaimed amount from salary,বেতন থেকে দায়হীন পরিমাণ পরিশোধ করুন ay,
Deduction from salary,বেতন থেকে ছাড়,
Expired Leaves,মেয়াদ শেষ হয়ে গেছে,
If this is not checked the loan by default will be considered as a Demand Loan,এটি যদি চেক না করা হয় তবে ডিফল্ট হিসাবে loanণকে ডিমান্ড anণ হিসাবে বিবেচনা করা হবে,
This account is used for booking loan repayments from the borrower and also disbursing loans to the borrower,এই অ্যাকাউন্টটি orণগ্রহীতা থেকে repণ পরিশোধের বুকিং এবং orণগ্রহীতাকে loansণ বিতরণের জন্য ব্যবহৃত হয়,
This account is capital account which is used to allocate capital for loan disbursal account ,এই অ্যাকাউন্টটি মূলধন অ্যাকাউন্ট যা disণ বিতরণ অ্যাকাউন্টের জন্য মূলধন বরাদ্দ করতে ব্যবহৃত হয়,
@ -8748,3 +8741,5 @@ Global Defaults,আন্তর্জাতিক ডিফল্ট,
Is Mandatory,আবশ্যক,
WhatsApp,হোয়াটসঅ্যাপ,
Make a call,ফোন করুন,
Approve,অনুমোদন করা,
Reject,প্রত্যাখ্যান,

Can't render this file because it is too large.

View File

@ -286,7 +286,6 @@ Auto Repeat,Auto Repeat,
Auto repeat document updated,Automatsko ponavljanje dokumenta je ažurirano,
Automotive,Automobilska industrija,
Available,Dostupno,
Available Leaves,Raspoložive liste,
Available Qty,Dostupno Količina,
Available Selling,Dostupna prodaja,
Available for use date is required,Potreban je datum upotrebe,
@ -1122,7 +1121,6 @@ Hub Category,Glavna kategorija,
Hub Sync ID,Hub Sync ID,
Human Resource,Human Resource,
Human Resources,Ljudski resursi,
IFSC Code,IFSC kod,
IGST Amount,IGST Iznos,
IP Address,IP adresa,
ITC Available (whether in full op part),Dostupan ITC (bilo u cjelini op. Dio),
@ -1666,7 +1664,6 @@ Organization Name,Naziv organizacije,
Other,Drugi,
Other Reports,Ostali izveštaji,
"Other outward supplies(Nil rated,Exempted)","Ostale vanjske zalihe (Nil ocijenjeno, Izuzeti)",
Others,Drugi,
Out Qty,Od kol,
Out Value,out vrijednost,
Out of Order,Ne radi,
@ -2812,7 +2809,6 @@ Total (Credit),Ukupno (kredit),
Total (Without Tax),Ukupno (bez poreza),
Total Achieved,Ukupno Ostvareni,
Total Actual,Ukupno Actual,
Total Allocated Leaves,Ukupno izdvojene liste,
Total Amount,Ukupan iznos,
Total Amount Credited,Ukupan iznos kredita,
Total Applicable Charges in Purchase Receipt Items table must be same as Total Taxes and Charges,Ukupno Primjenjivo Optužbe na račun za prodaju Predmeti sto mora biti isti kao Ukupni porezi i naknada,
@ -2922,7 +2918,6 @@ Updating Variants...,Ažuriranje varijanti ...,
Upload your letter head and logo. (you can edit them later).,Unos glavu pismo i logo. (Možete ih kasnije uređivanje).,
Upper Income,Viši Prihodi,
Use Sandbox,Koristite Sandbox,
Used Leaves,Korišćeni listovi,
User,User,
User ID,Korisnički ID,
User ID not set for Employee {0},Korisnik ID nije postavljen za zaposlenika {0},
@ -7949,12 +7944,10 @@ Payroll Cost Center,Centar troškova troškova zarada,
Approvers,Odobrivači,
The first Approver in the list will be set as the default Approver.,Prvi odobravatelj na listi postavit će se kao zadani odobravatelj.,
Shift Request Approver,Odobrivač zahtjeva za smjenom,
PAN Number,PAN broj,
Provident Fund Account,Račun osiguravajućeg fonda,
MICR Code,MICR kod,
Repay unclaimed amount from salary,Otplatite neiskorišteni iznos iz plate,
Deduction from salary,Odbitak od plate,
Expired Leaves,Isteklo lišće,
If this is not checked the loan by default will be considered as a Demand Loan,"Ako ovo nije potvrđeno, zajam će se prema zadanim postavkama smatrati zajmom na zahtjev",
This account is used for booking loan repayments from the borrower and also disbursing loans to the borrower,Ovaj račun koristi se za rezerviranje otplate zajma od zajmoprimca i za isplatu zajmova zajmoprimcu,
This account is capital account which is used to allocate capital for loan disbursal account ,Ovaj račun je račun kapitala koji se koristi za alokaciju kapitala za račun izdvajanja kredita,
@ -8748,3 +8741,5 @@ Global Defaults,Globalne zadane postavke,
Is Mandatory,Je obavezna,
WhatsApp,WhatsApp,
Make a call,Pozovite,
Approve,odobriti,
Reject,odbiti,

Can't render this file because it is too large.

View File

@ -286,7 +286,6 @@ Auto Repeat,Repetició automàtica,
Auto repeat document updated,S&#39;ha actualitzat el document de repetició automàtica,
Automotive,Automòbil,
Available,Disponible,
Available Leaves,Fulles disponibles,
Available Qty,Disponible Quantitat,
Available Selling,Venda disponible,
Available for use date is required,Disponible per a la data d&#39;ús,
@ -1122,7 +1121,6 @@ Hub Category,Categoria de concentrador,
Hub Sync ID,Identificador de sincronització del concentrador,
Human Resource,Recursos humans,
Human Resources,Recursos humans,
IFSC Code,Codi IFSC,
IGST Amount,Import de l&#39;IGST,
IP Address,Adreça IP,
ITC Available (whether in full op part),TIC disponible (en qualsevol part opcional),
@ -1666,7 +1664,6 @@ Organization Name,Nom de l'organització,
Other,Un altre,
Other Reports,Altres informes,
"Other outward supplies(Nil rated,Exempted)","Altres subministraments externs (Nil, eximitat)",
Others,Altres,
Out Qty,Quantitat de sortida,
Out Value,Valor fora,
Out of Order,No funciona,
@ -2812,7 +2809,6 @@ Total (Credit),Total (de crèdit),
Total (Without Tax),Total (sense impostos),
Total Achieved,Total aconseguit,
Total Actual,Actual total,
Total Allocated Leaves,Total Allocated Leaves,
Total Amount,Quantitat total,
Total Amount Credited,Import total acreditat,
Total Applicable Charges in Purchase Receipt Items table must be same as Total Taxes and Charges,Total d&#39;comissions aplicables en la compra Taula de rebuts Els articles han de ser iguals que les taxes totals i càrrecs,
@ -2922,7 +2918,6 @@ Updating Variants...,S&#39;estan actualitzant les variants ...,
Upload your letter head and logo. (you can edit them later).,Puja el teu cap lletra i logotip. (Pots editar més tard).,
Upper Income,Ingrés Alt,
Use Sandbox,ús Sandbox,
Used Leaves,Fulles utilitzades,
User,Usuari,
User ID,ID d'usuari,
User ID not set for Employee {0},ID d'usuari no entrat per l'Empleat {0},
@ -7949,12 +7944,10 @@ Payroll Cost Center,Centre de costos de nòmines,
Approvers,Aprovadors,
The first Approver in the list will be set as the default Approver.,El primer aprovador de la llista s&#39;establirà com a aprovador predeterminat.,
Shift Request Approver,Aprovador de sol·licituds de torn,
PAN Number,Número PAN,
Provident Fund Account,Compte de fons de previsió,
MICR Code,Codi MICR,
Repay unclaimed amount from salary,Reemborsar limport no reclamat del salari,
Deduction from salary,Deducció del salari,
Expired Leaves,Fulles caducades,
If this is not checked the loan by default will be considered as a Demand Loan,"Si no es comprova això, el préstec per defecte es considerarà un préstec a la demanda",
This account is used for booking loan repayments from the borrower and also disbursing loans to the borrower,Aquest compte sutilitza per reservar els pagaments de préstecs del prestatari i també per desemborsar préstecs al prestatari,
This account is capital account which is used to allocate capital for loan disbursal account ,Aquest compte és un compte de capital que sutilitza per assignar capital per al compte de desemborsament del préstec,
@ -8748,3 +8741,5 @@ Global Defaults,Valors per defecte globals,
Is Mandatory,És obligatori,
WhatsApp,Què tal,
Make a call,Fer una trucada,
Approve,aprovar,
Reject,Rebutjar,

Can't render this file because it is too large.

View File

@ -286,7 +286,6 @@ Auto Repeat,Auto opakování,
Auto repeat document updated,Dokument byl aktualizován automaticky,
Automotive,Automobilový,
Available,K dispozici,
Available Leaves,Dostupné listy,
Available Qty,Množství k dispozici,
Available Selling,Dostupné prodeje,
Available for use date is required,K dispozici je datum k dispozici pro použití,
@ -1122,7 +1121,6 @@ Hub Category,Kategorie Hubu,
Hub Sync ID,ID synchronizace Hubu,
Human Resource,Lidské zdroje,
Human Resources,Lidské zdroje,
IFSC Code,Kód IFSC,
IGST Amount,IGST částka,
IP Address,IP adresa,
ITC Available (whether in full op part),ITC k dispozici (ať už v plné op části),
@ -1666,7 +1664,6 @@ Organization Name,Název organizace,
Other,Ostatní,
Other Reports,Ostatní zprávy,
"Other outward supplies(Nil rated,Exempted)","Ostatní pasivní dodávky (bez hodnocení, osvobozeno)",
Others,Ostatní,
Out Qty,Out Množství,
Out Value,limitu,
Out of Order,Mimo provoz,
@ -2812,7 +2809,6 @@ Total (Credit),Celkový (Credit),
Total (Without Tax),Celkem (bez daně),
Total Achieved,Celkem Dosažená,
Total Actual,Celkem Aktuální,
Total Allocated Leaves,Celkové přidělené listy,
Total Amount,Celková částka,
Total Amount Credited,Celková částka připsána,
Total Applicable Charges in Purchase Receipt Items table must be same as Total Taxes and Charges,"Celkový počet použitelných poplatcích v dokladu o koupi zboží, které tabulky musí být stejná jako celkem daní a poplatků",
@ -2922,7 +2918,6 @@ Updating Variants...,Aktualizace variant ...,
Upload your letter head and logo. (you can edit them later).,Nahrajte svůj dopis hlavu a logo. (Můžete je upravit později).,
Upper Income,Horní příjmů,
Use Sandbox,použití Sandbox,
Used Leaves,Použité listy,
User,Uživatel,
User ID,User ID,
User ID not set for Employee {0},User ID není nastavena pro zaměstnance {0},
@ -7949,12 +7944,10 @@ Payroll Cost Center,Mzdové náklady,
Approvers,Schvalovatelé,
The first Approver in the list will be set as the default Approver.,První schvalovatel v seznamu bude nastaven jako výchozí schvalovatel.,
Shift Request Approver,Schvalovatel žádosti o změnu,
PAN Number,PAN číslo,
Provident Fund Account,Účet fondu Provident,
MICR Code,Kód MICR,
Repay unclaimed amount from salary,Vrátit nevyzvednutou částku z platu,
Deduction from salary,Srážka z platu,
Expired Leaves,Vypršela platnost listů,
If this is not checked the loan by default will be considered as a Demand Loan,"Pokud to není zaškrtnuto, bude se úvěr ve výchozím nastavení považovat za půjčku na vyžádání",
This account is used for booking loan repayments from the borrower and also disbursing loans to the borrower,Tento účet slouží k rezervaci splátek půjčky od dlužníka a také k vyplácení půjček dlužníkovi,
This account is capital account which is used to allocate capital for loan disbursal account ,"Tento účet je kapitálovým účtem, který se používá k přidělení kapitálu pro účet vyplácení půjček",
@ -8748,3 +8741,5 @@ Global Defaults,Globální Výchozí,
Is Mandatory,Je povinná,
WhatsApp,WhatsApp,
Make a call,Zavolat,
Approve,Schvalovat,
Reject,Odmítnout,

Can't render this file because it is too large.

View File

@ -286,7 +286,6 @@ Auto Repeat,Automatisk gentagelse,
Auto repeat document updated,Automatisk gentag dokument opdateret,
Automotive,Bil,
Available,Tilgængelig,
Available Leaves,Tilgængelige blade,
Available Qty,Tilgængelig antal,
Available Selling,Tilgængelig salg,
Available for use date is required,Tilgængelig til brug dato er påkrævet,
@ -1122,7 +1121,6 @@ Hub Category,Nav kategori,
Hub Sync ID,Hub Sync ID,
Human Resource,Menneskelige ressourcer,
Human Resources,Medarbejdere,
IFSC Code,IFSC-kode,
IGST Amount,IGST Beløb,
IP Address,IP-adresse,
ITC Available (whether in full op part),ITC tilgængelig (uanset om det er i fuld op-del),
@ -1666,7 +1664,6 @@ Organization Name,Organisationens navn,
Other,Andre,
Other Reports,Andre rapporter,
"Other outward supplies(Nil rated,Exempted)","Andre udgående leverancer (Nul bedømt, undtaget)",
Others,Andre,
Out Qty,Out Antal,
Out Value,Out Value,
Out of Order,Virker ikke,
@ -2812,7 +2809,6 @@ Total (Credit),I alt (kredit),
Total (Without Tax),I alt (uden skat),
Total Achieved,Total Opnået,
Total Actual,Samlede faktiske,
Total Allocated Leaves,Samlede tildelte blade,
Total Amount,Samlet beløb,
Total Amount Credited,Samlede beløb krediteret,
Total Applicable Charges in Purchase Receipt Items table must be same as Total Taxes and Charges,Total gældende takster i købskvitteringsvaretabel skal være det samme som de samlede skatter og afgifter,
@ -2922,7 +2918,6 @@ Updating Variants...,Opdaterer varianter ...,
Upload your letter head and logo. (you can edit them later).,Upload dit brevhoved og logo. (du kan redigere dem senere).,
Upper Income,Upper Indkomst,
Use Sandbox,Brug Sandbox,
Used Leaves,Brugte blade,
User,Bruger,
User ID,Bruger-id,
User ID not set for Employee {0},Bruger-id ikke indstillet til Medarbejder {0},
@ -7949,12 +7944,10 @@ Payroll Cost Center,Lønomkostningscenter,
Approvers,Approverser,
The first Approver in the list will be set as the default Approver.,Den første godkender på listen indstilles som standardgodkenderen.,
Shift Request Approver,Godkendelse af skiftanmodning,
PAN Number,PAN-nummer,
Provident Fund Account,Provident Fund-konto,
MICR Code,MICR-kode,
Repay unclaimed amount from salary,Tilbagebetal ikke-krævet beløb fra løn,
Deduction from salary,Fradrag fra løn,
Expired Leaves,Udløbne blade,
If this is not checked the loan by default will be considered as a Demand Loan,"Hvis dette ikke er markeret, vil lånet som standard blive betragtet som et behovslån",
This account is used for booking loan repayments from the borrower and also disbursing loans to the borrower,Denne konto bruges til at booke tilbagebetaling af lån fra låntager og også udbetale lån til låntager,
This account is capital account which is used to allocate capital for loan disbursal account ,"Denne konto er en kapitalkonto, der bruges til at allokere kapital til udbetaling af lånekonto",
@ -8748,3 +8741,5 @@ Global Defaults,Globale indstillinger,
Is Mandatory,Er obligatorisk,
WhatsApp,WhatsApp,
Make a call,Ringe,
Approve,Godkende,
Reject,Afvise,

Can't render this file because it is too large.

View File

@ -286,7 +286,6 @@ Auto Repeat,Automatische Wiederholung,
Auto repeat document updated,Automatisches Wiederholungsdokument aktualisiert,
Automotive,Fahrzeugbau,
Available,Verfügbar,
Available Leaves,Verfügbare Blätter,
Available Qty,Verfügbare Menge,
Available Selling,Verfügbarer Verkauf,
Available for use date is required,Verfügbar für das Nutzungsdatum ist erforderlich,
@ -1129,7 +1128,6 @@ Hub Category,Hub-Kategorie,
Hub Sync ID,Hub-Synchronisierungs-ID,
Human Resource,Personal,
Human Resources,Personalwesen,
IFSC Code,IFSC-Code,
IGST Amount,IGST Betrag,
IP Address,IP Adresse,
ITC Available (whether in full op part),ITC verfügbar (ob vollständig oder teilweise),
@ -1675,7 +1673,6 @@ Organization Name,Firmenname,
Other,Andere,
Other Reports,Weitere Berichte,
"Other outward supplies(Nil rated,Exempted)","Sonstige Auslandslieferungen (ohne Rating, ausgenommen)",
Others,Andere,
Out Qty,Ausgabe-Menge,
Out Value,Out Wert,
Out of Order,Außer Betrieb,
@ -2825,7 +2822,6 @@ Total (Credit),Insgesamt (Credit),
Total (Without Tax),Summe (ohne Steuern),
Total Achieved,Gesamtsumme erreicht,
Total Actual,Summe Tatsächlich,
Total Allocated Leaves,Insgesamt zugeteilte Blätter,
Total Amount,Gesamtsumme,
Total Amount Credited,Gesamtbetrag der Gutschrift,
Total Applicable Charges in Purchase Receipt Items table must be same as Total Taxes and Charges,Gesamt Die Gebühren in Kauf Eingangspositionen Tabelle muss als Gesamt Steuern und Abgaben gleich sein,
@ -2935,7 +2931,6 @@ Updating Variants...,Varianten werden aktualisiert ...,
Upload your letter head and logo. (you can edit them later).,Briefkopf und Logo hochladen. (Beides kann später noch bearbeitet werden.),
Upper Income,Gehobenes Einkommen,
Use Sandbox,Sandkastenmodus verwenden,
Used Leaves,Genutzter Urlaub,
User,Nutzer,
User ID,Benutzer-ID,
User ID not set for Employee {0},Benutzer-ID ist für Mitarbeiter {0} nicht eingegeben,
@ -7966,12 +7961,10 @@ Payroll Cost Center,Lohnkostenstelle,
Approvers,Genehmiger,
The first Approver in the list will be set as the default Approver.,Der erste Genehmiger in der Liste wird als Standardgenehmiger festgelegt.,
Shift Request Approver,Schichtanforderungsgenehmiger,
PAN Number,PAN-Nummer,
Provident Fund Account,Vorsorgefonds-Konto,
MICR Code,MICR-Code,
Repay unclaimed amount from salary,Nicht zurückgeforderten Betrag vom Gehalt zurückzahlen,
Deduction from salary,Abzug vom Gehalt,
Expired Leaves,Abgelaufene Blätter,
If this is not checked the loan by default will be considered as a Demand Loan,"Wenn dies nicht aktiviert ist, wird das Darlehen standardmäßig als Nachfragedarlehen betrachtet",
This account is used for booking loan repayments from the borrower and also disbursing loans to the borrower,Dieses Konto wird zur Buchung von Kreditrückzahlungen vom Kreditnehmer und zur Auszahlung von Krediten an den Kreditnehmer verwendet,
This account is capital account which is used to allocate capital for loan disbursal account ,"Dieses Konto ist ein Kapitalkonto, das zur Zuweisung von Kapital für das Darlehensauszahlungskonto verwendet wird",
@ -8670,7 +8663,7 @@ Please set default Cash or Bank account in Mode of Payment {},Bitte setzen Sie d
Please set default Cash or Bank account in Mode of Payments {},Bitte setzen Sie das Standard-Bargeld- oder Bankkonto im Zahlungsmodus {},
Please ensure {} account is a Balance Sheet account. You can change the parent account to a Balance Sheet account or select a different account.,"Bitte stellen Sie sicher, dass das Konto {} ein Bilanzkonto ist. Sie können das übergeordnete Konto in ein Bilanzkonto ändern oder ein anderes Konto auswählen.",
Please ensure {} account is a Payable account. Change the account type to Payable or select a different account.,"Bitte stellen Sie sicher, dass das Konto {} ein zahlbares Konto ist. Ändern Sie den Kontotyp in &quot;Verbindlichkeiten&quot; oder wählen Sie ein anderes Konto aus.",
"Row {0}: Expense Head changed to {1} because account {2} is not linked to warehouse {3} or it is not the default inventory account","Zeile {0}: Aufwandskonto geändert zu {1}, weil das Konto {2} nicht mit dem Lager {3} verknüpft ist oder es nicht das Standard-Inventarkonto ist",
Row {0}: Expense Head changed to {1} because account {2} is not linked to warehouse {3} or it is not the default inventory account,"Zeile {0}: Aufwandskonto geändert zu {1}, weil das Konto {2} nicht mit dem Lager {3} verknüpft ist oder es nicht das Standard-Inventarkonto ist",
Row {0}: Expense Head changed to {1} because expense is booked against this account in Purchase Receipt {2},"Zeile {0}: Aufwandskonto geändert zu {1}, da dieses bereits in Eingangsbeleg {2} verwendet wurde",
Row {0}: Expense Head changed to {1} as no Purchase Receipt is created against Item {2}.,"Zeile {0}: Aufwandskonto geändert zu {1}, da kein Eingangsbeleg für Artikel {2} erstellt wird.",
This is done to handle accounting for cases when Purchase Receipt is created after Purchase Invoice,"Dies erfolgt zur Abrechnung von Fällen, in denen der Eingangsbeleg nach der Eingangsrechnung erstellt wird",
@ -8833,3 +8826,5 @@ Global Defaults,Allgemeine Voreinstellungen,
Is Mandatory,Ist obligatorisch,
WhatsApp,WhatsApp,
Make a call,Einen Anruf tätigen,
Approve,Genehmigen,
Reject,Ablehnen,

Can't render this file because it is too large.

View File

@ -286,7 +286,6 @@ Auto Repeat,Αυτόματη επανάληψη,
Auto repeat document updated,Το έγγραφο αυτόματης επανάληψης ενημερώθηκε,
Automotive,Αυτοκίνητο,
Available,Διαθέσιμος,
Available Leaves,Διαθέσιμα φύλλα,
Available Qty,Διαθέσιμη ποσότητα,
Available Selling,Διαθέσιμη πώληση,
Available for use date is required,Απαιτείται ημερομηνία διαθέσιμη για χρήση,
@ -1122,7 +1121,6 @@ Hub Category,Κατηγορία Hub,
Hub Sync ID,Αναγνωριστικό συγχρονισμού Hub,
Human Resource,Ανθρώπινο δυναμικό,
Human Resources,Ανθρώπινοι πόροι,
IFSC Code,Κωδικός IFSC,
IGST Amount,Ποσό IGST,
IP Address,Διεύθυνση IP,
ITC Available (whether in full op part),ITC Διαθέσιμο (είτε σε πλήρη op μέρος),
@ -1666,7 +1664,6 @@ Organization Name,Όνομα Οργανισμού,
Other,Άλλος,
Other Reports,άλλες εκθέσεις,
"Other outward supplies(Nil rated,Exempted)","Άλλες παροχές προς το εξωτερικό (μη διαβαθμισμένες, απαλλαγμένες)",
Others,Άλλα,
Out Qty,Ποσότητα εκτός,
Out Value,από Αξία,
Out of Order,Εκτός λειτουργίας,
@ -2812,7 +2809,6 @@ Total (Credit),Συνολική (πίστωση),
Total (Without Tax),Σύνολο (χωρίς Φόρο),
Total Achieved,Σύνολο που επιτεύχθηκε,
Total Actual,Πραγματικό σύνολο,
Total Allocated Leaves,Συνολικά κατανεμημένα φύλλα,
Total Amount,Συνολικό ποσό,
Total Amount Credited,Συνολικό ποσό που πιστώνεται,
Total Applicable Charges in Purchase Receipt Items table must be same as Total Taxes and Charges,Σύνολο χρεώσεων που επιβάλλονται στην Αγορά Παραλαβή Είδη πίνακα πρέπει να είναι ίδιο με το συνολικό φόροι και επιβαρύνσεις,
@ -2922,7 +2918,6 @@ Updating Variants...,Ενημέρωση παραλλαγών ...,
Upload your letter head and logo. (you can edit them later).,Ανεβάστε την κεφαλίδα επιστολόχαρτου και το λογότυπό σας. (Μπορείτε να τα επεξεργαστείτε αργότερα).,
Upper Income,Άνω εισοδήματος,
Use Sandbox,χρήση Sandbox,
Used Leaves,Χρησιμοποιημένα φύλλα,
User,Χρήστης,
User ID,ID χρήστη,
User ID not set for Employee {0},Το ID χρήστη δεν έχει οριστεί για τον υπάλληλο {0},
@ -7949,12 +7944,10 @@ Payroll Cost Center,Κέντρο κόστους μισθοδοσίας,
Approvers,Εγκρίνει,
The first Approver in the list will be set as the default Approver.,Η πρώτη έγκριση στη λίστα θα οριστεί ως η προεπιλεγμένη έγκριση.,
Shift Request Approver,Έγκριση αιτήματος Shift,
PAN Number,Αριθμός PAN,
Provident Fund Account,Λογαριασμός Ταμείου Προνοίας,
MICR Code,Κωδικός MICR,
Repay unclaimed amount from salary,Επιστρέψτε το ποσό που δεν ζητήθηκε από το μισθό,
Deduction from salary,Έκπτωση από το μισθό,
Expired Leaves,Έληξε φύλλα,
If this is not checked the loan by default will be considered as a Demand Loan,"Εάν αυτό δεν ελεγχθεί, το δάνειο από προεπιλογή θα θεωρείται ως Δάνειο Ζήτησης",
This account is used for booking loan repayments from the borrower and also disbursing loans to the borrower,Αυτός ο λογαριασμός χρησιμοποιείται για την κράτηση αποπληρωμών δανείου από τον δανειολήπτη και επίσης για την εκταμίευση δανείων προς τον οφειλέτη,
This account is capital account which is used to allocate capital for loan disbursal account ,Αυτός ο λογαριασμός είναι λογαριασμός κεφαλαίου που χρησιμοποιείται για την κατανομή κεφαλαίου για λογαριασμό εκταμίευσης δανείου,
@ -8748,3 +8741,5 @@ Global Defaults,Καθολικές προεπιλογές,
Is Mandatory,Ειναι υποχρεωτικό,
WhatsApp,WhatsApp,
Make a call,Τηλεφώνησε,
Approve,Εγκρίνω,
Reject,Απορρίπτω,

Can't render this file because it is too large.

View File

@ -286,7 +286,6 @@ Auto Repeat,Repetición Automática,
Auto repeat document updated,Documento automático editado,
Automotive,Automotores,
Available,Disponible,
Available Leaves,Licencias Disponibles,
Available Qty,Cantidad disponible,
Available Selling,Venta disponible,
Available for use date is required,Disponible para la fecha de uso es obligatorio,
@ -1122,7 +1121,6 @@ Hub Category,Categoría de Hub,
Hub Sync ID,ID de Sincronización del Hub,
Human Resource,Recursos humanos,
Human Resources,Recursos humanos,
IFSC Code,Código IFSC,
IGST Amount,Monto IGST,
IP Address,Dirección IP,
ITC Available (whether in full op part),ITC disponible (ya sea en la parte op completa),
@ -1666,7 +1664,6 @@ Organization Name,Nombre de la Organización,
Other,Otro,
Other Reports,Otros Reportes,
"Other outward supplies(Nil rated,Exempted)","Otros suministros externos (sin calificación, exentos)",
Others,Otros,
Out Qty,Cant. enviada,
Out Value,Fuera de Valor,
Out of Order,Fuera de servicio,
@ -2812,7 +2809,6 @@ Total (Credit),Total (Crédito),
Total (Without Tax),Total (Sin Impuestos),
Total Achieved,Total Conseguido,
Total Actual,Total Actual,
Total Allocated Leaves,Total de Licencias Asignadas,
Total Amount,Importe total,
Total Amount Credited,Monto Total Acreditado,
Total Applicable Charges in Purchase Receipt Items table must be same as Total Taxes and Charges,Total de comisiones aplicables en la compra Tabla de recibos Los artículos deben ser iguales que las tasas totales y cargos,
@ -2922,7 +2918,6 @@ Updating Variants...,Actualizando Variantes ...,
Upload your letter head and logo. (you can edit them later).,Cargue su membrete y el logotipo. (Estos pueden editarse más tarde).,
Upper Income,Ingresos superior,
Use Sandbox,Utilizar Sandbox,
Used Leaves,Licencias Usadas,
User,Usuario,
User ID,ID de usuario,
User ID not set for Employee {0},ID de usuario no establecido para el empleado {0},
@ -7949,12 +7944,10 @@ Payroll Cost Center,Centro de costos de nómina,
Approvers,Aprobadores,
The first Approver in the list will be set as the default Approver.,El primer Aprobador de la lista se establecerá como Aprobador predeterminado.,
Shift Request Approver,Aprobador de solicitud de turno,
PAN Number,Número PAN,
Provident Fund Account,Cuenta del fondo de previsión,
MICR Code,Código MICR,
Repay unclaimed amount from salary,Reembolsar la cantidad no reclamada del salario,
Deduction from salary,Deducción del salario,
Expired Leaves,Hojas caducadas,
If this is not checked the loan by default will be considered as a Demand Loan,"Si no se marca, el préstamo por defecto se considerará Préstamo a la vista.",
This account is used for booking loan repayments from the borrower and also disbursing loans to the borrower,Esta cuenta se utiliza para registrar los reembolsos de préstamos del prestatario y también para desembolsar préstamos al prestatario.,
This account is capital account which is used to allocate capital for loan disbursal account ,Esta cuenta es una cuenta de capital que se utiliza para asignar capital para la cuenta de desembolso de préstamos.,
@ -8748,3 +8741,5 @@ Global Defaults,Predeterminados globales,
Is Mandatory,Es obligatorio,
WhatsApp,WhatsApp,
Make a call,Haz una llamada,
Approve,Aprobar,
Reject,Rechazar,

Can't render this file because it is too large.

View File

@ -286,7 +286,6 @@ Auto Repeat,Automaatne kordamine,
Auto repeat document updated,Auto kordusdokument uuendatud,
Automotive,Autod,
Available,Saadaval,
Available Leaves,Saadaolevad lehed,
Available Qty,Saadaval Kogus,
Available Selling,Saadaval müügil,
Available for use date is required,Kasutatav kasutuskuupäev on vajalik,
@ -1122,7 +1121,6 @@ Hub Category,Rummu kategooria,
Hub Sync ID,Hub Sync ID,
Human Resource,Inimressurss,
Human Resources,Inimressursid,
IFSC Code,IFSC kood,
IGST Amount,IGST summa,
IP Address,IP-aadress,
ITC Available (whether in full op part),ITC saadaval (kas täielikult op),
@ -1666,7 +1664,6 @@ Organization Name,Organisatsiooni nimi,
Other,Muud,
Other Reports,Teised aruanded,
"Other outward supplies(Nil rated,Exempted)","Muud välistarbed (null, erand)",
Others,Teised,
Out Qty,Out Kogus,
Out Value,välja väärtus,
Out of Order,Korrast ära,
@ -2812,7 +2809,6 @@ Total (Credit),Kokku (Credit),
Total (Without Tax),Kokku (maksudeta),
Total Achieved,Kokku saavutatud,
Total Actual,Kokku Tegelik,
Total Allocated Leaves,Kokku eraldatud lehed,
Total Amount,Kogu summa,
Total Amount Credited,Kogu summa krediteeritakse,
Total Applicable Charges in Purchase Receipt Items table must be same as Total Taxes and Charges,Kokku kohaldatavate tasude kohta ostutšekk Esemed tabel peab olema sama Kokku maksud ja tasud,
@ -2922,7 +2918,6 @@ Updating Variants...,Variantide värskendamine ...,
Upload your letter head and logo. (you can edit them later).,Laadi üles oma kirjas pea ja logo. (seda saab muuta hiljem).,
Upper Income,Ülemine tulu,
Use Sandbox,Kasuta liivakasti,
Used Leaves,Kasutatud lehed,
User,Kasutaja,
User ID,kasutaja ID,
User ID not set for Employee {0},Kasutaja ID ei seatud Töötaja {0},
@ -7949,12 +7944,10 @@ Payroll Cost Center,Palgaarvestuse kulukeskus,
Approvers,Heakskiitjad,
The first Approver in the list will be set as the default Approver.,Loendi esimene heakskiitja määratakse vaikimisi kinnitajaks.,
Shift Request Approver,Vahetustaotluse kinnitaja,
PAN Number,PAN-number,
Provident Fund Account,Providence Fundi konto,
MICR Code,MICR-kood,
Repay unclaimed amount from salary,Tagasimakstud summa palgast tagasi maksta,
Deduction from salary,Palgast mahaarvamine,
Expired Leaves,Aegunud lehed,
If this is not checked the loan by default will be considered as a Demand Loan,"Kui seda ei kontrollita, käsitatakse laenu vaikimisi nõudmislaenuna",
This account is used for booking loan repayments from the borrower and also disbursing loans to the borrower,Seda kontot kasutatakse laenusaaja tagasimaksete broneerimiseks ja ka laenuvõtjale laenude väljamaksmiseks,
This account is capital account which is used to allocate capital for loan disbursal account ,"See konto on kapitalikonto, mida kasutatakse kapitali eraldamiseks laenu väljamaksekontole",
@ -8748,3 +8741,5 @@ Global Defaults,Global Vaikeväärtused,
Is Mandatory,On kohustuslik,
WhatsApp,WhatsApp,
Make a call,Helistage,
Approve,kinnitama,
Reject,tagasi lükkama,

1 "Customer Provided Item" cannot be Purchase Item also &quot;Kliendiga varustatav toode&quot; ei saa olla ka ostuartikkel
286 Auto repeat document updated Auto kordusdokument uuendatud
287 Automotive Autod
288 Available Saadaval
Available Leaves Saadaolevad lehed
289 Available Qty Saadaval Kogus
290 Available Selling Saadaval müügil
291 Available for use date is required Kasutatav kasutuskuupäev on vajalik
1121 Hub Sync ID Hub Sync ID
1122 Human Resource Inimressurss
1123 Human Resources Inimressursid
IFSC Code IFSC kood
1124 IGST Amount IGST summa
1125 IP Address IP-aadress
1126 ITC Available (whether in full op part) ITC saadaval (kas täielikult op)
1664 Other Muud
1665 Other Reports Teised aruanded
1666 Other outward supplies(Nil rated,Exempted) Muud välistarbed (null, erand)
Others Teised
1667 Out Qty Out Kogus
1668 Out Value välja väärtus
1669 Out of Order Korrast ära
2809 Total (Without Tax) Kokku (maksudeta)
2810 Total Achieved Kokku saavutatud
2811 Total Actual Kokku Tegelik
Total Allocated Leaves Kokku eraldatud lehed
2812 Total Amount Kogu summa
2813 Total Amount Credited Kogu summa krediteeritakse
2814 Total Applicable Charges in Purchase Receipt Items table must be same as Total Taxes and Charges Kokku kohaldatavate tasude kohta ostutšekk Esemed tabel peab olema sama Kokku maksud ja tasud
2918 Upload your letter head and logo. (you can edit them later). Laadi üles oma kirjas pea ja logo. (seda saab muuta hiljem).
2919 Upper Income Ülemine tulu
2920 Use Sandbox Kasuta liivakasti
Used Leaves Kasutatud lehed
2921 User Kasutaja
2922 User ID kasutaja ID
2923 User ID not set for Employee {0} Kasutaja ID ei seatud Töötaja {0}
7944 Approvers Heakskiitjad
7945 The first Approver in the list will be set as the default Approver. Loendi esimene heakskiitja määratakse vaikimisi kinnitajaks.
7946 Shift Request Approver Vahetustaotluse kinnitaja
PAN Number PAN-number
7947 Provident Fund Account Providence Fundi konto
7948 MICR Code MICR-kood
7949 Repay unclaimed amount from salary Tagasimakstud summa palgast tagasi maksta
7950 Deduction from salary Palgast mahaarvamine
Expired Leaves Aegunud lehed
7951 If this is not checked the loan by default will be considered as a Demand Loan Kui seda ei kontrollita, käsitatakse laenu vaikimisi nõudmislaenuna
7952 This account is used for booking loan repayments from the borrower and also disbursing loans to the borrower Seda kontot kasutatakse laenusaaja tagasimaksete broneerimiseks ja ka laenuvõtjale laenude väljamaksmiseks
7953 This account is capital account which is used to allocate capital for loan disbursal account See konto on kapitalikonto, mida kasutatakse kapitali eraldamiseks laenu väljamaksekontole
8741 Is Mandatory On kohustuslik
8742 WhatsApp WhatsApp
8743 Make a call Helistage
8744 Approve kinnitama
8745 Reject tagasi lükkama

View File

@ -286,7 +286,6 @@ Auto Repeat,خودکار تکرار,
Auto repeat document updated,تکرار خودکار سند به روز شد,
Automotive,خودرو,
Available,در دسترس,
Available Leaves,برگهای موجود,
Available Qty,در دسترس تعداد,
Available Selling,فروش موجود,
Available for use date is required,برای تاریخ استفاده لازم است,
@ -1122,7 +1121,6 @@ Hub Category,رده هاب,
Hub Sync ID,شناسه همگام سازی هاب,
Human Resource,منابع انسانی,
Human Resources,منابع انسانی,
IFSC Code,کد IFSC,
IGST Amount,مقدار IGST,
IP Address,نشانی آیپی,
ITC Available (whether in full op part),ITC موجود (چه در بخش کامل عمل),
@ -1666,7 +1664,6 @@ Organization Name,نام سازمان,
Other,دیگر,
Other Reports,سایر گزارش,
"Other outward supplies(Nil rated,Exempted)",سایر لوازم خارجی (امتیاز صفر ، معافیت),
Others,دیگران,
Out Qty,از تعداد,
Out Value,ارزش از,
Out of Order,خارج از سفارش,
@ -2812,7 +2809,6 @@ Total (Credit),مجموع (اعتباری),
Total (Without Tax),مجموع (بدون مالیات),
Total Achieved,مجموع بهدستآمده,
Total Actual,مجموع واقعی,
Total Allocated Leaves,مجموع برگه های برگزیده,
Total Amount,مقدار کل,
Total Amount Credited,مبلغ کل اعتبار,
Total Applicable Charges in Purchase Receipt Items table must be same as Total Taxes and Charges,مجموع اتهامات قابل اجرا در خرید اقلام دریافت جدول باید همان مجموع مالیات و هزینه شود,
@ -2922,7 +2918,6 @@ Updating Variants...,در حال به روزرسانی انواع ...,
Upload your letter head and logo. (you can edit them later).,آپلود سر نامه و آرم خود را. (شما می توانید آنها را بعد از ویرایش).,
Upper Income,درآمد بالاتر,
Use Sandbox,استفاده از گودال ماسهبازی,
Used Leaves,برگهای مورد استفاده,
User,کاربر,
User ID,ID کاربر,
User ID not set for Employee {0},ID کاربر برای کارمند تنظیم نشده {0},
@ -7949,12 +7944,10 @@ Payroll Cost Center,مرکز هزینه حقوق و دستمزد,
Approvers,متقن,
The first Approver in the list will be set as the default Approver.,اولین تأیید کننده در لیست به عنوان تأیید کننده پیش فرض تنظیم می شود.,
Shift Request Approver,تأیید کننده درخواست شیفت,
PAN Number,شماره PAN,
Provident Fund Account,حساب صندوق تأمین مالی,
MICR Code,کد MICR,
Repay unclaimed amount from salary,مبلغ مطالبه نشده از حقوق را بازپرداخت کنید,
Deduction from salary,کسر از حقوق,
Expired Leaves,برگهای منقضی شده,
If this is not checked the loan by default will be considered as a Demand Loan,اگر این مورد بررسی نشود ، وام به طور پیش فرض به عنوان وام تقاضا در نظر گرفته می شود,
This account is used for booking loan repayments from the borrower and also disbursing loans to the borrower,این حساب برای رزرو بازپرداخت وام از وام گیرنده و همچنین پرداخت وام به وام گیرنده استفاده می شود,
This account is capital account which is used to allocate capital for loan disbursal account ,این حساب حساب سرمایه ای است که برای تخصیص سرمایه برای حساب پرداخت وام استفاده می شود,
@ -8748,3 +8741,5 @@ Global Defaults,به طور پیش فرض جهانی,
Is Mandatory,اجباری است,
WhatsApp,واتس اپ,
Make a call,تماس بگیر,
Approve,تایید,
Reject,رد کردن,

Can't render this file because it is too large.

View File

@ -286,7 +286,6 @@ Auto Repeat,Automaattinen toisto,
Auto repeat document updated,Automaattinen toistuva asiakirja päivitetty,
Automotive,Automotive,
Available,saatavissa,
Available Leaves,Saatavilla olevat lehdet,
Available Qty,saatava yksikkömäärä,
Available Selling,Saatavana myyntiin,
Available for use date is required,Käytettävä päivämäärä on pakollinen,
@ -1122,7 +1121,6 @@ Hub Category,Hub-luokka,
Hub Sync ID,Hub-synkronointitunnus,
Human Resource,henkilöstöresurssi,
Human Resources,Henkilöstöresurssit,
IFSC Code,IFSC-koodi,
IGST Amount,IGST Määrä,
IP Address,IP-osoite,
ITC Available (whether in full op part),ITC käytettävissä (onko täysin op-osa),
@ -1666,7 +1664,6 @@ Organization Name,Organisaatio,
Other,muut,
Other Reports,Muut raportit,
"Other outward supplies(Nil rated,Exempted)","Muut ulkoiset tarvikkeet (nolla, vapautettu)",
Others,Muut,
Out Qty,ulkona yksikkömäärä,
Out Value,out Arvo,
Out of Order,Epäkunnossa,
@ -2812,7 +2809,6 @@ Total (Credit),Yhteensä (luotto),
Total (Without Tax),Yhteensä (ilman veroa),
Total Achieved,"Yhteensä, saavutettu",
Total Actual,Kiinteä summa yhteensä,
Total Allocated Leaves,Kokonaisrajaiset lehdet,
Total Amount,Yhteensä,
Total Amount Credited,Laskettu kokonaismäärä,
Total Applicable Charges in Purchase Receipt Items table must be same as Total Taxes and Charges,Saapumistositteen riveillä olevat maksut pitää olla sama kuin verot ja maksut osiossa,
@ -2922,7 +2918,6 @@ Updating Variants...,Päivitetään variantteja ...,
Upload your letter head and logo. (you can edit them later).,Tuo kirjeen ylätunniste ja logo. (voit muokata niitä myöhemmin),
Upper Income,Ylemmät tulot,
Use Sandbox,Käytä Sandbox,
Used Leaves,Käytetyt lehdet,
User,käyttäjä,
User ID,käyttäjätunnus,
User ID not set for Employee {0},Käyttäjätunnusta ei asetettu työntekijälle {0},
@ -7949,12 +7944,10 @@ Payroll Cost Center,Palkkahallinnon kustannuskeskus,
Approvers,Hyväksyjät,
The first Approver in the list will be set as the default Approver.,Luettelon ensimmäinen hyväksyntä asetetaan oletuksen hyväksyjäksi.,
Shift Request Approver,Vaihtopyynnön hyväksyntä,
PAN Number,PAN-numero,
Provident Fund Account,Provident Fund -tili,
MICR Code,MICR-koodi,
Repay unclaimed amount from salary,Palauta takaisin perimät palkat,
Deduction from salary,Vähennys palkasta,
Expired Leaves,Vanhentuneet lehdet,
If this is not checked the loan by default will be considered as a Demand Loan,"Jos tätä ei ole valittu, laina katsotaan oletuksena kysyntälainaksi",
This account is used for booking loan repayments from the borrower and also disbursing loans to the borrower,Tätä tiliä käytetään lainan takaisinmaksun varaamiseen luotonsaajalta ja lainojen maksamiseen myös luotonottajalle,
This account is capital account which is used to allocate capital for loan disbursal account ,"Tämä tili on pääomatili, jota käytetään pääoman kohdistamiseen lainan maksamiseen",
@ -8748,3 +8741,5 @@ Global Defaults,Yleiset oletusasetukset,
Is Mandatory,On pakollinen,
WhatsApp,WhatsApp,
Make a call,Soita,
Approve,Hyväksyä,
Reject,Hylätä,

Can't render this file because it is too large.

View File

@ -286,7 +286,6 @@ Auto Repeat,Répétition automatique,
Auto repeat document updated,Document de répétition automatique mis à jour,
Automotive,Automobile,
Available,Disponible,
Available Leaves,Congés disponibles,
Available Qty,Qté disponible,
Available Selling,Vente disponible,
Available for use date is required,La date de mise en service est nécessaire,
@ -1122,7 +1121,6 @@ Hub Category,Catégorie du Hub,
Hub Sync ID,Hub Sync ID,
Human Resource,Ressource humaine,
Human Resources,Ressources humaines,
IFSC Code,Code IFSC,
IGST Amount,IGST Montant,
IP Address,Adresse IP,
ITC Available (whether in full op part),CIT Disponible (que ce soit en partie op),
@ -1665,7 +1663,6 @@ Organization Name,Nom de l'Organisation,
Other,Autre,
Other Reports,Autres rapports,
"Other outward supplies(Nil rated,Exempted)","Autres livraisons sortantes (cotations nulles, exemptées)",
Others,Autres,
Out Qty,Qté Sortante,
Out Value,Valeur Sortante,
Out of Order,Hors service,
@ -2812,7 +2809,6 @@ Total (Credit),Total (Crédit),
Total (Without Tax),Total (hors taxes),
Total Achieved,Total Obtenu,
Total Actual,Total réel,
Total Allocated Leaves,Total des congés alloués,
Total Amount,Montant total,
Total Amount Credited,Montant total crédité,
Total Applicable Charges in Purchase Receipt Items table must be same as Total Taxes and Charges,Total des Frais Applicables dans la Table des Articles de Reçus dAchat doit être égal au Total des Taxes et Frais,
@ -2922,7 +2918,6 @@ Updating Variants...,Mise à jour des variantes ...,
Upload your letter head and logo. (you can edit them later).,Charger votre en-tête et logo. (vous pouvez les modifier ultérieurement).,
Upper Income,Revenu Élevé,
Use Sandbox,Utiliser Sandbox,
Used Leaves,Congés utilisés,
User,Utilisateur,
User ID,Identifiant d'utilisateur,
User ID not set for Employee {0},ID de l'Utilisateur non défini pour l'Employé {0},
@ -7097,8 +7092,8 @@ Max Discount (%),Réduction Max (%),
No of Months,Nombre de mois,
Customer Items,Articles du clients,
Inspection Criteria,Critères d'Inspection,
Inspection Required before Purchase,Inspection Requise avant Achat,
Inspection Required before Delivery,Inspection Requise avant Livraison,
Inspection Required before Purchase,Inspection Requise à la réception,
Inspection Required before Delivery,Inspection Requise à l'expedition,
Default BOM,Nomenclature par Défaut,
Supply Raw Materials for Purchase,Fournir les Matières Premières pour l'Achat,
If subcontracted to a vendor,Si sous-traité à un fournisseur,
@ -7945,12 +7940,10 @@ Payroll Cost Center,Centre de coûts de la paie,
Approvers,Approbateurs,
The first Approver in the list will be set as the default Approver.,Le premier approbateur de la liste sera défini comme approbateur par défaut.,
Shift Request Approver,Approbateur de demande de quart,
PAN Number,Numéro PAN,
Provident Fund Account,Compte de prévoyance,
MICR Code,Code MICR,
Repay unclaimed amount from salary,Rembourser le montant non réclamé sur le salaire,
Deduction from salary,Déduction du salaire,
Expired Leaves,Feuilles expirées,
If this is not checked the loan by default will be considered as a Demand Loan,"Si cette case n'est pas cochée, le prêt par défaut sera considéré comme un prêt à vue",
This account is used for booking loan repayments from the borrower and also disbursing loans to the borrower,Ce compte est utilisé pour enregistrer les remboursements de prêts de l'emprunteur et également pour décaisser les prêts à l'emprunteur,
This account is capital account which is used to allocate capital for loan disbursal account ,Ce compte est un compte de capital qui est utilisé pour allouer du capital au compte de décaissement du prêt,
@ -8840,3 +8833,23 @@ Global Defaults,Valeurs par Défaut Globales,
Is Mandatory,Est obligatoire,
WhatsApp,WhatsApp,
Make a call,Passer un coup de téléphone,
No of Employees,Nb de salarié(e)s
No. of Employees,Nb de salarié(e)s
Annual Revenue,CA annuel
Qualified By,Qualifié par
Qualified on,Qualifié le
Open Tasks,Tâche à faire ouverte
No open task,Pas de Tâche à faire ouverte
Open Events,Evénements ouvert
No open event,Pas Evénements ouvert
New Task,Nv. Tâche à faire
No Notes,Pas de note
New Note,Nouvelle Note
Prospect Owner,Resp. du Prospect
Deal Owner,Resp. de l'opportunité
Stage,Etape
Probability,Probabilité
Closing,Clôture
Allow Sales,Autoriser à la vente
Approve,Approuver,
Reject,Rejeter,

Can't render this file because it is too large.

View File

@ -286,7 +286,6 @@ Auto Repeat,સ્વતઃ પુનરાવર્તન કરો,
Auto repeat document updated,સ્વતઃ પુનરાવર્તિત દસ્તાવેજ અપડેટ થયો,
Automotive,ઓટોમોટિવ,
Available,ઉપલબ્ધ,
Available Leaves,ઉપલબ્ધ પાંદડા,
Available Qty,ઉપલબ્ધ Qty,
Available Selling,ઉપલબ્ધ વેચાણ,
Available for use date is required,ઉપયોગ તારીખ માટે ઉપલબ્ધ જરૂરી છે,
@ -1122,7 +1121,6 @@ Hub Category,હબ કેટેગરી,
Hub Sync ID,હબ સમન્વયન ID,
Human Resource,માનવ સંસાધન,
Human Resources,માનવ સંસાધન,
IFSC Code,આઈએફએસસી કોડ,
IGST Amount,IGST રકમ,
IP Address,IP સરનામું,
ITC Available (whether in full op part),આઇટીસી ઉપલબ્ધ છે (સંપૂર્ણ ઓપ ભાગમાં છે કે નહીં),
@ -1666,7 +1664,6 @@ Organization Name,સંસ્થા નામ,
Other,અન્ય,
Other Reports,અન્ય અહેવાલો,
"Other outward supplies(Nil rated,Exempted)","અન્ય બાહ્ય પુરવઠો (નીલ રેટેડ, મુકત)",
Others,અન્ય,
Out Qty,Qty આઉટ,
Out Value,મૂલ્ય,
Out of Order,હુકમ બહાર,
@ -2812,7 +2809,6 @@ Total (Credit),કુલ (ક્રેડિટ),
Total (Without Tax),કુલ (કર વગર),
Total Achieved,કુલ પ્રાપ્ત,
Total Actual,વાસ્તવિક કુલ,
Total Allocated Leaves,કુલ ફાળવેલ પાંદડા,
Total Amount,કુલ રકમ,
Total Amount Credited,કુલ રકમનો શ્રેય,
Total Applicable Charges in Purchase Receipt Items table must be same as Total Taxes and Charges,ખરીદી રસીદ વસ્તુઓ ટેબલ કુલ લાગુ ખર્ચ કુલ કર અને ખર્ચ તરીકે જ હોવી જોઈએ,
@ -2922,7 +2918,6 @@ Updating Variants...,ચલોને અપડેટ કરી રહ્યુ
Upload your letter head and logo. (you can edit them later).,તમારો પત્ર વડા અને લોગો અપલોડ કરો. (જો તમે પછીથી તેમને ફેરફાર કરી શકો છો).,
Upper Income,ઉચ્ચ આવક,
Use Sandbox,ઉપયોગ સેન્ડબોક્સ,
Used Leaves,વપરાયેલ પાંદડા,
User,વપરાશકર્તા,
User ID,વપરાશકર્તા ID,
User ID not set for Employee {0},વપરાશકર્તા ID કર્મચારી માટે સેટ નથી {0},
@ -7949,12 +7944,10 @@ Payroll Cost Center,પેરોલ ખર્ચ કેન્દ્ર,
Approvers,વિવાદ,
The first Approver in the list will be set as the default Approver.,સૂચિમાં પ્રથમ મંજૂરી આપનારને ડિફ defaultલ્ટ મંજૂરી તરીકે સેટ કરવામાં આવશે.,
Shift Request Approver,શિફ્ટ વિનંતી મંજૂરી,
PAN Number,પાન નંબર,
Provident Fund Account,પ્રોવિડન્ટ ફંડ એકાઉન્ટ,
MICR Code,એમઆઈસીઆર કોડ,
Repay unclaimed amount from salary,પગારમાંથી દાવેદારી રકમ પરત કરો,
Deduction from salary,પગારમાંથી કપાત,
Expired Leaves,સમાપ્ત પાંદડા,
If this is not checked the loan by default will be considered as a Demand Loan,જો આને તપાસવામાં નહીં આવે તો ડિફોલ્ટ રૂપે લોનને ડિમાન્ડ લોન માનવામાં આવશે,
This account is used for booking loan repayments from the borrower and also disbursing loans to the borrower,આ એકાઉન્ટનો ઉપયોગ orણ લેનારા પાસેથી લોન ચુકવણી બુક કરવા અને લેનારાને લોન વહેંચવા માટે થાય છે.,
This account is capital account which is used to allocate capital for loan disbursal account ,આ એકાઉન્ટ કેપિટલ એકાઉન્ટ છે જેનો ઉપયોગ લોન વિતરણ ખાતા માટે મૂડી ફાળવવા માટે થાય છે,
@ -8748,3 +8741,5 @@ Global Defaults,વૈશ્વિક ડિફૉલ્ટ્સ,
Is Mandatory,ફરજિયાત છે,
WhatsApp,વોટ્સેપ,
Make a call,કોલ કરો,
Approve,મંજૂર,
Reject,નકારો,

Can't render this file because it is too large.

View File

@ -286,7 +286,6 @@ Auto Repeat,חזור אוטומטי,
Auto repeat document updated,מסמך חזרה אוטומטית עודכן,
Automotive,רכב,
Available,זמין,
Available Leaves,עלים זמינים,
Available Qty,כמות זמינה,
Available Selling,מכירה זמינה,
Available for use date is required,נדרש לתאריך השימוש,
@ -1122,7 +1121,6 @@ Hub Category,קטגוריית רכזת,
Hub Sync ID,מזהה סנכרון רכזת,
Human Resource,משאבי אנוש,
Human Resources,משאבי אנוש,
IFSC Code,קוד IFSC,
IGST Amount,סכום IGST,
IP Address,כתובת ה - IP,
ITC Available (whether in full op part),ITC זמין (אם בחלק אופ מלא),
@ -1666,7 +1664,6 @@ Organization Name,שם ארגון,
Other,אחר,
Other Reports,דוחות נוספים,
"Other outward supplies(Nil rated,Exempted)","אספקה חיצונית אחרת (מדורג אפס, פטור)",
Others,אחרים,
Out Qty,מתוך כמות,
Out Value,ערך מתוך,
Out of Order,מקולקל,
@ -2812,7 +2809,6 @@ Total (Credit),סה&quot;כ (אשראי),
Total (Without Tax),סה&quot;כ (ללא מס),
Total Achieved,"סה""כ הושג",
Total Actual,"סה""כ בפועל",
Total Allocated Leaves,סה&quot;כ עלים שהוקצו,
Total Amount,"סה""כ לתשלום",
Total Amount Credited,סכום כולל אשראי,
Total Applicable Charges in Purchase Receipt Items table must be same as Total Taxes and Charges,סה&quot;כ החיובים החלים בטבלת פריטי קבלה לרכישה חייבים להיות זהים לסכומי המסים והחיובים,
@ -2922,7 +2918,6 @@ Updating Variants...,מעדכן גרסאות ...,
Upload your letter head and logo. (you can edit them later).,העלה ראש המכתב ואת הלוגו שלך. (אתה יכול לערוך אותם מאוחר יותר).,
Upper Income,עליון הכנסה,
Use Sandbox,השתמש בארגז חול,
Used Leaves,עלים משומשים,
User,מִשׁתַמֵשׁ,
User ID,זיהוי משתמש,
User ID not set for Employee {0},זיהוי משתמש לא נקבע לעובדים {0},
@ -7949,12 +7944,10 @@ Payroll Cost Center,מרכז עלות שכר,
Approvers,מחלוקת,
The first Approver in the list will be set as the default Approver.,המאשר הראשון ברשימה יוגדר כמאשר ברירת המחדל.,
Shift Request Approver,אישור בקשת משמרת,
PAN Number,מספר PAN,
Provident Fund Account,חשבון קופת גמל,
MICR Code,קוד MICR,
Repay unclaimed amount from salary,החזר סכום שלא נתבע מהמשכורת,
Deduction from salary,ניכוי משכר,
Expired Leaves,עלים שפג תוקפם,
If this is not checked the loan by default will be considered as a Demand Loan,אם זה לא מסומן ההלוואה כברירת מחדל תיחשב כהלוואת דרישה,
This account is used for booking loan repayments from the borrower and also disbursing loans to the borrower,חשבון זה משמש להזמנת החזרי הלוואות מהלווה וגם להוצאת הלוואות ללווה,
This account is capital account which is used to allocate capital for loan disbursal account ,חשבון זה הוא חשבון הון המשמש להקצאת הון לחשבון פרסום הלוואות,
@ -8748,3 +8741,5 @@ Global Defaults,ברירות מחדל גלובליות,
Is Mandatory,זה חובה,
WhatsApp,ווטסאפ,
Make a call,להתקשר,
Approve,לְאַשֵׁר,
Reject,לִדחוֹת,

Can't render this file because it is too large.

View File

@ -286,7 +286,6 @@ Auto Repeat,ऑटो दोहराना,
Auto repeat document updated,ऑटो दोहराना दस्तावेज़ अद्यतन,
Automotive,मोटर वाहन,
Available,उपलब्ध,
Available Leaves,उपलब्ध पत्तियां,
Available Qty,उपलब्ध मात्रा,
Available Selling,उपलब्ध बेचना,
Available for use date is required,उपयोग की तारीख के लिए उपलब्ध है,
@ -1122,7 +1121,6 @@ Hub Category,हब श्रेणी,
Hub Sync ID,हब सिंक आईडी,
Human Resource,मानव संसाधन,
Human Resources,मानवीय संसाधन,
IFSC Code,आईएफएससी कोड,
IGST Amount,आईजीएसटी राशि,
IP Address,आईपी पता,
ITC Available (whether in full op part),ITC उपलब्ध (पूर्ण ऑप भाग में),
@ -1666,7 +1664,6 @@ Organization Name,संगठन का नाम,
Other,अन्य,
Other Reports,अन्य रिपोर्टें,
"Other outward supplies(Nil rated,Exempted)","अन्य बाहरी आपूर्ति (निल रेटेड, छूट)",
Others,दूसरों,
Out Qty,मात्रा बाहर,
Out Value,आउट मान,
Out of Order,खराब,
@ -2812,7 +2809,6 @@ Total (Credit),कुल (क्रेडिट),
Total (Without Tax),कुल (कर के बिना),
Total Achieved,कुल प्राप्त,
Total Actual,वास्तविक कुल,
Total Allocated Leaves,कुल आवंटित पत्तियां,
Total Amount,कुल राशि,
Total Amount Credited,कुल राशि क्रेडिट,
Total Applicable Charges in Purchase Receipt Items table must be same as Total Taxes and Charges,खरीद रसीद आइटम तालिका में कुल लागू शुल्कों के कुल करों और शुल्कों के रूप में ही होना चाहिए,
@ -2922,7 +2918,6 @@ Updating Variants...,वेरिएंट अपडेट हो रहा ह
Upload your letter head and logo. (you can edit them later).,अपने पत्र सिर और लोगो अपलोड करें। (आप उन्हें बाद में संपादित कर सकते हैं)।,
Upper Income,ऊपरी आय,
Use Sandbox,उपयोग सैंडबॉक्स,
Used Leaves,प्रयुक्त पत्तियां,
User,उपयोगकर्ता,
User ID,प्रयोक्ता आईडी,
User ID not set for Employee {0},यूजर आईडी कर्मचारी के लिए सेट नहीं {0},
@ -7949,12 +7944,10 @@ Payroll Cost Center,पेरोल लागत केंद्र,
Approvers,approvers,
The first Approver in the list will be set as the default Approver.,सूची में पहले अनुमोदन डिफ़ॉल्ट डिफ़ॉल्ट के रूप में सेट किया जाएगा।,
Shift Request Approver,शिफ्ट रिक्वेस्ट अप्रूवर,
PAN Number,पैन नंबर,
Provident Fund Account,भविष्य निधि खाता,
MICR Code,MICR कोड,
Repay unclaimed amount from salary,वेतन से लावारिस राशि को चुकाएं,
Deduction from salary,वेतन से कटौती,
Expired Leaves,समय सीमा समाप्त,
If this is not checked the loan by default will be considered as a Demand Loan,"यदि यह डिफ़ॉल्ट रूप से ऋण की जाँच नहीं है, तो इसे डिमांड लोन माना जाएगा",
This account is used for booking loan repayments from the borrower and also disbursing loans to the borrower,इस खाते का उपयोग उधारकर्ता से ऋण चुकौती की बुकिंग के लिए किया जाता है और उधारकर्ता को ऋण का वितरण भी किया जाता है,
This account is capital account which is used to allocate capital for loan disbursal account ,यह खाता पूंजी खाता है जिसका उपयोग ऋण वितरण खाते के लिए पूंजी आवंटित करने के लिए किया जाता है,
@ -8748,3 +8741,5 @@ Global Defaults,वैश्विक मूलभूत,
Is Mandatory,अनिवार्य है,
WhatsApp,WhatsApp,
Make a call,कॉल करें,
Approve,मंजूर,
Reject,अस्वीकार,

Can't render this file because it is too large.

View File

@ -286,7 +286,6 @@ Auto Repeat,Automatsko ponavljanje,
Auto repeat document updated,Ažurira se automatski ponavljanje dokumenta,
Automotive,Automobilska industrija,
Available,Dostupno,
Available Leaves,Dostupni lišće,
Available Qty,Dostupno Količina,
Available Selling,Dostupna prodaja,
Available for use date is required,Dostupan je za datum upotrebe,
@ -1122,7 +1121,6 @@ Hub Category,Kategorija hubova,
Hub Sync ID,ID sinkronizacije huba,
Human Resource,Ljudski resursi,
Human Resources,Ljudski resursi,
IFSC Code,IFSC kod,
IGST Amount,Iznos IGST,
IP Address,IP adresa,
ITC Available (whether in full op part),Dostupan ITC (bilo u cijelom op. Dijelu),
@ -1666,7 +1664,6 @@ Organization Name,Naziv organizacije,
Other,Drugi,
Other Reports,Ostala izvješća,
"Other outward supplies(Nil rated,Exempted)","Ostale vanjske zalihe (ocjenjivano bez vrijednosti, izuzeće)",
Others,Ostali,
Out Qty,Od kol,
Out Value,Iz vrijednost,
Out of Order,Izvanredno,
@ -2812,7 +2809,6 @@ Total (Credit),Ukupno (Credit),
Total (Without Tax),Ukupno (bez poreza),
Total Achieved,Ukupno Ostvareno,
Total Actual,Ukupno Stvarni,
Total Allocated Leaves,Ukupno dopuštena lišća,
Total Amount,Ukupan iznos,
Total Amount Credited,Ukupan iznos je odobren,
Total Applicable Charges in Purchase Receipt Items table must be same as Total Taxes and Charges,Ukupno odgovarajuće naknade u potvrdi o kupnji stavke stolu mora biti ista kao i Total poreza i naknada,
@ -2922,7 +2918,6 @@ Updating Variants...,Ažuriranje varijanti ...,
Upload your letter head and logo. (you can edit them later).,Upload Vaše pismo glavu i logotip. (Možete ih uređivati kasnije).,
Upper Income,Gornja Prihodi,
Use Sandbox,Sandbox,
Used Leaves,Koristi lišće,
User,Korisnik,
User ID,Korisnički ID,
User ID not set for Employee {0},Korisnik ID nije postavljen za zaposlenika {0},
@ -7949,12 +7944,10 @@ Payroll Cost Center,Mjesto troška plaća,
Approvers,Odobrivači,
The first Approver in the list will be set as the default Approver.,Prvi odobravatelj s popisa postavit će se kao zadani odobravatelj.,
Shift Request Approver,Odobritelj zahtjeva za smjenom,
PAN Number,PAN broj,
Provident Fund Account,Račun osiguravajućeg fonda,
MICR Code,MICR kod,
Repay unclaimed amount from salary,Otplatite neiskorišteni iznos iz plaće,
Deduction from salary,Odbitak od plaće,
Expired Leaves,Isteklo lišće,
If this is not checked the loan by default will be considered as a Demand Loan,"Ako se ovo ne potvrdi, zajam će se prema zadanim postavkama smatrati zajmom na zahtjev",
This account is used for booking loan repayments from the borrower and also disbursing loans to the borrower,Ovaj se račun koristi za rezerviranje otplate zajma od zajmoprimca i za isplatu zajmova zajmoprimcu,
This account is capital account which is used to allocate capital for loan disbursal account ,Ovaj račun je račun kapitala koji se koristi za raspodjelu kapitala za račun izdvajanja zajma,
@ -8748,3 +8741,5 @@ Global Defaults,Globalne zadane postavke,
Is Mandatory,Je obavezno,
WhatsApp,Što ima,
Make a call,Uputi poziv,
Approve,Odobriti,
Reject,Odbiti,

Can't render this file because it is too large.

View File

@ -286,7 +286,6 @@ Auto Repeat,Automatikus ismétlés,
Auto repeat document updated,Az automatikus ismétlődő dokumentum frissítve,
Automotive,Autóipar,
Available,Elérhető,
Available Leaves,Lehetséges távollétek,
Available Qty,Elérhető Menny.,
Available Selling,Elérhető értékesítés,
Available for use date is required,Rendelkezésre állási dátum szükséges,
@ -1122,7 +1121,6 @@ Hub Category,Hub kategória,
Hub Sync ID,Hub szinkronizálási azonosító ID,
Human Resource,Emberi Erőforrás HR,
Human Resources,Emberi erőforrások HR,
IFSC Code,IFSC kód,
IGST Amount,IGST összeg,
IP Address,IP-cím,
ITC Available (whether in full op part),ITC elérhető (teljes opcióban),
@ -1666,7 +1664,6 @@ Organization Name,Vállalkozás neve,
Other,Egyéb,
Other Reports,Más jelentések,
"Other outward supplies(Nil rated,Exempted)","Egyéb külső készletek (nulla, mentes)",
Others,Egyéb,
Out Qty,Mennyiségen kívül,
Out Value,Értéken kívül,
Out of Order,Üzemen kívül,
@ -2812,7 +2809,6 @@ Total (Credit),Összesen (Követelés),
Total (Without Tax),Összesen (adó nélkül/nettó),
Total Achieved,Összes Elért,
Total Actual,Összes Aktuális,
Total Allocated Leaves,Teljes elosztott távollétek száma,
Total Amount,Összesen,
Total Amount Credited,Összesen jóváírt összeg,
Total Applicable Charges in Purchase Receipt Items table must be same as Total Taxes and Charges,Összesen alkalmazandó díjak a vásárlási nyugta tételek táblázatban egyeznie kell az Összes adókkal és illetékekkel,
@ -2922,7 +2918,6 @@ Updating Variants...,Változat frissítése ...,
Upload your letter head and logo. (you can edit them later).,Kérjük töltse fel levele fejlécét és logo-ját. (Ezeket később szerkesztheti).,
Upper Income,Magasabb jövedelem,
Use Sandbox,Sandbox felhasználása,
Used Leaves,Felhasznált távollétek,
User,használó,
User ID,Felhasználó ID,
User ID not set for Employee {0},Felhasználói azonosítót nem állított be az Alkalmazotthoz: {0},
@ -7949,12 +7944,10 @@ Payroll Cost Center,Bérszámfejtési Központ,
Approvers,Jóváhagyó,
The first Approver in the list will be set as the default Approver.,A lista első jóváhagyója lesz az alapértelmezett jóváhagyó.,
Shift Request Approver,Shift Request Approver,
PAN Number,PAN szám,
Provident Fund Account,Provident Fund számla,
MICR Code,MICR kód,
Repay unclaimed amount from salary,Visszafizetni az igényelt összeget a fizetésből,
Deduction from salary,A fizetés levonása,
Expired Leaves,Lejárt levelek,
If this is not checked the loan by default will be considered as a Demand Loan,"Ha ez nincs bejelölve, akkor a hitelt alapértelmezés szerint Igény szerinti kölcsönnek kell tekinteni",
This account is used for booking loan repayments from the borrower and also disbursing loans to the borrower,"Ezt a számlát arra használják, hogy foglalják le a hiteltől származó hiteltörlesztéseket, és kölcsönöket is folyósítanak a hitelfelvevőnek",
This account is capital account which is used to allocate capital for loan disbursal account ,"Ez a számla tőkeszámla, amelyet a hitel folyósítási számlájához szükséges tőke allokálására használnak",
@ -8748,3 +8741,5 @@ Global Defaults,Általános beállítások,
Is Mandatory,Kötelező,
WhatsApp,WhatsApp,
Make a call,Hívást kezdeményezni,
Approve,Jóváhagy,
Reject,Elutasít,

Can't render this file because it is too large.

Some files were not shown because too many files have changed in this diff Show More