fix: validate negative qty

(cherry picked from commit 329d14957b)

# Conflicts:
#	.editorconfig
#	.git-blame-ignore-revs
#	.github/helper/documentation.py
#	.github/helper/install.sh
#	.github/stale.yml
#	.github/workflows/linters.yml
#	.github/workflows/patch.yml
#	.github/workflows/release.yml
#	.github/workflows/release_notes.yml
#	.github/workflows/server-tests-mariadb.yml
#	.github/workflows/server-tests-postgres.yml
#	.gitignore
#	.mergify.yml
#	.releaserc
#	CODEOWNERS
#	README.md
#	erpnext/__init__.py
#	erpnext/accounts/deferred_revenue.py
#	erpnext/accounts/doctype/account/account.json
#	erpnext/accounts/doctype/account/account.py
#	erpnext/accounts/doctype/account/account_tree.js
#	erpnext/accounts/doctype/account/chart_of_accounts/chart_of_accounts.py
#	erpnext/accounts/doctype/account/chart_of_accounts/verified/de_kontenplan_SKR04.json
#	erpnext/accounts/doctype/account/chart_of_accounts/verified/hu_chart_of_accounts_for_microenterprises_with_account_number.json
#	erpnext/accounts/doctype/account/chart_of_accounts/verified/in_standard_chart_of_accounts.json
#	erpnext/accounts/doctype/account/chart_of_accounts/verified/ni_catalogo_de_cuentas.json
#	erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts.py
#	erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts_with_account_number.py
#	erpnext/accounts/doctype/account/test_account.py
#	erpnext/accounts/doctype/account_closing_balance/account_closing_balance.json
#	erpnext/accounts/doctype/account_closing_balance/test_account_closing_balance.py
#	erpnext/accounts/doctype/accounting_dimension/accounting_dimension.json
#	erpnext/accounts/doctype/accounting_dimension/test_accounting_dimension.py
#	erpnext/accounts/doctype/accounting_dimension_detail/accounting_dimension_detail.json
#	erpnext/accounts/doctype/accounting_dimension_filter/accounting_dimension_filter.json
#	erpnext/accounts/doctype/accounting_dimension_filter/accounting_dimension_filter.py
#	erpnext/accounts/doctype/accounting_dimension_filter/test_accounting_dimension_filter.py
#	erpnext/accounts/doctype/accounting_period/accounting_period.json
#	erpnext/accounts/doctype/accounting_period/test_accounting_period.py
#	erpnext/accounts/doctype/accounts_settings/accounts_settings.json
#	erpnext/accounts/doctype/accounts_settings/test_accounts_settings.py
#	erpnext/accounts/doctype/advance_payment_ledger_entry/test_advance_payment_ledger_entry.py
#	erpnext/accounts/doctype/advance_tax/advance_tax.json
#	erpnext/accounts/doctype/advance_taxes_and_charges/advance_taxes_and_charges.json
#	erpnext/accounts/doctype/advance_taxes_and_charges/advance_taxes_and_charges.py
#	erpnext/accounts/doctype/allowed_dimension/allowed_dimension.json
#	erpnext/accounts/doctype/allowed_to_transact_with/allowed_to_transact_with.json
#	erpnext/accounts/doctype/applicable_on_account/applicable_on_account.json
#	erpnext/accounts/doctype/bank/bank.json
#	erpnext/accounts/doctype/bank/test_bank.py
#	erpnext/accounts/doctype/bank_account/bank_account.json
#	erpnext/accounts/doctype/bank_account/bank_account.py
#	erpnext/accounts/doctype/bank_account/test_bank_account.py
#	erpnext/accounts/doctype/bank_account_subtype/bank_account_subtype.json
#	erpnext/accounts/doctype/bank_account_subtype/test_bank_account_subtype.py
#	erpnext/accounts/doctype/bank_account_type/bank_account_type.json
#	erpnext/accounts/doctype/bank_account_type/test_bank_account_type.py
#	erpnext/accounts/doctype/bank_clearance/bank_clearance.json
#	erpnext/accounts/doctype/bank_clearance/test_bank_clearance.py
#	erpnext/accounts/doctype/bank_clearance_detail/bank_clearance_detail.json
#	erpnext/accounts/doctype/bank_guarantee/bank_guarantee.json
#	erpnext/accounts/doctype/bank_guarantee/bank_guarantee.py
#	erpnext/accounts/doctype/bank_guarantee/test_bank_guarantee.py
#	erpnext/accounts/doctype/bank_reconciliation_tool/bank_reconciliation_tool.json
#	erpnext/accounts/doctype/bank_reconciliation_tool/test_bank_reconciliation_tool.py
#	erpnext/accounts/doctype/bank_statement_import/bank_statement_import.js
#	erpnext/accounts/doctype/bank_statement_import/bank_statement_import.json
#	erpnext/accounts/doctype/bank_statement_import/bank_statement_import.py
#	erpnext/accounts/doctype/bank_statement_import/test_bank_statement_import.py
#	erpnext/accounts/doctype/bank_transaction/auto_match_party.py
#	erpnext/accounts/doctype/bank_transaction/bank_transaction.py
#	erpnext/accounts/doctype/bank_transaction/test_auto_match_party.py
#	erpnext/accounts/doctype/bank_transaction/test_bank_transaction.py
#	erpnext/accounts/doctype/bank_transaction_mapping/bank_transaction_mapping.json
#	erpnext/accounts/doctype/bank_transaction_payments/bank_transaction_payments.json
#	erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.json
#	erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py
#	erpnext/accounts/doctype/bisect_accounting_statements/test_bisect_accounting_statements.py
#	erpnext/accounts/doctype/bisect_nodes/bisect_nodes.json
#	erpnext/accounts/doctype/bisect_nodes/test_bisect_nodes.py
#	erpnext/accounts/doctype/budget/budget.json
#	erpnext/accounts/doctype/budget/test_budget.py
#	erpnext/accounts/doctype/budget_account/budget_account.json
#	erpnext/accounts/doctype/campaign_item/campaign_item.json
#	erpnext/accounts/doctype/cashier_closing/cashier_closing.json
#	erpnext/accounts/doctype/cashier_closing/test_cashier_closing.py
#	erpnext/accounts/doctype/cashier_closing_payments/cashier_closing_payments.json
#	erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.json
#	erpnext/accounts/doctype/chart_of_accounts_importer/test_chart_of_accounts_importer.py
#	erpnext/accounts/doctype/cheque_print_template/cheque_print_template.json
#	erpnext/accounts/doctype/cheque_print_template/test_cheque_print_template.py
#	erpnext/accounts/doctype/closed_document/closed_document.json
#	erpnext/accounts/doctype/cost_center/cost_center.json
#	erpnext/accounts/doctype/cost_center/test_cost_center.py
#	erpnext/accounts/doctype/cost_center_allocation/cost_center_allocation.json
#	erpnext/accounts/doctype/cost_center_allocation/test_cost_center_allocation.py
#	erpnext/accounts/doctype/cost_center_allocation_percentage/cost_center_allocation_percentage.json
#	erpnext/accounts/doctype/coupon_code/coupon_code.json
#	erpnext/accounts/doctype/coupon_code/coupon_code.py
#	erpnext/accounts/doctype/coupon_code/test_coupon_code.py
#	erpnext/accounts/doctype/currency_exchange_settings/currency_exchange_settings.json
#	erpnext/accounts/doctype/currency_exchange_settings/test_currency_exchange_settings.py
#	erpnext/accounts/doctype/currency_exchange_settings_details/currency_exchange_settings_details.json
#	erpnext/accounts/doctype/currency_exchange_settings_result/currency_exchange_settings_result.json
#	erpnext/accounts/doctype/customer_group_item/customer_group_item.json
#	erpnext/accounts/doctype/customer_item/customer_item.json
#	erpnext/accounts/doctype/discounted_invoice/discounted_invoice.json
#	erpnext/accounts/doctype/dunning/dunning.json
#	erpnext/accounts/doctype/dunning/dunning.py
#	erpnext/accounts/doctype/dunning/test_dunning.py
#	erpnext/accounts/doctype/dunning_letter_text/dunning_letter_text.json
#	erpnext/accounts/doctype/dunning_type/dunning_type.json
#	erpnext/accounts/doctype/dunning_type/test_dunning_type.py
#	erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.js
#	erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.json
#	erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.py
#	erpnext/accounts/doctype/exchange_rate_revaluation/test_exchange_rate_revaluation.py
#	erpnext/accounts/doctype/exchange_rate_revaluation_account/exchange_rate_revaluation_account.json
#	erpnext/accounts/doctype/finance_book/finance_book.json
#	erpnext/accounts/doctype/finance_book/test_finance_book.py
#	erpnext/accounts/doctype/fiscal_year/fiscal_year.json
#	erpnext/accounts/doctype/fiscal_year/test_fiscal_year.py
#	erpnext/accounts/doctype/fiscal_year_company/fiscal_year_company.json
#	erpnext/accounts/doctype/gl_entry/test_gl_entry.py
#	erpnext/accounts/doctype/invoice_discounting/invoice_discounting.js
#	erpnext/accounts/doctype/invoice_discounting/invoice_discounting.json
#	erpnext/accounts/doctype/invoice_discounting/test_invoice_discounting.py
#	erpnext/accounts/doctype/item_tax_template/item_tax_template.json
#	erpnext/accounts/doctype/item_tax_template/test_item_tax_template.py
#	erpnext/accounts/doctype/item_tax_template_detail/item_tax_template_detail.json
#	erpnext/accounts/doctype/journal_entry/journal_entry.js
#	erpnext/accounts/doctype/journal_entry/journal_entry.json
#	erpnext/accounts/doctype/journal_entry/journal_entry.py
#	erpnext/accounts/doctype/journal_entry/journal_entry_list.js
#	erpnext/accounts/doctype/journal_entry/test_journal_entry.py
#	erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json
#	erpnext/accounts/doctype/journal_entry_template/journal_entry_template.json
#	erpnext/accounts/doctype/journal_entry_template/test_journal_entry_template.py
#	erpnext/accounts/doctype/journal_entry_template_account/journal_entry_template_account.json
#	erpnext/accounts/doctype/ledger_health/test_ledger_health.py
#	erpnext/accounts/doctype/ledger_health_monitor/test_ledger_health_monitor.py
#	erpnext/accounts/doctype/ledger_merge/ledger_merge.json
#	erpnext/accounts/doctype/ledger_merge/test_ledger_merge.py
#	erpnext/accounts/doctype/ledger_merge_accounts/ledger_merge_accounts.json
#	erpnext/accounts/doctype/loyalty_point_entry/loyalty_point_entry.json
#	erpnext/accounts/doctype/loyalty_point_entry/loyalty_point_entry.py
#	erpnext/accounts/doctype/loyalty_point_entry/test_loyalty_point_entry.py
#	erpnext/accounts/doctype/loyalty_point_entry_redemption/loyalty_point_entry_redemption.json
#	erpnext/accounts/doctype/loyalty_program/loyalty_program.json
#	erpnext/accounts/doctype/loyalty_program/loyalty_program.py
#	erpnext/accounts/doctype/loyalty_program/test_loyalty_program.py
#	erpnext/accounts/doctype/loyalty_program_collection/loyalty_program_collection.json
#	erpnext/accounts/doctype/mode_of_payment/mode_of_payment.json
#	erpnext/accounts/doctype/mode_of_payment/test_mode_of_payment.py
#	erpnext/accounts/doctype/mode_of_payment_account/mode_of_payment_account.json
#	erpnext/accounts/doctype/monthly_distribution/monthly_distribution.json
#	erpnext/accounts/doctype/monthly_distribution/test_monthly_distribution.py
#	erpnext/accounts/doctype/monthly_distribution_percentage/monthly_distribution_percentage.json
#	erpnext/accounts/doctype/opening_invoice_creation_tool/opening_invoice_creation_tool.json
#	erpnext/accounts/doctype/opening_invoice_creation_tool/opening_invoice_creation_tool.py
#	erpnext/accounts/doctype/opening_invoice_creation_tool/test_opening_invoice_creation_tool.py
#	erpnext/accounts/doctype/opening_invoice_creation_tool_item/opening_invoice_creation_tool_item.json
#	erpnext/accounts/doctype/overdue_payment/overdue_payment.json
#	erpnext/accounts/doctype/party_account/party_account.json
#	erpnext/accounts/doctype/party_link/party_link.json
#	erpnext/accounts/doctype/party_link/test_party_link.py
#	erpnext/accounts/doctype/payment_entry/payment_entry.js
#	erpnext/accounts/doctype/payment_entry/payment_entry.json
#	erpnext/accounts/doctype/payment_entry/payment_entry.py
#	erpnext/accounts/doctype/payment_entry/test_payment_entry.py
#	erpnext/accounts/doctype/payment_entry_deduction/payment_entry_deduction.json
#	erpnext/accounts/doctype/payment_entry_reference/payment_entry_reference.json
#	erpnext/accounts/doctype/payment_gateway_account/payment_gateway_account.json
#	erpnext/accounts/doctype/payment_gateway_account/test_payment_gateway_account.py
#	erpnext/accounts/doctype/payment_ledger_entry/payment_ledger_entry.json
#	erpnext/accounts/doctype/payment_ledger_entry/test_payment_ledger_entry.py
#	erpnext/accounts/doctype/payment_order/payment_order.json
#	erpnext/accounts/doctype/payment_order/test_payment_order.py
#	erpnext/accounts/doctype/payment_order_reference/payment_order_reference.json
#	erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.json
#	erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py
#	erpnext/accounts/doctype/payment_reconciliation/test_payment_reconciliation.py
#	erpnext/accounts/doctype/payment_reconciliation_allocation/payment_reconciliation_allocation.json
#	erpnext/accounts/doctype/payment_reconciliation_invoice/payment_reconciliation_invoice.json
#	erpnext/accounts/doctype/payment_reconciliation_payment/payment_reconciliation_payment.json
#	erpnext/accounts/doctype/payment_request/payment_request.js
#	erpnext/accounts/doctype/payment_request/payment_request.json
#	erpnext/accounts/doctype/payment_request/payment_request.py
#	erpnext/accounts/doctype/payment_request/payment_request_list.js
#	erpnext/accounts/doctype/payment_request/test_payment_request.py
#	erpnext/accounts/doctype/payment_schedule/payment_schedule.json
#	erpnext/accounts/doctype/payment_term/payment_term.json
#	erpnext/accounts/doctype/payment_term/test_payment_term.py
#	erpnext/accounts/doctype/payment_terms_template/payment_terms_template.json
#	erpnext/accounts/doctype/payment_terms_template/test_payment_terms_template.py
#	erpnext/accounts/doctype/payment_terms_template_detail/payment_terms_template_detail.json
#	erpnext/accounts/doctype/period_closing_voucher/period_closing_voucher.json
#	erpnext/accounts/doctype/period_closing_voucher/test_period_closing_voucher.py
#	erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.json
#	erpnext/accounts/doctype/pos_closing_entry/test_pos_closing_entry.py
#	erpnext/accounts/doctype/pos_closing_entry_detail/pos_closing_entry_detail.json
#	erpnext/accounts/doctype/pos_closing_entry_taxes/pos_closing_entry_taxes.json
#	erpnext/accounts/doctype/pos_customer_group/pos_customer_group.json
#	erpnext/accounts/doctype/pos_field/pos_field.json
#	erpnext/accounts/doctype/pos_invoice/pos_invoice.js
#	erpnext/accounts/doctype/pos_invoice/pos_invoice.json
#	erpnext/accounts/doctype/pos_invoice/pos_invoice.py
#	erpnext/accounts/doctype/pos_invoice/test_pos_invoice.py
#	erpnext/accounts/doctype/pos_invoice_item/pos_invoice_item.json
#	erpnext/accounts/doctype/pos_invoice_item/pos_invoice_item.py
#	erpnext/accounts/doctype/pos_invoice_merge_log/pos_invoice_merge_log.json
#	erpnext/accounts/doctype/pos_invoice_merge_log/pos_invoice_merge_log.py
#	erpnext/accounts/doctype/pos_invoice_merge_log/test_pos_invoice_merge_log.py
#	erpnext/accounts/doctype/pos_invoice_reference/pos_invoice_reference.json
#	erpnext/accounts/doctype/pos_item_group/pos_item_group.json
#	erpnext/accounts/doctype/pos_opening_entry/pos_opening_entry.json
#	erpnext/accounts/doctype/pos_opening_entry/test_pos_opening_entry.py
#	erpnext/accounts/doctype/pos_opening_entry_detail/pos_opening_entry_detail.json
#	erpnext/accounts/doctype/pos_payment_method/pos_payment_method.json
#	erpnext/accounts/doctype/pos_profile/pos_profile.json
#	erpnext/accounts/doctype/pos_profile/pos_profile.py
#	erpnext/accounts/doctype/pos_profile/test_pos_profile.py
#	erpnext/accounts/doctype/pos_profile_user/pos_profile_user.json
#	erpnext/accounts/doctype/pos_profile_user/test_pos_profile_user.py
#	erpnext/accounts/doctype/pos_search_fields/pos_search_fields.json
#	erpnext/accounts/doctype/pos_settings/pos_settings.json
#	erpnext/accounts/doctype/pos_settings/test_pos_settings.py
#	erpnext/accounts/doctype/pricing_rule/pricing_rule.json
#	erpnext/accounts/doctype/pricing_rule/pricing_rule.py
#	erpnext/accounts/doctype/pricing_rule/test_pricing_rule.py
#	erpnext/accounts/doctype/pricing_rule/utils.py
#	erpnext/accounts/doctype/pricing_rule_brand/pricing_rule_brand.json
#	erpnext/accounts/doctype/pricing_rule_detail/pricing_rule_detail.json
#	erpnext/accounts/doctype/pricing_rule_item_code/pricing_rule_item_code.json
#	erpnext/accounts/doctype/pricing_rule_item_group/pricing_rule_item_group.json
#	erpnext/accounts/doctype/process_deferred_accounting/process_deferred_accounting.json
#	erpnext/accounts/doctype/process_deferred_accounting/test_process_deferred_accounting.py
#	erpnext/accounts/doctype/process_payment_reconciliation/process_payment_reconciliation.json
#	erpnext/accounts/doctype/process_payment_reconciliation/process_payment_reconciliation.py
#	erpnext/accounts/doctype/process_payment_reconciliation/test_process_payment_reconciliation.py
#	erpnext/accounts/doctype/process_payment_reconciliation_log/process_payment_reconciliation_log.json
#	erpnext/accounts/doctype/process_payment_reconciliation_log/test_process_payment_reconciliation_log.py
#	erpnext/accounts/doctype/process_payment_reconciliation_log_allocations/process_payment_reconciliation_log_allocations.json
#	erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.html
#	erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.json
#	erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts_accounts_receivable.html
#	erpnext/accounts/doctype/process_statement_of_accounts/test_process_statement_of_accounts.py
#	erpnext/accounts/doctype/process_statement_of_accounts_customer/process_statement_of_accounts_customer.json
#	erpnext/accounts/doctype/process_subscription/process_subscription.json
#	erpnext/accounts/doctype/process_subscription/test_process_subscription.py
#	erpnext/accounts/doctype/promotional_scheme/promotional_scheme.json
#	erpnext/accounts/doctype/promotional_scheme/test_promotional_scheme.py
#	erpnext/accounts/doctype/promotional_scheme_price_discount/promotional_scheme_price_discount.json
#	erpnext/accounts/doctype/promotional_scheme_product_discount/promotional_scheme_product_discount.json
#	erpnext/accounts/doctype/psoa_cost_center/psoa_cost_center.json
#	erpnext/accounts/doctype/psoa_project/psoa_project.json
#	erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js
#	erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json
#	erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py
#	erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py
#	erpnext/accounts/doctype/purchase_invoice_advance/purchase_invoice_advance.json
#	erpnext/accounts/doctype/purchase_invoice_item/purchase_invoice_item.json
#	erpnext/accounts/doctype/purchase_invoice_item/purchase_invoice_item.py
#	erpnext/accounts/doctype/purchase_taxes_and_charges/purchase_taxes_and_charges.json
#	erpnext/accounts/doctype/purchase_taxes_and_charges/purchase_taxes_and_charges.py
#	erpnext/accounts/doctype/purchase_taxes_and_charges_template/purchase_taxes_and_charges_template.json
#	erpnext/accounts/doctype/purchase_taxes_and_charges_template/test_purchase_taxes_and_charges_template.py
#	erpnext/accounts/doctype/repost_accounting_ledger/repost_accounting_ledger.json
#	erpnext/accounts/doctype/repost_accounting_ledger/test_repost_accounting_ledger.py
#	erpnext/accounts/doctype/repost_accounting_ledger_items/repost_accounting_ledger_items.json
#	erpnext/accounts/doctype/repost_accounting_ledger_settings/repost_accounting_ledger_settings.json
#	erpnext/accounts/doctype/repost_accounting_ledger_settings/test_repost_accounting_ledger_settings.py
#	erpnext/accounts/doctype/repost_allowed_types/repost_allowed_types.json
#	erpnext/accounts/doctype/repost_payment_ledger/repost_payment_ledger.json
#	erpnext/accounts/doctype/repost_payment_ledger/test_repost_payment_ledger.py
#	erpnext/accounts/doctype/repost_payment_ledger_items/repost_payment_ledger_items.json
#	erpnext/accounts/doctype/sales_invoice/sales_invoice.js
#	erpnext/accounts/doctype/sales_invoice/sales_invoice.json
#	erpnext/accounts/doctype/sales_invoice/sales_invoice.py
#	erpnext/accounts/doctype/sales_invoice/sales_invoice_list.js
#	erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py
#	erpnext/accounts/doctype/sales_invoice_advance/sales_invoice_advance.json
#	erpnext/accounts/doctype/sales_invoice_item/sales_invoice_item.json
#	erpnext/accounts/doctype/sales_invoice_item/sales_invoice_item.py
#	erpnext/accounts/doctype/sales_invoice_payment/sales_invoice_payment.json
#	erpnext/accounts/doctype/sales_invoice_timesheet/sales_invoice_timesheet.json
#	erpnext/accounts/doctype/sales_partner_item/sales_partner_item.json
#	erpnext/accounts/doctype/sales_taxes_and_charges/sales_taxes_and_charges.json
#	erpnext/accounts/doctype/sales_taxes_and_charges/sales_taxes_and_charges.py
#	erpnext/accounts/doctype/sales_taxes_and_charges_template/sales_taxes_and_charges_template.json
#	erpnext/accounts/doctype/sales_taxes_and_charges_template/sales_taxes_and_charges_template.py
#	erpnext/accounts/doctype/sales_taxes_and_charges_template/test_sales_taxes_and_charges_template.py
#	erpnext/accounts/doctype/share_balance/share_balance.json
#	erpnext/accounts/doctype/share_transfer/share_transfer.json
#	erpnext/accounts/doctype/share_transfer/test_share_transfer.py
#	erpnext/accounts/doctype/share_type/share_type.json
#	erpnext/accounts/doctype/share_type/test_share_type.py
#	erpnext/accounts/doctype/shareholder/shareholder.json
#	erpnext/accounts/doctype/shareholder/test_shareholder.py
#	erpnext/accounts/doctype/shipping_rule/shipping_rule.json
#	erpnext/accounts/doctype/shipping_rule/shipping_rule.py
#	erpnext/accounts/doctype/shipping_rule/test_shipping_rule.py
#	erpnext/accounts/doctype/shipping_rule_condition/shipping_rule_condition.json
#	erpnext/accounts/doctype/shipping_rule_country/shipping_rule_country.json
#	erpnext/accounts/doctype/south_africa_vat_account/south_africa_vat_account.json
#	erpnext/accounts/doctype/subscription/subscription.json
#	erpnext/accounts/doctype/subscription/subscription.py
#	erpnext/accounts/doctype/subscription/subscription_list.js
#	erpnext/accounts/doctype/subscription/test_subscription.py
#	erpnext/accounts/doctype/subscription_invoice/subscription_invoice.json
#	erpnext/accounts/doctype/subscription_invoice/test_subscription_invoice.py
#	erpnext/accounts/doctype/subscription_plan/subscription_plan.json
#	erpnext/accounts/doctype/subscription_plan/test_subscription_plan.py
#	erpnext/accounts/doctype/subscription_plan_detail/subscription_plan_detail.json
#	erpnext/accounts/doctype/subscription_settings/subscription_settings.json
#	erpnext/accounts/doctype/subscription_settings/test_subscription_settings.py
#	erpnext/accounts/doctype/supplier_group_item/supplier_group_item.json
#	erpnext/accounts/doctype/supplier_item/supplier_item.json
#	erpnext/accounts/doctype/tax_category/tax_category.json
#	erpnext/accounts/doctype/tax_category/test_tax_category.py
#	erpnext/accounts/doctype/tax_rule/tax_rule.json
#	erpnext/accounts/doctype/tax_rule/tax_rule.py
#	erpnext/accounts/doctype/tax_rule/test_tax_rule.py
#	erpnext/accounts/doctype/tax_withheld_vouchers/tax_withheld_vouchers.json
#	erpnext/accounts/doctype/tax_withholding_account/tax_withholding_account.json
#	erpnext/accounts/doctype/tax_withholding_category/tax_withholding_category.json
#	erpnext/accounts/doctype/tax_withholding_category/test_tax_withholding_category.py
#	erpnext/accounts/doctype/tax_withholding_rate/tax_withholding_rate.json
#	erpnext/accounts/doctype/territory_item/territory_item.json
#	erpnext/accounts/doctype/transaction_deletion_record_details/transaction_deletion_record_details.json
#	erpnext/accounts/doctype/unreconcile_payment/test_unreconcile_payment.py
#	erpnext/accounts/doctype/unreconcile_payment/unreconcile_payment.json
#	erpnext/accounts/doctype/unreconcile_payment/unreconcile_payment.py
#	erpnext/accounts/doctype/unreconcile_payment_entries/unreconcile_payment_entries.json
#	erpnext/accounts/general_ledger.py
#	erpnext/accounts/notification/notification_for_new_fiscal_year/notification_for_new_fiscal_year.json
#	erpnext/accounts/party.py
#	erpnext/accounts/print_format/dunning_letter/dunning_letter.json
#	erpnext/accounts/print_format/sales_invoice_return/sales_invoice_return.html
#	erpnext/accounts/report/account_balance/account_balance.js
#	erpnext/accounts/report/account_balance/account_balance.py
#	erpnext/accounts/report/account_balance/test_account_balance.py
#	erpnext/accounts/report/accounts_payable/accounts_payable.js
#	erpnext/accounts/report/accounts_payable/test_accounts_payable.py
#	erpnext/accounts/report/accounts_receivable/accounts_receivable.js
#	erpnext/accounts/report/accounts_receivable/accounts_receivable.py
#	erpnext/accounts/report/accounts_receivable/test_accounts_receivable.py
#	erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py
#	erpnext/accounts/report/accounts_receivable_summary/test_accounts_receivable_summary.py
#	erpnext/accounts/report/balance_sheet/test_balance_sheet.py
#	erpnext/accounts/report/bank_reconciliation_statement/test_bank_reconciliation_statement.py
#	erpnext/accounts/report/cash_flow/cash_flow.py
#	erpnext/accounts/report/consolidated_financial_statement/consolidated_financial_statement.py
#	erpnext/accounts/report/customer_ledger_summary/customer_ledger_summary.py
#	erpnext/accounts/report/deferred_revenue_and_expense/deferred_revenue_and_expense.py
#	erpnext/accounts/report/deferred_revenue_and_expense/test_deferred_revenue_and_expense.py
#	erpnext/accounts/report/general_and_payment_ledger_comparison/test_general_and_payment_ledger_comparison.py
#	erpnext/accounts/report/general_ledger/general_ledger.html
#	erpnext/accounts/report/general_ledger/general_ledger.py
#	erpnext/accounts/report/general_ledger/test_general_ledger.py
#	erpnext/accounts/report/gross_and_net_profit_report/gross_and_net_profit_report.py
#	erpnext/accounts/report/gross_profit/test_gross_profit.py
#	erpnext/accounts/report/item_wise_purchase_register/test_item_wise_purchase_register.py
#	erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.js
#	erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py
#	erpnext/accounts/report/item_wise_sales_register/test_item_wise_sales_register.py
#	erpnext/accounts/report/payment_ledger/test_payment_ledger.py
#	erpnext/accounts/report/profit_and_loss_statement/test_profit_and_loss_statement.py
#	erpnext/accounts/report/purchase_register/test_purchase_register.py
#	erpnext/accounts/report/sales_payment_summary/test_sales_payment_summary.py
#	erpnext/accounts/report/sales_register/test_sales_register.py
#	erpnext/accounts/report/tax_withholding_details/tax_withholding_details.py
#	erpnext/accounts/report/tax_withholding_details/test_tax_withholding_details.py
#	erpnext/accounts/report/trial_balance/test_trial_balance.py
#	erpnext/accounts/test/accounts_mixin.py
#	erpnext/accounts/test/test_reports.py
#	erpnext/accounts/test/test_utils.py
#	erpnext/accounts/test_party.py
#	erpnext/accounts/utils.py
#	erpnext/assets/doctype/asset/asset.js
#	erpnext/assets/doctype/asset/asset.json
#	erpnext/assets/doctype/asset/asset.py
#	erpnext/assets/doctype/asset/depreciation.py
#	erpnext/assets/doctype/asset/test_asset.py
#	erpnext/assets/doctype/asset_activity/asset_activity.json
#	erpnext/assets/doctype/asset_activity/test_asset_activity.py
#	erpnext/assets/doctype/asset_capitalization/asset_capitalization.js
#	erpnext/assets/doctype/asset_capitalization/asset_capitalization.json
#	erpnext/assets/doctype/asset_capitalization/asset_capitalization.py
#	erpnext/assets/doctype/asset_capitalization/test_asset_capitalization.py
#	erpnext/assets/doctype/asset_capitalization_asset_item/asset_capitalization_asset_item.json
#	erpnext/assets/doctype/asset_capitalization_service_item/asset_capitalization_service_item.json
#	erpnext/assets/doctype/asset_capitalization_stock_item/asset_capitalization_stock_item.json
#	erpnext/assets/doctype/asset_category/asset_category.json
#	erpnext/assets/doctype/asset_category/test_asset_category.py
#	erpnext/assets/doctype/asset_category_account/asset_category_account.json
#	erpnext/assets/doctype/asset_depreciation_schedule/asset_depreciation_schedule.json
#	erpnext/assets/doctype/asset_depreciation_schedule/test_asset_depreciation_schedule.py
#	erpnext/assets/doctype/asset_finance_book/asset_finance_book.json
#	erpnext/assets/doctype/asset_maintenance/asset_maintenance.json
#	erpnext/assets/doctype/asset_maintenance/asset_maintenance.py
#	erpnext/assets/doctype/asset_maintenance/test_asset_maintenance.py
#	erpnext/assets/doctype/asset_maintenance_log/asset_maintenance_log.json
#	erpnext/assets/doctype/asset_maintenance_log/test_asset_maintenance_log.py
#	erpnext/assets/doctype/asset_maintenance_task/asset_maintenance_task.json
#	erpnext/assets/doctype/asset_maintenance_team/asset_maintenance_team.json
#	erpnext/assets/doctype/asset_maintenance_team/test_asset_maintenance_team.py
#	erpnext/assets/doctype/asset_movement/asset_movement.json
#	erpnext/assets/doctype/asset_movement/asset_movement.py
#	erpnext/assets/doctype/asset_movement/test_asset_movement.py
#	erpnext/assets/doctype/asset_movement_item/asset_movement_item.json
#	erpnext/assets/doctype/asset_repair/asset_repair.js
#	erpnext/assets/doctype/asset_repair/asset_repair.json
#	erpnext/assets/doctype/asset_repair/asset_repair.py
#	erpnext/assets/doctype/asset_repair/test_asset_repair.py
#	erpnext/assets/doctype/asset_repair_consumed_item/asset_repair_consumed_item.json
#	erpnext/assets/doctype/asset_shift_allocation/asset_shift_allocation.json
#	erpnext/assets/doctype/asset_shift_allocation/test_asset_shift_allocation.py
#	erpnext/assets/doctype/asset_shift_factor/asset_shift_factor.json
#	erpnext/assets/doctype/asset_shift_factor/test_asset_shift_factor.py
#	erpnext/assets/doctype/asset_value_adjustment/asset_value_adjustment.js
#	erpnext/assets/doctype/asset_value_adjustment/asset_value_adjustment.json
#	erpnext/assets/doctype/asset_value_adjustment/asset_value_adjustment.py
#	erpnext/assets/doctype/asset_value_adjustment/test_asset_value_adjustment.py
#	erpnext/assets/doctype/depreciation_schedule/depreciation_schedule.json
#	erpnext/assets/doctype/linked_location/linked_location.json
#	erpnext/assets/doctype/location/location.json
#	erpnext/assets/doctype/location/test_location.py
#	erpnext/assets/doctype/maintenance_team_member/maintenance_team_member.json
#	erpnext/assets/doctype/maintenance_team_member/test_maintenance_team_member.py
#	erpnext/assets/report/fixed_asset_register/fixed_asset_register.py
#	erpnext/bulk_transaction/doctype/bulk_transaction_log/bulk_transaction_log.json
#	erpnext/bulk_transaction/doctype/bulk_transaction_log/test_bulk_transaction_log.py
#	erpnext/bulk_transaction/doctype/bulk_transaction_log_detail/bulk_transaction_log_detail.json
#	erpnext/bulk_transaction/doctype/bulk_transaction_log_detail/test_bulk_transaction_log_detail.py
#	erpnext/buying/doctype/buying_settings/buying_settings.json
#	erpnext/buying/doctype/buying_settings/test_buying_settings.py
#	erpnext/buying/doctype/purchase_order/purchase_order.js
#	erpnext/buying/doctype/purchase_order/purchase_order.json
#	erpnext/buying/doctype/purchase_order/purchase_order.py
#	erpnext/buying/doctype/purchase_order/purchase_order_list.js
#	erpnext/buying/doctype/purchase_order/test_purchase_order.py
#	erpnext/buying/doctype/purchase_order_item/purchase_order_item.json
#	erpnext/buying/doctype/purchase_order_item/purchase_order_item.py
#	erpnext/buying/doctype/purchase_order_item_supplied/purchase_order_item_supplied.json
#	erpnext/buying/doctype/purchase_receipt_item_supplied/purchase_receipt_item_supplied.json
#	erpnext/buying/doctype/request_for_quotation/request_for_quotation.js
#	erpnext/buying/doctype/request_for_quotation/request_for_quotation.json
#	erpnext/buying/doctype/request_for_quotation/request_for_quotation.py
#	erpnext/buying/doctype/request_for_quotation/test_request_for_quotation.py
#	erpnext/buying/doctype/request_for_quotation_item/request_for_quotation_item.json
#	erpnext/buying/doctype/request_for_quotation_supplier/request_for_quotation_supplier.json
#	erpnext/buying/doctype/supplier/supplier.json
#	erpnext/buying/doctype/supplier/supplier_dashboard.py
#	erpnext/buying/doctype/supplier/test_supplier.py
#	erpnext/buying/doctype/supplier_quotation/supplier_quotation.js
#	erpnext/buying/doctype/supplier_quotation/supplier_quotation.json
#	erpnext/buying/doctype/supplier_quotation/supplier_quotation.py
#	erpnext/buying/doctype/supplier_quotation/test_supplier_quotation.py
#	erpnext/buying/doctype/supplier_quotation_item/supplier_quotation_item.json
#	erpnext/buying/doctype/supplier_quotation_item/supplier_quotation_item.py
#	erpnext/buying/doctype/supplier_scorecard/supplier_scorecard.json
#	erpnext/buying/doctype/supplier_scorecard/supplier_scorecard.py
#	erpnext/buying/doctype/supplier_scorecard/test_supplier_scorecard.py
#	erpnext/buying/doctype/supplier_scorecard_criteria/supplier_scorecard_criteria.json
#	erpnext/buying/doctype/supplier_scorecard_criteria/test_supplier_scorecard_criteria.py
#	erpnext/buying/doctype/supplier_scorecard_period/supplier_scorecard_period.json
#	erpnext/buying/doctype/supplier_scorecard_period/test_supplier_scorecard_period.py
#	erpnext/buying/doctype/supplier_scorecard_scoring_criteria/supplier_scorecard_scoring_criteria.json
#	erpnext/buying/doctype/supplier_scorecard_scoring_standing/supplier_scorecard_scoring_standing.json
#	erpnext/buying/doctype/supplier_scorecard_scoring_variable/supplier_scorecard_scoring_variable.json
#	erpnext/buying/doctype/supplier_scorecard_standing/supplier_scorecard_standing.json
#	erpnext/buying/doctype/supplier_scorecard_standing/test_supplier_scorecard_standing.py
#	erpnext/buying/doctype/supplier_scorecard_variable/supplier_scorecard_variable.json
#	erpnext/buying/doctype/supplier_scorecard_variable/supplier_scorecard_variable.py
#	erpnext/buying/doctype/supplier_scorecard_variable/test_supplier_scorecard_variable.py
#	erpnext/buying/report/procurement_tracker/test_procurement_tracker.py
#	erpnext/buying/report/purchase_order_analysis/purchase_order_analysis.js
#	erpnext/buying/report/purchase_order_analysis/purchase_order_analysis.py
#	erpnext/buying/report/requested_items_to_order_and_receive/test_requested_items_to_order_and_receive.py
#	erpnext/buying/report/subcontracted_item_to_be_received/test_subcontracted_item_to_be_received.py
#	erpnext/buying/report/subcontracted_raw_materials_to_be_transferred/test_subcontracted_raw_materials_to_be_transferred.py
#	erpnext/buying/utils.py
#	erpnext/communication/doctype/communication_medium/communication_medium.json
#	erpnext/communication/doctype/communication_medium_timeslot/communication_medium_timeslot.json
#	erpnext/controllers/accounts_controller.py
#	erpnext/controllers/buying_controller.py
#	erpnext/controllers/queries.py
#	erpnext/controllers/sales_and_purchase_return.py
#	erpnext/controllers/selling_controller.py
#	erpnext/controllers/status_updater.py
#	erpnext/controllers/stock_controller.py
#	erpnext/controllers/subcontracting_controller.py
#	erpnext/controllers/taxes_and_totals.py
#	erpnext/controllers/tests/test_accounts_controller.py
#	erpnext/controllers/tests/test_item_variant.py
#	erpnext/controllers/tests/test_mapper.py
#	erpnext/controllers/tests/test_qty_based_taxes.py
#	erpnext/controllers/tests/test_queries.py
#	erpnext/controllers/tests/test_subcontracting_controller.py
#	erpnext/controllers/tests/test_transaction_base.py
#	erpnext/controllers/website_list_for_contact.py
#	erpnext/crm/dashboard_chart/lead_source/lead_source.json
#	erpnext/crm/dashboard_chart/opportunities_via_campaigns/opportunities_via_campaigns.json
#	erpnext/crm/doctype/appointment/appointment.json
#	erpnext/crm/doctype/appointment/appointment.py
#	erpnext/crm/doctype/appointment/test_appointment.py
#	erpnext/crm/doctype/appointment_booking_settings/appointment_booking_settings.json
#	erpnext/crm/doctype/appointment_booking_settings/test_appointment_booking_settings.py
#	erpnext/crm/doctype/appointment_booking_slots/appointment_booking_slots.json
#	erpnext/crm/doctype/availability_of_slots/availability_of_slots.json
#	erpnext/crm/doctype/campaign/campaign.js
#	erpnext/crm/doctype/campaign/campaign.json
#	erpnext/crm/doctype/campaign/campaign.py
#	erpnext/crm/doctype/campaign/test_campaign.py
#	erpnext/crm/doctype/campaign_email_schedule/campaign_email_schedule.json
#	erpnext/crm/doctype/competitor/competitor.json
#	erpnext/crm/doctype/competitor/test_competitor.py
#	erpnext/crm/doctype/competitor_detail/competitor_detail.json
#	erpnext/crm/doctype/contract/contract.json
#	erpnext/crm/doctype/contract/test_contract.py
#	erpnext/crm/doctype/contract_fulfilment_checklist/contract_fulfilment_checklist.json
#	erpnext/crm/doctype/contract_fulfilment_checklist/test_contract_fulfilment_checklist.py
#	erpnext/crm/doctype/contract_template/contract_template.json
#	erpnext/crm/doctype/contract_template/test_contract_template.py
#	erpnext/crm/doctype/contract_template_fulfilment_terms/contract_template_fulfilment_terms.json
#	erpnext/crm/doctype/crm_note/crm_note.json
#	erpnext/crm/doctype/crm_settings/crm_settings.json
#	erpnext/crm/doctype/crm_settings/test_crm_settings.py
#	erpnext/crm/doctype/email_campaign/email_campaign.json
#	erpnext/crm/doctype/email_campaign/email_campaign.py
#	erpnext/crm/doctype/email_campaign/test_email_campaign.py
#	erpnext/crm/doctype/lead/lead.json
#	erpnext/crm/doctype/lead/lead.py
#	erpnext/crm/doctype/lead/test_lead.py
#	erpnext/crm/doctype/lost_reason_detail/lost_reason_detail.json
#	erpnext/crm/doctype/market_segment/market_segment.json
#	erpnext/crm/doctype/market_segment/test_market_segment.py
#	erpnext/crm/doctype/opportunity/opportunity.js
#	erpnext/crm/doctype/opportunity/opportunity.json
#	erpnext/crm/doctype/opportunity/opportunity.py
#	erpnext/crm/doctype/opportunity/test_opportunity.py
#	erpnext/crm/doctype/opportunity_item/opportunity_item.json
#	erpnext/crm/doctype/opportunity_lost_reason/opportunity_lost_reason.json
#	erpnext/crm/doctype/opportunity_lost_reason_detail/opportunity_lost_reason_detail.json
#	erpnext/crm/doctype/opportunity_type/opportunity_type.json
#	erpnext/crm/doctype/opportunity_type/test_opportunity_type.py
#	erpnext/crm/doctype/prospect/prospect.json
#	erpnext/crm/doctype/prospect/test_prospect.py
#	erpnext/crm/doctype/prospect_lead/prospect_lead.json
#	erpnext/crm/doctype/prospect_opportunity/prospect_opportunity.json
#	erpnext/crm/doctype/sales_stage/sales_stage.json
#	erpnext/crm/doctype/sales_stage/test_sales_stage.py
#	erpnext/crm/doctype/utils.py
#	erpnext/crm/report/campaign_efficiency/campaign_efficiency.py
#	erpnext/crm/report/opportunity_summary_by_sales_stage/opportunity_summary_by_sales_stage.js
#	erpnext/crm/report/opportunity_summary_by_sales_stage/opportunity_summary_by_sales_stage.py
#	erpnext/crm/report/opportunity_summary_by_sales_stage/test_opportunity_summary_by_sales_stage.py
#	erpnext/crm/report/sales_pipeline_analytics/sales_pipeline_analytics.js
#	erpnext/crm/report/sales_pipeline_analytics/sales_pipeline_analytics.py
#	erpnext/crm/report/sales_pipeline_analytics/test_sales_pipeline_analytics.py
#	erpnext/crm/workspace/crm/crm.json
#	erpnext/edi/doctype/code_list/code_list_import.py
#	erpnext/erpnext_integrations/doctype/plaid_settings/plaid_settings.json
#	erpnext/erpnext_integrations/doctype/plaid_settings/test_plaid_settings.py
#	erpnext/erpnext_integrations/doctype/quickbooks_migrator/quickbooks_migrator.json
#	erpnext/erpnext_integrations/doctype/quickbooks_migrator/test_quickbooks_migrator.py
#	erpnext/erpnext_integrations/doctype/tally_migration/tally_migration.json
#	erpnext/erpnext_integrations/doctype/tally_migration/tally_migration.py
#	erpnext/erpnext_integrations/doctype/tally_migration/test_tally_migration.py
#	erpnext/erpnext_integrations/utils.py
#	erpnext/hooks.py
#	erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.json
#	erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.py
#	erpnext/maintenance/doctype/maintenance_schedule/test_maintenance_schedule.py
#	erpnext/maintenance/doctype/maintenance_schedule_detail/maintenance_schedule_detail.json
#	erpnext/maintenance/doctype/maintenance_schedule_item/maintenance_schedule_item.json
#	erpnext/maintenance/doctype/maintenance_visit/maintenance_visit.json
#	erpnext/maintenance/doctype/maintenance_visit/maintenance_visit.py
#	erpnext/maintenance/doctype/maintenance_visit/test_maintenance_visit.py
#	erpnext/maintenance/doctype/maintenance_visit_purpose/maintenance_visit_purpose.json
#	erpnext/manufacturing/doctype/blanket_order/blanket_order.json
#	erpnext/manufacturing/doctype/blanket_order/blanket_order.py
#	erpnext/manufacturing/doctype/blanket_order/test_blanket_order.py
#	erpnext/manufacturing/doctype/blanket_order_item/blanket_order_item.json
#	erpnext/manufacturing/doctype/bom/bom.js
#	erpnext/manufacturing/doctype/bom/bom.json
#	erpnext/manufacturing/doctype/bom/bom.py
#	erpnext/manufacturing/doctype/bom/test_bom.py
#	erpnext/manufacturing/doctype/bom_creator/bom_creator.js
#	erpnext/manufacturing/doctype/bom_creator/bom_creator.json
#	erpnext/manufacturing/doctype/bom_creator/bom_creator.py
#	erpnext/manufacturing/doctype/bom_creator/test_bom_creator.py
#	erpnext/manufacturing/doctype/bom_creator_item/bom_creator_item.json
#	erpnext/manufacturing/doctype/bom_creator_item/bom_creator_item.py
#	erpnext/manufacturing/doctype/bom_explosion_item/bom_explosion_item.json
#	erpnext/manufacturing/doctype/bom_item/bom_item.json
#	erpnext/manufacturing/doctype/bom_item/bom_item.py
#	erpnext/manufacturing/doctype/bom_operation/bom_operation.json
#	erpnext/manufacturing/doctype/bom_operation/bom_operation.py
#	erpnext/manufacturing/doctype/bom_scrap_item/bom_scrap_item.json
#	erpnext/manufacturing/doctype/bom_update_batch/bom_update_batch.json
#	erpnext/manufacturing/doctype/bom_update_log/bom_update_log.json
#	erpnext/manufacturing/doctype/bom_update_log/bom_update_log.py
#	erpnext/manufacturing/doctype/bom_update_log/test_bom_update_log.py
#	erpnext/manufacturing/doctype/bom_update_tool/bom_update_tool.json
#	erpnext/manufacturing/doctype/bom_update_tool/test_bom_update_tool.py
#	erpnext/manufacturing/doctype/bom_website_item/bom_website_item.json
#	erpnext/manufacturing/doctype/bom_website_operation/bom_website_operation.json
#	erpnext/manufacturing/doctype/downtime_entry/downtime_entry.json
#	erpnext/manufacturing/doctype/downtime_entry/test_downtime_entry.py
#	erpnext/manufacturing/doctype/job_card/job_card.js
#	erpnext/manufacturing/doctype/job_card/job_card.json
#	erpnext/manufacturing/doctype/job_card/job_card.py
#	erpnext/manufacturing/doctype/job_card/job_card_dashboard.py
#	erpnext/manufacturing/doctype/job_card/test_job_card.py
#	erpnext/manufacturing/doctype/job_card_item/job_card_item.json
#	erpnext/manufacturing/doctype/job_card_operation/job_card_operation.json
#	erpnext/manufacturing/doctype/job_card_scheduled_time/job_card_scheduled_time.json
#	erpnext/manufacturing/doctype/job_card_scrap_item/job_card_scrap_item.json
#	erpnext/manufacturing/doctype/job_card_time_log/job_card_time_log.json
#	erpnext/manufacturing/doctype/manufacturing_settings/manufacturing_settings.json
#	erpnext/manufacturing/doctype/manufacturing_settings/test_manufacturing_settings.py
#	erpnext/manufacturing/doctype/material_request_plan_item/material_request_plan_item.json
#	erpnext/manufacturing/doctype/material_request_plan_item/test_material_request_plan_item.py
#	erpnext/manufacturing/doctype/operation/operation.json
#	erpnext/manufacturing/doctype/operation/test_operation.py
#	erpnext/manufacturing/doctype/plant_floor/plant_floor.js
#	erpnext/manufacturing/doctype/plant_floor/plant_floor.json
#	erpnext/manufacturing/doctype/plant_floor/test_plant_floor.py
#	erpnext/manufacturing/doctype/production_plan/production_plan.json
#	erpnext/manufacturing/doctype/production_plan/production_plan.py
#	erpnext/manufacturing/doctype/production_plan/test_production_plan.py
#	erpnext/manufacturing/doctype/production_plan_item/production_plan_item.json
#	erpnext/manufacturing/doctype/production_plan_item_reference/production_plan_item_reference.json
#	erpnext/manufacturing/doctype/production_plan_material_request/production_plan_material_request.json
#	erpnext/manufacturing/doctype/production_plan_material_request_warehouse/production_plan_material_request_warehouse.json
#	erpnext/manufacturing/doctype/production_plan_material_request_warehouse/test_production_plan_material_request_warehouse.py
#	erpnext/manufacturing/doctype/production_plan_sales_order/production_plan_sales_order.json
#	erpnext/manufacturing/doctype/production_plan_sub_assembly_item/production_plan_sub_assembly_item.json
#	erpnext/manufacturing/doctype/routing/routing.json
#	erpnext/manufacturing/doctype/routing/routing.py
#	erpnext/manufacturing/doctype/routing/test_routing.py
#	erpnext/manufacturing/doctype/sub_operation/sub_operation.json
#	erpnext/manufacturing/doctype/sub_operation/test_sub_operation.py
#	erpnext/manufacturing/doctype/work_order/test_work_order.py
#	erpnext/manufacturing/doctype/work_order/work_order.js
#	erpnext/manufacturing/doctype/work_order/work_order.json
#	erpnext/manufacturing/doctype/work_order/work_order.py
#	erpnext/manufacturing/doctype/work_order_item/work_order_item.json
#	erpnext/manufacturing/doctype/work_order_operation/work_order_operation.json
#	erpnext/manufacturing/doctype/work_order_operation/work_order_operation.py
#	erpnext/manufacturing/doctype/workstation/test_workstation.py
#	erpnext/manufacturing/doctype/workstation/workstation.js
#	erpnext/manufacturing/doctype/workstation/workstation.json
#	erpnext/manufacturing/doctype/workstation/workstation.py
#	erpnext/manufacturing/doctype/workstation/workstation_job_card.html
#	erpnext/manufacturing/doctype/workstation_type/test_workstation_type.py
#	erpnext/manufacturing/doctype/workstation_type/workstation_type.json
#	erpnext/manufacturing/doctype/workstation_working_hour/workstation_working_hour.json
#	erpnext/manufacturing/notification/material_request_receipt_notification/material_request_receipt_notification.json
#	erpnext/manufacturing/report/bom_stock_calculated/test_bom_stock_calculated.py
#	erpnext/manufacturing/report/bom_stock_report/test_bom_stock_report.py
#	erpnext/manufacturing/report/production_analytics/production_analytics.py
#	erpnext/manufacturing/report/quality_inspection_summary/quality_inspection_summary.py
#	erpnext/manufacturing/report/test_reports.py
#	erpnext/patches.txt
#	erpnext/patches/v11_0/create_department_records_for_each_company.py
#	erpnext/patches/v11_0/make_location_from_warehouse.py
#	erpnext/patches/v11_0/rebuild_tree_for_company.py
#	erpnext/patches/v11_0/rename_supplier_type_to_supplier_group.py
#	erpnext/patches/v11_0/update_department_lft_rgt.py
#	erpnext/patches/v13_0/modify_invalid_gain_loss_gl_entries.py
#	erpnext/patches/v14_0/migrate_crm_settings.py
#	erpnext/patches/v14_0/migrate_gl_to_payment_ledger.py
#	erpnext/patches/v15_0/create_advance_payment_ledger_records.py
#	erpnext/patches/v15_0/create_asset_depreciation_schedules_from_assets.py
#	erpnext/patches/v15_0/update_gpa_and_ndb_for_assdeprsch.py
#	erpnext/portal/doctype/website_attribute/website_attribute.json
#	erpnext/portal/doctype/website_filter_field/website_filter_field.json
#	erpnext/portal/utils.py
#	erpnext/projects/doctype/activity_cost/activity_cost.json
#	erpnext/projects/doctype/activity_cost/test_activity_cost.py
#	erpnext/projects/doctype/activity_type/activity_type.json
#	erpnext/projects/doctype/activity_type/test_activity_type.py
#	erpnext/projects/doctype/dependent_task/dependent_task.json
#	erpnext/projects/doctype/project/project.json
#	erpnext/projects/doctype/project/project.py
#	erpnext/projects/doctype/project/test_project.py
#	erpnext/projects/doctype/project_template/project_template.json
#	erpnext/projects/doctype/project_template/test_project_template.py
#	erpnext/projects/doctype/project_template_task/project_template_task.json
#	erpnext/projects/doctype/project_type/project_type.json
#	erpnext/projects/doctype/project_type/test_project_type.py
#	erpnext/projects/doctype/project_update/project_update.json
#	erpnext/projects/doctype/project_update/test_project_update.py
#	erpnext/projects/doctype/project_user/project_user.json
#	erpnext/projects/doctype/projects_settings/projects_settings.json
#	erpnext/projects/doctype/projects_settings/test_projects_settings.py
#	erpnext/projects/doctype/task/task.js
#	erpnext/projects/doctype/task/task.json
#	erpnext/projects/doctype/task/task.py
#	erpnext/projects/doctype/task/test_task.py
#	erpnext/projects/doctype/task_depends_on/task_depends_on.json
#	erpnext/projects/doctype/task_type/task_type.json
#	erpnext/projects/doctype/task_type/test_task_type.py
#	erpnext/projects/doctype/timesheet/test_timesheet.py
#	erpnext/projects/doctype/timesheet/timesheet.js
#	erpnext/projects/doctype/timesheet/timesheet.json
#	erpnext/projects/doctype/timesheet/timesheet.py
#	erpnext/projects/doctype/timesheet_detail/timesheet_detail.json
#	erpnext/projects/doctype/timesheet_detail/timesheet_detail.py
#	erpnext/projects/report/delayed_tasks_summary/delayed_tasks_summary.py
#	erpnext/projects/report/delayed_tasks_summary/test_delayed_tasks_summary.py
#	erpnext/projects/workspace/projects/projects.json
#	erpnext/public/images/erpnext-logo.svg
#	erpnext/public/js/bom_configurator/bom_configurator.bundle.js
#	erpnext/public/js/bulk_transaction_processing.js
#	erpnext/public/js/controllers/accounts.js
#	erpnext/public/js/controllers/taxes_and_totals.js
#	erpnext/public/js/controllers/transaction.js
#	erpnext/public/js/financial_statements.js
#	erpnext/public/js/plant_floor_visual/visual_plant.js
#	erpnext/public/js/projects/timer.js
#	erpnext/public/js/setup_wizard.js
#	erpnext/public/js/templates/visual_plant_floor_template.html
#	erpnext/public/js/utils.js
#	erpnext/public/js/utils/dimension_tree_filter.js
#	erpnext/public/scss/erpnext.scss
#	erpnext/quality_management/doctype/non_conformance/non_conformance.json
#	erpnext/quality_management/doctype/non_conformance/test_non_conformance.py
#	erpnext/quality_management/doctype/quality_action/quality_action.json
#	erpnext/quality_management/doctype/quality_action/test_quality_action.py
#	erpnext/quality_management/doctype/quality_action_resolution/quality_action_resolution.json
#	erpnext/quality_management/doctype/quality_feedback/quality_feedback.json
#	erpnext/quality_management/doctype/quality_feedback/test_quality_feedback.py
#	erpnext/quality_management/doctype/quality_feedback_parameter/quality_feedback_parameter.json
#	erpnext/quality_management/doctype/quality_feedback_template/quality_feedback_template.json
#	erpnext/quality_management/doctype/quality_feedback_template/test_quality_feedback_template.py
#	erpnext/quality_management/doctype/quality_feedback_template_parameter/quality_feedback_template_parameter.json
#	erpnext/quality_management/doctype/quality_goal/quality_goal.json
#	erpnext/quality_management/doctype/quality_goal/test_quality_goal.py
#	erpnext/quality_management/doctype/quality_goal_objective/quality_goal_objective.json
#	erpnext/quality_management/doctype/quality_meeting/quality_meeting.json
#	erpnext/quality_management/doctype/quality_meeting/test_quality_meeting.py
#	erpnext/quality_management/doctype/quality_meeting_agenda/quality_meeting_agenda.json
#	erpnext/quality_management/doctype/quality_meeting_agenda/test_quality_meeting_agenda.py
#	erpnext/quality_management/doctype/quality_meeting_minutes/quality_meeting_minutes.json
#	erpnext/quality_management/doctype/quality_procedure/quality_procedure.json
#	erpnext/quality_management/doctype/quality_procedure/test_quality_procedure.py
#	erpnext/quality_management/doctype/quality_procedure_process/quality_procedure_process.json
#	erpnext/quality_management/doctype/quality_review/quality_review.json
#	erpnext/quality_management/doctype/quality_review/test_quality_review.py
#	erpnext/quality_management/doctype/quality_review_objective/quality_review_objective.json
#	erpnext/regional/doctype/import_supplier_invoice/import_supplier_invoice.json
#	erpnext/regional/doctype/import_supplier_invoice/import_supplier_invoice.py
#	erpnext/regional/doctype/import_supplier_invoice/test_import_supplier_invoice.py
#	erpnext/regional/doctype/lower_deduction_certificate/lower_deduction_certificate.json
#	erpnext/regional/doctype/lower_deduction_certificate/lower_deduction_certificate.py
#	erpnext/regional/doctype/lower_deduction_certificate/test_lower_deduction_certificate.py
#	erpnext/regional/doctype/south_africa_vat_settings/south_africa_vat_settings.json
#	erpnext/regional/doctype/south_africa_vat_settings/test_south_africa_vat_settings.py
#	erpnext/regional/doctype/uae_vat_account/uae_vat_account.json
#	erpnext/regional/doctype/uae_vat_settings/test_uae_vat_settings.py
#	erpnext/regional/doctype/uae_vat_settings/uae_vat_settings.json
#	erpnext/regional/italy/utils.py
#	erpnext/regional/print_format/detailed_tax_invoice/detailed_tax_invoice.json
#	erpnext/regional/print_format/tax_invoice/tax_invoice.json
#	erpnext/regional/report/uae_vat_201/test_uae_vat_201.py
#	erpnext/regional/report/vat_audit_report/vat_audit_report.py
#	erpnext/regional/united_states/test_united_states.py
#	erpnext/selling/doctype/customer/customer.js
#	erpnext/selling/doctype/customer/customer.json
#	erpnext/selling/doctype/customer/customer.py
#	erpnext/selling/doctype/customer/customer_dashboard.py
#	erpnext/selling/doctype/customer/test_customer.py
#	erpnext/selling/doctype/customer_credit_limit/customer_credit_limit.json
#	erpnext/selling/doctype/industry_type/industry_type.json
#	erpnext/selling/doctype/industry_type/test_industry_type.py
#	erpnext/selling/doctype/installation_note/installation_note.json
#	erpnext/selling/doctype/installation_note/installation_note.py
#	erpnext/selling/doctype/installation_note/test_installation_note.py
#	erpnext/selling/doctype/installation_note_item/installation_note_item.json
#	erpnext/selling/doctype/party_specific_item/party_specific_item.json
#	erpnext/selling/doctype/party_specific_item/test_party_specific_item.py
#	erpnext/selling/doctype/product_bundle/product_bundle.js
#	erpnext/selling/doctype/product_bundle/product_bundle.json
#	erpnext/selling/doctype/product_bundle/test_product_bundle.py
#	erpnext/selling/doctype/product_bundle_item/product_bundle_item.json
#	erpnext/selling/doctype/quotation/quotation.json
#	erpnext/selling/doctype/quotation/quotation.py
#	erpnext/selling/doctype/quotation/test_quotation.py
#	erpnext/selling/doctype/quotation_item/quotation_item.json
#	erpnext/selling/doctype/quotation_item/quotation_item.py
#	erpnext/selling/doctype/sales_order/sales_order.js
#	erpnext/selling/doctype/sales_order/sales_order.json
#	erpnext/selling/doctype/sales_order/sales_order.py
#	erpnext/selling/doctype/sales_order/sales_order_list.js
#	erpnext/selling/doctype/sales_order/test_sales_order.py
#	erpnext/selling/doctype/sales_order_item/sales_order_item.json
#	erpnext/selling/doctype/sales_order_item/sales_order_item.py
#	erpnext/selling/doctype/sales_partner_type/sales_partner_type.json
#	erpnext/selling/doctype/sales_partner_type/test_sales_partner_type.py
#	erpnext/selling/doctype/sales_team/sales_team.json
#	erpnext/selling/doctype/selling_settings/selling_settings.json
#	erpnext/selling/doctype/selling_settings/selling_settings.py
#	erpnext/selling/doctype/selling_settings/test_selling_settings.py
#	erpnext/selling/doctype/sms_center/sms_center.json
#	erpnext/selling/page/point_of_sale/pos_controller.js
#	erpnext/selling/page/point_of_sale/pos_item_cart.js
#	erpnext/selling/page/point_of_sale/pos_past_order_summary.js
#	erpnext/selling/page/point_of_sale/pos_payment.js
#	erpnext/selling/page/sales_funnel/sales_funnel.js
#	erpnext/selling/page/sales_funnel/sales_funnel.py
#	erpnext/selling/report/address_and_contacts/address_and_contacts.py
#	erpnext/selling/report/customer_credit_balance/customer_credit_balance.py
#	erpnext/selling/report/payment_terms_status_for_sales_order/payment_terms_status_for_sales_order.py
#	erpnext/selling/report/payment_terms_status_for_sales_order/test_payment_terms_status_for_sales_order.py
#	erpnext/selling/report/pending_so_items_for_purchase_request/test_pending_so_items_for_purchase_request.py
#	erpnext/selling/report/sales_analytics/sales_analytics.js
#	erpnext/selling/report/sales_analytics/sales_analytics.py
#	erpnext/selling/report/sales_analytics/test_analytics.py
#	erpnext/selling/report/sales_order_analysis/sales_order_analysis.js
#	erpnext/selling/report/sales_order_analysis/sales_order_analysis.py
#	erpnext/selling/report/sales_order_analysis/test_sales_order_analysis.py
#	erpnext/selling/report/sales_partner_target_variance_based_on_item_group/test_sales_partner_target_variance_based_on_item_group.py
#	erpnext/selling/report/sales_person_target_variance_based_on_item_group/test_sales_person_target_variance_based_on_item_group.py
#	erpnext/selling/workspace/selling/selling.json
#	erpnext/setup/doctype/authorization_control/authorization_control.json
#	erpnext/setup/doctype/authorization_control/authorization_control.py
#	erpnext/setup/doctype/authorization_rule/authorization_rule.json
#	erpnext/setup/doctype/authorization_rule/test_authorization_rule.py
#	erpnext/setup/doctype/branch/branch.json
#	erpnext/setup/doctype/branch/test_branch.py
#	erpnext/setup/doctype/brand/brand.json
#	erpnext/setup/doctype/brand/test_brand.py
#	erpnext/setup/doctype/company/company.js
#	erpnext/setup/doctype/company/company.json
#	erpnext/setup/doctype/company/company.py
#	erpnext/setup/doctype/company/test_company.py
#	erpnext/setup/doctype/currency_exchange/test_currency_exchange.py
#	erpnext/setup/doctype/customer_group/customer_group.json
#	erpnext/setup/doctype/customer_group/customer_group.py
#	erpnext/setup/doctype/customer_group/test_customer_group.py
#	erpnext/setup/doctype/department/department.json
#	erpnext/setup/doctype/department/department.py
#	erpnext/setup/doctype/department/test_department.py
#	erpnext/setup/doctype/designation/designation.json
#	erpnext/setup/doctype/designation/test_designation.py
#	erpnext/setup/doctype/driver/driver.json
#	erpnext/setup/doctype/driver/driver.py
#	erpnext/setup/doctype/driver/test_driver.py
#	erpnext/setup/doctype/driving_license_category/driving_license_category.json
#	erpnext/setup/doctype/email_digest/email_digest.json
#	erpnext/setup/doctype/email_digest/email_digest.py
#	erpnext/setup/doctype/email_digest/test_email_digest.py
#	erpnext/setup/doctype/email_digest_recipient/email_digest_recipient.json
#	erpnext/setup/doctype/employee/employee.json
#	erpnext/setup/doctype/employee/employee.py
#	erpnext/setup/doctype/employee/test_employee.py
#	erpnext/setup/doctype/employee_education/employee_education.json
#	erpnext/setup/doctype/employee_external_work_history/employee_external_work_history.json
#	erpnext/setup/doctype/employee_group/employee_group.json
#	erpnext/setup/doctype/employee_group/test_employee_group.py
#	erpnext/setup/doctype/employee_group_table/employee_group_table.json
#	erpnext/setup/doctype/employee_internal_work_history/employee_internal_work_history.json
#	erpnext/setup/doctype/global_defaults/global_defaults.json
#	erpnext/setup/doctype/global_defaults/test_global_defaults.py
#	erpnext/setup/doctype/holiday/holiday.json
#	erpnext/setup/doctype/holiday_list/holiday_list.json
#	erpnext/setup/doctype/holiday_list/test_holiday_list.py
#	erpnext/setup/doctype/incoterm/test_incoterm.py
#	erpnext/setup/doctype/item_group/item_group.json
#	erpnext/setup/doctype/item_group/test_item_group.py
#	erpnext/setup/doctype/party_type/party_type.json
#	erpnext/setup/doctype/party_type/test_party_type.py
#	erpnext/setup/doctype/print_heading/print_heading.json
#	erpnext/setup/doctype/print_heading/test_print_heading.py
#	erpnext/setup/doctype/quotation_lost_reason/quotation_lost_reason.json
#	erpnext/setup/doctype/quotation_lost_reason/test_quotation_lost_reason.py
#	erpnext/setup/doctype/quotation_lost_reason_detail/quotation_lost_reason_detail.json
#	erpnext/setup/doctype/sales_partner/sales_partner.json
#	erpnext/setup/doctype/sales_partner/sales_partner.py
#	erpnext/setup/doctype/sales_partner/test_sales_partner.py
#	erpnext/setup/doctype/sales_person/sales_person.json
#	erpnext/setup/doctype/sales_person/test_sales_person.py
#	erpnext/setup/doctype/supplier_group/supplier_group.js
#	erpnext/setup/doctype/supplier_group/supplier_group.json
#	erpnext/setup/doctype/supplier_group/test_supplier_group.py
#	erpnext/setup/doctype/target_detail/target_detail.json
#	erpnext/setup/doctype/terms_and_conditions/terms_and_conditions.json
#	erpnext/setup/doctype/terms_and_conditions/test_terms_and_conditions.py
#	erpnext/setup/doctype/territory/territory.json
#	erpnext/setup/doctype/territory/test_territory.py
#	erpnext/setup/doctype/transaction_deletion_record/test_transaction_deletion_record.py
#	erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.json
#	erpnext/setup/doctype/transaction_deletion_record_item/transaction_deletion_record_item.json
#	erpnext/setup/doctype/uom/test_uom.py
#	erpnext/setup/doctype/uom/uom.json
#	erpnext/setup/doctype/uom/uom.py
#	erpnext/setup/doctype/uom_conversion_factor/test_uom_conversion_factor.py
#	erpnext/setup/doctype/uom_conversion_factor/uom_conversion_factor.json
#	erpnext/setup/doctype/vehicle/test_vehicle.py
#	erpnext/setup/doctype/vehicle/vehicle.json
#	erpnext/setup/doctype/website_item_group/website_item_group.json
#	erpnext/setup/install.py
#	erpnext/setup/setup_wizard/data/country_wise_tax.json
#	erpnext/setup/setup_wizard/data/uom_data.json
#	erpnext/setup/setup_wizard/operations/defaults_setup.py
#	erpnext/setup/setup_wizard/operations/install_fixtures.py
#	erpnext/setup/utils.py
#	erpnext/startup/boot.py
#	erpnext/startup/leaderboard.py
#	erpnext/stock/__init__.py
#	erpnext/stock/deprecated_serial_batch.py
#	erpnext/stock/doctype/batch/batch.json
#	erpnext/stock/doctype/batch/test_batch.py
#	erpnext/stock/doctype/bin/bin.json
#	erpnext/stock/doctype/bin/test_bin.py
#	erpnext/stock/doctype/closing_stock_balance/closing_stock_balance.json
#	erpnext/stock/doctype/closing_stock_balance/test_closing_stock_balance.py
#	erpnext/stock/doctype/customs_tariff_number/customs_tariff_number.json
#	erpnext/stock/doctype/customs_tariff_number/test_customs_tariff_number.py
#	erpnext/stock/doctype/delivery_note/delivery_note.json
#	erpnext/stock/doctype/delivery_note/delivery_note.py
#	erpnext/stock/doctype/delivery_note/delivery_note_list.js
#	erpnext/stock/doctype/delivery_note/test_delivery_note.py
#	erpnext/stock/doctype/delivery_note_item/delivery_note_item.json
#	erpnext/stock/doctype/delivery_note_item/delivery_note_item.py
#	erpnext/stock/doctype/delivery_settings/delivery_settings.json
#	erpnext/stock/doctype/delivery_settings/test_delivery_settings.py
#	erpnext/stock/doctype/delivery_stop/delivery_stop.json
#	erpnext/stock/doctype/delivery_trip/delivery_trip.js
#	erpnext/stock/doctype/delivery_trip/delivery_trip.json
#	erpnext/stock/doctype/delivery_trip/delivery_trip.py
#	erpnext/stock/doctype/delivery_trip/test_delivery_trip.py
#	erpnext/stock/doctype/inventory_dimension/inventory_dimension.json
#	erpnext/stock/doctype/inventory_dimension/inventory_dimension.py
#	erpnext/stock/doctype/inventory_dimension/test_inventory_dimension.py
#	erpnext/stock/doctype/item/item.js
#	erpnext/stock/doctype/item/item.json
#	erpnext/stock/doctype/item/item.py
#	erpnext/stock/doctype/item/item_list.js
#	erpnext/stock/doctype/item/test_item.py
#	erpnext/stock/doctype/item_alternative/item_alternative.json
#	erpnext/stock/doctype/item_alternative/test_item_alternative.py
#	erpnext/stock/doctype/item_attribute/item_attribute.json
#	erpnext/stock/doctype/item_attribute/item_attribute.py
#	erpnext/stock/doctype/item_attribute/test_item_attribute.py
#	erpnext/stock/doctype/item_attribute_value/item_attribute_value.json
#	erpnext/stock/doctype/item_barcode/item_barcode.json
#	erpnext/stock/doctype/item_customer_detail/item_customer_detail.json
#	erpnext/stock/doctype/item_default/item_default.json
#	erpnext/stock/doctype/item_manufacturer/item_manufacturer.json
#	erpnext/stock/doctype/item_manufacturer/test_item_manufacturer.py
#	erpnext/stock/doctype/item_price/item_price.json
#	erpnext/stock/doctype/item_price/item_price.py
#	erpnext/stock/doctype/item_price/test_item_price.py
#	erpnext/stock/doctype/item_quality_inspection_parameter/item_quality_inspection_parameter.json
#	erpnext/stock/doctype/item_reorder/item_reorder.json
#	erpnext/stock/doctype/item_supplier/item_supplier.json
#	erpnext/stock/doctype/item_tax/item_tax.json
#	erpnext/stock/doctype/item_variant/item_variant.json
#	erpnext/stock/doctype/item_variant_attribute/item_variant_attribute.json
#	erpnext/stock/doctype/item_variant_settings/item_variant_settings.js
#	erpnext/stock/doctype/item_variant_settings/item_variant_settings.json
#	erpnext/stock/doctype/item_variant_settings/test_item_variant_settings.py
#	erpnext/stock/doctype/item_website_specification/item_website_specification.json
#	erpnext/stock/doctype/landed_cost_item/landed_cost_item.json
#	erpnext/stock/doctype/landed_cost_purchase_receipt/landed_cost_purchase_receipt.json
#	erpnext/stock/doctype/landed_cost_taxes_and_charges/landed_cost_taxes_and_charges.json
#	erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.json
#	erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py
#	erpnext/stock/doctype/landed_cost_voucher/test_landed_cost_voucher.py
#	erpnext/stock/doctype/manufacturer/manufacturer.json
#	erpnext/stock/doctype/manufacturer/test_manufacturer.py
#	erpnext/stock/doctype/material_request/material_request.js
#	erpnext/stock/doctype/material_request/material_request.json
#	erpnext/stock/doctype/material_request/material_request.py
#	erpnext/stock/doctype/material_request/material_request_list.js
#	erpnext/stock/doctype/material_request/test_material_request.py
#	erpnext/stock/doctype/material_request_item/material_request_item.json
#	erpnext/stock/doctype/packed_item/packed_item.json
#	erpnext/stock/doctype/packed_item/packed_item.py
#	erpnext/stock/doctype/packed_item/test_packed_item.py
#	erpnext/stock/doctype/packing_slip/packing_slip.json
#	erpnext/stock/doctype/packing_slip/test_packing_slip.py
#	erpnext/stock/doctype/packing_slip_item/packing_slip_item.json
#	erpnext/stock/doctype/pick_list/pick_list.json
#	erpnext/stock/doctype/pick_list/pick_list_list.js
#	erpnext/stock/doctype/pick_list/test_pick_list.py
#	erpnext/stock/doctype/pick_list_item/pick_list_item.json
#	erpnext/stock/doctype/price_list/price_list.json
#	erpnext/stock/doctype/price_list/price_list.py
#	erpnext/stock/doctype/price_list/test_price_list.py
#	erpnext/stock/doctype/price_list_country/price_list_country.json
#	erpnext/stock/doctype/purchase_receipt/purchase_receipt.json
#	erpnext/stock/doctype/purchase_receipt/purchase_receipt.py
#	erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py
#	erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json
#	erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.py
#	erpnext/stock/doctype/putaway_rule/putaway_rule.json
#	erpnext/stock/doctype/putaway_rule/putaway_rule.py
#	erpnext/stock/doctype/putaway_rule/test_putaway_rule.py
#	erpnext/stock/doctype/quality_inspection/quality_inspection.json
#	erpnext/stock/doctype/quality_inspection/test_quality_inspection.py
#	erpnext/stock/doctype/quality_inspection_parameter/quality_inspection_parameter.json
#	erpnext/stock/doctype/quality_inspection_parameter/test_quality_inspection_parameter.py
#	erpnext/stock/doctype/quality_inspection_parameter_group/quality_inspection_parameter_group.json
#	erpnext/stock/doctype/quality_inspection_parameter_group/test_quality_inspection_parameter_group.py
#	erpnext/stock/doctype/quality_inspection_reading/quality_inspection_reading.json
#	erpnext/stock/doctype/quality_inspection_template/quality_inspection_template.json
#	erpnext/stock/doctype/quality_inspection_template/test_quality_inspection_template.py
#	erpnext/stock/doctype/quick_stock_balance/quick_stock_balance.json
#	erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.json
#	erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py
#	erpnext/stock/doctype/repost_item_valuation/test_repost_item_valuation.py
#	erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.json
#	erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py
#	erpnext/stock/doctype/serial_and_batch_bundle/test_serial_and_batch_bundle.py
#	erpnext/stock/doctype/serial_and_batch_entry/serial_and_batch_entry.json
#	erpnext/stock/doctype/serial_no/serial_no.json
#	erpnext/stock/doctype/serial_no/test_serial_no.py
#	erpnext/stock/doctype/shipment/shipment.json
#	erpnext/stock/doctype/shipment/test_shipment.py
#	erpnext/stock/doctype/shipment_delivery_note/shipment_delivery_note.json
#	erpnext/stock/doctype/shipment_parcel/shipment_parcel.json
#	erpnext/stock/doctype/shipment_parcel_template/shipment_parcel_template.json
#	erpnext/stock/doctype/shipment_parcel_template/test_shipment_parcel_template.py
#	erpnext/stock/doctype/stock_entry/stock_entry.json
#	erpnext/stock/doctype/stock_entry/stock_entry.py
#	erpnext/stock/doctype/stock_entry/test_stock_entry.py
#	erpnext/stock/doctype/stock_entry_detail/stock_entry_detail.json
#	erpnext/stock/doctype/stock_entry_type/stock_entry_type.json
#	erpnext/stock/doctype/stock_entry_type/stock_entry_type.py
#	erpnext/stock/doctype/stock_entry_type/test_stock_entry_type.py
#	erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.json
#	erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.py
#	erpnext/stock/doctype/stock_ledger_entry/test_stock_ledger_entry.py
#	erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.json
#	erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py
#	erpnext/stock/doctype/stock_reconciliation/test_stock_reconciliation.py
#	erpnext/stock/doctype/stock_reconciliation_item/stock_reconciliation_item.json
#	erpnext/stock/doctype/stock_reposting_settings/stock_reposting_settings.json
#	erpnext/stock/doctype/stock_reposting_settings/test_stock_reposting_settings.py
#	erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.json
#	erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py
#	erpnext/stock/doctype/stock_reservation_entry/test_stock_reservation_entry.py
#	erpnext/stock/doctype/stock_settings/stock_settings.json
#	erpnext/stock/doctype/stock_settings/stock_settings.py
#	erpnext/stock/doctype/stock_settings/test_stock_settings.py
#	erpnext/stock/doctype/uom_category/test_uom_category.py
#	erpnext/stock/doctype/uom_category/uom_category.json
#	erpnext/stock/doctype/uom_conversion_detail/uom_conversion_detail.json
#	erpnext/stock/doctype/variant_field/test_variant_field.py
#	erpnext/stock/doctype/variant_field/variant_field.json
#	erpnext/stock/doctype/warehouse/test_warehouse.py
#	erpnext/stock/doctype/warehouse/warehouse.json
#	erpnext/stock/doctype/warehouse/warehouse.py
#	erpnext/stock/doctype/warehouse_type/test_warehouse_type.py
#	erpnext/stock/doctype/warehouse_type/warehouse_type.json
#	erpnext/stock/get_item_details.py
#	erpnext/stock/page/warehouse_capacity_summary/warehouse_capacity_summary.js
#	erpnext/stock/page/warehouse_capacity_summary/warehouse_capacity_summary_header.html
#	erpnext/stock/print_format/purchase_receipt_serial_and_batch_bundle_print/purchase_receipt_serial_and_batch_bundle_print.json
#	erpnext/stock/reorder_item.py
#	erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py
#	erpnext/stock/report/item_shortage_report/test_item_shortage_report.py
#	erpnext/stock/report/reserved_stock/test_reserved_stock.py
#	erpnext/stock/report/stock_ageing/test_stock_ageing.py
#	erpnext/stock/report/stock_analytics/test_stock_analytics.py
#	erpnext/stock/report/stock_balance/test_stock_balance.py
#	erpnext/stock/report/stock_ledger/test_stock_ledger_report.py
#	erpnext/stock/report/test_reports.py
#	erpnext/stock/serial_batch_bundle.py
#	erpnext/stock/stock_balance.py
#	erpnext/stock/stock_ledger.py
#	erpnext/stock/tests/test_get_item_details.py
#	erpnext/stock/tests/test_utils.py
#	erpnext/stock/tests/test_valuation.py
#	erpnext/stock/utils.py
#	erpnext/subcontracting/doctype/subcontracting_bom/subcontracting_bom.json
#	erpnext/subcontracting/doctype/subcontracting_bom/subcontracting_bom.py
#	erpnext/subcontracting/doctype/subcontracting_bom/test_subcontracting_bom.py
#	erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.json
#	erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.py
#	erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order_list.js
#	erpnext/subcontracting/doctype/subcontracting_order/test_subcontracting_order.py
#	erpnext/subcontracting/doctype/subcontracting_order_item/subcontracting_order_item.json
#	erpnext/subcontracting/doctype/subcontracting_order_item/subcontracting_order_item.py
#	erpnext/subcontracting/doctype/subcontracting_order_service_item/subcontracting_order_service_item.json
#	erpnext/subcontracting/doctype/subcontracting_order_supplied_item/subcontracting_order_supplied_item.json
#	erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.json
#	erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.py
#	erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt_list.js
#	erpnext/subcontracting/doctype/subcontracting_receipt/test_subcontracting_receipt.py
#	erpnext/subcontracting/doctype/subcontracting_receipt_item/subcontracting_receipt_item.json
#	erpnext/subcontracting/doctype/subcontracting_receipt_item/subcontracting_receipt_item.py
#	erpnext/subcontracting/doctype/subcontracting_receipt_supplied_item/subcontracting_receipt_supplied_item.json
#	erpnext/support/doctype/issue/issue.json
#	erpnext/support/doctype/issue/issue.py
#	erpnext/support/doctype/issue/test_issue.py
#	erpnext/support/doctype/issue_priority/issue_priority.json
#	erpnext/support/doctype/issue_priority/test_issue_priority.py
#	erpnext/support/doctype/issue_type/issue_type.json
#	erpnext/support/doctype/issue_type/test_issue_type.py
#	erpnext/support/doctype/pause_sla_on_status/pause_sla_on_status.json
#	erpnext/support/doctype/service_day/service_day.json
#	erpnext/support/doctype/service_level_agreement/service_level_agreement.json
#	erpnext/support/doctype/service_level_agreement/service_level_agreement.py
#	erpnext/support/doctype/service_level_agreement/test_service_level_agreement.py
#	erpnext/support/doctype/service_level_priority/service_level_priority.json
#	erpnext/support/doctype/sla_fulfilled_on_status/sla_fulfilled_on_status.json
#	erpnext/support/doctype/support_search_source/support_search_source.json
#	erpnext/support/doctype/support_settings/support_settings.json
#	erpnext/support/doctype/support_settings/test_support_settings.py
#	erpnext/support/doctype/warranty_claim/test_warranty_claim.py
#	erpnext/support/doctype/warranty_claim/warranty_claim.json
#	erpnext/support/doctype/warranty_claim/warranty_claim.py
#	erpnext/support/report/issue_analytics/test_issue_analytics.py
#	erpnext/telephony/doctype/call_log/test_call_log.py
#	erpnext/telephony/doctype/incoming_call_handling_schedule/incoming_call_handling_schedule.json
#	erpnext/telephony/doctype/incoming_call_settings/incoming_call_settings.json
#	erpnext/telephony/doctype/incoming_call_settings/test_incoming_call_settings.py
#	erpnext/telephony/doctype/telephony_call_type/telephony_call_type.json
#	erpnext/telephony/doctype/telephony_call_type/test_telephony_call_type.py
#	erpnext/telephony/doctype/voice_call_settings/test_voice_call_settings.py
#	erpnext/telephony/doctype/voice_call_settings/voice_call_settings.json
#	erpnext/templates/form_grid/includes/visible_cols.html
#	erpnext/templates/generators/sales_partner.html
#	erpnext/templates/includes/issue_row.html
#	erpnext/templates/includes/macros.html
#	erpnext/templates/includes/projects/project_row.html
#	erpnext/templates/includes/transaction_row.html
#	erpnext/templates/pages/order.html
#	erpnext/templates/pages/order.py
#	erpnext/templates/pages/timelog_info.html
#	erpnext/templates/print_formats/includes/total.html
#	erpnext/tests/test_activation.py
#	erpnext/tests/test_init.py
#	erpnext/tests/test_notifications.py
#	erpnext/tests/test_perf.py
#	erpnext/tests/test_point_of_sale.py
#	erpnext/tests/test_regional.py
#	erpnext/tests/test_webform.py
#	erpnext/tests/test_zform_loads.py
#	erpnext/utilities/activation.py
#	erpnext/utilities/bulk_transaction.py
#	erpnext/utilities/doctype/portal_user/portal_user.json
#	erpnext/utilities/doctype/rename_tool/rename_tool.json
#	erpnext/utilities/doctype/video/test_video.py
#	erpnext/utilities/doctype/video/video.json
#	erpnext/utilities/doctype/video/video.py
#	erpnext/utilities/doctype/video_settings/test_video_settings.py
#	erpnext/utilities/doctype/video_settings/video_settings.json
#	erpnext/www/support/index.py
#	pyproject.toml
This commit is contained in:
venkat102
2024-12-04 01:08:54 +05:30
committed by Mergify
parent ad3094fd11
commit f94dffe568
1278 changed files with 1620135 additions and 15 deletions

View File

@@ -18,4 +18,8 @@ max_line_length = 110
[{*.json}] [{*.json}]
insert_final_newline = false insert_final_newline = false
indent_style = space indent_style = space
<<<<<<< HEAD
indent_size = 2 indent_size = 2
=======
indent_size = 1
>>>>>>> 329d14957b (fix: validate negative qty)

View File

@@ -30,5 +30,20 @@ b147b85e6ac19a9220cd1e2958a6ebd99373283a
# bulk format python code with black # bulk format python code with black
baec607ff5905b1c67531096a9cf50ec7ff00a5d baec607ff5905b1c67531096a9cf50ec7ff00a5d
<<<<<<< HEAD
# ruff # ruff
960ef14b7a68cfec9e309ec12845f521cb6a721c 960ef14b7a68cfec9e309ec12845f521cb6a721c
=======
# bulk refactor with sourcery
eb9ee3f79b94e594fc6dfa4f6514580e125eee8c
# js formatting
ec74a5e56617bbd76ac402451468fd4668af543d
# ruff formatting
a308792ee7fda18a681e9181f4fd00b36385bc23
# noisy typing refactoring of get_item_details
7b7211ac79c248a79ba8a999ff34e734d874c0ae
d827ed21adc7b36047e247cbb0dc6388d048a7f9
>>>>>>> 329d14957b (fix: validate negative qty)

View File

@@ -1,7 +1,13 @@
import sys import sys
<<<<<<< HEAD
import requests import requests
from urllib.parse import urlparse from urllib.parse import urlparse
=======
from urllib.parse import urlparse
import requests
>>>>>>> 329d14957b (fix: validate negative qty)
WEBSITE_REPOS = [ WEBSITE_REPOS = [
"erpnext_com", "erpnext_com",
@@ -36,11 +42,15 @@ def is_documentation_link(word: str) -> bool:
def contains_documentation_link(body: str) -> bool: def contains_documentation_link(body: str) -> bool:
<<<<<<< HEAD
return any( return any(
is_documentation_link(word) is_documentation_link(word)
for line in body.splitlines() for line in body.splitlines()
for word in line.split() for word in line.split()
) )
=======
return any(is_documentation_link(word) for line in body.splitlines() for word in line.split())
>>>>>>> 329d14957b (fix: validate negative qty)
def check_pull_request(number: str) -> "tuple[int, str]": def check_pull_request(number: str) -> "tuple[int, str]":
@@ -53,12 +63,16 @@ def check_pull_request(number: str) -> "tuple[int, str]":
head_sha = (payload.get("head") or {}).get("sha") head_sha = (payload.get("head") or {}).get("sha")
body = (payload.get("body") or "").lower() body = (payload.get("body") or "").lower()
<<<<<<< HEAD
if ( if (
not title.startswith("feat") not title.startswith("feat")
or not head_sha or not head_sha
or "no-docs" in body or "no-docs" in body
or "backport" in body or "backport" in body
): ):
=======
if not title.startswith("feat") or not head_sha or "no-docs" in body or "backport" in body:
>>>>>>> 329d14957b (fix: validate negative qty)
return 0, "Skipping documentation checks... 🏃" return 0, "Skipping documentation checks... 🏃"
if contains_documentation_link(body): if contains_documentation_link(body):

View File

@@ -12,9 +12,22 @@ pip install frappe-bench
githubbranch=${GITHUB_BASE_REF:-${GITHUB_REF##*/}} githubbranch=${GITHUB_BASE_REF:-${GITHUB_REF##*/}}
frappeuser=${FRAPPE_USER:-"frappe"} frappeuser=${FRAPPE_USER:-"frappe"}
<<<<<<< HEAD
frappebranch=${FRAPPE_BRANCH:-$githubbranch} frappebranch=${FRAPPE_BRANCH:-$githubbranch}
git clone "https://github.com/${frappeuser}/frappe" --branch "${frappebranch}" --depth 1 git clone "https://github.com/${frappeuser}/frappe" --branch "${frappebranch}" --depth 1
=======
frappecommitish=${FRAPPE_BRANCH:-$githubbranch}
mkdir frappe
pushd frappe
git init
git remote add origin "https://github.com/${frappeuser}/frappe"
git fetch origin "${frappecommitish}" --depth 1
git checkout FETCH_HEAD
popd
>>>>>>> 329d14957b (fix: validate negative qty)
bench init --skip-assets --frappe-path ~/frappe --python "$(which python)" frappe-bench bench init --skip-assets --frappe-path ~/frappe --python "$(which python)" frappe-bench
mkdir ~/frappe-bench/sites/test_site mkdir ~/frappe-bench/sites/test_site

68
.github/helper/translation.py vendored Normal file
View File

@@ -0,0 +1,68 @@
import re
import sys
errors_encounter = 0
pattern = re.compile(
r"_\(([\"']{,3})(?P<message>((?!\1).)*)\1(\s*,\s*context\s*=\s*([\"'])(?P<py_context>((?!\5).)*)\5)*(\s*,(\s*?.*?\n*?)*(,\s*([\"'])(?P<js_context>((?!\11).)*)\11)*)*\)"
)
words_pattern = re.compile(r"_{1,2}\([\"'`]{1,3}.*?[a-zA-Z]")
start_pattern = re.compile(r"_{1,2}\([f\"'`]{1,3}")
f_string_pattern = re.compile(r"_\(f[\"']")
starts_with_f_pattern = re.compile(r"_\(f")
# skip first argument
files = sys.argv[1:]
files_to_scan = [_file for _file in files if _file.endswith((".py", ".js"))]
for _file in files_to_scan:
with open(_file) as f:
print(f"Checking: {_file}")
file_lines = f.readlines()
for line_number, line in enumerate(file_lines, 1):
if "frappe-lint: disable-translate" in line:
continue
start_matches = start_pattern.search(line)
if start_matches:
starts_with_f = starts_with_f_pattern.search(line)
if starts_with_f:
has_f_string = f_string_pattern.search(line)
if has_f_string:
errors_encounter += 1
print(
f"\nF-strings are not supported for translations at line number {line_number}\n{line.strip()[:100]}"
)
continue
else:
continue
match = pattern.search(line)
error_found = False
if not match and line.endswith((",\n", "[\n")):
# concat remaining text to validate multiline pattern
line = "".join(file_lines[line_number - 1 :])
line = line[start_matches.start() + 1 :]
match = pattern.match(line)
if not match:
error_found = True
print(f"\nTranslation syntax error at line number {line_number}\n{line.strip()[:100]}")
if not error_found and not words_pattern.search(line):
error_found = True
print(
f"\nTranslation is useless because it has no words at line number {line_number}\n{line.strip()[:100]}"
)
if error_found:
errors_encounter += 1
if errors_encounter > 0:
print(
'\nVisit "https://frappeframework.com/docs/user/en/translations" to learn about valid translation strings.'
)
sys.exit(1)
else:
print("\nGood To Go!")

40
.github/helper/update_pot_file.sh vendored Normal file
View File

@@ -0,0 +1,40 @@
#!/bin/bash
set -e
cd ~ || exit
echo "Setting Up Bench..."
pip install frappe-bench
bench -v init frappe-bench --skip-assets --skip-redis-config-generation --python "$(which python)"
cd ./frappe-bench || exit
echo "Get ERPNext..."
bench get-app --skip-assets erpnext "${GITHUB_WORKSPACE}"
echo "Generating POT file..."
bench generate-pot-file --app erpnext
cd ./apps/erpnext || exit
echo "Configuring git user..."
git config user.email "developers@erpnext.com"
git config user.name "frappe-pr-bot"
echo "Setting the correct git remote..."
# Here, the git remote is a local file path by default. Let's change it to the upstream repo.
git remote set-url upstream https://github.com/frappe/erpnext.git
echo "Creating a new branch..."
isodate=$(date -u +"%Y-%m-%d")
branch_name="pot_${BASE_BRANCH}_${isodate}"
git checkout -b "${branch_name}"
echo "Commiting changes..."
git add erpnext/locale/main.pot
git commit -m "chore: update POT file"
gh auth setup-git
git push -u upstream "${branch_name}"
echo "Creating a PR..."
gh pr create --fill --base "${BASE_BRANCH}" --head "${branch_name}" --reviewer ${PR_REVIEWER} -R frappe/erpnext

11
.github/stale.yml vendored
View File

@@ -12,6 +12,17 @@ exemptProjects: true
# Set to true to ignore issues in a milestone (defaults to false) # Set to true to ignore issues in a milestone (defaults to false)
exemptMilestones: true exemptMilestones: true
<<<<<<< HEAD
=======
# Skip the stale action for draft PRs
exemptDraftPr: true
# Issues or Pull Requests with these labels will never be considered stale. Set to `[]` to disable
exemptLabels:
- hotfix
- no-stale
>>>>>>> 329d14957b (fix: validate negative qty)
pulls: pulls:
daysUntilStale: 15 daysUntilStale: 15
daysUntilClose: 3 daysUntilClose: 3

26
.github/workflows/backport.yml vendored Normal file
View File

@@ -0,0 +1,26 @@
name: Backport
on:
pull_request_target:
types:
- closed
- labeled
jobs:
main:
runs-on: ubuntu-latest
timeout-minutes: 60
steps:
- name: Checkout Actions
uses: actions/checkout@v2
with:
repository: "frappe/backport"
path: ./actions
ref: develop
- name: Install Actions
run: npm install --production --prefix ./actions
- name: Run backport
uses: ./actions/backport
with:
token: ${{secrets.RELEASE_TOKEN}}
labelsToAdd: "backport"
title: "{{originalTitle}}"

39
.github/workflows/generate-pot-file.yml vendored Normal file
View File

@@ -0,0 +1,39 @@
# This workflow is agnostic to branches. Only maintain on develop branch.
# To add/remove branches just modify the matrix.
name: Regenerate POT file (translatable strings)
on:
schedule:
# 9:30 UTC => 3 PM IST Sunday
- cron: "30 9 * * 0"
workflow_dispatch:
jobs:
regenerate-pot-file:
name: Regenerate POT file
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
branch: ["develop"]
permissions:
contents: write
steps:
- name: Checkout
uses: actions/checkout@v4
with:
ref: ${{ matrix.branch }}
- name: Setup Python
uses: actions/setup-python@v5
with:
python-version: "3.12"
- name: Run script to update POT file
run: |
bash ${GITHUB_WORKSPACE}/.github/helper/update_pot_file.sh
env:
GH_TOKEN: ${{ secrets.RELEASE_TOKEN }}
BASE_BRANCH: ${{ matrix.branch }}
PR_REVIEWER: barredterra # change to your GitHub username if you copied this file

32
.github/workflows/initiate_release.yml vendored Normal file
View File

@@ -0,0 +1,32 @@
# This workflow is agnostic to branches. Only maintain on develop branch.
# To add/remove versions just modify the matrix.
name: Create weekly release pull requests
on:
schedule:
# 9:30 UTC => 3 PM IST Tuesday
- cron: "30 9 * * 2"
workflow_dispatch:
jobs:
stable-release:
name: Release
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
version: ["14", "15"]
steps:
- uses: octokit/request-action@v2.x
with:
route: POST /repos/{owner}/{repo}/pulls
owner: frappe
repo: erpnext
title: |-
"chore: release v${{ matrix.version }}"
body: "Automated weekly release."
base: version-${{ matrix.version }}
head: version-${{ matrix.version }}-hotfix
env:
GITHUB_TOKEN: ${{ secrets.RELEASE_TOKEN }}

View File

@@ -20,6 +20,21 @@ jobs:
- name: Install and Run Pre-commit - name: Install and Run Pre-commit
uses: pre-commit/action@v3.0.0 uses: pre-commit/action@v3.0.0
<<<<<<< HEAD
=======
semgrep:
name: semgrep
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up Python 3.10
uses: actions/setup-python@v4
with:
python-version: '3.10'
cache: pip
>>>>>>> 329d14957b (fix: validate negative qty)
- name: Download Semgrep rules - name: Download Semgrep rules
run: git clone --depth 1 https://github.com/frappe/semgrep-rules.git frappe-semgrep-rules run: git clone --depth 1 https://github.com/frappe/semgrep-rules.git frappe-semgrep-rules

21
.github/workflows/lock.yml vendored Normal file
View File

@@ -0,0 +1,21 @@
name: 'Lock threads'
on:
schedule:
- cron: '0 0 * * *'
workflow_dispatch:
permissions:
issues: write
pull-requests: write
jobs:
lock:
runs-on: ubuntu-latest
steps:
- uses: dessant/lock-threads@v5
with:
github-token: ${{ github.token }}
issue-inactive-days: 14
pr-inactive-days: 14

View File

@@ -32,7 +32,11 @@ jobs:
steps: steps:
- name: Clone - name: Clone
<<<<<<< HEAD
uses: actions/checkout@v2 uses: actions/checkout@v2
=======
uses: actions/checkout@v4
>>>>>>> 329d14957b (fix: validate negative qty)
- name: Check for valid Python & Merge Conflicts - name: Check for valid Python & Merge Conflicts
run: | run: |
@@ -43,12 +47,21 @@ jobs:
fi fi
- name: Setup Python - name: Setup Python
<<<<<<< HEAD
uses: "actions/setup-python@v4" uses: "actions/setup-python@v4"
with: with:
python-version: '3.10' python-version: '3.10'
- name: Setup Node - name: Setup Node
uses: actions/setup-node@v2 uses: actions/setup-node@v2
=======
uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Setup Node
uses: actions/setup-node@v4
>>>>>>> 329d14957b (fix: validate negative qty)
with: with:
node-version: 18 node-version: 18
check-latest: true check-latest: true
@@ -57,7 +70,11 @@ jobs:
run: echo "127.0.0.1 test_site" | sudo tee -a /etc/hosts run: echo "127.0.0.1 test_site" | sudo tee -a /etc/hosts
- name: Cache pip - name: Cache pip
<<<<<<< HEAD
uses: actions/cache@v2 uses: actions/cache@v2
=======
uses: actions/cache@v4
>>>>>>> 329d14957b (fix: validate negative qty)
with: with:
path: ~/.cache/pip path: ~/.cache/pip
key: ${{ runner.os }}-pip-${{ hashFiles('**/*requirements.txt', '**/pyproject.toml') }} key: ${{ runner.os }}-pip-${{ hashFiles('**/*requirements.txt', '**/pyproject.toml') }}
@@ -66,7 +83,11 @@ jobs:
${{ runner.os }}- ${{ runner.os }}-
- name: Cache node modules - name: Cache node modules
<<<<<<< HEAD
uses: actions/cache@v2 uses: actions/cache@v2
=======
uses: actions/cache@v4
>>>>>>> 329d14957b (fix: validate negative qty)
env: env:
cache-name: cache-node-modules cache-name: cache-node-modules
with: with:
@@ -81,7 +102,11 @@ jobs:
id: yarn-cache-dir-path id: yarn-cache-dir-path
run: echo "::set-output name=dir::$(yarn cache dir)" run: echo "::set-output name=dir::$(yarn cache dir)"
<<<<<<< HEAD
- uses: actions/cache@v2 - uses: actions/cache@v2
=======
- uses: actions/cache@v4
>>>>>>> 329d14957b (fix: validate negative qty)
id: yarn-cache id: yarn-cache
with: with:
path: ${{ steps.yarn-cache-dir-path.outputs.dir }} path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
@@ -134,9 +159,17 @@ jobs:
} }
update_to_version 14 update_to_version 14
<<<<<<< HEAD
echo "Updating to latest version" echo "Updating to latest version"
git -C "apps/frappe" checkout -q -f "${GITHUB_BASE_REF:-${GITHUB_REF##*/}}" git -C "apps/frappe" checkout -q -f "${GITHUB_BASE_REF:-${GITHUB_REF##*/}}"
=======
update_to_version 15
echo "Updating to latest version"
git -C "apps/frappe" fetch --depth 1 upstream "${GITHUB_BASE_REF:-${GITHUB_REF##*/}}"
git -C "apps/frappe" checkout -q -f FETCH_HEAD
>>>>>>> 329d14957b (fix: validate negative qty)
git -C "apps/erpnext" checkout -q -f "$GITHUB_SHA" git -C "apps/erpnext" checkout -q -f "$GITHUB_SHA"
pgrep honcho | xargs kill pgrep honcho | xargs kill

22
.github/workflows/patch_faux.yml vendored Normal file
View File

@@ -0,0 +1,22 @@
# Tests are skipped for these files but github doesn't allow "passing" hence this is required.
name: Skipped Patch Test
on:
pull_request:
paths:
- "**.js"
- "**.css"
- "**.md"
- "**.html"
- "**.csv"
jobs:
test:
runs-on: ubuntu-latest
name: Patch Test
steps:
- name: Pass skipped tests unconditionally
run: "echo Skipped"

View File

@@ -2,23 +2,37 @@ name: Generate Semantic Release
on: on:
push: push:
branches: branches:
<<<<<<< HEAD
- version-15 - version-15
=======
- version-13
>>>>>>> 329d14957b (fix: validate negative qty)
jobs: jobs:
release: release:
name: Release name: Release
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Checkout Entire Repository - name: Checkout Entire Repository
<<<<<<< HEAD
uses: actions/checkout@v4 uses: actions/checkout@v4
with: with:
fetch-depth: 0 fetch-depth: 0
persist-credentials: false persist-credentials: false
=======
uses: actions/checkout@v2
with:
fetch-depth: 0
persist-credentials: false
>>>>>>> 329d14957b (fix: validate negative qty)
- name: Setup Node.js - name: Setup Node.js
uses: actions/setup-node@v2 uses: actions/setup-node@v2
with: with:
node-version: 20 node-version: 20
<<<<<<< HEAD
=======
>>>>>>> 329d14957b (fix: validate negative qty)
- name: Setup dependencies - name: Setup dependencies
run: | run: |
npm install @semantic-release/git @semantic-release/exec --no-save npm install @semantic-release/git @semantic-release/exec --no-save

View File

@@ -29,7 +29,15 @@ jobs:
steps: steps:
- name: Update notes - name: Update notes
run: | run: |
<<<<<<< HEAD
NEW_NOTES=$(gh api --method POST -H "Accept: application/vnd.github+json" /repos/frappe/erpnext/releases/generate-notes -f tag_name=$RELEASE_TAG | jq -r '.body' | sed -E '/^\* (chore|ci|test|docs|style)/d' ) NEW_NOTES=$(gh api --method POST -H "Accept: application/vnd.github+json" /repos/frappe/erpnext/releases/generate-notes -f tag_name=$RELEASE_TAG | jq -r '.body' | sed -E '/^\* (chore|ci|test|docs|style)/d' )
=======
NEW_NOTES=$(gh api --method POST -H "Accept: application/vnd.github+json" /repos/frappe/erpnext/releases/generate-notes -f tag_name=$RELEASE_TAG \
| jq -r '.body' \
| sed -E '/^\* (chore|ci|test|docs|style)/d' \
| sed -E 's/by @mergify //'
)
>>>>>>> 329d14957b (fix: validate negative qty)
RELEASE_ID=$(gh api -H "Accept: application/vnd.github+json" /repos/frappe/erpnext/releases/tags/$RELEASE_TAG | jq -r '.id') RELEASE_ID=$(gh api -H "Accept: application/vnd.github+json" /repos/frappe/erpnext/releases/tags/$RELEASE_TAG | jq -r '.id')
gh api --method PATCH -H "Accept: application/vnd.github+json" /repos/frappe/erpnext/releases/$RELEASE_ID -f body="$NEW_NOTES" gh api --method PATCH -H "Accept: application/vnd.github+json" /repos/frappe/erpnext/releases/$RELEASE_ID -f body="$NEW_NOTES"

View File

@@ -0,0 +1,130 @@
name: Individual
on:
workflow_dispatch:
concurrency:
group: server-individual-tests-develop-${{ github.event_name }}-${{ github.event.number || github.event_name == 'workflow_dispatch' && github.run_id || '' }}
cancel-in-progress: false
jobs:
discover:
runs-on: ubuntu-latest
outputs:
matrix: ${{ steps.set-matrix.outputs.matrix }}
steps:
- name: Clone
uses: actions/checkout@v4
- id: set-matrix
run: |
# Use grep and find to get the list of test files
matrix=$(find . -path '*/doctype/*/test_*.py' | xargs grep -l 'def test_' | awk '{
# Remove ./ prefix, file extension, and replace / with .
gsub(/^\.\//, "", $0)
gsub(/\.py$/, "", $0)
gsub(/\//, ".", $0)
# Add to array
tests[NR] = $0
}
END {
# Start JSON array
printf "{\n \"include\": [\n"
# Loop through array and create JSON objects
for (i=1; i<=NR; i++) {
printf " {\"test\": \"%s\"}", tests[i]
if (i < NR) printf ","
printf "\n"
}
# Close JSON array
printf " ]\n}"
}')
# Output the matrix
echo "matrix=$(echo "$matrix" | jq -c)" >> $GITHUB_OUTPUT
# For debugging (optional)
echo "Generated matrix:"
echo "$matrix"
test:
needs: discover
runs-on: ubuntu-latest
timeout-minutes: 60
env:
NODE_ENV: "production"
strategy:
fail-fast: false
matrix: ${{fromJson(needs.discover.outputs.matrix)}}
name: Test
services:
mysql:
image: mariadb:10.6
env:
MARIADB_ROOT_PASSWORD: 'root'
ports:
- 3306:3306
options: --health-cmd="mariadb-admin ping" --health-interval=5s --health-timeout=2s --health-retries=3
steps:
- name: Clone
uses: actions/checkout@v4
- name: Setup Python
uses: actions/setup-python@v5
with:
python-version: '3.12'
- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: 18
check-latest: true
- name: Add to Hosts
run: echo "127.0.0.1 test_site" | sudo tee -a /etc/hosts
- name: Cache pip
uses: actions/cache@v4
with:
path: ~/.cache/pip
key: ${{ runner.os }}-pip-${{ hashFiles('**/*requirements.txt', '**/pyproject.toml') }}
restore-keys: |
${{ runner.os }}-pip-
${{ runner.os }}-
- name: Cache node modules
uses: actions/cache@v4
env:
cache-name: cache-node-modules
with:
path: ~/.npm
key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-build-${{ env.cache-name }}-
${{ runner.os }}-build-
${{ runner.os }}-
- name: Get yarn cache directory path
id: yarn-cache-dir-path
run: echo "::set-output name=dir::$(yarn cache dir)"
- uses: actions/cache@v4
id: yarn-cache
with:
path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
restore-keys: |
${{ runner.os }}-yarn-
- name: Install
run: bash ${GITHUB_WORKSPACE}/.github/helper/install.sh
env:
DB: mariadb
TYPE: server
FRAPPE_USER: ${{ github.event.inputs.user }}
FRAPPE_BRANCH: ${{ github.event.inputs.branch }}
- name: Run Tests
run: 'cd ~/frappe-bench/ && bench --site test_site run-tests --app erpnext --module ${{ matrix.test }}'

View File

@@ -0,0 +1,24 @@
# Tests are skipped for these files but github doesn't allow "passing" hence this is required.
name: Skipped Tests
on:
pull_request:
paths:
- "**.js"
- "**.css"
- "**.md"
- "**.html"
jobs:
test:
runs-on: ubuntu-latest
strategy:
matrix:
container: [1, 2, 3, 4]
name: Python Unit Tests
steps:
- name: Pass skipped tests unconditionally
run: "echo Skipped"

View File

@@ -1,6 +1,11 @@
name: Server (Mariadb) name: Server (Mariadb)
on: on:
<<<<<<< HEAD
=======
repository_dispatch:
types: [frappe-framework-change]
>>>>>>> 329d14957b (fix: validate negative qty)
pull_request: pull_request:
paths-ignore: paths-ignore:
- '**.js' - '**.js'
@@ -31,6 +36,12 @@ jobs:
test: test:
runs-on: ubuntu-latest runs-on: ubuntu-latest
timeout-minutes: 60 timeout-minutes: 60
<<<<<<< HEAD
=======
env:
NODE_ENV: "production"
WITH_COVERAGE: ${{ github.event_name != 'pull_request' }}
>>>>>>> 329d14957b (fix: validate negative qty)
strategy: strategy:
fail-fast: false fail-fast: false
@@ -51,12 +62,21 @@ jobs:
steps: steps:
- name: Clone - name: Clone
<<<<<<< HEAD
uses: actions/checkout@v2 uses: actions/checkout@v2
- name: Setup Python - name: Setup Python
uses: actions/setup-python@v2 uses: actions/setup-python@v2
with: with:
python-version: '3.11' python-version: '3.11'
=======
uses: actions/checkout@v4
- name: Setup Python
uses: actions/setup-python@v5
with:
python-version: '3.12'
>>>>>>> 329d14957b (fix: validate negative qty)
- name: Check for valid Python & Merge Conflicts - name: Check for valid Python & Merge Conflicts
run: | run: |
@@ -67,7 +87,11 @@ jobs:
fi fi
- name: Setup Node - name: Setup Node
<<<<<<< HEAD
uses: actions/setup-node@v2 uses: actions/setup-node@v2
=======
uses: actions/setup-node@v4
>>>>>>> 329d14957b (fix: validate negative qty)
with: with:
node-version: 18 node-version: 18
check-latest: true check-latest: true
@@ -76,7 +100,11 @@ jobs:
run: echo "127.0.0.1 test_site" | sudo tee -a /etc/hosts run: echo "127.0.0.1 test_site" | sudo tee -a /etc/hosts
- name: Cache pip - name: Cache pip
<<<<<<< HEAD
uses: actions/cache@v2 uses: actions/cache@v2
=======
uses: actions/cache@v4
>>>>>>> 329d14957b (fix: validate negative qty)
with: with:
path: ~/.cache/pip path: ~/.cache/pip
key: ${{ runner.os }}-pip-${{ hashFiles('**/*requirements.txt', '**/pyproject.toml') }} key: ${{ runner.os }}-pip-${{ hashFiles('**/*requirements.txt', '**/pyproject.toml') }}
@@ -85,7 +113,11 @@ jobs:
${{ runner.os }}- ${{ runner.os }}-
- name: Cache node modules - name: Cache node modules
<<<<<<< HEAD
uses: actions/cache@v2 uses: actions/cache@v2
=======
uses: actions/cache@v4
>>>>>>> 329d14957b (fix: validate negative qty)
env: env:
cache-name: cache-node-modules cache-name: cache-node-modules
with: with:
@@ -100,7 +132,11 @@ jobs:
id: yarn-cache-dir-path id: yarn-cache-dir-path
run: echo "::set-output name=dir::$(yarn cache dir)" run: echo "::set-output name=dir::$(yarn cache dir)"
<<<<<<< HEAD
- uses: actions/cache@v2 - uses: actions/cache@v2
=======
- uses: actions/cache@v4
>>>>>>> 329d14957b (fix: validate negative qty)
id: yarn-cache id: yarn-cache
with: with:
path: ${{ steps.yarn-cache-dir-path.outputs.dir }} path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
@@ -114,6 +150,7 @@ jobs:
DB: mariadb DB: mariadb
TYPE: server TYPE: server
FRAPPE_USER: ${{ github.event.inputs.user }} FRAPPE_USER: ${{ github.event.inputs.user }}
<<<<<<< HEAD
FRAPPE_BRANCH: ${{ github.event.inputs.branch }} FRAPPE_BRANCH: ${{ github.event.inputs.branch }}
- name: Run Tests - name: Run Tests
@@ -122,7 +159,47 @@ jobs:
TYPE: server TYPE: server
CI_BUILD_ID: ${{ github.run_id }} CI_BUILD_ID: ${{ github.run_id }}
ORCHESTRATOR_URL: http://test-orchestrator.frappe.io ORCHESTRATOR_URL: http://test-orchestrator.frappe.io
=======
FRAPPE_BRANCH: ${{ github.event.client_payload.sha || github.event.inputs.branch }}
- name: Run Tests
run: 'cd ~/frappe-bench/ && bench --site test_site run-parallel-tests --app erpnext --total-builds ${{ strategy.job-total }} --build-number ${{ matrix.container }}'
env:
TYPE: server
CAPTURE_COVERAGE: ${{ github.event_name != 'pull_request' }}
>>>>>>> 329d14957b (fix: validate negative qty)
- name: Show bench output - name: Show bench output
if: ${{ always() }} if: ${{ always() }}
run: cat ~/frappe-bench/bench_start.log || true run: cat ~/frappe-bench/bench_start.log || true
<<<<<<< HEAD
=======
- name: Upload coverage data
uses: actions/upload-artifact@v3
if: github.event_name != 'pull_request'
with:
name: coverage-${{ matrix.container }}
path: /home/runner/frappe-bench/sites/coverage.xml
coverage:
name: Coverage Wrap Up
needs: test
runs-on: ubuntu-latest
if: ${{ github.event_name != 'pull_request' }}
steps:
- name: Clone
uses: actions/checkout@v4
- name: Download artifacts
uses: actions/download-artifact@v3
- name: Upload coverage data
uses: codecov/codecov-action@v4
with:
name: MariaDB
token: ${{ secrets.CODECOV_TOKEN }}
fail_ci_if_error: true
verbose: true
>>>>>>> 329d14957b (fix: validate negative qty)

View File

@@ -41,12 +41,21 @@ jobs:
steps: steps:
- name: Clone - name: Clone
<<<<<<< HEAD
uses: actions/checkout@v2 uses: actions/checkout@v2
- name: Setup Python - name: Setup Python
uses: actions/setup-python@v2 uses: actions/setup-python@v2
with: with:
python-version: '3.10' python-version: '3.10'
=======
uses: actions/checkout@v4
- name: Setup Python
uses: actions/setup-python@v5
with:
python-version: '3.12'
>>>>>>> 329d14957b (fix: validate negative qty)
- name: Check for valid Python & Merge Conflicts - name: Check for valid Python & Merge Conflicts
run: | run: |
@@ -57,7 +66,11 @@ jobs:
fi fi
- name: Setup Node - name: Setup Node
<<<<<<< HEAD
uses: actions/setup-node@v2 uses: actions/setup-node@v2
=======
uses: actions/setup-node@v4
>>>>>>> 329d14957b (fix: validate negative qty)
with: with:
node-version: 18 node-version: 18
check-latest: true check-latest: true
@@ -66,7 +79,11 @@ jobs:
run: echo "127.0.0.1 test_site" | sudo tee -a /etc/hosts run: echo "127.0.0.1 test_site" | sudo tee -a /etc/hosts
- name: Cache pip - name: Cache pip
<<<<<<< HEAD
uses: actions/cache@v2 uses: actions/cache@v2
=======
uses: actions/cache@v4
>>>>>>> 329d14957b (fix: validate negative qty)
with: with:
path: ~/.cache/pip path: ~/.cache/pip
key: ${{ runner.os }}-pip-${{ hashFiles('**/*requirements.txt', '**/pyproject.toml') }} key: ${{ runner.os }}-pip-${{ hashFiles('**/*requirements.txt', '**/pyproject.toml') }}
@@ -75,7 +92,11 @@ jobs:
${{ runner.os }}- ${{ runner.os }}-
- name: Cache node modules - name: Cache node modules
<<<<<<< HEAD
uses: actions/cache@v2 uses: actions/cache@v2
=======
uses: actions/cache@v4
>>>>>>> 329d14957b (fix: validate negative qty)
env: env:
cache-name: cache-node-modules cache-name: cache-node-modules
with: with:
@@ -90,7 +111,11 @@ jobs:
id: yarn-cache-dir-path id: yarn-cache-dir-path
run: echo "::set-output name=dir::$(yarn cache dir)" run: echo "::set-output name=dir::$(yarn cache dir)"
<<<<<<< HEAD
- uses: actions/cache@v2 - uses: actions/cache@v2
=======
- uses: actions/cache@v4
>>>>>>> 329d14957b (fix: validate negative qty)
id: yarn-cache id: yarn-cache
with: with:
path: ${{ steps.yarn-cache-dir-path.outputs.dir }} path: ${{ steps.yarn-cache-dir-path.outputs.dir }}

11
.gitignore vendored
View File

@@ -2,7 +2,10 @@
*.py~ *.py~
.DS_Store .DS_Store
conf.py conf.py
<<<<<<< HEAD
locale locale
=======
>>>>>>> 329d14957b (fix: validate negative qty)
latest_updates.json latest_updates.json
.wnf-lang-status .wnf-lang-status
*.egg-info *.egg-info
@@ -15,5 +18,13 @@ __pycache__
*~ *~
.idea/ .idea/
.vscode/ .vscode/
<<<<<<< HEAD
node_modules/ node_modules/
.backportrc.json .backportrc.json
=======
.helix/
node_modules/
.backportrc.json
# Aider AI Chat
.aider*
>>>>>>> 329d14957b (fix: validate negative qty)

View File

@@ -17,6 +17,10 @@ pull_request_rules:
- base=version-12 - base=version-12
- base=version-14 - base=version-14
- base=version-15 - base=version-15
<<<<<<< HEAD
=======
- base=version-16
>>>>>>> 329d14957b (fix: validate negative qty)
actions: actions:
close: close:
comment: comment:
@@ -24,6 +28,7 @@ pull_request_rules:
@{{author}}, thanks for the contribution, but we do not accept pull requests on a stable branch. Please raise PR on an appropriate hotfix branch. @{{author}}, thanks for the contribution, but we do not accept pull requests on a stable branch. Please raise PR on an appropriate hotfix branch.
https://github.com/frappe/erpnext/wiki/Pull-Request-Checklist#which-branch https://github.com/frappe/erpnext/wiki/Pull-Request-Checklist#which-branch
<<<<<<< HEAD
- name: Auto-close PRs on pre-release branch - name: Auto-close PRs on pre-release branch
conditions: conditions:
- base=version-13-pre-release - base=version-13-pre-release
@@ -34,6 +39,8 @@ pull_request_rules:
@{{author}}, pre-release branch is not maintained anymore. Releases are directly done by merging hotfix branch to stable branches. @{{author}}, pre-release branch is not maintained anymore. Releases are directly done by merging hotfix branch to stable branches.
=======
>>>>>>> 329d14957b (fix: validate negative qty)
- name: backport to develop - name: backport to develop
conditions: conditions:
- label="backport develop" - label="backport develop"
@@ -54,6 +61,7 @@ pull_request_rules:
assignees: assignees:
- "{{ author }}" - "{{ author }}"
<<<<<<< HEAD
- name: backport to version-14-pre-release - name: backport to version-14-pre-release
conditions: conditions:
- label="backport version-14-pre-release" - label="backport version-14-pre-release"
@@ -61,6 +69,15 @@ pull_request_rules:
backport: backport:
branches: branches:
- version-14-pre-release - version-14-pre-release
=======
- name: backport to version-15-hotfix
conditions:
- label="backport version-15-hotfix"
actions:
backport:
branches:
- version-15-hotfix
>>>>>>> 329d14957b (fix: validate negative qty)
assignees: assignees:
- "{{ author }}" - "{{ author }}"
@@ -74,6 +91,7 @@ pull_request_rules:
assignees: assignees:
- "{{ author }}" - "{{ author }}"
<<<<<<< HEAD
- name: backport to version-13-pre-release - name: backport to version-13-pre-release
conditions: conditions:
- label="backport version-13-pre-release" - label="backport version-13-pre-release"
@@ -103,6 +121,8 @@ pull_request_rules:
- version-12-pre-release - version-12-pre-release
assignees: assignees:
- "{{ author }}" - "{{ author }}"
=======
>>>>>>> 329d14957b (fix: validate negative qty)
- name: Automatic merge on CI success and review - name: Automatic merge on CI success and review
conditions: conditions:

View File

@@ -1,5 +1,9 @@
{ {
<<<<<<< HEAD
"branches": ["version-15"], "branches": ["version-15"],
=======
"branches": ["version-13"],
>>>>>>> 329d14957b (fix: validate negative qty)
"plugins": [ "plugins": [
"@semantic-release/commit-analyzer", { "@semantic-release/commit-analyzer", {
"preset": "angular", "preset": "angular",
@@ -21,4 +25,8 @@
], ],
"@semantic-release/github" "@semantic-release/github"
] ]
<<<<<<< HEAD
} }
=======
}
>>>>>>> 329d14957b (fix: validate negative qty)

View File

@@ -3,11 +3,19 @@
# These owners will be the default owners for everything in # These owners will be the default owners for everything in
# the repo. Unless a later match takes precedence, # the repo. Unless a later match takes precedence,
<<<<<<< HEAD
erpnext/accounts/ @deepeshgarg007 @ruthra-kumar erpnext/accounts/ @deepeshgarg007 @ruthra-kumar
erpnext/assets/ @khushi8112 @deepeshgarg007 erpnext/assets/ @khushi8112 @deepeshgarg007
erpnext/regional @deepeshgarg007 @ruthra-kumar erpnext/regional @deepeshgarg007 @ruthra-kumar
erpnext/selling @deepeshgarg007 @ruthra-kumar erpnext/selling @deepeshgarg007 @ruthra-kumar
erpnext/support/ @deepeshgarg007 erpnext/support/ @deepeshgarg007
=======
erpnext/accounts/ @ruthra-kumar
erpnext/assets/ @khushi8112
erpnext/regional @ruthra-kumar
erpnext/selling @ruthra-kumar
erpnext/support/ @ruthra-kumar
>>>>>>> 329d14957b (fix: validate negative qty)
pos* pos*
erpnext/buying/ @rohitwaghchaure erpnext/buying/ @rohitwaghchaure
@@ -17,8 +25,15 @@ erpnext/quality_management/ @rohitwaghchaure
erpnext/stock/ @rohitwaghchaure erpnext/stock/ @rohitwaghchaure
erpnext/subcontracting @rohitwaghchaure erpnext/subcontracting @rohitwaghchaure
<<<<<<< HEAD
erpnext/controllers/ @deepeshgarg007 @rohitwaghchaure erpnext/controllers/ @deepeshgarg007 @rohitwaghchaure
erpnext/patches/ @deepeshgarg007 erpnext/patches/ @deepeshgarg007
.github/ @deepeshgarg007 .github/ @deepeshgarg007
=======
erpnext/controllers/ @ruthra-kumar @rohitwaghchaure
erpnext/patches/ @ruthra-kumar
.github/ @ruthra-kumar
>>>>>>> 329d14957b (fix: validate negative qty)
pyproject.toml @akhilnarang pyproject.toml @akhilnarang

View File

@@ -7,8 +7,12 @@
<p>ERP made simple</p> <p>ERP made simple</p>
</p> </p>
<<<<<<< HEAD
[![CI](https://github.com/frappe/erpnext/actions/workflows/server-tests.yml/badge.svg?branch=develop)](https://github.com/frappe/erpnext/actions/workflows/server-tests.yml) [![CI](https://github.com/frappe/erpnext/actions/workflows/server-tests.yml/badge.svg?branch=develop)](https://github.com/frappe/erpnext/actions/workflows/server-tests.yml)
[![UI](https://github.com/erpnext/erpnext_ui_tests/actions/workflows/ui-tests.yml/badge.svg?branch=develop&event=schedule)](https://github.com/erpnext/erpnext_ui_tests/actions/workflows/ui-tests.yml) [![UI](https://github.com/erpnext/erpnext_ui_tests/actions/workflows/ui-tests.yml/badge.svg?branch=develop&event=schedule)](https://github.com/erpnext/erpnext_ui_tests/actions/workflows/ui-tests.yml)
=======
[![CI](https://github.com/frappe/erpnext/actions/workflows/server-tests-mariadb.yml/badge.svg?event=schedule)](https://github.com/frappe/erpnext/actions/workflows/server-tests-mariadb.yml)
>>>>>>> 329d14957b (fix: validate negative qty)
[![Open Source Helpers](https://www.codetriage.com/frappe/erpnext/badges/users.svg)](https://www.codetriage.com/frappe/erpnext) [![Open Source Helpers](https://www.codetriage.com/frappe/erpnext/badges/users.svg)](https://www.codetriage.com/frappe/erpnext)
[![codecov](https://codecov.io/gh/frappe/erpnext/branch/develop/graph/badge.svg?token=0TwvyUg3I5)](https://codecov.io/gh/frappe/erpnext) [![codecov](https://codecov.io/gh/frappe/erpnext/branch/develop/graph/badge.svg?token=0TwvyUg3I5)](https://codecov.io/gh/frappe/erpnext)
[![docker pulls](https://img.shields.io/docker/pulls/frappe/erpnext-worker.svg)](https://hub.docker.com/r/frappe/erpnext-worker) [![docker pulls](https://img.shields.io/docker/pulls/frappe/erpnext-worker.svg)](https://hub.docker.com/r/frappe/erpnext-worker)
@@ -73,8 +77,11 @@ New passwords will be created for the ERPNext "Administrator" user, the MariaDB
1. [Issue Guidelines](https://github.com/frappe/erpnext/wiki/Issue-Guidelines) 1. [Issue Guidelines](https://github.com/frappe/erpnext/wiki/Issue-Guidelines)
1. [Report Security Vulnerabilities](https://erpnext.com/security) 1. [Report Security Vulnerabilities](https://erpnext.com/security)
1. [Pull Request Requirements](https://github.com/frappe/erpnext/wiki/Contribution-Guidelines) 1. [Pull Request Requirements](https://github.com/frappe/erpnext/wiki/Contribution-Guidelines)
<<<<<<< HEAD
1. [Translations](https://translate.erpnext.com) 1. [Translations](https://translate.erpnext.com)
=======
>>>>>>> 329d14957b (fix: validate negative qty)
## License ## License

3
babel_extractors.csv Normal file
View File

@@ -0,0 +1,3 @@
**/setup/setup_wizard/data/uom_data.json,erpnext.gettext.extractors.uom_data.extract
**/setup/doctype/incoterm/incoterms.csv,erpnext.gettext.extractors.incoterms.extract
**/setup/setup_wizard/data/*.txt,erpnext.gettext.extractors.lines_from_txt_file.extract
1 **/setup/setup_wizard/data/uom_data.json erpnext.gettext.extractors.uom_data.extract
2 **/setup/doctype/incoterm/incoterms.csv erpnext.gettext.extractors.incoterms.extract
3 **/setup/setup_wizard/data/*.txt erpnext.gettext.extractors.lines_from_txt_file.extract

10
crowdin.yml Normal file
View File

@@ -0,0 +1,10 @@
files:
- source: /erpnext/locale/main.pot
translation: /erpnext/locale/%two_letters_code%.po
pull_request_title: "fix: sync translations from crowdin"
pull_request_labels:
- translation
pull_request_reviewers:
- barredterra # change to your GitHub username if you copied this file
commit_message: "fix: %language% translations"
append_commit_message: false

View File

@@ -1,10 +1,20 @@
import functools import functools
import inspect import inspect
<<<<<<< HEAD
import frappe import frappe
from frappe.utils.user import is_website_user from frappe.utils.user import is_website_user
__version__ = "15.39.6" __version__ = "15.39.6"
=======
from typing import TypeVar
import frappe
from frappe.model.document import Document
from frappe.utils.user import is_website_user
__version__ = "16.0.0-dev"
>>>>>>> 329d14957b (fix: validate negative qty)
def get_default_company(user=None): def get_default_company(user=None):
@@ -160,3 +170,37 @@ def check_app_permission():
return False return False
return True return True
<<<<<<< HEAD
=======
T = TypeVar("T")
def normalize_ctx_input(T: type) -> callable:
"""
Normalizes the first argument (ctx) of the decorated function by:
- Converting Document objects to dictionaries
- Parsing JSON strings
- Casting the result to the specified type T
"""
def decorator(func: callable):
# conserve annotations for frappe.utils.typing_validations
@functools.wraps(func, assigned=(a for a in functools.WRAPPER_ASSIGNMENTS if a != "__annotations__"))
def wrapper(ctx: T | Document | dict | str, *args, **kwargs):
if isinstance(ctx, Document):
ctx = T(**ctx.as_dict())
elif isinstance(ctx, dict):
ctx = T(**ctx)
else:
ctx = T(**frappe.parse_json(ctx))
return func(ctx, *args, **kwargs)
# set annotations from function
wrapper.__annotations__.update({k: v for k, v in func.__annotations__.items() if k != "ctx"})
return wrapper
return decorator
>>>>>>> 329d14957b (fix: validate negative qty)

View File

@@ -220,7 +220,11 @@ def calculate_monthly_amount(
if amount + already_booked_amount_in_account_currency > item.net_amount: if amount + already_booked_amount_in_account_currency > item.net_amount:
amount = item.net_amount - already_booked_amount_in_account_currency amount = item.net_amount - already_booked_amount_in_account_currency
<<<<<<< HEAD
if not (get_first_day(start_date) == start_date and get_last_day(end_date) == end_date): if not (get_first_day(start_date) == start_date and get_last_day(end_date) == end_date):
=======
if get_first_day(start_date) != start_date or get_last_day(end_date) != end_date:
>>>>>>> 329d14957b (fix: validate negative qty)
partial_month = flt(date_diff(end_date, start_date)) / flt( partial_month = flt(date_diff(end_date, start_date)) / flt(
date_diff(get_last_day(end_date), get_first_day(start_date)) date_diff(get_last_day(end_date), get_first_day(start_date))
) )

View File

@@ -64,6 +64,11 @@
"label": "Is Group" "label": "Is Group"
}, },
{ {
<<<<<<< HEAD
=======
"fetch_from": "parent_account.company",
"fetch_if_empty": 1,
>>>>>>> 329d14957b (fix: validate negative qty)
"fieldname": "company", "fieldname": "company",
"fieldtype": "Link", "fieldtype": "Link",
"in_standard_filter": 1, "in_standard_filter": 1,
@@ -106,6 +111,10 @@
"fieldname": "parent_account", "fieldname": "parent_account",
"fieldtype": "Link", "fieldtype": "Link",
"ignore_user_permissions": 1, "ignore_user_permissions": 1,
<<<<<<< HEAD
=======
"in_preview": 1,
>>>>>>> 329d14957b (fix: validate negative qty)
"label": "Parent Account", "label": "Parent Account",
"oldfieldname": "parent_account", "oldfieldname": "parent_account",
"oldfieldtype": "Link", "oldfieldtype": "Link",
@@ -248,8 +257,17 @@
], ],
"search_fields": "account_number", "search_fields": "account_number",
"show_name_in_global_search": 1, "show_name_in_global_search": 1,
<<<<<<< HEAD
"sort_field": "modified", "sort_field": "modified",
"sort_order": "ASC", "sort_order": "ASC",
"states": [], "states": [],
"track_changes": 1 "track_changes": 1
} }
=======
"show_preview_popup": 1,
"sort_field": "creation",
"sort_order": "ASC",
"states": [],
"track_changes": 1
}
>>>>>>> 329d14957b (fix: validate negative qty)

View File

@@ -92,9 +92,13 @@ class Account(NestedSet):
super().on_update() super().on_update()
def onload(self): def onload(self):
<<<<<<< HEAD
frozen_accounts_modifier = frappe.db.get_value( frozen_accounts_modifier = frappe.db.get_value(
"Accounts Settings", "Accounts Settings", "frozen_accounts_modifier" "Accounts Settings", "Accounts Settings", "frozen_accounts_modifier"
) )
=======
frozen_accounts_modifier = frappe.db.get_single_value("Accounts Settings", "frozen_accounts_modifier")
>>>>>>> 329d14957b (fix: validate negative qty)
if not frozen_accounts_modifier or frozen_accounts_modifier in frappe.get_roles(): if not frozen_accounts_modifier or frozen_accounts_modifier in frappe.get_roles():
self.set_onload("can_freeze_account", True) self.set_onload("can_freeze_account", True)

View File

@@ -81,7 +81,11 @@ frappe.treeview_settings["Account"] = {
// show Dr if positive since balance is calculated as debit - credit else show Cr // show Dr if positive since balance is calculated as debit - credit else show Cr
const balance = account.balance_in_account_currency || account.balance; const balance = account.balance_in_account_currency || account.balance;
<<<<<<< HEAD
const dr_or_cr = balance > 0 ? "Dr" : "Cr"; const dr_or_cr = balance > 0 ? "Dr" : "Cr";
=======
const dr_or_cr = balance > 0 ? __("Dr") : __("Cr");
>>>>>>> 329d14957b (fix: validate negative qty)
const format = (value, currency) => format_currency(Math.abs(value), currency); const format = (value, currency) => format_currency(Math.abs(value), currency);
if (account.balance !== undefined) { if (account.balance !== undefined) {

View File

@@ -75,7 +75,11 @@ def create_charts(
# after all accounts are already inserted. # after all accounts are already inserted.
frappe.local.flags.ignore_update_nsm = True frappe.local.flags.ignore_update_nsm = True
_import_accounts(chart, None, None, root_account=True) _import_accounts(chart, None, None, root_account=True)
<<<<<<< HEAD
rebuild_tree("Account", "parent_account") rebuild_tree("Account", "parent_account")
=======
rebuild_tree("Account")
>>>>>>> 329d14957b (fix: validate negative qty)
frappe.local.flags.ignore_update_nsm = False frappe.local.flags.ignore_update_nsm = False
@@ -232,6 +236,11 @@ def build_account_tree(tree, parent, all_accounts):
tree[child.account_name]["account_type"] = child.account_type tree[child.account_name]["account_type"] = child.account_type
if child.tax_rate: if child.tax_rate:
tree[child.account_name]["tax_rate"] = child.tax_rate tree[child.account_name]["tax_rate"] = child.tax_rate
<<<<<<< HEAD
=======
if child.account_currency:
tree[child.account_name]["account_currency"] = child.account_currency
>>>>>>> 329d14957b (fix: validate negative qty)
if not parent: if not parent:
tree[child.account_name]["root_type"] = child.root_type tree[child.account_name]["root_type"] = child.root_type

View File

@@ -0,0 +1,569 @@
{
"country_code": "de",
"name": "SKR03 mit Kontonummern",
"tree": {
"Aktiva": {
"is_group": 1,
"root_type": "Asset",
"A - Anlagevermögen": {
"is_group": 1,
"EDV-Software": {
"account_number": "0027",
"account_type": "Fixed Asset"
},
"Geschäftsausstattung": {
"account_number": "0410",
"account_type": "Fixed Asset"
},
"Büroeinrichtung": {
"account_number": "0420",
"account_type": "Fixed Asset"
},
"Darlehen": {
"account_number": "0565"
},
"Maschinen": {
"account_number": "0210",
"account_type": "Fixed Asset"
},
"Betriebsausstattung": {
"account_number": "0400",
"account_type": "Fixed Asset"
},
"Ladeneinrichtung": {
"account_number": "0430",
"account_type": "Fixed Asset"
},
"Accumulated Depreciation": {
"account_type": "Accumulated Depreciation"
}
},
"B - Umlaufvermögen": {
"is_group": 1,
"I. Vorräte": {
"is_group": 1,
"Roh-, Hilfs- und Betriebsstoffe (Bestand)": {
"account_number": "3970",
"account_type": "Stock"
},
"Waren (Bestand)": {
"account_number": "3980",
"account_type": "Stock"
}
},
"II. Forderungen und sonstige Vermögensgegenstände": {
"is_group": 1,
"Forderungen aus Lieferungen und Leistungen mit Kontokorrent": {
"account_number": "1400",
"account_type": "Receivable",
"is_group": 1
},
"Forderungen aus Lieferungen und Leistungen ohne Kontokorrent": {
"account_number": "1410",
"account_type": "Receivable"
},
"Durchlaufende Posten": {
"account_number": "1590"
},
"Verrechnungskonto Gewinnermittlung § 4 Abs. 3 EStG, nicht ergebniswirksam": {
"account_number": "1371"
},
"Abziehbare Vorsteuer": {
"is_group": 1,
"Abziehbare Vorsteuer 7 %": {
"account_number": "1571",
"account_type": "Tax",
"tax_rate": 7.0
},
"Abziehbare Vorsteuer 19 %": {
"account_number": "1576",
"account_type": "Tax",
"tax_rate": 19.0
},
"Abziehbare Vorsteuer nach § 13b UStG 19 %": {
"account_number": "1577",
"account_type": "Tax",
"tax_rate": 19.0
}
}
},
"III. Wertpapiere": {
"is_group": 1,
"Anteile an verbundenen Unternehmen (Umlaufvermögen)": {
"account_number": "1340"
},
"Anteile an herrschender oder mit Mehrheit beteiligter Gesellschaft": {
"account_number": "1344"
},
"Sonstige Wertpapiere": {
"account_number": "1348"
}
},
"IV. Kassenbestand, Bundesbankguthaben, Guthaben bei Kreditinstituten und Schecks.": {
"is_group": 1,
"Kasse": {
"is_group": 1,
"account_type": "Cash",
"Kasse": {
"account_number": "1000",
"account_type": "Cash"
}
},
"Bank": {
"is_group": 1,
"account_type": "Bank",
"Postbank": {
"account_number": "1100",
"account_type": "Bank"
},
"Bankkonto": {
"account_number": "1200",
"account_type": "Bank"
}
}
}
},
"C - Rechnungsabgrenzungsposten": {
"is_group": 1,
"Aktive Rechnungsabgrenzung": {
"account_number": "0980"
}
},
"D - Aktive latente Steuern": {
"is_group": 1,
"Aktive latente Steuern": {
"account_number": "0983"
}
},
"E - Aktiver Unterschiedsbetrag aus der Vermögensverrechnung": {
"is_group": 1
}
},
"Passiva": {
"is_group": 1,
"root_type": "Liability",
"A. Eigenkapital": {
"is_group": 1,
"I. Gezeichnetes Kapital": {
"is_group": 1
},
"II. Kapitalrücklage": {
"is_group": 1
},
"III. Gewinnrücklagen": {
"is_group": 1
},
"IV. Gewinnvortrag/Verlustvortrag": {
"is_group": 1
},
"V. Jahresüberschuß/Jahresfehlbetrag": {
"is_group": 1
}
},
"B. Rückstellungen": {
"is_group": 1,
"I. Rückstellungen für Pensionen und ähnliche Verpflichtungen": {
"is_group": 1
},
"II. Steuerrückstellungen": {
"is_group": 1
},
"III. sonstige Rückstellungen": {
"is_group": 1
}
},
"C. Verbindlichkeiten": {
"is_group": 1,
"I. Anleihen": {
"is_group": 1
},
"II. Verbindlichkeiten gegenüber Kreditinstituten": {
"is_group": 1
},
"III. Erhaltene Anzahlungen auf Bestellungen": {
"is_group": 1
},
"IV. Verbindlichkeiten aus Lieferungen und Leistungen": {
"is_group": 1,
"Verbindlichkeiten aus Lieferungen und Leistungen mit Kontokorrent": {
"account_number": "1600",
"account_type": "Payable",
"is_group": 1
},
"Verbindlichkeiten aus Lieferungen und Leistungen ohne Kontokorrent": {
"account_number": "1610",
"account_type": "Payable"
}
},
"V. Verbindlichkeiten aus der Annahme gezogener Wechsel und der Ausstellung eigener Wechsel": {
"is_group": 1
},
"VI. Verbindlichkeiten gegenüber verbundenen Unternehmen": {
"is_group": 1
},
"VII. Verbindlichkeiten gegenüber Unternehmen, mit denen ein Beteiligungsverhältnis besteht": {
"is_group": 1
},
"VIII. sonstige Verbindlichkeiten": {
"is_group": 1,
"Sonstige Verbindlichkeiten": {
"account_number": "1700",
"account_type": "Asset Received But Not Billed"
},
"Sonstige Verbindlichkeiten (1 bis 5 Jahre)": {
"account_number": "1702",
"account_type": "Stock Received But Not Billed"
},
"Verbindlichkeiten aus Lohn und Gehalt": {
"account_number": "1740",
"account_type": "Payable"
},
"Umsatzsteuer": {
"is_group": 1,
"Umsatzsteuer 7 %": {
"account_number": "1771",
"account_type": "Tax",
"tax_rate": 7.0
},
"Umsatzsteuer 19 %": {
"account_number": "1776",
"account_type": "Tax",
"tax_rate": 19.0
},
"Umsatzsteuer-Vorauszahlung": {
"account_number": "1780",
"account_type": "Tax"
},
"Umsatzsteuer-Vorauszahlung 1/11": {
"account_number": "1781"
},
"Umsatzsteuer nach § 13b UStG 19 %": {
"account_number": "1787",
"account_type": "Tax",
"tax_rate": 19.0
},
"Umsatzsteuer Vorjahr": {
"account_number": "1790"
},
"Umsatzsteuer frühere Jahre": {
"account_number": "1791"
}
}
}
},
"D. Rechnungsabgrenzungsposten": {
"is_group": 1,
"Passive Rechnungsabgrenzung": {
"account_number": "0990"
}
},
"E. Passive latente Steuern": {
"is_group": 1
}
},
"Erlöse u. Erträge 2/8": {
"is_group": 1,
"root_type": "Income",
"Erlöskonten 8": {
"is_group": 1,
"Erlöse": {
"account_number": "8200",
"account_type": "Income Account"
},
"Erlöse USt. 19 %": {
"account_number": "8400",
"account_type": "Income Account"
},
"Erlöse USt. 7 %": {
"account_number": "8300",
"account_type": "Income Account"
}
},
"Ertragskonten 2": {
"is_group": 1,
"sonstige Zinsen und ähnliche Erträge": {
"account_number": "2650",
"account_type": "Income Account"
},
"Außerordentliche Erträge": {
"account_number": "2500",
"account_type": "Income Account"
},
"Sonstige Erträge": {
"account_number": "2700",
"account_type": "Income Account"
}
}
},
"Aufwendungen 2/4": {
"is_group": 1,
"root_type": "Expense",
"Fremdleistungen": {
"account_number": "3100",
"account_type": "Expense Account"
},
"Fremdleistungen ohne Vorsteuer": {
"account_number": "3109",
"account_type": "Expense Account"
},
"Bauleistungen eines im Inland ansässigen Unternehmers 19 % Vorsteuer und 19 % Umsatzsteuer": {
"account_number": "3120",
"account_type": "Expense Account"
},
"Wareneingang": {
"account_number": "3200"
},
"Bezugsnebenkosten": {
"account_number": "3800",
"account_type": "Expenses Included In Asset Valuation"
},
"Herstellungskosten": {
"account_number": "4996",
"account_type": "Cost of Goods Sold"
},
"Verluste aus dem Abgang von Gegenständen des Anlagevermögens": {
"account_number": "2320",
"account_type": "Stock Adjustment"
},
"Verwaltungskosten": {
"account_number": "4997",
"account_type": "Expenses Included In Valuation"
},
"Vertriebskosten": {
"account_number": "4998",
"account_type": "Expenses Included In Valuation"
},
"Gegenkonto 4996-4998": {
"account_number": "4999"
},
"Abschreibungen": {
"is_group": 1,
"Abschreibungen auf Sachanlagen (ohne AfA auf Kfz und Gebäude)": {
"account_number": "4830",
"account_type": "Accumulated Depreciation"
},
"Abschreibungen auf Gebäude": {
"account_number": "4831",
"account_type": "Depreciation"
},
"Abschreibungen auf Kfz": {
"account_number": "4832",
"account_type": "Depreciation"
},
"Sofortabschreibung GWG": {
"account_number": "4855",
"account_type": "Expense Account"
}
},
"Kfz-Kosten": {
"is_group": 1,
"Kfz-Steuer": {
"account_number": "4510",
"account_type": "Expense Account"
},
"Kfz-Versicherungen": {
"account_number": "4520",
"account_type": "Expense Account"
},
"laufende Kfz-Betriebskosten": {
"account_number": "4530",
"account_type": "Expense Account"
},
"Kfz-Reparaturen": {
"account_number": "4540",
"account_type": "Expense Account"
},
"Fremdfahrzeuge": {
"account_number": "4570",
"account_type": "Expense Account"
},
"sonstige Kfz-Kosten": {
"account_number": "4580",
"account_type": "Expense Account"
}
},
"Personalkosten": {
"is_group": 1,
"Gehälter": {
"account_number": "4120",
"account_type": "Expense Account"
},
"gesetzliche soziale Aufwendungen": {
"account_number": "4130",
"account_type": "Expense Account"
},
"Aufwendungen für Altersvorsorge": {
"account_number": "4165",
"account_type": "Expense Account"
},
"Vermögenswirksame Leistungen": {
"account_number": "4170",
"account_type": "Expense Account"
},
"Aushilfslöhne": {
"account_number": "4190",
"account_type": "Expense Account"
}
},
"Raumkosten": {
"is_group": 1,
"Miete und Nebenkosten": {
"account_number": "4210",
"account_type": "Expense Account"
},
"Gas, Wasser, Strom (Verwaltung, Vertrieb)": {
"account_number": "4240",
"account_type": "Expense Account"
},
"Reinigung": {
"account_number": "4250",
"account_type": "Expense Account"
}
},
"Reparatur/Instandhaltung": {
"is_group": 1,
"Reparaturen und Instandhaltungen von anderen Anlagen und Betriebs- und Geschäftsausstattung": {
"account_number": "4805",
"account_type": "Expense Account"
}
},
"Versicherungsbeiträge": {
"is_group": 1,
"Versicherungen": {
"account_number": "4360",
"account_type": "Expense Account"
},
"Beiträge": {
"account_number": "4380",
"account_type": "Expense Account"
},
"sonstige Ausgaben": {
"account_number": "4390",
"account_type": "Expense Account"
},
"steuerlich abzugsfähige Verspätungszuschläge und Zwangsgelder": {
"account_number": "4396",
"account_type": "Expense Account"
}
},
"Werbe-/Reisekosten": {
"is_group": 1,
"Werbekosten": {
"account_number": "4610",
"account_type": "Expense Account"
},
"Aufmerksamkeiten": {
"account_number": "4653",
"account_type": "Expense Account"
},
"nicht abzugsfähige Betriebsausg. aus Werbe-, Repräs.- u. Reisekosten": {
"account_number": "4665",
"account_type": "Expense Account"
},
"Reisekosten Unternehmer": {
"account_number": "4670",
"account_type": "Expense Account"
}
},
"verschiedene Kosten": {
"is_group": 1,
"Porto": {
"account_number": "4910",
"account_type": "Expense Account"
},
"Telekom": {
"account_number": "4920",
"account_type": "Expense Account"
},
"Mobilfunk D2": {
"account_number": "4921",
"account_type": "Expense Account"
},
"Internet": {
"account_number": "4922",
"account_type": "Expense Account"
},
"Bürobedarf": {
"account_number": "4930",
"account_type": "Expense Account"
},
"Zeitschriften, Bücher": {
"account_number": "4940",
"account_type": "Expense Account"
},
"Fortbildungskosten": {
"account_number": "4945",
"account_type": "Expense Account"
},
"Buchführungskosten": {
"account_number": "4955",
"account_type": "Expense Account"
},
"Abschluß- u. Prüfungskosten": {
"account_number": "4957",
"account_type": "Expense Account"
},
"Nebenkosten des Geldverkehrs": {
"account_number": "4970",
"account_type": "Expense Account"
},
"Werkzeuge und Kleingeräte": {
"account_number": "4985",
"account_type": "Expense Account"
}
},
"Zinsaufwendungen": {
"is_group": 1,
"Zinsaufwendungen für kurzfristige Verbindlichkeiten": {
"account_number": "2110",
"account_type": "Expense Account"
},
"Zinsaufwendungen für KFZ Finanzierung": {
"account_number": "2121",
"account_type": "Expense Account"
}
}
},
"Anfangsbestand 9": {
"is_group": 1,
"root_type": "Equity",
"Saldenvortragskonten": {
"is_group": 1,
"Saldenvortrag Sachkonten": {
"account_number": "9000"
},
"Saldenvorträge Debitoren": {
"account_number": "9008"
},
"Saldenvorträge Kreditoren": {
"account_number": "9009"
}
}
},
"Privatkonten 1": {
"is_group": 1,
"root_type": "Equity",
"Privatentnahmen/-einlagen": {
"is_group": 1,
"Privatentnahme allgemein": {
"account_number": "1800"
},
"Privatsteuern": {
"account_number": "1810"
},
"Sonderausgaben beschränkt abzugsfähig": {
"account_number": "1820"
},
"Sonderausgaben unbeschränkt abzugsfähig": {
"account_number": "1830"
},
"Außergewöhnliche Belastungen": {
"account_number": "1850"
},
"Privateinlagen": {
"account_number": "1890"
}
}
}
}
}

View File

@@ -1653,4 +1653,8 @@
} }
} }
} }
<<<<<<< HEAD
} }
=======
}
>>>>>>> 329d14957b (fix: validate negative qty)

View File

@@ -36,6 +36,7 @@
} }
}, },
"Fixed Assets": { "Fixed Assets": {
<<<<<<< HEAD
"Capital Equipments": { "Capital Equipments": {
"account_type": "Fixed Asset" "account_type": "Fixed Asset"
}, },
@@ -46,6 +47,18 @@
"account_type": "Fixed Asset" "account_type": "Fixed Asset"
}, },
"Office Equipments": { "Office Equipments": {
=======
"Capital Equipment": {
"account_type": "Fixed Asset"
},
"Electronic Equipment": {
"account_type": "Fixed Asset"
},
"Furniture and Fixtures": {
"account_type": "Fixed Asset"
},
"Office Equipment": {
>>>>>>> 329d14957b (fix: validate negative qty)
"account_type": "Fixed Asset" "account_type": "Fixed Asset"
}, },
"Plants and Machineries": { "Plants and Machineries": {

View File

@@ -1,6 +1,10 @@
{ {
"country_code": "ni", "country_code": "ni",
<<<<<<< HEAD
"name": "Nicaragua - Catalogo de Cuentas", "name": "Nicaragua - Catalogo de Cuentas",
=======
"name": "Nicaragua - Catálogo de Cuentas",
>>>>>>> 329d14957b (fix: validate negative qty)
"tree": { "tree": {
"Activo": { "Activo": {
"Activo Corriente": { "Activo Corriente": {
@@ -491,4 +495,8 @@
"root_type": "Liability" "root_type": "Liability"
} }
} }
<<<<<<< HEAD
} }
=======
}
>>>>>>> 329d14957b (fix: validate negative qty)

View File

@@ -23,6 +23,7 @@ def get():
_("Tax Assets"): {"is_group": 1}, _("Tax Assets"): {"is_group": 1},
}, },
_("Fixed Assets"): { _("Fixed Assets"): {
<<<<<<< HEAD
_("Capital Equipments"): {"account_type": "Fixed Asset"}, _("Capital Equipments"): {"account_type": "Fixed Asset"},
_("Electronic Equipments"): {"account_type": "Fixed Asset"}, _("Electronic Equipments"): {"account_type": "Fixed Asset"},
_("Furnitures and Fixtures"): {"account_type": "Fixed Asset"}, _("Furnitures and Fixtures"): {"account_type": "Fixed Asset"},
@@ -30,6 +31,15 @@ def get():
_("Plants and Machineries"): {"account_type": "Fixed Asset"}, _("Plants and Machineries"): {"account_type": "Fixed Asset"},
_("Buildings"): {"account_type": "Fixed Asset"}, _("Buildings"): {"account_type": "Fixed Asset"},
_("Softwares"): {"account_type": "Fixed Asset"}, _("Softwares"): {"account_type": "Fixed Asset"},
=======
_("Capital Equipment"): {"account_type": "Fixed Asset"},
_("Electronic Equipment"): {"account_type": "Fixed Asset"},
_("Furniture and Fixtures"): {"account_type": "Fixed Asset"},
_("Office Equipment"): {"account_type": "Fixed Asset"},
_("Plants and Machineries"): {"account_type": "Fixed Asset"},
_("Buildings"): {"account_type": "Fixed Asset"},
_("Software"): {"account_type": "Fixed Asset"},
>>>>>>> 329d14957b (fix: validate negative qty)
_("Accumulated Depreciation"): {"account_type": "Accumulated Depreciation"}, _("Accumulated Depreciation"): {"account_type": "Accumulated Depreciation"},
_("CWIP Account"): { _("CWIP Account"): {
"account_type": "Capital Work in Progress", "account_type": "Capital Work in Progress",

View File

@@ -36,6 +36,7 @@ def get():
"account_number": "1100-1600", "account_number": "1100-1600",
}, },
_("Fixed Assets"): { _("Fixed Assets"): {
<<<<<<< HEAD
_("Capital Equipments"): {"account_type": "Fixed Asset", "account_number": "1710"}, _("Capital Equipments"): {"account_type": "Fixed Asset", "account_number": "1710"},
_("Electronic Equipments"): {"account_type": "Fixed Asset", "account_number": "1720"}, _("Electronic Equipments"): {"account_type": "Fixed Asset", "account_number": "1720"},
_("Furnitures and Fixtures"): {"account_type": "Fixed Asset", "account_number": "1730"}, _("Furnitures and Fixtures"): {"account_type": "Fixed Asset", "account_number": "1730"},
@@ -43,6 +44,15 @@ def get():
_("Plants and Machineries"): {"account_type": "Fixed Asset", "account_number": "1750"}, _("Plants and Machineries"): {"account_type": "Fixed Asset", "account_number": "1750"},
_("Buildings"): {"account_type": "Fixed Asset", "account_number": "1760"}, _("Buildings"): {"account_type": "Fixed Asset", "account_number": "1760"},
_("Softwares"): {"account_type": "Fixed Asset", "account_number": "1770"}, _("Softwares"): {"account_type": "Fixed Asset", "account_number": "1770"},
=======
_("Capital Equipment"): {"account_type": "Fixed Asset", "account_number": "1710"},
_("Electronic Equipment"): {"account_type": "Fixed Asset", "account_number": "1720"},
_("Furniture and Fixtures"): {"account_type": "Fixed Asset", "account_number": "1730"},
_("Office Equipment"): {"account_type": "Fixed Asset", "account_number": "1740"},
_("Plants and Machineries"): {"account_type": "Fixed Asset", "account_number": "1750"},
_("Buildings"): {"account_type": "Fixed Asset", "account_number": "1760"},
_("Software"): {"account_type": "Fixed Asset", "account_number": "1770"},
>>>>>>> 329d14957b (fix: validate negative qty)
_("Accumulated Depreciation"): { _("Accumulated Depreciation"): {
"account_type": "Accumulated Depreciation", "account_type": "Accumulated Depreciation",
"account_number": "1780", "account_number": "1780",

View File

@@ -1,11 +1,18 @@
# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
# License: GNU General Public License v3. See license.txt # License: GNU General Public License v3. See license.txt
<<<<<<< HEAD
import unittest import unittest
import frappe import frappe
from frappe.test_runner import make_test_records from frappe.test_runner import make_test_records
=======
import unittest
import frappe
from frappe.tests import IntegrationTestCase
>>>>>>> 329d14957b (fix: validate negative qty)
from frappe.utils import nowdate from frappe.utils import nowdate
from erpnext.accounts.doctype.account.account import ( from erpnext.accounts.doctype.account.account import (
@@ -15,10 +22,17 @@ from erpnext.accounts.doctype.account.account import (
) )
from erpnext.stock import get_company_default_inventory_account, get_warehouse_account from erpnext.stock import get_company_default_inventory_account, get_warehouse_account
<<<<<<< HEAD
test_dependencies = ["Company"] test_dependencies = ["Company"]
class TestAccount(unittest.TestCase): class TestAccount(unittest.TestCase):
=======
EXTRA_TEST_RECORD_DEPENDENCIES = ["Company"]
class TestAccount(IntegrationTestCase):
>>>>>>> 329d14957b (fix: validate negative qty)
def test_rename_account(self): def test_rename_account(self):
if not frappe.db.exists("Account", "1210 - Debtors - _TC"): if not frappe.db.exists("Account", "1210 - Debtors - _TC"):
acc = frappe.new_doc("Account") acc = frappe.new_doc("Account")
@@ -120,7 +134,11 @@ class TestAccount(unittest.TestCase):
InvalidAccountMergeError, InvalidAccountMergeError,
merge_account, merge_account,
"Capital Stock - _TC", "Capital Stock - _TC",
<<<<<<< HEAD
"Softwares - _TC", "Softwares - _TC",
=======
"Software - _TC",
>>>>>>> 329d14957b (fix: validate negative qty)
) )
# Raise error as currency doesn't match # Raise error as currency doesn't match
@@ -203,8 +221,11 @@ class TestAccount(unittest.TestCase):
In a parent->child company setup, child should inherit parent account currency if explicitly specified. In a parent->child company setup, child should inherit parent account currency if explicitly specified.
""" """
<<<<<<< HEAD
make_test_records("Company") make_test_records("Company")
=======
>>>>>>> 329d14957b (fix: validate negative qty)
frappe.local.flags.pop("ignore_root_company_validation", None) frappe.local.flags.pop("ignore_root_company_validation", None)
def create_bank_account(): def create_bank_account():
@@ -328,7 +349,11 @@ class TestAccount(unittest.TestCase):
def _make_test_records(verbose=None): def _make_test_records(verbose=None):
<<<<<<< HEAD
from frappe.test_runner import make_test_objects from frappe.test_runner import make_test_objects
=======
from frappe.tests.utils import make_test_objects
>>>>>>> 329d14957b (fix: validate negative qty)
accounts = [ accounts = [
# [account_name, parent_account, is_group] # [account_name, parent_account, is_group]

View File

@@ -0,0 +1,3 @@
[[Account]]
name = "_Test Account 1"

View File

@@ -129,7 +129,11 @@
"icon": "fa fa-list", "icon": "fa fa-list",
"in_create": 1, "in_create": 1,
"links": [], "links": [],
<<<<<<< HEAD
"modified": "2023-03-06 08:56:36.393237", "modified": "2023-03-06 08:56:36.393237",
=======
"modified": "2024-03-27 13:05:56.710541",
>>>>>>> 329d14957b (fix: validate negative qty)
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "Accounts", "module": "Accounts",
"name": "Account Closing Balance", "name": "Account Closing Balance",
@@ -158,7 +162,11 @@
"role": "Auditor" "role": "Auditor"
} }
], ],
<<<<<<< HEAD
"sort_field": "modified", "sort_field": "modified",
=======
"sort_field": "creation",
>>>>>>> 329d14957b (fix: validate negative qty)
"sort_order": "DESC", "sort_order": "DESC",
"states": [] "states": []
} }

View File

@@ -2,8 +2,24 @@
# See license.txt # See license.txt
# import frappe # import frappe
<<<<<<< HEAD
from frappe.tests.utils import FrappeTestCase from frappe.tests.utils import FrappeTestCase
class TestAccountClosingBalance(FrappeTestCase): class TestAccountClosingBalance(FrappeTestCase):
=======
from frappe.tests import IntegrationTestCase, UnitTestCase
class UnitTestAccountClosingBalance(UnitTestCase):
"""
Unit tests for AccountClosingBalance.
Use this class for testing individual functions and methods.
"""
pass
class TestAccountClosingBalance(IntegrationTestCase):
>>>>>>> 329d14957b (fix: validate negative qty)
pass pass

View File

@@ -49,7 +49,11 @@
} }
], ],
"links": [], "links": [],
<<<<<<< HEAD
"modified": "2021-02-08 16:37:53.936656", "modified": "2021-02-08 16:37:53.936656",
=======
"modified": "2024-03-27 13:05:56.890002",
>>>>>>> 329d14957b (fix: validate negative qty)
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "Accounts", "module": "Accounts",
"name": "Accounting Dimension", "name": "Accounting Dimension",
@@ -80,7 +84,13 @@
"write": 1 "write": 1
} }
], ],
<<<<<<< HEAD
"sort_field": "modified", "sort_field": "modified",
"sort_order": "ASC", "sort_order": "ASC",
=======
"sort_field": "creation",
"sort_order": "ASC",
"states": [],
>>>>>>> 329d14957b (fix: validate negative qty)
"track_changes": 1 "track_changes": 1
} }

View File

@@ -1,17 +1,31 @@
# Copyright (c) 2019, Frappe Technologies Pvt. Ltd. and Contributors # Copyright (c) 2019, Frappe Technologies Pvt. Ltd. and Contributors
# See license.txt # See license.txt
<<<<<<< HEAD
import unittest import unittest
import frappe import frappe
=======
import unittest
import frappe
from frappe.tests import IntegrationTestCase
>>>>>>> 329d14957b (fix: validate negative qty)
from erpnext.accounts.doctype.journal_entry.test_journal_entry import make_journal_entry from erpnext.accounts.doctype.journal_entry.test_journal_entry import make_journal_entry
from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice
<<<<<<< HEAD
test_dependencies = ["Cost Center", "Location", "Warehouse", "Department"] test_dependencies = ["Cost Center", "Location", "Warehouse", "Department"]
class TestAccountingDimension(unittest.TestCase): class TestAccountingDimension(unittest.TestCase):
=======
EXTRA_TEST_RECORD_DEPENDENCIES = ["Cost Center", "Location", "Warehouse", "Department"]
class TestAccountingDimension(IntegrationTestCase):
>>>>>>> 329d14957b (fix: validate negative qty)
def setUp(self): def setUp(self):
create_dimension() create_dimension()

View File

@@ -1,4 +1,8 @@
{ {
<<<<<<< HEAD
=======
"actions": [],
>>>>>>> 329d14957b (fix: validate negative qty)
"creation": "2019-07-16 17:53:18.718831", "creation": "2019-07-16 17:53:18.718831",
"doctype": "DocType", "doctype": "DocType",
"editable_grid": 1, "editable_grid": 1,
@@ -73,13 +77,24 @@
} }
], ],
"istable": 1, "istable": 1,
<<<<<<< HEAD
"modified": "2019-08-15 11:59:09.389891", "modified": "2019-08-15 11:59:09.389891",
=======
"links": [],
"modified": "2024-03-27 13:05:57.056874",
>>>>>>> 329d14957b (fix: validate negative qty)
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "Accounts", "module": "Accounts",
"name": "Accounting Dimension Detail", "name": "Accounting Dimension Detail",
"owner": "Administrator", "owner": "Administrator",
"permissions": [], "permissions": [],
<<<<<<< HEAD
"sort_field": "modified", "sort_field": "modified",
"sort_order": "DESC", "sort_order": "DESC",
=======
"sort_field": "creation",
"sort_order": "DESC",
"states": [],
>>>>>>> 329d14957b (fix: validate negative qty)
"track_changes": 1 "track_changes": 1
} }

View File

@@ -94,7 +94,11 @@
], ],
"index_web_pages_for_search": 1, "index_web_pages_for_search": 1,
"links": [], "links": [],
<<<<<<< HEAD
"modified": "2023-06-07 14:59:41.869117", "modified": "2023-06-07 14:59:41.869117",
=======
"modified": "2024-03-27 13:05:57.199186",
>>>>>>> 329d14957b (fix: validate negative qty)
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "Accounts", "module": "Accounts",
"name": "Accounting Dimension Filter", "name": "Accounting Dimension Filter",
@@ -139,7 +143,11 @@
} }
], ],
"quick_entry": 1, "quick_entry": 1,
<<<<<<< HEAD
"sort_field": "modified", "sort_field": "modified",
=======
"sort_field": "creation",
>>>>>>> 329d14957b (fix: validate negative qty)
"sort_order": "DESC", "sort_order": "DESC",
"states": [], "states": [],
"track_changes": 1 "track_changes": 1

View File

@@ -67,7 +67,10 @@ class AccountingDimensionFilter(Document):
def get_dimension_filter_map(): def get_dimension_filter_map():
if not frappe.flags.get("dimension_filter_map"): if not frappe.flags.get("dimension_filter_map"):
<<<<<<< HEAD
# nosemgrep # nosemgrep
=======
>>>>>>> 329d14957b (fix: validate negative qty)
filters = frappe.db.sql( filters = frappe.db.sql(
""" """
SELECT SELECT

View File

@@ -12,7 +12,11 @@ from erpnext.accounts.doctype.accounting_dimension.test_accounting_dimension imp
from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice
from erpnext.exceptions import InvalidAccountDimensionError, MandatoryAccountDimensionError from erpnext.exceptions import InvalidAccountDimensionError, MandatoryAccountDimensionError
<<<<<<< HEAD
test_dependencies = ["Location", "Cost Center", "Department"] test_dependencies = ["Location", "Cost Center", "Department"]
=======
EXTRA_TEST_RECORD_DEPENDENCIES = ["Location", "Cost Center", "Department"]
>>>>>>> 329d14957b (fix: validate negative qty)
class TestAccountingDimensionFilter(unittest.TestCase): class TestAccountingDimensionFilter(unittest.TestCase):

View File

@@ -1,4 +1,5 @@
{ {
<<<<<<< HEAD
"allow_copy": 0, "allow_copy": 0,
"allow_guest_to_view": 0, "allow_guest_to_view": 0,
"allow_import": 0, "allow_import": 0,
@@ -314,4 +315,116 @@
"sort_order": "DESC", "sort_order": "DESC",
"track_changes": 1, "track_changes": 1,
"track_seen": 0 "track_seen": 0
=======
"actions": [],
"autoname": "field:period_name",
"creation": "2018-04-13 18:50:14.672323",
"doctype": "DocType",
"editable_grid": 1,
"engine": "InnoDB",
"field_order": [
"period_name",
"start_date",
"end_date",
"column_break_4",
"company",
"section_break_7",
"closed_documents"
],
"fields": [
{
"fieldname": "period_name",
"fieldtype": "Data",
"in_list_view": 1,
"label": "Period Name",
"reqd": 1,
"unique": 1
},
{
"fieldname": "start_date",
"fieldtype": "Date",
"in_list_view": 1,
"label": "Start Date",
"reqd": 1
},
{
"fieldname": "end_date",
"fieldtype": "Date",
"in_list_view": 1,
"label": "End Date",
"reqd": 1
},
{
"fieldname": "column_break_4",
"fieldtype": "Column Break"
},
{
"fieldname": "company",
"fieldtype": "Link",
"in_list_view": 1,
"label": "Company",
"options": "Company",
"reqd": 1
},
{
"fieldname": "section_break_7",
"fieldtype": "Section Break"
},
{
"fieldname": "closed_documents",
"fieldtype": "Table",
"label": "Closed Documents",
"options": "Closed Document",
"reqd": 1
}
],
"links": [],
"modified": "2024-03-27 13:05:57.388109",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Accounting Period",
"owner": "Administrator",
"permissions": [
{
"create": 1,
"delete": 1,
"email": 1,
"export": 1,
"print": 1,
"read": 1,
"report": 1,
"role": "System Manager",
"share": 1,
"write": 1
},
{
"create": 1,
"delete": 1,
"email": 1,
"export": 1,
"print": 1,
"read": 1,
"report": 1,
"role": "Accounts Manager",
"share": 1,
"write": 1
},
{
"create": 1,
"delete": 1,
"email": 1,
"export": 1,
"print": 1,
"read": 1,
"report": 1,
"role": "Accounts User",
"share": 1,
"write": 1
}
],
"sort_field": "creation",
"sort_order": "DESC",
"states": [],
"track_changes": 1
>>>>>>> 329d14957b (fix: validate negative qty)
} }

View File

@@ -1,9 +1,16 @@
# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors # Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors
# See license.txt # See license.txt
<<<<<<< HEAD
import unittest import unittest
import frappe import frappe
=======
import unittest
import frappe
from frappe.tests import IntegrationTestCase
>>>>>>> 329d14957b (fix: validate negative qty)
from frappe.utils import add_months, nowdate from frappe.utils import add_months, nowdate
from erpnext.accounts.doctype.accounting_period.accounting_period import ( from erpnext.accounts.doctype.accounting_period.accounting_period import (
@@ -12,10 +19,17 @@ from erpnext.accounts.doctype.accounting_period.accounting_period import (
) )
from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice
<<<<<<< HEAD
test_dependencies = ["Item"] test_dependencies = ["Item"]
class TestAccountingPeriod(unittest.TestCase): class TestAccountingPeriod(unittest.TestCase):
=======
EXTRA_TEST_RECORD_DEPENDENCIES = ["Item"]
class TestAccountingPeriod(IntegrationTestCase):
>>>>>>> 329d14957b (fix: validate negative qty)
def test_overlap(self): def test_overlap(self):
ap1 = create_accounting_period( ap1 = create_accounting_period(
start_date="2018-04-01", end_date="2018-06-30", company="Wind Power LLC" start_date="2018-04-01", end_date="2018-06-30", company="Wind Power LLC"

View File

@@ -521,7 +521,11 @@
} }
], ],
"quick_entry": 1, "quick_entry": 1,
<<<<<<< HEAD
"sort_field": "modified", "sort_field": "modified",
=======
"sort_field": "creation",
>>>>>>> 329d14957b (fix: validate negative qty)
"sort_order": "ASC", "sort_order": "ASC",
"states": [], "states": [],
"track_changes": 1 "track_changes": 1

View File

@@ -1,9 +1,16 @@
import unittest import unittest
import frappe import frappe
<<<<<<< HEAD
class TestAccountsSettings(unittest.TestCase): class TestAccountsSettings(unittest.TestCase):
=======
from frappe.tests import IntegrationTestCase
class TestAccountsSettings(IntegrationTestCase):
>>>>>>> 329d14957b (fix: validate negative qty)
def tearDown(self): def tearDown(self):
# Just in case `save` method succeeds, we need to take things back to default so that other tests # Just in case `save` method succeeds, we need to take things back to default so that other tests
# don't break # don't break

View File

@@ -2,7 +2,11 @@
# See license.txt # See license.txt
import frappe import frappe
<<<<<<< HEAD
from frappe.tests.utils import FrappeTestCase from frappe.tests.utils import FrappeTestCase
=======
from frappe.tests import IntegrationTestCase, UnitTestCase
>>>>>>> 329d14957b (fix: validate negative qty)
from frappe.utils import nowdate, today from frappe.utils import nowdate, today
from erpnext.accounts.doctype.payment_entry.test_payment_entry import get_payment_entry from erpnext.accounts.doctype.payment_entry.test_payment_entry import get_payment_entry
@@ -10,8 +14,19 @@ from erpnext.accounts.test.accounts_mixin import AccountsTestMixin
from erpnext.buying.doctype.purchase_order.test_purchase_order import create_purchase_order from erpnext.buying.doctype.purchase_order.test_purchase_order import create_purchase_order
from erpnext.selling.doctype.sales_order.test_sales_order import make_sales_order from erpnext.selling.doctype.sales_order.test_sales_order import make_sales_order
<<<<<<< HEAD
class TestAdvancePaymentLedgerEntry(AccountsTestMixin, FrappeTestCase): class TestAdvancePaymentLedgerEntry(AccountsTestMixin, FrappeTestCase):
=======
# On IntegrationTestCase, the doctype test records and all
# link-field test record depdendencies are recursively loaded
# Use these module variables to add/remove to/from that list
EXTRA_TEST_RECORD_DEPENDENCIES = [] # eg. ["User"]
IGNORE_TEST_RECORD_DEPENDENCIES = [] # eg. ["User"]
class TestAdvancePaymentLedgerEntry(AccountsTestMixin, IntegrationTestCase):
>>>>>>> 329d14957b (fix: validate negative qty)
""" """
Integration tests for AdvancePaymentLedgerEntry. Integration tests for AdvancePaymentLedgerEntry.
Use this class for testing interactions between multiple components. Use this class for testing interactions between multiple components.

View File

@@ -45,12 +45,22 @@
"index_web_pages_for_search": 1, "index_web_pages_for_search": 1,
"istable": 1, "istable": 1,
"links": [], "links": [],
<<<<<<< HEAD
"modified": "2021-11-25 10:27:51.712286", "modified": "2021-11-25 10:27:51.712286",
=======
"modified": "2024-03-27 13:05:58.308002",
>>>>>>> 329d14957b (fix: validate negative qty)
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "Accounts", "module": "Accounts",
"name": "Advance Tax", "name": "Advance Tax",
"owner": "Administrator", "owner": "Administrator",
"permissions": [], "permissions": [],
<<<<<<< HEAD
"sort_field": "modified", "sort_field": "modified",
"sort_order": "DESC" "sort_order": "DESC"
=======
"sort_field": "creation",
"sort_order": "DESC",
"states": []
>>>>>>> 329d14957b (fix: validate negative qty)
} }

View File

@@ -13,6 +13,10 @@
"col_break_1", "col_break_1",
"description", "description",
"included_in_paid_amount", "included_in_paid_amount",
<<<<<<< HEAD
=======
"set_by_item_tax_template",
>>>>>>> 329d14957b (fix: validate negative qty)
"accounting_dimensions_section", "accounting_dimensions_section",
"cost_center", "cost_center",
"dimension_col_break", "dimension_col_break",
@@ -20,11 +24,19 @@
"rate", "rate",
"section_break_9", "section_break_9",
"currency", "currency",
<<<<<<< HEAD
=======
"net_amount",
>>>>>>> 329d14957b (fix: validate negative qty)
"tax_amount", "tax_amount",
"total", "total",
"allocated_amount", "allocated_amount",
"column_break_13", "column_break_13",
"base_tax_amount", "base_tax_amount",
<<<<<<< HEAD
=======
"base_net_amount",
>>>>>>> 329d14957b (fix: validate negative qty)
"base_total" "base_total"
], ],
"fields": [ "fields": [
@@ -174,17 +186,58 @@
"label": "Account Currency", "label": "Account Currency",
"options": "Currency", "options": "Currency",
"read_only": 1 "read_only": 1
<<<<<<< HEAD
=======
},
{
"columns": 2,
"fieldname": "net_amount",
"fieldtype": "Currency",
"in_list_view": 1,
"label": "Net Amount",
"options": "currency",
"read_only": 1
},
{
"fieldname": "base_net_amount",
"fieldtype": "Currency",
"label": "Net Amount (Company Currency)",
"oldfieldname": "tax_amount",
"oldfieldtype": "Currency",
"options": "Company:company:default_currency",
"read_only": 1
},
{
"default": "0",
"fieldname": "set_by_item_tax_template",
"fieldtype": "Check",
"hidden": 1,
"label": "Set by Item Tax Template",
"print_hide": 1,
"read_only": 1,
"report_hide": 1
>>>>>>> 329d14957b (fix: validate negative qty)
} }
], ],
"index_web_pages_for_search": 1, "index_web_pages_for_search": 1,
"istable": 1, "istable": 1,
"links": [], "links": [],
<<<<<<< HEAD
"modified": "2021-11-25 11:10:10.945027", "modified": "2021-11-25 11:10:10.945027",
=======
"modified": "2024-11-22 19:16:22.346267",
>>>>>>> 329d14957b (fix: validate negative qty)
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "Accounts", "module": "Accounts",
"name": "Advance Taxes and Charges", "name": "Advance Taxes and Charges",
"owner": "Administrator", "owner": "Administrator",
"permissions": [], "permissions": [],
<<<<<<< HEAD
"sort_field": "modified", "sort_field": "modified",
"sort_order": "ASC" "sort_order": "ASC"
=======
"sort_field": "creation",
"sort_order": "ASC",
"states": []
>>>>>>> 329d14957b (fix: validate negative qty)
} }

View File

@@ -18,6 +18,10 @@ class AdvanceTaxesandCharges(Document):
account_head: DF.Link account_head: DF.Link
add_deduct_tax: DF.Literal["Add", "Deduct"] add_deduct_tax: DF.Literal["Add", "Deduct"]
allocated_amount: DF.Currency allocated_amount: DF.Currency
<<<<<<< HEAD
=======
base_net_amount: DF.Currency
>>>>>>> 329d14957b (fix: validate negative qty)
base_tax_amount: DF.Currency base_tax_amount: DF.Currency
base_total: DF.Currency base_total: DF.Currency
charge_type: DF.Literal[ charge_type: DF.Literal[
@@ -27,11 +31,19 @@ class AdvanceTaxesandCharges(Document):
currency: DF.Link | None currency: DF.Link | None
description: DF.SmallText description: DF.SmallText
included_in_paid_amount: DF.Check included_in_paid_amount: DF.Check
<<<<<<< HEAD
=======
net_amount: DF.Currency
>>>>>>> 329d14957b (fix: validate negative qty)
parent: DF.Data parent: DF.Data
parentfield: DF.Data parentfield: DF.Data
parenttype: DF.Data parenttype: DF.Data
rate: DF.Float rate: DF.Float
row_id: DF.Data | None row_id: DF.Data | None
<<<<<<< HEAD
=======
set_by_item_tax_template: DF.Check
>>>>>>> 329d14957b (fix: validate negative qty)
tax_amount: DF.Currency tax_amount: DF.Currency
total: DF.Currency total: DF.Currency
# end: auto-generated types # end: auto-generated types

View File

@@ -14,30 +14,48 @@
"fieldtype": "Link", "fieldtype": "Link",
"label": "Accounting Dimension", "label": "Accounting Dimension",
"options": "DocType", "options": "DocType",
<<<<<<< HEAD
"read_only": 1, "read_only": 1,
"show_days": 1, "show_days": 1,
"show_seconds": 1 "show_seconds": 1
=======
"read_only": 1
>>>>>>> 329d14957b (fix: validate negative qty)
}, },
{ {
"fieldname": "dimension_value", "fieldname": "dimension_value",
"fieldtype": "Dynamic Link", "fieldtype": "Dynamic Link",
"in_list_view": 1, "in_list_view": 1,
<<<<<<< HEAD
"options": "accounting_dimension", "options": "accounting_dimension",
"show_days": 1, "show_days": 1,
"show_seconds": 1 "show_seconds": 1
=======
"options": "accounting_dimension"
>>>>>>> 329d14957b (fix: validate negative qty)
} }
], ],
"index_web_pages_for_search": 1, "index_web_pages_for_search": 1,
"istable": 1, "istable": 1,
"links": [], "links": [],
<<<<<<< HEAD
"modified": "2020-11-23 09:56:19.744200", "modified": "2020-11-23 09:56:19.744200",
=======
"modified": "2024-03-27 13:05:58.587487",
>>>>>>> 329d14957b (fix: validate negative qty)
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "Accounts", "module": "Accounts",
"name": "Allowed Dimension", "name": "Allowed Dimension",
"owner": "Administrator", "owner": "Administrator",
"permissions": [], "permissions": [],
"quick_entry": 1, "quick_entry": 1,
<<<<<<< HEAD
"sort_field": "modified", "sort_field": "modified",
"sort_order": "DESC", "sort_order": "DESC",
=======
"sort_field": "creation",
"sort_order": "DESC",
"states": [],
>>>>>>> 329d14957b (fix: validate negative qty)
"track_changes": 1 "track_changes": 1
} }

View File

@@ -20,14 +20,22 @@
], ],
"istable": 1, "istable": 1,
"links": [], "links": [],
<<<<<<< HEAD
"modified": "2024-01-03 11:13:02.669632", "modified": "2024-01-03 11:13:02.669632",
=======
"modified": "2024-03-27 13:05:58.698893",
>>>>>>> 329d14957b (fix: validate negative qty)
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "Accounts", "module": "Accounts",
"name": "Allowed To Transact With", "name": "Allowed To Transact With",
"owner": "Administrator", "owner": "Administrator",
"permissions": [], "permissions": [],
"quick_entry": 1, "quick_entry": 1,
<<<<<<< HEAD
"sort_field": "modified", "sort_field": "modified",
=======
"sort_field": "creation",
>>>>>>> 329d14957b (fix: validate negative qty)
"sort_order": "DESC", "sort_order": "DESC",
"states": [], "states": [],
"track_changes": 1 "track_changes": 1

View File

@@ -15,9 +15,13 @@
"in_list_view": 1, "in_list_view": 1,
"label": "Accounts", "label": "Accounts",
"options": "Account", "options": "Account",
<<<<<<< HEAD
"reqd": 1, "reqd": 1,
"show_days": 1, "show_days": 1,
"show_seconds": 1 "show_seconds": 1
=======
"reqd": 1
>>>>>>> 329d14957b (fix: validate negative qty)
}, },
{ {
"columns": 2, "columns": 2,
@@ -25,22 +29,36 @@
"fieldname": "is_mandatory", "fieldname": "is_mandatory",
"fieldtype": "Check", "fieldtype": "Check",
"in_list_view": 1, "in_list_view": 1,
<<<<<<< HEAD
"label": "Is Mandatory", "label": "Is Mandatory",
"show_days": 1, "show_days": 1,
"show_seconds": 1 "show_seconds": 1
=======
"label": "Is Mandatory"
>>>>>>> 329d14957b (fix: validate negative qty)
} }
], ],
"index_web_pages_for_search": 1, "index_web_pages_for_search": 1,
"istable": 1, "istable": 1,
"links": [], "links": [],
<<<<<<< HEAD
"modified": "2020-11-22 19:55:13.324136", "modified": "2020-11-22 19:55:13.324136",
=======
"modified": "2024-03-27 13:05:59.168897",
>>>>>>> 329d14957b (fix: validate negative qty)
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "Accounts", "module": "Accounts",
"name": "Applicable On Account", "name": "Applicable On Account",
"owner": "Administrator", "owner": "Administrator",
"permissions": [], "permissions": [],
"quick_entry": 1, "quick_entry": 1,
<<<<<<< HEAD
"sort_field": "modified", "sort_field": "modified",
"sort_order": "DESC", "sort_order": "DESC",
=======
"sort_field": "creation",
"sort_order": "DESC",
"states": [],
>>>>>>> 329d14957b (fix: validate negative qty)
"track_changes": 1 "track_changes": 1
} }

View File

@@ -101,7 +101,11 @@
} }
], ],
"links": [], "links": [],
<<<<<<< HEAD
"modified": "2020-07-17 14:00:13.105433", "modified": "2020-07-17 14:00:13.105433",
=======
"modified": "2024-03-27 13:06:36.896195",
>>>>>>> 329d14957b (fix: validate negative qty)
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "Accounts", "module": "Accounts",
"name": "Bank", "name": "Bank",
@@ -121,7 +125,13 @@
} }
], ],
"quick_entry": 1, "quick_entry": 1,
<<<<<<< HEAD
"sort_field": "modified", "sort_field": "modified",
"sort_order": "DESC", "sort_order": "DESC",
=======
"sort_field": "creation",
"sort_order": "DESC",
"states": [],
>>>>>>> 329d14957b (fix: validate negative qty)
"track_changes": 1 "track_changes": 1
} }

View File

@@ -1,8 +1,17 @@
# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors # Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors
# See license.txt # See license.txt
<<<<<<< HEAD
import unittest import unittest
class TestBank(unittest.TestCase): class TestBank(unittest.TestCase):
=======
import unittest
from frappe.tests import IntegrationTestCase
class TestBank(IntegrationTestCase):
>>>>>>> 329d14957b (fix: validate negative qty)
pass pass

View File

@@ -283,8 +283,16 @@
} }
], ],
"search_fields": "bank,account", "search_fields": "bank,account",
<<<<<<< HEAD
"sort_field": "modified", "sort_field": "modified",
"sort_order": "DESC", "sort_order": "DESC",
"states": [], "states": [],
"track_changes": 1 "track_changes": 1
} }
=======
"sort_field": "creation",
"sort_order": "DESC",
"states": [],
"track_changes": 1
}
>>>>>>> 329d14957b (fix: validate negative qty)

View File

@@ -70,7 +70,11 @@ class BankAccount(Document):
def validate_company(self): def validate_company(self):
if self.is_company_account and not self.company: if self.is_company_account and not self.company:
<<<<<<< HEAD
frappe.throw(_("Company is manadatory for company account")) frappe.throw(_("Company is manadatory for company account"))
=======
frappe.throw(_("Company is mandatory for company account"))
>>>>>>> 329d14957b (fix: validate negative qty)
def validate_iban(self): def validate_iban(self):
""" """

View File

@@ -1,15 +1,25 @@
# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
# See license.txt # See license.txt
<<<<<<< HEAD
=======
>>>>>>> 329d14957b (fix: validate negative qty)
import unittest import unittest
import frappe import frappe
from frappe import ValidationError from frappe import ValidationError
<<<<<<< HEAD
# test_records = frappe.get_test_records('Bank Account') # test_records = frappe.get_test_records('Bank Account')
class TestBankAccount(unittest.TestCase): class TestBankAccount(unittest.TestCase):
=======
from frappe.tests import IntegrationTestCase
class TestBankAccount(IntegrationTestCase):
>>>>>>> 329d14957b (fix: validate negative qty)
def test_validate_iban(self): def test_validate_iban(self):
valid_ibans = [ valid_ibans = [
"GB82 WEST 1234 5698 7654 32", "GB82 WEST 1234 5698 7654 32",

View File

@@ -1,4 +1,5 @@
{ {
<<<<<<< HEAD
"allow_copy": 0, "allow_copy": 0,
"allow_events_in_timeline": 0, "allow_events_in_timeline": 0,
"allow_guest_to_view": 0, "allow_guest_to_view": 0,
@@ -67,17 +68,50 @@
{ {
"amend": 0, "amend": 0,
"cancel": 0, "cancel": 0,
=======
"actions": [],
"allow_import": 1,
"allow_rename": 1,
"autoname": "field:account_subtype",
"creation": "2018-10-25 15:46:08.054586",
"doctype": "DocType",
"editable_grid": 1,
"engine": "InnoDB",
"field_order": [
"account_subtype"
],
"fields": [
{
"fieldname": "account_subtype",
"fieldtype": "Data",
"label": "Account Subtype",
"unique": 1
}
],
"links": [],
"modified": "2024-03-27 13:06:37.221876",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Bank Account Subtype",
"owner": "Administrator",
"permissions": [
{
>>>>>>> 329d14957b (fix: validate negative qty)
"create": 1, "create": 1,
"delete": 1, "delete": 1,
"email": 1, "email": 1,
"export": 1, "export": 1,
<<<<<<< HEAD
"if_owner": 0, "if_owner": 0,
"import": 0, "import": 0,
"permlevel": 0, "permlevel": 0,
=======
>>>>>>> 329d14957b (fix: validate negative qty)
"print": 1, "print": 1,
"read": 1, "read": 1,
"report": 1, "report": 1,
"role": "System Manager", "role": "System Manager",
<<<<<<< HEAD
"set_user_permissions": 0, "set_user_permissions": 0,
"share": 1, "share": 1,
"submit": 0, "submit": 0,
@@ -86,17 +120,27 @@
{ {
"amend": 0, "amend": 0,
"cancel": 0, "cancel": 0,
=======
"share": 1,
"write": 1
},
{
>>>>>>> 329d14957b (fix: validate negative qty)
"create": 1, "create": 1,
"delete": 1, "delete": 1,
"email": 1, "email": 1,
"export": 1, "export": 1,
<<<<<<< HEAD
"if_owner": 0, "if_owner": 0,
"import": 0, "import": 0,
"permlevel": 0, "permlevel": 0,
=======
>>>>>>> 329d14957b (fix: validate negative qty)
"print": 1, "print": 1,
"read": 1, "read": 1,
"report": 1, "report": 1,
"role": "Accounts Manager", "role": "Accounts Manager",
<<<<<<< HEAD
"set_user_permissions": 0, "set_user_permissions": 0,
"share": 1, "share": 1,
"submit": 0, "submit": 0,
@@ -105,24 +149,38 @@
{ {
"amend": 0, "amend": 0,
"cancel": 0, "cancel": 0,
=======
"share": 1,
"write": 1
},
{
>>>>>>> 329d14957b (fix: validate negative qty)
"create": 1, "create": 1,
"delete": 1, "delete": 1,
"email": 1, "email": 1,
"export": 1, "export": 1,
<<<<<<< HEAD
"if_owner": 0, "if_owner": 0,
"import": 0, "import": 0,
"permlevel": 0, "permlevel": 0,
=======
>>>>>>> 329d14957b (fix: validate negative qty)
"print": 1, "print": 1,
"read": 1, "read": 1,
"report": 1, "report": 1,
"role": "Accounts User", "role": "Accounts User",
<<<<<<< HEAD
"set_user_permissions": 0, "set_user_permissions": 0,
"share": 1, "share": 1,
"submit": 0, "submit": 0,
=======
"share": 1,
>>>>>>> 329d14957b (fix: validate negative qty)
"write": 1 "write": 1
} }
], ],
"quick_entry": 1, "quick_entry": 1,
<<<<<<< HEAD
"read_only": 0, "read_only": 0,
"read_only_onload": 0, "read_only_onload": 0,
"show_name_in_global_search": 0, "show_name_in_global_search": 0,
@@ -131,4 +189,9 @@
"track_changes": 0, "track_changes": 0,
"track_seen": 0, "track_seen": 0,
"track_views": 0 "track_views": 0
=======
"sort_field": "creation",
"sort_order": "DESC",
"states": []
>>>>>>> 329d14957b (fix: validate negative qty)
} }

View File

@@ -1,8 +1,17 @@
# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors # Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors
# See license.txt # See license.txt
<<<<<<< HEAD
import unittest import unittest
class TestBankAccountSubtype(unittest.TestCase): class TestBankAccountSubtype(unittest.TestCase):
=======
import unittest
from frappe.tests import IntegrationTestCase
class TestBankAccountSubtype(IntegrationTestCase):
>>>>>>> 329d14957b (fix: validate negative qty)
pass pass

View File

@@ -19,7 +19,11 @@
} }
], ],
"links": [], "links": [],
<<<<<<< HEAD
"modified": "2020-04-10 21:13:09.137898", "modified": "2020-04-10 21:13:09.137898",
=======
"modified": "2024-03-27 13:06:37.347035",
>>>>>>> 329d14957b (fix: validate negative qty)
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "Accounts", "module": "Accounts",
"name": "Bank Account Type", "name": "Bank Account Type",
@@ -63,6 +67,12 @@
} }
], ],
"quick_entry": 1, "quick_entry": 1,
<<<<<<< HEAD
"sort_field": "modified", "sort_field": "modified",
"sort_order": "DESC" "sort_order": "DESC"
=======
"sort_field": "creation",
"sort_order": "DESC",
"states": []
>>>>>>> 329d14957b (fix: validate negative qty)
} }

View File

@@ -1,9 +1,19 @@
# Copyright (c) 2020, Frappe Technologies Pvt. Ltd. and Contributors # Copyright (c) 2020, Frappe Technologies Pvt. Ltd. and Contributors
# See license.txt # See license.txt
<<<<<<< HEAD
# import frappe # import frappe
import unittest import unittest
class TestBankAccountType(unittest.TestCase): class TestBankAccountType(unittest.TestCase):
=======
# import frappe
import unittest
from frappe.tests import IntegrationTestCase
class TestBankAccountType(IntegrationTestCase):
>>>>>>> 329d14957b (fix: validate negative qty)
pass pass

View File

@@ -91,7 +91,11 @@
"idx": 1, "idx": 1,
"issingle": 1, "issingle": 1,
"links": [], "links": [],
<<<<<<< HEAD
"modified": "2022-11-28 17:24:13.008692", "modified": "2022-11-28 17:24:13.008692",
=======
"modified": "2024-03-27 13:06:37.477927",
>>>>>>> 329d14957b (fix: validate negative qty)
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "Accounts", "module": "Accounts",
"name": "Bank Clearance", "name": "Bank Clearance",
@@ -107,7 +111,11 @@
], ],
"quick_entry": 1, "quick_entry": 1,
"read_only": 1, "read_only": 1,
<<<<<<< HEAD
"sort_field": "modified", "sort_field": "modified",
=======
"sort_field": "creation",
>>>>>>> 329d14957b (fix: validate negative qty)
"sort_order": "ASC", "sort_order": "ASC",
"states": [] "states": []
} }

View File

@@ -1,9 +1,16 @@
# Copyright (c) 2020, Frappe Technologies Pvt. Ltd. and Contributors # Copyright (c) 2020, Frappe Technologies Pvt. Ltd. and Contributors
# See license.txt # See license.txt
<<<<<<< HEAD
import unittest import unittest
import frappe import frappe
=======
import unittest
import frappe
from frappe.tests import IntegrationTestCase
>>>>>>> 329d14957b (fix: validate negative qty)
from frappe.utils import add_months, getdate from frappe.utils import add_months, getdate
from erpnext.accounts.doctype.cost_center.test_cost_center import create_cost_center from erpnext.accounts.doctype.cost_center.test_cost_center import create_cost_center
@@ -15,9 +22,16 @@ from erpnext.stock.doctype.warehouse.test_warehouse import create_warehouse
from erpnext.tests.utils import if_lending_app_installed, if_lending_app_not_installed from erpnext.tests.utils import if_lending_app_installed, if_lending_app_not_installed
<<<<<<< HEAD
class TestBankClearance(unittest.TestCase): class TestBankClearance(unittest.TestCase):
@classmethod @classmethod
def setUpClass(cls): def setUpClass(cls):
=======
class TestBankClearance(IntegrationTestCase):
@classmethod
def setUpClass(cls):
super().setUpClass()
>>>>>>> 329d14957b (fix: validate negative qty)
create_warehouse( create_warehouse(
warehouse_name="_Test Warehouse", warehouse_name="_Test Warehouse",
properties={"parent_warehouse": "All Warehouses - _TC"}, properties={"parent_warehouse": "All Warehouses - _TC"},
@@ -26,9 +40,12 @@ class TestBankClearance(unittest.TestCase):
create_item("_Test Item") create_item("_Test Item")
create_cost_center(cost_center_name="_Test Cost Center", company="_Test Company") create_cost_center(cost_center_name="_Test Cost Center", company="_Test Company")
<<<<<<< HEAD
clear_payment_entries() clear_payment_entries()
clear_loan_transactions() clear_loan_transactions()
clear_pos_sales_invoices() clear_pos_sales_invoices()
=======
>>>>>>> 329d14957b (fix: validate negative qty)
make_bank_account() make_bank_account()
add_transactions() add_transactions()
@@ -123,6 +140,7 @@ class TestBankClearance(unittest.TestCase):
self.assertEqual(si_clearance_date, date) self.assertEqual(si_clearance_date, date)
<<<<<<< HEAD
def clear_payment_entries(): def clear_payment_entries():
frappe.db.delete("Payment Entry") frappe.db.delete("Payment Entry")
@@ -140,6 +158,8 @@ def clear_loan_transactions():
frappe.db.delete(dt) frappe.db.delete(dt)
=======
>>>>>>> 329d14957b (fix: validate negative qty)
def make_bank_account(): def make_bank_account():
if not frappe.db.get_value("Account", "_Test Bank Clearance - _TC"): if not frappe.db.get_value("Account", "_Test Bank Clearance - _TC"):
frappe.get_doc( frappe.get_doc(

View File

@@ -1,4 +1,5 @@
{ {
<<<<<<< HEAD
"allow_copy": 0, "allow_copy": 0,
"allow_events_in_timeline": 0, "allow_events_in_timeline": 0,
"allow_guest_to_view": 0, "allow_guest_to_view": 0,
@@ -337,4 +338,116 @@
"track_changes": 0, "track_changes": 0,
"track_seen": 0, "track_seen": 0,
"track_views": 0 "track_views": 0
=======
"actions": [],
"creation": "2013-02-22 01:27:37",
"doctype": "DocType",
"editable_grid": 1,
"engine": "InnoDB",
"field_order": [
"payment_document",
"payment_entry",
"against_account",
"amount",
"column_break_5",
"posting_date",
"cheque_number",
"cheque_date",
"clearance_date"
],
"fields": [
{
"fieldname": "payment_document",
"fieldtype": "Link",
"label": "Payment Document",
"options": "DocType"
},
{
"columns": 2,
"fieldname": "payment_entry",
"fieldtype": "Dynamic Link",
"in_list_view": 1,
"label": "Payment Entry",
"oldfieldname": "voucher_id",
"oldfieldtype": "Link",
"options": "payment_document",
"width": "50"
},
{
"columns": 2,
"fieldname": "against_account",
"fieldtype": "Data",
"in_list_view": 1,
"label": "Against Account",
"oldfieldname": "against_account",
"oldfieldtype": "Data",
"read_only": 1,
"width": "15"
},
{
"columns": 2,
"fieldname": "amount",
"fieldtype": "Data",
"in_list_view": 1,
"label": "Amount",
"oldfieldname": "debit",
"oldfieldtype": "Currency",
"read_only": 1
},
{
"fieldname": "column_break_5",
"fieldtype": "Column Break",
"width": "50%"
},
{
"columns": 2,
"fieldname": "posting_date",
"fieldtype": "Date",
"label": "Posting Date",
"oldfieldname": "posting_date",
"oldfieldtype": "Date",
"read_only": 1
},
{
"columns": 2,
"fieldname": "cheque_number",
"fieldtype": "Data",
"in_list_view": 1,
"label": "Cheque Number",
"oldfieldname": "cheque_number",
"oldfieldtype": "Data",
"read_only": 1
},
{
"fieldname": "cheque_date",
"fieldtype": "Date",
"label": "Cheque Date",
"oldfieldname": "cheque_date",
"oldfieldtype": "Date",
"read_only": 1
},
{
"columns": 2,
"fieldname": "clearance_date",
"fieldtype": "Date",
"in_list_view": 1,
"label": "Clearance Date",
"oldfieldname": "clearance_date",
"oldfieldtype": "Date"
}
],
"idx": 1,
"istable": 1,
"links": [],
"modified": "2024-03-27 13:06:37.609319",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Bank Clearance Detail",
"owner": "Administrator",
"permissions": [],
"quick_entry": 1,
"sort_field": "creation",
"sort_order": "ASC",
"states": []
>>>>>>> 329d14957b (fix: validate negative qty)
} }

View File

@@ -1,4 +1,5 @@
{ {
<<<<<<< HEAD
"allow_copy": 0, "allow_copy": 0,
"allow_guest_to_view": 0, "allow_guest_to_view": 0,
"allow_import": 0, "allow_import": 0,
@@ -1053,4 +1054,262 @@
"track_changes": 0, "track_changes": 0,
"track_seen": 0, "track_seen": 0,
"track_views": 0 "track_views": 0
=======
"actions": [],
"autoname": "ACC-BG-.YYYY.-.#####",
"creation": "2016-12-17 10:43:35.731631",
"doctype": "DocType",
"document_type": "Document",
"editable_grid": 1,
"engine": "InnoDB",
"field_order": [
"bg_type",
"reference_doctype",
"reference_docname",
"customer",
"supplier",
"project",
"column_break_6",
"amount",
"start_date",
"validity",
"end_date",
"bank_account_info",
"bank",
"bank_account",
"account",
"bank_account_no",
"column_break_17",
"iban",
"branch_code",
"swift_number",
"section_break_14",
"more_information",
"margin_details",
"bank_guarantee_number",
"name_of_beneficiary",
"column_break_19",
"margin_money",
"charges",
"fixed_deposit_number",
"amended_from"
],
"fields": [
{
"fieldname": "bg_type",
"fieldtype": "Select",
"label": "Bank Guarantee Type",
"options": "\nReceiving\nProviding",
"reqd": 1
},
{
"fieldname": "reference_doctype",
"fieldtype": "Link",
"label": "Reference Document Type",
"options": "DocType",
"read_only": 1
},
{
"fieldname": "reference_docname",
"fieldtype": "Dynamic Link",
"label": "Reference Document Name",
"options": "reference_doctype"
},
{
"depends_on": "eval: doc.bg_type == \"Receiving\"",
"fieldname": "customer",
"fieldtype": "Link",
"label": "Customer",
"options": "Customer"
},
{
"depends_on": "eval: doc.bg_type == \"Providing\"",
"fieldname": "supplier",
"fieldtype": "Link",
"label": "Supplier",
"options": "Supplier"
},
{
"allow_on_submit": 1,
"fieldname": "project",
"fieldtype": "Link",
"label": "Project",
"options": "Project"
},
{
"fieldname": "column_break_6",
"fieldtype": "Column Break"
},
{
"fieldname": "amount",
"fieldtype": "Currency",
"in_list_view": 1,
"label": "Amount",
"reqd": 1
},
{
"fieldname": "start_date",
"fieldtype": "Date",
"label": "Start Date",
"reqd": 1
},
{
"fieldname": "validity",
"fieldtype": "Int",
"label": "Validity in Days"
},
{
"fieldname": "end_date",
"fieldtype": "Date",
"label": "End Date",
"read_only": 1
},
{
"fieldname": "bank_account_info",
"fieldtype": "Section Break",
"label": "Bank Account Info"
},
{
"fieldname": "bank",
"fieldtype": "Link",
"label": "Bank",
"options": "Bank"
},
{
"fieldname": "bank_account",
"fieldtype": "Link",
"label": "Bank Account",
"options": "Bank Account"
},
{
"fieldname": "account",
"fieldtype": "Link",
"label": "Account",
"options": "Account",
"read_only": 1
},
{
"fieldname": "bank_account_no",
"fieldtype": "Data",
"label": "Bank Account No",
"read_only": 1
},
{
"fieldname": "column_break_17",
"fieldtype": "Column Break"
},
{
"fieldname": "iban",
"fieldtype": "Data",
"label": "IBAN",
"read_only": 1
},
{
"fieldname": "branch_code",
"fieldtype": "Data",
"label": "Branch Code",
"read_only": 1
},
{
"fieldname": "swift_number",
"fieldtype": "Data",
"label": "SWIFT number",
"read_only": 1
},
{
"fieldname": "section_break_14",
"fieldtype": "Section Break"
},
{
"fieldname": "more_information",
"fieldtype": "Text Editor",
"label": "Clauses and Conditions"
},
{
"fieldname": "margin_details",
"fieldtype": "Section Break",
"label": "Other Details"
},
{
"fieldname": "bank_guarantee_number",
"fieldtype": "Data",
"label": "Bank Guarantee Number",
"unique": 1
},
{
"fieldname": "name_of_beneficiary",
"fieldtype": "Data",
"label": "Name of Beneficiary"
},
{
"fieldname": "column_break_19",
"fieldtype": "Column Break"
},
{
"fieldname": "margin_money",
"fieldtype": "Currency",
"label": "Margin Money"
},
{
"fieldname": "charges",
"fieldtype": "Currency",
"label": "Charges Incurred"
},
{
"fieldname": "fixed_deposit_number",
"fieldtype": "Data",
"label": "Fixed Deposit Number"
},
{
"fieldname": "amended_from",
"fieldtype": "Link",
"label": "Amended From",
"no_copy": 1,
"options": "Bank Guarantee",
"print_hide": 1,
"read_only": 1
}
],
"is_submittable": 1,
"links": [],
"modified": "2024-03-27 13:06:37.731207",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Bank Guarantee",
"owner": "Administrator",
"permissions": [
{
"create": 1,
"email": 1,
"export": 1,
"print": 1,
"read": 1,
"report": 1,
"role": "Accounts User",
"share": 1,
"submit": 1,
"write": 1
},
{
"cancel": 1,
"create": 1,
"delete": 1,
"email": 1,
"export": 1,
"print": 1,
"read": 1,
"report": 1,
"role": "Accounts Manager",
"share": 1,
"submit": 1,
"write": 1
}
],
"quick_entry": 1,
"search_fields": "customer",
"sort_field": "creation",
"sort_order": "DESC",
"states": [],
"title_field": "customer"
>>>>>>> 329d14957b (fix: validate negative qty)
} }

View File

@@ -48,11 +48,19 @@ class BankGuarantee(Document):
def on_submit(self): def on_submit(self):
if not self.bank_guarantee_number: if not self.bank_guarantee_number:
<<<<<<< HEAD
frappe.throw(_("Enter the Bank Guarantee Number before submittting.")) frappe.throw(_("Enter the Bank Guarantee Number before submittting."))
if not self.name_of_beneficiary: if not self.name_of_beneficiary:
frappe.throw(_("Enter the name of the Beneficiary before submittting.")) frappe.throw(_("Enter the name of the Beneficiary before submittting."))
if not self.bank: if not self.bank:
frappe.throw(_("Enter the name of the bank or lending institution before submittting.")) frappe.throw(_("Enter the name of the bank or lending institution before submittting."))
=======
frappe.throw(_("Enter the Bank Guarantee Number before submitting."))
if not self.name_of_beneficiary:
frappe.throw(_("Enter the name of the Beneficiary before submitting."))
if not self.bank:
frappe.throw(_("Enter the name of the bank or lending institution before submitting."))
>>>>>>> 329d14957b (fix: validate negative qty)
@frappe.whitelist() @frappe.whitelist()

View File

@@ -1,8 +1,17 @@
# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors # Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors
# See license.txt # See license.txt
<<<<<<< HEAD
import unittest import unittest
class TestBankGuarantee(unittest.TestCase): class TestBankGuarantee(unittest.TestCase):
=======
import unittest
from frappe.tests import IntegrationTestCase
class TestBankGuarantee(IntegrationTestCase):
>>>>>>> 329d14957b (fix: validate negative qty)
pass pass

View File

@@ -137,7 +137,14 @@
} }
], ],
"quick_entry": 1, "quick_entry": 1,
<<<<<<< HEAD
"sort_field": "modified", "sort_field": "modified",
"sort_order": "DESC", "sort_order": "DESC",
"states": [] "states": []
} }
=======
"sort_field": "creation",
"sort_order": "DESC",
"states": []
}
>>>>>>> 329d14957b (fix: validate negative qty)

View File

@@ -4,7 +4,11 @@
import frappe import frappe
from frappe import qb from frappe import qb
<<<<<<< HEAD
from frappe.tests.utils import FrappeTestCase from frappe.tests.utils import FrappeTestCase
=======
from frappe.tests import IntegrationTestCase
>>>>>>> 329d14957b (fix: validate negative qty)
from frappe.utils import add_days, today from frappe.utils import add_days, today
from erpnext.accounts.doctype.bank_reconciliation_tool.bank_reconciliation_tool import ( from erpnext.accounts.doctype.bank_reconciliation_tool.bank_reconciliation_tool import (
@@ -15,7 +19,11 @@ from erpnext.accounts.doctype.payment_entry.test_payment_entry import create_pay
from erpnext.accounts.test.accounts_mixin import AccountsTestMixin from erpnext.accounts.test.accounts_mixin import AccountsTestMixin
<<<<<<< HEAD
class TestBankReconciliationTool(AccountsTestMixin, FrappeTestCase): class TestBankReconciliationTool(AccountsTestMixin, FrappeTestCase):
=======
class TestBankReconciliationTool(AccountsTestMixin, IntegrationTestCase):
>>>>>>> 329d14957b (fix: validate negative qty)
def setUp(self): def setUp(self):
self.create_company() self.create_company()
self.create_customer() self.create_customer()

View File

@@ -2,6 +2,19 @@
// For license information, please see license.txt // For license information, please see license.txt
frappe.ui.form.on("Bank Statement Import", { frappe.ui.form.on("Bank Statement Import", {
<<<<<<< HEAD
=======
onload(frm) {
frm.set_query("bank_account", function (doc) {
return {
filters: {
company: doc.company,
},
};
});
},
>>>>>>> 329d14957b (fix: validate negative qty)
setup(frm) { setup(frm) {
frappe.realtime.on("data_import_refresh", ({ data_import }) => { frappe.realtime.on("data_import_refresh", ({ data_import }) => {
frm.import_in_progress = false; frm.import_in_progress = false;

View File

@@ -230,7 +230,15 @@
"write": 1 "write": 1
} }
], ],
<<<<<<< HEAD
"sort_field": "modified", "sort_field": "modified",
"sort_order": "DESC", "sort_order": "DESC",
"track_changes": 1 "track_changes": 1
} }
=======
"sort_field": "creation",
"sort_order": "DESC",
"states": [],
"track_changes": 1
}
>>>>>>> 329d14957b (fix: validate negative qty)

View File

@@ -79,7 +79,12 @@ class BankStatementImport(DataImport):
from frappe.utils.background_jobs import is_job_enqueued from frappe.utils.background_jobs import is_job_enqueued
from frappe.utils.scheduler import is_scheduler_inactive from frappe.utils.scheduler import is_scheduler_inactive
<<<<<<< HEAD
if is_scheduler_inactive() and not frappe.flags.in_test: if is_scheduler_inactive() and not frappe.flags.in_test:
=======
run_now = frappe.flags.in_test or frappe.conf.developer_mode
if is_scheduler_inactive() and not run_now:
>>>>>>> 329d14957b (fix: validate negative qty)
frappe.throw(_("Scheduler is inactive. Cannot import data."), title=_("Scheduler Inactive")) frappe.throw(_("Scheduler is inactive. Cannot import data."), title=_("Scheduler Inactive"))
job_id = f"bank_statement_import::{self.name}" job_id = f"bank_statement_import::{self.name}"
@@ -96,7 +101,11 @@ class BankStatementImport(DataImport):
google_sheets_url=self.google_sheets_url, google_sheets_url=self.google_sheets_url,
bank=self.bank, bank=self.bank,
template_options=self.template_options, template_options=self.template_options,
<<<<<<< HEAD
now=frappe.conf.developer_mode or frappe.flags.in_test, now=frappe.conf.developer_mode or frappe.flags.in_test,
=======
now=run_now,
>>>>>>> 329d14957b (fix: validate negative qty)
) )
return True return True

View File

@@ -1,9 +1,19 @@
# Copyright (c) 2020, Frappe Technologies and Contributors # Copyright (c) 2020, Frappe Technologies and Contributors
# See license.txt # See license.txt
<<<<<<< HEAD
# import frappe # import frappe
import unittest import unittest
class TestBankStatementImport(unittest.TestCase): class TestBankStatementImport(unittest.TestCase):
=======
# import frappe
import unittest
from frappe.tests import IntegrationTestCase
class TestBankStatementImport(IntegrationTestCase):
>>>>>>> 329d14957b (fix: validate negative qty)
pass pass

View File

@@ -113,7 +113,12 @@ class AutoMatchbyPartyNameDescription:
for party in parties: for party in parties:
filters = {"status": "Active"} if party == "Employee" else {"disabled": 0} filters = {"status": "Active"} if party == "Employee" else {"disabled": 0}
<<<<<<< HEAD
names = frappe.get_all(party, filters=filters, pluck=party.lower() + "_name") names = frappe.get_all(party, filters=filters, pluck=party.lower() + "_name")
=======
field = party.lower() + "_name"
names = frappe.get_all(party, filters=filters, fields=[f"{field} as party_name", "name"])
>>>>>>> 329d14957b (fix: validate negative qty)
for field in ["bank_party_name", "description"]: for field in ["bank_party_name", "description"]:
if not self.get(field): if not self.get(field):
@@ -132,7 +137,15 @@ class AutoMatchbyPartyNameDescription:
def fuzzy_search_and_return_result(self, party, names, field) -> tuple | None: def fuzzy_search_and_return_result(self, party, names, field) -> tuple | None:
skip = False skip = False
<<<<<<< HEAD
result = process.extract(query=self.get(field), choices=names, scorer=fuzz.token_set_ratio) result = process.extract(query=self.get(field), choices=names, scorer=fuzz.token_set_ratio)
=======
result = process.extract(
query=self.get(field),
choices={row.get("name"): row.get("party_name") for row in names},
scorer=fuzz.token_set_ratio,
)
>>>>>>> 329d14957b (fix: validate negative qty)
party_name, skip = self.process_fuzzy_result(result) party_name, skip = self.process_fuzzy_result(result)
if not party_name: if not party_name:
@@ -150,14 +163,22 @@ class AutoMatchbyPartyNameDescription:
Returns: Result, Skip (whether or not to discontinue matching) Returns: Result, Skip (whether or not to discontinue matching)
""" """
<<<<<<< HEAD
PARTY, SCORE, CUTOFF = 0, 1, 80 PARTY, SCORE, CUTOFF = 0, 1, 80
=======
SCORE, PARTY_ID, CUTOFF = 1, 2, 80
>>>>>>> 329d14957b (fix: validate negative qty)
if not result or not len(result): if not result or not len(result):
return None, False return None, False
first_result = result[0] first_result = result[0]
if len(result) == 1: if len(result) == 1:
<<<<<<< HEAD
return (first_result[PARTY] if first_result[SCORE] > CUTOFF else None), True return (first_result[PARTY] if first_result[SCORE] > CUTOFF else None), True
=======
return (first_result[PARTY_ID] if first_result[SCORE] > CUTOFF else None), True
>>>>>>> 329d14957b (fix: validate negative qty)
second_result = result[1] second_result = result[1]
if first_result[SCORE] > CUTOFF: if first_result[SCORE] > CUTOFF:
@@ -166,7 +187,11 @@ class AutoMatchbyPartyNameDescription:
if first_result[SCORE] == second_result[SCORE]: if first_result[SCORE] == second_result[SCORE]:
return None, True return None, True
<<<<<<< HEAD
return first_result[PARTY], True return first_result[PARTY], True
=======
return first_result[PARTY_ID], True
>>>>>>> 329d14957b (fix: validate negative qty)
else: else:
return None, False return None, False

View File

@@ -208,6 +208,7 @@ class BankTransaction(Document):
if self.party_type and self.party: if self.party_type and self.party:
return return
<<<<<<< HEAD
result = None result = None
try: try:
result = AutoMatchParty( result = AutoMatchParty(
@@ -219,6 +220,15 @@ class BankTransaction(Document):
).match() ).match()
except Exception: except Exception:
frappe.log_error(title=_("Error in party matching for Bank Transaction {0}").format(self.name)) frappe.log_error(title=_("Error in party matching for Bank Transaction {0}").format(self.name))
=======
result = AutoMatchParty(
bank_party_account_number=self.bank_party_account_number,
bank_party_iban=self.bank_party_iban,
bank_party_name=self.bank_party_name,
description=self.description,
deposit=self.deposit,
).match()
>>>>>>> 329d14957b (fix: validate negative qty)
if not result: if not result:
return return

View File

@@ -2,13 +2,30 @@
# License: GNU General Public License v3. See license.txt # License: GNU General Public License v3. See license.txt
import frappe import frappe
<<<<<<< HEAD
from frappe.tests.utils import FrappeTestCase from frappe.tests.utils import FrappeTestCase
=======
from frappe.tests import IntegrationTestCase, UnitTestCase
>>>>>>> 329d14957b (fix: validate negative qty)
from frappe.utils import nowdate from frappe.utils import nowdate
from erpnext.accounts.doctype.bank_transaction.test_bank_transaction import create_bank_account from erpnext.accounts.doctype.bank_transaction.test_bank_transaction import create_bank_account
<<<<<<< HEAD
class TestAutoMatchParty(FrappeTestCase): class TestAutoMatchParty(FrappeTestCase):
=======
class UnitTestBankTransaction(UnitTestCase):
"""
Unit tests for BankTransaction.
Use this class for testing individual functions and methods.
"""
pass
class TestAutoMatchParty(IntegrationTestCase):
>>>>>>> 329d14957b (fix: validate negative qty)
@classmethod @classmethod
def setUpClass(cls): def setUpClass(cls):
create_bank_account() create_bank_account()

View File

@@ -6,7 +6,11 @@ import json
import frappe import frappe
from frappe import utils from frappe import utils
from frappe.model.docstatus import DocStatus from frappe.model.docstatus import DocStatus
<<<<<<< HEAD
from frappe.tests.utils import FrappeTestCase from frappe.tests.utils import FrappeTestCase
=======
from frappe.tests import IntegrationTestCase, UnitTestCase
>>>>>>> 329d14957b (fix: validate negative qty)
from erpnext.accounts.doctype.bank_reconciliation_tool.bank_reconciliation_tool import ( from erpnext.accounts.doctype.bank_reconciliation_tool.bank_reconciliation_tool import (
get_linked_payments, get_linked_payments,
@@ -18,6 +22,7 @@ from erpnext.accounts.doctype.purchase_invoice.test_purchase_invoice import make
from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice
from erpnext.tests.utils import if_lending_app_installed from erpnext.tests.utils import if_lending_app_installed
<<<<<<< HEAD
test_dependencies = ["Item", "Cost Center"] test_dependencies = ["Item", "Cost Center"]
@@ -31,6 +36,22 @@ class TestBankTransaction(FrappeTestCase):
]: ]:
frappe.db.delete(dt) frappe.db.delete(dt)
clear_loan_transactions() clear_loan_transactions()
=======
EXTRA_TEST_RECORD_DEPENDENCIES = ["Item", "Cost Center"]
class UnitTestBankTransaction(UnitTestCase):
"""
Unit tests for BankTransaction.
Use this class for testing individual functions and methods.
"""
pass
class TestBankTransaction(IntegrationTestCase):
def setUp(self):
>>>>>>> 329d14957b (fix: validate negative qty)
make_pos_profile() make_pos_profile()
# generate and use a uniq hash identifier for 'Bank Account' and it's linked GL 'Account' to avoid validation error # generate and use a uniq hash identifier for 'Bank Account' and it's linked GL 'Account' to avoid validation error
@@ -222,11 +243,14 @@ class TestBankTransaction(FrappeTestCase):
self.assertEqual(linked_payments[0]["name"], repayment_entry.name) self.assertEqual(linked_payments[0]["name"], repayment_entry.name)
<<<<<<< HEAD
@if_lending_app_installed @if_lending_app_installed
def clear_loan_transactions(): def clear_loan_transactions():
frappe.db.delete("Loan Repayment") frappe.db.delete("Loan Repayment")
=======
>>>>>>> 329d14957b (fix: validate negative qty)
def create_bank_account( def create_bank_account(
bank_name="Citi Bank", gl_account="_Test Bank - _TC", bank_account_name="Checking Account" bank_name="Citi Bank", gl_account="_Test Bank - _TC", bank_account_name="Checking Account"
): ):

View File

@@ -1,4 +1,5 @@
{ {
<<<<<<< HEAD
"allow_copy": 0, "allow_copy": 0,
"allow_events_in_timeline": 0, "allow_events_in_timeline": 0,
"allow_guest_to_view": 0, "allow_guest_to_view": 0,
@@ -104,4 +105,42 @@
"track_changes": 0, "track_changes": 0,
"track_seen": 0, "track_seen": 0,
"track_views": 0 "track_views": 0
=======
"actions": [],
"creation": "2018-10-24 15:24:56.713277",
"doctype": "DocType",
"editable_grid": 1,
"engine": "InnoDB",
"field_order": [
"bank_transaction_field",
"file_field"
],
"fields": [
{
"fieldname": "bank_transaction_field",
"fieldtype": "Select",
"in_list_view": 1,
"label": "Field in Bank Transaction",
"reqd": 1
},
{
"fieldname": "file_field",
"fieldtype": "Data",
"in_list_view": 1,
"label": "Column in Bank File",
"reqd": 1
}
],
"istable": 1,
"links": [],
"modified": "2024-03-27 13:06:38.436517",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Bank Transaction Mapping",
"owner": "Administrator",
"permissions": [],
"sort_field": "creation",
"sort_order": "DESC",
"states": []
>>>>>>> 329d14957b (fix: validate negative qty)
} }

View File

@@ -1,4 +1,5 @@
{ {
<<<<<<< HEAD
"allow_copy": 0, "allow_copy": 0,
"allow_events_in_timeline": 0, "allow_events_in_timeline": 0,
"allow_guest_to_view": 0, "allow_guest_to_view": 0,
@@ -111,6 +112,43 @@
"translatable": 0, "translatable": 0,
"unique": 0 "unique": 0
}, },
=======
"actions": [],
"creation": "2018-11-28 08:55:40.815355",
"doctype": "DocType",
"editable_grid": 1,
"engine": "InnoDB",
"field_order": [
"payment_document",
"payment_entry",
"allocated_amount",
"clearance_date"
],
"fields": [
{
"fieldname": "payment_document",
"fieldtype": "Link",
"in_list_view": 1,
"label": "Payment Document",
"options": "DocType",
"reqd": 1
},
{
"fieldname": "payment_entry",
"fieldtype": "Dynamic Link",
"in_list_view": 1,
"label": "Payment Entry",
"options": "payment_document",
"reqd": 1
},
{
"fieldname": "allocated_amount",
"fieldtype": "Currency",
"in_list_view": 1,
"label": "Allocated Amount",
"reqd": 1
},
>>>>>>> 329d14957b (fix: validate negative qty)
{ {
"depends_on": "eval:doc.docstatus==1", "depends_on": "eval:doc.docstatus==1",
"fieldname": "clearance_date", "fieldname": "clearance_date",
@@ -120,6 +158,7 @@
"print_hide": 1, "print_hide": 1,
"read_only": 1 "read_only": 1
} }
<<<<<<< HEAD
], ],
"has_web_view": 0, "has_web_view": 0,
"hide_heading": 0, "hide_heading": 0,
@@ -148,3 +187,20 @@
"track_seen": 0, "track_seen": 0,
"track_views": 0 "track_views": 0
} }
=======
],
"istable": 1,
"links": [],
"modified": "2024-03-27 13:06:38.549438",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Bank Transaction Payments",
"owner": "Administrator",
"permissions": [],
"quick_entry": 1,
"sort_field": "creation",
"sort_order": "DESC",
"states": [],
"track_changes": 1
}
>>>>>>> 329d14957b (fix: validate negative qty)

View File

@@ -170,7 +170,11 @@
"index_web_pages_for_search": 1, "index_web_pages_for_search": 1,
"issingle": 1, "issingle": 1,
"links": [], "links": [],
<<<<<<< HEAD
"modified": "2023-12-01 16:49:54.073890", "modified": "2023-12-01 16:49:54.073890",
=======
"modified": "2024-03-27 13:06:39.619458",
>>>>>>> 329d14957b (fix: validate negative qty)
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "Accounts", "module": "Accounts",
"name": "Bisect Accounting Statements", "name": "Bisect Accounting Statements",
@@ -188,7 +192,11 @@
} }
], ],
"read_only": 1, "read_only": 1,
<<<<<<< HEAD
"sort_field": "modified", "sort_field": "modified",
=======
"sort_field": "creation",
>>>>>>> 329d14957b (fix: validate negative qty)
"sort_order": "DESC", "sort_order": "DESC",
"states": [] "states": []
} }

View File

@@ -138,10 +138,18 @@ class BisectAccountingStatements(Document):
# set root as current node # set root as current node
root = frappe.db.get_all("Bisect Nodes", filters={"root": ["is", "not set"]})[0] root = frappe.db.get_all("Bisect Nodes", filters={"root": ["is", "not set"]})[0]
<<<<<<< HEAD
self.get_report_summary() self.get_report_summary()
self.current_node = root.name self.current_node = root.name
self.current_from_date = self.from_date self.current_from_date = self.from_date
self.current_to_date = self.to_date self.current_to_date = self.to_date
=======
self.current_node = root.name
self.current_from_date = self.from_date
self.current_to_date = self.to_date
self.get_report_summary()
>>>>>>> 329d14957b (fix: validate negative qty)
self.save() self.save()
def get_report_summary(self): def get_report_summary(self):

View File

@@ -2,8 +2,24 @@
# See license.txt # See license.txt
# import frappe # import frappe
<<<<<<< HEAD
from frappe.tests.utils import FrappeTestCase from frappe.tests.utils import FrappeTestCase
class TestBisectAccountingStatements(FrappeTestCase): class TestBisectAccountingStatements(FrappeTestCase):
=======
from frappe.tests import IntegrationTestCase, UnitTestCase
class UnitTestBisectAccountingStatements(UnitTestCase):
"""
Unit tests for BisectAccountingStatements.
Use this class for testing individual functions and methods.
"""
pass
class TestBisectAccountingStatements(IntegrationTestCase):
>>>>>>> 329d14957b (fix: validate negative qty)
pass pass

View File

@@ -70,7 +70,11 @@
], ],
"index_web_pages_for_search": 1, "index_web_pages_for_search": 1,
"links": [], "links": [],
<<<<<<< HEAD
"modified": "2023-12-01 17:46:12.437996", "modified": "2023-12-01 17:46:12.437996",
=======
"modified": "2024-03-27 13:06:39.766063",
>>>>>>> 329d14957b (fix: validate negative qty)
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "Accounts", "module": "Accounts",
"name": "Bisect Nodes", "name": "Bisect Nodes",
@@ -91,7 +95,11 @@
} }
], ],
"read_only": 1, "read_only": 1,
<<<<<<< HEAD
"sort_field": "modified", "sort_field": "modified",
=======
"sort_field": "creation",
>>>>>>> 329d14957b (fix: validate negative qty)
"sort_order": "DESC", "sort_order": "DESC",
"states": [] "states": []
} }

View File

@@ -2,8 +2,24 @@
# See license.txt # See license.txt
# import frappe # import frappe
<<<<<<< HEAD
from frappe.tests.utils import FrappeTestCase from frappe.tests.utils import FrappeTestCase
class TestBisectNodes(FrappeTestCase): class TestBisectNodes(FrappeTestCase):
=======
from frappe.tests import IntegrationTestCase, UnitTestCase
class UnitTestBisectNodes(UnitTestCase):
"""
Unit tests for BisectNodes.
Use this class for testing individual functions and methods.
"""
pass
class TestBisectNodes(IntegrationTestCase):
>>>>>>> 329d14957b (fix: validate negative qty)
pass pass

View File

@@ -207,7 +207,11 @@
"index_web_pages_for_search": 1, "index_web_pages_for_search": 1,
"is_submittable": 1, "is_submittable": 1,
"links": [], "links": [],
<<<<<<< HEAD
"modified": "2022-10-10 22:14:36.361509", "modified": "2022-10-10 22:14:36.361509",
=======
"modified": "2024-03-27 13:06:42.675933",
>>>>>>> 329d14957b (fix: validate negative qty)
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "Accounts", "module": "Accounts",
"name": "Budget", "name": "Budget",
@@ -231,7 +235,11 @@
"write": 1 "write": 1
} }
], ],
<<<<<<< HEAD
"sort_field": "modified", "sort_field": "modified",
=======
"sort_field": "creation",
>>>>>>> 329d14957b (fix: validate negative qty)
"sort_order": "DESC", "sort_order": "DESC",
"states": [], "states": [],
"track_changes": 1 "track_changes": 1

View File

@@ -1,9 +1,16 @@
# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
# See license.txt # See license.txt
<<<<<<< HEAD
import unittest import unittest
import frappe import frappe
=======
import unittest
import frappe
from frappe.tests import IntegrationTestCase
>>>>>>> 329d14957b (fix: validate negative qty)
from frappe.utils import now_datetime, nowdate from frappe.utils import now_datetime, nowdate
from erpnext.accounts.doctype.budget.budget import BudgetError, get_actual_expense from erpnext.accounts.doctype.budget.budget import BudgetError, get_actual_expense
@@ -11,10 +18,17 @@ from erpnext.accounts.doctype.journal_entry.test_journal_entry import make_journ
from erpnext.accounts.utils import get_fiscal_year from erpnext.accounts.utils import get_fiscal_year
from erpnext.buying.doctype.purchase_order.test_purchase_order import create_purchase_order from erpnext.buying.doctype.purchase_order.test_purchase_order import create_purchase_order
<<<<<<< HEAD
test_dependencies = ["Monthly Distribution"] test_dependencies = ["Monthly Distribution"]
class TestBudget(unittest.TestCase): class TestBudget(unittest.TestCase):
=======
EXTRA_TEST_RECORD_DEPENDENCIES = ["Monthly Distribution"]
class TestBudget(IntegrationTestCase):
>>>>>>> 329d14957b (fix: validate negative qty)
def test_monthly_budget_crossed_ignore(self): def test_monthly_budget_crossed_ignore(self):
set_total_expense_zero(nowdate(), "cost_center") set_total_expense_zero(nowdate(), "cost_center")

View File

@@ -29,14 +29,22 @@
], ],
"istable": 1, "istable": 1,
"links": [], "links": [],
<<<<<<< HEAD
"modified": "2024-03-04 15:43:27.016947", "modified": "2024-03-04 15:43:27.016947",
=======
"modified": "2024-03-27 13:06:42.854458",
>>>>>>> 329d14957b (fix: validate negative qty)
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "Accounts", "module": "Accounts",
"name": "Budget Account", "name": "Budget Account",
"owner": "Administrator", "owner": "Administrator",
"permissions": [], "permissions": [],
"quick_entry": 1, "quick_entry": 1,
<<<<<<< HEAD
"sort_field": "modified", "sort_field": "modified",
=======
"sort_field": "creation",
>>>>>>> 329d14957b (fix: validate negative qty)
"sort_order": "DESC", "sort_order": "DESC",
"states": [] "states": []
} }

View File

@@ -13,19 +13,35 @@
"fieldtype": "Link", "fieldtype": "Link",
"in_list_view": 1, "in_list_view": 1,
"label": "Campaign", "label": "Campaign",
<<<<<<< HEAD
"options": "Campaign" "options": "Campaign"
=======
"options": "UTM Campaign"
>>>>>>> 329d14957b (fix: validate negative qty)
} }
], ],
"index_web_pages_for_search": 1, "index_web_pages_for_search": 1,
"istable": 1, "istable": 1,
"links": [], "links": [],
<<<<<<< HEAD
"modified": "2021-05-07 10:43:49.717633", "modified": "2021-05-07 10:43:49.717633",
=======
"modified": "2024-06-28 11:04:09.815940",
>>>>>>> 329d14957b (fix: validate negative qty)
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "Accounts", "module": "Accounts",
"name": "Campaign Item", "name": "Campaign Item",
"owner": "Administrator", "owner": "Administrator",
"permissions": [], "permissions": [],
<<<<<<< HEAD
"sort_field": "modified", "sort_field": "modified",
"sort_order": "DESC", "sort_order": "DESC",
"track_changes": 1 "track_changes": 1
} }
=======
"sort_field": "creation",
"sort_order": "DESC",
"states": [],
"track_changes": 1
}
>>>>>>> 329d14957b (fix: validate negative qty)

View File

@@ -124,7 +124,11 @@
], ],
"is_submittable": 1, "is_submittable": 1,
"links": [], "links": [],
<<<<<<< HEAD
"modified": "2023-12-28 13:15:46.858427", "modified": "2023-12-28 13:15:46.858427",
=======
"modified": "2024-03-27 13:06:44.260440",
>>>>>>> 329d14957b (fix: validate negative qty)
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "Accounts", "module": "Accounts",
"name": "Cashier Closing", "name": "Cashier Closing",
@@ -145,7 +149,11 @@
"write": 1 "write": 1
} }
], ],
<<<<<<< HEAD
"sort_field": "modified", "sort_field": "modified",
=======
"sort_field": "creation",
>>>>>>> 329d14957b (fix: validate negative qty)
"sort_order": "DESC", "sort_order": "DESC",
"states": [], "states": [],
"track_changes": 1 "track_changes": 1

View File

@@ -1,8 +1,17 @@
# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
# See license.txt # See license.txt
<<<<<<< HEAD
import unittest import unittest
class TestCashierClosing(unittest.TestCase): class TestCashierClosing(unittest.TestCase):
=======
import unittest
from frappe.tests import IntegrationTestCase
class TestCashierClosing(IntegrationTestCase):
>>>>>>> 329d14957b (fix: validate negative qty)
pass pass

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