103 lines
3.7 KiB
TypeScript
103 lines
3.7 KiB
TypeScript
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<IOrganizationFiscalProfile, "id">,
|
|
Document {}
|
|
|
|
export class OrganizationFiscalProfilesAdapterMongoose implements IOrganizationFiscalProfilesAdapter {
|
|
schema: Schema;
|
|
organizationFiscalProfileList: Model<IOrganizationFiscalProfileDocument>;
|
|
|
|
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<IOrganizationFiscalProfileDocument>(
|
|
"OrganizationFiscalProfile",
|
|
this.schema
|
|
);
|
|
}
|
|
|
|
public async create(
|
|
data: CreateOrganizationFiscalProfileParams
|
|
): Promise<IOrganizationFiscalProfile> {
|
|
return await this.organizationFiscalProfileList.create(data);
|
|
}
|
|
|
|
private buildSearchCriteria(
|
|
filters: FindOrganizationFiscalProfilesParams
|
|
): FilterQuery<IOrganizationFiscalProfile> {
|
|
const searchCriteria: FilterQuery<IOrganizationFiscalProfile> = {};
|
|
|
|
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<IOrganizationFiscalProfile[]> {
|
|
const searchCriteria = this.buildSearchCriteria(filters);
|
|
return this.organizationFiscalProfileList.find(searchCriteria).sort({ createdAt: -1 }).exec();
|
|
}
|
|
|
|
public async findOne(
|
|
filters: FindOrganizationFiscalProfilesParams
|
|
): Promise<IOrganizationFiscalProfileDocument | null> {
|
|
const searchCriteria = this.buildSearchCriteria(filters);
|
|
return this.organizationFiscalProfileList.findOne(searchCriteria).exec();
|
|
}
|
|
|
|
public async update(
|
|
data: UpdateOrganizationFiscalProfileParams
|
|
): Promise<IOrganizationFiscalProfileDocument | null> {
|
|
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();
|
|
}
|
|
}
|