georgeek commited on
Commit
38e0e74
·
1 Parent(s): aeb2778
bill copy.py DELETED
@@ -1,216 +0,0 @@
1
- #!/usr/bin/env -S poetry run python
2
-
3
- import os
4
- import json
5
- import pdfplumber
6
- import streamlit as st
7
- from openai import OpenAI
8
-
9
- client = OpenAI()
10
-
11
- def load_user_data(user_id):
12
- file_path = os.path.join("data", "user_data", f"user_data_{user_id}.json")
13
- if not os.path.exists(file_path):
14
- return {}
15
- with open(file_path, "r") as file:
16
- return json.load(file)
17
-
18
- def parse_pdf_to_json(pdf_path):
19
- user_id = {}
20
- serie_factura = {}
21
- data_factura = {}
22
- costuri = {}
23
- with pdfplumber.open(pdf_path, ) as pdf:
24
- for page in pdf.pages:
25
- text = page.extract_text()
26
- if text:
27
- lines = text.split('\n')
28
-
29
- # Process each line and look for specific categories
30
- for line in lines:
31
- # Check for 'Data emiterii facturii'
32
- if 'Data facturii' in line:
33
- date = line.split()[-1]
34
- data_factura['Data factura'] = date
35
-
36
- # Check for 'Serie factură'
37
- if 'rul facturii:' in line:
38
- serie = line.split()[-1]
39
- serie_factura['Serie numar'] = serie
40
-
41
- # Check for 'Cont client'
42
- if 'Cont client' in line:
43
- cont = line.split()[-1]
44
- user_id['Cont client'] = cont
45
-
46
- # Check for 'Valoare facturată fără TVA'
47
- if 'Sold precedent' in line:
48
- value = line.split()[-2].replace(',', '.') # Extract and convert to float
49
- costuri['Sold precedent'] = value
50
-
51
- # Check for 'Total bază de impozitare TVA'
52
- elif 'din sold precedent' in line:
53
- value = line.split()[-2].replace(',', '.') # Extract and convert to float
54
- costuri['Total platit din sold precedent'] = value
55
-
56
- # Check for 'TVA'
57
- elif 'TVA' in line and '%' in line:
58
- value = line.split()[-2].replace(',', '.') # Extract and convert to float
59
- costuri['TVA'] = value
60
-
61
- # Check for 'Dobânzi penalizatoare'
62
- elif 'Abonamente' in line:
63
- value = line.split()[-2].replace(',', '.') # Extract and convert to float
64
- costuri['Abonamente si extraopiuni'] = value
65
-
66
- # Check for 'TOTAL DE PLATĂ FACTURĂ CURENTĂ'
67
- elif 'Total factura curenta fara TVA' in line:
68
- value = float(line.split()[-2].replace(',', '.')) # Extract and convert to float
69
- costuri['Total factura curenta fara TVA'] = value
70
-
71
- # Check for 'Sold Cont Contract'
72
- elif 'Servicii utilizate' in line:
73
- value = line.split()[-2].replace(',', '.') # Extract and convert to float
74
- costuri['Servicii utilizate'] = value
75
-
76
- # Check for 'Compensatii'
77
- elif 'Rate terminal' in line:
78
- value = float(line.split()[-2].replace(',', '.')) # Extract and convert to float
79
- costuri['Rate terminal'] = value
80
-
81
- # Check for 'TVA 19,00%'
82
- elif 'TVA 19,00%' in line:
83
- value = float(line.split()[-2].replace(',', '.')) # Extract and convert to float
84
- costuri['TVA'] = value
85
-
86
- # Check for 'Compensatii'
87
- elif 'Total factura curenta' in line:
88
- value = float(line.split()[-2].replace(',', '.')) # Extract and convert to float
89
- costuri['Total factura curenta'] = value
90
-
91
- return costuri
92
-
93
- def check_related_keys(question, user_id):
94
- user_data = load_user_data(user_id)
95
- bill_keys = set()
96
- for bill in user_data.get("bills", []):
97
- bill_keys.update(bill.keys())
98
- return [key for key in bill_keys if key.lower() in question.lower()]
99
-
100
- def process_query(query, user_id):
101
- user_data = load_user_data(user_id)
102
- bill_info = user_data.get("bills", [])
103
- related_keys = check_related_keys(query, user_id)
104
- related_keys_str = ", ".join(related_keys) if related_keys else "N/A"
105
-
106
- if related_keys_str != "N/A":
107
- context = (
108
- f"Citeste informatiile despre costrurile in lei facturate din dictionar: {bill_info} "
109
- f"si raspunde la intrebarea: '{query}' dar numai cu info legate de: {related_keys_str}"
110
- )
111
- else:
112
- context = (
113
- f"Citeste informatiile despre costrurile in lei facturate din dictionar: {bill_info} "
114
- f"si raspunde la intrebarea: '{query}' dar numai cu info legate de factura"
115
- )
116
-
117
- max_input_length = 550
118
- st.write(f"Context:\n{context}")
119
- st.write(f"Context size: {len(context)} characters")
120
-
121
- if len(context) > max_input_length:
122
- st.warning("Prea multe caractere în context, solicitarea nu va fi trimisă.")
123
- return None
124
-
125
- return context
126
-
127
- def main():
128
-
129
- st.title("Telecom Bill Chat with LLM Agent")
130
-
131
- if "user_id" not in st.session_state:
132
- st.session_state.user_id = None
133
-
134
- user_id = st.sidebar.text_input("Introdu numărul de telefon:")
135
- if user_id and user_id != st.session_state.user_id:
136
- data = load_user_data(user_id)
137
- if data:
138
- st.session_state.user_id = user_id
139
- st.success("Utilizator găsit!")
140
- else:
141
- st.warning("Nu am găsit date pentru acest ID. Încărcați o factură PDF la nevoie.")
142
- st.session_state.user_id = user_id
143
-
144
- uploaded_file = st.file_uploader("Încarcă factura PDF", type="pdf")
145
- if uploaded_file and st.session_state.user_id:
146
- bill_data = parse_pdf_to_json(uploaded_file)
147
- existing_data = load_user_data(st.session_state.user_id)
148
- if "bills" not in existing_data:
149
- existing_data["bills"] = []
150
- existing_data["bills"].append(bill_data)
151
- file_path = os.path.join("data", "user_data", f"user_data_{st.session_state['user_id']}.json")
152
- os.makedirs(os.path.dirname(file_path), exist_ok=True)
153
- with open(file_path, "w") as file:
154
- json.dump(existing_data, file)
155
- st.success("Factura a fost încărcată și salvată cu succes!")
156
-
157
- if st.session_state.user_id:
158
- data = load_user_data(st.session_state.user_id)
159
- st.write(f"Phone Number: {st.session_state.user_id}")
160
- st.write("Facturi existente:")
161
- for bill in data.get("bills", []):
162
- st.write(bill)
163
- else:
164
- st.info("Introduceți un ID și/sau încărcați o factură PDF pentru a continua.")
165
-
166
- # Initialize conversation in the session state
167
- # "context_prompt_added" indicates whether we've added the specialized "bill info" context yet.
168
- if "messages" not in st.session_state:
169
- st.session_state["messages"] = [
170
- {"role": "assistant", "content": "Cu ce te pot ajuta?"}
171
- ]
172
- if "context_prompt_added" not in st.session_state:
173
- st.session_state.context_prompt_added = False
174
-
175
- st.write("---")
176
- st.subheader("Chat")
177
-
178
- for msg in st.session_state["messages"]:
179
- st.chat_message(msg["role"]).write(msg["content"])
180
-
181
- if prompt := st.chat_input("Introduceți întrebarea aici:"):
182
- if not st.session_state.user_id:
183
- st.error("Trebuie să introduceți un număr de telefon valid sau să încărcați date.")
184
- return
185
-
186
- # If the context prompt hasn't been added yet, build & inject it once;
187
- # otherwise, just add the user's raw question.
188
- if not st.session_state.context_prompt_added:
189
- final_prompt = process_query(prompt, st.session_state["user_id"])
190
- if final_prompt is None:
191
- st.stop()
192
- st.session_state["messages"].append({"role": "user", "content": final_prompt})
193
- st.session_state.context_prompt_added = True
194
- else:
195
- st.session_state["messages"].append({"role": "user", "content": prompt})
196
-
197
- # Display the latest user message in the chat
198
- st.chat_message("user").write(st.session_state["messages"][-1]["content"])
199
-
200
- # Now call GPT-4 with the entire conversation
201
- completion = client.chat.completions.create(
202
- model="gpt-4",
203
- messages=st.session_state["messages"]
204
- )
205
- response_text = completion.choices[0].message.content.strip()
206
-
207
- st.session_state["messages"].append({"role": "assistant", "content": response_text})
208
- st.chat_message("assistant").write(response_text)
209
-
210
- if hasattr(completion, "usage"):
211
- st.write("Prompt tokens:", completion.usage.prompt_tokens)
212
- st.write("Completion tokens:", completion.usage.completion_tokens)
213
- st.write("Total tokens:", completion.usage.total_tokens)
214
-
215
- if __name__ == "__main__":
216
- main()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
bill.py CHANGED
@@ -16,12 +16,35 @@ if not api_key:
16
 
17
  client = OpenAI()
18
 
 
19
  def load_user_data(user_id):
20
- file_path = os.path.join("data", "user_data", f"user_data_{user_id}.json")
 
 
 
 
21
  if not os.path.exists(file_path):
 
 
 
 
 
 
 
 
 
 
22
  return {}
23
- with open(file_path, "r") as file:
24
- return json.load(file)
 
 
 
 
 
 
 
 
25
 
26
  def parseBill(data):
27
  billDate = data.get("billDate")
@@ -33,16 +56,26 @@ def parseBill(data):
33
 
34
  totalBillCosts = [{"categorie": t.get("cat"), "amount": t.get("amt")} for t in taxItems]
35
  subscriberCosts = []
 
 
 
36
  for sub in subscribers:
37
  logicalResource = sub.get("logicalResource")
38
  billSummaryItems = sub.get("billSummaryItem", [])
39
- subscriberCosts.append({
40
- "logicalResource": logicalResource,
41
- "billSummaryItems": [
42
- {"categorie": bsi.get("cat"), "amount": bsi.get("amt"), "name": bsi.get("name")}
43
- for bsi in billSummaryItems
44
- ],
45
- })
 
 
 
 
 
 
 
46
 
47
  return {
48
  "billDate": billDate,
@@ -50,17 +83,18 @@ def parseBill(data):
50
  "amountDue": amountDue,
51
  "extraCharge": extraCharge,
52
  "totalBillCosts": totalBillCosts,
53
- "subscriberCosts": subscriberCosts
 
54
  }
55
 
56
  def check_related_keys(question, user_id):
57
  user_data = load_user_data(user_id)
58
- bill_keys = set()
59
  for bill in user_data.get("bills", []):
60
- bill_keys.update(bill.keys())
61
- return [key for key in bill_keys if key.lower() in question.lower()]
62
 
63
- def process_query(query, user_id, model):
64
  user_data = load_user_data(user_id)
65
  bill_info = user_data.get("bills", [])
66
  related_keys = check_related_keys(query, user_id)
@@ -68,12 +102,12 @@ def process_query(query, user_id, model):
68
 
69
  if related_keys_str != "N/A":
70
  context = (
71
- f"Citeste informatiile despre costrurile in lei facturate din dictionar: {bill_info} "
72
  f"si raspunde la intrebarea: '{query}' dar numai cu info legate de: {related_keys_str}"
73
  )
74
  else:
75
  context = (
76
- f"Citeste informatiile despre costrurile in lei facturate din dictionar: {bill_info} "
77
  f"si raspunde la intrebarea: '{query}' dar numai cu info legate de factura"
78
  )
79
 
@@ -86,12 +120,12 @@ def process_query(query, user_id, model):
86
  return None
87
 
88
  # Update this part to run the chosen model
89
- if model == "4o":
 
 
 
90
  # Code to run model 4o
91
- st.write("Running model 4o")
92
- elif model == "4o-mini":
93
- # Code to run model 4o-mini
94
- st.write("Running model 4o-mini")
95
 
96
  return context
97
 
@@ -99,37 +133,43 @@ def main():
99
  st.title("Telecom Bill Chat with LLM Agent")
100
 
101
  # Create a sidebar menu to choose between models
102
- model_name = st.sidebar.selectbox("Choose OpenAI Model", ["gpt-4o", "gpt-4o-mini"])
103
  if "user_id" not in st.session_state:
104
  st.session_state.user_id = None
105
 
106
  user_id = st.sidebar.text_input("Introdu numărul de telefon:")
 
 
 
107
  if user_id and user_id != st.session_state.user_id:
108
  data = load_user_data(user_id)
109
  if data:
110
  st.session_state.user_id = user_id
111
  st.success("Utilizator găsit!")
112
  else:
113
- st.warning("Nu am găsit date pentru acest ID. Încărcați o factură PDF la nevoie.")
114
  st.session_state.user_id = user_id
115
 
116
- uploaded_file = st.file_uploader("Încarcă factura JSON", type="json")
117
  if uploaded_file and st.session_state.user_id:
118
  bill_data = json.load(uploaded_file)
119
  parsed_bill = parseBill(bill_data)
120
  existing_data = load_user_data(st.session_state.user_id)
121
- if "bills" not in existing_data:
122
- existing_data["bills"] = []
123
- existing_data["bills"].append(parsed_bill)
124
- file_path = os.path.join("data", "user_data", f"user_data_{st.session_state['user_id']}.json")
125
- os.makedirs(os.path.dirname(file_path), exist_ok=True)
126
- with open(file_path, "w") as file:
127
- json.dump(existing_data, file)
128
- st.success("Factura a fost încărcată și salvată cu succes!")
 
 
 
129
 
130
  if st.session_state.user_id:
131
  data = load_user_data(st.session_state.user_id)
132
- st.write(f"Phone Number: {st.session_state.user_id}")
133
  st.write("Facturi existente:")
134
  for bill in data.get("bills", []):
135
  st.write(bill)
 
16
 
17
  client = OpenAI()
18
 
19
+
20
  def load_user_data(user_id):
21
+ file_path = os.path.join(os.getcwd(), "data", "user_data", f"user_data_{user_id}.json")
22
+ #st.write(f"Loading user data from: {file_path}")
23
+ #st.write(f"Current working directory: {os.getcwd()}")
24
+
25
+ #Verify if the file exists
26
  if not os.path.exists(file_path):
27
+ #st.write("File does not exist.")
28
+ return {}
29
+
30
+ try:
31
+ with open(file_path, "r") as file:
32
+ data = json.load(file)
33
+ #st.write(f"Loaded data: {data}")
34
+ return data
35
+ except json.JSONDecodeError:
36
+ st.write("Error decoding JSON.")
37
  return {}
38
+ except Exception as e:
39
+ st.write(f"An error occurred: {e}")
40
+ return {}
41
+
42
+
43
+ def save_user_data(user_id, data):
44
+ file_path = os.path.join("data", "user_data", f"user_data_{user_id}.json")
45
+ os.makedirs(os.path.dirname(file_path), exist_ok=True)
46
+ with open(file_path, "w") as file:
47
+ json.dump(data, file)
48
 
49
  def parseBill(data):
50
  billDate = data.get("billDate")
 
56
 
57
  totalBillCosts = [{"categorie": t.get("cat"), "amount": t.get("amt")} for t in taxItems]
58
  subscriberCosts = []
59
+ categories = set()
60
+ names = set()
61
+
62
  for sub in subscribers:
63
  logicalResource = sub.get("logicalResource")
64
  billSummaryItems = sub.get("billSummaryItem", [])
65
+ for item in billSummaryItems:
66
+ try:
67
+ categories.add(item["cat"]),
68
+ names.add(item["name"])
69
+ except KeyError:
70
+ continue
71
+
72
+ subscriberCosts.append({
73
+ "Numar telefon": logicalResource,
74
+ "Categorie cost": item["cat"],
75
+ "Cost": item["name"],
76
+ "Valoare": item["amt"]
77
+ })
78
+
79
 
80
  return {
81
  "billDate": billDate,
 
83
  "amountDue": amountDue,
84
  "extraCharge": extraCharge,
85
  "totalBillCosts": totalBillCosts,
86
+ "subscriberCosts": subscriberCosts,
87
+
88
  }
89
 
90
  def check_related_keys(question, user_id):
91
  user_data = load_user_data(user_id)
92
+ categories = set()
93
  for bill in user_data.get("bills", []):
94
+ categories.update(bill.get("categories", []))
95
+ return [category for category in categories if category.lower() in question.lower()]
96
 
97
+ def process_query(query, user_id, model_name):
98
  user_data = load_user_data(user_id)
99
  bill_info = user_data.get("bills", [])
100
  related_keys = check_related_keys(query, user_id)
 
102
 
103
  if related_keys_str != "N/A":
104
  context = (
105
+ f"Citeste informatiile despre costurile in lei facturate din json: {bill_info} "
106
  f"si raspunde la intrebarea: '{query}' dar numai cu info legate de: {related_keys_str}"
107
  )
108
  else:
109
  context = (
110
+ f"Citeste informatiile despre costrurile in lei facturate din json: {bill_info} "
111
  f"si raspunde la intrebarea: '{query}' dar numai cu info legate de factura"
112
  )
113
 
 
120
  return None
121
 
122
  # Update this part to run the chosen model
123
+ if model_name == "gpt-4o-mini":
124
+ # Code to run model 4o mini
125
+ st.write("Running model GPT-4o-mini")
126
+ elif model_name == "gpt-4o":
127
  # Code to run model 4o
128
+ st.write("Running model GPT-4o")
 
 
 
129
 
130
  return context
131
 
 
133
  st.title("Telecom Bill Chat with LLM Agent")
134
 
135
  # Create a sidebar menu to choose between models
136
+ model_name = st.sidebar.selectbox("Choose OpenAI Model", ["gpt-4o-mini", "gpt-4o"])
137
  if "user_id" not in st.session_state:
138
  st.session_state.user_id = None
139
 
140
  user_id = st.sidebar.text_input("Introdu numărul de telefon:")
141
+ # display the user data if the user_id is set
142
+ #st.write(f"User ID: {user_id}")
143
+
144
  if user_id and user_id != st.session_state.user_id:
145
  data = load_user_data(user_id)
146
  if data:
147
  st.session_state.user_id = user_id
148
  st.success("Utilizator găsit!")
149
  else:
150
+ st.warning("Nu am găsit date pentru acest ID. Încărcați o factură json.")
151
  st.session_state.user_id = user_id
152
 
153
+ uploaded_file = st.file_uploader("Upload JSON Bill", type="json")
154
  if uploaded_file and st.session_state.user_id:
155
  bill_data = json.load(uploaded_file)
156
  parsed_bill = parseBill(bill_data)
157
  existing_data = load_user_data(st.session_state.user_id)
158
+
159
+ # Check if the billNo already exists in the existing data
160
+ existing_bill_nos = [bill.get("billNo") for bill in existing_data.get("bills", [])]
161
+ if parsed_bill.get("billNo") in existing_bill_nos:
162
+ st.warning("Factura existentă.")
163
+ else:
164
+ if "bills" not in existing_data:
165
+ existing_data["bills"] = []
166
+ existing_data["bills"].append(parsed_bill)
167
+ save_user_data(st.session_state.user_id, existing_data)
168
+ st.success("Factura a fost încărcată și salvată cu succes!")
169
 
170
  if st.session_state.user_id:
171
  data = load_user_data(st.session_state.user_id)
172
+ st.write(f"Numar telefon: {st.session_state.user_id}")
173
  st.write("Facturi existente:")
174
  for bill in data.get("bills", []):
175
  st.write(bill)
data/bill_text.txt DELETED
@@ -1,38 +0,0 @@
1
- Factură seria FX nr. 24107160858 din data de 18.11.2024
2
- Furnizor
3
- SPEEH HIDROELECTRICA SA
4
- Societate administrată în sistem dualist
5
- Adresa: Bucuresti , B-dul Ion Mihalache nr. 15-17 ,cod postal 011171 .
6
- CIF: RO13267213, Nr. inreg. RC: J40/7426/2000
7
- Cont Bancar: RO63RNCB 0072 0183 3187 0495
8
- Banca: BCR
9
- Capital social: 4.498.025.670 Lei
10
- Centru de relații cu clienții: București, B-dul Ion Mihalache, nr. 15-17,
11
- sector 1, cod poștal 011171
12
- Program centrul de relații cu clienții: luni - joi, orele 10 - 14
13
- Client TICA SERBAN-GEORGE
14
- Adresa: Strada (N/A),8, bl. 17, sc. 1, et. 2, ap. 10
15
- Loc. BUCURESTI SECTORUL 4, jud./sect. Bucureşti
16
- Cod poștal 040023
17
- Cod Client:9900471492
18
- Cod Cont Contract:8000653635
19
- Număr contract / data contract / data încetare
20
- 2022.3293.2183 / 13.12.2022 / 16.12.2025
21
- Ofertă client casnic: Viitor verde
22
- Produse Valoare
23
- Perioadă de facturare:
24
- 28.09.2024 - 31.10.2024 1 Valoare facturată fără TVA (conform "Detalii factură") 135,96 lei
25
- 2 Total bază de impozitare TVA (19%) 135,96 lei
26
- Data scadență:
27
- 3 TVA 19% (3=2*19%) 25,83 lei
28
- 03.01.2025
29
- 4 Dobânzi penalizatoare 3,59 lei
30
- 5 TOTAL DE PLATĂ FACTURĂ CURENTĂ (5=1+3+4) 165,38 lei
31
- (conform "Detalii factură")
32
- 6 Sold Cont Contract la data emiterii facturii (facturi 577,61 lei
33
- restante sau creditate)
34
- 7 Compensatii Aplicare ORD.46/2021 -30,00 lei
35
- 8 TOTAL DE PLATĂ CONT CONTRACT (8=5+6+7) 712,99 lei
36
- 9 Consum Energie Activă în perioada de facturare 211,00 kWh
37
- 10Preţ final facturat energie electrică activă 0,77 lei/kWh
38
- Cod de bare pentru factura curent:ă 135.38 lei
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
data/user_data/user_data_0724077190.json ADDED
@@ -0,0 +1 @@
 
 
1
+ {"bills": [{"billDate": "2025-01-06", "billNo": "VDF685952701", "amountDue": 5550.46, "extraCharge": 5445.53, "totalBillCosts": [{"categorie": "Total factura curenta", "amount": 104.93}, {"categorie": "TVA 19%", "amount": 16.75}, {"categorie": "Total rate terminal", "amount": 5445.53}, {"categorie": "Abonamente si extraoptiuni", "amount": 91.17}, {"categorie": "Reduceri", "amount": -2.99}, {"categorie": "Rest plata", "amount": -5073.74}, {"categorie": "Sold precedent", "amount": -5073.74}, {"categorie": "Total de plata", "amount": 476.72}], "subscriberCosts": [{"Numar telefon": "724015962", "Categorie cost": "Abonamente si extraoptiuni", "Cost": "Red 11", "Valoare": 34.08}, {"Numar telefon": "724015962", "Categorie cost": "Abonamente si extraoptiuni", "Cost": "Reducere promo", "Valoare": -8.52}, {"Numar telefon": "724015962", "Categorie cost": "Abonamente si extraoptiuni", "Cost": "Secure Net", "Valoare": 2.99}, {"Numar telefon": "724015962", "Categorie cost": "Abonamente si extraoptiuni", "Cost": "Reducere promotionala 12 luni", "Valoare": -4.26}, {"Numar telefon": "724015962", "Categorie cost": "Rate terminal", "Cost": "Promotie Vodafone Smartphone cu plata in rate 12/36", "Valoare": 70.99}, {"Numar telefon": "373920691", "Categorie cost": "Abonamente si extraoptiuni", "Cost": "Abonament Vodafone WiFi Instant Nelimitat+", "Valoare": 29.82}, {"Numar telefon": "724077190", "Categorie cost": "Reduceri", "Cost": "Reducere Secure Net", "Valoare": -2.99}, {"Numar telefon": "724077190", "Categorie cost": "Abonamente si extraoptiuni", "Cost": "RED Start", "Valoare": 38.33}, {"Numar telefon": "724077190", "Categorie cost": "Abonamente si extraoptiuni", "Cost": "Secure Net", "Valoare": 2.99}, {"Numar telefon": "724077190", "Categorie cost": "Abonamente si extraoptiuni", "Cost": "Reducere promotionala 12 luni", "Valoare": -4.26}, {"Numar telefon": "724077190", "Categorie cost": "Rate terminal", "Cost": "Valoare rate ramase pana la expirare contract", "Valoare": 5374.54}]}]}
data/user_data/user_data_0727723137.json DELETED
@@ -1 +0,0 @@
1
- {"bills": [{"Sold precedent": "precedent", "Servicii utilizate": "utilizate", "TVA": "19.00%"}, {"Sold precedent": "precedent", "Servicii utilizate": "utilizate", "TVA": "19.00%"}, {"Sold precedent": "precedent", "Total platit din sold precedent": "precedent", "Servicii utilizate": "utilizate", "TVA": "19.00%"}, {"Sold precedent": "precedent", "Total platit din sold precedent": "precedent", "Abonamente si extraop\u00feiuni": "Abonamentele", "Servicii utilizate": "Servicii", "TVA": "19.00%"}, {"Sold precedent": "precedent", "Total platit din sold precedent": "precedent", "Abonamente si extraopiuni": "Abonamentele", "Servicii utilizate": "Servicii", "TVA": "19.00%"}]}