Merge pull request #48 from Danakcorp/mrtz

add : complete return order
This commit is contained in:
morteza-mortezai
2025-11-01 15:32:41 +03:30
committed by GitHub
5 changed files with 60 additions and 6 deletions
@@ -4,16 +4,18 @@ import { controller, httpDelete, httpGet, httpPost, queryParam, request, request
import { HttpStatus } from "../../../common"; import { HttpStatus } from "../../../common";
import { BaseController } from "../../../common/base/controller"; import { BaseController } from "../../../common/base/controller";
import { ApiAuth, ApiModel, ApiOperation, ApiParam, ApiQuery, ApiResponse, ApiTags } from "../../../common/decorator/swggerDocs"; import { ApiAuth, ApiFile, ApiModel, ApiOperation, ApiParam, ApiQuery, ApiResponse, ApiTags } from "../../../common/decorator/swggerDocs";
import { PaginationDTO } from "../../../common/dto/pagination.dto"; import { PaginationDTO } from "../../../common/dto/pagination.dto";
import { Guard } from "../../../core/middlewares/guard.middleware"; import { Guard } from "../../../core/middlewares/guard.middleware";
import { ValidationMiddleware } from "../../../core/middlewares/validator.middleware"; import { ValidationMiddleware } from "../../../core/middlewares/validator.middleware";
import { IOCTYPES } from "../../../IOC/ioc.types"; import { IOCTYPES } from "../../../IOC/ioc.types";
import { UploadService } from "../../../utils/upload.service";
import { CancelService } from "../../cancel/cancel.service"; import { CancelService } from "../../cancel/cancel.service";
import { CreateCancelDTO } from "../../cancel/DTO/cancel.dto"; import { CreateCancelDTO } from "../../cancel/DTO/cancel.dto";
import { CancelReasonDTO } from "../../cancel/DTO/cancelReason.dto"; import { CancelReasonDTO } from "../../cancel/DTO/cancelReason.dto";
import { Gran } from "../../order/order.repository"; import { Gran } from "../../order/order.repository";
import { OrderService } from "../../order/order.service"; import { OrderService } from "../../order/order.service";
import { CompeleteReturnRequestDTO } from "../../return/DTO/return.dto";
import { ReasonDTO, UpdateReasonDTO } from "../../return/DTO/returnReason.dto"; import { ReasonDTO, UpdateReasonDTO } from "../../return/DTO/returnReason.dto";
import { ReturnService } from "../../return/return.service"; import { ReturnService } from "../../return/return.service";
import { OwnerRef } from "../../shop/models/Abstraction/IShop"; import { OwnerRef } from "../../shop/models/Abstraction/IShop";
@@ -76,10 +78,11 @@ export class AdminOrderController extends BaseController {
@ApiOperation("complete a return order request with return order id") @ApiOperation("complete a return order request with return order id")
@ApiResponse("successful", HttpStatus.Ok) @ApiResponse("successful", HttpStatus.Ok)
@ApiParam("returnOrderId", "id of return order", true) @ApiParam("returnOrderId", "id of return order", true)
@ApiModel(CompeleteReturnRequestDTO)
@ApiAuth() @ApiAuth()
@httpPost("/returns/:returnOrderId/complete", Guard.authAdmin(), Guard.checkAdminPermissions([PermissionEnum.ORDER])) @httpPost("/returns/:returnOrderId/complete", Guard.authAdmin(), Guard.checkAdminPermissions([PermissionEnum.ORDER]))
public async completeReturnRequest(@requestParam("returnOrderId") returnOrderId: string) { public async completeReturnRequest(@requestParam("returnOrderId") returnOrderId: string, @requestBody() dto: CompeleteReturnRequestDTO) {
const data = await this.returnService.completeReturnRequest(returnOrderId); const data = await this.returnService.completeReturnRequest(returnOrderId, dto);
return this.response(data); return this.response(data);
} }
@@ -283,4 +286,23 @@ export class AdminOrderController extends BaseController {
const data = await this.orderService.getSaleOrderChart(granularity, from, to); const data = await this.orderService.getSaleOrderChart(granularity, from, to);
return this.response(data); return this.response(data);
} }
//uploader
@ApiOperation("Upload a return refund receipt info image ")
@ApiResponse("File uploaded successfully", HttpStatus.Accepted)
@ApiFile("image")
@ApiAuth()
@httpPost("/image/upload", Guard.authAdmin(), UploadService.single("image", "shipping-receipt"))
public async uploadImage(@request() req: Request) {
const file = req.file as Express.MulterS3.File;
const data = {
message: "file uploaded!",
url: {
size: file?.size,
url: file?.location,
type: file?.mimetype,
},
};
return this.response({ data }, HttpStatus.Accepted);
}
} }
+21
View File
@@ -128,3 +128,24 @@ export class ReturnRequestDTO {
}) })
items: ReturnRequestItemsDTO[]; items: ReturnRequestItemsDTO[];
} }
export class CompeleteReturnRequestDTO {
@Expose()
@IsNotEmpty()
@IsString()
@ApiProperty({ type: "string", description: "Date", example: "1404/02/02" })
refundDate: string;
@Expose()
@IsNotEmpty()
@IsString()
@ApiProperty({ type: "string", description: "comment", example: "متن دلخواه" })
refundComment: string;
@Expose()
@IsOptional()
@IsNotEmpty()
@IsString()
@ApiProperty({ type: "string", description: "the image of recept if mandatory ", example: "https://cdn.com" })
refundReceipt?: string;
}
@@ -7,4 +7,7 @@ export interface IReturnOrder {
user: Types.ObjectId; user: Types.ObjectId;
status: StatusEnum; status: StatusEnum;
total_price: number; total_price: number;
refundReceipt: string;
refundDate: Date;
refundComment: string;
} }
@@ -9,6 +9,9 @@ const ReturnOrderSchema = new Schema<IReturnOrder>(
user: { type: Schema.Types.ObjectId, ref: "User", required: true }, user: { type: Schema.Types.ObjectId, ref: "User", required: true },
status: { type: String, enum: StatusEnum, default: StatusEnum.Pending }, status: { type: String, enum: StatusEnum, default: StatusEnum.Pending },
total_price: { type: Number, default: 0 }, total_price: { type: Number, default: 0 },
refundReceipt: { type: String, default: null },
refundComment: { type: String, default: null },
refundDate: { type: Date, default: null },
}, },
{ timestamps: true, toJSON: { versionKey: false, virtuals: true }, id: false }, { timestamps: true, toJSON: { versionKey: false, virtuals: true }, id: false },
); );
+8 -3
View File
@@ -1,7 +1,7 @@
import { inject, injectable } from "inversify"; import { inject, injectable } from "inversify";
import { isValidObjectId, startSession } from "mongoose"; import { isValidObjectId, startSession } from "mongoose";
import { ReturnOrderDTO, ReturnRequestDTO } from "./DTO/return.dto"; import { CompeleteReturnRequestDTO, ReturnOrderDTO, ReturnRequestDTO } from "./DTO/return.dto";
import { ReasonDTO, UpdateReasonDTO } from "./DTO/returnReason.dto"; import { ReasonDTO, UpdateReasonDTO } from "./DTO/returnReason.dto";
import { ReturnOrderItemRepo, ReturnOrderRepo, ReturnReasonRepo } from "./return.repository"; import { ReturnOrderItemRepo, ReturnOrderRepo, ReturnReasonRepo } from "./return.repository";
import { PaginationDTO } from "../../common/dto/pagination.dto"; import { PaginationDTO } from "../../common/dto/pagination.dto";
@@ -192,12 +192,17 @@ class ReturnService {
//####################################################### //#######################################################
//####################################################### //#######################################################
async completeReturnRequest(returnOrderId: string) { async completeReturnRequest(returnOrderId: string, dto: CompeleteReturnRequestDTO) {
const session = await startSession(); const session = await startSession();
session.startTransaction(); session.startTransaction();
const { refundComment, refundDate, refundReceipt } = dto;
try { try {
// update returnOrder status to 'completed' // update returnOrder status to 'completed'
const returnOrder = await this.returnOrderRepo.model.findByIdAndUpdate(returnOrderId, { status: StatusEnum.Completed }, { session }); const returnOrder = await this.returnOrderRepo.model.findByIdAndUpdate(
returnOrderId,
{ status: StatusEnum.Completed, refundComment, refundDate, refundReceipt },
{ session },
);
if (!returnOrder) throw new BadRequestError(OrderMessage.ReturnOrderNotFound); if (!returnOrder) throw new BadRequestError(OrderMessage.ReturnOrderNotFound);
// Fetch ReturnOrderItems // Fetch ReturnOrderItems