Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
186 changes: 147 additions & 39 deletions claimManagement/src/main/java/org/openimis/imisclaims/ClaimActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,9 @@
import android.database.Cursor;
import android.inputmethodservice.Keyboard;
import android.os.Bundle;
import android.text.Editable;
import android.text.InputType;
import android.text.TextWatcher;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
Expand Down Expand Up @@ -93,7 +95,32 @@ public static Intent newIntent(@NonNull Context context, @NonNull String claimUU
RadioButton rbEmergency, rbReferral, rbOther, rbPositive, rbNegative;
ImageButton btnScan;
LinearLayout llFagepFields;
TextInputLayout ettClaimPrefix, ettGuaranteeNo;
TextInputLayout ettClaimPrefix, ettGuaranteeNo, ettClaimCode;
private volatile ValidationResult latestValidationResult;

private static class LocalClaimCodeValidationResult {
private final boolean valid;
private final String errorMessage;

private LocalClaimCodeValidationResult(boolean valid, String errorMessage) {
this.valid = valid;
this.errorMessage = errorMessage;
}
}

private static class ValidationResult {
private final boolean valid;
private final View errorView;
private final String errorMessage;
private final LocalClaimCodeValidationResult localClaimCodeValidationResult;

private ValidationResult(boolean valid, View errorView, String errorMessage, LocalClaimCodeValidationResult localClaimCodeValidationResult) {
this.valid = valid;
this.errorView = errorView;
this.errorMessage = errorMessage;
this.localClaimCodeValidationResult = localClaimCodeValidationResult;
}
}

@Override
protected void onCreate(Bundle savedInstanceState) {
Expand Down Expand Up @@ -140,6 +167,10 @@ protected void onCreate(Bundle savedInstanceState) {
etVisitType = findViewById(R.id.etVisitType);
ettClaimPrefix = findViewById(R.id.ettClaimPrefix);
ettGuaranteeNo = findViewById(R.id.ettGuaranteeNo);
View claimCodeParent = (View) etClaimCode.getParent();
if (claimCodeParent instanceof TextInputLayout) {
ettClaimCode = (TextInputLayout) claimCodeParent;
}

String[] visitTypes = getResources().getStringArray(R.array.visitType);
ArrayAdapter<String> visitTypeAdapter = new ArrayAdapter<>(this, android.R.layout.simple_dropdown_item_1line, visitTypes);
Expand Down Expand Up @@ -170,6 +201,25 @@ public void onItemClick(AdapterView<?> adapterView, View view, int position, lon
rgVisitType.setVisibility(View.GONE);
ettGuaranteeNo.setVisibility(View.GONE);

TextWatcher claimCodeUniquenessWatcher = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
// no-op
}

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// no-op
}

@Override
public void afterTextChanged(Editable s) {
validateLocalClaimCodeUniqueness();
}
};
etClaimCode.addTextChangedListener(claimCodeUniquenessWatcher);
etClaimPrefix.addTextChangedListener(claimCodeUniquenessWatcher);

tvItemTotal.setText("0");
tvServiceTotal.setText("0");

Expand Down Expand Up @@ -267,7 +317,14 @@ public void onItemClick(AdapterView<?> adapterView, View view, int position, lon
btnPost.setOnClickListener(v -> {
progressDialog = ProgressDialog.show(this, "", getResources().getString(R.string.Processing));
runOnNewThread(
() -> isValidData() && saveClaim(),
() -> {
ValidationResult validationResult = validateDataForSubmission();
latestValidationResult = validationResult;
if (!validationResult.valid) {
return false;
}
return saveClaim();
},
() -> runOnUiThread(() -> {
ClearForm();
progressDialog.dismiss();
Expand All @@ -278,7 +335,12 @@ public void onItemClick(AdapterView<?> adapterView, View view, int position, lon
}
}));
}),
() -> progressDialog.dismiss(),
() -> runOnUiThread(() -> {
if (latestValidationResult != null) {
renderValidationResult(latestValidationResult);
}
progressDialog.dismiss();
}),
500
);
});
Expand Down Expand Up @@ -756,26 +818,23 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
}
}

private boolean isValidData() {
private ValidationResult validateDataForSubmission() {
LocalClaimCodeValidationResult localClaimCodeValidationResult = checkLocalClaimCodeUniqueness();

if (etHealthFacility.getText().length() == 0) {
showValidationDialog(etHealthFacility, getResources().getString(R.string.MissingHealthFacility));
return false;
return invalidValidationResult(etHealthFacility, getResources().getString(R.string.MissingHealthFacility), localClaimCodeValidationResult);
}

if (sqlHandler.getAdjustability("ClaimAdministrator").equals("M") && etClaimAdmin.getText().length() == 0) {
showValidationDialog(etClaimAdmin, getResources().getString(R.string.MissingClaimAdmin));
return false;
return invalidValidationResult(etClaimAdmin, getResources().getString(R.string.MissingClaimAdmin), localClaimCodeValidationResult);
}

if (etClaimCode.getText().length() == 0) {
showValidationDialog(etClaimCode, getResources().getString(R.string.MissingClaimCode));
return false;
return invalidValidationResult(etClaimCode, getResources().getString(R.string.MissingClaimCode), localClaimCodeValidationResult);
}

if (etInsureeNumber.getText().length() == 0) {
showValidationDialog(etInsureeNumber, getResources().getString(R.string.MissingCHFID));
return false;
return invalidValidationResult(etInsureeNumber, getResources().getString(R.string.MissingCHFID), localClaimCodeValidationResult);
}

/*if (!etProgram.getText().toString().equals("VIH")) {
Expand All @@ -787,18 +846,15 @@ private boolean isValidData() {
}*/

if (!isValidInsureeNumber()) {
showValidationDialog(etInsureeNumber, getResources().getString(R.string.InvalidCHFID));
return false;
return invalidValidationResult(etInsureeNumber, getResources().getString(R.string.InvalidCHFID), localClaimCodeValidationResult);
}

if (etStartDate.getText().length() == 0) {
showValidationDialog(etStartDate, getResources().getString(R.string.MissingStartDate));
return false;
return invalidValidationResult(etStartDate, getResources().getString(R.string.MissingStartDate), localClaimCodeValidationResult);
}

if (etEndDate.getText().length() == 0) {
showValidationDialog(etEndDate, getResources().getString(R.string.MissingEndDate));
return false;
return invalidValidationResult(etEndDate, getResources().getString(R.string.MissingEndDate), localClaimCodeValidationResult);
}

try {
Expand All @@ -810,36 +866,34 @@ private boolean isValidData() {
Date End_date = DateUtils.dateFromString(EndDate);

if (End_date.after(Current_date)) {
showValidationDialog(etEndDate, getResources().getString(R.string.AfterCurrentDate));
return false;
return invalidValidationResult(etEndDate, getResources().getString(R.string.AfterCurrentDate), localClaimCodeValidationResult);
}

if (Start_date.after(End_date)) {
showValidationDialog(etEndDate, getResources().getString(R.string.BiggerDate));
return false;
return invalidValidationResult(etEndDate, getResources().getString(R.string.BiggerDate), localClaimCodeValidationResult);
}
} catch (Exception e) {
Log.e(LOG_TAG, "Error while parsing dates", e);
}

if (etDiagnosis.getText().length() == 0) {
showValidationDialog(etDiagnosis, getResources().getString(R.string.MissingDisease));
return false;
return invalidValidationResult(etDiagnosis, getResources().getString(R.string.MissingDisease), localClaimCodeValidationResult);
}

if (etProgram.getText().length() == 0) {
showValidationDialog(etProgram, getResources().getString(R.string.MissingProgram));
return false;
return invalidValidationResult(etProgram, getResources().getString(R.string.MissingProgram), localClaimCodeValidationResult);
}

if(etClaimPrefix.getText().length() == 0){
showValidationDialog(etClaimPrefix, getResources().getString(R.string.MissingChequeNumber));
return false;
return invalidValidationResult(etClaimPrefix, getResources().getString(R.string.MissingChequeNumber), localClaimCodeValidationResult);
}

if(etClaimCode.getText().length() > 7){
showValidationDialog(etClaimPrefix, getResources().getString(R.string.InvalidClaimCode));
return false;
return invalidValidationResult(etClaimPrefix, getResources().getString(R.string.InvalidClaimCode), localClaimCodeValidationResult);
}

if (!localClaimCodeValidationResult.valid) {
return invalidValidationResult(etClaimCode, localClaimCodeValidationResult.errorMessage, localClaimCodeValidationResult);
}

// if (rgVisitType.getCheckedRadioButtonId() == -1) {
Expand All @@ -848,26 +902,22 @@ private boolean isValidData() {
// }

if(etVisitType.getText().toString().isEmpty()){
showValidationDialog(rgVisitType, getResources().getString(R.string.MissingVisitType));
return false;
return invalidValidationResult(rgVisitType, getResources().getString(R.string.MissingVisitType), localClaimCodeValidationResult);
}

if (Float.parseFloat(tvItemTotal.getText().toString()) + Float.parseFloat(tvServiceTotal.getText().toString()) == 0) {
showValidationDialog(tvItemTotal, getResources().getString(R.string.MissingClaim));
return false;
return invalidValidationResult(tvItemTotal, getResources().getString(R.string.MissingClaim), localClaimCodeValidationResult);
}

if(prefixProgramCode.equals("PAL")){
if(etTestNumber.getText().length() == 0){
showValidationDialog(etClaimPrefix, getResources().getString(R.string.MissingTestNumber));
return false;
return invalidValidationResult(etClaimPrefix, getResources().getString(R.string.MissingTestNumber), localClaimCodeValidationResult);
}
if(rgTdr.getCheckedRadioButtonId() == -1){
showValidationDialog(etClaimPrefix, getResources().getString(R.string.MissingTdr));
return false;
return invalidValidationResult(etClaimPrefix, getResources().getString(R.string.MissingTdr), localClaimCodeValidationResult);
}
}
return true;
return new ValidationResult(true, null, null, localClaimCodeValidationResult);
}

private boolean isValidInsureeNumber() {
Expand Down Expand Up @@ -970,4 +1020,62 @@ private boolean saveClaim() {
return true;
}

private LocalClaimCodeValidationResult checkLocalClaimCodeUniqueness() {
if (getIntent().hasExtra(EXTRA_CLAIM_UUID)) {
return new LocalClaimCodeValidationResult(true, null);
}
String finalCode = etClaimPrefix.getText().toString() + etClaimCode.getText().toString();
if (finalCode.trim().isEmpty()) {
return new LocalClaimCodeValidationResult(true, null);
}

boolean exists = sqlHandler.existsClaimCode(finalCode);
if (exists) {
String errorMessage = getResources().getString(R.string.ClaimNumberExist);
return new LocalClaimCodeValidationResult(false, errorMessage);
}
return new LocalClaimCodeValidationResult(true, null);
}

private void renderLocalClaimCodeError(@NonNull LocalClaimCodeValidationResult result) {
if (ettClaimCode != null) {
if (result.valid) {
ettClaimCode.setError(null);
ettClaimCode.setErrorEnabled(false);
} else {
ettClaimCode.setErrorEnabled(true);
ettClaimCode.setError(result.errorMessage);
}
return;
}
if (result.valid) {
etClaimCode.setError(null);
} else {
etClaimCode.setError(result.errorMessage);
}
}

private boolean validateLocalClaimCodeUniqueness() {
LocalClaimCodeValidationResult result = checkLocalClaimCodeUniqueness();
renderLocalClaimCodeError(result);
return result.valid;
}

private ValidationResult invalidValidationResult(@NonNull View errorView, @NonNull String errorMessage, @NonNull LocalClaimCodeValidationResult localClaimCodeValidationResult) {
return new ValidationResult(false, errorView, errorMessage, localClaimCodeValidationResult);
}

private void renderValidationResult(@NonNull ValidationResult result) {
renderLocalClaimCodeError(result.localClaimCodeValidationResult);
if (result.valid) {
return;
}
showDialog(result.errorMessage, (dialog, which) -> {
if (result.errorView instanceof EditText) {
EditText editText = (EditText) result.errorView;
editText.requestFocus();
}
});
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -344,6 +344,8 @@ protected void runOnNewThread(@NonNull Supplier<Boolean> task, @NonNull Runnable
}
}

// Callbacks are executed on this worker thread.
// Any UI updates inside callbacks must be wrapped in runOnUiThread(...).
if (result) {
onTaskSucceed.run();
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1194,6 +1194,18 @@ public String getClaimUUIDForCode(@NonNull String claimCode) {
return null;
}

public boolean existsClaimCode(@NonNull String claimCode) {
try (Cursor cursor = db.rawQuery(
"SELECT 1 FROM tblClaimDetails WHERE LOWER(ClaimCode) = LOWER(?) LIMIT 1",
new String[]{claimCode}
)) {
return cursor != null && cursor.moveToFirst();
} catch (Exception e) {
Log.e(LOG_TAG, "Error while checking claim code uniqueness", e);
return false;
}
}

@NonNull
public JSONObject getClaimCounts() {
JSONArray claimCounts = getQueryResultAsJsonArray(
Expand Down
Loading