Merge pull request #35996 from frappe/version-14-hotfix

chore: release v14
This commit is contained in:
Deepesh Garg
2023-07-05 15:16:47 +05:30
committed by GitHub
24 changed files with 729 additions and 568 deletions

View File

@@ -2,10 +2,6 @@
"country_code": "nl", "country_code": "nl",
"name": "Netherlands - Grootboekschema", "name": "Netherlands - Grootboekschema",
"tree": { "tree": {
"FABRIKAGEREKENINGEN": {
"is_group": 1,
"root_type": "Expense"
},
"FINANCIELE REKENINGEN, KORTLOPENDE VORDERINGEN EN SCHULDEN": { "FINANCIELE REKENINGEN, KORTLOPENDE VORDERINGEN EN SCHULDEN": {
"Bank": { "Bank": {
"RABO Bank": { "RABO Bank": {
@@ -13,64 +9,6 @@
}, },
"account_type": "Bank" "account_type": "Bank"
}, },
"KORTLOPENDE SCHULDEN": {
"Af te dragen Btw-verlegd": {
"account_type": "Tax"
},
"Afdracht loonheffing": {},
"Btw af te dragen hoog": {
"account_type": "Tax"
},
"Btw af te dragen laag": {
"account_type": "Tax"
},
"Btw af te dragen overig": {
"account_type": "Tax"
},
"Btw oude jaren": {
"account_type": "Tax"
},
"Btw te vorderen hoog": {
"account_type": "Tax"
},
"Btw te vorderen laag": {
"account_type": "Tax"
},
"Btw te vorderen overig": {
"account_type": "Tax"
},
"Btw-afdracht": {
"account_type": "Tax"
},
"Crediteuren": {
"account_type": "Payable"
},
"Dividend": {},
"Dividendbelasting": {},
"Energiekosten 1": {},
"Investeringsaftrek": {},
"Loonheffing": {},
"Overige te betalen posten": {},
"Pensioenpremies 1": {},
"Premie WIR": {},
"Rekening-courant inkoopvereniging": {},
"Rente": {},
"Sociale lasten 1": {},
"Stock Recieved niet gefactureerd": {
"account_type": "Stock Received But Not Billed"
},
"Tanti\u00e8mes 1": {},
"Te vorderen Btw-verlegd": {
"account_type": "Tax"
},
"Telefoon/telefax 1": {},
"Termijnen onderh. werk": {},
"Vakantiedagen": {},
"Vakantiegeld 1": {},
"Vakantiezegels": {},
"Vennootschapsbelasting": {},
"Vooruit ontvangen bedr.": {}
},
"LIQUIDE MIDDELEN": { "LIQUIDE MIDDELEN": {
"ABN-AMRO bank": {}, "ABN-AMRO bank": {},
"Bankbetaalkaarten": {}, "Bankbetaalkaarten": {},
@@ -91,6 +29,110 @@
}, },
"account_type": "Cash" "account_type": "Cash"
}, },
"TUSSENREKENINGEN": {
"Betaalwijze cadeaubonnen": {
"account_type": "Cash"
},
"Betaalwijze chipknip": {
"account_type": "Cash"
},
"Betaalwijze contant": {
"account_type": "Cash"
},
"Betaalwijze pin": {
"account_type": "Cash"
},
"Inkopen Nederland hoog": {
"account_type": "Cash"
},
"Inkopen Nederland laag": {
"account_type": "Cash"
},
"Inkopen Nederland onbelast": {
"account_type": "Cash"
},
"Inkopen Nederland overig": {
"account_type": "Cash"
},
"Inkopen Nederland verlegd": {
"account_type": "Cash"
},
"Inkopen binnen EU hoog": {
"account_type": "Cash"
},
"Inkopen binnen EU laag": {
"account_type": "Cash"
},
"Inkopen binnen EU overig": {
"account_type": "Cash"
},
"Inkopen buiten EU hoog": {
"account_type": "Cash"
},
"Inkopen buiten EU laag": {
"account_type": "Cash"
},
"Inkopen buiten EU overig": {
"account_type": "Cash"
},
"Kassa 1": {
"account_type": "Cash"
},
"Kassa 2": {
"account_type": "Cash"
},
"Netto lonen": {
"account_type": "Cash"
},
"Tegenrekening Inkopen": {
"account_type": "Cash"
},
"Tussenrek. autom. betalingen": {
"account_type": "Cash"
},
"Tussenrek. autom. loonbetalingen": {
"account_type": "Cash"
},
"Tussenrek. cadeaubonbetalingen": {
"account_type": "Cash"
},
"Tussenrekening balans": {
"account_type": "Cash"
},
"Tussenrekening chipknip": {
"account_type": "Cash"
},
"Tussenrekening correcties": {
"account_type": "Cash"
},
"Tussenrekening pin": {
"account_type": "Cash"
},
"Vraagposten": {
"account_type": "Cash"
},
"VOORRAAD GRONDSTOFFEN, HULPMATERIALEN EN HANDELSGOEDEREN": {
"Emballage": {},
"Gereed product 1": {},
"Gereed product 2": {},
"Goederen 1": {},
"Goederen 2": {},
"Goederen in consignatie": {},
"Goederen onderweg": {},
"Grondstoffen 1": {},
"Grondstoffen 2": {},
"Halffabrikaten 1": {},
"Halffabrikaten 2": {},
"Hulpstoffen 1": {},
"Hulpstoffen 2": {},
"Kantoorbenodigdheden": {},
"Onderhanden werk": {},
"Verpakkingsmateriaal": {},
"Zegels": {},
"root_type": "Asset"
},
"root_type": "Asset"
},
"VORDERINGEN": { "VORDERINGEN": {
"Debiteuren": { "Debiteuren": {
"account_type": "Receivable" "account_type": "Receivable"
@@ -105,277 +147,298 @@
}, },
"root_type": "Asset" "root_type": "Asset"
}, },
"INDIRECTE KOSTEN": { "KORTLOPENDE SCHULDEN": {
"Af te dragen Btw-verlegd": {
"account_type": "Tax"
},
"Afdracht loonheffing": {},
"Btw af te dragen hoog": {
"account_type": "Tax"
},
"Btw af te dragen laag": {
"account_type": "Tax"
},
"Btw af te dragen overig": {
"account_type": "Tax"
},
"Btw oude jaren": {
"account_type": "Tax"
},
"Btw te vorderen hoog": {
"account_type": "Tax"
},
"Btw te vorderen laag": {
"account_type": "Tax"
},
"Btw te vorderen overig": {
"account_type": "Tax"
},
"Btw-afdracht": {
"account_type": "Tax"
},
"Crediteuren": {
"account_type": "Payable"
},
"Dividend": {},
"Dividendbelasting": {},
"Energiekosten 1": {},
"Investeringsaftrek": {},
"Loonheffing": {},
"Overige te betalen posten": {},
"Pensioenpremies 1": {},
"Premie WIR": {},
"Rekening-courant inkoopvereniging": {},
"Rente": {},
"Sociale lasten 1": {},
"Stock Recieved niet gefactureerd": {
"account_type": "Stock Received But Not Billed"
},
"Tanti\u00e8mes 1": {},
"Te vorderen Btw-verlegd": {
"account_type": "Tax"
},
"Telefoon/telefax 1": {},
"Termijnen onderh. werk": {},
"Vakantiedagen": {},
"Vakantiegeld 1": {},
"Vakantiezegels": {},
"Vennootschapsbelasting": {},
"Vooruit ontvangen bedr.": {},
"is_group": 1,
"root_type": "Liability"
},
"FABRIKAGEREKENINGEN": {
"is_group": 1, "is_group": 1,
"root_type": "Expense" "root_type": "Expense",
}, "INDIRECTE KOSTEN": {
"KOSTENREKENINGEN": { "is_group": 1,
"AFSCHRIJVINGEN": { "root_type": "Expense"
"Aanhangwagens": {}, },
"Aankoopkosten": {}, "KOSTENREKENINGEN": {
"Aanloopkosten": {}, "AFSCHRIJVINGEN": {
"Auteursrechten": {}, "Aanhangwagens": {},
"Bedrijfsgebouwen": {}, "Aankoopkosten": {},
"Bedrijfsinventaris": { "Aanloopkosten": {},
"Auteursrechten": {},
"Bedrijfsgebouwen": {},
"Bedrijfsinventaris": {
"account_type": "Depreciation"
},
"Drankvergunningen": {},
"Fabrieksinventaris": {
"account_type": "Depreciation"
},
"Gebouwen": {},
"Gereedschappen": {},
"Goodwill": {},
"Grondverbetering": {},
"Heftrucks": {},
"Kantine-inventaris": {},
"Kantoorinventaris": {
"account_type": "Depreciation"
},
"Kantoormachines": {},
"Licenties": {},
"Machines 1": {},
"Magazijninventaris": {},
"Octrooien": {},
"Ontwikkelingskosten": {},
"Pachtersinvestering": {},
"Parkeerplaats": {},
"Personenauto's": {
"account_type": "Depreciation"
},
"Rijwielen en bromfietsen": {},
"Tonnagevergunningen": {},
"Verbouwingen": {},
"Vergunningen": {},
"Voorraadverschillen": {},
"Vrachtauto's": {},
"Winkels": {},
"Woon-winkelhuis": {},
"account_type": "Depreciation" "account_type": "Depreciation"
}, },
"Drankvergunningen": {}, "ALGEMENE KOSTEN": {
"Fabrieksinventaris": { "Accountantskosten": {},
"account_type": "Depreciation" "Advieskosten": {},
"Assuranties 1": {},
"Bankkosten": {},
"Juridische kosten": {},
"Overige algemene kosten": {},
"Toev. Ass. eigen risico": {}
}, },
"Gebouwen": {}, "BEDRIJFSKOSTEN": {
"Gereedschappen": {}, "Assuranties 2": {},
"Goodwill": {}, "Energie (krachtstroom)": {},
"Grondverbetering": {}, "Gereedschappen 1": {},
"Heftrucks": {}, "Hulpmaterialen 1": {},
"Kantine-inventaris": {}, "Huur inventaris": {},
"Kantoorinventaris": { "Huur machines": {},
"account_type": "Depreciation" "Leasing invent.operational": {},
"Leasing mach. operational": {},
"Onderhoud inventaris": {},
"Onderhoud machines": {},
"Ophalen/vervoer afval": {},
"Overige bedrijfskosten": {}
}, },
"Kantoormachines": {}, "FINANCIERINGSKOSTEN 1": {
"Licenties": {}, "Overige rentebaten": {},
"Machines 1": {}, "Overige rentelasten": {},
"Magazijninventaris": {}, "Rente bankkrediet": {},
"Octrooien": {}, "Rente huurkoopcontracten": {},
"Ontwikkelingskosten": {}, "Rente hypotheek": {},
"Pachtersinvestering": {}, "Rente leasecontracten": {},
"Parkeerplaats": {}, "Rente lening o/g": {},
"Personenauto's": { "Rente lening u/g": {}
"account_type": "Depreciation"
}, },
"Rijwielen en bromfietsen": {}, "HUISVESTINGSKOSTEN": {
"Tonnagevergunningen": {}, "Assurantie onroerend goed": {},
"Verbouwingen": {}, "Belastingen onr. Goed": {},
"Vergunningen": {}, "Energiekosten": {},
"Voorraadverschillen": {}, "Groot onderhoud onr. Goed": {},
"Vrachtauto's": {}, "Huur": {},
"Winkels": {}, "Huurwaarde woongedeelte": {},
"Woon-winkelhuis": {}, "Onderhoud onroerend goed": {},
"account_type": "Depreciation" "Ontvangen huren": {},
}, "Overige huisvestingskosten": {},
"ALGEMENE KOSTEN": { "Pacht": {},
"Accountantskosten": {}, "Schoonmaakkosten": {},
"Advieskosten": {}, "Toevoeging egalisatieres. Groot onderhoud": {}
"Assuranties 1": {}, },
"Bankkosten": {}, "KANTOORKOSTEN": {
"Juridische kosten": {}, "Administratiekosten": {},
"Overige algemene kosten": {}, "Contributies/abonnementen": {},
"Toev. Ass. eigen risico": {} "Huur kantoorapparatuur": {},
}, "Internetaansluiting": {},
"BEDRIJFSKOSTEN": { "Kantoorbenodigdh./drukw.": {},
"Assuranties 2": {}, "Onderhoud kantoorinvent.": {},
"Energie (krachtstroom)": {}, "Overige kantoorkosten": {},
"Gereedschappen 1": {}, "Porti": {},
"Hulpmaterialen 1": {}, "Telefoon/telefax": {}
"Huur inventaris": {}, },
"Huur machines": {}, "OVERIGE BATEN EN LASTEN": {
"Leasing invent.operational": {}, "Betaalde schadevergoed.": {},
"Leasing mach. operational": {}, "Boekverlies vaste activa": {},
"Onderhoud inventaris": {}, "Boekwinst van vaste activa": {},
"Onderhoud machines": {}, "K.O. regeling OB": {},
"Ophalen/vervoer afval": {}, "Kasverschillen": {},
"Overige bedrijfskosten": {} "Kosten loonbelasting": {},
}, "Kosten omzetbelasting": {},
"FINANCIERINGSKOSTEN 1": { "Nadelige koersverschillen": {},
"Overige rentebaten": {}, "Naheffing bedrijfsver.": {},
"Overige rentelasten": {}, "Ontvangen schadevergoed.": {},
"Rente bankkrediet": {}, "Overige baten": {},
"Rente huurkoopcontracten": {}, "Overige lasten": {},
"Rente hypotheek": {}, "Voordelige koersverschil.": {}
"Rente leasecontracten": {}, },
"Rente lening o/g": {}, "PERSONEELSKOSTEN": {
"Rente lening u/g": {} "Autokostenvergoeding": {},
}, "Bedrijfskleding": {},
"HUISVESTINGSKOSTEN": { "Belastingvrije uitkeringen": {},
"Assurantie onroerend goed": {}, "Bijzondere beloningen": {},
"Belastingen onr. Goed": {}, "Congressen, seminars en symposia": {},
"Energiekosten": {}, "Gereedschapsgeld": {},
"Groot onderhoud onr. Goed": {}, "Geschenken personeel": {},
"Huur": {}, "Gratificaties": {},
"Huurwaarde woongedeelte": {}, "Inhouding pensioenpremies": {},
"Onderhoud onroerend goed": {}, "Inhouding sociale lasten": {},
"Ontvangen huren": {}, "Kantinekosten": {},
"Overige huisvestingskosten": {}, "Lonen en salarissen": {},
"Pacht": {}, "Loonwerk": {},
"Schoonmaakkosten": {}, "Managementvergoedingen": {},
"Toevoeging egalisatieres. Groot onderhoud": {} "Opleidingskosten": {},
}, "Oprenting stamrechtverpl.": {},
"KANTOORKOSTEN": { "Overhevelingstoeslag": {},
"Administratiekosten": {}, "Overige kostenverg.": {},
"Contributies/abonnementen": {}, "Overige personeelskosten": {},
"Huur kantoorapparatuur": {}, "Overige uitkeringen": {},
"Internetaansluiting": {}, "Pensioenpremies": {},
"Kantoorbenodigdh./drukw.": {}, "Provisie 1": {},
"Onderhoud kantoorinvent.": {}, "Reiskosten": {},
"Overige kantoorkosten": {}, "Rijwielvergoeding": {},
"Porti": {}, "Sociale lasten": {},
"Telefoon/telefax": {} "Tanti\u00e8mes": {},
}, "Thuiswerkers": {},
"OVERIGE BATEN EN LASTEN": { "Toev. Backservice pens.verpl.": {},
"Betaalde schadevergoed.": {}, "Toevoeging pensioenverpl.": {},
"Boekverlies vaste activa": {}, "Uitkering ziekengeld": {},
"Boekwinst van vaste activa": {}, "Uitzendkrachten": {},
"K.O. regeling OB": {}, "Vakantiebonnen": {},
"Kasverschillen": {}, "Vakantiegeld": {},
"Kosten loonbelasting": {}, "Vergoeding studiekosten": {},
"Kosten omzetbelasting": {}, "Wervingskosten personeel": {}
"Nadelige koersverschillen": {}, },
"Naheffing bedrijfsver.": {}, "VERKOOPKOSTEN": {
"Ontvangen schadevergoed.": {}, "Advertenties": {},
"Overige baten": {}, "Afschrijving dubieuze deb.": {},
"Overige lasten": {}, "Beurskosten": {},
"Voordelige koersverschil.": {} "Etalagekosten": {},
}, "Exportkosten": {},
"PERSONEELSKOSTEN": { "Kascorrecties": {},
"Autokostenvergoeding": {}, "Overige verkoopkosten": {},
"Bedrijfskleding": {}, "Provisie": {},
"Belastingvrije uitkeringen": {}, "Reclame": {},
"Bijzondere beloningen": {}, "Reis en verblijfkosten": {},
"Congressen, seminars en symposia": {}, "Relatiegeschenken": {},
"Gereedschapsgeld": {}, "Representatiekosten": {},
"Geschenken personeel": {}, "Uitgaande vrachten": {},
"Gratificaties": {}, "Veilingkosten": {},
"Inhouding pensioenpremies": {}, "Verpakkingsmateriaal 1": {},
"Inhouding sociale lasten": {}, "Websitekosten": {}
"Kantinekosten": {}, },
"Lonen en salarissen": {}, "VERVOERSKOSTEN": {
"Loonwerk": {}, "Assuranties auto's": {},
"Managementvergoedingen": {}, "Brandstoffen": {},
"Opleidingskosten": {}, "Leasing auto's": {},
"Oprenting stamrechtverpl.": {}, "Onderhoud personenauto's": {},
"Overhevelingstoeslag": {}, "Onderhoud vrachtauto's": {},
"Overige kostenverg.": {}, "Overige vervoerskosten": {},
"Overige personeelskosten": {}, "Priv\u00e9-gebruik auto's": {},
"Overige uitkeringen": {}, "Wegenbelasting": {}
"Pensioenpremies": {}, },
"Provisie 1": {}, "VOORRAAD GEREED PRODUCT EN ONDERHANDEN WERK": {
"Reiskosten": {}, "Betalingskort. crediteuren": {},
"Rijwielvergoeding": {}, "Garantiekosten": {},
"Sociale lasten": {}, "Hulpmaterialen": {},
"Tanti\u00e8mes": {}, "Inkomende vrachten": {
"Thuiswerkers": {}, "account_type": "Expenses Included In Valuation"
"Toev. Backservice pens.verpl.": {}, },
"Toevoeging pensioenverpl.": {}, "Inkoop import buiten EU hoog": {},
"Uitkering ziekengeld": {}, "Inkoop import buiten EU laag": {},
"Uitzendkrachten": {}, "Inkoop import buiten EU overig": {},
"Vakantiebonnen": {}, "Inkoopbonussen": {},
"Vakantiegeld": {}, "Inkoopkosten": {},
"Vergoeding studiekosten": {}, "Inkoopprovisie": {},
"Wervingskosten personeel": {} "Inkopen BTW verlegd": {},
}, "Inkopen EU hoog tarief": {},
"VERKOOPKOSTEN": { "Inkopen EU laag tarief": {},
"Advertenties": {}, "Inkopen EU overig": {},
"Afschrijving dubieuze deb.": {}, "Inkopen hoog": {},
"Beurskosten": {}, "Inkopen laag": {},
"Etalagekosten": {}, "Inkopen nul": {},
"Exportkosten": {}, "Inkopen overig": {},
"Kascorrecties": {}, "Invoerkosten": {},
"Overige verkoopkosten": {}, "Kosten inkoopvereniging": {},
"Provisie": {}, "Kostprijs omzet grondstoffen": {
"Reclame": {}, "account_type": "Cost of Goods Sold"
"Reis en verblijfkosten": {}, },
"Relatiegeschenken": {}, "Kostprijs omzet handelsgoederen": {},
"Representatiekosten": {}, "Onttrekking uitgev.garantie": {},
"Uitgaande vrachten": {}, "Priv\u00e9-gebruik goederen": {},
"Veilingkosten": {}, "Stock aanpassing": {
"Verpakkingsmateriaal 1": {}, "account_type": "Stock Adjustment"
"Websitekosten": {} },
}, "Tegenrekening inkoop": {},
"VERVOERSKOSTEN": { "Toev. Voorz. incour. grondst.": {},
"Assuranties auto's": {}, "Toevoeging garantieverpl.": {},
"Brandstoffen": {}, "Toevoeging voorz. incour. handelsgoed.": {},
"Leasing auto's": {}, "Uitbesteed werk": {},
"Onderhoud personenauto's": {}, "Voorz. Incourourant grondst.": {},
"Onderhoud vrachtauto's": {}, "Voorz.incour. handelsgoed.": {},
"Overige vervoerskosten": {}, "root_type": "Expense"
"Priv\u00e9-gebruik auto's": {}, },
"Wegenbelasting": {} "root_type": "Expense"
}, }
"root_type": "Expense"
},
"TUSSENREKENINGEN": {
"Betaalwijze cadeaubonnen": {
"account_type": "Cash"
},
"Betaalwijze chipknip": {
"account_type": "Cash"
},
"Betaalwijze contant": {
"account_type": "Cash"
},
"Betaalwijze pin": {
"account_type": "Cash"
},
"Inkopen Nederland hoog": {
"account_type": "Cash"
},
"Inkopen Nederland laag": {
"account_type": "Cash"
},
"Inkopen Nederland onbelast": {
"account_type": "Cash"
},
"Inkopen Nederland overig": {
"account_type": "Cash"
},
"Inkopen Nederland verlegd": {
"account_type": "Cash"
},
"Inkopen binnen EU hoog": {
"account_type": "Cash"
},
"Inkopen binnen EU laag": {
"account_type": "Cash"
},
"Inkopen binnen EU overig": {
"account_type": "Cash"
},
"Inkopen buiten EU hoog": {
"account_type": "Cash"
},
"Inkopen buiten EU laag": {
"account_type": "Cash"
},
"Inkopen buiten EU overig": {
"account_type": "Cash"
},
"Kassa 1": {
"account_type": "Cash"
},
"Kassa 2": {
"account_type": "Cash"
},
"Netto lonen": {
"account_type": "Cash"
},
"Tegenrekening Inkopen": {
"account_type": "Cash"
},
"Tussenrek. autom. betalingen": {
"account_type": "Cash"
},
"Tussenrek. autom. loonbetalingen": {
"account_type": "Cash"
},
"Tussenrek. cadeaubonbetalingen": {
"account_type": "Cash"
},
"Tussenrekening balans": {
"account_type": "Cash"
},
"Tussenrekening chipknip": {
"account_type": "Cash"
},
"Tussenrekening correcties": {
"account_type": "Cash"
},
"Tussenrekening pin": {
"account_type": "Cash"
},
"Vraagposten": {
"account_type": "Cash"
},
"root_type": "Asset"
}, },
"VASTE ACTIVA, EIGEN VERMOGEN, LANGLOPEND VREEMD VERMOGEN EN VOORZIENINGEN": { "VASTE ACTIVA, EIGEN VERMOGEN, LANGLOPEND VREEMD VERMOGEN EN VOORZIENINGEN": {
"EIGEN VERMOGEN": { "EIGEN VERMOGEN": {
@@ -602,7 +665,7 @@
"account_type": "Equity" "account_type": "Equity"
} }
}, },
"root_type": "Asset" "root_type": "Equity"
}, },
"VERKOOPRESULTATEN": { "VERKOOPRESULTATEN": {
"Diensten fabric. 0% niet-EU": {}, "Diensten fabric. 0% niet-EU": {},
@@ -627,67 +690,6 @@
"Verleende Kredietbep. fabricage": {}, "Verleende Kredietbep. fabricage": {},
"Verleende Kredietbep. handel": {}, "Verleende Kredietbep. handel": {},
"root_type": "Income" "root_type": "Income"
},
"VOORRAAD GEREED PRODUCT EN ONDERHANDEN WERK": {
"Betalingskort. crediteuren": {},
"Garantiekosten": {},
"Hulpmaterialen": {},
"Inkomende vrachten": {
"account_type": "Expenses Included In Valuation"
},
"Inkoop import buiten EU hoog": {},
"Inkoop import buiten EU laag": {},
"Inkoop import buiten EU overig": {},
"Inkoopbonussen": {},
"Inkoopkosten": {},
"Inkoopprovisie": {},
"Inkopen BTW verlegd": {},
"Inkopen EU hoog tarief": {},
"Inkopen EU laag tarief": {},
"Inkopen EU overig": {},
"Inkopen hoog": {},
"Inkopen laag": {},
"Inkopen nul": {},
"Inkopen overig": {},
"Invoerkosten": {},
"Kosten inkoopvereniging": {},
"Kostprijs omzet grondstoffen": {
"account_type": "Cost of Goods Sold"
},
"Kostprijs omzet handelsgoederen": {},
"Onttrekking uitgev.garantie": {},
"Priv\u00e9-gebruik goederen": {},
"Stock aanpassing": {
"account_type": "Stock Adjustment"
},
"Tegenrekening inkoop": {},
"Toev. Voorz. incour. grondst.": {},
"Toevoeging garantieverpl.": {},
"Toevoeging voorz. incour. handelsgoed.": {},
"Uitbesteed werk": {},
"Voorz. Incourourant grondst.": {},
"Voorz.incour. handelsgoed.": {},
"root_type": "Expense"
},
"VOORRAAD GRONDSTOFFEN, HULPMATERIALEN EN HANDELSGOEDEREN": {
"Emballage": {},
"Gereed product 1": {},
"Gereed product 2": {},
"Goederen 1": {},
"Goederen 2": {},
"Goederen in consignatie": {},
"Goederen onderweg": {},
"Grondstoffen 1": {},
"Grondstoffen 2": {},
"Halffabrikaten 1": {},
"Halffabrikaten 2": {},
"Hulpstoffen 1": {},
"Hulpstoffen 2": {},
"Kantoorbenodigdheden": {},
"Onderhanden werk": {},
"Verpakkingsmateriaal": {},
"Zegels": {},
"root_type": "Asset"
} }
} }
} }

View File

@@ -1735,7 +1735,7 @@ def get_reference_details(reference_doctype, reference_name, party_account_curre
if not total_amount: if not total_amount:
if party_account_currency == company_currency: if party_account_currency == company_currency:
# for handling cases that don't have multi-currency (base field) # for handling cases that don't have multi-currency (base field)
total_amount = ref_doc.get("grand_total") or ref_doc.get("base_grand_total") total_amount = ref_doc.get("base_grand_total") or ref_doc.get("grand_total")
exchange_rate = 1 exchange_rate = 1
else: else:
total_amount = ref_doc.get("grand_total") total_amount = ref_doc.get("grand_total")

View File

@@ -11,6 +11,7 @@ from frappe.utils import flt, nowdate
from erpnext.accounts.doctype.payment_entry.payment_entry import ( from erpnext.accounts.doctype.payment_entry.payment_entry import (
InvalidPaymentEntry, InvalidPaymentEntry,
get_payment_entry, get_payment_entry,
get_reference_details,
) )
from erpnext.accounts.doctype.purchase_invoice.test_purchase_invoice import ( from erpnext.accounts.doctype.purchase_invoice.test_purchase_invoice import (
make_purchase_invoice, make_purchase_invoice,
@@ -1037,6 +1038,29 @@ class TestPaymentEntry(FrappeTestCase):
self.assertRaises(frappe.ValidationError, pe_draft.submit) self.assertRaises(frappe.ValidationError, pe_draft.submit)
def test_details_update_on_reference_table(self):
so = make_sales_order(
customer="_Test Customer USD", currency="USD", qty=1, rate=100, do_not_submit=True
)
so.conversion_rate = 50
so.submit()
pe = get_payment_entry("Sales Order", so.name)
pe.references.clear()
pe.paid_from = "Debtors - _TC"
pe.paid_from_account_currency = "INR"
pe.source_exchange_rate = 50
pe.save()
ref_details = get_reference_details(so.doctype, so.name, pe.paid_from_account_currency)
expected_response = {
"total_amount": 5000.0,
"outstanding_amount": 5000.0,
"exchange_rate": 1.0,
"due_date": None,
"bill_no": None,
}
self.assertDictEqual(ref_details, expected_response)
def create_payment_entry(**args): def create_payment_entry(**args):
payment_entry = frappe.new_doc("Payment Entry") payment_entry = frappe.new_doc("Payment Entry")

View File

@@ -176,6 +176,7 @@
"fieldname": "received_qty", "fieldname": "received_qty",
"fieldtype": "Float", "fieldtype": "Float",
"label": "Received Qty", "label": "Received Qty",
"no_copy": 1,
"read_only": 1 "read_only": 1
}, },
{ {
@@ -880,7 +881,7 @@
"idx": 1, "idx": 1,
"istable": 1, "istable": 1,
"links": [], "links": [],
"modified": "2022-11-29 13:01:20.438217", "modified": "2023-07-02 18:39:41.495723",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "Accounts", "module": "Accounts",
"name": "Purchase Invoice Item", "name": "Purchase Invoice Item",

View File

@@ -670,19 +670,6 @@ frappe.ui.form.on('Sales Invoice', {
} }
} }
// expense account
frm.fields_dict['items'].grid.get_field('expense_account').get_query = function(doc) {
if (erpnext.is_perpetual_inventory_enabled(doc.company)) {
return {
filters: {
'report_type': 'Profit and Loss',
'company': doc.company,
"is_group": 0
}
}
}
}
// discount account // discount account
frm.fields_dict['items'].grid.get_field('discount_account').get_query = function(doc) { frm.fields_dict['items'].grid.get_field('discount_account').get_query = function(doc) {
return { return {

View File

@@ -152,5 +152,5 @@ def get_entries(filters):
return sorted( return sorted(
journal_entries + payment_entries + loan_disbursements + loan_repayments, journal_entries + payment_entries + loan_disbursements + loan_repayments,
key=lambda k: k[2] or getdate(nowdate()), key=lambda k: k[2].strftime("%H%M%S") or getdate(nowdate()),
) )

View File

@@ -15,20 +15,21 @@ from erpnext.accounts.report.item_wise_sales_register.item_wise_sales_register i
get_group_by_conditions, get_group_by_conditions,
get_tax_accounts, get_tax_accounts,
) )
from erpnext.accounts.report.utils import get_query_columns, get_values_for_columns
def execute(filters=None): def execute(filters=None):
return _execute(filters) return _execute(filters)
def _execute(filters=None, additional_table_columns=None, additional_query_columns=None): def _execute(filters=None, additional_table_columns=None):
if not filters: if not filters:
filters = {} filters = {}
columns = get_columns(additional_table_columns, filters) columns = get_columns(additional_table_columns, filters)
company_currency = erpnext.get_company_currency(filters.company) company_currency = erpnext.get_company_currency(filters.company)
item_list = get_items(filters, additional_query_columns) item_list = get_items(filters, get_query_columns(additional_table_columns))
aii_account_map = get_aii_accounts() aii_account_map = get_aii_accounts()
if item_list: if item_list:
itemised_tax, tax_columns = get_tax_accounts( itemised_tax, tax_columns = get_tax_accounts(
@@ -79,28 +80,20 @@ def _execute(filters=None, additional_table_columns=None, additional_query_colum
"posting_date": d.posting_date, "posting_date": d.posting_date,
"supplier": d.supplier, "supplier": d.supplier,
"supplier_name": d.supplier_name, "supplier_name": d.supplier_name,
**get_values_for_columns(additional_table_columns, d),
"credit_to": d.credit_to,
"mode_of_payment": d.mode_of_payment,
"project": d.project,
"company": d.company,
"purchase_order": d.purchase_order,
"purchase_receipt": purchase_receipt,
"expense_account": expense_account,
"stock_qty": d.stock_qty,
"stock_uom": d.stock_uom,
"rate": d.base_net_amount / d.stock_qty if d.stock_qty else d.base_net_amount,
"amount": d.base_net_amount,
} }
if additional_query_columns:
for col in additional_query_columns:
row.update({col: d.get(col)})
row.update(
{
"credit_to": d.credit_to,
"mode_of_payment": d.mode_of_payment,
"project": d.project,
"company": d.company,
"purchase_order": d.purchase_order,
"purchase_receipt": purchase_receipt,
"expense_account": expense_account,
"stock_qty": d.stock_qty,
"stock_uom": d.stock_uom,
"rate": d.base_net_amount / d.stock_qty if d.stock_qty else d.base_net_amount,
"amount": d.base_net_amount,
}
)
total_tax = 0 total_tax = 0
for tax in tax_columns: for tax in tax_columns:
item_tax = itemised_tax.get(d.name, {}).get(tax, {}) item_tax = itemised_tax.get(d.name, {}).get(tax, {})
@@ -317,11 +310,6 @@ def get_conditions(filters):
def get_items(filters, additional_query_columns): def get_items(filters, additional_query_columns):
conditions = get_conditions(filters) conditions = get_conditions(filters)
if additional_query_columns:
additional_query_columns = ", " + ", ".join(additional_query_columns)
else:
additional_query_columns = ""
return frappe.db.sql( return frappe.db.sql(
""" """
select select
@@ -340,11 +328,10 @@ def get_items(filters, additional_query_columns):
from `tabPurchase Invoice`, `tabPurchase Invoice Item`, `tabItem` from `tabPurchase Invoice`, `tabPurchase Invoice Item`, `tabItem`
where `tabPurchase Invoice`.name = `tabPurchase Invoice Item`.`parent` and where `tabPurchase Invoice`.name = `tabPurchase Invoice Item`.`parent` and
`tabItem`.name = `tabPurchase Invoice Item`.`item_code` and `tabItem`.name = `tabPurchase Invoice Item`.`item_code` and
`tabPurchase Invoice`.docstatus = 1 %s `tabPurchase Invoice`.docstatus = 1 {1}
""".format( """.format(
additional_query_columns additional_query_columns, conditions
) ),
% (conditions),
filters, filters,
as_dict=1, as_dict=1,
) )

View File

@@ -9,6 +9,7 @@ from frappe.utils import cstr, flt
from frappe.utils.xlsxutils import handle_html from frappe.utils.xlsxutils import handle_html
from erpnext.accounts.report.sales_register.sales_register import get_mode_of_payments from erpnext.accounts.report.sales_register.sales_register import get_mode_of_payments
from erpnext.accounts.report.utils import get_query_columns, get_values_for_columns
from erpnext.selling.report.item_wise_sales_history.item_wise_sales_history import ( from erpnext.selling.report.item_wise_sales_history.item_wise_sales_history import (
get_customer_details, get_customer_details,
) )
@@ -18,19 +19,14 @@ def execute(filters=None):
return _execute(filters) return _execute(filters)
def _execute( def _execute(filters=None, additional_table_columns=None, additional_conditions=None):
filters=None,
additional_table_columns=None,
additional_query_columns=None,
additional_conditions=None,
):
if not filters: if not filters:
filters = {} filters = {}
columns = get_columns(additional_table_columns, filters) columns = get_columns(additional_table_columns, filters)
company_currency = frappe.get_cached_value("Company", filters.get("company"), "default_currency") company_currency = frappe.get_cached_value("Company", filters.get("company"), "default_currency")
item_list = get_items(filters, additional_query_columns, additional_conditions) item_list = get_items(filters, get_query_columns(additional_table_columns), additional_conditions)
if item_list: if item_list:
itemised_tax, tax_columns = get_tax_accounts(item_list, columns, company_currency) itemised_tax, tax_columns = get_tax_accounts(item_list, columns, company_currency)
@@ -79,30 +75,22 @@ def _execute(
"customer": d.customer, "customer": d.customer,
"customer_name": customer_record.customer_name, "customer_name": customer_record.customer_name,
"customer_group": customer_record.customer_group, "customer_group": customer_record.customer_group,
**get_values_for_columns(additional_table_columns, d),
"debit_to": d.debit_to,
"mode_of_payment": ", ".join(mode_of_payments.get(d.parent, [])),
"territory": d.territory,
"project": d.project,
"company": d.company,
"sales_order": d.sales_order,
"delivery_note": d.delivery_note,
"income_account": d.unrealized_profit_loss_account
if d.is_internal_customer == 1
else d.income_account,
"cost_center": d.cost_center,
"stock_qty": d.stock_qty,
"stock_uom": d.stock_uom,
} }
if additional_query_columns:
for col in additional_query_columns:
row.update({col: d.get(col)})
row.update(
{
"debit_to": d.debit_to,
"mode_of_payment": ", ".join(mode_of_payments.get(d.parent, [])),
"territory": d.territory,
"project": d.project,
"company": d.company,
"sales_order": d.sales_order,
"delivery_note": d.delivery_note,
"income_account": d.unrealized_profit_loss_account
if d.is_internal_customer == 1
else d.income_account,
"cost_center": d.cost_center,
"stock_qty": d.stock_qty,
"stock_uom": d.stock_uom,
}
)
if d.stock_uom != d.uom and d.stock_qty: if d.stock_uom != d.uom and d.stock_qty:
row.update({"rate": (d.base_net_rate * d.qty) / d.stock_qty, "amount": d.base_net_amount}) row.update({"rate": (d.base_net_rate * d.qty) / d.stock_qty, "amount": d.base_net_amount})
else: else:
@@ -394,11 +382,6 @@ def get_group_by_conditions(filters, doctype):
def get_items(filters, additional_query_columns, additional_conditions=None): def get_items(filters, additional_query_columns, additional_conditions=None):
conditions = get_conditions(filters, additional_conditions) conditions = get_conditions(filters, additional_conditions)
if additional_query_columns:
additional_query_columns = ", " + ", ".join(additional_query_columns)
else:
additional_query_columns = ""
return frappe.db.sql( return frappe.db.sql(
""" """
select select
@@ -424,7 +407,7 @@ def get_items(filters, additional_query_columns, additional_conditions=None):
`tabItem`.name = `tabSales Invoice Item`.`item_code` and `tabItem`.name = `tabSales Invoice Item`.`item_code` and
`tabSales Invoice`.docstatus = 1 {1} `tabSales Invoice`.docstatus = 1 {1}
""".format( """.format(
additional_query_columns or "", conditions additional_query_columns, conditions
), ),
filters, filters,
as_dict=1, as_dict=1,

View File

@@ -14,8 +14,10 @@ frappe.require("assets/erpnext/js/financial_statements.js", function() {
"label": __("Project"), "label": __("Project"),
"fieldtype": "MultiSelectList", "fieldtype": "MultiSelectList",
get_data: function(txt) { get_data: function(txt) {
return frappe.db.get_link_options('Project', txt); return frappe.db.get_link_options('Project', txt, {
} company: frappe.query_report.get_filter_value("company")
});
},
}, },
{ {
"fieldname": "include_default_book_entries", "fieldname": "include_default_book_entries",

View File

@@ -10,17 +10,18 @@ from erpnext.accounts.doctype.accounting_dimension.accounting_dimension import (
get_accounting_dimensions, get_accounting_dimensions,
get_dimension_with_children, get_dimension_with_children,
) )
from erpnext.accounts.report.utils import get_query_columns, get_values_for_columns
def execute(filters=None): def execute(filters=None):
return _execute(filters) return _execute(filters)
def _execute(filters=None, additional_table_columns=None, additional_query_columns=None): def _execute(filters=None, additional_table_columns=None):
if not filters: if not filters:
filters = {} filters = {}
invoice_list = get_invoices(filters, additional_query_columns) invoice_list = get_invoices(filters, get_query_columns(additional_table_columns))
columns, expense_accounts, tax_accounts, unrealized_profit_loss_accounts = get_columns( columns, expense_accounts, tax_accounts, unrealized_profit_loss_accounts = get_columns(
invoice_list, additional_table_columns invoice_list, additional_table_columns
) )
@@ -47,13 +48,12 @@ def _execute(filters=None, additional_table_columns=None, additional_query_colum
purchase_receipt = list(set(invoice_po_pr_map.get(inv.name, {}).get("purchase_receipt", []))) purchase_receipt = list(set(invoice_po_pr_map.get(inv.name, {}).get("purchase_receipt", [])))
project = list(set(invoice_po_pr_map.get(inv.name, {}).get("project", []))) project = list(set(invoice_po_pr_map.get(inv.name, {}).get("project", [])))
row = [inv.name, inv.posting_date, inv.supplier, inv.supplier_name] row = [
inv.name,
if additional_query_columns: inv.posting_date,
for col in additional_query_columns: inv.supplier,
row.append(inv.get(col)) inv.supplier_name,
*get_values_for_columns(additional_table_columns, inv).values(),
row += [
supplier_details.get(inv.supplier), # supplier_group supplier_details.get(inv.supplier), # supplier_group
inv.tax_id, inv.tax_id,
inv.credit_to, inv.credit_to,
@@ -244,9 +244,6 @@ def get_conditions(filters):
def get_invoices(filters, additional_query_columns): def get_invoices(filters, additional_query_columns):
if additional_query_columns:
additional_query_columns = ", " + ", ".join(additional_query_columns)
conditions = get_conditions(filters) conditions = get_conditions(filters)
return frappe.db.sql( return frappe.db.sql(
""" """
@@ -255,11 +252,10 @@ def get_invoices(filters, additional_query_columns):
remarks, base_net_total, base_grand_total, outstanding_amount, remarks, base_net_total, base_grand_total, outstanding_amount,
mode_of_payment {0} mode_of_payment {0}
from `tabPurchase Invoice` from `tabPurchase Invoice`
where docstatus = 1 %s where docstatus = 1 {1}
order by posting_date desc, name desc""".format( order by posting_date desc, name desc""".format(
additional_query_columns or "" additional_query_columns, conditions
) ),
% conditions,
filters, filters,
as_dict=1, as_dict=1,
) )

View File

@@ -11,17 +11,18 @@ from erpnext.accounts.doctype.accounting_dimension.accounting_dimension import (
get_accounting_dimensions, get_accounting_dimensions,
get_dimension_with_children, get_dimension_with_children,
) )
from erpnext.accounts.report.utils import get_query_columns, get_values_for_columns
def execute(filters=None): def execute(filters=None):
return _execute(filters) return _execute(filters)
def _execute(filters, additional_table_columns=None, additional_query_columns=None): def _execute(filters, additional_table_columns=None):
if not filters: if not filters:
filters = frappe._dict({}) filters = frappe._dict({})
invoice_list = get_invoices(filters, additional_query_columns) invoice_list = get_invoices(filters, get_query_columns(additional_table_columns))
columns, income_accounts, tax_accounts, unrealized_profit_loss_accounts = get_columns( columns, income_accounts, tax_accounts, unrealized_profit_loss_accounts = get_columns(
invoice_list, additional_table_columns invoice_list, additional_table_columns
) )
@@ -54,30 +55,22 @@ def _execute(filters, additional_table_columns=None, additional_query_columns=No
"posting_date": inv.posting_date, "posting_date": inv.posting_date,
"customer": inv.customer, "customer": inv.customer,
"customer_name": inv.customer_name, "customer_name": inv.customer_name,
**get_values_for_columns(additional_table_columns, inv),
"customer_group": inv.get("customer_group"),
"territory": inv.get("territory"),
"tax_id": inv.get("tax_id"),
"receivable_account": inv.debit_to,
"mode_of_payment": ", ".join(mode_of_payments.get(inv.name, [])),
"project": inv.project,
"owner": inv.owner,
"remarks": inv.remarks,
"sales_order": ", ".join(sales_order),
"delivery_note": ", ".join(delivery_note),
"cost_center": ", ".join(cost_center),
"warehouse": ", ".join(warehouse),
"currency": company_currency,
} }
if additional_query_columns:
for col in additional_query_columns:
row.update({col: inv.get(col)})
row.update(
{
"customer_group": inv.get("customer_group"),
"territory": inv.get("territory"),
"tax_id": inv.get("tax_id"),
"receivable_account": inv.debit_to,
"mode_of_payment": ", ".join(mode_of_payments.get(inv.name, [])),
"project": inv.project,
"owner": inv.owner,
"remarks": inv.remarks,
"sales_order": ", ".join(sales_order),
"delivery_note": ", ".join(delivery_note),
"cost_center": ", ".join(cost_center),
"warehouse": ", ".join(warehouse),
"currency": company_currency,
}
)
# map income values # map income values
base_net_total = 0 base_net_total = 0
for income_acc in income_accounts: for income_acc in income_accounts:
@@ -402,9 +395,6 @@ def get_conditions(filters):
def get_invoices(filters, additional_query_columns): def get_invoices(filters, additional_query_columns):
if additional_query_columns:
additional_query_columns = ", " + ", ".join(additional_query_columns)
conditions = get_conditions(filters) conditions = get_conditions(filters)
return frappe.db.sql( return frappe.db.sql(
""" """
@@ -413,10 +403,10 @@ def get_invoices(filters, additional_query_columns):
base_net_total, base_grand_total, base_rounded_total, outstanding_amount, base_net_total, base_grand_total, base_rounded_total, outstanding_amount,
is_internal_customer, represents_company, company {0} is_internal_customer, represents_company, company {0}
from `tabSales Invoice` from `tabSales Invoice`
where docstatus = 1 %s order by posting_date desc, name desc""".format( where docstatus = 1 {1}
additional_query_columns or "" order by posting_date desc, name desc""".format(
) additional_query_columns, conditions
% conditions, ),
filters, filters,
as_dict=1, as_dict=1,
) )

View File

@@ -1,5 +1,5 @@
import frappe import frappe
from frappe.utils import flt, formatdate, get_datetime_str from frappe.utils import flt, formatdate, get_datetime_str, get_table_name
from erpnext import get_company_currency, get_default_company from erpnext import get_company_currency, get_default_company
from erpnext.accounts.doctype.fiscal_year.fiscal_year import get_from_and_to_date from erpnext.accounts.doctype.fiscal_year.fiscal_year import get_from_and_to_date
@@ -151,3 +151,32 @@ def get_invoiced_item_gross_margin(
result = sum(d.gross_profit for d in result) result = sum(d.gross_profit for d in result)
return result return result
def get_query_columns(report_columns):
if not report_columns:
return ""
columns = []
for column in report_columns:
fieldname = column["fieldname"]
if doctype := column.get("_doctype"):
columns.append(f"`{get_table_name(doctype)}`.`{fieldname}`")
else:
columns.append(fieldname)
return ", " + ", ".join(columns)
def get_values_for_columns(report_columns, report_row):
values = {}
if not report_columns:
return values
for column in report_columns:
fieldname = column["fieldname"]
values[fieldname] = report_row.get(fieldname)
return values

View File

@@ -0,0 +1,28 @@
// Copyright (c) 2023, Frappe Technologies Pvt. Ltd. and contributors
// For license information, please see license.txt
/* eslint-disable */
frappe.query_reports["Voucher-wise Balance"] = {
"filters": [
{
"fieldname": "company",
"label": __("Company"),
"fieldtype": "Link",
"options": "Company"
},
{
"fieldname":"from_date",
"label": __("From Date"),
"fieldtype": "Date",
"default": frappe.datetime.add_months(frappe.datetime.get_today(), -1),
"width": "60px"
},
{
"fieldname":"to_date",
"label": __("To Date"),
"fieldtype": "Date",
"default": frappe.datetime.get_today(),
"width": "60px"
},
]
};

View File

@@ -0,0 +1,33 @@
{
"add_total_row": 0,
"columns": [],
"creation": "2023-06-27 16:40:15.109554",
"disabled": 0,
"docstatus": 0,
"doctype": "Report",
"filters": [],
"idx": 0,
"is_standard": "Yes",
"json": "{}",
"letter_head": "LetterHead",
"modified": "2023-06-27 16:40:32.493725",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Voucher-wise Balance",
"owner": "Administrator",
"prepared_report": 0,
"ref_doctype": "GL Entry",
"report_name": "Voucher-wise Balance",
"report_type": "Script Report",
"roles": [
{
"role": "Accounts User"
},
{
"role": "Accounts Manager"
},
{
"role": "Auditor"
}
]
}

View File

@@ -0,0 +1,66 @@
# Copyright (c) 2023, Frappe Technologies Pvt. Ltd. and contributors
# For license information, please see license.txt
import frappe
from frappe import _
from frappe.query_builder.functions import Sum
def execute(filters=None):
columns = get_columns()
data = get_data(filters)
return columns, data
def get_columns():
return [
{"label": _("Voucher Type"), "fieldname": "voucher_type", "width": 300},
{
"label": _("Voucher No"),
"fieldname": "voucher_no",
"fieldtype": "Dynamic Link",
"options": "voucher_type",
"width": 300,
},
{
"fieldname": "debit",
"label": _("Debit"),
"fieldtype": "Currency",
"options": "currency",
"width": 300,
},
{
"fieldname": "credit",
"label": _("Credit"),
"fieldtype": "Currency",
"options": "currency",
"width": 300,
},
]
def get_data(filters):
gle = frappe.qb.DocType("GL Entry")
query = (
frappe.qb.from_(gle)
.select(
gle.voucher_type, gle.voucher_no, Sum(gle.debit).as_("debit"), Sum(gle.credit).as_("credit")
)
.groupby(gle.voucher_no)
)
query = apply_filters(query, filters, gle)
gl_entries = query.run(as_dict=True)
unmatched = [entry for entry in gl_entries if entry.debit != entry.credit]
return unmatched
def apply_filters(query, filters, gle):
if filters.get("company"):
query = query.where(gle.company == filters.company)
if filters.get("voucher_type"):
query = query.where(gle.voucher_type == filters.voucher_type)
if filters.get("from_date"):
query = query.where(gle.posting_date >= filters.from_date)
if filters.get("to_date"):
query = query.where(gle.posting_date <= filters.to_date)
return query

View File

@@ -329,6 +329,11 @@ def make_default_records():
"variable_label": "Total Shipments", "variable_label": "Total Shipments",
"path": "get_total_shipments", "path": "get_total_shipments",
}, },
{
"param_name": "total_ordered",
"variable_label": "Total Ordered",
"path": "get_ordered_qty",
},
] ]
install_standing_docs = [ install_standing_docs = [
{ {

View File

@@ -7,6 +7,7 @@ import sys
import frappe import frappe
from frappe import _ from frappe import _
from frappe.model.document import Document from frappe.model.document import Document
from frappe.query_builder.functions import Sum
from frappe.utils import getdate from frappe.utils import getdate
@@ -422,6 +423,23 @@ def get_total_shipments(scorecard):
return data return data
def get_ordered_qty(scorecard):
"""Returns the total number of ordered quantity (based on Purchase Orders)"""
po = frappe.qb.DocType("Purchase Order")
return (
frappe.qb.from_(po)
.select(Sum(po.total_qty))
.where(
(po.supplier == scorecard.supplier)
& (po.docstatus == 1)
& (po.transaction_date >= scorecard.get("start_date"))
& (po.transaction_date <= scorecard.get("end_date"))
)
).run(as_list=True)[0][0] or 0
def get_rfq_total_number(scorecard): def get_rfq_total_number(scorecard):
"""Gets the total number of RFQs sent to supplier""" """Gets the total number of RFQs sent to supplier"""
supplier = frappe.get_doc("Supplier", scorecard.supplier) supplier = frappe.get_doc("Supplier", scorecard.supplier)

View File

@@ -169,45 +169,50 @@ class SubcontractingController(StockController):
self.qty_to_be_received[(row.item_code, row.parent)] += row.qty self.qty_to_be_received[(row.item_code, row.parent)] += row.qty
def __get_transferred_items(self): def __get_transferred_items(self):
fields = [f"`tabStock Entry`.`{self.subcontract_data.order_field}`"] se = frappe.qb.DocType("Stock Entry")
alias_dict = { se_detail = frappe.qb.DocType("Stock Entry Detail")
"item_code": "rm_item_code",
"subcontracted_item": "main_item_code",
"basic_rate": "rate",
}
child_table_fields = [ query = (
"item_code", frappe.qb.from_(se)
"item_name", .inner_join(se_detail)
"description", .on(se.name == se_detail.parent)
"qty", .select(
"basic_rate", se[self.subcontract_data.order_field],
"amount", se_detail.item_code.as_("rm_item_code"),
"serial_no", se_detail.item_name,
"uom", se_detail.description,
"subcontracted_item", (
"stock_uom", frappe.qb.terms.Case()
"batch_no", .when(((se.purpose == "Material Transfer") & (se.is_return == 1)), -1 * se_detail.qty)
"conversion_factor", .else_(se_detail.qty)
"s_warehouse", ).as_("qty"),
"t_warehouse", se_detail.basic_rate.as_("rate"),
"item_group", se_detail.amount,
self.subcontract_data.rm_detail_field, se_detail.serial_no,
] se_detail.uom,
se_detail.subcontracted_item.as_("main_item_code"),
se_detail.stock_uom,
se_detail.batch_no,
se_detail.conversion_factor,
se_detail.s_warehouse,
se_detail.t_warehouse,
se_detail.item_group,
se_detail[self.subcontract_data.rm_detail_field],
)
.where(
(se.docstatus == 1)
& (se[self.subcontract_data.order_field].isin(self.subcontract_orders))
& (
(se.purpose == "Send to Subcontractor")
| ((se.purpose == "Material Transfer") & (se.is_return == 1))
)
)
)
if self.backflush_based_on == "BOM": if self.backflush_based_on == "BOM":
child_table_fields.append("original_item") query = query.select(se_detail.original_item)
for field in child_table_fields: return query.run(as_dict=True)
fields.append(f"`tabStock Entry Detail`.`{field}` As {alias_dict.get(field, field)}")
filters = [
["Stock Entry", "docstatus", "=", 1],
["Stock Entry", "purpose", "=", "Send to Subcontractor"],
["Stock Entry", self.subcontract_data.order_field, "in", self.subcontract_orders],
]
return frappe.get_all("Stock Entry", fields=fields, filters=filters)
def __set_alternative_item_details(self, row): def __set_alternative_item_details(self, row):
if row.get("original_item"): if row.get("original_item"):

View File

@@ -289,7 +289,8 @@
"fieldtype": "Link", "fieldtype": "Link",
"label": "Company", "label": "Company",
"options": "Company", "options": "Company",
"remember_last_selected_value": 1 "remember_last_selected_value": 1,
"reqd": 1
}, },
{ {
"fieldname": "column_break_28", "fieldname": "column_break_28",

View File

@@ -182,7 +182,9 @@ erpnext.TransactionController = class TransactionController extends erpnext.taxe
this.frm.set_query("expense_account", "items", function(doc) { this.frm.set_query("expense_account", "items", function(doc) {
return { return {
filters: { filters: {
"company": doc.company "company": doc.company,
"report_type": "Profit and Loss",
"is_group": 0
} }
}; };
}); });

View File

@@ -206,6 +206,7 @@
"fieldname": "received_qty", "fieldname": "received_qty",
"fieldtype": "Float", "fieldtype": "Float",
"label": "Received Quantity", "label": "Received Quantity",
"no_copy": 1,
"oldfieldname": "received_qty", "oldfieldname": "received_qty",
"oldfieldtype": "Currency", "oldfieldtype": "Currency",
"print_hide": 1, "print_hide": 1,
@@ -1021,7 +1022,7 @@
"idx": 1, "idx": 1,
"istable": 1, "istable": 1,
"links": [], "links": [],
"modified": "2023-02-28 15:43:04.470104", "modified": "2023-07-02 18:40:48.152637",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "Stock", "module": "Stock",
"name": "Purchase Receipt Item", "name": "Purchase Receipt Item",

View File

@@ -163,9 +163,10 @@ class SubcontractingOrder(SubcontractingController):
elif self.per_received > 0 and self.per_received < 100: elif self.per_received > 0 and self.per_received < 100:
status = "Partially Received" status = "Partially Received"
for item in self.supplied_items: for item in self.supplied_items:
if item.returned_qty: if not item.returned_qty or (item.supplied_qty - item.consumed_qty - item.returned_qty) > 0:
status = "Closed"
break break
else:
status = "Closed"
else: else:
total_required_qty = total_supplied_qty = 0 total_required_qty = total_supplied_qty = 0
for item in self.supplied_items: for item in self.supplied_items:

View File

@@ -875,7 +875,7 @@ Donor,schenker,
Donor Type information.,Donor Type informatie., Donor Type information.,Donor Type informatie.,
Donor information.,Donorinformatie., Donor information.,Donorinformatie.,
Download JSON,JSON downloaden, Download JSON,JSON downloaden,
Draft,Droogte, Draft,Concept,
Drop Ship,Drop Ship, Drop Ship,Drop Ship,
Drug,drug, Drug,drug,
Due / Reference Date cannot be after {0},Verval- / Referentiedatum kan niet na {0} zijn, Due / Reference Date cannot be after {0},Verval- / Referentiedatum kan niet na {0} zijn,
@@ -4279,7 +4279,7 @@ Failed to setup defaults for country {0}. Please contact support@erpnext.com,Kan
Row #{0}: Item {1} is not a Serialized/Batched Item. It cannot have a Serial No/Batch No against it.,Rij # {0}: artikel {1} is geen geserialiseerd / batch artikel. Het kan geen serienummer / batchnummer hebben., Row #{0}: Item {1} is not a Serialized/Batched Item. It cannot have a Serial No/Batch No against it.,Rij # {0}: artikel {1} is geen geserialiseerd / batch artikel. Het kan geen serienummer / batchnummer hebben.,
Please set {0},Stel {0} in, Please set {0},Stel {0} in,
Please set {0},Stel {0} in,supplier Please set {0},Stel {0} in,supplier
Draft,Droogte,"docstatus,=,0" Draft,Concept,"docstatus,=,0"
Cancelled,Geannuleerd,"docstatus,=,2" Cancelled,Geannuleerd,"docstatus,=,2"
Please setup Instructor Naming System in Education > Education Settings,Stel het instructeursysteem in onder onderwijs&gt; onderwijsinstellingen, Please setup Instructor Naming System in Education > Education Settings,Stel het instructeursysteem in onder onderwijs&gt; onderwijsinstellingen,
Please set Naming Series for {0} via Setup > Settings > Naming Series,Stel Naming Series in op {0} via Instellingen&gt; Instellingen&gt; Naming Series, Please set Naming Series for {0} via Setup > Settings > Naming Series,Stel Naming Series in op {0} via Instellingen&gt; Instellingen&gt; Naming Series,
@@ -8191,7 +8191,7 @@ Actual Batch Quantity,Werkelijke batchhoeveelheid,
Prevdoc DocType,Prevdoc DocType, Prevdoc DocType,Prevdoc DocType,
Parent Detail docname,Bovenliggende Detail docname, Parent Detail docname,Bovenliggende Detail docname,
"Generate packing slips for packages to be delivered. Used to notify package number, package contents and its weight.","Genereren van pakbonnen voor pakketten te leveren. Gebruikt voor pakket nummer, inhoud van de verpakking en het gewicht te melden.", "Generate packing slips for packages to be delivered. Used to notify package number, package contents and its weight.","Genereren van pakbonnen voor pakketten te leveren. Gebruikt voor pakket nummer, inhoud van de verpakking en het gewicht te melden.",
Indicates that the package is a part of this delivery (Only Draft),Geeft aan dat het pakket een onderdeel is van deze levering (alleen ontwerp), Indicates that the package is a part of this delivery (Only Draft),Geeft aan dat het pakket een onderdeel is van deze levering (alleen concept),
MAT-PAC-.YYYY.-,MAT-PAC-.YYYY.-, MAT-PAC-.YYYY.-,MAT-PAC-.YYYY.-,
From Package No.,Van Pakket No, From Package No.,Van Pakket No,
Identification of the package for the delivery (for print),Identificatie van het pakket voor de levering (voor afdrukken), Identification of the package for the delivery (for print),Identificatie van het pakket voor de levering (voor afdrukken),
Can't render this file because it is too large.