PMI25 commited on
Commit
8f260f9
·
verified ·
1 Parent(s): 2af8587

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +190 -0
app.py ADDED
@@ -0,0 +1,190 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+
3
+ def calculate_vat(amount, vat_rate=20, include_vat=True):
4
+ """
5
+ Рассчитывает НДС и итоговую сумму.
6
+ :param amount: сумма
7
+ :param vat_rate: ставка НДС в процентах
8
+ :param include_vat: True если сумма включает НДС, False если нет
9
+ :return: словарь с результатами
10
+ """
11
+ if amount is None or amount == "":
12
+ return {"error": "Введите сумму"}
13
+
14
+ try:
15
+ amount = float(amount)
16
+ if amount < 0:
17
+ return {"error": "Сумма должна быть положительной"}
18
+ except:
19
+ return {"error": "Некорректное число"}
20
+
21
+ try:
22
+ vat_rate = float(vat_rate)
23
+ except:
24
+ vat_rate = 20.0
25
+
26
+ if include_vat:
27
+ # Сумма включает НДС
28
+ vat_amount = amount * (vat_rate / (100 + vat_rate))
29
+ amount_without_vat = amount - vat_amount
30
+ amount_with_vat = amount
31
+ else:
32
+ # Сумма без НДС
33
+ vat_amount = amount * (vat_rate / 100)
34
+ amount_without_vat = amount
35
+ amount_with_vat = amount + vat_amount
36
+
37
+ return {
38
+ "Сумма без НДС": round(amount_without_vat, 2),
39
+ "Сумма НДС": round(vat_amount, 2),
40
+ "Сумма с НДС": round(amount_with_vat, 2),
41
+ "Ставка НДС": f"{vat_rate}%"
42
+ }
43
+
44
+ def calculate_advance(main_amount, vat_rate, include_vat, advance_percent):
45
+ """
46
+ Рассчитывает аванс и НДС от аванса.
47
+ :param main_amount: основная сумма
48
+ :param vat_rate: ставка НДС
49
+ :param include_vat: включает ли основная сумма НДС
50
+ :param advance_percent: процент аванса
51
+ :return: словарь с результатами по основной сумме и авансу
52
+ """
53
+ # Основной расчёт
54
+ main_result = calculate_vat(main_amount, vat_rate, include_vat)
55
+ if "error" in main_result:
56
+ return {"error": main_result["error"]}
57
+
58
+ try:
59
+ advance_percent = float(advance_percent)
60
+ if advance_percent < 0 or advance_percent > 100:
61
+ return {"error": "Процент аванса должен быть от 0 до 100"}
62
+ except:
63
+ return {"error": "Некорректный процент аванса"}
64
+
65
+ # Рассчитываем аванс от суммы без НДС
66
+ base_for_advance = main_result["Сумма без НДС"]
67
+ advance_amount_without_vat = base_for_advance * (advance_percent / 100)
68
+
69
+ # НДС от аванса
70
+ vat_rate_decimal = float(vat_rate) / 100
71
+ advance_vat = advance_amount_without_vat * vat_rate_decimal
72
+ advance_amount_with_vat = advance_amount_without_vat + advance_vat
73
+
74
+ return {
75
+ "main": main_result,
76
+ "advance": {
77
+ "Процент аванса": f"{advance_percent}%",
78
+ "Сумма аванса без НДС": round(advance_amount_without_vat, 2),
79
+ "НДС от аванса": round(advance_vat, 2),
80
+ "Сумма аванса с НДС": round(advance_amount_with_vat, 2)
81
+ }
82
+ }
83
+
84
+ def format_output(result):
85
+ if "error" in result:
86
+ return result["error"]
87
+
88
+ main = result["main"]
89
+ advance = result["advance"]
90
+
91
+ output = f"""
92
+ ### 📊 **Основной расчёт**
93
+ **Ставка НДС:** {main['Ставка НДС']}
94
+ **Сумма без НДС:** {main['Сумма без НДС']} ₽
95
+ **Сумма НДС:** {main['Сумма НДС']} ₽
96
+ **Сумма с НДС:** {main['Сумма с НДС']} ₽
97
+
98
+ ### 💰 **Расчёт аванса**
99
+ **Процент аванса:** {advance['Процент аванса']}
100
+ **Сумма аванса без НДС:** {advance['Сумма аванса без НДС']} ₽
101
+ **НДС от аванса:** {advance['НДС от аванса']} ₽
102
+ **Сумма аванса с НДС:** {advance['Сумма аванса с НДС']} ₽
103
+
104
+ ### 📈 **Итоговая информация**
105
+ **Оставшаяся сумма к оплате (без НДС):** {round(main['Сумма без НДС'] - advance['Сумма аванса без НДС'], 2)} ₽
106
+ **Оставшийся НДС:** {round(main['Сумма НДС'] - advance['НДС от аванса'], 2)} ₽
107
+ **Итог к оплате (с НДС):** {round(main['Сумма с НДС'] - advance['Сумма аванса с НДС'], 2)} ₽
108
+ """
109
+ return output
110
+
111
+ def main_calculator(amount, vat_rate, include_vat, advance_percent):
112
+ result = calculate_advance(amount, vat_rate, include_vat, advance_percent)
113
+ return format_output(result)
114
+
115
+ examples = [
116
+ ["10000", "20", "Сумма включает НДС", "30"],
117
+ ["5000", "20", "Сумма без НДС", "50"],
118
+ ["12000", "10", "Сумма включает НДС", "20"],
119
+ ["8000", "22", "Сумма без НДС", "40"],
120
+ ]
121
+
122
+ with gr.Blocks(title="Калькулятор НДС и аванса", theme=gr.themes.Soft()) as app:
123
+ gr.Markdown("# 🧮 Калькулятор НДС и аванса")
124
+ gr.Markdown("Рассчитайте НДС от суммы и аванс с выделением налога. Поддерживает разные ставки НДС и проценты аванса.")
125
+
126
+ with gr.Row():
127
+ with gr.Column(scale=1):
128
+ gr.Markdown("### ⚙️ Параметры расчёта")
129
+ amount_input = gr.Textbox(label="Сумма (руб)", placeholder="Введите сумму", info="Основная сумма договора")
130
+
131
+ with gr.Row():
132
+ vat_rate_dropdown = gr.Dropdown(
133
+ choices=["0%", "5%", "10%", "20%", "22%"],
134
+ value="20%",
135
+ label="Ставка НДС"
136
+ )
137
+ include_vat_radio = gr.Radio(
138
+ choices=["Сумма включает НДС", "Сумма без НДС"],
139
+ value="Сумма включает НДС",
140
+ label="Тип суммы",
141
+ info="Укажите, включает ли введённая сумма НДС"
142
+ )
143
+
144
+ advance_percent_slider = gr.Slider(
145
+ minimum=0,
146
+ maximum=100,
147
+ step=10,
148
+ value=30,
149
+ label="Процент аванса",
150
+ info="Выберите процент аванса от суммы"
151
+ )
152
+
153
+ btn = gr.Button("Рассчитать", variant="primary", size="lg")
154
+
155
+ with gr.Column(scale=2):
156
+ gr.Markdown("### 📊 Результаты")
157
+ output = gr.Markdown(label="Детальный расчёт")
158
+
159
+ gr.Markdown("### 📋 Примеры для быстрого тестирования")
160
+ gr.Examples(
161
+ examples=examples,
162
+ inputs=[amount_input, vat_rate_dropdown, include_vat_radio, advance_percent_slider],
163
+ outputs=output,
164
+ label="Нажмите на пример для быстрого расчёта:"
165
+ )
166
+
167
+ gr.Markdown("---")
168
+ gr.Markdown("""
169
+ ### ℹ️ Как пользоваться калькулятором
170
+ 1. Введите основную сумму договора
171
+ 2. Выберите ставку НДС (обычно 20%)
172
+ 3. Укажите, включает ли сумма НДС
173
+ 4. Выберите процент аванса (от 0% до 100%)
174
+ 5. Нажмите "Рассчитать"
175
+
176
+ ### ⚠️ Важно
177
+ - Аванс рассчитывается от суммы без НДС
178
+ - НДС от аванса начисляется отдельно
179
+ - Все суммы округляются до 2-х знаков после запятой
180
+ """)
181
+
182
+ def process(amount, vat_rate_str, include_vat_text, advance_percent):
183
+ vat_rate = float(vat_rate_str.replace("%", ""))
184
+ include_vat = include_vat_text == "Сумма включает НДС"
185
+ return main_calculator(amount, vat_rate, include_vat, advance_percent)
186
+
187
+ btn.click(fn=process, inputs=[amount_input, vat_rate_dropdown, include_vat_radio, advance_percent_slider], outputs=output)
188
+
189
+ if __name__ == "__main__":
190
+ app.launch()