Compare commits

...

3 Commits

Author SHA1 Message Date
VivianDee dc9415ff79 [fix]: Select offer requested amount 2025-06-16 15:40:50 +01:00
VivianDee 51995a3e02 [update]: Repayments table 2025-06-16 12:27:04 +01:00
ameye 265bba2365 Merge branch 'loan_count_fix' of DigiFi/digifi-BankToProductCore into master 2025-06-13 18:53:52 +00:00
5 changed files with 79 additions and 7 deletions
+12 -5
View File
@@ -3,6 +3,7 @@ from marshmallow import ValidationError
from app.api.helpers.response_helper import ResponseHelper
from app.api.services.base_service import BaseService
from app.api.enums import TransactionType
from app.models.transaction_offers import TransactionOffer
from app.utils.logger import logger
from app.api.schemas.select_offer import SelectOfferSchema
from app.extensions import db
@@ -57,14 +58,20 @@ class SelectOfferService(BaseService):
# Get the offer by product ID
offer = Offer.get_offer_by_product_id(product_id)
transaction_offer = TransactionOffer.get_transaction_offer(transaction_offer_id=offer_id)
if not transaction_offer:
logger.error(f"offer {offer_id} not found for customer {customer_id} and transaction {transaction_id}.")
return ResponseHelper.error(result_description="Offer not found.")
db.session.flush()
if amount < offer.min_amount:
logger.error(f"The amount {amount} is less than the minimum allowed offer amount {offer.min_amount}.")
if amount < transaction_offer.min_amount:
logger.error(f"The amount {amount} is less than the minimum allowed offer amount {transaction_offer.min_amount}.")
return ResponseHelper.error(result_description="The amount is less than the minimum allowed offer amount.")
elif amount > offer.max_amount:
logger.error(f"The amount {amount} is greater than the minimum allowed offer amount {offer.min_amount}.")
return ResponseHelper.error(result_description="The amount is greater than the maximum allowed offer amount.")
elif amount > transaction_offer.eligible_amount:
logger.error(f"The amount {amount} is greater than the eligible offer amount {transaction_offer.eligible_amount}.")
return ResponseHelper.error(result_description="The amount is greater than the eligible offer amount.")
+12 -2
View File
@@ -1,11 +1,17 @@
from datetime import datetime, timezone
from app.extensions import db
class RepaymentsData(db.Model):
__tablename__ = 'repayments_data'
__tablename__ = "repayments_data"
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
transaction_id = db.Column(db.String(50), nullable=False)
fbn_transaction_id = db.Column(db.String(50), nullable=True)
customer_id = db.Column(db.String(50), nullable=True)
account_id = db.Column(db.String(50), nullable=True)
repayment_amount = db.Column(db.Float, nullable=True, default=0.0)
amount_collected = db.Column(db.Float, nullable=True, default=0.0)
added_date = db.Column(db.DateTime(timezone=True), default=datetime.now(timezone.utc), nullable=False)
response_code = db.Column(db.String(10), nullable=True)
response_descr = db.Column(db.String(255), nullable=True)
@@ -14,11 +20,15 @@ class RepaymentsData(db.Model):
return {
"id": self.id,
"transaction_id": self.transaction_id,
"fbn_transaction_id": self.fbn_transaction_id,
"customer_id": self.customer_id,
"account_id": self.account_id,
"repayment_amount": self.repayment_amount,
"amount_collected": self.amount_collected,
"added_date": self.added_date.isoformat() if self.added_date else None,
"response_code": self.response_code,
"response_descr": self.response_descr,
}
def __repr__(self):
return f"<RepaymentsData id={self.id}, transaction_id={self.transaction_id}>"
+2
View File
@@ -17,8 +17,10 @@ class Transaction(db.Model):
customer_id = db.Column(db.String(50), nullable=True)
type = db.Column(db.String(50), nullable=False)
channel = db.Column(db.String(50), nullable=False)
phone_number = db.Column(db.String(50), nullable=True)
created_at = db.Column(db.DateTime(timezone=True), server_default=func.now())
updated_at = db.Column(db.DateTime(timezone=True), server_default=func.now(), onupdate=func.now())
def __repr__(self):
return f'<Transaction {self.id}>'
+7
View File
@@ -85,6 +85,13 @@ class TransactionOffer(db.Model):
return cls.query.filter_by(customer_id=customer_id) \
.order_by(cls.created_at.desc()) \
.first()
@classmethod
def get_transaction_offer(cls, transaction_offer_id):
"""
Returns a transaction offer by its ID.
"""
return cls.query.get(transaction_offer_id)
+46
View File
@@ -0,0 +1,46 @@
"""empty message
Revision ID: b54422fb31e0
Revises: 0acd553309a1
Create Date: 2025-06-16 12:24:09.159498
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = 'b54422fb31e0'
down_revision = '0acd553309a1'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
with op.batch_alter_table('repayments_data', schema=None) as batch_op:
batch_op.add_column(sa.Column('fbn_transaction_id', sa.String(length=50), nullable=True))
batch_op.add_column(sa.Column('customer_id', sa.String(length=50), nullable=True))
batch_op.add_column(sa.Column('account_id', sa.String(length=50), nullable=True))
batch_op.add_column(sa.Column('repayment_amount', sa.Float(), nullable=True))
batch_op.add_column(sa.Column('amount_collected', sa.Float(), nullable=True))
with op.batch_alter_table('transactions', schema=None) as batch_op:
batch_op.add_column(sa.Column('phone_number', sa.String(length=50), nullable=True))
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
with op.batch_alter_table('transactions', schema=None) as batch_op:
batch_op.drop_column('phone_number')
with op.batch_alter_table('repayments_data', schema=None) as batch_op:
batch_op.drop_column('amount_collected')
batch_op.drop_column('repayment_amount')
batch_op.drop_column('account_id')
batch_op.drop_column('customer_id')
batch_op.drop_column('fbn_transaction_id')
# ### end Alembic commands ###