Добавлен новый обработчик для отображения цен на услуги в main.py. Реализована логика сохранения данных пользователя при просмотре цен и формирование сообщения с информацией о ценах на услуги. Эти изменения улучшают информативность и взаимодействие с пользователем.

This commit is contained in:
Vlad 2025-06-03 00:05:46 +03:00
parent f2fe946244
commit f43580e1b0
2 changed files with 156 additions and 0 deletions

100
db_sql/log_payment.sql Normal file
View File

@ -0,0 +1,100 @@
-- Ñîçäàíèå òàáëèöû äëÿ ëîãèðîâàíèÿ âñåõ ïëàòåæíûõ îïåðàöèé
-- Ñîäåðæèò èñ÷åðïûâàþùóþ èíôîðìàöèþ î êëèåíòå, óñëóãå, VIN è ðåçóëüòàòå
-- Ñîçäàíèå ïîñëåäîâàòåëüíîñòè äëÿ ID çàïèñåé
CREATE SEQUENCE payment_logs_seq
START WITH 1
INCREMENT BY 1
CACHE 100;
-- Ñîçäàíèå îñíîâíîé òàáëèöû ëîãîâ
CREATE TABLE payment_logs (
log_id NUMBER PRIMARY KEY,
-- Èíôîðìàöèÿ î ïîëüçîâàòåëå
user_id NUMBER NOT NULL,
user_first_name VARCHAR2(255),
user_last_name VARCHAR2(255),
user_username VARCHAR2(255),
user_language_code VARCHAR2(10),
user_is_premium NUMBER(1) DEFAULT 0,
-- Èíôîðìàöèÿ îá óñëóãå
service_type VARCHAR2(50) NOT NULL, -- 'decode_vin', 'check_salvage', 'get_photos'
vin_number VARCHAR2(17) NOT NULL,
-- Èíôîðìàöèÿ î ïëàòåæå
payment_amount NUMBER(10,2) NOT NULL,
transaction_id VARCHAR2(255),
payment_status VARCHAR2(50) DEFAULT 'completed', -- 'completed', 'pending', 'failed'
payment_currency VARCHAR2(10) DEFAULT 'XTR',
-- Ðåçóëüòàò ïðåäîñòàâëåíèÿ óñëóãè
service_status VARCHAR2(50), -- 'success', 'failed', 'no_data', 'error'
data_found_count NUMBER DEFAULT 0, -- êîëè÷åñòâî íàéäåííûõ çàïèñåé/ôîòî
refund_status VARCHAR2(50) DEFAULT 'no_refund', -- 'no_refund', 'auto_refund', 'manual_refund', 'admin_refund'
refund_reason VARCHAR2(500),
-- Èíôîðìàöèÿ îá àâòîìîáèëå
vehicle_make VARCHAR2(100),
vehicle_model VARCHAR2(100),
vehicle_year VARCHAR2(10),
-- Òåõíè÷åñêàÿ èíôîðìàöèÿ
error_message CLOB,
created_date DATE DEFAULT SYSDATE,
ip_address VARCHAR2(45), -- äëÿ áóäóùåãî èñïîëüçîâàíèÿ
-- Èíäåêñû äëÿ áûñòðîãî ïîèñêà
CONSTRAINT chk_service_type CHECK (service_type IN ('decode_vin', 'check_salvage', 'get_photos')),
CONSTRAINT chk_payment_status CHECK (payment_status IN ('completed', 'pending', 'failed')),
CONSTRAINT chk_service_status CHECK (service_status IN ('success', 'failed', 'no_data', 'error', 'pending')),
CONSTRAINT chk_refund_status CHECK (refund_status IN ('no_refund', 'auto_refund', 'manual_refund', 'admin_refund'))
);
-- Ñîçäàíèå èíäåêñîâ äëÿ îïòèìèçàöèè çàïðîñîâ
CREATE INDEX idx_payment_logs_user_id ON payment_logs(user_id);
CREATE INDEX idx_payment_logs_vin ON payment_logs(vin_number);
CREATE INDEX idx_payment_logs_service_type ON payment_logs(service_type);
CREATE INDEX idx_payment_logs_date ON payment_logs(created_date);
CREATE INDEX idx_payment_logs_transaction_id ON payment_logs(transaction_id);
CREATE INDEX idx_payment_logs_status ON payment_logs(payment_status, service_status);
-- Êîììåíòàðèè ê òàáëèöå è ïîëÿì
COMMENT ON TABLE payment_logs IS 'Ëîãèðîâàíèå âñåõ ïëàòåæíûõ îïåðàöèé áîòà ñ äåòàëüíîé èíôîðìàöèåé';
COMMENT ON COLUMN payment_logs.log_id IS 'Óíèêàëüíûé èäåíòèôèêàòîð çàïèñè';
COMMENT ON COLUMN payment_logs.user_id IS 'ID ïîëüçîâàòåëÿ Telegram';
COMMENT ON COLUMN payment_logs.service_type IS 'Òèï óñëóãè: decode_vin, check_salvage, get_photos';
COMMENT ON COLUMN payment_logs.vin_number IS 'VIN íîìåð àâòîìîáèëÿ';
COMMENT ON COLUMN payment_logs.payment_amount IS 'Ñóììà ïëàòåæà â Telegram Stars';
COMMENT ON COLUMN payment_logs.transaction_id IS 'ID òðàíçàêöèè Telegram';
COMMENT ON COLUMN payment_logs.data_found_count IS 'Êîëè÷åñòâî íàéäåííûõ äàííûõ (çàïèñåé, ôîòî è ò.ä.)';
COMMENT ON COLUMN payment_logs.refund_status IS 'Ñòàòóñ âîçâðàòà ñðåäñòâ';
COMMENT ON COLUMN payment_logs.created_date IS 'Äàòà è âðåìÿ ñîçäàíèÿ çàïèñè';
-- Ñîçäàíèå ïðåäñòàâëåíèÿ äëÿ àíàëèòèêè
CREATE OR REPLACE VIEW payment_analytics AS
SELECT
service_type,
COUNT(*) as total_transactions,
SUM(payment_amount) as total_revenue,
AVG(payment_amount) as avg_payment,
COUNT(CASE WHEN refund_status != 'no_refund' THEN 1 END) as refunds_count,
COUNT(CASE WHEN service_status = 'success' THEN 1 END) as successful_services,
ROUND(COUNT(CASE WHEN service_status = 'success' THEN 1 END) * 100.0 / COUNT(*), 2) as success_rate,
TRUNC(created_date) as date_created
FROM payment_logs
GROUP BY service_type, TRUNC(created_date)
ORDER BY date_created DESC, service_type;
-- Ñîçäàíèå òðèããåðà äëÿ àâòîìàòè÷åñêîãî çàïîëíåíèÿ created_date
CREATE OR REPLACE TRIGGER trg_payment_logs_created_date
BEFORE INSERT ON payment_logs
FOR EACH ROW
BEGIN
IF :NEW.created_date IS NULL THEN
:NEW.created_date := SYSDATE;
END IF;
END;
/

56
main.py
View File

@ -473,6 +473,62 @@ async def help_callback(callback: CallbackQuery, db: OracleDatabase = None):
await callback.answer()
@dp.callback_query(lambda c: c.data == "prices")
async def prices_callback(callback: CallbackQuery, db: OracleDatabase = None):
# Используем переданный db или глобальный oracle_db
database = db or oracle_db
# Сохраняем данные пользователя при просмотре цен
await database.save_user(callback.from_user, "prices_button")
prices_text = (
"💰 **Our Service Prices**\n\n"
"🔍 **VIN Decoding Service:**\n"
f"• Basic info (make, model, year): **FREE** 🆓\n"
f"• Detailed specifications: **{DECODE_PRICE} ⭐**\n"
f" └ Engine details, transmission, safety features\n"
f" └ Dimensions, construction, brake system\n"
f" └ Lighting, additional features, NCSA data\n\n"
"🚨 **Salvage Check Service:**\n"
f"• Records count check: **FREE** 🆓\n"
f"• Detailed damage history: **{CHECK_PRICE} ⭐**\n"
f" └ Primary and secondary damage types\n"
f" └ Sale dates and auction locations\n"
f" └ Odometer readings and repair costs\n"
f" └ Engine/drive status information\n\n"
"📸 **Vehicle Photos Service:**\n"
f"• Photo availability check: **FREE** 🆓\n"
f"• Access to damage photos: **{IMG_PRICE} ⭐**\n"
f" └ High-quality auction images\n"
f" └ Multiple angles of vehicle damage\n"
f" └ Before and after condition photos\n\n"
"⭐ **Payment Information:**\n"
"• All payments made with **Telegram Stars**\n"
"• Instant delivery after successful payment\n"
"• Automatic refund if no data found\n"
"• Admin users get automatic refunds\n\n"
"💡 **Money-back guarantee:** If we can't provide the requested data, "
"your payment will be automatically refunded!"
)
builder = InlineKeyboardBuilder()
builder.button(text=f"🔍 Decode for {DECODE_PRICE}", callback_data="decode_vin")
builder.button(text=f"🚨 Check for {CHECK_PRICE}", callback_data="check_vin")
builder.button(text=f"📸 Photos for {IMG_PRICE}", callback_data="search_car_photo")
builder.adjust(3)
builder.button(text=" Help", callback_data="help")
builder.button(text="🏠 Back to Main Menu", callback_data="main_menu")
builder.adjust(2, 1)
await callback.message.answer(prices_text, reply_markup=builder.as_markup(), parse_mode="Markdown")
await callback.answer()
@dp.callback_query(lambda c: c.data and c.data.startswith("pay_detailed_info:"))
async def pay_detailed_info_callback(callback: CallbackQuery, db: OracleDatabase = None):
# Используем переданный db или глобальный oracle_db