irongit
351 lines13 KBJavaScript
1const Quotes = require("../../model/schema/quotes.js");
2const mongoose = require("mongoose");
3const User = require('../../model/schema/user')
4const Invoices = require("../../model/schema/invoices.js");
5
6
7
8async function getNextAutoIncrementValue() {
9 const num = await Quotes.countDocuments({});
10 return num + 1;
11}
12async function getNextAutoIncrementInvoiceValue() {
13 const num = await Invoices.countDocuments({});
14 return num + 1;
15}
16const index = async (req, res) => {
17 query = req.query;
18 query.deleted = false;
19 const user = await User.findById(req.user.userId)
20 if (user?.role !== "superAdmin") {
21 delete query.createBy
22 query.$or = [{ createBy: new mongoose.Types.ObjectId(req.user.userId) }, { assignUser: new mongoose.Types.ObjectId(req.user.userId) }];
23 }
24
25 try {
26 let result = await Quotes.aggregate([
27 { $match: query },
28 {
29 $lookup: {
30 from: "Contacts",
31 localField: "contact",
32 foreignField: "_id",
33 as: "contactData",
34 },
35 },
36 {
37 $lookup: {
38 from: "Accounts",
39 localField: "account",
40 foreignField: "_id",
41 as: "accountData",
42 },
43 },
44 {
45 $lookup: {
46 from: "User",
47 localField: "createBy",
48 foreignField: "_id",
49 as: "users",
50 },
51 },
52 {
53 $lookup: {
54 from: "User",
55 localField: "modifiedBy",
56 foreignField: "_id",
57 as: "modifiedByUser",
58 },
59 },
60 {
61 $lookup: {
62 from: "User",
63 localField: "assignedTo",
64 foreignField: "_id",
65 as: "assignedToData",
66 },
67 },
68 { $unwind: { path: "$users", preserveNullAndEmptyArrays: true } },
69 { $unwind: { path: "$contactData", preserveNullAndEmptyArrays: true } },
70 { $unwind: { path: "$accountData", preserveNullAndEmptyArrays: true } },
71 { $unwind: { path: '$modifiedByUser', preserveNullAndEmptyArrays: true } },
72 { $unwind: { path: "$assignedToData", preserveNullAndEmptyArrays: true } },
73 { $match: { "users.deleted": false } },
74 {
75 $addFields: {
76 assignUserName: {
77 $cond: {
78 if: '$assignUsers',
79 then: { $concat: ['$assignUsers.firstName', ' ', '$assignUsers.lastName'] },
80 else: { $concat: [''] }
81 }
82 },
83 createdByName: { $concat: ['$users.firstName', ' ', '$users.lastName'] },
84 modifiedUserName: { $concat: ['$modifiedByUser.firstName', ' ', '$modifiedByUser.lastName'] },
85 contactName: { $concat: ['$contactData.firstName', ' ', '$contactData.lastName'] },
86 accountName: '$accountData.name'
87 }
88 },
89 { $project: { users: 0, contactData: 0, accountData: 0, modifiedByUser: 0, assignedToData: 0 } },
90 ]);
91 res.send(result);
92 } catch (error) {
93 console.error("Error:", error);
94 res.status(500).send("Internal Server Error");
95 }
96};
97
98const add = async (req, res) => {
99 try {
100 const nextAutoIncrementValue = await getNextAutoIncrementValue();
101 const result = new Quotes({ ...req.body, quoteNumber: nextAutoIncrementValue });
102 await result.save();
103 res.status(200).json(result);
104 } catch (err) {
105 console.error("Failed to create Quotes:", err);
106 res.status(400).json({ error: "Failed to create Quotes : ", err });
107 }
108};
109
110const edit = async (req, res) => {
111 try {
112
113 let result = await Quotes.findOneAndUpdate(
114 { _id: req.params.id },
115 { $set: req.body },
116 { new: true }
117 );
118
119 res.status(200).json(result);
120 } catch (err) {
121 console.error("Failed to create Quotes:", err);
122 res.status(400).json({ error: "Failed to create Quotes : ", err });
123 }
124};
125const addMany = async (req, res) => {
126 try {
127 const data = req.body.map((item) => ({
128 ...item,
129 account: item.account ? item.account : null,
130 contact: item.contact ? item.contact : null,
131 }))
132 const inserted = await Quotes.insertMany(data);
133
134 res.status(200).json(inserted);
135 } catch (err) {
136 console.error('Failed to create Quotes :', err);
137 res.status(400).json({ error: 'Failed to create Quotes' });
138 }
139};
140
141const view = async (req, res) => {
142 try {
143 let response = await Quotes.findOne({ _id: req.params.id });
144 if (!response) return res.status(404).json({ message: "no Data Found." });
145 let result = await Quotes.aggregate([
146 { $match: { _id: response._id } },
147 {
148 $lookup: {
149 from: "Opportunities",
150 localField: "oppotunity",
151 foreignField: "_id",
152 as: "oppotunityData",
153 },
154 },
155 {
156 $lookup: {
157 from: "Contacts",
158 localField: "contact",
159 foreignField: "_id",
160 as: "contactData",
161 },
162 },
163 {
164 $lookup: {
165 from: "Accounts",
166 localField: "account",
167 foreignField: "_id",
168 as: "accountData",
169 },
170 },
171 {
172 $lookup: {
173 from: "User",
174 localField: "createBy",
175 foreignField: "_id",
176 as: "users",
177 },
178 },
179 {
180 $lookup: {
181 from: "User",
182 localField: "modifiedBy",
183 foreignField: "_id",
184 as: "modifiedByUser",
185 },
186 },
187 {
188 $lookup: {
189 from: "User",
190 localField: "assignedTo",
191 foreignField: "_id",
192 as: "assignedToData",
193 },
194 },
195 { $unwind: { path: "$users", preserveNullAndEmptyArrays: true } },
196 { $unwind: { path: "$contactData", preserveNullAndEmptyArrays: true } },
197 { $unwind: { path: "$accountData", preserveNullAndEmptyArrays: true } },
198 { $unwind: { path: '$modifiedByUser', preserveNullAndEmptyArrays: true } },
199 { $unwind: { path: "$assignedToData", preserveNullAndEmptyArrays: true } },
200 { $unwind: { path: "$oppotunityData", preserveNullAndEmptyArrays: true } },
201 { $match: { "users.deleted": false } },
202 {
203 $addFields: {
204 assignUserName: {
205 $cond: {
206 if: '$assignedToData',
207 then: { $concat: ['$assignedToData.firstName', ' ', '$assignedToData.lastName'] },
208 else: { $concat: [''] }
209 }
210 },
211 oppotunityName: '$oppotunityData.opportunityName',
212 createdByName: { $concat: ['$users.firstName', ' ', '$users.lastName'] },
213 modifiedUserName: { $concat: ['$modifiedByUser.firstName', ' ', '$modifiedByUser.lastName'] },
214 contactName: { $concat: ['$contactData.firstName', ' ', '$contactData.lastName'] },
215 accountName: '$accountData.name'
216 }
217 },
218 { $project: { users: 0, contactData: 0, accountData: 0, modifiedByUser: 0, oppotunityData: 0, assignedToData: 0 } },
219 ]);
220 let invoiceDetails = await Invoices.aggregate([
221 { $match: { quotesId: response._id, deleted: false } },
222 {
223 $lookup: {
224 from: "Contacts",
225 localField: "contact",
226 foreignField: "_id",
227 as: "contactData",
228 },
229 },
230 {
231 $lookup: {
232 from: "Accounts",
233 localField: "account",
234 foreignField: "_id",
235 as: "accountData",
236 },
237 },
238 { $unwind: { path: "$contactData", preserveNullAndEmptyArrays: true } },
239 { $unwind: { path: "$accountData", preserveNullAndEmptyArrays: true } },
240 {
241 $addFields: {
242 contactName: { $concat: ['$contactData.firstName', ' ', '$contactData.lastName'] },
243 accountName: '$accountData.name'
244 }
245 },
246 { $project: { contactData: 0, accountData: 0 } },
247
248 ]);
249 res.status(200).json({ result: result[0], invoiceDetails });
250 } catch (err) {
251 console.log("Error:", err);
252 res.status(400).json({ Error: err });
253 }
254};
255
256const convertToInvoice = async (req, res) => {
257 try {
258 let quotesData = await Quotes.findOne({ _id: req.body._id });
259 if (!quotesData) {
260 return res.status(404).json({ message: "Quotes not found" })
261 }
262 const nextAutoIncrementValue = await getNextAutoIncrementInvoiceValue();
263
264 const invoiceDetails = {
265 invoiceNumber: nextAutoIncrementValue,
266 quotesId: quotesData?._id,
267 title: quotesData?.title,
268 quoteNumber: quotesData?.quoteNumber,
269 quoteDate: quotesData?.createdDate,
270 dueDate: quotesData?.dueDate,
271 invoiceDate: new Date(),
272 status: "Paid",
273 assignedTo: quotesData?.assignedTo,
274 description: quotesData?.description,
275 account: quotesData?.account,
276 contact: quotesData?.contact,
277 billingStreet: quotesData?.billingStreet,
278 shippingStreet: quotesData?.shippingStreet,
279 billingCity: quotesData?.billingCity,
280 shippingCity: quotesData?.shippingCity,
281 billingState: quotesData?.billingState,
282 shippingState: quotesData?.shippingState,
283 billingPostalCode: quotesData?.billingPostalCode,
284 shippingPostalCode: quotesData?.shippingPostalCode,
285 billingCountry: quotesData?.billingCountry,
286 shippingCountry: quotesData?.shippingCountry,
287 isCheck: quotesData?.isCheck,
288 currency: quotesData?.currency,
289 total: quotesData?.total,
290 discount: quotesData?.discount,
291 subtotal: quotesData?.subtotal,
292 shipping: quotesData?.shipping,
293 shippingTax: quotesData?.shippingTax,
294 ptax: quotesData?.ptax,
295 tax: quotesData?.tax,
296 grandTotal: quotesData?.grandTotal,
297 discountType: quotesData?.discountType,
298 items: quotesData?.items,
299 invoiceConvertDate: new Date(),
300 createBy: quotesData?.createBy,
301 modifiedBy: quotesData?.modifiedBy
302 }
303
304 const invoiceData = new Invoices(invoiceDetails);
305 await invoiceData.save();
306
307 let result = await Quotes.findOneAndUpdate(
308 { _id: req.body._id },
309 { $set: { invoiceStatus: "Invoiced" } },
310 { new: true }
311 );
312
313 res.status(200).json({ message: "Invoiced Convert successfully", result });
314 } catch (err) {
315 res.status(404).json({ message: "error", err });
316 }
317}
318
319const deleteData = async (req, res) => {
320 try {
321 const result = await Quotes.findByIdAndUpdate(req.params.id, {
322 deleted: true,
323 });
324 res.status(200).json({ message: "done", result });
325 } catch (err) {
326 res.status(404).json({ message: "error", err });
327 }
328};
329
330const deleteMany = async (req, res) => {
331 try {
332 const result = await Quotes.updateMany(
333 { _id: { $in: req.body } },
334 { $set: { deleted: true } }
335 );
336
337 if (result?.matchedCount > 0 && result?.modifiedCount > 0) {
338 return res
339 .status(200)
340 .json({ message: "Quotes Removed successfully", result });
341 } else {
342 return res
343 .status(404)
344 .json({ success: false, message: "Failed to remove Quotes" });
345 }
346 } catch (err) {
347 return res.status(404).json({ success: false, message: "error", err });
348 }
349};
350
351module.exports = { index, add, edit, addMany, view, deleteData, deleteMany, convertToInvoice };