Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 

Find everything you need to get certified on Fabric—skills challenges, live sessions, exam prep, role guidance, and more. Get started

Reply
Daniel_L
Frequent Visitor

Verifying a two step invoice approval process

Hello community,

 

How would you solve this case where we need to verify whether a two step invoice approval process is legitimate or not?

 

I have two tables containing information about given approvals in phase A and phase B, and want to see if the invoices have been approved in accordance with the regulation.

 

Rules:

  • If there is one A approver and one B approver, they cannot be the same person
  • If there is one A approver then A is allowed to be one of many B approvers
  • If there are more than one A approver then none of them can be a B approver
  • If there are more than one A approver and more than one B approver, then at least one B approver must not be a A approver.

 

An alternate way of declaring the rules: Remove all B approvers from the A approvers set; if there are any remaining approvers then the process is legitimate.

 

 

Sample tables:

 

Phase A

InvoiceID_A

UserID_A

A

John

A

Sarah

A

Brad

B

Brad

C

Brad

D

Jane

D

Sarah

E

Jane

 

Phase B

InvoiceID_B

UserID_B

A

Sarah

B

John

B

Sarah

C

Sarah

C

Brad

D

John

D

Sarah

D

Brad

D

Jane

E

Jane

 

Expected Result

InvoiceID

(Result_UserIDs)

Result

A

(null)

False

B

John, Sarah

True

C

Sarah

True

D

John, Brad

True

E

(null)

False

 

Best Regards,

Daniel

1 ACCEPTED SOLUTION
sturlaws
Resident Rockstar
Resident Rockstar

Hi @Daniel_L 

Will this strategy work for you?


First create a new table with the distinct InvoiceIDs like this

InvoiceID =
DISTINCT (
    UNION ( VALUES ( 'Phase A'[InvoiceID_A] ); VALUES ( 'Phase B'[InvoiceID_B] ) )
)

Then create a new calculated column using this code

Number of =
VAR phaseA_approvers =
    CALCULATETABLE (
        VALUES ( 'Phase A'[UserID_A] );
        FILTER ( VALUES ( 'Phase A' ); 'Phase A'[InvoiceID_A] = InvoiceID[InvoiceID] )
    )
VAR phaseB_approvers =
    CALCULATETABLE (
        VALUES ( 'Phase B'[UserID_B] );
        FILTER ( VALUES ( 'Phase B' ); 'Phase B'[InvoiceID_B] = InvoiceID[InvoiceID] )
    )
VAR phaseB_approvers_not_approvers_phaseA =
    FILTER ( phaseB_approvers; NOT ( [UserID_B] IN phaseA_approvers ) )
RETURN
    IF (
        COUNTROWS ( phaseB_approvers_not_approvers_phaseA ) > 0;
        TRUE ();
        FALSE ()
    )

Cheers,
Sturla


If this post helps, then please consider Accepting it as the solution. Kudos are nice too.

View solution in original post

1 REPLY 1
sturlaws
Resident Rockstar
Resident Rockstar

Hi @Daniel_L 

Will this strategy work for you?


First create a new table with the distinct InvoiceIDs like this

InvoiceID =
DISTINCT (
    UNION ( VALUES ( 'Phase A'[InvoiceID_A] ); VALUES ( 'Phase B'[InvoiceID_B] ) )
)

Then create a new calculated column using this code

Number of =
VAR phaseA_approvers =
    CALCULATETABLE (
        VALUES ( 'Phase A'[UserID_A] );
        FILTER ( VALUES ( 'Phase A' ); 'Phase A'[InvoiceID_A] = InvoiceID[InvoiceID] )
    )
VAR phaseB_approvers =
    CALCULATETABLE (
        VALUES ( 'Phase B'[UserID_B] );
        FILTER ( VALUES ( 'Phase B' ); 'Phase B'[InvoiceID_B] = InvoiceID[InvoiceID] )
    )
VAR phaseB_approvers_not_approvers_phaseA =
    FILTER ( phaseB_approvers; NOT ( [UserID_B] IN phaseA_approvers ) )
RETURN
    IF (
        COUNTROWS ( phaseB_approvers_not_approvers_phaseA ) > 0;
        TRUE ();
        FALSE ()
    )

Cheers,
Sturla


If this post helps, then please consider Accepting it as the solution. Kudos are nice too.

Helpful resources

Announcements
Sept PBI Carousel

Power BI Monthly Update - September 2024

Check out the September 2024 Power BI update to learn about new features.

September Hackathon Carousel

Microsoft Fabric & AI Learning Hackathon

Learn from experts, get hands-on experience, and win awesome prizes.

Sept NL Carousel

Fabric Community Update - September 2024

Find out what's new and trending in the Fabric Community.