# Buggy code
def get_invoice_dict(self, row=None):
    def get_item_dict():
        default_uom = frappe.db.get_single_value("Stock Settings", "stock_uom") or _(
            "Nos"
        )
        cost_center = frappe.db.get_value("Company", self.company, "cost_center")
        if not cost_center:
            frappe.throw(
                _("Please set the Default Cost Center in {0} company").format(
                    frappe.bold(self.company)
                )
            )
        rate = flt(row.outstanding_amount) / row.qty

        return frappe._dict(
            {
                "uom": default_uom,
                "rate": rate or 0.0,
                "qty": row.qty,
                "conversion_factor": 1.0,
                "item_name": row.item_name or "Opening Invoice Item",
                "description": row.item_name or "Opening Invoice Item",
                income_expense_account_field: row.temporary_opening_account,
                "cost_center": cost_center,
            }
        )

    if not row:
        return None

    party_type = "Customer"
    income_expense_account_field = "income_account"
    if self.invoice_type == "Purchase":
        party_type = "Supplier"
        income_expense_account_field = "expense_account"

    item = get_item_dict()
    return frappe._dict(
        {
            "items": [item],
            "is_opening": "Yes",
            "set_posting_time": 1,
            "company": self.company,
            "due_date": row.due_date,
            "posting_date": row.posting_date,
            frappe.scrub(party_type): row.party,
            "doctype": "Sales Invoice"
            if self.invoice_type == "Sales"
            else "Purchase Invoice",
            "currency": frappe.db.get_value(
                "Company", self.company, "default_currency"
            ),
        }
    )


# Traceback (AttributeError)
Traceback (most recent call last):
File "/Users/umairsayyed/frappe-bench/apps/frappe/frappe/app.py", line 62, in application
response = frappe.handler.handle()
File "/Users/umairsayyed/frappe-bench/apps/frappe/frappe/handler.py", line 22, in handle
data = execute_cmd(cmd)
File "/Users/umairsayyed/frappe-bench/apps/frappe/frappe/handler.py", line 53, in execute_cmd
return frappe.call(method, **frappe.form_dict)
File "/Users/umairsayyed/frappe-bench/apps/frappe/frappe/__init__.py", line 939, in call
return fn(*args, **newargs)
File "/Users/umairsayyed/frappe-bench/apps/frappe/frappe/handler.py", line 81, in runserverobj
frappe.desk.form.run_method.runserverobj(method, docs=docs, dt=dt, dn=dn, arg=arg, args=args)
File "/Users/umairsayyed/frappe-bench/apps/frappe/frappe/desk/form/run_method.py", line 36, in runserverobj
r = doc.run_method(method)
File "/Users/umairsayyed/frappe-bench/apps/frappe/frappe/model/document.py", line 755, in run_method
out = Document.hook(fn)(self, *args, **kwargs)
File "/Users/umairsayyed/frappe-bench/apps/frappe/frappe/model/document.py", line 1024, in composer
return composed(self, method, *args, **kwargs)
File "/Users/umairsayyed/frappe-bench/apps/frappe/frappe/model/document.py", line 1007, in runner
add_to_return_value(self, fn(self, *args, **kwargs))
File "/Users/umairsayyed/frappe-bench/apps/frappe/frappe/model/document.py", line 749, in <lambda>
fn = lambda self, *args, **kwargs: getattr(self, method)(*args, **kwargs)
File "/Users/umairsayyed/frappe-bench/apps/erpnext/erpnext/accounts/doctype/opening_invoice_creation_tool/opening_invoice_creation_tool.py", line 68, in make_invoices
if not row.qty:
AttributeError: 'OpeningInvoiceCreationToolItem' object has no attribute 'qty'

# Fixed code
def get_invoice_dict(self, row=None):
    def get_item_dict():
        default_uom = frappe.db.get_single_value("Stock Settings", "stock_uom") or _(
            "Nos"
        )
        cost_center = frappe.db.get_value("Company", self.company, "cost_center")
        if not cost_center:
            frappe.throw(
                _("Please set the Default Cost Center in {0} company").format(
                    frappe.bold(self.company)
                )
            )
        rate = flt(row.outstanding_amount) / flt(row.qty)

        return frappe._dict(
            {
                "uom": default_uom,
                "rate": rate or 0.0,
                "qty": row.qty,
                "conversion_factor": 1.0,
                "item_name": row.item_name or "Opening Invoice Item",
                "description": row.item_name or "Opening Invoice Item",
                income_expense_account_field: row.temporary_opening_account,
                "cost_center": cost_center,
            }
        )

    if not row:
        return None

    party_type = "Customer"
    income_expense_account_field = "income_account"
    if self.invoice_type == "Purchase":
        party_type = "Supplier"
        income_expense_account_field = "expense_account"

    item = get_item_dict()
    return frappe._dict(
        {
            "items": [item],
            "is_opening": "Yes",
            "set_posting_time": 1,
            "company": self.company,
            "due_date": row.due_date,
            "posting_date": row.posting_date,
            frappe.scrub(party_type): row.party,
            "doctype": "Sales Invoice"
            if self.invoice_type == "Sales"
            else "Purchase Invoice",
            "currency": frappe.db.get_value(
                "Company", self.company, "default_currency"
            ),
        }
    )