chore: resolved conflicts

This commit is contained in:
Khushi Rawat
2024-09-02 16:09:09 +05:30
54 changed files with 3125 additions and 3088 deletions

View File

@@ -18,4 +18,4 @@ max_line_length = 110
[{*.json}]
insert_final_newline = false
indent_style = space
indent_size = 2
indent_size = 1

3
.gitignore vendored
View File

@@ -14,5 +14,6 @@ __pycache__
*~
.idea/
.vscode/
.helix/
node_modules/
.backportrc.json
.backportrc.json

View File

@@ -2,6 +2,7 @@ import functools
import inspect
import frappe
from frappe.utils.user import is_website_user
__version__ = "16.0.0-dev"
@@ -149,3 +150,13 @@ def allow_regional(fn):
return frappe.get_attr(overrides[function_path][-1])(*args, **kwargs)
return caller
def check_app_permission():
if frappe.session.user == "Administrator":
return True
if is_website_user():
return False
return True

View File

@@ -38,6 +38,11 @@ frappe.ui.form.on("Bank Clearance", {
frm.add_custom_button(__("Get Payment Entries"), () => frm.trigger("get_payment_entries"));
frm.change_custom_button_type(__("Get Payment Entries"), null, "primary");
if (frm.doc.payment_entries.length) {
frm.add_custom_button(__("Update Clearance Date"), () => frm.trigger("update_clearance_date"));
frm.change_custom_button_type(__("Get Payment Entries"), null, "default");
frm.change_custom_button_type(__("Update Clearance Date"), null, "primary");
}
},
update_clearance_date: function (frm) {
@@ -45,13 +50,7 @@ frappe.ui.form.on("Bank Clearance", {
method: "update_clearance_date",
doc: frm.doc,
callback: function (r, rt) {
frm.refresh_field("payment_entries");
frm.refresh_fields();
if (!frm.doc.payment_entries.length) {
frm.change_custom_button_type(__("Get Payment Entries"), null, "primary");
frm.change_custom_button_type(__("Update Clearance Date"), null, "default");
}
frm.refresh();
},
});
},
@@ -60,17 +59,8 @@ frappe.ui.form.on("Bank Clearance", {
return frappe.call({
method: "get_payment_entries",
doc: frm.doc,
callback: function (r, rt) {
frm.refresh_field("payment_entries");
if (frm.doc.payment_entries.length) {
frm.add_custom_button(__("Update Clearance Date"), () =>
frm.trigger("update_clearance_date")
);
frm.change_custom_button_type(__("Get Payment Entries"), null, "default");
frm.change_custom_button_type(__("Update Clearance Date"), null, "primary");
}
callback: function () {
frm.refresh();
},
});
},

View File

@@ -305,7 +305,7 @@ frappe.ui.form.on("Payment Entry", {
set_dynamic_labels: function (frm) {
var company_currency = frm.doc.company
? frappe.get_doc(":Company", frm.doc.company).default_currency
? frappe.get_doc(":Company", frm.doc.company)?.default_currency
: "";
frm.set_currency_labels(

View File

@@ -1838,7 +1838,7 @@ def get_outstanding_reference_documents(args, validate=False):
d["bill_no"] = frappe.db.get_value(d.voucher_type, d.voucher_no, "bill_no")
# Get negative outstanding sales /purchase invoices
if args.get("party_type") != "Employee" and not args.get("voucher_no"):
if args.get("party_type") != "Employee":
negative_outstanding_invoices = get_negative_outstanding_invoices(
args.get("party_type"),
args.get("party"),

View File

@@ -10,6 +10,7 @@
"failed_reason",
"column_break_2",
"naming_series",
"company",
"mode_of_payment",
"party_details",
"party_type",
@@ -400,13 +401,20 @@
"no_copy": 1,
"print_hide": 1,
"read_only": 1
},
{
"fieldname": "company",
"fieldtype": "Link",
"label": "Company",
"options": "Company",
"read_only": 1
}
],
"in_create": 1,
"index_web_pages_for_search": 1,
"is_submittable": 1,
"links": [],
"modified": "2024-06-20 13:54:55.245774",
"modified": "2024-08-07 16:39:54.288002",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Payment Request",

View File

@@ -16,7 +16,7 @@ from erpnext.accounts.doctype.payment_entry.payment_entry import (
)
from erpnext.accounts.doctype.subscription_plan.subscription_plan import get_plan_rate
from erpnext.accounts.party import get_party_account, get_party_bank_account
from erpnext.accounts.utils import get_account_currency
from erpnext.accounts.utils import get_account_currency, get_currency_precision
from erpnext.utilities import payment_app_import_guard
@@ -85,6 +85,7 @@ class PaymentRequest(Document):
subscription_plans: DF.Table[SubscriptionPlanDetail]
swift_number: DF.ReadOnly | None
transaction_date: DF.Date | None
company: DF.Link | None
# end: auto-generated types
def validate(self):
@@ -499,6 +500,7 @@ def make_payment_request(**args):
"message": gateway_account.get("message") or get_dummy_message(ref_doc),
"reference_doctype": args.dt,
"reference_name": args.dn,
"company": ref_doc.get("company"),
"party_type": args.get("party_type") or "Customer",
"party": args.get("party") or ref_doc.get("customer"),
"bank_account": bank_account,
@@ -566,7 +568,10 @@ def get_amount(ref_doc, payment_account=None):
elif dt == "Fees":
grand_total = ref_doc.outstanding_amount
return grand_total
if grand_total > 0:
return flt(grand_total, get_currency_precision())
else:
frappe.throw(_("Payment Entry is already created"))
def get_existing_payment_request_amount(ref_dt, ref_dn):

View File

@@ -13,7 +13,7 @@
</div>
{% endif %}
</div>
<h2 class="text-center">{{ _("STATEMENTS OF ACCOUNTS") }}</h2>
<h2 class="text-center">{{ _("STATEMENT OF ACCOUNTS") }}</h2>
<div>
{% if filters.party[0] == filters.party_name[0] %}
<h5 style="float: left;">{{ _("Customer: ") }} <b>{{ filters.party_name[0] }}</b></h5>
@@ -22,11 +22,11 @@
<h5 style="float: left; margin-left:15px">{{ _("Customer Name: ") }} <b>{{filters.party_name[0] }}</b></h5>
{% endif %}
<h5 style="float: right;">
{{ _("Date: ") }}
<b>{{ frappe.format(filters.from_date, 'Date')}}
{{ _("to") }}
{{ frappe.format(filters.to_date, 'Date')}}</b>
</h5>
{{ _("Date: {0} to {1}").format(
frappe.format(filters.from_date, "Date"),
frappe.format(filters.to_date, 'Date')
) }}
</h5>
</div>
<br>
@@ -54,7 +54,7 @@
<br>
{% endif %}
<br>{{ _("Remarks") }}: {{ row.remarks }}
<br>{{ _("Remarks:") }} {{ row.remarks }}
{% if row.bill_no %}
<br>{{ _("Supplier Invoice No") }}: {{ row.bill_no }}
{% endif %}
@@ -83,17 +83,20 @@
</table>
<br>
{% if ageing %}
<h4 class="text-center">{{ _("Ageing Report based on ") }} {{ ageing.ageing_based_on }}
{{ _("up to " ) }} {{ frappe.format(filters.to_date, 'Date')}}
<h4 class="text-center">
{{ _("Ageing Report based on {0} up to {1}").format(
ageing.ageing_based_on,
frappe.format(filters.to_date, "Date")
) }}
</h4>
<table class="table table-bordered">
<thead>
<tr>
<th style="width: 20%">0 - 30 Days</th>
<th style="width: 20%">30 - 60 Days</th>
<th style="width: 20%">60 - 90 Days</th>
<th style="width: 20%">90 - 120 Days</th>
<th style="width: 20%">Above 120 Days</th>
<th style="width: 20%">{{ _("0 - 30 Days") }}</th>
<th style="width: 20%">{{ _("30 - 60 Days") }}</th>
<th style="width: 20%">{{ _("60 - 90 Days") }}</th>
<th style="width: 20%">{{ _("90 - 120 Days") }}</th>
<th style="width: 20%">{{ _("Above 120 Days") }}</th>
</tr>
</thead>
<tbody>

View File

@@ -6,228 +6,302 @@
.print-format td {
vertical-align:middle !important;
}
</style>
</style>
<div id="header-html" class="hidden-pdf">
{% if letter_head.content %}
<div class="letter-head text-center">{{ letter_head.content }}</div>
<hr style="height:2px;border-width:0;color:black;background-color:black;">
{% endif %}
</div>
<div id="footer-html" class="visible-pdf">
{% if letter_head.footer %}
<div class="letter-head-footer">
<hr style="border-width:0;color:black;background-color:black;padding-bottom:2px;">
{{ letter_head.footer }}
</div>
{% endif %}
</div>
<h2 class="text-center" style="margin-top:0">{{ _(report.report_name) }}</h2>
<h4 class="text-center">
{{ filters.customer_name }}
</h4>
<h6 class="text-center">
{% if (filters.tax_id) %}
{{ _("Tax Id: ") }}{{ filters.tax_id }}
{% endif %}
</h6>
<h5 class="text-center">
{{ _(filters.ageing_based_on) }}
{{ _("Until") }}
{{ frappe.format(filters.report_date, 'Date') }}
</h5>
<div class="clearfix">
<div class="pull-left">
{% if(filters.payment_terms) %}
<strong>{{ _("Payment Terms") }}:</strong> {{ filters.payment_terms }}
{% endif %}
</div>
<div class="pull-right">
{% if(filters.credit_limit) %}
<strong>{{ _("Credit Limit") }}:</strong> {{ frappe.utils.fmt_money(filters.credit_limit) }}
{% endif %}
</div>
</div>
{% if(filters.show_future_payments) %}
{% set balance_row = data.slice(-1).pop() %}
{% for i in report.columns %}
{% if i.fieldname == 'age' %}
{% set elem = i %}
{% endif %}
{% endfor %}
{% set start = report.columns.findIndex(elem) %}
{% set range1 = report.columns[start].label %}
{% set range2 = report.columns[start+1].label %}
{% set range3 = report.columns[start+2].label %}
{% set range4 = report.columns[start+3].label %}
{% set range5 = report.columns[start+4].label %}
{% set range6 = report.columns[start+5].label %}
{% if(balance_row) %}
<table class="table table-bordered table-condensed">
<caption class="text-right">(Amount in {{ data[0]["currency"] ~ "" }})</caption>
<colgroup>
<col style="width: 30mm;">
<col style="width: 18mm;">
<col style="width: 18mm;">
<col style="width: 18mm;">
<col style="width: 18mm;">
<col style="width: 18mm;">
<col style="width: 18mm;">
<col style="width: 18mm;">
</colgroup>
<thead>
<tr>
<th>{{ _(" ") }}</th>
<th>{{ _(range1) }}</th>
<th>{{ _(range2) }}</th>
<th>{{ _(range3) }}</th>
<th>{{ _(range4) }}</th>
<th>{{ _(range5) }}</th>
<th>{{ _(range6) }}</th>
<th>{{ _("Total") }}</th>
</tr>
</thead>
<tbody>
<tr>
<td>{{ _("Total Outstanding") }}</td>
<td class="text-right">
{{ format_number(balance_row["age"], null, 2) }}
</td>
<td class="text-right">
{{ frappe.utils.fmt_money(balance_row["range1"], data[data.length-1]["currency"]) }}
</td>
<td class="text-right">
{{ frappe.utils.fmt_money(balance_row["range2"], data[data.length-1]["currency"]) }}
</td>
<td class="text-right">
{{ frappe.utils.fmt_money(balance_row["range3"], data[data.length-1]["currency"]) }}
</td>
<td class="text-right">
{{ frappe.utils.fmt_money(balance_row["range4"], data[data.length-1]["currency"]) }}
</td>
<td class="text-right">
{{ frappe.utils.fmt_money(balance_row["range5"], data[data.length-1]["currency"]) }}
</td>
<td class="text-right">
{{ frappe.utils.fmt_money(flt(balance_row["outstanding"]), data[data.length-1]["currency"]) }}
</td>
</tr>
<td>{{ _("Future Payments") }}</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td class="text-right">
{{ frappe.utils.fmt_money(flt(balance_row[("future_amount")]), data[data.length-1]["currency"]) }}
</td>
<tr class="cvs-footer">
<th class="text-left">{{ _("Cheques Required") }}</th>
<th></th>
<th></th>
<th></th>
<th></th>
<th></th>
<th></th>
<th class="text-right">
{{ frappe.utils.fmt_money(flt(balance_row["outstanding"] - balance_row[("future_amount")]), data[data.length-1]["currency"]) }}</th>
</tr>
</tbody>
</table>
{% endif %}
<div id="header-html" class="hidden-pdf">
{% if letter_head.content %}
<div class="letter-head text-center">{{ letter_head.content }}</div>
<hr style="height:2px;border-width:0;color:black;background-color:black;">
{% endif %}
<table class="table table-bordered">
</div>
<div id="footer-html" class="visible-pdf">
{% if letter_head.footer %}
<div class="letter-head-footer">
<hr style="border-width:0;color:black;background-color:black;padding-bottom:2px;">
{{ letter_head.footer }}
</div>
{% endif %}
</div>
<h2 class="text-center" style="margin-top:0">{{ _(report.report_name) }}</h2>
<h4 class="text-center">
{{ filters.customer_name }}
</h4>
<h6 class="text-center">
{% if (filters.tax_id) %}
{{ _("Tax Id: {0}").format(filters.tax_id) }}
{% endif %}
</h6>
<h5 class="text-center">
{{ _("{0} until {1}").format(
_(filters.ageing_based_on),
frappe.format(filters.report_date, 'Date')
) }}
</h5>
<div class="clearfix">
<div class="pull-left">
{% if(filters.payment_terms) %}
<strong>{{ _("Payment Terms:") }}</strong> {{ filters.payment_terms }}
{% endif %}
</div>
<div class="pull-right">
{% if(filters.credit_limit) %}
<strong>{{ _("Credit Limit:") }}</strong> {{ frappe.utils.fmt_money(filters.credit_limit) }}
{% endif %}
</div>
</div>
{% if(filters.show_future_payments) %}
{% set balance_row = data.slice(-1).pop() %}
{% for i in report.columns %}
{% if i.fieldname == 'age' %}
{% set elem = i %}
{% endif %}
{% endfor %}
{% set start = report.columns.findIndex(elem) %}
{% set range1 = report.columns[start].label %}
{% set range2 = report.columns[start+1].label %}
{% set range3 = report.columns[start+2].label %}
{% set range4 = report.columns[start+3].label %}
{% set range5 = report.columns[start+4].label %}
{% set range6 = report.columns[start+5].label %}
{% if(balance_row) %}
<table class="table table-bordered table-condensed">
<caption class="text-right">{{ _("Amount in {0}").format(data[0]["currency"] ~ "") }}</caption>
<colgroup>
<col style="width: 30mm;">
<col style="width: 18mm;">
<col style="width: 18mm;">
<col style="width: 18mm;">
<col style="width: 18mm;">
<col style="width: 18mm;">
<col style="width: 18mm;">
<col style="width: 18mm;">
</colgroup>
<thead>
<tr>
{% if(report.report_name == "Accounts Receivable" or report.report_name == "Accounts Payable") %}
<th style="width: 10%">{{ _("Date") }}</th>
<th style="width: 4%">{{ _("Age (Days)") }}</th>
{% if(report.report_name == "Accounts Receivable" and filters.show_sales_person) %}
<th style="width: 14%">{{ _("Reference") }}</th>
<th style="width: 10%">{{ _("Sales Person") }}</th>
{% else %}
<th style="width: 24%">{{ _("Reference") }}</th>
{% endif %}
{% if not(filters.show_future_payments) %}
<th style="width: 20%">
{% if (filters.customer or filters.supplier or filters.customer_name) %}
{{ _("Remarks") }}
{% else %}
{{ _("Party") }}
{% endif %}
</th>
{% endif %}
<th style="width: 10%; text-align: right">{{ _("Invoiced Amount") }}</th>
{% if not(filters.show_future_payments) %}
<th style="width: 10%; text-align: right">{{ _("Paid Amount") }}</th>
<th style="width: 10%; text-align: right">
{% if report.report_name == "Accounts Receivable" %}
{{ _('Credit Note') }}
{% else %}
{{ _('Debit Note') }}
{% endif %}
</th>
{% endif %}
<th style="width: 10%; text-align: right">{{ _("Outstanding Amount") }}</th>
{% if(filters.show_future_payments) %}
{% if(report.report_name == "Accounts Receivable") %}
<th style="width: 12%">{{ _("Customer LPO No.") }}</th>
{% endif %}
<th style="width: 10%">{{ _("Future Payment Ref") }}</th>
<th style="width: 10%">{{ _("Future Payment Amount") }}</th>
<th style="width: 10%">{{ _("Remaining Balance") }}</th>
{% endif %}
{% else %}
<th style="width: 40%">
{% if (filters.customer or filters.supplier or filters.customer_name) %}
{{ _("Remarks")}}
{% else %}
{{ _("Party") }}
{% endif %}
</th>
<th style="width: 15%">{{ _("Total Invoiced Amount") }}</th>
<th style="width: 15%">{{ _("Total Paid Amount") }}</th>
<th style="width: 15%">
{% if report.report_name == "Accounts Receivable Summary" %}
{{ _('Credit Note Amount') }}
{% else %}
{{ _('Debit Note Amount') }}
{% endif %}
</th>
<th style="width: 15%">{{ _("Total Outstanding Amount") }}</th>
{% endif %}
<th>{{ _(" ") }}</th>
<th>{{ _(range1) }}</th>
<th>{{ _(range2) }}</th>
<th>{{ _(range3) }}</th>
<th>{{ _(range4) }}</th>
<th>{{ _(range5) }}</th>
<th>{{ _(range6) }}</th>
<th>{{ _("Total") }}</th>
</tr>
</thead>
<tbody>
{% for i in range(data|length) %}
<tr>
{% if(report.report_name == "Accounts Receivable" or report.report_name == "Accounts Payable") %}
{% if(data[i]["party"]) %}
<td>{{ (data[i]["posting_date"]) }}</td>
<td style="text-align: right">{{ data[i]["age"] }}</td>
<td>
{% if not(filters.show_future_payments) %}
{{ data[i]["voucher_type"] }}
<br>
{% endif %}
{{ data[i]["voucher_no"] }}
</td>
<tr>
<td>{{ _("Total Outstanding") }}</td>
<td class="text-right">
{{ format_number(balance_row["age"], null, 2) }}
</td>
<td class="text-right">
{{ frappe.utils.fmt_money(balance_row["range1"], data[data.length-1]["currency"]) }}
</td>
<td class="text-right">
{{ frappe.utils.fmt_money(balance_row["range2"], data[data.length-1]["currency"]) }}
</td>
<td class="text-right">
{{ frappe.utils.fmt_money(balance_row["range3"], data[data.length-1]["currency"]) }}
</td>
<td class="text-right">
{{ frappe.utils.fmt_money(balance_row["range4"], data[data.length-1]["currency"]) }}
</td>
<td class="text-right">
{{ frappe.utils.fmt_money(balance_row["range5"], data[data.length-1]["currency"]) }}
</td>
<td class="text-right">
{{ frappe.utils.fmt_money(flt(balance_row["outstanding"]), data[data.length-1]["currency"]) }}
</td>
</tr>
<td>{{ _("Future Payments") }}</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td class="text-right">
{{ frappe.utils.fmt_money(flt(balance_row[("future_amount")]), data[data.length-1]["currency"]) }}
</td>
<tr class="cvs-footer">
<th class="text-left">{{ _("Cheques Required") }}</th>
<th></th>
<th></th>
<th></th>
<th></th>
<th></th>
<th></th>
<th class="text-right">
{{ frappe.utils.fmt_money(flt(balance_row["outstanding"] - balance_row[("future_amount")]), data[data.length-1]["currency"]) }}</th>
</tr>
</tbody>
{% if(report.report_name == "Accounts Receivable" and filters.show_sales_person) %}
<td>{{ data[i]["sales_person"] }}</td>
</table>
{% endif %}
{% endif %}
<table class="table table-bordered">
<thead>
<tr>
{% if(report.report_name == "Accounts Receivable" or report.report_name == "Accounts Payable") %}
<th style="width: 10%">{{ _("Date") }}</th>
<th style="width: 4%">{{ _("Age (Days)") }}</th>
{% if(report.report_name == "Accounts Receivable" and filters.show_sales_person) %}
<th style="width: 14%">{{ _("Reference") }}</th>
<th style="width: 10%">{{ _("Sales Person") }}</th>
{% else %}
<th style="width: 24%">{{ _("Reference") }}</th>
{% endif %}
{% if not(filters.show_future_payments) %}
<th style="width: 20%">
{% if (filters.customer or filters.supplier or filters.customer_name) %}
{{ _("Remarks") }}
{% else %}
{{ _("Party") }}
{% endif %}
</th>
{% endif %}
<th style="width: 10%; text-align: right">{{ _("Invoiced Amount") }}</th>
{% if not(filters.show_future_payments) %}
<th style="width: 10%; text-align: right">{{ _("Paid Amount") }}</th>
<th style="width: 10%; text-align: right">
{% if report.report_name == "Accounts Receivable" %}
{{ _("Credit Note") }}
{% else %}
{{ _("Debit Note") }}
{% endif %}
</th>
{% endif %}
<th style="width: 10%; text-align: right">{{ _("Outstanding Amount") }}</th>
{% if(filters.show_future_payments) %}
{% if(report.report_name == "Accounts Receivable") %}
<th style="width: 12%">{{ _("Customer LPO No.") }}</th>
{% endif %}
<th style="width: 10%">{{ _("Future Payment Ref") }}</th>
<th style="width: 10%">{{ _("Future Payment Amount") }}</th>
<th style="width: 10%">{{ _("Remaining Balance") }}</th>
{% endif %}
{% else %}
<th style="width: 40%">
{% if (filters.customer or filters.supplier or filters.customer_name) %}
{{ _("Remarks")}}
{% else %}
{{ _("Party") }}
{% endif %}
</th>
<th style="width: 15%">{{ _("Total Invoiced Amount") }}</th>
<th style="width: 15%">{{ _("Total Paid Amount") }}</th>
<th style="width: 15%">
{% if report.report_name == "Accounts Receivable Summary" %}
{{ _("Credit Note Amount") }}
{% else %}
{{ _("Debit Note Amount") }}
{% endif %}
</th>
<th style="width: 15%">{{ _("Total Outstanding Amount") }}</th>
{% endif %}
</tr>
</thead>
<tbody>
{% for i in range(data|length) %}
<tr>
{% if(report.report_name == "Accounts Receivable" or report.report_name == "Accounts Payable") %}
{% if(data[i]["party"]) %}
<td>{{ (data[i]["posting_date"]) }}</td>
<td style="text-align: right">{{ data[i]["age"] }}</td>
<td>
{% if not(filters.show_future_payments) %}
{{ data[i]["voucher_type"] }}
<br>
{% endif %}
{{ data[i]["voucher_no"] }}
</td>
{% if not (filters.show_future_payments) %}
{% if(report.report_name == "Accounts Receivable" and filters.show_sales_person) %}
<td>{{ data[i]["sales_person"] }}</td>
{% endif %}
{% if not (filters.show_future_payments) %}
<td>
{% if(not(filters.customer or filters.supplier or filters.customer_name)) %}
{{ data[i]["party"] }}
{% if(data[i]["customer_name"] and data[i]["customer_name"] != data[i]["party"]) %}
<br> {{ data[i]["customer_name"] }}
{% elif(data[i]["supplier_name"] != data[i]["party"]) %}
<br> {{ data[i]["supplier_name"] }}
{% endif %}
{% endif %}
<div>
{% if data[i]["remarks"] %}
{{ _("Remarks") }}:
{{ data[i]["remarks"] }}
{% endif %}
</div>
</td>
{% endif %}
<td style="text-align: right">
{{ frappe.utils.fmt_money(data[i]["invoiced"], currency=data[i]["currency"]) }}</td>
{% if not(filters.show_future_payments) %}
<td style="text-align: right">
{{ frappe.utils.fmt_money(data[i]["paid"], currency=data[i]["currency"]) }}</td>
<td style="text-align: right">
{{ frappe.utils.fmt_money(data[i]["credit_note"], currency=data[i]["currency"]) }}</td>
{% endif %}
<td style="text-align: right">
{{ frappe.utils.fmt_money(data[i]["outstanding"], currency=data[i]["currency"]) }}</td>
{% if(filters.show_future_payments) %}
{% if(report.report_name == "Accounts Receivable") %}
<td style="text-align: right">
{{ data[i]["po_no"] }}</td>
{% endif %}
<td style="text-align: right">{{ data[i]["future_ref"] }}</td>
<td style="text-align: right">{{ frappe.utils.fmt_money(data[i]["future_amount"], currency=data[i]["currency"]) }}</td>
<td style="text-align: right">{{ frappe.utils.fmt_money(data[i]["remaining_balance"], currency=data[i]["currency"]) }}</td>
{% endif %}
{% else %}
<td></td>
{% if not(filters.show_future_payments) %}
<td></td>
{% endif %}
{% if(report.report_name == "Accounts Receivable" and filters.show_sales_person) %}
<td></td>
{% endif %}
<td></td>
<td style="text-align: right"><b>{{ _("Total") }}</b></td>
<td style="text-align: right">
{{ frappe.utils.fmt_money(data[i]["invoiced"], data[i]["currency"]) }}</td>
{% if not(filters.show_future_payments) %}
<td style="text-align: right">
{{ frappe.utils.fmt_money(data[i]["paid"], currency=data[i]["currency"]) }}</td>
<td style="text-align: right">{{ frappe.utils.fmt_money(data[i]["credit_note"], currency=data[i]["currency"]) }} </td>
{% endif %}
<td style="text-align: right">
{{ frappe.utils.fmt_money(data[i]["outstanding"], currency=data[i]["currency"]) }}</td>
{% if(filters.show_future_payments) %}
{% if(report.report_name == "Accounts Receivable") %}
<td style="text-align: right">
{{ data[i]["po_no"] }}</td>
{% endif %}
<td style="text-align: right">{{ data[i]["future_ref"] }}</td>
<td style="text-align: right">{{ frappe.utils.fmt_money(data[i]["future_amount"], currency=data[i]["currency"]) }}</td>
<td style="text-align: right">{{ frappe.utils.fmt_money(data[i]["remaining_balance"], currency=data[i]["currency"]) }}</td>
{% endif %}
{% endif %}
{% else %}
{% if(data[i]["party"] or "&nbsp;") %}
{% if not(data[i]["is_total_row"]) %}
<td>
{% if(not(filters.customer or filters.supplier or filters.customer_name)) %}
{% if(not(filters.customer | filters.supplier)) %}
{{ data[i]["party"] }}
{% if(data[i]["customer_name"] and data[i]["customer_name"] != data[i]["party"]) %}
<br> {{ data[i]["customer_name"] }}
@@ -235,132 +309,62 @@
<br> {{ data[i]["supplier_name"] }}
{% endif %}
{% endif %}
<div>
{% if data[i]["remarks"] %}
{{ _("Remarks") }}:
{{ data[i]["remarks"] }}
{% endif %}
</div>
<br>{{ _("Remarks") }}:
{{ data[i]["remarks"] }}
</td>
{% endif %}
<td style="text-align: right">
{{ frappe.utils.fmt_money(data[i]["invoiced"], currency=data[i]["currency"]) }}</td>
{% if not(filters.show_future_payments) %}
<td style="text-align: right">
{{ frappe.utils.fmt_money(data[i]["paid"], currency=data[i]["currency"]) }}</td>
<td style="text-align: right">
{{ frappe.utils.fmt_money(data[i]["credit_note"], currency=data[i]["currency"]) }}</td>
{% endif %}
<td style="text-align: right">
{{ frappe.utils.fmt_money(data[i]["outstanding"], currency=data[i]["currency"]) }}</td>
{% if(filters.show_future_payments) %}
{% if(report.report_name == "Accounts Receivable") %}
<td style="text-align: right">
{{ data[i]["po_no"] }}</td>
{% endif %}
<td style="text-align: right">{{ data[i]["future_ref"] }}</td>
<td style="text-align: right">{{ frappe.utils.fmt_money(data[i]["future_amount"], currency=data[i]["currency"]) }}</td>
<td style="text-align: right">{{ frappe.utils.fmt_money(data[i]["remaining_balance"], currency=data[i]["currency"]) }}</td>
{% endif %}
{% else %}
<td></td>
{% if not(filters.show_future_payments) %}
<td></td>
{% endif %}
{% if(report.report_name == "Accounts Receivable" and filters.show_sales_person) %}
<td></td>
{% endif %}
<td></td>
<td style="text-align: right"><b>{{ _("Total") }}</b></td>
<td style="text-align: right">
{{ frappe.utils.fmt_money(data[i]["invoiced"], data[i]["currency"]) }}</td>
{% if not(filters.show_future_payments) %}
<td style="text-align: right">
{{ frappe.utils.fmt_money(data[i]["paid"], currency=data[i]["currency"]) }}</td>
<td style="text-align: right">{{ frappe.utils.fmt_money(data[i]["credit_note"], currency=data[i]["currency"]) }} </td>
{% endif %}
<td style="text-align: right">
{{ frappe.utils.fmt_money(data[i]["outstanding"], currency=data[i]["currency"]) }}</td>
{% if(filters.show_future_payments) %}
{% if(report.report_name == "Accounts Receivable") %}
<td style="text-align: right">
{{ data[i]["po_no"] }}</td>
{% endif %}
<td style="text-align: right">{{ data[i]["future_ref"] }}</td>
<td style="text-align: right">{{ frappe.utils.fmt_money(data[i]["future_amount"], currency=data[i]["currency"]) }}</td>
<td style="text-align: right">{{ frappe.utils.fmt_money(data[i]["remaining_balance"], currency=data[i]["currency"]) }}</td>
{% endif %}
{% endif %}
{% else %}
{% if(data[i]["party"] or "&nbsp;") %}
{% if not(data[i]["is_total_row"]) %}
<td>
{% if(not(filters.customer | filters.supplier)) %}
{{ data[i]["party"] }}
{% if(data[i]["customer_name"] and data[i]["customer_name"] != data[i]["party"]) %}
<br> {{ data[i]["customer_name"] }}
{% elif(data[i]["supplier_name"] != data[i]["party"]) %}
<br> {{ data[i]["supplier_name"] }}
{% endif %}
{% endif %}
<br>{{ _("Remarks") }}:
{{ data[i]["remarks"] }}
</td>
{% else %}
<td><b>{{ _("Total") }}</b></td>
{% endif %}
<td style="text-align: right">{{ frappe.utils.fmt_money(data[i]["invoiced"], currency=data[i]["currency"]) }}</td>
<td style="text-align: right">{{ frappe.utils.fmt_money(data[i]["paid"], currency=data[i]["currency"]) }}</td>
<td style="text-align: right">{{ frappe.utils.fmt_money(data[i]["credit_note"], currency=data[i]["currency"]) }}</td>
<td style="text-align: right">{{ frappe.utils.fmt_money(data[i]["outstanding"], currency=data[i]["currency"]) }}</td>
<td><b>{{ _("Total") }}</b></td>
{% endif %}
<td style="text-align: right">{{ frappe.utils.fmt_money(data[i]["invoiced"], currency=data[i]["currency"]) }}</td>
<td style="text-align: right">{{ frappe.utils.fmt_money(data[i]["paid"], currency=data[i]["currency"]) }}</td>
<td style="text-align: right">{{ frappe.utils.fmt_money(data[i]["credit_note"], currency=data[i]["currency"]) }}</td>
<td style="text-align: right">{{ frappe.utils.fmt_money(data[i]["outstanding"], currency=data[i]["currency"]) }}</td>
{% endif %}
</tr>
{% endfor %}
<td></td>
<td></td>
<td></td>
<td></td>
<td style="text-align: right"><b>{{ frappe.utils.fmt_money(data|sum(attribute="invoiced"), currency=data[0]["currency"]) }}</b></td>
<td style="text-align: right"><b>{{ frappe.utils.fmt_money(data|sum(attribute="paid"), currency=data[0]["currency"]) }}</b></td>
<td style="text-align: right"><b>{{ frappe.utils.fmt_money(data|sum(attribute="credit_note"), currency=data[0]["currency"]) }}</b></td>
<td style="text-align: right"><b>{{ frappe.utils.fmt_money(data|sum(attribute="outstanding"), currency=data[0]["currency"]) }}</b></td>
</tbody>
</table>
<br>
{% if ageing %}
<h4 class="text-center">{{ _("Ageing Report based on ") }} {{ ageing.ageing_based_on }}
{{ _("up to " ) }} {{ frappe.format(filters.report_date, 'Date')}}
</h4>
<table class="table table-bordered">
<thead>
<tr>
<th style="width: 25%">0 - 30 Days</th>
<th style="width: 25%">30 - 60 Days</th>
<th style="width: 25%">60 - 90 Days</th>
<th style="width: 25%">90 - 120 Days</th>
<th style="width: 20%">Above 120 Days</th>
{% endif %}
</tr>
</thead>
<tbody>
<tr>
<td>{{ frappe.utils.fmt_money(ageing.range1, currency=data[0]["currency"]) }}</td>
<td>{{ frappe.utils.fmt_money(ageing.range2, currency=data[0]["currency"]) }}</td>
<td>{{ frappe.utils.fmt_money(ageing.range3, currency=data[0]["currency"]) }}</td>
<td>{{ frappe.utils.fmt_money(ageing.range4, currency=data[0]["currency"]) }}</td>
<td>{{ frappe.utils.fmt_money(ageing.range5, currency=filters.presentation_currency) }}</td>
</tr>
</tbody>
</table>
{% endif %}
{% if terms_and_conditions %}
<div>
{{ terms_and_conditions }}
</div>
{% endif %}
<p class="text-right text-muted">{{ _("Printed On ") }}{{ frappe.utils.now() }}</p>
{% endfor %}
<td></td>
<td></td>
<td></td>
<td></td>
<td style="text-align: right"><b>{{ frappe.utils.fmt_money(data|sum(attribute="invoiced"), currency=data[0]["currency"]) }}</b></td>
<td style="text-align: right"><b>{{ frappe.utils.fmt_money(data|sum(attribute="paid"), currency=data[0]["currency"]) }}</b></td>
<td style="text-align: right"><b>{{ frappe.utils.fmt_money(data|sum(attribute="credit_note"), currency=data[0]["currency"]) }}</b></td>
<td style="text-align: right"><b>{{ frappe.utils.fmt_money(data|sum(attribute="outstanding"), currency=data[0]["currency"]) }}</b></td>
</tbody>
</table>
<br>
{% if ageing %}
<h4 class="text-center">
{{ _("Ageing Report based on {0} up to {1}").format(
ageing.ageing_based_on,
frappe.format(filters.report_date, "Date")
) }}
</h4>
<table class="table table-bordered">
<thead>
<tr>
<th style="width: 25%">{{ _("0 - 30 Days") }}</th>
<th style="width: 25%">{{ _("30 - 60 Days") }}</th>
<th style="width: 25%">{{ _("60 - 90 Days") }}</th>
<th style="width: 25%">{{ _("90 - 120 Days") }}</th>
<th style="width: 20%">{{ _("Above 120 Days") }}</th>
</tr>
</thead>
<tbody>
<tr>
<td>{{ frappe.utils.fmt_money(ageing.range1, currency=data[0]["currency"]) }}</td>
<td>{{ frappe.utils.fmt_money(ageing.range2, currency=data[0]["currency"]) }}</td>
<td>{{ frappe.utils.fmt_money(ageing.range3, currency=data[0]["currency"]) }}</td>
<td>{{ frappe.utils.fmt_money(ageing.range4, currency=data[0]["currency"]) }}</td>
<td>{{ frappe.utils.fmt_money(ageing.range5, currency=filters.presentation_currency) }}</td>
</tr>
</tbody>
</table>
{% endif %}
{% if terms_and_conditions %}
<div>
{{ terms_and_conditions }}
</div>
{% endif %}
<p class="text-right text-muted">{{ _("Printed on {0}").format(frappe.utils.now()) }}</p>

View File

@@ -46,5 +46,11 @@ frappe.query_reports["Asset Depreciations and Balances"] = {
options: "Asset",
depends_on: "eval: doc.group_by == 'Asset'",
},
{
fieldname: "finance_book",
label: __("Finance Book"),
fieldtype: "Link",
options: "Finance Book",
},
],
};

View File

@@ -69,6 +69,9 @@ def get_asset_categories_for_grouped_by_category(filters):
condition = ""
if filters.get("asset_category"):
condition += " and asset_category = %(asset_category)s"
if filters.get("finance_book"):
condition += " and exists (select 1 from `tabAsset Depreciation Schedule` ads where ads.asset = a.name and ads.finance_book = %(finance_book)s)"
# nosemgrep
return frappe.db.sql(
f"""
@@ -119,6 +122,7 @@ def get_asset_categories_for_grouped_by_category(filters):
"from_date": filters.from_date,
"company": filters.company,
"asset_category": filters.get("asset_category"),
"finance_book": filters.get("finance_book"),
},
as_dict=1,
)
@@ -128,6 +132,10 @@ def get_asset_details_for_grouped_by_category(filters):
condition = ""
if filters.get("asset"):
condition += " and name = %(asset)s"
if filters.get("finance_book"):
condition += " and exists (select 1 from `tabAsset Depreciation Schedule` ads where ads.asset = `tabAsset`.name and ads.finance_book = %(finance_book)s)"
# nosemgrep
return frappe.db.sql(
f"""
SELECT name,
@@ -176,6 +184,7 @@ def get_asset_details_for_grouped_by_category(filters):
"from_date": filters.from_date,
"company": filters.company,
"asset": filters.get("asset"),
"finance_book": filters.get("finance_book"),
},
as_dict=1,
)

View File

@@ -46,4 +46,20 @@ frappe.query_reports["Bank Reconciliation Statement"] = {
fieldtype: "Check",
},
],
formatter: function (value, row, column, data, default_formatter, filter) {
if (column.fieldname == "payment_entry" && value == "Cheques and Deposits incorrectly cleared") {
column.link_onclick =
"frappe.query_reports['Bank Reconciliation Statement'].open_utility_report()";
}
return default_formatter(value, row, column, data);
},
open_utility_report: function () {
frappe.route_options = {
company: frappe.query_report.get_filter_value("company"),
account: frappe.query_report.get_filter_value("account"),
report_date: frappe.query_report.get_filter_value("report_date"),
};
frappe.open_in_new_tab = true;
frappe.set_route("query-report", "Cheques and Deposits Incorrectly cleared");
},
};

View File

@@ -154,8 +154,8 @@ def get_payment_entries(filters):
select
"Payment Entry" as payment_document, name as payment_entry,
reference_no, reference_date as ref_date,
if(paid_to=%(account)s, received_amount, 0) as debit,
if(paid_from=%(account)s, paid_amount, 0) as credit,
if(paid_to=%(account)s, received_amount_after_tax, 0) as debit,
if(paid_from=%(account)s, paid_amount_after_tax, 0) as credit,
posting_date, ifnull(party,if(paid_from=%(account)s,paid_to,paid_from)) as against_account, clearance_date,
if(paid_to=%(account)s, paid_to_account_currency, paid_from_account_currency) as account_currency
from `tabPayment Entry`

View File

@@ -694,12 +694,17 @@ class Asset(AccountsController):
return cwip_account
def make_gl_entries(self):
if self.check_asset_capitalization_gl_entries():
return
gl_entries = []
purchase_document = self.get_purchase_document()
fixed_asset_account, cwip_account = self.get_fixed_asset_account(), self.get_cwip_account()
if purchase_document and self.purchase_amount and getdate(self.available_for_use_date) <= getdate():
if (self.is_composite_asset or (purchase_document and self.purchase_amount)) and getdate(
self.available_for_use_date
) <= getdate():
gl_entries.append(
self.get_gl_dict(
{
@@ -736,6 +741,24 @@ class Asset(AccountsController):
make_gl_entries(gl_entries)
self.db_set("booked_fixed_asset", 1)
def check_asset_capitalization_gl_entries(self):
if self.is_composite_asset:
result = frappe.db.get_value(
"Asset Capitalization",
{"target_asset": self.name, "docstatus": 1},
["name", "target_fixed_asset_account"],
)
if result:
asset_capitalization, target_fixed_asset_account = result
# Check GL entries for the retrieved Asset Capitalization and target fixed asset account
return has_gl_entries(
"Asset Capitalization", asset_capitalization, target_fixed_asset_account
)
# return if there are no submitted capitalization for given asset
return True
return False
@frappe.whitelist()
def get_depreciation_rate(self, args, on_validate=False):
if isinstance(args, str):
@@ -782,6 +805,22 @@ class Asset(AccountsController):
return flt((100 * (1 - depreciation_rate)), float_precision)
def has_gl_entries(doctype, docname, target_account):
gl_entry = frappe.qb.DocType("GL Entry")
gl_entries = (
frappe.qb.from_(gl_entry)
.select(gl_entry.account)
.where(
(gl_entry.voucher_type == doctype)
& (gl_entry.voucher_no == docname)
& (gl_entry.debit != 0)
& (gl_entry.account == target_account)
)
.run(as_dict=True)
)
return len(gl_entries) > 0
def update_maintenance_status():
assets = frappe.get_all(
"Asset", filters={"docstatus": 1, "maintenance_required": 1, "disposal_date": ("is", "not set")}

View File

@@ -317,7 +317,16 @@ class AssetCapitalization(StockController):
if not self.target_is_fixed_asset and not self.get("asset_items"):
frappe.throw(_("Consumed Asset Items is mandatory for Decapitalization"))
if not (self.get("stock_items") or self.get("asset_items") or self.get("service_items")):
if self.capitalization_method == "Create a new composite asset" and not (
self.get("stock_items") or self.get("asset_items")
):
frappe.throw(
_(
"Consumed Stock Items or Consumed Asset Items are mandatory for creating new composite asset"
)
)
elif not (self.get("stock_items") or self.get("asset_items") or self.get("service_items")):
frappe.throw(
_(
"Consumed Stock Items, Consumed Asset Items or Consumed Service Items is mandatory for Capitalization"
@@ -460,13 +469,24 @@ class AssetCapitalization(StockController):
self.get_gl_entries_for_consumed_asset_items(gl_entries, target_account, target_against, precision)
self.get_gl_entries_for_consumed_service_items(gl_entries, target_account, target_against, precision)
self.get_gl_entries_for_target_item(gl_entries, target_against, precision)
self.get_gl_entries_for_target_item(gl_entries, target_account, target_against, precision)
return gl_entries
def get_target_account(self):
if self.target_is_fixed_asset:
return self.target_fixed_asset_account
from erpnext.assets.doctype.asset.asset import is_cwip_accounting_enabled
asset_category = frappe.get_cached_value("Asset", self.target_asset, "asset_category")
if is_cwip_accounting_enabled(asset_category):
target_account = get_asset_category_account(
"capital_work_in_progress_account",
asset_category=asset_category,
company=self.company,
)
return target_account if target_account else self.target_fixed_asset_account
else:
return self.target_fixed_asset_account
else:
return self.warehouse_account[self.target_warehouse]["account"]
@@ -554,13 +574,13 @@ class AssetCapitalization(StockController):
)
)
def get_gl_entries_for_target_item(self, gl_entries, target_against, precision):
def get_gl_entries_for_target_item(self, gl_entries, target_account, target_against, precision):
if self.target_is_fixed_asset:
# Capitalization
gl_entries.append(
self.get_gl_dict(
{
"account": self.target_fixed_asset_account,
"account": target_account,
"against": ", ".join(target_against),
"remarks": self.get("remarks") or _("Accounting Entry for Asset"),
"debit": flt(self.total_value, precision),

View File

@@ -187,9 +187,10 @@ class TestAssetCapitalization(unittest.TestCase):
# Test General Ledger Entries
default_expense_account = frappe.db.get_value("Company", company, "default_expense_account")
expected_gle = {
"_Test Fixed Asset - _TC": 3000,
"Expenses Included In Asset Valuation - _TC": -1000,
default_expense_account: -2000,
"_Test Fixed Asset - _TC": -100000.0,
default_expense_account: -2000.0,
"CWIP Account - _TC": 103000.0,
"Expenses Included In Asset Valuation - _TC": -1000.0,
}
actual_gle = get_actual_gle_dict(asset_capitalization.name)
@@ -424,7 +425,7 @@ class TestAssetCapitalization(unittest.TestCase):
self.assertEqual(target_asset.purchase_amount, total_amount)
expected_gle = {
"_Test Fixed Asset - _TC": 1000.0,
"CWIP Account - _TC": 1000.0,
"Expenses Included In Asset Valuation - _TC": -1000.0,
}

View File

@@ -5,7 +5,6 @@ frappe.provide("erpnext.accounts.dimensions");
frappe.ui.form.on("Asset Value Adjustment", {
setup: function (frm) {
frm.add_fetch("company", "cost_center", "cost_center");
frm.set_query("cost_center", function () {
return {
filters: {
@@ -22,6 +21,14 @@ frappe.ui.form.on("Asset Value Adjustment", {
},
};
});
frm.set_query("difference_account", function () {
return {
filters: {
company: frm.doc.company,
is_group: 0,
},
};
});
},
onload: function (frm) {
@@ -37,7 +44,7 @@ frappe.ui.form.on("Asset Value Adjustment", {
},
asset: function (frm) {
frm.trigger("set_current_asset_value");
frm.trigger("set_acc_dimension");
},
finance_book: function (frm) {
@@ -60,4 +67,15 @@ frappe.ui.form.on("Asset Value Adjustment", {
});
}
},
set_acc_dimension: function (frm) {
if (frm.doc.asset) {
frm.call({
method: "erpnext.assets.doctype.asset_value_adjustment.asset_value_adjustment.get_value_of_accounting_dimensions",
args: {
asset_name: frm.doc.asset,
},
});
}
},
});

View File

@@ -17,6 +17,7 @@
"new_asset_value",
"column_break_11",
"difference_amount",
"difference_account",
"journal_entry",
"accounting_dimensions_section",
"cost_center",
@@ -54,6 +55,7 @@
"fieldtype": "Link",
"label": "Journal Entry",
"options": "Journal Entry",
"no_copy": 1,
"read_only": 1
},
{
@@ -79,6 +81,7 @@
"fieldtype": "Currency",
"in_list_view": 1,
"label": "New Asset Value",
"no_copy": 1,
"reqd": 1
},
{
@@ -120,12 +123,20 @@
{
"fieldname": "column_break_11",
"fieldtype": "Column Break"
},
{
"fieldname": "difference_account",
"fieldtype": "Link",
"label": "Difference Account",
"no_copy": 1,
"options": "Account",
"reqd": 1
}
],
"index_web_pages_for_search": 1,
"is_submittable": 1,
"links": [],
"modified": "2024-03-27 13:06:36.004049",
"modified": "2024-08-13 16:21:18.639208",
"modified_by": "Administrator",
"module": "Assets",
"name": "Asset Value Adjustment",

View File

@@ -34,6 +34,7 @@ class AssetValueAdjustment(Document):
cost_center: DF.Link | None
current_asset_value: DF.Currency
date: DF.Date
difference_account: DF.Link
difference_amount: DF.Currency
finance_book: DF.Link | None
journal_entry: DF.Link | None
@@ -47,6 +48,7 @@ class AssetValueAdjustment(Document):
def on_submit(self):
self.make_depreciation_entry()
self.set_value_after_depreciation()
self.update_asset(self.new_asset_value)
add_asset_activity(
self.asset,
@@ -76,7 +78,10 @@ class AssetValueAdjustment(Document):
)
def set_difference_amount(self):
self.difference_amount = flt(self.current_asset_value - self.new_asset_value)
self.difference_amount = flt(self.new_asset_value - self.current_asset_value)
def set_value_after_depreciation(self):
frappe.db.set_value("Asset", self.asset, "value_after_depreciation", self.new_asset_value)
def set_current_asset_value(self):
if not self.current_asset_value and self.asset:
@@ -85,7 +90,7 @@ class AssetValueAdjustment(Document):
def make_depreciation_entry(self):
asset = frappe.get_doc("Asset", self.asset)
(
_,
fixed_asset_account,
accumulated_depreciation_account,
depreciation_expense_account,
) = get_depreciation_accounts(asset.asset_category, asset.company)
@@ -95,28 +100,41 @@ class AssetValueAdjustment(Document):
)
je = frappe.new_doc("Journal Entry")
je.voucher_type = "Depreciation Entry"
je.voucher_type = "Journal Entry"
je.naming_series = depreciation_series
je.posting_date = self.date
je.company = self.company
je.remark = f"Depreciation Entry against {self.asset} worth {self.difference_amount}"
je.remark = f"Revaluation Entry against {self.asset} worth {self.difference_amount}"
je.finance_book = self.finance_book
credit_entry = {
"account": accumulated_depreciation_account,
"credit_in_account_currency": self.difference_amount,
"cost_center": depreciation_cost_center or self.cost_center,
entry_template = {
"cost_center": self.cost_center or depreciation_cost_center,
"reference_type": "Asset",
"reference_name": self.asset,
"reference_name": asset.name,
}
debit_entry = {
"account": depreciation_expense_account,
"debit_in_account_currency": self.difference_amount,
"cost_center": depreciation_cost_center or self.cost_center,
"reference_type": "Asset",
"reference_name": self.asset,
}
if self.difference_amount < 0:
credit_entry = {
"account": fixed_asset_account,
"credit_in_account_currency": -self.difference_amount,
**entry_template,
}
debit_entry = {
"account": self.difference_account,
"debit_in_account_currency": -self.difference_amount,
**entry_template,
}
elif self.difference_amount > 0:
credit_entry = {
"account": self.difference_account,
"credit_in_account_currency": self.difference_amount,
**entry_template,
}
debit_entry = {
"account": fixed_asset_account,
"debit_in_account_currency": self.difference_amount,
**entry_template,
}
accounting_dimensions = get_checks_for_pl_and_bs_accounts()
@@ -179,3 +197,9 @@ class AssetValueAdjustment(Document):
)
asset.flags.ignore_validate_update_after_submit = True
asset.save()
@frappe.whitelist()
def get_value_of_accounting_dimensions(asset_name):
dimension_fields = [*frappe.get_list("Accounting Dimension", pluck="fieldname"), "cost_center"]
return frappe.db.get_value("Asset", asset_name, fieldname=dimension_fields, as_dict=True)

View File

@@ -93,8 +93,8 @@ class TestAssetValueAdjustment(unittest.TestCase):
self.assertEqual(first_asset_depr_schedule.status, "Cancelled")
expected_gle = (
("_Test Accumulated Depreciations - _TC", 0.0, 4625.29),
("_Test Depreciations - _TC", 4625.29, 0.0),
("_Test Difference Account - _TC", 4625.29, 0.0),
("_Test Fixed Asset - _TC", 0.0, 4625.29),
)
gle = frappe.db.sql(
@@ -177,8 +177,8 @@ class TestAssetValueAdjustment(unittest.TestCase):
# Test gl entry creted from asset value adjustemnet
expected_gle = (
("_Test Accumulated Depreciations - _TC", 0.0, 5625.29),
("_Test Depreciations - _TC", 5625.29, 0.0),
("_Test Difference Account - _TC", 5625.29, 0.0),
("_Test Fixed Asset - _TC", 0.0, 5625.29),
)
gle = frappe.db.sql(
@@ -259,6 +259,39 @@ class TestAssetValueAdjustment(unittest.TestCase):
self.assertEqual(schedules, expected_schedules)
def test_difference_amount(self):
pr = make_purchase_receipt(item_code="Macbook Pro", qty=1, rate=120000.0, location="Test Location")
asset_name = frappe.db.get_value("Asset", {"purchase_receipt": pr.name}, "name")
asset_doc = frappe.get_doc("Asset", asset_name)
asset_doc.calculate_depreciation = 1
asset_doc.available_for_use_date = "2023-01-15"
asset_doc.purchase_date = "2023-01-15"
asset_doc.append(
"finance_books",
{
"expected_value_after_useful_life": 200,
"depreciation_method": "Straight Line",
"total_number_of_depreciations": 12,
"frequency_of_depreciation": 1,
"depreciation_start_date": "2023-01-31",
},
)
asset_doc.submit()
adj_doc = make_asset_value_adjustment(
asset=asset_doc.name,
current_asset_value=54000,
new_asset_value=50000.0,
date="2023-08-21",
)
adj_doc.submit()
difference_amount = adj_doc.new_asset_value - adj_doc.current_asset_value
self.assertEqual(difference_amount, -4000)
asset_doc.load_from_db()
self.assertEqual(asset_doc.value_after_depreciation, 50000.0)
def make_asset_value_adjustment(**args):
args = frappe._dict(args)
@@ -272,7 +305,22 @@ def make_asset_value_adjustment(**args):
"new_asset_value": args.new_asset_value,
"current_asset_value": args.current_asset_value,
"cost_center": args.cost_center or "Main - _TC",
"difference_account": make_difference_account(),
}
).insert()
return doc
def make_difference_account(**args):
account = "_Test Difference Account - _TC"
if not frappe.db.exists("Account", account):
acc = frappe.new_doc("Account")
acc.account_name = "_Test Difference Account"
acc.parent_account = "Direct Income - _TC"
acc.company = "_Test Company"
acc.is_group = 0
acc.insert()
return acc.name
else:
return account

View File

@@ -97,7 +97,7 @@ class Supplier(TransactionBase):
elif supp_master_name == "Naming Series":
set_name_by_naming_series(self)
else:
self.name = set_name_from_naming_options(frappe.get_meta(self.doctype).autoname, self)
set_name_from_naming_options(frappe.get_meta(self.doctype).autoname, self)
def on_update(self):
self.create_primary_contact()

View File

@@ -0,0 +1,62 @@
// Copyright (c) 2024, Frappe Technologies Pvt. Ltd. and contributors
// For license information, please see license.txt
frappe.query_reports["Item-wise Purchase History"] = {
filters: [
{
fieldname: "company",
label: __("Company"),
fieldtype: "Link",
options: "Company",
default: frappe.defaults.get_user_default("Company"),
reqd: 1,
},
{
fieldname: "from_date",
reqd: 1,
label: __("From Date"),
fieldtype: "Date",
default: frappe.datetime.add_months(frappe.datetime.get_today(), -1),
},
{
fieldname: "to_date",
reqd: 1,
default: frappe.datetime.get_today(),
label: __("To Date"),
fieldtype: "Date",
},
{
fieldname: "item_group",
label: __("Item Group"),
fieldtype: "Link",
options: "Item Group",
},
{
fieldname: "item_code",
label: __("Item"),
fieldtype: "Link",
options: "Item",
get_query: () => {
return {
query: "erpnext.controllers.queries.item_query",
};
},
},
{
fieldname: "supplier",
label: __("Supplier"),
fieldtype: "Link",
options: "Supplier",
},
],
formatter: function (value, row, column, data, default_formatter) {
value = default_formatter(value, row, column, data);
let format_fields = ["received_qty", "billed_amt"];
if (format_fields.includes(column.fieldname) && data && data[column.fieldname] > 0) {
value = "<span style='color:green;'>" + value + "</span>";
}
return value;
},
};

View File

@@ -1,30 +1,30 @@
{
"add_total_row": 1,
"apply_user_permissions": 1,
"creation": "2013-05-03 14:55:53",
"disabled": 0,
"docstatus": 0,
"doctype": "Report",
"idx": 3,
"is_standard": "Yes",
"modified": "2017-02-24 20:08:57.446613",
"modified_by": "Administrator",
"module": "Buying",
"name": "Item-wise Purchase History",
"owner": "Administrator",
"query": "select\n po_item.item_code as \"Item Code:Link/Item:120\",\n\tpo_item.item_name as \"Item Name::120\",\n po_item.item_group as \"Item Group:Link/Item Group:120\",\n\tpo_item.description as \"Description::150\",\n\tpo_item.qty as \"Qty:Float:100\",\n\tpo_item.uom as \"UOM:Link/UOM:80\",\n\tpo_item.base_rate as \"Rate:Currency:120\",\n\tpo_item.base_amount as \"Amount:Currency:120\",\n\tpo.name as \"Purchase Order:Link/Purchase Order:120\",\n\tpo.transaction_date as \"Transaction Date:Date:140\",\n\tpo.supplier as \"Supplier:Link/Supplier:130\",\n sup.supplier_name as \"Supplier Name::150\",\n\tpo_item.project as \"Project:Link/Project:130\",\n\tifnull(po_item.received_qty, 0) as \"Received Qty:Float:120\",\n\tpo.company as \"Company:Link/Company:\"\nfrom\n\t`tabPurchase Order` po, `tabPurchase Order Item` po_item, `tabSupplier` sup\nwhere\n\tpo.name = po_item.parent and po.supplier = sup.name and po.docstatus = 1\norder by po.name desc",
"ref_doctype": "Purchase Order",
"report_name": "Item-wise Purchase History",
"report_type": "Query Report",
"add_total_row": 1,
"creation": "2013-05-03 14:55:53",
"disable_prepared_report": 0,
"disabled": 0,
"docstatus": 0,
"doctype": "Report",
"idx": 5,
"is_standard": "Yes",
"modified": "2024-06-19 12:12:15.418799",
"modified_by": "Administrator",
"module": "Buying",
"name": "Item-wise Purchase History",
"owner": "Administrator",
"prepared_report": 0,
"ref_doctype": "Purchase Order",
"report_name": "Item-wise Purchase History",
"report_type": "Script Report",
"roles": [
{
"role": "Stock User"
},
},
{
"role": "Purchase Manager"
},
},
{
"role": "Purchase User"
}
]
]
}

View File

@@ -0,0 +1,276 @@
# Copyright (c) 2024, Frappe Technologies Pvt. Ltd. and contributors
# For license information, please see license.txt
import frappe
from frappe import _
from frappe.utils import flt
from frappe.utils.nestedset import get_descendants_of
def execute(filters=None):
filters = frappe._dict(filters or {})
if filters.from_date > filters.to_date:
frappe.throw(_("From Date cannot be greater than To Date"))
columns = get_columns(filters)
data = get_data(filters)
chart_data = get_chart_data(data)
return columns, data, None, chart_data
def get_columns(filters):
return [
{
"label": _("Item Code"),
"fieldtype": "Link",
"fieldname": "item_code",
"options": "Item",
"width": 120,
},
{
"label": _("Item Name"),
"fieldtype": "Data",
"fieldname": "item_name",
"width": 140,
},
{
"label": _("Item Group"),
"fieldtype": "Link",
"fieldname": "item_group",
"options": "Item Group",
"width": 120,
},
{
"label": _("Description"),
"fieldtype": "Data",
"fieldname": "description",
"width": 140,
},
{
"label": _("Quantity"),
"fieldtype": "Float",
"fieldname": "quantity",
"width": 120,
},
{
"label": _("UOM"),
"fieldtype": "Link",
"fieldname": "uom",
"options": "UOM",
"width": 90,
},
{
"label": _("Rate"),
"fieldname": "rate",
"fieldtype": "Currency",
"options": "currency",
"width": 120,
},
{
"label": _("Amount"),
"fieldname": "amount",
"fieldtype": "Currency",
"options": "currency",
"width": 120,
},
{
"label": _("Purchase Order"),
"fieldtype": "Link",
"fieldname": "purchase_order",
"options": "Purchase Order",
"width": 160,
},
{
"label": _("Transaction Date"),
"fieldtype": "Date",
"fieldname": "transaction_date",
"width": 110,
},
{
"label": _("Supplier"),
"fieldtype": "Link",
"fieldname": "supplier",
"options": "Supplier",
"width": 100,
},
{
"label": _("Supplier Name"),
"fieldtype": "Data",
"fieldname": "supplier_name",
"width": 140,
},
{
"label": _("Supplier Group"),
"fieldtype": "Link",
"fieldname": "supplier_group",
"options": "Supplier Group",
"width": 120,
},
{
"label": _("Project"),
"fieldtype": "Link",
"fieldname": "project",
"options": "Project",
"width": 100,
},
{
"label": _("Received Quantity"),
"fieldtype": "Float",
"fieldname": "received_qty",
"width": 150,
},
{
"label": _("Billed Amount"),
"fieldtype": "Currency",
"fieldname": "billed_amt",
"options": "currency",
"width": 120,
},
{
"label": _("Company"),
"fieldtype": "Link",
"fieldname": "company",
"options": "Company",
"width": 100,
},
{
"label": _("Currency"),
"fieldtype": "Link",
"fieldname": "currency",
"options": "Currency",
"hidden": 1,
},
]
def get_data(filters):
data = []
company_list = get_descendants_of("Company", filters.get("company"))
company_list.append(filters.get("company"))
supplier_details = get_supplier_details()
item_details = get_item_details()
purchase_order_records = get_purchase_order_details(company_list, filters)
for record in purchase_order_records:
supplier_record = supplier_details.get(record.supplier)
item_record = item_details.get(record.item_code)
row = {
"item_code": record.get("item_code"),
"item_name": item_record.get("item_name"),
"item_group": item_record.get("item_group"),
"description": record.get("description"),
"quantity": record.get("qty"),
"uom": record.get("uom"),
"rate": record.get("base_rate"),
"amount": record.get("base_amount"),
"purchase_order": record.get("name"),
"transaction_date": record.get("transaction_date"),
"supplier": record.get("supplier"),
"supplier_name": supplier_record.get("supplier_name"),
"supplier_group": supplier_record.get("supplier_group"),
"project": record.get("project"),
"received_qty": flt(record.get("received_qty")),
"billed_amt": flt(record.get("billed_amt")),
"company": record.get("company"),
}
row["currency"] = frappe.get_cached_value("Company", row["company"], "default_currency")
data.append(row)
return data
def get_supplier_details():
details = frappe.get_all("Supplier", fields=["name", "supplier_name", "supplier_group"])
supplier_details = {}
for d in details:
supplier_details.setdefault(
d.name,
frappe._dict({"supplier_name": d.supplier_name, "supplier_group": d.supplier_group}),
)
return supplier_details
def get_item_details():
details = frappe.db.get_all("Item", fields=["name", "item_name", "item_group"])
item_details = {}
for d in details:
item_details.setdefault(d.name, frappe._dict({"item_name": d.item_name, "item_group": d.item_group}))
return item_details
def get_purchase_order_details(company_list, filters):
db_po = frappe.qb.DocType("Purchase Order")
db_po_item = frappe.qb.DocType("Purchase Order Item")
query = (
frappe.qb.from_(db_po)
.inner_join(db_po_item)
.on(db_po_item.parent == db_po.name)
.select(
db_po.name,
db_po.supplier,
db_po.transaction_date,
db_po.project,
db_po.company,
db_po_item.item_code,
db_po_item.description,
db_po_item.qty,
db_po_item.uom,
db_po_item.base_rate,
db_po_item.base_amount,
db_po_item.received_qty,
(db_po_item.billed_amt * db_po.conversion_rate).as_("billed_amt"),
)
.where(db_po.docstatus == 1)
.where(db_po.company.isin(tuple(company_list)))
)
for field in ("item_code", "item_group"):
if filters.get(field):
query = query.where(db_po_item[field] == filters[field])
if filters.get("from_date"):
query = query.where(db_po.transaction_date >= filters.from_date)
if filters.get("to_date"):
query = query.where(db_po.transaction_date <= filters.to_date)
if filters.get("supplier"):
query = query.where(db_po.supplier == filters.supplier)
return query.run(as_dict=1)
def get_chart_data(data):
item_wise_purchase_map = {}
labels, datapoints = [], []
for row in data:
item_key = row.get("item_code")
if item_key not in item_wise_purchase_map:
item_wise_purchase_map[item_key] = 0
item_wise_purchase_map[item_key] = flt(item_wise_purchase_map[item_key]) + flt(row.get("amount"))
item_wise_purchase_map = {
item: value
for item, value in (sorted(item_wise_purchase_map.items(), key=lambda i: i[1], reverse=True))
}
for key in item_wise_purchase_map:
labels.append(key)
datapoints.append(item_wise_purchase_map[key])
return {
"data": {
"labels": labels[:30], # show max of 30 items in chart
"datasets": [{"name": _("Total Purchase Amount"), "values": datapoints[:30]}],
},
"type": "bar",
"fieldtype": "Currency",
}

View File

@@ -16,11 +16,11 @@ add_to_apps_screen = [
"logo": "/assets/erpnext/images/erpnext-logo-blue.png",
"title": "ERPNext",
"route": "/app/home",
# "has_permission": "erpnext.api.permission.has_app_permission"
"has_permission": "erpnext.check_app_permission",
}
]
develop_version = "14.x.x-develop"
develop_version = "15.x.x-develop"
app_include_js = "erpnext.bundle.js"
app_include_css = "erpnext.bundle.css"
@@ -547,6 +547,8 @@ accounting_dimension_doctypes = [
"Payment Reconciliation",
"Payment Reconciliation Allocation",
"Payment Request",
"Asset Movement Item",
"Asset Depreciation Schedule",
]
get_matching_queries = (

View File

@@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: frappe\n"
"Report-Msgid-Bugs-To: info@erpnext.com\n"
"POT-Creation-Date: 2024-08-18 09:35+0000\n"
"PO-Revision-Date: 2024-08-18 12:36\n"
"PO-Revision-Date: 2024-08-28 15:39\n"
"Last-Translator: info@erpnext.com\n"
"Language-Team: German\n"
"MIME-Version: 1.0\n"
@@ -1956,7 +1956,7 @@ msgstr "Konto: {0} mit Währung: {1} kann nicht ausgewählt werden"
#: setup/setup_wizard/data/designation.txt:1
msgid "Accountant"
msgstr ""
msgstr "Buchhalter:in"
#. Label of the section_break_19 (Section Break) field in DocType 'POS Profile'
#. Label of the accounting (Section Break) field in DocType 'Purchase Invoice
@@ -3712,7 +3712,7 @@ msgstr "Anpassung basierend auf dem Rechnungspreis"
#: setup/setup_wizard/data/designation.txt:2
msgid "Administrative Assistant"
msgstr ""
msgstr "Verwaltungsassistent:in"
#: accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts.py:54
#: accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts_with_account_number.py:79
@@ -3721,7 +3721,7 @@ msgstr "Verwaltungskosten"
#: setup/setup_wizard/data/designation.txt:3
msgid "Administrative Officer"
msgstr ""
msgstr "Verwaltungsangestellte:r"
#. Name of a role
#: accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.json
@@ -3838,15 +3838,15 @@ msgstr "Anzahlungen"
#: setup/setup_wizard/data/lead_source.txt:3
msgid "Advertisement"
msgstr ""
msgstr "Werbung"
#: setup/setup_wizard/data/industry_type.txt:2
msgid "Advertising"
msgstr ""
msgstr "Werbung"
#: setup/setup_wizard/data/industry_type.txt:3
msgid "Aerospace"
msgstr ""
msgstr "Luft- und Raumfahrt"
#. Label of the affected_transactions (Code) field in DocType 'Repost Item
#. Valuation'
@@ -4073,7 +4073,7 @@ msgstr "Tagesordnung"
#: setup/setup_wizard/data/sales_partner_type.txt:4
msgid "Agent"
msgstr ""
msgstr "Agent"
#. Label of the agent_busy_message (Data) field in DocType 'Incoming Call
#. Settings'
@@ -4118,7 +4118,7 @@ msgstr "Fassen Sie eine Gruppe von Artikeln in einem anderen Artikel zusammen. D
#: setup/setup_wizard/data/industry_type.txt:4
msgid "Agriculture"
msgstr ""
msgstr "Landwirtschaft"
#. Name of a role
#: assets/doctype/location/location.json
@@ -4132,7 +4132,7 @@ msgstr "Benutzer Landwirtschaft"
#: setup/setup_wizard/data/industry_type.txt:5
msgid "Airline"
msgstr ""
msgstr "Fluggesellschaft"
#. Label of the algorithm (Select) field in DocType 'Bisect Accounting
#. Statements'
@@ -4506,7 +4506,7 @@ msgstr "Zulassen, dass ein Element in einer Transaktion mehrmals hinzugefügt wi
#: controllers/selling_controller.py:697
msgid "Allow Item to Be Added Multiple Times in a Transaction"
msgstr ""
msgstr "Mehrfaches Hinzufügen von Artikeln in einer Transaktion zulassen"
#. Label of the allow_multiple_items (Check) field in DocType 'Selling
#. Settings'
@@ -5296,7 +5296,7 @@ msgstr "Beim Erstellen von Materialanfragen basierend auf der Nachbestellstufe i
#: setup/setup_wizard/data/designation.txt:4
msgid "Analyst"
msgstr ""
msgstr "Analyst"
#: accounts/doctype/budget/budget.py:235
msgid "Annual"
@@ -5346,7 +5346,7 @@ msgstr "Einer der folgenden Filter ist erforderlich: Lager, Artikelcode, Artikel
#: setup/setup_wizard/data/industry_type.txt:6
msgid "Apparel & Accessories"
msgstr ""
msgstr "Bekleidung & Accessoires"
#. Label of the applicable_charges (Currency) field in DocType 'Landed Cost
#. Item'
@@ -6796,7 +6796,7 @@ msgstr "Ausgleichsbuchung automatisch vornehmen"
#: setup/setup_wizard/data/industry_type.txt:7
msgid "Automotive"
msgstr ""
msgstr "Automobilindustrie"
#. Label of the availability_of_slots (Table) field in DocType 'Appointment
#. Booking Settings'
@@ -7004,7 +7004,7 @@ msgstr "Breitensuche"
#. Request Plan Item'
#: manufacturing/doctype/material_request_plan_item/material_request_plan_item.json
msgid "BIN Qty"
msgstr ""
msgstr "BIN Menge"
#. Label of the bom (Link) field in DocType 'Purchase Invoice Item'
#. Option for the 'Backflush Raw Materials of Subcontract Based On' (Select)
@@ -8415,7 +8415,7 @@ msgstr "Biot"
#: setup/setup_wizard/data/industry_type.txt:9
msgid "Biotechnology"
msgstr ""
msgstr "Biotechnologie"
#. Name of a DocType
#: accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.json
@@ -8760,11 +8760,11 @@ msgstr "Ausfall"
#: setup/setup_wizard/data/industry_type.txt:10
msgid "Broadcasting"
msgstr ""
msgstr "Rundfunk"
#: setup/setup_wizard/data/industry_type.txt:11
msgid "Brokerage"
msgstr ""
msgstr "Makler"
#: manufacturing/doctype/bom/bom.js:144
msgid "Browse BOM"
@@ -10262,7 +10262,7 @@ msgstr "Kaufabwicklung / Bestellung abschicken / Neue Bestellung"
#: setup/setup_wizard/data/industry_type.txt:12
msgid "Chemical"
msgstr ""
msgstr "Chemische Industrie"
#. Option for the 'Salary Mode' (Select) field in DocType 'Employee'
#: setup/doctype/employee/employee.json
@@ -10323,19 +10323,19 @@ msgstr "Schecks und Kautionen fälschlicherweise gelöscht"
#: setup/setup_wizard/data/designation.txt:9
msgid "Chief Executive Officer"
msgstr ""
msgstr "Geschäftsführer"
#: setup/setup_wizard/data/designation.txt:10
msgid "Chief Financial Officer"
msgstr ""
msgstr "Finanzvorstand"
#: setup/setup_wizard/data/designation.txt:11
msgid "Chief Operating Officer"
msgstr ""
msgstr "Operativer Geschäftsführer"
#: setup/setup_wizard/data/designation.txt:12
msgid "Chief Technology Officer"
msgstr ""
msgstr "Technischer Leiter"
#. Label of the child_docname (Data) field in DocType 'Pricing Rule Detail'
#: accounts/doctype/pricing_rule_detail/pricing_rule_detail.json
@@ -10658,7 +10658,7 @@ msgstr "Code"
#: setup/setup_wizard/data/lead_source.txt:4
msgid "Cold Calling"
msgstr ""
msgstr "Kaltakquise"
#: public/js/setup_wizard.js:190
msgid "Collapse All"
@@ -10714,7 +10714,7 @@ msgstr "Spalte {0}"
#: accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:52
msgid "Columns are not according to template. Please compare the uploaded file with standard template"
msgstr ""
msgstr "Die Spalten stimmen nicht mit der Vorlage überein. Bitte vergleichen Sie die hochgeladene Datei mit der Standardvorlage"
#: accounts/doctype/payment_terms_template/payment_terms_template.py:39
msgid "Combined invoice portion must equal 100%"
@@ -11659,7 +11659,7 @@ msgstr "Fertigstellungstermin"
#: assets/doctype/asset_repair/asset_repair.py:66
msgid "Completion Date can not be before Failure Date. Please adjust the dates accordingly."
msgstr ""
msgstr "Das Fertigstellungsdatum kann nicht vor dem Ausfalldatum liegen. Bitte passen Sie die Daten entsprechend an."
#. Label of the completion_status (Select) field in DocType 'Maintenance
#. Schedule Detail'
@@ -11891,7 +11891,7 @@ msgstr "Berater"
#: setup/setup_wizard/data/industry_type.txt:14
msgid "Consulting"
msgstr ""
msgstr "Beratung"
#: setup/setup_wizard/operations/install_fixtures.py:64
msgid "Consumable"
@@ -11979,7 +11979,7 @@ msgstr "Wert des verbrauchten Lagerbestands"
#: setup/setup_wizard/data/industry_type.txt:15
msgid "Consumer Products"
msgstr ""
msgstr "Konsumgüter"
#: stock/report/stock_ledger_invariant_check/stock_ledger_invariant_check.py:175
#: stock/report/stock_ledger_variance/stock_ledger_variance.py:99
@@ -12477,7 +12477,7 @@ msgstr "Korrektur / Vorbeugung"
#: setup/setup_wizard/data/industry_type.txt:16
msgid "Cosmetics"
msgstr ""
msgstr "Kosmetik"
#. Label of the cost (Currency) field in DocType 'Subscription Plan'
#: accounts/doctype/subscription_plan/subscription_plan.json
@@ -14737,7 +14737,7 @@ msgstr "Kundenservice"
#: setup/setup_wizard/data/designation.txt:13
msgid "Customer Service Representative"
msgstr ""
msgstr "Kundendienstmitarbeiter:in"
#. Label of the customer_territory (Link) field in DocType 'Loyalty Program'
#: accounts/doctype/loyalty_program/loyalty_program.json
@@ -15938,7 +15938,7 @@ msgstr "Standardeinstellungen"
#: setup/setup_wizard/data/industry_type.txt:17
msgid "Defense"
msgstr ""
msgstr "Verteidigung"
#. Label of the deferred_accounting_section (Section Break) field in DocType
#. 'Item'
@@ -16150,7 +16150,7 @@ msgstr ""
#. Title of an incoterm
#: setup/doctype/incoterm/incoterms.csv:11
msgid "Delivered At Place Unloaded"
msgstr ""
msgstr "Geliefert Benannter Ort Entladen"
#. Label of the delivered_by_supplier (Check) field in DocType 'POS Invoice
#. Item'
@@ -16164,7 +16164,7 @@ msgstr "Geliefert von Lieferant"
#. Title of an incoterm
#: setup/doctype/incoterm/incoterms.csv:12
msgid "Delivered Duty Paid"
msgstr ""
msgstr "Geliefert Verzollt"
#. Name of a report
#. Label of a Link in the Receivables Workspace
@@ -16420,7 +16420,7 @@ msgstr "Abteilung"
#: setup/setup_wizard/data/industry_type.txt:18
msgid "Department Stores"
msgstr ""
msgstr "Kaufhäuser"
#. Label of the departure_time (Datetime) field in DocType 'Delivery Trip'
#: stock/doctype/delivery_trip/delivery_trip.json
@@ -16905,7 +16905,7 @@ msgstr "Position"
#: setup/setup_wizard/data/designation.txt:14
msgid "Designer"
msgstr ""
msgstr "Designer"
#. Name of a role
#: crm/doctype/lead/lead.json projects/doctype/project/project.json
@@ -18464,7 +18464,7 @@ msgstr "Elektronisches Rechnungsregister"
#: setup/setup_wizard/data/industry_type.txt:20
msgid "Electronics"
msgstr ""
msgstr "Elektronik"
#. Name of a UOM
#: setup/setup_wizard/data/uom_data.json
@@ -19070,11 +19070,11 @@ msgstr "Ende des aktuellen Abonnementzeitraums"
#: setup/setup_wizard/data/industry_type.txt:21
msgid "Energy"
msgstr ""
msgstr "Energie"
#: setup/setup_wizard/data/designation.txt:15
msgid "Engineer"
msgstr ""
msgstr "Ingenieur"
#: manufacturing/report/bom_stock_report/bom_stock_report.html:13
#: manufacturing/report/bom_stock_report/bom_stock_report.html:23
@@ -19202,7 +19202,7 @@ msgstr "Geben Sie den Betrag {0} ein."
#: setup/setup_wizard/data/industry_type.txt:22
msgid "Entertainment & Leisure"
msgstr ""
msgstr "Unterhaltung & Freizeit"
#: accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts.py:57
#: accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts_with_account_number.py:82
@@ -19379,7 +19379,7 @@ msgstr "Auch Rechnungen, bei denen die Option „Steuereinbehalt anwenden“ nic
#. Title of an incoterm
#: setup/doctype/incoterm/incoterms.csv:2
msgid "Ex Works"
msgstr ""
msgstr "Ab Werk"
#. Label of the url (Data) field in DocType 'Currency Exchange Settings'
#: accounts/doctype/currency_exchange_settings/currency_exchange_settings.json
@@ -19563,7 +19563,7 @@ msgstr "Ausführung"
#: setup/setup_wizard/data/designation.txt:16
msgid "Executive Assistant"
msgstr ""
msgstr "Assistent:in der Geschäftsführung"
#: setup/setup_wizard/data/industry_type.txt:23
msgid "Executive Search"
@@ -19575,7 +19575,7 @@ msgstr "Steuerbefreite Lieferungen"
#: setup/setup_wizard/data/lead_source.txt:5
msgid "Exhibition"
msgstr ""
msgstr "Ausstellung"
#. Option for the 'Create Chart Of Accounts Based On' (Select) field in DocType
#. 'Company'
@@ -19590,7 +19590,7 @@ msgstr "Bestehendes Unternehmen"
#: setup/setup_wizard/data/lead_source.txt:1
msgid "Existing Customer"
msgstr ""
msgstr "Bestehender Kunde"
#. Label of the exit (Tab Break) field in DocType 'Employee'
#: setup/doctype/employee/employee.json
@@ -20367,7 +20367,7 @@ msgstr "Finanzbücher"
#: setup/setup_wizard/data/designation.txt:17
msgid "Finance Manager"
msgstr ""
msgstr "Finanzleitung"
#. Name of a report
#: accounts/report/financial_ratios/financial_ratios.json
@@ -20381,7 +20381,7 @@ msgstr "Finanzberichte"
#: setup/setup_wizard/data/industry_type.txt:24
msgid "Financial Services"
msgstr ""
msgstr "Finanzdienstleistungen"
#. Title of an Onboarding Step
#. Label of a Card Break in the Financial Reports Workspace
@@ -20799,7 +20799,7 @@ msgstr "Die folgenden Elemente {0} sind nicht als Element {1} markiert. Sie kön
#: setup/setup_wizard/data/industry_type.txt:25
msgid "Food, Beverage & Tobacco"
msgstr ""
msgstr "Lebensmittel, Getränke und Tabakwaren"
#. Name of a UOM
#: setup/setup_wizard/data/uom_data.json
@@ -21022,12 +21022,12 @@ msgstr "Forum-URL"
#. Title of an incoterm
#: setup/doctype/incoterm/incoterms.csv:4
msgid "Free Alongside Ship"
msgstr ""
msgstr "Frei Längsseite Schiff"
#. Title of an incoterm
#: setup/doctype/incoterm/incoterms.csv:3
msgid "Free Carrier"
msgstr ""
msgstr "Frei Frachtführer"
#. Label of the free_item (Link) field in DocType 'Pricing Rule'
#. Label of the section_break_6 (Section Break) field in DocType 'Promotional
@@ -21045,7 +21045,7 @@ msgstr ""
#. Title of an incoterm
#: setup/doctype/incoterm/incoterms.csv:5
msgid "Free On Board"
msgstr ""
msgstr "Frei an Bord"
#: accounts/doctype/pricing_rule/pricing_rule.py:282
msgid "Free item code is not selected"
@@ -21305,7 +21305,7 @@ msgstr "Von-Datum kann später liegen als Bis-Datum"
#: crm/report/sales_pipeline_analytics/sales_pipeline_analytics.py:26
msgid "From Date is mandatory"
msgstr ""
msgstr "Von-Datum ist obligatorisch"
#: accounts/report/customer_ledger_summary/customer_ledger_summary.py:21
#: accounts/report/general_ledger/general_ledger.py:76
@@ -22410,7 +22410,7 @@ msgstr "Grüße Abschnitt"
#: setup/setup_wizard/data/industry_type.txt:26
msgid "Grocery"
msgstr ""
msgstr "Lebensmittel"
#. Label of the gross_margin (Currency) field in DocType 'Project'
#: projects/doctype/project/project.json
@@ -22454,7 +22454,7 @@ msgstr "Bruttokaufbetrag"
#: assets/doctype/asset_depreciation_schedule/asset_depreciation_schedule.py:371
msgid "Gross Purchase Amount Too Low: {0} cannot be depreciated over {1} cycles with a frequency of {2} depreciations."
msgstr ""
msgstr "Bruttokaufbetrag zu niedrig: {0} kann nicht über {1} Zyklen mit einer Häufigkeit von {2} Abschreibungen abgeschrieben werden."
#: assets/doctype/asset/asset.py:313
msgid "Gross Purchase Amount is mandatory"
@@ -22748,16 +22748,16 @@ msgstr "Gibt es eine Standard-Nummernkreis für Chargen?"
#: setup/setup_wizard/data/designation.txt:19
msgid "Head of Marketing and Sales"
msgstr ""
msgstr "Leitung Marketing und Vertrieb"
#. Description of a DocType
#: accounts/doctype/account/account.json
msgid "Heads (or groups) against which Accounting Entries are made and balances are maintained."
msgstr ""
msgstr "Konten (oder Kontengruppen), unter denen Buchungen vorgenommen und Salden geführt werden."
#: setup/setup_wizard/data/industry_type.txt:27
msgid "Health Care"
msgstr ""
msgstr "Gesundheitswesen"
#. Label of the health_details (Small Text) field in DocType 'Employee'
#: setup/doctype/employee/employee.json
@@ -25100,7 +25100,7 @@ msgstr ""
#: setup/setup_wizard/data/industry_type.txt:29
msgid "Investment Banking"
msgstr ""
msgstr "Investment-Banking"
#: accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts.py:38
#: accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts_with_account_number.py:53
@@ -29230,11 +29230,11 @@ msgstr "Verwaltung"
#: setup/setup_wizard/data/designation.txt:20
msgid "Manager"
msgstr ""
msgstr "Manager:in"
#: setup/setup_wizard/data/designation.txt:21
msgid "Managing Director"
msgstr ""
msgstr "Geschäftsleitung"
#. Label of the reqd (Check) field in DocType 'POS Field'
#. Label of the reqd (Check) field in DocType 'Inventory Dimension'
@@ -29666,11 +29666,11 @@ msgstr "Marketingkosten"
#: setup/setup_wizard/data/designation.txt:22
msgid "Marketing Manager"
msgstr ""
msgstr "Marketing-Manager:in"
#: setup/setup_wizard/data/designation.txt:23
msgid "Marketing Specialist"
msgstr ""
msgstr "Marketing-Spezialist:in"
#. Option for the 'Marital Status' (Select) field in DocType 'Employee'
#: setup/doctype/employee/employee.json
@@ -30076,7 +30076,7 @@ msgstr "Maximaler Rechnungsbetrag"
#. Label of the maximum_net_rate (Float) field in DocType 'Item Tax'
#: stock/doctype/item_tax/item_tax.json
msgid "Maximum Net Rate"
msgstr "Maximaler Nettopreis"
msgstr "Bis Nettopreis"
#. Label of the maximum_payment_amount (Currency) field in DocType 'Payment
#. Reconciliation'
@@ -30493,7 +30493,7 @@ msgstr "Mindestalter Interessent (in Tagen)"
#. Label of the minimum_net_rate (Float) field in DocType 'Item Tax'
#: stock/doctype/item_tax/item_tax.json
msgid "Minimum Net Rate"
msgstr "Mindestnettopreis"
msgstr "Ab Nettopreis"
#. Label of the min_order_qty (Float) field in DocType 'Item'
#: stock/doctype/item/item.json
@@ -30987,7 +30987,7 @@ msgstr "Mehr Informationen"
#: setup/setup_wizard/data/industry_type.txt:32
msgid "Motion Picture & Video"
msgstr ""
msgstr "Film & Video"
#: manufacturing/doctype/plant_floor/stock_summary_template.html:58
#: stock/dashboard/item_dashboard_list.html:52 stock/doctype/batch/batch.js:75
@@ -31069,7 +31069,7 @@ msgstr "Mehrere Artikel können nicht als fertiger Artikel markiert werden"
#: setup/setup_wizard/data/industry_type.txt:33
msgid "Music"
msgstr ""
msgstr "Musik"
#. Label of the must_be_whole_number (Check) field in DocType 'UOM'
#: manufacturing/doctype/work_order/work_order.py:998
@@ -31705,7 +31705,7 @@ msgstr "Newsletter"
#: setup/setup_wizard/data/industry_type.txt:34
msgid "Newspaper Publishers"
msgstr ""
msgstr "Zeitungsverlage"
#. Name of a UOM
#: setup/setup_wizard/data/uom_data.json
@@ -32702,7 +32702,7 @@ msgstr "Laufende Jobkarten"
#: setup/setup_wizard/data/industry_type.txt:35
msgid "Online Auctions"
msgstr ""
msgstr "Online-Auktionen"
#. Description of the 'Default Advance Account' (Link) field in DocType
#. 'Payment Reconciliation'
@@ -35734,7 +35734,7 @@ msgstr "Ausstehende Verarbeitung"
#: setup/setup_wizard/data/industry_type.txt:36
msgid "Pension Funds"
msgstr ""
msgstr "Rentenfonds"
#. Option for the 'Evaluation Period' (Select) field in DocType 'Supplier
#. Scorecard'
@@ -35984,7 +35984,7 @@ msgstr "Arzneimittel"
#: setup/setup_wizard/data/industry_type.txt:37
msgid "Pharmaceuticals"
msgstr ""
msgstr "Pharmazeutika"
#. Option for the 'Type' (Select) field in DocType 'Mode of Payment'
#. Option for the 'Payment Channel' (Select) field in DocType 'Payment Gateway
@@ -38766,7 +38766,7 @@ msgstr "Produktanfrage"
#: setup/setup_wizard/data/designation.txt:25
msgid "Product Manager"
msgstr ""
msgstr "Produktmanager:in"
#. Label of the product_price_id (Data) field in DocType 'Subscription Plan'
#: accounts/doctype/subscription_plan/subscription_plan.json
@@ -39133,7 +39133,7 @@ msgstr "Projekt-ID"
#: setup/setup_wizard/data/designation.txt:26
msgid "Project Manager"
msgstr ""
msgstr "Projektmanager:in"
#. Label of the project_name (Data) field in DocType 'Sales Invoice Timesheet'
#. Label of the project_name (Data) field in DocType 'Project'
@@ -39425,7 +39425,7 @@ msgstr "Bereitstellung"
#: setup/doctype/company/company.py:447
msgid "Provisional Account"
msgstr ""
msgstr "Vorläufiges Konto"
#. Label of the provisional_expense_account (Link) field in DocType 'Purchase
#. Receipt Item'
@@ -41357,7 +41357,7 @@ msgstr "Zinssatz (%) p.a."
#: stock/doctype/delivery_note_item/delivery_note_item.json
#: stock/doctype/purchase_receipt_item/purchase_receipt_item.json
msgid "Rate of Stock UOM"
msgstr ""
msgstr "Einzelpreis der Lager-ME"
#. Label of the rate_or_discount (Select) field in DocType 'Pricing Rule'
#. Label of the rate_or_discount (Data) field in DocType 'Pricing Rule Detail'
@@ -41610,7 +41610,7 @@ msgstr "Ablesungen"
#: setup/setup_wizard/data/industry_type.txt:40
msgid "Real Estate"
msgstr ""
msgstr "Immobilien"
#: support/doctype/issue/issue.js:51
msgid "Reason"
@@ -41656,7 +41656,7 @@ msgstr ""
#: projects/doctype/project/project.js:136
msgid "Recalculating Purchase Cost against this Project..."
msgstr ""
msgstr "Neuberechnung der Anschaffungskosten für dieses Projekt..."
#. Option for the 'Status' (Select) field in DocType 'Asset'
#. Option for the 'Purpose' (Select) field in DocType 'Asset Movement'
@@ -43195,7 +43195,7 @@ msgstr "Forschung & Entwicklung"
#: setup/setup_wizard/data/designation.txt:27
msgid "Researcher"
msgstr ""
msgstr "Forscher:in"
#. Description of the 'Supplier Primary Address' (Link) field in DocType
#. 'Supplier'
@@ -43584,7 +43584,7 @@ msgstr "Auftrag fortsetzen"
#: setup/setup_wizard/data/industry_type.txt:41
msgid "Retail & Wholesale"
msgstr ""
msgstr "Einzel- und Großhandel"
#: setup/setup_wizard/data/sales_partner_type.txt:5
msgid "Retailer"
@@ -44364,7 +44364,7 @@ msgstr "Zeile {0}: Buchungssatz {1} betrifft nicht Konto {2} oder bereits mit ei
#: stock/doctype/item/item.py:348
msgid "Row #{0}: Maximum Net Rate cannot be greater than Minimum Net Rate"
msgstr ""
msgstr "Zeile #{0}: Der Ab Nettopreis kann nicht größer sein als der Bis Nettopreis"
#: selling/doctype/sales_order/sales_order.py:557
msgid "Row #{0}: Not allowed to change Supplier as Purchase Order already exists"
@@ -44831,7 +44831,7 @@ msgstr "Zeile {0}: Artikel {1} muss ein Lagerartikel sein."
#: controllers/subcontracting_controller.py:103
msgid "Row {0}: Item {1} must be a subcontracted item."
msgstr ""
msgstr "Zeile {0}: Artikel {1} muss ein an Dritte vergebener Artikel sein."
#: stock/doctype/delivery_note/delivery_note.py:742
msgid "Row {0}: Packed Qty must be equal to {1} Qty."
@@ -44863,7 +44863,7 @@ msgstr "Zeile {0}: Wenn es sich um eine Vorkasse-Buchung handelt, bitte \"Ist Vo
#: stock/doctype/packing_slip/packing_slip.py:140
msgid "Row {0}: Please provide a valid Delivery Note Item or Packed Item reference."
msgstr ""
msgstr "Zeile {0}: Bitte geben Sie einen gültigen Lieferschein Artikel oder verpackten Artikel an."
#: controllers/subcontracting_controller.py:123
msgid "Row {0}: Please select a BOM for Item {1}."
@@ -44923,7 +44923,7 @@ msgstr "Zeile {0}: Unterauftragsartikel sind für den Rohstoff {1} obligatorisch
#: controllers/stock_controller.py:1048
msgid "Row {0}: Target Warehouse is mandatory for internal transfers"
msgstr ""
msgstr "Zeile {0}: Ziellager ist für interne Transfers obligatorisch"
#: stock/doctype/stock_entry/stock_entry.py:427
msgid "Row {0}: The item {1}, quantity must be positive number"
@@ -45767,7 +45767,7 @@ msgstr "Übersicht über den Umsatz"
#: setup/setup_wizard/data/designation.txt:28
msgid "Sales Representative"
msgstr ""
msgstr "Vertriebsmitarbeiter:in"
#: accounts/report/gross_profit/gross_profit.py:797
#: stock/doctype/delivery_note/delivery_note.js:218
@@ -46350,7 +46350,7 @@ msgstr ""
#: setup/setup_wizard/data/designation.txt:29
msgid "Secretary"
msgstr ""
msgstr "Sekretär:in"
#: accounts/report/tax_withholding_details/tax_withholding_details.py:172
#: accounts/report/tds_computation_summary/tds_computation_summary.py:117
@@ -46364,7 +46364,7 @@ msgstr "Gedeckte Kredite"
#: setup/setup_wizard/data/industry_type.txt:42
msgid "Securities & Commodity Exchanges"
msgstr ""
msgstr "Wertpapier- und Rohstoffbörsen"
#: accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts.py:18
#: accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts_with_account_number.py:26
@@ -46573,7 +46573,7 @@ msgstr "Lager auswählen ..."
#: manufacturing/doctype/production_plan/production_plan.js:438
msgid "Select Warehouses to get Stock for Materials Planning"
msgstr ""
msgstr "Wählen Sie Lager aus, um Bestände für die Materialplanung zu erhalten"
#: public/js/communication.js:80
msgid "Select a Company"
@@ -46613,7 +46613,7 @@ msgstr "Wählen Sie ein Konto aus, das in der Kontowährung gedruckt werden soll
#: selling/page/point_of_sale/pos_past_order_summary.js:18
msgid "Select an invoice to load summary data"
msgstr ""
msgstr "Wählen Sie eine Rechnung aus, um die Zusammenfassung zu laden"
#: selling/doctype/quotation/quotation.js:342
msgid "Select an item from each set to be used in the Sales Order."
@@ -46864,7 +46864,7 @@ msgstr "An primären Kontakt senden"
#. Description of a DocType
#: setup/doctype/email_digest/email_digest.json
msgid "Send regular summary reports via Email."
msgstr ""
msgstr "Regelmäßige Zusammenfassungen per E-Mail senden."
#. Option for the 'Purpose' (Select) field in DocType 'Stock Entry'
#. Option for the 'Purpose' (Select) field in DocType 'Stock Entry Type'
@@ -47242,7 +47242,7 @@ msgstr "Serien- und Chargenbündel {0} wird bereits in {1} {2} verwendet."
#. 'Subcontracting Receipt Item'
#: subcontracting/doctype/subcontracting_receipt_item/subcontracting_receipt_item.json
msgid "Serial and Batch Details"
msgstr ""
msgstr "Serien- und Chargendetails"
#. Name of a DocType
#: stock/doctype/serial_and_batch_entry/serial_and_batch_entry.json
@@ -48016,7 +48016,7 @@ msgstr "Haltbarkeit in Tagen"
#: stock/doctype/batch/batch.py:191
msgid "Shelf Life in Days"
msgstr ""
msgstr "Haltbarkeitsdauer in Tagen"
#. Label of the shift (Link) field in DocType 'Depreciation Schedule'
#: assets/doctype/asset/asset.js:298
@@ -48327,7 +48327,7 @@ msgstr "Kumulativen Betrag anzeigen"
#: stock/report/warehouse_wise_stock_balance/warehouse_wise_stock_balance.js:16
msgid "Show Disabled Warehouses"
msgstr ""
msgstr "Deaktivierte Lager anzeigen"
#: erpnext_integrations/doctype/tally_migration/tally_migration.js:306
msgid "Show Document"
@@ -48347,7 +48347,7 @@ msgstr "Zukünftige Zahlungen anzeigen"
#: accounts/report/accounts_receivable_summary/accounts_receivable_summary.js:142
msgid "Show GL Balance"
msgstr ""
msgstr "Hauptbuchsaldo anzeigen"
#. Label of the show_in_website (Check) field in DocType 'Sales Partner'
#: setup/doctype/sales_partner/sales_partner.json
@@ -48407,7 +48407,7 @@ msgstr "zeigen Operationen"
#. Label of the show_pay_button (Check) field in DocType 'Buying Settings'
#: buying/doctype/buying_settings/buying_settings.json
msgid "Show Pay Button in Purchase Order Portal"
msgstr ""
msgstr "Schaltfläche „Bezahlen“ im Bestellportal anzeigen"
#: accounts/report/sales_payment_summary/sales_payment_summary.js:40
msgid "Show Payment Details"
@@ -48446,7 +48446,7 @@ msgstr "Alterungsdaten anzeigen"
#. Settings'
#: accounts/doctype/accounts_settings/accounts_settings.json
msgid "Show Taxes as Table in Print"
msgstr ""
msgstr "Steuern als Tabelle im Druck anzeigen"
#: accounts/doctype/bank_statement_import/bank_statement_import.js:480
#: erpnext_integrations/doctype/tally_migration/tally_migration.js:296
@@ -48477,7 +48477,7 @@ msgstr "In der Website anzeigen"
#: accounts/report/trial_balance/trial_balance.js:110
msgid "Show net values in opening and closing columns"
msgstr ""
msgstr "Nettowerte in Eröffnungs- und Abschlussspalten anzeigen"
#: accounts/report/sales_payment_summary/sales_payment_summary.js:35
msgid "Show only POS"
@@ -48497,7 +48497,7 @@ msgstr "Gewinn- und Verlustrechnung für nicht geschlossenes Finanzjahr zeigen."
#: accounts/report/deferred_revenue_and_expense/deferred_revenue_and_expense.js:96
msgid "Show with upcoming revenue/expense"
msgstr ""
msgstr "Mit kommenden Einnahmen/Ausgaben anzeigen"
#: accounts/report/consolidated_financial_statement/consolidated_financial_statement.js:137
#: accounts/report/profitability_analysis/profitability_analysis.js:71
@@ -48679,7 +48679,7 @@ msgstr "Glättungskonstante"
#: setup/setup_wizard/data/industry_type.txt:44
msgid "Soap & Detergent"
msgstr ""
msgstr "Seife & Waschmittel"
#: accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts.py:32
#: accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts_with_account_number.py:45
@@ -48689,7 +48689,7 @@ msgstr "Software"
#: setup/setup_wizard/data/designation.txt:30
msgid "Software Developer"
msgstr ""
msgstr "Software-Entwickler:in"
#. Option for the 'Status' (Select) field in DocType 'Asset'
#: assets/doctype/asset/asset.json assets/doctype/asset/asset_list.js:9
@@ -48702,7 +48702,7 @@ msgstr "Verkauft von"
#: www/book_appointment/index.js:248
msgid "Something went wrong please try again"
msgstr ""
msgstr "Etwas ist schief gelaufen, bitte versuchen Sie es erneut"
#: accounts/doctype/pricing_rule/utils.py:735
msgid "Sorry, this coupon code is no longer valid"
@@ -48861,12 +48861,12 @@ msgstr "Vom Lieferanten bezogen"
#. Name of a DocType
#: accounts/doctype/south_africa_vat_account/south_africa_vat_account.json
msgid "South Africa VAT Account"
msgstr ""
msgstr "Südafrika Mehrwertsteuer-Konto"
#. Name of a DocType
#: regional/doctype/south_africa_vat_settings/south_africa_vat_settings.json
msgid "South Africa VAT Settings"
msgstr ""
msgstr "Südafrika Mehrwertsteuer-Einstellungen"
#. Label of the spacer (Data) field in DocType 'Dunning'
#: accounts/doctype/dunning/dunning.json
@@ -48876,12 +48876,12 @@ msgstr "Abstandshalter"
#. Description of a DocType
#: setup/doctype/currency_exchange/currency_exchange.json
msgid "Specify Exchange Rate to convert one currency into another"
msgstr ""
msgstr "Geben Sie den Wechselkurs an, um eine Währung in eine andere umzurechnen"
#. Description of a DocType
#: accounts/doctype/shipping_rule/shipping_rule.json
msgid "Specify conditions to calculate shipping amount"
msgstr ""
msgstr "Geben Sie Bedingungen an, um den Versandbetrag zu berechnen"
#: assets/doctype/asset/asset.js:552 stock/doctype/batch/batch.js:75
#: stock/doctype/batch/batch.js:167 support/doctype/issue/issue.js:112
@@ -48925,7 +48925,7 @@ msgstr ""
#: setup/setup_wizard/data/industry_type.txt:46
msgid "Sports"
msgstr ""
msgstr "Sport"
#. Name of a UOM
#: setup/setup_wizard/data/uom_data.json
@@ -49096,7 +49096,7 @@ msgstr "Startdatum darf nicht vor dem aktuellen Datum liegen"
#: setup/doctype/transaction_deletion_record/transaction_deletion_record.js:21
msgid "Start Deletion"
msgstr ""
msgstr "Löschen starten"
#: accounts/doctype/bank_statement_import/bank_statement_import.js:115
msgid "Start Import"
@@ -49129,7 +49129,7 @@ msgstr "Startzeit"
#: support/doctype/service_level_agreement/service_level_agreement.py:129
msgid "Start Time can't be greater than or equal to End Time for {0}."
msgstr ""
msgstr "Die Startzeit kann nicht größer oder gleich der Endzeit für {0} sein."
#: accounts/report/consolidated_financial_statement/consolidated_financial_statement.js:56
#: accounts/report/deferred_revenue_and_expense/deferred_revenue_and_expense.js:56
@@ -49168,7 +49168,7 @@ msgstr "Startzeit"
#: utilities/bulk_transaction.py:21
msgid "Started a background job to create {1} {0}"
msgstr ""
msgstr "Hintergrundjob zum Erstellen von {1} {0} gestartet"
#. Label of the date_dist_from_left_edge (Float) field in DocType 'Cheque Print
#. Template'
@@ -49462,7 +49462,7 @@ msgstr "Status muss einer aus {0} sein"
#: stock/doctype/quality_inspection/quality_inspection.py:183
msgid "Status set to rejected as there are one or more rejected readings."
msgstr ""
msgstr "Der Status wurde auf abgelehnt gesetzt, da es einen oder mehrere abgelehnte Messwerte gibt."
#. Description of the 'Supplier Details' (Text) field in DocType 'Supplier'
#: buying/doctype/supplier/supplier.json
@@ -49548,7 +49548,7 @@ msgstr ""
#. Label of the stock_consumption (Check) field in DocType 'Asset Repair'
#: assets/doctype/asset_repair/asset_repair.json
msgid "Stock Consumed During Repair"
msgstr ""
msgstr "Während der Reparatur verbrauchter Bestand"
#. Label of the stock_consumption_details_section (Section Break) field in
#. DocType 'Asset Repair'
@@ -49616,7 +49616,7 @@ msgstr "Lagerbuchung {0} erstellt"
#: manufacturing/doctype/job_card/job_card.py:1261
msgid "Stock Entry {0} has created"
msgstr ""
msgstr "Lagerbuchung {0} erstellt"
#: accounts/doctype/journal_entry/journal_entry.py:1211
msgid "Stock Entry {0} is not submitted"
@@ -49834,15 +49834,15 @@ msgstr ""
#: stock/doctype/stock_settings/stock_settings.py:210
#: stock/doctype/stock_settings/stock_settings.py:224
msgid "Stock Reservation"
msgstr ""
msgstr "Bestandsreservierung"
#: stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1135
msgid "Stock Reservation Entries Cancelled"
msgstr ""
msgstr "Bestandsreservierungen storniert"
#: stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1087
msgid "Stock Reservation Entries Created"
msgstr ""
msgstr "Bestandsreservierungen erstellt"
#. Name of a DocType
#: selling/doctype/sales_order/sales_order.js:462
@@ -49851,15 +49851,15 @@ msgstr ""
#: stock/report/reserved_stock/reserved_stock.js:53
#: stock/report/reserved_stock/reserved_stock.py:171
msgid "Stock Reservation Entry"
msgstr ""
msgstr "Bestandsreservierungseintrag"
#: stock/doctype/stock_reservation_entry/stock_reservation_entry.py:425
msgid "Stock Reservation Entry cannot be updated as it has been delivered."
msgstr ""
msgstr "Der Bestandsreservierungseintrag kann nicht aktualisiert werden, da er bereits geliefert wurde."
#: stock/doctype/stock_reservation_entry/stock_reservation_entry.py:419
msgid "Stock Reservation Entry created against a Pick List cannot be updated. If you need to make changes, we recommend canceling the existing entry and creating a new one."
msgstr ""
msgstr "Ein anhand einer Kommissionierliste erstellter Bestandsreservierungseintrag kann nicht aktualisiert werden. Wenn Sie Änderungen vornehmen müssen, empfehlen wir, den vorhandenen Eintrag zu stornieren und einen neuen zu erstellen."
#: stock/doctype/delivery_note/delivery_note.py:695
msgid "Stock Reservation Warehouse Mismatch"
@@ -49867,14 +49867,14 @@ msgstr ""
#: stock/doctype/stock_reservation_entry/stock_reservation_entry.py:509
msgid "Stock Reservation can only be created against {0}."
msgstr ""
msgstr "Bestandsreservierungen können nur gegen {0} erstellt werden."
#. Label of the stock_reserved_qty (Float) field in DocType 'Sales Order Item'
#. Label of the stock_reserved_qty (Float) field in DocType 'Pick List Item'
#: selling/doctype/sales_order_item/sales_order_item.json
#: stock/doctype/pick_list_item/pick_list_item.json
msgid "Stock Reserved Qty (in Stock UOM)"
msgstr ""
msgstr "Reservierter Bestand (in Lager-ME)"
#: stock/doctype/stock_entry/stock_entry.py:1583
msgid "Stock Return"
@@ -50775,7 +50775,7 @@ msgstr "Sonntag"
#: buying/report/subcontract_order_summary/subcontract_order_summary.py:145
msgid "Supplied Item"
msgstr ""
msgstr "Gelieferter Artikel"
#. Label of the supplied_items (Table) field in DocType 'Purchase Invoice'
#. Label of the supplied_items (Table) field in DocType 'Purchase Order'
@@ -52404,11 +52404,11 @@ msgstr ""
#: setup/setup_wizard/data/industry_type.txt:47
msgid "Technology"
msgstr ""
msgstr "Technologie"
#: setup/setup_wizard/data/industry_type.txt:48
msgid "Telecommunications"
msgstr ""
msgstr "Telekommunikation"
#: accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts.py:69
#: accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts_with_account_number.py:93
@@ -52422,7 +52422,7 @@ msgstr "Telefonie Anrufart"
#: setup/setup_wizard/data/industry_type.txt:49
msgid "Television"
msgstr ""
msgstr "Fernsehen"
#. Option for the 'Status' (Select) field in DocType 'Task'
#. Label of the template (Link) field in DocType 'Quality Feedback'
@@ -53896,7 +53896,7 @@ msgstr "Bis Datum darf nicht kleiner sein als Von Datum"
#: crm/report/sales_pipeline_analytics/sales_pipeline_analytics.py:29
msgid "To Date is mandatory"
msgstr ""
msgstr "Bis Datum ist obligatorisch"
#: buying/report/subcontracted_item_to_be_received/subcontracted_item_to_be_received.py:11
#: buying/report/subcontracted_raw_materials_to_be_transferred/subcontracted_raw_materials_to_be_transferred.py:11
@@ -53934,7 +53934,7 @@ msgstr "Auszuliefern und Abzurechnen"
#. Label of the to_delivery_date (Date) field in DocType 'Production Plan'
#: manufacturing/doctype/production_plan/production_plan.json
msgid "To Delivery Date"
msgstr ""
msgstr "Bis Liefertermin"
#. Label of the to_doctype (Link) field in DocType 'Bulk Transaction Log
#. Detail'
@@ -53944,7 +53944,7 @@ msgstr ""
#: selling/report/payment_terms_status_for_sales_order/payment_terms_status_for_sales_order.js:83
msgid "To Due Date"
msgstr ""
msgstr "Bis Fälligkeitsdatum"
#. Label of the to_employee (Link) field in DocType 'Asset Movement Item'
#: assets/doctype/asset_movement_item/asset_movement_item.json
@@ -53995,7 +53995,7 @@ msgstr "Zu bezahlen"
#: accounts/doctype/payment_reconciliation/payment_reconciliation.json
#: accounts/doctype/process_payment_reconciliation/process_payment_reconciliation.json
msgid "To Payment Date"
msgstr ""
msgstr "Bis Zahlungsdatum"
#: manufacturing/report/job_card_summary/job_card_summary.js:43
#: manufacturing/report/work_order_summary/work_order_summary.js:29
@@ -54025,7 +54025,7 @@ msgstr "Zu empfangen und abzurechnen"
#. Tool'
#: accounts/doctype/bank_reconciliation_tool/bank_reconciliation_tool.json
msgid "To Reference Date"
msgstr ""
msgstr "Bis Stichtag"
#. Label of the to_rename (Check) field in DocType 'GL Entry'
#. Label of the to_rename (Check) field in DocType 'Stock Ledger Entry'
@@ -55398,7 +55398,7 @@ msgstr "Transportbeleg Nr"
#: setup/setup_wizard/data/industry_type.txt:50
msgid "Transportation"
msgstr ""
msgstr "Transportwesen"
#. Label of the transporter (Link) field in DocType 'Driver'
#. Label of the transporter (Link) field in DocType 'Delivery Note'
@@ -57117,7 +57117,7 @@ msgstr "Herstellername"
#: setup/setup_wizard/data/industry_type.txt:51
msgid "Venture Capital"
msgstr ""
msgstr "Risikokapital"
#: www/book_appointment/verify/index.html:15
msgid "Verification failed please check the link"

View File

@@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: frappe\n"
"Report-Msgid-Bugs-To: info@erpnext.com\n"
"POT-Creation-Date: 2024-08-18 09:35+0000\n"
"PO-Revision-Date: 2024-08-19 12:45\n"
"PO-Revision-Date: 2024-08-25 15:03\n"
"Last-Translator: info@erpnext.com\n"
"Language-Team: Spanish\n"
"MIME-Version: 1.0\n"
@@ -731,13 +731,13 @@ msgstr "(C) Cant. total en cola"
#: stock/report/stock_ledger_invariant_check/stock_ledger_invariant_check.py:210
#: stock/report/stock_ledger_variance/stock_ledger_variance.py:134
msgid "(D) Balance Stock Value"
msgstr ""
msgstr "(D) Valor del balance de las existencias"
#: stock/report/fifo_queue_vs_qty_after_transaction_comparison/fifo_queue_vs_qty_after_transaction_comparison.py:199
#: stock/report/stock_ledger_invariant_check/stock_ledger_invariant_check.py:215
#: stock/report/stock_ledger_variance/stock_ledger_variance.py:139
msgid "(E) Balance Stock Value in Queue"
msgstr ""
msgstr "(E) Valor del balance de las existencias en cola"
#: stock/report/stock_ledger_invariant_check/stock_ledger_invariant_check.py:225
#: stock/report/stock_ledger_variance/stock_ledger_variance.py:149
@@ -1794,7 +1794,7 @@ msgstr "Cuenta: {0} con divisa: {1} no puede ser seleccionada"
#: setup/setup_wizard/data/designation.txt:1
msgid "Accountant"
msgstr ""
msgstr "Contador"
#. Label of the section_break_19 (Section Break) field in DocType 'POS Profile'
#. Label of the accounting (Section Break) field in DocType 'Purchase Invoice
@@ -3550,7 +3550,7 @@ msgstr ""
#: setup/setup_wizard/data/designation.txt:2
msgid "Administrative Assistant"
msgstr ""
msgstr "Asistente Administrativo"
#: accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts.py:54
#: accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts_with_account_number.py:79
@@ -3559,7 +3559,7 @@ msgstr "GASTOS DE ADMINISTRACIÓN"
#: setup/setup_wizard/data/designation.txt:3
msgid "Administrative Officer"
msgstr ""
msgstr "Oficial Administrativo"
#. Name of a role
#: accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.json
@@ -3676,15 +3676,15 @@ msgstr "Anticipos"
#: setup/setup_wizard/data/lead_source.txt:3
msgid "Advertisement"
msgstr ""
msgstr "Publicidad"
#: setup/setup_wizard/data/industry_type.txt:2
msgid "Advertising"
msgstr ""
msgstr "Publicidad"
#: setup/setup_wizard/data/industry_type.txt:3
msgid "Aerospace"
msgstr ""
msgstr "Aeroespacial"
#. Label of the affected_transactions (Code) field in DocType 'Repost Item
#. Valuation'
@@ -3911,7 +3911,7 @@ msgstr "Agenda"
#: setup/setup_wizard/data/sales_partner_type.txt:4
msgid "Agent"
msgstr ""
msgstr "Agente"
#. Label of the agent_busy_message (Data) field in DocType 'Incoming Call
#. Settings'
@@ -3956,7 +3956,7 @@ msgstr ""
#: setup/setup_wizard/data/industry_type.txt:4
msgid "Agriculture"
msgstr ""
msgstr "Agricultura"
#. Name of a role
#: assets/doctype/location/location.json
@@ -3970,7 +3970,7 @@ msgstr "Usuario de Agricultura"
#: setup/setup_wizard/data/industry_type.txt:5
msgid "Airline"
msgstr ""
msgstr "Aerolínea"
#. Label of the algorithm (Select) field in DocType 'Bisect Accounting
#. Statements'
@@ -5134,7 +5134,7 @@ msgstr ""
#: setup/setup_wizard/data/designation.txt:4
msgid "Analyst"
msgstr ""
msgstr "Analista"
#: accounts/doctype/budget/budget.py:235
msgid "Annual"
@@ -5184,7 +5184,7 @@ msgstr ""
#: setup/setup_wizard/data/industry_type.txt:6
msgid "Apparel & Accessories"
msgstr ""
msgstr "Vestimenta & Accesorios"
#. Label of the applicable_charges (Currency) field in DocType 'Landed Cost
#. Item'
@@ -5454,7 +5454,7 @@ msgstr "Aplicar Monto de Retención de Impuestos"
#. Label of the apply_tds (Check) field in DocType 'Journal Entry'
#: accounts/doctype/journal_entry/journal_entry.json
msgid "Apply Tax Withholding Amount "
msgstr ""
msgstr "Aplicar Monto de Retención de Impuestos "
#. Label of the apply_restriction_on_values (Check) field in DocType
#. 'Accounting Dimension Filter'
@@ -6204,7 +6204,7 @@ msgstr "Condiciones de asignación"
#: setup/setup_wizard/data/designation.txt:5
msgid "Associate"
msgstr ""
msgstr "Asociado"
#: stock/doctype/pick_list/pick_list.py:98
msgid "At Row #{0}: The picked quantity {1} for the item {2} is greater than available stock {3} for the batch {4} in the warehouse {5}."
@@ -8253,7 +8253,7 @@ msgstr ""
#: setup/setup_wizard/data/industry_type.txt:9
msgid "Biotechnology"
msgstr ""
msgstr "Biotecnología"
#. Name of a DocType
#: accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.json
@@ -8598,11 +8598,11 @@ msgstr "Desglose"
#: setup/setup_wizard/data/industry_type.txt:10
msgid "Broadcasting"
msgstr ""
msgstr "Difusión"
#: setup/setup_wizard/data/industry_type.txt:11
msgid "Brokerage"
msgstr ""
msgstr "Corretaje"
#: manufacturing/doctype/bom/bom.js:144
msgid "Browse BOM"
@@ -8761,11 +8761,11 @@ msgstr ""
#: setup/setup_wizard/data/designation.txt:6
msgid "Business Analyst"
msgstr ""
msgstr "Analista de Negocios"
#: setup/setup_wizard/data/designation.txt:7
msgid "Business Development Manager"
msgstr ""
msgstr "Gerente de Desarrollo de Negocios"
#. Option for the 'Status' (Select) field in DocType 'Call Log'
#: telephony/doctype/call_log/call_log.json
@@ -10100,7 +10100,7 @@ msgstr "Realizar pedido / Enviar pedido / Nuevo pedido"
#: setup/setup_wizard/data/industry_type.txt:12
msgid "Chemical"
msgstr ""
msgstr "Química"
#. Option for the 'Salary Mode' (Select) field in DocType 'Employee'
#: setup/doctype/employee/employee.json
@@ -10161,19 +10161,19 @@ msgstr "Cheques y Depósitos liquidados de forma incorrecta"
#: setup/setup_wizard/data/designation.txt:9
msgid "Chief Executive Officer"
msgstr ""
msgstr "Director Ejecutivo"
#: setup/setup_wizard/data/designation.txt:10
msgid "Chief Financial Officer"
msgstr ""
msgstr "Director Financiero"
#: setup/setup_wizard/data/designation.txt:11
msgid "Chief Operating Officer"
msgstr ""
msgstr "Director de Operaciones"
#: setup/setup_wizard/data/designation.txt:12
msgid "Chief Technology Officer"
msgstr ""
msgstr "Director de Tecnología"
#. Label of the child_docname (Data) field in DocType 'Pricing Rule Detail'
#: accounts/doctype/pricing_rule_detail/pricing_rule_detail.json
@@ -10496,7 +10496,7 @@ msgstr "Código"
#: setup/setup_wizard/data/lead_source.txt:4
msgid "Cold Calling"
msgstr ""
msgstr "Llamada en frío"
#: public/js/setup_wizard.js:190
msgid "Collapse All"
@@ -11729,7 +11729,7 @@ msgstr "Consultor"
#: setup/setup_wizard/data/industry_type.txt:14
msgid "Consulting"
msgstr ""
msgstr "Consultoría"
#: setup/setup_wizard/operations/install_fixtures.py:64
msgid "Consumable"
@@ -11817,7 +11817,7 @@ msgstr ""
#: setup/setup_wizard/data/industry_type.txt:15
msgid "Consumer Products"
msgstr ""
msgstr "Productos de consumo"
#: stock/report/stock_ledger_invariant_check/stock_ledger_invariant_check.py:175
#: stock/report/stock_ledger_variance/stock_ledger_variance.py:99
@@ -12315,7 +12315,7 @@ msgstr "Correctivo / preventivo"
#: setup/setup_wizard/data/industry_type.txt:16
msgid "Cosmetics"
msgstr ""
msgstr "Cosméticos"
#. Label of the cost (Currency) field in DocType 'Subscription Plan'
#: accounts/doctype/subscription_plan/subscription_plan.json
@@ -14573,7 +14573,7 @@ msgstr "Servicio al cliente"
#: setup/setup_wizard/data/designation.txt:13
msgid "Customer Service Representative"
msgstr ""
msgstr "Representante de Servicio al Cliente"
#. Label of the customer_territory (Link) field in DocType 'Loyalty Program'
#: accounts/doctype/loyalty_program/loyalty_program.json
@@ -15069,7 +15069,7 @@ msgstr ""
#: setup/setup_wizard/data/sales_partner_type.txt:3
msgid "Dealer"
msgstr ""
msgstr "Distribuidor"
#: templates/emails/confirm_appointment.html:1
msgid "Dear"
@@ -15774,7 +15774,7 @@ msgstr "Predeterminados"
#: setup/setup_wizard/data/industry_type.txt:17
msgid "Defense"
msgstr ""
msgstr "Defensa"
#. Label of the deferred_accounting_section (Section Break) field in DocType
#. 'Item'
@@ -16256,7 +16256,7 @@ msgstr "Departamento"
#: setup/setup_wizard/data/industry_type.txt:18
msgid "Department Stores"
msgstr ""
msgstr "Tiendas por Departamento"
#. Label of the departure_time (Datetime) field in DocType 'Delivery Trip'
#: stock/doctype/delivery_trip/delivery_trip.json
@@ -16741,7 +16741,7 @@ msgstr "Puesto"
#: setup/setup_wizard/data/designation.txt:14
msgid "Designer"
msgstr ""
msgstr "Diseñador"
#. Name of a role
#: crm/doctype/lead/lead.json projects/doctype/project/project.json
@@ -18300,7 +18300,7 @@ msgstr "Registro Electrónico de Facturas"
#: setup/setup_wizard/data/industry_type.txt:20
msgid "Electronics"
msgstr ""
msgstr "Electrónica"
#. Name of a UOM
#: setup/setup_wizard/data/uom_data.json
@@ -18906,11 +18906,11 @@ msgstr ""
#: setup/setup_wizard/data/industry_type.txt:21
msgid "Energy"
msgstr ""
msgstr "Energía"
#: setup/setup_wizard/data/designation.txt:15
msgid "Engineer"
msgstr ""
msgstr "Ingeniero"
#: manufacturing/report/bom_stock_report/bom_stock_report.html:13
#: manufacturing/report/bom_stock_report/bom_stock_report.html:23
@@ -19037,7 +19037,7 @@ msgstr "Ingrese {0} monto."
#: setup/setup_wizard/data/industry_type.txt:22
msgid "Entertainment & Leisure"
msgstr ""
msgstr "Entretenimiento y Ocio"
#: accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts.py:57
#: accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts_with_account_number.py:82
@@ -19395,11 +19395,11 @@ msgstr "Ejecución"
#: setup/setup_wizard/data/designation.txt:16
msgid "Executive Assistant"
msgstr ""
msgstr "Asistente Ejecutivo"
#: setup/setup_wizard/data/industry_type.txt:23
msgid "Executive Search"
msgstr ""
msgstr "Búsqueda de Ejecutivo"
#: regional/report/uae_vat_201/uae_vat_201.py:67
msgid "Exempt Supplies"
@@ -19407,7 +19407,7 @@ msgstr ""
#: setup/setup_wizard/data/lead_source.txt:5
msgid "Exhibition"
msgstr ""
msgstr "Exposición"
#. Option for the 'Create Chart Of Accounts Based On' (Select) field in DocType
#. 'Company'
@@ -19422,7 +19422,7 @@ msgstr "Compañía existente"
#: setup/setup_wizard/data/lead_source.txt:1
msgid "Existing Customer"
msgstr ""
msgstr "Cliente Existente"
#. Label of the exit (Tab Break) field in DocType 'Employee'
#: setup/doctype/employee/employee.json
@@ -20199,7 +20199,7 @@ msgstr "Libros de Finanzas"
#: setup/setup_wizard/data/designation.txt:17
msgid "Finance Manager"
msgstr ""
msgstr "Gerente de Finanzas"
#. Name of a report
#: accounts/report/financial_ratios/financial_ratios.json
@@ -20213,7 +20213,7 @@ msgstr "Informes Financieros"
#: setup/setup_wizard/data/industry_type.txt:24
msgid "Financial Services"
msgstr ""
msgstr "Servicios Financieros"
#. Title of an Onboarding Step
#. Label of a Card Break in the Financial Reports Workspace
@@ -20631,7 +20631,7 @@ msgstr "Los siguientes elementos {0} no están marcados como {1} elemento. Puede
#: setup/setup_wizard/data/industry_type.txt:25
msgid "Food, Beverage & Tobacco"
msgstr ""
msgstr "Alimentación, bebidas y tabaco"
#. Name of a UOM
#: setup/setup_wizard/data/uom_data.json
@@ -22242,7 +22242,7 @@ msgstr "Sección de saludos"
#: setup/setup_wizard/data/industry_type.txt:26
msgid "Grocery"
msgstr ""
msgstr "Tienda de comestibles"
#. Label of the gross_margin (Currency) field in DocType 'Project'
#: projects/doctype/project/project.json
@@ -22580,7 +22580,7 @@ msgstr ""
#: setup/setup_wizard/data/designation.txt:19
msgid "Head of Marketing and Sales"
msgstr ""
msgstr "Jefe de Marketing y Ventas"
#. Description of a DocType
#: accounts/doctype/account/account.json
@@ -22589,7 +22589,7 @@ msgstr "Encabezados (o grupos) contra los cuales se realizan los Asientos Contab
#: setup/setup_wizard/data/industry_type.txt:27
msgid "Health Care"
msgstr ""
msgstr "Cuidados de salud"
#. Label of the health_details (Small Text) field in DocType 'Employee'
#: setup/doctype/employee/employee.json
@@ -23531,7 +23531,7 @@ msgstr "Vista de Imagen"
#: setup/setup_wizard/data/sales_partner_type.txt:6
msgid "Implementation Partner"
msgstr ""
msgstr "Socio de Implementación"
#: accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.js:132
msgid "Import"
@@ -24685,7 +24685,7 @@ msgstr ""
#: setup/setup_wizard/data/industry_type.txt:28
msgid "Internet Publishing"
msgstr ""
msgstr "Publicación en Internet"
#. Label of the introduction (Text) field in DocType 'Sales Partner'
#: setup/doctype/sales_partner/sales_partner.json
@@ -24931,7 +24931,7 @@ msgstr ""
#: setup/setup_wizard/data/industry_type.txt:29
msgid "Investment Banking"
msgstr ""
msgstr "Banca de Inversión"
#: accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts.py:38
#: accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts_with_account_number.py:53
@@ -29064,7 +29064,7 @@ msgstr "Administrador"
#: setup/setup_wizard/data/designation.txt:21
msgid "Managing Director"
msgstr ""
msgstr "Director General"
#. Label of the reqd (Check) field in DocType 'POS Field'
#. Label of the reqd (Check) field in DocType 'Inventory Dimension'
@@ -29496,11 +29496,11 @@ msgstr "Gastos de Publicidad"
#: setup/setup_wizard/data/designation.txt:22
msgid "Marketing Manager"
msgstr ""
msgstr "Gerente de Marketing"
#: setup/setup_wizard/data/designation.txt:23
msgid "Marketing Specialist"
msgstr ""
msgstr "Especialista en Marketing"
#. Option for the 'Marital Status' (Select) field in DocType 'Employee'
#: setup/doctype/employee/employee.json
@@ -29514,7 +29514,7 @@ msgstr "Máscara"
#: setup/setup_wizard/data/lead_source.txt:7
msgid "Mass Mailing"
msgstr ""
msgstr "Envío masivo"
#: manufacturing/doctype/workstation/workstation_dashboard.py:8
msgid "Master"
@@ -30817,7 +30817,7 @@ msgstr "Más información"
#: setup/setup_wizard/data/industry_type.txt:32
msgid "Motion Picture & Video"
msgstr ""
msgstr "Películas y vídeos"
#: manufacturing/doctype/plant_floor/stock_summary_template.html:58
#: stock/dashboard/item_dashboard_list.html:52 stock/doctype/batch/batch.js:75
@@ -30899,7 +30899,7 @@ msgstr ""
#: setup/setup_wizard/data/industry_type.txt:33
msgid "Music"
msgstr ""
msgstr "Música"
#. Label of the must_be_whole_number (Check) field in DocType 'UOM'
#: manufacturing/doctype/work_order/work_order.py:998
@@ -31535,7 +31535,7 @@ msgstr "Boletín de noticias"
#: setup/setup_wizard/data/industry_type.txt:34
msgid "Newspaper Publishers"
msgstr ""
msgstr "Editores de periódicos"
#. Name of a UOM
#: setup/setup_wizard/data/uom_data.json
@@ -32532,7 +32532,7 @@ msgstr "Tarjetas de trabajo en curso"
#: setup/setup_wizard/data/industry_type.txt:35
msgid "Online Auctions"
msgstr ""
msgstr "Subastas en línea"
#. Description of the 'Default Advance Account' (Link) field in DocType
#. 'Payment Reconciliation'
@@ -35564,7 +35564,7 @@ msgstr ""
#: setup/setup_wizard/data/industry_type.txt:36
msgid "Pension Funds"
msgstr ""
msgstr "Fondos de Pensiones"
#. Option for the 'Evaluation Period' (Select) field in DocType 'Supplier
#. Scorecard'
@@ -35814,7 +35814,7 @@ msgstr "Farmacéutico"
#: setup/setup_wizard/data/industry_type.txt:37
msgid "Pharmaceuticals"
msgstr ""
msgstr "Farmacéuticos"
#. Option for the 'Type' (Select) field in DocType 'Mode of Payment'
#. Option for the 'Payment Channel' (Select) field in DocType 'Payment Gateway
@@ -37541,7 +37541,7 @@ msgstr "Correo electrónico preferido"
#: setup/setup_wizard/data/designation.txt:24
msgid "President"
msgstr ""
msgstr "Presidente"
#. Label of the prevdoc_doctype (Data) field in DocType 'Packed Item'
#: stock/doctype/packed_item/packed_item.json
@@ -38305,7 +38305,7 @@ msgstr "La prioridad {0} se ha repetido."
#: setup/setup_wizard/data/industry_type.txt:38
msgid "Private Equity"
msgstr ""
msgstr "Capital privado"
#. Label of the probability (Percent) field in DocType 'Prospect Opportunity'
#: crm/doctype/prospect_opportunity/prospect_opportunity.json
@@ -38366,7 +38366,7 @@ msgstr "Proceso fallido"
#: manufacturing/doctype/bom/bom.json
#: stock/doctype/stock_entry/stock_entry.json
msgid "Process Loss"
msgstr ""
msgstr "Pérdida por Proceso"
#: manufacturing/doctype/bom/bom.py:1033
msgid "Process Loss Percentage cannot be greater than 100"
@@ -38596,7 +38596,7 @@ msgstr "Petición de producto"
#: setup/setup_wizard/data/designation.txt:25
msgid "Product Manager"
msgstr ""
msgstr "Gerente de Producto"
#. Label of the product_price_id (Data) field in DocType 'Subscription Plan'
#: accounts/doctype/subscription_plan/subscription_plan.json
@@ -38963,7 +38963,7 @@ msgstr "ID del proyecto"
#: setup/setup_wizard/data/designation.txt:26
msgid "Project Manager"
msgstr ""
msgstr "Gerente de Proyecto"
#. Label of the project_name (Data) field in DocType 'Sales Invoice Timesheet'
#. Label of the project_name (Data) field in DocType 'Project'
@@ -41440,7 +41440,7 @@ msgstr "Lecturas"
#: setup/setup_wizard/data/industry_type.txt:40
msgid "Real Estate"
msgstr ""
msgstr "Bienes Raíces"
#: support/doctype/issue/issue.js:51
msgid "Reason"
@@ -43024,7 +43024,7 @@ msgstr "Investigación y desarrollo"
#: setup/setup_wizard/data/designation.txt:27
msgid "Researcher"
msgstr ""
msgstr "Investigador"
#. Description of the 'Supplier Primary Address' (Link) field in DocType
#. 'Supplier'
@@ -43044,7 +43044,7 @@ msgstr "Vuelva a seleccionar, si el contacto elegido se edita después de guarda
#: setup/setup_wizard/data/sales_partner_type.txt:7
msgid "Reseller"
msgstr ""
msgstr "Revendedor"
#: accounts/doctype/payment_request/payment_request.js:39
msgid "Resend Payment Email"
@@ -43413,11 +43413,11 @@ msgstr ""
#: setup/setup_wizard/data/industry_type.txt:41
msgid "Retail & Wholesale"
msgstr ""
msgstr "Venta minorista y mayorista"
#: setup/setup_wizard/data/sales_partner_type.txt:5
msgid "Retailer"
msgstr ""
msgstr "Minorista"
#. Label of the retain_sample (Check) field in DocType 'Item'
#. Label of the retain_sample (Check) field in DocType 'Purchase Receipt Item'
@@ -45596,7 +45596,7 @@ msgstr "Registro de ventas"
#: setup/setup_wizard/data/designation.txt:28
msgid "Sales Representative"
msgstr ""
msgstr "Representante de Ventas"
#: accounts/report/gross_profit/gross_profit.py:797
#: stock/doctype/delivery_note/delivery_note.js:218
@@ -46179,7 +46179,7 @@ msgstr ""
#: setup/setup_wizard/data/designation.txt:29
msgid "Secretary"
msgstr ""
msgstr "Secretario/a"
#: accounts/report/tax_withholding_details/tax_withholding_details.py:172
#: accounts/report/tds_computation_summary/tds_computation_summary.py:117
@@ -48505,7 +48505,7 @@ msgstr "Constante de suavizado"
#: setup/setup_wizard/data/industry_type.txt:44
msgid "Soap & Detergent"
msgstr ""
msgstr "Jabón y detergente"
#: accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts.py:32
#: accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts_with_account_number.py:45
@@ -48515,7 +48515,7 @@ msgstr "Software"
#: setup/setup_wizard/data/designation.txt:30
msgid "Software Developer"
msgstr ""
msgstr "Desarrollador de Software"
#. Option for the 'Status' (Select) field in DocType 'Asset'
#: assets/doctype/asset/asset.json assets/doctype/asset/asset_list.js:9
@@ -48751,7 +48751,7 @@ msgstr ""
#: setup/setup_wizard/data/industry_type.txt:46
msgid "Sports"
msgstr ""
msgstr "Deportes"
#. Name of a UOM
#: setup/setup_wizard/data/uom_data.json
@@ -52230,11 +52230,11 @@ msgstr ""
#: setup/setup_wizard/data/industry_type.txt:47
msgid "Technology"
msgstr ""
msgstr "Tecnología"
#: setup/setup_wizard/data/industry_type.txt:48
msgid "Telecommunications"
msgstr ""
msgstr "Telecomunicaciones"
#: accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts.py:69
#: accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts_with_account_number.py:93
@@ -52248,7 +52248,7 @@ msgstr ""
#: setup/setup_wizard/data/industry_type.txt:49
msgid "Television"
msgstr ""
msgstr "Televisión"
#. Option for the 'Status' (Select) field in DocType 'Task'
#. Label of the template (Link) field in DocType 'Quality Feedback'
@@ -55224,7 +55224,7 @@ msgstr "Recibo de Transporte Nro"
#: setup/setup_wizard/data/industry_type.txt:50
msgid "Transportation"
msgstr ""
msgstr "Transporte"
#. Label of the transporter (Link) field in DocType 'Driver'
#. Label of the transporter (Link) field in DocType 'Delivery Note'
@@ -56977,7 +56977,7 @@ msgstr ""
#: setup/setup_wizard/data/designation.txt:31
msgid "Vice President"
msgstr ""
msgstr "Vice Presidente"
#. Name of a DocType
#: utilities/doctype/video/video.json
@@ -58963,7 +58963,7 @@ msgstr "[Importante] [ERPNext] Errores de reorden automático"
#: controllers/status_updater.py:250
msgid "`Allow Negative rates for Items`"
msgstr ""
msgstr "`Permitir precios Negativos para los Productos`"
#: stock/stock_ledger.py:1792
msgid "after"

View File

@@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: frappe\n"
"Report-Msgid-Bugs-To: info@erpnext.com\n"
"POT-Creation-Date: 2024-08-18 09:35+0000\n"
"PO-Revision-Date: 2024-08-18 12:36\n"
"PO-Revision-Date: 2024-08-26 14:59\n"
"Last-Translator: info@erpnext.com\n"
"Language-Team: Persian\n"
"MIME-Version: 1.0\n"
@@ -21,7 +21,7 @@ msgstr ""
#. Label of the column_break_32 (Column Break) field in DocType 'Email Digest'
#: setup/doctype/email_digest/email_digest.json
msgid " "
msgstr ""
msgstr " "
#: selling/doctype/quotation/quotation.js:79
msgid " Address"
@@ -1770,7 +1770,7 @@ msgstr "حساب: {0} با واحد پول: {1} قابل انتخاب نیست"
#: setup/setup_wizard/data/designation.txt:1
msgid "Accountant"
msgstr ""
msgstr "حسابدار"
#. Label of the section_break_19 (Section Break) field in DocType 'POS Profile'
#. Label of the accounting (Section Break) field in DocType 'Purchase Invoice
@@ -3526,7 +3526,7 @@ msgstr "تعدیل بر اساس نرخ فاکتور خرید"
#: setup/setup_wizard/data/designation.txt:2
msgid "Administrative Assistant"
msgstr ""
msgstr "معاون اداری"
#: accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts.py:54
#: accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts_with_account_number.py:79
@@ -3535,7 +3535,7 @@ msgstr "هزینه های اداری"
#: setup/setup_wizard/data/designation.txt:3
msgid "Administrative Officer"
msgstr ""
msgstr "کارمند اداری"
#. Name of a role
#: accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.json
@@ -3652,15 +3652,15 @@ msgstr "پیشرفت ها"
#: setup/setup_wizard/data/lead_source.txt:3
msgid "Advertisement"
msgstr ""
msgstr "تبلیغات"
#: setup/setup_wizard/data/industry_type.txt:2
msgid "Advertising"
msgstr ""
msgstr "تبلیغات"
#: setup/setup_wizard/data/industry_type.txt:3
msgid "Aerospace"
msgstr ""
msgstr "هوافضا"
#. Label of the affected_transactions (Code) field in DocType 'Repost Item
#. Valuation'
@@ -3887,7 +3887,7 @@ msgstr "دستور جلسه"
#: setup/setup_wizard/data/sales_partner_type.txt:4
msgid "Agent"
msgstr ""
msgstr "عامل"
#. Label of the agent_busy_message (Data) field in DocType 'Incoming Call
#. Settings'
@@ -5110,7 +5110,7 @@ msgstr "هنگام ایجاد درخواست‌های مواد بر اساس س
#: setup/setup_wizard/data/designation.txt:4
msgid "Analyst"
msgstr ""
msgstr "تحلیلگر"
#: accounts/doctype/budget/budget.py:235
msgid "Annual"
@@ -6180,7 +6180,7 @@ msgstr "شرایط واگذاری"
#: setup/setup_wizard/data/designation.txt:5
msgid "Associate"
msgstr ""
msgstr "دستیار"
#: stock/doctype/pick_list/pick_list.py:98
msgid "At Row #{0}: The picked quantity {1} for the item {2} is greater than available stock {3} for the batch {4} in the warehouse {5}."
@@ -8737,11 +8737,11 @@ msgstr "بوشل (US Dry Level)"
#: setup/setup_wizard/data/designation.txt:6
msgid "Business Analyst"
msgstr ""
msgstr "تحلیلگر کسب و کار"
#: setup/setup_wizard/data/designation.txt:7
msgid "Business Development Manager"
msgstr ""
msgstr "مدیر توسعه کسب و کار"
#. Option for the 'Status' (Select) field in DocType 'Call Log'
#: telephony/doctype/call_log/call_log.json
@@ -10137,7 +10137,7 @@ msgstr "چک ها و سپرده ها به اشتباه پاک شدند"
#: setup/setup_wizard/data/designation.txt:9
msgid "Chief Executive Officer"
msgstr ""
msgstr "مدیر ارشد اجرایی"
#: setup/setup_wizard/data/designation.txt:10
msgid "Chief Financial Officer"
@@ -11636,7 +11636,7 @@ msgstr "کل مبلغ دفتر کل طرف را در نظر بگیرید"
#. Plan'
#: manufacturing/doctype/production_plan/production_plan.json
msgid "Consider Minimum Order Qty"
msgstr "حداقل تعداد سفارش را در نظر بگیرید"
msgstr "در نظر گرفتن حداقل تعداد سفارش"
#. Label of the consider_rejected_warehouses (Check) field in DocType 'Pick
#. List'
@@ -14002,7 +14002,7 @@ msgstr "نرخ ارزش گذاری فعلی"
#: selling/report/sales_analytics/sales_analytics.js:90
msgid "Curves"
msgstr ""
msgstr "منحنی ها"
#. Label of the custodian (Link) field in DocType 'Asset'
#: assets/doctype/asset/asset.json
@@ -15045,7 +15045,7 @@ msgstr "صاحب معامله"
#: setup/setup_wizard/data/sales_partner_type.txt:3
msgid "Dealer"
msgstr ""
msgstr "فروشنده"
#: templates/emails/confirm_appointment.html:1
msgid "Dear"
@@ -16717,7 +16717,7 @@ msgstr "نقش سازمانی"
#: setup/setup_wizard/data/designation.txt:14
msgid "Designer"
msgstr ""
msgstr "طراح"
#. Name of a role
#: crm/doctype/lead/lead.json projects/doctype/project/project.json
@@ -18276,7 +18276,7 @@ msgstr "ثبت الکترونیکی صورتحساب"
#: setup/setup_wizard/data/industry_type.txt:20
msgid "Electronics"
msgstr ""
msgstr "الکترونیک"
#. Name of a UOM
#: setup/setup_wizard/data/uom_data.json
@@ -18882,7 +18882,7 @@ msgstr "پایان دوره اشتراک فعلی"
#: setup/setup_wizard/data/industry_type.txt:21
msgid "Energy"
msgstr ""
msgstr "انرژی"
#: setup/setup_wizard/data/designation.txt:15
msgid "Engineer"
@@ -19371,7 +19371,7 @@ msgstr "اجرا"
#: setup/setup_wizard/data/designation.txt:16
msgid "Executive Assistant"
msgstr ""
msgstr "دستیار اجرایی"
#: setup/setup_wizard/data/industry_type.txt:23
msgid "Executive Search"
@@ -20175,7 +20175,7 @@ msgstr "کتاب های مالی"
#: setup/setup_wizard/data/designation.txt:17
msgid "Finance Manager"
msgstr ""
msgstr "مدیر مالی"
#. Name of a report
#: accounts/report/financial_ratios/financial_ratios.json
@@ -21868,7 +21868,7 @@ msgstr ""
#. Label of the get_items_for_mr (Button) field in DocType 'Production Plan'
#: manufacturing/doctype/production_plan/production_plan.json
msgid "Get Raw Materials for Purchase"
msgstr "مواد اولیه را برای خرید دریافت کنید"
msgstr "دریافت مواد اولیه را برای خرید"
#. Label of the transfer_materials (Button) field in DocType 'Production Plan'
#: manufacturing/doctype/production_plan/production_plan.json
@@ -22218,7 +22218,7 @@ msgstr "بخش سلام"
#: setup/setup_wizard/data/industry_type.txt:26
msgid "Grocery"
msgstr ""
msgstr "خواربار"
#. Label of the gross_margin (Currency) field in DocType 'Project'
#: projects/doctype/project/project.json
@@ -24024,7 +24024,7 @@ msgstr "شامل نوشته های تطبیق شده"
#. Label of the include_safety_stock (Check) field in DocType 'Production Plan'
#: manufacturing/doctype/production_plan/production_plan.json
msgid "Include Safety Stock in Required Qty Calculation"
msgstr "موجودی ایمنی را در محاسبه مقدار مورد نیاز لحاظ کنید"
msgstr "لحاظ کردن موجودی ایمنی در محاسبه مقدار مورد نیاز"
#: manufacturing/report/production_planning_report/production_planning_report.js:87
msgid "Include Sub-assembly Raw Materials"
@@ -24034,7 +24034,7 @@ msgstr "شامل مواد اولیه زیر مونتاژ"
#. 'Production Plan'
#: manufacturing/doctype/production_plan/production_plan.json
msgid "Include Subcontracted Items"
msgstr "شامل موارد قرارداد فرعی"
msgstr "شامل آیتم‌های قرارداد فرعی"
#: projects/report/timesheet_billing_summary/timesheet_billing_summary.js:52
msgid "Include Timesheets in Draft Status"
@@ -24985,7 +24985,7 @@ msgstr "سهم فاکتور"
#: accounts/doctype/payment_term/payment_term.json
#: accounts/doctype/payment_terms_template_detail/payment_terms_template_detail.json
msgid "Invoice Portion (%)"
msgstr ""
msgstr "سهم فاکتور (%)"
#: accounts/report/payment_period_based_on_invoice_date/payment_period_based_on_invoice_date.py:106
msgid "Invoice Posting Date"
@@ -25269,7 +25269,7 @@ msgstr "قابل گسترش است"
#. Label of the is_final_finished_good (Check) field in DocType 'BOM Operation'
#: manufacturing/doctype/bom_operation/bom_operation.json
msgid "Is Final Finished Good"
msgstr ""
msgstr "آیا کالای تمام شده نهایی است"
#. Label of the is_finished_item (Check) field in DocType 'Stock Entry Detail'
#: stock/doctype/stock_entry_detail/stock_entry_detail.json
@@ -28056,7 +28056,7 @@ msgstr "بیایید شرکت شما را بررسی کنیم"
#. Label of an action in the Onboarding Step 'Review Fixed Asset Accounts'
#: assets/onboarding_step/fixed_asset_accounts/fixed_asset_accounts.json
msgid "Let's walk-through Chart of Accounts to review setup"
msgstr ""
msgstr "بیایید نمودار حساب‌ها را مرور کنیم تا تنظیمات را بررسی کنیم"
#. Label of the letter_head (Link) field in DocType 'Dunning'
#. Label of the letter_head (Link) field in DocType 'Journal Entry'
@@ -28120,7 +28120,7 @@ msgstr "متن پایان نامه یا ایمیل"
#. Label of an action in the Onboarding Step 'Sales Order'
#: selling/onboarding_step/sales_order/sales_order.json
msgid "Lets convert your first Sales Order against a Quotation"
msgstr ""
msgstr "بیایید اولین سفارش فروش شما را در برابر یک پیش فاکتور تبدیل کنیم"
#. Label of an action in the Onboarding Step 'Workstation'
#: manufacturing/onboarding_step/workstation/workstation.json
@@ -29036,11 +29036,11 @@ msgstr "مدیریت"
#: setup/setup_wizard/data/designation.txt:20
msgid "Manager"
msgstr ""
msgstr "مدیر"
#: setup/setup_wizard/data/designation.txt:21
msgid "Managing Director"
msgstr ""
msgstr "مدیر عامل"
#. Label of the reqd (Check) field in DocType 'POS Field'
#. Label of the reqd (Check) field in DocType 'Inventory Dimension'
@@ -29443,7 +29443,7 @@ msgstr "وضعیت تأهل"
#: public/js/templates/crm_activities.html:39
#: public/js/templates/crm_activities.html:82
msgid "Mark As Closed"
msgstr ""
msgstr "علامت گذاری به عنوان بسته شده"
#: erpnext_integrations/doctype/tally_migration/tally_migration.js:323
msgid "Mark as unresolved"
@@ -29472,11 +29472,11 @@ msgstr "هزینه های بازاریابی"
#: setup/setup_wizard/data/designation.txt:22
msgid "Marketing Manager"
msgstr ""
msgstr "مدیر بازاریابی"
#: setup/setup_wizard/data/designation.txt:23
msgid "Marketing Specialist"
msgstr ""
msgstr "کارشناس بازاریابی"
#. Option for the 'Marital Status' (Select) field in DocType 'Employee'
#: setup/doctype/employee/employee.json
@@ -31638,7 +31638,7 @@ msgstr "هیچ موردی با صورتحساب مواد وجود ندارد."
#: accounts/doctype/bank_reconciliation_tool/bank_reconciliation_tool.js:15
msgid "No Matching Bank Transactions Found"
msgstr ""
msgstr "هیچ تراکنش بانکی منطبقی یافت نشد"
#: public/js/templates/crm_notes.html:46
msgid "No Notes"
@@ -31837,7 +31837,7 @@ msgstr "تعداد بازدید"
#: public/js/templates/crm_activities.html:104
msgid "No open event"
msgstr ""
msgstr "رویداد باز وجود ندارد"
#: public/js/templates/crm_activities.html:57
msgid "No open task"
@@ -36042,7 +36042,7 @@ msgstr "گزارش های زمان را خارج از ساعات کاری ایس
#. Label of the quantity (Float) field in DocType 'Material Request Plan Item'
#: manufacturing/doctype/material_request_plan_item/material_request_plan_item.json
msgid "Plan to Request Qty"
msgstr "برای درخواست تعداد برنامه ریزی کنید"
msgstr "برنامه ریزی برای مقدار درخواست"
#. Option for the 'Maintenance Status' (Select) field in DocType 'Asset
#. Maintenance Log'
@@ -38572,7 +38572,7 @@ msgstr "درخواست محصول"
#: setup/setup_wizard/data/designation.txt:25
msgid "Product Manager"
msgstr ""
msgstr "مدیر محصول"
#. Label of the product_price_id (Data) field in DocType 'Subscription Plan'
#: accounts/doctype/subscription_plan/subscription_plan.json
@@ -38939,7 +38939,7 @@ msgstr "شناسه پروژه"
#: setup/setup_wizard/data/designation.txt:26
msgid "Project Manager"
msgstr ""
msgstr "مدیر پروژه"
#. Label of the project_name (Data) field in DocType 'Sales Invoice Timesheet'
#. Label of the project_name (Data) field in DocType 'Project'
@@ -39989,7 +39989,7 @@ msgstr "تعداد بعد از تراکنش"
#. Plan Item'
#: manufacturing/doctype/material_request_plan_item/material_request_plan_item.json
msgid "Qty As Per BOM"
msgstr "تعداد طبق BOM"
msgstr "مقدار طبق BOM"
#. Label of the actual_qty (Float) field in DocType 'Stock Ledger Entry'
#: stock/doctype/stock_ledger_entry/stock_ledger_entry.json
@@ -41416,7 +41416,7 @@ msgstr "خواندن"
#: setup/setup_wizard/data/industry_type.txt:40
msgid "Real Estate"
msgstr ""
msgstr "املاک و مستغلات"
#: support/doctype/issue/issue.js:51
msgid "Reason"
@@ -43000,7 +43000,7 @@ msgstr "تحقیق و توسعه"
#: setup/setup_wizard/data/designation.txt:27
msgid "Researcher"
msgstr ""
msgstr "پژوهشگر"
#. Description of the 'Supplier Primary Address' (Link) field in DocType
#. 'Supplier'
@@ -43551,12 +43551,12 @@ msgstr "مبلغ برگشتی"
#: subcontracting/doctype/subcontracting_order_supplied_item/subcontracting_order_supplied_item.json
#: subcontracting/doctype/subcontracting_receipt_item/subcontracting_receipt_item.json
msgid "Returned Qty"
msgstr "تعداد برگردانده شد"
msgstr "مقدار برگردانده شده"
#. Label of the returned_qty (Float) field in DocType 'Work Order Item'
#: manufacturing/doctype/work_order_item/work_order_item.json
msgid "Returned Qty "
msgstr " تعداد برگردانده شد"
msgstr "مقدار برگردانده شده "
#. Label of the returned_qty (Float) field in DocType 'Delivery Note Item'
#. Label of the returned_qty (Float) field in DocType 'Purchase Receipt Item'
@@ -44904,7 +44904,7 @@ msgstr "تنظیمات پیامک"
#: selling/report/pending_so_items_for_purchase_request/pending_so_items_for_purchase_request.py:43
msgid "SO Qty"
msgstr ""
msgstr "مقدار س.ف."
#: selling/report/sales_person_wise_transaction_summary/sales_person_wise_transaction_summary.py:107
msgid "SO Total Qty"
@@ -46155,7 +46155,7 @@ msgstr "نقش ثانویه"
#: setup/setup_wizard/data/designation.txt:29
msgid "Secretary"
msgstr ""
msgstr "منشی"
#: accounts/report/tax_withholding_details/tax_withholding_details.py:172
#: accounts/report/tds_computation_summary/tds_computation_summary.py:117
@@ -47746,7 +47746,7 @@ msgstr "تنظیمات"
#. Title of an Onboarding Step
#: setup/onboarding_step/letterhead/letterhead.json
msgid "Setup Your Letterhead"
msgstr ""
msgstr "سربرگ خود را تنظیم کنید"
#. Title of an Onboarding Step
#: stock/onboarding_step/create_a_warehouse/create_a_warehouse.json
@@ -48491,7 +48491,7 @@ msgstr "نرم‌افزار"
#: setup/setup_wizard/data/designation.txt:30
msgid "Software Developer"
msgstr ""
msgstr "توسعه دهنده نرم‌افزار"
#. Option for the 'Status' (Select) field in DocType 'Asset'
#: assets/doctype/asset/asset.json assets/doctype/asset/asset_list.js:9
@@ -48727,7 +48727,7 @@ msgstr "تقسیم {0} {1} به ردیف‌های {2} طبق شرایط پردا
#: setup/setup_wizard/data/industry_type.txt:46
msgid "Sports"
msgstr ""
msgstr "ورزشی"
#. Name of a UOM
#: setup/setup_wizard/data/uom_data.json
@@ -53736,7 +53736,7 @@ msgstr "برای تحویل و صدور صورتحساب"
#. Label of the to_delivery_date (Date) field in DocType 'Production Plan'
#: manufacturing/doctype/production_plan/production_plan.json
msgid "To Delivery Date"
msgstr "به تاریخ تحویل"
msgstr "تا تاریخ تحویل"
#. Label of the to_doctype (Link) field in DocType 'Bulk Transaction Log
#. Detail'
@@ -57080,7 +57080,7 @@ msgstr "ملاقات کرد"
#. Group in Maintenance Schedule's connections
#: maintenance/doctype/maintenance_schedule/maintenance_schedule.json
msgid "Visits"
msgstr ""
msgstr "بازدیدها"
#. Option for the 'Communication Medium Type' (Select) field in DocType
#. 'Communication Medium'
@@ -58969,7 +58969,7 @@ msgstr ""
#. Assembly Item'
#: manufacturing/doctype/production_plan_sub_assembly_item/production_plan_sub_assembly_item.json
msgid "description"
msgstr ""
msgstr "شرح"
#. Option for the 'Plaid Environment' (Select) field in DocType 'Plaid
#. Settings'
@@ -59029,7 +59029,7 @@ msgstr ""
#. Label of the image (Attach Image) field in DocType 'Batch'
#: stock/doctype/batch/batch.json
msgid "image"
msgstr ""
msgstr "تصویر"
#: accounts/doctype/budget/budget.py:273
msgid "is already"
@@ -59104,7 +59104,7 @@ msgstr "از 5"
#: accounts/doctype/payment_entry/payment_entry.py:1160
msgid "paid to"
msgstr ""
msgstr "پرداخت شده به"
#: public/js/utils.js:386
msgid "payments app is not installed. Please install it from {0} or {1}"
@@ -59152,7 +59152,7 @@ msgstr "نام ردیف آیتم‌های باندل محصول در سفارش
#. Settings'
#: erpnext_integrations/doctype/plaid_settings/plaid_settings.json
msgid "production"
msgstr ""
msgstr "تولید"
#. Label of the quotation_item (Data) field in DocType 'Sales Order Item'
#: selling/doctype/sales_order_item/sales_order_item.json
@@ -59203,7 +59203,7 @@ msgstr "اشتراک در حال حاضر لغو شده است."
#: controllers/status_updater.py:352 controllers/status_updater.py:372
msgid "target_ref_field"
msgstr ""
msgstr "target_ref_field"
#. Label of the temporary_name (Data) field in DocType 'Production Plan Item'
#: manufacturing/doctype/production_plan_item/production_plan_item.json
@@ -59213,7 +59213,7 @@ msgstr "نام موقت"
#. Label of the title (Data) field in DocType 'Activity Cost'
#: projects/doctype/activity_cost/activity_cost.json
msgid "title"
msgstr ""
msgstr "عنوان"
#: accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.html:27
#: accounts/report/general_ledger/general_ledger.html:20
@@ -59254,7 +59254,7 @@ msgstr "باید در جدول حسابها، حساب سرمایه در جری
#: accounts/report/cash_flow/cash_flow.py:220
#: accounts/report/cash_flow/cash_flow.py:221
msgid "{0}"
msgstr ""
msgstr "{0}"
#: controllers/accounts_controller.py:948
msgid "{0} '{1}' is disabled"
@@ -59754,11 +59754,11 @@ msgstr "{0}%"
#: controllers/website_list_for_contact.py:203
msgid "{0}% Billed"
msgstr ""
msgstr "{0}% صورتحساب شده"
#: controllers/website_list_for_contact.py:211
msgid "{0}% Delivered"
msgstr ""
msgstr "{0}% تحویل داده شده"
#: accounts/doctype/payment_term/payment_term.js:15
#, python-format
@@ -59839,7 +59839,7 @@ msgstr "{} در دسترس"
#: quality_management/workspace/quality/quality.json
#: selling/workspace/selling/selling.json
msgid "{} Open"
msgstr ""
msgstr "{} باز"
#. Count format of shortcut in the Buying Workspace
#. Count format of shortcut in the Stock Workspace

File diff suppressed because it is too large Load Diff

View File

@@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: frappe\n"
"Report-Msgid-Bugs-To: info@erpnext.com\n"
"POT-Creation-Date: 2024-08-18 09:35+0000\n"
"PO-Revision-Date: 2024-08-19 12:45\n"
"PO-Revision-Date: 2024-08-28 15:40\n"
"Last-Translator: info@erpnext.com\n"
"Language-Team: Swedish\n"
"MIME-Version: 1.0\n"
@@ -10042,7 +10042,7 @@ msgstr "Chain"
#: selling/page/point_of_sale/pos_payment.js:587
msgid "Change"
msgstr "Växel Belopp"
msgstr "Ändra"
#. Label of the change_amount (Currency) field in DocType 'POS Invoice'
#. Label of the change_amount (Currency) field in DocType 'Sales Invoice'
@@ -10794,7 +10794,7 @@ msgstr "Vanlig Kod"
#: crm/workspace/crm/crm.json
#: setup/setup_wizard/operations/install_fixtures.py:217
msgid "Communication"
msgstr "Korrespondens"
msgstr "E-post"
#. Label of the communication_channel (Select) field in DocType 'Communication
#. Medium'
@@ -24426,7 +24426,7 @@ msgstr "Felaktig Kvantitet av Bokföring Register Poster funna. Man kan ha valt
#: stock/doctype/purchase_receipt/purchase_receipt.json
#: stock/doctype/shipment/shipment.json
msgid "Incoterm"
msgstr "Inkoterm"
msgstr "Incoterm"
#. Label of the increase_in_asset_life (Int) field in DocType 'Asset Repair'
#: assets/doctype/asset_repair/asset_repair.json
@@ -37703,12 +37703,12 @@ msgstr "Preferens"
#. Label of the prefered_contact_email (Select) field in DocType 'Employee'
#: setup/doctype/employee/employee.json
msgid "Preferred Contact Email"
msgstr "Föredragen Kontakt E-post"
msgstr "Förvald Kontakt E-post"
#. Label of the prefered_email (Data) field in DocType 'Employee'
#: setup/doctype/employee/employee.json
msgid "Preferred Email"
msgstr "Föredragen E-Post"
msgstr "Förvald E-Post"
#: setup/setup_wizard/data/designation.txt:24
msgid "President"
@@ -59048,7 +59048,7 @@ msgstr "Du måste aktivera automatisk ombeställning i lager inställningar för
#: templates/pages/projects.html:134
msgid "You haven't created a {0} yet"
msgstr "Du har inte skapat {0} än"
msgstr "Ingen {0} skapad än"
#: selling/page/point_of_sale/pos_controller.js:218
msgid "You must add atleast one item to save it as draft."

File diff suppressed because it is too large Load Diff

View File

@@ -5,18 +5,17 @@
"document_type": "Document",
"engine": "InnoDB",
"field_order": [
"bom_and_work_order_tab",
"raw_materials_consumption_section",
"material_consumption",
"get_rm_cost_from_consumption_entry",
"column_break_3",
"backflush_raw_materials_based_on",
"capacity_planning",
"disable_capacity_planning",
"allow_overtime",
"allow_production_on_holidays",
"column_break_5",
"capacity_planning_for_days",
"mins_between_operations",
"validate_components_quantities_per_bom",
"bom_section",
"update_bom_costs_automatically",
"column_break_lhyt",
"manufacture_sub_assembly_in_operation",
"section_break_6",
"default_wip_warehouse",
"default_fg_warehouse",
@@ -30,8 +29,14 @@
"add_corrective_operation_cost_in_finished_good_valuation",
"column_break_24",
"job_card_excess_transfer",
"capacity_planning",
"disable_capacity_planning",
"allow_overtime",
"allow_production_on_holidays",
"column_break_5",
"capacity_planning_for_days",
"mins_between_operations",
"other_settings_section",
"update_bom_costs_automatically",
"set_op_cost_and_scrape_from_sub_assemblies",
"column_break_23",
"make_serial_no_batch_from_work_order"
@@ -149,7 +154,7 @@
{
"fieldname": "raw_materials_consumption_section",
"fieldtype": "Section Break",
"label": "Raw Materials Consumption"
"label": "Raw Materials Consumption "
},
{
"fieldname": "column_break_16",
@@ -183,8 +188,8 @@
},
{
"fieldname": "job_card_section",
"fieldtype": "Section Break",
"label": "Job Card"
"fieldtype": "Tab Break",
"label": "Job Card and Capacity Planning"
},
{
"fieldname": "column_break_24",
@@ -210,13 +215,41 @@
"fieldname": "get_rm_cost_from_consumption_entry",
"fieldtype": "Check",
"label": "Get Raw Materials Cost from Consumption Entry"
},
{
"fieldname": "bom_and_work_order_tab",
"fieldtype": "Tab Break",
"label": "BOM and Production"
},
{
"fieldname": "bom_section",
"fieldtype": "Section Break",
"label": "BOM"
},
{
"fieldname": "column_break_lhyt",
"fieldtype": "Column Break"
},
{
"default": "0",
"description": "If enabled then system will manufacture Sub-assembly against the Job Card (operation).",
"fieldname": "manufacture_sub_assembly_in_operation",
"fieldtype": "Check",
"label": "Manufacture Sub-assembly in Operation"
},
{
"default": "0",
"depends_on": "eval:doc.backflush_raw_materials_based_on == \"BOM\"",
"fieldname": "validate_components_quantities_per_bom",
"fieldtype": "Check",
"label": "Validate Components Quantities Per BOM"
}
],
"icon": "icon-wrench",
"index_web_pages_for_search": 1,
"issingle": 1,
"links": [],
"modified": "2024-03-27 13:10:04.700433",
"modified": "2024-09-02 12:12:03.132567",
"modified_by": "Administrator",
"module": "Manufacturing",
"name": "Manufacturing Settings",

View File

@@ -29,15 +29,22 @@ class ManufacturingSettings(Document):
get_rm_cost_from_consumption_entry: DF.Check
job_card_excess_transfer: DF.Check
make_serial_no_batch_from_work_order: DF.Check
manufacture_sub_assembly_in_operation: DF.Check
material_consumption: DF.Check
mins_between_operations: DF.Int
overproduction_percentage_for_sales_order: DF.Percent
overproduction_percentage_for_work_order: DF.Percent
set_op_cost_and_scrape_from_sub_assemblies: DF.Check
update_bom_costs_automatically: DF.Check
validate_components_quantities_per_bom: DF.Check
# end: auto-generated types
pass
def before_save(self):
self.reset_values()
def reset_values(self):
if self.backflush_raw_materials_based_on != "BOM" and self.validate_components_quantities_per_bom:
self.validate_components_quantities_per_bom = 0
def get_mins_between_operations():

View File

@@ -2054,6 +2054,108 @@ class TestWorkOrder(FrappeTestCase):
"BOM",
)
def test_disassemby_order(self):
fg_item = "Test Disassembly Item"
source_warehouse = "Stores - _TC"
raw_materials = ["Test Disassembly RM Item 1", "Test Disassembly RM Item 2"]
make_item(fg_item, {"is_stock_item": 1})
for item in raw_materials:
make_item(item, {"is_stock_item": 1})
test_stock_entry.make_stock_entry(
item_code=item,
target=source_warehouse,
qty=1,
basic_rate=100,
)
make_bom(item=fg_item, source_warehouse=source_warehouse, raw_materials=raw_materials)
wo = make_wo_order_test_record(
item=fg_item,
qty=1,
source_warehouse=source_warehouse,
skip_transfer=1,
)
stock_entry = frappe.get_doc(make_stock_entry(wo.name, "Manufacture", 1))
for row in stock_entry.items:
if row.item_code in raw_materials:
row.s_warehouse = source_warehouse
stock_entry.submit()
wo.reload()
self.assertEqual(wo.status, "Completed")
stock_entry = frappe.get_doc(make_stock_entry(wo.name, "Disassemble", 1))
stock_entry.save()
self.assertEqual(stock_entry.purpose, "Disassemble")
for row in stock_entry.items:
if row.item_code == fg_item:
self.assertTrue(row.s_warehouse)
self.assertFalse(row.t_warehouse)
else:
self.assertFalse(row.s_warehouse)
self.assertTrue(row.t_warehouse)
stock_entry.submit()
def test_components_qty_for_bom_based_manufacture_entry(self):
frappe.db.set_single_value("Manufacturing Settings", "backflush_raw_materials_based_on", "BOM")
frappe.db.set_single_value("Manufacturing Settings", "validate_components_quantities_per_bom", 1)
fg_item = "Test FG Item For Component Validation"
source_warehouse = "Stores - _TC"
raw_materials = ["Test Component Validation RM Item 1", "Test Component Validation RM Item 2"]
make_item(fg_item, {"is_stock_item": 1})
for item in raw_materials:
make_item(item, {"is_stock_item": 1})
test_stock_entry.make_stock_entry(
item_code=item,
target=source_warehouse,
qty=10,
basic_rate=100,
)
make_bom(item=fg_item, source_warehouse=source_warehouse, raw_materials=raw_materials)
wo = make_wo_order_test_record(
item=fg_item,
qty=10,
source_warehouse=source_warehouse,
)
transfer_entry = frappe.get_doc(make_stock_entry(wo.name, "Material Transfer for Manufacture", 10))
transfer_entry.save()
for row in transfer_entry.items:
row.qty = 5
self.assertRaises(frappe.ValidationError, transfer_entry.save)
transfer_entry.reload()
for row in transfer_entry.items:
self.assertEqual(row.qty, 10)
transfer_entry.submit()
manufacture_entry = frappe.get_doc(make_stock_entry(wo.name, "Manufacture", 10))
manufacture_entry.save()
for row in manufacture_entry.items:
if not row.s_warehouse:
continue
row.qty = 5
self.assertRaises(frappe.ValidationError, manufacture_entry.save)
manufacture_entry.reload()
manufacture_entry.submit()
frappe.db.set_single_value("Manufacturing Settings", "validate_components_quantities_per_bom", 0)
def make_operation(**kwargs):
kwargs = frappe._dict(kwargs)
@@ -2371,6 +2473,7 @@ def make_wo_order_test_record(**args):
wo_order.batch_size = args.batch_size or 0
if args.source_warehouse:
wo_order.source_warehouse = args.source_warehouse
for item in wo_order.get("required_items"):
item.source_warehouse = args.source_warehouse

View File

@@ -177,13 +177,30 @@ frappe.ui.form.on("Work Order", {
}
}
if (frm.doc.status == "Completed") {
if (frm.doc.__onload.backflush_raw_materials_based_on == "Material Transferred for Manufacture") {
frm.add_custom_button(
__("BOM"),
() => {
frm.trigger("make_bom");
},
__("Create")
);
}
}
if (
frm.doc.status == "Completed" &&
frm.doc.__onload.backflush_raw_materials_based_on == "Material Transferred for Manufacture"
frm.doc.docstatus === 1 &&
["Closed", "Completed"].includes(frm.doc.status) &&
frm.doc.produced_qty > 0
) {
frm.add_custom_button(__("Create BOM"), () => {
frm.trigger("make_bom");
});
frm.add_custom_button(
__("Disassembly Order"),
() => {
frm.trigger("make_disassembly_order");
},
__("Create")
);
}
frm.trigger("add_custom_button_to_return_components");
@@ -345,6 +362,23 @@ frappe.ui.form.on("Work Order", {
});
},
make_disassembly_order(frm) {
erpnext.work_order
.show_prompt_for_qty_input(frm, "Disassemble")
.then((data) => {
return frappe.xcall("erpnext.manufacturing.doctype.work_order.work_order.make_stock_entry", {
work_order_id: frm.doc.name,
purpose: "Disassemble",
qty: data.qty,
target_warehouse: data.target_warehouse,
});
})
.then((stock_entry) => {
frappe.model.sync(stock_entry);
frappe.set_route("Form", stock_entry.doctype, stock_entry.name);
});
},
show_progress_for_items: function (frm) {
var bars = [];
var message = "";
@@ -756,6 +790,10 @@ erpnext.work_order = {
get_max_transferable_qty: (frm, purpose) => {
let max = 0;
if (purpose === "Disassemble") {
return flt(frm.doc.produced_qty);
}
if (frm.doc.skip_transfer) {
max = flt(frm.doc.qty) - flt(frm.doc.produced_qty);
} else {
@@ -770,15 +808,38 @@ erpnext.work_order = {
show_prompt_for_qty_input: function (frm, purpose) {
let max = this.get_max_transferable_qty(frm, purpose);
let fields = [
{
fieldtype: "Float",
label: __("Qty for {0}", [__(purpose)]),
fieldname: "qty",
description: __("Max: {0}", [max]),
default: max,
},
];
if (purpose === "Disassemble") {
fields.push({
fieldtype: "Link",
options: "Warehouse",
fieldname: "target_warehouse",
label: __("Target Warehouse"),
default: frm.doc.source_warehouse || frm.doc.wip_warehouse,
get_query() {
return {
filters: {
company: frm.doc.company,
is_group: 0,
},
};
},
});
}
return new Promise((resolve, reject) => {
frappe.prompt(
{
fieldtype: "Float",
label: __("Qty for {0}", [__(purpose)]),
fieldname: "qty",
description: __("Max: {0}", [max]),
default: max,
},
fields,
(data) => {
max += (frm.doc.qty * (frm.doc.__onload.overproduction_percentage || 0.0)) / 100;

View File

@@ -1398,7 +1398,7 @@ def set_work_order_ops(name):
@frappe.whitelist()
def make_stock_entry(work_order_id, purpose, qty=None):
def make_stock_entry(work_order_id, purpose, qty=None, target_warehouse=None):
work_order = frappe.get_doc("Work Order", work_order_id)
if not frappe.db.get_value("Warehouse", work_order.wip_warehouse, "is_group"):
wip_warehouse = work_order.wip_warehouse
@@ -1428,9 +1428,16 @@ def make_stock_entry(work_order_id, purpose, qty=None):
stock_entry.to_warehouse = work_order.fg_warehouse
stock_entry.project = work_order.project
if purpose == "Disassemble":
stock_entry.from_warehouse = work_order.fg_warehouse
stock_entry.to_warehouse = target_warehouse or work_order.source_warehouse
stock_entry.set_stock_entry_type()
stock_entry.get_items()
stock_entry.set_serial_no_batch_for_finished_good()
if purpose != "Disassemble":
stock_entry.set_serial_no_batch_for_finished_good()
return stock_entry.as_dict()

View File

@@ -376,5 +376,6 @@ erpnext.patches.v15_0.update_asset_repair_field_in_stock_entry
erpnext.patches.v15_0.update_total_number_of_booked_depreciations
erpnext.patches.v15_0.do_not_use_batchwise_valuation
erpnext.patches.v15_0.drop_index_posting_datetime_from_sle
erpnext.patches.v15_0.add_disassembly_order_stock_entry_type #1
erpnext.patches.v15_0.set_standard_stock_entry_type
erpnext.patches.v15_0.link_purchase_item_to_asset_doc

View File

@@ -0,0 +1,13 @@
import frappe
def execute():
if not frappe.db.exists("Stock Entry Type", "Disassemble"):
frappe.get_doc(
{
"doctype": "Stock Entry Type",
"name": "Disassemble",
"purpose": "Disassemble",
"is_standard": 1,
}
).insert(ignore_permissions=True)

View File

@@ -0,0 +1,10 @@
import frappe
def execute():
AssetValueAdjustment = frappe.qb.DocType("Asset Value Adjustment")
frappe.qb.update(AssetValueAdjustment).set(
AssetValueAdjustment.difference_amount,
AssetValueAdjustment.new_asset_value - AssetValueAdjustment.current_asset_value,
).where(AssetValueAdjustment.docstatus != 2).run()

View File

@@ -11,6 +11,7 @@ def execute():
"Manufacture",
"Repack",
"Send to Subcontractor",
"Disassemble",
]:
if frappe.db.exists("Stock Entry Type", stock_entry_type):
frappe.db.set_value("Stock Entry Type", stock_entry_type, "is_standard", 1)

View File

@@ -1431,12 +1431,13 @@ erpnext.TransactionController = class TransactionController extends erpnext.taxe
let show = cint(this.frm.doc.discount_amount) ||
((this.frm.doc.taxes || []).filter(function(d) {return d.included_in_print_rate===1}).length);
if(frappe.meta.get_docfield(cur_frm.doctype, "net_total"))
if(this.frm.doc.doctype && frappe.meta.get_docfield(this.frm.doc.doctype, "net_total")) {
this.frm.toggle_display("net_total", show);
}
if(frappe.meta.get_docfield(cur_frm.doctype, "base_net_total"))
if(this.frm.doc.doctype && frappe.meta.get_docfield(this.frm.doc.doctype, "base_net_total")) {
this.frm.toggle_display("base_net_total", (show && (me.frm.doc.currency != company_currency)));
}
}
change_grid_labels(company_currency) {

View File

@@ -20,7 +20,11 @@ $.extend(erpnext, {
},
toggle_naming_series: function () {
if (cur_frm && cur_frm.fields_dict.naming_series) {
if (
cur_frm &&
cur_frm.fields_dict.naming_series &&
cur_frm.meta.naming_rule == 'By "Naming Series" field'
) {
cur_frm.toggle_display("naming_series", cur_frm.doc.__islocal ? true : false);
}
},

View File

@@ -368,8 +368,28 @@ erpnext.SerialBatchPackageSelector = class SerialNoBatchBundleUpdate {
];
}
get_batch_qty(batch_no, callback) {
let warehouse = this.item.s_warehouse || this.item.t_warehouse || this.item.warehouse;
frappe.call({
method: "erpnext.stock.doctype.batch.batch.get_batch_qty",
args: {
batch_no: batch_no,
warehouse: warehouse,
item_code: this.item.item_code,
posting_date: this.frm.doc.posting_date,
posting_time: this.frm.doc.posting_time,
},
callback: (r) => {
if (r.message) {
callback(flt(r.message));
}
},
});
}
get_dialog_table_fields() {
let fields = [];
let me = this;
if (this.item.has_serial_no) {
fields.push({
@@ -395,6 +415,15 @@ erpnext.SerialBatchPackageSelector = class SerialNoBatchBundleUpdate {
fieldname: "batch_no",
label: __("Batch No"),
in_list_view: 1,
change() {
let doc = this.doc;
if (!doc.qty && me.item.type_of_transaction === "Outward") {
me.get_batch_qty(doc.batch_no, (qty) => {
doc.qty = qty;
this.grid.set_value("qty", qty, doc);
});
}
},
get_query: () => {
let is_inward = false;
if (

View File

@@ -308,13 +308,15 @@
"fetch_from": "customer_primary_contact.mobile_no",
"fieldname": "mobile_no",
"fieldtype": "Read Only",
"label": "Mobile No"
"label": "Mobile No",
"options": "Mobile"
},
{
"fetch_from": "customer_primary_contact.email_id",
"fieldname": "email_id",
"fieldtype": "Read Only",
"label": "Email Id"
"label": "Email Id",
"options": "Email"
},
{
"fieldname": "column_break_26",
@@ -592,7 +594,7 @@
"link_fieldname": "party"
}
],
"modified": "2024-05-08 18:03:20.716169",
"modified": "2024-06-17 03:24:59.612974",
"modified_by": "Administrator",
"module": "Selling",
"name": "Customer",
@@ -677,4 +679,4 @@
"states": [],
"title_field": "customer_name",
"track_changes": 1
}
}

View File

@@ -104,7 +104,7 @@ class Customer(TransactionBase):
elif cust_master_name == "Naming Series":
set_name_by_naming_series(self)
else:
self.name = set_name_from_naming_options(frappe.get_meta(self.doctype).autoname, self)
set_name_from_naming_options(frappe.get_meta(self.doctype).autoname, self)
def get_customer_name(self):
if frappe.db.get_value("Customer", self.customer_name) and not frappe.flags.in_import:

View File

@@ -103,6 +103,7 @@ def install(country=None):
"purpose": "Repack",
"is_standard": 1,
},
{"doctype": "Stock Entry Type", "name": "Disassemble", "purpose": "Disassemble", "is_standard": 1},
{
"doctype": "Stock Entry Type",
"name": _("Send to Subcontractor"),

View File

@@ -345,7 +345,13 @@ class Item(Document):
def validate_item_tax_net_rate_range(self):
for tax in self.get("taxes"):
if flt(tax.maximum_net_rate) < flt(tax.minimum_net_rate):
frappe.throw(_("Row #{0}: Maximum Net Rate cannot be greater than Minimum Net Rate"))
frappe.throw(
_("Taxes row #{0}: {1} cannot be smaller than {2}").format(
tax.idx,
bold(_(tax.meta.get_label("maximum_net_rate"))),
bold(_(tax.meta.get_label("minimum_net_rate"))),
)
)
def update_template_tables(self):
template = frappe.get_cached_doc("Item", self.variant_of)

View File

@@ -127,7 +127,7 @@
"label": "Purpose",
"oldfieldname": "purpose",
"oldfieldtype": "Select",
"options": "Material Issue\nMaterial Receipt\nMaterial Transfer\nMaterial Transfer for Manufacture\nMaterial Consumption for Manufacture\nManufacture\nRepack\nSend to Subcontractor",
"options": "Material Issue\nMaterial Receipt\nMaterial Transfer\nMaterial Transfer for Manufacture\nMaterial Consumption for Manufacture\nManufacture\nRepack\nSend to Subcontractor\nDisassemble",
"read_only": 1,
"search_index": 1
},
@@ -143,7 +143,7 @@
"reqd": 1
},
{
"depends_on": "eval:in_list([\"Material Transfer for Manufacture\", \"Manufacture\", \"Material Consumption for Manufacture\"], doc.purpose)",
"depends_on": "eval:in_list([\"Material Transfer for Manufacture\", \"Manufacture\", \"Material Consumption for Manufacture\", \"Disassemble\"], doc.purpose)",
"fieldname": "work_order",
"fieldtype": "Link",
"label": "Work Order",
@@ -242,7 +242,7 @@
},
{
"default": "0",
"depends_on": "eval:in_list([\"Material Issue\", \"Material Transfer\", \"Manufacture\", \"Repack\", \"Send to Subcontractor\", \"Material Transfer for Manufacture\", \"Material Consumption for Manufacture\"], doc.purpose)",
"depends_on": "eval:in_list([\"Material Issue\", \"Material Transfer\", \"Manufacture\", \"Repack\", \"Send to Subcontractor\", \"Material Transfer for Manufacture\", \"Material Consumption for Manufacture\", \"Disassemble\"], doc.purpose)",
"fieldname": "from_bom",
"fieldtype": "Check",
"label": "From BOM",
@@ -697,7 +697,7 @@
"index_web_pages_for_search": 1,
"is_submittable": 1,
"links": [],
"modified": "2024-08-13 19:02:42.386955",
"modified": "2024-08-13 19:05:42.386955",
"modified_by": "Administrator",
"module": "Stock",
"name": "Stock Entry",

View File

@@ -132,6 +132,7 @@ class StockEntry(StockController):
"Manufacture",
"Repack",
"Send to Subcontractor",
"Disassemble",
]
remarks: DF.Text | None
sales_invoice_no: DF.Link | None
@@ -234,6 +235,7 @@ class StockEntry(StockController):
self.validate_serialized_batch()
self.calculate_rate_and_amount()
self.validate_putaway_capacity()
self.validate_component_quantities()
if self.get("purpose") != "Manufacture":
# ignore scrap item wh difference and empty source/target wh
@@ -354,6 +356,7 @@ class StockEntry(StockController):
"Repack",
"Send to Subcontractor",
"Material Consumption for Manufacture",
"Disassemble",
]
if self.purpose not in valid_purposes:
@@ -631,6 +634,7 @@ class StockEntry(StockController):
"Manufacture",
"Material Transfer for Manufacture",
"Material Consumption for Manufacture",
"Disassemble",
):
# check if work order is entered
@@ -761,6 +765,34 @@ class StockEntry(StockController):
title=_("Insufficient Stock"),
)
def validate_component_quantities(self):
if self.purpose not in ["Manufacture", "Material Transfer for Manufacture"]:
return
if not frappe.db.get_single_value("Manufacturing Settings", "validate_components_quantities_per_bom"):
return
if not self.fg_completed_qty:
return
raw_materials = self.get_bom_raw_materials(self.fg_completed_qty)
precision = frappe.get_precision("Stock Entry Detail", "qty")
for row in self.items:
if not row.s_warehouse:
continue
if details := raw_materials.get(row.item_code):
if flt(details.get("qty"), precision) != flt(row.qty, precision):
frappe.throw(
_("For the item {0}, the quantity should be {1} according to the BOM {2}.").format(
frappe.bold(row.item_code),
flt(details.get("qty"), precision),
get_link_to_form("BOM", self.bom_no),
),
title=_("Incorrect Component Quantity"),
)
@frappe.whitelist()
def get_stock_and_rate(self):
"""
@@ -1726,11 +1758,63 @@ class StockEntry(StockController):
},
)
def get_items_for_disassembly(self):
"""Get items for Disassembly Order"""
if not self.work_order:
frappe.throw(_("The Work Order is mandatory for Disassembly Order"))
items = self.get_items_from_manufacture_entry()
s_warehouse = ""
if self.work_order:
s_warehouse = frappe.db.get_value("Work Order", self.work_order, "fg_warehouse")
for row in items:
child_row = self.append("items", {})
for field, value in row.items():
if value is not None:
child_row.set(field, value)
child_row.s_warehouse = (self.from_warehouse or s_warehouse) if row.is_finished_item else ""
child_row.t_warehouse = self.to_warehouse if not row.is_finished_item else ""
child_row.is_finished_item = 0 if row.is_finished_item else 1
def get_items_from_manufacture_entry(self):
return frappe.get_all(
"Stock Entry",
fields=[
"`tabStock Entry Detail`.`item_code`",
"`tabStock Entry Detail`.`item_name`",
"`tabStock Entry Detail`.`description`",
"`tabStock Entry Detail`.`qty`",
"`tabStock Entry Detail`.`transfer_qty`",
"`tabStock Entry Detail`.`stock_uom`",
"`tabStock Entry Detail`.`uom`",
"`tabStock Entry Detail`.`basic_rate`",
"`tabStock Entry Detail`.`conversion_factor`",
"`tabStock Entry Detail`.`is_finished_item`",
"`tabStock Entry Detail`.`batch_no`",
"`tabStock Entry Detail`.`serial_no`",
"`tabStock Entry Detail`.`use_serial_batch_fields`",
],
filters=[
["Stock Entry", "purpose", "=", "Manufacture"],
["Stock Entry", "work_order", "=", self.work_order],
["Stock Entry", "docstatus", "=", 1],
["Stock Entry Detail", "docstatus", "=", 1],
],
order_by="`tabStock Entry Detail`.`idx` desc, `tabStock Entry Detail`.`is_finished_item` desc",
)
@frappe.whitelist()
def get_items(self):
self.set("items", [])
self.validate_work_order()
if self.purpose == "Disassemble":
return self.get_items_for_disassembly()
if not self.posting_date or not self.posting_time:
frappe.throw(_("Posting date and posting time is mandatory"))

View File

@@ -17,7 +17,7 @@
"fieldtype": "Select",
"in_list_view": 1,
"label": "Purpose",
"options": "\nMaterial Issue\nMaterial Receipt\nMaterial Transfer\nMaterial Transfer for Manufacture\nMaterial Consumption for Manufacture\nManufacture\nRepack\nSend to Subcontractor",
"options": "\nMaterial Issue\nMaterial Receipt\nMaterial Transfer\nMaterial Transfer for Manufacture\nMaterial Consumption for Manufacture\nManufacture\nRepack\nSend to Subcontractor\nDisassemble",
"reqd": 1,
"set_only_once": 1
},
@@ -37,10 +37,11 @@
}
],
"links": [],
"modified": "2024-08-22 16:00:22.696958",
"modified": "2024-08-23 16:00:22.696958",
"modified_by": "Administrator",
"module": "Stock",
"name": "Stock Entry Type",
"naming_rule": "Set by user",
"owner": "Administrator",
"permissions": [
{

View File

@@ -30,6 +30,7 @@ class StockEntryType(Document):
"Manufacture",
"Repack",
"Send to Subcontractor",
"Disassemble",
]
# end: auto-generated types
@@ -48,6 +49,7 @@ class StockEntryType(Document):
"Manufacture",
"Repack",
"Send to Subcontractor",
"Disassemble",
]:
frappe.throw(f"Stock Entry Type {self.name} cannot be set as standard")

View File

@@ -352,7 +352,8 @@
{
"fieldname": "posting_datetime",
"fieldtype": "Datetime",
"label": "Posting Datetime"
"label": "Posting Datetime",
"search_index": 1
}
],
"hide_toolbar": 1,
@@ -361,7 +362,7 @@
"in_create": 1,
"index_web_pages_for_search": 1,
"links": [],
"modified": "2024-06-27 16:23:18.820049",
"modified": "2024-08-27 09:28:03.961443",
"modified_by": "Administrator",
"module": "Stock",
"name": "Stock Ledger Entry",

View File

@@ -351,3 +351,4 @@ def on_doctype_update():
frappe.db.add_index("Stock Ledger Entry", ["voucher_no", "voucher_type"])
frappe.db.add_index("Stock Ledger Entry", ["batch_no", "item_code", "warehouse"])
frappe.db.add_index("Stock Ledger Entry", ["warehouse", "item_code"], "item_warehouse")
frappe.db.add_index("Stock Ledger Entry", ["posting_datetime", "creation"])