예제 #1
0
 def invalid_batch_qtys(items):
     get_qtys = compose(partial(valmap, sum_by("qty")),
                        partial(groupby, "item_code"))
     get_si_items = compose(get_qtys, partial(map, lambda x: x.as_dict()),
                            _filter_batch_items)
     get_batch_items = compose(get_qtys, json.loads)
     return get_si_items(items) != get_batch_items(batches)
예제 #2
0
 def make_aggregator(start, end):
     return compose(
         sum_by("amount"),
         lambda x: filter(
             lambda row: row.branch == x and (start <= row.posting_date <= end),
             payments,
         ),
         partial(get, "branch"),
     )
예제 #3
0
def _get_mop_collections(payments, end_date):
    get_sum_today = compose(
        sum_by("amount"),
        lambda x: filter(
            lambda row: row.mode_of_payment == x and row.posting_date == end_date,
            payments,
        ),
        partial(get, "mop"),
    )
    get_sum_mtd = compose(
        sum_by("amount"),
        lambda x: filter(lambda row: row.mode_of_payment == x, payments),
        partial(get, "mop"),
    )
    return map_resolved(
        lambda x: merge(
            x, {"collected_today": get_sum_today(x), "collected_mtd": get_sum_mtd(x)}
        ),
        frappe.get_all("Mode of Payment", fields=["name AS mop"]),
    )
예제 #4
0
def _get_mop_collections(payments, yesterday):
    get_sum_today = compose(
        sum_by("amount"),
        lambda x: filter(
            lambda row: row.mode_of_payment == x and row.posting_date == yesterday,
            payments,
        ),
        partial(get, "mop"),
    )
    return mapf(
        lambda x: merge(x, {"collected_today": get_sum_today(x)}),
        frappe.get_all("Mode of Payment", fields=["name AS mop"]),
    )
예제 #5
0
def _get_branch_collections(payments, end_date):
    get_sum_today = compose(
        sum_by("amount"),
        lambda x: filter(
            lambda row: row.branch == x and row.posting_date == end_date, payments
        ),
        partial(get, "branch"),
    )
    get_sum_mtd = compose(
        sum_by("amount"),
        lambda x: filter(lambda row: row.branch == x, payments),
        partial(get, "branch"),
    )

    get_percent = excepts(ZeroDivisionError, lambda x, y: x / y * 100, lambda __: 0)

    def set_amounts(x):
        monthly_target = get("monthly_target", x, 0)
        collected_mtd = get_sum_mtd(x)
        return {
            "collected_today": get_sum_today(x),
            "half_monthly_target": monthly_target / 2,
            "half_monthly_target_percent": get_percent(
                collected_mtd, monthly_target / 2
            ),
            "collected_mtd": collected_mtd,
            "monthly_target_remaining": monthly_target - collected_mtd,
            "monthly_target_percent": get_percent(collected_mtd, monthly_target),
        }

    return map_resolved(
        lambda x: merge(x, set_amounts(x)),
        frappe.get_all(
            "Branch",
            fields=["name AS branch", "os_target AS monthly_target"],
            filters={"disabled": 0},
        ),
    )
예제 #6
0
def _set_qty(bins):
    grouped = groupby("item_code", bins)
    get_total = sum_by("qty")

    def fn(item):
        branches = grouped.get(item.get("item_code"))
        return (merge(
            item,
            {x.get("branch"): x.get("qty")
             for x in branches},
            {"total_qty": get_total(branches)},
        ) if branches else item)

    return fn
예제 #7
0
def _set_payments(payments):
    mop_map = compose(
        partial(valmap, sum_by("amount")),
        partial(groupby, ("mode_of_payment")),
        partial(filter, lambda x: x.get("amount") is not None),
    )

    payments_grouped = compose(partial(valmap, mop_map),
                               partial(groupby, "posting_date"))(payments)

    def fn(row):
        mops = payments_grouped[row.get("posting_date")]
        return merge(row, mops, {"total_collected": sum(mops.values())})

    return fn
예제 #8
0
def _get_grouped_mop_collections(payments, yesterday):
    get_sum_today = compose(
        sum_by("amount"),
        lambda x: filter(
            lambda row: row.mode_of_payment in x and row.posting_date == yesterday,
            payments,
        ),
        lambda x: x.split("\n"),
        partial(get, "mops", default=""),
    )
    return [
        merge(x, {"collected_today": get_sum_today(x)})
        for x in frappe.get_all(
            "Email Alerts Grouped MOP", fields=["group_name", "mops"]
        )
    ]
예제 #9
0
 def set_missing_fields(self):
     for item in self.items:
         item.amount = flt(item.qty) * flt(item.basic_rate)
         item.valuation_rate = item.amount / flt(item.qty)
     self.total_value = sum_by("amount")(self.items)
     self.total_qty = sum_by("qty")(self.items)
예제 #10
0
    def set_report_details(self):
        args = merge(
            pick(["user", "pos_profile", "company"], self.as_dict()),
            {
                "start_time": self.start_time or now(),
                "end_time": self.end_time or now(),
            },
        )

        sales, returns = _get_invoices(args)
        sales_payments, returns_payments, collection_payments = _get_payments(
            args)
        taxes = _get_taxes(args)

        make_invoice = partial(
            pick, ["invoice", "total_qty", "grand_total", "paid_amount"])
        make_payment = partial(pick, ["mode_of_payment", "amount"])
        make_tax = partial(pick, ["rate", "tax_amount"])
        mops = compose(unique, partial(pluck, "mode_of_payment"))

        def get_mop_amount(mode_of_payment, payments=[]):
            return compose(
                partial(get, "amount"),
                excepts(StopIteration, first, lambda x: {"amount": 0}),
                partial(filter,
                        lambda x: x.get("mode_of_payment") == mode_of_payment),
            )(payments)

        get_cash = partial(get_mop_amount, "Cash")
        get_sales_amount = partial(get_mop_amount, payments=sales_payments)
        get_returns_amount = partial(get_mop_amount, payments=returns_payments)
        get_collection_amount = partial(get_mop_amount,
                                        payments=collection_payments)

        def make_payment(mode_of_payment):
            sales_amount = get_sales_amount(mode_of_payment)
            returns_amount = get_returns_amount(mode_of_payment)
            collection_amount = get_collection_amount(mode_of_payment)
            return {
                "mode_of_payment": mode_of_payment,
                "sales_amount": sales_amount,
                "returns_amount": returns_amount,
                "collection_amount": collection_amount,
                "total_amount":
                sales_amount + returns_amount + collection_amount,
            }

        sum_by_total = sum_by("total")
        sum_by_net = sum_by("net_total")
        sum_by_discount = compose(neg, sum_by("discount_amount"))
        sum_by_taxes = sum_by("tax_amount")
        sum_by_grand = sum_by("grand_total")

        self.cash_sales = get_cash(sales_payments)
        self.cash_returns = get_cash(returns_payments)
        self.cash_pe_received = get_cash(collection_payments)
        self.sales__total = sum_by_total(sales) - sum_by_total(returns)
        self.total__discount_amount = sum_by_discount(sales) + sum_by_discount(
            returns)
        self.returns__net_total = sum_by_net(returns)
        self.total__net_total = sum_by_net(sales + returns)
        self.total__total_taxes_and_charges = sum_by_taxes(taxes)
        self.total__grand_total = sum_by_grand(sales) + sum_by_grand(returns)

        self.sales = []
        for invoice in sales:
            self.append("sales", make_invoice(invoice))
        self.returns = []
        for invoice in returns:
            self.append("returns", make_invoice(invoice))
        self.payments = []
        for payment in mops(sales_payments + returns_payments +
                            collection_payments):
            self.append("payments", make_payment(payment))
        self.taxes = []
        for tax in taxes:
            self.append("taxes", make_tax(tax))

        self.total_collection = sum_by("total_amount")(self.payments)
예제 #11
0
 def si_deliverable(items):
     return sum_by("qty")(items) > sum_by("delivered_qty")(items)