Skip to content

Commit

Permalink
22969 - Refactor EFT Shortnames (#1751)
Browse files Browse the repository at this point in the history
  • Loading branch information
seeker25 authored Sep 16, 2024
1 parent 564bc83 commit 543f850
Show file tree
Hide file tree
Showing 12 changed files with 473 additions and 443 deletions.
6 changes: 3 additions & 3 deletions jobs/payment-jobs/poetry.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion jobs/payment-jobs/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ readme = "README.md"

[tool.poetry.dependencies]
python = "^3.12"
pay-api = {git = "https://github.com/seeker25/sbc-pay.git", branch = "logging_changes_part3", subdirectory = "pay-api"}
pay-api = {git = "https://github.com/seeker25/sbc-pay.git", branch = "22969", subdirectory = "pay-api"}
flask = "^3.0.2"
flask-sqlalchemy = "^3.1.1"
sqlalchemy = "^2.0.28"
Expand Down
10 changes: 10 additions & 0 deletions pay-api/src/pay_api/models/eft_credit.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
# limitations under the License.
"""Model to handle all operations related to EFT Credits data."""
from datetime import datetime, timezone
from typing import List, Self
from decimal import Decimal

from sqlalchemy import ForeignKey, func
Expand Down Expand Up @@ -72,3 +73,12 @@ def get_eft_credit_balance(cls, short_name_id: int) -> Decimal:
.one_or_none()

return Decimal(result.credit_balance) if result else 0

@classmethod
def get_eft_credits(cls, short_name_id: int) -> List[Self]:
"""Get EFT Credits with a remaining amount."""
return (cls.query
.filter(EFTCredit.remaining_amount > 0)
.filter(EFTCredit.short_name_id == short_name_id)
.order_by(EFTCredit.created_on.asc())
.all())
478 changes: 419 additions & 59 deletions pay-api/src/pay_api/services/eft_service.py

Large diffs are not rendered by default.

3 changes: 2 additions & 1 deletion pay-api/src/pay_api/services/eft_short_name_summaries.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,11 @@
from pay_api.models import EFTTransaction as EFTTransactionModel
from pay_api.models import db
from pay_api.models.eft_refund import EFTRefund as EFTRefundModel
from pay_api.services.eft_short_names import EFTShortnamesSearch
from pay_api.utils.enums import EFTFileLineType, EFTProcessStatus, EFTShortnameRefundStatus, EFTShortnameStatus
from pay_api.utils.util import unstructure_schema_items

from .eft_short_names import EFTShortnamesSearch


class EFTShortnameSummaries:
"""Service to provide summarized information for EFT Short names."""
Expand Down
363 changes: 11 additions & 352 deletions pay-api/src/pay_api/services/eft_short_names.py

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion pay-api/tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -296,5 +296,5 @@ def get_account_admin_users(auth_account_id):
}
monkeypatch.setattr('pay_api.services.payment_account.get_account_admin_users',
get_account_admin_users)
monkeypatch.setattr('pay_api.services.eft_short_names.get_account_admin_users',
monkeypatch.setattr('pay_api.services.eft_service.get_account_admin_users',
get_account_admin_users)
36 changes: 18 additions & 18 deletions pay-api/tests/unit/api/test_eft_payment_actions.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
from pay_api.models import EFTShortnames as EFTShortnamesModel
from pay_api.models import PaymentAccount as PaymentAccountModel
from pay_api.models import Statement as StatementModel
from pay_api.services.eft_short_names import EFTShortnames as EFTShortnamesService
from pay_api.services import EftService
from pay_api.utils.enums import (
EFTCreditInvoiceStatus, EFTPaymentActions, InvoiceStatus, PaymentMethod, Role, StatementFrequency)
from pay_api.utils.errors import Error
Expand Down Expand Up @@ -107,9 +107,9 @@ def test_eft_apply_credits_action(db, session, client, jwt, app):
assert rv.status_code == 400
assert rv.json['type'] == Error.EFT_INSUFFICIENT_CREDITS.name

credit_invoice_links = EFTShortnamesService.get_shortname_invoice_links(short_name.id, account.id,
[EFTCreditInvoiceStatus.PENDING.value
])
credit_invoice_links = EftService._get_shortname_invoice_links(short_name.id, account.id,
[EFTCreditInvoiceStatus.PENDING.value
])
assert not credit_invoice_links

eft_credits = setup_eft_credits(short_name=short_name, credit_amounts=[50, 25, 125])
Expand All @@ -122,9 +122,9 @@ def test_eft_apply_credits_action(db, session, client, jwt, app):
assert all(eft_credit.remaining_amount == 0 for eft_credit in eft_credits)
assert EFTCreditModel.get_eft_credit_balance(short_name.id) == 0

credit_invoice_links = EFTShortnamesService.get_shortname_invoice_links(short_name.id, account.id,
[EFTCreditInvoiceStatus.PENDING.value
])
credit_invoice_links = EftService._get_shortname_invoice_links(short_name.id, account.id,
[EFTCreditInvoiceStatus.PENDING.value
])
assert credit_invoice_links
assert len(credit_invoice_links) == 4
link_group_id = credit_invoice_links[0].link_group_id
Expand Down Expand Up @@ -254,8 +254,8 @@ def test_eft_reverse_payment_action(db, session, client, jwt, app, admin_users_m
assert rv.status_code == 400
assert rv.json['type'] == Error.EFT_PAYMENT_ACTION_CREDIT_LINK_STATUS_INVALID.name

credit_invoice_links = EFTShortnamesService.get_shortname_invoice_links(short_name.id, account.id,
[EFTCreditInvoiceStatus.PENDING.value])
credit_invoice_links = EftService._get_shortname_invoice_links(short_name.id, account.id,
[EFTCreditInvoiceStatus.PENDING.value])
for link in credit_invoice_links:
assert link.link_group_id is not None
link.status_code = EFTCreditInvoiceStatus.COMPLETED.value
Expand Down Expand Up @@ -295,23 +295,23 @@ def test_eft_reverse_payment_action(db, session, client, jwt, app, admin_users_m
invoices[0].invoice_status_code = InvoiceStatus.PAID.value
invoices[0].save()

credit_invoice_links = EFTShortnamesService.get_shortname_invoice_links(short_name.id, account.id,
[EFTCreditInvoiceStatus.COMPLETED.value,
])
credit_invoice_links = EftService._get_shortname_invoice_links(short_name.id, account.id,
[EFTCreditInvoiceStatus.COMPLETED.value,
])
credit_invoice_links[0].receipt_number = 'ABC123'
credit_invoice_links[0].save()
with patch('pay_api.services.eft_short_names.send_email') as mock_email:
with patch('pay_api.services.eft_service.send_email') as mock_email:
rv = client.post(f'/api/v1/eft-shortnames/{short_name.id}/payment',
data=json.dumps({'action': EFTPaymentActions.REVERSE.value, 'statementId': statement.id}),
headers=headers)
assert rv.status_code == 204
mock_email.assert_called_once()

credit_invoice_links = EFTShortnamesService.get_shortname_invoice_links(short_name.id, account.id,
[EFTCreditInvoiceStatus.PENDING.value,
EFTCreditInvoiceStatus.COMPLETED.value,
EFTCreditInvoiceStatus.PENDING_REFUND.value
])
credit_invoice_links = EftService._get_shortname_invoice_links(short_name.id, account.id,
[EFTCreditInvoiceStatus.PENDING.value,
EFTCreditInvoiceStatus.COMPLETED.value,
EFTCreditInvoiceStatus.PENDING_REFUND.value
])
assert credit_invoice_links
assert len(credit_invoice_links) == 2
assert credit_invoice_links[0].status_code == EFTCreditInvoiceStatus.COMPLETED.value
Expand Down
4 changes: 2 additions & 2 deletions pay-api/tests/unit/services/test_eft_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ def test_refund_eft_credits(session):
credit2 = MagicMock(remaining_amount=4)
credit3 = MagicMock(remaining_amount=3)

with patch('pay_api.services.eft_service.EFTShortnames.get_eft_credits',
with patch('pay_api.models.EFTCredit.get_eft_credits',
return_value=[credit1, credit2, credit3]), \
patch('pay_api.models.EFTCredit.get_eft_credit_balance', return_value=9):
EftService._refund_eft_credits(1, '8')
Expand Down Expand Up @@ -105,7 +105,7 @@ def test_refund_eft_credits_exceed_balance(session):
credit2 = MagicMock(remaining_amount=4)
credit3 = MagicMock(remaining_amount=3)

with patch('pay_api.services.eft_service.EFTShortnames.get_eft_credits',
with patch('pay_api.models.EFTCredit.get_eft_credits',
return_value=[credit1, credit2, credit3]), \
patch('pay_api.models.EFTCredit.get_eft_credit_balance', return_value=8):

Expand Down
8 changes: 4 additions & 4 deletions pay-queue/poetry.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion pay-queue/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ jinja2 = "^3.1.3"
protobuf = "4.25.3"
launchdarkly-server-sdk = "^8.2.1"
cachecontrol = "^0.14.0"
pay-api = {git = "https://github.com/ochiu/sbc-pay.git", subdirectory = "pay-api", branch = "22391-Multi-Account-Under-Payment"}
pay-api = {git = "https://github.com/seeker25/sbc-pay.git", subdirectory = "pay-api", branch = "22969"}
pg8000 = "^1.30.5"


Expand Down
2 changes: 1 addition & 1 deletion pay-queue/tests/integration/test_eft_reconciliation.py
Original file line number Diff line number Diff line change
Expand Up @@ -662,7 +662,7 @@ def test_skip_on_existing_pending_payments(session, app, client):
message_type=QueueMessageTypes.EFT_FILE_UPLOADED.value)

create_statement_from_invoices(payment_account, [invoice])
eft_credits = EFTShortNamesService.get_eft_credits(eft_shortname.id)
eft_credits = EFTCreditModel.get_eft_credits(eft_shortname.id)

# Add an unexpected PENDING record to test that processing skips for this account
EFTCreditInvoiceLinkModel(
Expand Down

0 comments on commit 543f850

Please sign in to comment.