mirror of
https://github.com/frappe/erpnext.git
synced 2026-09-17 10:36:31 +00:00
Merge remote-tracking branch 'upstream/version-13-hotfix' into fix-ecommerce-cart-badge
This commit is contained in:
@@ -164,44 +164,32 @@ erpnext.buying.BuyingController = erpnext.TransactionController.extend({
|
||||
this.price_list_rate(doc, cdt, cdn);
|
||||
},
|
||||
|
||||
qty: function(doc, cdt, cdn) {
|
||||
var item = frappe.get_doc(cdt, cdn);
|
||||
qty(doc, cdt, cdn) {
|
||||
if ((doc.doctype == "Purchase Receipt") || (doc.doctype == "Purchase Invoice" && (doc.update_stock || doc.is_return))) {
|
||||
frappe.model.round_floats_in(item, ["qty", "received_qty"]);
|
||||
|
||||
if(!doc.is_return && this.validate_negative_quantity(cdt, cdn, item, ["qty", "received_qty"])){ return }
|
||||
|
||||
if(!item.rejected_qty && item.qty) {
|
||||
item.received_qty = item.qty;
|
||||
}
|
||||
|
||||
frappe.model.round_floats_in(item, ["qty", "received_qty"]);
|
||||
item.rejected_qty = flt(item.received_qty - item.qty, precision("rejected_qty", item));
|
||||
item.received_stock_qty = flt(item.conversion_factor, precision("conversion_factor", item)) * flt(item.received_qty);
|
||||
this.calculate_received_qty(doc, cdt, cdn)
|
||||
}
|
||||
this._super(doc, cdt, cdn);
|
||||
},
|
||||
|
||||
batch_no: function(doc, cdt, cdn) {
|
||||
this._super(doc, cdt, cdn);
|
||||
rejected_qty(doc, cdt, cdn) {
|
||||
this.calculate_received_qty(doc, cdt, cdn)
|
||||
},
|
||||
|
||||
received_qty: function(doc, cdt, cdn) {
|
||||
this.calculate_accepted_qty(doc, cdt, cdn)
|
||||
},
|
||||
|
||||
rejected_qty: function(doc, cdt, cdn) {
|
||||
this.calculate_accepted_qty(doc, cdt, cdn)
|
||||
},
|
||||
|
||||
calculate_accepted_qty: function(doc, cdt, cdn){
|
||||
calculate_received_qty(doc, cdt, cdn){
|
||||
var item = frappe.get_doc(cdt, cdn);
|
||||
frappe.model.round_floats_in(item, ["received_qty", "rejected_qty"]);
|
||||
frappe.model.round_floats_in(item, ["qty", "rejected_qty"]);
|
||||
|
||||
if(!doc.is_return && this.validate_negative_quantity(cdt, cdn, item, ["received_qty", "rejected_qty"])){ return }
|
||||
if(!doc.is_return && this.validate_negative_quantity(cdt, cdn, item, ["qty", "rejected_qty"])){ return }
|
||||
|
||||
item.qty = flt(item.received_qty - item.rejected_qty, precision("qty", item));
|
||||
this.qty(doc, cdt, cdn);
|
||||
let received_qty = flt(item.qty + item.rejected_qty, precision("received_qty", item));
|
||||
let received_stock_qty = flt(item.conversion_factor, precision("conversion_factor", item)) * flt(received_qty);
|
||||
|
||||
frappe.model.set_value(cdt, cdn, "received_qty", received_qty);
|
||||
frappe.model.set_value(cdt, cdn, "received_stock_qty", received_stock_qty);
|
||||
},
|
||||
|
||||
batch_no(doc, cdt, cdn) {
|
||||
super.batch_no(doc, cdt, cdn);
|
||||
},
|
||||
|
||||
validate_negative_quantity: function(cdt, cdn, item, fieldnames){
|
||||
|
||||
@@ -81,6 +81,7 @@ erpnext.taxes_and_totals = erpnext.payments.extend({
|
||||
this.initialize_taxes();
|
||||
this.determine_exclusive_rate();
|
||||
this.calculate_net_total();
|
||||
this.calculate_shipping_charges();
|
||||
this.calculate_taxes();
|
||||
this.manipulate_grand_total_for_inclusive_tax();
|
||||
this.calculate_totals();
|
||||
@@ -137,7 +138,9 @@ erpnext.taxes_and_totals = erpnext.payments.extend({
|
||||
var me = this;
|
||||
|
||||
$.each(this.frm.doc["taxes"] || [], function(i, tax) {
|
||||
tax.item_wise_tax_detail = {};
|
||||
if (!tax.dont_recompute_tax) {
|
||||
tax.item_wise_tax_detail = {};
|
||||
}
|
||||
var tax_fields = ["total", "tax_amount_after_discount_amount",
|
||||
"tax_amount_for_current_item", "grand_total_for_current_item",
|
||||
"tax_fraction_for_current_item", "grand_total_fraction_for_current_item"];
|
||||
@@ -262,8 +265,13 @@ erpnext.taxes_and_totals = erpnext.payments.extend({
|
||||
me.frm.doc.net_total += item.net_amount;
|
||||
me.frm.doc.base_net_total += item.base_net_amount;
|
||||
});
|
||||
},
|
||||
|
||||
calculate_shipping_charges: function() {
|
||||
frappe.model.round_floats_in(this.frm.doc, ["total", "base_total", "net_total", "base_net_total"]);
|
||||
if (frappe.meta.get_docfield(this.frm.doc.doctype, "shipping_rule", this.frm.doc.name)) {
|
||||
this.shipping_rule();
|
||||
}
|
||||
},
|
||||
|
||||
add_taxes_from_item_tax_template: function(item_tax_map) {
|
||||
@@ -419,7 +427,9 @@ erpnext.taxes_and_totals = erpnext.payments.extend({
|
||||
current_tax_amount = tax_rate * item.qty;
|
||||
}
|
||||
|
||||
this.set_item_wise_tax(item, tax, tax_rate, current_tax_amount);
|
||||
if (!tax.dont_recompute_tax) {
|
||||
this.set_item_wise_tax(item, tax, tax_rate, current_tax_amount);
|
||||
}
|
||||
|
||||
return current_tax_amount;
|
||||
},
|
||||
@@ -587,7 +597,9 @@ erpnext.taxes_and_totals = erpnext.payments.extend({
|
||||
delete tax[fieldname];
|
||||
});
|
||||
|
||||
tax.item_wise_tax_detail = JSON.stringify(tax.item_wise_tax_detail);
|
||||
if (!tax.dont_recompute_tax) {
|
||||
tax.item_wise_tax_detail = JSON.stringify(tax.item_wise_tax_detail);
|
||||
}
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
@@ -680,7 +680,7 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({
|
||||
var item = frappe.get_doc(cdt, cdn);
|
||||
frappe.model.round_floats_in(item, ["price_list_rate", "discount_percentage"]);
|
||||
|
||||
// check if child doctype is Sales Order Item/Qutation Item and calculate the rate
|
||||
// check if child doctype is Sales Order Item/Quotation Item and calculate the rate
|
||||
if (in_list(["Quotation Item", "Sales Order Item", "Delivery Note Item", "Sales Invoice Item", "POS Invoice Item", "Purchase Invoice Item", "Purchase Order Item", "Purchase Receipt Item"]), cdt)
|
||||
this.apply_pricing_rule_on_item(item);
|
||||
else
|
||||
@@ -1065,16 +1065,8 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({
|
||||
return this.frm.call({
|
||||
doc: this.frm.doc,
|
||||
method: "apply_shipping_rule",
|
||||
callback: function(r) {
|
||||
if(!r.exc) {
|
||||
me.calculate_taxes_and_totals();
|
||||
}
|
||||
}
|
||||
}).fail(() => this.frm.set_value('shipping_rule', ''));
|
||||
}
|
||||
else {
|
||||
me.calculate_taxes_and_totals();
|
||||
}
|
||||
},
|
||||
|
||||
set_margin_amount_based_on_currency: function(exchange_rate) {
|
||||
@@ -1094,7 +1086,7 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({
|
||||
$.each(this.frm.doc.taxes || [], function(i, d) {
|
||||
if(d.charge_type == "Actual") {
|
||||
frappe.model.set_value(d.doctype, d.name, "tax_amount",
|
||||
flt(d.tax_amount) / flt(exchange_rate));
|
||||
flt(d.base_tax_amount) / flt(exchange_rate));
|
||||
}
|
||||
});
|
||||
},
|
||||
@@ -1570,25 +1562,27 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({
|
||||
|
||||
_set_values_for_item_list: function(children) {
|
||||
var me = this;
|
||||
var price_list_rate_changed = false;
|
||||
var items_rule_dict = {};
|
||||
|
||||
for(var i=0, l=children.length; i<l; i++) {
|
||||
var d = children[i];
|
||||
var d = children[i] ;
|
||||
let item_row = frappe.get_doc(d.doctype, d.name);
|
||||
var existing_pricing_rule = frappe.model.get_value(d.doctype, d.name, "pricing_rules");
|
||||
for(var k in d) {
|
||||
var v = d[k];
|
||||
if (["doctype", "name"].indexOf(k)===-1) {
|
||||
if(k=="price_list_rate") {
|
||||
if(flt(v) != flt(d.price_list_rate)) price_list_rate_changed = true;
|
||||
item_row['rate'] = v;
|
||||
}
|
||||
|
||||
if (k !== 'free_item_data') {
|
||||
frappe.model.set_value(d.doctype, d.name, k, v);
|
||||
item_row[k] = v;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
frappe.model.round_floats_in(item_row, ["price_list_rate", "discount_percentage"]);
|
||||
|
||||
// if pricing rule set as blank from an existing value, apply price_list
|
||||
if(!me.frm.doc.ignore_pricing_rule && existing_pricing_rule && !d.pricing_rules) {
|
||||
me.apply_price_list(frappe.get_doc(d.doctype, d.name));
|
||||
@@ -1605,9 +1599,10 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({
|
||||
}
|
||||
}
|
||||
|
||||
me.frm.refresh_field('items');
|
||||
me.apply_rule_on_other_items(items_rule_dict);
|
||||
|
||||
if(!price_list_rate_changed) me.calculate_taxes_and_totals();
|
||||
me.calculate_taxes_and_totals();
|
||||
},
|
||||
|
||||
apply_rule_on_other_items: function(args) {
|
||||
|
||||
@@ -113,15 +113,15 @@ function get_filters() {
|
||||
"fieldname":"period_start_date",
|
||||
"label": __("Start Date"),
|
||||
"fieldtype": "Date",
|
||||
"hidden": 1,
|
||||
"reqd": 1
|
||||
"reqd": 1,
|
||||
"depends_on": "eval:doc.filter_based_on == 'Date Range'"
|
||||
},
|
||||
{
|
||||
"fieldname":"period_end_date",
|
||||
"label": __("End Date"),
|
||||
"fieldtype": "Date",
|
||||
"hidden": 1,
|
||||
"reqd": 1
|
||||
"reqd": 1,
|
||||
"depends_on": "eval:doc.filter_based_on == 'Date Range'"
|
||||
},
|
||||
{
|
||||
"fieldname":"from_fiscal_year",
|
||||
@@ -129,7 +129,8 @@ function get_filters() {
|
||||
"fieldtype": "Link",
|
||||
"options": "Fiscal Year",
|
||||
"default": frappe.defaults.get_user_default("fiscal_year"),
|
||||
"reqd": 1
|
||||
"reqd": 1,
|
||||
"depends_on": "eval:doc.filter_based_on == 'Fiscal Year'"
|
||||
},
|
||||
{
|
||||
"fieldname":"to_fiscal_year",
|
||||
@@ -137,7 +138,8 @@ function get_filters() {
|
||||
"fieldtype": "Link",
|
||||
"options": "Fiscal Year",
|
||||
"default": frappe.defaults.get_user_default("fiscal_year"),
|
||||
"reqd": 1
|
||||
"reqd": 1,
|
||||
"depends_on": "eval:doc.filter_based_on == 'Fiscal Year'"
|
||||
},
|
||||
{
|
||||
"fieldname": "periodicity",
|
||||
|
||||
@@ -83,6 +83,13 @@ $.extend(erpnext.queries, {
|
||||
};
|
||||
},
|
||||
|
||||
dispatch_address_query: function(doc) {
|
||||
return {
|
||||
query: 'frappe.contacts.doctype.address.address.address_query',
|
||||
filters: { link_doctype: 'Company', link_name: doc.company || '' }
|
||||
};
|
||||
},
|
||||
|
||||
supplier_filter: function(doc) {
|
||||
if(!doc.supplier) {
|
||||
frappe.throw(__("Please set {0}", [__(frappe.meta.get_label(doc.doctype, "supplier", doc.name))]));
|
||||
|
||||
@@ -84,6 +84,10 @@ $.extend(erpnext, {
|
||||
});
|
||||
},
|
||||
|
||||
route_to_pending_reposts: (args) => {
|
||||
frappe.set_route('List', 'Repost Item Valuation', args);
|
||||
},
|
||||
|
||||
proceed_save_with_reminders_frequency_change: () => {
|
||||
frappe.ui.hide_open_dialog();
|
||||
|
||||
@@ -426,12 +430,9 @@ erpnext.utils.select_alternate_items = function(opts) {
|
||||
qty = row.qty;
|
||||
}
|
||||
row[item_field] = d.alternate_item;
|
||||
frm.script_manager.trigger(item_field, row.doctype, row.name)
|
||||
.then(() => {
|
||||
frappe.model.set_value(row.doctype, row.name, 'qty', qty);
|
||||
frappe.model.set_value(row.doctype, row.name,
|
||||
opts.original_item_field, d.item_code);
|
||||
});
|
||||
frappe.model.set_value(row.doctype, row.name, 'qty', qty);
|
||||
frappe.model.set_value(row.doctype, row.name, opts.original_item_field, d.item_code);
|
||||
frm.trigger(item_field, row.doctype, row.name);
|
||||
});
|
||||
|
||||
refresh_field(opts.child_docname);
|
||||
@@ -751,9 +752,13 @@ frappe.form.link_formatters['Item'] = function(value, doc) {
|
||||
}
|
||||
|
||||
frappe.form.link_formatters['Employee'] = function(value, doc) {
|
||||
if(doc && doc.employee_name && doc.employee_name !== value) {
|
||||
return value? value + ': ' + doc.employee_name: doc.employee_name;
|
||||
if (doc && value && doc.employee_name && doc.employee_name !== value && doc.employee === value) {
|
||||
return value + ': ' + doc.employee_name;
|
||||
} else if (!value && doc.doctype && doc.employee_name) {
|
||||
// format blank value in child table
|
||||
return doc.employee;
|
||||
} else {
|
||||
// if value is blank in report view or project name and name are the same, return as is
|
||||
return value;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -495,6 +495,11 @@
|
||||
font-size: var(--text-md);
|
||||
}
|
||||
|
||||
> .item-qty-total-container {
|
||||
@extend .net-total-container;
|
||||
padding: 5px 0px 0px 0px;
|
||||
}
|
||||
|
||||
> .taxes-container {
|
||||
display: none;
|
||||
flex-direction: column;
|
||||
|
||||
@@ -459,6 +459,7 @@ body.product-page {
|
||||
min-height: 0px;
|
||||
|
||||
.r-item-image {
|
||||
min-height: 100px;
|
||||
width: 40%;
|
||||
|
||||
.r-product-image {
|
||||
@@ -480,6 +481,7 @@ body.product-page {
|
||||
.r-item-info {
|
||||
font-size: 14px;
|
||||
padding-right: 0;
|
||||
padding-left: 10px;
|
||||
width: 60%;
|
||||
|
||||
a {
|
||||
@@ -671,18 +673,6 @@ body.product-page {
|
||||
img {
|
||||
max-height: 112px;
|
||||
}
|
||||
|
||||
.no-image-cart-item {
|
||||
max-height: 112px;
|
||||
display: flex; justify-content: center;
|
||||
background-color: var(--gray-200);
|
||||
align-items: center;
|
||||
color: var(--gray-400);
|
||||
margin-top: .15rem;
|
||||
border-radius: 6px;
|
||||
height: 100%;
|
||||
font-size: 24px;
|
||||
}
|
||||
}
|
||||
|
||||
.cart-items {
|
||||
@@ -861,6 +851,18 @@ body.product-page {
|
||||
}
|
||||
}
|
||||
|
||||
.no-image-cart-item {
|
||||
max-height: 112px;
|
||||
display: flex; justify-content: center;
|
||||
background-color: var(--gray-200);
|
||||
align-items: center;
|
||||
color: var(--gray-400);
|
||||
margin-top: .15rem;
|
||||
border-radius: 6px;
|
||||
height: 100%;
|
||||
font-size: 24px;
|
||||
}
|
||||
|
||||
.cart-empty.frappe-card {
|
||||
min-height: 76vh;
|
||||
@include flex(flex, center, center, column);
|
||||
|
||||
Reference in New Issue
Block a user