modifications of file upload and tender upload

main
josh 3 years ago
parent 20f1d829ea
commit 0625d414ed

@ -107,7 +107,7 @@ export class AuthService {
if(body.otp != newOtp[0].otp){ if(body.otp != newOtp[0].otp){
throw new UnauthorizedException('Unauthorized Access') throw new UnauthorizedException('Unauthorized Access')
} }
console.log("salt1234");
const salt = await bcrypt.genSalt(); const salt = await bcrypt.genSalt();
iuserData.salt = salt; iuserData.salt = salt;
iuserData.pass = await bcrypt.hash(body.pass, salt); iuserData.pass = await bcrypt.hash(body.pass, salt);
@ -153,7 +153,7 @@ export class AuthService {
console.log("isUserExist",isUserExist); console.log("isUserExist",isUserExist);
if(!isUserExist){ if(!isUserExist && flag == "F"){
throw new BadRequestException("User not found"); throw new BadRequestException("User not found");
} }
if (flag == 'R' && isUserExist) { if (flag == 'R' && isUserExist) {
@ -287,7 +287,6 @@ export class AuthService {
} }
try { try {
let igotp: PcdotpDto = new PcdotpDto(); let igotp: PcdotpDto = new PcdotpDto();
igotp.otp = newOtp; igotp.otp = newOtp;
igotp.createdBy = 'SYSTEM'; igotp.createdBy = 'SYSTEM';

@ -9,4 +9,6 @@ export class TenderDocumentDto{
doc_type:string; doc_type:string;
doc_size:number; doc_size:number;
doc_category:string
} }

@ -3,6 +3,8 @@ import { GetUser } from "src/auth/dto/get-user.decorator";
import { PcduserDto } from "src/auth/dto/pcd-user.dto"; import { PcduserDto } from "src/auth/dto/pcd-user.dto";
import { FindManyOptions } from "typeorm"; import { FindManyOptions } from "typeorm";
import { PcdFormGridService } from "./pcd-form-grid.service"; import { PcdFormGridService } from "./pcd-form-grid.service";
import { AuthGuard } from "@nestjs/passport";
import { AuthModule } from "src/auth/auth.module";
export class PcdFormGridController<T>{ export class PcdFormGridController<T>{
private logger = new Logger('PcdFormGridController'); // for logging private logger = new Logger('PcdFormGridController'); // for logging

@ -22,6 +22,7 @@ export class PcdTransactionController<T> {
return await this.service.findOne(filter, id); return await this.service.findOne(filter, id);
} }
@UseGuards(AuthGuard())
@Post() @Post()
async createOne(@Body() body: T, ): Promise<T> { async createOne(@Body() body: T, ): Promise<T> {
return await this.service.createOne(body,); return await this.service.createOne(body,);

@ -1,8 +1,11 @@
import { Controller } from '@nestjs/common'; import { Controller,UseGuards } from '@nestjs/common';
import { DocumentTypeDto } from 'src/dto/document-type.dto'; import { DocumentTypeDto } from 'src/dto/document-type.dto';
import { PcdFormGridController } from 'src/framework/beans/pcd-form-grid.controller'; import { PcdFormGridController } from 'src/framework/beans/pcd-form-grid.controller';
import { DocumentTypeService } from './document-type.service'; import { DocumentTypeService } from './document-type.service';
import { AuthGuard } from '@nestjs/passport';
@UseGuards(AuthGuard())
@Controller('document-type') @Controller('document-type')
export class DocumentTypeController extends PcdFormGridController<DocumentTypeDto>{ export class DocumentTypeController extends PcdFormGridController<DocumentTypeDto>{

@ -3,10 +3,12 @@ import { DocumentTypeController } from './document-type.controller';
import { DocumentTypeService } from './document-type.service'; import { DocumentTypeService } from './document-type.service';
import { TypeOrmModule } from '@nestjs/typeorm'; import { TypeOrmModule } from '@nestjs/typeorm';
import { DocumentTypeRepository } from './document-type.repository'; import { DocumentTypeRepository } from './document-type.repository';
import { AuthModule } from 'src/auth/auth.module';
@Module({ @Module({
imports: [ imports: [
TypeOrmModule.forFeature([DocumentTypeRepository]) TypeOrmModule.forFeature([DocumentTypeRepository]),
AuthModule
], ],
controllers: [DocumentTypeController], controllers: [DocumentTypeController],
providers: [DocumentTypeService] providers: [DocumentTypeService]

@ -1,8 +1,11 @@
import { Controller } from '@nestjs/common'; import { Controller,UseGuards } from '@nestjs/common';
import { EmdFeeTypeDto } from 'src/dto/emd-fee-type.dto'; import { EmdFeeTypeDto } from 'src/dto/emd-fee-type.dto';
import { PcdFormGridController } from 'src/framework/beans/pcd-form-grid.controller'; import { PcdFormGridController } from 'src/framework/beans/pcd-form-grid.controller';
import { EmdFeeTypeService } from './emd-fee-type.service'; import { EmdFeeTypeService } from './emd-fee-type.service';
import { AuthGuard } from '@nestjs/passport';
@UseGuards(AuthGuard())
@Controller('emd-fee-type') @Controller('emd-fee-type')
export class EmdFeeTypeController extends PcdFormGridController<EmdFeeTypeDto>{ export class EmdFeeTypeController extends PcdFormGridController<EmdFeeTypeDto>{

@ -3,10 +3,12 @@ import { EmdFeeTypeController } from './emd-fee-type.controller';
import { EmdFeeTypeService } from './emd-fee-type.service'; import { EmdFeeTypeService } from './emd-fee-type.service';
import { TypeOrmModule } from '@nestjs/typeorm'; import { TypeOrmModule } from '@nestjs/typeorm';
import { EmdFeeTypeRepository } from './emd-fee-type.repository'; import { EmdFeeTypeRepository } from './emd-fee-type.repository';
import { AuthModule } from 'src/auth/auth.module';
@Module({ @Module({
imports: [ imports: [
TypeOrmModule.forFeature([EmdFeeTypeRepository]) TypeOrmModule.forFeature([EmdFeeTypeRepository]),
AuthModule
], ],
controllers: [EmdFeeTypeController], controllers: [EmdFeeTypeController],
providers: [EmdFeeTypeService] providers: [EmdFeeTypeService]

@ -1,8 +1,11 @@
import { Controller } from '@nestjs/common'; import { Controller ,UseGuards} from '@nestjs/common';
import { FormOfContractDto } from 'src/dto/form-of-contract.dto'; import { FormOfContractDto } from 'src/dto/form-of-contract.dto';
import { PcdFormGridController } from 'src/framework/beans/pcd-form-grid.controller'; import { PcdFormGridController } from 'src/framework/beans/pcd-form-grid.controller';
import { FormOfContractService } from './form-of-contract.service'; import { FormOfContractService } from './form-of-contract.service';
import { AuthGuard } from '@nestjs/passport';
@UseGuards(AuthGuard())
@Controller('form-of-contract') @Controller('form-of-contract')
export class FormOfContractController extends PcdFormGridController<FormOfContractDto> { export class FormOfContractController extends PcdFormGridController<FormOfContractDto> {
constructor( constructor(

@ -4,10 +4,12 @@ import { FormOfContractService } from './form-of-contract.service';
import { typeOrmConfig } from 'src/config/typeorm.config'; import { typeOrmConfig } from 'src/config/typeorm.config';
import { TypeOrmModule } from '@nestjs/typeorm'; import { TypeOrmModule } from '@nestjs/typeorm';
import { FormOfContractRepository } from './form-of-contract.repository'; import { FormOfContractRepository } from './form-of-contract.repository';
import { AuthModule } from 'src/auth/auth.module';
@Module({ @Module({
imports: [ imports: [
TypeOrmModule.forFeature([FormOfContractRepository]) TypeOrmModule.forFeature([FormOfContractRepository]),
AuthModule
], ],
controllers: [FormOfContractController], controllers: [FormOfContractController],
providers: [FormOfContractService] providers: [FormOfContractService]

@ -1,8 +1,11 @@
import { Controller } from '@nestjs/common'; import { Controller,UseGuards } from '@nestjs/common';
import { PaymentModeDto } from 'src/dto/payment-mode.dto'; import { PaymentModeDto } from 'src/dto/payment-mode.dto';
import { PcdFormGridController } from 'src/framework/beans/pcd-form-grid.controller'; import { PcdFormGridController } from 'src/framework/beans/pcd-form-grid.controller';
import { PaymentModeService } from './payment-mode.service'; import { PaymentModeService } from './payment-mode.service';
import { AuthGuard } from '@nestjs/passport';
@UseGuards(AuthGuard())
@Controller('payment-mode') @Controller('payment-mode')
export class PaymentModeController extends PcdFormGridController<PaymentModeDto> { export class PaymentModeController extends PcdFormGridController<PaymentModeDto> {

@ -3,10 +3,12 @@ import { PaymentModeController } from './payment-mode.controller';
import { PaymentModeService } from './payment-mode.service'; import { PaymentModeService } from './payment-mode.service';
import { TypeOrmModule } from '@nestjs/typeorm'; import { TypeOrmModule } from '@nestjs/typeorm';
import { PaymentModeRepository } from './payment-mode.repository'; import { PaymentModeRepository } from './payment-mode.repository';
import { AuthModule } from 'src/auth/auth.module';
@Module({ @Module({
imports: [ imports: [
TypeOrmModule.forFeature([PaymentModeRepository]) TypeOrmModule.forFeature([PaymentModeRepository]),
AuthModule
], ],
controllers: [PaymentModeController], controllers: [PaymentModeController],
providers: [PaymentModeService] providers: [PaymentModeService]

@ -1,8 +1,10 @@
import { Controller } from '@nestjs/common'; import { Controller ,UseGuards} from '@nestjs/common';
import { ProductCategoryDto } from 'src/dto/product-category.dto'; import { ProductCategoryDto } from 'src/dto/product-category.dto';
import { PcdFormGridController } from 'src/framework/beans/pcd-form-grid.controller'; import { PcdFormGridController } from 'src/framework/beans/pcd-form-grid.controller';
import { ProductCategoryService } from './product-category.service'; import { ProductCategoryService } from './product-category.service';
import { AuthGuard } from '@nestjs/passport';
@UseGuards(AuthGuard())
@Controller('product-category') @Controller('product-category')
export class ProductCategoryController extends PcdFormGridController<ProductCategoryDto> { export class ProductCategoryController extends PcdFormGridController<ProductCategoryDto> {

@ -3,10 +3,12 @@ import { ProductCategoryController } from './product-category.controller';
import { ProductCategoryService } from './product-category.service'; import { ProductCategoryService } from './product-category.service';
import { TypeOrmModule } from '@nestjs/typeorm'; import { TypeOrmModule } from '@nestjs/typeorm';
import { ProductCategoryRepository } from './product-category.repository'; import { ProductCategoryRepository } from './product-category.repository';
import { AuthModule } from 'src/auth/auth.module';
@Module({ @Module({
imports: [ imports: [
TypeOrmModule.forFeature([ProductCategoryRepository]) TypeOrmModule.forFeature([ProductCategoryRepository]),
AuthModule
], ],
controllers: [ProductCategoryController], controllers: [ProductCategoryController],
providers: [ProductCategoryService] providers: [ProductCategoryService]

@ -1,8 +1,10 @@
import { Controller } from '@nestjs/common'; import { Controller ,UseGuards} from '@nestjs/common';
import { TenderCategoryDto } from 'src/dto/tender-category.dto'; import { TenderCategoryDto } from 'src/dto/tender-category.dto';
import { PcdFormGridController } from 'src/framework/beans/pcd-form-grid.controller'; import { PcdFormGridController } from 'src/framework/beans/pcd-form-grid.controller';
import { TenderCategoryService } from './tender-category.service'; import { TenderCategoryService } from './tender-category.service';
import { AuthGuard } from '@nestjs/passport';
@UseGuards(AuthGuard())
@Controller('tender-category') @Controller('tender-category')
export class TenderCategoryController extends PcdFormGridController<TenderCategoryDto>{ export class TenderCategoryController extends PcdFormGridController<TenderCategoryDto>{

@ -3,10 +3,12 @@ import { TenderCategoryController } from './tender-category.controller';
import { TenderCategoryService } from './tender-category.service'; import { TenderCategoryService } from './tender-category.service';
import { TypeOrmModule } from '@nestjs/typeorm'; import { TypeOrmModule } from '@nestjs/typeorm';
import { TenderCategoryRepository } from './tender-category.repository'; import { TenderCategoryRepository } from './tender-category.repository';
import { AuthModule } from 'src/auth/auth.module';
@Module({ @Module({
imports: [ imports: [
TypeOrmModule.forFeature([TenderCategoryRepository]) TypeOrmModule.forFeature([TenderCategoryRepository]),
AuthModule
], ],
controllers: [TenderCategoryController], controllers: [TenderCategoryController],
providers: [TenderCategoryService] providers: [TenderCategoryService]

@ -1,8 +1,10 @@
import { Controller } from '@nestjs/common'; import { Controller ,UseGuards} from '@nestjs/common';
import { TenderDocumentDto } from 'src/dto/tender-document.dto'; import { TenderDocumentDto } from 'src/dto/tender-document.dto';
import { PcdFormGridController } from 'src/framework/beans/pcd-form-grid.controller'; import { PcdFormGridController } from 'src/framework/beans/pcd-form-grid.controller';
import { TenderDocService } from './tender-doc.service'; import { TenderDocService } from './tender-doc.service';
import { AuthGuard } from '@nestjs/passport';
@UseGuards(AuthGuard())
@Controller('tender-doc') @Controller('tender-doc')
export class TenderDocController extends PcdFormGridController<TenderDocumentDto>{ export class TenderDocController extends PcdFormGridController<TenderDocumentDto>{

@ -1,25 +1,24 @@
import { PcdBaseEntity } from "src/framework/custom/pcd-entity.custom"; import { PcdBaseEntity } from "src/framework/custom/pcd-entity.custom";
import { TenderMaster } from "src/tables/tender-master/tender-master.entity"; import { TenderMaster } from "src/tables/tender-master/tender-master.entity";
import { Column, Entity, JoinColumn, ManyToOne, PrimaryColumn } from "typeorm"; import { Column, Entity, JoinColumn, ManyToOne, PrimaryColumn, PrimaryGeneratedColumn } from "typeorm";
import { DocumentType } from "../document-type/document-type.entity"; import { DocumentType } from "../document-type/document-type.entity";
@Entity("tender-doc") @Entity("tender-doc")
export class TenderDoc extends PcdBaseEntity{ export class TenderDoc extends PcdBaseEntity{
@PrimaryColumn({ @PrimaryGeneratedColumn({
name:"id" name:"id"
}) })
id:number id:number
@Column({ @Column({
name:"tender_id", name:"tender_id",
type:"numeric", type:"numeric",
// length:500,
nullable:true nullable:true
}) })
tenderId:number tenderId:number
@Column({ @Column({
name:"doc_name", name:"doc_name",
type:"varchar", type:"varchar",
length:500, length:1500,
nullable:true nullable:true
}) })
docName:string docName:string
@ -32,7 +31,7 @@ export class TenderDoc extends PcdBaseEntity{
@Column({ @Column({
name:"description", name:"description",
type:"varchar", type:"varchar",
length:500, length:1500,
nullable:true nullable:true
}) })
description:string description:string
@ -44,6 +43,12 @@ export class TenderDoc extends PcdBaseEntity{
}) })
documentSize:number; documentSize:number;
@Column({
name:"tender_category",
type:"varchar",
nullable:true
})
tenderCategory:string
@ManyToOne(() => TenderMaster,(tenderMaster)=> tenderMaster.TenderDoc) @ManyToOne(() => TenderMaster,(tenderMaster)=> tenderMaster.TenderDoc)
@JoinColumn([{ name: "tender_id", referencedColumnName: "id" }]) @JoinColumn([{ name: "tender_id", referencedColumnName: "id" }])

@ -3,10 +3,12 @@ import { TenderDocService } from './tender-doc.service';
import { TenderDocController } from './tender-doc.controller'; import { TenderDocController } from './tender-doc.controller';
import { tenderDocRepository } from './tender-doc.repository'; import { tenderDocRepository } from './tender-doc.repository';
import { TypeOrmModule } from '@nestjs/typeorm'; import { TypeOrmModule } from '@nestjs/typeorm';
import { AuthModule } from 'src/auth/auth.module';
@Module({ @Module({
imports: [ imports: [
TypeOrmModule.forFeature([tenderDocRepository]) TypeOrmModule.forFeature([tenderDocRepository]),
AuthModule
], ],
providers: [TenderDocService], providers: [TenderDocService],
controllers: [TenderDocController] controllers: [TenderDocController]

@ -1,8 +1,10 @@
import { Controller,Get, Param} from '@nestjs/common'; import { Controller,Get, Param,UseGuards} from '@nestjs/common';
import { TenderDetailsService } from './tender-details.service'; import { TenderDetailsService } from './tender-details.service';
import { PcdFormGridController } from 'src/framework/beans/pcd-form-grid.controller'; import { PcdFormGridController } from 'src/framework/beans/pcd-form-grid.controller';
import { TenderMaster } from './tender-master.entity'; import { TenderMaster } from './tender-master.entity';
import { TenderDetailDto } from 'src/dto/tender-master.dto'; import { TenderDetailDto } from 'src/dto/tender-master.dto';
import { AuthGuard } from '@nestjs/passport';
@Controller('tender-details') @Controller('tender-details')
export class TenderDetailsController extends PcdFormGridController<TenderDetailDto> { export class TenderDetailsController extends PcdFormGridController<TenderDetailDto> {

@ -4,12 +4,13 @@ import { TenderDetailsService } from './tender-details.service';
import { TenderMasterRepository } from './tender-master.repository'; import { TenderMasterRepository } from './tender-master.repository';
import { TypeOrmModule } from '@nestjs/typeorm'; import { TypeOrmModule } from '@nestjs/typeorm';
@Module({ @Module({
imports: [ imports: [
TypeOrmModule.forFeature([ TypeOrmModule.forFeature([
TenderMasterRepository TenderMasterRepository
]), ])
], ],
controllers: [TenderDetailsController], controllers: [TenderDetailsController],
providers: [TenderDetailsService] providers: [TenderDetailsService]

@ -224,7 +224,7 @@ export class TenderMaster extends PcdBaseEntity{
pincode:string pincode:string
@Column({ @Column({
name:"pre_bid_date", name:"pre_bid_date",
type:"date", type:"timestamp",
nullable:true nullable:true
}) })
preBidDate:Date preBidDate:Date
@ -264,49 +264,49 @@ export class TenderMaster extends PcdBaseEntity{
bidOpeningPlace:string bidOpeningPlace:string
@Column({ @Column({
name:"publish_date", name:"publish_date",
type:"date", type:"timestamp",
nullable:true nullable:true
}) })
publishDate:Date publishDate:Date
@Column({ @Column({
name:"sale_start_date", name:"sale_start_date",
type:"date", type:"timestamp",
nullable:true nullable:true
}) })
saleStartDate:Date saleStartDate:Date
@Column({ @Column({
name:"clarification_start_d", name:"clarification_start_d",
type:"date", type:"timestamp",
nullable:true nullable:true
}) })
clarificationStartDate:Date clarificationStartDate:Date
@Column({ @Column({
name:"bid_sub_start_date", name:"bid_sub_start_date",
type:"date", type:"timestamp",
nullable:true nullable:true
}) })
bidSubStartDate:Date bidSubStartDate:Date
@Column({ @Column({
name:"bid_open_date", name:"bid_open_date",
type:"date", type:"timestamp",
nullable:true nullable:true
}) })
bidOpenDate:Date bidOpenDate:Date
@Column({ @Column({
name:"sale_end_date", name:"sale_end_date",
type:"date", type:"timestamp",
nullable:true nullable:true
}) })
saleEndDate:Date saleEndDate:Date
@Column({ @Column({
name:"clarification_end_d", name:"clarification_end_d",
type:"date", type:"timestamp",
nullable:true nullable:true
}) })
clarificationEndDate:Date clarificationEndDate:Date
@Column({ @Column({
name:"bid_sub_end_date", name:"bid_sub_end_date",
type:"date", type:"timestamp",
nullable:true nullable:true
}) })
bidSubEndDate:Date bidSubEndDate:Date

@ -1,8 +1,11 @@
import { Controller } from '@nestjs/common'; import { Controller, UseGuards } from '@nestjs/common';
import { TenderTypeDto } from 'src/dto/tender-type.dto'; import { TenderTypeDto } from 'src/dto/tender-type.dto';
import { PcdFormGridController } from 'src/framework/beans/pcd-form-grid.controller'; import { PcdFormGridController } from 'src/framework/beans/pcd-form-grid.controller';
import { TenderTypeService } from './tender-type.service'; import { TenderTypeService } from './tender-type.service';
import { AuthGuard } from '@nestjs/passport';
@UseGuards(AuthGuard())
@Controller('tender-type') @Controller('tender-type')
export class TenderTypeController extends PcdFormGridController<TenderTypeDto>{ export class TenderTypeController extends PcdFormGridController<TenderTypeDto>{

@ -3,10 +3,12 @@ import { TenderTypeController } from './tender-type.controller';
import { TenderTypeService } from './tender-type.service'; import { TenderTypeService } from './tender-type.service';
import { TypeOrmModule } from '@nestjs/typeorm'; import { TypeOrmModule } from '@nestjs/typeorm';
import { TenderTypeRepository } from './tender-type.repository'; import { TenderTypeRepository } from './tender-type.repository';
import { AuthModule } from 'src/auth/auth.module';
@Module({ @Module({
imports: [ imports: [
TypeOrmModule.forFeature([TenderTypeRepository]) TypeOrmModule.forFeature([TenderTypeRepository]),
AuthModule
], ],
controllers: [TenderTypeController], controllers: [TenderTypeController],
providers: [TenderTypeService] providers: [TenderTypeService]

@ -1,4 +1,14 @@
import { Controller } from '@nestjs/common'; import { Controller,UseGuards } from '@nestjs/common';
import { TenderDetailDto } from 'src/dto/tender-master.dto';
import { PcdTransactionController } from 'src/framework/beans/pcd-transaction.controller';
import { TenderService } from './tender.service';
import { AuthGuard } from '@nestjs/passport';
@UseGuards(AuthGuard())
@Controller('tender') @Controller('tender')
export class TenderController {} export class TenderController extends PcdTransactionController<TenderDetailDto> {
constructor(
private tenderService: TenderService
) {
super(tenderService);
}}

@ -1,8 +1,15 @@
import { Module } from '@nestjs/common'; import { Module } from '@nestjs/common';
import { TenderController } from './tender.controller'; import { TenderController } from './tender.controller';
import { TenderService } from './tender.service'; import { TenderService } from './tender.service';
import { TypeOrmModule } from '@nestjs/typeorm';
import { TenderMasterRepository } from 'src/tables/tender-master/tender-master.repository';
import { AuthModule } from 'src/auth/auth.module';
@Module({ @Module({
imports: [
TypeOrmModule.forFeature([TenderMasterRepository]),
AuthModule
],
controllers: [TenderController], controllers: [TenderController],
providers: [TenderService] providers: [TenderService]
}) })

@ -1,7 +1,33 @@
import { Injectable } from '@nestjs/common'; import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { TenderDetailDto } from 'src/dto/tender-master.dto'; import { TenderDetailDto } from 'src/dto/tender-master.dto';
import { PcdTransactionService } from 'src/framework/beans/pcd-transaction.service'; import { PcdTransactionService } from 'src/framework/beans/pcd-transaction.service';
import { TransactionDetailDto } from 'src/framework/custom/transaction-detail.dto'; import { TransactionDetailDto } from 'src/framework/custom/transaction-detail.dto';
import { tenderDocRepository } from 'src/tables/tender-documents/tender-doc.repository';
import { TenderMasterRepository } from 'src/tables/tender-master/tender-master.repository';
import { Connection } from 'typeorm';
@Injectable() @Injectable()
export class TenderService{} export class TenderService extends PcdTransactionService<TenderDetailDto>{
MAIN_KEY: string = 'id';
DETAIL_DATA_FORMAT: TransactionDetailDto[] = [
{
detailName: "tenderDoc", repo: this.conn.getCustomRepository(tenderDocRepository),
filter: [{ columnName: "tenderId", headerColumn: "id" }],
foreignKeyColumnName: "tenderId",
childDetail: [],
addtionalSettingOfRowsInInsertion: [],
orderByColumn: { columnName: "id", sort: "DESC" }
}
];
constructor(
private conn: Connection,
@InjectRepository(TenderMasterRepository)
private tenderMasterRepository: TenderMasterRepository,
){
super(conn, conn.getCustomRepository(TenderMasterRepository));
// this.TenderMasterRepository = conn.getCustomRepository(SisPaymentDetailRepository)
}
}

Loading…
Cancel
Save