diff --git a/erpnext/__init__.py b/erpnext/__init__.py index 76123b1a0b..ff8701a140 100644 --- a/erpnext/__init__.py +++ b/erpnext/__init__.py @@ -5,7 +5,7 @@ import frappe from erpnext.hooks import regional_overrides from frappe.utils import getdate -__version__ = '10.0.19' +__version__ = '10.0.20' def get_default_company(user=None): '''Get default company for user''' diff --git a/erpnext/accounts/doctype/account/chart_of_accounts/verified/de_kontenplan_SKR04.json b/erpnext/accounts/doctype/account/chart_of_accounts/verified/de_kontenplan_SKR04.json index e109a3a629..e29ad827bf 100644 --- a/erpnext/accounts/doctype/account/chart_of_accounts/verified/de_kontenplan_SKR04.json +++ b/erpnext/accounts/doctype/account/chart_of_accounts/verified/de_kontenplan_SKR04.json @@ -176,7 +176,7 @@ "Eingeforderte Nachsch\u00fcsse (gegenkonto 2929)": {} }, "Eingeforderte- noch ausstehende Kapitaleinlagen": { - "Ausstehende Einlagen auf das gezeichnete Kapital- eingefordert (Forderungen- nicht eingeforderte ausstehende Einlagen s. Konto 2910)": {} + "Ausstehende Einlagen auf das gezeichnete Kapital- eingefordert": {} }, "Forderungen aus Lieferungen und Leistungen H-Saldo": { "Einzelwertberechtigungen zu Forderungen mit einer Restlaufzeit bis zu 1 Jahr": {}, @@ -685,7 +685,6 @@ "Umsatzsteuer aus innergemeinschaftlichem Erwerb 16%": {}, "Umsatzsteuer aus innergemeinschaftlichem Erwerb 19%": {}, "Umsatzsteuer aus innergemeinschaftlichem Erwerb ohne Vorsteuerabzug": {}, - "Umsatzsteuer aus innergemeinschaftlichem Erwerb von Neufahrzeugen von Lieferanten ohne Umsatzsteuer-Identifikationsnummer": {}, "Umsatzsteuer fr\u00fchere Jahre": {}, "Umsatzsteuer laufendes Jahr": {}, "Umsatzsteuer nach \u00a713b UStG": {}, @@ -747,7 +746,7 @@ "Verbindlichkeiten gegen\u00fcber Kreditinstituten ": { "Gegenkonto 3159-3209 bei Aufteilung der Konten 3210-3248": {} }, - "Verbindlichkeiten gegen\u00fcber Kreditinstituten oder Kassenbestand- Bundesbankguthaben- Guthaben bei Kreditinstituten und Schecks": { + "Verbindlichkeiten gegen\u00fcber Kreditinstituten - Bundesbankguthaben- Guthaben bei Kreditinstituten und Schecks": { "Verbindlichkeiten gegen\u00fcber Kreditinstituten 1": { "(frei- in Bilanz kein Restlaufzeit vermerkt) 1": {}, "Verbindlichkeiten gegen\u00fcber Kreditinstituten Restlaufzeit 1 bis 5 Jahre": {}, @@ -778,8 +777,8 @@ }, "Gewinn u. Verlust - Aufwendungen": { "Betriebliche Aufwendungen": { - "Abschreibungen a. Verm\u00f6gensgeg. d. Umlaufverm\u00f6gens- soweit diese die in der Kapitalgesellschaft \u00fcblichen Abschreibungen \u00fcberschreiten": { - "Abschreibungen a. Verm\u00f6gensgeg. d. Umlaufverm\u00f6gens- soweit diese die in der Kapitalgesellschaft \u00fcblichen Abschreibungen \u00fcberschreiten": { + "Abschreibungen a. Verm\u00f6gensgeg. d. Umlaufverm\u00f6gens- soweit diese die in der Abschreibungen \u00fcberschreiten": { + "Abschreibungen a. Verm\u00f6gensgeg. d. Umlaufverm\u00f6gens- soweit diese die in der Abschreibungen \u00fcberschreiten": { "Abschreibungen auf Umlaufverm\u00f6gen- steuerrechtlich bedingt (soweit un\u00fcblich hoch)": {}, "Abschreibungen auf Verm\u00f6gensgegenst\u00e4nde des Umlaufverm\u00f6gens (soweit un\u00fcblich hoch)": {}, "Forderungsverluste (soweit un\u00fcblich hoch)": {}, @@ -852,7 +851,7 @@ "Sonstige betriebliche Aufwendungen 3": { "Sonstige betriebliche Aufwendungen 4": { "Abgaben f\u00fcr betrieblich genutzten Grundbesitz": {}, - "Abgang von Wirtschaftsg\u00fctern des Umlaufverm\u00f6gens 100% / 50% nicht abzugsf\u00e4hig (inlandische Kap. Ges.) nach \u00a7 4 Abs. 3 Satz 4 EStG": {}, + "Abgang von Wirtschaftsg\u00fctern des Umlaufverm\u00f6gens 100% / 50% nicht abzugsf\u00e4hig (inlandische Kap. Ges.) nach": {}, "Abgang von Wirtschaftsg\u00fctern des Umlaufverm\u00f6gens nach \u00a7 4 Abs. 3 Satz 4 EStG": {}, "Abschluss- und Pr\u00fcfungskosten": {}, "Abschreibung auf Umlaufverm\u00f6gen au\u00dfer Vorr\u00e4te und Wertpapieren des UV (\u00fcbliche H\u00f6he)": {}, @@ -867,7 +866,7 @@ "Aufwendungen aus Anteilen an Kapitalgesellschaften 100% / 50% nicht abzugsf\u00e4hig (inlandische Kap. Ges.)": {}, "Aufwendungen aus Bewertung Finanzmittelfonds": {}, "Aufwendungen aus Kursdifferenzen": {}, - "Aufwendungen aus der Ver\u00e4u\u00dferung von Anteilen an Kapitalgesellschaften 100% / 50% nicht abzugsf\u00e4hig (inl\u00e4ndische Kap. Ges.)": {}, + "Aufwendungen aus der Ver\u00e4u\u00dferung von Anteilen an Kapitalgesellschaften 100% / 50% nicht abzugsf\u00e4hig": {}, "Aufwendungen aus der Zuschreibung von steuertlich niedriger bewerteten R\u00fcckstellungen": {}, "Aufwendungen aus der Zuschreibung von steuertlich niedriger bewerteten Verbindlichkeiten": {}, "Aufwendungen f\u00fcr Abraum- und Abfallbeseitigung": {}, @@ -987,9 +986,9 @@ "Verg\u00fctungen an Mitunternehmer \u00a7 15 EStG": {}, "Verkaufsprovisionen": {}, "Verluste aus dem Abgang von Gegenst\u00e4nden des Anlageverm\u00f6gens": {}, - "Verluste aus dem Abgang von Gegenst\u00e4nden des Umlaufverm\u00f6gens (au\u00dfer Vorr\u00e4te) 100% / 50% nicht anzugsf\u00e4hig (inlandische Kap. Ges.)": {}, + "Verluste aus dem Abgang von Gegenst\u00e4nden des Umlaufverm\u00f6gens (au\u00dfer Vorr\u00e4te) 100%/50% nicht anzugsf\u00e4hig": {}, "Verluste aus dem Abgang von Gegenst\u00e4nden des Umlaufverm\u00f6gens au\u00dfer Vorr\u00e4te": {}, - "Verluste aus der Ver\u00e4u\u00dferung von Anteilen an Kapitalgesellschaften 100% / 50% nicht abzugsf\u00e4hig (inl\u00e4ndische Kap. Ges.)": {}, + "Verluste aus der Ver\u00e4u\u00dferung von Anteilen an Kapitalgesellschaften 100% / 50% nicht abzugsf\u00e4hig": {}, "Verpackungsmaterial": {}, "Versicherungen": {}, "Versicherungen f\u00fcr Geb\u00e4ude": {}, @@ -1020,10 +1019,10 @@ }, "Abschreibungen auf Finanzanlagen 100% / 50% nicht abzugsf\u00e4hig (inl\u00e4ndische Kap. Ges.)": {}, "Abschreibungen auf Finanzanlagen auf Grund steuerlicher Sondervorschriften": {}, - "Abschreibungen auf Finanzanlagen auf Grund steuerlicher Sondervorschriften 100% / 50% nicht abzugsf\u00e4hig (inl\u00e4ndische Kap. Ges.)": {}, + "Abschreibungen auf Finanzanlagen auf Grund steuerlicher Sondervorschriften 100% / 50% nicht abzugsf\u00e4hig": {}, "Abschreibungen auf Grund von Verlustanteilen an Mitunternehmerschaften \u00a7 8 GewStG": {}, "Abschreibungen auf Wertpapiere des Umlaufverm\u00f6gens": {}, - "Abschreibungen auf Wertpapiere des Umlaufverm\u00f6gens 100% / 50% nicht abzugsf\u00e4hig (inl\u00e4ndische Kap. Ges.)": {}, + "Abschreibungen auf Wertpapiere des Umlaufverm\u00f6gens 100% / 50% nicht abzugsf\u00e4hig": {}, "Vorwegnahme k\u00fcnftiger Wertschwankungen bei Wertpapieren des Umlaufverm\u00f6gens": {} }, "account_type": "Depreciation" @@ -1123,15 +1122,15 @@ } }, "Erh\u00f6hung oder Verminderung des Bestands an fertigen und unfertige Erzeugnissen": { - "Erh\u00f6hung des Bestands an fertigen und unfertigen Erzeugnissen oder Verminderung des Bestands an fertigen und unfertigen Erzeugnissen": { + "Erh\u00f6hung / Verminderung des Bestands an fertigen und unfertigen Erzeugnissen": { "Bestandsver\u00e4nderungen - fertige Erzeugnisse": {}, "Bestandsver\u00e4nderungen - unfertige Erzeugnisse": {}, "Bestandsver\u00e4nderungen - unfertige Leistungen": {} }, - "Erh\u00f6hung des Bestands in Arbeit befindlicher Auftr\u00e4ge oder Verminderung des Bestands in Arbeit befindlicher Auftr\u00e4ge": { + "Erh\u00f6hung / Verminderung des Bestands in Arbeit befindlicher Auftr\u00e4ge": { "Bestandsver\u00e4nderungen in Arbeit befindlicher Auftr\u00e4ge": {} }, - "Erh\u00f6hung des Bestands in Ausf\u00fchrung befindlicher Bauaftr\u00e4ge oder Verminderung des Bestands in Ausf\u00fchrung befindlicher Bauauftr\u00e4ge": { + "Erh\u00f6hung / Verminderung des Bestands in Ausf\u00fchrung befindlicher Bauaftr\u00e4ge": { "Bestandsver\u00e4nderungen in Ausf\u00fchrung befindliche Bauauftr\u00e4ge": {} } }, @@ -1384,8 +1383,8 @@ "Sonstige Zinsen und \u00e4hnliche Ertr\u00e4ge 1": { "Diskontertr\u00e4ge": {}, "Diskontertr\u00e4ge aus verbundenen Unternehmen": {}, - "Laufende Ertr\u00e4ge aus Anteilen an Kapitalgesellschaften (Umlaufverm\u00f6gen) 100% / 50% steuerfrei (inl\u00e4ndische Kap. Ges.)": {}, - "Laufende Ertr\u00e4ge aus Anteilen an Kapitalgesellschaften (verbundene Unternehmen) 100% / 50% steuerfrei (inl\u00e4ndische Kap. Ges.)": {}, + "Laufende Ertr\u00e4ge aus Anteilen an Kapitalgesellschaften 100% / 50% steuerfrei": {}, + "Laufende Ertr\u00e4ge aus Anteilen an Kapitalgesellschaften 100% / 50% steuerfrei": {}, "Sonstige Zinsen und \u00e4hnliche Ertr\u00e4ge 2": {}, "Sonstige Zinsen und \u00e4hnliche Ertr\u00e4ge aus verbundenen Unternehmen": {}, "Sonstige Zinsertr\u00e4ge": {}, diff --git a/erpnext/accounts/doctype/account/chart_of_accounts/verified/hu_chart_of_accounts.json b/erpnext/accounts/doctype/account/chart_of_accounts/verified/hu_chart_of_accounts.json index 3ed6b1dd46..ea8ebf070d 100644 --- a/erpnext/accounts/doctype/account/chart_of_accounts/verified/hu_chart_of_accounts.json +++ b/erpnext/accounts/doctype/account/chart_of_accounts/verified/hu_chart_of_accounts.json @@ -588,7 +588,6 @@ "5592. Munk\u00e1ltat\u00f3 \u00e1ltal \u00f6nk\u00e9ntes p\u00e9nzt\u00e1rba befizetett munk\u00e1ltat\u00f3i tagd\u00edj hozz\u00e1j\u00e1rul\u00e1s": {}, "5593. Munk\u00e1ltat\u00f3t terhel\u0151 szem\u00e9lyi j\u00f6vedelemad\u00f3": {}, "5594. Munk\u00e1ltat\u00f3i hozz\u00e1j\u00e1rul\u00e1s a korengedm\u00e9nyes nyugd\u00edj ig\u00e9nybev\u00e9tel\u00e9hez": {}, - "5595. Tal\u00e1lm\u00e1nyi d\u00edj, szabadalom v\u00e9tel\u00e1ra \u00e9s hasznos\u00edt\u00e1si d\u00edja, az \u00faj\u00edt\u00e1si d\u00edj \u00e9s ezekkel kapcsolatos k\u00f6zrem\u0171k\u00f6d\u00e9si d\u00edjak": {}, "5596. Fizetett szerz\u0151i, \u00edr\u00f3i \u00e9s m\u00e1s jogv\u00e9delmet \u00e9lvez\u0151 munk\u00e1k d\u00edjai \u00e9s ezekkel kapcsolatos k\u00f6zrem\u0171k\u00f6d\u0151i d\u00edjak": {}, "5597. Fizetett \u00f6szt\u00f6nd\u00edjak": {}, "5598. Reprezent\u00e1ci\u00f3s k\u00f6lts\u00e9gek, \u00e9tkez\u00e9si hozz\u00e1j\u00e1rul\u00e1s": {}, @@ -731,7 +730,7 @@ "8684. K\u00f6vetel\u00e9sek \u00e9rt\u00e9kveszt\u00e9se": {} }, "869. K\u00fcl\u00f6nf\u00e9le egy\u00e9b r\u00e1ford\u00edt\u00e1sok": { - "8691. T\u00e1rsas\u00e1gba bevitt, \u00e9rt\u00e9kpap\u00edrnak vagy r\u00e9szesed\u00e9snek nem min\u0151s\u00fcl\u0151 vagyont. k\u00f6nyv szerinti \u00e9s l\u00e9t. okir. meghat. veszt. k\u00fcl\u00f6nb\u00f6zet": {}, + "8691. T\u00e1rsas\u00e1gba bevitt, \u00e9rt\u00e9kpap\u00edrnak vagy r\u00e9szesed\u00e9snek nem min\u0151s\u00fcl\u0151 vagyont.": {}, "8692. Ellent\u00e9telez\u00e9s n\u00e9lk\u00fcl \u00e1tv\u00e1llalt k\u00f6telezetts\u00e9g szerz\u0151d\u00e9s szerinti \u00f6sszege": {}, "8693. T\u00e9r\u00edt\u00e9s n\u00e9lk\u00fcl \u00e1tadott, r\u00e9szesed\u00e9snek vagy \u00e9rt\u00e9kpap\u00edrnak nem min\u0151s\u00fcl\u0151 eszk\u00f6z\u00f6k nyilv\u00e1ntart\u00e1s szerinti \u00e9rt\u00e9ke": {}, "8694. T\u00e9r\u00edt\u00e9s n\u00e9lk\u00fcl ny\u00fajtott szolg\u00e1ltat\u00e1sok beker\u00fcl\u00e9si \u00e9rt\u00e9ke": {}, @@ -813,12 +812,7 @@ "9684. R\u00e9szesed\u00e9sek \u00e9rt\u00e9kveszt\u00e9s\u00e9nek vissza\u00edr\u00e1sa": {} }, "969. K\u00fcl\u00f6nf\u00e9le egy\u00e9b bev\u00e9telek": { - "9691. Gazdas\u00e1gi t\u00e1rsas\u00e1gba bevitt, \u00e9rt\u00e9kp. vagy r\u00e9szesed\u00e9snek nem min\u0151s\u00fcl\u0151 vagyont. \u00e9rt\u00e9ke \u00e9s l\u00e9tes\u00edt\u0151 okir. \u00e9rt. nyer. jell . k\u00fcl\u00f6nb.": {}, - "9692. El\u00e9v\u00fclt k\u00f6telezetts\u00e9g k\u00f6nyv szerinti \u00e9rt\u00e9ke": {}, - "9693. T\u00e9r\u00edt\u00e9s n\u00e9lk\u00fcl \u00e1tvett, aj\u00e1nd\u00e9kk\u00e9nt, hagyat\u00e9kk\u00e9nt kapott, fellelt eszk\u00f6z\u00f6k piaci vagy jogszab\u00e1ly szerinti \u00e9rt\u00e9ke": {}, - "9694. T\u00e9r\u00edt\u00e9s n\u00e9lk\u00fcl kapott szolg\u00e1ltat\u00e1sok piaci vagy jogszab\u00e1ly szerinti \u00e9rt\u00e9ke": {}, - "9695. Elengedett \u00e9s ellent\u00e9telez\u00e9s n\u00e9lk\u00fcl \u00e1tv\u00e1llalt k\u00f6telezetts\u00e9g \u00e9rt\u00e9ke": {}, - "9696. Egy\u00e9b, vagyonn\u00f6veked\u00e9ssel j\u00e1r\u00f3 bev\u00e9telek": {} + "is_group": 1 } }, "97. P\u00c9NZ\u00dcGYI M\u0170VELETEK BEV\u00c9TELEI": { diff --git a/erpnext/accounts/page/pos/pos.js b/erpnext/accounts/page/pos/pos.js index a852b76e6f..3be2dcd9fb 100644 --- a/erpnext/accounts/page/pos/pos.js +++ b/erpnext/accounts/page/pos/pos.js @@ -15,6 +15,7 @@ frappe.pages['pos'].on_page_load = function (wrapper) { cur_pos = wrapper.pos; } else { // online + frappe.flags.is_online = true frappe.set_route('point-of-sale'); } }); @@ -24,6 +25,10 @@ frappe.pages['pos'].refresh = function (wrapper) { window.onbeforeunload = function () { return wrapper.pos.beforeunload() } + + if (frappe.flags.is_online) { + frappe.set_route('point-of-sale'); + } } erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({ diff --git a/erpnext/accounts/report/general_ledger/general_ledger.html b/erpnext/accounts/report/general_ledger/general_ledger.html index 90e8059376..9e1b884e1a 100644 --- a/erpnext/accounts/report/general_ledger/general_ledger.html +++ b/erpnext/accounts/report/general_ledger/general_ledger.html @@ -22,7 +22,7 @@ {%= __("Party") %} {%= __("Debit") %} {%= __("Credit") %} - {%= __("Balance") %} + {%= __("Balance (Dr - Cr)") %} @@ -76,11 +76,11 @@ {% } %} {% } %} {% if(filters.print_in_account_currency) { %} - {%= get_currency_symbol(data[i].account_currency)%} - {%= data[i].balance_in_account_currency %} + + {%= format_currency(data[i].balance_in_account_currency, data[i].account_currency) %} + {% } else { %} - {%= get_currency_symbol()%} - {%= data[i].balance %} + {%= format_currency(data[i].balance) %} {% } %} {% } %} diff --git a/erpnext/accounts/report/general_ledger/general_ledger.py b/erpnext/accounts/report/general_ledger/general_ledger.py index b6b26b1eed..8e4259c542 100644 --- a/erpnext/accounts/report/general_ledger/general_ledger.py +++ b/erpnext/accounts/report/general_ledger/general_ledger.py @@ -241,13 +241,13 @@ def get_result_as_list(data, filters): if not d.get('posting_date'): balance, balance_in_account_currency = 0, 0 - balance, label = get_balance(d, balance, 'debit', 'credit') - d['balance'] = '{0} {1}'.format(fmt_money(abs(balance)), label) + balance = get_balance(d, balance, 'debit', 'credit') + d['balance'] = balance if filters.get("show_in_account_currency"): - balance_in_account_currency, label = get_balance(d, balance_in_account_currency, + balance_in_account_currency = get_balance(d, balance_in_account_currency, 'debit_in_account_currency', 'credit_in_account_currency') - d['balance_in_account_currency'] = '{0} {1}'.format(fmt_money(abs(balance_in_account_currency)), label) + d['balance_in_account_currency'] = balance_in_account_currency else: d['debit_in_account_currency'] = d.get('debit', 0) d['credit_in_account_currency'] = d.get('credit', 0) @@ -268,9 +268,8 @@ def get_supplier_invoice_details(): def get_balance(row, balance, debit_field, credit_field): balance += (row.get(debit_field, 0) - row.get(credit_field, 0)) - label = 'DR' if balance > 0 else 'CR' - return balance, label + return balance def get_columns(filters): columns = [ @@ -300,10 +299,10 @@ def get_columns(filters): "width": 100 }, { - "label": _("Balance"), + "label": _("Balance (Dr - Cr)"), "fieldname": "balance", - "fieldtype": "Data", - "width": 100 + "fieldtype": "Float", + "width": 130 } ] diff --git a/erpnext/controllers/selling_controller.py b/erpnext/controllers/selling_controller.py index 2ec6b83861..a64e76fdca 100644 --- a/erpnext/controllers/selling_controller.py +++ b/erpnext/controllers/selling_controller.py @@ -156,7 +156,7 @@ class SellingController(StockController): last_purchase_rate, is_stock_item = frappe.db.get_value("Item", it.item_code, ["last_purchase_rate", "is_stock_item"]) last_purchase_rate_in_sales_uom = last_purchase_rate / (it.conversion_factor or 1) - if flt(it.base_rate) < flt(last_purchase_rate_in_sales_uom): + if flt(it.base_rate) < flt(last_purchase_rate_in_sales_uom) and not self.is_return: throw_message(it.item_name, last_purchase_rate_in_sales_uom, "last purchase rate") last_valuation_rate = frappe.db.sql(""" @@ -166,7 +166,7 @@ class SellingController(StockController): """, (it.item_code, it.warehouse)) if last_valuation_rate: last_valuation_rate_in_sales_uom = last_valuation_rate[0][0] / (it.conversion_factor or 1) - if is_stock_item and flt(it.base_rate) < flt(last_valuation_rate_in_sales_uom): + if is_stock_item and flt(it.base_rate) < flt(last_valuation_rate_in_sales_uom) and not self.is_return: throw_message(it.name, last_valuation_rate_in_sales_uom, "valuation rate") diff --git a/erpnext/controllers/taxes_and_totals.py b/erpnext/controllers/taxes_and_totals.py index 4547ac1113..0e35cb89e6 100644 --- a/erpnext/controllers/taxes_and_totals.py +++ b/erpnext/controllers/taxes_and_totals.py @@ -491,11 +491,13 @@ class calculate_taxes_and_totals(object): if self.doc.doctype == "Sales Invoice" \ and self.doc.paid_amount > self.doc.grand_total and not self.doc.is_return \ and any([d.type == "Cash" for d in self.doc.payments]): + grand_total = self.doc.rounded_total or self.doc.grand_total + base_grand_total = self.doc.base_rounded_total or self.doc.base_grand_total - self.doc.change_amount = flt(self.doc.paid_amount - self.doc.grand_total + + self.doc.change_amount = flt(self.doc.paid_amount - grand_total + self.doc.write_off_amount, self.doc.precision("change_amount")) - self.doc.base_change_amount = flt(self.doc.base_paid_amount - self.doc.base_grand_total + + self.doc.base_change_amount = flt(self.doc.base_paid_amount - base_grand_total + self.doc.base_write_off_amount, self.doc.precision("base_change_amount")) def calculate_write_off_amount(self): diff --git a/erpnext/hr/doctype/payroll_entry/payroll_entry.py b/erpnext/hr/doctype/payroll_entry/payroll_entry.py index 0b4e3bf0c7..77cece3cfe 100644 --- a/erpnext/hr/doctype/payroll_entry/payroll_entry.py +++ b/erpnext/hr/doctype/payroll_entry/payroll_entry.py @@ -321,7 +321,7 @@ class PayrollEntry(Document): journal_entry.user_remark = _('Payment of salary from {0} to {1}')\ .format(self.start_date, self.end_date) journal_entry.company = self.company - journal_entry.posting_date = nowdate() + journal_entry.posting_date = self.posting_date payment_amount = flt(total_salary_amount.rounded_total, precision) diff --git a/erpnext/projects/doctype/timesheet/timesheet.js b/erpnext/projects/doctype/timesheet/timesheet.js index 43f5705e82..99ee2a2c5e 100644 --- a/erpnext/projects/doctype/timesheet/timesheet.js +++ b/erpnext/projects/doctype/timesheet/timesheet.js @@ -39,7 +39,7 @@ frappe.ui.form.on("Timesheet", { refresh: function(frm) { if(frm.doc.docstatus==1) { - if(frm.doc.per_billed < 100){ + if(frm.doc.per_billed < 100 && frm.doc.total_billable_hours && frm.doc.total_billable_hours > frm.doc.total_billed_hours){ frm.add_custom_button(__("Make Sales Invoice"), function() { frm.trigger("make_invoice") }, "fa fa-file-alt"); } diff --git a/erpnext/projects/doctype/timesheet/timesheet.py b/erpnext/projects/doctype/timesheet/timesheet.py index 01552a50c9..8d339b9ce6 100644 --- a/erpnext/projects/doctype/timesheet/timesheet.py +++ b/erpnext/projects/doctype/timesheet/timesheet.py @@ -310,16 +310,16 @@ def get_timesheet(doctype, txt, searchfield, start, page_len, filters): @frappe.whitelist() def get_timesheet_data(name, project): + data = None if project and project!='': data = get_projectwise_timesheet_data(project, name) else: data = frappe.get_all('Timesheet', fields = ["(total_billable_amount - total_billed_amount) as billing_amt", "total_billable_hours as billing_hours"], filters = {'name': name}) - return { - 'billing_hours': data[0].billing_hours, - 'billing_amount': data[0].billing_amt, - 'timesheet_detail': data[0].name if project and project!= '' else None + 'billing_hours': data[0].billing_hours if data else None, + 'billing_amount': data[0].billing_amt if data else None, + 'timesheet_detail': data[0].name if data and project and project!= '' else None } @frappe.whitelist() @@ -327,6 +327,12 @@ def make_sales_invoice(source_name, item_code=None, customer=None): target = frappe.new_doc("Sales Invoice") timesheet = frappe.get_doc('Timesheet', source_name) + if not timesheet.total_billable_hours: + frappe.throw(_("Invoice can't be made for zero billing hour")) + + if timesheet.total_billable_hours == timesheet.total_billed_hours: + frappe.throw(_("Invoice already created for all billing hours")) + hours = flt(timesheet.total_billable_hours) - flt(timesheet.total_billed_hours) billing_amount = flt(timesheet.total_billable_amount) - flt(timesheet.total_billed_amount) billing_rate = billing_amount / hours diff --git a/erpnext/public/js/controllers/taxes_and_totals.js b/erpnext/public/js/controllers/taxes_and_totals.js index 4847dae555..c1b020bbe5 100644 --- a/erpnext/public/js/controllers/taxes_and_totals.js +++ b/erpnext/public/js/controllers/taxes_and_totals.js @@ -653,11 +653,14 @@ erpnext.taxes_and_totals = erpnext.payments.extend({ var payment_types = $.map(this.frm.doc.payments, function(d) { return d.type; }); if (in_list(payment_types, 'Cash')) { - this.frm.doc.change_amount = flt(this.frm.doc.paid_amount - this.frm.doc.grand_total + + var grand_total = this.frm.doc.rounded_total || this.frm.doc.grand_total; + var base_grand_total = this.frm.doc.base_rounded_total || this.frm.doc.base_grand_total; + + this.frm.doc.change_amount = flt(this.frm.doc.paid_amount - grand_total + this.frm.doc.write_off_amount, precision("change_amount")); this.frm.doc.base_change_amount = flt(this.frm.doc.base_paid_amount - - this.frm.doc.base_grand_total + this.frm.doc.base_write_off_amount, + base_grand_total + this.frm.doc.base_write_off_amount, precision("base_change_amount")); } } diff --git a/erpnext/selling/page/point_of_sale/point_of_sale.js b/erpnext/selling/page/point_of_sale/point_of_sale.js index 5c2662c36e..2d7711523c 100644 --- a/erpnext/selling/page/point_of_sale/point_of_sale.js +++ b/erpnext/selling/page/point_of_sale/point_of_sale.js @@ -15,6 +15,7 @@ frappe.pages['point-of-sale'].on_page_load = function(wrapper) { window.cur_pos = wrapper.pos; } else { // offline + frappe.flags.is_offline = true; frappe.set_route('pos'); } }); @@ -24,6 +25,10 @@ frappe.pages['point-of-sale'].refresh = function(wrapper) { if (wrapper.pos) { cur_frm = wrapper.pos.frm; } + + if (frappe.flags.is_offline) { + frappe.set_route('pos'); + } } erpnext.pos.PointOfSale = class PointOfSale { diff --git a/erpnext/shopping_cart/cart.py b/erpnext/shopping_cart/cart.py index c3deaf238f..254d7b74af 100644 --- a/erpnext/shopping_cart/cart.py +++ b/erpnext/shopping_cart/cart.py @@ -65,10 +65,13 @@ def place_order(): from erpnext.selling.doctype.quotation.quotation import _make_sales_order sales_order = frappe.get_doc(_make_sales_order(quotation.name, ignore_permissions=True)) for item in sales_order.get("items"): - item.reserved_warehouse = frappe.db.get_value("Item", item.item_code, "website_warehouse") or None - item_stock = get_qty_in_stock(item.item_code, "website_warehouse") - if item.qty > item_stock.stock_qty[0][0]: - throw(_("Only {0} in stock for item {1}").format(item_stock.stock_qty[0][0], item.item_code)) + item.reserved_warehouse, is_stock_item = frappe.db.get_value("Item", + item.item_code, ["website_warehouse", "is_stock_item"]) or None, None + + if is_stock_item: + item_stock = get_qty_in_stock(item.item_code, "website_warehouse") + if item.qty > item_stock.stock_qty[0][0]: + throw(_("Only {0} in stock for item {1}").format(item_stock.stock_qty[0][0], item.item_code)) sales_order.flags.ignore_permissions = True sales_order.insert()