Fill rate is surprisingly easy to calculate from the PO Items table. This script is implimented in the Fill Rate dataflow in Domo.

library(DomoR)
library(tidyverse)
library(lubridate)

load("domoCustomer")
load("domoAccessToken")
init(domoCustomer, domoAccessToken)

poItems <- fetch("b8d4c659-5735-41b7-adb7-b6a42be1aed7")

fillRate <- poItems %>%
        filter(exclude_from_fill_rate == 0,
               dropship_po == 0) %>%
        mutate(qty_ordered = ifelse(qty_ordered == 0 & original_qty_ordered > 0,
                                    original_qty_ordered,
                                    qty_ordered),
               date_received = as_date(date_received),
               date_received = ifelse(is.na(date_received),
                                      ymd("2099-12-31"),
                                      as_date(date_received)),
               date_received = as_date(date_received)) %>%
        group_by(purchase_orders_id) %>%
        nest() %>%
        mutate(on_time = map(data, (function(df) df$date_received <= as_date(min(df$date_received)) + 1)),
               no_items_received = map(data, (function(df)df$date_received == ymd("2099-12-31") &
                                                      as_date(min(df$date_received)) == ymd("2099-12-31")))) %>%
        unnest() %>%
        mutate(qty_received_on_time = ifelse(on_time == T, qty_received, 0),
               month = month(date_received),
               year = year(date_received),
               week = week(date_received),
               on_time = as.character(on_time),
               no_items_received = as.character(no_items_received))