Warranty Management
Authors
- Sanket Mal
- Ayan Ghosh
Last Updated Date
2024-03-12
SRS References
Version History
| Version | Date | Changes | Author |
|---|---|---|---|
| 1.0 | 2024-12-05 | Initial draft | Sanket Mal, Ayan Ghsoh |
| 2.0 | 2024-03-12 | Enhanced warranty claim feature to support multiple components | Sanket Mal, Ayan Ghsoh |
Feature Overview
Objective:
The warranty planning feature is designed to streamline and standardize the process of handling warranty claims within the organization. It ensures seamless communication and processing across the hierarchy of Dealer, Distributor, and Fleeto, while allowing for clear decision-making, efficient replacements or repairs, and robust tracking of claims from initiation to closure.
Scope:
1. The feature encompasses the entire lifecycle of a warranty claim, including initiation, verification, repair/replacement/reject, and delivery of resolved claims.
2. Applicable for three hierarchical roles:
- Dealer: Can initiate warranty claims.
- Distributor: Can both initiate claims (to the Fleeto) and process incoming claims (from Dealers).
- Fleeto: Can only process warranty claims (from Distributors or dealers).
3. The system must generate a warranty ticket for each claim and track its status until resolution.
Dependencies:
Requirements
-
Warranty Claim Initiation:
- Buyers or authorized sellers (e.g., Distributors/Owners) can initiate warranty claims for multiple components (which are purchased in a particular invoice), either on behalf of the buyer or the seller, by referencing the corresponding invoice number.
- Immediate after claim create a system generate ticket number for the warranty claim.
-
Initial Approval:
- Upon initiating a warranty claim, a decision-making process should verify the eligibility of the claim based on the component, purchase details, and warranty coverage.
- Sellers (Distributors) can approve or reject claims based on eligibility checks.
-
Damage Assessment and Claim Resolution:
- The process should accommodate options for direct replacement of the defective components without receiving or checking the damage components or the seller can ask the buyer to send the damaged component(s) before proceeding.Damaged components are sent for a quality inspection to determine the next steps.
- The seller confirms receipt and records relevant details.
-
Inspection & Decision Making:
- The inspection team assesses components and suggests either repair, replacement, or rejection.
- A higher authority makes the final decision before proceeding to service.
-
Service Processing:
- Approved claims undergo either repair or replacement as per the decision.
- The system tracks the progress of service operations.
-
Free of Charge (FOC) Invoice Generation:
- The system must generate FOC invoices only for the components that are being replaced under warranty, with relevant details such as the invoice number and details of the replacement component.
- Generate an FOC invoice PDF upon request for the warranty claim.
-
Shipping & Delivery:
- The seller confirms the shipping method for the repaired/replaced component(s).
- Dispatched components are assigned tracking details.
-
Automated Claim Closure:
- Claims are automatically closed upon successful delivery.
- Lifecycle Tracking of Warranty Claims
Each claim progresses through multiple stages, represented by a status in the WarrantyStatus enum.
- I. Claim Initiated (
ClaimInitiated = 0)- The buyer or the seller on behalf of the buyer can submits a warranty claim for one or multiple components which are purchased in the exactly same invoice.
- The system records the claim and assigns a unique ticket number.
- II. Claim Approved (
ClaimAccepted = 1)- The seller reviews the claim request and accepted it for the further procedure if the components are eligible for warranty or the components are in warranty period.
- III. Claim Rejected (
ClaimRejected = 2)- The seller determines that the components do not meet the warranty criteria.
- The claim is rejected, and the buyer is notified with the reason for rejection.
- IV. Waiting for Damaged Component (
WaitingForDamagedComponent = 3)- If required, the seller requests the buyer to send the damaged components before proceeding with further steps.
- The claim remains in this status until the components are received.
- V. Damaged Component Received (
DamagedComponentReceived = 4)- The seller confirms receipt of the damaged components.
- The components are recorded in the system and prepared for inspection.
- VI. Sent for Inspection (
SentForInspection = 5)- The damaged components are sent for detailed inspection to the quality team.
- The inspection determines if repair or replacement or rejection are required for each individual component.
- VII. Waiting for Final Approval (
WaitingForFinalApproval = 6)- After getting the inspection report or suggestion of the quality team, a higher authority team took the final decision that which action will take against each individual components (repair or replacement or reject).
- A final approval is required before proceeding to the next step.
- VIII. Service Processing (
ServiceProcessing = 7)- The repair or replacement process begins as per the approved decision.
- The system tracks the progress of service operations.
- IX. Shipping Method Confirmed (
ShippingMethodConfirmed = 8)- The seller determines how the repaired or replaced components will be shipped to the buyer.
- X. Dispatched (
Dispatched = 9)- The repaired or replacement components are shipped to the buyer.
- The tracking details are updated in the system.
- XI. Delivered (
Delivered = 10)- The buyer receives the repaired or replaced components.
- The system marks the delivery as complete.
- XII. Claim Closed (
ClaimClosed = 11)- Immediately after delivery, the claim is automatically marked as closed.
- The warranty claim process is successfully completed.
Design Specifications
(Provide detailed design specifications, including UI/UX designs, API interfaces, and any other relevant architectural details.)
-
UI/UX Design:
(Include wireframes, mockups, or links to design files.)
-
Data Models:
(Detail the data structures, including database schemas or objects.)
public class WarrantyClaim
{
public Guid ClaimId { get; set; }
public required Guid ClaimFor { get; set; } // Dealer who claimed
public Guid AssignedTo { get; set; } // Assigned dealer or team
public string? ClaimInitiateBy { get; set; } // Person who initiated the claim
public Guid? ClaimInitiatedByConsumerId { get; set; } // Consumerid of the person who initiated the claim
public required string InvoiceNumber { get; set; }
public DateTime InvoiceDate { get; set; }
public required List<ClaimedComponentDetails> ClaimedComponentDetails { get; set; }
public string? WarrantyTicketNumber { get; set; }
public WarrantyStatus? CurrentStatus { get; set; }
public bool? ReplacementWithoutReceivedDamageComponent { get; set; }
public string? RejectionReason { get; set; }
public DateTime CreatedAt { get; set; }
public DamageComponentShippingBy? DamageItemShippingBy { get; set; }
public ShippingBy? ReplacementItemShippingMethod { get; set; }
public Address? PickUpAddress { get; set; } // Address from where damage component will receive
public Address? DeliveryAddress { get; set; } // Address where repair or replaced component will send
public string? Notes { get; set; }
public string? LogUsername { get; set; }
public DateTime LogDts { get; set; } = DateTime.UtcNow;
public bool IsInvoicePresentInTheSystem { get; set; } = false;
}
public class WarrantyDetailInfo : WarrantyClaim
{
public string? ClaimDealerName { get; set; }
public string? ClaimDealerCode { get; set; }
public string? AssignedDealerName { get; set; }
public string? AssignedDealerCode { get; set; }
public List<ClaimMapping>? ClaimMappingDetails { get; set; }
public List<StatusWithProcessDate> TrackWarrantyStatus { get; set; } = new List<StatusWithProcessDate>();
}
public record WarrantyUpdateRecord
{
public required Guid ClaimId { get; init; }
public WarrantyStatus? CurrentStatus { get; set; }
public bool? ReplacementWithoutReceivedDamageComponent { get; set; }
public string? RejectionReason { get; set; }
public DamageComponentShippingBy? DamageItemShippingBy { get; init; }
public Address? PickUpAddress { get; init; } // Address from where damage component will receive
public ShippingBy? ReplacementItemShippingMethod { get; init; }
public Address? DeliveryAddress { get; init; } // Address where repair or replaced component will send
public string? Notes { get; init; }
public string? LogUsername { get; set; }
public DateTime LogDts { get; set; } = DateTime.UtcNow;
public List<UpdateComponentDetailsRecord>? Components { get; set; }
}
public record UpdateComponentDetailsRecord
{
//public Guid? ClaimId { get; set; }
public required string ComponentNumber { get; init; }
public required ComponentType ComponentType { get; init; }
public bool? IsBatteryChecked { get; init; } // Is Battery Checked
public decimal? BatteryVoltageReading { get; init; } // Battery Voltage Reading
public List<ImageInfo>? Attachments { get; set; }
}
public record StatusWithProcessDate
{
public WarrantyStatus Status { get; init; }
public DateTime ProcessDate { get; init; }
}
public record WarrantyStateLog
{
public Guid TransactionId { get; init; }
public Guid ClaimId { get; init; }
public WarrantyStatus? WarrantyStatus { get; set; }
public DateTime ProcessDate { get; init; } = DateTime.UtcNow;
public bool IsMailSend { get; init; } = false;
public string? LogUserName { get; set; }
public DateTime LogDTS { get; init; } = DateTime.UtcNow;
}
public record WarrantyMinimalInfo
{
public string? WarrantyTicketNumber { get; set; }
public Guid ClaimId { get; set; }
public Guid ClaimFor { get; set; } // Dealer who claimed
public string? ClaimDealerName { get; set; }
public string? ClaimDealerCode { get; set; }
public Guid AssignedTo { get; set; } // Assigned dealer
public string? AssignedDealerName { get; set; }
public string? AssignedDealerCode { get; set; }
public string? InvoiceNumber { get; set; }
public List<string>? ComponentNumber { get; set; }
[JsonIgnore]
public string[]? ComponentNumbers { get; init; }
public ComponentType? ComponentType { get; init; }
public WarrantyStatus? CurrentStatus { get; set; }
public DateTime? CreatedAt { get; set; }
public DamageComponentShippingBy? DamageItemShippingBy { get; set; }
public ShippingBy? ReplacementItemShippingMethod { get; set; }
[System.Text.Json.Serialization.JsonIgnore]
[Newtonsoft.Json.JsonIgnore]
public int TotalNumber { get; init; }
}
public record WarrantyFilter
{
public Guid? ClaimId { get; init; }
public List<Guid>? ClaimFor { get; set; } // Dealer who claimed
public Guid? AssignedTo { get; set; }
public string? InvoiceNumber { get; init; }
public string? WarrantyTicketNumber { get; init; }
public List<WarrantyStatus>? Status { get; init; }
public DateTime? StartDate { get; set; }
public DateTime? EndDate { get; set; }
public string? ComponentNumber { get; init; }
public ComponentType? ComponentType { get; init; }
public int RowsPerPage { get; set; }
public int PageNumber { get; set; }
public bool IsExcel { get; init; } = false;
}
public record ClaimedComponentDetails
{
public Guid? Id { get; set; }
public Guid? ClaimId { get; set; }
public required string ComponentNumber { get; init; }
public required ComponentType ComponentType { get; init; }
public string? Model { get; set; }
public string? Color { get; set; }
public List<AdditionalInfo>? AdditionalInfo { get; set; }
[JsonIgnore]
public string? AdditionalInfoAsString { get; set; }
public string? Brand { get; set; }
public string? DamageDetails { get; init; }
public string? LogUsername { get; set; } // Username of the person who logged this record
public DateTime LogDts { get; set; } = DateTime.UtcNow; // Log timestamp
public bool IsBatteryChecked { get; set; } = false; // Is Battery Checked
public decimal BatteryVoltageReading { get; set; } = 0; // Battery Voltage Reading
[JsonIgnore]
public string? AttachmentsAsString { get; set; }
public List<ImageInfo>? Attachments { get; set; } = [];
}
public record ComponentsInvoiceHistoryRequest
{
public required List<string> ComponentNumbers { get; set; }
public required ComponentType ComponentType { get; set; }
public required Guid ClaimFor { get; set; }
}
public record ComponentsInvoiceHistory
{
public List<ComponentPurchaseInfoResponse>? ComponentsPurchaseInfo { get; set; }
public bool IsInvoicePresentInTheSystem { get; set; } = false;
}
public record ComponentsInvoiceHistoryRequest
{
public required List<string> ComponentNumbers { get; set; }
public required ComponentType ComponentType { get; set; }
public required Guid ClaimFor { get; set; }
}
public record ComponentPurchaseInfoResponse
{
public string? ComponentNumber { get; init; }
public ComponentType ComponentType { get; init; }
public string? Model { get; init; }
public string? Colour { get; init; }
public List<AdditionalInfo>? AdditionalInfo { get; set; }
public string? Brand { get; init; }
public List<InvoiceHistory> InvoiceHistories { get; set; } = [];
}
public record DamageComponentReceipt
{
public Guid Id { get; set; }
public Guid ClaimId { get; set; } // Foreign Key tblWarrantyClaims
public bool PhysicallyReceivedAtPlant { get; init; } // Indicates physical receipt status
public string? ReceivedBy { get; init; } // Person who received the item
public DateTime ReceivedDate { get; init; } // Date of receipt
public string? SecurityInwardRegisterNo { get; init; } // Security inward register number
public DamageComponentShippingBy? DamageItemShippingBy { get; set; } // Process description for damaged item sent
public string? CourierName { get; init; } // Name of the courier service
public string? CourierReceiptNumber { get; init; } // Courier receipt number
public string? TruckNumber { get; init; } // Truck number used for transportation
public string? DriverName { get; init; } // Driver's name
public string? DriverContact { get; init; } // Driver's contact number
public string? Notes { get; init; }
public string? LogUsername { get; set; } // Username of the person who logged this record
public DateTime LogDts { get; set; } = DateTime.UtcNow; // Log timestamp
public _OperationType OperationType { get; init; } = _OperationType.Insert;
}
public record InspectionInitiationRecord
{
public _OperationType OperationType { get; init; } = _OperationType.Insert;
public Guid InspectionId { get; init; }
public Guid ClaimId { get; set; }
public DateTime HandOverDate { get; set; } // Date when the component was handed over
public string? HandOverTo { get; init; } // Name of the person or entity the component was handed over to
public string? InspectionFormNumber { get; init; } // Unique form number for inspection
public string? Notes { get; init; } // Additional remarks or comments
public string? LogUsername { get; set; }
public DateTime LogDts { get; set; } = DateTime.UtcNow;
}
public record ActionRecommendedForComponent
{
public Guid ClaimId { get; set; }
public required string ComponentNumber { get; init; }
public required ComponentType ComponentType { get; init; }
public required ActionForWarranty Action { get; init; }
public string? Notes { get; init; } // Additional remarks or comments
public DateTime? ConditionReportingDate { get; set; }
}
public record ActionTakenForComponent : ActionRecommendedForComponent
{
public string? SanctionedBy { get; init; }
public string? NewComponentNumber { get; set; } // New component number (if replaced)
public string? ReasonForAction { get; init; } // Reason for the action taken
}
public record ShippingDetailsRecord
{
public Guid ClaimId { get; set; }
public ShippingBy ShippingMethod { get; init; } // Method of shipping (e.g., Seller, Dealer, Courier).
public Address? DeliveryAddress { get; init; } // Address where the item will be shipped.
public DateTime LogDTS { get; init; } // Date and time when shipping was confirmed.
public string? LogUserName { get; set; }
}
public record WarrantyDispatchDetails : DeliveryInformation
{
public _OperationType OperationType { get; init; } = _OperationType.Insert;
public Guid DispatchId { get; set; }
public Guid ClaimId { get; set; }
public DateTime DispatchDate { get; init; }
public string? CourierName { get; init; } // Name of the courier service (optional for truck-based).
public string? CourierReceiptNumber { get; init; } // Receipt number of the courier (if applicable).
}
public class InvoiceMinimalData // Updated
{
[XLColumn(Ignore = true)]
public Guid InvoiceId { get; set; }
[XLColumn(Header = "Invoice Number")]
public string? InvoiceNumber { get; set; }
[XLColumn(Header = "Order Number")]
public string? OrderNumber { get; set; } // Added
[XLColumn(Header = "Warranty Ticket Number")]
public string? WarrantyTicketNumber { get; set; } // Added
[XLColumn(Header = "Dealership Type")]
public InvoicePartyType PartyType { get; set; }
[XLColumn(Header = "Invoice Date")]
public DateTime InvoiceDate { get; set; }
[XLColumn(Header = "Billing Type")]
public BillingType BillingType { get; set; }
[XLColumn(Header = "Payment Status")]
public InvoicePaymentStatus PaymentStatus { get; set; }
[XLColumn(Header = "Invoice Type")]
public InvoiceType InvoiceType { get; set; }
[XLColumn(Header = "Total Amount")]
public decimal TotalAmount { get; set; }
[XLColumn(Header = "CGST Amount")]
public decimal CGSTAmount { get; set; }
[XLColumn(Header = "SGST Amount")]
public decimal SGSTAmount { get; set; }
[XLColumn(Header = "IGST Amount")]
public decimal IGSTAmount { get; set; }
[XLColumn(Header = "Total Amount With Tax")]
public decimal TotalAmountWithTax { get; set; }
[XLColumn(Header = "Round Off")]
public decimal? RoundOff { get; set; }
[XLColumn(Header = "Buyer Name")]
public string? BuyerName { get; set; }
[XLColumn(Header = "Seller Name")]
public string? SellerName { get; set; }
[XLColumn(Header = "IRN Applicable Status")]
public bool? IsIrnApplicable { get; set; } = false;
[XLColumn(Header = "E-Way Bill Applicable Status")]
public bool? IsEwaybillApplicable { get; set; } = false;
}
public class InvoiceMaster //updated
{
public Guid InvoiceId { get; set; }
public string? InvoiceNumber { get; set; }
public InvoicePartyType PartyType { get; set; }
public DateTime InvoiceDate { get; set; }
public BillingType BillingType { get; set; }
public InvoicePaymentStatus PaymentStatus { get; set; }
public decimal? PendingAmount { get; set; }
public decimal? PaymentAmount { get; set; }
public InvoiceType Type { get; set; }
public decimal TotalAmount { get; set; }
public decimal? CGSTAmount { get; set; }
public decimal? SGSTAmount { get; set; }
public decimal? IGSTAmount { get; set; }
public decimal TotalAmountWithTax { get; set; }
[Required]
public Address BillingAddress { get; set; } = new Address();
[Required]
public Address ShippingAddress { get; set; } = new Address();
public bool IsCancellation { get; set; }
public string? ReasonsForInvoiceCancellation { get; set; }
public DateTime? DueDate { get; set; }
public bool? SentStatus { get; set; }
public DateTime LogDts { get; set; } = DateTime.UtcNow;
public string? LogUserName { get; set; }
public Guid? LogUserId { get; set; }
public string? Notes { get; set; }
[Required]
public List<InvoiceItemDetails> ItemDetails { get; set; } = new List<InvoiceItemDetails>();
public decimal? RoundOff { get; set; }
public decimal? Discount { get; set; }
public ClearTaxStatus? IRNDetails { get; set; }
//Payment transaction only for credit note(From which payment the invoice is generated)
public Guid? TransactionId { get; set; }
public ClearTaxStatus? EwayDetails { get; set; }
public Guid ClaimId { get; set; } //Add
public string? WarrantyTicketNumber { get; set; } //Add
}
public class ImageInfo
{
public string? ImageId { get; set; }
}
public enum WarrantyStatus
{
ClaimRequested = 0, // Initial claim submission
ClaimAccepted = 1, // Claim has been approved
ClaimRejected = 2, // Claim has been rejected
WaitingForDamagedComponent = 3, // Damage component receive decision has been done
DamagedComponentReceived = 4,
SentForInspection = 5,
WaitingForFinalApproval = 6,
ServiceProcessing = 7, // Replacement or repair processing
ShippingMethodConfirmed = 8,
Dispatched = 9,
Delivered = 10,
ClaimClosed = 11 // Claim has been resolved and closed
}
public enum DamageComponentShippingBy
{
ShippedByBuyer = 0, // Buyer ships the damaged component
ShippedThroughCourier = 1, // Courier is used for shipping
PickedUpBySeller = 2, // Seller picks up the damaged component
NotSpecified = 99 // Default or unspecified value
}
public enum ShippingBy
{
PickedUpByBuyer = 0,
ShippedThroughCourier = 1,
ShippedBySeller = 2,
NotSpecified = 99
}
public enum ActionForWarranty
{
Repair = 0, // Component will be repaired
Replace = 1, // Component will be replaced
Reject = 2 // Warranty claim is rejected
}
public enum InvoiceType
{
Ordered,
Adhoc,
DueNote,
CreditNote,
FOC // Added the last one
} -
API Interfaces:
(Define the APIs required for this feature, including endpoints, methods, request/response formats.)Endpoint Method Parameters Response Response Status Codes Notes api/inventory/warranty/components/invoice-historyPOSTComponentsInvoiceHistoryRequestComponentsInvoiceHistory200,401,404,403,500To get the components invoice history.api/inventory/warranty/claims/initiatePOSTWarrantyClaimA object with 2 properties - 1.Message 2WarrantyClaim200,401,404,403,500To initiate a warranty claim.api/inventory/warranty/claims/uploadPOSTIFormFileCollection filesList<ImageInfo>200,401,404,403,500To upload the attachment at the time of warranty claim./api/inventory/warranty/claims/listPOSTWarrantyFilter<ServerPaginatedData<WarrantyMinimalInfo>200,401,404,403,500To fetch paginated warranty claims for tracking or management./api/inventory/warranty/claims/{claimId}GETGuid claimIdWarrantyDetailInfo200,401,404,403,500To get detailed information about a specific warranty claim./api/inventory/warranty/claims/updatePUTWarrantyUpdateRecordstring message200,401,404,403,500To modify or update warranty claim information & also used to update status/api/inventory/warranty/claims/{claimId}/received-detailsPOSTGuid claimId,DamagedComponentReceiptDamagedComponentReceipt200,401,404,403,500To add or update the receiving details of the damaged components./api/inventory/warranty/claims/{claimId}/received-detailsGETGuid claimIdDamagedComponentReceipt200,401,404,403,500To get the receiving details of the damaged components./api/inventory/warranty/claims/{claimId}/inspection-initiatePOSTInspectionInitiationRecordstring message200,401,404,403,500To add or update the data for sending the damaged component for inspection./api/inventory/warranty/claims/{claimId}/inspection-initiateGETGuid claimIdInspectionInitiationRecord200,401,404,403,500To get the data for sending the damaged component for inspection./api/inventory/warranty/claims/{claimId}/inspection-resultPOSTGuid ClaimId,List<ActionRecommendedForComponent> actions,[FromQuery] _OperationType operationType = _OperationType.Insertstring message200,401,404,403,500To add or update the data for inspection result of the claimed components./api/inventory/warranty/claims/{claimId}/inspection-resultGETGuid claimIdList<ActionRecommendedForComponent>200,401,404,403,500To get the inspection result of the damaged components./api/inventory/warranty/claims/{claimId}/actionPOSTGuid claimId,List<ActionTakenForComponent> actions,[FromQuery] _OperationType operationType = _OperationType.InsertWarrantyActionDetail200,401,404,403,500To add or update info about what actions taken on a warranty claim./api/inventory/warranty/claims/{claimId}/action/actionsGETGuid claimIdList<ActionTakenForComponent>200,401,404,403,500To retrieve info about what actions taken on a warranty claim against the components./api/inventory/warranty/claims/{claimId}/confirm-shipping-methodPOSTGuid claimId,ShippingDetailsRecord shippingDetailsstring message200,401,404,403,500To confirm the shipping procedure after the repair or replacement./api/inventory/warranty/component-suggestionGET[FromQuery][Required] Guid consumerId,[FromQuery][Required]ComponentType componentTypeList<string>200,401,404,403,500Fetches a list of components which are purchased by the consumer of the given particular component type as well as eligible for claiming warranty./api/inventory/warranty/dispatchPOSTGuid claimId,WarrantyDispatchDetails dispatchDetailsstring message200,401,404,403,500Save or update dispatch information for a warranty claim./api/warranty/dispatchGETGuid claimIdWarrantyDispatch200,401,404,403,500Fetch dispatch information of a specific warranty replacement.
-
Third-Party Integrations:
(List any third-party services or tools that need to be integrated.) -
Workflow:
Flow Chart for warranty management :
Development Tasks & Estimates
(Break down the development process into smaller tasks and provide time estimates for each.)
| No | Task Name | Estimate (Hours) | Dependencies | Notes |
|---|---|---|---|---|
| 1 | Define Workflow & Planing for Warranty Management | 10 hrs | Establish the overall workflow for the warranty management system, covering all stages, including claims initiation, inspection, replacement, repair, and delivery. Outline the sequence of actions and interdependencies. | |
| 2 | Screen Planing Warranty Management | 10 hrs | Define and plan the UI screens required for warranty management, such as claim initiation, inspection updates, dispatch, and delivery tracking. | |
| 3 | Documentation for Warranty Management | 4 hours | ||
| 4 | Model Creation for Warranty Management | 2 hours | Define and create models required for the warranty management APIs, ensuring compatibility with the planned workflows and database schema. | |
| 5 | Database Schema Finalization | 2 hours | Finalize the database schema for warranty management | |
| 6 | /api/warranty/claims/initiate API | 6 hrs | Create API for initiating warranty claims. | |
| 7 | Backend Testing for /api/warranty/claims/initiate API | 2 hrs | Testing for API of initiating warranty claims. | |
| 8 | /api/warranty/claims/list API | 6 hrs | Create API for listing warranty claims with pagination. | |
| 9 | Backend Testing for /api/warranty/claims/list API | 2 hrs | Testing for API of listing warranty claims with pagination. | |
| 10 | /api/warranty/claims/{claimId}/receive-details POST API | 5 hrs | Create API to add or update receiving details of damaged components. | |
| 11 | Backend Testing for /api/warranty/claims/{claimId}/receive-details POST API | 1.5 hrs | Create API to add or update receiving details of damaged components. | |
| 12 | /api/warranty/claims/{claimId}/receive-details GET API | 5 hrs | Create API to fetch receiving details of damaged components. | |
| 13 | Backend Testing for /api/warranty/claims/{claimId}/receive-details GET API | 1 hrs | Testing for API to fetch receiving details of damaged components. | |
| 14 | /api/warranty/claims/{claimId}/inspection-initiate POST API | 5 hrs | Create API to add or update data for sending component for inspection. | |
| 15 | Backend Testing for /api/warranty/claims/{claimId}/inspection-initiate POST API | 1 hrs | Testing for API to add or update data for sending component for inspection. | |
| 16 | /api/warranty/claims/{claimId}/inspection-initiate GET API | 4 hrs | Create API to retrieve inspection initiation data. | |
| 17 | Backend Testing for /api/warranty/claims/{claimId}/inspection-initiate GET API | 1 hrs | Testing for API to retrieve inspection initiation data. | |
| 18 | /api/warranty/claims/{claimId}/inspection-result POST API | 4 hrs | Create API to add or update inspection result data. | |
| 19 | Backend Testing for /api/warranty/claims/{claimId}/inspection-result POST API | 1 hrs | Testing for API to add or update inspection result data. | |
| 20 | /api/warranty/claims/{claimId}/inspection-result GET API | 4 hrs | Create API to retrieve inspection result data. | |
| 21 | Backend Testing for /api/warranty/claims/{claimId}/inspection-result GET API | 1 hrs | Backend testing for API to retrieve inspection result data. | |
| 22 | /api/warranty/claims/{claimId}/actions POST API | 6 hrs | Create API to add or update action taken on warranty claims. | |
| 23 | Backend Testing for /api/warranty/claims/{claimId}/actions API | 2 hrs | Backend testing for API to add or update action taken on warranty claims. | |
| 24 | /api/warranty/claims/{claimId}/foc-invoice-pdf API | 8 hrs | Create API to generate FOC invoice PDF for warranty claim. | |
| 25 | Backend testing for /api/warranty/claims/{claimId}/foc-invoice-pdf API | 3 hrs | Testing for API to generate FOC invoice PDF for warranty claim. | |
| 26 | /api/warranty/components-suggestions API | 8 hrs | Create an API to fetch all components from an invoice that are eligible for warranty claims. Components should not already be claimed for warranty or returned through a credit note invoice. | |
| 27 | Backend testing for /api/warranty/components-suggestions API | 2 hrs | Testing to ensure the API fetches only eligible components for warranty claims and provides accurate suggestions. | |
| 28 | /api/warranty/component-purchase-info API | 8 hrs | Fetch detailed purchase information for the claimed component. | |
| 29 | Backend Testing for /api/warranty/component-purchase-info API | 2 hrs | Fetch detailed purchase information for any component. | |
| 30 | /api/warranty/dispatch POST API | 5 hrs | Add or update dispatch info for any particular warranty. | |
| 31 | Backend Testing /api/warranty/dispatch API | 1 hrs | Test the API to ensure it handles delivery scenarios for warranty items, order items, and combined deliveries. Verify support for cases where both warranty and order items are dispatched together in one delivery process. | |
| 32 | /api/warranty/dispatch GET API | 4 hrs | Get the warranty dispatch details. | |
| 33 | Backend Testing /api/warranty/dispatch API | 1 hrs | Test the API to verify accurate retrieval of delivery information. | |
| 34 | /api/warranty/send-otp API | 6 hrs | API to handle OTP generation and send otp to the buyer at the time of warranty dispatch. | |
| 35 | Backend Testing /api/warranty/send-otp API | 2 hrs | Test the API to handle OTP generation and send otp to the buyer at the time of warranty dispatch. | |
| 36 | /api/warranty/verify/otp API | 3.5 hrs | API to verify OTP just before warranty item delivered. | |
| 37 | Backend Testing /api/warranty/verify/otp API | 1 hrs | Test the API of verify OTP. | |
| 38 | /api/warranty/dispatch/list API | 6 hrs | Get paginated list of warranty (with their minimal dispatch) info which is already dispatched. | |
| 39 | Backend Testing of /api/warranty/dispatch/list API | 2 hrs | Test the Get paginated list of warranty API. | |
| 40 | Generate FOC Invoice after Replacement or Repair | 6 hrs | Generate FOC Invoice after Replacement or Repair | |
| 41 | Update /api/payment/invoice/get/invoice/receivedorder API | 4 hrs | Modify the API to show order number and warranty ticket number in the invoice paginated call. | |
| 42 | Backend Testing /api/payment/invoice/get/invoice/receivedorder API | 1 hr | Test the updated /api/payment/invoice/get/invoice/receivedorder API. | |
| 43 | Update /api/payment/invoice/get/invoicedetails API | 3 hrs | Show warranty brief details such as warranty ticket number and warranty claim date in the response. | |
| 44 | Backend Testing /api/payment/invoice/get/invoicedetails API | 1 hr | Test the updated /api/payment/invoice/get/invoicedetails API to ensure correct data retrieval. | |
| 45 | Update /api/payment/invoice/invoice/generate/b2b API | 3 hrs | In case of warranty, set InvoiceType to "FOC" and save WarrantyClaimId. | |
| 46 | Backend Testing /api/payment/invoice/invoice/generate/b2b API | 1 hr | Test the updated /api/payment/invoice/invoice/generate/b2b API to ensure correct handling of FOC invoices. | |
| 47 | Generate Warranty Ticket Number in a Particular Pattern | 3 hrs | Implement the logic to generate warranty ticket numbers following a specific pattern. | |
| 48 | Change Naming Pattern for FOC Invoice | 2 hrs | Update the naming pattern for FOC invoices to reflect changes in the system. | |
| 49 | Update Invoice PDF Design for FOC Invoice | 3 hrs | Modify the invoice PDF design to include relevant information for FOC invoices. | |
| 50 | Testing for FOC Invoice PDF | 2 hrs | Modify the invoice PDF design to include relevant information for FOC invoices. | |
| 51 | Mail Send to Both Buyer and Seller at the Time of Warranty Claim | 2 hrs | Send an email to both the buyer and seller when a warranty claim is made. | |
| 52 | Mail Send to Both Buyer and Seller at the Time of Warranty Approval | 2 hrs | Send an email to both the buyer and seller when the warranty claim is approved. | |
| 53 | Mail Send to Both Buyer and Seller at the Time of Warranty Rejection | 2 hrs | Send an email to both the buyer and seller when the warranty claim is rejected. | |
| 54 | Mail Send to Both Buyer and Seller at the Time of Damage Item Receipt | 2 hrs | Send an email to both the buyer and seller when the damaged item is received for warranty processing. | |
| 55 | Mail Send to Both Buyer and Seller at the Time of Replacement or Repair Item Dispatch | 2 hrs | Send an email to both the buyer and seller when the replacement or repair item is dispatched. | |
| 56 | Mail Send to Both Buyer and Seller at the Time of OTP Sent After Dispatch | 2 hrs | Send an email to both the buyer and seller when the OTP is sent after dispatch. | |
| 57 | Mail Send to Both Buyer and Seller at the Time of OTP Verification | 2 hrs | Send an email to both the buyer and seller when OTP verification is completed. | |
| 58 | Mail Send to Both Buyer and Seller at the Time of OTP Delivered | 2 hrs | Send an email to both the buyer and seller when the OTP is successfully delivered. | |
| 59 | Create Mail HTML Template for Warranty | 8 hrs | Create a new HTML email template for warranty notifications and processes. | |
| 60 | /api/warranty/claims/{claimId}/actions GET API | 5 hrs | Create API to retrieve action taken on warranty claims. | |
| 61 | Backend Testing for /api/warranty/claims/{claimId}/actions API | 1 hrs | Backend testing for API to retrieve action taken on warranty claims. | |
| 62 | /api/warranty/claims-details GET API | 5 hrs | API to retrieve details of a warranty claim. | |
| 63 | Backend Testing for /api/warranty/claims-details GET API | 1 hrs | Backend testing for API to retrieve details of a warranty claim. | |
| 64 | /api/warranty/claims/update POST API | 5 hrs | API to update a warranty claim. | |
| 65 | Backend Testing for /api/warranty/claims/update POST API | 1 hrs | Backend testing for API to update a warranty | |
| 66 | Claim warranty page UI | 12 hrs | ||
| 67 | Claim warranty page API integration | 3 hrs | ||
| 68 | My warranty list UI | 3 hrs | ||
| 69 | My warranty list API integration | 2 hrs | ||
| 70 | My warranty filter | 2 hrs | ||
| 71 | Received warranty list UI | 3 hrs | ||
| 72 | Received warranty filter | 4 hrs | ||
| 73 | Warranty track UI | 14 hrs | ||
| 74 | Received warranty list api integration | 3 hrs | ||
| 75 | Warranty approve reject UI | 2 hrs | ||
| 76 | Add received details UI | 2 hrs | ||
| 77 | Available for dispatch list UI | 4 hrs | ||
| 78 | Available for dispatch list api integration | 3 hrs | ||
| 79 | Ready to dispatch page UI | 4 hrs | ||
| 80 | Ready to dispatch list api integration | 3 hrs | ||
| 81 | Quality check page UI | 4 hrs | ||
| 82 | Quality check details add api integration | 4 hrs | ||
| 83 | Repair replace page UI | 4 hrs | ||
| 84 | Repair replace info add UI | 4 hrs | ||
| 85 | Repair detail view | 2 hrs | ||
| 86 | Quality check detail view | 2 hrs | ||
| Total | 303 hours |
Testing & Quality Assurance
(Outline the testing strategy and quality assurance measures for the feature.)
-
Unit Tests:
(List the unit tests that will be written for this feature.) -
Integration Tests:
(Describe how integration testing will be conducted.) -
Acceptance Criteria:
(Define the criteria that must be met for the feature to be considered complete.) -
Testing Tools:
(List any tools that will be used for testing.)
Deployment Considerations
(Describe any deployment considerations, including environment configurations, feature toggles, or migration steps.)
-
Configuration Changes:
(Detail any configuration changes required for this feature.)
CREATE TABLE IF NOT EXISTS public.tblwarrantyclaims
(
claimid uuid NOT NULL,
claimfor uuid NOT NULL,
assignedto uuid NOT NULL,
claiminitiatedbyconsumerid uuid NOT NULL,
claiminitiateby text COLLATE pg_catalog."default",
invoicenumber character varying(100) COLLATE pg_catalog."default",
invoicedate timestamp with time zone,
warrantyticketnumber text COLLATE pg_catalog."default" NOT NULL,
currentstatus character varying(100) COLLATE pg_catalog."default",
damageitemshippingby character varying(100) COLLATE pg_catalog."default",
replacementwithoutreceiveddamagecomponent boolean,
rejectionreason text COLLATE pg_catalog."default",
createdat timestamp with time zone DEFAULT CURRENT_TIMESTAMP,
focinvoicenumber character varying(100) COLLATE pg_catalog."default",
focinvoiceid uuid,
pickupaddress jsonb,
deliveryaddress jsonb,
notes text COLLATE pg_catalog."default",
logusername text COLLATE pg_catalog."default",
logdts timestamp with time zone DEFAULT CURRENT_TIMESTAMP,
replacementitemshippingmethod character varying(100) COLLATE pg_catalog."default",
componenttype text COLLATE pg_catalog."default",
componentnumbers text[] COLLATE pg_catalog."default",
CONSTRAINT tblwarrantyclaims_pkey PRIMARY KEY (claimid),
CONSTRAINT tblwarrantyclaims_warrantyticketnumber_key UNIQUE (warrantyticketnumber)
);
CREATE TABLE IF NOT EXISTS public.tblclaimedcomponentdetails
(
componentid uuid NOT NULL,
claimid uuid,
componentnumber text COLLATE pg_catalog."default",
componenttype character varying(100) COLLATE pg_catalog."default",
model text COLLATE pg_catalog."default",
color text COLLATE pg_catalog."default",
brand text COLLATE pg_catalog."default",
additionalinfo jsonb,
damagedetails text COLLATE pg_catalog."default",
logusername text COLLATE pg_catalog."default",
logdts timestamp without time zone DEFAULT CURRENT_TIMESTAMP,
isbatterychecked boolean NOT NULL DEFAULT false,
batteryvoltagereading numeric NOT NULL DEFAULT 0,
attachments jsonb,
CONSTRAINT tblclaimedcomponentdetails_pkey PRIMARY KEY (componentid)
);
CREATE TABLE IF NOT EXISTS public.tblwarrantystatelog
(
transactionid uuid NOT NULL,
claimid uuid,
statename character varying(100) COLLATE pg_catalog."default" NOT NULL,
processdate timestamp with time zone DEFAULT CURRENT_TIMESTAMP,
ismailsend boolean DEFAULT false,
logusername character varying(100) COLLATE pg_catalog."default" NOT NULL,
logdts timestamp with time zone DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT tblwarrantystatelog_pkey PRIMARY KEY (transactionid)
);
CREATE TABLE IF NOT EXISTS public.tbldamagedcomponentreceipts
(
id uuid NOT NULL,
claimid uuid,
physicallyreceivedatplant boolean,
receivedby character varying(100) COLLATE pg_catalog."default",
receiveddate timestamp without time zone DEFAULT CURRENT_TIMESTAMP,
securityinwardregisterno text COLLATE pg_catalog."default",
damageitemshippingby text COLLATE pg_catalog."default",
couriername text COLLATE pg_catalog."default",
courierreceiptnumber text COLLATE pg_catalog."default",
trucknumber character varying(50) COLLATE pg_catalog."default",
drivername character varying(100) COLLATE pg_catalog."default",
drivercontact character varying(50) COLLATE pg_catalog."default",
notes text COLLATE pg_catalog."default",
logusername text COLLATE pg_catalog."default",
logdts timestamp without time zone DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT tbldamagedcomponentreceipts_pkey PRIMARY KEY (id)
);
CREATE TABLE IF NOT EXISTS public.tblinspectioninitiation
(
inspectionid uuid NOT NULL,
claimid uuid NOT NULL,
handoverdate timestamp without time zone NOT NULL,
handoverto character varying(100) COLLATE pg_catalog."default",
inspectionformnumber character varying(100) COLLATE pg_catalog."default",
notes text COLLATE pg_catalog."default",
logusername character varying(100) COLLATE pg_catalog."default",
logdts timestamp without time zone DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT tblinspectioninitiation_pkey PRIMARY KEY (inspectionid)
);
CREATE TABLE IF NOT EXISTS public.tblinspectionresult
(
id uuid NOT NULL,
claimid uuid NOT NULL,
conditionreportingdate timestamp without time zone,
checkedincdc boolean NOT NULL DEFAULT false,
actionrequired character varying(50) COLLATE pg_catalog."default",
notes text COLLATE pg_catalog."default",
logusername character varying(100) COLLATE pg_catalog."default",
logdts timestamp without time zone DEFAULT CURRENT_TIMESTAMP,
componentnumber text COLLATE pg_catalog."default",
componenttype text COLLATE pg_catalog."default",
CONSTRAINT tblinspectionresult_pkey PRIMARY KEY (id),
CONSTRAINT uq_claim_component UNIQUE (claimid, componentnumber, componenttype)
);
CREATE TABLE IF NOT EXISTS public.tblwarrantyactiondetails
(
actionid uuid NOT NULL,
claimid uuid NOT NULL,
action character varying(100) COLLATE pg_catalog."default" NOT NULL,
reasonforaction text COLLATE pg_catalog."default",
sanctionedby character varying(100) COLLATE pg_catalog."default",
partsused jsonb,
newcomponentnumber character varying(100) COLLATE pg_catalog."default",
notes text COLLATE pg_catalog."default",
logusername character varying(100) COLLATE pg_catalog."default",
logdts timestamp without time zone DEFAULT CURRENT_TIMESTAMP,
componentnumber text COLLATE pg_catalog."default",
componenttype text COLLATE pg_catalog."default",
CONSTRAINT tblwarrantyactiondetails_pkey PRIMARY KEY (actionid),
CONSTRAINT unique_warranty_action UNIQUE (claimid, componentnumber, componenttype)
);
CREATE TABLE IF NOT EXISTS public.tblwarrantydispatch
(
dispatchid uuid NOT NULL,
claimid uuid NOT NULL,
transid text COLLATE pg_catalog."default",
transname character varying(255) COLLATE pg_catalog."default",
transmode character varying(50) COLLATE pg_catalog."default",
distance numeric,
transdocno character varying(255) COLLATE pg_catalog."default",
transdocdt timestamp without time zone,
vehno character varying(50) COLLATE pg_catalog."default",
vehtype character varying(50) COLLATE pg_catalog."default",
drivername character varying(255) COLLATE pg_catalog."default",
driverphno character varying(50) COLLATE pg_catalog."default",
vehownership character varying(50) COLLATE pg_catalog."default",
wheeler character varying(50) COLLATE pg_catalog."default",
logdts timestamp without time zone NOT NULL,
logusername character varying(255) COLLATE pg_catalog."default",
loguserid uuid,
consumerid uuid,
openingkmreading numeric,
destinationkm numeric,
closingkmreading numeric,
journeykm numeric,
returnkm numeric,
tollexpense numeric,
facilitationexpense numeric,
dieselrefill numeric,
fasttagrecharge numeric,
driverpersonalexpense numeric,
otherexpenses numeric,
totalexpenses numeric,
totalfare numeric,
cashcollected numeric,
chequevalue numeric,
cashcollectiondate timestamp without time zone,
chequecollectiondate timestamp without time zone,
totalpayableamount numeric,
dispatchdate timestamp without time zone,
couriername character varying(255) COLLATE pg_catalog."default",
courierreceiptnumber character varying(255) COLLATE pg_catalog."default",
CONSTRAINT tblwarrantydispatch_pkey PRIMARY KEY (dispatchid)
);
ALTER TABLE tblinvoicemaster
ADD COLUMN WarrantyClaimId UUID;
ALTER TABLE tblComponentAnnexure
ADD COLUMN IsWarrantyClaimed BOOLEAN DEFAULT FALSE;
-- For tblinvoicemaster
ALTER TABLE tblinvoicemaster
ADD CONSTRAINT fk_warrantyclaimid FOREIGN KEY (WarrantyClaimId) REFERENCES tblWarrantyClaims (ClaimId) ON DELETE SET NULL;
ALTER TABLE tblComponentAnnexure rename column conponent_no to component_no; -
Rollout Plan:
(Outline the plan for rolling out the feature, including any phased releases.)
Risks & Mitigations
(Identify potential risks and the strategies to mitigate them.)
| Risk | Impact | Likelihood | Mitigation Strategy |
|---|---|---|---|
| ... | ... | ... | ... |
Review & Approval
(Include a section for review and approval by stakeholders.)
-
Reviewer:
Abhishak Kumar Roy -
Approval Date:
2024-12-09
Notes
(Add any additional notes or considerations related to the feature development here.)