From 90ded7394e1229b3dc10b9bba123d44570859b2c Mon Sep 17 00:00:00 2001 From: Bryce Covert Date: Fri, 27 Jul 2018 11:59:33 -0700 Subject: [PATCH] lots of fixes to sorting and adding dates on checks. --- src/clj/auto_ap/db/checks.clj | 29 ++- src/clj/auto_ap/db/invoices.clj | 20 +- src/clj/auto_ap/graphql/checks.clj | 3 +- src/clj/auto_ap/routes/checks.clj | 6 +- src/cljs/auto_ap/views/pages/checks.cljs | 4 +- .../prod/terraform.tfstate | 12 +- .../prod/terraform.tfstate.backup | 182 +++++++++++++++++- 7 files changed, 229 insertions(+), 27 deletions(-) diff --git a/src/clj/auto_ap/db/checks.clj b/src/clj/auto_ap/db/checks.clj index e381d8eb..0855573e 100644 --- a/src/clj/auto_ap/db/checks.clj +++ b/src/clj/auto_ap/db/checks.clj @@ -50,20 +50,33 @@ (map db->clj) (map data->fields))) -#_(defn add-sort-by [q sort-by asc] +(def all-keys #{:company-id :vendor-id :id :status :date :s3-uuid :s3-key :s3-url :check-number :memo :amount :paid-to :bank-account-id}) + +(defn add-sort-by [q sort-by asc] + (println sort-by) (let [sort-by-key (keyword sort-by)] - (cond (all-keys sort-by-key) - (helpers/merge-order-by q [sort-by-key (when-not asc :desc)]) + (cond (nil? sort-by) + (helpers/merge-order-by q [:date]) + + (= :date sort-by-key) + (helpers/merge-order-by q [:date (when-not asc :desc)]) + + (all-keys sort-by-key) + (helpers/merge-order-by q + [sort-by-key (when-not asc :desc)] + [:date]) (= :vendor sort-by-key) (-> q - (helpers/merge-left-join [:vendors :v] [:= :v.id :invoices.vendor-id] ) - (helpers/merge-order-by [:v.name (when-not asc :desc)])) + (helpers/merge-left-join [:vendors :v] [:= :v.id :checks.vendor-id] ) + (helpers/merge-order-by [:v.name (when-not asc :desc)] + [:date])) (= :company sort-by-key) (-> q - (helpers/merge-left-join [:companies :c] [:= :c.id :invoices.company-id] ) - (helpers/merge-order-by [:c.name (when-not asc :desc)])) + (helpers/merge-left-join [:companies :c] [:= :c.id :checks.company-id] ) + (helpers/merge-order-by [:c.name (when-not asc :desc)] + [:date])) :else q))) @@ -82,7 +95,7 @@ (defn get-graphql [{:keys [start sort-by asc id limit] :as args :or {limit 20}}] (query (cond-> (base-graphql args) - #_#_(not (nil? sort-by) ) (add-sort-by sort-by asc) + true (add-sort-by sort-by asc) true (assoc :limit limit) start (assoc :offset start)))) diff --git a/src/clj/auto_ap/db/invoices.clj b/src/clj/auto_ap/db/invoices.clj index c15a6eff..d00f964b 100644 --- a/src/clj/auto_ap/db/invoices.clj +++ b/src/clj/auto_ap/db/invoices.clj @@ -95,18 +95,28 @@ (defn add-sort-by [q sort-by asc] (let [sort-by-key (keyword sort-by)] - (cond (all-keys sort-by-key) - (helpers/merge-order-by q [sort-by-key (when-not asc :desc)]) + (cond (nil? sort-by) + (helpers/merge-order-by q [:date]) + + (= :date sort-by-key) + (helpers/merge-order-by q [:date (when-not asc :desc)]) + + (all-keys sort-by-key) + (helpers/merge-order-by q + [sort-by-key (when-not asc :desc)] + [:date]) (= :vendor sort-by-key) (-> q (helpers/merge-left-join [:vendors :v] [:= :v.id :invoices.vendor-id] ) - (helpers/merge-order-by [:v.name (when-not asc :desc)])) + (helpers/merge-order-by [:v.name (when-not asc :desc)] + [:date])) (= :company sort-by-key) (-> q (helpers/merge-left-join [:companies :c] [:= :c.id :invoices.company-id] ) - (helpers/merge-order-by [:c.name (when-not asc :desc)])) + (helpers/merge-order-by [:c.name (when-not asc :desc)] + [:date])) :else q))) @@ -123,7 +133,7 @@ (defn get-graphql [{:keys [start sort-by asc limit] :as args :or {limit 20}}] (query (cond-> (base-graphql args) - (not (nil? sort-by) ) (add-sort-by sort-by asc) + true (add-sort-by sort-by asc) true (assoc :limit limit) start (assoc :offset start)))) diff --git a/src/clj/auto_ap/graphql/checks.clj b/src/clj/auto_ap/graphql/checks.clj index 22dd5cf0..d79af5ab 100644 --- a/src/clj/auto_ap/graphql/checks.clj +++ b/src/clj/auto_ap/graphql/checks.clj @@ -10,7 +10,7 @@ [auto-ap.db.invoices :as invoices] [auto-ap.utils :refer [by]] [auto-ap.db.companies :as companies] - [auto-ap.time :refer [parse normal-date]])) + [auto-ap.time :refer [parse normal-date iso-date]])) (defn get-vendor-for-check [context args value] (->graphql @@ -49,6 +49,7 @@ :s3-key nil :s3-url nil :check-number (:check_number args) + :date (parse (:date args) iso-date) :amount (:amount args) :bank-account-id (:bank_account_id args) :vendor-id (:vendor-id invoice) diff --git a/src/clj/auto_ap/routes/checks.clj b/src/clj/auto_ap/routes/checks.clj index 8ec6717e..cc7ff885 100644 --- a/src/clj/auto_ap/routes/checks.clj +++ b/src/clj/auto_ap/routes/checks.clj @@ -74,10 +74,11 @@ [[:cell {:colspan 6 :leading 50} [:spacer]] - [:cell {:colspan 6 :rowspan 2} (when (:signature-file company) + [:cell {:colspan 6 :rowspan 2} (if (:signature-file company) [:image { :top-margin 90 :xscale 0.30 :yscale 0.30 :align :center} - (:signature-file company)])]] + (:signature-file company)] + [:spacer])]] [[:cell {:size 9 } "MEMO"] [:cell {:colspan 5} memo [:line {:line-width 0.15 :color [50 50 50]}]] @@ -193,6 +194,7 @@ :memo memo :vendor-id (:id vendor) :company-id (:id company) + :date (time/now) :pdf-data {:vendor vendor :paid-to (:name vendor) :amount (reduce + 0 (map (comp invoice-amounts :id) invoices)) diff --git a/src/cljs/auto_ap/views/pages/checks.cljs b/src/cljs/auto_ap/views/pages/checks.cljs index a21dbfcd..ff60fe0f 100644 --- a/src/cljs/auto_ap/views/pages/checks.cljs +++ b/src/cljs/auto_ap/views/pages/checks.cljs @@ -115,7 +115,7 @@ "Vendor"] [sorted-column {:on-sort opc :style {:width percentage-size :cursor "pointer"} - :sort-key "invoice-number" + :sort-key "check-number" :sort-by sort-by :asc asc} "Check #"] @@ -127,7 +127,7 @@ "Date"] [sorted-column {:on-sort opc :style {:width "8em" :cursor "pointer"} - :sort-key "total" + :sort-key "amount" :sort-by sort-by :asc asc} "Amount"] diff --git a/terraform/terraform.tfstate.d/prod/terraform.tfstate b/terraform/terraform.tfstate.d/prod/terraform.tfstate index d1035012..8aaa1eea 100644 --- a/terraform/terraform.tfstate.d/prod/terraform.tfstate +++ b/terraform/terraform.tfstate.d/prod/terraform.tfstate @@ -1,7 +1,7 @@ { "version": 3, "terraform_version": "0.11.5", - "serial": 27, + "serial": 30, "lineage": "9b630886-8cee-a57d-c7a2-4f19f13f9c51", "modules": [ { @@ -497,13 +497,13 @@ "aws_sns_topic.yodlee_topic" ], "primary": { - "id": "arn:aws:sns:us-east-1:679918342773:events-yodlee-prod:77f8b52d-4e96-4c8a-82c2-964e85fb7403", + "id": "arn:aws:sns:us-east-1:679918342773:events-yodlee-prod:b73ce5a7-4a49-4617-9b36-f55e53031dd0", "attributes": { - "arn": "arn:aws:sns:us-east-1:679918342773:events-yodlee-prod:77f8b52d-4e96-4c8a-82c2-964e85fb7403", + "arn": "arn:aws:sns:us-east-1:679918342773:events-yodlee-prod:b73ce5a7-4a49-4617-9b36-f55e53031dd0", "confirmation_timeout_in_minutes": "1", "endpoint": "https://app.integreatconsult.com/api/events/yodlee-import", "endpoint_auto_confirms": "true", - "id": "arn:aws:sns:us-east-1:679918342773:events-yodlee-prod:77f8b52d-4e96-4c8a-82c2-964e85fb7403", + "id": "arn:aws:sns:us-east-1:679918342773:events-yodlee-prod:b73ce5a7-4a49-4617-9b36-f55e53031dd0", "protocol": "https", "raw_message_delivery": "false", "topic_arn": "arn:aws:sns:us-east-1:679918342773:events-yodlee-prod" @@ -545,11 +545,11 @@ "type": "aws_caller_identity", "depends_on": [], "primary": { - "id": "2018-07-17 00:28:02.848245172 +0000 UTC", + "id": "2018-07-27 17:35:27.694945812 +0000 UTC", "attributes": { "account_id": "679918342773", "arn": "arn:aws:iam::679918342773:user/bryce", - "id": "2018-07-17 00:28:02.848245172 +0000 UTC", + "id": "2018-07-27 17:35:27.694945812 +0000 UTC", "user_id": "AIDAJPUJFTOKO4IRADMV4" }, "meta": {}, diff --git a/terraform/terraform.tfstate.d/prod/terraform.tfstate.backup b/terraform/terraform.tfstate.d/prod/terraform.tfstate.backup index 101afa85..96e2faff 100644 --- a/terraform/terraform.tfstate.d/prod/terraform.tfstate.backup +++ b/terraform/terraform.tfstate.d/prod/terraform.tfstate.backup @@ -1,7 +1,7 @@ { "version": 3, "terraform_version": "0.11.5", - "serial": 27, + "serial": 30, "lineage": "9b630886-8cee-a57d-c7a2-4f19f13f9c51", "modules": [ { @@ -53,6 +53,28 @@ "deposed": [], "provider": "provider.aws" }, + "aws_cloudwatch_event_rule.yodlee_rule": { + "type": "aws_cloudwatch_event_rule", + "depends_on": [ + "aws_iam_role.yodlee_role" + ], + "primary": { + "id": "schedule-yodlee-import-prod", + "attributes": { + "arn": "arn:aws:events:us-east-1:679918342773:rule/schedule-yodlee-import-prod", + "description": "", + "id": "schedule-yodlee-import-prod", + "is_enabled": "true", + "name": "schedule-yodlee-import-prod", + "role_arn": "arn:aws:iam::679918342773:role/yodlee-role-prod", + "schedule_expression": "rate(4 hours)" + }, + "meta": {}, + "tainted": false + }, + "deposed": [], + "provider": "provider.aws" + }, "aws_cloudwatch_event_target.sns": { "type": "aws_cloudwatch_event_target", "depends_on": [ @@ -76,6 +98,29 @@ "deposed": [], "provider": "provider.aws" }, + "aws_cloudwatch_event_target.yodlee_sns_target": { + "type": "aws_cloudwatch_event_target", + "depends_on": [ + "aws_cloudwatch_event_rule.yodlee_rule", + "aws_sns_topic.yodlee_topic" + ], + "primary": { + "id": "schedule-yodlee-import-prod-SendToSNS", + "attributes": { + "arn": "arn:aws:sns:us-east-1:679918342773:events-yodlee-prod", + "id": "schedule-yodlee-import-prod-SendToSNS", + "input": "", + "input_path": "", + "role_arn": "", + "rule": "schedule-yodlee-import-prod", + "target_id": "SendToSNS" + }, + "meta": {}, + "tainted": false + }, + "deposed": [], + "provider": "provider.aws" + }, "aws_iam_access_key.app_user": { "type": "aws_iam_access_key", "depends_on": [ @@ -117,6 +162,45 @@ "deposed": [], "provider": "provider.aws" }, + "aws_iam_role.yodlee_role": { + "type": "aws_iam_role", + "depends_on": [], + "primary": { + "id": "yodlee-role-prod", + "attributes": { + "arn": "arn:aws:iam::679918342773:role/yodlee-role-prod", + "assume_role_policy": "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Sid\":\"\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"events.amazonaws.com\"},\"Action\":\"sts:AssumeRole\"}]}", + "create_date": "2018-07-17T00:29:10Z", + "force_detach_policies": "false", + "id": "yodlee-role-prod", + "name": "yodlee-role-prod", + "path": "/", + "unique_id": "AROAIFTHATSTTTW472YFY" + }, + "meta": {}, + "tainted": false + }, + "deposed": [], + "provider": "provider.aws" + }, + "aws_iam_role_policy_attachment.allow_schedule_yodlee": { + "type": "aws_iam_role_policy_attachment", + "depends_on": [ + "aws_iam_role.yodlee_role" + ], + "primary": { + "id": "yodlee-role-prod-20180717002911573600000001", + "attributes": { + "id": "yodlee-role-prod-20180717002911573600000001", + "policy_arn": "arn:aws:iam::aws:policy/AmazonSNSFullAccess", + "role": "yodlee-role-prod" + }, + "meta": {}, + "tainted": false + }, + "deposed": [], + "provider": "provider.aws" + }, "aws_iam_role_policy_attachment.allow_send": { "type": "aws_iam_role_policy_attachment", "depends_on": [ @@ -172,6 +256,44 @@ "deposed": [], "provider": "provider.aws" }, + "aws_s3_bucket.data": { + "type": "aws_s3_bucket", + "depends_on": [], + "primary": { + "id": "data.prod.app.integreatconsult.com", + "attributes": { + "acceleration_status": "", + "acl": "private", + "arn": "arn:aws:s3:::data.prod.app.integreatconsult.com", + "bucket": "data.prod.app.integreatconsult.com", + "bucket_domain_name": "data.prod.app.integreatconsult.com.s3.amazonaws.com", + "force_destroy": "false", + "hosted_zone_id": "Z3AQBSTGFYJSTF", + "id": "data.prod.app.integreatconsult.com", + "logging.#": "0", + "policy": "{\"Id\":\"Policy1526084187222\",\"Statement\":[{\"Action\":\"s3:GetObject\",\"Effect\":\"Allow\",\"Principal\":\"*\",\"Resource\":\"arn:aws:s3:::data.prod.app.integreatconsult.com/*\",\"Sid\":\"Stmt1526084185514\"}],\"Version\":\"2012-10-17\"}", + "region": "us-east-1", + "replication_configuration.#": "0", + "request_payer": "BucketOwner", + "server_side_encryption_configuration.#": "0", + "tags.%": "0", + "versioning.#": "1", + "versioning.0.enabled": "false", + "versioning.0.mfa_delete": "false", + "website.#": "1", + "website.0.error_document": "", + "website.0.index_document": "index.html", + "website.0.redirect_all_requests_to": "", + "website.0.routing_rules": "", + "website_domain": "s3-website-us-east-1.amazonaws.com", + "website_endpoint": "data.prod.app.integreatconsult.com.s3-website-us-east-1.amazonaws.com" + }, + "meta": {}, + "tainted": false + }, + "deposed": [], + "provider": "provider.aws" + }, "aws_s3_bucket.invoices": { "type": "aws_s3_bucket", "depends_on": [ @@ -315,6 +437,37 @@ "deposed": [], "provider": "provider.aws" }, + "aws_sns_topic.yodlee_topic": { + "type": "aws_sns_topic", + "depends_on": [], + "primary": { + "id": "arn:aws:sns:us-east-1:679918342773:events-yodlee-prod", + "attributes": { + "application_failure_feedback_role_arn": "", + "application_success_feedback_role_arn": "", + "application_success_feedback_sample_rate": "0", + "arn": "arn:aws:sns:us-east-1:679918342773:events-yodlee-prod", + "delivery_policy": "", + "display_name": "", + "http_failure_feedback_role_arn": "", + "http_success_feedback_role_arn": "", + "http_success_feedback_sample_rate": "0", + "id": "arn:aws:sns:us-east-1:679918342773:events-yodlee-prod", + "lambda_failure_feedback_role_arn": "", + "lambda_success_feedback_role_arn": "", + "lambda_success_feedback_sample_rate": "0", + "name": "events-yodlee-prod", + "policy": "{\"Version\":\"2008-10-17\",\"Id\":\"__default_policy_ID\",\"Statement\":[{\"Sid\":\"__default_statement_ID\",\"Effect\":\"Allow\",\"Principal\":{\"AWS\":\"*\"},\"Action\":[\"SNS:Publish\",\"SNS:RemovePermission\",\"SNS:SetTopicAttributes\",\"SNS:DeleteTopic\",\"SNS:ListSubscriptionsByTopic\",\"SNS:GetTopicAttributes\",\"SNS:Receive\",\"SNS:AddPermission\",\"SNS:Subscribe\"],\"Resource\":\"arn:aws:sns:us-east-1:679918342773:yodlee\",\"Condition\":{\"StringEquals\":{\"AWS:SourceOwner\":\"679918342773\"}}},{\"Sid\":\"__console_pub_0\",\"Effect\":\"Allow\",\"Principal\":{\"AWS\":\"*\"},\"Action\":\"SNS:Publish\",\"Resource\":\"arn:aws:sns:us-east-1:679918342773:yodlee\"}]}", + "sqs_failure_feedback_role_arn": "", + "sqs_success_feedback_role_arn": "", + "sqs_success_feedback_sample_rate": "0" + }, + "meta": {}, + "tainted": false + }, + "deposed": [], + "provider": "provider.aws" + }, "aws_sns_topic_subscription.send_reminders_to_service": { "type": "aws_sns_topic_subscription", "depends_on": [ @@ -338,6 +491,29 @@ "deposed": [], "provider": "provider.aws" }, + "aws_sns_topic_subscription.trigger_yodlee_import": { + "type": "aws_sns_topic_subscription", + "depends_on": [ + "aws_sns_topic.yodlee_topic" + ], + "primary": { + "id": "arn:aws:sns:us-east-1:679918342773:events-yodlee-prod:77f8b52d-4e96-4c8a-82c2-964e85fb7403", + "attributes": { + "arn": "arn:aws:sns:us-east-1:679918342773:events-yodlee-prod:77f8b52d-4e96-4c8a-82c2-964e85fb7403", + "confirmation_timeout_in_minutes": "1", + "endpoint": "https://app.integreatconsult.com/api/events/yodlee-import", + "endpoint_auto_confirms": "true", + "id": "arn:aws:sns:us-east-1:679918342773:events-yodlee-prod:77f8b52d-4e96-4c8a-82c2-964e85fb7403", + "protocol": "https", + "raw_message_delivery": "false", + "topic_arn": "arn:aws:sns:us-east-1:679918342773:events-yodlee-prod" + }, + "meta": {}, + "tainted": false + }, + "deposed": [], + "provider": "provider.aws" + }, "aws_sqs_queue.integreat-mail": { "type": "aws_sqs_queue", "depends_on": [ @@ -369,11 +545,11 @@ "type": "aws_caller_identity", "depends_on": [], "primary": { - "id": "2018-04-10 06:39:11.533275039 +0000 UTC", + "id": "2018-07-27 17:34:20.686230107 +0000 UTC", "attributes": { "account_id": "679918342773", "arn": "arn:aws:iam::679918342773:user/bryce", - "id": "2018-04-10 06:39:11.533275039 +0000 UTC", + "id": "2018-07-27 17:34:20.686230107 +0000 UTC", "user_id": "AIDAJPUJFTOKO4IRADMV4" }, "meta": {},