Spaces:
Runtime error
Runtime error
Update app.py
Browse files
app.py
CHANGED
|
@@ -588,172 +588,128 @@ def build_outputs(results, descriptions, result_details, plate_number):
|
|
| 588 |
|
| 589 |
app = FastAPI()
|
| 590 |
|
| 591 |
-
@app.
|
| 592 |
-
def greet_json(
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 593 |
global codes_emb
|
| 594 |
global undetected
|
| 595 |
|
| 596 |
undetected_code = undetected[:3]
|
| 597 |
-
|
| 598 |
-
# if history and history[-1][-1][21:24] == undetected_code:
|
| 599 |
-
# list_his = ""
|
| 600 |
-
# for his in history[::-1]:
|
| 601 |
-
# if his[-1][21:24] != undetected_code:
|
| 602 |
-
# break
|
| 603 |
-
# list_his = his[0] + "\n" + list_his
|
| 604 |
-
|
| 605 |
-
# message += "\n" + list_his
|
| 606 |
|
| 607 |
-
#
|
| 608 |
-
#
|
| 609 |
-
pattern = r'\b([A-Za-z]{1,2})\s?(\d{4})\s?([A-Za-z]{1,3})\b'
|
| 610 |
|
|
|
|
|
|
|
| 611 |
matches = re.findall(pattern, message)
|
| 612 |
-
|
| 613 |
plates = [" ".join(x).upper() for i,x in enumerate(matches)]
|
| 614 |
|
| 615 |
-
plate_numbers = ", ".join(plates)
|
| 616 |
|
| 617 |
-
# if model.config._name_or_path in model_ids[-2:]:
|
| 618 |
if type(model) == CrossEncoder:
|
| 619 |
-
|
| 620 |
-
sentence_pairs = [[message, v["name"]] for v in detail_perhitungan.values()]
|
| 621 |
-
# sentence_pairs = [[message, doc] for doc in documents]
|
| 622 |
scores = model.predict(sentence_pairs, convert_to_tensor=True)
|
| 623 |
-
weights = [
|
| 624 |
-
# scores = [x["score"] for x in model.rank(message, documents)]
|
| 625 |
else:
|
| 626 |
text_emb = model.encode(message)
|
| 627 |
scores = cos_sim(codes_emb, text_emb).mean(axis=-1)#[:,0]
|
| 628 |
-
weights = [
|
| 629 |
-
|
| 630 |
scores_argsort = scores.argsort(descending=True)
|
| 631 |
-
|
| 632 |
-
|
| 633 |
-
# if n_num == 0:
|
| 634 |
-
# std = scores.std()
|
| 635 |
-
# else:
|
| 636 |
-
# std = 0
|
| 637 |
-
if n_num == 0:
|
| 638 |
-
# w_avg = np.average(scores[scores_argsort].numpy(), weights=range(len(scores),0,-1))
|
| 639 |
-
w_avg = np.average(scores[scores_argsort].numpy(), weights=weights)
|
| 640 |
-
else:
|
| 641 |
-
w_avg = 9999
|
| 642 |
-
#[::-1]
|
| 643 |
-
|
| 644 |
-
if is_multiple:
|
| 645 |
-
request_details = []
|
| 646 |
-
request_numbers = []
|
| 647 |
-
request_scores = []
|
| 648 |
-
# request_undetected = False
|
| 649 |
-
# for i,score in enumerate(scores):
|
| 650 |
-
if scores[scores_argsort[0]] < threshold:
|
| 651 |
-
request_details.append(undetected[6:])
|
| 652 |
-
request_numbers.append(undetected_code)
|
| 653 |
-
else:
|
| 654 |
-
for i in scores_argsort:
|
| 655 |
-
# if scores[scores_argsort[0]] - std <= scores[i]:
|
| 656 |
-
if scores[i] > w_avg:
|
| 657 |
-
request_details.append(codes[i][6:])
|
| 658 |
-
request_numbers.append(codes[i][:3])
|
| 659 |
-
request_scores.append(str( round(scores[i].tolist(), 3) ) )
|
| 660 |
-
else:
|
| 661 |
-
if len(request_scores) >= n_num:
|
| 662 |
-
break
|
| 663 |
-
if scores[i] > threshold:
|
| 664 |
-
request_details.append(codes[i][6:])
|
| 665 |
-
request_numbers.append(codes[i][:3])
|
| 666 |
-
request_scores.append(str( round(scores[i].tolist(), 3) ) )
|
| 667 |
-
|
| 668 |
-
|
| 669 |
-
request_numbers_copy = request_numbers
|
| 670 |
-
request_details_copy = request_details
|
| 671 |
-
|
| 672 |
-
request_numbers = "\n".join(request_numbers)
|
| 673 |
-
request_details = "\n".join(request_details)
|
| 674 |
-
request_scores = "\n".join(request_scores)
|
| 675 |
-
|
| 676 |
-
# if len(request_numbers_copy) > 0:
|
| 677 |
-
# for code, detail in zip(request_numbers_copy, request_details_copy):
|
| 678 |
-
# kode_mohon = detail_perhitungan.get(code)
|
| 679 |
-
# formula = kode_mohon.get("formula")
|
| 680 |
-
# description = inspect.getsource(formula).split(":", 2)[-1].strip()
|
| 681 |
-
|
| 682 |
-
# if request_undetected and len(plates) == 0:
|
| 683 |
-
# + f"\n\nConfidence score:\n{request_scores}"
|
| 684 |
-
# return "Request code number:\n" + request_numbers + "\n\nRequest detail:\n" + request_details + "\n\nPlate numbers: " + plate_numbers
|
| 685 |
-
print(request_scores)
|
| 686 |
-
out = ""
|
| 687 |
-
for plate in plates:
|
| 688 |
-
results, descriptions, result_details = [], [], []
|
| 689 |
-
for code in request_numbers_copy:
|
| 690 |
-
result, description, result_detail = get_calculation(code, plate)
|
| 691 |
-
|
| 692 |
-
if result != None:
|
| 693 |
-
results.append(result)
|
| 694 |
-
if descriptions != None:
|
| 695 |
-
descriptions.append(description)
|
| 696 |
-
result_details.append(result_detail)
|
| 697 |
-
|
| 698 |
-
if results:
|
| 699 |
-
out += "\n\n" + build_outputs(results, descriptions, result_details, plate)
|
| 700 |
-
elif vehicle_tax_info.get(plate):
|
| 701 |
-
out += "\n\n" + build_output_vehicle(plate)
|
| 702 |
-
|
| 703 |
-
if out == "":
|
| 704 |
-
descriptions, result_details = [], []
|
| 705 |
-
for code in request_numbers_copy:
|
| 706 |
-
result, description, result_detail = get_calculation(code, "")
|
| 707 |
-
if description != None:
|
| 708 |
-
descriptions.append(description)
|
| 709 |
-
result_details.append(result_detail)
|
| 710 |
-
if descriptions:
|
| 711 |
-
out += "\n\n" + build_output_formula(descriptions, result_details)
|
| 712 |
-
else:
|
| 713 |
-
return "Request code number: " + request_numbers + "\nRequest detail: " + request_details + "\nPlate numbers: " + plate_numbers
|
| 714 |
-
|
| 715 |
-
return {"results":out}
|
| 716 |
-
|
| 717 |
-
# result, description, result_detailget_calculation(request_code, plate_number)
|
| 718 |
-
|
| 719 |
-
|
| 720 |
-
|
| 721 |
-
s_max = scores.argmax()
|
| 722 |
-
|
| 723 |
-
if scores[s_max] < threshold:
|
| 724 |
-
# request_code = "033 - Other/Undetected"
|
| 725 |
-
request_code = undetected
|
| 726 |
-
else:
|
| 727 |
-
request_code = codes[scores.argmax()]
|
| 728 |
-
# "{:.2f}".format(a)
|
| 729 |
|
| 730 |
-
# out = "Request code number: " + request_code[:3] + "\nRequest detail: " + request_code[6:] + f"\nConfidence score: {round(scores[s_max].tolist(),3)}" + "\nPlate numbers: " + plate_numbers
|
| 731 |
|
| 732 |
out = ""
|
| 733 |
-
|
| 734 |
-
|
| 735 |
-
|
| 736 |
-
|
| 737 |
-
|
| 738 |
-
|
| 739 |
-
|
| 740 |
-
result_details.append(result_detail)
|
| 741 |
-
out += "\n\n" + build_outputs(results, descriptions, result_details, plate)
|
| 742 |
-
elif vehicle_tax_info.get(plate):
|
| 743 |
-
out += "\n\n" + build_output_vehicle(plate)
|
| 744 |
-
elif description != None:
|
| 745 |
-
descriptions.append(description)
|
| 746 |
-
result_details.append(result_detail)
|
| 747 |
-
out += "\n\n" + build_output_formula(descriptions, result_details)
|
| 748 |
-
# else:
|
| 749 |
-
# # + f"\nConfidence score: {round(scores[s_max].tolist(),3)}"
|
| 750 |
-
# out += "Request code number: " + request_code[:3] + "\nRequest detail: " + "\nPlate numbers: " + plate_numbers
|
| 751 |
-
|
| 752 |
-
if out == "":
|
| 753 |
-
if request_code[:3] == undetected_code:
|
| 754 |
-
return "Request code number: " + request_code[:3] + "\nRequest detail: " + request_code[6:] + "\nPlate numbers: " + plate_numbers
|
| 755 |
else:
|
| 756 |
-
|
| 757 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 758 |
|
| 759 |
return {"results":out}
|
|
|
|
| 588 |
|
| 589 |
app = FastAPI()
|
| 590 |
|
| 591 |
+
@app.post("/")
|
| 592 |
+
def greet_json(
|
| 593 |
+
message : str,
|
| 594 |
+
threshold : float = 0.0005,
|
| 595 |
+
tarif_pkb : float = 0.015,
|
| 596 |
+
tarif_bbnkb : float = 0.1,
|
| 597 |
+
):
|
| 598 |
global codes_emb
|
| 599 |
global undetected
|
| 600 |
|
| 601 |
undetected_code = undetected[:3]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 602 |
|
| 603 |
+
# tarif_pkb = 1.5/100
|
| 604 |
+
# tarif_bbnkb = 0.1
|
|
|
|
| 605 |
|
| 606 |
+
pattern = r'\b([A-Za-z]{1,2})\s?(\d{2,4})\s?([A-Za-z]{1,3})\b'
|
| 607 |
+
|
| 608 |
matches = re.findall(pattern, message)
|
| 609 |
+
|
| 610 |
plates = [" ".join(x).upper() for i,x in enumerate(matches)]
|
| 611 |
|
|
|
|
| 612 |
|
|
|
|
| 613 |
if type(model) == CrossEncoder:
|
| 614 |
+
sentence_pairs = [[message, v[6:]] for v in codes]
|
|
|
|
|
|
|
| 615 |
scores = model.predict(sentence_pairs, convert_to_tensor=True)
|
| 616 |
+
weights = [9,8]
|
|
|
|
| 617 |
else:
|
| 618 |
text_emb = model.encode(message)
|
| 619 |
scores = cos_sim(codes_emb, text_emb).mean(axis=-1)#[:,0]
|
| 620 |
+
weights = [11,9]
|
| 621 |
+
|
| 622 |
scores_argsort = scores.argsort(descending=True)
|
| 623 |
+
w_avg = np.average(scores[scores_argsort].numpy(), weights=weights)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 624 |
|
|
|
|
| 625 |
|
| 626 |
out = ""
|
| 627 |
+
|
| 628 |
+
for inp in plates:
|
| 629 |
+
|
| 630 |
+
vehicle = df_sample[df_sample["no_polisi"] == inp.strip()].copy()
|
| 631 |
+
|
| 632 |
+
if vehicle.shape[0] == 0:
|
| 633 |
+
out += f"\n\n---\nKendaraan {inp} Tidak Ditemukan\n"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 634 |
else:
|
| 635 |
+
vehicle["nm_pemilik"] = censor_middle(vehicle["nm_pemilik"].values[0], -1)
|
| 636 |
+
vehicle["al_pemilik"] = censor_middle(vehicle["al_pemilik"].values[0], -1)
|
| 637 |
+
|
| 638 |
+
v_type = vehicle["nm_jenis_kb"].values[0]
|
| 639 |
+
nilai_jual = vehicle["nilai_jual"].values[0]
|
| 640 |
+
pnbp_stnk = vehicle["pnbp_stnk"].values[0]
|
| 641 |
+
pnbp_tnkb = vehicle["pnbp_tnkb"].values[0]
|
| 642 |
+
|
| 643 |
+
bobot = df_bobot[df_bobot["JENIS_KENDARAAN"]==v_type]["BOBOT"].values[0]
|
| 644 |
+
|
| 645 |
+
bbnkb = tarif_bbnkb * nilai_jual * 1 # pengenaan
|
| 646 |
+
pkb = tarif_pkb * bobot * nilai_jual * 1 # pengenaan
|
| 647 |
+
|
| 648 |
+
vehicle["nilai_jual"] = f"Rp{int(nilai_jual):,}"
|
| 649 |
+
out += "\n\n---\nDetail Kendaraan:"
|
| 650 |
+
for k,v in vehicle.iloc[0].items():
|
| 651 |
+
out += f"\n{k} \t\t: {v}"
|
| 652 |
+
# out += "\n=================================================================="
|
| 653 |
+
|
| 654 |
+
out += "\n--"
|
| 655 |
+
|
| 656 |
+
if scores[scores_argsort[0]] < threshold:
|
| 657 |
+
continue
|
| 658 |
+
|
| 659 |
+
header_rincian = "| POKOK | DENDA | TOTAL ||\n|-:|-:|-:|:-|\n"
|
| 660 |
+
rincian = "\n\n### RINCIAN:\n\n" + header_rincian
|
| 661 |
+
|
| 662 |
+
is_rincian = False
|
| 663 |
+
|
| 664 |
+
out_k = ""
|
| 665 |
+
|
| 666 |
+
if scores[0] > w_avg:
|
| 667 |
+
out += f"\nBBNKB \t\t: {int(bbnkb):,}"
|
| 668 |
+
|
| 669 |
+
out_k += "\nRumus Bea Balik Nama Kendaraan Bermotor (BBNKB) : TARIF x NJKB x PENGENAAN"
|
| 670 |
+
out_k += f"\nKalkulasi : {tarif_bbnkb*100}% x Rp{int(nilai_jual):,} x 100%"
|
| 671 |
+
out_k += f"\nTotal Pembayaran : Rp{int(bbnkb):,}\n"
|
| 672 |
+
rincian += f"|{int(bbnkb):,}|0|{int(bbnkb):,}|BBNKB|\n"
|
| 673 |
+
is_rincian = True
|
| 674 |
+
else:
|
| 675 |
+
bbnkb = 0
|
| 676 |
+
|
| 677 |
+
if scores[1] > w_avg:
|
| 678 |
+
d = datetime.now().date() - vehicle["tg_akhir_pkb"].values[0]
|
| 679 |
+
d = d.days // 365
|
| 680 |
+
if d < 1:
|
| 681 |
+
d = 1
|
| 682 |
+
# swdkllj = 35000
|
| 683 |
+
swdkllj = dict_swdkllj.get(vehicle["gol"].values[0])
|
| 684 |
+
|
| 685 |
+
out += f"\nPKB \t\t: {int(pkb*d):,}"
|
| 686 |
+
out += f"\nSWDKLLJ \t\t: {int(swdkllj*d):,}"
|
| 687 |
+
out += f"\nPNBP STNK \t\t:{int(pnbp_stnk):,}"
|
| 688 |
+
out += f"\nPNBP TNKB \t\t:{int(pnbp_tnkb):,}"
|
| 689 |
+
out += f"\nTOTAL \t\t: {int(pkb*d + swdkllj*d + pnbp_stnk + pnbp_tnkb + bbnkb):,}"
|
| 690 |
+
|
| 691 |
+
out_k += "\nRumus Pokok Pajak Kendaraan Bermotor (PKB) : TARIF * NJKB * BOBOT * PENGENAAN * TAHUN BAYAR"
|
| 692 |
+
out_k += f"\nKalkulasi : {tarif_pkb*100}% * Rp{int(nilai_jual):,} * {bobot} * 100% * {d}"
|
| 693 |
+
out_k += f"\nTotal Pembayaran : Rp{int(pkb*d):,}\n"
|
| 694 |
+
out_k += "\nRumus Total PKB: PKB + SWDKLLJ + PNBP STNK + PNBP TNKB"
|
| 695 |
+
out_k += f"\nKalkulasi : Rp{int(pkb*d):,} + Rp{int(swdkllj*d):,} + Rp{int(pnbp_stnk):,} + Rp{int(pnbp_tnkb):,}"
|
| 696 |
+
out_k += f"\nTotal Pembayaran : Rp{int(pkb*d + swdkllj*d + pnbp_stnk + pnbp_tnkb):,}\n"
|
| 697 |
+
|
| 698 |
+
rincian += f"|{int(pkb*d):,}|0|{int(pkb*d):,}|PKB|\n" + f"|{int(swdkllj*d):,}|0|{int(swdkllj*d):,}|SWDKLLJ|\n\n"
|
| 699 |
+
rincian_pkb = "### RINCIAN PKB:\n\n| POKOK | DENDA | TOTAL |\n|-:|-:|-:|\n"
|
| 700 |
+
rincian_swdkllj = "### RINCIAN SWDKLLJ:\n\n| POKOK | DENDA | TOTAL |\n|-:|-:|-:|\n"
|
| 701 |
+
for i in range(d):
|
| 702 |
+
rincian_pkb += f"|{int(pkb):,}|0|{int(pkb):,}|PKB|\n"
|
| 703 |
+
rincian_swdkllj += f"|{int(swdkllj):,}|0|{int(swdkllj):,}|PKB|\n"
|
| 704 |
+
rincian += rincian_pkb + "\n" + rincian_swdkllj
|
| 705 |
+
is_rincian = True
|
| 706 |
+
out += out_k
|
| 707 |
+
if is_rincian:
|
| 708 |
+
out += rincian
|
| 709 |
+
if not out and scores[scores_argsort[0]] >= threshold:
|
| 710 |
+
if scores[0] > w_avg:
|
| 711 |
+
out += "\nRumus Bea Balik Nama Kendaraan Bermotor (BBNKB) : TARIF x NJKB x PENGENAAN"
|
| 712 |
+
if scores[1] > w_avg:
|
| 713 |
+
out += "\nRumus Pokok Pajak Kendaraan Bermotor (PKB) : TARIF * NJKB * BOBOT * PENGENAAN"
|
| 714 |
|
| 715 |
return {"results":out}
|