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}
|