### A Pluto.jl notebook ### # v0.20.4 using Markdown using InteractiveUtils # ╔═╡ cba1228a-b95e-11ef-0e06-5df9120a08ad begin using Pkg Pkg.activate(".") end # ╔═╡ 0f44ab6d-8f68-495e-95b9-9168cdf22004 begin using SQLite using DataFrames using CairoMakie using Dates end # ╔═╡ 436f0b91-4cc8-4c22-b625-cfd4779e20ec db = SQLite.DB("../psboard_qaqc.db") # ╔═╡ 085176e5-c0f9-4cf2-8416-581a8d20c941 SQLite.tables(db) # ╔═╡ 363afd96-5b0d-4b09-b480-64a40ddce8cd qaqc_single_run_results = DBInterface.execute(db, "select * from qaqc_single_run_results") |> DataFrame # ╔═╡ 7a86a76d-7a69-4549-9998-36182e312ca7 num_premassproduction = filter(:psboard_id => <(100), qaqc_single_run_results).psboard_id |> unique |> length # ╔═╡ 0467fb45-6b97-4148-8343-0e4b06a7c2ec qaqc_runs = let df = DBInterface.execute(db, "select * from qaqc_runs") |> DataFrame transform!(df, :run_datetime => ByRow(passmissing(DateTime)) => :run_datetime) df end # ╔═╡ 4c30b33a-e15e-4b3c-a0f5-50184e7a711f qaqc_campaigns = let df = DBInterface.execute(db, "select * from qaqc_campaigns") |> DataFrame transform!( df, :start_date => ByRow(DateTime) => :start_date, :end_date => ByRow(DateTime) => :end_date, ) df end # ╔═╡ 560bbdc3-26a4-4fe9-8459-e5ecaad04082 qaqc_dispatch = let df = DBInterface.execute(db, "select * from qaqc_dispatch") |> DataFrame transform!(df, :qaqc_campaign_id => ByRow(x -> begin if x == 0 x + 1 else x end end) => :qaqc_campaign_id) df end # ╔═╡ 89d90098-0324-4bc0-8881-819cd8685f5c df_num_tested_boards = let df = leftjoin( select(qaqc_single_run_results, [:psboard_id, :runid]), qaqc_runs, on = :runid => :id, ) sort!(df, :runid) df = combine(groupby(df, :psboard_id), first) @info "" df nrow(df) filter(:psboard_id => <(100), df) df = combine( groupby(df, :campaign_id), :psboard_id => length ∘ unique => :num_tested_boards, ) df = leftjoin(df, qaqc_campaigns, on = :campaign_id => :id) df.num_total_tested = accumulate(+, df.num_tested_boards) disallowmissing!(df, :end_date) df end # ╔═╡ fa7565e0-2662-4f2c-8e1c-8f6158557d58 df_num_dispatched = let df = combine(groupby(qaqc_dispatch, :qaqc_campaign_id), nrow => :num_dispatched) transform!(df, :qaqc_campaign_id => ByRow(Float64) => :qaqc_campaign_id) # TODO: remove this later when dispatch table is updated push!(df, (qaqc_campaign_id = 7.5, num_dispatched = 11)) df.num_total_dispatched = accumulate(+, df.num_dispatched) df = leftjoin(df, qaqc_campaigns, on = :qaqc_campaign_id => :id) disallowmissing!(df, :end_date) df end # ╔═╡ 8a2ae739-0da0-49cc-9614-74ac7e133599 let fig = Figure(size = (600, 400)) ax = Axis(fig[1, 1], limits = (nothing, (0, 1600)), title = "PS board QAQC progress") n_campaings = nrow(df_num_dispatched) num_testeds = let v = df_num_tested_boards.num_total_tested |> copy hcat([0, v[1:(end - 1)]...], v) |> transpose |> (a -> reshape(a, 2 * n_campaings)) end num_testeds[2:end] .= num_testeds[2:end] .- num_premassproduction num_dispatched = let v = df_num_dispatched.num_total_dispatched |> copy hcat([0, v[1:(end - 1)]...], v) |> transpose |> (a -> reshape(a, 2 * n_campaings)) end start_end_dates = vcat( reshape(df_num_dispatched.start_date, (1, n_campaings)), reshape(df_num_dispatched.end_date, (1, n_campaings)), ) |> (a -> reshape(a, 16)) |> skipmissing |> collect @info "" num_testeds num_dispatched lines!(ax, start_end_dates, num_testeds, label = "tested") lines!(ax, start_end_dates, num_dispatched, label = "passed") middle_dates = let starts = df_num_dispatched.start_date @. (df_num_dispatched.end_date - starts) / 2 + starts end text!( ax, middle_dates, df_num_tested_boards.num_total_tested, text = ["1st", "2nd", "3rd", ("$(i)th" for i in 4:(n_campaings - 1))..., ""], align = (:center, :bottom), ) axislegend(position = :rb) hlines!(ax, 1480, color = Makie.wong_colors()[3]) save("qaqc_progress.svg", fig) fig end # ╔═╡ Cell order: # ╠═cba1228a-b95e-11ef-0e06-5df9120a08ad # ╠═0f44ab6d-8f68-495e-95b9-9168cdf22004 # ╠═436f0b91-4cc8-4c22-b625-cfd4779e20ec # ╠═085176e5-c0f9-4cf2-8416-581a8d20c941 # ╠═363afd96-5b0d-4b09-b480-64a40ddce8cd # ╠═7a86a76d-7a69-4549-9998-36182e312ca7 # ╠═0467fb45-6b97-4148-8343-0e4b06a7c2ec # ╠═4c30b33a-e15e-4b3c-a0f5-50184e7a711f # ╠═560bbdc3-26a4-4fe9-8459-e5ecaad04082 # ╠═89d90098-0324-4bc0-8881-819cd8685f5c # ╠═fa7565e0-2662-4f2c-8e1c-8f6158557d58 # ╠═8a2ae739-0da0-49cc-9614-74ac7e133599