Compare commits

..

64 Commits

Author SHA1 Message Date
Frappe PR Bot
7fd4d3c882 chore(release): Bumped to Version 14.41.2
## [14.41.2](https://github.com/frappe/erpnext/compare/v14.41.1...v14.41.2) (2023-09-29)

### Bug Fixes

* incorrect qty for material request in Production Plan (backport [#37270](https://github.com/frappe/erpnext/issues/37270)) ([#37290](https://github.com/frappe/erpnext/issues/37290)) ([cfb3a9e](cfb3a9eabf))
2023-09-29 06:50:09 +00:00
mergify[bot]
cfb3a9eabf fix: incorrect qty for material request in Production Plan (backport #37270) (#37290)
fix: incorrect qty for material request in Production Plan (#37270)

(cherry picked from commit 8fe4a4d3aa)

Co-authored-by: rohitwaghchaure <rohitw1991@gmail.com>
2023-09-29 12:18:35 +05:30
Frappe PR Bot
1b86e7e2f5 chore(release): Bumped to Version 14.41.1
## [14.41.1](https://github.com/frappe/erpnext/compare/v14.41.0...v14.41.1) (2023-09-27)

### Bug Fixes

* trial balance report freezes when adding filters (backport [#37264](https://github.com/frappe/erpnext/issues/37264)) ([#37266](https://github.com/frappe/erpnext/issues/37266)) ([53817e4](53817e463f))
2023-09-27 07:08:57 +00:00
mergify[bot]
53817e463f fix: trial balance report freezes when adding filters (backport #37264) (#37266)
fix: trial balance report freezes when adding filters (#37264)

fix: Only add onclick if correct data is returned

workaround for https://github.com/frappe/datatable/issues/177

(cherry picked from commit 2dc95e5d59)

Co-authored-by: Ankush Menat <ankush@frappe.io>
2023-09-27 12:37:05 +05:30
Frappe PR Bot
abb6044291 chore(release): Bumped to Version 14.41.0
# [14.41.0](https://github.com/frappe/erpnext/compare/v14.40.0...v14.41.0) (2023-09-27)

### Bug Fixes

* allow to select parent warehouse in the website item (backport [#37047](https://github.com/frappe/erpnext/issues/37047)) ([#37173](https://github.com/frappe/erpnext/issues/37173)) ([56657b6](56657b6122))
* AP & AR summary filters to match AR  (backport [#37248](https://github.com/frappe/erpnext/issues/37248)) ([#37261](https://github.com/frappe/erpnext/issues/37261)) ([1dc58b3](1dc58b3660))
* apply gl report filters ([b4bc44d](b4bc44db4a))
* german translation of Sales and Purchase Invoice ([#37122](https://github.com/frappe/erpnext/issues/37122)) ([8236814](8236814270))
* incorrect `Parent Task` getting set for 2nd to nth child Task (backport [#37230](https://github.com/frappe/erpnext/issues/37230)) ([#37240](https://github.com/frappe/erpnext/issues/37240)) ([279f21d](279f21d1e5))
* labels for `Stock Ledger Invariant Check` report (backport [#37150](https://github.com/frappe/erpnext/issues/37150)) ([#37176](https://github.com/frappe/erpnext/issues/37176)) ([f2bcfb5](f2bcfb5f97))
* **Material Request:** consider project for item details (backport [#37215](https://github.com/frappe/erpnext/issues/37215)) ([#37221](https://github.com/frappe/erpnext/issues/37221)) ([25f800d](25f800d3f5))
* reserved qty for production plan ([#37251](https://github.com/frappe/erpnext/issues/37251)) ([0a0d5b3](0a0d5b3e66))
* serial number decimal issue ([#37242](https://github.com/frappe/erpnext/issues/37242)) ([78ab201](78ab2013e5))
* set customer currency in pos_invoice if exists ([e0da8d2](e0da8d261f))
* Update `advance_paid` in SO/PO after unlinking from advance entry ([1181dcf](1181dcf521))
* validate duplicate serial no on submit in DN ([#37243](https://github.com/frappe/erpnext/issues/37243)) ([70e2093](70e2093941))

### Features

* `Stock Ledger Variance` report (backport [#37165](https://github.com/frappe/erpnext/issues/37165)) ([#37183](https://github.com/frappe/erpnext/issues/37183)) ([02fc67c](02fc67c83c))
* Toggle net values in Trial Balance report ([57c82c1](57c82c1800))
2023-09-27 05:40:33 +00:00
Deepesh Garg
e752027709 Merge pull request #37247 from frappe/version-14-hotfix
chore: release v14
2023-09-27 11:09:00 +05:30
mergify[bot]
1dc58b3660 fix: AP & AR summary filters to match AR (backport #37248) (#37261)
* fix: set AR filters after rename

(cherry picked from commit 832d7e7d7b)

* fix: change filters for AR summary

(cherry picked from commit 7d96044d8e)

* fix: set new AP summary filters

(cherry picked from commit 76a5d94f37)

---------

Co-authored-by: Gursheen Anand <gursheen@frappe.io>
2023-09-27 10:22:27 +05:30
rohitwaghchaure
0a0d5b3e66 fix: reserved qty for production plan (#37251) 2023-09-26 17:55:33 +05:30
rohitwaghchaure
78ab2013e5 fix: serial number decimal issue (#37242) 2023-09-26 16:46:19 +05:30
s-aga-r
70e2093941 fix: validate duplicate serial no on submit in DN (#37243) 2023-09-26 16:34:19 +05:30
mergify[bot]
279f21d1e5 fix: incorrect Parent Task getting set for 2nd to nth child Task (backport #37230) (#37240)
fix: incorrect `Parent Task` getting set for 2nd to nth child Task (#37230)

(cherry picked from commit 73fc974950)

Co-authored-by: s-aga-r <sagarsharma.s312@gmail.com>
2023-09-26 13:32:05 +05:30
Deepesh Garg
ba45299e0d Merge pull request #37228 from FHenry/14_warning_depreciation_regional_france
refactor(region): Splitting of France Regional logic from ERPNext
2023-09-25 14:55:53 +05:30
Florian HENRY
c9ba777e3c refactor(region): Splitting of France Regional logic from ERPNext 2023-09-25 10:24:32 +02:00
Florian HENRY
ab8a4f7f7b Merge branch 'version-14-hotfix' of https://github.com/frappe/erpnext into 14_warning_depreciation_regional_france 2023-09-25 10:19:55 +02:00
mergify[bot]
25f800d3f5 fix(Material Request): consider project for item details (backport #37215) (#37221)
fix(Material Request): consider project for item details (#37215)

fix(Material Request): project in item details

(cherry picked from commit 7c4ebe2733)

Co-authored-by: Raffael Meyer <14891507+barredterra@users.noreply.github.com>
2023-09-24 22:24:56 +05:30
Deepesh Garg
2b8118c5e6 Merge pull request #37218 from frappe/mergify/bp/version-14-hotfix/pr-37211
feat: Toggle net values in Trial Balance report (#37211)
2023-09-24 20:19:06 +05:30
Deepesh Garg
4250a7c4d1 Merge pull request #37217 from frappe/mergify/bp/version-14-hotfix/pr-37213
fix: filter gl entries in process soa (#37213)
2023-09-24 20:18:51 +05:30
Deepesh Garg
81d52b16d9 Merge pull request #37220 from frappe/mergify/bp/version-14-hotfix/pr-37167
fix: set customer currency in pos_invoice if exists (#37167)
2023-09-24 20:18:09 +05:30
milanpethani
e0da8d261f fix: set customer currency in pos_invoice if exists
if currency exists in the profile and customer currency doesn't exists still it will update currency to None, so update customer currency only if exists

(cherry picked from commit 041d52e828)
2023-09-24 12:24:02 +00:00
Deepesh Garg
57c82c1800 feat: Toggle net values in Trial Balance report
(cherry picked from commit 06a45897de)
2023-09-24 12:15:57 +00:00
Gursheen Anand
b4bc44db4a fix: apply gl report filters
(cherry picked from commit 5346c67b02)
2023-09-24 12:15:44 +00:00
ruthra kumar
d3c9a6d975 Merge pull request #37206 from frappe/mergify/bp/version-14-hotfix/pr-37202
refactor: ignore PLE's on PCV cancellation (backport #37202)
2023-09-22 13:57:53 +05:30
ruthra kumar
9d5fce9091 refactor: ignore PLE's on PCV cancellation
(cherry picked from commit 301092dad1)
2023-09-22 08:00:36 +00:00
ruthra kumar
139a7ce911 Merge pull request #37196 from frappe/mergify/bp/version-14-hotfix/pr-37069
fix: Recalculate `advance_paid` in SO/PO after unlinking from advance entry (backport #37069)
2023-09-22 10:18:00 +05:30
marination
591c720e51 test: Impact on SO of advance PE submit and unlinking/replacement by SI
(cherry picked from commit 8a4954d713)
2023-09-22 03:06:31 +00:00
marination
1181dcf521 fix: Update advance_paid in SO/PO after unlinking from advance entry
(cherry picked from commit 426350eee6)
2023-09-22 03:06:31 +00:00
mergify[bot]
02fc67c83c feat: Stock Ledger Variance report (backport #37165) (#37183)
feat: `Stock Ledger Variance` report (#37165)

* feat: `Stock Ledger Variance` report

* refactor: `get_data()`

(cherry picked from commit acda72d616)

Co-authored-by: s-aga-r <sagarsharma.s312@gmail.com>
2023-09-21 07:49:02 +00:00
Deepesh Garg
43f3779f10 Merge pull request #37156 from frappe/mergify/bp/version-14-hotfix/pr-37122
fix: german translation of Sales and Purchase Invoice (backport #37122)
2023-09-20 22:15:43 +05:30
mergify[bot]
f2bcfb5f97 fix: labels for Stock Ledger Invariant Check report (backport #37150) (#37176)
fix: labels for `Stock Ledger Invariant Check` report (#37150)

refactor: `Stock Ledger Invariant Check` report
(cherry picked from commit f0859ecc60)

Co-authored-by: s-aga-r <sagarsharma.s312@gmail.com>
2023-09-20 19:21:54 +05:30
Raffael Meyer
03e52d3859 chore: resolve conflicts 2023-09-20 14:38:42 +02:00
mergify[bot]
56657b6122 fix: allow to select parent warehouse in the website item (backport #37047) (#37173)
fix: allow to select parent warehouse in the website item (#37047)

(cherry picked from commit e6199dc802)

Co-authored-by: rohitwaghchaure <rohitw1991@gmail.com>
2023-09-20 18:06:30 +05:30
Frappe PR Bot
2713925628 chore(release): Bumped to Version 14.40.0
# [14.40.0](https://github.com/frappe/erpnext/compare/v14.39.0...v14.40.0) (2023-09-20)

### Bug Fixes

* + btn not appearing for delivery note connection (backport [#36980](https://github.com/frappe/erpnext/issues/36980)) ([#37070](https://github.com/frappe/erpnext/issues/37070)) ([c2a0c1e](c2a0c1e989))
* accepted warehouse and rejected warehouse can't be same (backport [#36973](https://github.com/frappe/erpnext/issues/36973)) ([#37071](https://github.com/frappe/erpnext/issues/37071)) ([b56c9b9](b56c9b91f1))
* after applying coupon code, field in_words not updated ([#37133](https://github.com/frappe/erpnext/issues/37133)) ([1cb8c64](1cb8c64c94))
* Apply dimension filter, irrespective of dimesion columns ([9bc44a3](9bc44a3b40))
* asset validation misfire on debit notes ([b33db6c](b33db6c79a))
* company wise deferred accounting fields in item ([#37023](https://github.com/frappe/erpnext/issues/37023)) ([13aaff3](13aaff30a5))
* Don't allow merging accounts with different currency ([#37074](https://github.com/frappe/erpnext/issues/37074)) ([c41cb39](c41cb3930c))
* don't set from warehouse for purchase material request ([#37132](https://github.com/frappe/erpnext/issues/37132)) ([e62b783](e62b783f34))
* Duplicate Serial Nos validation in POS ([#36927](https://github.com/frappe/erpnext/issues/36927)) ([366325c](366325ca3c))
* fetch logic for repay_from_salary in loan_repayment [v14] ([#37135](https://github.com/frappe/erpnext/issues/37135)) ([480a0ca](480a0ca7a8))
* ignore user permissions for `Source Warehouse` in MR (backport [#37102](https://github.com/frappe/erpnext/issues/37102)) ([#37110](https://github.com/frappe/erpnext/issues/37110)) ([727dcc5](727dcc5034))
* incorrect stock ledger entries in DN (backport [#36944](https://github.com/frappe/erpnext/issues/36944)) ([#37066](https://github.com/frappe/erpnext/issues/37066)) ([699ad80](699ad80802))
* packed item using expired price ([413b40f](413b40f5a7))
* POS opening Issue if Product Bundle is available ([#37138](https://github.com/frappe/erpnext/issues/37138)) ([af05864](af05864e6d))
* precision issue and column name ([#37073](https://github.com/frappe/erpnext/issues/37073)) ([f2395a9](f2395a9297))
* Purchase Receipt Provisional Accounting GL Entries (backport [#37046](https://github.com/frappe/erpnext/issues/37046)) ([#37068](https://github.com/frappe/erpnext/issues/37068)) ([8772e40](8772e40bae))
* Remove redundant code ([#37001](https://github.com/frappe/erpnext/issues/37001)) ([3ecdf02](3ecdf028f2))
* **ux:** move `get_route_options_for_new_doc` to `refresh` ([#37092](https://github.com/frappe/erpnext/issues/37092)) ([a563fed](a563fed6dc))
* validate duplicate serial no in DN ([fffa13f](fffa13f22b))

### Features

* provision to create RIV from `Stock Ledger Invariant Check` report (backport [#37115](https://github.com/frappe/erpnext/issues/37115)) ([#37147](https://github.com/frappe/erpnext/issues/37147)) ([29ff0ce](29ff0ce286))
2023-09-20 06:24:47 +00:00
Deepesh Garg
428870a65d Merge pull request #37153 from frappe/version-14-hotfix
chore: release v14
2023-09-20 11:53:07 +05:30
mergify[bot]
c5df164e1c chore: translations dutch (#37042)
chore: translations dutch (#37042)

update: translations dutch
(cherry picked from commit c35dea7177)

Co-authored-by: RJPvT <48353029+RJPvT@users.noreply.github.com>
2023-09-19 20:41:53 +05:30
HENRY Florian
8c14dbd7ac chore: translation manual backport of #35697 (#37053)
chore: translation manual backport of #35697
2023-09-19 20:26:05 +05:30
Raffael Meyer
8236814270 fix: german translation of Sales and Purchase Invoice (#37122)
* fix: german translation of Purchase Invoice

* fix: german translation of Sales Invoice

(cherry picked from commit 84a9000db2)

# Conflicts:
#	erpnext/translations/de.csv
2023-09-19 14:29:56 +00:00
mergify[bot]
1cb8c64c94 fix: after applying coupon code, field in_words not updated (#37133)
fix: after applying coupon code, field in_words not updated (#37133)

* fix: after applying coupon code, field in_words not updated

* fix: changed the order of the function set_total_in_words

(cherry picked from commit 03f0abf6de)

Co-authored-by: RitvikSardana <65544983+RitvikSardana@users.noreply.github.com>
2023-09-19 19:44:29 +05:30
mergify[bot]
699ad80802 fix: incorrect stock ledger entries in DN (backport #36944) (#37066)
fix: incorrect stock ledger entries in DN (#36944)

(cherry picked from commit 0e83190c19)

Co-authored-by: rohitwaghchaure <rohitw1991@gmail.com>
2023-09-19 19:30:47 +05:30
Anand Baburajan
480a0ca7a8 fix: fetch logic for repay_from_salary in loan_repayment [v14] (#37135)
* fix: fetch logic for repay_from_salary in loan_repayment

* chore: only fetch repay_from_salary if field exists
2023-09-19 15:18:35 +05:30
mergify[bot]
29ff0ce286 feat: provision to create RIV from Stock Ledger Invariant Check report (backport #37115) (#37147)
feat: provision to create RIV from `Stock Ledger Invariant Check` report (#37115)

* feat: provision to create RIV from `Stock Ledger Invariant Check` report

* fix: `linter`

(cherry picked from commit 9c9d0ecb73)

Co-authored-by: s-aga-r <sagarsharma.s312@gmail.com>
2023-09-19 14:01:47 +05:30
RitvikSardana
af05864e6d fix: POS opening Issue if Product Bundle is available (#37138)
fix: POS opening issue because of Product Bundle
2023-09-19 13:09:35 +05:30
mergify[bot]
dfe5f63f59 refactor: more generic filters in Accounts Receivable report (backport #37131) (#37137)
* refactor: replace 'customer' filter with 'party_type' and 'party'

(cherry picked from commit ac650d2e7a)

* chore: remove stale code

(cherry picked from commit 083c82c206)

* refactor(test): AR output filtered on USD customers

(cherry picked from commit 08d91ab831)

---------

Co-authored-by: ruthra kumar <ruthra@erpnext.com>
2023-09-19 13:07:30 +05:30
RitvikSardana
366325ca3c fix: Duplicate Serial Nos validation in POS (#36927)
* fix: added validation for duplicate serial nos in pos

* chore: code cleanup

* chore: code cleanup

* fix: removed duplicate batch number validation

* chore: code cleanup
2023-09-18 16:32:45 +05:30
Frappe PR Bot
7af8aec879 chore(release): Bumped to Version 14.39.0
# [14.39.0](https://github.com/frappe/erpnext/compare/v14.38.0...v14.39.0) (2023-09-12)

### Bug Fixes

* `company` is ambiguous ([fe69d53](fe69d5364d))
* `Parent Task` link with `Project Task` (backport [#37025](https://github.com/frappe/erpnext/issues/37025)) ([#37033](https://github.com/frappe/erpnext/issues/37033)) ([6602787](66027877d3))
* correct asset daily depr schedule calculation [v14] ([#36991](https://github.com/frappe/erpnext/issues/36991)) ([2ae4463](2ae4463b76))
* generate pdf only when result exists ([53270dd](53270dd933))
* remove report field db set ([284181d](284181d766))
* show letterhead and terms for AR pdf ([2077b2c](2077b2cde4))
* Update party type for payroll payable account ([f251d6c](f251d6cb69))
* use primary key for link lookup (backport [#36919](https://github.com/frappe/erpnext/issues/36919)) ([#36978](https://github.com/frappe/erpnext/issues/36978)) ([4fede56](4fede56d98))
* **ux:** docstatus filter for `Reference Name` in QI (backport [#37024](https://github.com/frappe/erpnext/issues/37024)) ([#37028](https://github.com/frappe/erpnext/issues/37028)) ([21be889](21be889a77))

### Features

* add field for specifying pdf name ([657ca7f](657ca7ff22))
* Add half-yearly asset maintenance periodicity. (backport [#37006](https://github.com/frappe/erpnext/issues/37006)) ([#37014](https://github.com/frappe/erpnext/issues/37014)) ([acd9c69](acd9c69201))
* provision to set required by from Production Plan ([#37039](https://github.com/frappe/erpnext/issues/37039)) ([d278b11](d278b11603))
2023-09-12 12:22:33 +00:00
Deepesh Garg
69454fc804 Merge pull request #37043 from frappe/version-14-hotfix
chore: release v14
2023-09-12 17:49:56 +05:30
Florian HENRY
5c0a232e0f refactor(region): Splitting of France Regional logic from ERPNext 2023-09-10 17:24:01 +02:00
Florian HENRY
7de3d08ce3 refactor(region): Splitting of France Regional logic from ERPNext 2023-09-10 17:23:35 +02:00
Florian HENRY
fb7ca8fca2 refactor(region): Splitting of France Regional logic from ERPNext 2023-09-10 17:19:35 +02:00
Florian HENRY
d9f15e96b5 refactor(region): Splitting of France Regional logic from ERPNext 2023-09-10 17:18:42 +02:00
Frappe PR Bot
a4b80d1ec4 chore(release): Bumped to Version 14.38.0
# [14.38.0](https://github.com/frappe/erpnext/compare/v14.37.1...v14.38.0) (2023-09-06)

### Bug Fixes

* account payable currency and value ([#36859](https://github.com/frappe/erpnext/issues/36859)) ([98c2640](98c26403c1))
* added ignore_user_permissions to parent field of tree doctypes ([451cc7b](451cc7bc12))
* added validation for unique serial numbers in pos invoice ([#36302](https://github.com/frappe/erpnext/issues/36302)) ([1192736](119273639c))
* allow payment_account of loan repayment to be edited ([#36948](https://github.com/frappe/erpnext/issues/36948)) ([09e2f24](09e2f24329))
* ask for asset related accounts only when needed (backport [#36960](https://github.com/frappe/erpnext/issues/36960)) ([#36971](https://github.com/frappe/erpnext/issues/36971)) ([58163d5](58163d5aa8))
* calcuate received/paid amount on rate change in PE ([0a63266](0a632660e0))
* deduplicate gain/loss JE creation for journals as payment ([9168b3b](9168b3b0e8))
* difference amount in UI should not be calculated ([9bc2b41](9bc2b419e3))
* fetch discount amount for gle in base currency ([a8b5880](a8b58800bb))
* ignore mandatory fields while saving WO (backport [#36954](https://github.com/frappe/erpnext/issues/36954)) ([#36970](https://github.com/frappe/erpnext/issues/36970)) ([c125dea](c125dea0f1))
* index error on Receivable report based on payment terms ([#36963](https://github.com/frappe/erpnext/issues/36963)) ([e3d64fc](e3d64fc553))
* invalid gain/loss JE created on base currency Expense Claim ([068f1b5](068f1b5a6b))
* only show "Unreconcile" if reconciled ([61752ac](61752ac2b4))
* prorate factor for subscription plan ([#36953](https://github.com/frappe/erpnext/issues/36953)) ([fc79af5](fc79af5926))
* reduce threshold for bg job fn ([5a226a8](5a226a8395))
* remove withholding category from common fields ([18f8f7f](18f8f7f09c))
* Set the default filter in All Trends Report ([132957f](132957f59e))
* Set the default filter in All Trends Report ([420536c](420536ca52))
* when create doc from item dashboard default uom (buying or selling) is not correctly selected (backport [#36892](https://github.com/frappe/erpnext/issues/36892)) ([#36928](https://github.com/frappe/erpnext/issues/36928)) ([5c8bee0](5c8bee0a95))

### Features

* **RFQ:** optionally send document print ([#36363](https://github.com/frappe/erpnext/issues/36363)) ([345c608](345c6084e5))
2023-09-06 05:57:04 +00:00
ruthra kumar
260567e99e Merge pull request #36969 from frappe/version-14-hotfix
chore: release v14
2023-09-06 11:25:38 +05:30
Frappe PR Bot
09d9263082 chore(release): Bumped to Version 14.37.1
## [14.37.1](https://github.com/frappe/erpnext/compare/v14.37.0...v14.37.1) (2023-08-31)

### Bug Fixes

* calcuate received/paid amount on rate change in PE ([46bea0e](46bea0e56f))
2023-08-31 14:11:41 +00:00
ruthra kumar
38d27a13c3 Merge pull request #36890 from frappe/mergify/bp/version-14/pr-36888
fix: calcuate received/paid amount on exchange rate change in Payment Entry (backport #36888)
2023-08-31 19:39:50 +05:30
ruthra kumar
46bea0e56f fix: calcuate received/paid amount on rate change in PE
(cherry picked from commit 64d835374b)
2023-08-31 13:09:15 +00:00
Frappe PR Bot
b95ab3425a chore(release): Bumped to Version 14.37.0
# [14.37.0](https://github.com/frappe/erpnext/compare/v14.36.0...v14.37.0) (2023-08-30)

### Bug Fixes

* added valuation field type (Float/Currency) in the filter (backport [#36866](https://github.com/frappe/erpnext/issues/36866)) ([#36868](https://github.com/frappe/erpnext/issues/36868)) ([22247cf](22247cfa17))
* Allow to make return against sales invoice which has closed sales order ([0f98cc8](0f98cc85e9))
* Asset Category filter is not working in asset depreciation([#36806](https://github.com/frappe/erpnext/issues/36806)) ([bd41cb2](bd41cb221b))
* create entries for only PR items present in LCV ([#36852](https://github.com/frappe/erpnext/issues/36852)) ([d2091cc](d2091cc22c))
* error in report when data is not available to load chart in report (backport [#36842](https://github.com/frappe/erpnext/issues/36842)) ([#36853](https://github.com/frappe/erpnext/issues/36853)) ([9789b7b](9789b7bdef))
* error listindexoutofrange when save a production plan ([#36807](https://github.com/frappe/erpnext/issues/36807)) ([fd41594](fd4159423d))
* fetch JVs in tax withholding report without party values ([bc6bd81](bc6bd81f87))
* fetch rounded total while pulling reference details on SO ([adc87f1](adc87f16a3))
* missing company flag for regional fn ([#36791](https://github.com/frappe/erpnext/issues/36791)) ([c07548a](c07548a612))
* SCR return status (backport [#36793](https://github.com/frappe/erpnext/issues/36793)) ([#36796](https://github.com/frappe/erpnext/issues/36796)) ([6edfcf4](6edfcf4de8))
* Tax withholding reversal on Debit Notes ([e8dc63c](e8dc63c89c))

### Features

* **MR:** Project and Cost Center in Connections (backport [#36794](https://github.com/frappe/erpnext/issues/36794)) ([#36795](https://github.com/frappe/erpnext/issues/36795)) ([4fa0777](4fa07777e9))
2023-08-30 13:56:17 +00:00
Deepesh Garg
16edf3ac36 Merge pull request #36861 from frappe/version-14-hotfix
chore: release v14
2023-08-30 19:24:48 +05:30
Frappe PR Bot
d1b2ce35b6 chore(release): Bumped to Version 14.36.0
# [14.36.0](https://github.com/frappe/erpnext/compare/v14.35.2...v14.36.0) (2023-08-23)

### Bug Fixes

* Accounts Payable Currency bug ([94612b9](94612b90ef))
* Add company filters for account ([e62ffa9](e62ffa990d))
* add missing items labels back ([#36737](https://github.com/frappe/erpnext/issues/36737)) ([3634e80](3634e80341))
* broken advance field in Accounts Receivable summary rpt ([296a4d7](296a4d7a12))
* broken consolidated report due to finance book filter ([5bd2a09](5bd2a0923f))
* check tax and charges if it is passed ([1f76c69](1f76c6972b))
* clear dimension defaults after test ([2a467a9](2a467a9fbf))
* dict value for dimension for gl entries defined without the dimension ([11ba553](11ba553dbd))
* dimension name in remark ([01ae513](01ae513f70))
* divide offsetting amount for multiple dimensions ([1269f2d](1269f2d301))
* divide offsetting amount only when account exists ([2c8c3a0](2c8c3a022c))
* Document Name link validation in Bank Reconciliation Tool ([#36495](https://github.com/frappe/erpnext/issues/36495)) ([83cbc1b](83cbc1bef6)), closes [#35540](https://github.com/frappe/erpnext/issues/35540) [#35540](https://github.com/frappe/erpnext/issues/35540)
* don't throw if item does not have default BOM (backport [#36709](https://github.com/frappe/erpnext/issues/36709)) ([#36734](https://github.com/frappe/erpnext/issues/36734)) ([e1bd9a7](e1bd9a7e8d))
* duplicate acc dimension in test ([cdb66bf](cdb66bf198))
* fetch acc dimensions correctly when fieldname is different from name ([7ac35b4](7ac35b496a))
* fetch accounting dimension details specific to company ([c1f1a21](c1f1a21714))
* include gain/loss journal in AR/AP reports ([4606079](4606079568))
* incorrect gl balance on multi company setup ([cb9aad3](cb9aad3e87))
* incorrect schedule in asset value adjustment ([#36725](https://github.com/frappe/erpnext/issues/36725)) ([a0575ed](a0575ed2b0))
* make offsetting entry for acc dimensions ([3198f26](3198f2669d))
* make offsetting entry for all doctypes ([f578c32](f578c3219d))
* mode of payment fetched from pos profile company in POS ([c74a414](c74a414313))
* not able to make stock entry ([#36759](https://github.com/frappe/erpnext/issues/36759)) ([873ee38](873ee384a1))
* Procurement Tracker report not showing material request items ([#36768](https://github.com/frappe/erpnext/issues/36768)) ([6a9935c](6a9935c00e))
* reset dimension defaults when company changedin test ([37ef6e9](37ef6e959b))
* **RFQ:** make "update password" and "submit quotation" buttons the same size (backport [#36667](https://github.com/frappe/erpnext/issues/36667)) ([#36686](https://github.com/frappe/erpnext/issues/36686)) ([36147ec](36147ec02c))
* timeout error coming during reposting ([#36715](https://github.com/frappe/erpnext/issues/36715)) ([620b21f](620b21fec5))
* **ux:** change batch selection message to alert (backport [#36500](https://github.com/frappe/erpnext/issues/36500)) ([#36697](https://github.com/frappe/erpnext/issues/36697)) ([0a4947a](0a4947a8f6))
* **UX:** Ignore prepared report ([3e23e1f](3e23e1fb91))

### Features

* **RFQ:** make email message fully configurable (backport [#36353](https://github.com/frappe/erpnext/issues/36353)) ([#36531](https://github.com/frappe/erpnext/issues/36531)) ([c308bd5](c308bd5309))
* Tick on checkbox to include draft timesheets (backport [#36577](https://github.com/frappe/erpnext/issues/36577)) ([#36640](https://github.com/frappe/erpnext/issues/36640)) ([9668615](9668615f7e))
* utility to repost accounting ledgers without cancellation ([#36469](https://github.com/frappe/erpnext/issues/36469)) ([f8d6fe6](f8d6fe6be0))

### Performance Improvements

* pull latest details only for referenced vouchers ([47345e8](47345e81a1))
2023-08-23 02:59:58 +00:00
Deepesh Garg
a0a3519cd3 Merge pull request #36763 from frappe/version-14-hotfix
chore: release v14
2023-08-23 08:28:36 +05:30
Frappe PR Bot
de3b67c327 chore(release): Bumped to Version 14.35.2
## [14.35.2](https://github.com/frappe/erpnext/compare/v14.35.1...v14.35.2) (2023-08-18)

### Bug Fixes

* timeout error coming during reposting (backport [#36715](https://github.com/frappe/erpnext/issues/36715)) ([#36716](https://github.com/frappe/erpnext/issues/36716)) ([d5a596d](d5a596dff1))
2023-08-18 15:30:59 +00:00
mergify[bot]
d5a596dff1 fix: timeout error coming during reposting (backport #36715) (#36716)
fix: timeout error coming during reposting (#36715)

(cherry picked from commit 620b21fec5)

Co-authored-by: rohitwaghchaure <rohitw1991@gmail.com>
2023-08-18 20:59:20 +05:30
Frappe PR Bot
2aa3b30b56 chore(release): Bumped to Version 14.35.1
## [14.35.1](https://github.com/frappe/erpnext/compare/v14.35.0...v14.35.1) (2023-08-17)

### Bug Fixes

* **ux:** change batch selection message to alert ([#36500](https://github.com/frappe/erpnext/issues/36500)) ([641fe77](641fe7738c))
2023-08-17 12:32:49 +00:00
Dany Robert
641fe7738c fix(ux): change batch selection message to alert (#36500)
* fix(ux): change batch selection message to alert

* chore: linters
2023-08-17 18:01:15 +05:30
Frappe PR Bot
b773465b41 chore(release): Bumped to Version 14.35.0
# [14.35.0](https://github.com/frappe/erpnext/compare/v14.34.3...v14.35.0) (2023-08-16)

### Bug Fixes

* Allow backdated repayment cancels for term loans ([1377cf4](1377cf4cf1))
* allow negative stock condition for batch item ([#36586](https://github.com/frappe/erpnext/issues/36586)) ([ee04c6d](ee04c6d5c5))
* AR/AP report based on payment terms ([#36574](https://github.com/frappe/erpnext/issues/36574)) ([ac0fff7](ac0fff7e94))
* better remarks on Cr note created by Reconciliation ([5443592](5443592d84))
* Button Alignment center in hero slider ([#36607](https://github.com/frappe/erpnext/issues/36607)) ([b131f70](b131f70ed6)), closes [#36561](https://github.com/frappe/erpnext/issues/36561)
* cr/dr note should be posted for exc gain/loss ([349601b](349601b4b9))
* disallow mulitple SO with same PO No ([b901cfd](b901cfdbe2))
* don't show disabled items in `Item Shortage Report` (backport [#36550](https://github.com/frappe/erpnext/issues/36550)) ([#36571](https://github.com/frappe/erpnext/issues/36571)) ([19cfcea](19cfcea78e))
* fetch `Stock UOM` from Item if not set (backport [#36606](https://github.com/frappe/erpnext/issues/36606)) ([#36617](https://github.com/frappe/erpnext/issues/36617)) ([8b13185](8b13185c25))
* Group Account total not showing in Financial Statements ([2912648](2912648151))
* incorrect available qty for backdated stock reco with batch ([#36581](https://github.com/frappe/erpnext/issues/36581)) ([2800ad3](2800ad39d2))
* incorrect gain/loss on allocation change on reconciliation tool ([39c439d](39c439dc4b))
* Make default sales update frequency as monthly instead of each transaction ([4ca1f3b](4ca1f3b9cf))
* move company rename to long queue ([8083c0b](8083c0b59e))
* precision issue while submitting the stock entry ([#36575](https://github.com/frappe/erpnext/issues/36575)) ([a864e07](a864e07d4f))
* re-add permission that was unintentionally removed ([#36663](https://github.com/frappe/erpnext/issues/36663)) ([99777d3](99777d3fa4))
* **RFQ:** link to supplier portal ([eb2f68e](eb2f68ec98))
* standard formula to calculate the "difference" ([#36612](https://github.com/frappe/erpnext/issues/36612)) ([716d5c0](716d5c0b98))
* Tax withholding post LDC limit consumed ([#36611](https://github.com/frappe/erpnext/issues/36611)) ([1deebe8](1deebe8757))
* **test:** replace hardcoded reference to adv with dynamic one ([2e6bfa3](2e6bfa36de))
* **test:** test case breakage in Github Actions ([3542df7](3542df70f6))
* unhide `uom` and `stock_uom` fields in print view ([b49309c](b49309c160))
* validation blocks partial payment for SO and PO ([ce08f03](ce08f038d2))
* wrap none type rate under flt (backport [#36602](https://github.com/frappe/erpnext/issues/36602)) ([#36604](https://github.com/frappe/erpnext/issues/36604)) ([63c061e](63c061e5e8))
* wrong currency on financial-statement based reports ([#36524](https://github.com/frappe/erpnext/issues/36524)) ([3044f46](3044f46c52))

### Features

* add voucher totals in tds payable report ([#36568](https://github.com/frappe/erpnext/issues/36568)) ([90b390c](90b390c2c5))
* daily asset depreciation method ([#36587](https://github.com/frappe/erpnext/issues/36587)) ([2918127](29181274c8))
* Reallow customizing company abbreviation on setup. ([#36646](https://github.com/frappe/erpnext/issues/36646)) ([ca34b63](ca34b63470))

### Performance Improvements

* **invoice:** Faster return amount query (backport [#36556](https://github.com/frappe/erpnext/issues/36556)) ([#36557](https://github.com/frappe/erpnext/issues/36557)) ([fe41be9](fe41be953d))
2023-08-16 06:34:09 +00:00
Deepesh Garg
787118d00b Merge pull request #36658 from frappe/version-14-hotfix
chore: release v14
2023-08-16 12:02:35 +05:30
50 changed files with 1066 additions and 302 deletions

View File

@@ -3,7 +3,7 @@ import inspect
import frappe
__version__ = "14.34.3"
__version__ = "14.41.2"
def get_default_company(user=None):

View File

@@ -33,7 +33,7 @@ class PeriodClosingVoucher(AccountsController):
def on_cancel(self):
self.validate_future_closing_vouchers()
self.db_set("gle_processing_status", "In Progress")
self.ignore_linked_doctypes = ("GL Entry", "Stock Ledger Entry")
self.ignore_linked_doctypes = ("GL Entry", "Stock Ledger Entry", "Payment Ledger Entry")
gle_count = frappe.db.count(
"GL Entry",
{"voucher_type": "Period Closing Voucher", "voucher_no": self.name, "is_cancelled": 0},

View File

@@ -1,5 +1,7 @@
# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors and contributors
# For license information, please see license.txt
import collections
import frappe
@@ -43,7 +45,6 @@ class POSInvoice(SalesInvoice):
self.validate_debit_to_acc()
self.validate_write_off_account()
self.validate_change_amount()
self.validate_duplicate_serial_and_batch_no()
self.validate_change_account()
self.validate_item_cost_centers()
self.validate_warehouse()
@@ -56,6 +57,7 @@ class POSInvoice(SalesInvoice):
self.validate_payment_amount()
self.validate_loyalty_transaction()
self.validate_company_with_pos_company()
self.validate_duplicate_serial_no()
if self.coupon_code:
from erpnext.accounts.doctype.pricing_rule.utils import validate_coupon_code
@@ -156,27 +158,18 @@ class POSInvoice(SalesInvoice):
title=_("Item Unavailable"),
)
def validate_duplicate_serial_and_batch_no(self):
def validate_duplicate_serial_no(self):
serial_nos = []
batch_nos = []
for row in self.get("items"):
if row.serial_no:
serial_nos = row.serial_no.split("\n")
if row.batch_no and not row.serial_no:
batch_nos.append(row.batch_no)
if serial_nos:
for key, value in collections.Counter(serial_nos).items():
if value > 1:
frappe.throw(_("Duplicate Serial No {0} found").format("key"))
if batch_nos:
for key, value in collections.Counter(batch_nos).items():
if value > 1:
frappe.throw(_("Duplicate Batch No {0} found").format("key"))
def validate_pos_reserved_batch_qty(self, item):
filters = {"item_code": item.item_code, "warehouse": item.warehouse, "batch_no": item.batch_no}
@@ -525,7 +518,7 @@ class POSInvoice(SalesInvoice):
selling_price_list = (
customer_price_list or customer_group_price_list or profile.get("selling_price_list")
)
if customer_currency != profile.get("currency"):
if customer_currency and customer_currency != profile.get("currency"):
self.set("currency", customer_currency)
else:

View File

@@ -464,6 +464,37 @@ class TestPOSInvoice(unittest.TestCase):
pos2.insert()
self.assertRaises(frappe.ValidationError, pos2.submit)
def test_pos_invoice_with_duplicate_serial_no(self):
from erpnext.stock.doctype.serial_no.serial_no import get_serial_nos
from erpnext.stock.doctype.stock_entry.test_stock_entry import make_serialized_item
se = make_serialized_item(
company="_Test Company",
target_warehouse="Stores - _TC",
cost_center="Main - _TC",
expense_account="Cost of Goods Sold - _TC",
)
serial_nos = get_serial_nos(se.get("items")[0].serial_no)
pos = create_pos_invoice(
company="_Test Company",
debit_to="Debtors - _TC",
account_for_change_amount="Cash - _TC",
warehouse="Stores - _TC",
income_account="Sales - _TC",
expense_account="Cost of Goods Sold - _TC",
cost_center="Main - _TC",
item=se.get("items")[0].item_code,
rate=1000,
qty=2,
do_not_save=1,
)
pos.get("items")[0].has_serial_no = 1
pos.get("items")[0].serial_no = serial_nos[0] + "\n" + serial_nos[0]
self.assertRaises(frappe.ValidationError, pos.submit)
def test_invalid_serial_no_validation(self):
from erpnext.stock.doctype.stock_entry.test_stock_entry import make_serialized_item

View File

@@ -64,6 +64,7 @@ def get_report_pdf(doc, consolidated=True):
filters = get_common_filters(doc)
if doc.report == "General Ledger":
filters.update(get_gl_filters(doc, entry, tax_id, presentation_currency))
col, res = get_soa(filters)
for x in [0, -2, -1]:
res[x]["account"] = res[x]["account"].replace("'", "")
@@ -142,7 +143,8 @@ def get_gl_filters(doc, entry, tax_id, presentation_currency):
def get_ar_filters(doc, entry):
return {
"report_date": doc.posting_date if doc.posting_date else None,
"customer": entry.customer,
"party_type": "Customer",
"party": entry.customer,
"customer_name": entry.customer_name if entry.customer_name else None,
"payment_terms_template": doc.payment_terms_template if doc.payment_terms_template else None,
"sales_partner": doc.sales_partner if doc.sales_partner else None,

View File

@@ -1801,6 +1801,10 @@ class TestSalesInvoice(unittest.TestCase):
)
def test_outstanding_amount_after_advance_payment_entry_cancellation(self):
"""Test impact of advance PE submission/cancellation on SI and SO."""
from erpnext.selling.doctype.sales_order.test_sales_order import make_sales_order
sales_order = make_sales_order(item_code="138-CMS Shoe", qty=1, price_list_rate=500)
pe = frappe.get_doc(
{
"doctype": "Payment Entry",
@@ -1820,10 +1824,25 @@ class TestSalesInvoice(unittest.TestCase):
"paid_to": "_Test Cash - _TC",
}
)
pe.append(
"references",
{
"reference_doctype": "Sales Order",
"reference_name": sales_order.name,
"total_amount": sales_order.grand_total,
"outstanding_amount": sales_order.grand_total,
"allocated_amount": 300,
},
)
pe.insert()
pe.submit()
sales_order.reload()
self.assertEqual(sales_order.advance_paid, 300)
si = frappe.copy_doc(test_records[0])
si.items[0].sales_order = sales_order.name
si.items[0].so_detail = sales_order.get("items")[0].name
si.is_pos = 0
si.append(
"advances",
@@ -1831,6 +1850,7 @@ class TestSalesInvoice(unittest.TestCase):
"doctype": "Sales Invoice Advance",
"reference_type": "Payment Entry",
"reference_name": pe.name,
"reference_row": pe.references[0].name,
"advance_amount": 300,
"allocated_amount": 300,
"remarks": pe.remarks,
@@ -1839,7 +1859,13 @@ class TestSalesInvoice(unittest.TestCase):
si.insert()
si.submit()
si.load_from_db()
si.reload()
pe.reload()
sales_order.reload()
# Check if SO is unlinked/replaced by SI in PE & if SO advance paid is 0
self.assertEqual(pe.references[0].reference_name, si.name)
self.assertEqual(sales_order.advance_paid, 0.0)
# check outstanding after advance allocation
self.assertEqual(
@@ -1847,11 +1873,9 @@ class TestSalesInvoice(unittest.TestCase):
flt(si.rounded_total - si.total_advance, si.precision("outstanding_amount")),
)
# added to avoid Document has been modified exception
pe = frappe.get_doc("Payment Entry", pe.name)
pe.cancel()
si.reload()
si.load_from_db()
# check outstanding after advance cancellation
self.assertEqual(
flt(si.outstanding_amount),

View File

@@ -108,11 +108,8 @@ frappe.query_reports["Accounts Payable"] = {
},
on_change: () => {
frappe.query_report.set_filter_value('party', "");
let party_type = frappe.query_report.get_filter_value('party_type');
frappe.query_report.toggle_filter_display('supplier_group', frappe.query_report.get_filter_value('party_type') !== "Supplier");
}
},
{
"fieldname":"party",

View File

@@ -24,7 +24,7 @@ class TestAccountsReceivable(AccountsTestMixin, FrappeTestCase):
def tearDown(self):
frappe.db.rollback()
def test_accounts_receivable_with_supplier(self):
def test_accounts_payable_for_foreign_currency_supplier(self):
pi = self.create_purchase_invoice(do_not_submit=True)
pi.currency = "USD"
pi.conversion_rate = 80

View File

@@ -72,10 +72,27 @@ frappe.query_reports["Accounts Payable Summary"] = {
}
},
{
"fieldname":"supplier",
"label": __("Supplier"),
"fieldname": "party_type",
"label": __("Party Type"),
"fieldtype": "Link",
"options": "Supplier"
"options": "Party Type",
get_query: () => {
return {
filters: {
'account_type': 'Payable'
}
};
},
on_change: () => {
frappe.query_report.set_filter_value('party', "");
frappe.query_report.toggle_filter_display('supplier_group', frappe.query_report.get_filter_value('party_type') !== "Supplier");
}
},
{
"fieldname":"party",
"label": __("Party"),
"fieldtype": "Dynamic Link",
"options": "party_type",
},
{
"fieldname":"payment_terms_template",

View File

@@ -38,32 +38,29 @@ frappe.query_reports["Accounts Receivable"] = {
}
},
{
"fieldname": "customer",
"label": __("Customer"),
"fieldname": "party_type",
"label": __("Party Type"),
"fieldtype": "Link",
"options": "Customer",
"options": "Party Type",
"Default": "Customer",
get_query: () => {
return {
filters: {
'account_type': 'Receivable'
}
};
},
on_change: () => {
var customer = frappe.query_report.get_filter_value('customer');
var company = frappe.query_report.get_filter_value('company');
if (customer) {
frappe.db.get_value('Customer', customer, ["customer_name", "payment_terms"], function(value) {
frappe.query_report.set_filter_value('customer_name', value["customer_name"]);
frappe.query_report.set_filter_value('payment_terms', value["payment_terms"]);
});
frappe.db.get_value('Customer Credit Limit', {'parent': customer, 'company': company},
["credit_limit"], function(value) {
if (value) {
frappe.query_report.set_filter_value('credit_limit', value["credit_limit"]);
}
}, "Customer");
} else {
frappe.query_report.set_filter_value('customer_name', "");
frappe.query_report.set_filter_value('credit_limit', "");
frappe.query_report.set_filter_value('payment_terms', "");
}
frappe.query_report.set_filter_value('party', "");
frappe.query_report.toggle_filter_display('customer_group', frappe.query_report.get_filter_value('party_type') !== "Customer");
}
},
{
"fieldname":"party",
"label": __("Party"),
"fieldtype": "Dynamic Link",
"options": "party_type",
},
{
"fieldname": "party_account",
"label": __("Receivable Account"),
@@ -174,24 +171,6 @@ frappe.query_reports["Accounts Receivable"] = {
"fieldname": "show_remarks",
"label": __("Show Remarks"),
"fieldtype": "Check",
},
{
"fieldname": "customer_name",
"label": __("Customer Name"),
"fieldtype": "Data",
"hidden": 1
},
{
"fieldname": "payment_terms",
"label": __("Payment Tems"),
"fieldtype": "Data",
"hidden": 1
},
{
"fieldname": "credit_limit",
"label": __("Credit Limit"),
"fieldtype": "Currency",
"hidden": 1
}
],

View File

@@ -769,15 +769,12 @@ class ReceivablePayableReport(object):
self.or_filters = []
for party_type in self.party_type:
party_type_field = scrub(party_type)
self.or_filters.append(self.ple.party_type == party_type)
self.add_common_filters()
self.add_common_filters(party_type_field=party_type_field)
if party_type_field == "customer":
if self.account_type == "Receivable":
self.add_customer_filters()
elif party_type_field == "supplier":
elif self.account_type == "Payable":
self.add_supplier_filters()
if self.filters.cost_center:
@@ -793,16 +790,13 @@ class ReceivablePayableReport(object):
]
self.qb_selection_filter.append(self.ple.cost_center.isin(cost_center_list))
def add_common_filters(self, party_type_field):
def add_common_filters(self):
if self.filters.company:
self.qb_selection_filter.append(self.ple.company == self.filters.company)
if self.filters.finance_book:
self.qb_selection_filter.append(self.ple.finance_book == self.filters.finance_book)
if self.filters.get(party_type_field):
self.qb_selection_filter.append(self.ple.party == self.filters.get(party_type_field))
if self.filters.get("party_type"):
self.qb_selection_filter.append(self.filters.party_type == self.ple.party_type)
@@ -969,6 +963,20 @@ class ReceivablePayableReport(object):
fieldtype="Link",
options="Contact",
)
if self.filters.party_type == "Customer":
self.add_column(
_("Customer Name"),
fieldname="customer_name",
fieldtype="Link",
options="Customer",
)
elif self.filters.party_type == "Supplier":
self.add_column(
_("Supplier Name"),
fieldname="supplier_name",
fieldtype="Link",
options="Supplier",
)
self.add_column(label=_("Cost Center"), fieldname="cost_center", fieldtype="Data")
self.add_column(label=_("Voucher Type"), fieldname="voucher_type", fieldtype="Data")

View File

@@ -568,3 +568,40 @@ class TestAccountsReceivable(AccountsTestMixin, FrappeTestCase):
row.account_currency,
],
)
def test_usd_customer_filter(self):
filters = {
"company": self.company,
"party_type": "Customer",
"party": self.customer,
"report_date": today(),
"range1": 30,
"range2": 60,
"range3": 90,
"range4": 120,
}
si = self.create_sales_invoice(no_payment_schedule=True, do_not_submit=True)
si.currency = "USD"
si.conversion_rate = 80
si.debit_to = self.debtors_usd
si.save().submit()
name = si.name
# check invoice grand total and invoiced column's value for 3 payment terms
report = execute(filters)
expected = {
"voucher_type": si.doctype,
"voucher_no": si.name,
"party_account": self.debtors_usd,
"customer_name": self.customer,
"invoiced": 100.0,
"outstanding": 100.0,
"account_currency": "USD",
}
self.assertEqual(len(report[1]), 1)
report_output = report[1][0]
for field in expected:
with self.subTest(field=field):
self.assertEqual(report_output.get(field), expected.get(field))

View File

@@ -72,10 +72,28 @@ frappe.query_reports["Accounts Receivable Summary"] = {
}
},
{
"fieldname":"customer",
"label": __("Customer"),
"fieldname": "party_type",
"label": __("Party Type"),
"fieldtype": "Link",
"options": "Customer"
"options": "Party Type",
"Default": "Customer",
get_query: () => {
return {
filters: {
'account_type': 'Receivable'
}
};
},
on_change: () => {
frappe.query_report.set_filter_value('party', "");
frappe.query_report.toggle_filter_display('customer_group', frappe.query_report.get_filter_value('party_type') !== "Customer");
}
},
{
"fieldname":"party",
"label": __("Party"),
"fieldtype": "Dynamic Link",
"options": "party_type",
},
{
"fieldname":"customer_group",

View File

@@ -99,6 +99,12 @@ frappe.require("assets/erpnext/js/financial_statements.js", function() {
"label": __("Include Default Book Entries"),
"fieldtype": "Check",
"default": 1
},
{
"fieldname": "show_net_values",
"label": __("Show net values in opening and closing columns"),
"fieldtype": "Check",
"default": 1
}
],
"formatter": erpnext.financial_statements.formatter,

View File

@@ -120,7 +120,9 @@ def get_data(filters):
ignore_opening_entries=True,
)
calculate_values(accounts, gl_entries_by_account, opening_balances)
calculate_values(
accounts, gl_entries_by_account, opening_balances, filters.get("show_net_values")
)
accumulate_values_into_parents(accounts, accounts_by_name)
data = prepare_data(accounts, filters, parent_children_map, company_currency)
@@ -310,7 +312,7 @@ def get_opening_balance(
return gle
def calculate_values(accounts, gl_entries_by_account, opening_balances):
def calculate_values(accounts, gl_entries_by_account, opening_balances, show_net_values):
init = {
"opening_debit": 0.0,
"opening_credit": 0.0,
@@ -335,7 +337,8 @@ def calculate_values(accounts, gl_entries_by_account, opening_balances):
d["closing_debit"] = d["opening_debit"] + d["debit"]
d["closing_credit"] = d["opening_credit"] + d["credit"]
prepare_opening_closing(d)
if show_net_values:
prepare_opening_closing(d)
def calculate_total_row(accounts, company_currency):
@@ -375,7 +378,7 @@ def prepare_data(accounts, filters, parent_children_map, company_currency):
for d in accounts:
# Prepare opening closing for group account
if parent_children_map.get(d.account):
if parent_children_map.get(d.account) and filters.get("show_net_values"):
prepare_opening_closing(d)
has_value = False

View File

@@ -560,6 +560,10 @@ def update_reference_in_journal_entry(d, journal_entry, do_not_save=False):
"""
jv_detail = journal_entry.get("accounts", {"name": d["voucher_detail_no"]})[0]
# Update Advance Paid in SO/PO since they might be getting unlinked
if jv_detail.get("reference_type") in ("Sales Order", "Purchase Order"):
frappe.get_doc(jv_detail.reference_type, jv_detail.reference_name).set_total_advance_paid()
if flt(d["unadjusted_amount"]) - flt(d["allocated_amount"]) != 0:
# adjust the unreconciled balance
amount_in_account_currency = flt(d["unadjusted_amount"]) - flt(d["allocated_amount"])
@@ -625,6 +629,13 @@ def update_reference_in_payment_entry(
if d.voucher_detail_no:
existing_row = payment_entry.get("references", {"name": d["voucher_detail_no"]})[0]
# Update Advance Paid in SO/PO since they are getting unlinked
if existing_row.get("reference_doctype") in ("Sales Order", "Purchase Order"):
frappe.get_doc(
existing_row.reference_doctype, existing_row.reference_name
).set_total_advance_paid()
original_row = existing_row.as_dict().copy()
existing_row.update(reference_details)

View File

@@ -168,7 +168,6 @@ class AccountsController(TransactionBase):
self.validate_value("base_grand_total", ">=", 0)
validate_return(self)
self.set_total_in_words()
self.validate_all_documents_schedule()
@@ -207,6 +206,8 @@ class AccountsController(TransactionBase):
if self.doctype != "Material Request" and not self.ignore_pricing_rule:
apply_pricing_rule_on_transaction(self)
self.set_total_in_words()
def before_cancel(self):
validate_einvoice_fields(self)

View File

@@ -655,7 +655,7 @@ class SubcontractingController(StockController):
{
"item_code": item.rm_item_code,
"warehouse": self.supplier_warehouse,
"actual_qty": -1 * flt(item.consumed_qty),
"actual_qty": -1 * flt(item.consumed_qty, item.precision("consumed_qty")),
"dependant_sle_voucher_detail_no": item.reference_name,
},
)

View File

@@ -312,7 +312,7 @@ class TestWebsiteItem(unittest.TestCase):
# check if stock details are fetched and item not in stock with warehouse set
data = get_product_info_for_website(item_code, skip_quotation_creation=True)
self.assertFalse(bool(data.product_info["in_stock"]))
self.assertEqual(data.product_info["stock_qty"][0][0], 0)
self.assertEqual(data.product_info["stock_qty"], 0)
# disable show stock availability
setup_e_commerce_settings({"show_stock_availability": 0})
@@ -355,7 +355,7 @@ class TestWebsiteItem(unittest.TestCase):
# check if stock details are fetched and item is in stock with warehouse set
data = get_product_info_for_website(item_code, skip_quotation_creation=True)
self.assertTrue(bool(data.product_info["in_stock"]))
self.assertEqual(data.product_info["stock_qty"][0][0], 2)
self.assertEqual(data.product_info["stock_qty"], 2)
# unset warehouse
frappe.db.set_value("Website Item", {"item_code": item_code}, "website_warehouse", "")
@@ -364,7 +364,7 @@ class TestWebsiteItem(unittest.TestCase):
# (even though it has stock in some warehouse)
data = get_product_info_for_website(item_code, skip_quotation_creation=True)
self.assertFalse(bool(data.product_info["in_stock"]))
self.assertFalse(bool(data.product_info["stock_qty"]))
self.assertFalse(data.product_info["stock_qty"])
# disable show stock availability
setup_e_commerce_settings({"show_stock_availability": 0})

View File

@@ -5,12 +5,6 @@ frappe.ui.form.on('Website Item', {
onload: (frm) => {
// should never check Private
frm.fields_dict["website_image"].df.is_private = 0;
frm.set_query("website_warehouse", () => {
return {
filters: {"is_group": 0}
};
});
},
refresh: (frm) => {

View File

@@ -135,7 +135,7 @@
"fieldtype": "Column Break"
},
{
"description": "Show Stock availability based on this warehouse.",
"description": "Show Stock availability based on this warehouse. If the parent warehouse is selected, then the system will display the consolidated available quantity of all child warehouses.",
"fieldname": "website_warehouse",
"fieldtype": "Link",
"ignore_user_permissions": 1,
@@ -348,7 +348,7 @@
"index_web_pages_for_search": 1,
"links": [],
"make_attachments_public": 1,
"modified": "2022-09-30 04:01:52.090732",
"modified": "2023-09-12 14:19:22.822689",
"modified_by": "Administrator",
"module": "E-commerce",
"name": "Website Item",

View File

@@ -259,6 +259,10 @@ class ProductQuery:
)
def get_stock_availability(self, item):
from erpnext.templates.pages.wishlist import (
get_stock_availability as get_stock_availability_from_template,
)
"""Modify item object and add stock details."""
item.in_stock = False
warehouse = item.get("website_warehouse")
@@ -274,11 +278,7 @@ class ProductQuery:
else:
item.in_stock = True
elif warehouse:
# stock item and has warehouse
actual_qty = frappe.db.get_value(
"Bin", {"item_code": item.item_code, "warehouse": item.get("website_warehouse")}, "actual_qty"
)
item.in_stock = bool(flt(actual_qty))
item.in_stock = get_stock_availability_from_template(item.item_code, warehouse)
def get_cart_items(self):
customer = get_customer(silent=True)

View File

@@ -111,8 +111,8 @@ def place_order():
item_stock = get_web_item_qty_in_stock(item.item_code, "website_warehouse")
if not cint(item_stock.in_stock):
throw(_("{0} Not in Stock").format(item.item_code))
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))
if item.qty > item_stock.stock_qty:
throw(_("Only {0} in Stock for item {1}").format(item_stock.stock_qty, item.item_code))
sales_order.flags.ignore_permissions = True
sales_order.insert()
@@ -150,6 +150,10 @@ def update_cart(item_code, qty, additional_notes=None, with_items=False):
empty_card = True
else:
warehouse = frappe.get_cached_value(
"Website Item", {"item_code": item_code}, "website_warehouse"
)
quotation_items = quotation.get("items", {"item_code": item_code})
if not quotation_items:
quotation.append(
@@ -159,11 +163,13 @@ def update_cart(item_code, qty, additional_notes=None, with_items=False):
"item_code": item_code,
"qty": qty,
"additional_notes": additional_notes,
"warehouse": warehouse,
},
)
else:
quotation_items[0].qty = qty
quotation_items[0].additional_notes = additional_notes
quotation_items[0].warehouse = warehouse
apply_cart_settings(quotation=quotation)
@@ -322,6 +328,10 @@ def decorate_quotation_doc(doc):
fields = fields[2:]
d.update(frappe.db.get_value("Website Item", {"item_code": item_code}, fields, as_dict=True))
website_warehouse = frappe.get_cached_value(
"Website Item", {"item_code": item_code}, "website_warehouse"
)
d.warehouse = website_warehouse
return doc

View File

@@ -104,6 +104,8 @@ def get_attributes_and_values(item_code):
@frappe.whitelist(allow_guest=True)
def get_next_attribute_and_values(item_code, selected_attributes):
from erpnext.stock.doctype.warehouse.warehouse import get_child_warehouses
"""Find the count of Items that match the selected attributes.
Also, find the attribute values that are not applicable for further searching.
If less than equal to 10 items are found, return item_codes of those items.
@@ -168,7 +170,7 @@ def get_next_attribute_and_values(item_code, selected_attributes):
product_info = None
product_id = ""
website_warehouse = ""
warehouse = ""
if exact_match or filtered_items:
if exact_match and len(exact_match) == 1:
product_id = exact_match[0]
@@ -176,16 +178,19 @@ def get_next_attribute_and_values(item_code, selected_attributes):
product_id = list(filtered_items)[0]
if product_id:
website_warehouse = frappe.get_cached_value(
warehouse = frappe.get_cached_value(
"Website Item", {"item_code": product_id}, "website_warehouse"
)
available_qty = 0.0
if website_warehouse:
available_qty = flt(
frappe.db.get_value(
"Bin", {"item_code": product_id, "warehouse": website_warehouse}, "actual_qty"
)
if warehouse and frappe.get_cached_value("Warehouse", warehouse, "is_group") == 1:
warehouses = get_child_warehouses(warehouse)
else:
warehouses = [warehouse] if warehouse else []
for warehouse in warehouses:
available_qty += flt(
frappe.db.get_value("Bin", {"item_code": product_id, "warehouse": warehouse}, "actual_qty")
)
return {

View File

@@ -6,7 +6,14 @@
frappe.ui.form.on('Loan Repayment', {
// refresh: function(frm) {
// }
// },
setup: function(frm) {
if (frappe.meta.has_field("Loan Repayment", "repay_from_salary")) {
frm.add_fetch("against_loan", "repay_from_salary", "repay_from_salary");
}
},
onload: function(frm) {
frm.set_query('against_loan', function() {
return {

View File

@@ -80,6 +80,12 @@ class LoanRepayment(AccountsController):
if amounts.get("due_date"):
self.due_date = amounts.get("due_date")
if hasattr(self, "repay_from_salary") and hasattr(self, "payroll_payable_account"):
if self.repay_from_salary and not self.payroll_payable_account:
frappe.throw(_("Please set Payroll Payable Account in Loan Repayment"))
elif not self.repay_from_salary and self.payroll_payable_account:
self.repay_from_salary = 1
def check_future_entries(self):
future_repayment_date = frappe.db.get_value(
"Loan Repayment",

View File

@@ -1508,6 +1508,10 @@ def get_items_for_material_requests(doc, warehouses=None, get_parent_warehouse_d
def get_materials_from_other_locations(item, warehouses, new_mr_items, company):
from erpnext.stock.doctype.pick_list.pick_list import get_available_item_locations
stock_uom, purchase_uom = frappe.db.get_value(
"Item", item.get("item_code"), ["stock_uom", "purchase_uom"]
)
locations = get_available_item_locations(
item.get("item_code"), warehouses, item.get("quantity"), company, ignore_validation=True
)
@@ -1518,6 +1522,10 @@ def get_materials_from_other_locations(item, warehouses, new_mr_items, company):
if required_qty <= 0:
return
conversion_factor = 1.0
if purchase_uom != stock_uom and purchase_uom == item["uom"]:
conversion_factor = get_uom_conversion_factor(item["item_code"], item["uom"])
new_dict = copy.deepcopy(item)
quantity = required_qty if d.get("qty") > required_qty else d.get("qty")
@@ -1530,25 +1538,14 @@ def get_materials_from_other_locations(item, warehouses, new_mr_items, company):
}
)
required_qty -= quantity
required_qty -= quantity / conversion_factor
new_mr_items.append(new_dict)
# raise purchase request for remaining qty
if required_qty:
stock_uom, purchase_uom = frappe.db.get_value(
"Item", item["item_code"], ["stock_uom", "purchase_uom"]
)
if purchase_uom != stock_uom and purchase_uom == item["uom"]:
conversion_factor = get_uom_conversion_factor(item["item_code"], item["uom"])
if not (conversion_factor or frappe.flags.show_qty_in_stock_uom):
frappe.throw(
_("UOM Conversion factor ({0} -> {1}) not found for item: {2}").format(
purchase_uom, stock_uom, item["item_code"]
)
)
required_qty = required_qty / conversion_factor
precision = frappe.get_precision("Material Request Plan Item", "quantity")
if flt(required_qty, precision) > 0:
required_qty = required_qty
if frappe.db.get_value("UOM", purchase_uom, "must_be_whole_number"):
required_qty = ceil(required_qty)

View File

@@ -1039,6 +1039,59 @@ class TestProductionPlan(FrappeTestCase):
self.assertEqual(after_qty, before_qty)
def test_resered_qty_for_production_plan_for_work_order(self):
from erpnext.stock.utils import get_or_make_bin
bin_name = get_or_make_bin("Raw Material Item 1", "_Test Warehouse - _TC")
before_qty = flt(frappe.db.get_value("Bin", bin_name, "reserved_qty_for_production_plan"))
pln = create_production_plan(item_code="Test Production Item 1")
bin_name = get_or_make_bin("Raw Material Item 1", "_Test Warehouse - _TC")
after_qty = flt(frappe.db.get_value("Bin", bin_name, "reserved_qty_for_production_plan"))
self.assertEqual(after_qty - before_qty, 1)
pln.make_work_order()
work_orders = []
for row in frappe.get_all("Work Order", filters={"production_plan": pln.name}, fields=["name"]):
wo_doc = frappe.get_doc("Work Order", row.name)
wo_doc.source_warehouse = "_Test Warehouse - _TC"
wo_doc.wip_warehouse = "_Test Warehouse 1 - _TC"
wo_doc.fg_warehouse = "_Test Warehouse - _TC"
for d in wo_doc.required_items:
d.source_warehouse = "_Test Warehouse - _TC"
make_stock_entry(
item_code=d.item_code,
qty=d.required_qty,
rate=100,
target="_Test Warehouse - _TC",
)
wo_doc.submit()
work_orders.append(wo_doc)
bin_name = get_or_make_bin("Raw Material Item 1", "_Test Warehouse - _TC")
after_qty = flt(frappe.db.get_value("Bin", bin_name, "reserved_qty_for_production_plan"))
self.assertEqual(after_qty, before_qty)
rm_work_order = None
for wo_doc in work_orders:
for d in wo_doc.required_items:
if d.item_code == "Raw Material Item 1":
rm_work_order = wo_doc
break
if rm_work_order:
s = frappe.get_doc(make_se_from_wo(rm_work_order.name, "Material Transfer for Manufacture", 1))
s.submit()
bin_name = get_or_make_bin("Raw Material Item 1", "_Test Warehouse - _TC")
after_qty = flt(frappe.db.get_value("Bin", bin_name, "reserved_qty_for_production_plan"))
self.assertEqual(after_qty, before_qty)
def test_resered_qty_for_production_plan_for_material_requests_with_multi_UOM(self):
from erpnext.stock.utils import get_or_make_bin
@@ -1166,6 +1219,64 @@ class TestProductionPlan(FrappeTestCase):
if row.item_code == "SubAssembly2 For SUB Test":
self.assertEqual(row.quantity, 10)
def test_transfer_and_purchase_mrp_for_purchase_uom(self):
from erpnext.manufacturing.doctype.bom.test_bom import create_nested_bom
from erpnext.stock.doctype.warehouse.test_warehouse import create_warehouse
bom_tree = {
"Test FG Item INK PEN": {
"Test RM Item INK": {},
}
}
parent_bom = create_nested_bom(bom_tree, prefix="")
if not frappe.db.exists("UOM Conversion Detail", {"parent": "Test RM Item INK", "uom": "Kg"}):
doc = frappe.get_doc("Item", "Test RM Item INK")
doc.purchase_uom = "Kg"
doc.append("uoms", {"uom": "Kg", "conversion_factor": 0.5})
doc.save()
wh1 = create_warehouse("PNE Warehouse", company="_Test Company")
wh2 = create_warehouse("MBE Warehouse", company="_Test Company")
mrp_warhouse = create_warehouse("MRPBE Warehouse", company="_Test Company")
make_stock_entry(
item_code="Test RM Item INK",
qty=2,
rate=100,
target=wh1,
)
make_stock_entry(
item_code="Test RM Item INK",
qty=2,
rate=100,
target=wh2,
)
plan = create_production_plan(
item_code=parent_bom.item,
planned_qty=10,
do_not_submit=1,
warehouse="_Test Warehouse - _TC",
)
plan.for_warehouse = mrp_warhouse
items = get_items_for_material_requests(
plan.as_dict(), warehouses=[{"warehouse": wh1}, {"warehouse": wh2}]
)
for row in items:
row = frappe._dict(row)
if row.material_request_type == "Material Transfer":
self.assertTrue(row.from_warehouse in [wh1, wh2])
self.assertEqual(row.quantity, 2)
if row.material_request_type == "Purchase":
self.assertTrue(row.warehouse == mrp_warhouse)
self.assertEqual(row.quantity, 12)
def create_production_plan(**args):
"""

View File

@@ -1497,16 +1497,17 @@ def get_reserved_qty_for_production(
wo = frappe.qb.DocType("Work Order")
wo_item = frappe.qb.DocType("Work Order Item")
if check_production_plan:
qty_field = wo_item.required_qty
else:
qty_field = Case()
qty_field = qty_field.when(wo.skip_transfer == 0, wo_item.required_qty - wo_item.transferred_qty)
qty_field = qty_field.else_(wo_item.required_qty - wo_item.consumed_qty)
query = (
frappe.qb.from_(wo)
.from_(wo_item)
.select(
Sum(
Case()
.when(wo.skip_transfer == 0, wo_item.required_qty - wo_item.transferred_qty)
.else_(wo_item.required_qty - wo_item.consumed_qty)
)
)
.select(Sum(qty_field))
.where(
(wo_item.item_code == item_code)
& (wo_item.parent == wo.name)

View File

@@ -269,6 +269,7 @@ erpnext.patches.v13_0.show_hr_payroll_deprecation_warning
erpnext.patches.v13_0.reset_corrupt_defaults
erpnext.patches.v13_0.create_accounting_dimensions_for_asset_repair
erpnext.patches.v14_0.update_reference_due_date_in_journal_entry
erpnext.patches.v14_0.france_depreciation_warning
[post_model_sync]
execute:frappe.delete_doc_if_exists('Workspace', 'ERPNext Integrations Settings')
@@ -333,7 +334,7 @@ erpnext.patches.v14_0.update_company_in_ldc
erpnext.patches.v14_0.set_packed_qty_in_draft_delivery_notes
erpnext.patches.v14_0.cleanup_workspaces
erpnext.patches.v14_0.enable_allow_existing_serial_no
erpnext.patches.v14_0.set_report_in_process_SOA
erpnext.patches.v14_0.set_report_in_process_SOA
erpnext.patches.v14_0.create_accounting_dimensions_for_closing_balance
erpnext.patches.v14_0.update_closing_balances #15-07-2023
execute:frappe.defaults.clear_default("fiscal_year")

View File

@@ -0,0 +1,12 @@
import click
import frappe
def execute():
if "erpnext_france" in frappe.get_installed_apps():
return
click.secho(
"Feature for region France will be remove in version-15 and moved to a separate app\n"
"Please install the app to continue using the regionnal France features: https://github.com/scopen-coop/erpnext_france.git",
fg="yellow",
)

View File

@@ -67,6 +67,7 @@ class Project(Document):
tmp_task_details.append(template_task_details)
task = self.create_task_from_template(template_task_details)
project_tasks.append(task)
self.dependency_mapping(tmp_task_details, project_tasks)
def create_task_from_template(self, task_details):
@@ -105,36 +106,28 @@ class Project(Document):
def dependency_mapping(self, template_tasks, project_tasks):
for project_task in project_tasks:
if project_task.get("template_task"):
template_task = frappe.get_doc("Task", project_task.template_task)
else:
template_task = list(filter(lambda x: x.subject == project_task.subject, template_tasks))[0]
template_task = frappe.get_doc("Task", template_task.name)
template_task = frappe.get_doc("Task", project_task.template_task)
self.check_depends_on_value(template_task, project_task, project_tasks)
self.check_for_parent_tasks(template_task, project_task, project_tasks)
def check_depends_on_value(self, template_task, project_task, project_tasks):
if template_task.get("depends_on") and not project_task.get("depends_on"):
project_template_map = {pt.template_task: pt for pt in project_tasks}
for child_task in template_task.get("depends_on"):
child_task_subject = frappe.db.get_value("Task", child_task.task, "subject")
corresponding_project_task = list(
filter(lambda x: x.subject == child_task_subject, project_tasks)
)
if len(corresponding_project_task):
if project_template_map and project_template_map.get(child_task.task):
project_task.reload() # reload, as it might have been updated in the previous iteration
project_task.append("depends_on", {"task": corresponding_project_task[0].name})
project_task.append("depends_on", {"task": project_template_map.get(child_task.task).name})
project_task.save()
def check_for_parent_tasks(self, template_task, project_task, project_tasks):
if template_task.get("parent_task") and not project_task.get("parent_task"):
parent_task_subject = frappe.db.get_value("Task", template_task.get("parent_task"), "subject")
corresponding_project_task = list(
filter(lambda x: x.subject == parent_task_subject, project_tasks)
)
if len(corresponding_project_task):
project_task.parent_task = corresponding_project_task[0].name
project_task.save()
for pt in project_tasks:
if pt.template_task == template_task.parent_task:
project_task.parent_task = pt.name
project_task.save()
break
def is_row_updated(self, row, existing_task_data, fields):
if self.get("__islocal") or not existing_task_data:

View File

@@ -6,8 +6,10 @@ erpnext.financial_statements = {
if (data && column.fieldname=="account") {
value = data.account_name || value;
column.link_onclick =
"erpnext.financial_statements.open_general_ledger(" + JSON.stringify(data) + ")";
if (data.account) {
column.link_onclick =
"erpnext.financial_statements.open_general_ledger(" + JSON.stringify(data) + ")";
}
column.is_tree = true;
}

View File

@@ -1252,6 +1252,7 @@
"depends_on": "eval: doc.is_internal_customer",
"fieldname": "set_target_warehouse",
"fieldtype": "Link",
"ignore_user_permissions": 1,
"in_standard_filter": 1,
"label": "Set Target Warehouse",
"no_copy": 1,
@@ -1399,7 +1400,7 @@
"idx": 146,
"is_submittable": 1,
"links": [],
"modified": "2023-06-16 14:58:55.066602",
"modified": "2023-09-04 14:15:28.363184",
"modified_by": "Administrator",
"module": "Stock",
"name": "Delivery Note",

View File

@@ -138,7 +138,9 @@ class DeliveryNote(SellingController):
self.validate_uom_is_integer("stock_uom", "stock_qty")
self.validate_uom_is_integer("uom", "qty")
self.validate_with_previous_doc()
self.validate_duplicate_serial_nos()
if self.get("_action") == "submit":
self.validate_duplicate_serial_nos()
from erpnext.stock.doctype.packed_item.packed_item import make_packing_list

View File

@@ -1234,14 +1234,10 @@ class TestDeliveryNote(FrappeTestCase):
)
dn.items[0].serial_no = "\n".join(serial_nos[:2])
dn.append("items", dn.items[0].as_dict())
dn.save()
# Test - 1: ValidationError should be raised
self.assertRaises(frappe.ValidationError, dn.save)
# Step - 4: Submit Delivery Note with unique Serial Nos
dn.items[1].serial_no = "\n".join(serial_nos[2:])
dn.save()
dn.submit()
self.assertRaises(frappe.ValidationError, dn.submit)
def tearDown(self):
frappe.db.rollback()

View File

@@ -218,7 +218,8 @@ frappe.ui.form.on('Material Request', {
plc_conversion_rate: 1,
rate: item.rate,
uom: item.uom,
conversion_factor: item.conversion_factor
conversion_factor: item.conversion_factor,
project: item.project,
},
overwrite_warehouse: overwrite_warehouse
},

View File

@@ -1392,6 +1392,9 @@ def get_default_bom(item_code=None):
@frappe.whitelist()
def get_valuation_rate(item_code, company, warehouse=None):
if frappe.get_cached_value("Warehouse", warehouse, "is_group"):
return {"valuation_rate": 0.0}
item = get_item_defaults(item_code, company)
item_group = get_item_group_defaults(item_code, company)
brand = get_brand_defaults(item_code, company)

View File

@@ -2,24 +2,24 @@
// For license information, please see license.txt
/* eslint-disable */
const DIFFERNCE_FIELD_NAMES = [
"difference_in_qty",
"fifo_qty_diff",
"fifo_value_diff",
"fifo_valuation_diff",
"valuation_diff",
"fifo_difference_diff",
"diff_value_diff"
const DIFFERENCE_FIELD_NAMES = [
'difference_in_qty',
'fifo_qty_diff',
'fifo_value_diff',
'fifo_valuation_diff',
'valuation_diff',
'fifo_difference_diff',
'diff_value_diff'
];
frappe.query_reports["Stock Ledger Invariant Check"] = {
"filters": [
frappe.query_reports['Stock Ledger Invariant Check'] = {
'filters': [
{
"fieldname": "item_code",
"fieldtype": "Link",
"label": "Item",
"mandatory": 1,
"options": "Item",
'fieldname': 'item_code',
'fieldtype': 'Link',
'label': 'Item',
'mandatory': 1,
'options': 'Item',
get_query: function() {
return {
filters: {is_stock_item: 1, has_serial_no: 0}
@@ -27,18 +27,61 @@ frappe.query_reports["Stock Ledger Invariant Check"] = {
}
},
{
"fieldname": "warehouse",
"fieldtype": "Link",
"label": "Warehouse",
"mandatory": 1,
"options": "Warehouse",
'fieldname': 'warehouse',
'fieldtype': 'Link',
'label': 'Warehouse',
'mandatory': 1,
'options': 'Warehouse',
}
],
formatter (value, row, column, data, default_formatter) {
value = default_formatter(value, row, column, data);
if (DIFFERNCE_FIELD_NAMES.includes(column.fieldname) && Math.abs(data[column.fieldname]) > 0.001) {
value = "<span style='color:red'>" + value + "</span>";
if (DIFFERENCE_FIELD_NAMES.includes(column.fieldname) && Math.abs(data[column.fieldname]) > 0.001) {
value = '<span style="color:red">' + value + '</span>';
}
return value;
},
get_datatable_options(options) {
return Object.assign(options, {
checkboxColumn: true,
});
},
onload(report) {
report.page.add_inner_button(__('Create Reposting Entry'), () => {
let message = `
<div>
<p>
Reposting Entry will change the value of
accounts Stock In Hand, and Stock Expenses
in the Trial Balance report and will also change
the Balance Value in the Stock Balance report.
</p>
<p>Are you sure you want to create a Reposting Entry?</p>
</div>`;
let indexes = frappe.query_report.datatable.rowmanager.getCheckedRows();
let selected_rows = indexes.map(i => frappe.query_report.data[i]);
if (!selected_rows.length) {
frappe.throw(__('Please select a row to create a Reposting Entry'));
}
else if (selected_rows.length > 1) {
frappe.throw(__('Please select only one row to create a Reposting Entry'));
}
else {
frappe.confirm(__(message), () => {
frappe.call({
method: 'erpnext.stock.report.stock_ledger_invariant_check.stock_ledger_invariant_check.create_reposting_entries',
args: {
rows: selected_rows,
item_code: frappe.query_report.get_filter_values().item_code,
warehouse: frappe.query_report.get_filter_values().warehouse,
}
});
});
}
});
},
};

View File

@@ -5,6 +5,7 @@ import json
import frappe
from frappe import _
from frappe.utils import get_link_to_form, parse_json
SLE_FIELDS = (
"name",
@@ -185,7 +186,7 @@ def get_columns():
{
"fieldname": "fifo_queue_qty",
"fieldtype": "Float",
"label": _("(C) Total qty in queue"),
"label": _("(C) Total Qty in Queue"),
},
{
"fieldname": "fifo_qty_diff",
@@ -210,51 +211,83 @@ def get_columns():
{
"fieldname": "stock_value_difference",
"fieldtype": "Float",
"label": _("(F) Stock Value Difference"),
"label": _("(F) Change in Stock Value"),
},
{
"fieldname": "stock_value_from_diff",
"fieldtype": "Float",
"label": _("Balance Stock Value using (F)"),
"label": _("(G) Sum of Change in Stock Value"),
},
{
"fieldname": "diff_value_diff",
"fieldtype": "Float",
"label": _("K - D"),
"label": _("G - D"),
},
{
"fieldname": "fifo_stock_diff",
"fieldtype": "Float",
"label": _("(G) Stock Value difference (FIFO queue)"),
"label": _("(H) Change in Stock Value (FIFO Queue)"),
},
{
"fieldname": "fifo_difference_diff",
"fieldtype": "Float",
"label": _("F - G"),
"label": _("H - F"),
},
{
"fieldname": "valuation_rate",
"fieldtype": "Float",
"label": _("(H) Valuation Rate"),
"label": _("(I) Valuation Rate"),
},
{
"fieldname": "fifo_valuation_rate",
"fieldtype": "Float",
"label": _("(I) Valuation Rate as per FIFO"),
"label": _("(J) Valuation Rate as per FIFO"),
},
{
"fieldname": "fifo_valuation_diff",
"fieldtype": "Float",
"label": _("H - I"),
"label": _("I - J"),
},
{
"fieldname": "balance_value_by_qty",
"fieldtype": "Float",
"label": _("(J) Valuation = Value (D) ÷ Qty (A)"),
"label": _("(K) Valuation = Value (D) ÷ Qty (A)"),
},
{
"fieldname": "valuation_diff",
"fieldtype": "Float",
"label": _("H - J"),
"label": _("I - K"),
},
]
@frappe.whitelist()
def create_reposting_entries(rows, item_code=None, warehouse=None):
if isinstance(rows, str):
rows = parse_json(rows)
entries = []
for row in rows:
row = frappe._dict(row)
try:
doc = frappe.get_doc(
{
"doctype": "Repost Item Valuation",
"based_on": "Item and Warehouse",
"status": "Queued",
"item_code": item_code or row.item_code,
"warehouse": warehouse or row.warehouse,
"posting_date": row.posting_date,
"posting_time": row.posting_time,
"allow_nagative_stock": 1,
}
).submit()
entries.append(get_link_to_form("Repost Item Valuation", doc.name))
except frappe.DuplicateEntryError:
continue
if entries:
entries = ", ".join(entries)
frappe.msgprint(_("Reposting entries created: {0}").format(entries))

View File

@@ -0,0 +1,101 @@
// Copyright (c) 2023, Frappe Technologies Pvt. Ltd. and contributors
// For license information, please see license.txt
const DIFFERENCE_FIELD_NAMES = [
"difference_in_qty",
"fifo_qty_diff",
"fifo_value_diff",
"fifo_valuation_diff",
"valuation_diff",
"fifo_difference_diff",
"diff_value_diff"
];
frappe.query_reports["Stock Ledger Variance"] = {
"filters": [
{
"fieldname": "item_code",
"fieldtype": "Link",
"label": "Item",
"options": "Item",
get_query: function() {
return {
filters: {is_stock_item: 1, has_serial_no: 0}
}
}
},
{
"fieldname": "warehouse",
"fieldtype": "Link",
"label": "Warehouse",
"options": "Warehouse",
get_query: function() {
return {
filters: {is_group: 0, disabled: 0}
}
}
},
{
"fieldname": "difference_in",
"fieldtype": "Select",
"label": "Difference In",
"options": [
"",
"Qty",
"Value",
"Valuation",
],
},
{
"fieldname": "include_disabled",
"fieldtype": "Check",
"label": "Include Disabled",
}
],
formatter (value, row, column, data, default_formatter) {
value = default_formatter(value, row, column, data);
if (DIFFERENCE_FIELD_NAMES.includes(column.fieldname) && Math.abs(data[column.fieldname]) > 0.001) {
value = "<span style='color:red'>" + value + "</span>";
}
return value;
},
get_datatable_options(options) {
return Object.assign(options, {
checkboxColumn: true,
});
},
onload(report) {
report.page.add_inner_button(__('Create Reposting Entries'), () => {
let message = `
<div>
<p>
Reposting Entries will change the value of
accounts Stock In Hand, and Stock Expenses
in the Trial Balance report and will also change
the Balance Value in the Stock Balance report.
</p>
<p>Are you sure you want to create Reposting Entries?</p>
</div>`;
let indexes = frappe.query_report.datatable.rowmanager.getCheckedRows();
let selected_rows = indexes.map(i => frappe.query_report.data[i]);
if (!selected_rows.length) {
frappe.throw(__("Please select rows to create Reposting Entries"));
}
frappe.confirm(__(message), () => {
frappe.call({
method: 'erpnext.stock.report.stock_ledger_invariant_check.stock_ledger_invariant_check.create_reposting_entries',
args: {
rows: selected_rows,
}
});
});
});
},
};

View File

@@ -0,0 +1,22 @@
{
"add_total_row": 0,
"columns": [],
"creation": "2023-09-20 10:44:19.414449",
"disabled": 0,
"docstatus": 0,
"doctype": "Report",
"filters": [],
"idx": 0,
"is_standard": "Yes",
"letterhead": null,
"modified": "2023-09-20 10:44:19.414449",
"modified_by": "Administrator",
"module": "Stock",
"name": "Stock Ledger Variance",
"owner": "Administrator",
"prepared_report": 0,
"ref_doctype": "Stock Ledger Entry",
"report_name": "Stock Ledger Variance",
"report_type": "Script Report",
"roles": []
}

View File

@@ -0,0 +1,279 @@
# Copyright (c) 2023, Frappe Technologies Pvt. Ltd. and contributors
# For license information, please see license.txt
import frappe
from frappe import _
from frappe.utils import cint, flt
from erpnext.stock.report.stock_ledger_invariant_check.stock_ledger_invariant_check import (
get_data as stock_ledger_invariant_check,
)
def execute(filters=None):
columns, data = [], []
filters = frappe._dict(filters or {})
columns = get_columns()
data = get_data(filters)
return columns, data
def get_columns():
return [
{
"fieldname": "name",
"fieldtype": "Link",
"label": _("Stock Ledger Entry"),
"options": "Stock Ledger Entry",
},
{
"fieldname": "posting_date",
"fieldtype": "Data",
"label": _("Posting Date"),
},
{
"fieldname": "posting_time",
"fieldtype": "Data",
"label": _("Posting Time"),
},
{
"fieldname": "creation",
"fieldtype": "Data",
"label": _("Creation"),
},
{
"fieldname": "item_code",
"fieldtype": "Link",
"label": _("Item"),
"options": "Item",
},
{
"fieldname": "warehouse",
"fieldtype": "Link",
"label": _("Warehouse"),
"options": "Warehouse",
},
{
"fieldname": "voucher_type",
"fieldtype": "Link",
"label": _("Voucher Type"),
"options": "DocType",
},
{
"fieldname": "voucher_no",
"fieldtype": "Dynamic Link",
"label": _("Voucher No"),
"options": "voucher_type",
},
{
"fieldname": "batch_no",
"fieldtype": "Link",
"label": _("Batch"),
"options": "Batch",
},
{
"fieldname": "use_batchwise_valuation",
"fieldtype": "Check",
"label": _("Batchwise Valuation"),
},
{
"fieldname": "actual_qty",
"fieldtype": "Float",
"label": _("Qty Change"),
},
{
"fieldname": "incoming_rate",
"fieldtype": "Float",
"label": _("Incoming Rate"),
},
{
"fieldname": "consumption_rate",
"fieldtype": "Float",
"label": _("Consumption Rate"),
},
{
"fieldname": "qty_after_transaction",
"fieldtype": "Float",
"label": _("(A) Qty After Transaction"),
},
{
"fieldname": "expected_qty_after_transaction",
"fieldtype": "Float",
"label": _("(B) Expected Qty After Transaction"),
},
{
"fieldname": "difference_in_qty",
"fieldtype": "Float",
"label": _("A - B"),
},
{
"fieldname": "stock_queue",
"fieldtype": "Data",
"label": _("FIFO/LIFO Queue"),
},
{
"fieldname": "fifo_queue_qty",
"fieldtype": "Float",
"label": _("(C) Total Qty in Queue"),
},
{
"fieldname": "fifo_qty_diff",
"fieldtype": "Float",
"label": _("A - C"),
},
{
"fieldname": "stock_value",
"fieldtype": "Float",
"label": _("(D) Balance Stock Value"),
},
{
"fieldname": "fifo_stock_value",
"fieldtype": "Float",
"label": _("(E) Balance Stock Value in Queue"),
},
{
"fieldname": "fifo_value_diff",
"fieldtype": "Float",
"label": _("D - E"),
},
{
"fieldname": "stock_value_difference",
"fieldtype": "Float",
"label": _("(F) Change in Stock Value"),
},
{
"fieldname": "stock_value_from_diff",
"fieldtype": "Float",
"label": _("(G) Sum of Change in Stock Value"),
},
{
"fieldname": "diff_value_diff",
"fieldtype": "Float",
"label": _("G - D"),
},
{
"fieldname": "fifo_stock_diff",
"fieldtype": "Float",
"label": _("(H) Change in Stock Value (FIFO Queue)"),
},
{
"fieldname": "fifo_difference_diff",
"fieldtype": "Float",
"label": _("H - F"),
},
{
"fieldname": "valuation_rate",
"fieldtype": "Float",
"label": _("(I) Valuation Rate"),
},
{
"fieldname": "fifo_valuation_rate",
"fieldtype": "Float",
"label": _("(J) Valuation Rate as per FIFO"),
},
{
"fieldname": "fifo_valuation_diff",
"fieldtype": "Float",
"label": _("I - J"),
},
{
"fieldname": "balance_value_by_qty",
"fieldtype": "Float",
"label": _("(K) Valuation = Value (D) ÷ Qty (A)"),
},
{
"fieldname": "valuation_diff",
"fieldtype": "Float",
"label": _("I - K"),
},
]
def get_data(filters=None):
filters = frappe._dict(filters or {})
item_warehouse_map = get_item_warehouse_combinations(filters)
data = []
if item_warehouse_map:
precision = cint(frappe.db.get_single_value("System Settings", "float_precision"))
for item_warehouse in item_warehouse_map:
report_data = stock_ledger_invariant_check(item_warehouse)
if not report_data:
continue
for row in report_data:
if has_difference(row, precision, filters.difference_in):
data.append(add_item_warehouse_details(row, item_warehouse))
break
return data
def get_item_warehouse_combinations(filters: dict = None) -> dict:
filters = frappe._dict(filters or {})
bin = frappe.qb.DocType("Bin")
item = frappe.qb.DocType("Item")
warehouse = frappe.qb.DocType("Warehouse")
query = (
frappe.qb.from_(bin)
.inner_join(item)
.on(bin.item_code == item.name)
.inner_join(warehouse)
.on(bin.warehouse == warehouse.name)
.select(
bin.item_code,
bin.warehouse,
)
.where((item.is_stock_item == 1) & (item.has_serial_no == 0) & (warehouse.is_group == 0))
)
if filters.item_code:
query = query.where(item.name == filters.item_code)
if filters.warehouse:
query = query.where(warehouse.name == filters.warehouse)
if not filters.include_disabled:
query = query.where((item.disabled == 0) & (warehouse.disabled == 0))
return query.run(as_dict=1)
def has_difference(row, precision, difference_in):
has_qty_difference = flt(row.difference_in_qty, precision) or flt(row.fifo_qty_diff, precision)
has_value_difference = (
flt(row.diff_value_diff, precision)
or flt(row.fifo_value_diff, precision)
or flt(row.fifo_difference_diff, precision)
)
has_valuation_difference = flt(row.valuation_diff, precision) or flt(
row.fifo_valuation_diff, precision
)
if difference_in == "Qty" and has_qty_difference:
return True
elif difference_in == "Value" and has_value_difference:
return True
elif difference_in == "Valuation" and has_valuation_difference:
return True
elif difference_in not in ["Qty", "Value", "Valuation"] and (
has_qty_difference or has_value_difference or has_valuation_difference
):
return True
return False
def add_item_warehouse_details(row, item_warehouse):
row.update(
{
"item_code": item_warehouse.item_code,
"warehouse": item_warehouse.warehouse,
}
)
return row

View File

@@ -49,7 +49,7 @@
<span class="in-green has-stock">
{{ _('In stock') }}
{% if product_info.show_stock_qty and product_info.stock_qty %}
({{ product_info.stock_qty[0][0] }})
({{ product_info.stock_qty }})
{% endif %}
</span>
{% endif %}

View File

@@ -25,9 +25,19 @@ def get_context(context):
def get_stock_availability(item_code, warehouse):
stock_qty = frappe.utils.flt(
frappe.db.get_value("Bin", {"item_code": item_code, "warehouse": warehouse}, "actual_qty")
)
from erpnext.stock.doctype.warehouse.warehouse import get_child_warehouses
if warehouse and frappe.get_cached_value("Warehouse", warehouse, "is_group") == 1:
warehouses = get_child_warehouses(warehouse)
else:
warehouses = [warehouse] if warehouse else []
stock_qty = 0.0
for warehouse in warehouses:
stock_qty += frappe.utils.flt(
frappe.db.get_value("Bin", {"item_code": item_code, "warehouse": warehouse}, "actual_qty")
)
return bool(stock_qty)

View File

@@ -1312,7 +1312,7 @@ Invalid GSTIN! A GSTIN must have 15 characters.,Ungültige GSTIN! Eine GSTIN mus
Invalid GSTIN! First 2 digits of GSTIN should match with State number {0}.,Ungültige GSTIN! Die ersten beiden Ziffern von GSTIN sollten mit der Statusnummer {0} übereinstimmen.,
Invalid GSTIN! The input you've entered doesn't match the format of GSTIN.,Ungültige GSTIN! Die von Ihnen eingegebene Eingabe stimmt nicht mit dem Format von GSTIN überein.,
Invalid Posting Time,Ungültige Buchungszeit,
Invalid Purchase Invoice,Ungültige Einkaufsrechnung,
Invalid Purchase Invoice,Ungültige Eingangsrechnung,
Invalid attribute {0} {1},Ungültiges Attribut {0} {1},
Invalid quantity specified for item {0}. Quantity should be greater than 0.,Ungültzige Anzahl für Artikel {0} angegeben. Anzahl sollte größer als 0 sein.,
Invalid reference {0} {1},Ungültige Referenz {0} {1},
@@ -1970,7 +1970,7 @@ Please click on 'Generate Schedule',"Bitte auf ""Zeitplan generieren"" klicken",
Please click on 'Generate Schedule' to fetch Serial No added for Item {0},"Bitte auf ""Zeitplan generieren"" klicken, um die Seriennummer für Artikel {0} abzurufen",
Please click on 'Generate Schedule' to get schedule,"Bitte auf ""Zeitplan generieren"" klicken, um den Zeitplan zu erhalten",
Please confirm once you have completed your training,"Bitte bestätigen Sie, sobald Sie Ihre Ausbildung abgeschlossen haben",
Please create purchase receipt or purchase invoice for the item {0},Bitte erstellen Sie eine Kaufquittung oder eine Kaufrechnung für den Artikel {0},
Please create purchase receipt or purchase invoice for the item {0},Bitte erstellen Sie eine Kaufquittung oder eine Eingangsrechnungen für den Artikel {0},
Please define grade for Threshold 0%,Bitte definieren Sie Grade for Threshold 0%,
Please enable Applicable on Booking Actual Expenses,Bitte aktivieren Sie Anwendbar bei der Buchung von tatsächlichen Ausgaben,
Please enable Applicable on Purchase Order and Applicable on Booking Actual Expenses,Bitte aktivieren Sie Anwendbar bei Bestellung und Anwendbar bei Buchung von tatsächlichen Ausgaben,
@@ -4937,7 +4937,7 @@ POS Customer Group,POS Kundengruppe,
POS Field,POS-Feld,
POS Item Group,POS Artikelgruppe,
Company Address,Anschrift des Unternehmens,
Update Stock,Lagerbestand aktualisieren,
Update Stock,Lagerbestand aktualisieren,
Ignore Pricing Rule,Preisregel ignorieren,
Applicable for Users,Anwendbar für Benutzer,
Sales Invoice Payment,Ausgangsrechnung-Zahlungen,
@@ -5134,7 +5134,6 @@ ACC-SINV-.YYYY.-,ACC-SINV-.JJJJ.-,
Include Payment (POS),(POS) Zahlung einschließen,
Offline POS Name,Offline-Verkaufsstellen-Name,
Is Return (Credit Note),ist Rücklieferung (Gutschrift),
Return Against Sales Invoice,Zurück zur Kundenrechnung,
Update Billed Amount in Sales Order,Aktualisierung des Rechnungsbetrags im Auftrag,
Customer PO Details,Auftragsdetails,
Customer's Purchase Order,Bestellung des Kunden,
@@ -7673,8 +7672,8 @@ Default Company Bank Account,Standard-Bankkonto des Unternehmens,
From Lead,Aus Lead,
Account Manager,Kundenberater,
Accounts Manager,Buchhalter,
Allow Sales Invoice Creation Without Sales Order,Ermöglichen Sie die Erstellung von Kundenrechnungen ohne Auftrag,
Allow Sales Invoice Creation Without Delivery Note,Ermöglichen Sie die Erstellung einer Ausgangsrechnung ohne Lieferschein,
Allow Sales Invoice Creation Without Sales Order,Ermöglichen Sie die Erstellung von Ausgangsrechnungen ohne Auftrag,
Allow Sales Invoice Creation Without Delivery Note,Ermöglichen Sie die Erstellung von Ausgangsrechnungen ohne Lieferschein,
Default Price List,Standardpreisliste,
Primary Address and Contact,Hauptadresse und -kontakt,
"Select, to make the customer searchable with these fields","Wählen Sie, um den Kunden mit diesen Feldern durchsuchbar zu machen",
@@ -9598,8 +9597,8 @@ This role is allowed to submit transactions that exceed credit limits,"Diese Rol
Show Inclusive Tax in Print,Inklusive Steuern im Druck anzeigen,
Only select this if you have set up the Cash Flow Mapper documents,"Wählen Sie diese Option nur, wenn Sie die Cash Flow Mapper-Dokumente eingerichtet haben",
Payment Channel,Zahlungskanal,
Is Purchase Order Required for Purchase Invoice & Receipt Creation?,Ist für die Erstellung von Kaufrechnungen und Quittungen eine Bestellung erforderlich?,
Is Purchase Receipt Required for Purchase Invoice Creation?,Ist für die Erstellung der Kaufrechnung ein Kaufbeleg erforderlich?,
Is Purchase Order Required for Purchase Invoice & Receipt Creation?,Ist für die Erstellung von Eingangsrechnungen und Quittungen eine Bestellung erforderlich?,
Is Purchase Receipt Required for Purchase Invoice Creation?,Ist für die Erstellung der Eingangsrechnungen ein Kaufbeleg erforderlich?,
Maintain Same Rate Throughout the Purchase Cycle,Behalten Sie den gleichen Preis während des gesamten Kaufzyklus bei,
Allow Item To Be Added Multiple Times in a Transaction,"Zulassen, dass ein Element in einer Transaktion mehrmals hinzugefügt wird",
Suppliers,Lieferanten,
@@ -9657,8 +9656,8 @@ Purchase Order already created for all Sales Order items,Bestellung bereits für
Select Items,Gegenstände auswählen,
Against Default Supplier,Gegen Standardlieferanten,
Auto close Opportunity after the no. of days mentioned above,Gelegenheit zum automatischen Schließen nach der Nr. der oben genannten Tage,
Is Sales Order Required for Sales Invoice & Delivery Note Creation?,Ist ein Auftrag für die Erstellung von Kundenrechnungen und Lieferscheinen erforderlich?,
Is Delivery Note Required for Sales Invoice Creation?,Ist für die Erstellung der Ausgangsrechnung ein Lieferschein erforderlich?,
Is Sales Order Required for Sales Invoice & Delivery Note Creation?,Ist ein Auftrag für die Erstellung von Ausgangsrechnungen und Lieferscheinen erforderlich?,
Is Delivery Note Required for Sales Invoice Creation?,Ist ein Lieferschein für die Erstellung von Ausgangsrechnungen erforderlich?,
How often should Project and Company be updated based on Sales Transactions?,Wie oft sollten Projekt und Unternehmen basierend auf Verkaufstransaktionen aktualisiert werden?,
Allow User to Edit Price List Rate in Transactions,Benutzer darf Preisliste in Transaktionen bearbeiten,
Allow Item to Be Added Multiple Times in a Transaction,"Zulassen, dass ein Element in einer Transaktion mehrmals hinzugefügt wird",
@@ -9804,7 +9803,7 @@ or it is not the default inventory account,oder es ist nicht das Standard-Invent
Expense Head Changed,Ausgabenkopf geändert,
because expense is booked against this account in Purchase Receipt {},weil die Kosten für dieses Konto im Kaufbeleg {} gebucht werden,
as no Purchase Receipt is created against Item {}. ,da für Artikel {} kein Kaufbeleg erstellt wird.,
This is done to handle accounting for cases when Purchase Receipt is created after Purchase Invoice,"Dies erfolgt zur Abrechnung von Fällen, in denen der Kaufbeleg nach der Kaufrechnung erstellt wird",
This is done to handle accounting for cases when Purchase Receipt is created after Purchase Invoice,"Dies erfolgt zur Abrechnung von Fällen, in denen der Kaufbeleg nach der Eingangsrechnung erstellt wird",
Purchase Order Required for item {},Bestellung erforderlich für Artikel {},
To submit the invoice without purchase order please set {} ,"Um die Rechnung ohne Bestellung einzureichen, setzen Sie bitte {}",
as {} in {},wie in {},
Can't render this file because it is too large.

View File

@@ -115,7 +115,7 @@ Add Customers,Ajouter des clients,
Add Employees,Ajouter des employés,
Add Item,Ajouter un Article,
Add Items,Ajouter des articles,
Add Leads,Créer des Prospects,
Add Leads,Créer des Leads,
Add Multiple Tasks,Ajouter plusieurs tâches,
Add Row,Ajouter une Ligne,
Add Sales Partners,Ajouter des partenaires commerciaux,
@@ -658,8 +658,8 @@ Create Invoice,Créer une facture,
Create Invoices,Créer des factures,
Create Job Card,Créer une carte de travail,
Create Journal Entry,Créer une entrée de journal,
Create Lead,Créer un Prospect,
Create Leads,Créer des Prospects,
Create Lead,Créer un Lead,
Create Leads,Créer des Lead,
Create Maintenance Visit,Créer une visite de maintenance,
Create Material Request,Créer une demande de matériel,
Create Multiple,Créer plusieurs,
@@ -951,7 +951,7 @@ End time cannot be before start time,L'heure de fin ne peut pas être avant l'he
Ends On date cannot be before Next Contact Date.,La date de fin ne peut pas être avant la prochaine date de contact,
Energy,Énergie,
Engineer,Ingénieur,
Enough Parts to Build,Pièces Suffisantes pour Construire
Enough Parts to Build,Pièces Suffisantes pour Construire,
Enroll,Inscrire,
Enrolling student,Inscrire un étudiant,
Enrolling students,Inscription des étudiants,
@@ -1426,13 +1426,12 @@ Last Purchase Price,Dernier prix d'achat,
Last Purchase Rate,Dernier Prix d'Achat,
Latest,Dernier,
Latest price updated in all BOMs,Prix les plus récents mis à jour dans toutes les nomenclatures,
Lead,Prospect,
Lead Count,Nombre de Prospects,
Lead Count,Nombre de Lead,
Lead Owner,Responsable du Prospect,
Lead Owner cannot be same as the Lead,Le Responsable du Prospect ne peut pas être identique au Prospect,
Lead Owner cannot be same as the Lead,Le Responsable du Prospect ne peut pas être identique au Lead,
Lead Time Days,Jours de Délai,
Lead to Quotation,Du Prospect au Devis,
"Leads help you get business, add all your contacts and more as your leads","Les prospects vous aident à obtenir des contrats, ajoutez tous vos contacts et plus dans votre liste de prospects",
"Leads help you get business, add all your contacts and more as your leads","Les lead vous aident à obtenir des contrats, ajoutez tous vos contacts et plus dans votre liste de lead",
Learn,Apprendre,
Leave Approval Notification,Notification d'approbation de congés,
Leave Blocked,Laisser Verrouillé,
@@ -1596,7 +1595,7 @@ Middle Name,Deuxième Nom,
Middle Name (Optional),Deuxième Prénom (Optionnel),
Min Amt can not be greater than Max Amt,Min Amt ne peut pas être supérieur à Max Amt,
Min Qty can not be greater than Max Qty,Qté Min ne peut pas être supérieure à Qté Max,
Minimum Lead Age (Days),Âge Minimum du Prospect (Jours),
Minimum Lead Age (Days),Âge Minimum du lead (Jours),
Miscellaneous Expenses,Charges Diverses,
Missing Currency Exchange Rates for {0},Taux de Change Manquant pour {0},
Missing email template for dispatch. Please set one in Delivery Settings.,Modèle de courrier électronique manquant pour l'envoi. Veuillez en définir un dans les paramètres de livraison.,
@@ -1676,7 +1675,7 @@ New {0} pricing rules are created,De nouvelles règles de tarification {0} sont
Newsletters,Newsletters,
Newspaper Publishers,Éditeurs de journaux,
Next,Suivant,
Next Contact By cannot be same as the Lead Email Address,Prochain Contact Par ne peut être identique à lAdresse Email du Prospect,
Next Contact By cannot be same as the Lead Email Address,Prochain Contact Par ne peut être identique à lAdresse Email du Lead,
Next Contact Date cannot be in the past,La Date de Prochain Contact ne peut pas être dans le passé,
Next Steps,Prochaines étapes,
No Action,Pas d'action,
@@ -1808,9 +1807,9 @@ Operation Time must be greater than 0 for Operation {0},Temps de l'Opération do
Operations,Opérations,
Operations cannot be left blank,Les opérations ne peuvent pas être laissées vides,
Opp Count,Compte d'Opportunités,
Opp/Lead %,Opp / Prospect %,
Opp/Lead %,Opp / Lead %,
Opportunities,Opportunités,
Opportunities by lead source,Opportunités par source de plomb,
Opportunities by lead source,Opportunités par source de lead,
Opportunity,Opportunité,
Opportunity Amount,Montant de l'opportunité,
Optional Holiday List not set for leave period {0},Une liste de vacances facultative n'est pas définie pour la période de congé {0},
@@ -2007,7 +2006,7 @@ Please mention Basic and HRA component in Company,Veuillez mentionner les compos
Please mention Round Off Account in Company,Veuillez indiquer le Compte dArrondi de la Société,
Please mention Round Off Cost Center in Company,Veuillez indiquer le Centre de Coûts dArrondi de la Société,
Please mention no of visits required,Veuillez indiquer le nb de visites requises,
Please mention the Lead Name in Lead {0},Veuillez mentionner le nom du Prospect dans le Prospect {0},
Please mention the Lead Name in Lead {0},Veuillez mentionner le nom du Lead dans le Lead {0},
Please pull items from Delivery Note,Veuillez récupérer les articles des Bons de Livraison,
Please register the SIREN number in the company information file,Veuillez enregistrer le numéro SIREN dans la fiche d'information de la société,
Please remove this Invoice {0} from C-Form {1},Veuillez retirez cette Facture {0} du C-Form {1},
@@ -2277,7 +2276,7 @@ Queued for replacing the BOM. It may take a few minutes.,En file d'attente pour
Queued for updating latest price in all Bill of Materials. It may take a few minutes.,Mise à jour des prix les plus récents dans toutes les nomenclatures en file d'attente. Cela peut prendre quelques minutes.,
Quick Journal Entry,Écriture Rapide dans le Journal,
Quot Count,Compte de Devis,
Quot/Lead %,Devis / Prospects %,
Quot/Lead %,Devis / Lead %,
Quotation,Devis,
Quotation {0} is cancelled,Devis {0} est annulée,
Quotation {0} not of type {1},Le devis {0} n'est pas du type {1},
@@ -2285,7 +2284,7 @@ Quotations,Devis,
"Quotations are proposals, bids you have sent to your customers","Les devis sont des propositions, offres que vous avez envoyées à vos clients",
Quotations received from Suppliers.,Devis reçus des Fournisseurs.,
Quotations: ,Devis :,
Quotes to Leads or Customers.,Devis de Prospects ou Clients.,
Quotes to Leads or Customers.,Devis de Lead ou Clients.,
RFQs are not allowed for {0} due to a scorecard standing of {1},Les Appels d'Offres ne sont pas autorisés pour {0} en raison d'une note de {1} sur la fiche d'évaluation,
Range,Plage,
Rate,Prix,
@@ -2888,7 +2887,7 @@ Supplies made to UIN holders,Fournitures faites aux titulaires de l'UIN,
Supplies made to Unregistered Persons,Fournitures faites à des personnes non inscrites,
Suppliies made to Composition Taxable Persons,Suppleies à des personnes assujetties à la composition,
Supply Type,Type d'approvisionnement,
Support,"Assistance/Support",
Support,Assistance/Support,
Support Analytics,Analyse de l'assistance,
Support Settings,Paramètres du module Assistance,
Support Tickets,Ticket d'assistance,
@@ -3037,7 +3036,7 @@ To Date must be greater than From Date,La date de fin doit être supérieure à
To Date should be within the Fiscal Year. Assuming To Date = {0},La Date Finale doit être dans l'exercice. En supposant Date Finale = {0},
To Datetime,À la Date,
To Deliver,À Livrer,
{} To Deliver,{} à livrer
{} To Deliver,{} à livrer,
To Deliver and Bill,À Livrer et Facturer,
To Fiscal Year,À l'année fiscale,
To GSTIN,GSTIN (Destination),
@@ -3122,7 +3121,7 @@ Total(Amt),Total (Mnt),
Total(Qty),Total (Qté),
Traceability,Traçabilité,
Traceback,Retraçage,
Track Leads by Lead Source.,Suivre les prospects par sources,
Track Leads by Lead Source.,Suivre les leads par sources,
Training,Formation,
Training Event,Événement de formation,
Training Events,Événements de formation,
@@ -3243,8 +3242,8 @@ View Chart of Accounts,Voir le plan comptable,
View Fees Records,Voir les honoraires,
View Form,Voir le formulaire,
View Lab Tests,Afficher les tests de laboratoire,
View Leads,Voir Prospects,
View Ledger,Voir le Livre,
View Leads,Voir Lead,
View Ledger,Voir le Journal,
View Now,Voir maintenant,
View a list of all the help videos,Afficher la liste de toutes les vidéos d'aide,
View in Cart,Voir Panier,
@@ -3677,7 +3676,7 @@ Couldn't Set Service Level Agreement {0}.,Impossible de définir le contrat de s
Country,Pays,
Country Code in File does not match with country code set up in the system,Le code de pays dans le fichier ne correspond pas au code de pays configuré dans le système,
Create New Contact,Créer un nouveau contact,
Create New Lead,Créer une nouvelle piste,
Create New Lead,Créer une nouvelle lead,
Create Pick List,Créer une liste de choix,
Create Quality Inspection for Item {0},Créer un contrôle qualité pour l'article {0},
Creating Accounts...,Création de comptes ...,
@@ -3784,7 +3783,7 @@ Group Warehouses cannot be used in transactions. Please change the value of {0},
Help,Aidez-moi,
Help Article,Article dAide,
"Helps you keep tracks of Contracts based on Supplier, Customer and Employee","Vous aide à garder une trace des contrats en fonction du fournisseur, client et employé",
Helps you manage appointments with your leads,Vous aide à gérer les rendez-vous avec vos prospects,
Helps you manage appointments with your leads,Vous aide à gérer les rendez-vous avec vos leads,
Home,Accueil,
IBAN is not valid,IBAN n'est pas valide,
Import Data from CSV / Excel files.,Importer des données à partir de fichiers CSV / Excel,
@@ -3880,7 +3879,7 @@ Only expired allocation can be cancelled,Seule l'allocation expirée peut être
Only users with the {0} role can create backdated leave applications,Seuls les utilisateurs avec le rôle {0} peuvent créer des demandes de congé antidatées,
Open,Ouvert,
Open Contact,Contact ouvert,
Open Lead,Ouvrir le Prospect,
Open Lead,Ouvrir le Lead,
Opening and Closing,Ouverture et fermeture,
Operating Cost as per Work Order / BOM,Coût d'exploitation selon l'ordre de fabrication / nomenclature,
Order Amount,Montant de la commande,
@@ -3926,7 +3925,7 @@ Please select another payment method. Stripe does not support transactions in cu
Please select the customer.,S'il vous plaît sélectionner le client.,
Please set a Supplier against the Items to be considered in the Purchase Order.,Veuillez définir un fournisseur par rapport aux articles à prendre en compte dans la Commande d'Achat.,
Please set account heads in GST Settings for Compnay {0},Définissez les en-têtes de compte dans les paramètres de la TPS pour le service {0}.,
Please set an email id for the Lead {0},Veuillez définir un identifiant de messagerie pour le prospect {0}.,
Please set an email id for the Lead {0},Veuillez définir un identifiant de messagerie pour le lead {0}.,
Please set default UOM in Stock Settings,Veuillez définir l'UdM par défaut dans les paramètres de stock,
Please set filter based on Item or Warehouse due to a large amount of entries.,Veuillez définir le filtre en fonction de l'article ou de l'entrepôt en raison d'une grande quantité d'entrées.,
Please set up the Campaign Schedule in the Campaign {0},Configurez le calendrier de la campagne dans la campagne {0}.,
@@ -4943,8 +4942,8 @@ Min Qty,Qté Min,
Max Qty,Qté Max,
Min Amt,Montant Min,
Max Amt,Montant Max,
"If rate is zero them item will be treated as ""Free Item""",Si le prix est à 0 alors l'article sera traité comme article gratuit
Is Recursive,Est récursif
"If rate is zero them item will be treated as ""Free Item""",Si le prix est à 0 alors l'article sera traité comme article gratuit,
Is Recursive,Est récursif,
"Discounts to be applied in sequential ranges like buy 1 get 1, buy 2 get 2, buy 3 get 3 and so on","La remise sera appliquée séquentiellement telque : acheter 1 => recupérer 1, acheter 2 => recupérer 2, acheter 3 => recupérer 3, etc..."
Period Settings,Paramètres de période,
Margin,Marge,
@@ -5600,7 +5599,7 @@ Call Log,Journal d'appel,
Received By,Reçu par,
Caller Information,Informations sur l'appelant,
Contact Name,Nom du Contact,
Lead Name,Nom du Prospect,
Lead Name,Nom du Lead,
Ringing,Sonnerie,
Missed,Manqué,
Call Duration in seconds,Durée d'appel en secondes,
@@ -5668,7 +5667,7 @@ Fulfilment Terms and Conditions,Termes et conditions d'exécution,
Contract Template Fulfilment Terms,Conditions d'exécution du modèle de contrat,
Email Campaign,Campagne Email,
Email Campaign For ,Campagne d'email pour,
Lead is an Organization,Le prospect est une organisation,
Lead is an Organization,Le Lead est une organisation,
CRM-LEAD-.YYYY.-,CRM-LEAD-.YYYY.-,
Person Name,Nom de la Personne,
Lost Quotation,Devis Perdu,
@@ -5683,7 +5682,7 @@ Next Contact Date,Date du Prochain Contact,
Ends On,Se termine le,
Address & Contact,Adresse &amp; Contact,
Mobile No.,N° Mobile.,
Lead Type,Type de Prospect,
Lead Type,Type de Lead,
Channel Partner,Partenaire de Canal,
Consultant,Consultant,
Market Segment,Part de Marché,
@@ -5706,7 +5705,7 @@ Opportunity Lost Reason,Raison perdue,
Potential Sales Deal,Ventes Potentielles,
CRM-OPP-.YYYY.-,CRM-OPP-YYYY.-,
Opportunity From,Opportunité De,
Customer / Lead Name,Nom du Client / Prospect,
Customer / Lead Name,Nom du Client / Lead,
Opportunity Type,Type d'Opportunité,
Converted By,Converti par,
Sales Stage,Stade de vente,
@@ -5716,7 +5715,7 @@ To Discuss,À Discuter,
With Items,Avec Articles,
Probability (%),Probabilité (%),
Contact Info,Information du Contact,
Customer / Lead Address,Adresse du Client / Prospect,
Customer / Lead Address,Adresse du Lead / Prospect,
Contact Mobile No,N° de Portable du Contact,
Enter name of campaign if source of enquiry is campaign,Entrez le nom de la campagne si la source de l'enquête est une campagne,
Opportunity Date,Date d'Opportunité,
@@ -7240,7 +7239,7 @@ Replace,Remplacer,
Update latest price in all BOMs,Mettre à jour le prix le plus récent dans toutes les nomenclatures,
BOM Website Item,Article de nomenclature du Site Internet,
BOM Website Operation,Opération de nomenclature du Site Internet,
Operation Time,Durée de l'Opération
Operation Time,Durée de l'Opération,
PO-JOB.#####,PO-JOB. #####,
Timing Detail,Détail du timing,
Time Logs,Time Logs,
@@ -7645,7 +7644,7 @@ Campaign Schedules,Horaires de campagne,
Buyer of Goods and Services.,Acheteur des Biens et Services.,
CUST-.YYYY.-,CUST-.YYYY.-,
Default Company Bank Account,Compte bancaire d'entreprise par défaut,
From Lead,Du Prospect,
From Lead,Du Lead,
Account Manager,Gestionnaire de compte,
Allow Sales Invoice Creation Without Sales Order,Autoriser la création de factures de vente sans commande client,
Allow Sales Invoice Creation Without Delivery Note,Autoriser la création de factures de vente sans bon de livraison,
@@ -7672,7 +7671,7 @@ Installation Date,Date d'Installation,
Installation Time,Temps d'Installation,
Installation Note Item,Article Remarque d'Installation,
Installed Qty,Qté Installée,
Lead Source,Source du Prospect,
Lead Source,Source du Lead,
Period Start Date,Date de début de la période,
Period End Date,Date de fin de la période,
Cashier,Caissier,
@@ -8517,8 +8516,8 @@ Item-wise Sales Register,Registre des Ventes par Article,
Items To Be Requested,Articles À Demander,
Reserved,Réservé,
Itemwise Recommended Reorder Level,Renouvellement Recommandé par Article,
Lead Details,Détails du Prospect,
Lead Owner Efficiency,Efficacité des Responsables des Prospects,
Lead Details,Détails du Lead,
Lead Owner Efficiency,Efficacité des Responsables des Leads,
Loan Repayment and Closure,Remboursement et clôture de prêts,
Loan Security Status,État de la sécurité du prêt,
Lost Opportunity,Occasion perdue,
@@ -9207,7 +9206,7 @@ Time Required (In Mins),Temps requis (en minutes),
From Posting Date,À partir de la date de publication,
To Posting Date,À la date de publication,
No records found,Aucun enregistrement trouvé,
Customer/Lead Name,Nom du client / prospect,
Customer/Lead Name,Nom du client / lead,
Unmarked Days,Jours non marqués,
Jan,Jan,
Feb,fév,
@@ -9471,7 +9470,7 @@ Row {0}: Loan Security {1} added multiple times,Ligne {0}: Garantie de prêt {1}
Row #{0}: Child Item should not be a Product Bundle. Please remove Item {1} and Save,Ligne n ° {0}: l'élément enfant ne doit pas être un ensemble de produits. Veuillez supprimer l'élément {1} et enregistrer,
Credit limit reached for customer {0},Limite de crédit atteinte pour le client {0},
Could not auto create Customer due to the following missing mandatory field(s):,Impossible de créer automatiquement le client en raison du ou des champs obligatoires manquants suivants:,
Please create Customer from Lead {0}.,Veuillez créer un client à partir du prospect {0}.,
Please create Customer from Lead {0}.,Veuillez créer un client à partir du lead {0}.,
Mandatory Missing,Obligatoire manquant,
Please set Payroll based on in Payroll settings,Veuillez définir la paie en fonction des paramètres de paie,
Additional Salary: {0} already exist for Salary Component: {1} for period {2} and {3},Salaire supplémentaire: {0} existe déjà pour le composant de salaire: {1} pour la période {2} et {3},
@@ -9834,29 +9833,29 @@ Enable European Access,Activer l'accès européen,
Creating Purchase Order ...,Création d'une commande d'achat ...,
"Select a Supplier from the Default Suppliers of the items below. On selection, a Purchase Order will be made against items belonging to the selected Supplier only.","Sélectionnez un fournisseur parmi les fournisseurs par défaut des articles ci-dessous. Lors de la sélection, une commande d'achat sera effectué contre des articles appartenant uniquement au fournisseur sélectionné.",
Row #{}: You must select {} serial numbers for item {}.,Ligne n ° {}: vous devez sélectionner {} numéros de série pour l'article {}.,
Update Rate as per Last Purchase,Mettre à jour avec les derniers prix d'achats
Company Shipping Address,Adresse d'expédition
Shipping Address Details,Détail d'adresse d'expédition
Company Billing Address,Adresse de la société de facturation
Update Rate as per Last Purchase,Mettre à jour avec les derniers prix d'achats,
Company Shipping Address,Adresse d'expédition,
Shipping Address Details,Détail d'adresse d'expédition,
Company Billing Address,Adresse de la société de facturation,
Supplier Address Details,
Bank Reconciliation Tool,Outil de réconcialiation d'écritures bancaires
Supplier Contact,Contact fournisseur
Subcontracting,Sous traitance
Order Status,Statut de la commande
Build,Personnalisations avancées
Dispatch Address Name,Adresse de livraison intermédiaire
Amount Eligible for Commission,Montant éligible à comission
Grant Commission,Eligible aux commissions
Stock Transactions Settings, Paramétre des transactions
Role Allowed to Over Deliver/Receive, Rôle autorisé à dépasser cette limite
Users with this role are allowed to over deliver/receive against orders above the allowance percentage,Rôle Utilisateur qui sont autorisé à livrée/commandé au-delà de la limite
Over Transfer Allowance,Autorisation de limite de transfert
Quality Inspection Settings,Paramétre de l'inspection qualité
Action If Quality Inspection Is Rejected,Action si l'inspection qualité est rejetée
Disable Serial No And Batch Selector,Désactiver le sélecteur de numéro de lot/série
Is Rate Adjustment Entry (Debit Note),Est un justement du prix de la note de débit
Issue a debit note with 0 qty against an existing Sales Invoice,Creer une note de débit avec une quatité à O pour la facture
Control Historical Stock Transactions,Controle de l'historique des stransaction de stock
Bank Reconciliation Tool,Outil de réconcialiation d'écritures bancaires,
Supplier Contact,Contact fournisseur,
Subcontracting,Sous traitance,
Order Status,Statut de la commande,
Build,Personnalisations avancées,
Dispatch Address Name,Adresse de livraison intermédiaire,
Amount Eligible for Commission,Montant éligible à comission,
Grant Commission,Eligible aux commissions,
Stock Transactions Settings, Paramétre des transactions,
Role Allowed to Over Deliver/Receive, Rôle autorisé à dépasser cette limite,
Users with this role are allowed to over deliver/receive against orders above the allowance percentage,Rôle Utilisateur qui sont autorisé à livrée/commandé au-delà de la limite,
Over Transfer Allowance,Autorisation de limite de transfert,
Quality Inspection Settings,Paramétre de l'inspection qualité,
Action If Quality Inspection Is Rejected,Action si l'inspection qualité est rejetée,
Disable Serial No And Batch Selector,Désactiver le sélecteur de numéro de lot/série,
Is Rate Adjustment Entry (Debit Note),Est un justement du prix de la note de débit,
Issue a debit note with 0 qty against an existing Sales Invoice,Creer une note de débit avec une quatité à O pour la facture,
Control Historical Stock Transactions,Controle de l'historique des stransaction de stock,
No stock transactions can be created or modified before this date.,Aucune transaction ne peux être créée ou modifié avant cette date.
Stock transactions that are older than the mentioned days cannot be modified.,Les transactions de stock plus ancienne que le nombre de jours ci-dessus ne peuvent être modifiées,
Role Allowed to Create/Edit Back-dated Transactions,Rôle autorisé à créer et modifier des transactions anti-datée,
@@ -9867,29 +9866,29 @@ Show Barcode Field in Stock Transactions,Afficher le champ Code Barre dans les t
Convert Item Description to Clean HTML in Transactions,Convertir les descriptions d'articles en HTML valide lors des transactions,
Have Default Naming Series for Batch ID?,Masque de numérotation par défaut pour les Lots ou Séries,
"The percentage you are allowed to transfer more against the quantity ordered. For example, if you have ordered 100 units, and your Allowance is 10%, then you are allowed transfer 110 units","Le pourcentage de quantité que vous pourrez réceptionner en plus de la quantité commandée. Par exemple, vous avez commandé 100 unités, votre pourcentage de dépassement est de 10%, vous pourrez réceptionner 110 unités"
Allowed Items,Articles autorisés
Party Specific Item,Restriction d'article disponible
Restrict Items Based On,Type de critére de restriction
Based On Value,critére de restriction
Allowed Items,Articles autorisés,
Party Specific Item,Restriction d'article disponible,
Restrict Items Based On,Type de critére de restriction,
Based On Value,critére de restriction,
Unit of Measure (UOM),Unité de mesure (UdM),
Unit Of Measure (UOM),Unité de mesure (UdM),
CRM Settings,Paramètres CRM
Do Not Explode,Ne pas décomposer
Quick Access, Accés rapides
{} Available,{} Disponible.s
{} Pending,{} En attente.s
{} To Bill,{} à facturer
{} To Receive,{} A recevoir
CRM Settings,Paramètres CRM,
Do Not Explode,Ne pas décomposer,
Quick Access, Accés rapides,
{} Available,{} Disponible.s,
{} Pending,{} En attente.s,
{} To Bill,{} à facturer,
{} To Receive,{} A recevoir,
{} Active,{} Actif.ve(s)
{} Open,{} Ouvert.e(s)
Incorrect Data Report,Rapport de données incohérentes
Incorrect Serial No Valuation,Valorisation inccorecte par Num. Série / Lots
Incorrect Balance Qty After Transaction,Equilibre des quantités aprés une transaction
Incorrect Data Report,Rapport de données incohérentes,
Incorrect Serial No Valuation,Valorisation inccorecte par Num. Série / Lots,
Incorrect Balance Qty After Transaction,Equilibre des quantités aprés une transaction,
Interview Type,Type d'entretien
Interview Round,Cycle d'entretien
Interview,Entretien
Interview Feedback,Retour d'entretien
Journal Energy Point,Historique des points d'énergies
Journal Energy Point,Historique des points d'énergies,
Billing Address Details,Adresse de facturation (détails)
Supplier Address Details,Adresse Fournisseur (détails)
Retail,Commerce,
Can't render this file because it is too large.

View File

@@ -2364,7 +2364,7 @@ Report Type is mandatory,Rapport type is verplicht,
Reports,rapporten,
Reqd By Date,Benodigd op datum,
Reqd Qty,Gewenste hoeveelheid,
Request for Quotation,Offerte,
Request for Quotation,Offerte-verzoek,
Request for Quotations,Verzoek om offertes,
Request for Raw Materials,Verzoek om grondstoffen,
Request for purchase.,Inkoopaanvraag,
Can't render this file because it is too large.

View File

@@ -6,6 +6,7 @@ from frappe.utils import cint, flt, fmt_money, getdate, nowdate
from erpnext.accounts.doctype.pricing_rule.pricing_rule import get_pricing_rule_for_item
from erpnext.stock.doctype.batch.batch import get_batch_qty
from erpnext.stock.doctype.warehouse.warehouse import get_child_warehouses
def get_web_item_qty_in_stock(item_code, item_warehouse_field, warehouse=None):
@@ -22,23 +23,31 @@ def get_web_item_qty_in_stock(item_code, item_warehouse_field, warehouse=None):
"Website Item", {"item_code": template_item_code}, item_warehouse_field
)
if warehouse:
stock_qty = frappe.db.sql(
"""
select GREATEST(S.actual_qty - S.reserved_qty - S.reserved_qty_for_production - S.reserved_qty_for_sub_contract, 0) / IFNULL(C.conversion_factor, 1)
from tabBin S
inner join `tabItem` I on S.item_code = I.Item_code
left join `tabUOM Conversion Detail` C on I.sales_uom = C.uom and C.parent = I.Item_code
where S.item_code=%s and S.warehouse=%s""",
(item_code, warehouse),
)
if warehouse and frappe.get_cached_value("Warehouse", warehouse, "is_group") == 1:
warehouses = get_child_warehouses(warehouse)
else:
warehouses = [warehouse] if warehouse else []
if stock_qty:
stock_qty = adjust_qty_for_expired_items(item_code, stock_qty, warehouse)
in_stock = stock_qty[0][0] > 0 and 1 or 0
total_stock = 0.0
if warehouses:
for warehouse in warehouses:
stock_qty = frappe.db.sql(
"""
select GREATEST(S.actual_qty - S.reserved_qty - S.reserved_qty_for_production - S.reserved_qty_for_sub_contract, 0) / IFNULL(C.conversion_factor, 1)
from tabBin S
inner join `tabItem` I on S.item_code = I.Item_code
left join `tabUOM Conversion Detail` C on I.sales_uom = C.uom and C.parent = I.Item_code
where S.item_code=%s and S.warehouse=%s""",
(item_code, warehouse),
)
if stock_qty:
total_stock += adjust_qty_for_expired_items(item_code, stock_qty, warehouse)
in_stock = total_stock > 0 and 1 or 0
return frappe._dict(
{"in_stock": in_stock, "stock_qty": stock_qty, "is_stock_item": is_stock_item}
{"in_stock": in_stock, "stock_qty": total_stock, "is_stock_item": is_stock_item}
)
@@ -56,7 +65,7 @@ def adjust_qty_for_expired_items(item_code, stock_qty, warehouse):
if not stock_qty[0][0]:
break
return stock_qty
return stock_qty[0][0] if stock_qty else 0
def get_expired_batches(batches):