def validate(self): self.validate_posting_time() super(DeliveryNote, self).validate() self.set_status() self.so_required() self.validate_proj_cust() self.check_sales_order_on_hold_or_close("against_sales_order") self.validate_warehouse() self.validate_uom_is_integer("stock_uom", "stock_qty") self.validate_uom_is_integer("uom", "qty") self.validate_with_previous_doc() from erpnext.stock.doctype.packed_item.packed_item import make_packing_list make_packing_list(self) if self._action != "submit" and not self.is_return: set_batch_nos(self, "warehouse", throw=True) set_batch_nos(self, "warehouse", throw=True, child_table="packed_items") self.update_current_stock() if not self.installation_status: self.installation_status = "Not Installed" self.reset_default_field_value("set_warehouse", "items", "warehouse")
def validate(self): self.pro_doc = frappe._dict() if self.production_order: self.pro_doc = frappe.get_doc('Production Order', self.production_order) self.validate_posting_time() self.validate_purpose() self.validate_item() self.set_transfer_qty() self.validate_uom_is_integer("uom", "qty") self.validate_uom_is_integer("stock_uom", "transfer_qty") self.validate_warehouse() self.validate_production_order() self.validate_bom() self.validate_finished_goods() self.validate_with_material_request() self.validate_batch() if not self.from_bom: self.fg_completed_qty = 0.0 if self._action == 'submit': self.make_batches('t_warehouse') else: set_batch_nos(self, 's_warehouse') self.set_incoming_rate() self.set_actual_qty() self.calculate_rate_and_amount(update_finished_item_rate=False)
def validate(self): self.pro_doc = frappe._dict() if self.production_order: self.pro_doc = frappe.get_doc('Production Order', self.production_order) self.validate_posting_time() self.validate_purpose() self.validate_item() self.set_transfer_qty() self.validate_uom_is_integer("uom", "qty") self.validate_uom_is_integer("stock_uom", "transfer_qty") self.validate_warehouse() self.validate_production_order() self.validate_bom() self.validate_finished_goods() self.validate_with_material_request() self.validate_batch() if self._action == 'submit': self.make_batches('t_warehouse') else: set_batch_nos(self, 's_warehouse') self.set_actual_qty() self.calculate_rate_and_amount(update_finished_item_rate=False)
def validate(self): super(SalesInvoice, self).validate() self.validate_auto_set_posting_time() if not self.is_pos: self.so_dn_required() self.validate_proj_cust() self.validate_with_previous_doc() self.validate_uom_is_integer("stock_uom", "stock_qty") self.validate_uom_is_integer("uom", "qty") self.check_close_sales_order("sales_order") self.validate_debit_to_acc() self.clear_unallocated_advances("Sales Invoice Advance", "advances") self.add_remarks() self.validate_write_off_account() self.validate_account_for_change_amount() self.validate_fixed_asset() self.set_income_account_for_fixed_assets() if cint(self.is_pos): self.validate_pos() if cint(self.update_stock): self.validate_dropship_item() self.validate_item_code() self.validate_warehouse() self.update_current_stock() self.validate_delivery_note() if not self.is_opening: self.is_opening = 'No' if self._action != 'submit' and self.update_stock and not self.is_return: set_batch_nos(self, 'warehouse', True) self.set_against_income_account() self.validate_c_form() self.validate_time_sheets_are_submitted() self.validate_multiple_billing("Delivery Note", "dn_detail", "amount", "items") if not self.is_return: self.validate_serial_numbers() self.update_packing_list() self.set_billing_hours_and_amount() self.update_timesheet_billing_for_project() self.set_status() # As a company policy default ledger is not allowed for creating Invoice self.check_debit_to()
def validate(self): super(SalesInvoice, self).validate() self.validate_auto_set_posting_time() if not self.is_pos: self.so_dn_required() self.validate_proj_cust() self.validate_with_previous_doc() self.validate_uom_is_integer("stock_uom", "stock_qty") self.validate_uom_is_integer("uom", "qty") self.check_close_sales_order("sales_order") self.validate_debit_to_acc() self.clear_unallocated_advances("Sales Invoice Advance", "advances") self.add_remarks() self.validate_write_off_account() self.validate_account_for_change_amount() self.validate_fixed_asset() self.set_income_account_for_fixed_assets() if cint(self.is_pos): self.validate_pos() if cint(self.update_stock): self.validate_dropship_item() self.validate_item_code() self.validate_warehouse() self.update_current_stock() self.validate_delivery_note() if not self.is_opening: self.is_opening = 'No' if self._action != 'submit' and self.update_stock and not self.is_return: set_batch_nos(self, 'warehouse', True) self.set_against_income_account() self.validate_c_form() self.validate_time_sheets_are_submitted() self.validate_multiple_billing("Delivery Note", "dn_detail", "amount", "items") if not self.is_return: self.validate_serial_numbers() self.update_packing_list() self.set_billing_hours_and_amount() self.update_timesheet_billing_for_project() self.set_status() if self.is_pos and not self.is_return: self.verify_payment_amount_is_positive()
def validate(self): self.validate_posting_time() super(DeliveryNote, self).validate() self.set_status() self.so_required() self.validate_proj_cust() self.check_sales_order_on_hold_or_close("against_sales_order") self.validate_warehouse() self.validate_uom_is_integer("stock_uom", "stock_qty") self.validate_uom_is_integer("uom", "qty") self.validate_with_previous_doc() if self._action != 'submit' and not self.is_return: set_batch_nos(self, 'warehouse', True) from erpnext.stock.doctype.packed_item.packed_item import make_packing_list make_packing_list(self) self.update_current_stock() if not self.installation_status: self.installation_status = 'Not Installed'
def validate(self): self.validate_posting_time() super(DeliveryNote, self).validate() self.set_status() self.so_required() self.validate_proj_cust() self.check_close_sales_order("against_sales_order") self.validate_for_items() self.validate_warehouse() self.validate_uom_is_integer("stock_uom", "qty") self.validate_uom_is_integer("uom", "qty") self.validate_with_previous_doc() if self._action != 'submit': set_batch_nos(self, 'warehouse', True) from erpnext.stock.doctype.packed_item.packed_item import make_packing_list make_packing_list(self) self.update_current_stock() if not self.installation_status: self.installation_status = 'Not Installed'
def validate(self): self.pro_doc = frappe._dict() if self.work_order: self.pro_doc = frappe.get_doc('Work Order', self.work_order) self.validate_posting_time() self.validate_item() self.set_transfer_qty() self.validate_uom_is_integer("uom", "qty") self.validate_uom_is_integer("stock_uom", "transfer_qty") self.validate_warehouse() self.validate_batch() if not self.from_bom: self.fg_completed_qty = 0.0 if not self._action == 'submit': set_batch_nos(self, 's_warehouse') self.get_batch_details() self.set_incoming_rate() self.set_actual_qty() self.calculate_rate_and_amount(update_finished_item_rate=False)
def validate(self): self.pro_doc = frappe._dict() if self.work_order: self.pro_doc = frappe.get_doc('Work Order', self.work_order) self.validate_posting_time() self.validate_purpose() self.validate_item() self.validate_customer_provided_item() self.validate_qty() self.set_transfer_qty() self.validate_uom_is_integer("uom", "qty") self.validate_uom_is_integer("stock_uom", "transfer_qty") self.validate_warehouse() self.validate_work_order() self.validate_bom() self.mark_finished_and_scrap_items() self.validate_finished_goods() self.validate_with_material_request() self.validate_batch() self.validate_inspection() self.validate_fg_completed_qty() self.validate_difference_account() self.set_job_card_data() self.set_purpose_for_stock_entry() if not self.from_bom: self.fg_completed_qty = 0.0 if self._action == 'submit': self.make_batches('t_warehouse') else: set_batch_nos(self, 's_warehouse') self.validate_serialized_batch() self.set_actual_qty() self.calculate_rate_and_amount() self.validate_putaway_capacity()
def submit_invoice(invoice, data): data = json.loads(data) invoice = json.loads(invoice) invoice_doc = frappe.get_doc("Sales Invoice", invoice.get("name")) invoice_doc.update(invoice) if invoice.get("posa_delivery_date"): invoice_doc.update_stock = 0 mop_cash_list = [ i.mode_of_payment for i in invoice_doc.payments if "cash" in i.mode_of_payment.lower() and i.type == "Cash" ] if len(mop_cash_list) > 0: cash_account = get_bank_cash_account(mop_cash_list[0], invoice_doc.company) else: cash_account = { "account": frappe.get_value( "Company", invoice_doc.company, "default_cash_account" ) } # creating advance payment if data.get("credit_change"): advance_payment_entry = frappe.get_doc( { "doctype": "Payment Entry", "mode_of_payment": "Cash", "paid_to": cash_account["account"], "payment_type": "Receive", "party_type": "Customer", "party": invoice_doc.get("customer"), "paid_amount": invoice_doc.get("credit_change"), "received_amount": invoice_doc.get("credit_change"), "company": invoice_doc.get("company"), } ) advance_payment_entry.flags.ignore_permissions = True frappe.flags.ignore_account_permission = True advance_payment_entry.save() advance_payment_entry.submit() # calculating cash total_cash = 0 if data.get("redeemed_customer_credit"): total_cash = invoice_doc.total - float(data.get("redeemed_customer_credit")) is_payment_entry = 0 if data.get("redeemed_customer_credit"): for row in data.get("customer_credit_dict"): if row["type"] == "Advance" and row["credit_to_redeem"]: advance = frappe.get_doc("Payment Entry", row["credit_origin"]) advance_payment = { "reference_type": "Payment Entry", "reference_name": advance.name, "remarks": advance.remarks, "advance_amount": advance.unallocated_amount, "allocated_amount": row["credit_to_redeem"], } invoice_doc.append("advances", advance_payment) invoice_doc.is_pos = 0 is_payment_entry = 1 payments = [] if data.get("is_cashback") and not is_payment_entry: for payment in invoice.get("payments"): for i in invoice_doc.payments: if i.mode_of_payment == payment["mode_of_payment"]: i.amount = payment["amount"] i.base_amount = 0 if i.amount: payments.append(i) break if len(payments) == 0 and not invoice_doc.is_return and invoice_doc.is_pos: payments = [invoice_doc.payments[0]] else: invoice_doc.is_pos = 0 invoice_doc.payments = payments if frappe.get_value("POS Profile", invoice_doc.pos_profile, "posa_auto_set_batch"): set_batch_nos(invoice_doc, "warehouse", throw=True) set_batch_nos_for_bundels(invoice_doc, "warehouse", throw=True) invoice_doc.due_date = data.get("due_date") invoice_doc.flags.ignore_permissions = True frappe.flags.ignore_account_permission = True invoice_doc.posa_is_printed = 1 invoice_doc.save() if frappe.get_value( "POS Profile", invoice_doc.pos_profile, "posa_allow_submissions_in_background_job", ): invoices_list = frappe.get_all( "Sales Invoice", filters={ "posa_pos_opening_shift": invoice_doc.posa_pos_opening_shift, "docstatus": 0, "posa_is_printed": 1, }, ) for invoice in invoices_list: enqueue( method=submit_in_background_job, queue="short", timeout=1000, is_async=True, kwargs={ "invoice": invoice.name, "data": data, "is_payment_entry": is_payment_entry, "total_cash": total_cash, "cash_account": cash_account, }, ) else: invoice_doc.submit() redeeming_customer_credit( invoice_doc, data, is_payment_entry, total_cash, cash_account ) return {"name": invoice_doc.name, "status": invoice_doc.docstatus}