The cancellation service (Cancelación) reverses previously registered healthcare transactions. Like registration, it supports both complete and partial cancellation scenarios where individual items within a transaction may have different outcomes.
CancelacionRequest request = new CancelacionRequest();// Operation datarequest.setModo("N");request.setCreden(7180171001151L);request.setTipo(2);request.setAlta(""); // Can be empty for cancellationrequest.setManual(Manual.MANUAL);// Cancellation-specificrequest.setTicketExt(0);request.setCancelCab(123456); // Transaction to cancelrequest.setCancelModo("N");// Technical datarequest.setTermId("TERM-001");request.setInterNro(200);// Providerrequest.setCuit(20123456789L);// Optional parametersrequest.setParam1("Cancellation reason");request.setParam2("Additional info");
The cancelCab field must reference a valid, previously registered transaction number obtained from a successful registration response.
if (result.isOk()) { CancelacionResponse response = result.getData().get(); Long cancelTransac = response.getCabecera().getTransac(); System.out.println("Cancellation successful!"); System.out.println("Cancellation transaction: " + cancelTransac); // Original transaction is now fully cancelled}
Verify the transaction exists and is eligible for cancellation:
// Check transaction exists in local databaseTransaction original = database.getTransaction(transactionId);if (original == null) { throw new IllegalArgumentException( "Transaction not found: " + transactionId );}// Check transaction is not already cancelledif (original.isCancelled()) { throw new IllegalStateException( "Transaction already cancelled: " + transactionId );}// Proceed with cancellationcancelarPrestacion(transactionId);
Store Cancellation Transactions
Always store the cancellation transaction number for audit trail:
if (result.isOk() || result.isPartial()) { Long originalTransac = request.getCancelCab(); Long cancelTransac = result.getData().get() .getCabecera().getTransac(); // Link cancellation to original database.linkCancellation( originalTransac, cancelTransac, new Date() );}
Handle Partial Cancellations
When some items cannot be cancelled, provide clear feedback:
if (result.isPartial()) { List<Hl7ItemError> failed = result.getDetails(); StringBuilder message = new StringBuilder(); message.append("Partially cancelled. "); message.append(failed.size()) .append(" item(s) could not be cancelled:\n"); for (Hl7ItemError item : failed) { message.append(" - ") .append(item.getMessage()) .append("\n"); } showUserMessage(message.toString());}
Implement Idempotency Checks
Prevent duplicate cancellation attempts:
public void safeCancelTransaction(Integer transactionId) { // Check if already cancelled if (database.isCancelled(transactionId)) { System.out.println( "Transaction already cancelled: " + transactionId ); return; } // Attempt cancellation Hl7Result<CancelacionResponse> result = cancelarPrestacion(transactionId); // Handle result...}
Log Cancellation Reasons
Always document why a transaction is being cancelled:
CancelacionRequest request = new CancelacionRequest();// ... set required fields// Document the reasonrequest.setParam1("Patient requested cancellation");request.setParam2("Cancelled by: Dr. Smith");// This helps with auditing and compliance