From 9964c19807615a6c59b038daf32bf27905346685 Mon Sep 17 00:00:00 2001 From: Mohamed Elmoslemany Date: Fri, 11 Oct 2024 13:06:18 +0200 Subject: [PATCH 01/34] adding insurance claim services (not complete) --- .../insurance/v1/claim_settlement.proto | 43 +++++++ .../services/insurance/v1/claim_types.proto | 73 +++++++++++ .../insurance/v1/get_claim_form.proto | 50 ++++++++ .../insurance/v1/submit_claim_form.proto | 50 ++++++++ .../v1/submit_claim_form_extra_info.proto | 57 +++++++++ proto/cmp/types/v3/file.proto | 114 ++++++++++++++++++ 6 files changed, 387 insertions(+) create mode 100644 proto/cmp/services/insurance/v1/claim_settlement.proto create mode 100644 proto/cmp/services/insurance/v1/claim_types.proto create mode 100644 proto/cmp/services/insurance/v1/get_claim_form.proto create mode 100644 proto/cmp/services/insurance/v1/submit_claim_form.proto create mode 100644 proto/cmp/services/insurance/v1/submit_claim_form_extra_info.proto create mode 100644 proto/cmp/types/v3/file.proto diff --git a/proto/cmp/services/insurance/v1/claim_settlement.proto b/proto/cmp/services/insurance/v1/claim_settlement.proto new file mode 100644 index 00000000..2e937b6c --- /dev/null +++ b/proto/cmp/services/insurance/v1/claim_settlement.proto @@ -0,0 +1,43 @@ +syntax = "proto3"; + +package cmp.services.insurance.v1; + +import "cmp/services/insurance/v1/insurance_types.proto"; +import "cmp/types/v1/common.proto"; +import "cmp/types/v1/language.proto"; +import "cmp/types/v2/product_code.proto"; +import "google/protobuf/timestamp.proto"; + +message InsuranceProductInfoRequest { + // Message header + cmp.types.v1.RequestHeader header = 1; + + // Only respond with the products that are new, modified or deactivated after this + // timestamp. + google.protobuf.Timestamp modified_after = 2; + + // Languages to be included in the response for descriptions. Null means all + // available languages. + repeated cmp.types.v1.Language languages = 3; + + // Insurance codes + repeated cmp.types.v2.SupplierProductCode supplier_codes = 4; +} + +message InsuranceProductInfoResponse { + // Message header + cmp.types.v1.ResponseHeader header = 1; + + // Product list: Insurances + repeated cmp.services.insurance.v1.PolicyExtendedInfo insurances = 2; +} + +// Insurance product info service definition +// +// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/insurance/v1/info.proto.dot.xs.svg) +// +// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/insurance/v1/info.proto.dot.svg) +service InsuranceProductInfoService { + // Returns product info for insurance + rpc InsuranceProductInfo(InsuranceProductInfoRequest) returns (InsuranceProductInfoResponse); +} diff --git a/proto/cmp/services/insurance/v1/claim_types.proto b/proto/cmp/services/insurance/v1/claim_types.proto new file mode 100644 index 00000000..b4090cdf --- /dev/null +++ b/proto/cmp/services/insurance/v1/claim_types.proto @@ -0,0 +1,73 @@ +syntax = "proto3"; + +package cmp.services.insurance.v1; + +import "cmp/types/v1/date.proto"; +import "cmp/types/v3/file.proto"; +import "cmp/types/v2/price.proto"; + +// TODO-MO: shall I put this inside insurance types ?! +// ClaimForm +// +// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/insurance/v1/claim_types.proto.dot.xs.svg) +// +// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/insurance/v1/claim_types.proto.dot.svg) +message ClaimForm { + // Dates of services + repeated cmp.types.v1.Date dates = 1; + + repeated cmp.services.insurance.v1.ClaimableService services_to_claim = 2; + + repeated cmp.services.insurance.v1.ClaimDocument additional_documents = 3; + + repeated cmp.services.insurance.v1.ClaimAdditionalInfo additional_info = 4; +} + +message ClaimableService { + string service_description = 1; + cmp.types.v2.Price charge_amount = 2; + repeated cmp.services.insurance.v1.ClaimDocument documents = 3; +} + +message ClaimDocument { + cmp.types.v3.File file = 1; + cmp.services.insurance.v1.ClaimDocumentType type = 2; +} + +message ClaimAdditionalInfo { + repeated string info = 1; // TODO-MO: I added this + cmp.services.insurance.v1.ClaimConditions conditions = 2; +} + +message ClaimConditions { // TODO-Mo: more conditions ?! + bool employment = 1; + bool car_accident = 2; + bool trip_delay = 3; + bool trip_cancelled = 4; + bool family = 5; + bool death = 6; + bool other_condition = 7; +} + +enum ClaimDocumentType { //TODO-Mo: more types ?! + CLAIM_DOCUMENT_TYPE_UNSPECIFIED = 0; + CLAIM_DOCUMENT_TYPE_OTHER = 1; + CLAIM_DOCUMENT_TYPE_BILL = 2; + CLAIM_DOCUMENT_TYPE_POLICE_REPORT = 3; + CLAIM_DOCUMENT_TYPE_MEDICAL_REPORT = 4; + CLAIM_DOCUMENT_TYPE_LAB_RESULT = 5; +} + +enum ClaimStatus { // TODO-Mo: more statuses ? + CLAIM_STATUS_UNSPECIFIED = 0; + CLAIM_STATUS_RECEIVED = 1; + CLAIM_STATUS_PROCESSING = 2; + CLAIM_STATUS_APPROVED = 3; + CLAIM_STATUS_REJECTED = 4; + CLAIM_STATUS_INVESTIGATING = 5; + CLAIM_STATUS_MORE_INFO_REQUIRED = 6; + CLAIM_STATUS_FEEDBACK = 7; + CLAIM_STATUS_REVIEW = 8; + CLAIM_STATUS_PAIDOUT = 9; + CLAIM_STATUS_DONE = 10; +} \ No newline at end of file diff --git a/proto/cmp/services/insurance/v1/get_claim_form.proto b/proto/cmp/services/insurance/v1/get_claim_form.proto new file mode 100644 index 00000000..03cc4508 --- /dev/null +++ b/proto/cmp/services/insurance/v1/get_claim_form.proto @@ -0,0 +1,50 @@ +syntax = "proto3"; + +package cmp.services.insurance.v1; + +import "cmp/services/insurance/v1/insurance_types.proto"; +import "cmp/services/insurance/v1/claim_types.proto"; +import "cmp/types/v1/common.proto"; +import "cmp/types/v1/language.proto"; +import "cmp/types/v2/product_code.proto"; +import "google/protobuf/timestamp.proto"; + +message InsuranceGetClaimFormRequest { + // Message header + cmp.types.v1.RequestHeader header = 1; + + // Only respond with the products that are new, modified or deactivated after this + // timestamp. + google.protobuf.Timestamp modified_after = 2; + + // Languages to be included in the response for descriptions. Null means all + // available languages. + repeated cmp.types.v1.Language languages = 3; + + // Insurance codes + cmp.services.insurance.v1.PolicyCodes policy_codes = 4; // TODO-Mo: I used this instead of uuid + + cmp.services.insurance.v1.InsuredBooking insured_booking = 5; // TODO-Mo: I used this to specify on-off chain +} + +message InsuranceGetClaimFormResponse { + // Message header + cmp.types.v1.ResponseHeader header = 1; + + // Product list: Insurances + repeated cmp.types.v2.BasicTraveller insured_persons = 2; // TODO-Mo: can an insurance include more than one person ? + + cmp.services.insurance.v1.PolicyExtendedInfo policy_info = 3; + + cmp.services.insurance.v1.ClaimForm form = 4; +} + +// Insurance get claim form service definition +// +// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/insurance/v1/get_claim_form.proto.dot.xs.svg) +// +// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/insurance/v1/get_claim_form.proto.dot.svg) +service InsuranceGetClaimFormService { + // Returns product info for insurance + rpc InsuranceGetClaimForm(InsuranceGetClaimFormRequest) returns (InsuranceGetClaimFormResponse); +} diff --git a/proto/cmp/services/insurance/v1/submit_claim_form.proto b/proto/cmp/services/insurance/v1/submit_claim_form.proto new file mode 100644 index 00000000..94b51d00 --- /dev/null +++ b/proto/cmp/services/insurance/v1/submit_claim_form.proto @@ -0,0 +1,50 @@ +syntax = "proto3"; + +package cmp.services.insurance.v1; + +import "cmp/services/insurance/v1/insurance_types.proto"; +import "cmp/services/insurance/v1/claim_types.proto"; +import "cmp/types/v1/common.proto"; +import "cmp/types/v1/language.proto"; +import "cmp/types/v2/product_code.proto"; +import "google/protobuf/timestamp.proto"; + +message InsuranceSubmitClaimFormRequest { + // Message header + cmp.types.v1.RequestHeader header = 1; + + // Only respond with the products that are new, modified or deactivated after this + // timestamp. + google.protobuf.Timestamp modified_after = 2; + + // Product list: Insurances + repeated cmp.types.v2.BasicTraveller insured_persons = 2; // TODO-Mo: can an insurance include more than one person ? + + cmp.services.insurance.v1.PolicyExtendedInfo policy_info = 3; + + cmp.services.insurance.v1.ClaimForm form = 4; +} + +message InsuranceSubmitClaimFormResponse { //TODO-Mo what is the metadata here ?! + // Message header + cmp.types.v1.ResponseHeader header = 1; + + // Submission ID from the TO or OTA to trace this claim + string submission_id = 2; + + // Claim Status + cmp.services.insurance.v1.ClaimStatus status = 3; + + // Processing ID from insurance supplier + string processing_id = 4; +} + +// Insurance get claim form service definition +// +// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/insurance/v1/get_claim_form.proto.dot.xs.svg) +// +// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/insurance/v1/get_claim_form.proto.dot.svg) +service InsuranceSubmitClaimFormService { + // Returns product info for insurance + rpc InsuranceSubmitClaimForm(InsuranceSubmitClaimFormRequest) returns (InsuranceSubmitClaimFormResponse); +} diff --git a/proto/cmp/services/insurance/v1/submit_claim_form_extra_info.proto b/proto/cmp/services/insurance/v1/submit_claim_form_extra_info.proto new file mode 100644 index 00000000..bb0d7444 --- /dev/null +++ b/proto/cmp/services/insurance/v1/submit_claim_form_extra_info.proto @@ -0,0 +1,57 @@ +syntax = "proto3"; + +package cmp.services.insurance.v1; + +import "cmp/services/insurance/v1/insurance_types.proto"; +import "cmp/services/insurance/v1/claim_types.proto"; +import "cmp/types/v1/common.proto"; +import "cmp/types/v1/language.proto"; +import "cmp/types/v2/product_code.proto"; +import "google/protobuf/timestamp.proto"; + +message InsuranceSubmitClaimFormExtraInfoRequest { + // Message header + cmp.types.v1.RequestHeader header = 1; + + // Only respond with the products that are new, modified or deactivated after this + // timestamp. + google.protobuf.Timestamp modified_after = 2; + + // Submission ID from the TO or OTA to trace this claim + string submission_id = 3; + + // Claim Status + cmp.services.insurance.v1.ClaimStatus status = 4; + + // Processing ID from insurance supplier + string processing_id = 5; + + // Carrier ID from insurance carrier + string carrier_id = 6; + + repeated cmp.services.insurance.v1.ClaimableService extra_info = 7; +} + +message InsuranceSubmitClaimFormExtraInfoResponse { //TODO-Mo what is the metadata here ?! + // Message header + cmp.types.v1.ResponseHeader header = 1; + + // Submission ID from the TO or OTA to trace this claim + string submission_id = 2; + + // Claim Status + cmp.services.insurance.v1.ClaimStatus status = 3; + + // Processing ID from insurance supplier + string processing_id = 4; +} + +// Insurance submit claim form service definition +// +// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/insurance/v1/submit_claim_form_extra_info.proto.dot.xs.svg) +// +// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/insurance/v1/submit_claim_form_extra_info.proto.dot.svg) +service InsuranceSubmitClaimFormExtraInfoService { + // Returns product info for insurance + rpc InsuranceSubmitClaimFormExtraInfo(InsuranceSubmitClaimFormExtraInfoRequest) returns (InsuranceSubmitClaimFormExtraInfoResponse); +} diff --git a/proto/cmp/types/v3/file.proto b/proto/cmp/types/v3/file.proto new file mode 100644 index 00000000..88c2321b --- /dev/null +++ b/proto/cmp/types/v3/file.proto @@ -0,0 +1,114 @@ +syntax = "proto3"; + +package cmp.types.v3; + +import "google/protobuf/timestamp.proto"; + +// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/types/v3/file.proto.dot.xs.svg) +// +// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/types/v3/file.proto.dot.svg) +message File { + // file name + string name = 1; + + // URL + string url = 2; + + // Last modification time + google.protobuf.Timestamp last_modified = 3; + + // Description + string description = 4; + + // TODO-MO: I added the following because I see it is general for any file + string type = 5; + + uint64 size = 6; + + string hash_algorithm = 7; + + string checksum = 8; +} + +message Image { + // file + cmp.types.v2.File file = 1; + + // Width + int32 width = 2; + + // Height + int32 height = 3; + + // Category + string category = 6; + + // Image type + cmp.types.v2.ImageFormat format = 7; +} + +message Video { + // File + cmp.types.v2.File file = 1; + + // Codec of video + cmp.types.v2.Codec codec = 2; + + // Bitrate in kbps + int32 bitrate = 3; + + // Framerate + int32 framerate = 4; + + // Width and height are specified in pixels. Aspect ratio can be derived from that + // Ex: "16:9" + int32 width = 5; + int32 height = 6; + + // Container format. Ex: "MP4" + cmp.types.v2.VideoFormat format = 7; + + // Category + string category = 8; +} + +// Image formats +enum ImageFormat { + IMAGE_FORMAT_UNSPECIFIED = 0; + IMAGE_FORMAT_JPEG = 1; // JPEG or JPG + IMAGE_FORMAT_PNG = 2; + IMAGE_FORMAT_GIF = 3; + IMAGE_FORMAT_BMP = 4; + IMAGE_FORMAT_TIFF = 5; + IMAGE_FORMAT_SVG = 6; + IMAGE_FORMAT_EPS = 7; + IMAGE_FORMAT_PDF = 8; + IMAGE_FORMAT_PSD = 9; + IMAGE_FORMAT_AI = 10; // Adobe Illustrator’s native format + IMAGE_FORMAT_WEBP = 11; + IMAGE_FORMAT_HEIF = 12; // heif or heic +} + +// Video formats +enum VideoFormat { + VIDEO_FORMAT_UNSPECIFIED = 0; + VIDEO_FORMAT_MP4 = 1; // MPEG-4 + VIDEO_FORMAT_MKV = 2; // Matroska + VIDEO_FORMAT_MOV = 3; // QuickTime + VIDEO_FORMAT_AVI = 4; // Audio Video Interleave + VIDEO_FORMAT_FLV = 5; // Flash Video + VIDEO_FORMAT_WEBM = 6; // WebM + VIDEO_FORMAT_WMV = 7; // Windows Media Video + VIDEO_FORMAT_M4V = 8; // iTunes Video + VIDEO_FORMAT_MPEG = 9; // MPEG Video (sometimes also expressed as mpg) +} + +// Codec formats +enum Codec { + CODEC_UNSPECIFIED = 0; + CODEC_H264 = 1; // H.264 (Advanced Video Coding) + CODEC_HEVC = 2; // HEVC (H.265, High-Efficiency Video Coding) + CODEC_VP9 = 3; // VP9 + CODEC_AV1 = 4; // AV1 + CODEC_MPEG2 = 5; // MPEG-2 (codec used for video on DVDs) +} From dbffc5f9fa399a6c3c3bf79f28b60ead04c99c3f Mon Sep 17 00:00:00 2001 From: Mohamed Elmoslemany Date: Mon, 14 Oct 2024 22:32:44 +0200 Subject: [PATCH 02/34] added claiming services with unresolved comments --- .../insurance/v1/claim_settlement.proto | 43 ------------- .../v1/claim_settlement_decision.proto | 64 +++++++++++++++++++ .../v1/claim_settlement_extra_info.proto | 54 ++++++++++++++++ .../v1/claim_settlement_paidout.proto | 64 +++++++++++++++++++ .../services/insurance/v1/claim_types.proto | 20 +++++- .../insurance/v1/get_claim_form.proto | 4 +- .../insurance/v1/submit_claim_form.proto | 15 ++--- .../v1/submit_claim_form_extra_info.proto | 4 +- proto/cmp/types/v3/file.proto | 10 +-- 9 files changed, 217 insertions(+), 61 deletions(-) delete mode 100644 proto/cmp/services/insurance/v1/claim_settlement.proto create mode 100644 proto/cmp/services/insurance/v1/claim_settlement_decision.proto create mode 100644 proto/cmp/services/insurance/v1/claim_settlement_extra_info.proto create mode 100644 proto/cmp/services/insurance/v1/claim_settlement_paidout.proto diff --git a/proto/cmp/services/insurance/v1/claim_settlement.proto b/proto/cmp/services/insurance/v1/claim_settlement.proto deleted file mode 100644 index 2e937b6c..00000000 --- a/proto/cmp/services/insurance/v1/claim_settlement.proto +++ /dev/null @@ -1,43 +0,0 @@ -syntax = "proto3"; - -package cmp.services.insurance.v1; - -import "cmp/services/insurance/v1/insurance_types.proto"; -import "cmp/types/v1/common.proto"; -import "cmp/types/v1/language.proto"; -import "cmp/types/v2/product_code.proto"; -import "google/protobuf/timestamp.proto"; - -message InsuranceProductInfoRequest { - // Message header - cmp.types.v1.RequestHeader header = 1; - - // Only respond with the products that are new, modified or deactivated after this - // timestamp. - google.protobuf.Timestamp modified_after = 2; - - // Languages to be included in the response for descriptions. Null means all - // available languages. - repeated cmp.types.v1.Language languages = 3; - - // Insurance codes - repeated cmp.types.v2.SupplierProductCode supplier_codes = 4; -} - -message InsuranceProductInfoResponse { - // Message header - cmp.types.v1.ResponseHeader header = 1; - - // Product list: Insurances - repeated cmp.services.insurance.v1.PolicyExtendedInfo insurances = 2; -} - -// Insurance product info service definition -// -// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/insurance/v1/info.proto.dot.xs.svg) -// -// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/insurance/v1/info.proto.dot.svg) -service InsuranceProductInfoService { - // Returns product info for insurance - rpc InsuranceProductInfo(InsuranceProductInfoRequest) returns (InsuranceProductInfoResponse); -} diff --git a/proto/cmp/services/insurance/v1/claim_settlement_decision.proto b/proto/cmp/services/insurance/v1/claim_settlement_decision.proto new file mode 100644 index 00000000..d1bf398a --- /dev/null +++ b/proto/cmp/services/insurance/v1/claim_settlement_decision.proto @@ -0,0 +1,64 @@ +syntax = "proto3"; + +package cmp.services.insurance.v1; + +import "cmp/services/insurance/v1/claim_types.proto"; +import "cmp/types/v1/common.proto"; +import "cmp/types/v2/price.proto"; +import "google/protobuf/timestamp.proto"; + +message InsuranceSettlementDecisionRequest { //TODO-Mo: I called it decision instead of acceptedrejected + // Message header + cmp.types.v1.RequestHeader header = 1; + + // Only respond with the products that are new, modified or deactivated after this + // timestamp. + google.protobuf.Timestamp modified_after = 2; + + // Submission ID from the TO or OTA to trace this claim + string submission_id = 3; + + // Claim Status + cmp.services.insurance.v1.ClaimStatus status = 4; + + string acceptance_reference = 5; // TODO-Mo: what if it is rejected ? + + // Processing ID from insurance supplier + string processing_id = 6; + + // Carrier ID from insurance carrier + string carrier_id = 7; + + string transaction_id = 8; + + string transaction_type = 9; + + cmp.types.v2.Price amount = 10; +} + +//TODO-Mo : what's metadata here ? +message InsuranceSettlementDecisionResponse { + // Message header + cmp.types.v1.ResponseHeader header = 1; + + // Submission ID from the TO or OTA to trace this claim + string submission_id = 2; + + // Processing ID from insurance supplier + string processing_id = 3; + + // Carrier ID from insurance carrier + string carrier_id = 4; + + string message_status = 5; //TODO-Mo : do we need this ? if there is a response then msg is already received, do we need an enum for it ? +} + +// Insurance settlement decision (Accepted or Rejected) service definition +// +// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/insurance/v1/claim_settlement_decision.proto.dot.xs.svg) +// +// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/insurance/v1/claim_settlement_decision.proto.dot.svg) +service InsuranceSettlementDecisionService { + // Returns insurance settlement response + rpc InsuranceSettlementDecision(InsuranceSettlementDecisionRequest) returns (InsuranceSettlementDecisionResponse); +} \ No newline at end of file diff --git a/proto/cmp/services/insurance/v1/claim_settlement_extra_info.proto b/proto/cmp/services/insurance/v1/claim_settlement_extra_info.proto new file mode 100644 index 00000000..140b81d4 --- /dev/null +++ b/proto/cmp/services/insurance/v1/claim_settlement_extra_info.proto @@ -0,0 +1,54 @@ +syntax = "proto3"; + +package cmp.services.insurance.v1; + +import "cmp/services/insurance/v1/claim_types.proto"; +import "cmp/types/v1/common.proto"; +import "google/protobuf/timestamp.proto"; + +message InsuranceSettlementExtraInfoRequest { + // Message header + cmp.types.v1.RequestHeader header = 1; + + // Only respond with the products that are new, modified or deactivated after this + // timestamp. + google.protobuf.Timestamp modified_after = 2; + + // Submission ID from the TO or OTA to trace this claim + string submission_id = 3; + + // Processing ID from insurance supplier + string processing_id = 4; + + // Carrier ID from insurance carrier + string carrier_id = 5; + + repeated cmp.services.insurance.v1.ClaimableService extra_info = 6; +} + +//TODO-Mo : what's metadata here ? +message InsuranceSettlementExtraInfoResponse { + // Message header + cmp.types.v1.ResponseHeader header = 1; + + // Submission ID from the TO or OTA to trace this claim + string submission_id = 2; + + // Processing ID from insurance supplier + string processing_id = 3; + + // Carrier ID from insurance carrier + string carrier_id = 4; + + string message_status = 5; //TODO-Mo : do we need this ? if there is a response then msg is already received, do we need an enum for it ? +} + +// Insurance settlement Extra Info service definition +// +// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/insurance/v1/claim_settlement_extra_info.proto.dot.xs.svg) +// +// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/insurance/v1/claim_settlement_extra_info.proto.dot.svg) +service InsuranceSettlementExtraInfoService { + // Returns insurance settlement response + rpc InsuranceSettlementExtraInfo(InsuranceSettlementExtraInfoRequest) returns (InsuranceSettlementExtraInfoResponse); +} diff --git a/proto/cmp/services/insurance/v1/claim_settlement_paidout.proto b/proto/cmp/services/insurance/v1/claim_settlement_paidout.proto new file mode 100644 index 00000000..83b4fe97 --- /dev/null +++ b/proto/cmp/services/insurance/v1/claim_settlement_paidout.proto @@ -0,0 +1,64 @@ +syntax = "proto3"; + +package cmp.services.insurance.v1; + +import "cmp/services/insurance/v1/claim_types.proto"; +import "cmp/types/v1/common.proto"; +import "cmp/types/v2/price.proto"; +import "google/protobuf/timestamp.proto"; + +message InsuranceSettlementPaidOutRequest { //TODO-Mo: what's the difference between paidout request and decision request ?! + // Message header + cmp.types.v1.RequestHeader header = 1; + + // Only respond with the products that are new, modified or deactivated after this + // timestamp. + google.protobuf.Timestamp modified_after = 2; + + // Submission ID from the TO or OTA to trace this claim + string submission_id = 3; + + // Claim Status + cmp.services.insurance.v1.ClaimStatus status = 4; + + string acceptance_reference = 5; // TODO-Mo: what if it is rejected ? + + // Processing ID from insurance supplier + string processing_id = 6; + + // Carrier ID from insurance carrier + string carrier_id = 7; + + string transaction_id = 8; + + string transaction_type = 9; + + cmp.types.v2.Price amount = 10; +} + +//TODO-Mo : what's metadata here ? +message InsuranceSettlementPaidOutResponse { + // Message header + cmp.types.v1.ResponseHeader header = 1; + + // Submission ID from the TO or OTA to trace this claim + string submission_id = 2; + + // Processing ID from insurance supplier + string processing_id = 3; + + // Carrier ID from insurance carrier + string carrier_id = 4; + + string message_status = 5; //TODO-Mo : do we need this ? if there is a response then msg is already received, do we need an enum for it ? +} + +// Insurance settlement PaidOut service definition +// +// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/insurance/v1/claim_settlement_paidout.proto.dot.xs.svg) +// +// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/insurance/v1/claim_settlement_paidout.proto.dot.svg) +service InsuranceSettlementPaidOutService { + // Returns insurance settlement response + rpc InsuranceSettlementPaidOut(InsuranceSettlementPaidOutRequest) returns (InsuranceSettlementPaidOutResponse); +} diff --git a/proto/cmp/services/insurance/v1/claim_types.proto b/proto/cmp/services/insurance/v1/claim_types.proto index b4090cdf..d63afb13 100644 --- a/proto/cmp/services/insurance/v1/claim_types.proto +++ b/proto/cmp/services/insurance/v1/claim_types.proto @@ -3,6 +3,7 @@ syntax = "proto3"; package cmp.services.insurance.v1; import "cmp/types/v1/date.proto"; +import "cmp/types/v1/common.proto"; import "cmp/types/v3/file.proto"; import "cmp/types/v2/price.proto"; @@ -70,4 +71,21 @@ enum ClaimStatus { // TODO-Mo: more statuses ? CLAIM_STATUS_REVIEW = 8; CLAIM_STATUS_PAIDOUT = 9; CLAIM_STATUS_DONE = 10; -} \ No newline at end of file +} + +//TODO-Mo : what's metadata here ? I moved it to here because it's general for 3 requests +message InsuranceSettlementResponse { //TODO-Mo what is the metadata here ?! + // Message header + cmp.types.v1.ResponseHeader header = 1; + + // Submission ID from the TO or OTA to trace this claim + string submission_id = 2; + + // Processing ID from insurance supplier + string processing_id = 3; + + // Carrier ID from insurance carrier + string carrier_id = 4; + + string message_status = 5; //TODO-Mo : do we need this ? if there is a response then msg is already received, do we need an enum for it ? + } \ No newline at end of file diff --git a/proto/cmp/services/insurance/v1/get_claim_form.proto b/proto/cmp/services/insurance/v1/get_claim_form.proto index 03cc4508..e14ff49d 100644 --- a/proto/cmp/services/insurance/v1/get_claim_form.proto +++ b/proto/cmp/services/insurance/v1/get_claim_form.proto @@ -6,9 +6,11 @@ import "cmp/services/insurance/v1/insurance_types.proto"; import "cmp/services/insurance/v1/claim_types.proto"; import "cmp/types/v1/common.proto"; import "cmp/types/v1/language.proto"; -import "cmp/types/v2/product_code.proto"; +import "cmp/types/v2/traveller.proto"; +import "cmp/services/insurance/v1/search_result_types.proto"; import "google/protobuf/timestamp.proto"; + message InsuranceGetClaimFormRequest { // Message header cmp.types.v1.RequestHeader header = 1; diff --git a/proto/cmp/services/insurance/v1/submit_claim_form.proto b/proto/cmp/services/insurance/v1/submit_claim_form.proto index 94b51d00..58ab18ec 100644 --- a/proto/cmp/services/insurance/v1/submit_claim_form.proto +++ b/proto/cmp/services/insurance/v1/submit_claim_form.proto @@ -5,8 +5,7 @@ package cmp.services.insurance.v1; import "cmp/services/insurance/v1/insurance_types.proto"; import "cmp/services/insurance/v1/claim_types.proto"; import "cmp/types/v1/common.proto"; -import "cmp/types/v1/language.proto"; -import "cmp/types/v2/product_code.proto"; +import "cmp/types/v2/traveller.proto"; import "google/protobuf/timestamp.proto"; message InsuranceSubmitClaimFormRequest { @@ -18,11 +17,11 @@ message InsuranceSubmitClaimFormRequest { google.protobuf.Timestamp modified_after = 2; // Product list: Insurances - repeated cmp.types.v2.BasicTraveller insured_persons = 2; // TODO-Mo: can an insurance include more than one person ? + repeated cmp.types.v2.BasicTraveller insured_persons = 3; // TODO-Mo: can an insurance include more than one person ? - cmp.services.insurance.v1.PolicyExtendedInfo policy_info = 3; + cmp.services.insurance.v1.PolicyExtendedInfo policy_info = 4; - cmp.services.insurance.v1.ClaimForm form = 4; + cmp.services.insurance.v1.ClaimForm form = 5; } message InsuranceSubmitClaimFormResponse { //TODO-Mo what is the metadata here ?! @@ -39,11 +38,11 @@ message InsuranceSubmitClaimFormResponse { //TODO-Mo what is the metadata here ? string processing_id = 4; } -// Insurance get claim form service definition +// Insurance submit claim form service definition // -// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/insurance/v1/get_claim_form.proto.dot.xs.svg) +// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/insurance/v1/submit_claim_form.proto.dot.xs.svg) // -// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/insurance/v1/get_claim_form.proto.dot.svg) +// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/insurance/v1/submit_claim_form.proto.dot.svg) service InsuranceSubmitClaimFormService { // Returns product info for insurance rpc InsuranceSubmitClaimForm(InsuranceSubmitClaimFormRequest) returns (InsuranceSubmitClaimFormResponse); diff --git a/proto/cmp/services/insurance/v1/submit_claim_form_extra_info.proto b/proto/cmp/services/insurance/v1/submit_claim_form_extra_info.proto index bb0d7444..3ad899d5 100644 --- a/proto/cmp/services/insurance/v1/submit_claim_form_extra_info.proto +++ b/proto/cmp/services/insurance/v1/submit_claim_form_extra_info.proto @@ -2,11 +2,9 @@ syntax = "proto3"; package cmp.services.insurance.v1; -import "cmp/services/insurance/v1/insurance_types.proto"; + import "cmp/services/insurance/v1/claim_types.proto"; import "cmp/types/v1/common.proto"; -import "cmp/types/v1/language.proto"; -import "cmp/types/v2/product_code.proto"; import "google/protobuf/timestamp.proto"; message InsuranceSubmitClaimFormExtraInfoRequest { diff --git a/proto/cmp/types/v3/file.proto b/proto/cmp/types/v3/file.proto index 88c2321b..a1ebd154 100644 --- a/proto/cmp/types/v3/file.proto +++ b/proto/cmp/types/v3/file.proto @@ -32,7 +32,7 @@ message File { message Image { // file - cmp.types.v2.File file = 1; + cmp.types.v3.File file = 1; // Width int32 width = 2; @@ -44,15 +44,15 @@ message Image { string category = 6; // Image type - cmp.types.v2.ImageFormat format = 7; + cmp.types.v3.ImageFormat format = 7; } message Video { // File - cmp.types.v2.File file = 1; + cmp.types.v3.File file = 1; // Codec of video - cmp.types.v2.Codec codec = 2; + cmp.types.v3.Codec codec = 2; // Bitrate in kbps int32 bitrate = 3; @@ -66,7 +66,7 @@ message Video { int32 height = 6; // Container format. Ex: "MP4" - cmp.types.v2.VideoFormat format = 7; + cmp.types.v3.VideoFormat format = 7; // Category string category = 8; From 5bedba7b744009922c9175e8b92c25b7c827aa71 Mon Sep 17 00:00:00 2001 From: Mohamed Elmoslemany Date: Wed, 16 Oct 2024 13:31:26 +0200 Subject: [PATCH 03/34] comments --- .../v1/claim_settlement_decision.proto | 29 ++--- .../v1/claim_settlement_extra_info.proto | 25 +--- .../v1/claim_settlement_paidout.proto | 29 ++--- .../services/insurance/v1/claim_types.proto | 106 +++++++++++----- .../insurance/v1/get_claim_form.proto | 22 +--- .../insurance/v1/submit_claim_form.proto | 25 ++-- .../v1/submit_claim_form_extra_info.proto | 30 ++--- proto/cmp/types/v3/file.proto | 114 +++++++++++++++++- proto/cmp/types/v3/traveller.proto | 100 +++++++++++++++ 9 files changed, 324 insertions(+), 156 deletions(-) create mode 100644 proto/cmp/types/v3/traveller.proto diff --git a/proto/cmp/services/insurance/v1/claim_settlement_decision.proto b/proto/cmp/services/insurance/v1/claim_settlement_decision.proto index d1bf398a..f4fea8a0 100644 --- a/proto/cmp/services/insurance/v1/claim_settlement_decision.proto +++ b/proto/cmp/services/insurance/v1/claim_settlement_decision.proto @@ -15,42 +15,27 @@ message InsuranceSettlementDecisionRequest { //TODO-Mo: I called it decision in // timestamp. google.protobuf.Timestamp modified_after = 2; - // Submission ID from the TO or OTA to trace this claim - string submission_id = 3; + // Claim IDs: Submission ID, Processing ID and Carrier ID + cmp.services.insurance.v1.ClaimIds claim_ids = 3; // Claim Status cmp.services.insurance.v1.ClaimStatus status = 4; string acceptance_reference = 5; // TODO-Mo: what if it is rejected ? - // Processing ID from insurance supplier - string processing_id = 6; + string transaction_id = 6; - // Carrier ID from insurance carrier - string carrier_id = 7; + string transaction_type = 7; - string transaction_id = 8; - - string transaction_type = 9; - - cmp.types.v2.Price amount = 10; + cmp.types.v2.Price amount = 8; } -//TODO-Mo : what's metadata here ? message InsuranceSettlementDecisionResponse { // Message header cmp.types.v1.ResponseHeader header = 1; - // Submission ID from the TO or OTA to trace this claim - string submission_id = 2; - - // Processing ID from insurance supplier - string processing_id = 3; - - // Carrier ID from insurance carrier - string carrier_id = 4; - - string message_status = 5; //TODO-Mo : do we need this ? if there is a response then msg is already received, do we need an enum for it ? + // Claim Message Response to respond with claim ids (processing, carrier and submission) and message status + cmp.services.insurance.v1.ClaimMessageResponse claim_message_response = 2; } // Insurance settlement decision (Accepted or Rejected) service definition diff --git a/proto/cmp/services/insurance/v1/claim_settlement_extra_info.proto b/proto/cmp/services/insurance/v1/claim_settlement_extra_info.proto index 140b81d4..3f5e90b9 100644 --- a/proto/cmp/services/insurance/v1/claim_settlement_extra_info.proto +++ b/proto/cmp/services/insurance/v1/claim_settlement_extra_info.proto @@ -14,33 +14,18 @@ message InsuranceSettlementExtraInfoRequest { // timestamp. google.protobuf.Timestamp modified_after = 2; - // Submission ID from the TO or OTA to trace this claim - string submission_id = 3; + // Claim IDs: Submission ID, Processing ID and Carrier ID + cmp.services.insurance.v1.ClaimIds claim_ids = 3; - // Processing ID from insurance supplier - string processing_id = 4; - - // Carrier ID from insurance carrier - string carrier_id = 5; - - repeated cmp.services.insurance.v1.ClaimableService extra_info = 6; + repeated cmp.services.insurance.v1.ClaimInfoRequested info_requested = 4; } -//TODO-Mo : what's metadata here ? message InsuranceSettlementExtraInfoResponse { // Message header cmp.types.v1.ResponseHeader header = 1; - // Submission ID from the TO or OTA to trace this claim - string submission_id = 2; - - // Processing ID from insurance supplier - string processing_id = 3; - - // Carrier ID from insurance carrier - string carrier_id = 4; - - string message_status = 5; //TODO-Mo : do we need this ? if there is a response then msg is already received, do we need an enum for it ? + // Claim Message Response to respond with claim ids (processing, carrier and submission) and message status + cmp.services.insurance.v1.ClaimMessageResponse claim_message_response = 2; } // Insurance settlement Extra Info service definition diff --git a/proto/cmp/services/insurance/v1/claim_settlement_paidout.proto b/proto/cmp/services/insurance/v1/claim_settlement_paidout.proto index 83b4fe97..553bee7e 100644 --- a/proto/cmp/services/insurance/v1/claim_settlement_paidout.proto +++ b/proto/cmp/services/insurance/v1/claim_settlement_paidout.proto @@ -15,42 +15,27 @@ message InsuranceSettlementPaidOutRequest { //TODO-Mo: what's the difference be // timestamp. google.protobuf.Timestamp modified_after = 2; - // Submission ID from the TO or OTA to trace this claim - string submission_id = 3; + // Claim IDs: Submission ID, Processing ID and Carrier ID + cmp.services.insurance.v1.ClaimIds claim_ids = 3; // Claim Status cmp.services.insurance.v1.ClaimStatus status = 4; string acceptance_reference = 5; // TODO-Mo: what if it is rejected ? - // Processing ID from insurance supplier - string processing_id = 6; + string transaction_id = 6; - // Carrier ID from insurance carrier - string carrier_id = 7; + string transaction_type = 7; - string transaction_id = 8; - - string transaction_type = 9; - - cmp.types.v2.Price amount = 10; + cmp.types.v2.Price amount = 8; } -//TODO-Mo : what's metadata here ? message InsuranceSettlementPaidOutResponse { // Message header cmp.types.v1.ResponseHeader header = 1; - // Submission ID from the TO or OTA to trace this claim - string submission_id = 2; - - // Processing ID from insurance supplier - string processing_id = 3; - - // Carrier ID from insurance carrier - string carrier_id = 4; - - string message_status = 5; //TODO-Mo : do we need this ? if there is a response then msg is already received, do we need an enum for it ? + // Claim Message Response to respond with claim ids (processing, carrier and submission) and message status + cmp.services.insurance.v1.ClaimMessageResponse claim_message_response = 2; } // Insurance settlement PaidOut service definition diff --git a/proto/cmp/services/insurance/v1/claim_types.proto b/proto/cmp/services/insurance/v1/claim_types.proto index d63afb13..d2356d9a 100644 --- a/proto/cmp/services/insurance/v1/claim_types.proto +++ b/proto/cmp/services/insurance/v1/claim_types.proto @@ -6,14 +6,21 @@ import "cmp/types/v1/date.proto"; import "cmp/types/v1/common.proto"; import "cmp/types/v3/file.proto"; import "cmp/types/v2/price.proto"; +import "cmp/types/v3/traveller.proto"; -// TODO-MO: shall I put this inside insurance types ?! // ClaimForm // // ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/insurance/v1/claim_types.proto.dot.xs.svg) // // [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/insurance/v1/claim_types.proto.dot.svg) message ClaimForm { + + // Insured person or someone related + cmp.types.v3.TravellerExtraInfo insured_person = 2; + + // Policy brief info + cmp.services.insurance.v1.PolicyInfo policy_info = 3; + // Dates of services repeated cmp.types.v1.Date dates = 1; @@ -21,7 +28,7 @@ message ClaimForm { repeated cmp.services.insurance.v1.ClaimDocument additional_documents = 3; - repeated cmp.services.insurance.v1.ClaimAdditionalInfo additional_info = 4; + cmp.services.insurance.v1.ClaimAdditionalInfo additional_info = 4; // TODO-Mo: I removed repeated from here and put it in each of the message parameters } message ClaimableService { @@ -36,21 +43,26 @@ message ClaimDocument { } message ClaimAdditionalInfo { - repeated string info = 1; // TODO-MO: I added this - cmp.services.insurance.v1.ClaimConditions conditions = 2; + repeated string info = 1; + repeated cmp.services.insurance.v1.ClaimCondition condition = 2; } -message ClaimConditions { // TODO-Mo: more conditions ?! - bool employment = 1; - bool car_accident = 2; - bool trip_delay = 3; - bool trip_cancelled = 4; - bool family = 5; - bool death = 6; - bool other_condition = 7; +// Claim conditions +// TODO: is this list enough ? +enum ClaimCondition { + CLAIM_CONDITION_UNSPECIFIED = 0; + CLAIM_CONDITION_OTHER = 1; + CLAIM_CONDITION_EMPLOYMENT = 2; + CLAIM_CONDITION_TRIP_DELAY = 3; + CLAIM_CONDITION_TRIP_CANCELLED = 4; + CLAIM_CONDITION_FAMILY = 5; + CLAIM_CONDITION_DEATH = 6; + CLAIM_CONDITION_CAR_ACCIDENT = 0; } -enum ClaimDocumentType { //TODO-Mo: more types ?! +// Claim document types +// TODO: check if there are more types +enum ClaimDocumentType { CLAIM_DOCUMENT_TYPE_UNSPECIFIED = 0; CLAIM_DOCUMENT_TYPE_OTHER = 1; CLAIM_DOCUMENT_TYPE_BILL = 2; @@ -59,7 +71,9 @@ enum ClaimDocumentType { //TODO-Mo: more types ?! CLAIM_DOCUMENT_TYPE_LAB_RESULT = 5; } -enum ClaimStatus { // TODO-Mo: more statuses ? +// Claim Status +// TODO: check if this list is sufficient +enum ClaimStatus { CLAIM_STATUS_UNSPECIFIED = 0; CLAIM_STATUS_RECEIVED = 1; CLAIM_STATUS_PROCESSING = 2; @@ -73,19 +87,51 @@ enum ClaimStatus { // TODO-Mo: more statuses ? CLAIM_STATUS_DONE = 10; } -//TODO-Mo : what's metadata here ? I moved it to here because it's general for 3 requests -message InsuranceSettlementResponse { //TODO-Mo what is the metadata here ?! - // Message header - cmp.types.v1.ResponseHeader header = 1; - - // Submission ID from the TO or OTA to trace this claim - string submission_id = 2; - - // Processing ID from insurance supplier - string processing_id = 3; - - // Carrier ID from insurance carrier - string carrier_id = 4; - - string message_status = 5; //TODO-Mo : do we need this ? if there is a response then msg is already received, do we need an enum for it ? - } \ No newline at end of file +// Claim Message Status +// TODO: check if this list is sufficient +enum ClaimMessageStatus { + CLAIM_MESSAGE_STATUS_UNSPECIFIED = 0; + CLAIM_MESSAGE_STATUS_OTHER = 1; + CLAIM_MESSAGE_STATUS_RECEIVED = 2; + CLAIM_MESSAGE_STATUS_UNKNOWN_CARRIER_ID = 3; + CLAIM_MESSAGE_STATUS_UNKNOWN_PROCESSING_ID = 4; + CLAIM_MESSAGE_STATUS_UNKNOWN_SUBMISSION_ID = 5; + CLAIM_MESSAGE_STATUS_EROOR = 6; +} + +// Brief info about insurance policy +message PolicyInfo { + cmp.types.v3.TravellerExtraInfo insured_person = 1; + uint64 policy_token_id = 2 ; + int32 chain_id = 3; + string wallet_address = 4; + string iban = 5; + string company_name = 6; // TODO-Mo: what about adding name to contact info in types ? + cmp.types.v2.ContactInfo comany_contact = 7; + cmp.services.insurance.v1.PolicyCodes policy_codes = 8; +} + +message ClaimInfoRequested { + string service_description = 1; + cmp.types.v2.Price charge_amount = 2; + cmp.services.insurance.v1.ClaimDocumentType document_type = 3; +} + +message ClaimIds { + // Submission ID from the TO or OTA to trace this claim + string submission_id = 1; + + // Processing ID from insurance supplier + string processing_id = 2; + + // Carrier ID from insurance carrier + string carrier_id = 3; +} + +message ClaimMessageResponse { + // Claim IDs: Submission ID, Processing ID and Carrier ID + cmp.services.insurance.v1.ClaimIds claim_ids = 1; + + // Claim Message Status + cmp.services.insurance.v1.ClaimMessageStatus message_status = 2; +} \ No newline at end of file diff --git a/proto/cmp/services/insurance/v1/get_claim_form.proto b/proto/cmp/services/insurance/v1/get_claim_form.proto index e14ff49d..b39f08cf 100644 --- a/proto/cmp/services/insurance/v1/get_claim_form.proto +++ b/proto/cmp/services/insurance/v1/get_claim_form.proto @@ -6,7 +6,7 @@ import "cmp/services/insurance/v1/insurance_types.proto"; import "cmp/services/insurance/v1/claim_types.proto"; import "cmp/types/v1/common.proto"; import "cmp/types/v1/language.proto"; -import "cmp/types/v2/traveller.proto"; +import "cmp/types/v3/traveller.proto"; import "cmp/services/insurance/v1/search_result_types.proto"; import "google/protobuf/timestamp.proto"; @@ -15,30 +15,20 @@ message InsuranceGetClaimFormRequest { // Message header cmp.types.v1.RequestHeader header = 1; - // Only respond with the products that are new, modified or deactivated after this - // timestamp. - google.protobuf.Timestamp modified_after = 2; - // Languages to be included in the response for descriptions. Null means all // available languages. - repeated cmp.types.v1.Language languages = 3; - - // Insurance codes - cmp.services.insurance.v1.PolicyCodes policy_codes = 4; // TODO-Mo: I used this instead of uuid + repeated cmp.types.v1.Language languages = 2; - cmp.services.insurance.v1.InsuredBooking insured_booking = 5; // TODO-Mo: I used this to specify on-off chain + // Booking token ID for the policy. You get it after minting an Insurance policy. This is not the booking token of the trip. + unit64 policy_token_id = 3; } message InsuranceGetClaimFormResponse { // Message header cmp.types.v1.ResponseHeader header = 1; - // Product list: Insurances - repeated cmp.types.v2.BasicTraveller insured_persons = 2; // TODO-Mo: can an insurance include more than one person ? - - cmp.services.insurance.v1.PolicyExtendedInfo policy_info = 3; - - cmp.services.insurance.v1.ClaimForm form = 4; + // Claim form + cmp.services.insurance.v1.ClaimForm form = 2; } // Insurance get claim form service definition diff --git a/proto/cmp/services/insurance/v1/submit_claim_form.proto b/proto/cmp/services/insurance/v1/submit_claim_form.proto index 58ab18ec..5c39c4c9 100644 --- a/proto/cmp/services/insurance/v1/submit_claim_form.proto +++ b/proto/cmp/services/insurance/v1/submit_claim_form.proto @@ -5,37 +5,26 @@ package cmp.services.insurance.v1; import "cmp/services/insurance/v1/insurance_types.proto"; import "cmp/services/insurance/v1/claim_types.proto"; import "cmp/types/v1/common.proto"; -import "cmp/types/v2/traveller.proto"; +import "cmp/types/v3/traveller.proto"; import "google/protobuf/timestamp.proto"; message InsuranceSubmitClaimFormRequest { // Message header cmp.types.v1.RequestHeader header = 1; - // Only respond with the products that are new, modified or deactivated after this - // timestamp. - google.protobuf.Timestamp modified_after = 2; - - // Product list: Insurances - repeated cmp.types.v2.BasicTraveller insured_persons = 3; // TODO-Mo: can an insurance include more than one person ? - - cmp.services.insurance.v1.PolicyExtendedInfo policy_info = 4; - - cmp.services.insurance.v1.ClaimForm form = 5; + // Claim form + cmp.services.insurance.v1.ClaimForm form = 2; } -message InsuranceSubmitClaimFormResponse { //TODO-Mo what is the metadata here ?! +message InsuranceSubmitClaimFormResponse { // Message header cmp.types.v1.ResponseHeader header = 1; - // Submission ID from the TO or OTA to trace this claim - string submission_id = 2; + // Claim Message Response to respond with claim ids (processing, carrier and submission) and message status + cmp.services.insurance.v1.ClaimMessageResponse claim_message_response = 2; // Claim Status - cmp.services.insurance.v1.ClaimStatus status = 3; - - // Processing ID from insurance supplier - string processing_id = 4; + cmp.services.insurance.v1.ClaimStatus status = 4; } // Insurance submit claim form service definition diff --git a/proto/cmp/services/insurance/v1/submit_claim_form_extra_info.proto b/proto/cmp/services/insurance/v1/submit_claim_form_extra_info.proto index 3ad899d5..8539cf9e 100644 --- a/proto/cmp/services/insurance/v1/submit_claim_form_extra_info.proto +++ b/proto/cmp/services/insurance/v1/submit_claim_form_extra_info.proto @@ -11,37 +11,21 @@ message InsuranceSubmitClaimFormExtraInfoRequest { // Message header cmp.types.v1.RequestHeader header = 1; - // Only respond with the products that are new, modified or deactivated after this - // timestamp. - google.protobuf.Timestamp modified_after = 2; + // Claim IDs: Submission ID, Processing ID and Carrier ID + cmp.services.insurance.v1.ClaimIds claim_ids = 2; - // Submission ID from the TO or OTA to trace this claim - string submission_id = 3; - - // Claim Status - cmp.services.insurance.v1.ClaimStatus status = 4; - - // Processing ID from insurance supplier - string processing_id = 5; - - // Carrier ID from insurance carrier - string carrier_id = 6; - - repeated cmp.services.insurance.v1.ClaimableService extra_info = 7; + repeated cmp.services.insurance.v1.ClaimableService requested_info = 3; } -message InsuranceSubmitClaimFormExtraInfoResponse { //TODO-Mo what is the metadata here ?! +message InsuranceSubmitClaimFormExtraInfoResponse { // Message header cmp.types.v1.ResponseHeader header = 1; - // Submission ID from the TO or OTA to trace this claim - string submission_id = 2; + // Claim Message Response to respond with claim ids (processing, carrier and submission) and message status + cmp.services.insurance.v1.ClaimMessageResponse claim_message_response = 2; // Claim Status - cmp.services.insurance.v1.ClaimStatus status = 3; - - // Processing ID from insurance supplier - string processing_id = 4; + cmp.services.insurance.v1.ClaimStatus status = 2; } // Insurance submit claim form service definition diff --git a/proto/cmp/types/v3/file.proto b/proto/cmp/types/v3/file.proto index a1ebd154..b2be4983 100644 --- a/proto/cmp/types/v3/file.proto +++ b/proto/cmp/types/v3/file.proto @@ -20,14 +20,14 @@ message File { // Description string description = 4; - // TODO-MO: I added the following because I see it is general for any file - string type = 5; + // MIME Type + cmp.types.v3.MIMEType type = 5; + // File size uint64 size = 6; - string hash_algorithm = 7; - - string checksum = 8; + // File checksum + cmp.types.v3.Checksum checksum = 7; } message Image { @@ -112,3 +112,107 @@ enum Codec { CODEC_AV1 = 4; // AV1 CODEC_MPEG2 = 5; // MPEG-2 (codec used for video on DVDs) } + +enum MIMEType { + FILE_TYPE_UNSPECIFIED = 0; + FILE_TYPE_OTHER = 1; + MIME_TYPE_ABW = 2; + MIME_TYPE_APNG = 3; + MIME_TYPE_ARC = 4; + MIME_TYPE_AVIF = 5; + MIME_TYPE_AVI = 6; + MIME_TYPE_AZW = 7; + MIME_TYPE_BIN = 8; + MIME_TYPE_BMP = 9; + MIME_TYPE_BZ = 10; + MIME_TYPE_BZ2 = 11; + MIME_TYPE_CDA = 12; + MIME_TYPE_CSH = 13; + MIME_TYPE_CSS = 14; + MIME_TYPE_CSV = 15; + MIME_TYPE_DOC = 16; + MIME_TYPE_DOCX = 17; + MIME_TYPE_EOT = 18; + MIME_TYPE_EPUB = 19; + MIME_TYPE_GZ = 20; + MIME_TYPE_GIF = 21; + MIME_TYPE_HTM= 22; + MIME_TYPE_ICO = 23; + MIME_TYPE_ICS = 24; + MIME_TYPE_JAR = 25; + MIME_TYPE_JPEG = 26; + MIME_TYPE_JS = 27; + MIME_TYPE_JSON = 28; + MIME_TYPE_JSONLD = 29; + MIME_TYPE_MID = 30; + MIME_TYPE_MJS = 31; + MIME_TYPE_MP3 = 32; + MIME_TYPE_MP4 = 33; + MIME_TYPE_MPEG = 34; + MIME_TYPE_MPKG = 35; + MIME_TYPE_ODP = 36; + MIME_TYPE_ODS = 37; + MIME_TYPE_ODT = 38; + MIME_TYPE_OGA = 39; + MIME_TYPE_OGV = 40; + MIME_TYPE_OGX = 41; + MIME_TYPE_OPUS = 42; + MIME_TYPE_OTF = 43; + MIME_TYPE_PNG = 44; + MIME_TYPE_PDF = 45; + MIME_TYPE_PHP = 46; + MIME_TYPE_PPT = 47; + MIME_TYPE_PPTX = 48; + MIME_TYPE_RAR = 49; + MIME_TYPE_RTF = 50; + MIME_TYPE_SH = 51; + MIME_TYPE_SVG = 52; + MIME_TYPE_TAR = 53; + MIME_TYPE_TIFF = 54; + MIME_TYPE_TS = 55; + MIME_TYPE_TTF = 56; + MIME_TYPE_TXT = 57; + MIME_TYPE_VSD = 58; + MIME_TYPE_WAV = 59; + MIME_TYPE_WEBA = 60; + MIME_TYPE_WEBM = 61; + MIME_TYPE_WEBP = 62; + MIME_TYPE_WOFF = 63; + MIME_TYPE_WOFF2 = 64; + MIME_TYPE_XHTML = 65; + MIME_TYPE_XLS = 66; + MIME_TYPE_XLSX = 67; + MIME_TYPE_XML = 68; + MIME_TYPE_XUL = 69; + MIME_TYPE_ZIP = 70; + MIME_TYPE_3GP = 71; + MIME_TYPE_3G2 = 72; + MIME_TYPE_7Z= 73; + MIME_TYPE_AAC = 74; +} + +message Checksum { + cmp.types.v3.HashAlgorithm hash_algorithm = 7; + + string hash_content = 8; +} + +enum HashAlgorithm { + HASH_ALGORITHM_UNSPECIFIED = 0; + HASH_ALGORITHM_OTHER = 1; + HASH_ALGORITHM_MD5 = 2; + HASH_ALGORITHM_SHA0 = 3; + HASH_ALGORITHM_SHA1 = 4; + HASH_ALGORITHM_SHA224 = 5; + HASH_ALGORITHM_SHA256 = 6; + HASH_ALGORITHM_SHA384 = 7; + HASH_ALGORITHM_SHA512 = 8; + HASH_ALGORITHM_SHA512224 = 9; + HASH_ALGORITHM_SHA512256 = 10; + HASH_ALGORITHM_SHA3224 = 11; + HASH_ALGORITHM_SHA3256 = 12; + HASH_ALGORITHM_SHA3384 = 13; + HASH_ALGORITHM_SHA3512 = 14; + HASH_ALGORITHM_SHAKE128 = 15; + HASH_ALGORITHM_SHAKE256 = 16; +} diff --git a/proto/cmp/types/v3/traveller.proto b/proto/cmp/types/v3/traveller.proto new file mode 100644 index 00000000..6d22169e --- /dev/null +++ b/proto/cmp/types/v3/traveller.proto @@ -0,0 +1,100 @@ +syntax = "proto3"; + +package cmp.types.v3; + +import "cmp/types/v1/date.proto"; +import "cmp/types/v1/document.proto"; +import "cmp/types/v2/contact_info.proto"; +import "cmp/types/v2/country.proto"; + +// Traveller +// +// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/types/v2/traveller.proto.dot.xs.svg) +// +// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/types/v2/traveller.proto.dot.svg) +message BasicTraveller { + // Guest number, the lowest number is the lead-pax. This ID is also used for + // referencing services linked to specific participants, like baggage. + // the traveller_id must be kept consistent between the search request and response. + // Conclusively if the request specifies traveller 0 and 1, then the response also refers + // to these traveller numbers. If the request specifies 1 and 2 or 10 and 20, then the + // response also returns these references. + // The traveller_id is specified in each unit and only detailed once in the search response + // repeated travellers field + int32 traveller_id = 1; + + // Traveller type from enum below + cmp.types.v3.TravellerType type = 2; + + // Birthdate + cmp.types.v1.Date birthdate = 3; + + // The country code for the nationality of the traveller. + cmp.types.v2.Country nationality = 4; +} + +// Traveller Type +enum TravellerType { + TRAVELLER_TYPE_UNSPECIFIED = 0; + TRAVELLER_TYPE_ADULT = 1; + TRAVELLER_TYPE_CHILD = 2; + TRAVELLER_TYPE_INFANT = 3; + TRAVELLER_TYPE_SENIOR = 4; +} + +message ExtensiveTraveller { + // Guest number, the lowest number is the lead-pax. This ID is also used for + // referencing services linked to specific participants, like baggage. + int32 traveller_id = 1; + + // Gender from the enum below + cmp.types.v3.GenderType gender = 2; + + // Many systems might just have one field for all first names and just one field + // for all surnames of a traveller. However, we see many countries with many + // surnames and authorities that require the names data to be correctly registered + // as in the passport of the traveller. In this case you can for example find in + // the fist name field "Diana Frances" and in the surname field "Spencer". However + // with double barrelled surnames this becomes problematic like in the case of + // firstname: "Winnie" Surname: "Madikizela-Mandela". In Spanish tradition, double + // surnames are the norm, which are composed of surname of their fathers, followed + // by the (first) surname of their mothers. These names are combined without + // hyphen for example Julio Iglesias de la Cueva and Enrique Iglesias Preysler. + // Conclusively systems that haye a limited number of first name and surname + // fields can just use one antry and systems that have multipl can fit John legen + // into first_name: John, first_name: Roger, surname: Stephens, surname: Legend. + repeated string first_names = 3; + repeated string surnames = 4; + cmp.types.v2.ContactInfo contact_info = 5; + repeated cmp.types.v1.Document documents = 6; +} + +// Gender Type +enum GenderType { + GENDER_TYPE_UNSPECIFIED = 0; + GENDER_TYPE_MALE = 1; + GENDER_TYPE_FEMALE = 2; + GENDER_TYPE_NONBINARY = 3; + GENDER_TYPE_AGENDER = 4; +} + +// Extra info about the traveller or someone related +message TravellerExtraInfo { + cmp.types.v3.BasicTraveller basic_traveller = 1; + string name = 2; + cmp.types.v3.TravellerRelationship relationship_to_traveller = 2; +} + +enum TravellerRelationship { + TRAVELLER_RELATIONSHIP_UNSPECIFIED = 0; + TRAVELLER_RELATIONSHIP_OTHER = 1; + TRAVELLER_RELATIONSHIP_FATHER = 2; + TRAVELLER_RELATIONSHIP_MOTHER = 3; + TRAVELLER_RELATIONSHIP_SON = 4; + TRAVELLER_RELATIONSHIP_DAUGHTER = 5; + TRAVELLER_RELATIONSHIP_SPOUSE = 6; + TRAVELLER_RELATIONSHIP_BROTHER = 7; + TRAVELLER_RELATIONSHIP_SISTER = 8; + TRAVELLER_RELATIONSHIP_FAMILY_MEMBER = 9; + TRAVELLER_RELATIONSHIP_ADOPTED = 10; +} \ No newline at end of file From 2adf5d9856d91c7bbb8708411645aa4992ccf3d2 Mon Sep 17 00:00:00 2001 From: Mohamed Elmoslemany Date: Wed, 16 Oct 2024 14:37:16 +0200 Subject: [PATCH 04/34] comments --- proto/cmp/types/v3/file.proto | 5 +++++ proto/cmp/types/v3/traveller.proto | 6 ++++++ 2 files changed, 11 insertions(+) diff --git a/proto/cmp/types/v3/file.proto b/proto/cmp/types/v3/file.proto index b2be4983..dc8e5957 100644 --- a/proto/cmp/types/v3/file.proto +++ b/proto/cmp/types/v3/file.proto @@ -113,6 +113,7 @@ enum Codec { CODEC_MPEG2 = 5; // MPEG-2 (codec used for video on DVDs) } +// File mime type enum MIMEType { FILE_TYPE_UNSPECIFIED = 0; FILE_TYPE_OTHER = 1; @@ -191,12 +192,16 @@ enum MIMEType { MIME_TYPE_AAC = 74; } +// File Checksum message Checksum { + // Hash algorithm cmp.types.v3.HashAlgorithm hash_algorithm = 7; + // Hash content string hash_content = 8; } +// Hash algorithms enum HashAlgorithm { HASH_ALGORITHM_UNSPECIFIED = 0; HASH_ALGORITHM_OTHER = 1; diff --git a/proto/cmp/types/v3/traveller.proto b/proto/cmp/types/v3/traveller.proto index 6d22169e..f79f9c7c 100644 --- a/proto/cmp/types/v3/traveller.proto +++ b/proto/cmp/types/v3/traveller.proto @@ -80,11 +80,17 @@ enum GenderType { // Extra info about the traveller or someone related message TravellerExtraInfo { + // Traveller cmp.types.v3.BasicTraveller basic_traveller = 1; + + // Traveller name string name = 2; + + // Relationship with the traveller cmp.types.v3.TravellerRelationship relationship_to_traveller = 2; } +// Traveller relationship enum TravellerRelationship { TRAVELLER_RELATIONSHIP_UNSPECIFIED = 0; TRAVELLER_RELATIONSHIP_OTHER = 1; From 2eb9803fc0a0f27fe4317143329899e9f6e8337e Mon Sep 17 00:00:00 2001 From: Mohamed Elmoslemany Date: Thu, 17 Oct 2024 15:11:34 +0200 Subject: [PATCH 05/34] comments --- .../v1/claim_settlement_decision.proto | 15 ++++-- .../v1/claim_settlement_paidout.proto | 49 ------------------- .../services/insurance/v1/claim_types.proto | 24 ++++----- 3 files changed, 24 insertions(+), 64 deletions(-) delete mode 100644 proto/cmp/services/insurance/v1/claim_settlement_paidout.proto diff --git a/proto/cmp/services/insurance/v1/claim_settlement_decision.proto b/proto/cmp/services/insurance/v1/claim_settlement_decision.proto index f4fea8a0..15d71797 100644 --- a/proto/cmp/services/insurance/v1/claim_settlement_decision.proto +++ b/proto/cmp/services/insurance/v1/claim_settlement_decision.proto @@ -21,13 +21,20 @@ message InsuranceSettlementDecisionRequest { //TODO-Mo: I called it decision in // Claim Status cmp.services.insurance.v1.ClaimStatus status = 4; - string acceptance_reference = 5; // TODO-Mo: what if it is rejected ? + // TODO: Is this reference applied for Acceptance and Rejection ? + string decision_reference = 5; - string transaction_id = 6; + // More info about decision such as rejection reason. + string decision_detail = 6; - string transaction_type = 7; + // Todo-Mo: create PayOutTransaction message with id and type. + // Payment transaction id + string transaction_id = 7; - cmp.types.v2.Price amount = 8; + string transaction_type = 8; + + // TODO: ask whether there could be multiple payouts for the same claim. + cmp.types.v2.PriceDetail amount = 9; } message InsuranceSettlementDecisionResponse { diff --git a/proto/cmp/services/insurance/v1/claim_settlement_paidout.proto b/proto/cmp/services/insurance/v1/claim_settlement_paidout.proto deleted file mode 100644 index 553bee7e..00000000 --- a/proto/cmp/services/insurance/v1/claim_settlement_paidout.proto +++ /dev/null @@ -1,49 +0,0 @@ -syntax = "proto3"; - -package cmp.services.insurance.v1; - -import "cmp/services/insurance/v1/claim_types.proto"; -import "cmp/types/v1/common.proto"; -import "cmp/types/v2/price.proto"; -import "google/protobuf/timestamp.proto"; - -message InsuranceSettlementPaidOutRequest { //TODO-Mo: what's the difference between paidout request and decision request ?! - // Message header - cmp.types.v1.RequestHeader header = 1; - - // Only respond with the products that are new, modified or deactivated after this - // timestamp. - google.protobuf.Timestamp modified_after = 2; - - // Claim IDs: Submission ID, Processing ID and Carrier ID - cmp.services.insurance.v1.ClaimIds claim_ids = 3; - - // Claim Status - cmp.services.insurance.v1.ClaimStatus status = 4; - - string acceptance_reference = 5; // TODO-Mo: what if it is rejected ? - - string transaction_id = 6; - - string transaction_type = 7; - - cmp.types.v2.Price amount = 8; -} - -message InsuranceSettlementPaidOutResponse { - // Message header - cmp.types.v1.ResponseHeader header = 1; - - // Claim Message Response to respond with claim ids (processing, carrier and submission) and message status - cmp.services.insurance.v1.ClaimMessageResponse claim_message_response = 2; -} - -// Insurance settlement PaidOut service definition -// -// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/insurance/v1/claim_settlement_paidout.proto.dot.xs.svg) -// -// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/insurance/v1/claim_settlement_paidout.proto.dot.svg) -service InsuranceSettlementPaidOutService { - // Returns insurance settlement response - rpc InsuranceSettlementPaidOut(InsuranceSettlementPaidOutRequest) returns (InsuranceSettlementPaidOutResponse); -} diff --git a/proto/cmp/services/insurance/v1/claim_types.proto b/proto/cmp/services/insurance/v1/claim_types.proto index d2356d9a..0e30237d 100644 --- a/proto/cmp/services/insurance/v1/claim_types.proto +++ b/proto/cmp/services/insurance/v1/claim_types.proto @@ -15,8 +15,8 @@ import "cmp/types/v3/traveller.proto"; // [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/insurance/v1/claim_types.proto.dot.svg) message ClaimForm { - // Insured person or someone related - cmp.types.v3.TravellerExtraInfo insured_person = 2; + // Insured person or someone related who has the accident + cmp.types.v3.TravellerExtraInfo affected_person = 2; // Policy brief info cmp.services.insurance.v1.PolicyInfo policy_info = 3; @@ -28,7 +28,7 @@ message ClaimForm { repeated cmp.services.insurance.v1.ClaimDocument additional_documents = 3; - cmp.services.insurance.v1.ClaimAdditionalInfo additional_info = 4; // TODO-Mo: I removed repeated from here and put it in each of the message parameters + repeated cmp.services.insurance.v1.ClaimAdditionalInfo additional_info = 4; } message ClaimableService { @@ -43,8 +43,8 @@ message ClaimDocument { } message ClaimAdditionalInfo { - repeated string info = 1; - repeated cmp.services.insurance.v1.ClaimCondition condition = 2; + string info = 1; + cmp.services.insurance.v1.ClaimCondition condition = 2; } // Claim conditions @@ -91,12 +91,11 @@ enum ClaimStatus { // TODO: check if this list is sufficient enum ClaimMessageStatus { CLAIM_MESSAGE_STATUS_UNSPECIFIED = 0; - CLAIM_MESSAGE_STATUS_OTHER = 1; + CLAIM_MESSAGE_STATUS_ERROR = 1; CLAIM_MESSAGE_STATUS_RECEIVED = 2; CLAIM_MESSAGE_STATUS_UNKNOWN_CARRIER_ID = 3; CLAIM_MESSAGE_STATUS_UNKNOWN_PROCESSING_ID = 4; CLAIM_MESSAGE_STATUS_UNKNOWN_SUBMISSION_ID = 5; - CLAIM_MESSAGE_STATUS_EROOR = 6; } // Brief info about insurance policy @@ -104,10 +103,13 @@ message PolicyInfo { cmp.types.v3.TravellerExtraInfo insured_person = 1; uint64 policy_token_id = 2 ; int32 chain_id = 3; + // for payout // Todo-mo: should be one of + // TODO: how do they define currency for pay out and which chain to use ? string wallet_address = 4; + // for pay out string iban = 5; - string company_name = 6; // TODO-Mo: what about adding name to contact info in types ? - cmp.types.v2.ContactInfo comany_contact = 7; + string company_name = 6; // TODO-Mo: create new Company type to have name and contact info ? + cmp.types.v2.ContactInfo company_contact = 7; cmp.services.insurance.v1.PolicyCodes policy_codes = 8; } @@ -117,7 +119,7 @@ message ClaimInfoRequested { cmp.services.insurance.v1.ClaimDocumentType document_type = 3; } -message ClaimIds { +message ClaimId { // Submission ID from the TO or OTA to trace this claim string submission_id = 1; @@ -130,7 +132,7 @@ message ClaimIds { message ClaimMessageResponse { // Claim IDs: Submission ID, Processing ID and Carrier ID - cmp.services.insurance.v1.ClaimIds claim_ids = 1; + cmp.services.insurance.v1.ClaimId claim_id = 1; // Claim Message Status cmp.services.insurance.v1.ClaimMessageStatus message_status = 2; From b8addda54371196cc6f8bd82524dd62bac9fd43a Mon Sep 17 00:00:00 2001 From: Mohamed Elmoslemany Date: Fri, 18 Oct 2024 12:33:10 +0200 Subject: [PATCH 06/34] adjust comments --- .../v1/claim_settlement_decision.proto | 16 ++--- .../v1/claim_settlement_extra_info.proto | 4 ++ .../services/insurance/v1/claim_types.proto | 60 ++++++++++++++++--- .../v1/submit_claim_form_extra_info.proto | 1 + proto/cmp/types/v1/company.proto | 24 ++++++++ proto/cmp/types/v2/payment.proto | 25 ++++++++ 6 files changed, 116 insertions(+), 14 deletions(-) create mode 100644 proto/cmp/types/v1/company.proto create mode 100644 proto/cmp/types/v2/payment.proto diff --git a/proto/cmp/services/insurance/v1/claim_settlement_decision.proto b/proto/cmp/services/insurance/v1/claim_settlement_decision.proto index 15d71797..e671526f 100644 --- a/proto/cmp/services/insurance/v1/claim_settlement_decision.proto +++ b/proto/cmp/services/insurance/v1/claim_settlement_decision.proto @@ -7,12 +7,16 @@ import "cmp/types/v1/common.proto"; import "cmp/types/v2/price.proto"; import "google/protobuf/timestamp.proto"; -message InsuranceSettlementDecisionRequest { //TODO-Mo: I called it decision instead of acceptedrejected +message InsuranceSettlementDecisionRequest { // Message header cmp.types.v1.RequestHeader header = 1; // Only respond with the products that are new, modified or deactivated after this // timestamp. + // + // Timestamps may be used for both off-chain and on-chain operations. + // For on-chain operations, only seconds are supported, and nanoseconds + // will be ignored. google.protobuf.Timestamp modified_after = 2; // Claim IDs: Submission ID, Processing ID and Carrier ID @@ -27,14 +31,12 @@ message InsuranceSettlementDecisionRequest { //TODO-Mo: I called it decision in // More info about decision such as rejection reason. string decision_detail = 6; - // Todo-Mo: create PayOutTransaction message with id and type. - // Payment transaction id - string transaction_id = 7; - - string transaction_type = 8; + // Pay-out transaction + cmp.services.insurance.v1.PayOutTransaction payout_transaction = 7; // TODO: ask whether there could be multiple payouts for the same claim. - cmp.types.v2.PriceDetail amount = 9; + // Amount + cmp.types.v2.PriceDetail amount = 8; } message InsuranceSettlementDecisionResponse { diff --git a/proto/cmp/services/insurance/v1/claim_settlement_extra_info.proto b/proto/cmp/services/insurance/v1/claim_settlement_extra_info.proto index 3f5e90b9..43882891 100644 --- a/proto/cmp/services/insurance/v1/claim_settlement_extra_info.proto +++ b/proto/cmp/services/insurance/v1/claim_settlement_extra_info.proto @@ -12,6 +12,10 @@ message InsuranceSettlementExtraInfoRequest { // Only respond with the products that are new, modified or deactivated after this // timestamp. + // + // Timestamps may be used for both off-chain and on-chain operations. + // For on-chain operations, only seconds are supported, and nanoseconds + // will be ignored. google.protobuf.Timestamp modified_after = 2; // Claim IDs: Submission ID, Processing ID and Carrier ID diff --git a/proto/cmp/services/insurance/v1/claim_types.proto b/proto/cmp/services/insurance/v1/claim_types.proto index 0e30237d..a6c68d72 100644 --- a/proto/cmp/services/insurance/v1/claim_types.proto +++ b/proto/cmp/services/insurance/v1/claim_types.proto @@ -6,6 +6,7 @@ import "cmp/types/v1/date.proto"; import "cmp/types/v1/common.proto"; import "cmp/types/v3/file.proto"; import "cmp/types/v2/price.proto"; +import "cmp/types/v2/payment.proto"; import "cmp/types/v3/traveller.proto"; // ClaimForm @@ -24,26 +25,43 @@ message ClaimForm { // Dates of services repeated cmp.types.v1.Date dates = 1; + // Services to claim repeated cmp.services.insurance.v1.ClaimableService services_to_claim = 2; + // Additional documents repeated cmp.services.insurance.v1.ClaimDocument additional_documents = 3; + // Additional info repeated cmp.services.insurance.v1.ClaimAdditionalInfo additional_info = 4; } +// Service to claim message ClaimableService { + // Service description string service_description = 1; + + // Amount to be claimed cmp.types.v2.Price charge_amount = 2; + + // Documents repeated cmp.services.insurance.v1.ClaimDocument documents = 3; } +// Claim Document message ClaimDocument { + // File cmp.types.v3.File file = 1; + + // Type of the document cmp.services.insurance.v1.ClaimDocumentType type = 2; } +// Additonal info message ClaimAdditionalInfo { + // Info string. More information regarding the claim/accident to be added here string info = 1; + + // Condition related to the claim cmp.services.insurance.v1.ClaimCondition condition = 2; } @@ -100,22 +118,41 @@ enum ClaimMessageStatus { // Brief info about insurance policy message PolicyInfo { + // Insured person cmp.types.v3.TravellerExtraInfo insured_person = 1; + + // Token ID of the policy booking uint64 policy_token_id = 2 ; + + // Chain ID , where the policy token was issued int32 chain_id = 3; - // for payout // Todo-mo: should be one of + // TODO: how do they define currency for pay out and which chain to use ? - string wallet_address = 4; - // for pay out - string iban = 5; - string company_name = 6; // TODO-Mo: create new Company type to have name and contact info ? - cmp.types.v2.ContactInfo company_contact = 7; - cmp.services.insurance.v1.PolicyCodes policy_codes = 8; + // Payment method: wallet address or the IBAN of the claim issuer for pay-out + oneof payment_method { + // Wallet address for on-chain payment + string wallet_address = 4; + + // IBAN for off-chain payment + string iban = 5; + } + + // Insurance Company + cmp.types.v1.Company company = 6; + + // Policy Codes: unit Code, service code and product code + cmp.services.insurance.v1.PolicyCodes policy_code = 8; } +// Claim more info requested message ClaimInfoRequested { + // Service description string service_description = 1; + + // Claim service amount cmp.types.v2.Price charge_amount = 2; + + // Document type requested cmp.services.insurance.v1.ClaimDocumentType document_type = 3; } @@ -136,4 +173,13 @@ message ClaimMessageResponse { // Claim Message Status cmp.services.insurance.v1.ClaimMessageStatus message_status = 2; +} + +// Claim Pay-Out Transaction +message PayOutTransaction { + // Transaction ID + string transaction_id = 1; + + // Transaction Type. It can be Bank transfer, Crypto transfer, Credit card, ... etc + cmp.types.v2.PaymentType transaction_type = 2; } \ No newline at end of file diff --git a/proto/cmp/services/insurance/v1/submit_claim_form_extra_info.proto b/proto/cmp/services/insurance/v1/submit_claim_form_extra_info.proto index 8539cf9e..3a60990e 100644 --- a/proto/cmp/services/insurance/v1/submit_claim_form_extra_info.proto +++ b/proto/cmp/services/insurance/v1/submit_claim_form_extra_info.proto @@ -14,6 +14,7 @@ message InsuranceSubmitClaimFormExtraInfoRequest { // Claim IDs: Submission ID, Processing ID and Carrier ID cmp.services.insurance.v1.ClaimIds claim_ids = 2; + // Extra info needed repeated cmp.services.insurance.v1.ClaimableService requested_info = 3; } diff --git a/proto/cmp/types/v1/company.proto b/proto/cmp/types/v1/company.proto new file mode 100644 index 00000000..67657143 --- /dev/null +++ b/proto/cmp/types/v1/company.proto @@ -0,0 +1,24 @@ +syntax = "proto3"; + +package cmp.types.v1; + +import "cmp/types/v2/contact_info.proto"; + +// ### Company message type +// +// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/types/v1/company.proto.dot.xs.svg) +// +// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/types/v1/company.proto.dot.svg) +message Company { + // Short name of the partner. Ex: Chain4Travel + string short_name = 1; + + // Legal name of the partner. Ex: Chain4Travel AG + string legal_name = 2; + + // Contact Info + cmp.types.v2.ContactInfo contact_info = 6; +} + + + diff --git a/proto/cmp/types/v2/payment.proto b/proto/cmp/types/v2/payment.proto new file mode 100644 index 00000000..f87c0776 --- /dev/null +++ b/proto/cmp/types/v2/payment.proto @@ -0,0 +1,25 @@ +syntax = "proto3"; + +package cmp.types.v2; + +import "cmp/types/v1/credit_card.proto"; + +// Additional payment info message with currently only a single field of +// `CreditCard` message type. +// +// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/types/v2/payment.proto.dot.xs.svg) +// +// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/types/v2/payment.proto.dot.svg) +message AdditionalPaymentInfo { + cmp.types.v1.CreditCard credit_card = 1; +} + +// Payment Types +enum PaymentType { + PAYMENT_TYPE_UNSPECIFIED = 0; + PAYMENT_TYPE_OTHER = 1; + PAYMENT_TYPE_CRYPTO = 2; + PAYMENT_TYPE_BANK_TRANSFER = 3; + PAYMENT_TYPE_CREDITCARD = 4; + PAYMENT_TYPE_PAYPAL = 5; +} From d029583f45850672dd8804d01ff23a2455ebb034 Mon Sep 17 00:00:00 2001 From: Mohamed Elmoslemany Date: Fri, 18 Oct 2024 12:48:56 +0200 Subject: [PATCH 07/34] buf lint fixes --- .../v1/claim_settlement_decision.proto | 12 +- .../v1/claim_settlement_extra_info.proto | 6 +- .../services/insurance/v1/claim_types.proto | 194 +++++++++--------- .../insurance/v1/get_claim_form.proto | 7 +- .../insurance/v1/submit_claim_form.proto | 3 - .../v1/submit_claim_form_extra_info.proto | 8 +- proto/cmp/types/{v1 => v2}/company.proto | 5 +- proto/cmp/types/v3/file.proto | 118 +++++------ proto/cmp/types/v3/traveller.proto | 6 +- 9 files changed, 173 insertions(+), 186 deletions(-) rename proto/cmp/types/{v1 => v2}/company.proto (95%) diff --git a/proto/cmp/services/insurance/v1/claim_settlement_decision.proto b/proto/cmp/services/insurance/v1/claim_settlement_decision.proto index e671526f..dde9f548 100644 --- a/proto/cmp/services/insurance/v1/claim_settlement_decision.proto +++ b/proto/cmp/services/insurance/v1/claim_settlement_decision.proto @@ -16,17 +16,17 @@ message InsuranceSettlementDecisionRequest { // // Timestamps may be used for both off-chain and on-chain operations. // For on-chain operations, only seconds are supported, and nanoseconds - // will be ignored. + // will be ignored. google.protobuf.Timestamp modified_after = 2; - // Claim IDs: Submission ID, Processing ID and Carrier ID - cmp.services.insurance.v1.ClaimIds claim_ids = 3; + // Claim ID: Submission ID, Processing ID and Carrier ID + cmp.services.insurance.v1.ClaimId claim_id = 3; // Claim Status cmp.services.insurance.v1.ClaimStatus status = 4; // TODO: Is this reference applied for Acceptance and Rejection ? - string decision_reference = 5; + string decision_reference = 5; // More info about decision such as rejection reason. string decision_detail = 6; @@ -39,7 +39,7 @@ message InsuranceSettlementDecisionRequest { cmp.types.v2.PriceDetail amount = 8; } -message InsuranceSettlementDecisionResponse { +message InsuranceSettlementDecisionResponse { // Message header cmp.types.v1.ResponseHeader header = 1; @@ -55,4 +55,4 @@ message InsuranceSettlementDecisionResponse { service InsuranceSettlementDecisionService { // Returns insurance settlement response rpc InsuranceSettlementDecision(InsuranceSettlementDecisionRequest) returns (InsuranceSettlementDecisionResponse); -} \ No newline at end of file +} diff --git a/proto/cmp/services/insurance/v1/claim_settlement_extra_info.proto b/proto/cmp/services/insurance/v1/claim_settlement_extra_info.proto index 43882891..7e920af6 100644 --- a/proto/cmp/services/insurance/v1/claim_settlement_extra_info.proto +++ b/proto/cmp/services/insurance/v1/claim_settlement_extra_info.proto @@ -18,13 +18,13 @@ message InsuranceSettlementExtraInfoRequest { // will be ignored. google.protobuf.Timestamp modified_after = 2; - // Claim IDs: Submission ID, Processing ID and Carrier ID - cmp.services.insurance.v1.ClaimIds claim_ids = 3; + // Claim ID: Submission ID, Processing ID and Carrier ID + cmp.services.insurance.v1.ClaimId claim_id = 3; repeated cmp.services.insurance.v1.ClaimInfoRequested info_requested = 4; } -message InsuranceSettlementExtraInfoResponse { +message InsuranceSettlementExtraInfoResponse { // Message header cmp.types.v1.ResponseHeader header = 1; diff --git a/proto/cmp/services/insurance/v1/claim_types.proto b/proto/cmp/services/insurance/v1/claim_types.proto index a6c68d72..7b7e81e4 100644 --- a/proto/cmp/services/insurance/v1/claim_types.proto +++ b/proto/cmp/services/insurance/v1/claim_types.proto @@ -2,11 +2,12 @@ syntax = "proto3"; package cmp.services.insurance.v1; +import "cmp/services/insurance/v1/search_result_types.proto"; import "cmp/types/v1/date.proto"; -import "cmp/types/v1/common.proto"; -import "cmp/types/v3/file.proto"; -import "cmp/types/v2/price.proto"; +import "cmp/types/v2/company.proto"; import "cmp/types/v2/payment.proto"; +import "cmp/types/v2/price.proto"; +import "cmp/types/v3/file.proto"; import "cmp/types/v3/traveller.proto"; // ClaimForm @@ -15,145 +16,144 @@ import "cmp/types/v3/traveller.proto"; // // [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/insurance/v1/claim_types.proto.dot.svg) message ClaimForm { + // Insured person or someone related who has the accident + cmp.types.v3.TravellerExtraInfo affected_person = 1; - // Insured person or someone related who has the accident - cmp.types.v3.TravellerExtraInfo affected_person = 2; + // Policy brief info + cmp.services.insurance.v1.PolicyInfo policy_info = 2; - // Policy brief info - cmp.services.insurance.v1.PolicyInfo policy_info = 3; - - // Dates of services - repeated cmp.types.v1.Date dates = 1; + // Dates of services + repeated cmp.types.v1.Date dates = 3; - // Services to claim - repeated cmp.services.insurance.v1.ClaimableService services_to_claim = 2; + // Services to claim + repeated cmp.services.insurance.v1.ClaimableService services_to_claim = 4; - // Additional documents - repeated cmp.services.insurance.v1.ClaimDocument additional_documents = 3; + // Additional documents + repeated cmp.services.insurance.v1.ClaimDocument additional_documents = 5; - // Additional info - repeated cmp.services.insurance.v1.ClaimAdditionalInfo additional_info = 4; + // Additional info + repeated cmp.services.insurance.v1.ClaimAdditionalInfo additional_info = 6; } // Service to claim message ClaimableService { - // Service description - string service_description = 1; + // Service description + string service_description = 1; - // Amount to be claimed - cmp.types.v2.Price charge_amount = 2; + // Amount to be claimed + cmp.types.v2.Price charge_amount = 2; - // Documents - repeated cmp.services.insurance.v1.ClaimDocument documents = 3; + // Documents + repeated cmp.services.insurance.v1.ClaimDocument documents = 3; } // Claim Document message ClaimDocument { - // File - cmp.types.v3.File file = 1; + // File + cmp.types.v3.File file = 1; - // Type of the document - cmp.services.insurance.v1.ClaimDocumentType type = 2; + // Type of the document + cmp.services.insurance.v1.ClaimDocumentType type = 2; } // Additonal info message ClaimAdditionalInfo { - // Info string. More information regarding the claim/accident to be added here - string info = 1; + // Info string. More information regarding the claim/accident to be added here + string info = 1; - // Condition related to the claim - cmp.services.insurance.v1.ClaimCondition condition = 2; + // Condition related to the claim + cmp.services.insurance.v1.ClaimCondition condition = 2; } // Claim conditions // TODO: is this list enough ? -enum ClaimCondition { - CLAIM_CONDITION_UNSPECIFIED = 0; - CLAIM_CONDITION_OTHER = 1; - CLAIM_CONDITION_EMPLOYMENT = 2; - CLAIM_CONDITION_TRIP_DELAY = 3; - CLAIM_CONDITION_TRIP_CANCELLED = 4; - CLAIM_CONDITION_FAMILY = 5; - CLAIM_CONDITION_DEATH = 6; - CLAIM_CONDITION_CAR_ACCIDENT = 0; +enum ClaimCondition { + CLAIM_CONDITION_UNSPECIFIED = 0; + CLAIM_CONDITION_OTHER = 1; + CLAIM_CONDITION_EMPLOYMENT = 2; + CLAIM_CONDITION_TRIP_DELAY = 3; + CLAIM_CONDITION_TRIP_CANCELLED = 4; + CLAIM_CONDITION_FAMILY = 5; + CLAIM_CONDITION_DEATH = 6; + CLAIM_CONDITION_CAR_ACCIDENT = 7; } // Claim document types // TODO: check if there are more types enum ClaimDocumentType { - CLAIM_DOCUMENT_TYPE_UNSPECIFIED = 0; - CLAIM_DOCUMENT_TYPE_OTHER = 1; - CLAIM_DOCUMENT_TYPE_BILL = 2; - CLAIM_DOCUMENT_TYPE_POLICE_REPORT = 3; - CLAIM_DOCUMENT_TYPE_MEDICAL_REPORT = 4; - CLAIM_DOCUMENT_TYPE_LAB_RESULT = 5; + CLAIM_DOCUMENT_TYPE_UNSPECIFIED = 0; + CLAIM_DOCUMENT_TYPE_OTHER = 1; + CLAIM_DOCUMENT_TYPE_BILL = 2; + CLAIM_DOCUMENT_TYPE_POLICE_REPORT = 3; + CLAIM_DOCUMENT_TYPE_MEDICAL_REPORT = 4; + CLAIM_DOCUMENT_TYPE_LAB_RESULT = 5; } // Claim Status // TODO: check if this list is sufficient enum ClaimStatus { - CLAIM_STATUS_UNSPECIFIED = 0; - CLAIM_STATUS_RECEIVED = 1; - CLAIM_STATUS_PROCESSING = 2; - CLAIM_STATUS_APPROVED = 3; - CLAIM_STATUS_REJECTED = 4; - CLAIM_STATUS_INVESTIGATING = 5; - CLAIM_STATUS_MORE_INFO_REQUIRED = 6; - CLAIM_STATUS_FEEDBACK = 7; - CLAIM_STATUS_REVIEW = 8; - CLAIM_STATUS_PAIDOUT = 9; - CLAIM_STATUS_DONE = 10; + CLAIM_STATUS_UNSPECIFIED = 0; + CLAIM_STATUS_RECEIVED = 1; + CLAIM_STATUS_PROCESSING = 2; + CLAIM_STATUS_APPROVED = 3; + CLAIM_STATUS_REJECTED = 4; + CLAIM_STATUS_INVESTIGATING = 5; + CLAIM_STATUS_MORE_INFO_REQUIRED = 6; + CLAIM_STATUS_FEEDBACK = 7; + CLAIM_STATUS_REVIEW = 8; + CLAIM_STATUS_PAIDOUT = 9; + CLAIM_STATUS_DONE = 10; } // Claim Message Status // TODO: check if this list is sufficient enum ClaimMessageStatus { - CLAIM_MESSAGE_STATUS_UNSPECIFIED = 0; - CLAIM_MESSAGE_STATUS_ERROR = 1; - CLAIM_MESSAGE_STATUS_RECEIVED = 2; - CLAIM_MESSAGE_STATUS_UNKNOWN_CARRIER_ID = 3; - CLAIM_MESSAGE_STATUS_UNKNOWN_PROCESSING_ID = 4; - CLAIM_MESSAGE_STATUS_UNKNOWN_SUBMISSION_ID = 5; + CLAIM_MESSAGE_STATUS_UNSPECIFIED = 0; + CLAIM_MESSAGE_STATUS_ERROR = 1; + CLAIM_MESSAGE_STATUS_RECEIVED = 2; + CLAIM_MESSAGE_STATUS_UNKNOWN_CARRIER_ID = 3; + CLAIM_MESSAGE_STATUS_UNKNOWN_PROCESSING_ID = 4; + CLAIM_MESSAGE_STATUS_UNKNOWN_SUBMISSION_ID = 5; } // Brief info about insurance policy message PolicyInfo { - // Insured person - cmp.types.v3.TravellerExtraInfo insured_person = 1; - - // Token ID of the policy booking - uint64 policy_token_id = 2 ; - - // Chain ID , where the policy token was issued - int32 chain_id = 3; - - // TODO: how do they define currency for pay out and which chain to use ? - // Payment method: wallet address or the IBAN of the claim issuer for pay-out - oneof payment_method { - // Wallet address for on-chain payment - string wallet_address = 4; - - // IBAN for off-chain payment - string iban = 5; - } - - // Insurance Company - cmp.types.v1.Company company = 6; - - // Policy Codes: unit Code, service code and product code - cmp.services.insurance.v1.PolicyCodes policy_code = 8; + // Insured person + cmp.types.v3.TravellerExtraInfo insured_person = 1; + + // Token ID of the policy booking + uint64 policy_token_id = 2; + + // Chain ID , where the policy token was issued + int32 chain_id = 3; + + // TODO: how do they define currency for pay out and which chain to use ? + // Payment method: wallet address or the IBAN of the claim issuer for pay-out + oneof payment_method { + // Wallet address for on-chain payment + string wallet_address = 4; + + // IBAN for off-chain payment + string iban = 5; + } + + // Insurance Company + cmp.types.v2.Company company = 6; + + // Policy Codes: unit Code, service code and product code + cmp.services.insurance.v1.PolicyCodes policy_code = 8; } // Claim more info requested message ClaimInfoRequested { - // Service description - string service_description = 1; + // Service description + string service_description = 1; - // Claim service amount - cmp.types.v2.Price charge_amount = 2; + // Claim service amount + cmp.types.v2.Price charge_amount = 2; - // Document type requested - cmp.services.insurance.v1.ClaimDocumentType document_type = 3; + // Document type requested + cmp.services.insurance.v1.ClaimDocumentType document_type = 3; } message ClaimId { @@ -177,9 +177,9 @@ message ClaimMessageResponse { // Claim Pay-Out Transaction message PayOutTransaction { - // Transaction ID - string transaction_id = 1; + // Transaction ID + string transaction_id = 1; - // Transaction Type. It can be Bank transfer, Crypto transfer, Credit card, ... etc - cmp.types.v2.PaymentType transaction_type = 2; -} \ No newline at end of file + // Transaction Type. It can be Bank transfer, Crypto transfer, Credit card, ... etc + cmp.types.v2.PaymentType transaction_type = 2; +} diff --git a/proto/cmp/services/insurance/v1/get_claim_form.proto b/proto/cmp/services/insurance/v1/get_claim_form.proto index b39f08cf..0df74586 100644 --- a/proto/cmp/services/insurance/v1/get_claim_form.proto +++ b/proto/cmp/services/insurance/v1/get_claim_form.proto @@ -2,14 +2,9 @@ syntax = "proto3"; package cmp.services.insurance.v1; -import "cmp/services/insurance/v1/insurance_types.proto"; import "cmp/services/insurance/v1/claim_types.proto"; import "cmp/types/v1/common.proto"; import "cmp/types/v1/language.proto"; -import "cmp/types/v3/traveller.proto"; -import "cmp/services/insurance/v1/search_result_types.proto"; -import "google/protobuf/timestamp.proto"; - message InsuranceGetClaimFormRequest { // Message header @@ -20,7 +15,7 @@ message InsuranceGetClaimFormRequest { repeated cmp.types.v1.Language languages = 2; // Booking token ID for the policy. You get it after minting an Insurance policy. This is not the booking token of the trip. - unit64 policy_token_id = 3; + uint64 policy_token_id = 3; } message InsuranceGetClaimFormResponse { diff --git a/proto/cmp/services/insurance/v1/submit_claim_form.proto b/proto/cmp/services/insurance/v1/submit_claim_form.proto index 5c39c4c9..50730645 100644 --- a/proto/cmp/services/insurance/v1/submit_claim_form.proto +++ b/proto/cmp/services/insurance/v1/submit_claim_form.proto @@ -2,11 +2,8 @@ syntax = "proto3"; package cmp.services.insurance.v1; -import "cmp/services/insurance/v1/insurance_types.proto"; import "cmp/services/insurance/v1/claim_types.proto"; import "cmp/types/v1/common.proto"; -import "cmp/types/v3/traveller.proto"; -import "google/protobuf/timestamp.proto"; message InsuranceSubmitClaimFormRequest { // Message header diff --git a/proto/cmp/services/insurance/v1/submit_claim_form_extra_info.proto b/proto/cmp/services/insurance/v1/submit_claim_form_extra_info.proto index 3a60990e..d0331ccd 100644 --- a/proto/cmp/services/insurance/v1/submit_claim_form_extra_info.proto +++ b/proto/cmp/services/insurance/v1/submit_claim_form_extra_info.proto @@ -2,17 +2,15 @@ syntax = "proto3"; package cmp.services.insurance.v1; - import "cmp/services/insurance/v1/claim_types.proto"; import "cmp/types/v1/common.proto"; -import "google/protobuf/timestamp.proto"; message InsuranceSubmitClaimFormExtraInfoRequest { // Message header cmp.types.v1.RequestHeader header = 1; - // Claim IDs: Submission ID, Processing ID and Carrier ID - cmp.services.insurance.v1.ClaimIds claim_ids = 2; + // Claim ID: Submission ID, Processing ID and Carrier ID + cmp.services.insurance.v1.ClaimId claim_id = 2; // Extra info needed repeated cmp.services.insurance.v1.ClaimableService requested_info = 3; @@ -26,7 +24,7 @@ message InsuranceSubmitClaimFormExtraInfoResponse { cmp.services.insurance.v1.ClaimMessageResponse claim_message_response = 2; // Claim Status - cmp.services.insurance.v1.ClaimStatus status = 2; + cmp.services.insurance.v1.ClaimStatus status = 3; } // Insurance submit claim form service definition diff --git a/proto/cmp/types/v1/company.proto b/proto/cmp/types/v2/company.proto similarity index 95% rename from proto/cmp/types/v1/company.proto rename to proto/cmp/types/v2/company.proto index 67657143..361a10c1 100644 --- a/proto/cmp/types/v1/company.proto +++ b/proto/cmp/types/v2/company.proto @@ -1,6 +1,6 @@ syntax = "proto3"; -package cmp.types.v1; +package cmp.types.v2; import "cmp/types/v2/contact_info.proto"; @@ -19,6 +19,3 @@ message Company { // Contact Info cmp.types.v2.ContactInfo contact_info = 6; } - - - diff --git a/proto/cmp/types/v3/file.proto b/proto/cmp/types/v3/file.proto index dc8e5957..a8c2b1d5 100644 --- a/proto/cmp/types/v3/file.proto +++ b/proto/cmp/types/v3/file.proto @@ -21,13 +21,13 @@ message File { string description = 4; // MIME Type - cmp.types.v3.MIMEType type = 5; + cmp.types.v3.MIMEType type = 5; // File size uint64 size = 6; // File checksum - cmp.types.v3.Checksum checksum = 7; + cmp.types.v3.Checksum checksum = 7; } message Image { @@ -115,81 +115,81 @@ enum Codec { // File mime type enum MIMEType { - FILE_TYPE_UNSPECIFIED = 0; - FILE_TYPE_OTHER = 1; - MIME_TYPE_ABW = 2; + MIME_TYPE_UNSPECIFIED = 0; + MIME_TYPE_OTHER = 1; + MIME_TYPE_ABW = 2; MIME_TYPE_APNG = 3; - MIME_TYPE_ARC = 4; - MIME_TYPE_AVIF = 5; - MIME_TYPE_AVI = 6; - MIME_TYPE_AZW = 7; - MIME_TYPE_BIN = 8; - MIME_TYPE_BMP = 9; - MIME_TYPE_BZ = 10; - MIME_TYPE_BZ2 = 11; - MIME_TYPE_CDA = 12; - MIME_TYPE_CSH = 13; - MIME_TYPE_CSS = 14; - MIME_TYPE_CSV = 15; - MIME_TYPE_DOC = 16; + MIME_TYPE_ARC = 4; + MIME_TYPE_AVIF = 5; + MIME_TYPE_AVI = 6; + MIME_TYPE_AZW = 7; + MIME_TYPE_BIN = 8; + MIME_TYPE_BMP = 9; + MIME_TYPE_BZ = 10; + MIME_TYPE_BZ2 = 11; + MIME_TYPE_CDA = 12; + MIME_TYPE_CSH = 13; + MIME_TYPE_CSS = 14; + MIME_TYPE_CSV = 15; + MIME_TYPE_DOC = 16; MIME_TYPE_DOCX = 17; - MIME_TYPE_EOT = 18; + MIME_TYPE_EOT = 18; MIME_TYPE_EPUB = 19; - MIME_TYPE_GZ = 20; - MIME_TYPE_GIF = 21; - MIME_TYPE_HTM= 22; - MIME_TYPE_ICO = 23; - MIME_TYPE_ICS = 24; - MIME_TYPE_JAR = 25; + MIME_TYPE_GZ = 20; + MIME_TYPE_GIF = 21; + MIME_TYPE_HTM = 22; + MIME_TYPE_ICO = 23; + MIME_TYPE_ICS = 24; + MIME_TYPE_JAR = 25; MIME_TYPE_JPEG = 26; MIME_TYPE_JS = 27; MIME_TYPE_JSON = 28; MIME_TYPE_JSONLD = 29; MIME_TYPE_MID = 30; - MIME_TYPE_MJS = 31; - MIME_TYPE_MP3 = 32; - MIME_TYPE_MP4 = 33; + MIME_TYPE_MJS = 31; + MIME_TYPE_MP3 = 32; + MIME_TYPE_MP4 = 33; MIME_TYPE_MPEG = 34; MIME_TYPE_MPKG = 35; - MIME_TYPE_ODP = 36; - MIME_TYPE_ODS = 37; - MIME_TYPE_ODT = 38; - MIME_TYPE_OGA = 39; - MIME_TYPE_OGV = 40; - MIME_TYPE_OGX = 41; - MIME_TYPE_OPUS = 42; - MIME_TYPE_OTF = 43; - MIME_TYPE_PNG = 44; - MIME_TYPE_PDF = 45; - MIME_TYPE_PHP = 46; - MIME_TYPE_PPT = 47; + MIME_TYPE_ODP = 36; + MIME_TYPE_ODS = 37; + MIME_TYPE_ODT = 38; + MIME_TYPE_OGA = 39; + MIME_TYPE_OGV = 40; + MIME_TYPE_OGX = 41; + MIME_TYPE_OPUS = 42; + MIME_TYPE_OTF = 43; + MIME_TYPE_PNG = 44; + MIME_TYPE_PDF = 45; + MIME_TYPE_PHP = 46; + MIME_TYPE_PPT = 47; MIME_TYPE_PPTX = 48; - MIME_TYPE_RAR = 49; - MIME_TYPE_RTF = 50; - MIME_TYPE_SH = 51; - MIME_TYPE_SVG = 52; - MIME_TYPE_TAR = 53; + MIME_TYPE_RAR = 49; + MIME_TYPE_RTF = 50; + MIME_TYPE_SH = 51; + MIME_TYPE_SVG = 52; + MIME_TYPE_TAR = 53; MIME_TYPE_TIFF = 54; MIME_TYPE_TS = 55; - MIME_TYPE_TTF = 56; - MIME_TYPE_TXT = 57; - MIME_TYPE_VSD = 58; - MIME_TYPE_WAV = 59; + MIME_TYPE_TTF = 56; + MIME_TYPE_TXT = 57; + MIME_TYPE_VSD = 58; + MIME_TYPE_WAV = 59; MIME_TYPE_WEBA = 60; MIME_TYPE_WEBM = 61; MIME_TYPE_WEBP = 62; MIME_TYPE_WOFF = 63; - MIME_TYPE_WOFF2 = 64; - MIME_TYPE_XHTML = 65; - MIME_TYPE_XLS = 66; + MIME_TYPE_WOFF2 = 64; + MIME_TYPE_XHTML = 65; + MIME_TYPE_XLS = 66; MIME_TYPE_XLSX = 67; - MIME_TYPE_XML = 68; - MIME_TYPE_XUL = 69; - MIME_TYPE_ZIP = 70; - MIME_TYPE_3GP = 71; - MIME_TYPE_3G2 = 72; - MIME_TYPE_7Z= 73; - MIME_TYPE_AAC = 74; + MIME_TYPE_XML = 68; + MIME_TYPE_XUL = 69; + MIME_TYPE_ZIP = 70; + MIME_TYPE_3GP = 71; + MIME_TYPE_3G2 = 72; + MIME_TYPE_7Z = 73; + MIME_TYPE_AAC = 74; } // File Checksum diff --git a/proto/cmp/types/v3/traveller.proto b/proto/cmp/types/v3/traveller.proto index f79f9c7c..0e3b86a8 100644 --- a/proto/cmp/types/v3/traveller.proto +++ b/proto/cmp/types/v3/traveller.proto @@ -85,9 +85,9 @@ message TravellerExtraInfo { // Traveller name string name = 2; - + // Relationship with the traveller - cmp.types.v3.TravellerRelationship relationship_to_traveller = 2; + cmp.types.v3.TravellerRelationship relationship_to_traveller = 3; } // Traveller relationship @@ -103,4 +103,4 @@ enum TravellerRelationship { TRAVELLER_RELATIONSHIP_SISTER = 8; TRAVELLER_RELATIONSHIP_FAMILY_MEMBER = 9; TRAVELLER_RELATIONSHIP_ADOPTED = 10; -} \ No newline at end of file +} From fcf8e571030d9421a50ed22a96ee6b7b12acd87c Mon Sep 17 00:00:00 2001 From: Mohamed Elmoslemany Date: Fri, 18 Oct 2024 12:52:03 +0200 Subject: [PATCH 08/34] update deps --- .../cmp/services/accommodation/v3/info.proto | 45 +++ .../cmp/services/accommodation/v3/list.proto | 37 +++ .../accommodation/v3/property_types.proto | 198 +++++++++++++ .../services/accommodation/v3/search.proto | 123 ++++++++ .../accommodation/v3/search_query_types.proto | 29 ++ .../services/activity/v3/activity_types.proto | 268 ++++++++++++++++++ proto/cmp/services/activity/v3/info.proto | 47 +++ proto/cmp/services/activity/v3/list.proto | 37 +++ proto/cmp/services/activity/v3/search.proto | 159 +++++++++++ .../activity/v3/search_result_types.proto | 45 +++ proto/cmp/services/book/v3/mint.proto | 104 +++++++ proto/cmp/services/book/v3/validate.proto | 53 ++++ proto/cmp/services/insurance/v2/info.proto | 47 +++ .../insurance/v2/insurance_types.proto | 171 +++++++++++ proto/cmp/services/insurance/v2/list.proto | 37 +++ proto/cmp/services/insurance/v2/search.proto | 91 ++++++ .../v2/search_parameters_types.proto | 43 +++ .../insurance/v2/search_query_types.proto | 14 + .../services/seat_map/v3/availability.proto | 60 ++++ proto/cmp/services/seat_map/v3/seat_map.proto | 53 ++++ proto/cmp/services/transport/v3/search.proto | 8 +- .../transport/v3/search_query_types.proto | 54 ++++ proto/cmp/types/v3/seat_map.proto | 211 ++++++++++++++ 23 files changed, 1930 insertions(+), 4 deletions(-) create mode 100644 proto/cmp/services/accommodation/v3/info.proto create mode 100644 proto/cmp/services/accommodation/v3/list.proto create mode 100644 proto/cmp/services/accommodation/v3/property_types.proto create mode 100644 proto/cmp/services/accommodation/v3/search.proto create mode 100644 proto/cmp/services/accommodation/v3/search_query_types.proto create mode 100644 proto/cmp/services/activity/v3/activity_types.proto create mode 100644 proto/cmp/services/activity/v3/info.proto create mode 100644 proto/cmp/services/activity/v3/list.proto create mode 100644 proto/cmp/services/activity/v3/search.proto create mode 100644 proto/cmp/services/activity/v3/search_result_types.proto create mode 100644 proto/cmp/services/book/v3/mint.proto create mode 100644 proto/cmp/services/book/v3/validate.proto create mode 100644 proto/cmp/services/insurance/v2/info.proto create mode 100644 proto/cmp/services/insurance/v2/insurance_types.proto create mode 100644 proto/cmp/services/insurance/v2/list.proto create mode 100644 proto/cmp/services/insurance/v2/search.proto create mode 100644 proto/cmp/services/insurance/v2/search_parameters_types.proto create mode 100644 proto/cmp/services/insurance/v2/search_query_types.proto create mode 100644 proto/cmp/services/seat_map/v3/availability.proto create mode 100644 proto/cmp/services/seat_map/v3/seat_map.proto create mode 100644 proto/cmp/services/transport/v3/search_query_types.proto create mode 100644 proto/cmp/types/v3/seat_map.proto diff --git a/proto/cmp/services/accommodation/v3/info.proto b/proto/cmp/services/accommodation/v3/info.proto new file mode 100644 index 00000000..cf2afc35 --- /dev/null +++ b/proto/cmp/services/accommodation/v3/info.proto @@ -0,0 +1,45 @@ +syntax = "proto3"; + +package cmp.services.accommodation.v3; + +import "cmp/services/accommodation/v3/property_types.proto"; +import "cmp/types/v1/common.proto"; +import "cmp/types/v1/language.proto"; +import "cmp/types/v2/product_code.proto"; +import "google/protobuf/timestamp.proto"; + +message AccommodationProductInfoRequest { + // Message header + cmp.types.v1.RequestHeader header = 1; + + // Only respond with the products that are modified after this timestamp + // + // Timestamps may be used for both off-chain and on-chain operations. + // For on-chain operations, only seconds are supported, and nanoseconds + // will be ignored. + google.protobuf.Timestamp modified_after = 2; + + // Languages + repeated cmp.types.v1.Language languages = 3; + + // Property codes + repeated cmp.types.v2.SupplierProductCode supplier_codes = 4; +} + +message AccommodationProductInfoResponse { + // Message header + cmp.types.v1.ResponseHeader header = 1; + + // Product list: Properties + repeated cmp.services.accommodation.v3.PropertyExtendedInfo properties = 2; +} + +// Accommodation product info service definition +// +// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/accommodation/v2/info.proto.dot.xs.svg) +// +// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/accommodation/v2/info.proto.dot.svg) +service AccommodationProductInfoService { + // Returns product list for accommodation (properties) + rpc AccommodationProductInfo(AccommodationProductInfoRequest) returns (AccommodationProductInfoResponse); +} diff --git a/proto/cmp/services/accommodation/v3/list.proto b/proto/cmp/services/accommodation/v3/list.proto new file mode 100644 index 00000000..adf410c9 --- /dev/null +++ b/proto/cmp/services/accommodation/v3/list.proto @@ -0,0 +1,37 @@ +syntax = "proto3"; + +package cmp.services.accommodation.v3; + +import "cmp/services/accommodation/v3/property_types.proto"; +import "cmp/types/v1/common.proto"; +import "google/protobuf/timestamp.proto"; + +message AccommodationProductListRequest { + // Message header + cmp.types.v1.RequestHeader header = 1; + + // Only respond with the products that are modified after this timestamp + // + // Timestamps may be used for both off-chain and on-chain operations. + // For on-chain operations, only seconds are supported, and nanoseconds + // will be ignored. + google.protobuf.Timestamp modified_after = 2; +} + +message AccommodationProductListResponse { + // Message header + cmp.types.v1.ResponseHeader header = 1; + + // Product list: Properties + repeated cmp.services.accommodation.v3.Property properties = 2; +} + +// Accommodation product list service definition +// +// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/accommodation/v2/list.proto.dot.xs.svg) +// +// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/accommodation/v2/list.proto.dot.svg) +service AccommodationProductListService { + // Returns product list for accommodation (properties) + rpc AccommodationProductList(AccommodationProductListRequest) returns (AccommodationProductListResponse); +} diff --git a/proto/cmp/services/accommodation/v3/property_types.proto b/proto/cmp/services/accommodation/v3/property_types.proto new file mode 100644 index 00000000..7154ec71 --- /dev/null +++ b/proto/cmp/services/accommodation/v3/property_types.proto @@ -0,0 +1,198 @@ +syntax = "proto3"; + +package cmp.services.accommodation.v3; + +import "cmp/types/v1/amenity.proto"; +import "cmp/types/v1/bed.proto"; +import "cmp/types/v1/description.proto"; +import "cmp/types/v1/meal_plan.proto"; +import "cmp/types/v1/product_status.proto"; +import "cmp/types/v2/contact_info.proto"; +import "cmp/types/v3/file.proto"; +import "cmp/types/v2/location.proto"; +import "cmp/types/v2/product_code.proto"; +import "cmp/types/v2/service_fact.proto"; +import "cmp/types/v3/traveller.proto"; +import "google/protobuf/timestamp.proto"; + +// Represents property info for an accommodation product +// +// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/accommodation/v2/property_types.proto.dot.xs.svg) +// +// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/accommodation/v2/property_types.proto.dot.svg) +message Property { + // Ex: "2023-08-28T12:03:50", specifying when the static data of a product was + // last updated + // + // Timestamps may be used for both off-chain and on-chain operations. + // For on-chain operations, only seconds are supported, and nanoseconds + // will be ignored. + google.protobuf.Timestamp last_modified = 1; + + // Supplier product Code + cmp.types.v2.SupplierProductCode supplier_code = 2; + + // Product code which can be of different types + repeated cmp.types.v2.ProductCode product_codes = 3; + + // Ex: "Beach Hotel Alanya" + string name = 4; + + // Ex: "Hilton" + string chain = 5; + + // Ex: CATEGORY_RATING_4_5 + cmp.services.accommodation.v3.CategoryRating category_rating = 6; + + // Ex: CATEGORY_UNIT_PALMS + cmp.services.accommodation.v3.CategoryUnit category_unit = 7; + + // Contact Info: phone, address, email, links + cmp.types.v2.ContactInfo contact_info = 8; + + // Location coordinate + cmp.types.v2.Coordinates coordinates = 9; + + // Status of the property + cmp.types.v1.ProductStatus status = 10; + + // Airports + // Ex: ["PMI", "ZRH", "AYT"] + repeated string airports = 11; +} + +enum CategoryRating { + CATEGORY_RATING_UNSPECIFIED = 0; + CATEGORY_RATING_0_5 = 1; + CATEGORY_RATING_1_0 = 2; + CATEGORY_RATING_1_5 = 3; + CATEGORY_RATING_2_0 = 4; + CATEGORY_RATING_2_5 = 5; + CATEGORY_RATING_3_0 = 6; + CATEGORY_RATING_3_5 = 7; + CATEGORY_RATING_4_0 = 8; + CATEGORY_RATING_4_5 = 9; + CATEGORY_RATING_5_0 = 10; + CATEGORY_RATING_5_5 = 11; + CATEGORY_RATING_6_0 = 12; + CATEGORY_RATING_6_5 = 13; + CATEGORY_RATING_7_0 = 14; + CATEGORY_RATING_7_5 = 15; + CATEGORY_RATING_8_0 = 16; + CATEGORY_RATING_8_5 = 17; + CATEGORY_RATING_9_0 = 18; + CATEGORY_RATING_9_5 = 19; + CATEGORY_RATING_10_0 = 20; +} + +enum CategoryUnit { + CATEGORY_UNIT_UNSPECIFIED = 0; + CATEGORY_UNIT_STARS = 1; + CATEGORY_UNIT_PALMS = 2; +} + +// This message type contains extended info about a property +message PropertyExtendedInfo { + // Property + cmp.services.accommodation.v3.Property property = 1; + + // Images + repeated cmp.types.v3.Image images = 2; + + // Videos + repeated cmp.types.v3.Video videos = 3; + + // Segmentation classification + repeated string classifications = 4; + + // Property descriptions + repeated cmp.types.v1.LocalizedDescriptionSet localized_descriptions = 5; + + // Room descriptions + repeated cmp.types.v1.LocalizedDescriptionSet localized_room_descriptions = 6; + + // Payment type. Ex: "MERCHANT" + string payment_type = 7; + + // Rooms + repeated cmp.services.accommodation.v3.Room rooms = 8; +} + +message Room { + // Room code of the unit in case of hotel. Ex: "RMSDDB0000". For holiday homes + // often no room codes are used. This code must explicitly match the supplier_room_code + // in the ProductList and the ProductInfo messages, so that the static data like room + // amenities, descriptions, images etc. can be married to the dynamic price and + // availability data for display to the end user. + string supplier_code = 1; + + // Room name. In case of hotel a standardized room name is often derrived from + // room code structures. Exmple: "superior seaview room". + // For holiday homes we expect names like "Master Bedroom", "Second Bedroom" or + // "Bathroom" when specific descriptions for each room are available. + string supplier_name = 2; + + // Original room name as assigned by the hotel. In case of spefifically designated room + // names by chains and both the chain and the customer wants to adhere to them. + // Ex: "CEIBA CLUB", "CEIBA GOVERNORS SUITE", "GOVERNORS SUITE" or "ENCLAVE NATURE VIEW" + // For holiday homes specific room names if availbale can be given. + string original_name = 3; + + repeated cmp.types.v3.Image images = 4; + repeated cmp.types.v3.Video videos = 5; + + // Room descriptions + repeated cmp.types.v1.LocalizedDescriptionSet descriptions = 6; + + // Meal plan (Board code) + repeated cmp.types.v1.MealPlan meal_plans = 7; + + // Beds + repeated cmp.types.v1.Bed beds = 8; + + // Occupancy + cmp.services.accommodation.v3.Occupancy total_occupancy = 9; + + // Services + repeated cmp.types.v2.ServiceFact services = 10; + + // Amenities + repeated cmp.types.v1.Amenity amenities = 11; +} + +message Occupancy { + // Min guests + int32 min_guests = 1; + + // Max guests + int32 max_guests = 2; + + // Standard occupancy + int32 standard_occupancy = 3; + + // Full payers + int32 full_payers = 4; + + // If infants are counted in total guests or not + bool infant_counted_in_total_guests = 5; + + // Occupancy options + repeated cmp.services.accommodation.v3.OccupancyOption occupancy_options = 6; +} + +message OccupancyOption { + // Guest type like adult, child, infant. + cmp.types.v3.TravellerType guest_type = 1; + + // Min guests + int32 min = 2; + + // Max guests + int32 max = 3; + + // Min age + int32 min_age = 4; + + // Max age + int32 max_age = 5; +} diff --git a/proto/cmp/services/accommodation/v3/search.proto b/proto/cmp/services/accommodation/v3/search.proto new file mode 100644 index 00000000..2d2ab047 --- /dev/null +++ b/proto/cmp/services/accommodation/v3/search.proto @@ -0,0 +1,123 @@ +syntax = "proto3"; + +// ## Accommodation Services +// +// The Accommodation services are used for both hotels and holiday homes, often +// called short term rentals. +// +// Any search message response in the Camino Messenger Protocol only includes +// dynamic data. Static data can be cached and kept up to data with the Product List +// and Product Details messages. +// +// This package is a **WIP**. +package cmp.services.accommodation.v3; + +import "cmp/services/accommodation/v3/search_query_types.proto"; +import "cmp/services/accommodation/v2/search_result_types.proto"; +import "cmp/types/v1/common.proto"; +import "cmp/types/v2/search.proto"; +import "cmp/types/v3/traveller.proto"; + +// The `Accommodation Search Request` message type facilitates the request for +// accommodations like hotel and holiday home searches within the platform. In the +// request the market, language and currency are specified at the top-level. +// +// In "queries" we specify the details of the trip like dates, properties or +// locations or filters. The purpose of such a structure is to allow for multi-room +// and multi-property search requests. +// +// For the response this means that there is no grouping of different +// room, mealplan or rateplan options in single room or single property searches. +// Each AccommodationSearchResult is one bookable option as a "result_id". +// +// Simple example: +// a search for 1 room for 2 adults would be just 1 query, with one travel period and +// one set of search parameters. The response has one query_id with many result_ids +// for various rooms, mealplans and rateplans in one hotel and depending on the search +// parameters, again for other hotels. Each property+room+rateplan+mealplan is one +// result_id with just one unit. +// +// The simple example is also applicable for holiday homes where one or multiple +// result_ids will be returned for various homes matching the query. The results will +// probably not include a mealplan and in general no room information as all rooms in +// the home are included. Flexible and non-refundable as well as packaging rateplans +// are already surfacing in some distribution channels. +// +// Multi room example: +// a search for 1 room for 2 adults in one query and another room for two adults and a +// child of 8 in another room in the same hotel or destination for the same dates in +// another query in the search request. This will lead to a search response with just +// one unit for eavery possible option available for each query_id, with many result_ids. +// +// The same concept is valid for multiple homes for more than one family travelling +// together to one park or destination. +// +// Road-trip or circuit example: +// a search for one or multiple rooms or homes in queries that have sequential dates +// and destinations. For example a trip to Las Vegas, a flight to New York and decending +// the atlantic coastline to New Orleans or Orlando by car with stops in various places. +// +// The hostel, convention or groups example: +// Often just 5 rooms for 10 peopleare requested or specific bed combinations like 5 +// single-use rooms (for 5 travellers) and 5 double rooms (10 travellers) are requested. +// In this case the number of rooms is specified and the total amount of travellers, +// but no distribution of travellers per room is detailed in the request. The reponse +// then hold multiple units for one search_id and result_id, so that if 5 rooms are +// requested, but only 2 standard rooms are available, the requested amount can be +// completed with a different room type (superior, seaview,..) +// +// In general, the number of available rooms should be considered to ensure that for +// requests with multiple rooms or homes, the same room or home is not offered twice +// to different travellers. +// +message AccommodationSearchRequest { + // Message header. Contains API version, message info string and end-user wallet + // address + cmp.types.v1.RequestHeader header = 1; + + // Search request metadata + cmp.types.v2.SearchRequestMetadata metadata = 2; + + // Generic search parameters Ex: Inclusion of OnRequest options and inclusion of + // only the cheapest or all options. + // In the search parameters multiple filters can be applied for upfront filtering + // of the search results to for example to only include hotels that are less than + // one kilometer from the beach, have a kids club and offer an a la carte restaurant + cmp.types.v2.SearchParameters search_parameters_generic = 3; + + // This field represents a list of search queries that can be used to create + // multiroom multi location searches. + repeated cmp.services.accommodation.v3.AccommodationSearchQuery queries = 4; +} + +// The `Accommodation Search Response` message type facilitates the response for +// accommodations like hotel and holiday home searches within the platform. +// +// In the response a search_id must be included and a search_option_id for every +// bookable option responded. Included, compulsory and optional services can be +// included. A simple "free cancellation upto" can be set or full cancellation +// pilicies can be included. +message AccommodationSearchResponse { + // Message header. Contains API version, message info string and end user wallet + // address. + cmp.types.v1.ResponseHeader header = 1; + + // Search response metadata + cmp.types.v2.SearchResponseMetadata metadata = 2; + + // Unique combinations of bookable search results, like property, + repeated cmp.services.accommodation.v2.AccommodationSearchResult results = 3; + + // Global definition of the travellers for all results to be used via the traveller_id each unit. + repeated cmp.types.v3.BasicTraveller travellers = 4; +} + +// Service definition for Accommodation search +// +// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/accommodation/v2/search.proto.dot.xs.svg) +// +// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/accommodation/v2/search.proto.dot.svg) +service AccommodationSearchService { + // Accommodation Search method + rpc AccommodationSearch(AccommodationSearchRequest) returns (AccommodationSearchResponse); +} diff --git a/proto/cmp/services/accommodation/v3/search_query_types.proto b/proto/cmp/services/accommodation/v3/search_query_types.proto new file mode 100644 index 00000000..fc986664 --- /dev/null +++ b/proto/cmp/services/accommodation/v3/search_query_types.proto @@ -0,0 +1,29 @@ +syntax = "proto3"; + +package cmp.services.accommodation.v3; + +import "cmp/services/accommodation/v2/search_parameters_types.proto"; +import "cmp/services/accommodation/v2/unit_types.proto"; +import "cmp/types/v1/travel_period.proto"; +import "cmp/types/v3/traveller.proto"; + +message AccommodationSearchQuery { + // Integer query ID, unique per search request + int32 query_id = 1; + + // Accommodation specific search parameters Ex: Specific search parameters like + // geo location, meal plan, rate plan and rate rules. + cmp.services.accommodation.v2.AccommodationSearchParameters search_parameters_accommodation = 2; + + // Travel period + cmp.types.v1.TravelPeriod travel_period = 3; + + // Travellers + repeated cmp.types.v3.BasicTraveller travellers = 4; + + // Total number of rooms / holiday homes + int32 unit_count = 5; + + // Type of the unit, like room or holiday home + cmp.services.accommodation.v2.UnitType unit_type = 6; +} diff --git a/proto/cmp/services/activity/v3/activity_types.proto b/proto/cmp/services/activity/v3/activity_types.proto new file mode 100644 index 00000000..659b83b0 --- /dev/null +++ b/proto/cmp/services/activity/v3/activity_types.proto @@ -0,0 +1,268 @@ +syntax = "proto3"; + +package cmp.services.activity.v3; + +import "cmp/types/v1/bookability.proto"; +import "cmp/types/v1/datetime_range.proto"; +import "cmp/types/v1/delivery.proto"; +import "cmp/types/v1/description.proto"; +import "cmp/types/v1/duration.proto"; +import "cmp/types/v1/language.proto"; +import "cmp/types/v1/redemption.proto"; +import "cmp/types/v2/address.proto"; +import "cmp/types/v2/contact_info.proto"; +import "cmp/types/v3/file.proto"; +import "cmp/types/v2/location.proto"; +import "cmp/types/v2/product_code.proto"; +import "google/protobuf/timestamp.proto"; + +// Activity +// +// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/activity/v2/activity_types.proto.dot.xs.svg) +// +// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/activity/v2/activity_types.proto.dot.svg) +message Activity { + // Context for Inventory system concepts that need to be included in an info + // response, like an OwnerCode, PTC_OfferParameters, Tax codes, Disclosure RefID, + // etc. or a serialized combination of these codes. + string context = 1; + + // Ex: "2023-08-28T12:03:50", specifying when the static data of a product was + // last updated + // + // Timestamps may be used for both off-chain and on-chain operations. + // For on-chain operations, only seconds are supported, and nanoseconds + // will be ignored. + google.protobuf.Timestamp last_modified = 2; + + // An identifier for external sessions, aiding in tracking and continuity across + // sessions. + string external_session_id = 3; + + // External Product codes for the result. These can be of different types + cmp.types.v2.ProductCode product_code = 4; + + // Unit ID for the result + // + // The purpose of this concept is to allow for different activities for one + // product like "Windsurfing" and "Kitesurfing" under "Salou Playa Llarga". Code + // and description match the information provided in the ProductList and + // ProductInfo message. These are in general also supplier specific. + string unit_code = 5; + + // Service codes for the result + // + // Several different packages could be included like "Windsurfing" with or without + // "Wetsuit". Code and description match the information provided in the + // ProductInfo message These are in general also supplier specific. + string service_code = 6; + + // Status of the result, whether it is immediately bookable or not + cmp.types.v1.Bookability bookability = 7; +} + +message ActivityLocation { + // Ex: Ctra. de la Porrassa, s/n, Magaluf, ES 07181 in structured fields + cmp.types.v2.Address address = 1; + + // Geo Tree. Country, region, city_or_resort + cmp.types.v2.GeoTree geo_tree = 2; + + // Coordinate + cmp.types.v2.Coordinates coordinates = 3; +} + +message PickupDropoffEvent { + // Supplier specific pick-up code. Avoid using this and use a more generic concept + // where possible, so that the integration is suitable for more than one partner. + // + // Ex: "AESPMI43NU", + string location_code = 1; + // Ex: "Sunny Beach Hotel", + string location_name = 2; + + // True if this pickup location is selected for the activity + // + // If the boolean is set to false, this is a specific indication that + // pick-up/drop-off at this location is not possible. An activity search response + // can have one result without a transfer service and without a PickupDropoffEvent + // to indicate that there is no transfer included. Or a PickupDropoffEvent with + // pick_up indicator set to false can be included to make it explicit. + bool pickup_indicator = 3; + + // Ex: "OTHERS / Parking Varadero (bus stop css nº50)", + string other_info = 4; + + // Datetime of the pickup dropoff event as Unix timestamp + // + // Timestamps may be used for both off-chain and on-chain operations. + // For on-chain operations, only seconds are supported, and nanoseconds + // will be ignored. + google.protobuf.Timestamp date_time = 5; + + // Longitude and Latitude of the location + cmp.types.v2.Coordinates coordinates = 6; +} + +// Activity static info +message ActivityExtendedInfo { + // Activity dynamic info references + cmp.services.activity.v3.Activity activity = 1; + + // Available Units + repeated cmp.services.activity.v3.ActivityUnit units = 2; + + // Available Services + repeated cmp.services.activity.v3.ActivityService services = 3; + + // Transfer Zone(s) in which participants of the activity can be used for pick-up + // and drop-off + repeated cmp.services.activity.v3.TransferZone zones = 4; + + // Descriptions with different languages + repeated cmp.types.v1.LocalizedDescriptionSet descriptions = 5; + + // Coordinates of where the activity takes place + cmp.services.activity.v3.ActivityLocation location = 6; + + // Activity Features + repeated cmp.services.activity.v3.ActivityFeature features = 7; + + // Tags + repeated cmp.services.activity.v3.ActivityTag tags = 8; + + // Languages + repeated cmp.types.v1.Language languages = 9; + + // Contact Info; Address, Email, Phone, Urls + cmp.types.v2.ContactInfo contact_info = 10; + + // Images + repeated cmp.types.v3.Image images = 11; + + // Videos + repeated cmp.types.v3.Video videos = 12; + + // Supplier code from the Inventory System for this activity response. + string supplier_unit_code = 13; + + // Activity Category Code + string category_code = 14; + + // Category name which describes the category_code + string category_name = 15; + + // Type Code + string type_code = 16; + + // Type name which describes type_code + string type_name = 17; + + // Supplier Product codes for the result + // These must match the supplier codes provided in the ProductList and + // ProductInfo messages + cmp.types.v2.SupplierProductCode supplier_code = 18; + + // Supplier Name + string supplier_code_name = 19; + + // Duration range (min, max) of the activity in minutes + cmp.types.v1.DurationRange duration_range = 20; + + // Time given for confirmation before the offer expires + cmp.types.v1.Duration max_confirmation_duration = 21; + + // Allow Free Sale + bool allow_free_sale = 22; + + // The ability to confirm instantly + bool instant_confirmation = 23; + + // Can be delivered instantly + bool instant_delivery = 24; + + // Check availability + bool availability_required = 25; + + // Availability Type + string availability_type = 26; + + // Delivery Formats; such as QR Code, NFT, Ticket, ... etc + repeated cmp.types.v1.DeliveryFormat delivery_formats = 27; + + // Delivery Methods; such as Email, SMS, Post, ... etc + repeated cmp.types.v1.DeliveryMethod delivery_methods = 28; + + // Redemption method + repeated cmp.types.v1.RedemptionMethod redemption_methods = 29; +} + +// The unit gives us a choice of the different options that are available in an +// activity, like for example a normal ticket or a VIP ticket. a 2 hour or 4 hour +// jeep safari. A ticket to a specific section of a stadium. +message ActivityUnit { + //Schedule + cmp.types.v1.DateTimeRange schedule = 1; + + // Unit Code + string code = 2; + + // Unit Name + string name = 3; + + // Unit Description + string description = 4; +} + +// Services can be selected like do we go to the activity by ourselves or is a +// transfer from our hotel included. Do we book the VIP ticket with or without +// alcoholic drinks included? +message ActivityService { + // Service Code + string code = 1; + + // Service Name + string name = 2; + + // Service Description + string description = 3; + + // Included items in the activity service + repeated string included = 4; + + // Excluded items in the activity service + repeated string excluded = 5; +} + +message TransferZone { + // Zone Code used in transfer operations + string code = 1; + + // Geo tree type, represented by Country, Region, and City_or_Resort. + cmp.types.v2.GeoTree geo_tree = 2; + + // pick-up and drop-off information about location and time + repeated cmp.services.activity.v3.PickupDropoffEvent pickup_dropoff_events = 3; +} + +message ActivityFeature { + // Feature description + string description = 1; + + // Feature Code + string code = 2; +} + +message ActivityTag { + // active status + bool active = 1; + + // Unique ID + int32 id = 2; + + // Name + string name = 3; + + // Slug; giving an informal name to the tag + string slug = 4; +} diff --git a/proto/cmp/services/activity/v3/info.proto b/proto/cmp/services/activity/v3/info.proto new file mode 100644 index 00000000..808f3e1d --- /dev/null +++ b/proto/cmp/services/activity/v3/info.proto @@ -0,0 +1,47 @@ +syntax = "proto3"; + +package cmp.services.activity.v3; + +import "cmp/services/activity/v3/activity_types.proto"; +import "cmp/types/v1/common.proto"; +import "cmp/types/v1/language.proto"; +import "cmp/types/v2/product_code.proto"; +import "google/protobuf/timestamp.proto"; + +message ActivityProductInfoRequest { + // Message header + cmp.types.v1.RequestHeader header = 1; + + // Only respond with the products that are new, modified or deactivated after this + // timestamp. + // + // Timestamps may be used for both off-chain and on-chain operations. + // For on-chain operations, only seconds are supported, and nanoseconds + // will be ignored. + google.protobuf.Timestamp modified_after = 2; + + // Languages to be included in the response for descriptions. Null means all + // available languages. + repeated cmp.types.v1.Language languages = 3; + + // Activity codes + repeated cmp.types.v2.SupplierProductCode supplier_codes = 4; +} + +message ActivityProductInfoResponse { + // Message header + cmp.types.v1.ResponseHeader header = 1; + + // Product list: Activities + repeated cmp.services.activity.v3.ActivityExtendedInfo activities = 2; +} + +// Activity product info service definition +// +// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/activity/v2/info.proto.dot.xs.svg) +// +// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/activity/v2/info.proto.dot.svg) +service ActivityProductInfoService { + // Returns product list for activity + rpc ActivityProductInfo(ActivityProductInfoRequest) returns (ActivityProductInfoResponse); +} diff --git a/proto/cmp/services/activity/v3/list.proto b/proto/cmp/services/activity/v3/list.proto new file mode 100644 index 00000000..1a8bfd96 --- /dev/null +++ b/proto/cmp/services/activity/v3/list.proto @@ -0,0 +1,37 @@ +syntax = "proto3"; + +package cmp.services.activity.v3; + +import "cmp/services/activity/v3/activity_types.proto"; +import "cmp/types/v1/common.proto"; +import "google/protobuf/timestamp.proto"; + +message ActivityProductListRequest { + // Message header + cmp.types.v1.RequestHeader header = 1; + + // Only respond with the products that are modified after this timestamp + // + // Timestamps may be used for both off-chain and on-chain operations. + // For on-chain operations, only seconds are supported, and nanoseconds + // will be ignored. + google.protobuf.Timestamp modified_after = 2; +} + +message ActivityProductListResponse { + // Message header + cmp.types.v1.ResponseHeader header = 1; + + // Product list: Activities + repeated cmp.services.activity.v3.Activity activities = 2; +} + +// This service is used to get a product list for activities. +// +// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/activity/v2/list.proto.dot.xs.svg) +// +// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/activity/v2/list.proto.dot.svg) +service ActivityProductListService { + // Gets an optional `modified_after` date and returns a product list. + rpc ActivityProductList(ActivityProductListRequest) returns (ActivityProductListResponse); +} diff --git a/proto/cmp/services/activity/v3/search.proto b/proto/cmp/services/activity/v3/search.proto new file mode 100644 index 00000000..f812740a --- /dev/null +++ b/proto/cmp/services/activity/v3/search.proto @@ -0,0 +1,159 @@ +syntax = "proto3"; + +// ### Activity Services +// +// The Activity services are used for both tickets and excursions. +// +// Any search message response in the Camino Messenger Protocol only includes +// dynamic data in the search, validate and mint process. Static data can be cached +// and kept up to date with the Product List and Product Details messages. +// +// Partners keep the list of activity products up-to-date on a daily basis, by +// getting changes since yesterday with the ActivityProductList service. The details +// of the updated activities are bing pulled using the ActivityProductInfo service. +// +// Once we have a traveller interested in an activity, the ActivitySearch service is +// used to obtain the pricing of relevant activities that are available. In this +// process there is no repeated exchange of static data to reduce the message size, +// reduce cost and increase processing speed. +// +// Similar to all other message types, the Activity service is constructed using the +// "Product", "Unit" and "Service" layers. For example the product is a Taylor Swift +// concert or a Disney World ticket. The unit then gives us a choice of the +// different options that are available, like for example a normal ticket or a VIP +// ticket. Finally we would have the services, which can be selected like do we go +// there by ourselves or is a transfer from our hotel included. This then would +// result to product=Disneyland, unit=VIP, service=TRFIncluded. +// +// It is of course impossible to offer a transfer from every hotel in Florida to +// Disney World. A supplier might have defined just the ticket, without transfer. And +// additionally a ticket with transfer from the 25 most popular hotels in the area. +// If the PickUp is not provided in the search request, the response should include +// an option without transfer and further options that include a transfer from +// several hotels that are close together and would cost the same for the ticket and +// transfer. +// +// The Activity search messages will be adapted to work with the SeatMap services, +// just like the Transport service. This package is **WIP**. +package cmp.services.activity.v3; + +import "cmp/services/activity/v2/search_parameters_types.proto"; +import "cmp/services/activity/v3/search_result_types.proto"; +import "cmp/types/v1/common.proto"; +import "cmp/types/v1/travel_period.proto"; +import "cmp/types/v2/location.proto"; +import "cmp/types/v2/search.proto"; +import "cmp/types/v3/traveller.proto"; + +// Search request for Activities +message ActivitySearchRequest { + // Message header. Contains API version, message info string and end-user wallet + // address. + cmp.types.v1.RequestHeader header = 1; + + // Search request metadata + cmp.types.v2.SearchRequestMetadata metadata = 2; + + // Generic search parameters + // + // Ex: Inclusion of OnRequest options, inclusion of only the cheapest or all + // options, setting the market, language, currency, sorting and filters etc. + cmp.types.v2.SearchParameters search_parameters_generic = 3; + + // Activity specific search parameters + // + // Here we set for example a list of activity product codes that we want to search + // for, set min or mar duration or price. + cmp.services.activity.v2.ActivitySearchParameters search_parameters_activity = 4; + + // Travel period + cmp.types.v1.TravelPeriod travel_period = 5; + + // Travellers + repeated cmp.types.v3.BasicTraveller travellers = 6; + + // For search, set only one of the fields at once. Source location indicates the + // customer’s position at the start of the service. Typical value would be the + // stay hotel or the touristic destination. The source location is needed for + // service and transfer availability, pickup location and pickup time calculation. + // Setting the source_location will reduce the list of options to the activities + // that can be serviced. In the example of Disney World and Orlando it will reduce + // the list substantially as the non-relevant pick-up points will not be included. + // + // This one of field enforces only one of the fields below. They all share memory, + // setting one will remove the others. + oneof source_location { + // The code and code type of a stay location the provider will be able to process + // Ex. GiataID + cmp.types.v2.LocationCodes source_location_codes = 7; + + // Single geographic point represented by two double fields. + cmp.types.v2.Coordinates source_location_coordinates = 8; + + // Geo tree type, represented by Country, Region, and City_or_Resort. + cmp.types.v2.GeoTree source_location_geo_tree = 9; + + // Geo circle. Represented by a coordinate and a distance for radius + cmp.types.v2.GeoCircle source_location_geo_circle = 10; + + // Geo polygon. Represented by a list of coordinate points. + cmp.types.v2.GeoPolygon source_location_geo_polygon = 11; + } + + // For search, set only one of the field at once. Service location specifies the + // areas involved in a ticket or excursion service. Service location indicates the + // area of the requested services. Typical value would be the region or resort. + // + // This one of field enforces only one of the fields below. They all share memory, + // setting one will remove the others. + oneof service_location { + // The code and code type of a stay location the distributor will be able to + // process. Ex. Google Place ID, Foursquare fsq_id, OpenStreetMap Ref, Here ID or + // any other agreed code type. + cmp.types.v2.LocationCodes service_location_codes = 12; + + // Single geographic point represented by two double fields. + cmp.types.v2.Coordinates service_location_coordinates = 13; + + // Geo tree type, represented by Country, Region, and City_or_Resort. + cmp.types.v2.GeoTree service_location_geo_tree = 14; + + // Geo circle. Represented by a coordinate and a distance for radius + cmp.types.v2.GeoCircle service_location_geo_circle = 15; + + // Geo polygon. Represented by a list of coordinate points. + cmp.types.v2.GeoPolygon service_location_geo_polygon = 16; + } +} + +message ActivitySearchResponse { + // Message header. Contains API version, message info string and end user wallet + // address. + cmp.types.v1.ResponseHeader header = 1; + + // Search response metadata + // + // The most important field is the search_id, which is a UUID that needs to be + // carried through to the validate request. + cmp.types.v2.SearchResponseMetadata metadata = 2; + + // Unique combinations of bookable search results, each identified by a result_id + // that needs to be carried through to the validate request. + repeated cmp.services.activity.v3.ActivitySearchResult results = 3; + + // The traveller_id is specified in each result and the ids are detailed with + // basic traveller data only once in the top-level search response to avoid + // repetition. + repeated cmp.types.v3.BasicTraveller travellers = 4; +} + +// Activity Search Service +// +// Takes `ActivitySearchRequest` message type and returns `ActivitySearchResponse` message type. +// +// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/activity/v2/search.proto.dot.xs.svg) +// +// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/activity/v2/search.proto.dot.svg) +service ActivitySearchService { + rpc ActivitySearch(ActivitySearchRequest) returns (ActivitySearchResponse); +} diff --git a/proto/cmp/services/activity/v3/search_result_types.proto b/proto/cmp/services/activity/v3/search_result_types.proto new file mode 100644 index 00000000..3d6a8752 --- /dev/null +++ b/proto/cmp/services/activity/v3/search_result_types.proto @@ -0,0 +1,45 @@ +syntax = "proto3"; + +package cmp.services.activity.v3; + +import "cmp/services/activity/v3/activity_types.proto"; +import "cmp/types/v1/datetime_range.proto"; +import "cmp/types/v1/price_type.proto"; +import "cmp/types/v2/price.proto"; + +// This type represents a search result and is used in the `ActivitySearchResponse` +// message. +// +// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/activity/v2/search_result_types.proto.dot.xs.svg) +// +// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/activity/v2/search_result_types.proto.dot.svg) +message ActivitySearchResult { + // Option ID for the search option. This is an increasing number starting at 0 and + // increasing by 1 for every search result. + int32 result_id = 1; + + // Activity basic info + cmp.services.activity.v3.Activity info = 2; + + // Schedule + cmp.types.v1.DateTimeRange schedule = 3; + + // Activity location + cmp.services.activity.v3.ActivityLocation location = 4; + + // Pickup Dropoff + repeated cmp.services.activity.v3.PickupDropoffEvent pickup_dropoff_events = 5; + + // Min participants + int32 min_participants = 6; + + // Max participants + int32 max_participants = 7; + + // Price with value and currency code + cmp.types.v2.Price price = 8; + + // Pricing type + // Ex: "PerPerson", "PerGroup" + cmp.types.v1.ChargeType charge_type = 9; +} diff --git a/proto/cmp/services/book/v3/mint.proto b/proto/cmp/services/book/v3/mint.proto new file mode 100644 index 00000000..5ad22bf8 --- /dev/null +++ b/proto/cmp/services/book/v3/mint.proto @@ -0,0 +1,104 @@ +syntax = "proto3"; + +package cmp.services.book.v3; + +import "cmp/types/v1/common.proto"; +import "cmp/types/v1/language.proto"; +import "cmp/types/v2/payment.proto"; +import "cmp/types/v1/pubkey.proto"; +import "cmp/types/v1/uuid.proto"; +import "cmp/types/v2/price.proto"; +import "cmp/types/v3/traveller.proto"; +import "google/protobuf/timestamp.proto"; + +message MintRequest { + // Message header + cmp.types.v1.RequestHeader header = 1; + + // This must be a UUID according to RFC 4122 + cmp.types.v1.UUID validation_id = 2; + + string external_session_id = 3; + + cmp.types.v1.Language language = 4; + + string market = 5; + + string booking_reference = 6; + + repeated cmp.types.v3.ExtensiveTraveller travellers = 7; + + // The comments field is meant to pass noncommittal remarks entered by the + // end-consumer about the service reservation, like "non-smoking room please", + // "top floor room please". + string comment = 8; + + // Public keys that will be used to encrypt the private booking data + repeated cmp.types.v1.PublicKey public_keys = 9; + + // Buyer's address. Only this address should be allowed to buy the `BookingToken` + // on chain. + string buyer_address = 10; + + // This field is only relevant for off chain virtual credit card payments. + cmp.types.v2.AdditionalPaymentInfo additional_payment_info = 11; +} + +message MintResponse { + // Message header + cmp.types.v1.ResponseHeader header = 1; + + // This must be a UUID according to RFC 4122 + cmp.types.v1.UUID mint_id = 2; + + // This must be a UUID according to RFC 4122 + cmp.types.v1.UUID validation_id = 3; + + string provider_booking_reference = 4; + + // Timestamp of the booking in the inventory system of the supplier. + // + // Timestamps may be used for both off-chain and on-chain operations. + // For on-chain operations, only seconds are supported, and nanoseconds + // will be ignored. + google.protobuf.Timestamp provider_booking_timestamp = 5; + + // Price of the `BookingToken`. This field is meant to be populated by the + // supplier plugin and used by the supplier bot while minting the `BookingToken`. + cmp.types.v2.Price price = 6; + + // ID of the token that represents the booking of the service. This will be + // populated by the supplier bot after the `BookingToken` is minted on chain. + uint64 booking_token_id = 7; + + // URI of the token that represents the booking of the service. This should be + // populated by the Supplier partner plugin. It is up to the supplier to decide + // what kind of storage (IPFS, HTTP, ...) to use here. + string booking_token_uri = 8; + + // Mint transaction ID that will be populated by the supplier bot after the + // `BookingToken` is minted on chain. + string mint_transaction_id = 9; + + // On chain booking token should be only buyable until this timestamp and should + // expire after that. + // + // Timestamps may be used for both off-chain and on-chain operations. + // For on-chain operations, only seconds are supported, and nanoseconds + // will be ignored. + google.protobuf.Timestamp buyable_until = 10; + + // Transaction ID of the buy operation. This field is populated by the distributor + // (buyer) bot after the buy operation and passed to the distributor middleware + // (partner plugin) in the mint response. + // + // This field is not meant for the supplier. + string buy_transaction_id = 11; +} + +// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/book/v2/mint.proto.dot.xs.svg) +// +// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/book/v2/mint.proto.dot.svg) +service MintService { + rpc Mint(MintRequest) returns (MintResponse); +} diff --git a/proto/cmp/services/book/v3/validate.proto b/proto/cmp/services/book/v3/validate.proto new file mode 100644 index 00000000..cb488543 --- /dev/null +++ b/proto/cmp/services/book/v3/validate.proto @@ -0,0 +1,53 @@ +syntax = "proto3"; + +package cmp.services.book.v3; + +import "cmp/types/v1/common.proto"; +import "cmp/types/v1/uuid.proto"; +import "cmp/types/v2/price.proto"; +import "cmp/types/v2/search.proto"; +import "cmp/types/v3/seat_map.proto"; + +message ValidationRequest { + // Message header + cmp.types.v1.RequestHeader header = 1; + + // Validation object + cmp.services.book.v3.ValidationObject validation_object = 2; +} + +message ValidationResponse { + // Message header + cmp.types.v1.ResponseHeader header = 1; + + // Unique validation ID. This must be a UUID according to RFC 4122 + cmp.types.v1.UUID validation_id = 2; + + // Validation object + cmp.services.book.v3.ValidationObject validation_object = 3; + + // Price details for the validated product + cmp.types.v2.PriceDetail price_detail = 4; +} + +// Validation message that represents a single `result_id` from the search results +// message and also the optional `unit_identifier` for specific services that +// requires it. For example a seat for a concert. +message ValidationObject { + // Search result identifier with `search_id` & `result_id` + cmp.types.v2.SearchIdentifier search_identifier = 1; + + // Unit identifier that is used to describe selected units from the `result_id`. + // For example: seats for a concert. + oneof unit_identifier { + // Selected seat(s) represented as a seat map inventory message type. + cmp.types.v3.SeatMapInventory seat_selection = 2; + } +} + +// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/book/v2/validate.proto.dot.xs.svg) +// +// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/book/v2/validate.proto.dot.svg) +service ValidationService { + rpc Validation(ValidationRequest) returns (ValidationResponse); +} diff --git a/proto/cmp/services/insurance/v2/info.proto b/proto/cmp/services/insurance/v2/info.proto new file mode 100644 index 00000000..f408e141 --- /dev/null +++ b/proto/cmp/services/insurance/v2/info.proto @@ -0,0 +1,47 @@ +syntax = "proto3"; + +package cmp.services.insurance.v2; + +import "cmp/services/insurance/v2/insurance_types.proto"; +import "cmp/types/v1/common.proto"; +import "cmp/types/v1/language.proto"; +import "cmp/types/v2/product_code.proto"; +import "google/protobuf/timestamp.proto"; + +message InsuranceProductInfoRequest { + // Message header + cmp.types.v1.RequestHeader header = 1; + + // Only respond with the products that are new, modified or deactivated after this + // timestamp. + // + // Timestamps may be used for both off-chain and on-chain operations. + // For on-chain operations, only seconds are supported, and nanoseconds + // will be ignored. + google.protobuf.Timestamp modified_after = 2; + + // Languages to be included in the response for descriptions. Null means all + // available languages. + repeated cmp.types.v1.Language languages = 3; + + // Insurance codes + repeated cmp.types.v2.SupplierProductCode supplier_codes = 4; +} + +message InsuranceProductInfoResponse { + // Message header + cmp.types.v1.ResponseHeader header = 1; + + // Product list: Insurances + repeated cmp.services.insurance.v2.PolicyExtendedInfo insurances = 2; +} + +// Insurance product info service definition +// +// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/insurance/v1/info.proto.dot.xs.svg) +// +// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/insurance/v1/info.proto.dot.svg) +service InsuranceProductInfoService { + // Returns product info for insurance + rpc InsuranceProductInfo(InsuranceProductInfoRequest) returns (InsuranceProductInfoResponse); +} diff --git a/proto/cmp/services/insurance/v2/insurance_types.proto b/proto/cmp/services/insurance/v2/insurance_types.proto new file mode 100644 index 00000000..ac8250fe --- /dev/null +++ b/proto/cmp/services/insurance/v2/insurance_types.proto @@ -0,0 +1,171 @@ +syntax = "proto3"; + +package cmp.services.insurance.v2; + +import "cmp/types/v1/inclusivity.proto"; +import "cmp/types/v1/link.proto"; +import "cmp/types/v2/contact_info.proto"; +import "cmp/types/v3/file.proto"; +import "cmp/types/v2/price.proto"; +import "cmp/types/v2/product_code.proto"; +import "google/protobuf/timestamp.proto"; + +// Insurance +// +// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/insurance/v1/insurance_types.proto.dot.xs.svg) +// +// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/insurance/v1/insurance_types.proto.dot.svg) +message Insurance { + // Context for Inventory system concepts that need to be included in an info + // response, like an OwnerCode, PTC_OfferParameters, Tax codes, Disclosure RefID, + // etc. or a serialized combination of these codes. + string context = 1; + + // An identifier for external sessions, aiding in tracking and continuity across + // sessions. + string external_session_id = 2; + + // List of insurance policies + repeated cmp.services.insurance.v1.Policy policies = 3; +} + +message Policy { + // Product Code + cmp.types.v2.ProductCode product_code = 1; + + // Description + string description = 2; + + // Ex: "2023-08-28T12:03:50", specifying when the static data of a product was + // last updated + // + // Timestamps may be used for both off-chain and on-chain operations. + // For on-chain operations, only seconds are supported, and nanoseconds + // will be ignored. + google.protobuf.Timestamp last_modified = 3; +} + +message PolicyExtendedInfo { + // Insurance Policy dynamic info + cmp.services.insurance.v1.Policy policy = 1; + + // Carrier code, this provider is the holder of the policy and not a supplier to the Camino Network + string carrier_code = 2; + + // Carrier name + string carrier_name = 3; + + // URL to logo + cmp.types.v3.Image logo = 4; + + // Enum of possible types, to be used for filtering + cmp.services.insurance.v1.PolicyType policy_type = 5; + + // Support contact + cmp.types.v2.ContactInfo support_contact = 6; + + // Criteria + repeated cmp.services.insurance.v1.PolicyCriteria criteria = 7; + + // Units + repeated cmp.services.insurance.v1.PolicyUnit units = 8; + + // Services + repeated cmp.services.insurance.v1.PolicyService services = 9; +} + +message PolicyCriteria { + // Criteria Code + string code = 1; + + // Criteria Name + string name = 2; +} + +message PolicyUnit { + // Unit code + string code = 1; + + // Unit name + string name = 2; + + // Coverage details + cmp.services.insurance.v1.PolicyCoverage policy_coverage = 4; +} + +message PolicyService { + // Service Code + string code = 1; + + // Service name + string name = 2; + + // Codes of units + repeated string unit_codes = 3; + + // Coverage details + cmp.services.insurance.v1.PolicyCoverage policy_coverage = 4; +} + +enum PolicyType { + POLICY_TYPE_UNSPECIFIED = 0; + POLICY_TYPE_OTHER = 1; + POLICY_TYPE_CANCEL = 2; + POLICY_TYPE_TRAVEL = 3; + POLICY_TYPE_TRAVEL_MEDICAL = 4; + POLICY_TYPE_MEDICAL = 5; + POLICY_TYPE_EMERGENCY = 6; + POLICY_TYPE_RENTAL_CAR = 7; + POLICY_TYPE_PERSONAL_BELONGINGS = 8; + POLICY_TYPE_FLIGHT = 9; + POLICY_TYPE_DEATH = 10; +} + +message PolicyCoverage { + // Maximum coverage amount + cmp.types.v2.Price max_coverage_amount = 3; + + // URL to Detailed list of risks covered + cmp.types.v1.Link coverage_link = 4; + + // URL to Specific events or conditions that are not covered by the policy + cmp.types.v1.Link exclusions_link = 5; + + // pre-existing conditions coverage + cmp.types.v1.Inclusivity preconditions_coverage = 6; + + // URL to Details on whether pre-existing medical conditions are covered, and if so, under what terms. + cmp.types.v1.Link preconditions_coverage_link = 7; + + // URL to Full legal terms of the policy, privacy policy, compliance, ... etc + cmp.types.v1.Link terms = 8; + + // URL to Frequently asked questions about the policy page + cmp.types.v1.Link faq = 9; +} + +message InsuredBooking { + // Location of insured booking: on-chain or off-chain + oneof location { + // On-Chain booking + cmp.services.insurance.v1.OnChainBooking on_chain = 1; + // Off-Chain booking + cmp.services.insurance.v1.OffChainBooking off_chain = 2; + } +} + +message OnChainBooking { + // Token ID + string token_id = 1; + // Smart Contract Address + string smart_contract_id = 2; + // Chain ID of the evm compatible chain that contract is deployed. For Camino (mainnet) it is 500. And for Columbus (testnet) it is 501. + int32 chain_id = 3; +} + +message OffChainBooking { + // Location of booking in some other off-chain system like booking.com + string location = 1; + // Booking reference + string reference = 2; +} diff --git a/proto/cmp/services/insurance/v2/list.proto b/proto/cmp/services/insurance/v2/list.proto new file mode 100644 index 00000000..fca5ef72 --- /dev/null +++ b/proto/cmp/services/insurance/v2/list.proto @@ -0,0 +1,37 @@ +syntax = "proto3"; + +package cmp.services.insurance.v2; + +import "cmp/services/insurance/v2/insurance_types.proto"; +import "cmp/types/v1/common.proto"; +import "google/protobuf/timestamp.proto"; + +message InsuranceProductListRequest { + // Message header + cmp.types.v1.RequestHeader header = 1; + + // Only respond with the products that are modified after this timestamp + // + // Timestamps may be used for both off-chain and on-chain operations. + // For on-chain operations, only seconds are supported, and nanoseconds + // will be ignored. + google.protobuf.Timestamp modified_after = 2; +} + +message InsuranceProductListResponse { + // Message header + cmp.types.v1.ResponseHeader header = 1; + + // Product list: Insurance + repeated cmp.services.insurance.v2.Insurance insurances = 2; +} + +// This service is used to get a product list for insurances. +// +// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/insurance/v1/list.proto.dot.xs.svg) +// +// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/insurance/v1/list.proto.dot.svg) +service InsuranceProductListService { + // Gets an optional `modified_after` date and returns a product list. + rpc InsuranceProductList(InsuranceProductListRequest) returns (InsuranceProductListResponse); +} diff --git a/proto/cmp/services/insurance/v2/search.proto b/proto/cmp/services/insurance/v2/search.proto new file mode 100644 index 00000000..f2e5fa19 --- /dev/null +++ b/proto/cmp/services/insurance/v2/search.proto @@ -0,0 +1,91 @@ +syntax = "proto3"; + +// ## InsuranceServices +// +// Insurance Services has two main processes: +// +// - selling insurances: this process follows the same flow as selling any travel +// product on the Camino Network: Static data download using the InsuranceProductList +// message to obtain the (changed) portfolio of product a supplier offers, followed by +// the InsuranceProductInfo message to get the exact detail of each product. The real-time data +// does not contain any static information and consists of the InsuranceSearch message, followed +// by the generic Validate and Mint messages. +// +// - making an insurance claim: this is a special workflow, only used in the Insurance Services. +// A claim form is requested based on the insurance policy purchased. This "template" is then +// filled with the required information, the necessary documents are attached, and the claim is +// submitted to the supplier. The supplier pushes a status upon change to the distributor. +// It might be possible that further information is required or that an off-line conversation is taking place. +// This finally leads to an acceptance and pay-out or a denial. +package cmp.services.insurance.v2; + +import "cmp/services/insurance/v2/search_query_types.proto"; +import "cmp/services/insurance/v1/search_result_types.proto"; +import "cmp/types/v1/common.proto"; +import "cmp/types/v2/search.proto"; +import "cmp/types/v3/traveller.proto"; + +// InsuranceSearchRequest +// +// The Insurance Search Request message type facilitates the request for insurances +// like health or cancellation insurances within the platform. In the request the market, +// language and currency are specified at the top-level. +// +// In "queries" we specify the details of the insurances we would like to be offered. +// In the Response, each InsuranceSearchResult is one bookable option as a "result_id". +// Each consists of a "product" which indicates a type of insurance and if more options of +// one type are available, then different units are offered. In case of an additional service, +// like a sports package in combination with a health insurance, you would find one search result +// with just the health insurance and another search result with both the health insurance and +// the sports package. +message InsuranceSearchRequest { + // Message header. Contains API version, message info string and end-user wallet + // address + cmp.types.v1.RequestHeader header = 1; + + // Search request metadata + cmp.types.v2.SearchRequestMetadata metadata = 2; + + // Generic search parameters Ex: Inclusion of OnRequest options and inclusion of + // only the cheapest or all options. + // In the search parameters multiple filters can be applied for upfront filtering + // of the search results to for example to only include hotels that are less than + // one kilometer from the beach, have a kids club and offer an a la carte restaurant + cmp.types.v2.SearchParameters search_parameters_generic = 3; + + // This field represents a list of search queries that can be used to create + // multiroom multi location searches. + repeated cmp.services.insurance.v2.InsuranceSearchQuery queries = 4; +} + +// The `Insurance Search Response` message type facilitates the response for +// insurances like hotel and holiday home searches within the platform. +// +// In the response a search_id must be included and a search_option_id for every +// bookable option responded. Included, compulsory and optional services can be +// included. A simple "free cancellation upto" can be set or full cancellation +// pilicies can be included. +message InsuranceSearchResponse { + // Message header. Contains API version, message info string and end user wallet + // address. + cmp.types.v1.ResponseHeader header = 1; + + // Search response metadata + cmp.types.v2.SearchResponseMetadata metadata = 2; + + // Unique combinations of bookable search results, like property, + repeated cmp.services.insurance.v1.InsuranceSearchResult results = 3; + + // Global definition of the travellers for all results to be used via the traveller_id each unit. + repeated cmp.types.v3.BasicTraveller travellers = 4; +} + +// Service definition for Insurance search +// +// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/insurance/v1/search.proto.dot.xs.svg) +// +// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/insurance/v1/search.proto.dot.svg) +service InsuranceSearchService { + // Insurance Search method + rpc InsuranceSearch(InsuranceSearchRequest) returns (InsuranceSearchResponse); +} diff --git a/proto/cmp/services/insurance/v2/search_parameters_types.proto b/proto/cmp/services/insurance/v2/search_parameters_types.proto new file mode 100644 index 00000000..2d85705d --- /dev/null +++ b/proto/cmp/services/insurance/v2/search_parameters_types.proto @@ -0,0 +1,43 @@ +syntax = "proto3"; + +package cmp.services.insurance.v2; + +import "cmp/services/insurance/v2/insurance_types.proto"; +import "cmp/types/v1/loyalty_program.proto"; +import "cmp/types/v1/travel_period.proto"; +import "cmp/types/v2/country.proto"; +import "cmp/types/v2/price.proto"; +import "cmp/types/v2/product_code.proto"; +import "cmp/types/v3/traveller.proto"; + +// This type is used in search requests for parameters like insured booking, network, ... etc +// +// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/insurance/v1/search_parameters_types.proto.dot.xs.svg) +// +// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/insurance/v1/search_parameters_types.proto.dot.svg) +message InsuranceSearchParameters { + // Product code list + // Here a list of property codes would be used that could be of different types + repeated cmp.types.v2.ProductCode product_codes = 1; + + // Value of booking to be insured, only valid with CFAR, Flight? and Rantal Car? insurances + cmp.types.v2.Price amount_purchase = 2; + + // Insurance location and its references. Location can be on-chain or off-chain. + cmp.services.insurance.v2.InsuredBooking booking_to_insure = 3; + + // The country code of the end-consumer nationality. This code is optional for normal NFT, but required for an NFT that is a receipt for a physical product. + cmp.types.v2.Country nationality = 4; + + // The country code of the end-consumer place of residence + cmp.types.v2.Country country_residence = 5; + + // Travel period + cmp.types.v1.TravelPeriod travel_period = 6; + + // Travellers + repeated cmp.types.v3.BasicTraveller travellers = 7; + + // Loyalty Program + cmp.types.v1.LoyaltyProgram loyalty_program = 8; +} diff --git a/proto/cmp/services/insurance/v2/search_query_types.proto b/proto/cmp/services/insurance/v2/search_query_types.proto new file mode 100644 index 00000000..974594dc --- /dev/null +++ b/proto/cmp/services/insurance/v2/search_query_types.proto @@ -0,0 +1,14 @@ +syntax = "proto3"; + +package cmp.services.insurance.v2; + +import "cmp/services/insurance/v2/search_parameters_types.proto"; + +message InsuranceSearchQuery { + // Integer query ID, unique per search request + int32 query_id = 1; + + // Insurance specific search parameters Ex: Specific search parameters like + // insured booking, nationality, blockchain, ... etc + cmp.services.insurance.v2.InsuranceSearchParameters search_parameters_insurance = 2; +} diff --git a/proto/cmp/services/seat_map/v3/availability.proto b/proto/cmp/services/seat_map/v3/availability.proto new file mode 100644 index 00000000..ed7eb608 --- /dev/null +++ b/proto/cmp/services/seat_map/v3/availability.proto @@ -0,0 +1,60 @@ +syntax = "proto3"; + +package cmp.services.seat_map.v3; + +import "cmp/types/v1/common.proto"; +import "cmp/types/v2/search.proto"; +import "cmp/types/v3/seat_map.proto"; + +// Request for seat map availability data +// +// Requests the seat map availability data for a given map ID +message SeatMapAvailabilityRequest { + // Message header + // + // Header contains information about the request + cmp.types.v1.RequestHeader header = 1; + + // Required. The identifier of the seat map. + oneof identifier { + // Mint Identifier + // + // Example: For flights which book before seat selection. In this case, the + // buyer already have a `mint_id` because the service is already booked (minted + // on-chain). + string mint_id = 2; + + // Search result identifier with `search_id` & `result_id` + // + // Example: For requesting seat availability for search results. In this case, + // booking has not happended yet. + cmp.types.v2.SearchIdentifier search_identifier = 3; + } +} + +// Response for seat map availability request +// +// Contains the seat map availability data for a given map ID +message SeatMapAvailabilityResponse { + // Message header + // + // Header contains information about the response + cmp.types.v1.ResponseHeader header = 1; + + // Required. Seat map availability data. + cmp.types.v3.SeatMapInventory seat_map = 2; +} + +// Service for requesting seat map availability data +// +// Service is used to request the seat map availability data for a given map ID +// +// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/seat_map/v2/availability.proto.dot.xs.svg) +// +// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/seat_map/v2/availability.proto.dot.svg) +service SeatMapAvailabilityService { + // Get seat map availability data + // + // Requests the seat map availability data for a given map ID + rpc SeatMapAvailability(SeatMapAvailabilityRequest) returns (SeatMapAvailabilityResponse); +} diff --git a/proto/cmp/services/seat_map/v3/seat_map.proto b/proto/cmp/services/seat_map/v3/seat_map.proto new file mode 100644 index 00000000..490e891a --- /dev/null +++ b/proto/cmp/services/seat_map/v3/seat_map.proto @@ -0,0 +1,53 @@ +syntax = "proto3"; + +package cmp.services.seat_map.v3; + +import "cmp/types/v1/common.proto"; +import "cmp/types/v1/language.proto"; +import "cmp/types/v3/seat_map.proto"; + +// Request for seat map data +// +// Requests the seat map data for a given map ID +message SeatMapRequest { + // Request header + // + // Header contains information about the request + cmp.types.v1.RequestHeader header = 1; + + // Unique identifier for the seat map + // + // This is the map ID that is received in the search results and also from the + // product info responses. + string map_id = 2; + + // Requested Languages + repeated cmp.types.v1.Language languages = 3; +} + +// Response for seat map request +// +// Contains the seat map data for a given map ID +message SeatMapResponse { + // Response header + // + // Header contains information about the response + cmp.types.v1.ResponseHeader header = 1; + + // Seat map data + // + // Contains the seat map data for the requested map ID + cmp.types.v3.SeatMap seat_map = 2; +} + +// Service for requesting seat map data for a given map ID +// +// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/seat_map/v2/seat_map.proto.dot.xs.svg) +// +// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/seat_map/v2/seat_map.proto.dot.svg) +service SeatMapService { + // Get seat map data + // + // Requests the seat map data for a given map ID + rpc SeatMap(SeatMapRequest) returns (SeatMapResponse); +} diff --git a/proto/cmp/services/transport/v3/search.proto b/proto/cmp/services/transport/v3/search.proto index 47b9f844..7689a6ce 100644 --- a/proto/cmp/services/transport/v3/search.proto +++ b/proto/cmp/services/transport/v3/search.proto @@ -11,12 +11,12 @@ syntax = "proto3"; // This package is a WIP. package cmp.services.transport.v3; -import "cmp/services/transport/v2/search_query_types.proto"; +import "cmp/services/transport/v3/search_query_types.proto"; import "cmp/services/transport/v3/search_result_types.proto"; import "cmp/types/v1/common.proto"; import "cmp/types/v1/content_source.proto"; import "cmp/types/v2/search.proto"; -import "cmp/types/v2/traveller.proto"; +import "cmp/types/v3/traveller.proto"; // Transport Search Request message TransportSearchRequest { @@ -34,7 +34,7 @@ message TransportSearchRequest { cmp.types.v2.SearchParameters search_parameters = 3; // Multiple search queries for this search request - repeated cmp.services.transport.v2.TransportSearchQuery queries = 4; + repeated cmp.services.transport.v3.TransportSearchQuery queries = 4; // Remarks string remarks = 5; @@ -59,7 +59,7 @@ message TransportSearchResponse { repeated cmp.services.transport.v3.TransportSearchResult results = 4; // Global definition of the travellers for all results to be used via the traveller_id - repeated cmp.types.v2.BasicTraveller travellers = 5; + repeated cmp.types.v3.BasicTraveller travellers = 5; } // Transport Search Service definition. diff --git a/proto/cmp/services/transport/v3/search_query_types.proto b/proto/cmp/services/transport/v3/search_query_types.proto new file mode 100644 index 00000000..3bf25db9 --- /dev/null +++ b/proto/cmp/services/transport/v3/search_query_types.proto @@ -0,0 +1,54 @@ +syntax = "proto3"; + +package cmp.services.transport.v3; + +import "cmp/services/transport/v2/search_parameters_types.proto"; +import "cmp/types/v1/date.proto"; +import "cmp/types/v2/location.proto"; +import "cmp/types/v3/traveller.proto"; + +// Transport search query. Multiple trips can be send, each representing multi-leg +// journey. +// +// Ex: +// - 1 trip in trips : One way journey from PMI to BCN. +// - 2 trips in trips: Roundtrip journey from PMI to BCN and then BCN to PMI. +// - 3 trips in trips: PMI->BCN + BCN->BER + BER->PMI (1 two legged flight (connection) and 1 direct (return) flight) +// +// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/transport/v2/search_query_types.proto.dot.xs.svg) +// [Open Message +// Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/transport/v2/search_query_types.proto.dot.svg) +message TransportSearchQuery { + // ID + int32 query_id = 1; + + // Global definition of the travellers for all requests to be used via the traveller_id + repeated cmp.types.v3.BasicTraveller travellers = 2; + + // Trips + repeated cmp.services.transport.v3.QueryTrip trips = 3; +} + +// Version of `Trip` object in `trip_types.prot` for search request's queries. It +// contains only departure and arrival objects, lacking the segments field. +message QueryTrip { + // Departure event + cmp.services.transport.v3.QueryTransitEvent departure = 1; + + // Arrival event + cmp.services.transport.v3.QueryTransitEvent arrival = 2; + + // Transport specific search parameters + cmp.services.transport.v2.TransportSearchParameters search_parameters_transport = 3; +} + +// Represents a departure or arrival event for search request's query. This type is +// different from `TransitEvent` in `trip_types.proto` by having a `date` object +// instead of a `datetime` object. +message QueryTransitEvent { + // Date time of the event + cmp.types.v1.Date date = 1; + + // Event location + cmp.types.v2.LocationCode location_code = 2; +} diff --git a/proto/cmp/types/v3/seat_map.proto b/proto/cmp/types/v3/seat_map.proto new file mode 100644 index 00000000..c5518640 --- /dev/null +++ b/proto/cmp/types/v3/seat_map.proto @@ -0,0 +1,211 @@ +syntax = "proto3"; + +package cmp.types.v3; + +import "cmp/types/v1/description.proto"; +import "cmp/types/v1/language.proto"; +import "cmp/types/v1/localized.proto"; +import "cmp/types/v3/file.proto"; +import "google/protobuf/wrappers.proto"; + +// Represents a basic seat with optional features and restrictions. Each seat has a +// unique identifier, a location within the seat map, and can have various static +// features and restrictions associated with it. +message Seat { + // Unique identifier for the seat, such as "12B" or "A26". This identifier must be + // unique within the section to which this seat belongs. + string id = 1; + + // The location of the seat within the seat map. This can be defined using either + // a vector (SVG) or bitmap format. + cmp.types.v3.SeatLocation location = 2; + + // Static features associated with the seat, such as type, amenities, etc. + repeated cmp.types.v3.LocalizedSeatAttributeSet features = 3; + + // Restrictions associated with the seat, such as age limits or accessibility requirements. + repeated cmp.types.v3.LocalizedSeatAttributeSet restrictions = 4; +} + +// List of seats +message SeatList { + repeated cmp.types.v3.Seat seats = 1; +} + +// A Section represents a distinct area within a venue, which can be defined by +// various attributes. It can be a block of rows in a theater, a specific area in a +// concert venue such as the stage or standing area, a section of seating in a +// stadium, or a section in an airplane. Each Section is uniquely identified and can +// contain information about its seats, layout, and additional properties. +message Section { + // Level, section or row identifier, e.g., "Upper", "Balcony" or "Section 101", + // "Orchestra" or "A", "12". Must be unique for each section. + string id = 1; + + // List of localized names Human readable names of the section + repeated cmp.types.v1.LocalizedString names = 2; + + // Seats in this section. + oneof seat_info { + // List of seats in this section. + cmp.types.v3.SeatList seat_list = 3; + + // Total number of seats in this section as an integer. + google.protobuf.Int32Value total_seats = 4; + } + + // Image that provides a visual representation of the section's layout, which can + // be either a vector (SVG) or bitmap image. + // + // If set, it is assumed that this image is used for locating seats within the + // section. (the `SeatLocation` message type in the `Seat` message above is + // used to represent seat location inside this image). + cmp.types.v3.Image image = 5; + + // A list of localized descriptions for this section, useful for providing + // information about features and amenities in multiple languages. + repeated cmp.types.v1.LocalizedDescriptionSet localized_descriptions = 6; + + // Nested sections within this section, allowing for a hierarchical representation + // of the venue's layout. + repeated cmp.types.v3.Section sections = 7; +} + +// High-level representation of a seat map, which defines the layout and structure +// of seating within a venue. This message provides a comprehensive overview of the +// seating arrangement, including sections, images, and localized descriptions. +// +// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/types/v2/seat_map.proto.dot.xs.svg) +// +// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/types/v2/seat_map.proto.dot.svg) +message SeatMap { + // Unique identifier for the seat map + string id = 1; + + // A list of sections within the seat map. Each section represents a distinct area + // within the venue, such as rows, sections, levels, or blocks of seats. This + // field is recursive, allowing for hierarchical structuring of the seating + // layout. + repeated cmp.types.v3.Section sections = 2; + + // Image that provides a visual representation of the seat map, illustrating the + // location and arrangement of seats. The image can be in vector format (SVG) or + // bitmap format. + cmp.types.v3.Image image = 3; + + // A list of localized descriptions for the seat map. This can be used to describe + // features and amenities of the seating arrangement in multiple languages. + // The languages should match those requested in SeatMapRequest + repeated cmp.types.v1.LocalizedDescriptionSet localized_descriptions = 4; +} + +// List of _only_ seat IDs to be used for seat selection or seat availability. +message SeatInventory { + // List of seat IDs + repeated string ids = 1; +} + +// Represents the inventory of seats for a specific section and all its inner +// sections. This message is used for both seat availability and seat selection +// purposes, providing information about either the remaining or selected seats +// within the section. +message SectionInventory { + // Unique identifier for the section. Must be unique within the seat map. + string id = 1; + + oneof seat_info { + // List of individual seat IDs within this section. + cmp.types.v3.SeatInventory seat_list = 2; + + // Seat count in this section, representing either the remaining seats for + // availability purposes or the selected seats for seat selection messages. + // + // This field is intended for sections without individual seat details, such as + // standing areas at a concert or an arena. + google.protobuf.Int32Value seat_count = 3; + } + + // Nested inner sections within this section, allowing for a hierarchical + // representation of seat inventory. Each inner section can have its own seat + // information and further nested sections. + repeated cmp.types.v3.SectionInventory sections = 4; +} + +// Represents the inventory of seats for a specific seat map, used for both seat +// selection and seat availability purposes. This message provides a comprehensive +// overview of the seating inventory, including detailed information about each +// section and its inner sections. +message SeatMapInventory { + // Unique identifier for the seat map that this Inventory refers to. + string id = 1; + + // A list of seat inventories for each section within the seat map. This field + // includes detailed seat information and supports nested sections, allowing for a + // hierarchical representation of the seating arrangement. + repeated cmp.types.v3.SectionInventory sections = 2; +} + +message LocalizedSeatAttributeSet { + cmp.types.v1.Language language = 1; + repeated cmp.types.v3.SeatAttribute seat_attributes = 2; +} +/* Helper messages */ + +// Defines a static attribute for a seat, which can be used for specifying features +// and restrictions. Attributes include a name, a human-readable description, and a +// value that can be used for various conditions or restrictions. +// +// FIXME: Can we make this a big enum? +message SeatAttribute { + // Name of the attribute, used to identify the feature or restriction. + string name = 1; + + // Human-readable description of the attribute, providing more details about its purpose. + string description = 2; + + // Integer value associated with the attribute, which can be used for conditions + // or restrictions, such as "min_age". + int32 value = 3; +} + +// Enumerates the types of areas that can be defined within a seat map. This is used +// for specifying the shape of regions in bitmap images. +enum AreaType { + AREA_TYPE_UNSPECIFIED = 0; + AREA_TYPE_RECTANGLE = 1; + AREA_TYPE_CIRCLE = 2; + AREA_TYPE_POLYGON = 3; +} + +// Defines the location of a seat within a bitmap image seat map. This information +// is generally used with the HTML `area` tag to specify clickable regions. +message BitmapSeatLocation { + // The type of area defining the seat location, such as rectangle, circle, or polygon. + cmp.types.v3.AreaType type = 1; + + // Coordinates defining the area. The format of the coordinates depends on the + // area type (e.g., top-left (x1,y1) and bottom-right (x2,y2) corners for a + // rectangle: ` Date: Fri, 18 Oct 2024 12:54:39 +0200 Subject: [PATCH 09/34] buf lint fixes --- .../accommodation/v3/property_types.proto | 2 +- .../services/accommodation/v3/search.proto | 2 +- .../services/activity/v3/activity_types.proto | 2 +- proto/cmp/services/book/v3/mint.proto | 2 +- .../insurance/v2/insurance_types.proto | 22 +++++++++---------- proto/cmp/services/insurance/v2/search.proto | 2 +- 6 files changed, 16 insertions(+), 16 deletions(-) diff --git a/proto/cmp/services/accommodation/v3/property_types.proto b/proto/cmp/services/accommodation/v3/property_types.proto index 7154ec71..f43b35cd 100644 --- a/proto/cmp/services/accommodation/v3/property_types.proto +++ b/proto/cmp/services/accommodation/v3/property_types.proto @@ -8,10 +8,10 @@ import "cmp/types/v1/description.proto"; import "cmp/types/v1/meal_plan.proto"; import "cmp/types/v1/product_status.proto"; import "cmp/types/v2/contact_info.proto"; -import "cmp/types/v3/file.proto"; import "cmp/types/v2/location.proto"; import "cmp/types/v2/product_code.proto"; import "cmp/types/v2/service_fact.proto"; +import "cmp/types/v3/file.proto"; import "cmp/types/v3/traveller.proto"; import "google/protobuf/timestamp.proto"; diff --git a/proto/cmp/services/accommodation/v3/search.proto b/proto/cmp/services/accommodation/v3/search.proto index 2d2ab047..6d4ae481 100644 --- a/proto/cmp/services/accommodation/v3/search.proto +++ b/proto/cmp/services/accommodation/v3/search.proto @@ -12,8 +12,8 @@ syntax = "proto3"; // This package is a **WIP**. package cmp.services.accommodation.v3; -import "cmp/services/accommodation/v3/search_query_types.proto"; import "cmp/services/accommodation/v2/search_result_types.proto"; +import "cmp/services/accommodation/v3/search_query_types.proto"; import "cmp/types/v1/common.proto"; import "cmp/types/v2/search.proto"; import "cmp/types/v3/traveller.proto"; diff --git a/proto/cmp/services/activity/v3/activity_types.proto b/proto/cmp/services/activity/v3/activity_types.proto index 659b83b0..3f76dca6 100644 --- a/proto/cmp/services/activity/v3/activity_types.proto +++ b/proto/cmp/services/activity/v3/activity_types.proto @@ -11,9 +11,9 @@ import "cmp/types/v1/language.proto"; import "cmp/types/v1/redemption.proto"; import "cmp/types/v2/address.proto"; import "cmp/types/v2/contact_info.proto"; -import "cmp/types/v3/file.proto"; import "cmp/types/v2/location.proto"; import "cmp/types/v2/product_code.proto"; +import "cmp/types/v3/file.proto"; import "google/protobuf/timestamp.proto"; // Activity diff --git a/proto/cmp/services/book/v3/mint.proto b/proto/cmp/services/book/v3/mint.proto index 5ad22bf8..79e1a6c5 100644 --- a/proto/cmp/services/book/v3/mint.proto +++ b/proto/cmp/services/book/v3/mint.proto @@ -4,9 +4,9 @@ package cmp.services.book.v3; import "cmp/types/v1/common.proto"; import "cmp/types/v1/language.proto"; -import "cmp/types/v2/payment.proto"; import "cmp/types/v1/pubkey.proto"; import "cmp/types/v1/uuid.proto"; +import "cmp/types/v2/payment.proto"; import "cmp/types/v2/price.proto"; import "cmp/types/v3/traveller.proto"; import "google/protobuf/timestamp.proto"; diff --git a/proto/cmp/services/insurance/v2/insurance_types.proto b/proto/cmp/services/insurance/v2/insurance_types.proto index ac8250fe..fd34d499 100644 --- a/proto/cmp/services/insurance/v2/insurance_types.proto +++ b/proto/cmp/services/insurance/v2/insurance_types.proto @@ -5,9 +5,9 @@ package cmp.services.insurance.v2; import "cmp/types/v1/inclusivity.proto"; import "cmp/types/v1/link.proto"; import "cmp/types/v2/contact_info.proto"; -import "cmp/types/v3/file.proto"; import "cmp/types/v2/price.proto"; import "cmp/types/v2/product_code.proto"; +import "cmp/types/v3/file.proto"; import "google/protobuf/timestamp.proto"; // Insurance @@ -26,7 +26,7 @@ message Insurance { string external_session_id = 2; // List of insurance policies - repeated cmp.services.insurance.v1.Policy policies = 3; + repeated cmp.services.insurance.v2.Policy policies = 3; } message Policy { @@ -47,7 +47,7 @@ message Policy { message PolicyExtendedInfo { // Insurance Policy dynamic info - cmp.services.insurance.v1.Policy policy = 1; + cmp.services.insurance.v2.Policy policy = 1; // Carrier code, this provider is the holder of the policy and not a supplier to the Camino Network string carrier_code = 2; @@ -59,19 +59,19 @@ message PolicyExtendedInfo { cmp.types.v3.Image logo = 4; // Enum of possible types, to be used for filtering - cmp.services.insurance.v1.PolicyType policy_type = 5; + cmp.services.insurance.v2.PolicyType policy_type = 5; // Support contact cmp.types.v2.ContactInfo support_contact = 6; // Criteria - repeated cmp.services.insurance.v1.PolicyCriteria criteria = 7; + repeated cmp.services.insurance.v2.PolicyCriteria criteria = 7; // Units - repeated cmp.services.insurance.v1.PolicyUnit units = 8; + repeated cmp.services.insurance.v2.PolicyUnit units = 8; // Services - repeated cmp.services.insurance.v1.PolicyService services = 9; + repeated cmp.services.insurance.v2.PolicyService services = 9; } message PolicyCriteria { @@ -90,7 +90,7 @@ message PolicyUnit { string name = 2; // Coverage details - cmp.services.insurance.v1.PolicyCoverage policy_coverage = 4; + cmp.services.insurance.v2.PolicyCoverage policy_coverage = 4; } message PolicyService { @@ -104,7 +104,7 @@ message PolicyService { repeated string unit_codes = 3; // Coverage details - cmp.services.insurance.v1.PolicyCoverage policy_coverage = 4; + cmp.services.insurance.v2.PolicyCoverage policy_coverage = 4; } enum PolicyType { @@ -148,9 +148,9 @@ message InsuredBooking { // Location of insured booking: on-chain or off-chain oneof location { // On-Chain booking - cmp.services.insurance.v1.OnChainBooking on_chain = 1; + cmp.services.insurance.v2.OnChainBooking on_chain = 1; // Off-Chain booking - cmp.services.insurance.v1.OffChainBooking off_chain = 2; + cmp.services.insurance.v2.OffChainBooking off_chain = 2; } } diff --git a/proto/cmp/services/insurance/v2/search.proto b/proto/cmp/services/insurance/v2/search.proto index f2e5fa19..c2bb63e2 100644 --- a/proto/cmp/services/insurance/v2/search.proto +++ b/proto/cmp/services/insurance/v2/search.proto @@ -19,8 +19,8 @@ syntax = "proto3"; // This finally leads to an acceptance and pay-out or a denial. package cmp.services.insurance.v2; -import "cmp/services/insurance/v2/search_query_types.proto"; import "cmp/services/insurance/v1/search_result_types.proto"; +import "cmp/services/insurance/v2/search_query_types.proto"; import "cmp/types/v1/common.proto"; import "cmp/types/v2/search.proto"; import "cmp/types/v3/traveller.proto"; From a8a8423f2cb157ef7c5fbb1544a0eb46d80795bc Mon Sep 17 00:00:00 2001 From: Mohamed Elmoslemany Date: Fri, 18 Oct 2024 15:27:51 +0200 Subject: [PATCH 10/34] fix edge case for company type version --- proto/cmp/types/v1/company.proto | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 proto/cmp/types/v1/company.proto diff --git a/proto/cmp/types/v1/company.proto b/proto/cmp/types/v1/company.proto new file mode 100644 index 00000000..f1d5f15e --- /dev/null +++ b/proto/cmp/types/v1/company.proto @@ -0,0 +1,21 @@ +syntax = "proto3"; + +package cmp.types.v1; + +import "cmp/types/v1/contact_info.proto"; + +// ### Company message type +// +// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/types/v1/company.proto.dot.xs.svg) +// +// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/types/v1/company.proto.dot.svg) +message Company { + // Short name of the partner. Ex: Chain4Travel + string short_name = 1; + + // Legal name of the partner. Ex: Chain4Travel AG + string legal_name = 2; + + // Contact Info + cmp.types.v1.ContactInfo contact_info = 6; +} From c7405fc78e3a289f20aa15b4dc8fe73ea5d916bc Mon Sep 17 00:00:00 2001 From: Mohamed Elmoslemany Date: Tue, 22 Oct 2024 12:44:14 +0200 Subject: [PATCH 11/34] separate claim from insurance --- proto/cmp/services/book/v3/mint.proto | 4 +- .../v1/claim_settlement_decision.proto | 28 +++++++------- .../v1/claim_settlement_extra_info.proto | 26 ++++++------- .../{insurance => claim}/v1/claim_types.proto | 34 ++++++++--------- .../v1/get_claim_form.proto | 22 +++++------ .../services/claim/v1/submit_claim_form.proto | 35 +++++++++++++++++ .../v1/submit_claim_form_extra_info.proto | 38 +++++++++++++++++++ .../insurance/v1/submit_claim_form.proto | 35 ----------------- .../v1/submit_claim_form_extra_info.proto | 38 ------------------- proto/cmp/types/v1/company.proto | 21 ---------- proto/cmp/types/{v2 => v3}/company.proto | 6 +-- proto/cmp/types/{v2 => v3}/payment.proto | 6 +-- 12 files changed, 136 insertions(+), 157 deletions(-) rename proto/cmp/services/{insurance => claim}/v1/claim_settlement_decision.proto (58%) rename proto/cmp/services/{insurance => claim}/v1/claim_settlement_extra_info.proto (51%) rename proto/cmp/services/{insurance => claim}/v1/claim_types.proto (80%) rename proto/cmp/services/{insurance => claim}/v1/get_claim_form.proto (53%) create mode 100644 proto/cmp/services/claim/v1/submit_claim_form.proto create mode 100644 proto/cmp/services/claim/v1/submit_claim_form_extra_info.proto delete mode 100644 proto/cmp/services/insurance/v1/submit_claim_form.proto delete mode 100644 proto/cmp/services/insurance/v1/submit_claim_form_extra_info.proto delete mode 100644 proto/cmp/types/v1/company.proto rename proto/cmp/types/{v2 => v3}/company.proto (77%) rename proto/cmp/types/{v2 => v3}/payment.proto (81%) diff --git a/proto/cmp/services/book/v3/mint.proto b/proto/cmp/services/book/v3/mint.proto index 79e1a6c5..d62aad0c 100644 --- a/proto/cmp/services/book/v3/mint.proto +++ b/proto/cmp/services/book/v3/mint.proto @@ -6,8 +6,8 @@ import "cmp/types/v1/common.proto"; import "cmp/types/v1/language.proto"; import "cmp/types/v1/pubkey.proto"; import "cmp/types/v1/uuid.proto"; -import "cmp/types/v2/payment.proto"; import "cmp/types/v2/price.proto"; +import "cmp/types/v3/payment.proto"; import "cmp/types/v3/traveller.proto"; import "google/protobuf/timestamp.proto"; @@ -41,7 +41,7 @@ message MintRequest { string buyer_address = 10; // This field is only relevant for off chain virtual credit card payments. - cmp.types.v2.AdditionalPaymentInfo additional_payment_info = 11; + cmp.types.v3.AdditionalPaymentInfo additional_payment_info = 11; } message MintResponse { diff --git a/proto/cmp/services/insurance/v1/claim_settlement_decision.proto b/proto/cmp/services/claim/v1/claim_settlement_decision.proto similarity index 58% rename from proto/cmp/services/insurance/v1/claim_settlement_decision.proto rename to proto/cmp/services/claim/v1/claim_settlement_decision.proto index dde9f548..ee912dc3 100644 --- a/proto/cmp/services/insurance/v1/claim_settlement_decision.proto +++ b/proto/cmp/services/claim/v1/claim_settlement_decision.proto @@ -1,13 +1,13 @@ syntax = "proto3"; -package cmp.services.insurance.v1; +package cmp.services.claim.v1; -import "cmp/services/insurance/v1/claim_types.proto"; +import "cmp/services/claim/v1/claim_types.proto"; import "cmp/types/v1/common.proto"; import "cmp/types/v2/price.proto"; import "google/protobuf/timestamp.proto"; -message InsuranceSettlementDecisionRequest { +message ClaimSettlementDecisionRequest { // Message header cmp.types.v1.RequestHeader header = 1; @@ -20,10 +20,10 @@ message InsuranceSettlementDecisionRequest { google.protobuf.Timestamp modified_after = 2; // Claim ID: Submission ID, Processing ID and Carrier ID - cmp.services.insurance.v1.ClaimId claim_id = 3; + cmp.services.claim.v1.ClaimId claim_id = 3; // Claim Status - cmp.services.insurance.v1.ClaimStatus status = 4; + cmp.services.claim.v1.ClaimStatus status = 4; // TODO: Is this reference applied for Acceptance and Rejection ? string decision_reference = 5; @@ -32,27 +32,27 @@ message InsuranceSettlementDecisionRequest { string decision_detail = 6; // Pay-out transaction - cmp.services.insurance.v1.PayOutTransaction payout_transaction = 7; + cmp.services.claim.v1.PayOutTransaction payout_transaction = 7; // TODO: ask whether there could be multiple payouts for the same claim. // Amount cmp.types.v2.PriceDetail amount = 8; } -message InsuranceSettlementDecisionResponse { +message ClaimSettlementDecisionResponse { // Message header cmp.types.v1.ResponseHeader header = 1; // Claim Message Response to respond with claim ids (processing, carrier and submission) and message status - cmp.services.insurance.v1.ClaimMessageResponse claim_message_response = 2; + cmp.services.claim.v1.ClaimMessageResponse claim_message_response = 2; } -// Insurance settlement decision (Accepted or Rejected) service definition +// Claim settlement decision (Accepted or Rejected) service definition // -// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/insurance/v1/claim_settlement_decision.proto.dot.xs.svg) +// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/claim/v1/claim_settlement_decision.proto.dot.xs.svg) // -// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/insurance/v1/claim_settlement_decision.proto.dot.svg) -service InsuranceSettlementDecisionService { - // Returns insurance settlement response - rpc InsuranceSettlementDecision(InsuranceSettlementDecisionRequest) returns (InsuranceSettlementDecisionResponse); +// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/claim/v1/claim_settlement_decision.proto.dot.svg) +service ClaimSettlementDecisionService { + // Returns claim settlement response + rpc ClaimSettlementDecision(ClaimSettlementDecisionRequest) returns (ClaimSettlementDecisionResponse); } diff --git a/proto/cmp/services/insurance/v1/claim_settlement_extra_info.proto b/proto/cmp/services/claim/v1/claim_settlement_extra_info.proto similarity index 51% rename from proto/cmp/services/insurance/v1/claim_settlement_extra_info.proto rename to proto/cmp/services/claim/v1/claim_settlement_extra_info.proto index 7e920af6..0ba1e5f8 100644 --- a/proto/cmp/services/insurance/v1/claim_settlement_extra_info.proto +++ b/proto/cmp/services/claim/v1/claim_settlement_extra_info.proto @@ -1,12 +1,12 @@ syntax = "proto3"; -package cmp.services.insurance.v1; +package cmp.services.claim.v1; -import "cmp/services/insurance/v1/claim_types.proto"; +import "cmp/services/claim/v1/claim_types.proto"; import "cmp/types/v1/common.proto"; import "google/protobuf/timestamp.proto"; -message InsuranceSettlementExtraInfoRequest { +message ClaimSettlementExtraInfoRequest { // Message header cmp.types.v1.RequestHeader header = 1; @@ -19,25 +19,25 @@ message InsuranceSettlementExtraInfoRequest { google.protobuf.Timestamp modified_after = 2; // Claim ID: Submission ID, Processing ID and Carrier ID - cmp.services.insurance.v1.ClaimId claim_id = 3; + cmp.services.claim.v1.ClaimId claim_id = 3; - repeated cmp.services.insurance.v1.ClaimInfoRequested info_requested = 4; + repeated cmp.services.claim.v1.ClaimInfoRequested info_requested = 4; } -message InsuranceSettlementExtraInfoResponse { +message ClaimSettlementExtraInfoResponse { // Message header cmp.types.v1.ResponseHeader header = 1; // Claim Message Response to respond with claim ids (processing, carrier and submission) and message status - cmp.services.insurance.v1.ClaimMessageResponse claim_message_response = 2; + cmp.services.claim.v1.ClaimMessageResponse claim_message_response = 2; } -// Insurance settlement Extra Info service definition +// Claim settlement Extra Info service definition // -// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/insurance/v1/claim_settlement_extra_info.proto.dot.xs.svg) +// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/claim/v1/claim_settlement_extra_info.proto.dot.xs.svg) // -// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/insurance/v1/claim_settlement_extra_info.proto.dot.svg) -service InsuranceSettlementExtraInfoService { - // Returns insurance settlement response - rpc InsuranceSettlementExtraInfo(InsuranceSettlementExtraInfoRequest) returns (InsuranceSettlementExtraInfoResponse); +// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/claim/v1/claim_settlement_extra_info.proto.dot.svg) +service ClaimSettlementExtraInfoService { + // Returns claim settlement response + rpc ClaimSettlementExtraInfo(ClaimSettlementExtraInfoRequest) returns (ClaimSettlementExtraInfoResponse); } diff --git a/proto/cmp/services/insurance/v1/claim_types.proto b/proto/cmp/services/claim/v1/claim_types.proto similarity index 80% rename from proto/cmp/services/insurance/v1/claim_types.proto rename to proto/cmp/services/claim/v1/claim_types.proto index 7b7e81e4..72081939 100644 --- a/proto/cmp/services/insurance/v1/claim_types.proto +++ b/proto/cmp/services/claim/v1/claim_types.proto @@ -1,38 +1,38 @@ syntax = "proto3"; -package cmp.services.insurance.v1; +package cmp.services.claim.v1; import "cmp/services/insurance/v1/search_result_types.proto"; import "cmp/types/v1/date.proto"; -import "cmp/types/v2/company.proto"; -import "cmp/types/v2/payment.proto"; import "cmp/types/v2/price.proto"; +import "cmp/types/v3/company.proto"; import "cmp/types/v3/file.proto"; +import "cmp/types/v3/payment.proto"; import "cmp/types/v3/traveller.proto"; // ClaimForm // -// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/insurance/v1/claim_types.proto.dot.xs.svg) +// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/claim/v1/claim_types.proto.dot.xs.svg) // -// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/insurance/v1/claim_types.proto.dot.svg) +// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/claim/v1/claim_types.proto.dot.svg) message ClaimForm { // Insured person or someone related who has the accident cmp.types.v3.TravellerExtraInfo affected_person = 1; // Policy brief info - cmp.services.insurance.v1.PolicyInfo policy_info = 2; + cmp.services.claim.v1.PolicyInfo policy_info = 2; // Dates of services repeated cmp.types.v1.Date dates = 3; // Services to claim - repeated cmp.services.insurance.v1.ClaimableService services_to_claim = 4; + repeated cmp.services.claim.v1.ClaimableService services_to_claim = 4; // Additional documents - repeated cmp.services.insurance.v1.ClaimDocument additional_documents = 5; + repeated cmp.services.claim.v1.ClaimDocument additional_documents = 5; // Additional info - repeated cmp.services.insurance.v1.ClaimAdditionalInfo additional_info = 6; + repeated cmp.services.claim.v1.ClaimAdditionalInfo additional_info = 6; } // Service to claim @@ -44,7 +44,7 @@ message ClaimableService { cmp.types.v2.Price charge_amount = 2; // Documents - repeated cmp.services.insurance.v1.ClaimDocument documents = 3; + repeated cmp.services.claim.v1.ClaimDocument documents = 3; } // Claim Document @@ -53,7 +53,7 @@ message ClaimDocument { cmp.types.v3.File file = 1; // Type of the document - cmp.services.insurance.v1.ClaimDocumentType type = 2; + cmp.services.claim.v1.ClaimDocumentType type = 2; } // Additonal info @@ -62,7 +62,7 @@ message ClaimAdditionalInfo { string info = 1; // Condition related to the claim - cmp.services.insurance.v1.ClaimCondition condition = 2; + cmp.services.claim.v1.ClaimCondition condition = 2; } // Claim conditions @@ -138,7 +138,7 @@ message PolicyInfo { } // Insurance Company - cmp.types.v2.Company company = 6; + cmp.types.v3.Company company = 6; // Policy Codes: unit Code, service code and product code cmp.services.insurance.v1.PolicyCodes policy_code = 8; @@ -153,7 +153,7 @@ message ClaimInfoRequested { cmp.types.v2.Price charge_amount = 2; // Document type requested - cmp.services.insurance.v1.ClaimDocumentType document_type = 3; + cmp.services.claim.v1.ClaimDocumentType document_type = 3; } message ClaimId { @@ -169,10 +169,10 @@ message ClaimId { message ClaimMessageResponse { // Claim IDs: Submission ID, Processing ID and Carrier ID - cmp.services.insurance.v1.ClaimId claim_id = 1; + cmp.services.claim.v1.ClaimId claim_id = 1; // Claim Message Status - cmp.services.insurance.v1.ClaimMessageStatus message_status = 2; + cmp.services.claim.v1.ClaimMessageStatus message_status = 2; } // Claim Pay-Out Transaction @@ -181,5 +181,5 @@ message PayOutTransaction { string transaction_id = 1; // Transaction Type. It can be Bank transfer, Crypto transfer, Credit card, ... etc - cmp.types.v2.PaymentType transaction_type = 2; + cmp.types.v3.PaymentType transaction_type = 2; } diff --git a/proto/cmp/services/insurance/v1/get_claim_form.proto b/proto/cmp/services/claim/v1/get_claim_form.proto similarity index 53% rename from proto/cmp/services/insurance/v1/get_claim_form.proto rename to proto/cmp/services/claim/v1/get_claim_form.proto index 0df74586..bd6142e8 100644 --- a/proto/cmp/services/insurance/v1/get_claim_form.proto +++ b/proto/cmp/services/claim/v1/get_claim_form.proto @@ -1,12 +1,12 @@ syntax = "proto3"; -package cmp.services.insurance.v1; +package cmp.services.claim.v1; -import "cmp/services/insurance/v1/claim_types.proto"; +import "cmp/services/claim/v1/claim_types.proto"; import "cmp/types/v1/common.proto"; import "cmp/types/v1/language.proto"; -message InsuranceGetClaimFormRequest { +message ClaimGetFormRequest { // Message header cmp.types.v1.RequestHeader header = 1; @@ -18,20 +18,20 @@ message InsuranceGetClaimFormRequest { uint64 policy_token_id = 3; } -message InsuranceGetClaimFormResponse { +message ClaimGetFormResponse { // Message header cmp.types.v1.ResponseHeader header = 1; // Claim form - cmp.services.insurance.v1.ClaimForm form = 2; + cmp.services.claim.v1.ClaimForm form = 2; } -// Insurance get claim form service definition +// Claim get claim form service definition // -// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/insurance/v1/get_claim_form.proto.dot.xs.svg) +// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/claim/v1/get_claim_form.proto.dot.xs.svg) // -// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/insurance/v1/get_claim_form.proto.dot.svg) -service InsuranceGetClaimFormService { - // Returns product info for insurance - rpc InsuranceGetClaimForm(InsuranceGetClaimFormRequest) returns (InsuranceGetClaimFormResponse); +// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/claim/v1/get_claim_form.proto.dot.svg) +service ClaimGetFormService { + // Returns product info for claim + rpc ClaimGetForm(ClaimGetFormRequest) returns (ClaimGetFormResponse); } diff --git a/proto/cmp/services/claim/v1/submit_claim_form.proto b/proto/cmp/services/claim/v1/submit_claim_form.proto new file mode 100644 index 00000000..7a17ee18 --- /dev/null +++ b/proto/cmp/services/claim/v1/submit_claim_form.proto @@ -0,0 +1,35 @@ +syntax = "proto3"; + +package cmp.services.claim.v1; + +import "cmp/services/claim/v1/claim_types.proto"; +import "cmp/types/v1/common.proto"; + +message ClaimSubmitFormRequest { + // Message header + cmp.types.v1.RequestHeader header = 1; + + // Claim form + cmp.services.claim.v1.ClaimForm form = 2; +} + +message ClaimSubmitFormResponse { + // Message header + cmp.types.v1.ResponseHeader header = 1; + + // Claim Message Response to respond with claim ids (processing, carrier and submission) and message status + cmp.services.claim.v1.ClaimMessageResponse claim_message_response = 2; + + // Claim Status + cmp.services.claim.v1.ClaimStatus status = 4; +} + +// Claim submit claim form service definition +// +// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/claim/v1/submit_claim_form.proto.dot.xs.svg) +// +// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/claim/v1/submit_claim_form.proto.dot.svg) +service ClaimSubmitFormService { + // Returns product info for claim + rpc ClaimSubmitForm(ClaimSubmitFormRequest) returns (ClaimSubmitFormResponse); +} diff --git a/proto/cmp/services/claim/v1/submit_claim_form_extra_info.proto b/proto/cmp/services/claim/v1/submit_claim_form_extra_info.proto new file mode 100644 index 00000000..506d1c03 --- /dev/null +++ b/proto/cmp/services/claim/v1/submit_claim_form_extra_info.proto @@ -0,0 +1,38 @@ +syntax = "proto3"; + +package cmp.services.claim.v1; + +import "cmp/services/claim/v1/claim_types.proto"; +import "cmp/types/v1/common.proto"; + +message ClaimSubmitFormExtraInfoRequest { + // Message header + cmp.types.v1.RequestHeader header = 1; + + // Claim ID: Submission ID, Processing ID and Carrier ID + cmp.services.claim.v1.ClaimId claim_id = 2; + + // Extra info needed + repeated cmp.services.claim.v1.ClaimableService requested_info = 3; +} + +message ClaimSubmitFormExtraInfoResponse { + // Message header + cmp.types.v1.ResponseHeader header = 1; + + // Claim Message Response to respond with claim ids (processing, carrier and submission) and message status + cmp.services.claim.v1.ClaimMessageResponse claim_message_response = 2; + + // Claim Status + cmp.services.claim.v1.ClaimStatus status = 3; +} + +// Claim submit claim form service definition +// +// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/claim/v1/submit_claim_form_extra_info.proto.dot.xs.svg) +// +// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/claim/v1/submit_claim_form_extra_info.proto.dot.svg) +service ClaimSubmitFormExtraInfoService { + // Returns product info for claim + rpc ClaimSubmitFormExtraInfo(ClaimSubmitFormExtraInfoRequest) returns (ClaimSubmitFormExtraInfoResponse); +} diff --git a/proto/cmp/services/insurance/v1/submit_claim_form.proto b/proto/cmp/services/insurance/v1/submit_claim_form.proto deleted file mode 100644 index 50730645..00000000 --- a/proto/cmp/services/insurance/v1/submit_claim_form.proto +++ /dev/null @@ -1,35 +0,0 @@ -syntax = "proto3"; - -package cmp.services.insurance.v1; - -import "cmp/services/insurance/v1/claim_types.proto"; -import "cmp/types/v1/common.proto"; - -message InsuranceSubmitClaimFormRequest { - // Message header - cmp.types.v1.RequestHeader header = 1; - - // Claim form - cmp.services.insurance.v1.ClaimForm form = 2; -} - -message InsuranceSubmitClaimFormResponse { - // Message header - cmp.types.v1.ResponseHeader header = 1; - - // Claim Message Response to respond with claim ids (processing, carrier and submission) and message status - cmp.services.insurance.v1.ClaimMessageResponse claim_message_response = 2; - - // Claim Status - cmp.services.insurance.v1.ClaimStatus status = 4; -} - -// Insurance submit claim form service definition -// -// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/insurance/v1/submit_claim_form.proto.dot.xs.svg) -// -// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/insurance/v1/submit_claim_form.proto.dot.svg) -service InsuranceSubmitClaimFormService { - // Returns product info for insurance - rpc InsuranceSubmitClaimForm(InsuranceSubmitClaimFormRequest) returns (InsuranceSubmitClaimFormResponse); -} diff --git a/proto/cmp/services/insurance/v1/submit_claim_form_extra_info.proto b/proto/cmp/services/insurance/v1/submit_claim_form_extra_info.proto deleted file mode 100644 index d0331ccd..00000000 --- a/proto/cmp/services/insurance/v1/submit_claim_form_extra_info.proto +++ /dev/null @@ -1,38 +0,0 @@ -syntax = "proto3"; - -package cmp.services.insurance.v1; - -import "cmp/services/insurance/v1/claim_types.proto"; -import "cmp/types/v1/common.proto"; - -message InsuranceSubmitClaimFormExtraInfoRequest { - // Message header - cmp.types.v1.RequestHeader header = 1; - - // Claim ID: Submission ID, Processing ID and Carrier ID - cmp.services.insurance.v1.ClaimId claim_id = 2; - - // Extra info needed - repeated cmp.services.insurance.v1.ClaimableService requested_info = 3; -} - -message InsuranceSubmitClaimFormExtraInfoResponse { - // Message header - cmp.types.v1.ResponseHeader header = 1; - - // Claim Message Response to respond with claim ids (processing, carrier and submission) and message status - cmp.services.insurance.v1.ClaimMessageResponse claim_message_response = 2; - - // Claim Status - cmp.services.insurance.v1.ClaimStatus status = 3; -} - -// Insurance submit claim form service definition -// -// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/insurance/v1/submit_claim_form_extra_info.proto.dot.xs.svg) -// -// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/insurance/v1/submit_claim_form_extra_info.proto.dot.svg) -service InsuranceSubmitClaimFormExtraInfoService { - // Returns product info for insurance - rpc InsuranceSubmitClaimFormExtraInfo(InsuranceSubmitClaimFormExtraInfoRequest) returns (InsuranceSubmitClaimFormExtraInfoResponse); -} diff --git a/proto/cmp/types/v1/company.proto b/proto/cmp/types/v1/company.proto deleted file mode 100644 index f1d5f15e..00000000 --- a/proto/cmp/types/v1/company.proto +++ /dev/null @@ -1,21 +0,0 @@ -syntax = "proto3"; - -package cmp.types.v1; - -import "cmp/types/v1/contact_info.proto"; - -// ### Company message type -// -// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/types/v1/company.proto.dot.xs.svg) -// -// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/types/v1/company.proto.dot.svg) -message Company { - // Short name of the partner. Ex: Chain4Travel - string short_name = 1; - - // Legal name of the partner. Ex: Chain4Travel AG - string legal_name = 2; - - // Contact Info - cmp.types.v1.ContactInfo contact_info = 6; -} diff --git a/proto/cmp/types/v2/company.proto b/proto/cmp/types/v3/company.proto similarity index 77% rename from proto/cmp/types/v2/company.proto rename to proto/cmp/types/v3/company.proto index 361a10c1..e125724f 100644 --- a/proto/cmp/types/v2/company.proto +++ b/proto/cmp/types/v3/company.proto @@ -1,14 +1,14 @@ syntax = "proto3"; -package cmp.types.v2; +package cmp.types.v3; import "cmp/types/v2/contact_info.proto"; // ### Company message type // -// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/types/v1/company.proto.dot.xs.svg) +// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/types/v3/company.proto.dot.xs.svg) // -// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/types/v1/company.proto.dot.svg) +// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/types/v3/company.proto.dot.svg) message Company { // Short name of the partner. Ex: Chain4Travel string short_name = 1; diff --git a/proto/cmp/types/v2/payment.proto b/proto/cmp/types/v3/payment.proto similarity index 81% rename from proto/cmp/types/v2/payment.proto rename to proto/cmp/types/v3/payment.proto index f87c0776..635f1cca 100644 --- a/proto/cmp/types/v2/payment.proto +++ b/proto/cmp/types/v3/payment.proto @@ -1,15 +1,15 @@ syntax = "proto3"; -package cmp.types.v2; +package cmp.types.v3; import "cmp/types/v1/credit_card.proto"; // Additional payment info message with currently only a single field of // `CreditCard` message type. // -// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/types/v2/payment.proto.dot.xs.svg) +// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/types/v3/payment.proto.dot.xs.svg) // -// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/types/v2/payment.proto.dot.svg) +// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/types/v3/payment.proto.dot.svg) message AdditionalPaymentInfo { cmp.types.v1.CreditCard credit_card = 1; } From 7bfe8483a25f2d317e0e4ce325a613f07d9fcb43 Mon Sep 17 00:00:00 2001 From: Mohamed Elmoslemany Date: Tue, 22 Oct 2024 12:45:54 +0200 Subject: [PATCH 12/34] fix comments --- proto/cmp/types/v3/seat_map.proto | 4 ++-- proto/cmp/types/v3/traveller.proto | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/proto/cmp/types/v3/seat_map.proto b/proto/cmp/types/v3/seat_map.proto index c5518640..6ccfebd9 100644 --- a/proto/cmp/types/v3/seat_map.proto +++ b/proto/cmp/types/v3/seat_map.proto @@ -75,9 +75,9 @@ message Section { // of seating within a venue. This message provides a comprehensive overview of the // seating arrangement, including sections, images, and localized descriptions. // -// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/types/v2/seat_map.proto.dot.xs.svg) +// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/types/v3/seat_map.proto.dot.xs.svg) // -// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/types/v2/seat_map.proto.dot.svg) +// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/types/v3/seat_map.proto.dot.svg) message SeatMap { // Unique identifier for the seat map string id = 1; diff --git a/proto/cmp/types/v3/traveller.proto b/proto/cmp/types/v3/traveller.proto index 0e3b86a8..3f060db3 100644 --- a/proto/cmp/types/v3/traveller.proto +++ b/proto/cmp/types/v3/traveller.proto @@ -9,9 +9,9 @@ import "cmp/types/v2/country.proto"; // Traveller // -// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/types/v2/traveller.proto.dot.xs.svg) +// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/types/v3/traveller.proto.dot.xs.svg) // -// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/types/v2/traveller.proto.dot.svg) +// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/types/v3/traveller.proto.dot.svg) message BasicTraveller { // Guest number, the lowest number is the lead-pax. This ID is also used for // referencing services linked to specific participants, like baggage. From 0169582815b4a5036880f91b43bd649e5ae93eab Mon Sep 17 00:00:00 2001 From: Mohamed Elmoslemany Date: Tue, 22 Oct 2024 12:54:13 +0200 Subject: [PATCH 13/34] fix version comment in diagram urls --- proto/cmp/services/accommodation/v3/info.proto | 4 ++-- proto/cmp/services/accommodation/v3/list.proto | 4 ++-- proto/cmp/services/accommodation/v3/property_types.proto | 4 ++-- proto/cmp/services/accommodation/v3/search.proto | 4 ++-- proto/cmp/services/activity/v3/activity_types.proto | 4 ++-- proto/cmp/services/activity/v3/info.proto | 4 ++-- proto/cmp/services/activity/v3/list.proto | 4 ++-- proto/cmp/services/activity/v3/search.proto | 4 ++-- proto/cmp/services/activity/v3/search_result_types.proto | 4 ++-- proto/cmp/services/book/v3/mint.proto | 4 ++-- proto/cmp/services/book/v3/validate.proto | 4 ++-- proto/cmp/services/insurance/v2/info.proto | 4 ++-- proto/cmp/services/insurance/v2/insurance_types.proto | 4 ++-- proto/cmp/services/insurance/v2/list.proto | 4 ++-- proto/cmp/services/insurance/v2/search.proto | 4 ++-- proto/cmp/services/insurance/v2/search_parameters_types.proto | 4 ++-- proto/cmp/services/seat_map/v3/availability.proto | 4 ++-- proto/cmp/services/seat_map/v3/seat_map.proto | 4 ++-- proto/cmp/services/transport/v3/search_query_types.proto | 4 ++-- 19 files changed, 38 insertions(+), 38 deletions(-) diff --git a/proto/cmp/services/accommodation/v3/info.proto b/proto/cmp/services/accommodation/v3/info.proto index cf2afc35..ac9cd973 100644 --- a/proto/cmp/services/accommodation/v3/info.proto +++ b/proto/cmp/services/accommodation/v3/info.proto @@ -36,9 +36,9 @@ message AccommodationProductInfoResponse { // Accommodation product info service definition // -// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/accommodation/v2/info.proto.dot.xs.svg) +// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/accommodation/v3/info.proto.dot.xs.svg) // -// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/accommodation/v2/info.proto.dot.svg) +// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/accommodation/v3/info.proto.dot.svg) service AccommodationProductInfoService { // Returns product list for accommodation (properties) rpc AccommodationProductInfo(AccommodationProductInfoRequest) returns (AccommodationProductInfoResponse); diff --git a/proto/cmp/services/accommodation/v3/list.proto b/proto/cmp/services/accommodation/v3/list.proto index adf410c9..ea10f146 100644 --- a/proto/cmp/services/accommodation/v3/list.proto +++ b/proto/cmp/services/accommodation/v3/list.proto @@ -28,9 +28,9 @@ message AccommodationProductListResponse { // Accommodation product list service definition // -// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/accommodation/v2/list.proto.dot.xs.svg) +// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/accommodation/v3/list.proto.dot.xs.svg) // -// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/accommodation/v2/list.proto.dot.svg) +// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/accommodation/v3/list.proto.dot.svg) service AccommodationProductListService { // Returns product list for accommodation (properties) rpc AccommodationProductList(AccommodationProductListRequest) returns (AccommodationProductListResponse); diff --git a/proto/cmp/services/accommodation/v3/property_types.proto b/proto/cmp/services/accommodation/v3/property_types.proto index f43b35cd..48023587 100644 --- a/proto/cmp/services/accommodation/v3/property_types.proto +++ b/proto/cmp/services/accommodation/v3/property_types.proto @@ -17,9 +17,9 @@ import "google/protobuf/timestamp.proto"; // Represents property info for an accommodation product // -// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/accommodation/v2/property_types.proto.dot.xs.svg) +// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/accommodation/v3/property_types.proto.dot.xs.svg) // -// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/accommodation/v2/property_types.proto.dot.svg) +// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/accommodation/v3/property_types.proto.dot.svg) message Property { // Ex: "2023-08-28T12:03:50", specifying when the static data of a product was // last updated diff --git a/proto/cmp/services/accommodation/v3/search.proto b/proto/cmp/services/accommodation/v3/search.proto index 6d4ae481..6ba36e21 100644 --- a/proto/cmp/services/accommodation/v3/search.proto +++ b/proto/cmp/services/accommodation/v3/search.proto @@ -114,9 +114,9 @@ message AccommodationSearchResponse { // Service definition for Accommodation search // -// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/accommodation/v2/search.proto.dot.xs.svg) +// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/accommodation/v3/search.proto.dot.xs.svg) // -// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/accommodation/v2/search.proto.dot.svg) +// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/accommodation/v3/search.proto.dot.svg) service AccommodationSearchService { // Accommodation Search method rpc AccommodationSearch(AccommodationSearchRequest) returns (AccommodationSearchResponse); diff --git a/proto/cmp/services/activity/v3/activity_types.proto b/proto/cmp/services/activity/v3/activity_types.proto index 3f76dca6..eeadd406 100644 --- a/proto/cmp/services/activity/v3/activity_types.proto +++ b/proto/cmp/services/activity/v3/activity_types.proto @@ -18,9 +18,9 @@ import "google/protobuf/timestamp.proto"; // Activity // -// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/activity/v2/activity_types.proto.dot.xs.svg) +// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/activity/v3/activity_types.proto.dot.xs.svg) // -// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/activity/v2/activity_types.proto.dot.svg) +// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/activity/v3/activity_types.proto.dot.svg) message Activity { // Context for Inventory system concepts that need to be included in an info // response, like an OwnerCode, PTC_OfferParameters, Tax codes, Disclosure RefID, diff --git a/proto/cmp/services/activity/v3/info.proto b/proto/cmp/services/activity/v3/info.proto index 808f3e1d..c9c926d0 100644 --- a/proto/cmp/services/activity/v3/info.proto +++ b/proto/cmp/services/activity/v3/info.proto @@ -38,9 +38,9 @@ message ActivityProductInfoResponse { // Activity product info service definition // -// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/activity/v2/info.proto.dot.xs.svg) +// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/activity/v3/info.proto.dot.xs.svg) // -// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/activity/v2/info.proto.dot.svg) +// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/activity/v3/info.proto.dot.svg) service ActivityProductInfoService { // Returns product list for activity rpc ActivityProductInfo(ActivityProductInfoRequest) returns (ActivityProductInfoResponse); diff --git a/proto/cmp/services/activity/v3/list.proto b/proto/cmp/services/activity/v3/list.proto index 1a8bfd96..e67c121d 100644 --- a/proto/cmp/services/activity/v3/list.proto +++ b/proto/cmp/services/activity/v3/list.proto @@ -28,9 +28,9 @@ message ActivityProductListResponse { // This service is used to get a product list for activities. // -// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/activity/v2/list.proto.dot.xs.svg) +// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/activity/v3/list.proto.dot.xs.svg) // -// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/activity/v2/list.proto.dot.svg) +// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/activity/v3/list.proto.dot.svg) service ActivityProductListService { // Gets an optional `modified_after` date and returns a product list. rpc ActivityProductList(ActivityProductListRequest) returns (ActivityProductListResponse); diff --git a/proto/cmp/services/activity/v3/search.proto b/proto/cmp/services/activity/v3/search.proto index f812740a..84866e0c 100644 --- a/proto/cmp/services/activity/v3/search.proto +++ b/proto/cmp/services/activity/v3/search.proto @@ -151,9 +151,9 @@ message ActivitySearchResponse { // // Takes `ActivitySearchRequest` message type and returns `ActivitySearchResponse` message type. // -// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/activity/v2/search.proto.dot.xs.svg) +// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/activity/v3/search.proto.dot.xs.svg) // -// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/activity/v2/search.proto.dot.svg) +// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/activity/v3/search.proto.dot.svg) service ActivitySearchService { rpc ActivitySearch(ActivitySearchRequest) returns (ActivitySearchResponse); } diff --git a/proto/cmp/services/activity/v3/search_result_types.proto b/proto/cmp/services/activity/v3/search_result_types.proto index 3d6a8752..1b1d6951 100644 --- a/proto/cmp/services/activity/v3/search_result_types.proto +++ b/proto/cmp/services/activity/v3/search_result_types.proto @@ -10,9 +10,9 @@ import "cmp/types/v2/price.proto"; // This type represents a search result and is used in the `ActivitySearchResponse` // message. // -// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/activity/v2/search_result_types.proto.dot.xs.svg) +// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/activity/v3/search_result_types.proto.dot.xs.svg) // -// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/activity/v2/search_result_types.proto.dot.svg) +// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/activity/v3/search_result_types.proto.dot.svg) message ActivitySearchResult { // Option ID for the search option. This is an increasing number starting at 0 and // increasing by 1 for every search result. diff --git a/proto/cmp/services/book/v3/mint.proto b/proto/cmp/services/book/v3/mint.proto index d62aad0c..7316a70b 100644 --- a/proto/cmp/services/book/v3/mint.proto +++ b/proto/cmp/services/book/v3/mint.proto @@ -96,9 +96,9 @@ message MintResponse { string buy_transaction_id = 11; } -// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/book/v2/mint.proto.dot.xs.svg) +// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/book/v3/mint.proto.dot.xs.svg) // -// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/book/v2/mint.proto.dot.svg) +// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/book/v3/mint.proto.dot.svg) service MintService { rpc Mint(MintRequest) returns (MintResponse); } diff --git a/proto/cmp/services/book/v3/validate.proto b/proto/cmp/services/book/v3/validate.proto index cb488543..8d10287d 100644 --- a/proto/cmp/services/book/v3/validate.proto +++ b/proto/cmp/services/book/v3/validate.proto @@ -45,9 +45,9 @@ message ValidationObject { } } -// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/book/v2/validate.proto.dot.xs.svg) +// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/book/v3/validate.proto.dot.xs.svg) // -// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/book/v2/validate.proto.dot.svg) +// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/book/v3/validate.proto.dot.svg) service ValidationService { rpc Validation(ValidationRequest) returns (ValidationResponse); } diff --git a/proto/cmp/services/insurance/v2/info.proto b/proto/cmp/services/insurance/v2/info.proto index f408e141..03dcf5fc 100644 --- a/proto/cmp/services/insurance/v2/info.proto +++ b/proto/cmp/services/insurance/v2/info.proto @@ -38,9 +38,9 @@ message InsuranceProductInfoResponse { // Insurance product info service definition // -// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/insurance/v1/info.proto.dot.xs.svg) +// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/insurance/v2/info.proto.dot.xs.svg) // -// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/insurance/v1/info.proto.dot.svg) +// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/insurance/v2/info.proto.dot.svg) service InsuranceProductInfoService { // Returns product info for insurance rpc InsuranceProductInfo(InsuranceProductInfoRequest) returns (InsuranceProductInfoResponse); diff --git a/proto/cmp/services/insurance/v2/insurance_types.proto b/proto/cmp/services/insurance/v2/insurance_types.proto index fd34d499..d57fc001 100644 --- a/proto/cmp/services/insurance/v2/insurance_types.proto +++ b/proto/cmp/services/insurance/v2/insurance_types.proto @@ -12,9 +12,9 @@ import "google/protobuf/timestamp.proto"; // Insurance // -// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/insurance/v1/insurance_types.proto.dot.xs.svg) +// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/insurance/v2/insurance_types.proto.dot.xs.svg) // -// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/insurance/v1/insurance_types.proto.dot.svg) +// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/insurance/v2/insurance_types.proto.dot.svg) message Insurance { // Context for Inventory system concepts that need to be included in an info // response, like an OwnerCode, PTC_OfferParameters, Tax codes, Disclosure RefID, diff --git a/proto/cmp/services/insurance/v2/list.proto b/proto/cmp/services/insurance/v2/list.proto index fca5ef72..1daa8950 100644 --- a/proto/cmp/services/insurance/v2/list.proto +++ b/proto/cmp/services/insurance/v2/list.proto @@ -28,9 +28,9 @@ message InsuranceProductListResponse { // This service is used to get a product list for insurances. // -// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/insurance/v1/list.proto.dot.xs.svg) +// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/insurance/v2/list.proto.dot.xs.svg) // -// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/insurance/v1/list.proto.dot.svg) +// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/insurance/v2/list.proto.dot.svg) service InsuranceProductListService { // Gets an optional `modified_after` date and returns a product list. rpc InsuranceProductList(InsuranceProductListRequest) returns (InsuranceProductListResponse); diff --git a/proto/cmp/services/insurance/v2/search.proto b/proto/cmp/services/insurance/v2/search.proto index c2bb63e2..4a302b99 100644 --- a/proto/cmp/services/insurance/v2/search.proto +++ b/proto/cmp/services/insurance/v2/search.proto @@ -82,9 +82,9 @@ message InsuranceSearchResponse { // Service definition for Insurance search // -// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/insurance/v1/search.proto.dot.xs.svg) +// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/insurance/v2/search.proto.dot.xs.svg) // -// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/insurance/v1/search.proto.dot.svg) +// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/insurance/v2/search.proto.dot.svg) service InsuranceSearchService { // Insurance Search method rpc InsuranceSearch(InsuranceSearchRequest) returns (InsuranceSearchResponse); diff --git a/proto/cmp/services/insurance/v2/search_parameters_types.proto b/proto/cmp/services/insurance/v2/search_parameters_types.proto index 2d85705d..672bf677 100644 --- a/proto/cmp/services/insurance/v2/search_parameters_types.proto +++ b/proto/cmp/services/insurance/v2/search_parameters_types.proto @@ -12,9 +12,9 @@ import "cmp/types/v3/traveller.proto"; // This type is used in search requests for parameters like insured booking, network, ... etc // -// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/insurance/v1/search_parameters_types.proto.dot.xs.svg) +// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/insurance/v2/search_parameters_types.proto.dot.xs.svg) // -// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/insurance/v1/search_parameters_types.proto.dot.svg) +// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/insurance/v2/search_parameters_types.proto.dot.svg) message InsuranceSearchParameters { // Product code list // Here a list of property codes would be used that could be of different types diff --git a/proto/cmp/services/seat_map/v3/availability.proto b/proto/cmp/services/seat_map/v3/availability.proto index ed7eb608..a8a47d18 100644 --- a/proto/cmp/services/seat_map/v3/availability.proto +++ b/proto/cmp/services/seat_map/v3/availability.proto @@ -49,9 +49,9 @@ message SeatMapAvailabilityResponse { // // Service is used to request the seat map availability data for a given map ID // -// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/seat_map/v2/availability.proto.dot.xs.svg) +// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/seat_map/v3/availability.proto.dot.xs.svg) // -// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/seat_map/v2/availability.proto.dot.svg) +// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/seat_map/v3/availability.proto.dot.svg) service SeatMapAvailabilityService { // Get seat map availability data // diff --git a/proto/cmp/services/seat_map/v3/seat_map.proto b/proto/cmp/services/seat_map/v3/seat_map.proto index 490e891a..0db247df 100644 --- a/proto/cmp/services/seat_map/v3/seat_map.proto +++ b/proto/cmp/services/seat_map/v3/seat_map.proto @@ -42,9 +42,9 @@ message SeatMapResponse { // Service for requesting seat map data for a given map ID // -// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/seat_map/v2/seat_map.proto.dot.xs.svg) +// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/seat_map/v3/seat_map.proto.dot.xs.svg) // -// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/seat_map/v2/seat_map.proto.dot.svg) +// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/seat_map/v3/seat_map.proto.dot.svg) service SeatMapService { // Get seat map data // diff --git a/proto/cmp/services/transport/v3/search_query_types.proto b/proto/cmp/services/transport/v3/search_query_types.proto index 3bf25db9..d3bc3e36 100644 --- a/proto/cmp/services/transport/v3/search_query_types.proto +++ b/proto/cmp/services/transport/v3/search_query_types.proto @@ -15,9 +15,9 @@ import "cmp/types/v3/traveller.proto"; // - 2 trips in trips: Roundtrip journey from PMI to BCN and then BCN to PMI. // - 3 trips in trips: PMI->BCN + BCN->BER + BER->PMI (1 two legged flight (connection) and 1 direct (return) flight) // -// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/transport/v2/search_query_types.proto.dot.xs.svg) +// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/transport/v3/search_query_types.proto.dot.xs.svg) // [Open Message -// Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/transport/v2/search_query_types.proto.dot.svg) +// Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/transport/v3/search_query_types.proto.dot.svg) message TransportSearchQuery { // ID int32 query_id = 1; From c062c035fef919a707311a99772909664a6195c3 Mon Sep 17 00:00:00 2001 From: Sam Jaarsma C4T Date: Wed, 23 Oct 2024 16:54:12 +0200 Subject: [PATCH 14/34] adding introduction chapter for the claim service --- .../services/claim/v1/get_claim_form.proto | 72 +++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/proto/cmp/services/claim/v1/get_claim_form.proto b/proto/cmp/services/claim/v1/get_claim_form.proto index bd6142e8..544438d3 100644 --- a/proto/cmp/services/claim/v1/get_claim_form.proto +++ b/proto/cmp/services/claim/v1/get_claim_form.proto @@ -1,5 +1,77 @@ syntax = "proto3"; +# Insurance Claims Processing System +## Technical Documentation + +### Overview +This documentation outlines the technical specifications and workflows for the insurance claims processing system, focusing on the interaction between Distributors and Suppliers through standardized message types. The system supports various insurance products including CFAR (Cancel For Any Reason), travel medical insurance, and baggage coverage. + +### Message Types +The system implements four primary message types for claims processing: + +1. **InsuranceGetClaimForm** + - Direction: Distributor → Supplier + - Purpose: Retrieves claim form for a specific policy + - Trigger: Initial claim request from end-customer + +2. **InsuranceSubmitClaimForm** + - Direction: Distributor → Supplier + - Purpose: Submits claim data including: + - Booking NFT/Data + - Required documentation + - Claim registration details + - Note: For operational changes, updated booking details must be re-attached + +3. **InsuranceSettlement** + - Direction: Supplier → Distributor + - Purpose: Provides claim status updates + - Features: + - Push-based notification system + - Supports iterative information requests + - Handles multiple settlement statuses + +Process flow diagram: + + + +### Implementation Requirements + +#### Distributor Requirements +1. Must implement and enable InsuranceSettlement service in their profile +2. System must be capable of: + - Processing InsuranceSettlementRQ messages + - Communicating status updates to end-consumers + - Handling document submission and resubmission + - Supporting uniform user experience across insurance providers + +#### Settlement Processing +- Supports multiple settlement statuses: + - "received" (initial acknowledgment) + - "more info required" (with specific documentation requests) + - "denied" or "accepted" + - "paid-out" (final status) + +### Payment Processing + +#### Payment Methods +The system supports two primary payment channels: +1. Direct bank transfer to provided IBAN +2. Blockchain transaction on Camino network + - Supports Camino wallet addresses + - Integration with Partner Plugin for blockchain transactions + +#### Currency Handling +- Supports multiple currency types: + - Fiat currencies + - Stable cryptocurrencies + - Volatile cryptocurrencies +- Payment processing in original purchase currency + +### Security and Compliance +- Implements fraud prevention measures through document verification +- Supports policy-specific document submission +- Maintains audit trail of all claim-related communications + package cmp.services.claim.v1; import "cmp/services/claim/v1/claim_types.proto"; From e808075fdb76720c95fe5083bc13580fbcff8c9c Mon Sep 17 00:00:00 2001 From: Sam Jaarsma C4T Date: Wed, 23 Oct 2024 17:13:03 +0200 Subject: [PATCH 15/34] added claim process diagram --- images/claim_process_workflow.png | Bin 0 -> 273552 bytes .../cmp/services/claim/v1/get_claim_form.proto | 7 +++++-- 2 files changed, 5 insertions(+), 2 deletions(-) create mode 100644 images/claim_process_workflow.png diff --git a/images/claim_process_workflow.png b/images/claim_process_workflow.png new file mode 100644 index 0000000000000000000000000000000000000000..c8555ed99a06fccd74b65975867ffb9eae50e4f8 GIT binary patch literal 273552 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%0DhicVk5Zv# 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%0D204R*Tm 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

9I?&|Y45754?H2KX)+-iR>Dvy1TEK!V4 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

v?a{PO$h0+8@_q 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

y;b(g8JA-7Z5VCTa|?IDC_o;$o<@?>!iKxwlV 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 z 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 literal 0 HcmV?d00001 diff --git a/proto/cmp/services/claim/v1/get_claim_form.proto b/proto/cmp/services/claim/v1/get_claim_form.proto index 544438d3..14866f5b 100644 --- a/proto/cmp/services/claim/v1/get_claim_form.proto +++ b/proto/cmp/services/claim/v1/get_claim_form.proto @@ -4,7 +4,7 @@ syntax = "proto3"; ## Technical Documentation ### Overview -This documentation outlines the technical specifications and workflows for the insurance claims processing system, focusing on the interaction between Distributors and Suppliers through standardized message types. The system supports various insurance products including CFAR (Cancel For Any Reason), travel medical insurance, and baggage coverage. +This documentation outlines the technical specifications and workflows for the insurance claims processing service, focusing on the interaction between Distributors and Suppliers through standardized message types. The system supports various insurance products including CFAR (Cancel For Any Reason), travel medical insurance, and baggage coverage. ### Message Types The system implements four primary message types for claims processing: @@ -32,7 +32,10 @@ The system implements four primary message types for claims processing: Process flow diagram: - +

+This image displays the claim process workflow +
Fig.1: claim process
+
### Implementation Requirements From 6675f761695f7d5d90fbdc9cd22b4f7d192e39d8 Mon Sep 17 00:00:00 2001 From: Sam Jaarsma C4T Date: Wed, 23 Oct 2024 17:35:02 +0200 Subject: [PATCH 16/34] move images to assets folder --- .../images}/claim_process_workflow.png | Bin .../services/claim/v1/get_claim_form.proto | 150 +++++++++--------- 2 files changed, 75 insertions(+), 75 deletions(-) rename {images => assets/images}/claim_process_workflow.png (100%) diff --git a/images/claim_process_workflow.png b/assets/images/claim_process_workflow.png similarity index 100% rename from images/claim_process_workflow.png rename to assets/images/claim_process_workflow.png diff --git a/proto/cmp/services/claim/v1/get_claim_form.proto b/proto/cmp/services/claim/v1/get_claim_form.proto index 14866f5b..e1b2c64d 100644 --- a/proto/cmp/services/claim/v1/get_claim_form.proto +++ b/proto/cmp/services/claim/v1/get_claim_form.proto @@ -1,80 +1,80 @@ syntax = "proto3"; -# Insurance Claims Processing System -## Technical Documentation - -### Overview -This documentation outlines the technical specifications and workflows for the insurance claims processing service, focusing on the interaction between Distributors and Suppliers through standardized message types. The system supports various insurance products including CFAR (Cancel For Any Reason), travel medical insurance, and baggage coverage. - -### Message Types -The system implements four primary message types for claims processing: - -1. **InsuranceGetClaimForm** - - Direction: Distributor → Supplier - - Purpose: Retrieves claim form for a specific policy - - Trigger: Initial claim request from end-customer - -2. **InsuranceSubmitClaimForm** - - Direction: Distributor → Supplier - - Purpose: Submits claim data including: - - Booking NFT/Data - - Required documentation - - Claim registration details - - Note: For operational changes, updated booking details must be re-attached - -3. **InsuranceSettlement** - - Direction: Supplier → Distributor - - Purpose: Provides claim status updates - - Features: - - Push-based notification system - - Supports iterative information requests - - Handles multiple settlement statuses - -Process flow diagram: - -
-This image displays the claim process workflow -
Fig.1: claim process
-
- -### Implementation Requirements - -#### Distributor Requirements -1. Must implement and enable InsuranceSettlement service in their profile -2. System must be capable of: - - Processing InsuranceSettlementRQ messages - - Communicating status updates to end-consumers - - Handling document submission and resubmission - - Supporting uniform user experience across insurance providers - -#### Settlement Processing -- Supports multiple settlement statuses: - - "received" (initial acknowledgment) - - "more info required" (with specific documentation requests) - - "denied" or "accepted" - - "paid-out" (final status) - -### Payment Processing - -#### Payment Methods -The system supports two primary payment channels: -1. Direct bank transfer to provided IBAN -2. Blockchain transaction on Camino network - - Supports Camino wallet addresses - - Integration with Partner Plugin for blockchain transactions - -#### Currency Handling -- Supports multiple currency types: - - Fiat currencies - - Stable cryptocurrencies - - Volatile cryptocurrencies -- Payment processing in original purchase currency - -### Security and Compliance -- Implements fraud prevention measures through document verification -- Supports policy-specific document submission -- Maintains audit trail of all claim-related communications - +// # Insurance Claims Processing System +// ## Technical Documentation +// +// ### Overview +// This documentation outlines the technical specifications and workflows for the insurance claims processing service, focusing on the interaction between Distributors and Suppliers through standardized message types. The system supports various insurance products including CFAR (Cancel For Any Reason), travel medical insurance, and baggage coverage. +// +// ### Message Types +// The system implements four primary message types for claims processing: +// +// 1. **InsuranceGetClaimForm** +// - Direction: Distributor → Supplier +// - Purpose: Retrieves claim form for a specific policy +// - Trigger: Initial claim request from end-customer +// +// 2. **InsuranceSubmitClaimForm** +// - Direction: Distributor → Supplier +// - Purpose: Submits claim data including: +// - Booking NFT/Data +// - Required documentation +// - Claim registration details +// - Note: For operational changes, updated booking details must be re-attached +// +// 3. **InsuranceSettlement** +// - Direction: Supplier → Distributor +// - Purpose: Provides claim status updates +// - Features: +// - Push-based notification system +// - Supports iterative information requests +// - Handles multiple settlement statuses +// +// Process flow diagram: +// +//
+// This image displays the claim process workflow +//
Fig.1: claim process
+//
+// +// ### Implementation Requirements +// +// #### Distributor Requirements +// 1. Must implement and enable InsuranceSettlement service in their profile +// 2. System must be capable of: +// - Processing InsuranceSettlementRQ messages +// - Communicating status updates to end-consumers +// - Handling document submission and resubmission +// - Supporting uniform user experience across insurance providers +// +// #### Settlement Processing +// - Supports multiple settlement statuses: +// - "received" (initial acknowledgment) +// - "more info required" (with specific documentation requests) +// - "denied" or "accepted" +// - "paid-out" (final status) +// +// ### Payment Processing +// +// #### Payment Methods +// The system supports two primary payment channels: +// 1. Direct bank transfer to provided IBAN +// 2. Blockchain transaction on Camino network +// - Supports Camino wallet addresses +// - Integration with Partner Plugin for blockchain transactions +// +// #### Currency Handling +// - Supports multiple currency types: +// - Fiat currencies +// - Stable cryptocurrencies +// - Volatile cryptocurrencies +// - Payment processing in original purchase currency +// +// ### Security and Compliance +// - Implements fraud prevention measures through document verification +// - Supports policy-specific document submission +// - Maintains audit trail of all claim-related communications +// package cmp.services.claim.v1; import "cmp/services/claim/v1/claim_types.proto"; From 94ae28bc9da2c2fd040950cda857b0db6e3cde52 Mon Sep 17 00:00:00 2001 From: Sam Jaarsma C4T Date: Wed, 23 Oct 2024 17:45:19 +0200 Subject: [PATCH 17/34] removed the claim explanation from insurances as it is now in claim --- proto/cmp/services/insurance/v2/search.proto | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/proto/cmp/services/insurance/v2/search.proto b/proto/cmp/services/insurance/v2/search.proto index 4a302b99..afbc0dab 100644 --- a/proto/cmp/services/insurance/v2/search.proto +++ b/proto/cmp/services/insurance/v2/search.proto @@ -11,12 +11,9 @@ syntax = "proto3"; // does not contain any static information and consists of the InsuranceSearch message, followed // by the generic Validate and Mint messages. // -// - making an insurance claim: this is a special workflow, only used in the Insurance Services. -// A claim form is requested based on the insurance policy purchased. This "template" is then -// filled with the required information, the necessary documents are attached, and the claim is -// submitted to the supplier. The supplier pushes a status upon change to the distributor. -// It might be possible that further information is required or that an off-line conversation is taking place. -// This finally leads to an acceptance and pay-out or a denial. +// - making an insurance claim: this is a special workflow and further explained in the claim service +// +// further below you'll find the technical details of the insurance selling service. package cmp.services.insurance.v2; import "cmp/services/insurance/v1/search_result_types.proto"; From cf9ab7d0532ab3ce2accb40d25e9c1f6314f42c9 Mon Sep 17 00:00:00 2001 From: Mohamed Elmoslemany Date: Thu, 24 Oct 2024 09:09:36 +0200 Subject: [PATCH 18/34] upload assets --- .github/workflows/ci.yaml | 5 +++++ proto/cmp/services/claim/v1/get_claim_form.proto | 2 +- scripts/replace_url.sh | 6 ++++++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 90a4b007..8231422c 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -181,3 +181,8 @@ jobs: run: | # '-J' options is to set Content-Encoding to gzip gsutil -m rsync -J -R -d gen/diagrams gs://docs-cmp-files/diagrams/${{ github.ref_name }} + + - name: Upload Assets + run: | + # '-J' options is to set Content-Encoding to gzip + gsutil -m rsync -J -R -d assets gs://docs-cmp-files/assets/${{ github.ref_name }} diff --git a/proto/cmp/services/claim/v1/get_claim_form.proto b/proto/cmp/services/claim/v1/get_claim_form.proto index e1b2c64d..850ca9bf 100644 --- a/proto/cmp/services/claim/v1/get_claim_form.proto +++ b/proto/cmp/services/claim/v1/get_claim_form.proto @@ -33,7 +33,7 @@ syntax = "proto3"; // Process flow diagram: // //
-// This image displays the claim process workflow +// This image displays the claim process workflow //
Fig.1: claim process
//
// diff --git a/scripts/replace_url.sh b/scripts/replace_url.sh index 83753fc6..e588b67c 100755 --- a/scripts/replace_url.sh +++ b/scripts/replace_url.sh @@ -10,6 +10,8 @@ file_path=$1 branch=$2 old_url="https:\/\/storage.googleapis.com\/docs-cmp-files\/diagrams" new_url="https:\/\/storage.googleapis.com\/docs-cmp-files\/diagrams\/${branch}" +old_assets_url="https:\/\/storage.googleapis.com\/docs-cmp-files\/assets" +new_assets_url="https:\/\/storage.googleapis.com\/docs-cmp-files\/assets\/${branch}" # Check if the file exists if [ ! -f "$file_path" ]; then @@ -20,4 +22,8 @@ fi # Replace the URL sed -i "s/$old_url/$new_url/g" "$file_path" +# Replace the assets URL +sed -i "s/$old_assets_url/$new_assets_url/g" "$file_path" + echo "URL updated successfully with ${branch} in $file_path" + From b53e9bbcd3672f619451692dfe907172d3dbc2a2 Mon Sep 17 00:00:00 2001 From: Mohamed Elmoslemany Date: Tue, 29 Oct 2024 12:07:52 +0100 Subject: [PATCH 19/34] PR comments --- proto/cmp/services/claim/v1/get_claim_form.proto | 4 ++++ proto/cmp/services/insurance/v2/insurance_types.proto | 8 ++++++-- proto/cmp/types/v3/company.proto | 2 +- proto/cmp/types/v3/payment.proto | 1 + proto/cmp/types/v3/traveller.proto | 9 ++++++--- 5 files changed, 18 insertions(+), 6 deletions(-) diff --git a/proto/cmp/services/claim/v1/get_claim_form.proto b/proto/cmp/services/claim/v1/get_claim_form.proto index 850ca9bf..3bff436c 100644 --- a/proto/cmp/services/claim/v1/get_claim_form.proto +++ b/proto/cmp/services/claim/v1/get_claim_form.proto @@ -91,6 +91,10 @@ message ClaimGetFormRequest { // Booking token ID for the policy. You get it after minting an Insurance policy. This is not the booking token of the trip. uint64 policy_token_id = 3; + + // TODO: If a form needs to be requested for a flight delay, cancellation, or baggage damage, is there a different reference + // that should be used? For missing baggage, you likely have a report filed at the airport that includes a reference + // (you can add the report itself later in the submit_claim_form message). Could this be a type of claim? } message ClaimGetFormResponse { diff --git a/proto/cmp/services/insurance/v2/insurance_types.proto b/proto/cmp/services/insurance/v2/insurance_types.proto index d57fc001..fa3f6f95 100644 --- a/proto/cmp/services/insurance/v2/insurance_types.proto +++ b/proto/cmp/services/insurance/v2/insurance_types.proto @@ -37,7 +37,9 @@ message Policy { string description = 2; // Ex: "2023-08-28T12:03:50", specifying when the static data of a product was - // last updated + // last updated. If the Timestamp is after the moment the last time the Policy was updated, + // The InsuranceProductInfo message type must be used to update all policy details in the static + // data on the Distributor side. // // Timestamps may be used for both off-chain and on-chain operations. // For on-chain operations, only seconds are supported, and nanoseconds @@ -46,7 +48,9 @@ message Policy { } message PolicyExtendedInfo { - // Insurance Policy dynamic info + // Insurance Policy static info. These details are only pulled after the InsuranceProductList + // was pulled and the Timestamp in the response indicated that the policy was updated since + // the last time the list was pulled. cmp.services.insurance.v2.Policy policy = 1; // Carrier code, this provider is the holder of the policy and not a supplier to the Camino Network diff --git a/proto/cmp/types/v3/company.proto b/proto/cmp/types/v3/company.proto index e125724f..534f34e9 100644 --- a/proto/cmp/types/v3/company.proto +++ b/proto/cmp/types/v3/company.proto @@ -17,5 +17,5 @@ message Company { string legal_name = 2; // Contact Info - cmp.types.v2.ContactInfo contact_info = 6; + cmp.types.v2.ContactInfo contact_info = 3; } diff --git a/proto/cmp/types/v3/payment.proto b/proto/cmp/types/v3/payment.proto index 635f1cca..9dc8c089 100644 --- a/proto/cmp/types/v3/payment.proto +++ b/proto/cmp/types/v3/payment.proto @@ -22,4 +22,5 @@ enum PaymentType { PAYMENT_TYPE_BANK_TRANSFER = 3; PAYMENT_TYPE_CREDITCARD = 4; PAYMENT_TYPE_PAYPAL = 5; + PAYMENT_TYPE_CRYPTO_CARD = 6; } diff --git a/proto/cmp/types/v3/traveller.proto b/proto/cmp/types/v3/traveller.proto index 3f060db3..eb92406e 100644 --- a/proto/cmp/types/v3/traveller.proto +++ b/proto/cmp/types/v3/traveller.proto @@ -83,11 +83,14 @@ message TravellerExtraInfo { // Traveller cmp.types.v3.BasicTraveller basic_traveller = 1; - // Traveller name - string name = 2; + // Traveller first names + repeated string first_names = 2; + + // Traveller surnames + repeated string surnames = 3; // Relationship with the traveller - cmp.types.v3.TravellerRelationship relationship_to_traveller = 3; + cmp.types.v3.TravellerRelationship relationship_to_traveller = 4; } // Traveller relationship From bffe260308b10880ac8bee85c73392e9db4d7d13 Mon Sep 17 00:00:00 2001 From: Mohamed Elmoslemany Date: Wed, 6 Nov 2024 10:39:15 +0100 Subject: [PATCH 20/34] put claim services in one file --- .../claim/v1/claim_settlement_decision.proto | 10 -- .../v1/claim_settlement_extra_info.proto | 10 -- .../services/claim/v1/get_claim_form.proto | 85 -------------- proto/cmp/services/claim/v1/services.proto | 106 ++++++++++++++++++ .../services/claim/v1/submit_claim_form.proto | 10 -- .../v1/submit_claim_form_extra_info.proto | 10 -- 6 files changed, 106 insertions(+), 125 deletions(-) create mode 100644 proto/cmp/services/claim/v1/services.proto diff --git a/proto/cmp/services/claim/v1/claim_settlement_decision.proto b/proto/cmp/services/claim/v1/claim_settlement_decision.proto index ee912dc3..58173c1a 100644 --- a/proto/cmp/services/claim/v1/claim_settlement_decision.proto +++ b/proto/cmp/services/claim/v1/claim_settlement_decision.proto @@ -46,13 +46,3 @@ message ClaimSettlementDecisionResponse { // Claim Message Response to respond with claim ids (processing, carrier and submission) and message status cmp.services.claim.v1.ClaimMessageResponse claim_message_response = 2; } - -// Claim settlement decision (Accepted or Rejected) service definition -// -// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/claim/v1/claim_settlement_decision.proto.dot.xs.svg) -// -// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/claim/v1/claim_settlement_decision.proto.dot.svg) -service ClaimSettlementDecisionService { - // Returns claim settlement response - rpc ClaimSettlementDecision(ClaimSettlementDecisionRequest) returns (ClaimSettlementDecisionResponse); -} diff --git a/proto/cmp/services/claim/v1/claim_settlement_extra_info.proto b/proto/cmp/services/claim/v1/claim_settlement_extra_info.proto index 0ba1e5f8..55157a9e 100644 --- a/proto/cmp/services/claim/v1/claim_settlement_extra_info.proto +++ b/proto/cmp/services/claim/v1/claim_settlement_extra_info.proto @@ -31,13 +31,3 @@ message ClaimSettlementExtraInfoResponse { // Claim Message Response to respond with claim ids (processing, carrier and submission) and message status cmp.services.claim.v1.ClaimMessageResponse claim_message_response = 2; } - -// Claim settlement Extra Info service definition -// -// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/claim/v1/claim_settlement_extra_info.proto.dot.xs.svg) -// -// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/claim/v1/claim_settlement_extra_info.proto.dot.svg) -service ClaimSettlementExtraInfoService { - // Returns claim settlement response - rpc ClaimSettlementExtraInfo(ClaimSettlementExtraInfoRequest) returns (ClaimSettlementExtraInfoResponse); -} diff --git a/proto/cmp/services/claim/v1/get_claim_form.proto b/proto/cmp/services/claim/v1/get_claim_form.proto index 3bff436c..91a30a40 100644 --- a/proto/cmp/services/claim/v1/get_claim_form.proto +++ b/proto/cmp/services/claim/v1/get_claim_form.proto @@ -1,80 +1,5 @@ syntax = "proto3"; -// # Insurance Claims Processing System -// ## Technical Documentation -// -// ### Overview -// This documentation outlines the technical specifications and workflows for the insurance claims processing service, focusing on the interaction between Distributors and Suppliers through standardized message types. The system supports various insurance products including CFAR (Cancel For Any Reason), travel medical insurance, and baggage coverage. -// -// ### Message Types -// The system implements four primary message types for claims processing: -// -// 1. **InsuranceGetClaimForm** -// - Direction: Distributor → Supplier -// - Purpose: Retrieves claim form for a specific policy -// - Trigger: Initial claim request from end-customer -// -// 2. **InsuranceSubmitClaimForm** -// - Direction: Distributor → Supplier -// - Purpose: Submits claim data including: -// - Booking NFT/Data -// - Required documentation -// - Claim registration details -// - Note: For operational changes, updated booking details must be re-attached -// -// 3. **InsuranceSettlement** -// - Direction: Supplier → Distributor -// - Purpose: Provides claim status updates -// - Features: -// - Push-based notification system -// - Supports iterative information requests -// - Handles multiple settlement statuses -// -// Process flow diagram: -// -//
-// This image displays the claim process workflow -//
Fig.1: claim process
-//
-// -// ### Implementation Requirements -// -// #### Distributor Requirements -// 1. Must implement and enable InsuranceSettlement service in their profile -// 2. System must be capable of: -// - Processing InsuranceSettlementRQ messages -// - Communicating status updates to end-consumers -// - Handling document submission and resubmission -// - Supporting uniform user experience across insurance providers -// -// #### Settlement Processing -// - Supports multiple settlement statuses: -// - "received" (initial acknowledgment) -// - "more info required" (with specific documentation requests) -// - "denied" or "accepted" -// - "paid-out" (final status) -// -// ### Payment Processing -// -// #### Payment Methods -// The system supports two primary payment channels: -// 1. Direct bank transfer to provided IBAN -// 2. Blockchain transaction on Camino network -// - Supports Camino wallet addresses -// - Integration with Partner Plugin for blockchain transactions -// -// #### Currency Handling -// - Supports multiple currency types: -// - Fiat currencies -// - Stable cryptocurrencies -// - Volatile cryptocurrencies -// - Payment processing in original purchase currency -// -// ### Security and Compliance -// - Implements fraud prevention measures through document verification -// - Supports policy-specific document submission -// - Maintains audit trail of all claim-related communications -// package cmp.services.claim.v1; import "cmp/services/claim/v1/claim_types.proto"; @@ -104,13 +29,3 @@ message ClaimGetFormResponse { // Claim form cmp.services.claim.v1.ClaimForm form = 2; } - -// Claim get claim form service definition -// -// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/claim/v1/get_claim_form.proto.dot.xs.svg) -// -// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/claim/v1/get_claim_form.proto.dot.svg) -service ClaimGetFormService { - // Returns product info for claim - rpc ClaimGetForm(ClaimGetFormRequest) returns (ClaimGetFormResponse); -} diff --git a/proto/cmp/services/claim/v1/services.proto b/proto/cmp/services/claim/v1/services.proto new file mode 100644 index 00000000..0d618868 --- /dev/null +++ b/proto/cmp/services/claim/v1/services.proto @@ -0,0 +1,106 @@ +syntax = "proto3"; + +// # Insurance Claims Processing System +// ## Technical Documentation +// +// ### Overview +// This documentation outlines the technical specifications and workflows for the insurance claims processing service, focusing on the interaction between Distributors and Suppliers through standardized message types. The system supports various insurance products including CFAR (Cancel For Any Reason), travel medical insurance, and baggage coverage. +// +// ### Message Types +// The system implements four primary message types for claims processing: +// +// 1. **InsuranceGetClaimForm** +// - Direction: Distributor → Supplier +// - Purpose: Retrieves claim form for a specific policy +// - Trigger: Initial claim request from end-customer +// +// 2. **InsuranceSubmitClaimForm** +// - Direction: Distributor → Supplier +// - Purpose: Submits claim data including: +// - Booking NFT/Data +// - Required documentation +// - Claim registration details +// - Note: For operational changes, updated booking details must be re-attached +// +// 3. **InsuranceSettlement** +// - Direction: Supplier → Distributor +// - Purpose: Provides claim status updates +// - Features: +// - Push-based notification system +// - Supports iterative information requests +// - Handles multiple settlement statuses +// +// Process flow diagram: +// +//
+// This image displays the claim process workflow +//
Fig.1: claim process
+//
+// +// ### Implementation Requirements +// +// #### Distributor Requirements +// 1. Must implement and enable InsuranceSettlement service in their profile +// 2. System must be capable of: +// - Processing InsuranceSettlementRQ messages +// - Communicating status updates to end-consumers +// - Handling document submission and resubmission +// - Supporting uniform user experience across insurance providers +// +// #### Settlement Processing +// - Supports multiple settlement statuses: +// - "received" (initial acknowledgment) +// - "more info required" (with specific documentation requests) +// - "denied" or "accepted" +// - "paid-out" (final status) +// +// ### Payment Processing +// +// #### Payment Methods +// The system supports two primary payment channels: +// 1. Direct bank transfer to provided IBAN +// 2. Blockchain transaction on Camino network +// - Supports Camino wallet addresses +// - Integration with Partner Plugin for blockchain transactions +// +// #### Currency Handling +// - Supports multiple currency types: +// - Fiat currencies +// - Stable cryptocurrencies +// - Volatile cryptocurrencies +// - Payment processing in original purchase currency +// +// ### Security and Compliance +// - Implements fraud prevention measures through document verification +// - Supports policy-specific document submission +// - Maintains audit trail of all claim-related communications +// +package cmp.services.claim.v1; + +import "cmp/services/claim/v1/claim_settlement_decision.proto"; +import "cmp/services/claim/v1/claim_settlement_extra_info.proto"; +import "cmp/services/claim/v1/get_claim_form.proto"; +import "cmp/services/claim/v1/submit_claim_form.proto"; +import "cmp/services/claim/v1/submit_claim_form_extra_info.proto"; + +// Claim services +// +// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/claim/v1/services.proto.dot.xs.svg) +// +// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/claim/v1/services.proto.dot.svg) +service CancellationService { + // Claim Get Form + rpc ClaimGetForm(ClaimGetFormRequest) returns (ClaimGetFormResponse) {} + + // Claim Submit Form + rpc ClaimSubmitForm(ClaimSubmitFormRequest) returns (ClaimSubmitFormResponse) {} + + // Claim Settlement Extra Info + rpc ClaimSettlementExtraInfo(ClaimSettlementExtraInfoRequest) returns (ClaimSettlementExtraInfoResponse) {} + + // Claim Submit Extra Info + rpc ClaimSubmitFormExtraInfo(ClaimSubmitFormExtraInfoRequest) returns (ClaimSubmitFormExtraInfoResponse) {} + + // Claim Settlement Decision + rpc ClaimSettlementDecision(ClaimSettlementDecisionRequest) returns (ClaimSettlementDecisionResponse) {} +} diff --git a/proto/cmp/services/claim/v1/submit_claim_form.proto b/proto/cmp/services/claim/v1/submit_claim_form.proto index 7a17ee18..c611fe4d 100644 --- a/proto/cmp/services/claim/v1/submit_claim_form.proto +++ b/proto/cmp/services/claim/v1/submit_claim_form.proto @@ -23,13 +23,3 @@ message ClaimSubmitFormResponse { // Claim Status cmp.services.claim.v1.ClaimStatus status = 4; } - -// Claim submit claim form service definition -// -// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/claim/v1/submit_claim_form.proto.dot.xs.svg) -// -// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/claim/v1/submit_claim_form.proto.dot.svg) -service ClaimSubmitFormService { - // Returns product info for claim - rpc ClaimSubmitForm(ClaimSubmitFormRequest) returns (ClaimSubmitFormResponse); -} diff --git a/proto/cmp/services/claim/v1/submit_claim_form_extra_info.proto b/proto/cmp/services/claim/v1/submit_claim_form_extra_info.proto index 506d1c03..2ce94312 100644 --- a/proto/cmp/services/claim/v1/submit_claim_form_extra_info.proto +++ b/proto/cmp/services/claim/v1/submit_claim_form_extra_info.proto @@ -26,13 +26,3 @@ message ClaimSubmitFormExtraInfoResponse { // Claim Status cmp.services.claim.v1.ClaimStatus status = 3; } - -// Claim submit claim form service definition -// -// ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/claim/v1/submit_claim_form_extra_info.proto.dot.xs.svg) -// -// [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/claim/v1/submit_claim_form_extra_info.proto.dot.svg) -service ClaimSubmitFormExtraInfoService { - // Returns product info for claim - rpc ClaimSubmitFormExtraInfo(ClaimSubmitFormExtraInfoRequest) returns (ClaimSubmitFormExtraInfoResponse); -} From d965fde72b9379d052624c3031f01ff7f3cb1523 Mon Sep 17 00:00:00 2001 From: Mohamed Elmoslemany Date: Wed, 6 Nov 2024 11:06:33 +0100 Subject: [PATCH 21/34] fix typo --- proto/cmp/services/claim/v1/services.proto | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/proto/cmp/services/claim/v1/services.proto b/proto/cmp/services/claim/v1/services.proto index 0d618868..fe7eb5cd 100644 --- a/proto/cmp/services/claim/v1/services.proto +++ b/proto/cmp/services/claim/v1/services.proto @@ -88,7 +88,7 @@ import "cmp/services/claim/v1/submit_claim_form_extra_info.proto"; // ![Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/claim/v1/services.proto.dot.xs.svg) // // [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/claim/v1/services.proto.dot.svg) -service CancellationService { +service ClaimService { // Claim Get Form rpc ClaimGetForm(ClaimGetFormRequest) returns (ClaimGetFormResponse) {} From ae5e372f93e4602904812c4bd3be13048aafc444 Mon Sep 17 00:00:00 2001 From: Sam Jaarsma C4T Date: Wed, 13 Nov 2024 16:00:56 +0100 Subject: [PATCH 22/34] Review comments Avata. Adding InsuredProductType enum and option to search by PolicyType. Comments. --- proto/cmp/services/insurance/v2/search.proto | 12 ++++- .../v2/search_parameters_types.proto | 45 +++++++++++++++---- 2 files changed, 48 insertions(+), 9 deletions(-) diff --git a/proto/cmp/services/insurance/v2/search.proto b/proto/cmp/services/insurance/v2/search.proto index afbc0dab..22b69d20 100644 --- a/proto/cmp/services/insurance/v2/search.proto +++ b/proto/cmp/services/insurance/v2/search.proto @@ -51,7 +51,17 @@ message InsuranceSearchRequest { cmp.types.v2.SearchParameters search_parameters_generic = 3; // This field represents a list of search queries that can be used to create - // multiroom multi location searches. + // a request that covers multiple bookings, travellers that have a different + // nationality or residence. Or for sequential travel periods. + // what is important to realize is that each query, when booked will result + // to one policy that can be claimed. It is never possible to only claim + // part of a policy. + // As insurances of different product families will be covered with different + // carriers, never combine different product families in one request. These + // are specified in the "insured_product_type" in the search parameters. + // Instead of adding multiple product families into multiple queries, it is + // recommended to split them into multiple requests so that they can be + // processed in parallel. repeated cmp.services.insurance.v2.InsuranceSearchQuery queries = 4; } diff --git a/proto/cmp/services/insurance/v2/search_parameters_types.proto b/proto/cmp/services/insurance/v2/search_parameters_types.proto index 672bf677..2159aaa6 100644 --- a/proto/cmp/services/insurance/v2/search_parameters_types.proto +++ b/proto/cmp/services/insurance/v2/search_parameters_types.proto @@ -17,27 +17,56 @@ import "cmp/types/v3/traveller.proto"; // [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/insurance/v2/search_parameters_types.proto.dot.svg) message InsuranceSearchParameters { // Product code list - // Here a list of property codes would be used that could be of different types + // Here a list of product codes would be used that could be for various specific + // insurances from the InsuranceProductList the insurance supplier offers, in + // case one or more specific policies are requested. repeated cmp.types.v2.ProductCode product_codes = 1; + // Insurances can also be requested by type, in case not a specific policy is + // requested through the product codes above + cmp.services.insurance.v2.PolicyType policy_type = 2; + + // Insured product type has to be specified. It can only be one product type + // from the enumeration in each query. Seperate queries or requests have to be + // submitted for different insured product types + cmp.services.insurance.v2.InsuredProductType insured_product_type = 3; + // Value of booking to be insured, only valid with CFAR, Flight? and Rantal Car? insurances - cmp.types.v2.Price amount_purchase = 2; + cmp.types.v2.Price amount_purchase = 4; // Insurance location and its references. Location can be on-chain or off-chain. - cmp.services.insurance.v2.InsuredBooking booking_to_insure = 3; + cmp.services.insurance.v2.InsuredBooking booking_to_insure = 5; // The country code of the end-consumer nationality. This code is optional for normal NFT, but required for an NFT that is a receipt for a physical product. - cmp.types.v2.Country nationality = 4; + cmp.types.v2.Country nationality = 6; // The country code of the end-consumer place of residence - cmp.types.v2.Country country_residence = 5; + cmp.types.v2.Country country_residence = 7; // Travel period - cmp.types.v1.TravelPeriod travel_period = 6; + cmp.types.v1.TravelPeriod travel_period = 8; // Travellers - repeated cmp.types.v3.BasicTraveller travellers = 7; + repeated cmp.types.v3.BasicTraveller travellers = 9; // Loyalty Program - cmp.types.v1.LoyaltyProgram loyalty_program = 8; + cmp.types.v1.LoyaltyProgram loyalty_program = 10; +} + +enum InsuredProductType { + INSURED_PRODUCT_TYPE_UNSPECIFIED = 0; + INSURED_PRODUCT_TYPE_FLIGHT = 1; + INSURED_PRODUCT_TYPE_TRAIN_TRIP = 2; + INSURED_PRODUCT_TYPE_TRANSFER = 3; + INSURED_PRODUCT_TYPE_HOTEL = 4; + INSURED_PRODUCT_TYPE_HOLIDAY_HOME = 5; + INSURED_PRODUCT_TYPE_HOSTAL = 6; + INSURED_PRODUCT_TYPE_RENTAL_CAR = 7; + INSURED_PRODUCT_TYPE_CAMPER = 8; + INSURED_PRODUCT_TYPE_BICYCLE = 9; + INSURED_PRODUCT_TYPE_MOTOR_BIKE = 10; + INSURED_PRODUCT_TYPE_ACTIVITY = 11; + INSURED_PRODUCT_TYPE_EVENT = 12; + INSURED_PRODUCT_TYPE_CONCERT = 13; + INSURED_PRODUCT_TYPE_HOLIDAY_PACKAGE = 14; } From 8d9366c70208b24cbafb82e54522b24a96e07325 Mon Sep 17 00:00:00 2001 From: Sam Jaarsma C4T Date: Fri, 22 Nov 2024 10:55:19 +0100 Subject: [PATCH 23/34] review comments Avata --- proto/cmp/services/claim/v1/claim_types.proto | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/proto/cmp/services/claim/v1/claim_types.proto b/proto/cmp/services/claim/v1/claim_types.proto index 72081939..9639e027 100644 --- a/proto/cmp/services/claim/v1/claim_types.proto +++ b/proto/cmp/services/claim/v1/claim_types.proto @@ -43,8 +43,14 @@ message ClaimableService { // Amount to be claimed cmp.types.v2.Price charge_amount = 2; - // Documents + // Documents supporting the claim repeated cmp.services.claim.v1.ClaimDocument documents = 3; + + // CancellationConfirmed is a boolean indicating that the Partner certifies + // that the insured booking is cancelled in case of CFAR insurance. + // Proof of cancellation as for example NFT status query or cancellation + // request/response has to be included in documents. + bool cancellation_confirmed = 4; } // Claim Document @@ -87,6 +93,7 @@ enum ClaimDocumentType { CLAIM_DOCUMENT_TYPE_POLICE_REPORT = 3; CLAIM_DOCUMENT_TYPE_MEDICAL_REPORT = 4; CLAIM_DOCUMENT_TYPE_LAB_RESULT = 5; + CLAIM_DOCUMENT_TYPE_CANCELLATION_CONFIRMATION = 6; } // Claim Status From 4d0bbf153dbe761a57a7dfbf99b7fe9dcdd300cc Mon Sep 17 00:00:00 2001 From: Sam Jaarsma C4T Date: Fri, 22 Nov 2024 14:24:44 +0100 Subject: [PATCH 24/34] Adding comment that status field is mandatory in the reponse header --- proto/cmp/types/v1/common.proto | 1 + 1 file changed, 1 insertion(+) diff --git a/proto/cmp/types/v1/common.proto b/proto/cmp/types/v1/common.proto index f4ddcbff..c430e21d 100644 --- a/proto/cmp/types/v1/common.proto +++ b/proto/cmp/types/v1/common.proto @@ -69,6 +69,7 @@ message ResponseHeader { cmp.types.v1.Header base_header = 1; // Status of the response, success or failure + // THIS FIELD IS MANDATORY cmp.types.v1.StatusType status = 2; // Alert for more detailed information about the response From 85fe6b449767e3a73117a02b4cb0009d9ab446be Mon Sep 17 00:00:00 2001 From: Sam Jaarsma C4T <122641111+SamJaarsma@users.noreply.github.com> Date: Fri, 22 Nov 2024 15:48:34 +0100 Subject: [PATCH 25/34] Update proto/cmp/services/accommodation/v3/search.proto Co-authored-by: Ekrem Seren --- proto/cmp/services/accommodation/v3/search.proto | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/proto/cmp/services/accommodation/v3/search.proto b/proto/cmp/services/accommodation/v3/search.proto index 6ba36e21..ea33508a 100644 --- a/proto/cmp/services/accommodation/v3/search.proto +++ b/proto/cmp/services/accommodation/v3/search.proto @@ -96,7 +96,7 @@ message AccommodationSearchRequest { // In the response a search_id must be included and a search_option_id for every // bookable option responded. Included, compulsory and optional services can be // included. A simple "free cancellation upto" can be set or full cancellation -// pilicies can be included. +// policies can be included. message AccommodationSearchResponse { // Message header. Contains API version, message info string and end user wallet // address. From fc717a77e9dc6886161c9e0484422ee9f6df6104 Mon Sep 17 00:00:00 2001 From: Sam Jaarsma C4T <122641111+SamJaarsma@users.noreply.github.com> Date: Fri, 22 Nov 2024 15:48:55 +0100 Subject: [PATCH 26/34] Update proto/cmp/services/insurance/v2/search_parameters_types.proto Co-authored-by: Ekrem Seren --- proto/cmp/services/insurance/v2/search_parameters_types.proto | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/proto/cmp/services/insurance/v2/search_parameters_types.proto b/proto/cmp/services/insurance/v2/search_parameters_types.proto index 2159aaa6..e6bb7826 100644 --- a/proto/cmp/services/insurance/v2/search_parameters_types.proto +++ b/proto/cmp/services/insurance/v2/search_parameters_types.proto @@ -27,7 +27,7 @@ message InsuranceSearchParameters { cmp.services.insurance.v2.PolicyType policy_type = 2; // Insured product type has to be specified. It can only be one product type - // from the enumeration in each query. Seperate queries or requests have to be + // from the enumeration in each query. Separate queries or requests have to be // submitted for different insured product types cmp.services.insurance.v2.InsuredProductType insured_product_type = 3; From 8653a2d884f6b9258f805c31c8e4b7a4c5148ea5 Mon Sep 17 00:00:00 2001 From: Sam Jaarsma C4T <122641111+SamJaarsma@users.noreply.github.com> Date: Fri, 22 Nov 2024 15:50:12 +0100 Subject: [PATCH 27/34] Update proto/cmp/services/accommodation/v3/property_types.proto Co-authored-by: Ekrem Seren --- proto/cmp/services/accommodation/v3/property_types.proto | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/proto/cmp/services/accommodation/v3/property_types.proto b/proto/cmp/services/accommodation/v3/property_types.proto index 48023587..722274ce 100644 --- a/proto/cmp/services/accommodation/v3/property_types.proto +++ b/proto/cmp/services/accommodation/v3/property_types.proto @@ -126,16 +126,16 @@ message Room { // availability data for display to the end user. string supplier_code = 1; - // Room name. In case of hotel a standardized room name is often derrived from - // room code structures. Exmple: "superior seaview room". + // Room name. In case of hotel a standardized room name is often derived from + // room code structures. Example: "superior sea view room". // For holiday homes we expect names like "Master Bedroom", "Second Bedroom" or // "Bathroom" when specific descriptions for each room are available. string supplier_name = 2; - // Original room name as assigned by the hotel. In case of spefifically designated room + // Original room name as assigned by the hotel. In case of specifically designated room // names by chains and both the chain and the customer wants to adhere to them. // Ex: "CEIBA CLUB", "CEIBA GOVERNORS SUITE", "GOVERNORS SUITE" or "ENCLAVE NATURE VIEW" - // For holiday homes specific room names if availbale can be given. + // For holiday homes specific room names if available can be given. string original_name = 3; repeated cmp.types.v3.Image images = 4; From 5d122d1d1b643dfdd65b0398f57c0a2c427616e3 Mon Sep 17 00:00:00 2001 From: Sam Jaarsma C4T <122641111+SamJaarsma@users.noreply.github.com> Date: Fri, 22 Nov 2024 15:51:20 +0100 Subject: [PATCH 28/34] Update proto/cmp/services/claim/v1/services.proto Co-authored-by: Ekrem Seren --- proto/cmp/services/claim/v1/services.proto | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/proto/cmp/services/claim/v1/services.proto b/proto/cmp/services/claim/v1/services.proto index fe7eb5cd..6d0fb2ee 100644 --- a/proto/cmp/services/claim/v1/services.proto +++ b/proto/cmp/services/claim/v1/services.proto @@ -90,17 +90,17 @@ import "cmp/services/claim/v1/submit_claim_form_extra_info.proto"; // [Open Message Diagram](https://storage.googleapis.com/docs-cmp-files/diagrams/proto/cmp/services/claim/v1/services.proto.dot.svg) service ClaimService { // Claim Get Form - rpc ClaimGetForm(ClaimGetFormRequest) returns (ClaimGetFormResponse) {} + rpc ClaimGetForm(ClaimGetFormRequest) returns (ClaimGetFormResponse); // Claim Submit Form - rpc ClaimSubmitForm(ClaimSubmitFormRequest) returns (ClaimSubmitFormResponse) {} + rpc ClaimSubmitForm(ClaimSubmitFormRequest) returns (ClaimSubmitFormResponse); // Claim Settlement Extra Info - rpc ClaimSettlementExtraInfo(ClaimSettlementExtraInfoRequest) returns (ClaimSettlementExtraInfoResponse) {} + rpc ClaimSettlementExtraInfo(ClaimSettlementExtraInfoRequest) returns (ClaimSettlementExtraInfoResponse); // Claim Submit Extra Info - rpc ClaimSubmitFormExtraInfo(ClaimSubmitFormExtraInfoRequest) returns (ClaimSubmitFormExtraInfoResponse) {} + rpc ClaimSubmitFormExtraInfo(ClaimSubmitFormExtraInfoRequest) returns (ClaimSubmitFormExtraInfoResponse); // Claim Settlement Decision - rpc ClaimSettlementDecision(ClaimSettlementDecisionRequest) returns (ClaimSettlementDecisionResponse) {} + rpc ClaimSettlementDecision(ClaimSettlementDecisionRequest) returns (ClaimSettlementDecisionResponse); } From fec3563379f0bb2d1c75e7b2da09a4722835dddb Mon Sep 17 00:00:00 2001 From: Sam Jaarsma C4T <122641111+SamJaarsma@users.noreply.github.com> Date: Fri, 22 Nov 2024 15:52:00 +0100 Subject: [PATCH 29/34] Update proto/cmp/types/v3/file.proto Co-authored-by: Ekrem Seren --- proto/cmp/types/v3/file.proto | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/proto/cmp/types/v3/file.proto b/proto/cmp/types/v3/file.proto index a8c2b1d5..cba6373b 100644 --- a/proto/cmp/types/v3/file.proto +++ b/proto/cmp/types/v3/file.proto @@ -195,10 +195,10 @@ enum MIMEType { // File Checksum message Checksum { // Hash algorithm - cmp.types.v3.HashAlgorithm hash_algorithm = 7; + cmp.types.v3.HashAlgorithm hash_algorithm = 1; // Hash content - string hash_content = 8; + string hash_content = 2; } // Hash algorithms From 16a0be4d07b2ed9cf6f6e256b6a79bb07561da48 Mon Sep 17 00:00:00 2001 From: Sam Jaarsma C4T <122641111+SamJaarsma@users.noreply.github.com> Date: Fri, 22 Nov 2024 15:53:05 +0100 Subject: [PATCH 30/34] Update proto/cmp/services/claim/v1/claim_settlement_decision.proto Co-authored-by: Ekrem Seren --- proto/cmp/services/claim/v1/claim_settlement_decision.proto | 1 + 1 file changed, 1 insertion(+) diff --git a/proto/cmp/services/claim/v1/claim_settlement_decision.proto b/proto/cmp/services/claim/v1/claim_settlement_decision.proto index 58173c1a..88d1903c 100644 --- a/proto/cmp/services/claim/v1/claim_settlement_decision.proto +++ b/proto/cmp/services/claim/v1/claim_settlement_decision.proto @@ -35,6 +35,7 @@ message ClaimSettlementDecisionRequest { cmp.services.claim.v1.PayOutTransaction payout_transaction = 7; // TODO: ask whether there could be multiple payouts for the same claim. + // // Amount cmp.types.v2.PriceDetail amount = 8; } From f0b5190554a4baedf5e8572df4ef9f444d804ae7 Mon Sep 17 00:00:00 2001 From: Sam Jaarsma C4T <122641111+SamJaarsma@users.noreply.github.com> Date: Fri, 22 Nov 2024 15:53:21 +0100 Subject: [PATCH 31/34] Update proto/cmp/services/claim/v1/claim_types.proto Co-authored-by: Ekrem Seren --- proto/cmp/services/claim/v1/claim_types.proto | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/proto/cmp/services/claim/v1/claim_types.proto b/proto/cmp/services/claim/v1/claim_types.proto index 9639e027..0d22e58a 100644 --- a/proto/cmp/services/claim/v1/claim_types.proto +++ b/proto/cmp/services/claim/v1/claim_types.proto @@ -148,7 +148,7 @@ message PolicyInfo { cmp.types.v3.Company company = 6; // Policy Codes: unit Code, service code and product code - cmp.services.insurance.v1.PolicyCodes policy_code = 8; + cmp.services.insurance.v1.PolicyCodes policy_code = 7; } // Claim more info requested From 0883a7c5fdc10572f20d466f742b7cc300566d91 Mon Sep 17 00:00:00 2001 From: Sam Jaarsma C4T <122641111+SamJaarsma@users.noreply.github.com> Date: Fri, 22 Nov 2024 15:53:48 +0100 Subject: [PATCH 32/34] Update proto/cmp/services/claim/v1/submit_claim_form.proto Co-authored-by: Ekrem Seren --- proto/cmp/services/claim/v1/submit_claim_form.proto | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/proto/cmp/services/claim/v1/submit_claim_form.proto b/proto/cmp/services/claim/v1/submit_claim_form.proto index c611fe4d..d661c4c5 100644 --- a/proto/cmp/services/claim/v1/submit_claim_form.proto +++ b/proto/cmp/services/claim/v1/submit_claim_form.proto @@ -21,5 +21,5 @@ message ClaimSubmitFormResponse { cmp.services.claim.v1.ClaimMessageResponse claim_message_response = 2; // Claim Status - cmp.services.claim.v1.ClaimStatus status = 4; + cmp.services.claim.v1.ClaimStatus status = 3; } From 313b21acc74392d526cfb952392a9d883c20e212 Mon Sep 17 00:00:00 2001 From: Sam Jaarsma C4T Date: Fri, 22 Nov 2024 15:58:01 +0100 Subject: [PATCH 33/34] review comment --- proto/cmp/services/claim/v1/services.proto | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/proto/cmp/services/claim/v1/services.proto b/proto/cmp/services/claim/v1/services.proto index 6d0fb2ee..fae2448e 100644 --- a/proto/cmp/services/claim/v1/services.proto +++ b/proto/cmp/services/claim/v1/services.proto @@ -4,7 +4,11 @@ syntax = "proto3"; // ## Technical Documentation // // ### Overview -// This documentation outlines the technical specifications and workflows for the insurance claims processing service, focusing on the interaction between Distributors and Suppliers through standardized message types. The system supports various insurance products including CFAR (Cancel For Any Reason), travel medical insurance, and baggage coverage. +// This documentation outlines the technical specifications and workflows for the +// insurance claims processing service, focusing on the interaction between +// Distributors and Suppliers through standardized message types. The system +// supports various insurance products including CFAR (Cancel For Any Reason), +// travel medical insurance, and baggage coverage. // // ### Message Types // The system implements four primary message types for claims processing: From b509151fdf47bc006f629eee4d6fde3f4ed2113e Mon Sep 17 00:00:00 2001 From: Mohamed Elmoslemany <117270519+mo-c4t@users.noreply.github.com> Date: Fri, 29 Nov 2024 09:30:18 +0100 Subject: [PATCH 34/34] Update proto/cmp/services/claim/v1/services.proto Co-authored-by: Ekrem Seren --- proto/cmp/services/claim/v1/services.proto | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/proto/cmp/services/claim/v1/services.proto b/proto/cmp/services/claim/v1/services.proto index fae2448e..bfe79330 100644 --- a/proto/cmp/services/claim/v1/services.proto +++ b/proto/cmp/services/claim/v1/services.proto @@ -36,10 +36,7 @@ syntax = "proto3"; // // Process flow diagram: // -//
-// This image displays the claim process workflow -//
Fig.1: claim process
-//
+// ![Claim Process Workflow](https://storage.googleapis.com/docs-cmp-files/assets/images/claim_process_workflow.png) // // ### Implementation Requirements //