diff --git a/api.saladeaula.digital/app/routes/orders/payment_retries.py b/api.saladeaula.digital/app/routes/orders/payment_retries.py index 76a2546..c280b18 100644 --- a/api.saladeaula.digital/app/routes/orders/payment_retries.py +++ b/api.saladeaula.digital/app/routes/orders/payment_retries.py @@ -50,6 +50,15 @@ def payment_retries( }, exc_cls=InvoiceNotFoundError, ) + transact.put( + item={ + 'id': order_id, + 'sk': 'CREDIT_CARD', + 'brand': credit_card.brand, + 'last4': credit_card.last4, + 'created_at': now_, + } + ) transact.put( item={ 'id': order_id, diff --git a/api.saladeaula.digital/tests/routes/orders/test_payment_retries.py b/api.saladeaula.digital/tests/routes/orders/test_payment_retries.py index 3560151..4c82226 100644 --- a/api.saladeaula.digital/tests/routes/orders/test_payment_retries.py +++ b/api.saladeaula.digital/tests/routes/orders/test_payment_retries.py @@ -1,6 +1,10 @@ from http import HTTPMethod, HTTPStatus -from layercake.dynamodb import DynamoDBPersistenceLayer, KeyPair +from layercake.dynamodb import ( + DynamoDBPersistenceLayer, + SortKey, + TransactKey, +) from ...conftest import HttpApiProxy, LambdaContext @@ -33,12 +37,18 @@ def test_payment_retries( assert r['statusCode'] == HTTPStatus.CREATED r = dynamodb_persistence_layer.collection.get_items( - KeyPair('4b23f6f5-5377-476b-b1de-79427c0295f6', 'TRANSACTION') - + KeyPair( - '4b23f6f5-5377-476b-b1de-79427c0295f6', + TransactKey('4b23f6f5-5377-476b-b1de-79427c0295f6') + + SortKey('TRANSACTION') + + SortKey( + 'CREDIT_CARD', + rename_key='cc', + ) + + SortKey( 'TRANSACTION#STATS', rename_key='stats', - ) + ), ) assert r['credit_card']['number'] == '4111111111111111' assert 'last_attempt_succeeded' not in r['stats'] + assert r['cc']['last4'] == '1111' + assert r['cc']['brand'] == 'Visa' diff --git a/apps/admin.saladeaula.digital/app/routes/_.$orgid.payments.$id._index/route.tsx b/apps/admin.saladeaula.digital/app/routes/_.$orgid.payments.$id._index/route.tsx index f3b09c9..6d410ca 100644 --- a/apps/admin.saladeaula.digital/app/routes/_.$orgid.payments.$id._index/route.tsx +++ b/apps/admin.saladeaula.digital/app/routes/_.$orgid.payments.$id._index/route.tsx @@ -6,6 +6,9 @@ import { useRequest } from 'ahooks' import { AlertCircleIcon, ArrowLeftRightIcon, + CircleCheckIcon, + CircleXIcon, + EllipsisIcon, HelpCircleIcon } from 'lucide-react' import { useEffect } from 'react' @@ -28,8 +31,16 @@ import { CardHeader, CardTitle } from '@repo/ui/components/ui/card' +import { + Command, + CommandEmpty, + CommandGroup, + CommandItem, + CommandList +} from '@repo/ui/components/ui/command' import { Item, + ItemActions, ItemContent, ItemGroup, ItemTitle @@ -46,16 +57,9 @@ import { import { request as req } from '@repo/util/request' import { Abbr } from '@repo/ui/components/abbr' +import { DateTime } from '@repo/ui/components/datetime' import { Badge } from '@repo/ui/components/ui/badge' import { Button } from '@repo/ui/components/ui/button' -import { Kbd } from '@repo/ui/components/ui/kbd' -import { cn } from '@repo/ui/lib/utils' -import { - labels, - statuses, - type Order as Order_ -} from '@repo/ui/routes/orders/data' - import { Dialog, DialogClose, @@ -66,8 +70,20 @@ import { DialogTitle, DialogTrigger } from '@repo/ui/components/ui/dialog' +import { Kbd } from '@repo/ui/components/ui/kbd' +import { + Popover, + PopoverContent, + PopoverTrigger +} from '@repo/ui/components/ui/popover' import { Separator } from '@repo/ui/components/ui/separator' import { Spinner } from '@repo/ui/components/ui/spinner' +import { cn } from '@repo/ui/lib/utils' +import { + labels, + statuses, + type Order as Order_ +} from '@repo/ui/routes/orders/data' import { CreditCard, creditCardSchema, @@ -107,6 +123,13 @@ type Invoice = { secure_url: string } +type Attempts = { + sk: string + status: string + brand: string + last4: string +} + type Order = Order_ & { items: Item[] interest_amount: number @@ -115,6 +138,7 @@ type Order = Order_ & { subtotal: number discount: number address: Address + payment_attempts: Attempts[] credit_card?: CreditCardProps coupon?: string installments?: number @@ -142,8 +166,9 @@ export default function Route({ loaderData: { order } }: Route.ComponentProps) { interest_amount, discount, invoice, - subtotal, - items = [] + payment_attempts = [], + items = [], + subtotal } = order const Component = @@ -203,6 +228,12 @@ export default function Route({ loaderData: { order } }: Route.ComponentProps) { )} + + {payment_attempts.length > 0 ? ( + + + + ) : null} @@ -462,3 +493,60 @@ function CreditCardPaymentDialog({ ) } + +function PaymentAttemptsMenu({ + payment_attempts +}: { + payment_attempts: Attempts[] +}) { + return ( + + + + + + {/*
+ Transações +
*/} +
+ {payment_attempts.map( + ({ sk, brand, last4, status, ...props }, index) => { + const [, , created_at] = sk.split('#') + + return ( +
    +
  • + + + {created_at} + + +
  • +
  • + {brand} +
  • +
  • **** {last4}
  • +
  • + {status === 'FAILED' ? ( + + ) : ( + + )} +
  • +
+ ) + } + )} +
+
+
+ ) +} diff --git a/apps/admin.saladeaula.digital/app/routes/_.$orgid.users[.]json/route.ts b/apps/admin.saladeaula.digital/app/routes/_.$orgid.users[.]json/route.ts index 640698d..3ca9163 100644 --- a/apps/admin.saladeaula.digital/app/routes/_.$orgid.users[.]json/route.ts +++ b/apps/admin.saladeaula.digital/app/routes/_.$orgid.users[.]json/route.ts @@ -3,8 +3,8 @@ import type { Route } from './+types/route' import { MeiliSearchFilterBuilder } from 'meilisearch-helper' import { data } from 'react-router' -import { createSearch } from '@repo/util/meili' import { cloudflareContext } from '@repo/auth/context' +import { createSearch } from '@repo/util/meili' export async function loader({ params, context, request }: Route.LoaderArgs) { const cloudflare = context.get(cloudflareContext) diff --git a/enrollments-events/app/events/issue_cert.py b/enrollments-events/app/events/issue_cert.py index c3ef1fa..09810cf 100644 --- a/enrollments-events/app/events/issue_cert.py +++ b/enrollments-events/app/events/issue_cert.py @@ -133,6 +133,7 @@ def _generate_cert( return None try: + logger.info('Sending data to Paperforge API') # Send template URI and data to Paperforge API to generate a PDF r = requests.post( PAPERFORGE_API, @@ -165,7 +166,7 @@ def _generate_cert( ContentType='application/pdf', ) - logger.debug(f'PDF uploaded successfully to {s3_uri}') + logger.info(f'PDF uploaded successfully to {s3_uri}') except requests.exceptions.RequestException as exc: logger.exception(exc) raise diff --git a/enrollments-events/template.yaml b/enrollments-events/template.yaml index 231e76c..494547a 100644 --- a/enrollments-events/template.yaml +++ b/enrollments-events/template.yaml @@ -394,7 +394,7 @@ Resources: Properties: Handler: events.issue_cert.lambda_handler Tracing: Active - # Timeout: 12 + Timeout: 10 LoggingConfig: LogGroup: !Ref EventLog Policies: