Skip to content

Commit f08fef0

Browse files
committed
fix sync claims
1 parent d919616 commit f08fef0

8 files changed

Lines changed: 152 additions & 17 deletions

File tree

claimManagement/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ android {
2727
minSdkVersion 23
2828
targetSdkVersion 32
2929
versionCode 4
30-
versionName "1.1.1"
30+
versionName "1.1.2"
3131
testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'
3232
}
3333
buildTypes {
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
query CheckMutation($clientMutationId: String) {
2+
mutationLogs(clientMutationId:$clientMutationId, orderBy:["-requestDateTime"]) {
3+
edges {
4+
node {
5+
status
6+
error
7+
}
8+
}
9+
}
10+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package org.openimis.imisclaims.network.request;
2+
3+
import androidx.annotation.NonNull;
4+
import androidx.annotation.WorkerThread;
5+
6+
import com.apollographql.apollo.api.Input;
7+
import com.apollographql.apollo.api.Response;
8+
9+
import org.openimis.imisclaims.CheckMutationQuery;
10+
11+
import java.util.Objects;
12+
13+
public class CheckMutationGraphQLRequest extends BaseGraphQLRequest {
14+
15+
@WorkerThread
16+
@NonNull
17+
public CheckMutationQuery.Node execute(@NonNull String uuid) throws Exception {
18+
Response<CheckMutationQuery.Data> response = makeSynchronous(new CheckMutationQuery(Input.fromNullable(uuid)));
19+
return Objects.requireNonNull(
20+
Objects.requireNonNull(
21+
Objects.requireNonNull(response.getData())
22+
.mutationLogs()
23+
).edges().get(0).node()
24+
);
25+
}
26+
}

claimManagement/src/main/java/org/openimis/imisclaims/network/request/CreateClaimGraphQLRequest.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import org.openimis.imisclaims.usecase.PostNewClaims;
1515
import org.openimis.imisclaims.util.DateUtils;
1616
import java.security.cert.CertificateException;
17+
import java.util.UUID;
1718

1819
import javax.net.ssl.HostnameVerifier;
1920
import javax.net.ssl.SSLContext;
@@ -38,7 +39,7 @@ public class CreateClaimGraphQLRequest extends BaseGraphQLRequest{
3839

3940
@WorkerThread
4041
@NonNull
41-
public PostNewClaims.Result create(
42+
public String create(
4243
@NonNull PendingClaimGQL claim,
4344
@NonNull int hfId,
4445
@NonNull int adminId,
@@ -50,6 +51,8 @@ public PostNewClaims.Result create(
5051
@NonNull int icd3Id,
5152
@NonNull int icd4Id
5253
) throws Exception{
54+
String clientMutationId = UUID.randomUUID().toString();
55+
String clientMutationLabel = "Création de la prestation " + claim.getClaimCode();
5356

5457
String claimServices = "";
5558
if(claim.getServices().isEmpty()){
@@ -155,6 +158,8 @@ public PostNewClaims.Result create(
155158
String QUERY_DOCUMENT = QueryDocumentMinifier.minify(
156159
"mutation {"
157160
+ " createClaim(input: {"
161+
+ " clientMutationId: \"" + clientMutationId + "\""
162+
+ " clientMutationLabel: \"" + clientMutationLabel + "\""
158163
+ " code: \"" + claim.getClaimCode() + "\""
159164
+ " insureeId: " + insureeId
160165
+ " adminId: " + adminId
@@ -240,10 +245,6 @@ public boolean verify(String hostname, SSLSession session) {
240245

241246

242247

243-
return (new PostNewClaims.Result(
244-
claim.getClaimCode(),
245-
response.code() == 200 ? PostNewClaims.Result.Status.SUCCESS: PostNewClaims.Result.Status.REJECTED,
246-
response.message()
247-
));
248+
return clientMutationId;
248249
}
249250
}
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
package org.openimis.imisclaims.usecase;
2+
3+
import androidx.annotation.NonNull;
4+
import androidx.annotation.WorkerThread;
5+
6+
import org.json.JSONArray;
7+
import org.json.JSONObject;
8+
import org.openimis.imisclaims.CheckMutationQuery;
9+
import org.openimis.imisclaims.network.request.CheckMutationGraphQLRequest;
10+
11+
import java.util.concurrent.TimeoutException;
12+
13+
public class CheckMutation {
14+
15+
private static final long DEFAULT_TIMEOUT = 60_000L;
16+
private static final long DEFAULT_DELAY = 600L;
17+
private static final int STATUS_RECEIVED = 0;
18+
private static final int STATUS_ERROR = 1;
19+
20+
private final long timeOutMs;
21+
private final long delayMs;
22+
@NonNull
23+
private final CheckMutationGraphQLRequest request;
24+
25+
public CheckMutation() {
26+
this(DEFAULT_TIMEOUT, DEFAULT_DELAY);
27+
}
28+
29+
public CheckMutation(long timeOutMs, long delayMs) {
30+
this(timeOutMs, delayMs, new CheckMutationGraphQLRequest());
31+
}
32+
33+
public CheckMutation(long timeOutMs, long delayMs, @NonNull CheckMutationGraphQLRequest request) {
34+
this.timeOutMs = timeOutMs;
35+
this.delayMs = delayMs;
36+
this.request = request;
37+
}
38+
39+
@WorkerThread
40+
public CheckMutationQuery.Node execute(@NonNull String uuid, @NonNull String message) throws Exception {
41+
long start = System.currentTimeMillis();
42+
CheckMutationQuery.Node node = null;
43+
Integer status;
44+
do {
45+
if (node != null) {
46+
Thread.sleep(delayMs);
47+
}
48+
node = request.execute(uuid);
49+
status = node.status();
50+
if (System.currentTimeMillis() >= start + timeOutMs) {
51+
throw new TimeoutException("Could not retrieve the mutation status of '" + uuid + "' within " + timeOutMs + "ms");
52+
}
53+
} while (status == null || status == STATUS_RECEIVED);
54+
55+
if (status == STATUS_ERROR) {
56+
throw new IllegalStateException(message + ":\n" + getErrorDetail(node.error()));
57+
}
58+
59+
return node;
60+
}
61+
62+
private String getErrorDetail(String error) {
63+
try {
64+
JSONArray array = new JSONArray(error);
65+
StringBuilder builder = new StringBuilder();
66+
for (int i=0; i < array.length();i++) {
67+
JSONObject object = array.getJSONObject(i);
68+
if (builder.length() != 0) {
69+
builder.append("\n");
70+
}
71+
builder.append(" - ");
72+
builder.append(object.getString("detail"));
73+
}
74+
if (builder.length() != 0) {
75+
return builder.toString();
76+
}
77+
} catch (Exception ignored) {
78+
//
79+
}
80+
return error;
81+
}
82+
}

claimManagement/src/main/java/org/openimis/imisclaims/usecase/CreateClaims.java

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import org.json.JSONArray;
99
import org.json.JSONObject;
10+
import org.openimis.imisclaims.CheckMutationQuery;
1011
import org.openimis.imisclaims.SQLHandler;
1112
import org.openimis.imisclaims.SynchronizeService;
1213
import org.openimis.imisclaims.domain.entity.Claim;
@@ -26,15 +27,19 @@ public class CreateClaims {
2627

2728
@NonNull
2829
private final CreateClaimGraphQLRequest createClaimGraphQLRequest;
30+
@NonNull
31+
private final CheckMutation checkMutation;
2932

3033
public CreateClaims() {
31-
this(new CreateClaimGraphQLRequest());
34+
this(new CreateClaimGraphQLRequest(), new CheckMutation());
3235
}
3336

3437
public CreateClaims(
35-
@NonNull CreateClaimGraphQLRequest createPolicyGraphQLRequest
38+
@NonNull CreateClaimGraphQLRequest createPolicyGraphQLRequest,
39+
@NonNull CheckMutation checkMutation
3640
) {
3741
this.createClaimGraphQLRequest = createPolicyGraphQLRequest;
42+
this.checkMutation = checkMutation;
3843
}
3944

4045
@WorkerThread
@@ -45,7 +50,7 @@ public List<PostNewClaims.Result> execute(
4550
List<PostNewClaims.Result> results = new ArrayList<>();
4651
SQLHandler sqlHandler = new SQLHandler(context);
4752
for(PendingClaimGQL pendingClaim: claims){
48-
int insureeId = Integer.parseInt(new FetchInsuree().execute(pendingClaim.getChfId()));
53+
int insureeId = new FetchInsuree().execute(pendingClaim.getChfId());
4954
int adminId = Integer.parseInt(new FetchClaimAdmin().execute(pendingClaim.getClaimAdmin()));
5055
int icdId = new FetchDiagnose().execute(pendingClaim.getIcdCode());
5156
int icd1Id = 0;
@@ -69,7 +74,18 @@ public List<PostNewClaims.Result> execute(
6974
if(pendingClaim.getReferalHF() != null && !pendingClaim.getReferalHF().isEmpty()){
7075
referFromId = Integer.parseInt(sqlHandler.getHfId(pendingClaim.getReferalHF()));
7176
}
72-
results.add(createClaimGraphQLRequest.create(pendingClaim,Integer.parseInt(hfId),adminId,insureeId,icdId, referFromId, icd1Id, icd2Id, icd3Id, icd4Id));
77+
CheckMutationQuery.Node response = checkMutation.execute(
78+
createClaimGraphQLRequest.create(pendingClaim,Integer.parseInt(hfId),adminId,insureeId,icdId, referFromId, icd1Id, icd2Id, icd3Id, icd4Id),
79+
"Érreur lors de la création de la prestation " + pendingClaim.getClaimCode()
80+
);
81+
82+
results.add(
83+
new PostNewClaims.Result(
84+
pendingClaim.getClaimCode(),
85+
response.status() != 0 && response.status() == 2 ? PostNewClaims.Result.Status.SUCCESS: PostNewClaims.Result.Status.REJECTED,
86+
response.status() == 1 ? response.error() : "")
87+
);
88+
7389
}
7490
return results;
7591
}

claimManagement/src/main/java/org/openimis/imisclaims/usecase/FetchInsuree.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
import org.openimis.imisclaims.GetInsureeIdQuery;
77
import org.openimis.imisclaims.network.request.GetInsureeIdGraphQLRequest;
8+
import org.openimis.imisclaims.util.IdUtils;
89

910
public class FetchInsuree {
1011

@@ -21,10 +22,8 @@ public FetchInsuree(@NonNull GetInsureeIdGraphQLRequest request) {
2122

2223
@NonNull
2324
@WorkerThread
24-
public String execute(@NonNull String chfId) throws Exception {
25+
public int execute(@NonNull String chfId) throws Exception {
2526
GetInsureeIdQuery.Node node = request.get(chfId);
26-
byte[] bytes = node.id().getBytes();
27-
String id = new String(org.apache.commons.codec.binary.Base64.decodeBase64(bytes)).split(":")[1];
28-
return id;
27+
return IdUtils.getIdFromGraphQLString(node.id());
2928
}
3029
}

claimManagement/src/main/res/layout/activity_claim.xml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,9 @@
5555
android:fontFamily="sans-serif-light"
5656
android:hint="@string/CHFID"
5757
android:inputType="number"
58-
android:maxLength="12"/>
58+
android:maxLength="18">
59+
<requestFocus />
60+
</EditText>
5961

6062
<ImageButton
6163
android:id="@+id/btnScan"
@@ -76,7 +78,6 @@
7678
android:fontFamily="sans-serif-light"
7779
android:hint="@string/ClaimCode"
7880
android:maxLength="8">
79-
<requestFocus />
8081
</EditText>
8182

8283
<EditText

0 commit comments

Comments
 (0)