Esempio n. 1
0
    def postprocess(source, target):
        from \
         .dfactoring \
         .doctype \
         .party_portfolio \
         .party_portfolio \
        import \
         get_temporary_opening_account \
        as get_temp_acc

        default_uom = db.get_single_value("Stock Settings",
                                          "stock_uom") or _("Nos")
        cost_center = db.get_value("Company", source.company, "cost_center")

        target.append(
            "items", {
                "doctype": "Purchase Invoice Item",
                "parenttype": "Purchase Invoice",
                "parentfield": "items",
                "rate": source.total_amount,
                "amount": source.total_amount,
                "qty": 1,
                "conversion_factor": 1,
                "uom": default_uom,
                "cost_center": cost_center,
                "item_name": _("Opening Invoice Item"),
                "description": _("Opening Invoice Item"),
                "expense_account": get_temp_acc(source.company),
            })
Esempio n. 2
0
        def get_parent_department(option):
            name = get_department(option)

            doctype = "Department"
            fieldname = "parent_department"

            return database.get_value(doctype, name, fieldname)
        def get_item_dict():
            default_uom = db.get_single_value("Stock Settings",
                                              "stock_uom") or _("Nos")
            cost_center = db.get_value("Company", self.get("company"),
                                       "cost_center")

            if not cost_center:
                frappe.throw(
                 _("Please set the Default Cost Center in {0} company") \
                  .format(frappe.bold(self.get("company")))
                )

            item_name = _("Opening Invoice Item")

            return frappe._dict({
                "uom":
                default_uom,
                "rate":
                flt(self.due_capital_balance),
                "qty":
                1.000,
                "conversion_factor":
                1.000,
                "item_name":
                item_name,
                "description":
                item_name,
                income_expense_account_field:
                self.get("temporary_opening_account"),
                "cost_center":
                cost_center,
            })
Esempio n. 4
0
def make_sales_quotation(source_name, target_doc=None):
    cost_estimation = database.get_value("Cost Estimation",
                                         source_name,
                                         ["generated_on", "valid_until"],
                                         as_dict=1)
    if cost_estimation.valid_until and (
            cost_estimation.valid_until < cost_estimation.generated_on
            or cost_estimation.valid_until < getdate(nowdate())):
        frappe.throw(translate("Validity period of this quotation has ended."))
    return _make_sales_quotation(source_name, target_doc)
Esempio n. 5
0
def fwd_uti_cancel(self):
    if self.forward_contract:
        existing_row_id = db.get_value("Forward Booking Utilization",
                                       filters={
                                           "parent": self.forward_contract,
                                           "payment_entry": self.name
                                       },
                                       fieldname="name")
        frappe.delete_doc("Forward Booking Utilization", existing_row_id)
        db.commit()
Esempio n. 6
0
def create_igst_jv(self):
    if self.export_type == "With Payment of Tax" and self.currency != "INR" and self.total_igst_amount and self.shipping_bill_date:
        refund_receivable_account = db.get_value(
            "Company", {"company_name": self.company},
            "refund_receivable_on_export_account")
        igst_payable_account = db.get_value("Company",
                                            {"company_name": self.company},
                                            "igst_payable_account")
        cost_center = db.get_value("Company", {"company_name": self.company},
                                   "cost_center")
        if not refund_receivable_account:
            frappe.throw(
                _("Set Refund Receivable on Export Account in Company"))
        elif not igst_payable_account:
            frappe.throw(_("Set IGST Payable Account in Company"))
        elif not cost_center:
            frappe.throw(_("Set Default Cost Center in Company"))
        else:
            jv = frappe.new_doc("Journal Entry")
            jv.voucher_type = "GST Payable Entry"
            jv.posting_date = self.shipping_bill_date
            jv.company = self.company
            jv.cheque_no = self.name
            jv.cheque_date = self.shipping_bill_date
            jv.user_remark = "IGST Payable against" + self.name + " for " + self.customer
            jv.append(
                "accounts", {
                    "account": refund_receivable_account,
                    "cost_center": cost_center,
                    "debit_in_account_currency": self.total_igst_amount
                })
            jv.append(
                "accounts", {
                    "account": igst_payable_account,
                    "cost_center": cost_center,
                    "credit_in_account_currency": self.total_igst_amount
                })
            jv.save(ignore_permissions=True)
            self.db_set('gst_jv', jv.name)
            jv.submit()
            db.commit()
Esempio n. 7
0
def create_drawback_jv(self):
    if self.currency != "INR" and self.total_duty_drawback:
        drawback_receivable_account = db.get_value(
            "Company", {"company_name": self.company},
            "duty_drawback_receivable_account")
        drawback_income_account = db.get_value("Company",
                                               {"company_name": self.company},
                                               "duty_drawback_income_account")
        drawback_cost_center = db.get_value("Company",
                                            {"company_name": self.company},
                                            "duty_drawback_cost_center")
        if not drawback_receivable_account:
            frappe.throw(_("Set Duty Drawback Receivable Account in Company"))
        elif not drawback_income_account:
            frappe.throw(_("Set Duty Drawback Income Account in Company"))
        elif not drawback_cost_center:
            frappe.throw(_("Set Duty Drawback Cost Center in Company"))
        else:
            jv = frappe.new_doc("Journal Entry")
            jv.voucher_type = "Duty Drawback Entry"
            jv.posting_date = self.posting_date
            jv.company = self.company
            jv.cheque_no = self.name
            jv.cheque_date = self.posting_date
            jv.user_remark = "Duty draw back against" + self.name + " for " + self.customer
            jv.append(
                "accounts", {
                    "account": drawback_receivable_account,
                    "cost_center": drawback_cost_center,
                    "debit_in_account_currency": self.total_duty_drawback
                })
            jv.append(
                "accounts", {
                    "account": drawback_income_account,
                    "cost_center": drawback_cost_center,
                    "credit_in_account_currency": self.total_duty_drawback
                })
            jv.save(ignore_permissions=True)
            self.db_set('duty_drawback_jv', jv.name)
            jv.submit()
            db.commit()
        def get_warehouse(doc):
            doctype = "Item Default"
            filters = {
                "company": self.company,
                "parent": doc.item,
                "parenttype": "Item",
                "parentfield": "item_defaults",
            }

            fieldname = "default_warehouse"

            return database.get_value(doctype, filters, fieldname)
def get_temporary_opening_account(company=None):
    if not company:
        return

    accounts = frappe.get_all("Account",
                              filters={
                                  'company':
                                  company,
                                  'account_type':
                                  'Temporary',
                                  'account_currency':
                                  db.get_value("Company", company,
                                               "default_currency")
                              })

    if not accounts:
        accounts = frappe.get_all("Account",
                                  filters={
                                      'company': company,
                                      'account_type': 'Temporary',
                                  })

    if not accounts:
        accounts = frappe.get_all("Account",
                                  filters={
                                      'company':
                                      company,
                                      'account_type':
                                      'Income Account',
                                      'account_currency':
                                      db.get_value("Company", company,
                                                   "default_currency"),
                                  })

    if not accounts:
        frappe.throw(
            _("Please add a Temporary Opening account in Chart of Accounts"))

    return accounts[0].name
Esempio n. 10
0
def update_bin(args,
               allow_negative_stock=False,
               via_landed_cost_voucher=False):
    is_stock_item = db.get_value('Item', args.get("item_code"),
                                 'is_stock_item')
    if is_stock_item:
        bin_ = get_bin(args.get("item_code"), args.get("warehouse"))
        bin_.update_stock_ = update_stock_.__get__(bin_, Bin)
        bin_.update_stock_(args, allow_negative_stock, via_landed_cost_voucher)
        return bin_
    else:
        msgprint(
            _("Item {0} ignored since it is not a stock item").format(
                args.get("item_code")))
Esempio n. 11
0
def upadte_item_price(item, price_list, per_unit_price):
	if db.exists("Item Price",{"item_code":item,"price_list":price_list}):
		name = db.get_value("Item Price",{"item_code":item,"price_list":price_list},'name')
		db.set_value("Item Price",name,"price_list_rate", per_unit_price)
	else:
		item_price = frappe.new_doc("Item Price")
		item_price.price_list = price_list
		item_price.item_code = item
		item_price.price_list_rate = per_unit_price
		
		item_price.save()
	db.commit()
		
	return "Item Price Updated!"
Esempio n. 12
0
    def get_ball_mill(self):
        if not self.ball_mill_ref:
            frappe.throw(_("Please select Ball Mill Data Sheet!"))

        bm = frappe.get_doc("Ball Mill Data Sheet", self.ball_mill_ref)
        self.product_name = bm.product_name
        self.link_to = "Customer"
        self.party = bm.customer_name
        self.batch_yield = bm.total_yield

        customer_name, destination = db.get_value(
            "Customer", bm.customer_name, ['customer_name', 'territory'])
        self.party_name = customer_name
        self.destination_1 = self.destination = destination

        self.set("details", [])

        total_amount = 0.0
        for row in bm.items:
            price = get_spare_price(row.item_name,
                                    "Standard Buying").price_list_rate

            if row.batch_yield:
                bomyield = frappe.db.get_value("BOM", {'item': row.item_name},
                                               "batch_yield")
                if bomyield != 0:
                    rate = (price * flt(bomyield)) / row.batch_yield
                else:
                    rate = (price * 2.2) / row.batch_yield
            else:
                rate = price

            amount = rate * row.quantity
            total_amount += amount

            self.append(
                'details', {
                    'item_name': row.item_name,
                    'batch_yield': row.batch_yield,
                    'quantity': row.quantity,
                    'rate': rate,
                    'price_list_rate': price,
                    'amount': amount,
                })

        self.total_amount = total_amount
        self.total_qty = bm.total_qty
        self.per_unit_price = total_amount / bm.total_qty
        def get_product_features(item_code):
            doctype = "Item"
            name = item_code
            fields = ("ref_doctype", "ref_docname")

            ref_doctype, ref_docname = database.get_value(
                doctype, name, fields)

            if not ref_doctype or not ref_docname \
                    or not database.exists(ref_doctype, ref_docname):
                return []

            doc = frappe.get_doc(ref_doctype, ref_docname)

            options = doc.get_full_product_options()

            return options.split(", ")
Esempio n. 14
0
    def validate_product_assembly(self):
        doctype = self.meta \
            .get_field("product_assembly") \
            .options

        docname = self.product_assembly
        fieldname = "product_profile"

        value = database.get_value(doctype, docname, fieldname)

        errmsg = translate("Product Assembly: {} is not "
                           "a type of Product Profile: {}")

        if value != self.product_profile:
            formatted_error = errmsg.format(self.product_assembly,
                                            self.product_profile)

            frappe.throw(formatted_error)
Esempio n. 15
0
    def set_printing_sides(self):
        doctype = "Product Assembly"
        name = self.product_assembly
        fields = ("front_colors", "pantone_colors", "back_colors",
                  "pantone_back_colors")

        front_colors, pantone_colors, back_colors, pantone_back_colors \
            = database.get_value(doctype, name, fields)

        self.printing_sides = "Sin Impresión"

        if cint(front_colors) > 0 \
                or cint(pantone_colors) > 0:
            self.printing_sides = translate("One Side")

            if cint(back_colors) > 0 \
                    or cint(pantone_back_colors) > 0:
                self.printing_sides = translate("Two Sides")
Esempio n. 16
0
    def before_submit(self):
        if self.truck_part == "Battery" or self.truck_part == "Tyre":
            if self.include_sr_no and self.number_of_parts != len(
                    self.serial_number):
                throw(
                    _("Please set total %d serial numbers" %
                      self.number_of_parts))

        serial_list = []
        for d in self.serial_number:
            serial = db.get_value("Truck Parts Inventory",
                                  {"serial_number": d.serial_no})
            if serial:
                throw(_("Serial number already exists for row %d!" % d.idx))

            if d.serial_no not in serial_list:
                serial_list.append(d.serial_no)
            else:
                throw(_("Similar serial number found in row %d" % d.idx))
Esempio n. 17
0
    def validate_duplicates_production_orders(self):
        if not self.project_center:
            return "production order without project center"

        doctype = self.doctype
        filters = {
            "name": ["!=", self.name],
            "project_center": self.project_center
        }

        value = database.get_value(doctype, filters)

        if not value:
            return "ok"

        err_msg = translate("A Production Order exists "
                            "against this Project Center.")

        frappe.throw(err_msg.format(value))
Esempio n. 18
0
def fwd_uti(self):
    if self.forward_contract:
        target_doc = frappe.get_doc("Forward Booking", self.forward_contract)
        existing_row_id = db.get_value("Forward Booking Utilization",
                                       filters={
                                           "parent": self.forward_contract,
                                           "payment_entry": self.name
                                       },
                                       fieldname="name")

        if not existing_row_id:
            target_doc.append(
                "payment_entries", {
                    "date": self.posting_date,
                    "party_type": self.party_type,
                    "party": self.party,
                    "paid_amount": self.paid_amount,
                    "received_amount": self.received_amount,
                    "payment_entry": self.name
                })
        target_doc.save()
        db.commit()
Esempio n. 19
0
 def validate(self):
     if db.get_value(
         "Vehicle Owner Contract", {"name": self.name}, "contract_status"
     ) in ["Cancelled", "Terminated", "Rejected"]:
         frappe.throw(_("Cannot modify contracts in this status."))
Esempio n. 20
0
def get_customer_ref_code(item_code, customer):
	ref_code = db.get_value("Item Customer Detail", {'parent': item_code, 'customer_name': customer}, 'ref_code')
	return ref_code if ref_code else ''
        def get_expected_start_date(project_center):
            doctype = "Project Center"
            name = project_center
            fieldname = "expected_start_date"

            return database.get_value(doctype, name, fieldname)
Esempio n. 22
0
        def get_work_station(option):
            doctype = "Product Feature"
            name = option
            fieldname = "default_work_station"

            return database.get_value(doctype, name, fieldname)
Esempio n. 23
0
 def get_department(option):
     doctype = "Product Feature"
     name = option
     fieldname = "department"
     return database.get_value(doctype, name, fieldname)
Esempio n. 24
0
    def before_submit(self):
        for d in self.service_detail:
            if d.type == "Change from Inventory" or d.type == "Change at Garage":
                old_part = get_doc("Truck Parts Inventory", d.part_no)
                old_part.part_status = "Available"
                old_part.truck_no = ""
                old_part.warehouse = d.warehouse
                old_part.save()

                if d.type == "Change from Inventory":
                    if not d.new_part_no:
                        throw(
                            _("Please provide New Part No. in row %d" % d.idx))

                    update_part = get_doc("Truck Parts Inventory",
                                          d.new_part_no)
                    update_part.part_status = "In Use"
                    update_part.truck_no = self.truck_no
                    update_part.save()
                else:
                    if not d.serial_number:
                        throw(
                            _("Please provide serial number in row %d" %
                              d.idx))
                    elif not d.part_company:
                        throw(
                            _("Please provide part company in row %d" % d.idx))
                    elif not d.purchase_rate:
                        throw(
                            _("Please provide purchase rate in row %d" %
                              d.idx))
                    elif not d.purchase_date:
                        throw(
                            _("Please provide purchase date in row %d" %
                              d.idx))
                    elif not d.new_part_link:
                        inventory = new_doc("Truck Parts Inventory")
                        inventory.truck_part = d.service_item
                        inventory.part_company = d.part_company
                        inventory.warehouse = d.warehouse
                        inventory.purchase_through = "Maintenance Log"
                        inventory.ref_link = self.name
                        inventory.purchase_rate = d.purchase_rate
                        inventory.purchase_date = d.purchase_date
                        inventory.serial_number = d.serial_number
                        inventory.title = d.service_item + "-" + d.serial_number
                        inventory.part_status = "In Use"
                        inventory.truck_no = self.truck_no
                        inventory.save()
                        d.new_part_link = inventory.name

                db.commit()

        stock_entry = None
        cost_center = db.get_value("Company", self.company, "cost_center")
        for d in self.consumable_details:
            if d.from_inventory:
                if not d.warehouse:
                    throw(
                        _("Please provide warehouse in row %d of Consumable Service Table"
                          % d.idx))
                else:
                    if not stock_entry:
                        stock_entry = new_doc("Stock Entry")
                        stock_entry.company = self.company
                        stock_entry.purpose = "Material Issue"
                        stock_entry.append(
                            "items", {
                                "s_warehouse": d.warehouse,
                                "item_code": d.item_code,
                                "qty": d.used_qty,
                                "expense_account": self.expense_account,
                                "cost_center": cost_center
                            })
                    else:
                        stock_entry.append(
                            "items", {
                                "s_warehouse": d.warehouse,
                                "item_code": d.item_code,
                                "qty": d.used_qty,
                                "expense_account": self.expense_account,
                                "cost_center": cost_center
                            })

        if stock_entry:
            stock_entry.save()
            stock_entry.submit()
            db.commit()
            url = get_url_to_form("Stock Entry", stock_entry.name)
            idx = url.find("/desk#")
            stock_entry_url = url[:idx] + ":8081" + url[idx:]
            link = "<b><a href='{url}'>{name}</a></b>".format(
                url=stock_entry_url, name=stock_entry.name)
            msgprint(_("New Stock Entry {0} created!".format(link)),
                     title="Success",
                     indicator='green')
Esempio n. 25
0
    def set_allow_printing(self):
        doctype = "Product Profile"
        name = self.product_profile
        fieldname = "allow_printing"

        self.allow_printing = database.get_value(doctype, name, fieldname)
Esempio n. 26
0
    def set_paperboard(self):
        doctype = "Product Assembly"
        name = self.product_assembly
        fieldname = "paperboard"

        self.paperboard = database.get_value(doctype, name, fieldname)
	def get_gl_entries(self, warehouse_account=None, default_expense_account=None,
					   default_cost_center=None):
		default_expense_account = self.expense_account
		default_cost_center = self.cost_center

		if not self.cost_center:
			msgprint(_("Please enter Cost Center"), raise_exception=1)

		if not warehouse_account:
			warehouse_account = get_warehouse_account_map()

		sle_map = self.get_stock_ledger_details()
		voucher_details = self.get_voucher_details(default_expense_account, default_cost_center, sle_map)

		gl_list = []
		warehouse_with_no_account = []

		for item_row in voucher_details:
			sle_list = sle_map.get(item_row.name)
			if sle_list:
				for sle in sle_list:
					if warehouse_account.get(sle.warehouse):
						# from warehouse account

						self.check_expense_account(item_row)

						# If the item does not have the allow zero valuation rate flag set
						# and ( valuation rate not mentioned in an incoming entry
						# or incoming entry not found while delivering the item),
						# try to pick valuation rate from previous sle or Item master and update in SLE
						# Otherwise, throw an exception

						if not sle.stock_value_difference and self.doctype != "Inventory Reconciliation" \
							and not item_row.get("allow_zero_valuation_rate"):
							sle = self.update_stock_ledger_entries(sle)

						gl_list.append(self.get_gl_dict({
							"account": warehouse_account[sle.warehouse]["account"],
							"against": item_row.expense_account,
							"cost_center": item_row.cost_center,
							"remarks": self.get("remarks") or "Accounting Entry for Stock",
							"debit": flt(sle.stock_value_difference, 2),
						}, warehouse_account[sle.warehouse]["account_currency"]))

						# to target warehouse / expense account
						gl_list.append(self.get_gl_dict({
							"account": item_row.expense_account,
							"against": warehouse_account[sle.warehouse]["account"],
							"cost_center": item_row.cost_center,
							"remarks": self.get("remarks") or "Accounting Entry for Stock",
							"credit": flt(sle.stock_value_difference, 2),
							"project": item_row.get("project") or self.get("project")
						}))

					elif sle.warehouse not in warehouse_with_no_account:
						warehouse_with_no_account.append(sle.warehouse)

		if warehouse_with_no_account:
			for wh in warehouse_with_no_account:
				if db.get_value("Warehouse", wh, "company"):
					throw(_("Warehouse {0} is not linked to any account, please "
							"mention the account in  the warehouse record or set "
							"default inventory account in company {1}.").format(wh, self.company))

		return process_gl_map(gl_list)