Rushabh Mehta | cca33b2 | 2016-07-08 18:24:46 +0530 | [diff] [blame] | 1 | # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors |
| 2 | # License: GNU General Public License v3. See license.txt |
| 3 | |
| 4 | from __future__ import unicode_literals |
| 5 | |
| 6 | import frappe, random |
| 7 | from frappe.desk import query_report |
| 8 | from erpnext.stock.stock_ledger import NegativeStockError |
| 9 | from erpnext.stock.doctype.serial_no.serial_no import SerialNoRequiredError, SerialNoQtyError |
| 10 | |
| 11 | def work(): |
| 12 | frappe.set_user(frappe.db.get_global('demo_manufacturing_user')) |
| 13 | |
| 14 | make_purchase_receipt() |
| 15 | make_delivery_note() |
| 16 | make_stock_reconciliation() |
| 17 | submit_draft_stock_entries() |
| 18 | |
| 19 | def make_purchase_receipt(): |
| 20 | if random.random() < 0.6: |
| 21 | from erpnext.buying.doctype.purchase_order.purchase_order import make_purchase_receipt |
| 22 | report = "Purchase Order Items To Be Received" |
| 23 | po_list =list(set([r[0] for r in query_report.run(report)["result"] if r[0]!="'Total'"]))[:random.randint(1, 10)] |
| 24 | for po in po_list: |
| 25 | pr = frappe.get_doc(make_purchase_receipt(po)) |
| 26 | |
| 27 | if pr.is_subcontracted=="Yes": |
| 28 | pr.supplier_warehouse = "Supplier - WPL" |
| 29 | |
| 30 | pr.posting_date = frappe.flags.current_date |
| 31 | pr.insert() |
Rushabh Mehta | ffa70e3 | 2016-07-13 17:41:03 +0530 | [diff] [blame] | 32 | try: |
| 33 | pr.submit() |
| 34 | except NegativeStockError: |
| 35 | pass |
Rushabh Mehta | 3ce24d6 | 2016-07-11 16:07:06 +0530 | [diff] [blame] | 36 | frappe.db.commit() |
Rushabh Mehta | cca33b2 | 2016-07-08 18:24:46 +0530 | [diff] [blame] | 37 | |
| 38 | def make_delivery_note(): |
| 39 | # make purchase requests |
| 40 | |
| 41 | # make delivery notes (if possible) |
| 42 | if random.random() < 0.3: |
| 43 | from erpnext.selling.doctype.sales_order.sales_order import make_delivery_note |
| 44 | report = "Ordered Items To Be Delivered" |
| 45 | for so in list(set([r[0] for r in query_report.run(report)["result"] |
| 46 | if r[0]!="'Total'"]))[:random.randint(1, 3)]: |
| 47 | dn = frappe.get_doc(make_delivery_note(so)) |
| 48 | dn.posting_date = frappe.flags.current_date |
| 49 | for d in dn.get("items"): |
| 50 | if not d.expense_account: |
| 51 | d.expense_account = ("Cost of Goods Sold - {0}".format( |
| 52 | frappe.db.get_value('Company', dn.company, 'abbr'))) |
| 53 | dn.insert() |
| 54 | try: |
| 55 | dn.submit() |
| 56 | frappe.db.commit() |
| 57 | except (NegativeStockError, SerialNoRequiredError, SerialNoQtyError): |
| 58 | frappe.db.rollback() |
| 59 | |
| 60 | def make_stock_reconciliation(): |
| 61 | # random set some items as damaged |
| 62 | from erpnext.stock.doctype.stock_reconciliation.stock_reconciliation \ |
| 63 | import OpeningEntryAccountError, EmptyStockReconciliationItemsError |
| 64 | |
| 65 | if random.random() < 0.1: |
| 66 | stock_reco = frappe.new_doc("Stock Reconciliation") |
| 67 | stock_reco.posting_date = frappe.flags.current_date |
| 68 | stock_reco.get_items_for("Stores - WP") |
| 69 | if stock_reco.items: |
| 70 | for item in stock_reco.items: |
| 71 | if item.qty: |
| 72 | item.qty = item.qty - round(random.randint(1, item.qty)) |
| 73 | try: |
| 74 | stock_reco.insert() |
| 75 | stock_reco.submit() |
| 76 | frappe.db.commit() |
| 77 | except OpeningEntryAccountError: |
| 78 | frappe.db.rollback() |
| 79 | except EmptyStockReconciliationItemsError: |
| 80 | frappe.db.rollback() |
| 81 | |
| 82 | def submit_draft_stock_entries(): |
| 83 | from erpnext.stock.doctype.stock_entry.stock_entry import IncorrectValuationRateError, \ |
| 84 | DuplicateEntryForProductionOrderError, OperationsNotCompleteError |
| 85 | |
| 86 | # try posting older drafts (if exists) |
| 87 | for st in frappe.db.get_values("Stock Entry", {"docstatus":0}, "name"): |
| 88 | try: |
| 89 | ste = frappe.get_doc("Stock Entry", st[0]) |
| 90 | ste.posting_date = frappe.flags.current_date |
| 91 | ste.save() |
| 92 | ste.submit() |
| 93 | frappe.db.commit() |
| 94 | except (NegativeStockError, IncorrectValuationRateError, DuplicateEntryForProductionOrderError, |
| 95 | OperationsNotCompleteError): |
| 96 | frappe.db.rollback() |
| 97 | |