import { Document, FilterQuery, Model, Schema, model } from "mongoose"; import { CreateOrganizationFiscalProfileParams, FindOrganizationFiscalProfilesParams, IOrganizationFiscalProfile, IOrganizationFiscalProfilesAdapter, ORGANIZATION_FISCAL_PROFILE_STATUS, ORGANIZATION_FISCAL_PROFILE_TAX_CONDITION, UpdateOrganizationFiscalProfileParams, } from "./OrganizationFiscalProfiles.Interface"; export interface IOrganizationFiscalProfileDocument extends Omit, Document {} export class OrganizationFiscalProfilesAdapterMongoose implements IOrganizationFiscalProfilesAdapter { schema: Schema; organizationFiscalProfileList: Model; constructor() { this.schema = new Schema({ companyId: { type: Schema.Types.ObjectId, required: true, ref: "Company", unique: true, index: true, }, cuit: { type: String, required: true }, legalName: { type: String, required: true }, taxCondition: { type: String, required: true, enum: Object.values(ORGANIZATION_FISCAL_PROFILE_TAX_CONDITION), }, pointOfSale: { type: Number, required: true }, activityCode: { type: String, required: false }, activityDescription: { type: String, required: false }, status: { type: String, required: true, enum: Object.values(ORGANIZATION_FISCAL_PROFILE_STATUS), index: true, }, createdAt: { type: Date, required: true, default: Date.now }, updatedAt: { type: Date, required: true, default: Date.now }, }); this.organizationFiscalProfileList = model( "OrganizationFiscalProfile", this.schema ); } public async create( data: CreateOrganizationFiscalProfileParams ): Promise { return await this.organizationFiscalProfileList.create(data); } private buildSearchCriteria( filters: FindOrganizationFiscalProfilesParams ): FilterQuery { const searchCriteria: FilterQuery = {}; if (filters.id) searchCriteria._id = filters.id; if (filters.companyId) searchCriteria.companyId = filters.companyId; if (filters.status) searchCriteria.status = filters.status; return searchCriteria; } public async find( filters: FindOrganizationFiscalProfilesParams ): Promise { const searchCriteria = this.buildSearchCriteria(filters); return this.organizationFiscalProfileList.find(searchCriteria).sort({ createdAt: -1 }).exec(); } public async findOne( filters: FindOrganizationFiscalProfilesParams ): Promise { const searchCriteria = this.buildSearchCriteria(filters); return this.organizationFiscalProfileList.findOne(searchCriteria).exec(); } public async update( data: UpdateOrganizationFiscalProfileParams ): Promise { const { id, companyId, sessionUser, ...updateData } = data; if (!id && !companyId) { throw new Error("Se requiere un identificador para actualizar el perfil fiscal"); } return this.organizationFiscalProfileList .findOneAndUpdate(this.buildSearchCriteria({ id, companyId, sessionUser }), updateData, { new: true, }) .exec(); } }