diff --git a/.github/workflows/dev-client-deploy.yaml b/.github/workflows/dev-client-deploy.yaml index 80d2959d5..77ade10cd 100644 --- a/.github/workflows/dev-client-deploy.yaml +++ b/.github/workflows/dev-client-deploy.yaml @@ -13,11 +13,100 @@ concurrency: cancel-in-progress: true jobs: + cache_images: + name: cache base images + runs-on: ubuntu-latest + permissions: + packages: read + steps: + - name: login to ghcr + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: restore image cache + id: cache + uses: actions/cache@v4 + with: + path: ~/image-cache + key: base-images-v1 + - name: pull and retag images + if: steps.cache.outputs.cache-hit != 'true' + run: | + mkdir -p ~/image-cache + docker pull ghcr.io/systemaccounting/rust:latest + docker tag ghcr.io/systemaccounting/rust:latest public.ecr.aws/docker/library/rust:latest + docker pull ghcr.io/systemaccounting/lambda-provided:al2023 + docker tag ghcr.io/systemaccounting/lambda-provided:al2023 public.ecr.aws/lambda/provided:al2023 + docker pull ghcr.io/systemaccounting/postgresql:15 + docker tag ghcr.io/systemaccounting/postgresql:15 public.ecr.aws/bitnami/postgresql:15 + docker pull ghcr.io/systemaccounting/redis:latest + docker tag ghcr.io/systemaccounting/redis:latest public.ecr.aws/bitnami/redis:latest + docker pull ghcr.io/systemaccounting/alpine:latest + docker tag ghcr.io/systemaccounting/alpine:latest public.ecr.aws/docker/library/alpine:latest + docker pull ghcr.io/systemaccounting/node:lts-alpine + docker tag ghcr.io/systemaccounting/node:lts-alpine public.ecr.aws/docker/library/node:lts-alpine + docker save -o ~/image-cache/images.tar \ + public.ecr.aws/docker/library/rust:latest \ + public.ecr.aws/lambda/provided:al2023 \ + public.ecr.aws/bitnami/postgresql:15 \ + public.ecr.aws/bitnami/redis:latest \ + public.ecr.aws/docker/library/alpine:latest \ + public.ecr.aws/docker/library/node:lts-alpine + compile: + name: compile ${{ matrix.service }} + runs-on: ubuntu-latest + strategy: + matrix: + service: + - graphql + - request-create + - request-approve + - rule + - request-by-id + - requests-by-account + - transaction-by-id + - transactions-by-account + - balance-by-account + steps: + - uses: actions/checkout@v4 + - uses: dtolnay/rust-toolchain@master + with: + toolchain: stable + - uses: Swatinem/rust-cache@v2 + with: + shared-key: ${{ matrix.service }} + - name: compile + run: cargo build -p ${{ matrix.service }} + - name: upload binary + uses: actions/upload-artifact@v4 + with: + name: ${{ matrix.service }} + path: target/debug/${{ matrix.service }} + retention-days: 1 test: name: test client + needs: [cache_images, compile] runs-on: ubuntu-latest + env: + SKIP_CARGO_WATCH: true steps: - uses: actions/checkout@v4 + - name: restore image cache + uses: actions/cache@v4 + with: + path: ~/image-cache + key: base-images-v1 + - name: load cached images + run: docker load -i ~/image-cache/images.tar + - name: download all binaries + uses: actions/download-artifact@v4 + with: + path: target/debug/ + merge-multiple: true + - name: set permissions + run: chmod +x target/debug/* - name: start services run: make start # todo: unit tests @@ -57,4 +146,4 @@ jobs: - uses: actions/checkout@v4 - name: deploy to dev cloud environment # deploy newly tagged image to dev cloud - run: bash scripts/deploy-last-image.sh --app-name $APP_DIR --env dev --env-id ${{ secrets.DEV_ENV_ID }} \ No newline at end of file + run: bash scripts/deploy-last-image.sh --app-name $APP_DIR --env dev --env-id ${{ secrets.DEV_ENV_ID }} diff --git a/.github/workflows/local-integration.yaml b/.github/workflows/local-integration.yaml index cf6b4ffab..863d8f4d3 100644 --- a/.github/workflows/local-integration.yaml +++ b/.github/workflows/local-integration.yaml @@ -51,7 +51,7 @@ jobs: needs: compile runs-on: ubuntu-latest env: - SERVICES_WORKFLOW: true + SKIP_CARGO_WATCH: true steps: - uses: actions/checkout@v4 - name: download all binaries diff --git a/.github/workflows/services.yaml b/.github/workflows/services.yaml index 4920d83da..fefdccf95 100644 --- a/.github/workflows/services.yaml +++ b/.github/workflows/services.yaml @@ -152,7 +152,7 @@ jobs: needs: [cache_images, compile] runs-on: ubuntu-latest env: - SERVICES_WORKFLOW: true + SKIP_CARGO_WATCH: true steps: - uses: actions/checkout@v4 - name: restore image cache @@ -181,7 +181,7 @@ jobs: needs: [cache_images, compile] runs-on: ubuntu-latest env: - SERVICES_WORKFLOW: true + SKIP_CARGO_WATCH: true steps: - uses: actions/checkout@v4 - name: restore image cache diff --git a/Cargo.lock b/Cargo.lock index fd8abf6a1..9d6e845f4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3665,6 +3665,7 @@ dependencies = [ "openssl", "pg", "redisclient", + "serde_json", "service", "shutdown", "thiserror 2.0.17", diff --git a/README.md b/README.md index fe46a0ae4..914d372fe 100644 --- a/README.md +++ b/README.md @@ -636,11 +636,13 @@ client (typescript, svelte, cloudfront/s3: demo web client targeting graphql) ├── request-by-id (rust, lambda: returns a transaction request by id) │ └── postgres ├── request-create (rust, lambda: creates a transaction request between a buyer and seller) - │ └── postgres + │ ├── rule + │ ├── postgres + │ └── cache (dynamodb/redis) ├── requests-by-account (rust, lambda: returns transaction requests by account) │ └── postgres ├── rule (rust, lambda: returns transactions with user defined rules applied, e.g. taxes, dividends, etc.) - │ └── postgres + │ └── cache (dynamodb/redis) ├── transaction-by-id (rust, lambda: returns a transaction by id) │ └── postgres └── transactions-by-account (rust, lambda: returns transactions by account) diff --git a/client/src/app.d.ts b/client/src/app.d.ts index 0f79cec8f..6317d7435 100644 --- a/client/src/app.d.ts +++ b/client/src/app.d.ts @@ -14,7 +14,6 @@ declare global { item_id: string; price: string; quantity: string; - debitor_first: boolean; rule_instance_id: string; rule_exec_ids: string[]; unit_of_measurement: string; @@ -40,6 +39,7 @@ declare global { author_role: string; equilibrium_time: string; sum_value: string; + debitor_first?: boolean; transaction_items: ITransactionItem[]; } diff --git a/client/src/data/initial.json b/client/src/data/initial.json index b0085bc6d..94eab5b55 100755 --- a/client/src/data/initial.json +++ b/client/src/data/initial.json @@ -5,7 +5,6 @@ "item_id": null, "price": null, "quantity": null, - "debitor_first": false, "rule_instance_id": null, "unit_of_measurement": null, "units_measured": null, diff --git a/client/src/graphql/mutation/createRequest.ts b/client/src/graphql/mutation/createRequest.ts index c7903a5ec..838cbcbf5 100755 --- a/client/src/graphql/mutation/createRequest.ts +++ b/client/src/graphql/mutation/createRequest.ts @@ -1,8 +1,8 @@ import { gql } from "@urql/core"; const CREATE_REQUEST_MUTATION = gql` - mutation createRequest($transaction_items: [TransactionItemInput!], $auth_account: String!) { - createRequest(transaction_items: $transaction_items, auth_account: $auth_account) { + mutation createRequest($transaction: TransactionInput!, $auth_account: String!) { + createRequest(transaction: $transaction, auth_account: $auth_account) { id } } diff --git a/client/src/graphql/query/requestByID.ts b/client/src/graphql/query/requestByID.ts index 9ae5bc588..4616a89b3 100644 --- a/client/src/graphql/query/requestByID.ts +++ b/client/src/graphql/query/requestByID.ts @@ -10,13 +10,13 @@ const REQUEST_BY_ID_QUERY = gql` author_device_latlng author_role sum_value + debitor_first transaction_items { id transaction_id item_id price quantity - debitor_first rule_exec_ids rule_instance_id unit_of_measurement diff --git a/client/src/graphql/query/requestsByAccount.ts b/client/src/graphql/query/requestsByAccount.ts index f18723abb..d672ed4b9 100755 --- a/client/src/graphql/query/requestsByAccount.ts +++ b/client/src/graphql/query/requestsByAccount.ts @@ -13,13 +13,13 @@ const REQUESTS_BY_ACCOUNT_QUERY = gql` author_device_latlng author_role sum_value + debitor_first transaction_items { id transaction_id item_id price quantity - debitor_first rule_instance_id unit_of_measurement units_measured diff --git a/client/src/graphql/query/rules.ts b/client/src/graphql/query/rules.ts index 8b82ba665..2cc8f6f1e 100755 --- a/client/src/graphql/query/rules.ts +++ b/client/src/graphql/query/rules.ts @@ -1,8 +1,8 @@ import { gql } from "@urql/core"; const RULES_QUERY = gql` - query getRules($transaction_items: [TransactionItemInput!]) { - rules(transaction_items: $transaction_items) { + query getRules($transaction: TransactionInput!) { + rules(transaction: $transaction) { id rule_instance_id author @@ -10,13 +10,13 @@ const RULES_QUERY = gql` author_device_latlng author_role sum_value + debitor_first transaction_items { id transaction_id item_id price quantity - debitor_first rule_instance_id unit_of_measurement units_measured diff --git a/client/src/graphql/query/transactionByID.ts b/client/src/graphql/query/transactionByID.ts index 82563aa56..b1cfe0db9 100644 --- a/client/src/graphql/query/transactionByID.ts +++ b/client/src/graphql/query/transactionByID.ts @@ -10,13 +10,13 @@ const TRANSACTION_BY_ID_QUERY = gql` author_device_latlng author_role sum_value + debitor_first transaction_items { id transaction_id item_id price quantity - debitor_first rule_exec_ids rule_instance_id unit_of_measurement diff --git a/client/src/graphql/query/transactionsByAccount.ts b/client/src/graphql/query/transactionsByAccount.ts index 57141b6bf..515ba412c 100755 --- a/client/src/graphql/query/transactionsByAccount.ts +++ b/client/src/graphql/query/transactionsByAccount.ts @@ -10,6 +10,7 @@ const TRANSACTIONS_BY_ACCOUNT_QUERY = gql` author_device_latlng author_role sum_value + debitor_first equilibrium_time transaction_items { id @@ -17,7 +18,6 @@ const TRANSACTIONS_BY_ACCOUNT_QUERY = gql` item_id price quantity - debitor_first rule_instance_id unit_of_measurement units_measured diff --git a/client/src/routes/account/+page.svelte b/client/src/routes/account/+page.svelte index f4aec4fca..526373a4b 100644 --- a/client/src/routes/account/+page.svelte +++ b/client/src/routes/account/+page.svelte @@ -82,7 +82,13 @@ async function getRuleItems(userAdded: App.ITransactionItem[]) { previouslySubmitted = JSON.stringify(userAdded); - const res = await client.query(RULES_QUERY, { transaction_items: userAdded }).toPromise(); + const transaction = { + author: account, + author_role: isCredit ? 'creditor' : 'debitor', + sum_value: sum(userAdded), + transaction_items: userAdded + }; + const res = await client.query(RULES_QUERY, { transaction }).toPromise(); if (!res.data || !res.data.rules) { addRuleItems([]); } else { @@ -135,7 +141,12 @@ client .mutation(CREATE_REQUEST_MUTATION, { auth_account: account, - transaction_items: reqItems + transaction: { + author: account, + author_role: isCredit ? 'creditor' : 'debitor', + sum_value: sumValue, + transaction_items: reqItems + } }) .toPromise() .then((result) => { diff --git a/crates/pg/src/model.rs b/crates/pg/src/model.rs index f495a219b..6f187dbf3 100644 --- a/crates/pg/src/model.rs +++ b/crates/pg/src/model.rs @@ -471,6 +471,7 @@ impl ModelTrait for DatabaseConnection { transaction_author_device_latlng, // author_device_latlng transaction.author_role, // author_role transaction_equilibrium_time, // equilibrium_time + transaction.debitor_first, // debitor_first transaction_sum_value, // sum_value transaction_created_at, // created_at ]; @@ -490,8 +491,6 @@ impl ModelTrait for DatabaseConnection { let tr_item_quantity = parse_pg_numeric(Some(tr_item.quantity)).unwrap(); values.push_param(tr_item_quantity); // quantity - values.push_param(tr_item.debitor_first); // debitor_first - let tr_item_rule_instance_id = parse_pg_int4(tr_item.rule_instance_id).unwrap(); values.push_param(tr_item_rule_instance_id); // rule_instance_id diff --git a/crates/pg/src/sqls/transaction.rs b/crates/pg/src/sqls/transaction.rs index 08423e956..0ee29424c 100644 --- a/crates/pg/src/sqls/transaction.rs +++ b/crates/pg/src/sqls/transaction.rs @@ -54,6 +54,7 @@ impl TransactionTable { .cast_value_as(Type::POINT), self.get_column("author_role"), self.get_column("equilibrium_time"), + self.get_column("debitor_first"), self.get_column("sum_value").cast_value_as(Type::NUMERIC), ]) } @@ -70,6 +71,7 @@ impl TransactionTable { .cast_value_as(Type::POINT), self.get_column("author_role"), self.get_column("equilibrium_time"), + self.get_column("debitor_first"), self.get_column("sum_value").cast_value_as(Type::NUMERIC), self.get_column("created_at"), ]) @@ -86,6 +88,7 @@ impl TransactionTable { .cast_column_as(Type::TEXT), self.get_column("author_role"), self.get_column("equilibrium_time"), + self.get_column("debitor_first"), self.get_column("sum_value").cast_column_as(Type::TEXT), ]) } @@ -223,6 +226,7 @@ impl TransactionTable { NULL, -- author_device_latlng 'creditor', -- author_role NULL, -- equilibrium_time + false, -- debitor_first 1.000, -- sum_value NULL -- created_at ), @@ -234,7 +238,6 @@ impl TransactionTable { 'bread', -- item_id 1.000, -- price 1, -- quantity - true, -- debitor_first NULL, -- rule_instance_id NULL, -- rule_exec_ids NULL, -- unit_of_measurement @@ -390,7 +393,7 @@ mod tests { let test_row = test_table.pg_row(test_columns, None, &mut 1); assert_eq!( test_row, - "ROW($1, $2, $3, $4, $5::point, $6, $7, $8::numeric, $9)" + "ROW($1, $2, $3, $4, $5::point, $6, $7, $8, $9::numeric, $10)" ) } @@ -421,7 +424,7 @@ mod tests { let test_row = test_table.pg_row(test_columns, None, &mut 1); assert_eq!( test_row, - "ROW($1, $2, $3, $4, $5::point, $6, $7, $8::numeric, $9)" + "ROW($1, $2, $3, $4, $5::point, $6, $7, $8, $9::numeric, $10)" ) } @@ -432,7 +435,7 @@ mod tests { let test_array = test_table.pg_row_array(test_columns, 2, "test", &mut 1); assert_eq!( test_array, - "ARRAY [ROW($1, $2, $3, $4, $5::point, $6, $7, $8::numeric, $9), ROW($10, $11, $12, $13, $14::point, $15, $16, $17::numeric, $18)]::test[]" + "ARRAY [ROW($1, $2, $3, $4, $5::point, $6, $7, $8, $9::numeric, $10), ROW($11, $12, $13, $14, $15::point, $16, $17, $18, $19::numeric, $20)]::test[]" ) } @@ -442,7 +445,7 @@ mod tests { let test_row = test_table.entire_transaction_item_row(2, &mut 1); assert_eq!( test_row, - r#"ROW(ROW($1, $2, $3, $4::numeric, $5::numeric, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20), ARRAY [ROW($21, $22, $23, $24, $25, $26, $27, $28::point, $29, $30, $31), ROW($32, $33, $34, $35, $36, $37, $38, $39::point, $40, $41, $42)]::approval[])"# + r#"ROW(ROW($1, $2, $3, $4::numeric, $5::numeric, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19), ARRAY [ROW($20, $21, $22, $23, $24, $25, $26, $27::point, $28, $29, $30), ROW($31, $32, $33, $34, $35, $36, $37, $38::point, $39, $40, $41)]::approval[])"# ) } @@ -450,7 +453,7 @@ mod tests { fn it_creates_an_entire_transaction_item_array() { assert_eq!( TransactionTable::new().entire_transaction_item_array(vec![2, 2], &mut 1), - r#"ARRAY [ROW(ROW($1, $2, $3, $4::numeric, $5::numeric, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20), ARRAY [ROW($21, $22, $23, $24, $25, $26, $27, $28::point, $29, $30, $31), ROW($32, $33, $34, $35, $36, $37, $38, $39::point, $40, $41, $42)]::approval[]), ROW(ROW($43, $44, $45, $46::numeric, $47::numeric, $48, $49, $50, $51, $52, $53, $54, $55, $56, $57, $58, $59, $60, $61, $62), ARRAY [ROW($63, $64, $65, $66, $67, $68, $69, $70::point, $71, $72, $73), ROW($74, $75, $76, $77, $78, $79, $80, $81::point, $82, $83, $84)]::approval[])]::entire_transaction_item[]"# + r#"ARRAY [ROW(ROW($1, $2, $3, $4::numeric, $5::numeric, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19), ARRAY [ROW($20, $21, $22, $23, $24, $25, $26, $27::point, $28, $29, $30), ROW($31, $32, $33, $34, $35, $36, $37, $38::point, $39, $40, $41)]::approval[]), ROW(ROW($42, $43, $44, $45::numeric, $46::numeric, $47, $48, $49, $50, $51, $52, $53, $54, $55, $56, $57, $58, $59, $60), ARRAY [ROW($61, $62, $63, $64, $65, $66, $67, $68::point, $69, $70, $71), ROW($72, $73, $74, $75, $76, $77, $78, $79::point, $80, $81, $82)]::approval[])]::entire_transaction_item[]"# ) } @@ -458,13 +461,13 @@ mod tests { fn it_creates_an_entire_transaction_row() { assert_eq!( TransactionTable::new().entire_transaction_row(vec![2, 2], &mut 1), - r#"ROW(ROW($1, $2, $3, $4, $5::point, $6, $7, $8::numeric, $9), ARRAY [ROW(ROW($10, $11, $12, $13::numeric, $14::numeric, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29), ARRAY [ROW($30, $31, $32, $33, $34, $35, $36, $37::point, $38, $39, $40), ROW($41, $42, $43, $44, $45, $46, $47, $48::point, $49, $50, $51)]::approval[]), ROW(ROW($52, $53, $54, $55::numeric, $56::numeric, $57, $58, $59, $60, $61, $62, $63, $64, $65, $66, $67, $68, $69, $70, $71), ARRAY [ROW($72, $73, $74, $75, $76, $77, $78, $79::point, $80, $81, $82), ROW($83, $84, $85, $86, $87, $88, $89, $90::point, $91, $92, $93)]::approval[])]::entire_transaction_item[])::entire_transaction"# + r#"ROW(ROW($1, $2, $3, $4, $5::point, $6, $7, $8, $9::numeric, $10), ARRAY [ROW(ROW($11, $12, $13, $14::numeric, $15::numeric, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29), ARRAY [ROW($30, $31, $32, $33, $34, $35, $36, $37::point, $38, $39, $40), ROW($41, $42, $43, $44, $45, $46, $47, $48::point, $49, $50, $51)]::approval[]), ROW(ROW($52, $53, $54, $55::numeric, $56::numeric, $57, $58, $59, $60, $61, $62, $63, $64, $65, $66, $67, $68, $69, $70), ARRAY [ROW($71, $72, $73, $74, $75, $76, $77, $78::point, $79, $80, $81), ROW($82, $83, $84, $85, $86, $87, $88, $89::point, $90, $91, $92)]::approval[])]::entire_transaction_item[])::entire_transaction"# ) } #[test] fn it_creates_a_select_transaction_by_id_sql() { - let expected = "SELECT id::text, rule_instance_id::text, author, author_device_id, author_device_latlng::text, author_role, equilibrium_time, sum_value::text FROM transaction WHERE id = $1"; + let expected = "SELECT id::text, rule_instance_id::text, author, author_device_id, author_device_latlng::text, author_role, equilibrium_time, debitor_first, sum_value::text FROM transaction WHERE id = $1"; assert_eq!( TransactionTable::new().select_transaction_by_id_sql(), expected @@ -473,7 +476,7 @@ mod tests { #[test] fn it_creates_a_select_transactions_by_ids_sql() { - let expected = "SELECT id::text, rule_instance_id::text, author, author_device_id, author_device_latlng::text, author_role, equilibrium_time, sum_value::text FROM transaction WHERE id IN ($1, $2, $3)"; + let expected = "SELECT id::text, rule_instance_id::text, author, author_device_id, author_device_latlng::text, author_role, equilibrium_time, debitor_first, sum_value::text FROM transaction WHERE id IN ($1, $2, $3)"; assert_eq!( TransactionTable::new().select_transactions_by_ids_sql(3), expected @@ -505,7 +508,7 @@ mod tests { ORDER BY transaction_id DESC ) - SELECT id::text, rule_instance_id::text, author, author_device_id, author_device_latlng::text, author_role, equilibrium_time, sum_value::text FROM transaction + SELECT id::text, rule_instance_id::text, author, author_device_id, author_device_latlng::text, author_role, equilibrium_time, debitor_first, sum_value::text FROM transaction WHERE id IN ( SELECT transaction_id FROM transactions diff --git a/crates/pg/src/sqls/transaction_item.rs b/crates/pg/src/sqls/transaction_item.rs index dec62b946..e9840528a 100644 --- a/crates/pg/src/sqls/transaction_item.rs +++ b/crates/pg/src/sqls/transaction_item.rs @@ -40,7 +40,6 @@ impl TransactionItemTable { self.get_column("item_id"), self.get_column("price").cast_value_as(Type::NUMERIC), self.get_column("quantity").cast_value_as(Type::NUMERIC), - self.get_column("debitor_first"), self.get_column("rule_instance_id"), self.get_column("rule_exec_ids"), self.get_column("unit_of_measurement"), @@ -64,7 +63,6 @@ impl TransactionItemTable { self.get_column("item_id"), self.get_column("price").cast_value_as(Type::NUMERIC), self.get_column("quantity").cast_value_as(Type::NUMERIC), - self.get_column("debitor_first"), self.get_column("rule_instance_id"), self.get_column("rule_exec_ids"), self.get_column("unit_of_measurement"), @@ -89,7 +87,6 @@ impl TransactionItemTable { self.get_column("item_id"), self.get_column("price").cast_column_as(Type::TEXT), self.get_column("quantity").cast_column_as(Type::TEXT), - self.get_column("debitor_first"), self.get_column("rule_instance_id") .cast_column_as(Type::TEXT), self.get_column("rule_exec_ids"), @@ -206,7 +203,7 @@ mod tests { ); assert_eq!( sql, - "INSERT INTO transaction_item (transaction_id, item_id, price, quantity, debitor_first, rule_instance_id, rule_exec_ids, unit_of_measurement, units_measured, debitor, creditor, debitor_profile_id, creditor_profile_id, debitor_approval_time, creditor_approval_time, debitor_expiration_time, creditor_expiration_time) VALUES ((SELECT id FROM insert_transaction), $1, $2::numeric, $3::numeric, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16) RETURNING id" + "INSERT INTO transaction_item (transaction_id, item_id, price, quantity, rule_instance_id, rule_exec_ids, unit_of_measurement, units_measured, debitor, creditor, debitor_profile_id, creditor_profile_id, debitor_approval_time, creditor_approval_time, debitor_expiration_time, creditor_expiration_time) VALUES ((SELECT id FROM insert_transaction), $1, $2::numeric, $3::numeric, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15) RETURNING id" ); } @@ -216,7 +213,7 @@ mod tests { let sql = transaction_item_table.select_transaction_items_by_transaction_id_sql(); assert_eq!( sql, - "SELECT id::text, transaction_id::text, item_id, price::text, quantity::text, debitor_first, rule_instance_id::text, rule_exec_ids, unit_of_measurement, units_measured::text, debitor, creditor, debitor_profile_id::text, creditor_profile_id::text, debitor_approval_time, creditor_approval_time, debitor_rejection_time, creditor_rejection_time, debitor_expiration_time, creditor_expiration_time FROM transaction_item WHERE transaction_id = $1" + "SELECT id::text, transaction_id::text, item_id, price::text, quantity::text, rule_instance_id::text, rule_exec_ids, unit_of_measurement, units_measured::text, debitor, creditor, debitor_profile_id::text, creditor_profile_id::text, debitor_approval_time, creditor_approval_time, debitor_rejection_time, creditor_rejection_time, debitor_expiration_time, creditor_expiration_time FROM transaction_item WHERE transaction_id = $1" ); } @@ -226,7 +223,7 @@ mod tests { let sql = transaction_item_table.select_transaction_items_by_transaction_ids_sql(2); assert_eq!( sql, - "SELECT id::text, transaction_id::text, item_id, price::text, quantity::text, debitor_first, rule_instance_id::text, rule_exec_ids, unit_of_measurement, units_measured::text, debitor, creditor, debitor_profile_id::text, creditor_profile_id::text, debitor_approval_time, creditor_approval_time, debitor_rejection_time, creditor_rejection_time, debitor_expiration_time, creditor_expiration_time FROM transaction_item WHERE transaction_id IN ($1, $2)" + "SELECT id::text, transaction_id::text, item_id, price::text, quantity::text, rule_instance_id::text, rule_exec_ids, unit_of_measurement, units_measured::text, debitor, creditor, debitor_profile_id::text, creditor_profile_id::text, debitor_approval_time, creditor_approval_time, debitor_rejection_time, creditor_rejection_time, debitor_expiration_time, creditor_expiration_time FROM transaction_item WHERE transaction_id IN ($1, $2)" ); } } diff --git a/crates/pg/testdata/transaction_insert.golden b/crates/pg/testdata/transaction_insert.golden index a84c63e20..ad61ea982 100644 --- a/crates/pg/testdata/transaction_insert.golden +++ b/crates/pg/testdata/transaction_insert.golden @@ -1 +1 @@ -SELECT insert_transaction(ROW(ROW($1, $2, $3, $4, $5::point, $6, $7, $8::numeric, $9), ARRAY [ROW(ROW($10, $11, $12, $13::numeric, $14::numeric, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29), ARRAY [ROW($30, $31, $32, $33, $34, $35, $36, $37::point, $38, $39, $40), ROW($41, $42, $43, $44, $45, $46, $47, $48::point, $49, $50, $51), ROW($52, $53, $54, $55, $56, $57, $58, $59::point, $60, $61, $62), ROW($63, $64, $65, $66, $67, $68, $69, $70::point, $71, $72, $73)]::approval[]), ROW(ROW($74, $75, $76, $77::numeric, $78::numeric, $79, $80, $81, $82, $83, $84, $85, $86, $87, $88, $89, $90, $91, $92, $93), ARRAY [ROW($94, $95, $96, $97, $98, $99, $100, $101::point, $102, $103, $104), ROW($105, $106, $107, $108, $109, $110, $111, $112::point, $113, $114, $115), ROW($116, $117, $118, $119, $120, $121, $122, $123::point, $124, $125, $126), ROW($127, $128, $129, $130, $131, $132, $133, $134::point, $135, $136, $137)]::approval[]), ROW(ROW($138, $139, $140, $141::numeric, $142::numeric, $143, $144, $145, $146, $147, $148, $149, $150, $151, $152, $153, $154, $155, $156, $157), ARRAY [ROW($158, $159, $160, $161, $162, $163, $164, $165::point, $166, $167, $168), ROW($169, $170, $171, $172, $173, $174, $175, $176::point, $177, $178, $179), ROW($180, $181, $182, $183, $184, $185, $186, $187::point, $188, $189, $190), ROW($191, $192, $193, $194, $195, $196, $197, $198::point, $199, $200, $201)]::approval[]), ROW(ROW($202, $203, $204, $205::numeric, $206::numeric, $207, $208, $209, $210, $211, $212, $213, $214, $215, $216, $217, $218, $219, $220, $221), ARRAY [ROW($222, $223, $224, $225, $226, $227, $228, $229::point, $230, $231, $232), ROW($233, $234, $235, $236, $237, $238, $239, $240::point, $241, $242, $243), ROW($244, $245, $246, $247, $248, $249, $250, $251::point, $252, $253, $254)]::approval[]), ROW(ROW($255, $256, $257, $258::numeric, $259::numeric, $260, $261, $262, $263, $264, $265, $266, $267, $268, $269, $270, $271, $272, $273, $274), ARRAY [ROW($275, $276, $277, $278, $279, $280, $281, $282::point, $283, $284, $285), ROW($286, $287, $288, $289, $290, $291, $292, $293::point, $294, $295, $296), ROW($297, $298, $299, $300, $301, $302, $303, $304::point, $305, $306, $307)]::approval[]), ROW(ROW($308, $309, $310, $311::numeric, $312::numeric, $313, $314, $315, $316, $317, $318, $319, $320, $321, $322, $323, $324, $325, $326, $327), ARRAY [ROW($328, $329, $330, $331, $332, $333, $334, $335::point, $336, $337, $338), ROW($339, $340, $341, $342, $343, $344, $345, $346::point, $347, $348, $349), ROW($350, $351, $352, $353, $354, $355, $356, $357::point, $358, $359, $360)]::approval[])]::entire_transaction_item[])::entire_transaction) \ No newline at end of file +SELECT insert_transaction(ROW(ROW($1, $2, $3, $4, $5::point, $6, $7, $8, $9::numeric, $10), ARRAY [ROW(ROW($11, $12, $13, $14::numeric, $15::numeric, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29), ARRAY [ROW($30, $31, $32, $33, $34, $35, $36, $37::point, $38, $39, $40), ROW($41, $42, $43, $44, $45, $46, $47, $48::point, $49, $50, $51), ROW($52, $53, $54, $55, $56, $57, $58, $59::point, $60, $61, $62), ROW($63, $64, $65, $66, $67, $68, $69, $70::point, $71, $72, $73)]::approval[]), ROW(ROW($74, $75, $76, $77::numeric, $78::numeric, $79, $80, $81, $82, $83, $84, $85, $86, $87, $88, $89, $90, $91, $92), ARRAY [ROW($93, $94, $95, $96, $97, $98, $99, $100::point, $101, $102, $103), ROW($104, $105, $106, $107, $108, $109, $110, $111::point, $112, $113, $114), ROW($115, $116, $117, $118, $119, $120, $121, $122::point, $123, $124, $125), ROW($126, $127, $128, $129, $130, $131, $132, $133::point, $134, $135, $136)]::approval[]), ROW(ROW($137, $138, $139, $140::numeric, $141::numeric, $142, $143, $144, $145, $146, $147, $148, $149, $150, $151, $152, $153, $154, $155), ARRAY [ROW($156, $157, $158, $159, $160, $161, $162, $163::point, $164, $165, $166), ROW($167, $168, $169, $170, $171, $172, $173, $174::point, $175, $176, $177), ROW($178, $179, $180, $181, $182, $183, $184, $185::point, $186, $187, $188), ROW($189, $190, $191, $192, $193, $194, $195, $196::point, $197, $198, $199)]::approval[]), ROW(ROW($200, $201, $202, $203::numeric, $204::numeric, $205, $206, $207, $208, $209, $210, $211, $212, $213, $214, $215, $216, $217, $218), ARRAY [ROW($219, $220, $221, $222, $223, $224, $225, $226::point, $227, $228, $229), ROW($230, $231, $232, $233, $234, $235, $236, $237::point, $238, $239, $240), ROW($241, $242, $243, $244, $245, $246, $247, $248::point, $249, $250, $251)]::approval[]), ROW(ROW($252, $253, $254, $255::numeric, $256::numeric, $257, $258, $259, $260, $261, $262, $263, $264, $265, $266, $267, $268, $269, $270), ARRAY [ROW($271, $272, $273, $274, $275, $276, $277, $278::point, $279, $280, $281), ROW($282, $283, $284, $285, $286, $287, $288, $289::point, $290, $291, $292), ROW($293, $294, $295, $296, $297, $298, $299, $300::point, $301, $302, $303)]::approval[]), ROW(ROW($304, $305, $306, $307::numeric, $308::numeric, $309, $310, $311, $312, $313, $314, $315, $316, $317, $318, $319, $320, $321, $322), ARRAY [ROW($323, $324, $325, $326, $327, $328, $329, $330::point, $331, $332, $333), ROW($334, $335, $336, $337, $338, $339, $340, $341::point, $342, $343, $344), ROW($345, $346, $347, $348, $349, $350, $351, $352::point, $353, $354, $355)]::approval[])]::entire_transaction_item[])::entire_transaction) diff --git a/crates/service/src/lib.rs b/crates/service/src/lib.rs index ecc3c4944..bad6616f1 100644 --- a/crates/service/src/lib.rs +++ b/crates/service/src/lib.rs @@ -1548,6 +1548,7 @@ mod tests { author_device_latlng: None, author_role: Some(AccountRole::Creditor), equilibrium_time: None, + debitor_first: Some(false), sum_value: String::from("21.800"), transaction_items: TransactionItems(vec![ TransactionItem { @@ -1556,7 +1557,6 @@ mod tests { item_id: String::from("bread"), price: String::from("3.000"), quantity: String::from("2"), - debitor_first: Some(false), rule_instance_id: None, rule_exec_ids: Some(vec![]), unit_of_measurement: None, @@ -1606,7 +1606,6 @@ mod tests { item_id: String::from("milk"), price: String::from("4.000"), quantity: String::from("3"), - debitor_first: Some(false), rule_instance_id: None, rule_exec_ids: Some(vec![]), unit_of_measurement: None, @@ -1660,6 +1659,7 @@ mod tests { author_device_latlng: None, author_role: Some(AccountRole::Creditor), equilibrium_time: None, + debitor_first: Some(false), sum_value: String::from("21.800"), transaction_items: TransactionItems(vec![ TransactionItem { @@ -1668,7 +1668,6 @@ mod tests { item_id: String::from("bread"), price: String::from("3.000"), quantity: String::from("2"), - debitor_first: Some(false), rule_instance_id: None, rule_exec_ids: Some(vec![]), unit_of_measurement: None, @@ -1718,7 +1717,6 @@ mod tests { item_id: String::from("milk"), price: String::from("4.000"), quantity: String::from("3"), - debitor_first: Some(false), rule_instance_id: None, rule_exec_ids: Some(vec![]), unit_of_measurement: None, @@ -1833,6 +1831,7 @@ mod tests { author_device_latlng: None, author_role: Some(AccountRole::Creditor), equilibrium_time: None, + debitor_first: Some(false), sum_value: String::from("21.800"), transaction_items: TransactionItems(vec![ TransactionItem { @@ -1841,7 +1840,6 @@ mod tests { item_id: String::from("bread"), price: String::from("3.000"), quantity: String::from("2"), - debitor_first: Some(false), rule_instance_id: None, rule_exec_ids: Some(vec![]), unit_of_measurement: None, @@ -1891,7 +1889,6 @@ mod tests { item_id: String::from("milk"), price: String::from("4.000"), quantity: String::from("3"), - debitor_first: Some(false), rule_instance_id: None, rule_exec_ids: Some(vec![]), unit_of_measurement: None, @@ -1947,7 +1944,6 @@ mod tests { item_id: String::from("bread"), price: String::from("3.000"), quantity: String::from("2"), - debitor_first: Some(false), rule_instance_id: None, rule_exec_ids: Some(vec![]), unit_of_measurement: None, @@ -1997,7 +1993,6 @@ mod tests { item_id: String::from("milk"), price: String::from("4.000"), quantity: String::from("3"), - debitor_first: Some(false), rule_instance_id: None, rule_exec_ids: Some(vec![]), unit_of_measurement: None, diff --git a/crates/types/src/transaction.rs b/crates/types/src/transaction.rs index 8661c4a43..6345d5016 100644 --- a/crates/types/src/transaction.rs +++ b/crates/types/src/transaction.rs @@ -4,7 +4,7 @@ use crate::{ time::TZTime, transaction_item::{TransactionItem, TransactionItemError, TransactionItems}, }; -use async_graphql::{ComplexObject, Object, SimpleObject}; +use async_graphql::{InputObject, Object}; use rust_decimal::Decimal; use serde::{Deserialize, Serialize}; use std::{error::Error, vec}; @@ -27,8 +27,8 @@ pub enum TransactionError { MissingAuthorRoleInTransaction, } -#[derive(Eq, PartialEq, Debug, Deserialize, Serialize, Clone, SimpleObject)] -#[graphql(rename_fields = "snake_case", complex)] +#[derive(Eq, PartialEq, Debug, Deserialize, Serialize, Clone, InputObject)] +#[graphql(input_name = "TransactionInput", rename_fields = "snake_case")] pub struct Transaction { pub id: Option, pub rule_instance_id: Option, @@ -37,14 +37,43 @@ pub struct Transaction { pub author_device_latlng: Option, pub author_role: Option, pub equilibrium_time: Option, + pub debitor_first: Option, pub sum_value: String, - #[graphql(skip)] pub transaction_items: TransactionItems, } -#[ComplexObject] +// Transaction is both a graphql input and output type +// https://async-graphql.github.io/async-graphql/en/define_complex_object.html +// Object must have a resolver defined for each field in its impl +#[Object(rename_fields = "snake_case")] impl Transaction { - #[graphql(name = "transaction_items")] + async fn id(&self) -> Option { + self.id.clone() + } + async fn rule_instance_id(&self) -> Option { + self.rule_instance_id.clone() + } + async fn author(&self) -> Option { + self.author.clone() + } + async fn author_device_id(&self) -> Option { + self.author_device_id.clone() + } + async fn author_device_latlng(&self) -> Option { + self.author_device_latlng.clone() + } + async fn author_role(&self) -> Option { + self.author_role + } + async fn equilibrium_time(&self) -> Option { + self.equilibrium_time + } + async fn debitor_first(&self) -> Option { + self.debitor_first + } + async fn sum_value(&self) -> String { + self.sum_value.clone() + } async fn transaction_items(&self) -> Vec { self.transaction_items.clone().0 } @@ -64,6 +93,7 @@ impl Transaction { author_device_latlng: None, author_role: None, equilibrium_time, + debitor_first: Some(false), sum_value: transaction_items.sum_value(), transaction_items, }; @@ -165,7 +195,8 @@ impl From for Transaction { author_device_latlng: row.get(4), author_role: row.get(5), equilibrium_time: row.get(6), - sum_value: row.get(7), + debitor_first: row.get(7), + sum_value: row.get(8), transaction_items: TransactionItems(vec![]), } } @@ -181,7 +212,8 @@ impl From<&Row> for Transaction { author_device_latlng: row.get(4), author_role: row.get(5), equilibrium_time: row.get(6), - sum_value: row.get(7), + debitor_first: row.get(7), + sum_value: row.get(8), transaction_items: TransactionItems(vec![]), } } @@ -440,6 +472,7 @@ pub mod tests { "author_device_latlng": null, "author_role": "creditor", "equilibrium_time": null, + "debitor_first": false, "sum_value": "21.800", "transaction_items": [ { @@ -448,7 +481,6 @@ pub mod tests { "item_id": "bread", "price": "3.000", "quantity": "2", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": [], "unit_of_measurement": null, @@ -498,7 +530,6 @@ pub mod tests { "item_id": "milk", "price": "4.000", "quantity": "3", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": [], "unit_of_measurement": null, @@ -568,6 +599,7 @@ pub mod tests { "author_device_latlng": null, "author_role": "creditor", "equilibrium_time": null, + "debitor_first": false, "sum_value": "21.800", "transaction_items": [ { @@ -576,7 +608,6 @@ pub mod tests { "item_id": "bread", "price": "3.000", "quantity": "2", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": [], "unit_of_measurement": null, @@ -626,7 +657,6 @@ pub mod tests { "item_id": "milk", "price": "4.000", "quantity": "3", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": [], "unit_of_measurement": null, @@ -680,6 +710,7 @@ pub mod tests { "author_device_latlng": null, "author_role": "creditor", "equilibrium_time": null, + "debitor_first": false, "sum_value": "21.800", "transaction_items": [ { @@ -688,7 +719,6 @@ pub mod tests { "item_id": "bread", "price": "3.000", "quantity": "2", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": [], "unit_of_measurement": null, @@ -738,7 +768,6 @@ pub mod tests { "item_id": "milk", "price": "4.000", "quantity": "3", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": [], "unit_of_measurement": null, @@ -801,6 +830,7 @@ pub mod tests { author_device_latlng: None, author_role: Some(AccountRole::Creditor), equilibrium_time: None, + debitor_first: Some(false), sum_value: String::from("21.800"), transaction_items: TransactionItems(vec![ TransactionItem { @@ -809,7 +839,6 @@ pub mod tests { item_id: String::from("bread"), price: String::from("3.000"), quantity: String::from("2"), - debitor_first: Some(false), rule_instance_id: None, rule_exec_ids: Some(vec![]), unit_of_measurement: None, @@ -859,7 +888,6 @@ pub mod tests { item_id: String::from("milk"), price: String::from("4.000"), quantity: String::from("3"), - debitor_first: Some(false), rule_instance_id: None, rule_exec_ids: Some(vec![]), unit_of_measurement: None, @@ -917,6 +945,7 @@ pub mod tests { author_device_latlng: None, author_role: Some(AccountRole::Creditor), equilibrium_time: None, + debitor_first: Some(false), sum_value: String::from("21.800"), transaction_items: TransactionItems(vec![ TransactionItem { @@ -925,7 +954,6 @@ pub mod tests { item_id: String::from("bread"), price: String::from("3.000"), quantity: String::from("2"), - debitor_first: Some(false), rule_instance_id: None, rule_exec_ids: Some(vec![]), unit_of_measurement: None, @@ -975,7 +1003,6 @@ pub mod tests { item_id: String::from("milk"), price: String::from("4.000"), quantity: String::from("3"), - debitor_first: Some(false), rule_instance_id: None, rule_exec_ids: Some(vec![]), unit_of_measurement: None, @@ -1029,6 +1056,7 @@ pub mod tests { author_device_latlng: None, author_role: Some(AccountRole::Creditor), equilibrium_time: None, + debitor_first: Some(false), sum_value: String::from("21.800"), transaction_items: TransactionItems(vec![ TransactionItem { @@ -1037,7 +1065,6 @@ pub mod tests { item_id: String::from("bread"), price: String::from("3.000"), quantity: String::from("2"), - debitor_first: Some(false), rule_instance_id: None, rule_exec_ids: Some(vec![]), unit_of_measurement: None, @@ -1087,7 +1114,6 @@ pub mod tests { item_id: String::from("milk"), price: String::from("4.000"), quantity: String::from("3"), - debitor_first: Some(false), rule_instance_id: None, rule_exec_ids: Some(vec![]), unit_of_measurement: None, diff --git a/crates/types/src/transaction_item.rs b/crates/types/src/transaction_item.rs index 7d75db976..49eedefbe 100644 --- a/crates/types/src/transaction_item.rs +++ b/crates/types/src/transaction_item.rs @@ -4,7 +4,7 @@ use crate::{ approval::{Approval, ApprovalError, Approvals}, time::TZTime, }; -use async_graphql::{InputObject, Object}; +use async_graphql::{InputObject, InputType, InputValueResult, Object, Value}; use rust_decimal::{prelude::FromPrimitive, Decimal}; use serde::{Deserialize, Serialize}; use std::collections::HashMap; @@ -14,8 +14,6 @@ use tokio_postgres::Row; #[derive(Error, Debug, PartialEq, Eq)] pub enum TransactionItemError { - #[error("inconsistent debitor_first values")] - InconsistentValue, #[error("self payment detected for {} account", .0)] SelfPayment(String), #[error("adding to non empty approvals")] @@ -42,7 +40,6 @@ pub struct TransactionItem { pub item_id: String, pub price: String, pub quantity: String, - pub debitor_first: Option, pub rule_instance_id: Option, pub rule_exec_ids: Option>, pub unit_of_measurement: Option, @@ -85,9 +82,6 @@ impl TransactionItem { async fn quantity(&self) -> String { self.quantity.clone() } - async fn debitor_first(&self) -> Option { - self.debitor_first - } async fn rule_instance_id(&self) -> Option { self.rule_instance_id.clone() } @@ -150,12 +144,6 @@ impl TransactionItem { } } - pub fn set_none_debitor_first_as_false(&mut self) { - if self.debitor_first.is_none() { - self.debitor_first = Some(false) - } - } - pub fn set_none_rule_exec_ids_as_empty(&mut self) { if self.rule_exec_ids.is_none() { self.rule_exec_ids = Some(vec![]) @@ -246,7 +234,6 @@ impl TransactionItem { self.item_id == other.item_id && self_price == other_price && self_quantity == other_quantity - && self.debitor_first == other.debitor_first // return when test data is consistent // && self.rule_instance_id == other.rule_instance_id && self.unit_of_measurement == other.unit_of_measurement @@ -264,21 +251,20 @@ impl From for TransactionItem { item_id: row.get(2), price: row.get(3), quantity: row.get(4), - debitor_first: row.get(5), - rule_instance_id: row.get(6), - rule_exec_ids: row.get(7), - unit_of_measurement: row.get(8), - units_measured: row.get(9), - debitor: row.get(10), - creditor: row.get(11), - debitor_profile_id: row.get(12), - creditor_profile_id: row.get(13), - debitor_approval_time: row.get(14), - creditor_approval_time: row.get(15), - debitor_rejection_time: row.get(16), - creditor_rejection_time: row.get(17), - debitor_expiration_time: row.get(18), - creditor_expiration_time: row.get(19), + rule_instance_id: row.get(5), + rule_exec_ids: row.get(6), + unit_of_measurement: row.get(7), + units_measured: row.get(8), + debitor: row.get(9), + creditor: row.get(10), + debitor_profile_id: row.get(11), + creditor_profile_id: row.get(12), + debitor_approval_time: row.get(13), + creditor_approval_time: row.get(14), + debitor_rejection_time: row.get(15), + creditor_rejection_time: row.get(16), + debitor_expiration_time: row.get(17), + creditor_expiration_time: row.get(18), approvals: Some(Approvals(vec![])), } } @@ -287,6 +273,37 @@ impl From for TransactionItem { #[derive(Default, Eq, PartialEq, Debug, Deserialize, Serialize, Clone)] pub struct TransactionItems(pub Vec); +impl InputType for TransactionItems { + type RawValueType = Self; + + fn type_name() -> std::borrow::Cow<'static, str> { + as InputType>::type_name() + } + + fn qualified_type_name() -> String { + as InputType>::qualified_type_name() + } + + fn create_type_info(registry: &mut async_graphql::registry::Registry) -> String { + as InputType>::create_type_info(registry) + } + + fn parse(value: Option) -> InputValueResult { + match as InputType>::parse(value) { + Ok(items) => Ok(TransactionItems(items)), + Err(e) => Err(e.propagate()), + } + } + + fn to_value(&self) -> Value { + as InputType>::to_value(&self.0) + } + + fn as_raw_value(&self) -> Option<&Self::RawValueType> { + Some(self) + } +} + impl From> for TransactionItems { fn from(transaction_items: Vec) -> Self { Self(transaction_items) @@ -343,45 +360,12 @@ impl TransactionItems { format!("{sum:.FIXED_DECIMAL_PLACES$}") } - pub fn set_debitor_first_default(&mut self) { - for ti in self.0.iter_mut() { - ti.set_none_debitor_first_as_false() - } - } - pub fn set_empty_rule_exec_ids(&mut self) { for ti in self.0.iter_mut() { ti.set_none_rule_exec_ids_as_empty() } } - pub fn is_debitor_first(&self) -> Result { - let mut true_count = 0; - let mut false_count = 0; - - for ti in self.0.iter() { - if let Some(debitor_first) = ti.debitor_first { - if debitor_first { - true_count += 1; - } else { - false_count += 1; - } - } else { - false_count += 1; - } - } - - let length = self.0.len(); - - if false_count == length { - Ok(false) - } else if true_count == length { - Ok(true) - } else { - Err(TransactionItemError::InconsistentValue) - } - } - pub fn list_unique_debitors(&self) -> Vec { let mut debit_accounts: Vec = vec![]; for ti in self.0.iter() { @@ -526,7 +510,6 @@ impl TransactionItems { item_id: ti.item_id.clone(), price: ti.price.clone(), quantity: ti.quantity.clone(), - debitor_first: ti.debitor_first, rule_instance_id: ti.rule_instance_id.clone(), rule_exec_ids: None, unit_of_measurement: ti.unit_of_measurement.clone(), @@ -595,7 +578,6 @@ mod tests { use super::*; use crate::approval::Approval; - use crate::transaction::tests::create_test_transaction; use serde_json; #[test] @@ -638,15 +620,6 @@ mod tests { assert_eq!(got, want, "got {}, want {}", got, want) } - #[test] - fn it_sets_debitor_first_as_false() { - let mut test_tr_item = create_test_transaction_item(); - test_tr_item.set_none_debitor_first_as_false(); - let got = test_tr_item.debitor_first.unwrap(); - let want = false; - assert_eq!(got, want, "got {}, want {}", got, want) - } - #[test] fn it_sets_none_rule_exec_ids_as_empty() { let mut test_tr_item = create_test_transaction_item(); @@ -701,20 +674,6 @@ mod tests { assert_eq!(got, want, "got {}, want {}", got, want) } - #[test] - fn it_sets_debitor_first_default() { - let mut test_tr_items = create_test_transaction_items(); - for t in test_tr_items.0.iter_mut() { - t.debitor_first = None - } - test_tr_items.set_debitor_first_default(); - for t in test_tr_items.0.iter_mut() { - let got = t.debitor_first; - let want = Some(false); - assert_eq!(got, want, "got {:?}, want {:?}", got, want) - } - } - #[test] fn it_sets_empty_rule_exec_ids() { let mut test_tr_items = create_test_transaction_items(); @@ -965,7 +924,6 @@ mod tests { item_id: String::from("eggs"), price: String::from("2.500"), quantity: String::from("2"), - debitor_first: Some(false), rule_instance_id: None, rule_exec_ids: Some(vec![]), unit_of_measurement: None, @@ -1025,7 +983,6 @@ mod tests { item_id: String::from("bread"), price: String::from("3.000"), quantity: String::from("2"), - debitor_first: Some(false), rule_instance_id: None, rule_exec_ids: None, unit_of_measurement: None, @@ -1048,7 +1005,6 @@ mod tests { item_id: String::from("milk"), price: String::from("4.000"), quantity: String::from("3"), - debitor_first: Some(false), rule_instance_id: None, rule_exec_ids: None, unit_of_measurement: None, @@ -1079,7 +1035,6 @@ mod tests { item_id: String::from("9% state sales tax"), price: String::from("0.270"), quantity: String::from("2.000"), - debitor_first: Some(false), rule_instance_id: Some(String::from("9% state sales tax")), rule_exec_ids: Some(vec![]), unit_of_measurement: None, @@ -1111,7 +1066,6 @@ mod tests { item_id: String::from("eggs"), price: String::from("2.500"), quantity: String::from("2"), - debitor_first: Some(false), rule_instance_id: None, rule_exec_ids: Some(vec![]), unit_of_measurement: None, @@ -1131,7 +1085,7 @@ mod tests { let test_other = create_test_transaction_items(); assert_eq!( test_tr_items.test_equality(test_other).unwrap_err().to_string(), - "missing transaction items: [TransactionItem { id: None, transaction_id: None, item_id: \"eggs\", price: \"2.500\", quantity: \"2\", debitor_first: Some(false), rule_instance_id: None, rule_exec_ids: Some([]), unit_of_measurement: None, units_measured: None, debitor: \"JacobWebb\", creditor: \"GroceryStore\", debitor_profile_id: None, creditor_profile_id: None, debitor_approval_time: None, creditor_approval_time: None, debitor_rejection_time: None, creditor_rejection_time: None, debitor_expiration_time: None, creditor_expiration_time: None, approvals: None }]".to_string() + "missing transaction items: [TransactionItem { id: None, transaction_id: None, item_id: \"eggs\", price: \"2.500\", quantity: \"2\", rule_instance_id: None, rule_exec_ids: Some([]), unit_of_measurement: None, units_measured: None, debitor: \"JacobWebb\", creditor: \"GroceryStore\", debitor_profile_id: None, creditor_profile_id: None, debitor_approval_time: None, creditor_approval_time: None, debitor_rejection_time: None, creditor_rejection_time: None, debitor_expiration_time: None, creditor_expiration_time: None, approvals: None }]".to_string() ) } @@ -1145,7 +1099,6 @@ mod tests { item_id: String::from("eggs"), price: String::from("2.500"), quantity: String::from("2"), - debitor_first: Some(false), rule_instance_id: None, rule_exec_ids: Some(vec![]), unit_of_measurement: None, @@ -1191,7 +1144,6 @@ mod tests { "item_id": "bottled water", "price": "1.000", "quantity": "2", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": [], "unit_of_measurement": null, @@ -1229,7 +1181,6 @@ mod tests { "item_id": "bread", "price": "3.000", "quantity": "2", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": [], "unit_of_measurement": null, @@ -1279,7 +1230,6 @@ mod tests { "item_id": "milk", "price": "4.000", "quantity": "3", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": [], "unit_of_measurement": null, @@ -1343,43 +1293,6 @@ mod tests { assert_eq!(got, want, "got {:?}, want {:?}", got, want) } - #[test] - fn it_returns_creditor_first() { - let test_transaction = create_test_transaction(); - let got = test_transaction - .transaction_items - .is_debitor_first() - .unwrap(); - let want = false; - assert_eq!(got, want); - } - - #[test] - fn it_returns_debitor_first() { - let test_transaction = create_test_debitor_first_transaction_items(); - let got = test_transaction.is_debitor_first().unwrap(); - let want = true; - assert_eq!(got, want); - } - - #[test] - fn it_returns_debitor_first_as_false_with_none() { - let mut test_tr_items = create_test_debitor_first_transaction_items(); - for t in test_tr_items.0.iter_mut() { - t.debitor_first = None; - } - let got = test_tr_items.is_debitor_first().unwrap(); - let want = false; - assert_eq!(got, want); - } - - #[test] - fn it_returns_inconsistent_err() { - let test_transaction = create_test_inconsistent_err_transaction_items(); - let got = test_transaction.is_debitor_first(); - assert_eq!(got, Err(TransactionItemError::InconsistentValue)); - } - pub fn create_test_approvals() -> Approvals { Approvals(vec![ Approval { @@ -1418,7 +1331,6 @@ mod tests { item_id: String::from("bottled water"), price: String::from("1.000"), quantity: String::from("2"), - debitor_first: Some(false), rule_instance_id: None, rule_exec_ids: Some(vec![]), unit_of_measurement: None, @@ -1445,7 +1357,6 @@ mod tests { item_id: String::from("bread"), price: String::from("3.000"), quantity: String::from("2"), - debitor_first: Some(false), rule_instance_id: None, rule_exec_ids: Some(vec![]), unit_of_measurement: None, @@ -1495,7 +1406,6 @@ mod tests { item_id: String::from("milk"), price: String::from("4.000"), quantity: String::from("3"), - debitor_first: Some(false), rule_instance_id: None, rule_exec_ids: Some(vec![]), unit_of_measurement: None, @@ -1541,214 +1451,4 @@ mod tests { }, ]) } - - pub fn create_test_debitor_first_transaction_items() -> TransactionItems { - TransactionItems(vec![ - TransactionItem { - id: None, - transaction_id: None, - item_id: String::from("bread"), - price: String::from("3.000"), - quantity: String::from("2"), - debitor_first: Some(true), - rule_instance_id: None, - rule_exec_ids: Some(vec![]), - unit_of_measurement: None, - units_measured: None, - debitor: String::from("JacobWebb"), - creditor: String::from("GroceryStore"), - debitor_profile_id: None, - creditor_profile_id: None, - debitor_approval_time: None, - creditor_approval_time: None, - debitor_rejection_time: None, - creditor_rejection_time: None, - debitor_expiration_time: None, - creditor_expiration_time: None, - approvals: Some(Approvals(vec![ - Approval { - id: None, - rule_instance_id: None, - transaction_id: None, - transaction_item_id: None, - account_name: String::from("JacobWebb"), - account_role: AccountRole::Debitor, - device_id: None, - device_latlng: None, - approval_time: None, - rejection_time: None, - expiration_time: None, - }, - Approval { - id: None, - rule_instance_id: None, - transaction_id: None, - transaction_item_id: None, - account_name: String::from("GroceryStore"), - account_role: AccountRole::Creditor, - device_id: None, - device_latlng: None, - approval_time: None, - rejection_time: None, - expiration_time: None, - }, - ])), - }, - TransactionItem { - id: None, - transaction_id: None, - item_id: String::from("milk"), - price: String::from("4.000"), - quantity: String::from("3"), - debitor_first: Some(true), - rule_instance_id: None, - rule_exec_ids: Some(vec![]), - unit_of_measurement: None, - units_measured: None, - debitor: String::from("JacobWebb"), - creditor: String::from("GroceryStore"), - debitor_profile_id: None, - creditor_profile_id: None, - debitor_approval_time: None, - creditor_approval_time: None, - debitor_rejection_time: None, - creditor_rejection_time: None, - debitor_expiration_time: None, - creditor_expiration_time: None, - approvals: Some(Approvals(vec![ - Approval { - id: None, - rule_instance_id: None, - transaction_id: None, - transaction_item_id: None, - account_name: String::from("JacobWebb"), - account_role: AccountRole::Debitor, - device_id: None, - device_latlng: None, - approval_time: None, - rejection_time: None, - expiration_time: None, - }, - Approval { - id: None, - rule_instance_id: None, - transaction_id: None, - transaction_item_id: None, - account_name: String::from("GroceryStore"), - account_role: AccountRole::Creditor, - device_id: None, - device_latlng: None, - approval_time: None, - rejection_time: None, - expiration_time: None, - }, - ])), - }, - ]) - } - - pub fn create_test_inconsistent_err_transaction_items() -> TransactionItems { - TransactionItems(vec![ - TransactionItem { - id: None, - transaction_id: None, - item_id: String::from("bread"), - price: String::from("3.000"), - quantity: String::from("2"), - debitor_first: Some(true), - rule_instance_id: None, - rule_exec_ids: Some(vec![]), - unit_of_measurement: None, - units_measured: None, - debitor: String::from("JacobWebb"), - creditor: String::from("GroceryStore"), - debitor_profile_id: None, - creditor_profile_id: None, - debitor_approval_time: None, - creditor_approval_time: None, - debitor_rejection_time: None, - creditor_rejection_time: None, - debitor_expiration_time: None, - creditor_expiration_time: None, - approvals: Some(Approvals(vec![ - Approval { - id: None, - rule_instance_id: None, - transaction_id: None, - transaction_item_id: None, - account_name: String::from("JacobWebb"), - account_role: AccountRole::Debitor, - device_id: None, - device_latlng: None, - approval_time: None, - rejection_time: None, - expiration_time: None, - }, - Approval { - id: None, - rule_instance_id: None, - transaction_id: None, - transaction_item_id: None, - account_name: String::from("GroceryStore"), - account_role: AccountRole::Creditor, - device_id: None, - device_latlng: None, - approval_time: None, - rejection_time: None, - expiration_time: None, - }, - ])), - }, - TransactionItem { - id: None, - transaction_id: None, - item_id: String::from("milk"), - price: String::from("4.000"), - quantity: String::from("3"), - debitor_first: Some(false), - rule_instance_id: None, - rule_exec_ids: Some(vec![]), - unit_of_measurement: None, - units_measured: None, - debitor: String::from("JacobWebb"), - creditor: String::from("GroceryStore"), - debitor_profile_id: None, - creditor_profile_id: None, - debitor_approval_time: None, - creditor_approval_time: None, - debitor_rejection_time: None, - creditor_rejection_time: None, - debitor_expiration_time: None, - creditor_expiration_time: None, - approvals: Some(Approvals(vec![ - Approval { - id: None, - rule_instance_id: None, - transaction_id: None, - transaction_item_id: None, - account_name: String::from("JacobWebb"), - account_role: AccountRole::Debitor, - device_id: None, - device_latlng: None, - approval_time: None, - rejection_time: None, - expiration_time: None, - }, - Approval { - id: None, - rule_instance_id: None, - transaction_id: None, - transaction_item_id: None, - account_name: String::from("GroceryStore"), - account_role: AccountRole::Creditor, - device_id: None, - device_latlng: None, - approval_time: None, - rejection_time: None, - expiration_time: None, - }, - ])), - }, - ]) - } } diff --git a/infra/terraform/aws/modules/environment/v001/ssm.tf b/infra/terraform/aws/modules/environment/v001/ssm.tf index befcece7f..6fc2f5875 100644 --- a/infra/terraform/aws/modules/environment/v001/ssm.tf +++ b/infra/terraform/aws/modules/environment/v001/ssm.tf @@ -108,3 +108,15 @@ resource "aws_ssm_parameter" "lambda_readiness_check_path" { type = "SecureString" value = var.readiness_check_path } + +resource "aws_ssm_parameter" "google_maps_api_key" { + name = "/${var.ssm_prefix}/client/google_maps_api_key" + description = "google maps api key in ${local.SPACED_ID_ENV}" + type = "SecureString" + // set later when dev wants to use maps in client/src/routes/measure/+page.svelte + value = "null" + + lifecycle { + ignore_changes = [value] + } +} diff --git a/migrations/schema/000005_transaction.up.sql b/migrations/schema/000005_transaction.up.sql index 778ee2ed6..a95eb902b 100644 --- a/migrations/schema/000005_transaction.up.sql +++ b/migrations/schema/000005_transaction.up.sql @@ -12,6 +12,7 @@ CREATE TABLE transaction ( author_role text not null, -- https://en.wiktionary.org/wiki/equilibrium_price equilibrium_time timestamptz, + debitor_first boolean default false, sum_value numeric, created_at timestamptz NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT fk_rule_instance_id diff --git a/migrations/schema/000006_transaction_item.up.sql b/migrations/schema/000006_transaction_item.up.sql index 291f6a413..9e8ac5eec 100644 --- a/migrations/schema/000006_transaction_item.up.sql +++ b/migrations/schema/000006_transaction_item.up.sql @@ -5,7 +5,6 @@ CREATE TABLE transaction_item ( item_id character varying(255) NOT NULL, -- temporary until item inserts added in code price numeric NOT NULL CHECK (price > 0), quantity numeric NOT NULL CHECK (quantity > 0), - debitor_first boolean default true, rule_instance_id int, rule_exec_ids text[], unit_of_measurement character varying(255), diff --git a/migrations/schema/000008_insert_transaction.up.sql b/migrations/schema/000008_insert_transaction.up.sql index 5d1cf8c34..8f799549e 100644 --- a/migrations/schema/000008_insert_transaction.up.sql +++ b/migrations/schema/000008_insert_transaction.up.sql @@ -23,6 +23,7 @@ BEGIN author_device_latlng, author_role, equilibrium_time, + debitor_first, sum_value ) VALUES ( (entire_transaction).transaction.rule_instance_id, @@ -31,6 +32,7 @@ BEGIN (entire_transaction).transaction.author_device_latlng, (entire_transaction).transaction.author_role, (entire_transaction).transaction.equilibrium_time, + (entire_transaction).transaction.debitor_first, (entire_transaction).transaction.sum_value ) RETURNING id INTO tr_id; -- 2. loop through transaction_item array and insert @@ -42,7 +44,6 @@ BEGIN item_id, price, quantity, - debitor_first, rule_instance_id, rule_exec_ids, unit_of_measurement, @@ -62,7 +63,6 @@ BEGIN (tr_item).transaction_item.item_id, (tr_item).transaction_item.price, (tr_item).transaction_item.quantity, - (tr_item).transaction_item.debitor_first, (tr_item).transaction_item.rule_instance_id, (tr_item).transaction_item.rule_exec_ids, (tr_item).transaction_item.unit_of_measurement, diff --git a/project.yaml b/project.yaml index 28f4a68a0..86c93d0f6 100644 --- a/project.yaml +++ b/project.yaml @@ -28,7 +28,7 @@ client: ssm: null default: 10009 GOOGLE_MAPS_API_KEY: - ssm: null + ssm: client/google_maps_api_key # todo: precommit hook setting null default: null # variables requiring a PUBLIC_* prefix diff --git a/scripts/README.md b/scripts/README.md index 25f574ad0..864dc7e4e 100755 --- a/scripts/README.md +++ b/scripts/README.md @@ -319,4 +319,7 @@ installs project dependencies. only macos supported tests availability of services locally or in cloud #### `invoke-warm-cache.sh` -invokes warm-cache lambda to populate ddb cache from rds \ No newline at end of file +invokes warm-cache lambda to populate ddb cache from rds + +#### `maps-key.sh` +gets or sets the google maps api key in ssm. `bash scripts/maps-key.sh` to get, `bash scripts/maps-key.sh --set ` to set. always targets dev ssm. used by `create-env-file.sh` to silently populate `GOOGLE_MAPS_API_KEY` in client `.env` \ No newline at end of file diff --git a/scripts/create-env-file.sh b/scripts/create-env-file.sh index 83386c439..17bc18d73 100644 --- a/scripts/create-env-file.sh +++ b/scripts/create-env-file.sh @@ -100,6 +100,9 @@ function set_default_value() { else echo "$SECRET=$LOCAL_ADDRESS:$PORT_VAL" >>$ENV_FILE fi + elif [[ "$SECRET" == 'GOOGLE_MAPS_API_KEY' ]]; then + ENV_VAR=$(bash scripts/maps-key.sh 2>/dev/null || true) + echo "$SECRET=$ENV_VAR" >>$ENV_FILE elif [[ "$SECRET" == 'RUST_LOG' ]]; then RUST_LOG_VAL=$(yq "$APP_CONF_PATH.rust_log" $PROJECT_CONF) echo "$SECRET=$RUST_LOG_VAL" >>$ENV_FILE diff --git a/scripts/maps-key.sh b/scripts/maps-key.sh new file mode 100644 index 000000000..40c70faf5 --- /dev/null +++ b/scripts/maps-key.sh @@ -0,0 +1,50 @@ +#!/bin/bash + +set -eo pipefail + +if [[ $(basename $(pwd)) != "mxfactorial" ]]; then + echo "error: run from project root" + exit 1 +fi + +PROJECT_CONF=project.yaml +SSM_VERSION=$(yq '.infra.terraform.aws.modules.environment.env_var.set.SSM_VERSION.default' $PROJECT_CONF) +REGION=$(yq '.infra.terraform.aws.modules.environment.env_var.set.REGION.default' $PROJECT_CONF) +SSM_SUFFIX=$(yq '.client.env_var.set.GOOGLE_MAPS_API_KEY.ssm' $PROJECT_CONF) + +ENV=dev + +export ENV_ID +ENV_ID=$(source scripts/print-env-id.sh) +SSM_NAME="/$ENV_ID/$SSM_VERSION/$ENV/$SSM_SUFFIX" + +SET=false + +while [[ "$#" -gt 0 ]]; do + case $1 in + --set) SET=true; VALUE="$2"; shift; shift ;; + *) echo "unknown parameter passed: $1"; exit 1 ;; + esac +done + +if [[ $SET == true ]]; then + if [[ -z $VALUE ]]; then + echo "use: ENV=dev bash scripts/maps-key.sh --set " + exit 1 + fi + aws ssm put-parameter \ + --name "$SSM_NAME" \ + --value "$VALUE" \ + --type SecureString \ + --region "$REGION" \ + --overwrite \ + --output text + echo "set $SSM_NAME" +else + aws ssm get-parameter \ + --name "$SSM_NAME" \ + --query 'Parameter.Value' \ + --region "$REGION" \ + --with-decryption \ + --output text +fi diff --git a/scripts/start-local.sh b/scripts/start-local.sh index f6204bb3e..76df2021f 100644 --- a/scripts/start-local.sh +++ b/scripts/start-local.sh @@ -44,20 +44,14 @@ for d in "${APP_DIRS[@]}"; do RUNTIME=$(yq "$CONF_PATH.runtime" $PROJECT_CONF) BUILD_SRC_PATH=$(yq "$CONF_PATH.build_src_path" $PROJECT_CONF) - # compile rust before starting (skip when using pre-built binaries from services workflow artifacts) - if [[ -z "$SERVICES_WORKFLOW" ]] && [[ "$RUNTIME" == "$RUST_RUNTIME" ]]; then - echo -e -n "\n${GREEN}*** compiling $d${RESET}\n" - make --no-print-directory -C "$d" compile - fi - # skip starting client in services workflows - if [[ "$SERVICES_WORKFLOW" ]] && [[ "$d" == 'client' ]]; then + if [[ "$SKIP_CARGO_WATCH" ]] && [[ "$d" == 'client' ]]; then continue fi echo -e -n "\n${GREEN}*** starting $d${RESET}\n" - if [[ "$SERVICES_WORKFLOW" ]]; then + if [[ "$SKIP_CARGO_WATCH" ]]; then make --no-print-directory -C "$d" get-secrets ENV=local > /dev/null # &; \ disown fails in make so backgrounding kept in bash if [[ "$RUNTIME" == "$RUST_RUNTIME" ]]; then diff --git a/services/graphql/postman/graphql.postman_collection.json b/services/graphql/postman/graphql.postman_collection.json index ec0d32011..d5621cb40 100644 --- a/services/graphql/postman/graphql.postman_collection.json +++ b/services/graphql/postman/graphql.postman_collection.json @@ -1,369 +1,370 @@ { - "info": { - "_postman_id": "bd8075c0-a747-42c1-98cc-77fae9e44233", - "name": "graphql", - "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" - }, - "item": [ - { - "name": "rules", - "request": { - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/json", - "type": "text" - }, - { - "key": "Authorization", - "value": "{{ID_TOKEN}}", - "type": "text" - } - ], - "body": { - "mode": "graphql", - "graphql": { - "query": "query getRules($transaction_items: [TransactionItemInput!]) {\n rules(transaction_items: $transaction_items) {\n id\n rule_instance_id\n author\n author_device_id\n author_device_latlng\n author_role\n sum_value\n transaction_items {\n id\n transaction_id\n item_id\n price\n quantity\n debitor_first\n rule_instance_id\n unit_of_measurement\n units_measured\n debitor\n creditor\n debitor_profile_id\n creditor_profile_id\n debitor_approval_time\n creditor_approval_time\n debitor_expiration_time\n creditor_expiration_time\n debitor_rejection_time\n creditor_rejection_time \n }\n }\n}", - "variables": "{\n \"transaction_items\": [\n {\n \"id\": null,\n \"transaction_id\": null,\n \"item_id\": \"milk\",\n \"price\": \"2.000\",\n \"quantity\": \"1\",\n \"debitor_first\": null,\n \"rule_instance_id\": null,\n \"unit_of_measurement\": \"\",\n \"units_measured\": null,\n \"debitor\": \"JacobWebb\",\n \"creditor\": \"GroceryStore\",\n \"debitor_profile_id\": null,\n \"creditor_profile_id\": null,\n \"debitor_approval_time\": null,\n \"creditor_approval_time\": null,\n \"debitor_expiration_time\": null,\n \"creditor_expiration_time\": null,\n \"debitor_rejection_time\": null,\n \"creditor_rejection_time\": null\n },\n {\n \"id\": null,\n \"transaction_id\": null,\n \"item_id\": \"bread\",\n \"price\": \"3.000\",\n \"quantity\": \"2\",\n \"debitor_first\": null,\n \"rule_instance_id\": null,\n \"unit_of_measurement\": \"\",\n \"units_measured\": null,\n \"debitor\": \"JacobWebb\",\n \"creditor\": \"GroceryStore\",\n \"debitor_profile_id\": null,\n \"creditor_profile_id\": null,\n \"debitor_approval_time\": null,\n \"creditor_approval_time\": null,\n \"debitor_expiration_time\": null,\n \"creditor_expiration_time\": null,\n \"debitor_rejection_time\": null,\n \"creditor_rejection_time\": null\n },\n {\n \"id\": null,\n \"transaction_id\": null,\n \"item_id\": \"eggs\",\n \"price\": \"4.000\",\n \"quantity\": \"3\",\n \"debitor_first\": null,\n \"rule_instance_id\": null,\n \"unit_of_measurement\": \"\",\n \"units_measured\": null,\n \"debitor\": \"JacobWebb\",\n \"creditor\": \"GroceryStore\",\n \"debitor_profile_id\": null,\n \"creditor_profile_id\": null,\n \"debitor_approval_time\": null,\n \"creditor_approval_time\": null,\n \"debitor_expiration_time\": null,\n \"creditor_expiration_time\": null,\n \"debitor_rejection_time\": null,\n \"creditor_rejection_time\": null\n }\n ]\n}" - } - }, - "url": { - "raw": "{{GRAPHQL_URI}}/query", - "host": [ - "{{GRAPHQL_URI}}" - ], - "path": [ - "query" - ] - } - }, - "response": [] - }, - { - "name": "rulesWithApprovers", - "request": { - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/json", - "type": "text" - }, - { - "key": "Authorization", - "value": "{{ID_TOKEN}}", - "type": "text" - } - ], - "body": { - "mode": "graphql", - "graphql": { - "query": "query getRules($transaction_items: [TransactionItemInput!]) {\n rules(transaction_items: $transaction_items) {\n id\n rule_instance_id\n author\n author_device_id\n author_device_latlng\n author_role\n sum_value\n transaction_items {\n id\n transaction_id\n item_id\n price\n quantity\n debitor_first\n rule_instance_id\n unit_of_measurement\n units_measured\n debitor\n creditor\n debitor_profile_id\n creditor_profile_id\n debitor_approval_time\n creditor_approval_time\n debitor_expiration_time\n creditor_expiration_time\n debitor_rejection_time\n creditor_rejection_time\n approvals {\n id\n rule_instance_id\n transaction_id\n transaction_item_id\n account_name\n account_role\n device_id\n device_latlng\n approval_time\n rejection_time\n expiration_time\n }\n }\n }\n}", - "variables": "{\n \"transaction_items\": [\n {\n \"id\": null,\n \"transaction_id\": null,\n \"item_id\": \"milk\",\n \"price\": \"2.000\",\n \"quantity\": \"1\",\n \"debitor_first\": null,\n \"rule_instance_id\": null,\n \"unit_of_measurement\": null,\n \"units_measured\": null,\n \"debitor\": \"JoeCarter\",\n \"creditor\": \"GroceryCo\",\n \"debitor_profile_id\": null,\n \"creditor_profile_id\": null,\n \"debitor_approval_time\": null,\n \"creditor_approval_time\": null,\n \"debitor_expiration_time\": null,\n \"creditor_expiration_time\": null,\n \"debitor_rejection_time\": null,\n \"creditor_rejection_time\": null\n },\n {\n \"id\": null,\n \"transaction_id\": null,\n \"item_id\": \"bread\",\n \"price\": \"3.000\",\n \"quantity\": \"2\",\n \"debitor_first\": null,\n \"rule_instance_id\": null,\n \"unit_of_measurement\": null,\n \"units_measured\": null,\n \"debitor\": \"JoeCarter\",\n \"creditor\": \"GroceryCo\",\n \"debitor_profile_id\": null,\n \"creditor_profile_id\": null,\n \"debitor_approval_time\": null,\n \"creditor_approval_time\": null,\n \"debitor_expiration_time\": null,\n \"creditor_expiration_time\": null,\n \"debitor_rejection_time\": null,\n \"creditor_rejection_time\": null\n },\n {\n \"id\": null,\n \"transaction_id\": null,\n \"item_id\": \"eggs\",\n \"price\": \"4.000\",\n \"quantity\": \"3\",\n \"debitor_first\": null,\n \"rule_instance_id\": null,\n \"unit_of_measurement\": null,\n \"units_measured\": null,\n \"debitor\": \"JoeCarter\",\n \"creditor\": \"GroceryCo\",\n \"debitor_profile_id\": null,\n \"creditor_profile_id\": null,\n \"debitor_approval_time\": null,\n \"creditor_approval_time\": null,\n \"debitor_expiration_time\": null,\n \"creditor_expiration_time\": null,\n \"debitor_rejection_time\": null,\n \"creditor_rejection_time\": null\n }\n ]\n}" - } - }, - "url": { - "raw": "{{GRAPHQL_URI}}/query", - "host": [ - "{{GRAPHQL_URI}}" - ], - "path": [ - "query" - ] - } - }, - "response": [] - }, - { - "name": "rulesBottledWater", - "request": { - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/json", - "type": "text" - }, - { - "key": "Authorization", - "value": "{{ID_TOKEN}}", - "type": "text" - } - ], - "body": { - "mode": "graphql", - "graphql": { - "query": "query getRules($transaction_items: [TransactionItemInput!]) {\n rules(transaction_items: $transaction_items) {\n id\n rule_instance_id\n author\n author_device_id\n author_device_latlng\n author_role\n sum_value\n transaction_items {\n id\n transaction_id\n item_id\n price\n quantity\n debitor_first\n rule_instance_id\n unit_of_measurement\n units_measured\n debitor\n creditor\n debitor_profile_id\n creditor_profile_id\n debitor_approval_time\n creditor_approval_time\n debitor_expiration_time\n creditor_expiration_time\n debitor_rejection_time\n creditor_rejection_time \n }\n }\n}", - "variables": "{\n \"transaction_items\": [\n {\n \"id\": null,\n \"transaction_id\": null,\n \"item_id\": \"bottled water\",\n \"price\": \"1.000\",\n \"quantity\": \"1\",\n \"debitor_first\": null,\n \"rule_instance_id\": null,\n \"unit_of_measurement\": null,\n \"units_measured\": null,\n \"debitor\": \"JacobWebb\",\n \"creditor\": \"GroceryStore\",\n \"debitor_profile_id\": null,\n \"creditor_profile_id\": null,\n \"debitor_approval_time\": null,\n \"creditor_approval_time\": null,\n \"debitor_expiration_time\": null,\n \"creditor_expiration_time\": null,\n \"debitor_rejection_time\": null,\n \"creditor_rejection_time\": null\n }\n ]\n}" - } - }, - "url": { - "raw": "{{GRAPHQL_URI}}/query", - "host": [ - "{{GRAPHQL_URI}}" - ], - "path": [ - "query" - ] - } - }, - "response": [] - }, - { - "name": "balance", - "protocolProfileBehavior": { - "disabledSystemHeaders": { - "user-agent": true, - "accept": true, - "accept-encoding": true, - "connection": true - } - }, - "request": { - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/json", - "type": "text", - "disabled": true - }, - { - "key": "Authorization", - "value": "{{ID_TOKEN}}", - "type": "text", - "disabled": true - } - ], - "body": { - "mode": "graphql", - "graphql": { - "query": "query balance($account_name: String!, $auth_account: String!) {\n balance(account_name: $account_name, auth_account: $auth_account)\n}", - "variables": "{\n \"auth_account\": \"StateOfCalifornia\",\n \"account_name\": \"StateOfCalifornia\"\n}" - } - }, - "url": { - "raw": "{{GRAPHQL_URI}}/query", - "host": [ - "{{GRAPHQL_URI}}" - ], - "path": [ - "query" - ] - } - }, - "response": [] - }, - { - "name": "createRequest", - "request": { - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/json", - "type": "text" - }, - { - "key": "Authorization", - "value": "{{ID_TOKEN}}", - "type": "text" - } - ], - "body": { - "mode": "graphql", - "graphql": { - "query": "mutation createRequest($transaction_items: [TransactionItemInput!], $auth_account: String!) {\n createRequest(transaction_items: $transaction_items, auth_account: $auth_account) {\n id\n rule_instance_id\n author\n author_device_id\n author_device_latlng\n author_role\n sum_value\n transaction_items {\n id\n transaction_id\n item_id\n price\n quantity\n debitor_first\n rule_instance_id\n unit_of_measurement\n units_measured\n debitor\n creditor\n debitor_profile_id\n creditor_profile_id\n debitor_approval_time\n creditor_approval_time\n debitor_expiration_time\n creditor_expiration_time\n debitor_rejection_time\n creditor_rejection_time \n }\n }\n}", - "variables": "{\n\t\"auth_account\": \"GroceryStore\",\n\t\"transaction_items\": [\n\t\t{\n\t\t\t\"id\": null,\n\t\t\t\"transaction_id\": null,\n\t\t\t\"item_id\": \"9% state sales tax\",\n\t\t\t\"price\": \"0.180\",\n\t\t\t\"quantity\": \"1.000\",\n\t\t\t\"debitor_first\": null,\n\t\t\t\"rule_instance_id\": \"1\",\n\t\t\t\"unit_of_measurement\": null,\n\t\t\t\"units_measured\": null,\n\t\t\t\"debitor\": \"JacobWebb\",\n\t\t\t\"creditor\": \"StateOfCalifornia\",\n\t\t\t\"debitor_profile_id\": null,\n\t\t\t\"creditor_profile_id\": null,\n\t\t\t\"debitor_approval_time\": null,\n\t\t\t\"creditor_approval_time\": null,\n\t\t\t\"debitor_expiration_time\": null,\n\t\t\t\"creditor_expiration_time\": null,\n\t\t\t\"debitor_rejection_time\": null,\n\t\t\t\"creditor_rejection_time\": null\n\t\t},\n\t\t{\n\t\t\t\"id\": null,\n\t\t\t\"transaction_id\": null,\n\t\t\t\"item_id\": \"9% state sales tax\",\n\t\t\t\"price\": \"0.270\",\n\t\t\t\"quantity\": \"2.000\",\n\t\t\t\"debitor_first\": null,\n\t\t\t\"rule_instance_id\": \"1\",\n\t\t\t\"unit_of_measurement\": null,\n\t\t\t\"units_measured\": null,\n\t\t\t\"debitor\": \"JacobWebb\",\n\t\t\t\"creditor\": \"StateOfCalifornia\",\n\t\t\t\"debitor_profile_id\": null,\n\t\t\t\"creditor_profile_id\": null,\n\t\t\t\"debitor_approval_time\": null,\n\t\t\t\"creditor_approval_time\": null,\n\t\t\t\"debitor_expiration_time\": null,\n\t\t\t\"creditor_expiration_time\": null,\n\t\t\t\"debitor_rejection_time\": null,\n\t\t\t\"creditor_rejection_time\": null\n\t\t},\n\t\t{\n\t\t\t\"id\": null,\n\t\t\t\"transaction_id\": null,\n\t\t\t\"item_id\": \"9% state sales tax\",\n\t\t\t\"price\": \"0.360\",\n\t\t\t\"quantity\": \"3.000\",\n\t\t\t\"debitor_first\": null,\n\t\t\t\"rule_instance_id\": \"1\",\n\t\t\t\"unit_of_measurement\": null,\n\t\t\t\"units_measured\": null,\n\t\t\t\"debitor\": \"JacobWebb\",\n\t\t\t\"creditor\": \"StateOfCalifornia\",\n\t\t\t\"debitor_profile_id\": null,\n\t\t\t\"creditor_profile_id\": null,\n\t\t\t\"debitor_approval_time\": null,\n\t\t\t\"creditor_approval_time\": null,\n\t\t\t\"debitor_expiration_time\": null,\n\t\t\t\"creditor_expiration_time\": null,\n\t\t\t\"debitor_rejection_time\": null,\n\t\t\t\"creditor_rejection_time\": null\n\t\t},\n\t\t{\n\t\t\t\"id\": null,\n\t\t\t\"transaction_id\": null,\n\t\t\t\"item_id\": \"milk\",\n\t\t\t\"price\": \"2.000\",\n\t\t\t\"quantity\": \"1\",\n\t\t\t\"debitor_first\": null,\n\t\t\t\"rule_instance_id\": null,\n\t\t\t\"unit_of_measurement\": null,\n\t\t\t\"units_measured\": null,\n\t\t\t\"debitor\": \"JacobWebb\",\n\t\t\t\"creditor\": \"GroceryStore\",\n\t\t\t\"debitor_profile_id\": null,\n\t\t\t\"creditor_profile_id\": null,\n\t\t\t\"debitor_approval_time\": null,\n\t\t\t\"creditor_approval_time\": null,\n\t\t\t\"debitor_expiration_time\": null,\n\t\t\t\"creditor_expiration_time\": null,\n\t\t\t\"debitor_rejection_time\": null,\n\t\t\t\"creditor_rejection_time\": null\n\t\t},\n\t\t{\n\t\t\t\"id\": null,\n\t\t\t\"transaction_id\": null,\n\t\t\t\"item_id\": \"bread\",\n\t\t\t\"price\": \"3.000\",\n\t\t\t\"quantity\": \"2\",\n\t\t\t\"debitor_first\": null,\n\t\t\t\"rule_instance_id\": null,\n\t\t\t\"unit_of_measurement\": null,\n\t\t\t\"units_measured\": null,\n\t\t\t\"debitor\": \"JacobWebb\",\n\t\t\t\"creditor\": \"GroceryStore\",\n\t\t\t\"debitor_profile_id\": null,\n\t\t\t\"creditor_profile_id\": null,\n\t\t\t\"debitor_approval_time\": null,\n\t\t\t\"creditor_approval_time\": null,\n\t\t\t\"debitor_expiration_time\": null,\n\t\t\t\"creditor_expiration_time\": null,\n\t\t\t\"debitor_rejection_time\": null,\n\t\t\t\"creditor_rejection_time\": null\n\t\t},\n\t\t{\n\t\t\t\"id\": null,\n\t\t\t\"transaction_id\": null,\n\t\t\t\"item_id\": \"eggs\",\n\t\t\t\"price\": \"4.000\",\n\t\t\t\"quantity\": \"3\",\n\t\t\t\"debitor_first\": null,\n\t\t\t\"rule_instance_id\": null,\n\t\t\t\"unit_of_measurement\": null,\n\t\t\t\"units_measured\": null,\n\t\t\t\"debitor\": \"JacobWebb\",\n\t\t\t\"creditor\": \"GroceryStore\",\n\t\t\t\"debitor_profile_id\": null,\n\t\t\t\"creditor_profile_id\": null,\n\t\t\t\"debitor_approval_time\": null,\n\t\t\t\"creditor_approval_time\": null,\n\t\t\t\"debitor_expiration_time\": null,\n\t\t\t\"creditor_expiration_time\": null,\n\t\t\t\"debitor_rejection_time\": null,\n\t\t\t\"creditor_rejection_time\": null\n\t\t}\n\t]\n}" - } - }, - "url": { - "raw": "{{GRAPHQL_URI}}/query", - "host": [ - "{{GRAPHQL_URI}}" - ], - "path": [ - "query" - ] - } - }, - "response": [] - }, - { - "name": "approveRequest", - "request": { - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/json", - "type": "text" - }, - { - "key": "Authorization", - "value": "{{ID_TOKEN}}", - "type": "text" - } - ], - "body": { - "mode": "graphql", - "graphql": { - "query": "mutation approveRequest($id: String!, $account_name: String!, $account_role: String!, $auth_account: String!) {\n approveRequest(id: $id, account_name: $account_name, account_role: $account_role, auth_account: $auth_account) {\n id\n rule_instance_id\n author\n author_device_id\n author_device_latlng\n author_role\n equilibrium_time\n sum_value\n transaction_items {\n id\n transaction_id\n item_id\n price\n quantity\n debitor_first\n rule_instance_id\n unit_of_measurement\n units_measured\n debitor\n creditor\n debitor_profile_id\n creditor_profile_id\n debitor_approval_time\n creditor_approval_time\n debitor_expiration_time\n creditor_expiration_time\n debitor_rejection_time\n creditor_rejection_time \n }\n }\n}", - "variables": "{\n \"id\": \"3\",\n \"account_name\": \"JacobWebb\",\n \"account_role\": \"debitor\",\n \"auth_account\": \"JacobWebb\"\n}" - } - }, - "url": { - "raw": "{{GRAPHQL_URI}}/query", - "host": [ - "{{GRAPHQL_URI}}" - ], - "path": [ - "query" - ] - } - }, - "response": [] - }, - { - "name": "requestByID", - "request": { - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/json", - "type": "text" - }, - { - "key": "Authorization", - "value": "{{ID_TOKEN}}", - "type": "text" - } - ], - "body": { - "mode": "graphql", - "graphql": { - "query": "query getRequestByID($id: String!, $auth_account: String!) {\n requestByID(id: $id, auth_account: $auth_account) {\n id\n rule_instance_id\n author\n author_device_id\n author_device_latlng\n author_role\n transaction_items {\n id\n transaction_id\n item_id\n price\n quantity\n debitor_first\n rule_instance_id\n unit_of_measurement\n units_measured\n debitor\n creditor\n debitor_profile_id\n creditor_profile_id\n debitor_approval_time\n creditor_approval_time\n debitor_expiration_time\n creditor_expiration_time\n debitor_rejection_time\n creditor_rejection_time\n }\n }\n}", - "variables": "{\n \"auth_account\": \"JacobWebb\",\n \"id\": \"1\"\n}" - } - }, - "url": { - "raw": "{{GRAPHQL_URI}}/query", - "host": [ - "{{GRAPHQL_URI}}" - ], - "path": [ - "query" - ] - } - }, - "response": [] - }, - { - "name": "requestsByAccount", - "request": { - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/json", - "type": "text" - }, - { - "key": "Authorization", - "value": "{{ID_TOKEN}}", - "type": "text" - } - ], - "body": { - "mode": "graphql", - "graphql": { - "query": "query getRequestsByAccount($account_name: String!, $auth_account: String!) {\n requestsByAccount(account_name: $account_name, auth_account: $auth_account) {\n id\n rule_instance_id\n author\n author_device_id\n author_device_latlng\n author_role\n sum_value\n transaction_items {\n id\n transaction_id\n item_id\n price\n quantity\n debitor_first\n rule_instance_id\n unit_of_measurement\n units_measured\n debitor\n creditor\n debitor_profile_id\n creditor_profile_id\n debitor_approval_time\n creditor_approval_time\n debitor_expiration_time\n creditor_expiration_time\n debitor_rejection_time\n creditor_rejection_time\n approvals {\n id\n rule_instance_id\n transaction_id\n transaction_item_id\n account_name\n account_role\n device_id\n device_latlng\n approval_time\n rejection_time\n expiration_time\n }\n }\n }\n}", - "variables": "{\n \"auth_account\": \"JacobWebb\",\n \"account_name\": \"JacobWebb\"\n}" - } - }, - "url": { - "raw": "{{GRAPHQL_URI}}/query", - "host": [ - "{{GRAPHQL_URI}}" - ], - "path": [ - "query" - ] - } - }, - "response": [] - }, - { - "name": "transactionsByAccount", - "request": { - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/json", - "type": "text" - }, - { - "key": "Authorization", - "value": "{{ID_TOKEN}}", - "type": "text" - } - ], - "body": { - "mode": "graphql", - "graphql": { - "query": "query getTransactionsByAccount($account_name: String!, $auth_account: String!) {\n transactionsByAccount(account_name: $account_name, auth_account: $auth_account) {\n id\n rule_instance_id\n author\n author_device_id\n author_device_latlng\n author_role\n\tsum_value\n\tequilibrium_time\n transaction_items {\n id\n transaction_id\n item_id\n price\n quantity\n debitor_first\n rule_instance_id\n unit_of_measurement\n units_measured\n debitor\n creditor\n debitor_profile_id\n creditor_profile_id\n debitor_approval_time\n creditor_approval_time\n debitor_expiration_time\n creditor_expiration_time\n debitor_rejection_time\n creditor_rejection_time\n approvals {\n id\n rule_instance_id\n transaction_id\n transaction_item_id\n account_name\n account_role\n device_id\n device_latlng\n approval_time\n rejection_time\n expiration_time\n }\n }\n }\n}", - "variables": "{\n \"auth_account\": \"JoeCarter\",\n \"account_name\": \"JoeCarter\"\n}" - } - }, - "url": { - "raw": "{{GRAPHQL_URI}}/query", - "host": [ - "{{GRAPHQL_URI}}" - ], - "path": [ - "query" - ] - } - }, - "response": [] - }, - { - "name": "transactionByID", - "request": { - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/json", - "type": "text" - }, - { - "key": "Authorization", - "value": "{{ID_TOKEN}}", - "type": "text" - } - ], - "body": { - "mode": "graphql", - "graphql": { - "query": "query getTransactionByID($id: String!, $auth_account: String!) {\n transactionByID(id: $id, auth_account: $auth_account) {\n id\n rule_instance_id\n author\n author_device_id\n author_device_latlng\n author_role\n transaction_items {\n id\n transaction_id\n item_id\n price\n quantity\n debitor_first\n rule_instance_id\n unit_of_measurement\n units_measured\n debitor\n creditor\n debitor_profile_id\n creditor_profile_id\n debitor_approval_time\n creditor_approval_time\n debitor_expiration_time\n creditor_expiration_time\n debitor_rejection_time\n creditor_rejection_time\n approvals {\n id\n rule_instance_id\n transaction_id\n transaction_item_id\n account_name\n account_role\n device_id\n device_latlng\n approval_time\n rejection_time\n expiration_time\n }\n }\n }\n}", - "variables": "{\n \"auth_account\": \"JoeCarter\",\n \"id\": \"2\"\n}" - } - }, - "url": { - "raw": "{{GRAPHQL_URI}}/query", - "host": [ - "{{GRAPHQL_URI}}" - ], - "path": [ - "query" - ] - } - }, - "response": [] - } - ] + "info": { + "_postman_id": "a4f412a6-f649-4474-858d-9602adadbb99", + "name": "graphql", + "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json", + "_exporter_id": "2381569" + }, + "item": [ + { + "name": "rules", + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + }, + { + "key": "Authorization", + "value": "{{ID_TOKEN}}", + "type": "text" + } + ], + "body": { + "mode": "graphql", + "graphql": { + "query": "query getRules($transaction: TransactionInput!) {\n rules(transaction: $transaction) {\n id\n rule_instance_id\n author\n author_device_id\n author_device_latlng\n author_role\n sum_value\n transaction_items {\n id\n transaction_id\n item_id\n price\n quantity\n rule_instance_id\n unit_of_measurement\n units_measured\n debitor\n creditor\n debitor_profile_id\n creditor_profile_id\n debitor_approval_time\n creditor_approval_time\n debitor_expiration_time\n creditor_expiration_time\n debitor_rejection_time\n creditor_rejection_time\n }\n }\n}", + "variables": "{\n \"transaction\": {\n \"author\": \"GroceryStore\",\n \"author_device_id\": null,\n \"author_device_latlng\": null,\n \"author_role\": \"creditor\",\n \"debitor_first\": null,\n \"sum_value\": \"18.000\",\n \"transaction_items\": [\n {\n \"item_id\": \"bread\",\n \"price\": \"3.000\",\n \"quantity\": \"2\",\n \"debitor\": \"JacobWebb\",\n \"creditor\": \"GroceryStore\"\n },\n {\n \"item_id\": \"milk\",\n \"price\": \"4.000\",\n \"quantity\": \"3\",\n \"debitor\": \"JacobWebb\",\n \"creditor\": \"GroceryStore\"\n }\n ]\n }\n}" + } + }, + "url": { + "raw": "{{GRAPHQL_URI}}/query", + "host": [ + "{{GRAPHQL_URI}}" + ], + "path": [ + "query" + ] + } + }, + "response": [] + }, + { + "name": "rulesWithApprovers", + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + }, + { + "key": "Authorization", + "value": "{{ID_TOKEN}}", + "type": "text" + } + ], + "body": { + "mode": "graphql", + "graphql": { + "query": "query getRules($transaction: TransactionInput!) {\n rules(transaction: $transaction) {\n id\n rule_instance_id\n author\n author_device_id\n author_device_latlng\n author_role\n sum_value\n transaction_items {\n id\n transaction_id\n item_id\n price\n quantity\n rule_instance_id\n unit_of_measurement\n units_measured\n debitor\n creditor\n debitor_profile_id\n creditor_profile_id\n debitor_approval_time\n creditor_approval_time\n debitor_expiration_time\n creditor_expiration_time\n debitor_rejection_time\n creditor_rejection_time\n approvals {\n id\n rule_instance_id\n transaction_id\n transaction_item_id\n account_name\n account_role\n device_id\n device_latlng\n approval_time\n rejection_time\n expiration_time\n }\n }\n }\n}", + "variables": "{\n \"transaction\": {\n \"author\": \"GroceryStore\",\n \"author_role\": \"creditor\",\n \"sum_value\": \"14.000\",\n \"transaction_items\": [\n {\n \"item_id\": \"milk\",\n \"price\": \"2.000\",\n \"quantity\": \"1\",\n \"debitor\": \"JacobWebb\",\n \"creditor\": \"GroceryStore\"\n },\n {\n \"item_id\": \"bread\",\n \"price\": \"3.000\",\n \"quantity\": \"2\",\n \"debitor\": \"JacobWebb\",\n \"creditor\": \"GroceryStore\"\n }\n ]\n }\n}" + } + }, + "url": { + "raw": "{{GRAPHQL_URI}}/query", + "host": [ + "{{GRAPHQL_URI}}" + ], + "path": [ + "query" + ] + } + }, + "response": [] + }, + { + "name": "rulesBottledWater", + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + }, + { + "key": "Authorization", + "value": "{{ID_TOKEN}}", + "type": "text" + } + ], + "body": { + "mode": "graphql", + "graphql": { + "query": "query getRules($transaction: TransactionInput!) {\n rules(transaction: $transaction) {\n id\n rule_instance_id\n author\n author_device_id\n author_device_latlng\n author_role\n sum_value\n debitor_first\n transaction_items {\n id\n transaction_id\n item_id\n price\n quantity\n rule_instance_id\n unit_of_measurement\n units_measured\n debitor\n creditor\n debitor_profile_id\n creditor_profile_id\n debitor_approval_time\n creditor_approval_time\n debitor_expiration_time\n creditor_expiration_time\n debitor_rejection_time\n creditor_rejection_time\n }\n }\n}", + "variables": "{\n \"transaction\": {\n \"author\": \"GroceryStore\",\n \"author_device_id\": null,\n \"author_device_latlng\": null,\n \"author_role\": \"creditor\",\n \"debitor_first\": null,\n \"sum_value\": \"1.000\",\n \"transaction_items\": [\n {\n \"item_id\": \"bottled water\",\n \"price\": \"1.000\",\n \"quantity\": \"1\",\n \"debitor\": \"JacobWebb\",\n \"creditor\": \"GroceryStore\"\n }\n ]\n }\n}" + } + }, + "url": { + "raw": "{{GRAPHQL_URI}}/query", + "host": [ + "{{GRAPHQL_URI}}" + ], + "path": [ + "query" + ] + } + }, + "response": [] + }, + { + "name": "balance", + "protocolProfileBehavior": { + "disabledSystemHeaders": { + "user-agent": true, + "accept": true, + "accept-encoding": true, + "connection": true + } + }, + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "type": "text", + "disabled": true + }, + { + "key": "Authorization", + "value": "{{ID_TOKEN}}", + "type": "text", + "disabled": true + } + ], + "body": { + "mode": "graphql", + "graphql": { + "query": "query balance($account_name: String!, $auth_account: String!) {\n balance(account_name: $account_name, auth_account: $auth_account)\n}", + "variables": "{\n \"auth_account\": \"StateOfCalifornia\",\n \"account_name\": \"StateOfCalifornia\"\n}" + } + }, + "url": { + "raw": "{{GRAPHQL_URI}}/query", + "host": [ + "{{GRAPHQL_URI}}" + ], + "path": [ + "query" + ] + } + }, + "response": [] + }, + { + "name": "createRequest", + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + }, + { + "key": "Authorization", + "value": "{{ID_TOKEN}}", + "type": "text" + } + ], + "body": { + "mode": "graphql", + "graphql": { + "query": "mutation createRequest($transaction: TransactionInput!, $auth_account: String!) {\n createRequest(transaction: $transaction, auth_account: $auth_account) {\n id\n rule_instance_id\n author\n author_device_id\n author_device_latlng\n author_role\n sum_value\n debitor_first\n transaction_items {\n id\n transaction_id\n item_id\n price\n quantity\n rule_exec_ids\n rule_instance_id\n unit_of_measurement\n units_measured\n debitor\n creditor\n debitor_profile_id\n creditor_profile_id\n debitor_approval_time\n creditor_approval_time\n debitor_expiration_time\n creditor_expiration_time\n debitor_rejection_time\n creditor_rejection_time\n }\n }\n}", + "variables": "{\n \"auth_account\": \"GroceryStore\",\n \"transaction\": {\n \"author\": \"GroceryStore\",\n \"author_role\": \"creditor\",\n \"sum_value\": \"19.620\",\n \"transaction_items\": [\n {\n \"item_id\": \"bread\",\n \"price\": \"3.000\",\n \"quantity\": \"2\",\n \"rule_instance_id\": null,\n \"debitor\": \"JacobWebb\",\n \"creditor\": \"GroceryStore\"\n },\n {\n \"item_id\": \"9% state sales tax\",\n \"price\": \"0.270\",\n \"quantity\": \"2.000\",\n \"rule_instance_id\": \"1\",\n \"debitor\": \"JacobWebb\",\n \"creditor\": \"StateOfCalifornia\"\n },\n {\n \"item_id\": \"milk\",\n \"price\": \"4.000\",\n \"quantity\": \"3\",\n \"rule_instance_id\": null,\n \"debitor\": \"JacobWebb\",\n \"creditor\": \"GroceryStore\"\n },\n {\n \"item_id\": \"9% state sales tax\",\n \"price\": \"0.360\",\n \"quantity\": \"3.000\",\n \"rule_instance_id\": \"1\",\n \"debitor\": \"JacobWebb\",\n \"creditor\": \"StateOfCalifornia\"\n }\n ]\n }\n}" + } + }, + "url": { + "raw": "{{GRAPHQL_URI}}/query", + "host": [ + "{{GRAPHQL_URI}}" + ], + "path": [ + "query" + ] + } + }, + "response": [] + }, + { + "name": "approveRequest", + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + }, + { + "key": "Authorization", + "value": "{{ID_TOKEN}}", + "type": "text" + } + ], + "body": { + "mode": "graphql", + "graphql": { + "query": "mutation approveRequest($id: String!, $account_name: String!, $account_role: String!, $auth_account: String!) {\n approveRequest(id: $id, account_name: $account_name, account_role: $account_role, auth_account: $auth_account) {\n id\n rule_instance_id\n author\n author_device_id\n author_device_latlng\n author_role\n equilibrium_time\n sum_value\n debitor_first\n transaction_items {\n id\n transaction_id\n item_id\n price\n quantity\n rule_instance_id\n unit_of_measurement\n units_measured\n debitor\n creditor\n debitor_profile_id\n creditor_profile_id\n debitor_approval_time\n creditor_approval_time\n debitor_expiration_time\n creditor_expiration_time\n debitor_rejection_time\n creditor_rejection_time\n }\n }\n}", + "variables": "{\n \"id\": \"3\",\n \"account_name\": \"JacobWebb\",\n \"account_role\": \"debitor\",\n \"auth_account\": \"JacobWebb\"\n}" + } + }, + "url": { + "raw": "{{GRAPHQL_URI}}/query", + "host": [ + "{{GRAPHQL_URI}}" + ], + "path": [ + "query" + ] + } + }, + "response": [] + }, + { + "name": "requestByID", + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + }, + { + "key": "Authorization", + "value": "{{ID_TOKEN}}", + "type": "text" + } + ], + "body": { + "mode": "graphql", + "graphql": { + "query": "query getRequestByID($id: String!, $account_name: String!, $auth_account: String!) {\n requestByID(id: $id, account_name: $account_name, auth_account: $auth_account) {\n id\n rule_instance_id\n author\n author_device_id\n author_device_latlng\n author_role\n sum_value\n debitor_first\n transaction_items {\n id\n transaction_id\n item_id\n price\n quantity\n rule_exec_ids\n rule_instance_id\n unit_of_measurement\n units_measured\n debitor\n creditor\n debitor_profile_id\n creditor_profile_id\n debitor_approval_time\n creditor_approval_time\n debitor_expiration_time\n creditor_expiration_time\n debitor_rejection_time\n creditor_rejection_time\n }\n }\n}", + "variables": "{\n \"id\": \"1\",\n \"account_name\": \"JacobWebb\",\n \"auth_account\": \"JacobWebb\"\n}" + } + }, + "url": { + "raw": "{{GRAPHQL_URI}}/query", + "host": [ + "{{GRAPHQL_URI}}" + ], + "path": [ + "query" + ] + } + }, + "response": [] + }, + { + "name": "requestsByAccount", + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + }, + { + "key": "Authorization", + "value": "{{ID_TOKEN}}", + "type": "text" + } + ], + "body": { + "mode": "graphql", + "graphql": { + "query": "query getRequestsByAccount($account_name: String!, $auth_account: String!) {\n requestsByAccount(account_name: $account_name, auth_account: $auth_account) {\n id\n rule_instance_id\n author\n author_device_id\n author_device_latlng\n author_role\n sum_value\n debitor_first\n transaction_items {\n id\n transaction_id\n item_id\n price\n quantity\n rule_instance_id\n unit_of_measurement\n units_measured\n debitor\n creditor\n debitor_profile_id\n creditor_profile_id\n debitor_approval_time\n creditor_approval_time\n debitor_expiration_time\n creditor_expiration_time\n debitor_rejection_time\n creditor_rejection_time\n }\n }\n}", + "variables": "{\n \"account_name\": \"JacobWebb\",\n \"auth_account\": \"JacobWebb\"\n}" + } + }, + "url": { + "raw": "{{GRAPHQL_URI}}/query", + "host": [ + "{{GRAPHQL_URI}}" + ], + "path": [ + "query" + ] + } + }, + "response": [] + }, + { + "name": "transactionsByAccount", + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + }, + { + "key": "Authorization", + "value": "{{ID_TOKEN}}", + "type": "text" + } + ], + "body": { + "mode": "graphql", + "graphql": { + "query": "query getTransactionsByAccount($account_name: String!, $auth_account: String!) {\n transactionsByAccount(account_name: $account_name, auth_account: $auth_account) {\n id\n rule_instance_id\n author\n author_device_id\n author_device_latlng\n author_role\n\tsum_value\n\tequilibrium_time\n transaction_items {\n id\n transaction_id\n item_id\n price\n quantity\n debitor_first\n rule_instance_id\n unit_of_measurement\n units_measured\n debitor\n creditor\n debitor_profile_id\n creditor_profile_id\n debitor_approval_time\n creditor_approval_time\n debitor_expiration_time\n creditor_expiration_time\n debitor_rejection_time\n creditor_rejection_time\n approvals {\n id\n rule_instance_id\n transaction_id\n transaction_item_id\n account_name\n account_role\n device_id\n device_latlng\n approval_time\n rejection_time\n expiration_time\n }\n }\n }\n}", + "variables": "{\n \"auth_account\": \"JoeCarter\",\n \"account_name\": \"JoeCarter\"\n}" + } + }, + "url": { + "raw": "{{GRAPHQL_URI}}/query", + "host": [ + "{{GRAPHQL_URI}}" + ], + "path": [ + "query" + ] + } + }, + "response": [] + }, + { + "name": "transactionByID", + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + }, + { + "key": "Authorization", + "value": "{{ID_TOKEN}}", + "type": "text" + } + ], + "body": { + "mode": "graphql", + "graphql": { + "query": "query getTransactionByID($id: String!, $account_name: String!, $auth_account: String!) {\n transactionByID(id: $id, account_name: $account_name, auth_account: $auth_account) {\n id\n rule_instance_id\n equilibrium_time\n author\n author_device_id\n author_device_latlng\n author_role\n sum_value\n debitor_first\n transaction_items {\n id\n transaction_id\n item_id\n price\n quantity\n rule_instance_id\n unit_of_measurement\n units_measured\n debitor\n creditor\n debitor_profile_id\n creditor_profile_id\n debitor_approval_time\n creditor_approval_time\n debitor_expiration_time\n creditor_expiration_time\n debitor_rejection_time\n creditor_rejection_time\n }\n }\n}", + "variables": "{\n \"auth_account\": \"JoeCarter\",\n \"account_name\": \"JoeCarter\",\n \"id\": \"2\"\n}" + } + }, + "url": { + "raw": "{{GRAPHQL_URI}}/query", + "host": [ + "{{GRAPHQL_URI}}" + ], + "path": [ + "query" + ] + } + }, + "response": [] + } + ] } \ No newline at end of file diff --git a/services/graphql/src/main.rs b/services/graphql/src/main.rs index 8e28b08dd..fcdc11210 100644 --- a/services/graphql/src/main.rs +++ b/services/graphql/src/main.rs @@ -2,7 +2,6 @@ use ::types::{ account_role::AccountRole, request_response::{IntraTransaction, IntraTransactions, RequestApprove}, transaction::Transaction, - transaction_item::{TransactionItem, TransactionItems}, }; use ::wsclient::WsClient; use async_graphql::*; @@ -119,11 +118,11 @@ impl Query { #[graphql(name = "rules")] async fn rules( &self, - #[graphql(name = "transaction_items")] transaction_items: Vec, + #[graphql(name = "transaction")] transaction: Transaction, ) -> Transaction { let uri = Uri::new_from_env_var("RULE_URL").to_string(); let client = Client::new(); - let body = json!(transaction_items).to_string(); + let body = json!(transaction).to_string(); let response = client.post(uri, body).await.unwrap(); let response_body = response.text().await.unwrap(); let intra_transaction: IntraTransaction = serde_json::from_str(&response_body).unwrap(); @@ -138,20 +137,13 @@ impl Mutation { async fn create_request( &self, ctx: &Context<'_>, - #[graphql(name = "transaction_items")] transaction_items: Vec, + #[graphql(name = "transaction")] transaction: Transaction, #[graphql(name = "auth_account")] auth_account: String, ) -> Transaction { let account_from_token = get_auth_account(ctx, auth_account).unwrap(); let uri = Uri::new_from_env_var("REQUEST_CREATE_URL").to_string(); let client = Client::new(); - let request = IntraTransaction::new( - account_from_token.clone(), - Transaction::new( - account_from_token, - None, - TransactionItems::from(transaction_items), - ), - ); + let request = IntraTransaction::new(account_from_token, transaction); let body = json!(request).to_string(); let response = client.post(uri, body).await.unwrap(); let response_body = response.text().await.unwrap(); diff --git a/services/request-create/Cargo.toml b/services/request-create/Cargo.toml index 54f6a5acc..630f05d91 100644 --- a/services/request-create/Cargo.toml +++ b/services/request-create/Cargo.toml @@ -6,6 +6,7 @@ rust-version.workspace = true [dependencies] axum = "0.8" +serde_json = "1" tracing = "0.1" tracing-subscriber = { version = "0.3", features = ["env-filter"] } tokio = { version = "1.49", features = ["macros", "rt-multi-thread"] } diff --git a/services/request-create/src/main.rs b/services/request-create/src/main.rs index 383b11328..4f6b1d075 100644 --- a/services/request-create/src/main.rs +++ b/services/request-create/src/main.rs @@ -14,10 +14,7 @@ use shutdown::shutdown_signal; use std::{env, error::Error, net::ToSocketAddrs, sync::Arc}; use thiserror::Error; use tokio::net::TcpListener; -use types::{ - request_response::IntraTransaction, transaction::Transaction, - transaction_item::TransactionItems, -}; +use types::{request_response::IntraTransaction, transaction::Transaction}; use uribuilder::Uri; #[derive(Clone)] @@ -39,16 +36,14 @@ enum RequestCreateError { MissingAuthorRole, #[error("sum_value failure")] SumValueFailure, - #[error("missing debitor_first values in request")] - MissingDebitorFirstValues, } pub async fn get_rule_applied_transaction( - transaction_items: TransactionItems, + transaction: Transaction, ) -> Result> { let uri = Uri::new_from_env_var("RULE_URL").to_string(); let client = Client::new(); - let body = transaction_items.to_json_string(); + let body = serde_json::to_string(&transaction)?; let response = client.post(uri, body).await?; let rule_tested = response.text().await.unwrap(); let intra_transaction = IntraTransaction::from_json_string(rule_tested.as_str())?; @@ -72,23 +67,27 @@ async fn test_values(req: IntraTransaction) -> Result bool { - // todo: test transaction item values in request - let _ = tr_items; +pub fn expected_values(transaction: &Transaction) -> bool { + // todo: test transaction values in request + let _ = transaction; true } -pub fn create_response(transtaction_items: TransactionItems) -> IntraTransaction { +pub fn create_response( + transaction_items: TransactionItems, + source_transaction: &Transaction, +) -> IntraTransaction { IntraTransaction { auth_account: None, transaction: Transaction { id: None, rule_instance_id: None, - author: None, - author_device_id: None, - author_device_latlng: None, - author_role: None, + author: source_transaction.author.clone(), + author_device_id: source_transaction.author_device_id.clone(), + author_device_latlng: source_transaction.author_device_latlng.clone(), + author_role: source_transaction.author_role, equilibrium_time: None, - sum_value: transtaction_items.sum_value(), - transaction_items: transtaction_items, + debitor_first: source_transaction.debitor_first, + sum_value: transaction_items.sum_value(), + transaction_items, }, } } @@ -111,7 +115,6 @@ mod tests { item_id: String::from("9% state sales taxk"), price: String::from("0.270"), quantity: String::from("2.000"), - debitor_first: Some(false), rule_instance_id: None, rule_exec_ids: Some(vec![]), unit_of_measurement: None, diff --git a/services/rule/src/main.rs b/services/rule/src/main.rs index 6256b09b4..db3a61dce 100644 --- a/services/rule/src/main.rs +++ b/services/rule/src/main.rs @@ -17,6 +17,7 @@ use types::{ account_role::{RoleSequence, CREDITOR_FIRST, DEBITOR_FIRST}, request_response::IntraTransaction, time::TZTime, + transaction::Transaction, transaction_item::TransactionItems, }; mod rules; @@ -189,28 +190,24 @@ async fn apply_approval_rules<'a>( async fn apply_rules( State(state): State, - transaction_items: Json, + transaction: Json, ) -> Result, StatusCode> { - if !expected_values(&transaction_items) { + if !expected_values(&transaction) { return Err(StatusCode::BAD_REQUEST); }; - let mut role_sequence = CREDITOR_FIRST; + let debitor_first = transaction.debitor_first.unwrap_or(false); + let role_sequence = if debitor_first { + DEBITOR_FIRST + } else { + CREDITOR_FIRST + }; - let mut transaction_items = transaction_items.clone(); + let mut transaction_items = transaction.transaction_items.clone(); // set defaults for None values - transaction_items.set_debitor_first_default(); transaction_items.set_empty_rule_exec_ids(); - match transaction_items.is_debitor_first() { - Ok(true) => role_sequence = DEBITOR_FIRST, - Ok(false) => {} - Err(_e) => { - return Err(StatusCode::BAD_REQUEST); - } - } - // get connection from pool let conn = state.pool.get_conn().await; @@ -233,9 +230,9 @@ async fn apply_rules( let labeled_approved = label_approved_transaction_items(&role_sequence, rule_applied_tr_items); - let transaction = create_response(labeled_approved); + let response_transaction = create_response(labeled_approved, &transaction); - let response = axum::Json(transaction); + let response = axum::Json(response_transaction); Ok(response) } diff --git a/services/rule/src/rules/transaction_item.rs b/services/rule/src/rules/transaction_item.rs index 7b2dc0bfc..427942f3d 100644 --- a/services/rule/src/rules/transaction_item.rs +++ b/services/rule/src/rules/transaction_item.rs @@ -36,7 +36,6 @@ fn multiply_item_value( let price: f32 = transaction_item.price.clone().parse().unwrap(); let quantity = utils::number_to_fixed_string(transaction_item.quantity.clone().parse::().unwrap()); - let rule_apply_sequence = transaction_item.debitor_first; let rule_instance_id = rule_instance.id.clone().unwrap(); let unit_of_measurement = transaction_item.unit_of_measurement.clone(); let units_measured = transaction_item.units_measured.clone(); @@ -68,7 +67,6 @@ fn multiply_item_value( item_id: item_name, price: added_item_value, quantity, - debitor_first: rule_apply_sequence, rule_instance_id: Some(rule_instance_id), rule_exec_ids: Some(vec![rule_exec_id]), unit_of_measurement, diff --git a/tests/src/integration_tests.rs b/tests/src/integration_tests.rs index 95012c911..58b411aab 100644 --- a/tests/src/integration_tests.rs +++ b/tests/src/integration_tests.rs @@ -12,10 +12,9 @@ mod tests { use super::*; use crate::requests as r; use regex::Regex; - use serde::Deserialize; use std::{fs::File, io::BufReader}; use types::{ - account_role::AccountRole, request_response::IntraTransaction, + account_role::AccountRole, request_response::IntraTransaction, transaction::Transaction, transaction_item::TransactionItem, }; @@ -23,11 +22,6 @@ mod tests { const DATE_RE: &str = r"\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z)"; - #[derive(Debug, Deserialize)] - pub struct TransactionItemsBody { - pub transaction_items: Vec, - } - #[tokio::test] #[cfg_attr(not(feature = "integration_tests"), ignore)] async fn http_rule_adds_2_objects() { @@ -35,9 +29,9 @@ mod tests { let file = File::open("../tests/testdata/nullFirstTrItemsNoAppr.json").unwrap(); let reader = BufReader::new(file); - let test_transaction_items: Vec = serde_json::from_reader(reader).unwrap(); + let test_transaction: Transaction = serde_json::from_reader(reader).unwrap(); - let got = r::get_rules_http(test_transaction_items.clone()).await; + let got = r::get_rules_http(test_transaction.clone()).await; let got_rule_added_transaction_items: Vec = got .transaction .transaction_items @@ -368,16 +362,13 @@ mod tests { let file = File::open("../tests/testdata/intRules.json").unwrap(); let reader = BufReader::new(file); - let test_transaction_items: TransactionItemsBody = serde_json::from_reader(reader).unwrap(); + let test_transaction: Transaction = serde_json::from_reader(reader).unwrap(); - let rule_tested_transaction = - r::get_rules_gql(test_transaction_items.transaction_items.clone()) - .await - .unwrap(); + let rule_tested_transaction = r::get_rules_gql(test_transaction.clone()).await.unwrap(); let got = r::create_request_gql( - test_transaction_items.transaction_items[0].creditor.clone(), - rule_tested_transaction.transaction_items.0, + test_transaction.transaction_items.0[0].creditor.clone(), + rule_tested_transaction, ) .await; @@ -392,19 +383,16 @@ mod tests { let file = File::open("../tests/testdata/intRules.json").unwrap(); let reader = BufReader::new(file); - let test_transaction_items: TransactionItemsBody = serde_json::from_reader(reader).unwrap(); + let test_transaction: Transaction = serde_json::from_reader(reader).unwrap(); - let rule_tested_transaction = - r::get_rules_gql(test_transaction_items.transaction_items.clone()) - .await - .unwrap(); + let rule_tested_transaction = r::get_rules_gql(test_transaction.clone()).await.unwrap(); - let test_creditor = test_transaction_items.transaction_items[0].creditor.clone(); + let test_creditor = test_transaction.transaction_items.0[0].creditor.clone(); let transaction_request = - r::create_request_gql(test_creditor, rule_tested_transaction.transaction_items.0).await; + r::create_request_gql(test_creditor, rule_tested_transaction).await; - let test_debitor = test_transaction_items.transaction_items[0].debitor.clone(); + let test_debitor = test_transaction.transaction_items.0[0].debitor.clone(); let got = r::approve_request_gql( transaction_request.id.unwrap(), @@ -643,8 +631,8 @@ mod tests { // call rule service (reuse existing testdata - bread $3 x 2) let file = File::open("../tests/testdata/nullFirstTrItemsNoAppr.json").unwrap(); let reader = BufReader::new(file); - let test_items: Vec = serde_json::from_reader(reader).unwrap(); - let got = r::get_rules_http(test_items).await; + let test_transaction: Transaction = serde_json::from_reader(reader).unwrap(); + let got = r::get_rules_http(test_transaction).await; // restore original h::set_cached_state_rule("California", &modified, &original).await; diff --git a/tests/src/requests.rs b/tests/src/requests.rs index 5b95b92d8..455b6ea0a 100644 --- a/tests/src/requests.rs +++ b/tests/src/requests.rs @@ -1,4 +1,5 @@ use ::types::{ + account_role::AccountRole, request_response::{IntraTransaction, IntraTransactions}, time::TZTime, transaction::Transaction, @@ -57,7 +58,6 @@ pub struct TransactionItemInput { pub item_id: String, pub price: String, pub quantity: String, - pub debitor_first: Option, pub rule_instance_id: Option, pub rule_exec_ids: Option>, pub unit_of_measurement: Option, @@ -82,7 +82,6 @@ impl From for TransactionItemInput { item_id: item.item_id, price: item.price, quantity: item.quantity, - debitor_first: item.debitor_first, rule_instance_id: item.rule_instance_id, rule_exec_ids: item.rule_exec_ids, unit_of_measurement: item.unit_of_measurement, @@ -111,20 +110,51 @@ fn convert_to_input_vec(transaction_items: Vec) -> Vec, + pub rule_instance_id: Option, + pub author: Option, + pub author_device_id: Option, + pub author_device_latlng: Option, + pub author_role: Option, + pub equilibrium_time: Option, + pub debitor_first: Option, + pub sum_value: String, + pub transaction_items: Vec, +} + +impl From for TransactionInput { + fn from(t: Transaction) -> Self { + TransactionInput { + id: t.id, + rule_instance_id: t.rule_instance_id, + author: t.author, + author_device_id: t.author_device_id, + author_device_latlng: t.author_device_latlng, + author_role: t.author_role, + equilibrium_time: t.equilibrium_time, + debitor_first: t.debitor_first, + sum_value: t.sum_value, + transaction_items: convert_to_input_vec(t.transaction_items.0), + } + } +} + #[derive(Debug, Serialize)] struct RuleVars { - transaction_items: Vec, + transaction: TransactionInput, } pub async fn get_rules_gql( - transaction_items: Vec, + transaction: Transaction, ) -> Result> { let graphql_resource = std::env::var("GRAPHQL_RESOURCE").unwrap(); let uri = Uri::new_from_env_var("GRAPHQL_URI") .with_path(graphql_resource.as_str()) .to_string(); - let query = r#"query getRules($transaction_items: [TransactionItemInput!]) { - rules(transaction_items: $transaction_items) { + let query = r#"query getRules($transaction: TransactionInput!) { + rules(transaction: $transaction) { id rule_instance_id author @@ -132,13 +162,13 @@ pub async fn get_rules_gql( author_device_latlng author_role sum_value + debitor_first transaction_items { id transaction_id item_id price quantity - debitor_first rule_instance_id unit_of_measurement units_measured @@ -156,7 +186,7 @@ pub async fn get_rules_gql( } }"#; let variables = RuleVars { - transaction_items: convert_to_input_vec(transaction_items), + transaction: TransactionInput::from(transaction), }; let client = GqlClient::new(uri); let res = client @@ -170,7 +200,7 @@ pub async fn get_rules_gql( #[derive(Debug, Serialize)] struct CreateRequestVars { auth_account: String, - transaction_items: Vec, + transaction: TransactionInput, } #[derive(Debug, Deserialize)] @@ -179,16 +209,13 @@ struct CreateRequestResponse { create_request: Transaction, } -pub async fn create_request_gql( - auth_account: String, - transaction_items: Vec, -) -> Transaction { +pub async fn create_request_gql(auth_account: String, transaction: Transaction) -> Transaction { let graphql_resource = std::env::var("GRAPHQL_RESOURCE").unwrap(); let uri = Uri::new_from_env_var("GRAPHQL_URI") .with_path(graphql_resource.as_str()) .to_string(); - let query = r#"mutation createRequest($transaction_items: [TransactionItemInput!], $auth_account: String!) { - createRequest(transaction_items: $transaction_items, auth_account: $auth_account) { + let query = r#"mutation createRequest($transaction: TransactionInput!, $auth_account: String!) { + createRequest(transaction: $transaction, auth_account: $auth_account) { id rule_instance_id author @@ -196,6 +223,7 @@ pub async fn create_request_gql( author_device_latlng author_role sum_value + debitor_first transaction_items { id transaction_id @@ -203,7 +231,6 @@ pub async fn create_request_gql( price rule_exec_ids quantity - debitor_first rule_instance_id unit_of_measurement units_measured @@ -222,7 +249,7 @@ pub async fn create_request_gql( }"#; let variables = CreateRequestVars { auth_account, - transaction_items: convert_to_input_vec(transaction_items), + transaction: TransactionInput::from(transaction), }; let client = GqlClient::new(uri); let res = client @@ -267,13 +294,13 @@ pub async fn approve_request_gql( author_role equilibrium_time sum_value + debitor_first transaction_items { id transaction_id item_id price quantity - debitor_first rule_instance_id unit_of_measurement units_measured @@ -342,7 +369,6 @@ pub async fn get_transactions_by_account_gql( item_id price quantity - debitor_first rule_instance_id unit_of_measurement units_measured @@ -407,13 +433,13 @@ pub async fn get_transaction_by_id_gql( author_device_latlng author_role sum_value + debitor_first transaction_items { id transaction_id item_id price quantity - debitor_first rule_instance_id unit_of_measurement units_measured @@ -473,13 +499,13 @@ pub async fn get_requests_by_account_gql( author_device_latlng author_role sum_value + debitor_first transaction_items { id transaction_id item_id price quantity - debitor_first rule_instance_id unit_of_measurement units_measured @@ -541,13 +567,13 @@ pub async fn get_request_by_id_gql( author_device_latlng author_role sum_value + debitor_first transaction_items { id transaction_id item_id price quantity - debitor_first rule_instance_id unit_of_measurement units_measured @@ -578,10 +604,10 @@ pub async fn get_request_by_id_gql( res.request_by_id } -pub async fn get_rules_http(transaction_items: Vec) -> IntraTransaction { +pub async fn get_rules_http(transaction: Transaction) -> IntraTransaction { let client = Client::new(); let uri = Uri::new_from_env_var("RULE_URL").to_string(); - let body_json = json!(transaction_items).to_string(); + let body_json = json!(transaction).to_string(); let response = client.post(uri, body_json).await.unwrap(); let response_string = response.text().await.unwrap(); serde_json::from_str(&response_string).unwrap() diff --git a/tests/testdata/allRuleInstanceIDs.json b/tests/testdata/allRuleInstanceIDs.json index b686081cd..951634c06 100644 --- a/tests/testdata/allRuleInstanceIDs.json +++ b/tests/testdata/allRuleInstanceIDs.json @@ -14,7 +14,6 @@ "item_id": "9% state sales tax", "price": "0.180", "quantity": "1.000", - "debitor_first": null, "rule_instance_id": "1", "unit_of_measurement": null, "units_measured": null, @@ -35,7 +34,6 @@ "item_id": "9% state sales tax", "price": "0.270", "quantity": "2.000", - "debitor_first": null, "rule_instance_id": "1", "unit_of_measurement": null, "units_measured": null, @@ -56,7 +54,6 @@ "item_id": "9% state sales tax", "price": "0.360", "quantity": "3.000", - "debitor_first": null, "rule_instance_id": "1", "unit_of_measurement": null, "units_measured": null, @@ -77,7 +74,6 @@ "item_id": "milk", "price": "2.000", "quantity": "1", - "debitor_first": null, "rule_instance_id": "1", "unit_of_measurement": null, "units_measured": null, @@ -98,7 +94,6 @@ "item_id": "bread", "price": "3.000", "quantity": "2", - "debitor_first": null, "rule_instance_id": "1", "unit_of_measurement": null, "units_measured": null, @@ -119,7 +114,6 @@ "item_id": "eggs", "price": "4.000", "quantity": "3", - "debitor_first": null, "rule_instance_id": "1", "unit_of_measurement": null, "units_measured": null, @@ -136,4 +130,4 @@ } ] } -} \ No newline at end of file +} diff --git a/tests/testdata/bottledWater.json b/tests/testdata/bottledWater.json index 90d168161..8627f617f 100644 --- a/tests/testdata/bottledWater.json +++ b/tests/testdata/bottledWater.json @@ -5,7 +5,6 @@ "item_id": "bottled water", "price": "1.000", "quantity": "1", - "debitor_first": null, "rule_instance_id": null, "rule_exec_ids": [], "unit_of_measurement": null, diff --git a/tests/testdata/crFirstTrItems.json b/tests/testdata/crFirstTrItems.json index b90132155..cddb2cf7c 100644 --- a/tests/testdata/crFirstTrItems.json +++ b/tests/testdata/crFirstTrItems.json @@ -5,7 +5,6 @@ "item_id": "bread", "price": "3.000", "quantity": "2", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": [], "unit_of_measurement": null, @@ -27,7 +26,6 @@ "item_id": "milk", "price": "4.000", "quantity": "3", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": [], "unit_of_measurement": null, diff --git a/tests/testdata/dbFirstTrItems.json b/tests/testdata/dbFirstTrItems.json index 1a823c366..cddb2cf7c 100644 --- a/tests/testdata/dbFirstTrItems.json +++ b/tests/testdata/dbFirstTrItems.json @@ -5,7 +5,6 @@ "item_id": "bread", "price": "3.000", "quantity": "2", - "debitor_first": true, "rule_instance_id": null, "rule_exec_ids": [], "unit_of_measurement": null, @@ -27,7 +26,6 @@ "item_id": "milk", "price": "4.000", "quantity": "3", - "debitor_first": true, "rule_instance_id": null, "rule_exec_ids": [], "unit_of_measurement": null, diff --git a/tests/testdata/failFirstTrItems.json b/tests/testdata/failFirstTrItems.json index 4617f2c8f..cddb2cf7c 100644 --- a/tests/testdata/failFirstTrItems.json +++ b/tests/testdata/failFirstTrItems.json @@ -5,7 +5,6 @@ "item_id": "bread", "price": "3.000", "quantity": "2", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": [], "unit_of_measurement": null, @@ -27,7 +26,6 @@ "item_id": "milk", "price": "4.000", "quantity": "3", - "debitor_first": true, "rule_instance_id": null, "rule_exec_ids": [], "unit_of_measurement": null, diff --git a/tests/testdata/intRules.json b/tests/testdata/intRules.json index a12b34b60..e28076546 100644 --- a/tests/testdata/intRules.json +++ b/tests/testdata/intRules.json @@ -1,4 +1,13 @@ { + "id": null, + "rule_instance_id": null, + "author": "GroceryStore", + "author_device_id": null, + "author_device_latlng": null, + "author_role": "creditor", + "equilibrium_time": null, + "debitor_first": null, + "sum_value": "23.500", "transaction_items": [ { "id": null, @@ -6,7 +15,6 @@ "item_id": "candles", "price": "2.000", "quantity": "3", - "debitor_first": null, "rule_instance_id": null, "unit_of_measurement": null, "units_measured": null, @@ -27,7 +35,6 @@ "item_id": "olive oil", "price": "8.000", "quantity": "2", - "debitor_first": null, "rule_instance_id": null, "unit_of_measurement": null, "units_measured": null, @@ -48,7 +55,6 @@ "item_id": "cranberries", "price": "1.500", "quantity": "1", - "debitor_first": null, "rule_instance_id": null, "unit_of_measurement": null, "units_measured": null, @@ -64,4 +70,4 @@ "creditor_rejection_time": null } ] -} \ No newline at end of file +} diff --git a/tests/testdata/nullFirstTrItems.json b/tests/testdata/nullFirstTrItems.json index dc09a80c5..28c196733 100644 --- a/tests/testdata/nullFirstTrItems.json +++ b/tests/testdata/nullFirstTrItems.json @@ -5,7 +5,6 @@ "item_id": "bread", "price": "3.000", "quantity": "2", - "debitor_first": null, "rule_instance_id": null, "rule_exec_ids": [], "unit_of_measurement": null, @@ -28,7 +27,6 @@ "item_id": "milk", "price": "4.000", "quantity": "3", - "debitor_first": null, "rule_instance_id": null, "rule_exec_ids": [], "unit_of_measurement": null, diff --git a/tests/testdata/nullFirstTrItemsNoAppr.json b/tests/testdata/nullFirstTrItemsNoAppr.json index 4958e8260..6ea797110 100644 --- a/tests/testdata/nullFirstTrItemsNoAppr.json +++ b/tests/testdata/nullFirstTrItemsNoAppr.json @@ -1,44 +1,53 @@ -[ - { - "id": null, - "transaction_id": null, - "item_id": "bread", - "price": "3.000", - "quantity": "2", - "debitor_first": null, - "rule_instance_id": null, - "unit_of_measurement": null, - "units_measured": null, - "debitor": "JacobWebb", - "creditor": "GroceryStore", - "debitor_profile_id": null, - "creditor_profile_id": null, - "debitor_approval_time": null, - "creditor_approval_time": null, - "debitor_expiration_time": null, - "creditor_expiration_time": null, - "debitor_rejection_time": null, - "creditor_rejection_time": null - }, - { - "id": null, - "transaction_id": null, - "item_id": "milk", - "price": "4.000", - "quantity": "3", - "debitor_first": null, - "rule_instance_id": null, - "unit_of_measurement": null, - "units_measured": null, - "debitor": "JacobWebb", - "creditor": "GroceryStore", - "debitor_profile_id": null, - "creditor_profile_id": null, - "debitor_approval_time": null, - "creditor_approval_time": null, - "debitor_expiration_time": null, - "creditor_expiration_time": null, - "debitor_rejection_time": null, - "creditor_rejection_time": null - } -] \ No newline at end of file +{ + "id": null, + "rule_instance_id": null, + "author": "GroceryStore", + "author_device_id": null, + "author_device_latlng": null, + "author_role": "creditor", + "equilibrium_time": null, + "debitor_first": null, + "sum_value": "18.000", + "transaction_items": [ + { + "id": null, + "transaction_id": null, + "item_id": "bread", + "price": "3.000", + "quantity": "2", + "rule_instance_id": null, + "unit_of_measurement": null, + "units_measured": null, + "debitor": "JacobWebb", + "creditor": "GroceryStore", + "debitor_profile_id": null, + "creditor_profile_id": null, + "debitor_approval_time": null, + "creditor_approval_time": null, + "debitor_expiration_time": null, + "creditor_expiration_time": null, + "debitor_rejection_time": null, + "creditor_rejection_time": null + }, + { + "id": null, + "transaction_id": null, + "item_id": "milk", + "price": "4.000", + "quantity": "3", + "rule_instance_id": null, + "unit_of_measurement": null, + "units_measured": null, + "debitor": "JacobWebb", + "creditor": "GroceryStore", + "debitor_profile_id": null, + "creditor_profile_id": null, + "debitor_approval_time": null, + "creditor_approval_time": null, + "debitor_expiration_time": null, + "creditor_expiration_time": null, + "debitor_rejection_time": null, + "creditor_rejection_time": null + } + ] +} diff --git a/tests/testdata/preRuleTrItems.json b/tests/testdata/preRuleTrItems.json index 4958e8260..6ea797110 100644 --- a/tests/testdata/preRuleTrItems.json +++ b/tests/testdata/preRuleTrItems.json @@ -1,44 +1,53 @@ -[ - { - "id": null, - "transaction_id": null, - "item_id": "bread", - "price": "3.000", - "quantity": "2", - "debitor_first": null, - "rule_instance_id": null, - "unit_of_measurement": null, - "units_measured": null, - "debitor": "JacobWebb", - "creditor": "GroceryStore", - "debitor_profile_id": null, - "creditor_profile_id": null, - "debitor_approval_time": null, - "creditor_approval_time": null, - "debitor_expiration_time": null, - "creditor_expiration_time": null, - "debitor_rejection_time": null, - "creditor_rejection_time": null - }, - { - "id": null, - "transaction_id": null, - "item_id": "milk", - "price": "4.000", - "quantity": "3", - "debitor_first": null, - "rule_instance_id": null, - "unit_of_measurement": null, - "units_measured": null, - "debitor": "JacobWebb", - "creditor": "GroceryStore", - "debitor_profile_id": null, - "creditor_profile_id": null, - "debitor_approval_time": null, - "creditor_approval_time": null, - "debitor_expiration_time": null, - "creditor_expiration_time": null, - "debitor_rejection_time": null, - "creditor_rejection_time": null - } -] \ No newline at end of file +{ + "id": null, + "rule_instance_id": null, + "author": "GroceryStore", + "author_device_id": null, + "author_device_latlng": null, + "author_role": "creditor", + "equilibrium_time": null, + "debitor_first": null, + "sum_value": "18.000", + "transaction_items": [ + { + "id": null, + "transaction_id": null, + "item_id": "bread", + "price": "3.000", + "quantity": "2", + "rule_instance_id": null, + "unit_of_measurement": null, + "units_measured": null, + "debitor": "JacobWebb", + "creditor": "GroceryStore", + "debitor_profile_id": null, + "creditor_profile_id": null, + "debitor_approval_time": null, + "creditor_approval_time": null, + "debitor_expiration_time": null, + "creditor_expiration_time": null, + "debitor_rejection_time": null, + "creditor_rejection_time": null + }, + { + "id": null, + "transaction_id": null, + "item_id": "milk", + "price": "4.000", + "quantity": "3", + "rule_instance_id": null, + "unit_of_measurement": null, + "units_measured": null, + "debitor": "JacobWebb", + "creditor": "GroceryStore", + "debitor_profile_id": null, + "creditor_profile_id": null, + "debitor_approval_time": null, + "creditor_approval_time": null, + "debitor_expiration_time": null, + "creditor_expiration_time": null, + "debitor_rejection_time": null, + "creditor_rejection_time": null + } + ] +} diff --git a/tests/testdata/requests.json b/tests/testdata/requests.json index bf75a7898..12beeb453 100644 --- a/tests/testdata/requests.json +++ b/tests/testdata/requests.json @@ -9,6 +9,7 @@ "author_device_latlng": null, "author_role": "creditor", "equilibrium_time": null, + "debitor_first": false, "sum_value": "21.800", "transaction_items": [ { @@ -17,7 +18,6 @@ "item_id": "9% state sales tax", "price": "0.180", "quantity": "1.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -93,7 +93,6 @@ "item_id": "9% state sales tax", "price": "0.270", "quantity": "2.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -169,7 +168,6 @@ "item_id": "9% state sales tax", "price": "0.360", "quantity": "3.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -245,7 +243,6 @@ "item_id": "milk", "price": "2.000", "quantity": "1", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -308,7 +305,6 @@ "item_id": "bread", "price": "3.000", "quantity": "2", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -371,7 +367,6 @@ "item_id": "eggs", "price": "4.000", "quantity": "3", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -441,6 +436,7 @@ "author_device_latlng": null, "author_role": "creditor", "equilibrium_time": null, + "debitor_first": false, "sum_value": "25.615", "transaction_items": [ { @@ -449,7 +445,6 @@ "item_id": "9% state sales tax", "price": "0.180", "quantity": "3.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -525,7 +520,6 @@ "item_id": "9% state sales tax", "price": "0.720", "quantity": "2.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -601,7 +595,6 @@ "item_id": "9% state sales tax", "price": "0.135", "quantity": "1.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -677,7 +670,6 @@ "item_id": "candle", "price": "2.000", "quantity": "3", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -740,7 +732,6 @@ "item_id": "olive oil", "price": "8.000", "quantity": "2", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -803,7 +794,6 @@ "item_id": "cranberries", "price": "1.500", "quantity": "1", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -873,6 +863,7 @@ "author_device_latlng": null, "author_role": "creditor", "equilibrium_time": null, + "debitor_first": false, "sum_value": "22.345", "transaction_items": [ { @@ -881,7 +872,6 @@ "item_id": "9% state sales tax", "price": "0.540", "quantity": "2.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -957,7 +947,6 @@ "item_id": "9% state sales tax", "price": "0.225", "quantity": "1.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -1033,7 +1022,6 @@ "item_id": "9% state sales tax", "price": "0.270", "quantity": "2.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -1109,7 +1097,6 @@ "item_id": "shrimp", "price": "6.000", "quantity": "2", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -1172,7 +1159,6 @@ "item_id": "lettuce", "price": "2.500", "quantity": "1", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -1235,7 +1221,6 @@ "item_id": "bleach", "price": "3.000", "quantity": "2", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -1305,6 +1290,7 @@ "author_device_latlng": null, "author_role": "creditor", "equilibrium_time": null, + "debitor_first": false, "sum_value": "18.530", "transaction_items": [ { @@ -1313,7 +1299,6 @@ "item_id": "9% state sales tax", "price": "0.225", "quantity": "2.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -1389,7 +1374,6 @@ "item_id": "9% state sales tax", "price": "0.540", "quantity": "1.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -1465,7 +1449,6 @@ "item_id": "9% state sales tax", "price": "0.270", "quantity": "2.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -1541,7 +1524,6 @@ "item_id": "croissants", "price": "2.500", "quantity": "2", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -1604,7 +1586,6 @@ "item_id": "sterilizer", "price": "6.000", "quantity": "1", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -1667,7 +1648,6 @@ "item_id": "toothpaste", "price": "3.000", "quantity": "2", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -1737,6 +1717,7 @@ "author_device_latlng": null, "author_role": "creditor", "equilibrium_time": null, + "debitor_first": false, "sum_value": "20.165", "transaction_items": [ { @@ -1745,7 +1726,6 @@ "item_id": "9% state sales tax", "price": "0.315", "quantity": "1.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -1821,7 +1801,6 @@ "item_id": "9% state sales tax", "price": "0.090", "quantity": "7.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -1897,7 +1876,6 @@ "item_id": "9% state sales tax", "price": "0.360", "quantity": "2.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -1973,7 +1951,6 @@ "item_id": "glass cleaner", "price": "3.500", "quantity": "1", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -2036,7 +2013,6 @@ "item_id": "grapefruit", "price": "1.000", "quantity": "7", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -2099,7 +2075,6 @@ "item_id": "ground coffee", "price": "4.000", "quantity": "2", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -2169,6 +2144,7 @@ "author_device_latlng": null, "author_role": "creditor", "equilibrium_time": null, + "debitor_first": false, "sum_value": "13.625", "transaction_items": [ { @@ -2177,7 +2153,6 @@ "item_id": "9% state sales tax", "price": "0.270", "quantity": "2.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -2253,7 +2228,6 @@ "item_id": "9% state sales tax", "price": "0.270", "quantity": "1.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -2329,7 +2303,6 @@ "item_id": "9% state sales tax", "price": "0.315", "quantity": "1.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -2405,7 +2378,6 @@ "item_id": "butter", "price": "3.000", "quantity": "2", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -2468,7 +2440,6 @@ "item_id": "shampoo", "price": "3.000", "quantity": "1", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -2531,7 +2502,6 @@ "item_id": "dish soap", "price": "3.500", "quantity": "1", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -2601,6 +2571,7 @@ "author_device_latlng": null, "author_role": "creditor", "equilibrium_time": null, + "debitor_first": false, "sum_value": "4.360", "transaction_items": [ { @@ -2609,7 +2580,6 @@ "item_id": "9% state sales tax", "price": "0.090", "quantity": "1.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -2685,7 +2655,6 @@ "item_id": "9% state sales tax", "price": "0.090", "quantity": "1.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -2761,7 +2730,6 @@ "item_id": "9% state sales tax", "price": "0.180", "quantity": "1.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -2837,7 +2805,6 @@ "item_id": "pepper", "price": "1.000", "quantity": "1", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -2900,7 +2867,6 @@ "item_id": "salt", "price": "1.000", "quantity": "1", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -2963,7 +2929,6 @@ "item_id": "seasoning", "price": "2.000", "quantity": "1", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -3033,6 +2998,7 @@ "author_device_latlng": null, "author_role": "creditor", "equilibrium_time": null, + "debitor_first": false, "sum_value": "15.805", "transaction_items": [ { @@ -3041,7 +3007,6 @@ "item_id": "9% state sales tax", "price": "0.450", "quantity": "1.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -3117,7 +3082,6 @@ "item_id": "9% state sales tax", "price": "0.270", "quantity": "2.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -3193,7 +3157,6 @@ "item_id": "9% state sales tax", "price": "0.315", "quantity": "1.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -3269,7 +3232,6 @@ "item_id": "detergent", "price": "5.000", "quantity": "1", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -3332,7 +3294,6 @@ "item_id": "softener", "price": "3.000", "quantity": "2", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -3395,7 +3356,6 @@ "item_id": "glass cleaner", "price": "3.500", "quantity": "1", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -3465,6 +3425,7 @@ "author_device_latlng": null, "author_role": "creditor", "equilibrium_time": null, + "debitor_first": false, "sum_value": "10.900", "transaction_items": [ { @@ -3473,7 +3434,6 @@ "item_id": "9% state sales tax", "price": "0.270", "quantity": "1.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -3549,7 +3509,6 @@ "item_id": "9% state sales tax", "price": "0.315", "quantity": "1.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -3625,7 +3584,6 @@ "item_id": "9% state sales tax", "price": "0.315", "quantity": "1.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -3701,7 +3659,6 @@ "item_id": "peanut butter", "price": "3.000", "quantity": "1", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -3764,7 +3721,6 @@ "item_id": "jelly", "price": "3.500", "quantity": "1", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -3827,7 +3783,6 @@ "item_id": "bread", "price": "3.500", "quantity": "1", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -3897,6 +3852,7 @@ "author_device_latlng": null, "author_role": "creditor", "equilibrium_time": null, + "debitor_first": false, "sum_value": "22.890", "transaction_items": [ { @@ -3905,7 +3861,6 @@ "item_id": "9% state sales tax", "price": "0.270", "quantity": "2.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -3981,7 +3936,6 @@ "item_id": "9% state sales tax", "price": "0.225", "quantity": "4.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -4057,7 +4011,6 @@ "item_id": "9% state sales tax", "price": "0.450", "quantity": "1.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -4133,7 +4086,6 @@ "item_id": "paper towels", "price": "3.000", "quantity": "2", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -4196,7 +4148,6 @@ "item_id": "pasta", "price": "2.500", "quantity": "4", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -4259,7 +4210,6 @@ "item_id": "ground coffee", "price": "5.000", "quantity": "1", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -4329,6 +4279,7 @@ "author_device_latlng": null, "author_role": "creditor", "equilibrium_time": null, + "debitor_first": false, "sum_value": "19.620", "transaction_items": [ { @@ -4337,7 +4288,6 @@ "item_id": "9% state sales tax", "price": "0.270", "quantity": "2.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -4413,7 +4363,6 @@ "item_id": "9% state sales tax", "price": "0.360", "quantity": "2.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -4489,7 +4438,6 @@ "item_id": "9% state sales tax", "price": "0.360", "quantity": "1.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -4565,7 +4513,6 @@ "item_id": "fruit juice", "price": "3.000", "quantity": "2", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -4628,7 +4575,6 @@ "item_id": "flour", "price": "4.000", "quantity": "2", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -4691,7 +4637,6 @@ "item_id": "coffee creamer", "price": "4.000", "quantity": "1", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -4761,6 +4706,7 @@ "author_device_latlng": null, "author_role": "creditor", "equilibrium_time": null, + "debitor_first": false, "sum_value": "16.895", "transaction_items": [ { @@ -4769,7 +4715,6 @@ "item_id": "9% state sales tax", "price": "0.405", "quantity": "2.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -4845,7 +4790,6 @@ "item_id": "9% state sales tax", "price": "0.270", "quantity": "1.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -4921,7 +4865,6 @@ "item_id": "9% state sales tax", "price": "0.315", "quantity": "1.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -4997,7 +4940,6 @@ "item_id": "sliced turkey", "price": "4.500", "quantity": "2", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -5060,7 +5002,6 @@ "item_id": "mustard", "price": "3.000", "quantity": "1", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -5123,7 +5064,6 @@ "item_id": "mayonnaise", "price": "3.500", "quantity": "1", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -5193,6 +5133,7 @@ "author_device_latlng": null, "author_role": "creditor", "equilibrium_time": null, + "debitor_first": false, "sum_value": "11.445", "transaction_items": [ { @@ -5201,7 +5142,6 @@ "item_id": "9% state sales tax", "price": "0.090", "quantity": "4.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -5277,7 +5217,6 @@ "item_id": "9% state sales tax", "price": "0.270", "quantity": "1.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -5353,7 +5292,6 @@ "item_id": "9% state sales tax", "price": "0.315", "quantity": "1.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -5429,7 +5367,6 @@ "item_id": "raisins", "price": "1.000", "quantity": "4", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -5492,7 +5429,6 @@ "item_id": "cheddar cheese", "price": "3.000", "quantity": "1", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -5555,7 +5491,6 @@ "item_id": "vanilla extract", "price": "3.500", "quantity": "1", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -5625,6 +5560,7 @@ "author_device_latlng": null, "author_role": "creditor", "equilibrium_time": null, + "debitor_first": false, "sum_value": "13.080", "transaction_items": [ { @@ -5633,7 +5569,6 @@ "item_id": "9% state sales tax", "price": "0.090", "quantity": "4.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -5709,7 +5644,6 @@ "item_id": "9% state sales tax", "price": "0.405", "quantity": "1.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -5785,7 +5719,6 @@ "item_id": "9% state sales tax", "price": "0.315", "quantity": "1.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -5861,7 +5794,6 @@ "item_id": "lemon", "price": "1.000", "quantity": "4", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -5924,7 +5856,6 @@ "item_id": "italian sausage", "price": "4.500", "quantity": "1", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -5987,7 +5918,6 @@ "item_id": "parmesan cheese", "price": "3.500", "quantity": "1", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -6057,6 +5987,7 @@ "author_device_latlng": null, "author_role": "creditor", "equilibrium_time": null, + "debitor_first": false, "sum_value": "19.293", "transaction_items": [ { @@ -6065,7 +5996,6 @@ "item_id": "9% state sales tax", "price": "0.135", "quantity": "3.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -6141,7 +6071,6 @@ "item_id": "9% state sales tax", "price": "0.270", "quantity": "2.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -6217,7 +6146,6 @@ "item_id": "9% state sales tax", "price": "0.108", "quantity": "6.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -6293,7 +6221,6 @@ "item_id": "celery", "price": "1.500", "quantity": "3", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -6356,7 +6283,6 @@ "item_id": "hand soap", "price": "3.000", "quantity": "2", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -6419,7 +6345,6 @@ "item_id": "avocado", "price": "1.200", "quantity": "6", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -6489,6 +6414,7 @@ "author_device_latlng": null, "author_role": "creditor", "equilibrium_time": null, + "debitor_first": false, "sum_value": "29.430", "transaction_items": [ { @@ -6497,7 +6423,6 @@ "item_id": "9% state sales tax", "price": "0.405", "quantity": "4.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -6573,7 +6498,6 @@ "item_id": "9% state sales tax", "price": "0.135", "quantity": "2.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -6649,7 +6573,6 @@ "item_id": "9% state sales tax", "price": "0.180", "quantity": "3.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -6725,7 +6648,6 @@ "item_id": "roses", "price": "4.500", "quantity": "4", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -6788,7 +6710,6 @@ "item_id": "grapefruit", "price": "1.500", "quantity": "2", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -6851,7 +6772,6 @@ "item_id": "chocolate", "price": "2.000", "quantity": "3", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -6921,6 +6841,7 @@ "author_device_latlng": null, "author_role": "creditor", "equilibrium_time": null, + "debitor_first": false, "sum_value": "18.530", "transaction_items": [ { @@ -6929,7 +6850,6 @@ "item_id": "9% state sales tax", "price": "0.495", "quantity": "1.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -7005,7 +6925,6 @@ "item_id": "9% state sales tax", "price": "0.315", "quantity": "2.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -7081,7 +7000,6 @@ "item_id": "9% state sales tax", "price": "0.405", "quantity": "1.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -7157,7 +7075,6 @@ "item_id": "shrimp", "price": "5.500", "quantity": "1", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -7220,7 +7137,6 @@ "item_id": "tissue", "price": "3.500", "quantity": "2", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -7283,7 +7199,6 @@ "item_id": "honey", "price": "4.500", "quantity": "1", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -7353,6 +7268,7 @@ "author_device_latlng": null, "author_role": "creditor", "equilibrium_time": null, + "debitor_first": false, "sum_value": "21.255", "transaction_items": [ { @@ -7361,7 +7277,6 @@ "item_id": "9% state sales tax", "price": "0.270", "quantity": "3.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -7437,7 +7352,6 @@ "item_id": "9% state sales tax", "price": "0.315", "quantity": "1.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -7513,7 +7427,6 @@ "item_id": "9% state sales tax", "price": "0.315", "quantity": "2.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -7589,7 +7502,6 @@ "item_id": "crackers", "price": "3.000", "quantity": "3", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -7652,7 +7564,6 @@ "item_id": "lemonade", "price": "3.500", "quantity": "1", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -7715,7 +7626,6 @@ "item_id": "granola", "price": "3.500", "quantity": "2", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -7785,6 +7695,7 @@ "author_device_latlng": null, "author_role": "creditor", "equilibrium_time": null, + "debitor_first": false, "sum_value": "25.070", "transaction_items": [ { @@ -7793,7 +7704,6 @@ "item_id": "9% state sales tax", "price": "0.270", "quantity": "3.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -7869,7 +7779,6 @@ "item_id": "9% state sales tax", "price": "0.315", "quantity": "2.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -7945,7 +7854,6 @@ "item_id": "9% state sales tax", "price": "0.315", "quantity": "2.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -8021,7 +7929,6 @@ "item_id": "cookies", "price": "3.000", "quantity": "3", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -8084,7 +7991,6 @@ "item_id": "tomato sauce", "price": "3.500", "quantity": "2", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -8147,7 +8053,6 @@ "item_id": "chicken soup", "price": "3.500", "quantity": "2", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -8217,6 +8122,7 @@ "author_device_latlng": null, "author_role": "creditor", "equilibrium_time": null, + "debitor_first": false, "sum_value": "16.350", "transaction_items": [ { @@ -8225,7 +8131,6 @@ "item_id": "9% state sales tax", "price": "0.270", "quantity": "2.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -8301,7 +8206,6 @@ "item_id": "9% state sales tax", "price": "0.090", "quantity": "5.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -8377,7 +8281,6 @@ "item_id": "9% state sales tax", "price": "0.360", "quantity": "1.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -8453,7 +8356,6 @@ "item_id": "rice", "price": "3.000", "quantity": "2", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -8516,7 +8418,6 @@ "item_id": "corn", "price": "1.000", "quantity": "5", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -8579,7 +8480,6 @@ "item_id": "almonds", "price": "4.000", "quantity": "1", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -8649,6 +8549,7 @@ "author_device_latlng": null, "author_role": "creditor", "equilibrium_time": null, + "debitor_first": false, "sum_value": "15.260", "transaction_items": [ { @@ -8657,7 +8558,6 @@ "item_id": "9% state sales tax", "price": "0.225", "quantity": "3.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -8733,7 +8633,6 @@ "item_id": "9% state sales tax", "price": "0.360", "quantity": "1.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -8809,7 +8708,6 @@ "item_id": "9% state sales tax", "price": "0.225", "quantity": "1.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -8885,7 +8783,6 @@ "item_id": "carrots", "price": "2.500", "quantity": "3", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -8948,7 +8845,6 @@ "item_id": "oats", "price": "4.000", "quantity": "1", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -9011,7 +8907,6 @@ "item_id": "ketchup", "price": "2.500", "quantity": "1", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -9081,6 +8976,7 @@ "author_device_latlng": null, "author_role": "creditor", "equilibrium_time": null, + "debitor_first": false, "sum_value": "12.535", "transaction_items": [ { @@ -9089,7 +8985,6 @@ "item_id": "9% state sales tax", "price": "0.360", "quantity": "1.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -9165,7 +9060,6 @@ "item_id": "9% state sales tax", "price": "0.135", "quantity": "3.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -9241,7 +9135,6 @@ "item_id": "9% state sales tax", "price": "0.270", "quantity": "1.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -9317,7 +9210,6 @@ "item_id": "band aids", "price": "4.000", "quantity": "1", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -9380,7 +9272,6 @@ "item_id": "mango", "price": "1.500", "quantity": "3", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -9443,7 +9334,6 @@ "item_id": "ground cinnamon", "price": "3.000", "quantity": "1", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -9513,6 +9403,7 @@ "author_device_latlng": null, "author_role": "creditor", "equilibrium_time": null, + "debitor_first": false, "sum_value": "14.170", "transaction_items": [ { @@ -9521,7 +9412,6 @@ "item_id": "9% state sales tax", "price": "0.315", "quantity": "1.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -9597,7 +9487,6 @@ "item_id": "9% state sales tax", "price": "0.540", "quantity": "1.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -9673,7 +9562,6 @@ "item_id": "9% state sales tax", "price": "0.315", "quantity": "1.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -9749,7 +9637,6 @@ "item_id": "frozen vegetables", "price": "3.500", "quantity": "1", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -9812,7 +9699,6 @@ "item_id": "ground beef", "price": "6.000", "quantity": "1", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -9875,7 +9761,6 @@ "item_id": "strawberry preserve", "price": "3.500", "quantity": "1", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -9945,6 +9830,7 @@ "author_device_latlng": null, "author_role": "creditor", "equilibrium_time": null, + "debitor_first": false, "sum_value": "15.260", "transaction_items": [ { @@ -9953,7 +9839,6 @@ "item_id": "9% state sales tax", "price": "0.360", "quantity": "1.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -10029,7 +9914,6 @@ "item_id": "9% state sales tax", "price": "0.270", "quantity": "1.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -10105,7 +9989,6 @@ "item_id": "9% state sales tax", "price": "0.315", "quantity": "2.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -10181,7 +10064,6 @@ "item_id": "corn meal", "price": "4.000", "quantity": "1", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -10244,7 +10126,6 @@ "item_id": "pistachios", "price": "3.000", "quantity": "1", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -10307,7 +10188,6 @@ "item_id": "orange juice", "price": "3.500", "quantity": "2", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -10377,6 +10257,7 @@ "author_device_latlng": null, "author_role": "creditor", "equilibrium_time": null, + "debitor_first": false, "sum_value": "15.805", "transaction_items": [ { @@ -10385,7 +10266,6 @@ "item_id": "9% state sales tax", "price": "0.360", "quantity": "2.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -10461,7 +10341,6 @@ "item_id": "9% state sales tax", "price": "0.270", "quantity": "1.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -10537,7 +10416,6 @@ "item_id": "9% state sales tax", "price": "0.315", "quantity": "1.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -10613,7 +10491,6 @@ "item_id": "pineapple", "price": "4.000", "quantity": "2", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -10676,7 +10553,6 @@ "item_id": "grapes", "price": "3.000", "quantity": "1", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -10739,7 +10615,6 @@ "item_id": "window cleaner", "price": "3.500", "quantity": "1", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -10809,6 +10684,7 @@ "author_device_latlng": null, "author_role": "creditor", "equilibrium_time": null, + "debitor_first": false, "sum_value": "10.355", "transaction_items": [ { @@ -10817,7 +10693,6 @@ "item_id": "9% state sales tax", "price": "0.405", "quantity": "1.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -10893,7 +10768,6 @@ "item_id": "9% state sales tax", "price": "0.270", "quantity": "1.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -10969,7 +10843,6 @@ "item_id": "9% state sales tax", "price": "0.180", "quantity": "1.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -11045,7 +10918,6 @@ "item_id": "mozzarella cheese", "price": "4.500", "quantity": "1", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -11108,7 +10980,6 @@ "item_id": "pesto sauce", "price": "3.000", "quantity": "1", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -11171,7 +11042,6 @@ "item_id": "pine nuts", "price": "2.000", "quantity": "1", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -11241,6 +11111,7 @@ "author_device_latlng": null, "author_role": "creditor", "equilibrium_time": null, + "debitor_first": false, "sum_value": "16.350", "transaction_items": [ { @@ -11249,7 +11120,6 @@ "item_id": "9% state sales tax", "price": "0.450", "quantity": "1.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -11325,7 +11195,6 @@ "item_id": "9% state sales tax", "price": "0.270", "quantity": "2.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -11401,7 +11270,6 @@ "item_id": "9% state sales tax", "price": "0.360", "quantity": "1.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -11477,7 +11345,6 @@ "item_id": "pitted dates", "price": "5.000", "quantity": "1", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -11540,7 +11407,6 @@ "item_id": "potato salad", "price": "3.000", "quantity": "2", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -11603,7 +11469,6 @@ "item_id": "olives", "price": "4.000", "quantity": "1", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -11673,6 +11538,7 @@ "author_device_latlng": null, "author_role": "creditor", "equilibrium_time": null, + "debitor_first": false, "sum_value": "10.902", "transaction_items": [ { @@ -11681,7 +11547,6 @@ "item_id": "9% state sales tax", "price": "0.045", "quantity": "6.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -11757,7 +11622,6 @@ "item_id": "9% state sales tax", "price": "0.068", "quantity": "4.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -11833,7 +11697,6 @@ "item_id": "9% state sales tax", "price": "0.360", "quantity": "1.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -11909,7 +11772,6 @@ "item_id": "jalepeno pepper", "price": "0.500", "quantity": "6", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -11972,7 +11834,6 @@ "item_id": "peach", "price": "0.750", "quantity": "4", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -12035,7 +11896,6 @@ "item_id": "cream cheese", "price": "4.000", "quantity": "1", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -12105,6 +11965,7 @@ "author_device_latlng": null, "author_role": "creditor", "equilibrium_time": null, + "debitor_first": false, "sum_value": "22.345", "transaction_items": [ { @@ -12113,7 +11974,6 @@ "item_id": "9% state sales tax", "price": "0.225", "quantity": "1.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -12189,7 +12049,6 @@ "item_id": "9% state sales tax", "price": "0.135", "quantity": "4.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -12265,7 +12124,6 @@ "item_id": "9% state sales tax", "price": "0.360", "quantity": "3.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -12341,7 +12199,6 @@ "item_id": "baking powder", "price": "2.500", "quantity": "1", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -12404,7 +12261,6 @@ "item_id": "serving spoon", "price": "1.500", "quantity": "4", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -12467,7 +12323,6 @@ "item_id": "napkins", "price": "4.000", "quantity": "3", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -12537,6 +12392,7 @@ "author_device_latlng": null, "author_role": "creditor", "equilibrium_time": null, + "debitor_first": false, "sum_value": "25.615", "transaction_items": [ { @@ -12545,7 +12401,6 @@ "item_id": "9% state sales tax", "price": "0.360", "quantity": "2.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -12621,7 +12476,6 @@ "item_id": "9% state sales tax", "price": "0.225", "quantity": "3.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -12697,7 +12551,6 @@ "item_id": "9% state sales tax", "price": "0.360", "quantity": "2.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -12773,7 +12626,6 @@ "item_id": "guacamole", "price": "4.000", "quantity": "2", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -12836,7 +12688,6 @@ "item_id": "sour cream", "price": "2.500", "quantity": "3", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -12899,7 +12750,6 @@ "item_id": "tortilla chips", "price": "4.000", "quantity": "2", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -12969,6 +12819,7 @@ "author_device_latlng": null, "author_role": "creditor", "equilibrium_time": null, + "debitor_first": false, "sum_value": "22.345", "transaction_items": [ { @@ -12977,7 +12828,6 @@ "item_id": "9% state sales tax", "price": "0.450", "quantity": "2.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -13053,7 +12903,6 @@ "item_id": "9% state sales tax", "price": "0.225", "quantity": "1.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -13129,7 +12978,6 @@ "item_id": "9% state sales tax", "price": "0.360", "quantity": "2.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -13205,7 +13053,6 @@ "item_id": "rice noodles", "price": "5.000", "quantity": "2", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -13268,7 +13115,6 @@ "item_id": "scallions", "price": "2.500", "quantity": "1", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -13331,7 +13177,6 @@ "item_id": "tofu", "price": "4.000", "quantity": "2", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -13401,6 +13246,7 @@ "author_device_latlng": null, "author_role": "creditor", "equilibrium_time": null, + "debitor_first": false, "sum_value": "10.630", "transaction_items": [ { @@ -13409,7 +13255,6 @@ "item_id": "9% state sales tax", "price": "0.270", "quantity": "2.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -13485,7 +13330,6 @@ "item_id": "9% state sales tax", "price": "0.032", "quantity": "5.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -13561,7 +13405,6 @@ "item_id": "9% state sales tax", "price": "0.090", "quantity": "2.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -13637,7 +13480,6 @@ "item_id": "spinach", "price": "3.000", "quantity": "2", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -13700,7 +13542,6 @@ "item_id": "garlic", "price": "0.350", "quantity": "5", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -13763,7 +13604,6 @@ "item_id": "cucumber", "price": "1.000", "quantity": "2", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -13833,6 +13673,7 @@ "author_device_latlng": null, "author_role": "creditor", "equilibrium_time": null, + "debitor_first": false, "sum_value": "23.435", "transaction_items": [ { @@ -13841,7 +13682,6 @@ "item_id": "9% state sales tax", "price": "0.900", "quantity": "1.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -13917,7 +13757,6 @@ "item_id": "9% state sales tax", "price": "0.315", "quantity": "1.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -13993,7 +13832,6 @@ "item_id": "9% state sales tax", "price": "0.360", "quantity": "2.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -14069,7 +13907,6 @@ "item_id": "charcoal", "price": "10.000", "quantity": "1", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -14132,7 +13969,6 @@ "item_id": "brown sugar", "price": "3.500", "quantity": "1", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -14195,7 +14031,6 @@ "item_id": "almond milk", "price": "4.000", "quantity": "2", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -14265,6 +14100,7 @@ "author_device_latlng": null, "author_role": "creditor", "equilibrium_time": null, + "debitor_first": false, "sum_value": "21.800", "transaction_items": [ { @@ -14273,7 +14109,6 @@ "item_id": "9% state sales tax", "price": "0.180", "quantity": "4.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -14349,7 +14184,6 @@ "item_id": "9% state sales tax", "price": "0.270", "quantity": "1.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -14425,7 +14259,6 @@ "item_id": "9% state sales tax", "price": "0.405", "quantity": "2.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -14501,7 +14334,6 @@ "item_id": "kitchen sponge", "price": "2.000", "quantity": "4", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -14564,7 +14396,6 @@ "item_id": "vinegar", "price": "3.000", "quantity": "1", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -14627,7 +14458,6 @@ "item_id": "frozen vegetable mix", "price": "4.500", "quantity": "2", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -14697,6 +14527,7 @@ "author_device_latlng": null, "author_role": "creditor", "equilibrium_time": null, + "debitor_first": false, "sum_value": "19.075", "transaction_items": [ { @@ -14705,7 +14536,6 @@ "item_id": "9% state sales tax", "price": "0.405", "quantity": "1.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -14781,7 +14611,6 @@ "item_id": "9% state sales tax", "price": "0.990", "quantity": "1.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -14857,7 +14686,6 @@ "item_id": "9% state sales tax", "price": "0.180", "quantity": "1.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -14933,7 +14761,6 @@ "item_id": "blueberries", "price": "4.500", "quantity": "1", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -14996,7 +14823,6 @@ "item_id": "strainer", "price": "11.000", "quantity": "1", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -15059,7 +14885,6 @@ "item_id": "walnuts", "price": "2.000", "quantity": "1", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -15129,6 +14954,7 @@ "author_device_latlng": null, "author_role": "creditor", "equilibrium_time": null, + "debitor_first": false, "sum_value": "15.260", "transaction_items": [ { @@ -15137,7 +14963,6 @@ "item_id": "9% state sales tax", "price": "0.270", "quantity": "2.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -15213,7 +15038,6 @@ "item_id": "9% state sales tax", "price": "0.450", "quantity": "1.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -15289,7 +15113,6 @@ "item_id": "9% state sales tax", "price": "0.135", "quantity": "2.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -15365,7 +15188,6 @@ "item_id": "cottage cheese", "price": "3.000", "quantity": "2", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -15428,7 +15250,6 @@ "item_id": "aluminium foil", "price": "5.000", "quantity": "1", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -15491,7 +15312,6 @@ "item_id": "sunflower seeds", "price": "1.500", "quantity": "2", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -15561,6 +15381,7 @@ "author_device_latlng": null, "author_role": "creditor", "equilibrium_time": null, + "debitor_first": false, "sum_value": "10.355", "transaction_items": [ { @@ -15569,7 +15390,6 @@ "item_id": "9% state sales tax", "price": "0.090", "quantity": "3.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -15645,7 +15465,6 @@ "item_id": "9% state sales tax", "price": "0.135", "quantity": "2.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -15721,7 +15540,6 @@ "item_id": "9% state sales tax", "price": "0.315", "quantity": "1.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -15797,7 +15615,6 @@ "item_id": "radish", "price": "1.000", "quantity": "3", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -15860,7 +15677,6 @@ "item_id": "string peas", "price": "1.500", "quantity": "2", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -15923,7 +15739,6 @@ "item_id": "ranch dressing", "price": "3.500", "quantity": "1", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -15993,6 +15808,7 @@ "author_device_latlng": null, "author_role": "creditor", "equilibrium_time": null, + "debitor_first": false, "sum_value": "14.170", "transaction_items": [ { @@ -16001,7 +15817,6 @@ "item_id": "9% state sales tax", "price": "0.360", "quantity": "1.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -16077,7 +15892,6 @@ "item_id": "9% state sales tax", "price": "0.495", "quantity": "1.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -16153,7 +15967,6 @@ "item_id": "9% state sales tax", "price": "0.315", "quantity": "1.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -16229,7 +16042,6 @@ "item_id": "fabric softener", "price": "4.000", "quantity": "1", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -16292,7 +16104,6 @@ "item_id": "maple syrup", "price": "5.500", "quantity": "1", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -16355,7 +16166,6 @@ "item_id": "margarine", "price": "3.500", "quantity": "1", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -16425,6 +16235,7 @@ "author_device_latlng": null, "author_role": "creditor", "equilibrium_time": null, + "debitor_first": false, "sum_value": "14.715", "transaction_items": [ { @@ -16433,7 +16244,6 @@ "item_id": "9% state sales tax", "price": "0.630", "quantity": "1.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -16509,7 +16319,6 @@ "item_id": "9% state sales tax", "price": "0.045", "quantity": "5.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -16585,7 +16394,6 @@ "item_id": "9% state sales tax", "price": "0.360", "quantity": "1.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -16661,7 +16469,6 @@ "item_id": "plastic cups", "price": "7.000", "quantity": "1", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -16724,7 +16531,6 @@ "item_id": "lime", "price": "0.500", "quantity": "5", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -16787,7 +16593,6 @@ "item_id": "chilli sauce", "price": "4.000", "quantity": "1", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -16857,6 +16662,7 @@ "author_device_latlng": null, "author_role": "creditor", "equilibrium_time": null, + "debitor_first": false, "sum_value": "23.980", "transaction_items": [ { @@ -16865,7 +16671,6 @@ "item_id": "9% state sales tax", "price": "0.630", "quantity": "1.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -16941,7 +16746,6 @@ "item_id": "9% state sales tax", "price": "0.270", "quantity": "3.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -17017,7 +16821,6 @@ "item_id": "9% state sales tax", "price": "0.270", "quantity": "2.000", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -17093,7 +16896,6 @@ "item_id": "salmon", "price": "7.000", "quantity": "1", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -17156,7 +16958,6 @@ "item_id": "artichoke", "price": "3.000", "quantity": "3", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -17219,7 +17020,6 @@ "item_id": "rice pudding", "price": "3.000", "quantity": "2", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -17279,4 +17079,4 @@ ] } } -] \ No newline at end of file +] diff --git a/tests/testdata/trItemWAppr.json b/tests/testdata/trItemWAppr.json index 37facbc9e..5e9c61365 100644 --- a/tests/testdata/trItemWAppr.json +++ b/tests/testdata/trItemWAppr.json @@ -4,7 +4,6 @@ "item_id": "milk", "price": "2.000", "quantity": "1", - "debitor_first": null, "rule_instance_id": null, "rule_exec_ids": [], "unit_of_measurement": "", diff --git a/tests/testdata/trItemWZeroAppr.json b/tests/testdata/trItemWZeroAppr.json index 9cc9daf18..df9053f51 100644 --- a/tests/testdata/trItemWZeroAppr.json +++ b/tests/testdata/trItemWZeroAppr.json @@ -4,7 +4,6 @@ "item_id": "milk", "price": "2.000", "quantity": "1", - "debitor_first": null, "rule_instance_id": null, "rule_exec_ids": [], "unit_of_measurement": "", diff --git a/tests/testdata/trItemsNoAppr.json b/tests/testdata/trItemsNoAppr.json index ef2679157..8fb418a91 100644 --- a/tests/testdata/trItemsNoAppr.json +++ b/tests/testdata/trItemsNoAppr.json @@ -5,7 +5,6 @@ "item_id": "9% state sales tax", "price": "0.180", "quantity": "1.000", - "debitor_first": null, "rule_instance_id": 1, "unit_of_measurement": "", "units_measured": null, @@ -26,7 +25,6 @@ "item_id": "9% state sales tax", "price": "0.270", "quantity": "2.000", - "debitor_first": null, "rule_instance_id": 1, "unit_of_measurement": "", "units_measured": null, @@ -47,7 +45,6 @@ "item_id": "9% state sales tax", "price": "0.360", "quantity": "3.000", - "debitor_first": null, "rule_instance_id": 1, "unit_of_measurement": "", "units_measured": null, @@ -68,7 +65,6 @@ "item_id": "milk", "price": "2.000", "quantity": "1", - "debitor_first": null, "rule_instance_id": null, "unit_of_measurement": "", "units_measured": null, @@ -89,7 +85,6 @@ "item_id": "bread", "price": "3.000", "quantity": "2", - "debitor_first": null, "rule_instance_id": null, "unit_of_measurement": "", "units_measured": null, @@ -110,7 +105,6 @@ "item_id": "eggs", "price": "4.000", "quantity": "3", - "debitor_first": null, "rule_instance_id": null, "unit_of_measurement": "", "units_measured": null, diff --git a/tests/testdata/transMultipleRules.json b/tests/testdata/transMultipleRules.json index b9d389033..8740fe2cb 100644 --- a/tests/testdata/transMultipleRules.json +++ b/tests/testdata/transMultipleRules.json @@ -8,6 +8,7 @@ "author_device_latlng": null, "author_role": "creditor", "equilibrium_time": null, + "debitor_first": null, "sum_value": "23.60", "transaction_items": [ { @@ -16,7 +17,6 @@ "item_id": "9% state sales tax", "price": "0.180", "quantity": "1.000", - "debitor_first": null, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -39,7 +39,6 @@ "item_id": "9% state sales tax", "price": "0.180", "quantity": "1.000", - "debitor_first": null, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -62,7 +61,6 @@ "item_id": "9% state sales tax", "price": "0.270", "quantity": "2.000", - "debitor_first": null, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -85,7 +83,6 @@ "item_id": "9% state sales tax", "price": "0.270", "quantity": "2.000", - "debitor_first": null, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -108,7 +105,6 @@ "item_id": "9% state sales tax", "price": "0.360", "quantity": "3.000", - "debitor_first": null, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -131,7 +127,6 @@ "item_id": "9% state sales tax", "price": "0.360", "quantity": "3.000", - "debitor_first": null, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -154,7 +149,6 @@ "item_id": "milk", "price": "2.000", "quantity": "1", - "debitor_first": null, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -177,7 +171,6 @@ "item_id": "bread", "price": "3.000", "quantity": "2", - "debitor_first": null, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -200,7 +193,6 @@ "item_id": "eggs", "price": "4.000", "quantity": "3", - "debitor_first": null, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -219,4 +211,4 @@ } ] } -} \ No newline at end of file +} diff --git a/tests/testdata/transNoAppr.json b/tests/testdata/transNoAppr.json index 89d5070d8..a63c5bd3e 100644 --- a/tests/testdata/transNoAppr.json +++ b/tests/testdata/transNoAppr.json @@ -8,6 +8,7 @@ "author_device_latlng": null, "author_role": "creditor", "equilibrium_time": null, + "debitor_first": false, "sum_value": "21.8", "transaction_items": [ { @@ -16,7 +17,6 @@ "item_id": "9% state sales tax", "price": "0.18", "quantity": "1", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -39,7 +39,6 @@ "item_id": "9% state sales tax", "price": "0.27", "quantity": "2", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -62,7 +61,6 @@ "item_id": "9% state sales tax", "price": "0.36", "quantity": "3", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": null, "unit_of_measurement": null, @@ -85,7 +83,6 @@ "item_id": "milk", "price": "2", "quantity": "1", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -108,7 +105,6 @@ "item_id": "bread", "price": "3", "quantity": "2", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, @@ -131,7 +127,6 @@ "item_id": "eggs", "price": "4", "quantity": "3", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": null, "unit_of_measurement": null, diff --git a/tests/testdata/transWAppr.json b/tests/testdata/transWAppr.json index cbf94b4a3..aec5c26f6 100644 --- a/tests/testdata/transWAppr.json +++ b/tests/testdata/transWAppr.json @@ -8,6 +8,7 @@ "author_device_latlng": null, "author_role": "creditor", "equilibrium_time": null, + "debitor_first": null, "sum_value": "21.800", "transaction_items": [ { @@ -16,7 +17,6 @@ "item_id": "9% state sales tax", "price": "0.180", "quantity": "1.000", - "debitor_first": null, "rule_instance_id": "1", "unit_of_measurement": null, "units_measured": null, @@ -91,7 +91,6 @@ "item_id": "9% state sales tax", "price": "0.270", "quantity": "2.000", - "debitor_first": null, "rule_instance_id": "1", "unit_of_measurement": null, "units_measured": null, @@ -166,7 +165,6 @@ "item_id": "9% state sales tax", "price": "0.360", "quantity": "3.000", - "debitor_first": null, "rule_instance_id": "1", "unit_of_measurement": null, "units_measured": null, @@ -241,7 +239,6 @@ "item_id": "milk", "price": "2.000", "quantity": "1", - "debitor_first": null, "rule_instance_id": null, "unit_of_measurement": null, "units_measured": null, @@ -303,7 +300,6 @@ "item_id": "bread", "price": "3.000", "quantity": "2", - "debitor_first": null, "rule_instance_id": null, "unit_of_measurement": null, "units_measured": null, @@ -365,7 +361,6 @@ "item_id": "eggs", "price": "4.000", "quantity": "3", - "debitor_first": null, "rule_instance_id": null, "unit_of_measurement": null, "units_measured": null, @@ -423,4 +418,4 @@ } ] } -} \ No newline at end of file +} diff --git a/tests/testdata/transWTimes.json b/tests/testdata/transWTimes.json index 77716d8ee..bf3943c72 100644 --- a/tests/testdata/transWTimes.json +++ b/tests/testdata/transWTimes.json @@ -5,6 +5,7 @@ "author": "GroceryCo", "author_role": "creditor", "equilibrium_time": "2022-06-24T03:09:32.772Z", + "debitor_first": false, "sum_value": "22.89", "transaction_items": [ { @@ -13,7 +14,6 @@ "item_id": "ground coffee", "price": "5", "quantity": "1", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": [ "RPY4ycoT" @@ -61,7 +61,6 @@ "item_id": "pasta", "price": "2.5", "quantity": "4", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": [ "hoPzSXuj" @@ -109,7 +108,6 @@ "item_id": "paper towels", "price": "3", "quantity": "2", - "debitor_first": false, "rule_instance_id": null, "rule_exec_ids": [ "dhlp9OBs" @@ -157,7 +155,6 @@ "item_id": "9% state sales tax", "price": "0.45", "quantity": "1", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": [ "RPY4ycoT" @@ -214,7 +211,6 @@ "item_id": "9% state sales tax", "price": "0.225", "quantity": "4", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": [ "hoPzSXuj" @@ -271,7 +267,6 @@ "item_id": "9% state sales tax", "price": "0.27", "quantity": "2", - "debitor_first": false, "rule_instance_id": "1", "rule_exec_ids": [ "dhlp9OBs" @@ -324,4 +319,4 @@ } ] } -} \ No newline at end of file +} diff --git a/tests/thunder-tests/thunderclient.json b/tests/thunder-tests/thunderclient.json index 64937c18d..0825e179c 100644 --- a/tests/thunder-tests/thunderclient.json +++ b/tests/thunder-tests/thunderclient.json @@ -8,7 +8,7 @@ "method": "POST", "sortNum": 10000, "created": "2023-01-22T03:27:30.997Z", - "modified": "2023-05-11T21:37:08.304Z", + "modified": "2026-01-28T03:40:22.759Z", "headers": [ { "name": "Content-Type", @@ -25,8 +25,8 @@ "raw": "", "form": [], "graphql": { - "query": "query getRules($transaction_items: [TransactionItemInput!]) {\n rules(transaction_items: $transaction_items) {\n id\n rule_instance_id\n author\n author_device_id\n author_device_latlng\n author_role\n sum_value\n transaction_items {\n id\n transaction_id\n item_id\n price\n quantity\n debitor_first\n rule_instance_id\n unit_of_measurement\n units_measured\n debitor\n creditor\n debitor_profile_id\n creditor_profile_id\n debitor_approval_time\n creditor_approval_time\n debitor_expiration_time\n creditor_expiration_time\n debitor_rejection_time\n creditor_rejection_time \n }\n }\n}", - "variables": "{\n \"transaction_items\": [\n {\n \"id\": null,\n \"transaction_id\": null,\n \"item_id\": \"milk\",\n \"price\": \"2.000\",\n \"quantity\": \"1\",\n \"debitor_first\": null,\n \"rule_instance_id\": null,\n \"unit_of_measurement\": null,\n \"units_measured\": null,\n \"debitor\": \"JacobWebb\",\n \"creditor\": \"GroceryStore\",\n \"debitor_profile_id\": null,\n \"creditor_profile_id\": null,\n \"debitor_approval_time\": null,\n \"creditor_approval_time\": null,\n \"debitor_expiration_time\": null,\n \"creditor_expiration_time\": null,\n \"debitor_rejection_time\": null,\n \"creditor_rejection_time\": null\n },\n {\n \"id\": null,\n \"transaction_id\": null,\n \"item_id\": \"bread\",\n \"price\": \"3.000\",\n \"quantity\": \"2\",\n \"debitor_first\": null,\n \"rule_instance_id\": null,\n \"unit_of_measurement\": null,\n \"units_measured\": null,\n \"debitor\": \"JacobWebb\",\n \"creditor\": \"GroceryStore\",\n \"debitor_profile_id\": null,\n \"creditor_profile_id\": null,\n \"debitor_approval_time\": null,\n \"creditor_approval_time\": null,\n \"debitor_expiration_time\": null,\n \"creditor_expiration_time\": null,\n \"debitor_rejection_time\": null,\n \"creditor_rejection_time\": null\n },\n {\n \"id\": null,\n \"transaction_id\": null,\n \"item_id\": \"eggs\",\n \"price\": \"4.000\",\n \"quantity\": \"3\",\n \"debitor_first\": null,\n \"rule_instance_id\": null,\n \"unit_of_measurement\": null,\n \"units_measured\": null,\n \"debitor\": \"JacobWebb\",\n \"creditor\": \"GroceryStore\",\n \"debitor_profile_id\": null,\n \"creditor_profile_id\": null,\n \"debitor_approval_time\": null,\n \"creditor_approval_time\": null,\n \"debitor_expiration_time\": null,\n \"creditor_expiration_time\": null,\n \"debitor_rejection_time\": null,\n \"creditor_rejection_time\": null\n }\n ]\n}" + "query": "query getRules($transaction: TransactionInput!) {\n rules(transaction: $transaction) {\n id\n rule_instance_id\n author\n author_device_id\n author_device_latlng\n author_role\n sum_value\n debitor_first\n transaction_items {\n id\n transaction_id\n item_id\n price\n quantity\n rule_instance_id\n unit_of_measurement\n units_measured\n debitor\n creditor\n debitor_profile_id\n creditor_profile_id\n debitor_approval_time\n creditor_approval_time\n debitor_expiration_time\n creditor_expiration_time\n debitor_rejection_time\n creditor_rejection_time\n }\n }\n}", + "variables": "{\n \"transaction\": {\n \"author\": \"GroceryStore\",\n \"author_role\": \"creditor\",\n \"sum_value\": \"14.000\",\n \"transaction_items\": [\n {\n \"item_id\": \"milk\",\n \"price\": \"2.000\",\n \"quantity\": \"1\",\n \"debitor\": \"JacobWebb\",\n \"creditor\": \"GroceryStore\"\n },\n {\n \"item_id\": \"bread\",\n \"price\": \"3.000\",\n \"quantity\": \"2\",\n \"debitor\": \"JacobWebb\",\n \"creditor\": \"GroceryStore\"\n }\n ]\n }\n}" } }, "tests": [] @@ -40,7 +40,7 @@ "method": "POST", "sortNum": 20000, "created": "2023-01-22T03:27:30.999Z", - "modified": "2023-04-02T04:13:35.757Z", + "modified": "2026-01-28T03:40:45.506Z", "headers": [ { "name": "Content-Type", @@ -57,8 +57,8 @@ "raw": "", "form": [], "graphql": { - "query": "query getRules($transaction_items: [TransactionItemInput!]) {\n rules(transaction_items: $transaction_items) {\n id\n rule_instance_id\n author\n author_device_id\n author_device_latlng\n author_role\n sum_value\n transaction_items {\n id\n transaction_id\n item_id\n price\n quantity\n debitor_first\n rule_instance_id\n unit_of_measurement\n units_measured\n debitor\n creditor\n debitor_profile_id\n creditor_profile_id\n debitor_approval_time\n creditor_approval_time\n debitor_expiration_time\n creditor_expiration_time\n debitor_rejection_time\n creditor_rejection_time\n approvals {\n id\n rule_instance_id\n transaction_id\n transaction_item_id\n account_name\n account_role\n device_id\n device_latlng\n approval_time\n rejection_time\n expiration_time\n }\n }\n }\n}", - "variables": "{\n \"transaction_items\": [\n {\n \"id\": null,\n \"transaction_id\": null,\n \"item_id\": \"milk\",\n \"price\": \"2.000\",\n \"quantity\": \"1\",\n \"debitor_first\": null,\n \"rule_instance_id\": null,\n \"unit_of_measurement\": null,\n \"units_measured\": null,\n \"debitor\": \"JoeCarter\",\n \"creditor\": \"GroceryCo\",\n \"debitor_profile_id\": null,\n \"creditor_profile_id\": null,\n \"debitor_approval_time\": null,\n \"creditor_approval_time\": null,\n \"debitor_expiration_time\": null,\n \"creditor_expiration_time\": null,\n \"debitor_rejection_time\": null,\n \"creditor_rejection_time\": null\n },\n {\n \"id\": null,\n \"transaction_id\": null,\n \"item_id\": \"bread\",\n \"price\": \"3.000\",\n \"quantity\": \"2\",\n \"debitor_first\": null,\n \"rule_instance_id\": null,\n \"unit_of_measurement\": null,\n \"units_measured\": null,\n \"debitor\": \"JoeCarter\",\n \"creditor\": \"GroceryCo\",\n \"debitor_profile_id\": null,\n \"creditor_profile_id\": null,\n \"debitor_approval_time\": null,\n \"creditor_approval_time\": null,\n \"debitor_expiration_time\": null,\n \"creditor_expiration_time\": null,\n \"debitor_rejection_time\": null,\n \"creditor_rejection_time\": null\n },\n {\n \"id\": null,\n \"transaction_id\": null,\n \"item_id\": \"eggs\",\n \"price\": \"4.000\",\n \"quantity\": \"3\",\n \"debitor_first\": null,\n \"rule_instance_id\": null,\n \"unit_of_measurement\": null,\n \"units_measured\": null,\n \"debitor\": \"JoeCarter\",\n \"creditor\": \"GroceryCo\",\n \"debitor_profile_id\": null,\n \"creditor_profile_id\": null,\n \"debitor_approval_time\": null,\n \"creditor_approval_time\": null,\n \"debitor_expiration_time\": null,\n \"creditor_expiration_time\": null,\n \"debitor_rejection_time\": null,\n \"creditor_rejection_time\": null\n }\n ]\n}" + "query": "query getRules($transaction: TransactionInput!) {\n rules(transaction: $transaction) {\n id\n rule_instance_id\n author\n author_device_id\n author_device_latlng\n author_role\n sum_value\n debitor_first\n transaction_items {\n id\n transaction_id\n item_id\n price\n quantity\n rule_instance_id\n unit_of_measurement\n units_measured\n debitor\n creditor\n debitor_profile_id\n creditor_profile_id\n debitor_approval_time\n creditor_approval_time\n debitor_expiration_time\n creditor_expiration_time\n debitor_rejection_time\n creditor_rejection_time\n approvals {\n id\n rule_instance_id\n transaction_id\n transaction_item_id\n account_name\n account_role\n device_id\n device_latlng\n approval_time\n rejection_time\n expiration_time\n }\n }\n }\n}", + "variables": "{\n \"transaction\": {\n \"author\": \"GroceryStore\",\n \"author_role\": \"creditor\",\n \"sum_value\": \"14.000\",\n \"transaction_items\": [\n {\n \"item_id\": \"milk\",\n \"price\": \"2.000\",\n \"quantity\": \"1\",\n \"debitor\": \"JacobWebb\",\n \"creditor\": \"GroceryStore\"\n },\n {\n \"item_id\": \"bread\",\n \"price\": \"3.000\",\n \"quantity\": \"2\",\n \"debitor\": \"JacobWebb\",\n \"creditor\": \"GroceryStore\"\n }\n ]\n }\n}" } }, "tests": [] @@ -72,7 +72,7 @@ "method": "POST", "sortNum": 30000, "created": "2023-01-22T03:27:31.000Z", - "modified": "2023-03-29T07:08:41.072Z", + "modified": "2026-01-30T03:04:19.873Z", "headers": [ { "name": "Content-Type", @@ -89,8 +89,8 @@ "raw": "", "form": [], "graphql": { - "query": "query getRules($transaction_items: [TransactionItemInput!]) {\n rules(transaction_items: $transaction_items) {\n id\n rule_instance_id\n author\n author_device_id\n author_device_latlng\n author_role\n sum_value\n transaction_items {\n id\n transaction_id\n item_id\n price\n quantity\n debitor_first\n rule_instance_id\n unit_of_measurement\n units_measured\n debitor\n creditor\n debitor_profile_id\n creditor_profile_id\n debitor_approval_time\n creditor_approval_time\n debitor_expiration_time\n creditor_expiration_time\n debitor_rejection_time\n creditor_rejection_time \n }\n }\n}", - "variables": "{\n \"transaction_items\": [\n {\n \"id\": null,\n \"transaction_id\": null,\n \"item_id\": \"bottled water\",\n \"price\": \"1.000\",\n \"quantity\": \"1\",\n \"debitor_first\": null,\n \"rule_instance_id\": null,\n \"unit_of_measurement\": null,\n \"units_measured\": null,\n \"debitor\": \"JacobWebb\",\n \"creditor\": \"GroceryStore\",\n \"debitor_profile_id\": null,\n \"creditor_profile_id\": null,\n \"debitor_approval_time\": null,\n \"creditor_approval_time\": null,\n \"debitor_expiration_time\": null,\n \"creditor_expiration_time\": null,\n \"debitor_rejection_time\": null,\n \"creditor_rejection_time\": null\n }\n ]\n}" + "query": "query getRules($transaction: TransactionInput!) {\n rules(transaction: $transaction) {\n id\n rule_instance_id\n author\n author_device_id\n author_device_latlng\n author_role\n sum_value\n debitor_first\n transaction_items {\n id\n transaction_id\n item_id\n price\n quantity\n rule_instance_id\n unit_of_measurement\n units_measured\n debitor\n creditor\n debitor_profile_id\n creditor_profile_id\n debitor_approval_time\n creditor_approval_time\n debitor_expiration_time\n creditor_expiration_time\n debitor_rejection_time\n creditor_rejection_time\n }\n }\n}", + "variables": "{\n \"transaction\": {\n \"author\": \"GroceryStore\",\n \"author_device_id\": null,\n \"author_device_latlng\": null,\n \"author_role\": \"creditor\",\n \"debitor_first\": null,\n \"sum_value\": \"1.000\",\n \"transaction_items\": [\n {\n \"item_id\": \"bottled water\",\n \"price\": \"1.000\",\n \"quantity\": \"1\",\n \"debitor\": \"JacobWebb\",\n \"creditor\": \"GroceryStore\"\n }\n ]\n }\n}" } }, "tests": [] @@ -138,7 +138,7 @@ "method": "POST", "sortNum": 50000, "created": "2023-01-22T03:27:31.002Z", - "modified": "2024-04-03T04:15:05.853Z", + "modified": "2026-01-28T04:44:47.587Z", "headers": [ { "name": "Content-Type", @@ -155,8 +155,8 @@ "raw": "", "form": [], "graphql": { - "query": "mutation createRequest($transaction_items: [TransactionItemInput!]!, $auth_account: String!) {\n createRequest(transaction_items: $transaction_items, auth_account: $auth_account) {\n id\n rule_instance_id\n author\n author_device_id\n author_device_latlng\n author_role\n sum_value\n transaction_items {\n id\n transaction_id\n item_id\n price\n rule_exec_ids\n quantity\n debitor_first\n rule_instance_id\n unit_of_measurement\n units_measured\n debitor\n creditor\n debitor_profile_id\n creditor_profile_id\n debitor_approval_time\n creditor_approval_time\n debitor_expiration_time\n creditor_expiration_time\n debitor_rejection_time\n creditor_rejection_time \n }\n }\n}", - "variables": "{\n\t\"auth_account\": \"GroceryStore\",\n\t\"transaction_items\": [\n\t\t{\n\t\t\t\"id\": null,\n\t\t\t\"transaction_id\": null,\n\t\t\t\"item_id\": \"9% state sales tax\",\n\t\t\t\"price\": \"0.180\",\n\t\t\t\"quantity\": \"1.000\",\n\t\t\t\"debitor_first\": false,\n\t\t\t\"rule_instance_id\": \"1\",\n\t\t\t\"unit_of_measurement\": null,\n\t\t\t\"units_measured\": null,\n\t\t\t\"debitor\": \"JacobWebb\",\n\t\t\t\"creditor\": \"StateOfCalifornia\",\n\t\t\t\"debitor_profile_id\": null,\n\t\t\t\"creditor_profile_id\": null,\n\t\t\t\"debitor_approval_time\": null,\n\t\t\t\"creditor_approval_time\": null,\n\t\t\t\"debitor_expiration_time\": null,\n\t\t\t\"creditor_expiration_time\": null,\n\t\t\t\"debitor_rejection_time\": null,\n\t\t\t\"creditor_rejection_time\": null\n\t\t},\n\t\t{\n\t\t\t\"id\": null,\n\t\t\t\"transaction_id\": null,\n\t\t\t\"item_id\": \"9% state sales tax\",\n\t\t\t\"price\": \"0.270\",\n\t\t\t\"quantity\": \"2.000\",\n\t\t\t\"debitor_first\": false,\n\t\t\t\"rule_instance_id\": \"1\",\n\t\t\t\"unit_of_measurement\": null,\n\t\t\t\"units_measured\": null,\n\t\t\t\"debitor\": \"JacobWebb\",\n\t\t\t\"creditor\": \"StateOfCalifornia\",\n\t\t\t\"debitor_profile_id\": null,\n\t\t\t\"creditor_profile_id\": null,\n\t\t\t\"debitor_approval_time\": null,\n\t\t\t\"creditor_approval_time\": null,\n\t\t\t\"debitor_expiration_time\": null,\n\t\t\t\"creditor_expiration_time\": null,\n\t\t\t\"debitor_rejection_time\": null,\n\t\t\t\"creditor_rejection_time\": null\n\t\t},\n\t\t{\n\t\t\t\"id\": null,\n\t\t\t\"transaction_id\": null,\n\t\t\t\"item_id\": \"9% state sales tax\",\n\t\t\t\"price\": \"0.360\",\n\t\t\t\"quantity\": \"3.000\",\n\t\t\t\"debitor_first\": false,\n\t\t\t\"rule_instance_id\": \"1\",\n\t\t\t\"unit_of_measurement\": null,\n\t\t\t\"units_measured\": null,\n\t\t\t\"debitor\": \"JacobWebb\",\n\t\t\t\"creditor\": \"StateOfCalifornia\",\n\t\t\t\"debitor_profile_id\": null,\n\t\t\t\"creditor_profile_id\": null,\n\t\t\t\"debitor_approval_time\": null,\n\t\t\t\"creditor_approval_time\": null,\n\t\t\t\"debitor_expiration_time\": null,\n\t\t\t\"creditor_expiration_time\": null,\n\t\t\t\"debitor_rejection_time\": null,\n\t\t\t\"creditor_rejection_time\": null\n\t\t},\n\t\t{\n\t\t\t\"id\": null,\n\t\t\t\"transaction_id\": null,\n\t\t\t\"item_id\": \"milk\",\n\t\t\t\"price\": \"2.000\",\n\t\t\t\"quantity\": \"1\",\n\t\t\t\"debitor_first\": false,\n\t\t\t\"rule_instance_id\": null,\n\t\t\t\"unit_of_measurement\": null,\n\t\t\t\"units_measured\": null,\n\t\t\t\"debitor\": \"JacobWebb\",\n\t\t\t\"creditor\": \"GroceryStore\",\n\t\t\t\"debitor_profile_id\": null,\n\t\t\t\"creditor_profile_id\": null,\n\t\t\t\"debitor_approval_time\": null,\n\t\t\t\"creditor_approval_time\": null,\n\t\t\t\"debitor_expiration_time\": null,\n\t\t\t\"creditor_expiration_time\": null,\n\t\t\t\"debitor_rejection_time\": null,\n\t\t\t\"creditor_rejection_time\": null\n\t\t},\n\t\t{\n\t\t\t\"id\": null,\n\t\t\t\"transaction_id\": null,\n\t\t\t\"item_id\": \"bread\",\n\t\t\t\"price\": \"3.000\",\n\t\t\t\"quantity\": \"2\",\n\t\t\t\"debitor_first\": false,\n\t\t\t\"rule_instance_id\": null,\n\t\t\t\"unit_of_measurement\": null,\n\t\t\t\"units_measured\": null,\n\t\t\t\"debitor\": \"JacobWebb\",\n\t\t\t\"creditor\": \"GroceryStore\",\n\t\t\t\"debitor_profile_id\": null,\n\t\t\t\"creditor_profile_id\": null,\n\t\t\t\"debitor_approval_time\": null,\n\t\t\t\"creditor_approval_time\": null,\n\t\t\t\"debitor_expiration_time\": null,\n\t\t\t\"creditor_expiration_time\": null,\n\t\t\t\"debitor_rejection_time\": null,\n\t\t\t\"creditor_rejection_time\": null\n\t\t},\n\t\t{\n\t\t\t\"id\": null,\n\t\t\t\"transaction_id\": null,\n\t\t\t\"item_id\": \"eggs\",\n\t\t\t\"price\": \"4.000\",\n\t\t\t\"quantity\": \"3\",\n\t\t\t\"debitor_first\": false,\n\t\t\t\"rule_instance_id\": null,\n\t\t\t\"unit_of_measurement\": null,\n\t\t\t\"units_measured\": null,\n\t\t\t\"debitor\": \"JacobWebb\",\n\t\t\t\"creditor\": \"GroceryStore\",\n\t\t\t\"debitor_profile_id\": null,\n\t\t\t\"creditor_profile_id\": null,\n\t\t\t\"debitor_approval_time\": null,\n\t\t\t\"creditor_approval_time\": null,\n\t\t\t\"debitor_expiration_time\": null,\n\t\t\t\"creditor_expiration_time\": null,\n\t\t\t\"debitor_rejection_time\": null,\n\t\t\t\"creditor_rejection_time\": null\n\t\t}\n\t]\n}" + "query": "mutation createRequest($transaction: TransactionInput!, $auth_account: String!) {\n createRequest(transaction: $transaction, auth_account: $auth_account) {\n id\n rule_instance_id\n author\n author_device_id\n author_device_latlng\n author_role\n sum_value\n debitor_first\n transaction_items {\n id\n transaction_id\n item_id\n price\n quantity\n rule_instance_id\n unit_of_measurement\n units_measured\n debitor\n creditor\n debitor_profile_id\n creditor_profile_id\n debitor_approval_time\n creditor_approval_time\n debitor_expiration_time\n creditor_expiration_time\n debitor_rejection_time\n creditor_rejection_time\n }\n }\n}", + "variables": "{\n \"auth_account\": \"GroceryStore\",\n \"transaction\": {\n \"author\": \"GroceryStore\",\n \"author_role\": \"creditor\",\n \"sum_value\": \"19.620\",\n \"transaction_items\": [\n {\n \"item_id\": \"bread\",\n \"price\": \"3.000\",\n \"quantity\": \"2\",\n \"rule_instance_id\": null,\n \"debitor\": \"JacobWebb\",\n \"creditor\": \"GroceryStore\"\n },\n {\n \"item_id\": \"9% state sales tax\",\n \"price\": \"0.270\",\n \"quantity\": \"2.000\",\n \"rule_instance_id\": \"1\",\n \"debitor\": \"JacobWebb\",\n \"creditor\": \"StateOfCalifornia\"\n },\n {\n \"item_id\": \"milk\",\n \"price\": \"4.000\",\n \"quantity\": \"3\",\n \"rule_instance_id\": null,\n \"debitor\": \"JacobWebb\",\n \"creditor\": \"GroceryStore\"\n },\n {\n \"item_id\": \"9% state sales tax\",\n \"price\": \"0.360\",\n \"quantity\": \"3.000\",\n \"rule_instance_id\": \"1\",\n \"debitor\": \"JacobWebb\",\n \"creditor\": \"StateOfCalifornia\"\n }\n ]\n }\n}" } }, "tests": [] @@ -187,8 +187,8 @@ "raw": "", "form": [], "graphql": { - "query": "mutation approveRequest($id: String!, $account_name: String!, $account_role: String!, $auth_account: String!) {\n approveRequest(id: $id, account_name: $account_name, account_role: $account_role, auth_account: $auth_account) {\n id\n rule_instance_id\n author\n author_device_id\n author_device_latlng\n author_role\n equilibrium_time\n sum_value\n transaction_items {\n id\n transaction_id\n item_id\n price\n quantity\n debitor_first\n rule_instance_id\n unit_of_measurement\n units_measured\n debitor\n creditor\n debitor_profile_id\n creditor_profile_id\n debitor_approval_time\n creditor_approval_time\n debitor_expiration_time\n creditor_expiration_time\n debitor_rejection_time\n creditor_rejection_time \n }\n }\n}", - "variables": "{\n \"id\": \"3\",\n \"account_name\": \"JacobWebb\",\n \"account_role\": \"debitor\",\n \"auth_account\": \"JacobWebb\"\n}" + "query": "mutation approveRequest($id: String!, $account_name: String!, $account_role: String!, $auth_account: String!) {\n approveRequest(id: $id, account_name: $account_name, account_role: $account_role, auth_account: $auth_account) {\n id\n rule_instance_id\n author\n author_device_id\n author_device_latlng\n author_role\n equilibrium_time\n debitor_first\n sum_value\n transaction_items {\n id\n transaction_id\n item_id\n price\n quantity\n rule_instance_id\n unit_of_measurement\n units_measured\n debitor\n creditor\n debitor_profile_id\n creditor_profile_id\n debitor_approval_time\n creditor_approval_time\n debitor_expiration_time\n creditor_expiration_time\n debitor_rejection_time\n creditor_rejection_time \n }\n }\n}", + "variables": "{\n \"id\": \"3\",\n \"account_name\": \"JacobWebb\",\n \"account_role\": \"debitor\",\n \"auth_account\": \"JacobWebb\"\n}" } }, "tests": [] @@ -219,7 +219,7 @@ "raw": "", "form": [], "graphql": { - "query": "query getRequestByID($id: String!, $account_name: String!, $auth_account: String!) {\n requestByID(id: $id, account_name: $account_name, auth_account: $auth_account) {\n id\n rule_instance_id\n author\n author_device_id\n author_device_latlng\n author_role\n transaction_items {\n id\n transaction_id\n item_id\n price\n quantity\n debitor_first\n rule_exec_ids\n rule_instance_id\n unit_of_measurement\n units_measured\n debitor\n creditor\n debitor_profile_id\n creditor_profile_id\n debitor_approval_time\n creditor_approval_time\n debitor_expiration_time\n creditor_expiration_time\n debitor_rejection_time\n creditor_rejection_time\n }\n }\n}", + "query": "query getRequestByID($id: String!, $account_name: String!, $auth_account: String!) {\n requestByID(id: $id, account_name: $account_name, auth_account: $auth_account) {\n id\n rule_instance_id\n author\n author_device_id\n author_device_latlng\n author_role\n debitor_first\n transaction_items {\n id\n transaction_id\n item_id\n price\n quantity\n rule_exec_ids\n rule_instance_id\n unit_of_measurement\n units_measured\n debitor\n creditor\n debitor_profile_id\n creditor_profile_id\n debitor_approval_time\n creditor_approval_time\n debitor_expiration_time\n creditor_expiration_time\n debitor_rejection_time\n creditor_rejection_time\n }\n }\n}", "variables": "{\n \"auth_account\": \"JacobWebb\",\n \"account_name\": \"JacobWebb\",\n \"id\": \"1\"\n}" } }, @@ -251,7 +251,7 @@ "raw": "", "form": [], "graphql": { - "query": "query getRequestsByAccount($account_name: String!, $auth_account: String!) {\n requestsByAccount(account_name: $account_name, auth_account: $auth_account) {\n id\n rule_instance_id\n author\n author_device_id\n author_device_latlng\n author_role\n sum_value\n transaction_items {\n id\n transaction_id\n item_id\n price\n quantity\n debitor_first\n rule_instance_id\n unit_of_measurement\n units_measured\n debitor\n creditor\n debitor_profile_id\n creditor_profile_id\n debitor_approval_time\n creditor_approval_time\n debitor_expiration_time\n creditor_expiration_time\n debitor_rejection_time\n creditor_rejection_time\n approvals {\n id\n rule_instance_id\n transaction_id\n transaction_item_id\n account_name\n account_role\n device_id\n device_latlng\n approval_time\n rejection_time\n expiration_time\n }\n }\n }\n}", + "query": "query getRequestsByAccount($account_name: String!, $auth_account: String!) {\n requestsByAccount(account_name: $account_name, auth_account: $auth_account) {\n id\n rule_instance_id\n author\n author_device_id\n author_device_latlng\n author_role\n sum_value\n debitor_first\n transaction_items {\n id\n transaction_id\n item_id\n price\n quantity\n rule_instance_id\n unit_of_measurement\n units_measured\n debitor\n creditor\n debitor_profile_id\n creditor_profile_id\n debitor_approval_time\n creditor_approval_time\n debitor_expiration_time\n creditor_expiration_time\n debitor_rejection_time\n creditor_rejection_time\n approvals {\n id\n rule_instance_id\n transaction_id\n transaction_item_id\n account_name\n account_role\n device_id\n device_latlng\n approval_time\n rejection_time\n expiration_time\n }\n }\n }\n}", "variables": "{\n \"auth_account\": \"JacobWebb\",\n \"account_name\": \"JacobWebb\"\n}" } }, @@ -283,7 +283,7 @@ "raw": "", "form": [], "graphql": { - "query": "query getTransactionsByAccount($account_name: String!, $auth_account: String!) {\n transactionsByAccount(account_name: $account_name, auth_account: $auth_account) {\n id\n rule_instance_id\n author\n author_device_id\n author_device_latlng\n author_role\n\tsum_value\n\tequilibrium_time\n transaction_items {\n id\n transaction_id\n item_id\n price\n quantity\n debitor_first\n rule_instance_id\n unit_of_measurement\n units_measured\n debitor\n creditor\n debitor_profile_id\n creditor_profile_id\n debitor_approval_time\n creditor_approval_time\n debitor_expiration_time\n creditor_expiration_time\n debitor_rejection_time\n creditor_rejection_time\n approvals {\n id\n rule_instance_id\n transaction_id\n transaction_item_id\n account_name\n account_role\n device_id\n device_latlng\n approval_time\n rejection_time\n expiration_time\n }\n }\n }\n}", + "query": "query getTransactionsByAccount($account_name: String!, $auth_account: String!) {\n transactionsByAccount(account_name: $account_name, auth_account: $auth_account) {\n id\n rule_instance_id\n author\n author_device_id\n author_device_latlng\n author_role\n\tsum_value\n\tdebitor_first\n\tequilibrium_time\n transaction_items {\n id\n transaction_id\n item_id\n price\n quantity\n rule_instance_id\n unit_of_measurement\n units_measured\n debitor\n creditor\n debitor_profile_id\n creditor_profile_id\n debitor_approval_time\n creditor_approval_time\n debitor_expiration_time\n creditor_expiration_time\n debitor_rejection_time\n creditor_rejection_time\n approvals {\n id\n rule_instance_id\n transaction_id\n transaction_item_id\n account_name\n account_role\n device_id\n device_latlng\n approval_time\n rejection_time\n expiration_time\n }\n }\n }\n}", "variables": "{\n \"auth_account\": \"JoeCarter\",\n \"account_name\": \"JoeCarter\"\n}" } }, @@ -315,7 +315,7 @@ "raw": "", "form": [], "graphql": { - "query": "query getTransactionByID($id: String!, $account_name: String!, $auth_account: String!) {\n transactionByID(id: $id, account_name: $account_name, auth_account: $auth_account) {\n id\n rule_instance_id\n author\n author_device_id\n author_device_latlng\n author_role\n transaction_items {\n id\n transaction_id\n item_id\n price\n quantity\n debitor_first\n rule_exec_ids\n rule_instance_id\n unit_of_measurement\n units_measured\n debitor\n creditor\n debitor_profile_id\n creditor_profile_id\n debitor_approval_time\n creditor_approval_time\n debitor_expiration_time\n creditor_expiration_time\n debitor_rejection_time\n creditor_rejection_time\n approvals {\n id\n rule_instance_id\n transaction_id\n transaction_item_id\n account_name\n account_role\n device_id\n device_latlng\n approval_time\n rejection_time\n expiration_time\n }\n }\n }\n}", + "query": "query getTransactionByID($id: String!, $account_name: String!, $auth_account: String!) {\n transactionByID(id: $id, account_name: $account_name, auth_account: $auth_account) {\n id\n rule_instance_id\n author\n author_device_id\n author_device_latlng\n author_role\n debitor_first\n transaction_items {\n id\n transaction_id\n item_id\n price\n quantity\n rule_exec_ids\n rule_instance_id\n unit_of_measurement\n units_measured\n debitor\n creditor\n debitor_profile_id\n creditor_profile_id\n debitor_approval_time\n creditor_approval_time\n debitor_expiration_time\n creditor_expiration_time\n debitor_rejection_time\n creditor_rejection_time\n approvals {\n id\n rule_instance_id\n transaction_id\n transaction_item_id\n account_name\n account_role\n device_id\n device_latlng\n approval_time\n rejection_time\n expiration_time\n }\n }\n }\n}", "variables": "{\n \"auth_account\": \"JoeCarter\",\n \"account_name\": \"JoeCarter\",\n \"id\": \"2\"\n}" } }, @@ -369,7 +369,7 @@ "params": [], "body": { "type": "json", - "raw": "[\n {\n \"id\": null,\n \"transaction_id\": null,\n \"item_id\": \"bottled water\",\n \"price\": \"1.000\",\n \"quantity\": \"1\",\n \"debitor_first\": false,\n \"rule_instance_id\": null,\n \"rule_exec_ids\": [],\n \"unit_of_measurement\": null,\n \"units_measured\": null,\n \"debitor\": \"JacobWebb\",\n \"creditor\": \"GroceryStore\",\n \"debitor_profile_id\": null,\n \"creditor_profile_id\": null,\n \"debitor_approval_time\": null,\n \"creditor_approval_time\": null,\n \"debitor_expiration_time\": null,\n \"creditor_expiration_time\": null,\n \"debitor_rejection_time\": null,\n \"creditor_rejection_time\": null\n }\n]", + "raw": "[\n {\n \"id\": null,\n \"transaction_id\": null,\n \"item_id\": \"bottled water\",\n \"price\": \"1.000\",\n \"quantity\": \"1\",\n \"rule_instance_id\": null,\n \"rule_exec_ids\": [],\n \"unit_of_measurement\": null,\n \"units_measured\": null,\n \"debitor\": \"JacobWebb\",\n \"creditor\": \"GroceryStore\",\n \"debitor_profile_id\": null,\n \"creditor_profile_id\": null,\n \"debitor_approval_time\": null,\n \"creditor_approval_time\": null,\n \"debitor_expiration_time\": null,\n \"creditor_expiration_time\": null,\n \"debitor_rejection_time\": null,\n \"creditor_rejection_time\": null\n }\n]", "form": [] }, "tests": []