@@ -16,6 +16,7 @@ import { CreateNoteDto } from './dto/create-note.dto';
1616import { CreateMaintenanceDto } from './dto/create-maintenance.dto' ;
1717import { UpdateMaintenanceDto } from './dto/update-maintenance.dto' ;
1818import { CreateDocumentDto } from './dto/create-document.dto' ;
19+ import { DuplicateAssetDto } from './dto/duplicate-asset.dto' ;
1920import { AssetStatus , AssetHistoryAction , StellarStatus } from './enums' ;
2021import { DepartmentsService } from '../departments/departments.service' ;
2122import { CategoriesService } from '../categories/categories.service' ;
@@ -247,6 +248,53 @@ export class AssetsService {
247248 return this . findOne ( id ) ;
248249 }
249250
251+ async duplicate ( id : string , dto : DuplicateAssetDto , currentUser : User ) : Promise < Asset [ ] > {
252+ const source = await this . findOne ( id ) ;
253+ const quantity = dto . quantity ?? 1 ;
254+ const results : Asset [ ] = [ ] ;
255+
256+ for ( let i = 0 ; i < quantity ; i ++ ) {
257+ const newAssetId = await this . generateAssetId ( ) ;
258+ const copy = this . assetsRepo . create ( {
259+ assetId : newAssetId ,
260+ name : dto . name ?? source . name ,
261+ description : source . description ,
262+ category : source . category ,
263+ department : source . department ,
264+ assignedTo : null ,
265+ serialNumber : quantity === 1 && dto . serialNumber ? dto . serialNumber : null ,
266+ purchaseDate : source . purchaseDate ,
267+ purchasePrice : source . purchasePrice ,
268+ currentValue : source . currentValue ,
269+ warrantyExpiration : source . warrantyExpiration ,
270+ status : AssetStatus . ACTIVE ,
271+ condition : source . condition ,
272+ location : source . location ,
273+ manufacturer : source . manufacturer ,
274+ model : source . model ,
275+ tags : source . tags ,
276+ notes : source . notes ,
277+ customFields : source . customFields ,
278+ imageUrls : source . imageUrls ,
279+ createdBy : currentUser ,
280+ updatedBy : currentUser ,
281+ } ) ;
282+
283+ const saved = await this . assetsRepo . save ( copy ) ;
284+ await this . logHistory (
285+ saved ,
286+ AssetHistoryAction . CREATED ,
287+ `Duplicated from ${ source . assetId } ` ,
288+ null ,
289+ null ,
290+ currentUser ,
291+ ) ;
292+ results . push ( await this . findOne ( saved . id ) ) ;
293+ }
294+
295+ return results ;
296+ }
297+
250298 async remove ( id : string ) : Promise < void > {
251299 const asset = await this . findOne ( id ) ;
252300 await this . assetsRepo . remove ( asset ) ;
0 commit comments