diff --git a/.npmignore b/.npmignore new file mode 100644 index 000000000..0703f3b0f --- /dev/null +++ b/.npmignore @@ -0,0 +1,40 @@ +# Logs +logs +*.log +npm-debug.log* + +# Runtime data +pids +*.pid +*.seed + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (http://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules +jspm_packages + +# Optional npm cache directory +.npm + +# Optional REPL history +.node_repl_history + +vscode +.vscode/launch.json \ No newline at end of file diff --git a/index.js b/index.js index fc3828b8f..9721eb49c 100644 --- a/index.js +++ b/index.js @@ -128,6 +128,16 @@ module.exports = { MasterPlanComodityManager: require('./src/managers/garment-master-plan/master-plan-comodity-manager'), SewingBlockingPlanManager: require('./src/managers/garment-master-plan/sewing-blocking-plan-manager'), GarmentSectionManager: require('./src/managers/garment-master-plan/garment-section-manager'), + }, + spMasterPlan: { + // WeeklyPlanManager: require("./src/managers/garment-master-plan/weekly-plan-manager"), + // WorkingHoursStandardManager: require('./src/managers/garment-master-plan/working-hours-standard-manager'), + // StyleManager: require('./src/managers/garment-master-plan/style-manager'), + StandardCapacityManager: require('./src/managers/sp-master-plan/standard-capacity-manager'), + // BookingOrderManager: require('./src/managers/garment-master-plan/booking-order-manager'), + // MasterPlanComodityManager: require('./src/managers/garment-master-plan/master-plan-comodity-manager'), + // SewingBlockingPlanManager: require('./src/managers/garment-master-plan/sewing-blocking-plan-manager'), + // GarmentSectionManager: require('./src/managers/garment-master-plan/garment-section-manager'), } }, test: { @@ -246,6 +256,16 @@ module.exports = { masterPlanComodity: require("./test/data-util/garment-master-plan/master-plan-comodity-data-util"), sewingBlockingPlan: require("./test/data-util/garment-master-plan/sewing-blocking-plan-data-util"), garmentSection: require("./test/data-util/garment-master-plan/garment-section-data-util") + }, + spMasterPlan: { + // weeklyPlan: require("./test/data-util/garment-master-plan/weekly-plan-data-util"), + // workingHoursStandard: require("./test/data-util/garment-master-plan/working-hours-standard-data-util"), + // style: require("./test/data-util/garment-master-plan/style-data-util"), + standardCapacity: require("./test/data-util/sp-master-plan/standard-capacity-data-util") + // bookingOrder: require("./test/data-util/garment-master-plan/booking-order-data-util"), + // masterPlanComodity: require("./test/data-util/garment-master-plan/master-plan-comodity-data-util"), + // sewingBlockingPlan: require("./test/data-util/garment-master-plan/sewing-blocking-plan-data-util"), + // garmentSection: require("./test/data-util/garment-master-plan/garment-section-data-util") } } }, diff --git a/package.json b/package.json index db61c4832..f32ca1c7f 100644 --- a/package.json +++ b/package.json @@ -1,28 +1,68 @@ { - "name": "dl-module", - "version": "1.1.0", - "description": "Dan Liris Modules", - "main": "index.js", - "scripts": { - "test": "mocha test/index.js", - "cover": "istanbul cover _mocha", - "coveralls": "npm run cover -- --report lcovonly && cat ./coverage/lcov.info | coveralls", - "codeclimate": "codeclimate-test-reporter < ./coverage/lcov.info" + "_args": [ + [ + { + "raw": "dl-module@git+https://github.com/danliris/dl-module.git#dev", + "scope": null, + "escapedName": "dl-module", + "name": "dl-module", + "rawSpec": "git+https://github.com/danliris/dl-module.git#dev", + "spec": "git+https://github.com/danliris/dl-module.git#dev", + "type": "hosted", + "hosted": { + "type": "github", + "ssh": "git@github.com:danliris/dl-module.git#dev", + "sshUrl": "git+ssh://git@github.com/danliris/dl-module.git#dev", + "httpsUrl": "git+https://github.com/danliris/dl-module.git#dev", + "gitUrl": "git://github.com/danliris/dl-module.git#dev", + "shortcut": "github:danliris/dl-module#dev", + "directUrl": "https://raw.githubusercontent.com/danliris/dl-module/dev/package.json" + } + }, + "E:\\GITHUB\\MasterPlanGmt\\dl-sp-master-plan-webapi" + ] + ], + "_from": "git+https://github.com/danliris/dl-module.git#dev", + "_id": "dl-module@1.1.0", + "_inCache": true, + "_location": "/dl-module", + "_phantomChildren": {}, + "_requested": { + "raw": "dl-module@git+https://github.com/danliris/dl-module.git#dev", + "scope": null, + "escapedName": "dl-module", + "name": "dl-module", + "rawSpec": "git+https://github.com/danliris/dl-module.git#dev", + "spec": "git+https://github.com/danliris/dl-module.git#dev", + "type": "hosted", + "hosted": { + "type": "github", + "ssh": "git@github.com:danliris/dl-module.git#dev", + "sshUrl": "git+ssh://git@github.com/danliris/dl-module.git#dev", + "httpsUrl": "git+https://github.com/danliris/dl-module.git#dev", + "gitUrl": "git://github.com/danliris/dl-module.git#dev", + "shortcut": "github:danliris/dl-module#dev", + "directUrl": "https://raw.githubusercontent.com/danliris/dl-module/dev/package.json" + } }, - "repository": { - "type": "git", - "url": "git+https://github.com/danliris/dl-module.git" + "_requiredBy": [ + "/" + ], + "_resolved": "git+https://github.com/danliris/dl-module.git#17cdc5019802066513635682259a656bc230f8f6", + "_shasum": "bfe14358c481d6e0a0b7755278d277fe76c62de7", + "_shrinkwrap": null, + "_spec": "dl-module@git+https://github.com/danliris/dl-module.git#dev", + "_where": "E:\\GITHUB\\MasterPlanGmt\\dl-sp-master-plan-webapi", + "author": { + "name": "Moonlay" }, - "author": "Moonlay", - "license": "MIT", "bugs": { "url": "https://github.com/danliris/dl-module/issues" }, - "homepage": "https://github.com/danliris/dl-module#readme", "dependencies": { "assert": "^1.4.1", "dl-i18n": "git+https://github.com/danliris/dl-i18n.git", - "dl-models": "https://github.com/danliris/dl-models#dev", + "dl-models": "git+https://github.com/danliris/dl-models.git#dev", "hashids": "^1.1.0", "module-toolkit": "git+https://github.com/pinkgorilla/module-toolkit.git", "moment": "2.17.1", @@ -33,9 +73,10 @@ "pdfmake": "^0.1.18", "sha1": "^1.1.1" }, + "description": "Dan Liris Modules", "devDependencies": { - "coveralls": "^2.11.15", "codeclimate-test-reporter": "^0.4.0", + "coveralls": "^2.11.15", "istanbul": "^0.4.5", "mocha": "^3.0.0", "mocha-lcov-reporter": "^1.2.0", @@ -43,5 +84,24 @@ }, "directories": { "test": "test" - } + }, + "gitHead": "17cdc5019802066513635682259a656bc230f8f6", + "homepage": "https://github.com/danliris/dl-module#readme", + "license": "MIT", + "main": "index.js", + "name": "dl-module", + "optionalDependencies": {}, + "readme": "\r\n[![Build Status](https://travis-ci.org/danliris/dl-module.svg?branch=uat)](https://travis-ci.org/danliris/dl-module)\r\n[![Code Climate](https://codeclimate.com/github/danliris/dl-module/badges/gpa.svg)](https://codeclimate.com/github/danliris/dl-module)\r\n[![Issue Count](https://codeclimate.com/github/danliris/dl-module/badges/issue_count.svg)](https://codeclimate.com/github/danliris/dl-module) \r\n[![Coverage Status](https://coveralls.io/repos/github/danliris/dl-module/badge.svg?branch=uat)](https://coveralls.io/github/danliris/dl-module?branch=uat)\r\n\r\n# dl-module\r\nDan Liris Modules\r\n", + "readmeFilename": "README.md", + "repository": { + "type": "git", + "url": "git+https://github.com/danliris/dl-module.git" + }, + "scripts": { + "codeclimate": "codeclimate-test-reporter < ./coverage/lcov.info", + "cover": "istanbul cover _mocha", + "coveralls": "npm run cover -- --report lcovonly && cat ./coverage/lcov.info | coveralls", + "test": "mocha test/index.js" + }, + "version": "1.1.0" } diff --git a/src/managers/master/garment-product-manager.js b/src/managers/master/garment-product-manager.js index 6641bf99a..d7798fa4e 100644 --- a/src/managers/master/garment-product-manager.js +++ b/src/managers/master/garment-product-manager.js @@ -22,7 +22,7 @@ module.exports = class GarmentProductManager extends BaseManager { this.uomManager = new UomManager(db, user); this.currencyManager = new CurrencyManager(db, user); } - + _getQuery(paging) { var _default = { _deleted: false, @@ -138,46 +138,6 @@ module.exports = class GarmentProductManager extends BaseManager { }); } - getDistinctProductDescription(paging) { - var _paging = Object.assign({ - size: 20, - order: {}, - filter: {}, - select: [] - }, paging); - - return this._createIndexes() - .then(() => { - var query = this._getQuery(_paging); - return this.collection - .aggregate([ - { - "$match": query - }, - { - "$group": { - "_id": "$description", // the grouping key - "document": { "$first": "$$ROOT" } - } - }, - { "$limit": 25 } - ]) - .toArray() - .then((result) => { - result = result.map((data) => data.document); - return result; - }) - }); - } - - getSingleProductByName(query) { - let nameFilter = { - "name": query.name - } - return this.collection.findOne(nameFilter) - .then((result) => result) - } - getProduct() { return new Promise((resolve, reject) => { var query = { diff --git a/src/managers/sp-master-plan/booking-order-manager.js b/src/managers/sp-master-plan/booking-order-manager.js new file mode 100644 index 000000000..2e5f4d2ad --- /dev/null +++ b/src/managers/sp-master-plan/booking-order-manager.js @@ -0,0 +1,1256 @@ +"use strict" + +var ObjectId = require("mongodb").ObjectId; +require("mongodb-toolkit"); +var DLModels = require("dl-models"); +var map = DLModels.map; +var BookingOrder = DLModels.garmentMasterPlan.BookingOrder; +var SewingBlockingPlan = DLModels.garmentMasterPlan.SewingBlockingPlan; +var BaseManager = require("module-toolkit").BaseManager; +var i18n = require("dl-i18n"); +var ComodityManager = require('./master-plan-comodity-manager'); +//var MasterPlanManager = require('./master-plan-manager'); +var GarmentBuyerManager = require('../master/garment-buyer-manager'); +var GarmentSectionManager = require('../garment-master-plan/garment-section-manager'); +var generateCode = require("../../utils/code-generator"); +var assert = require('assert'); +var moment = require("moment"); + +module.exports = class BookingOrderManager extends BaseManager { + constructor(db, user) { + super(db, user); + this.collection = this.db.use(map.garmentMasterPlan.collection.BookingOrder); + this.sewingBlockingPlanCollection = this.db.use(map.garmentMasterPlan.collection.SewingBlockingPlan); + this.comodityManager = new ComodityManager(db, user); + //this.masterPlanManager = new MasterPlanManager(db, user); + this.garmentBuyerManager = new GarmentBuyerManager(db, user); + this.garmentSectionManager = new GarmentSectionManager(db, user); + this.documentNumbers = this.db.collection("document-numbers"); + } + + _getQuery(paging) { + var _default = { + _deleted: false + }, + pagingFilter = paging.filter || {}, + keywordFilter = {}, + query = {}; + + if (paging.keyword) { + var regex = new RegExp(paging.keyword, "i"); + var codeFilter = { + "code": { + "$regex": regex + } + }; + var buyerFilter = { + "garmentBuyerName": { + "$regex": regex + } + }; + keywordFilter["$or"] = [codeFilter, buyerFilter]; + } + query["$and"] = [_default, keywordFilter, pagingFilter]; + return query; + } + + // _beforeInsert(bookingOrder){ + // bookingOrder.code = !bookingOrder.code ? generateCode() : bookingOrder.code; + // bookingOrder._active = true; + // bookingOrder._createdDate= new Date(); + // return Promise.resolve(bookingOrder); + // } + + _validate(bookingOrder) { + var errors = {}; + //bookingOrder.code = !bookingOrder.code ? generateCode() : bookingOrder.code; + var valid = bookingOrder; + // 1. begin: Declare promises. + + var getBooking = this.collection.singleOrDefault({ + _id: { + "$ne": new ObjectId(valid._id) + }, + code: valid.code, + _deleted: false + }); + + //var getComodity = valid.styleId && ObjectId.isValid(valid.styleId) ? this.styleManager.getSingleByIdOrDefault(new ObjectId(valid.styleId)) : Promise.resolve(null); + var getBuyer = valid.garmentBuyerId && ObjectId.isValid(valid.garmentBuyerId) ? this.garmentBuyerManager.getSingleByIdOrDefault(new ObjectId(valid.garmentBuyerId)) : Promise.resolve(null); + + var getSection = valid.garmentSectionId && ObjectId.isValid(valid.garmentSectionId) ? this.garmentSectionManager.getSingleByIdOrDefault(new ObjectId(valid.garmentSectionId)) : Promise.resolve(null); + + // valid.details = valid.details || []; + // var getWeeklyPlan = []; + // var getUnit = []; + // for (var detail of valid.details) { + // if(!detail.weeklyPlanId) + // detail.weeklyPlanId=detail.weeklyPlan && ObjectId.isValid(detail.weeklyPlan._id) ? detail.weeklyPlan._id : ""; + // var week =detail.weeklyPlan && ObjectId.isValid(detail.weeklyPlanId) ? this.weeklyPlanManager.getSingleByIdOrDefault(detail.weeklyPlanId) : Promise.resolve(null); + // getWeeklyPlan.push(week); + // } + // 2. begin: Validation. + return Promise.all([getBooking,getBuyer,getSection]) + .then(results => { + var duplicateBooking = results[0]; + var _buyer=results[1]; + var _section=results[2]; + + + // if(!valid.code || valid.code === "") + // errors["code"] = i18n.__("BookingOrder.code.isRequired:%s is required", i18n.__("BookingOrder.code._:Code")); + if (duplicateBooking) { + errors["code"] = i18n.__("BookingOrder.code.isExists:%s is already exists", i18n.__("BookingOrder.code._:Code")); + } + if(!valid.bookingDate || valid.bookingDate === '') + errors["bookingDate"] = i18n.__("BookingOrder.bookingDate.isRequired:%s is required", i18n.__("BookingOrder.bookingDate._:BookingDate")); + + if(!valid.deliveryDate || valid.deliveryDate === '') + errors["deliveryDate"] = i18n.__("BookingOrder.deliveryDate.isRequired:%s is required", i18n.__("BookingOrder.deliveryDate._:DeliveryDate")); + + if(!valid.garmentBuyerId || valid.garmentBuyerId==='') + errors["buyer"] = i18n.__("BookingOrder.buyer.isRequired:%s is required", i18n.__("BookingOrder.buyer._:Buyer")); + // if(!_buyer) + // errors["buyer"] = i18n.__("BookingOrder.buyer.isNotFound:%s is not found", i18n.__("BookingOrder.buyer._:Buyer")); + + if(!valid.garmentSectionId || valid.garmentSectionId==='') + errors["section"] = i18n.__("BookingOrder.section.isRequired:%s is required", i18n.__("BookingOrder.section._:Section")); + + if((!valid.expiredBookingOrder || valid.expiredBookingOrder === 0) && (!valid.canceledBookingOrder || valid.canceledBookingOrder === 0)){ + if(!valid.orderQuantity || valid.orderQuantity<=0) + errors["orderQuantity"] = i18n.__("BookingOrder.orderQuantity.isRequired:%s is required", i18n.__("BookingOrder.orderQuantity._:OrderQuantity")); + } + + if (!valid.deliveryDate || valid.deliveryDate === "") { + errors["deliveryDate"] = i18n.__("BookingOrder.deliveryDate.isRequired:%s is required", i18n.__("BookingOrder.deliveryDate._:DeliveryDate")); + } + else if (!valid.items || valid.items.length === 0) { + valid.bookingDate = new Date(valid.bookingDate); + valid.deliveryDate = new Date(valid.deliveryDate); + valid.bookingDate.setUTCHours(valid.bookingDate.getUTCHours() >= 17 ? 17 : -7, 0, 0, 0); + valid.deliveryDate.setUTCHours(valid.deliveryDate.getUTCHours() >= 17 ? 17 : -7, 0, 0, 0); + + // setUTCHours 17 atau -7 untuk mengubah ke 00:00:00 WIB + + var next45Days = new Date(); + next45Days.setUTCHours(next45Days.getUTCHours() >= 17 ? 17 : -7, 0, 0, 0); + next45Days.setDate(next45Days.getDate() + 45); + + if (valid.bookingDate.getTime() > valid.deliveryDate.getTime()) { + errors["deliveryDate"] = i18n.__("BookingOrder.DeliveryDate.shouldNotLessThanBookingDate:%s should not be less than booking date", i18n.__("BookingOrder.deliveryDate._:deliveryDate")); + } else if (valid.bookingDate.getTime() == valid.deliveryDate.getTime()) { + errors["deliveryDate"] = i18n.__("BookingOrder.DeliveryDate.shouldNotSameAsBookingDate:%s should not be the same date as booking date", i18n.__("BookingOrder.deliveryDate._:deliveryDate")); + } else if (next45Days.getTime() >= valid.deliveryDate.getTime()) { + errors["deliveryDate"] = i18n.__("BookingOrder.DeliveryDate.shouldMoreThan45Days:%s from today date should be more than 45 days", i18n.__("BookingOrder.deliveryDate._:deliveryDate")) + " (" + moment(next45Days).add(7, 'h').format('DD-MMM-YYYY') + ")"; + } + // } else if(today.getTime() > validDeliveryDate.getTime()){ + // errors["deliveryDate"] = i18n.__("BookingOrder.DeliveryDate.shouldNot:%s should not be less than today date", i18n.__("BookingOrder.deliveryDate._:deliveryDate")); + // } + } + // if(valid.items){ + // var totalqty = 0; + // for (var i of valid.items) { + // totalqty += i.quantity; + // } + // if (valid.orderQuantity < totalqty) { + // errors["orderQuantity"] = i18n.__("BookingOrder.orderQuantity.shouldNot:%s should equal or more than SUM quantity in items", i18n.__("BookingOrder.orderQuantity._:OrderQuantity")); + // errors["totalQuantity"]= i18n.__("BookingOrder.totalQuantity.shouldNot:%s should equal or less than booking order quantity", i18n.__("BookingOrder.totalQuantity._:TotalQuantity")); + // } + // } + + valid.items = valid.items || []; + // if (valid.items && valid.items.length <= 0) { + // errors["items"] = i18n.__("BookingOrder.items.isRequired:%s is required", i18n.__("BookingOrder.items._:items")); + // } + + if (valid.type==='confirm'){ + if (valid.items.length > 0) { + var itemErrors = []; + var index=0; + + for (var item of valid.items) { + item._createdDate= item._createdDate ? item._createdDate: new Date(); + item.code= !item.code || item.code==valid.code ? generateCode()+index.toString() : item.code ; + var itemError = {}; + + if(!item.masterPlanComodity){ + itemError["masterPlanComodity"] = i18n.__("BookingOrder.items.masterPlanComodity.isRequired:%s is required", i18n.__("BookingOrder.items.masterPlanComodity._:MasterPlanComodity")); + } + else{ + item.masterPlanComodityId=new ObjectId(item.masterPlanComodity._id); + + // var existComodity = valid.items.find((test, idx) => + // item.masterPlanComodityId.toString() === test.masterPlanComodity._id.toString() && item.masterPlanComodityId.toString() === test.masterPlanComodity._id.toString() && index != idx); + + // if(existComodity) + // itemError["masterPlanComodity"] = i18n.__("BookingOrder.items.masterPlanComodity.isExists:%s is already choosen", i18n.__("BookingOrder.items.masterPlanComodity._:MasterPlanComodity")); + + } + + if (!item.quantity || item.quantity <=0) + itemError["quantity"] = i18n.__("BookingOrder.items.quantity.isRequired:%s is required", i18n.__("BookingOrder.items.quantity._:Quantity")); + + // if (valid.orderQuantity != totalqty) + // itemError["total"] = i18n.__("ProductionOrder.items.total.shouldNot:%s Total should equal Order Quantity", i18n.__("ProductionOrder.items.total._:Total")); + + if (!item.deliveryDate || item.deliveryDate === "") { + itemError["deliveryDate"] = i18n.__("BookingOrder.items.deliveryDate.isRequired:%s is required", i18n.__("BookingOrder.items.deliveryDate._:DeliveryDate")); + } + else{ + var check_bookingDate = new Date(valid.bookingDate); + check_bookingDate.setUTCHours(check_bookingDate.getUTCHours() >= 17 ? 17 : -7, 0, 0, 0); + var check_deliveryDate = new Date(valid.deliveryDate); + check_deliveryDate.setUTCHours(check_deliveryDate.getUTCHours() >= 17 ? 17 : -7, 0, 0, 0); + var check_item_deliveryDate = new Date(item.deliveryDate); + check_item_deliveryDate.setUTCHours(check_item_deliveryDate.getUTCHours() >= 17 ? 17 : -7, 0, 0, 0); + + if (check_bookingDate.getTime() > check_item_deliveryDate.getTime()) { + itemError["deliveryDate"] = i18n.__("BookingOrder.items.deliveryDates.shouldNot:%s should not be less than booking date", i18n.__("BookingOrder.items.deliveryDate._:DeliveryDate")); + } else if (check_bookingDate.getTime() == check_item_deliveryDate.getTime()) { + itemError["deliveryDate"] = i18n.__("BookingOrder.items.deliveryDate2.shouldNot:%s should not be the same date as booking date", i18n.__("BookingOrder.items.deliveryDate._:DeliveryDate")); + } else if (check_deliveryDate.getTime() < check_item_deliveryDate.getTime()) { + itemError["deliveryDate"] = i18n.__("BookingOrder.items.deliveryDatedd.shouldNot:%s should not be more than booking deliveryDate", i18n.__("BookingOrder.items.deliveryDate._:DeliveryDate")); + } + // item.deliveryDate= new Date(item.deliveryDate.setDate(item.deliveryDate.getDate() + 1)); + } + + index++; + itemErrors.push(itemError); + } + for (var itemError of itemErrors) { + if (Object.getOwnPropertyNames(itemError).length > 0) { + errors.items = itemErrors; + break; + } + } + + } + // else + // errors["detail"] = i18n.__("BookingOrder.detail.mustHaveItem:%s must have at least 1 item", i18n.__("BookingOrder.detail._:Detail")); + + } + if (Object.getOwnPropertyNames(errors).length > 0) { + var ValidationError = require("module-toolkit").ValidationError; + return Promise.reject(new ValidationError("data does not pass validation", errors)); + } + + var indexCanceledItem = valid.items.findIndex(item => item.isCanceled); + if(indexCanceledItem > -1) { + var canceledItem = valid.items[indexCanceledItem]; + valid.canceledItems ? + valid.canceledItems.push(canceledItem) : + valid.canceledItems = [canceledItem]; + valid.items.splice(indexCanceledItem, 1); + } + + if(_buyer){ + valid.garmentBuyerId=new ObjectId(_buyer._id); + valid.garmentBuyerName=_buyer.name; + valid.garmentBuyerCode=_buyer.code; + } + + if(_section){ + valid.garmentSectionId=new ObjectId(_section._id); + valid.garmentSectionName=_section.name; + valid.garmentSectionCode=_section.code; + } + + if (!valid.stamp) { + valid = new BookingOrder(valid); + } + + valid.stamp(this.user.username, "manager"); + return Promise.resolve(valid); + }); + } + + cancelBooking(booking){ + return this.getSingleById(booking._id) + .then((booking) => { + var subtracted = booking.orderQuantity - + booking.items.reduce( + (total, value) => total + value.quantity + , 0 + ); + + booking.orderQuantity -= subtracted; + booking.canceledBookingOrder = booking.canceledBookingOrder + subtracted; + + booking.canceledDate = new Date(); + booking.isCanceled = booking.items.length <= 0; + + return this.update(booking) + .then((id) => + Promise.resolve(id) + ); + }); + } + + expiredBooking(booking){ + return this.getSingleById(booking._id) + .then( (booking) => { + var query = { + "bookingOrderNo": booking.code, + "_deleted":false + }; + booking._updatedDate=new Date(); + booking._updatedBy=this.user.username; + return this.sewingBlockingPlanCollection.singleOrDefault(query) + .then((sewingBlockingPlan) => { + var total=0; + booking.expiredDeletedDate=new Date(); + if(booking.items.length>0){ + for(var qty of booking.items){ + total+=qty.quantity; + } + } + var leftOver=booking.orderQuantity-total; + if(leftOver>0){ + booking.expiredBookingOrder = booking.expiredBookingOrder + leftOver; + booking.orderQuantity-=leftOver; + } + if(sewingBlockingPlan){ + if(booking.items.length==0){ + sewingBlockingPlan.status="Booking Expired"; + } + else{ + sewingBlockingPlan.status="Booking Ada Perubahan"; + for(var detail of sewingBlockingPlan.details){ + var itemBooking = booking.items.find(select => select.code === detail.code); + if(itemBooking){ + detail.isConfirmed = itemBooking.isConfirmed; + } + } + } + return this.sewingBlockingPlanCollection.update(sewingBlockingPlan) + .then((id) =>{ + return this.collection.update(booking) + .then((id) => + Promise.resolve(id) + ); + }) + } + else{ + return this.collection.update(booking) + .then((id) => + Promise.resolve(id) + ); + } + + + + }); + }); + } + + + _beforeInsert(data) { + // salesContract.salesContractNo = salesContract.salesContractNo ? salesContract.salesContractNo : generateCode(); + var dataGarmentSectionCode = data.garmentSectionCode ? data.garmentSectionCode : ""; + var dataGarmentBuyerCode = data.garmentBuyerCode ? data.garmentBuyerCode : ""; + var type = dataGarmentSectionCode + "-" + dataGarmentBuyerCode; + return this.documentNumbers + .find({ "type": type }, { "number": 1, "year": 1 }) + .sort({ "year": -1, "number": -1 }) + .limit(1) + .toArray() + .then((previousDocumentNumbers) => { + + var yearNow = moment().format("YYYY"); + + var number = 1; + + if (!data.code) { + if (previousDocumentNumbers.length > 0) { + + var oldYear = previousDocumentNumbers[0].year; + number = yearNow > oldYear ? number : previousDocumentNumbers[0].number + 1; + + data.code = `${type}-${yearNow.substr(-2)}${this.pad(number, 5)}`; + } else { + data.code = `${type}-${yearNow.substr(-2)}00001`; + } + } + + var documentNumbersData = { + type: type, + documentNumber: data.code, + number: number, + year: yearNow + } + + return this.documentNumbers + .insert(documentNumbersData) + .then((id) => { + return Promise.resolve(data) + }) + }) + } + + pad(number, length) { + + var str = '' + number; + while (str.length < length) { + str = '0' + str; + } + + return str; + } + + // confirmBooking(booking){ + // return this.getSingleById(booking._id) + // .then((booking) => { + // booking.isConfirmed=true; + // return this.update(booking) + // .then((id) => + // Promise.resolve(id) + // ); + // }); + // } + + _afterUpdate(id) { + return new Promise((resolve, reject) => { + var bookingId=id; + this.getSingleById(id) + .then((booking) => { + var query = { + "bookingOrderNo": booking.code, + "_deleted":false + }; + this.sewingBlockingPlanCollection.singleOrDefault(query) + .then((sewingBlockingPlan) => { + if(sewingBlockingPlan){ + if(booking.isCanceled){ + sewingBlockingPlan.status="Booking Dibatalkan"; + } + else{ + sewingBlockingPlan.status="Booking Ada Perubahan"; + for(var detail of sewingBlockingPlan.details){ + var itemBooking = booking.items.find(select => select.code === detail.code); + if(itemBooking){ + detail.isConfirmed = itemBooking.isConfirmed; + } + } + } + this.sewingBlockingPlanCollection.update(sewingBlockingPlan) + .then((id) => + resolve(bookingId)); + } + else{ + resolve(bookingId); + } + }); + //Promise.resolve(bookingId); + }); + }); + } + + + _createIndexes() { + var dateIndex = { + name: `ix_${map.garmentMasterPlan.collection.BookingOrder}__updatedDate`, + key: { + _updatedDate: -1 + } + }; + + var codeIndex = { + name: `ix_${map.garmentMasterPlan.collection.BookingOrder}_code`, + key: { + "code": 1 + } + }; + + return this.collection.createIndexes([dateIndex, codeIndex]); + } + + delete(data) { + data._deleted = true; + return this.sewingBlockingPlanCollection.singleOrDefault({ "bookingOrderNo": data.code,"_deleted":false }) + .then(sewingBlockingPlan =>{ + if(sewingBlockingPlan){ + sewingBlockingPlan.status="Booking Dihapus"; + return this.sewingBlockingPlanCollection.update(sewingBlockingPlan) + .then(idSewingBlockingPlan=>{ + return this.collection.update(data) + .then(id => {return id}); + }); + } + else{ + return this.collection.update(data) + .then(id => {return id}); + } + }); + } + + getBookingOrderReport(query,offset) { + return new Promise((resolve, reject) => { + + var deletedQuery = { _deleted: false }; + var date = new Date(); + var dateString = moment(date).format('YYYY-MM-DD'); + var dateNow = new Date(dateString); + var dateBefore = dateNow.setDate(dateNow.getDate() - 30); + var dateFrom = new Date(query.dateFrom); + var dateTo = new Date(query.dateTo); + dateFrom.setUTCHours(dateFrom.getUTCHours() >= 17 ? 17 : -7, 0, 0, 0); + dateTo.setUTCHours(dateTo.getUTCHours() >= 17 ? 17 : -7, 0, 0, 0); + + var dateQuery={}; + if (query.dateFrom !== undefined && query.dateFrom !== "" && query.dateTo !== undefined && query.dateTo !== "") + { + dateQuery = { + "bookingDate": { + "$gte": dateFrom, + "$lte": dateTo, + } + }; + } + var sectionQuery = {}; + if(query.section) { + sectionQuery = { + "section": query.section + }; + } + var codeQuery = {}; + if (query.code) { + codeQuery = { + "bookingCode": query.code + }; + } + var buyerQuery = {}; + if (query.buyer) { + buyerQuery = { + "buyer": query.buyer + }; + } + + var comodityQuery = {}; + if (query.comodity) { + comodityQuery = { + "comodity": query.comodity + }; + } + + var confirmStateQuery = {}; + if (query.confirmState === "Sudah Dikonfirmasi") { + confirmStateQuery = { + "deliveryDateConfirm":{$ne:"" } + } + }else if (query.confirmState === "Belum Dikonfirmasi") + { + confirmStateQuery = { + "deliveryDateConfirm": "" + } + } + var bookingOrderStateQuery ={}; + if (query.bookingOrderState === "Booking Dibatalkan") { + bookingOrderStateQuery = { + "isCanceled": true + } + }else if (query.bookingOrderState === "Sudah Dibuat Master Plan") { + bookingOrderStateQuery = { + "isMasterPlan": true, + "isCanceled":false + } + }else if (query.bookingOrderState === "Booking") { + bookingOrderStateQuery = { + "isMasterPlan": false , + "isCanceled":false , + "items": {$exists:false} + + } + }else if (query.bookingOrderState === "Confirmed") { + bookingOrderStateQuery = { + "isMasterPlan": false , + "isCanceled":false , + "items":{$exists:true} + + } + } + + var totalOrderQuery={"totalOrderQty":{$ne:0}}; + + var Query = { "$and": [ dateQuery, deletedQuery, sectionQuery, buyerQuery, comodityQuery, confirmStateQuery, bookingOrderStateQuery, codeQuery, totalOrderQuery] }; + this.collection + .aggregate( [ + { "$unwind": {path: "$items", preserveNullAndEmptyArrays: true} }, + { + "$project": { + "_updatedDate":"$_updatedDate", + "bookingCode": "$code", + "section": "$garmentSectionCode", + "bookingDate":"$bookingDate", + "buyer": "$garmentBuyerName", + "totalOrderQty" :"$orderQuantity", + "deliveryDateBooking":"$deliveryDate", + "orderQty":"$items.quantity", + "deliveryDateConfirm":{"$ifNull":["$items.deliveryDate",""]}, + "remark" :"$items.remark", + "isCanceled":"$isCanceled", + "comodity":"$items.masterPlanComodity.name", + "isMasterPlan":"$isMasterPlan", + "_deleted":"$_deleted", + "_createdDate":"$_createdDate", + "confirmDate":{"$ifNull":["$items._createdDate",""]}, + "items":"$items", + } + }, + { "$match": Query }, + { + "$sort": { + "_updatedDate": -1, + } + } + ]) + .toArray() + .then(results => { + resolve(results); + }) + .catch(e => { + reject(e); + }); + }); + } + + + getBookingOrderReportXls(dataReport, query,offset) { + + return new Promise((resolve, reject) => { + var xls = {}; + xls.data = []; + xls.options = []; + xls.name = ''; + var remain=0; + var temp=dataReport.data; + var dateFormat = "DD/MM/YYYY"; + var temp_data = {}; + + this.rowspan=[]; + this.dataXls=[]; + + var count=0; + var row_span_count=1; + + for (var data of dataReport.data) { + var item = {}; + var item_temp = {}; + var rowcount={}; + var confirmstate=""; + var bookingOrderState=""; + if(data.deliveryDateConfirm=="") + { + confirmstate="Belum Dikonfirmasi"; + }else + { + confirmstate="Sudah Dikonfirmasi"; + } + if(data.isCanceled==true) + { + bookingOrderState="Booking Dibatalkan"; + }else if(data.isMasterPlan ==true) + { + bookingOrderState="Sudah Dibuat Master Plan"; + }else if(data.isMasterPlan == false && data.isCanceled==false) + { + if(!data.items){ + bookingOrderState="Booking"; + } else if(data.items){ + bookingOrderState="Confirmed"; + } + } + + item["Kode Booking"] = data.bookingCode; + item["Tanggal Booking"] = data.bookingDate ? moment(new Date(data.bookingDate)).add(7, 'h').format(dateFormat) : ''; + item["Buyer"] = data.buyer ? data.buyer : ''; + item["Jumlah Order"] = data.totalOrderQty ? data.totalOrderQty : ''; + item["Tanggal Pengiriman (Booking)"]= data.deliveryDateBooking && data.deliveryDateBooking !="" ? moment(data.deliveryDateBooking ).add(7, 'h').format(dateFormat) : ''; + item["Komoditi"]=data.comodity ? data.comodity : ''; + item["Jumlah Confirm"] = data.orderQty ? data.orderQty : ''; + item["Tanggal Pengiriman(Confirm)"] = data.deliveryDateConfirm && data.deliveryDateConfirm !="" ? moment(new Date(data.deliveryDateConfirm)).add(7, 'h').format(dateFormat) : ''; + item["Tanggal Confirm"] = data.confirmDate && data.confirmDate !="" ? moment(new Date(data.confirmDate)).add(7, 'h').format(dateFormat) : ''; + item["Keterangan"] = data.remark ? data.remark : ''; + item["Status Confirm"] = confirmstate ? confirmstate : ''; + item["Status Booking Order"] = bookingOrderState ? bookingOrderState : ''; + for(var items of temp) + { + if(data.bookingCode == items.bookingCode) + { + remain = remain + items.orderQty; + item["Sisa Order(Belum Confirm)"]=remain ? data.totalOrderQty-remain :data.totalOrderQty; + } + + } + var today=new Date(); + var a = moment(new Date(data.deliveryDateBooking)).add(7, 'h').locale('id'); + var b = today; + a = new Date(a); + a.setHours(0,0,0,0); + b.setHours(0,0,0,0); + var diff=a.getTime() - b.getTime(); + var timeDiff = a.getTime() - b.getTime(); + var diffDays = Math.ceil(timeDiff / (1000 * 3600 * 24)); + + if(diffDays>0 && diffDays<=45){ + item["Selisih Hari (dari Tanggal Pengiriman)"] = diffDays; + } else if(diffDays<=0 || diffDays>45){ + item["Selisih Hari (dari Tanggal Pengiriman)"] = '-'; + } + + if(temp_data.code == data.bookingCode){ + item_temp["Kode Booking"]=''; + item_temp["Tanggal Booking"]=''; + item_temp["Buyer"]=''; + item_temp["Jumlah Order"]=''; + item_temp["Status Confirm"]=''; + item_temp["Status Booking Order"]=''; + item_temp["Sisa Order(Belum Confirm)"]=''; + item_temp["Tanggal Pengiriman (Booking)"]=''; + item_temp["Komoditi"]=item["Komoditi"]; + item_temp["Tanggal Pengiriman(Confirm)"]=item["Tanggal Pengiriman(Confirm)"]; + item_temp["Tanggal Confirm"]=item["Tanggal Confirm"]; + item_temp["Jumlah Confirm"] = item["Jumlah Confirm"]; + item_temp["Keterangan"]=item["Keterangan"]; + item_temp["Selisih Hari (dari Tanggal Pengiriman)"]=item["Selisih Hari (dari Tanggal Pengiriman)"]; + row_span_count=row_span_count+1; + rowcount.row_count=row_span_count; + + rowcount.code=data.bookingCode; + xls.data.push(item_temp); + this.rowspan.push(rowcount); + + } else if(!temp_data.code || temp_data.code!=data.bookingCode){ + temp_data.code=data.bookingCode; + row_span_count=1; + rowcount.row_count=row_span_count; + rowcount.code=data.bookingCode; + xls.data.push(item); + this.rowspan.push(rowcount); + } + remain=0; + + xls.options.specification = {}; + var fgColor = function(color){ + return { + fgColor: { + rgb: color + } + }; + }; + var border = { + top: { style: 'thin', color: 'FF000000' }, + bottom: { style: 'thin', color: 'FF000000' }, + left: { style: 'thin', color: 'FF000000' }, + right: { style: 'thin', color: 'FF000000' }, + }; + var styles = { + header: { + fill: fgColor('FFCCCCCC'), + border: border, + alignment: { + horizontal: 'center' + }, + font: { + bold: true + } + }, + cellUnit: { + + border: border, + alignment: { + vertical: 'top' + }, + + }, + cellUnit_2: { + border: border, + alignment: { + horizontal: 'right', + vertical: 'top' + }, + + }, + }; + + for(var b of Object.keys(xls.data[0])){ + + if(b=='Tanggal Pengiriman (Booking)' || b=='Tanggal Pengiriman(Confirm)' || b=='Sisa Order(Belum Confirm)'){ + xls.options.specification[b] = { + displayName: b, + width: 200, + headerStyle: styles.header, + cellStyle: styles.cellUnit + }; + }else if(b=='Selisih Hari (dari Tanggal Pengiriman)'){ + xls.options.specification[b] = { + displayName: b, + width: 250, + headerStyle: styles.header, + cellStyle: styles.cellUnit_2 + }; + } else { + xls.options.specification[b] = { + displayName: b, + width: 150, + headerStyle: styles.header, + cellStyle: styles.cellUnit + }; + } + }; + + + if (this.rowspan[count].row_count>1){ + for(var x=this.rowspan[count].row_count;01 && (b!=="Komoditi" && b!=="Tanggal Pengiriman(Confirm)" && b!=="Tanggal Confirm" && b!=="Jumlah Confirm" && b!=="Keterangan")){//&& xls.data[a].b && ){ + xls.options.merges.push( + { start: { row: a+2, column: c }, end: { row: (a+(this.rowspan[d].row_count)+1), column: c } } + ); + } + c++; + } + d++; + } + + xls.options["Kode Booking"] = "string"; + xls.options["Tanggal Booking"] = "string"; + xls.options["Buyer"] = "string"; + xls.options["Jumlah Order"] = "string"; + xls.options["Tanggal Pengiriman(Booking)"] = "string"; + xls.options["Komoditi"] = "string"; + xls.options["Tanggal Pengiriman(Confirm)"] = "string"; + xls.options["Tanggal Confirm"] = "string"; + xls.options["Keterangan"] = "string"; + xls.options["Status Confirm"] = "string"; + xls.options["Status Booking Order"] = "string"; + xls.options["Sisa Order(Belum Confirm)"] = "string"; + xls.options["Selisih Hari (dari Tanggal Pengiriman)"] = "number"; + + if (query.dateFrom && query.dateTo) { + xls.name = `Booking Order ${moment(new Date(query.dateFrom)).add(7, 'h').format(dateFormat)} - ${moment(new Date(query.dateTo)).add(7, 'h').format(dateFormat)}.xlsx`; + } + else if (!query.dateFrom && query.dateTo) { + xls.name = `Booking Order ${moment(new Date(query.dateTo)).add(7, 'h').format(dateFormat)}.xlsx`; + } + else if (query.dateFrom && !query.dateTo) { + xls.name = `Booking Order ${moment(new Date(query.dateFrom)).add(7, 'h').format(dateFormat)}.xlsx`; + } + else + xls.name = `Booking Order Report.xlsx`; + + resolve(xls); + }); + } + + getCanceledBookingOrderReport(query,offset) { + return new Promise((resolve, reject) => { + + var deletedQuery = { _deleted: false }; + var date = new Date(); + var dateString = moment(date).format('YYYY-MM-DD'); + var dateNow = new Date(dateString); + var dateBefore = dateNow.setDate(dateNow.getDate() - 30); + var dateFrom = new Date(query.dateFrom); + var dateTo = new Date(query.dateTo); + dateFrom.setUTCHours(dateFrom.getUTCHours() >= 17 ? 17 : -7, 0, 0, 0); + dateTo.setUTCHours(dateTo.getUTCHours() >= 17 ? 17 : -7, 0, 0, 0); + + var dateQuery={}; + if (query.dateFrom !== undefined && query.dateFrom !== "" && query.dateTo !== undefined && query.dateTo !== "") + { + dateQuery = { + "bookingDate": { + "$gte": dateFrom, + "$lte": dateTo, + } + }; + } + + var codeQuery = {}; + if (query.code) { + codeQuery = { + "bookingCode": query.code + }; + } + var buyerQuery = {}; + if (query.buyer) { + buyerQuery = { + "buyer": query.buyer + }; + } + + var cancelStateQuery = {}; + var cancelStateQueryOr = {}; + if (query.cancelState === "Cancel Confirm") { + cancelStateQuery = { + "canceledItems":{"$ne":[] }, + "canceledItems":{$exists:true} + } + }else if (query.cancelState === "Cancel Sisa") + { + cancelStateQuery = { + "canceledBookingOrder":{"$gt":0} + } + }else if (query.cancelState==="Expired") + { + cancelStateQuery = { + "expiredBookingOrder":{"$gt":0} + } + } + + var Query = [ dateQuery, deletedQuery, buyerQuery, cancelStateQuery, codeQuery] ; + var queryOr; + if(query.cancelState==="Cancel Sisa" || query.cancelState==="Expired"){ + queryOr=[{}]; + } else { + queryOr= [cancelStateQuery]; + } + this.collection + .aggregate( [ + { "$unwind": {path: "$canceledItems", preserveNullAndEmptyArrays: true} }, + { + "$project": { + "_updatedDate":"$_updatedDate", + "bookingCode": "$code", + "bookingDate":"$bookingDate", + "buyer": "$garmentBuyerName", + "totalOrderQty" :"$orderQuantity", + "canceledBookingOrder":"$canceledBookingOrder", + "expiredBookingOrder":"$expiredBookingOrder", + "deliveryDateBooking":"$deliveryDate", + "orderQty":"$canceledItems.quantity", + "deliveryDateConfirm":{"$ifNull":["$canceledItems.deliveryDate",""]}, + "remark" :"$canceledItems.remark", + "comodity":"$canceledItems.masterPlanComodity.name", + "_deleted":"$_deleted", + "_createdDate":"$_createdDate", + "cancelItemsDate":"$canceledItems.canceledDate", + "canceledDate":"$canceledDate", + "expiredDeletedDate":"$expiredDeletedDate", + "cancelConfirmDate":{"$ifNull":["$canceledItems._createdDate",""]}, + "items":"$items", + "canceledItems":"$canceledItems" + } + }, + { "$match": {"$and":Query,"$or":queryOr} }, + { + "$sort": { + "_updatedDate": -1, + "bookingCode" : 1, + } + } + ]) + .toArray() + .then(results => { + resolve(results); + }) + .catch(e => { + reject(e); + }); + }); + } + + + getCanceledBookingOrderReportXls(dataReport, query,offset) { + + return new Promise((resolve, reject) => { + var xls = {}; + xls.data = []; + xls.options = []; + xls.name = ''; + var temp=dataReport.data; + + var _temp = {}; + var _temp2 = {}; + var _temp3 = {}; + var dateFormat = "DD/MM/YYYY"; + var temp_data = {}; + + this.rowspan=[]; + this.dataXls=[]; + + var count=0; + var row_span_count=1; + + for (var data of dataReport.data) { + var temporaryCancelSisa = {}; + var temporaryExpired = {}; + var item = {}; + var item_temp = {}; + var rowcount={}; + var temporaryCancelSisa = {}; + var temporaryExpired = {}; + + item["Kode Booking"]= data.bookingCode; + item["Tanggal Booking"] =data.bookingDate ? moment(data.bookingDate).add(7, 'h').format("DD MMMM YYYY") : "";; + item["Buyer"] = data.buyer; + if((data.canceledBookingOrder==0 || data.canceledBookingOrder==undefined) && (data.expiredBookingOrder==0 || data.expiredBookingOrder==undefined)){ + item["Jumlah Booking Order Awal"] = data.totalOrderQty; + } else if(data.canceledBookingOrder>0 && data.expiredBookingOrder>0){ + item["Jumlah Booking Order Awal"] = data.totalOrderQty + data.canceledBookingOrder + data.expiredBookingOrder; + } else if(data.canceledBookingOrder>0 && (data.expiredBookingOrder==0 || data.expiredBookingOrder==undefined)){ + item["Jumlah Booking Order Awal"] =data.totalOrderQty + data.canceledBookingOrder; + } else if((data.canceledBookingOrder==0 || data.canceledBookingOrder==undefined) && data.expiredBookingOrder>0){ + item["Jumlah Booking Order Awal"]= data.totalOrderQty + data.expiredBookingOrder; + } + + item["Jumlah Booking Order Akhir"] = data.totalOrderQty; + item["Tanggal Pengiriman (Booking)"]= data.deliveryDateBooking ? moment(data.deliveryDateBooking).add(7, 'h').format("DD MMMM YYYY") : ""; + + if(!data.canceledItems) { + item["Komoditi"]=""; + item["Jumlah Confirm"]=""; + item["Tanggal Confirm"]=""; + item["Tanggal Pengiriman (Confirm)"]=""; + item["Keterangan"]=""; + } else { + item["Komoditi"] = data.comodity; + item["Jumlah Confirm"] = data.orderQty; + item["Tanggal Confirm"] = data.cancelConfirmDate ? moment(data.cancelConfirmDate).add(7, 'h').format("DD MMMM YYYY") : ""; + item["Tanggal Pengiriman (Confirm)"] = data.deliveryDateConfirm ? moment(data.deliveryDateConfirm).add(7, 'h').format("DD MMMM YYYY") : ""; + item["Keterangan"] = data.remark; + } + + if(!item["Komoditi"]){ + if(data.canceledBookingOrder>0 && (query.cancelState=='' || query.cancelState=='Cancel Sisa')){ + + item["Tanggal Cancel"]=data.canceledDate ? moment(data.canceledDate).add(7, 'h').format("DD MMMM YYYY") : ""; + item["Jumlah yang Dicancel"]=data.canceledBookingOrder; + item["Status Cancel"]="Cancel Sisa"; + + } else if(data.expiredBookingOrder>0 && (query.cancelState== '' || query.cancelState=='Expired')){ + + item["Tanggal Cancel"]=data.expiredDeletedDate ? moment(data.expiredDeletedDate).add(7, 'h').format("DD MMMM YYYY") : ""; + item["Jumlah yang Dicancel"]=data.expiredBookingOrder; + item["Status Cancel"]="Expired"; + + } + } else if(item["Komoditi"]) { + item["Tanggal Cancel"]=data.cancelItemsDate ? moment(data.cancelItemsDate).add(7, 'h').format("DD MMMM YYYY") : ""; + item["Jumlah yang Dicancel"]=data.orderQty; + item["Status Cancel"]="Cancel Confirm"; + } + + if (item["Tanggal Cancel"] || (data.canceledBookingOrder>0 || data.expiredBookingOrder>0)){ + if(query.cancelState!=="Cancel Confirm"){ + if(data.canceledBookingOrder>0 && data.canceledItems && (item["Kode Booking"]!==_temp2.code || !_temp2.code) && (item["Status Cancel"]!==_temp2.cancelState || !_temp2.cancelState) && query.cancelState!=="Expired"){ //&& _data.cancelState!=="Cancel Confirm"){ + _temp2.code=item["Kode Booking"]; + _temp2.cancelState=item["Status Cancel"]; + temporaryCancelSisa["Kode Booking"]=item["Kode Booking"]; + temporaryCancelSisa["Tanggal Booking"] =item["Tanggal Booking"]; + temporaryCancelSisa["Buyer"] = item["Buyer"]; + temporaryCancelSisa["Jumlah Booking Order Awal"] = item["Jumlah Booking Order Awal"]; + temporaryCancelSisa["Jumlah Booking Order Akhir"] = item["Jumlah Booking Order Akhir"] + temporaryCancelSisa["Tanggal Pengiriman (Booking)"] = item["Tanggal Pengiriman (Booking)"]; + temporaryCancelSisa["Komoditi"] = ""; + temporaryCancelSisa["Jumlah Confirm"] = ""; + temporaryCancelSisa["Tanggal Confirm"] = ""; + temporaryCancelSisa["Tanggal Pengiriman (Confirm)"] = ""; + temporaryCancelSisa["Keterangan"] = ""; + temporaryCancelSisa["Tanggal Cancel"]=data.canceledDate ? moment(data.canceledDate).add(7, 'h').format("DD MMMM YYYY") : ""; + temporaryCancelSisa["Jumlah yang Dicancel"]=data.canceledBookingOrder; + temporaryCancelSisa["Status Cancel"]="Cancel Sisa"; + + row_span_count=1; + rowcount.row_count=row_span_count; + rowcount.code=item["Kode Booking"]; + rowcount.cancelState=temporaryCancelSisa["Status Cancel"]; + + count++; + xls.data.push(temporaryCancelSisa); + this.rowspan.push(rowcount); + } + if(data.expiredBookingOrder>0 && data.canceledItems && (item["Kode Booking"]!==_temp3.code || !_temp3.code) && (item["Status Cancel"]!==_temp3.cancelState || !_temp3.cancelState)&& query.cancelState!=="Cancel Sisa"){ //&& _data.cancelState!=="Cancel Confirm"){ + _temp3.code=item["Kode Booking"]; + _temp3.cancelState=item["Status Cancel"]; + temporaryExpired["Kode Booking"]=item["Kode Booking"]; + temporaryExpired["Tanggal Booking"] =item["Tanggal Booking"]; + temporaryExpired["Buyer"] = item["Buyer"]; + temporaryExpired["Jumlah Booking Order Awal"] = item["Jumlah Booking Order Awal"]; + temporaryExpired["Jumlah Booking Order Akhir"] = item["Jumlah Booking Order Akhir"] + temporaryExpired["Tanggal Pengiriman (Booking)"] = item["Tanggal Pengiriman (Booking)"]; + temporaryExpired["Komoditi"] = ""; + temporaryExpired["Jumlah Confirm"] = ""; + temporaryExpired["Tanggal Confirm"] = ""; + temporaryExpired["Tanggal Pengiriman (Confirm)"] = ""; + temporaryExpired["Keterangan"] = ""; + temporaryExpired["Tanggal Cancel"]=data.expiredDeletedDate ? moment(data.expiredDeletedDate).add(7, 'h').format("DD MMMM YYYY") : ""; + temporaryExpired["Jumlah yang Dicancel"]=data.expiredBookingOrder; + temporaryExpired["Status Cancel"]="Expired"; + count++; + + row_span_count=1; + rowcount.row_count=row_span_count; + rowcount.code=item["Kode Booking"]; + rowcount.cancelState=temporaryExpired["Status Cancel"]; + xls.data.push(temporaryExpired); + this.rowspan.push(rowcount); + } + } + if(_temp.code == item["Kode Booking"] && _temp.cancelState == item["Status Cancel"]){ + item["Kode Booking"]=''; + item["Tanggal Booking"]=''; + item["Buyer"]=''; + item["Jumlah Booking Order Akhir"]=''; + item["Tanggal Pengiriman (Booking)"]=''; + item["Jumlah Booking Order Awal"]=''; + row_span_count=row_span_count+1; + } else if((!_temp.code || _temp.code !== item["Kode Booking"]) ){ + _temp.code = item["Kode Booking"]; + _temp.cancelState = item["Status Cancel"]; + row_span_count=1; + } else if(_temp.code==item["Kode Booking"] && _temp.cancelState!==item["Status Cancel"]){ + _temp.code = item["Kode Booking"]; + _temp.cancelState = item["Status Cancel"]; + row_span_count=1; + } + + if(query.cancelState=="Cancel Sisa" || query.cancelState=="Expired"){ + if(item["Status Cancel"] !== "Cancel Confirm"){ + rowcount.row_count=row_span_count; + rowcount.code=data.bookingCode; + rowcount.cancelState=item["Status Cancel"]; + xls.data.push(item); + this.rowspan.push(rowcount); + } + } else { + rowcount.row_count=row_span_count; + rowcount.code=data.bookingCode; + rowcount.cancelState=item["Status Cancel"]; + xls.data.push(item); + this.rowspan.push(rowcount); + if (this.rowspan[count].row_count>1){ + for(var x=rowcount.row_count;01 && (b!=="Komoditi" && b!=="Jumlah Confirm" && b!=="Tanggal Confirm" && b!=="Tanggal Pengiriman (Confirm)" && b!=="Keterangan" && b!=="Tanggal Cancel" && b!=="Jumlah yang Dicancel" && b!=="Status Cancel")){//&& xls.data[a].b && ){ + if(xls.data[a]["Status Cancel"]=="Cancel Confirm"){ + xls.options.merges.push( + { start: { row: a+2, column: c }, end: { row: (a+(this.rowspan[d].row_count)+1), column: c } } + ); + } + } + c++; + } + d++; + } + + xls.options["Kode Booking"] = "string"; + xls.options["Tanggal Booking"] = "string"; + xls.options["Buyer"] = "string"; + xls.options["Jumlah Booking Order Awal"] = "number"; + xls.options["Jumlah Booking Order Akhir"] = "number"; + xls.options["Tanggal Pengiriman (Booking)"] = "string"; + xls.options["Komoditi"] = "string"; + xls.options["Jumlah Confirm)"] = "number"; + xls.options["Tanggal Confirm"] = "string"; + xls.options["Tanggal Pengiriman (Confirm"] = "string"; + xls.options["Keterangan"] = "string"; + xls.options["Tanggal Cancel"] = "string"; + xls.options["Jumlah yang Dicancel"] = "number"; + xls.options["Status Cancel"] = "string"; + + if (query.dateFrom && query.dateTo) { + xls.name = `Canceled Booking Order ${moment(new Date(query.dateFrom)).add(7, 'h').format(dateFormat)} - ${moment(new Date(query.dateTo)).add(7, 'h').format(dateFormat)}.xlsx`; + } + else if (!query.dateFrom && query.dateTo) { + xls.name = `Canceled Booking Order ${moment(new Date(query.dateTo)).add(7, 'h').format(dateFormat)}.xlsx`; + } + else if (query.dateFrom && !query.dateTo) { + xls.name = `Canceled Booking Order ${moment(new Date(query.dateFrom)).add(7, 'h').format(dateFormat)}.xlsx`; + } + else + xls.name = `Canceled Booking Order Report.xlsx`; + + resolve(xls); + }); + } +} \ No newline at end of file diff --git a/src/managers/sp-master-plan/garment-section-manager.js b/src/managers/sp-master-plan/garment-section-manager.js new file mode 100644 index 000000000..6acf13bdf --- /dev/null +++ b/src/managers/sp-master-plan/garment-section-manager.js @@ -0,0 +1,116 @@ +"use strict" + +var ObjectId = require("mongodb").ObjectId; +require("mongodb-toolkit"); +var DLModels = require("dl-models"); +var map = DLModels.map; +var GarmentSection = DLModels.garmentMasterPlan.GarmentSection; +var BaseManager = require("module-toolkit").BaseManager; +var i18n = require("dl-i18n"); + +module.exports = class GarmentSectionManager extends BaseManager { + constructor(db, user) { + super(db, user); + this.collection = this.db.use(map.garmentMasterPlan.collection.GarmentSection); + } + + _getQuery(paging) { + var _default = { + _deleted: false + }, + pagingFilter = paging.filter || {}, + keywordFilter = {}, + query = {}; + + if (paging.keyword) { + var regex = new RegExp(paging.keyword, "i"); + var codeFilter = { + "code": { + "$regex": regex + } + }; + var nameFilter = { + "name": { + "$regex": regex + } + }; + keywordFilter["$or"] = [codeFilter, nameFilter]; + } + query["$and"] = [_default, keywordFilter, pagingFilter]; + return query; + } + + _validate(garmentSection) { + var errors = {}; + var valid = garmentSection; + + // 1. begin: Declare promises. + + // trim string for code and name + valid.code = valid.code ? valid.code.trim() : ""; + valid.name = valid.name ? valid.name.trim() : ""; + + var getGarmentSectionByCode = this.collection.singleOrDefault({ + _id: { + "$ne": new ObjectId(valid._id) + }, + code: valid.code, + _deleted: false + }); + + var getGarmentSectionByName = this.collection.singleOrDefault({ + _id: { + "$ne": new ObjectId(valid._id) + }, + name: valid.name, + _deleted: false + }); + + // 2. begin: Validation. + return Promise.all([getGarmentSectionByCode, getGarmentSectionByName]) + .then(results => { + var duplicateGarmentSectionByCode = results[0]; + var duplicateGarmentSectionByName = results[1]; + + if(!valid.code || valid.code === "") + errors["code"] = i18n.__("GarmentSection.code.isRequired:%s is required", i18n.__("GarmentSection.code._:Code")); + else if (duplicateGarmentSectionByCode) + errors["code"] = i18n.__("GarmentSection.name.isExists:%s already exists", i18n.__("GarmentSection.code._:Code")); + + if(!valid.name || valid.name === "") + errors["name"] = i18n.__("GarmentSection.name.isRequired:%s is required", i18n.__("GarmentSection.name._:Name")); + else if (duplicateGarmentSectionByName) + errors["name"] = i18n.__("GarmentSection.name.isExists:%s already exists", i18n.__("GarmentSection.name._:Name")); + + if (Object.getOwnPropertyNames(errors).length > 0) { + var ValidationError = require("module-toolkit").ValidationError; + return Promise.reject(new ValidationError("data does not pass validation", errors)); + } + + if (!valid.stamp) { + valid = new GarmentSection(valid); + } + + valid.stamp(this.user.username, "manager"); + return Promise.resolve(valid); + }); + } + + _createIndexes() { + var dateIndex = { + name: `ix_${map.garmentMasterPlan.collection.GarmentSection}__updatedDate`, + key: { + _updatedDate: -1 + } + }; + + var codeIndex = { + name: `ix_${map.garmentMasterPlan.collection.GarmentSection}_code`, + key: { + "code": 1 + } + }; + + return this.collection.createIndexes([dateIndex, codeIndex]); + } +} \ No newline at end of file diff --git a/src/managers/sp-master-plan/master-plan-comodity-manager.js b/src/managers/sp-master-plan/master-plan-comodity-manager.js new file mode 100644 index 000000000..4c3b7984c --- /dev/null +++ b/src/managers/sp-master-plan/master-plan-comodity-manager.js @@ -0,0 +1,100 @@ +"use strict" + +var ObjectId = require("mongodb").ObjectId; +require("mongodb-toolkit"); +var DLModels = require("dl-models"); +var map = DLModels.map; +var MasterPlanComodity = DLModels.spMasterPlan.MasterPlanComodity; +var BaseManager = require("module-toolkit").BaseManager; +var i18n = require("dl-i18n"); + +module.exports = class MasterPlanComodityManager extends BaseManager { + constructor(db, user) { + super(db, user); + this.collection = this.db.use(map.spMasterPlan.collection.MasterPlanComodity); + } + + _getQuery(paging) { + var _default = { + _deleted: false + }, + pagingFilter = paging.filter || {}, + keywordFilter = {}, + query = {}; + + if (paging.keyword) { + var regex = new RegExp(paging.keyword, "i"); + var codeFilter = { + "code": { + "$regex": regex + } + }; + var nameFilter = { + "name": { + "$regex": regex + } + }; + keywordFilter["$or"] = [codeFilter, nameFilter]; + } + query["$and"] = [_default, keywordFilter, pagingFilter]; + return query; + } + + _validate(masterPlanComodity) { + var errors = {}; + var valid = masterPlanComodity; + // 1. begin: Declare promises. + var getMasterPlanComodity = this.collection.singleOrDefault({ + _id: { + "$ne": new ObjectId(valid._id) + }, + code: valid.code, + _deleted: false + }); + + // 2. begin: Validation. + return Promise.all([getMasterPlanComodity]) + .then(results => { + var duplicateMasterPlanComodity = results[0]; + + if(!valid.code || valid.code === "") + errors["code"] = i18n.__("MasterPlanComodity.code.isRequired:%s is required", i18n.__("MasterPlanComodity.code._:Code")); + if (duplicateMasterPlanComodity) { + errors["code"] = i18n.__("MasterPlanComodity.code.isExists:%s is already exists", i18n.__("MasterPlanComodity.code._:Code")); + } + + if(!valid.name || valid.name === "") + errors["name"] = i18n.__("MasterPlanComodity.name.isRequired:%s is required", i18n.__("MasterPlanComodity.name._:Name")); + + if (Object.getOwnPropertyNames(errors).length > 0) { + var ValidationError = require("module-toolkit").ValidationError; + return Promise.reject(new ValidationError("data does not pass validation", errors)); + } + + if (!valid.stamp) { + valid = new MasterPlanComodity(valid); + } + + valid.stamp(this.user.username, "manager"); + return Promise.resolve(valid); + }); + } + + _createIndexes() { + var dateIndex = { + name: `ix_${map.spMasterPlan.collection.MasterPlanComodity}__updatedDate`, + key: { + _updatedDate: -1 + } + }; + + var codeIndex = { + name: `ix_${map.spMasterPlan.collection.MasterPlanComodity}_code`, + key: { + "code": 1 + } + }; + + return this.collection.createIndexes([dateIndex, codeIndex]); + } +} \ No newline at end of file diff --git a/src/managers/sp-master-plan/sewing-blocking-plan-manager.js b/src/managers/sp-master-plan/sewing-blocking-plan-manager.js new file mode 100644 index 000000000..361da1078 --- /dev/null +++ b/src/managers/sp-master-plan/sewing-blocking-plan-manager.js @@ -0,0 +1,1358 @@ +"use strict" + +require("should"); +var ObjectId = require("mongodb").ObjectId; +require("mongodb-toolkit"); +var DLModels = require("dl-models"); +var map = DLModels.map; +var SewingBlockingPlan = DLModels.garmentMasterPlan.SewingBlockingPlan; +var SewingBlockingPlanDetail = DLModels.garmentMasterPlan.SewingBlockingPlanDetail; +var SewingBlockingPlanDetailItem = DLModels.garmentMasterPlan.SewingBlockingPlanDetailItem; +var BaseManager = require("module-toolkit").BaseManager; +var i18n = require("dl-i18n"); +var WeeklyPlanManager = require('./weekly-plan-manager'); +var GarmentBuyerManager = require('../master/garment-buyer-manager'); +var BookingOrderManager = require('./booking-order-manager'); +var MasterPlanComodityManager = require('./master-plan-comodity-manager'); +var UnitManager = require('../master/unit-manager'); +var generateCode = require("../../utils/code-generator"); + +module.exports = class SewingBlockingPlanManager extends BaseManager { + constructor(db, user) { + super(db, user); + this.collection = this.db.use(map.garmentMasterPlan.collection.SewingBlockingPlan); + this.weeklyPlanManager = new WeeklyPlanManager(db, user); + this.garmentBuyerManager = new GarmentBuyerManager(db, user); + this.unitManager = new UnitManager(db, user); + this.bookingOrderManager = new BookingOrderManager(db, user); + this.masterPlanComodityManager = new MasterPlanComodityManager(db, user); + } + + _getQuery(paging) { + var _default = { + _deleted: false + }, + pagingFilter = paging.filter || {}, + keywordFilter = {}, + query = {}; + + if (paging.keyword) { + var regex = new RegExp(paging.keyword, "i"); + var codeFilter = { + "bookingOrderNo": { + "$regex": regex + } + }; + var buyerFilter = { + "garmentBuyerName": { + "$regex": regex + } + }; + var statusFilter = { + "status": { + "$regex": regex + } + }; + keywordFilter["$or"] = [codeFilter, buyerFilter, statusFilter]; + } + query["$and"] = [_default, keywordFilter, pagingFilter]; + return query; + } + + _beforeInsert(sewingBlockingPlan) { + sewingBlockingPlan.code = !sewingBlockingPlan.code ? generateCode() : sewingBlockingPlan.code; + sewingBlockingPlan._active = true; + sewingBlockingPlan._createdDate = new Date(); + return Promise.resolve(sewingBlockingPlan); + } + + _validate(sewingBlockingPlan) { + var errors = {}; + var valid = sewingBlockingPlan; + // 1. begin: Declare promises. + + var getSewingBlockingPlan = this.collection.singleOrDefault({ + _id: { + "$ne": new ObjectId(valid._id) + }, + bookingOrderNo: valid.bookingOrderNo ? valid.bookingOrderNo : "", + _deleted: false + }); + var units = []; + var weeks = []; + var comodities = []; + if (valid.details && valid.details.length > 0) { + for (var detail of valid.details) { + if (detail.unitId && ObjectId.isValid(detail.unitId)) + units.push(new ObjectId(detail.unitId)); + if (detail.weeklyPlanYear) + weeks.push(detail.weeklyPlanYear); + if (detail.masterPlanComodity) { + //detail.masterPlanComodityId=new ObjectId(detail.masterPlanComodity._id) + if (detail.masterPlanComodityId && ObjectId.isValid(detail.masterPlanComodityId)) + comodities.push(new ObjectId(detail.masterPlanComodityId)); + } + } + } + var getBuyer = valid.garmentBuyerId && ObjectId.isValid(valid.garmentBuyerId) ? this.garmentBuyerManager.getSingleByIdOrDefault(new ObjectId(valid.garmentBuyerId)) : Promise.resolve(null); + var getBookingOrder = valid.bookingOrderId && ObjectId.isValid(valid.bookingOrderId) ? this.bookingOrderManager.getSingleByIdOrDefault(new ObjectId(valid.bookingOrderId)) : Promise.resolve(null); + var getUnits = units.length > 0 ? this.unitManager.collection.find({ "_id": { "$in": units } }).toArray() : Promise.resolve([]); + var getWeeklyPlan = weeks.length > 0 ? this.weeklyPlanManager.collection.find({ "year": { "$in": weeks } }).toArray() : Promise.resolve([]); + var getComodity = comodities.length > 0 ? this.masterPlanComodityManager.collection.find({ "_id": { "$in": comodities } }).toArray() : Promise.resolve([]); + + // 2. begin: Validation. + return Promise.all([getSewingBlockingPlan, getBuyer, getBookingOrder, getUnits, getWeeklyPlan, getComodity]) + .then(results => { + var _sewingBlockingPlan = results[0]; + var _buyer = results[1]; + var _bookingOrder = results[2]; + var _units = results[3]; + var _weeklyPlan = results[4]; + var _comodities = results[5]; + + if (!valid.bookingOrderNo || valid.bookingOrderNo === "") + errors["bookingOrderNo"] = i18n.__("SewingBlockingPlan.bookingOrderNo.isRequired:%s is required", i18n.__("SewingBlockingPlan.bookingOrderNo._:BookingOrderNo")); + else if (_sewingBlockingPlan) + errors["bookingOrderNo"] = i18n.__("SewingBlockingPlan.bookingOrderNo.isExists:%s is already exists in Master Plan", i18n.__("SewingBlockingPlan.bookingOrderNo._:BookingOrderNo")); + else if (!_bookingOrder) + errors["bookingOrderNo"] = i18n.__("SewingBlockingPlan.bookingOrderNo.isNotExists:%s is not exists", i18n.__("SewingBlockingPlan.bookingOrderNo._:BookingOrderNo")); + + if (!valid.details || valid.details.length === 0) + errors["detail"] = "detail must have 1 item"; + else { + var detailErrors = []; + var totalDetail = 0; + for (var detail of valid.details) { + var detailError = {}; + totalDetail += (!detail.quantity ? 0 : detail.quantity); + // if(!detail.shCutting || detail.shCutting === 0) + // detailError["shCutting"] = i18n.__("SewingBlockingPlan.details.shCutting.mustGreater:%s must greater than 0", i18n.__("SewingBlockingPlan.details.shCutting._:Sh Cutting")); + if (!detail.shSewing || detail.shSewing === 0) + detailError["shSewing"] = i18n.__("SewingBlockingPlan.details.smvSewing.mustGreater:%s must greater than 0", i18n.__("SewingBlockingPlan.details.smvSewing._:SMV Sewing")); + // if(!detail.shFinishing || detail.shFinishing === 0) + // detailError["shFinishing"] = i18n.__("SewingBlockingPlan.details.shFinishing.mustGreater:%s must greater than 0", i18n.__("SewingBlockingPlan.details.shFinishing._:Sh Finishing")); + if (!detail.quantity || detail.quantity === 0) + detailError["quantity"] = i18n.__("SewingBlockingPlan.details.quantity.mustGreater:%s must greater than 0", i18n.__("SewingBlockingPlan.details.quantity._:Quantity")); + + if ((detail.isConfirmed && !detail.masterPlanComodityId) || (detail.isConfirmed && detail.masterPlanComodityId === "")) + detailError["masterPlanComodity"] = i18n.__("SewingBlockingPlan.details.masterPlanComodity.isRequired:%s is required", i18n.__("SewingBlockingPlan.details.masterPlanComodity._:Master Plan Comodity")); + else if (detail.masterPlanComodityId) { + var id = ObjectId.isValid(detail.masterPlanComodityId) && typeof (detail.masterPlanComodityId) === 'object' ? detail.masterPlanComodityId.toString() : detail.masterPlanComodityId; + var comoditySelected = _comodities.find(select => select._id.toString() === id); + if (!comoditySelected) + detailError["masterPlanComodity"] = i18n.__("SewingBlockingPlan.details.masterPlanComodity.isNotExists:%s is not Exists", i18n.__("SewingBlockingPlan.details.masterPlanComodity._:Master Plan Comodity")); + } + + + if (!detail.deliveryDate || detail.deliveryDate === '') + detailError["deliveryDate"] = i18n.__("SewingBlockingPlan.details.deliveryDate.isRequired:%s is required", i18n.__("SewingBlockingPlan.details.deliveryDate._:DeliveryDate")); + else { + if (_bookingOrder) { + _bookingOrder.bookingDate = new Date(_bookingOrder.bookingDate); + detail.deliveryDate = new Date(detail.deliveryDate); + if (detail.deliveryDate < _bookingOrder.bookingDate) { + detailError["deliveryDate"] = i18n.__("SewingBlockingPlan.details.deliveryDate.shouldNot:%s should not be less than booking order date", i18n.__("SewingBlockingPlan.details.deliveryDate._:DeliveryDate")); + } + if (detail.deliveryDate > _bookingOrder.deliveryDate) { + detailError["deliveryDate"] = i18n.__("SewingBlockingPlan.details.deliveryDates.shouldNot:%s should not be more than booking order delivery date", i18n.__("SewingBlockingPlan.details.deliveryDate._:DeliveryDate")); + } + } + } + if (!detail.unitId || detail.unitId === "") + detailError["unit"] = i18n.__("SewingBlockingPlan.details.unit.isRequired:%s is required", i18n.__("SewingBlockingPlan.details.unit._:Unit")); + else if (!_units || _units.length === 0) + detailError["unit"] = i18n.__("SewingBlockingPlan.details.unit.isNotExists:%s is not Exists", i18n.__("SewingBlockingPlan.details.unit._:Unit")); + else { + var id = ObjectId.isValid(detail.unitId) && typeof (detail.unitId) === 'object' ? detail.unitId.toString() : detail.unitId; + var unitSelected = _units.find(select => select._id.toString() === id); + if (!unitSelected) + detailError["unit"] = i18n.__("SewingBlockingPlan.details.unit.isNotExists:%s is not Exists", i18n.__("SewingBlockingPlan.details.unit._:Unit")); + } + + if (!detail.masterPlanComodityId || detail.masterPlanComodityId === "") + detailError["masterPlanComodity"] = i18n.__("SewingBlockingPlan.details.masterPlanComodity.isRequired:%s is required", i18n.__("SewingBlockingPlan.details.masterPlanComodity._:MasterPlanComodity")); + + if (!detail.efficiency || detail.efficiency <= 0) + detailError["efficiency"] = i18n.__("SewingBlockingPlan.details.efficiency.isRequired:%s is required", i18n.__("SewingBlockingPlan.details.efficiency._:Efficiency")); + + if (!detail.weeklyPlanYear || detail.weeklyPlanYear === "" || detail.weeklyPlanYear === 0 || !detail.weeklyPlanId || detail.weeklyPlanId === "") + detailError["weeklyPlanYear"] = i18n.__("SewingBlockingPlan.details.weeklyPlanYear.isRequired:%s is required", i18n.__("SewingBlockingPlan.details.weeklyPlanYear._:Weekly Plan Year")); + else if (!_weeklyPlan || _weeklyPlan.length === 0) + detailError["weeklyPlanYear"] = i18n.__("SewingBlockingPlan.details.weeklyPlanYear.isNotExists:%s is not Exists", i18n.__("SewingBlockingPlan.details.weeklyPlanYear._:Weekly Plan Year")); + else { + var id = ObjectId.isValid(detail.weeklyPlanId) && typeof (detail.weeklyPlanId) === 'object' ? detail.weeklyPlanId.toString() : detail.weeklyPlanId; + var weeklyPlan = _weeklyPlan.find(select => select._id.toString() === id); + if (!weeklyPlan) + detailError["weeklyPlanYear"] = i18n.__("SewingBlockingPlan.details.weeklyPlanYear.isNotExists:%s is not Exists", i18n.__("SewingBlockingPlan.details.weeklyPlanYear._:Weekly Plan Year")); + else { + if (!detail.week) + detailError["week"] = i18n.__("SewingBlockingPlan.details.week.isRequired:%s is required", i18n.__("SewingBlockingPlan.details.week._:Week")); + else { + var weekDay = weeklyPlan.items.find(select => select.weekNumber === detail.week.weekNumber && select.month === detail.week.month && select.efficiency === detail.week.efficiency && select.operator === detail.week.operator); + if (!weekDay) + detailError["week"] = i18n.__("SewingBlockingPlan.details.week.isNotExists:%s is not Exists", i18n.__("SewingBlockingPlan.details.week._:Week")); + } + } + } + detailErrors.push(detailError); + } + for (var error of detailErrors) { + if (Object.getOwnPropertyNames(error).length > 0) { + errors["details"] = detailErrors; + break; + } + } + // if(totalDetail > valid.quantity) + // errors["detail"] = `Quantity can not be more than ${valid.quantity}`; + } + + if (Object.getOwnPropertyNames(errors).length > 0) { + var ValidationError = require("module-toolkit").ValidationError; + return Promise.reject(new ValidationError("data does not pass validation", errors)); + } + + if (_bookingOrder) { + valid.bookingOrderId = _bookingOrder._id; + valid.bookingOrderNo = _bookingOrder.code; + valid.bookingDate = _bookingOrder.bookingDate; + valid.deliveryDate = _bookingOrder.deliveryDate; + valid.quantity = _bookingOrder.orderQuantity; + valid.remark = _bookingOrder.remark; + valid.bookingItems = _bookingOrder.items; + } + var details = []; + var index = 0; + for (var detail of valid.details) { + detail.code = !detail.code ? generateCode() + index.toString() : detail.code; + var unitId = ObjectId.isValid(detail.unitId) && typeof (detail.unitId) === 'object' ? detail.unitId.toString() : detail.unitId; + var unitSelected = _units.find(select => select._id.toString() === unitId); + if (unitSelected) { + detail.unitId = unitSelected._id; + detail.unit = unitSelected; + } + var weeklyPlanId = ObjectId.isValid(detail.weeklyPlanId) && typeof (detail.weeklyPlanId) === 'object' ? detail.weeklyPlanId.toString() : detail.weeklyPlanId; + var weeklyPlan = _weeklyPlan.find(select => select._id.toString() === weeklyPlanId); + if (weeklyPlan) { + detail.weeklyPlanId = weeklyPlan._id; + detail.weeklyPlanYear = weeklyPlan.year; + var weekDay = weeklyPlan.items.find(select => select.weekNumber === detail.week.weekNumber && select.month === detail.week.month && select.efficiency === detail.week.efficiency && select.operator === detail.week.operator); + if (weekDay) { + detail.week = weekDay; + // detail.week.remainingEH-=detail.ehBooking; + // detail.week.usedAH+=detail.ehBooking; + } + } + if (detail.masterPlanComodityId) { + var masterPlanComodityId = ObjectId.isValid(detail.masterPlanComodityId) && typeof (detail.masterPlanComodityId) === 'object' ? detail.masterPlanComodityId.toString() : detail.masterPlanComodityId; + var masterPlanComodity = _comodities.find(select => select._id.toString() === masterPlanComodityId); + if (masterPlanComodity) { + detail.masterPlanComodityId = masterPlanComodity._id; + detail.masterPlanComodity = masterPlanComodity; + } + } else { + detail.masterPlanComodityId = null; + detail.masterPlanComodity = null; + } + detail.deliveryDate = new Date(detail.deliveryDate); + if (!detail.stamp) { + detail = new SewingBlockingPlanDetail(detail); + } + detail._createdDate = valid._createdDate; + detail.stamp(this.user.username, "manager"); + details.push(detail); + index++; + } + valid.details = details; + if (_buyer) { + valid.garmentBuyerId = _buyer._id; + valid.garmentBuyerName = _buyer.name; + valid.garmentBuyerCode = _buyer.code; + } + + if (!valid.hasOwnProperty('status')) + valid["status"] = "Booking"; + if (!valid.stamp) { + valid = new SewingBlockingPlan(valid); + } + + valid.stamp(this.user.username, "manager"); + return Promise.resolve(valid); + }); + } + + // _afterInsert(id) { + // return new Promise((resolve, reject) => { + // this.getSingleById(id) + // .then(data => { + // this.bookingOrderManager.getSingleById(data.bookingOrderId) + // .then(booking =>{ + // booking.isMasterPlan = true; + // this.bookingOrderManager.collection.update(booking) + // .then(idBooking=>{ + // resolve(id); + // }) + // .catch(e => { + // reject(e); + // }); + // }) + // .catch(e => { + // reject(e); + // }); + // }) + // .catch(e => { + // reject(e); + // }); + // }); + // } + + _beforeUpdate(data) { + return this.getSingleById(data._id) + .then(masterPlan => { + var weeks = []; + var flags = [], output = [], l = masterPlan.details.length; + for (var i = 0; i < l; i++) { + if (flags[masterPlan.details[i].weeklyPlanId.toString()]) continue; + flags[masterPlan.details[i].weeklyPlanId.toString()] = true; + output.push(this.weeklyPlanManager.getSingleById(masterPlan.details[i].weeklyPlanId)); + } + return Promise.all(output) + .then(weeklyPlans => { + var updateWeek = []; + // for(var mp of masterPlan.details){ + // //for(var w of weeklyPlans){ + // //if(w.unit.code===mp.unit.code && w.year==mp.weeklyPlanYear){ + // mp.week.remainingEH+=mp.ehBooking; + // mp.week.usedEH-=mp.ehBooking; + // // w.items[mp.week.weekNumber-1]= mp.week; + // // break; + // // } + // //} + // updateWeek.push(this.weeklyPlanManager.collection.update(w)); + // for(var detail of data.details){ + // if(mp.masterPlanComodityId.toString()===detail.masterPlanComodityId.toString() && mp.unitId.toString() === detail.unitId.toString() && mp.weeklyPlanYear===detail.weeklyPlanYear){ + // if(detail.week){ + // if(detail.week.weekNumber===mp.week.weekNumber){ + // detail.week=mp.week; + // } + // } + // } + // } + // } + for (var w of weeklyPlans) { + for (var mp of masterPlan.details) { + if (w.unit.code === mp.unit.code && w.year == mp.weeklyPlanYear) { + w.items[mp.week.weekNumber - 1].usedEH -= mp.ehBooking; + w.items[mp.week.weekNumber - 1].remainingEH += mp.ehBooking; + } + } + updateWeek.push(this.weeklyPlanManager.collection.update(w)); + } + for (var mp of masterPlan.details) { + mp.week.remainingEH += mp.ehBooking; + mp.week.usedEH -= mp.ehBooking; + } + + return Promise.all(updateWeek) + .then(result => { + return this.collection.update(masterPlan); + }) + .then(() => { + return Promise.resolve(data); + }) + }) + }) + + } + + _afterUpdate(id) { + return this.getSingleById(id) + .then(masterPlan => { + var weeks = []; + masterPlan.status = "Booking"; + var flags = [], output = [], l = masterPlan.details.length; + for (var i = 0; i < l; i++) { + if (flags[masterPlan.details[i].weeklyPlanId.toString()]) continue; + flags[masterPlan.details[i].weeklyPlanId.toString()] = true; + output.push(this.weeklyPlanManager.getSingleById(masterPlan.details[i].weeklyPlanId)); + } + // for(var detail of masterPlan.details){ + // weeks.push(this.weeklyPlanManager.getSingleById(detail.weeklyPlanId)); + // } + return Promise.all(output) + .then(weeklyPlans => { + var updateWeek = []; + // for(var mp of masterPlan.details){ + // for(var w of weeklyPlans){ + // if(w.unit.code===mp.unit.code && w.year==mp.weeklyPlanYear){ + // mp.week.remainingEH-=mp.ehBooking; + // mp.week.usedEH+=mp.ehBooking; + // w.items[mp.week.weekNumber-1]= mp.week; + // break; + // } + // } + // updateWeek.push(this.weeklyPlanManager.collection.update(w)); + // } + for (var w of weeklyPlans) { + for (var mp of masterPlan.details) { + if (w.unit.code === mp.unit.code && w.year == mp.weeklyPlanYear) { + w.items[mp.week.weekNumber - 1].usedEH += mp.ehBooking; + w.items[mp.week.weekNumber - 1].remainingEH -= mp.ehBooking; + } + } + updateWeek.push(this.weeklyPlanManager.collection.update(w)); + } + for (var mp of masterPlan.details) { + mp.week.remainingEH -= mp.ehBooking; + mp.week.usedEH += mp.ehBooking; + } + return Promise.all(updateWeek) + .then(result => { + return this.collection.update(masterPlan); + }); + }) + + }).then(() => + Promise.resolve(id)); + } + + _afterInsert(id) { + var tasks = []; + var masterPlanId = id; + return this.getSingleById(id) + .then((masterPlan) => { + var weeks = []; + var flags = [], output = [], l = masterPlan.details.length; + for (var i = 0; i < l; i++) { + if (flags[masterPlan.details[i].weeklyPlanId.toString()]) continue; + flags[masterPlan.details[i].weeklyPlanId.toString()] = true; + output.push(this.weeklyPlanManager.getSingleById(masterPlan.details[i].weeklyPlanId)); + } + return this.bookingOrderManager.getSingleById(masterPlan.bookingOrderId) + .then(booking => { + booking.isMasterPlan = true; + return this.bookingOrderManager.collection.update(booking) + .then(idBooking => { + return Promise.all(output) + .then(weeklyPlans => { + var updateWeek = []; + for (var w of weeklyPlans) { + for (var mp of masterPlan.details) { + if (w.unit.code === mp.unit.code && w.year == mp.weeklyPlanYear) { + w.items[mp.week.weekNumber - 1].usedEH += mp.ehBooking; + w.items[mp.week.weekNumber - 1].remainingEH -= mp.ehBooking; + } + + //if(w.unit.code===mp.unit.code && w.year==mp.weeklyPlanYear){ + // mp.week.remainingEH-=mp.ehBooking; + // mp.week.usedEH+=mp.ehBooking; + // w.items[mp.week.weekNumber-1]= mp.week; + // break; + // } + } + + updateWeek.push(this.weeklyPlanManager.collection.update(w)); + } + for (var mp of masterPlan.details) { + mp.week.remainingEH -= mp.ehBooking; + mp.week.usedEH += mp.ehBooking; + } + return Promise.all(updateWeek) + .then(result => { + return this.collection.update(masterPlan); + }); + }) + }) + }) + + }) + .then(results => id); + } + + delete(data) { + var tasks = []; + var masterPlanId = data._id; + data._deleted = true; + var weeks = []; + // for(var detail of data.details){ + // weeks.push(this.weeklyPlanManager.getSingleById(detail.weeklyPlanId)); + // } + var flags = [], output = [], l = data.details.length; + for (var i = 0; i < l; i++) { + if (flags[data.details[i].weeklyPlanId.toString()]) continue; + flags[data.details[i].weeklyPlanId.toString()] = true; + output.push(this.weeklyPlanManager.getSingleById(data.details[i].weeklyPlanId)); + } + return this.bookingOrderManager.getSingleById(data.bookingOrderId) + .then(booking => { + booking.isMasterPlan = false; + return this.bookingOrderManager.collection.update(booking) + .then(idBooking => { + return Promise.all(output) + .then(weeklyPlans => { + var updateWeek = []; + for (var w of weeklyPlans) { + for (var mp of data.details) { + if (w.unit.code === mp.unit.code && w.year == mp.weeklyPlanYear) { + w.items[mp.week.weekNumber - 1].usedEH -= mp.ehBooking; + w.items[mp.week.weekNumber - 1].remainingEH += mp.ehBooking; + } + + // for(var w of weeklyPlans){ + // for(var mp of data.details){ + // if(w._id.toString()===mp.weeklyPlanId.toString()){ + // mp.week.remainingEH+=mp.ehBooking; + // mp.week.usedEH-=mp.ehBooking; + // w.items[mp.week.weekNumber-1]= mp.week; + // } + } + updateWeek.push(this.weeklyPlanManager.collection.update(w)); + } + + + return Promise.all(updateWeek).then(result => { + return this.collection.update(data); + }); + }) + }) + }) + .then(() => + Promise.resolve(masterPlanId)); + } + + + // getPreview(month, year){ + // return new Promise((resolve, reject) => { + // var deletedQuery = { + // _deleted: false + // }; + // var stringDate = month > 10 ? `${year}-${month - 1}-01` : `${year}-0${month - 1}-01`; + // var thisDate = new Date(stringDate); + // var nextDate = new Date(thisDate.setMonth(thisDate.getMonth() + 6)); + // var nextMonth = nextDate.getMonth(); + // var nextYear = nextDate.getFullYear(); + // var dateQuery = { + // "$and" : [ + // {"details.week.month" : {"$gte" : (month - 1)}}, + // {"details.weeklyPlanYear" : {"$gte" : year}}, + // {"details.week.month" : {"$lte" : nextMonth}}, + // {"details.weeklyPlanYear" : {"$lte" : nextYear}} + // ] + // }; + // this.collection + // .aggregate([ + // { "$unwind": "$details" }, + // { "$match": dateQuery }, + // { + // "$project": { + // "month": "$details.week.month", + // "week": "$details.week.weekNumber", + // "year": "$details.weeklyPlanYear", + // "unitCode": "$details.unit.code", + // "sh":"$details.shSewing" + // } + // }, + // { + // "$group": { + // "_id": { "month": "$month", "week": "$week", "year": "$year", "unitCode": "$unitCode" }, + // "sh": { "$sum": "$sh" } + // } + // } + + // ]) + // .toArray() + // .then(results => { + // resolve(results); + // }) + // .catch(e => { + // reject(e); + // }); + // }); + // } + + _createIndexes() { + var dateIndex = { + name: `ix_${map.garmentMasterPlan.collection.SewingBlockingPlan}__updatedDate`, + key: { + _updatedDate: -1 + } + }; + + var codeIndex = { + name: `ix_${map.garmentMasterPlan.collection.SewingBlockingPlan}_code`, + key: { + "code": 1 + } + }; + + return this.collection.createIndexes([dateIndex, codeIndex]); + } + + getReport(query) { + return new Promise((resolve, reject) => { + + var deletedQuery = { deleted: false }; + + var unitQuery = {}; + if (query.unit != "") { + unitQuery = { + "unit": query.unit + }; + } + + var yearQuery = {}; + if (query.year) { + yearQuery = { + "year": parseInt(query.year) + }; + } + + var weeklyPlans = map.garmentMasterPlan.collection.WeeklyPlan; + var bookingOrders = map.garmentMasterPlan.collection.BookingOrder; + + var Query = { "$and": [yearQuery, deletedQuery, unitQuery] }; + + this.collection + .aggregate([ + { "$unwind": "$details" }, + { "$lookup": { from: weeklyPlans, localField: "details.weeklyPlanId", foreignField: "_id", as: "weeklyPlans" } }, + { "$unwind": { path: "$weeklyPlans", preserveNullAndEmptyArrays: true } }, + { "$lookup": { from: bookingOrders, localField: "bookingOrderId", foreignField: "_id", as: "bookingOrders" } }, + { "$unwind": { path: "$bookingOrders", preserveNullAndEmptyArrays: true } }, + // { "$match": Query}, + { + "$project": { + "buyer": { $concat: ["$garmentBuyerName", "-", "$details.masterPlanComodity.name"] }, + "year": "$weeklyPlans.year", + "weekSewingBlocking": "$details.week.weekNumber", + "unit": "$weeklyPlans.unit.code", + "SMVSewing": "$details.shSewing", + "weekNumber": "$weeklyPlans.items.weekNumber", + "weekEndDate": "$weeklyPlans.items.endDate", + "bookigQty": "$details.quantity", + "isConfirmed": "$details.isConfirmed", + "efficiency": "$weeklyPlans.items.efficiency", + "workingHoours": "$weeklyPlans.items.workingHours", + "AHTotal": "$weeklyPlans.items.ahTotal", + "EHTotal": "$weeklyPlans.items.ehTotal", + "usedTotal": "$weeklyPlans.items.usedEH", + "remainingEH": "$weeklyPlans.items.remainingEH", + "operator": "$weeklyPlans.items.operator", + "bookingOrderItems": "$bookingOrders.items", + "bookingOrdersQuantity": "$bookingOrders.orderQuantity", + "deleted": "$_deleted" + } + }, + { "$match": Query }, + + { + "$group": { + _id: { + "buyer": "$buyer", + "year": "$year", + "weekSewingBlocking": "$weekSewingBlocking", + "unit": "$unit", + "operator": "$operator", + "SMVSewing": "$SMVSewing", + "isConfirmed": "$isConfirmed", + "weekNumber": "$weekNumber", + "weekEndDate": "$weekEndDate", + "bookingQty": "$bookigQty", + "efficiency": "$efficiency", + "workingHoours": "$workingHoours", + "AHTotal": "$AHTotal", + "EHTotal": "$EHTotal", + "usedTotal": "$usedTotal", + "bookingOrderItems": "$bookingOrderItems", + "bookingOrdersQuantity": "$bookingOrdersQuantity", + "remainingEH": "$remainingEH" + }, + "BookingQTyTot": { "$sum": "$bookigQty" }, + "SMVTot": { "$sum": "$SMVSewing" }, + + count: { $sum: 1 } + + } + }, + + { + "$sort": { + "_id.unit": 1, + "_id.buyer": 1 + } + } + ]) + .toArray() + .then(results => { + resolve(results); + }) + .catch(e => { + reject(e); + }); + }); + } + + getXls(dataReport, query) { + return new Promise((resolve, reject) => { + var xls = {}; + xls.data = []; + this.data = []; + this.dataTemp = []; + xls.options = []; + xls.name = ''; + + var dateFormat = "DD/MM/YYYY"; + this.dataTemp = []; + this.data = []; + this.weeklyNumbers = 0; + this.WeekQuantity = []; + for (var pr of dataReport.data) { + this.weeklyNumbers = pr._id.weekNumber; + break; + } + + + for (var pr of dataReport.data) { + var dataTemp = {}; + dataTemp.backgroundColor = []; + dataTemp.quantity = []; + dataTemp.efficiency = []; + dataTemp.unitBuyerQuantity = []; + //dataTemp.isConfirmed=[]; + dataTemp.units = pr._id.unit; + dataTemp.buyer = pr._id.buyer; + dataTemp.unitBuyer = pr._id.unit + ';' + pr._id.buyer; + dataTemp.SMVTotal = pr.SMVTot; + dataTemp.dataCount = pr.count; + dataTemp.operator = pr._id.operator; + dataTemp.workingHours = pr._id.workingHoours; + dataTemp.AH = pr._id.AHTotal; + dataTemp.EH = pr._id.EHTotal; + dataTemp.usedEH = pr._id.usedTotal; + dataTemp.remainingEH = pr._id.remainingEH; + dataTemp.dataCount = pr.count; + + for (var j = 0; j < pr._id.efficiency.length; j++) { + dataTemp.efficiency[j] = pr._id.efficiency[j].toString() + '%'; + dataTemp.backgroundColor[j] = dataTemp.remainingEH[j] > 0 ? "#FFFF00" : + dataTemp.remainingEH[j] < 0 ? "#f62c2c" : + "#52df46"; + } + dataTemp.weekSewingBlocking = pr._id.weekSewingBlocking; + dataTemp.SMVSewings = pr.SMVTot / pr.count; + dataTemp.SMVSewingWeek = pr._id.weekSewingBlocking; + dataTemp.bookingQty = pr._id.bookingQty; + dataTemp.isConfirmed = pr._id.isConfirmed ? 1 : 0; + for (var i = 0; i < this.weeklyNumbers.length; i++) { + if (i + 1 === pr._id.weekSewingBlocking) { + dataTemp.quantity[i] = pr._id.bookingQty; + + } + else { + dataTemp.quantity[i] = 0; + } + + } + dataTemp.bookingOrderItemsLength = pr._id.bookingOrderItems.length; + dataTemp.bookingOrdersConfirmQuantity = pr._id.bookingOrderItems.reduce( + (acc, cur) => acc + cur.quantity, + 0 + ); + dataTemp.bookingOrdersQuantity = pr._id.bookingOrdersQuantity; + this.dataTemp.push(dataTemp); + } + // console.log((this.dataTemp)); + //units + var flags = [], output = [], l = this.dataTemp.length, i; + for (i = 0; i < l; i++) { + if (flags[this.dataTemp[i].units]) continue; + flags[this.dataTemp[i].units] = true; + output.push(this.dataTemp[i].units); + + } + + var flags = [], output2 = [], l = this.dataTemp.length, i; + for (i = 0; i < l; i++) { + if (flags[this.dataTemp[i].unitBuyer]) continue; + flags[this.dataTemp[i].unitBuyer] = true; + output2.push({ unit: this.dataTemp[i].units, buyer: this.dataTemp[i].buyer }); + + } + // console.log(output2); + // //total smvSewing + // var arr = this.dataTemp, + // totalSewing = arr.reduce(function (r, o) { + // (r[o.unitBuyer]) ? r[o.unitBuyer] += o.SMVSewings : r[o.unitBuyer] = o.SMVSewings; + // return r; + // }, {}); + // var totalSewing = Object.keys(totalSewing).map(function (key) { + // return { unitBuyer: key, SMVTotal: totalSewing[key] }; + // }); + + // //Total per Unit + // var arr = this.dataTemp, + // totalSMV = arr.reduce(function (r, o) { + // (r[o.units]) ? r[o.units] += o.SMVTotal : r[o.units] = o.SMVTotal; + // return r; + // }, {}); + // var groups = Object.keys(totalSMV).map(function (key) { + // return { units: key, SMVTotal: totalSMV[key] }; + // }); + + // console.log(groups); + let cat = []; + let category = []; + let len = []; + let bookingOrderItemsLength = []; + let bookingOrdersConfirmQuantity = []; + let bookingOrdersQuantity = []; + for (var c of this.dataTemp) { + var oye = {}; + if (!cat[c.units + c.buyer + c.weekSewingBlocking]) { + cat[c.units + c.buyer + c.weekSewingBlocking] = c.bookingQty; + } + else { + cat[c.units + c.buyer + c.weekSewingBlocking] += c.bookingQty; + } + + // if (!category[c.units + c.buyer + c.weekSewingBlocking]) { + // category[c.units + c.buyer + c.weekSewingBlocking] = c.isConfirmed; + // } + // else + // { + // category[c.units + c.buyer + c.weekSewingBlocking] += c.isConfirmed; + // } + // if (!len[c.units + c.buyer + c.weekSewingBlocking]) { + // len[c.units + c.buyer + c.weekSewingBlocking] = 1; + // } + // else + // { + // len[c.units + c.buyer + c.weekSewingBlocking] += 1; + // } + // console.log(c.units + c.buyer + c.weekSewingBlocking, category[c.units + c.buyer + c.weekSewingBlocking], len[c.units + c.buyer + c.weekSewingBlocking]); + + if (!bookingOrderItemsLength[c.units + c.buyer + c.weekSewingBlocking]) { + bookingOrderItemsLength[c.units + c.buyer + c.weekSewingBlocking] = c.bookingOrderItemsLength; + } + if (!bookingOrdersConfirmQuantity[c.units + c.buyer + c.weekSewingBlocking]) { + bookingOrdersConfirmQuantity[c.units + c.buyer + c.weekSewingBlocking] = c.bookingOrdersConfirmQuantity; + } + if (!bookingOrdersQuantity[c.units + c.buyer + c.weekSewingBlocking]) { + bookingOrdersQuantity[c.units + c.buyer + c.weekSewingBlocking] = c.bookingOrdersQuantity; + } + + if (!cat[c.units + "TOTAL" + c.weekSewingBlocking]) { + cat[c.units + "TOTAL" + c.weekSewingBlocking] = c.bookingQty; + } + else { + cat[c.units + "TOTAL" + c.weekSewingBlocking] += c.bookingQty; + } + if (!cat[c.units + "smv" + c.buyer]) { + cat[c.units + "smv" + c.buyer] = c.SMVSewings; + } + else { + cat[c.units + "smv" + c.buyer] += c.SMVSewings; + } + if (!cat[c.units + "count" + c.buyer]) { + cat[c.units + "count" + c.buyer] = c.dataCount; + } + else { + cat[c.units + "count" + c.buyer] += c.dataCount; + } + + if (!cat[c.units + "efisiensi"]) { + cat[c.units + "efisiensi"] = c.efficiency; + } + if (!cat[c.units + "operator"]) { + cat[c.units + "operator"] = c.operator; + } + if (!cat[c.units + "totalAH"]) { + cat[c.units + "totalAH"] = c.AH; + } + if (!cat[c.units + "totalEH"]) { + cat[c.units + "totalEH"] = c.EH; + } + if (!cat[c.units + "usedEH"]) { + cat[c.units + "usedEH"] = c.usedEH; + } + if (!cat[c.units + "workingHours"]) { + cat[c.units + "workingHours"] = c.workingHours; + } + if (!cat[c.units + "remainingEH"]) { + cat[c.units + "remainingEH"] = c.remainingEH; + } + if (!cat[c.units + "background"]) { + cat[c.units + "background"] = c.backgroundColor; + } + + } + + for (var j of output) { + var data = {}; + data.units = j; + data.collection = []; + this.sewing = []; + var un = this.dataTemp.filter(o => (o.units == j)); + + var smvTot = 0; + var counts = 0; + for (var i of output2) { + + if (j == i.unit) { + data.quantity = []; + var background = []; + for (var k = 0; k <= this.weeklyNumbers.length; k++) { + var categ = j + i.buyer + (k).toString(); + + if (k == 0) { + categ = (j + "smv" + i.buyer); + data.quantity[k] = (cat[j + "smv" + i.buyer] / cat[j + "count" + i.buyer]) ? Math.round((cat[j + "smv" + i.buyer] / cat[j + "count" + i.buyer])) : '-'; + smvTot += Math.round(cat[j + "smv" + i.buyer] / cat[j + "count" + i.buyer]); + counts += 1; + + } else { + data.quantity[k] = cat[categ] ? cat[categ] : '-'; + } + // if (category[categ] == 0) { + + // background[k] = "#eee860"; + // } + // else if(category[categ] == len[categ]) + // { + // background[k] = "#ffffff"; + + // }else + // { + // if (category[categ] != undefined) { + + // background[k] = "#F4A919"; + // } + // } + + if (bookingOrderItemsLength[categ] === 0) { + background[k] = "#EEE860"; + } else if (bookingOrderItemsLength[categ] > 0 && bookingOrdersConfirmQuantity[categ] < bookingOrdersQuantity[categ]) { + background[k] = "#F4A919"; + } else { + background[k] = "#FFFFFF"; + } + + } + data.collection.push({ name: i.buyer, quantity: data.quantity, units: j, background: background, fontWeight: "normal" }); + } + + } + var qty = []; + for (var y = 0; y < this.weeklyNumbers.length; y++) { + + var categ = j + "TOTAL" + (y + 1).toString(); + + qty[y + 1] = cat[categ] ? cat[categ] : '-'; + qty[0] = Math.round(smvTot / counts); + + } + data.collection.push({ name: "TOTAL", quantity: qty, fontWeight: "bold" }); + var eff = cat[j + "efisiensi"]; + var opp = cat[j + "operator"]; + var AH = cat[j + "totalAH"]; + var EH = cat[j + "totalEH"]; + var usedEH = cat[j + "usedEH"]; + var remainingEH = cat[j + "remainingEH"]; + var background = cat[j + "background"]; + var workingHours = cat[j + "workingHours"]; + eff.splice(0, 0, ""); + opp.splice(0, 0, ""); + AH.splice(0, 0, ""); + EH.splice(0, 0, ""); + usedEH.splice(0, 0, ""); + remainingEH.splice(0, 0, ""); + workingHours.splice(0, 0, ""); + background.splice(0, 0, ""); + data.collection.push({ name: "Efisiensi", quantity: eff, fontWeight: "bold" }); + data.collection.push({ name: "Total Operator Sewing", quantity: opp, fontWeight: "bold" }); + data.collection.push({ name: "Working Hours", quantity: workingHours, fontWeight: "bold" }); + data.collection.push({ name: "Total AH", quantity: AH, fontWeight: "bold" }); + data.collection.push({ name: "Total EH", quantity: EH, fontWeight: "bold" }); + data.collection.push({ name: "Used EH", quantity: usedEH, fontWeight: "bold" }); + data.collection.push({ name: "Remaining EH", quantity: remainingEH, background: background, fontWeight: "bold" }); + this.data.push(data); + } + + this.dataXL = []; + + for (var b of this.data) { + var dataXL = {}; + for (var data of b.collection) { + this.dataXL.push({ unit: b.units, buyer: data.name, quantity: data.quantity, background: data.background, fontWeight: data.fontWeight }); + } + + } + //style excel + var border = { + top: { style: 'thin', color: 'FF000000' }, + bottom: { style: 'thin', color: 'FF000000' }, + left: { style: 'thin', color: 'FF000000' }, + right: { style: 'thin', color: 'FF000000' }, + }; + + var fgColor = function (color) { + return { + fgColor: { + rgb: color + } + } + }; + + var styles = { + header: { + fill: fgColor('FFCCCCCC'), + border: border, + alignment: { + horizontal: 'center' + }, + font: { + bold: true + } + }, + cell: { + fill: fgColor('FFFFFFFF'), + border: border + }, + cellBold: { + fill: fgColor('FFFFFFFF'), + border: border, + font: { + bold: true + } + }, + cellUnit: { + fill: fgColor('FFFFFFFF'), + border: border, + alignment: { + // horizontal: 'center', + vertical: 'top' + }, + font: { + bold: true + } + }, + cellColor: (color) => { + return { + fill: { + fgColor: { + rgb: color + } + }, + border: border + } + }, + cellColorBold: (color) => { + return { + fill: { + fgColor: { + rgb: color + } + }, + border: border, + font: { + bold: true + } + } + }, + }; + + var mergeCountEnd = 1; + var mergeCountStart = 1; + var unittemp = ""; + xls.options.merges = []; + + for (var b of this.dataXL) { + var item = {}; + xls.options.specification = {}; + + item["background"] = b.background; + item["fontweight"] = b.fontWeight; + + item["UNIT"] = b.unit; + + if (unittemp != b.unit) { + unittemp = b.unit; + mergeCountStart = this.dataXL.indexOf(b) + 2; + mergeCountEnd = mergeCountStart; + + xls.options.merges.push( + { start: { row: mergeCountStart, column: 1 }, end: { row: mergeCountEnd, column: 1 } } + ); + + } else { + mergeCountEnd = this.dataXL.indexOf(b) + 2; + xls.options.merges[xls.options.merges.length - 1] = { start: { row: mergeCountStart, column: 1 }, end: { row: mergeCountEnd, column: 1 } }; + } + + + item["BUYER-KOMODITI"] = b.buyer; + xls.options.specification["UNIT"] = { + displayName: "UNIT", + width: 50, + headerStyle: styles.header, + cellStyle: styles.cellUnit + }; + xls.options.specification["BUYER-KOMODITI"] = { + displayName: "BUYER-KOMODITI", + width: 300, + headerStyle: styles.header, + cellStyle: function (value, row) { + return value === "TOTAL" ? styles.cellBold : + row["SMV Sewing"] === "" ? styles.cellBold : + styles.cell; + } + }; + + for (var d = 0; d <= this.weeklyNumbers.length; d++) { + if (d === 0) { + item["SMV Sewing"] = b.quantity[d]; + xls.options.specification["SMV Sewing"] = { + displayName: "SMV Sewing", + width: 75, + headerStyle: styles.header, + cellStyle: function (value, row) { + return row["BUYER-KOMODITI"] === "TOTAL" ? styles.cellBold : styles.cell; + } + }; + } else { + var weekNo = "W" + (d).toString(); + item[weekNo] = { value: b.quantity[d], weeknumber: d }; + + xls.options.specification[weekNo] = { + displayName: weekNo, + width: 70, + headerStyle: styles.header, + cellFormat: function (value) { + return value.value; + }, + cellStyle: function (value, row) { + if (row["BUYER-KOMODITI"] === "Remaining EH") { + return (value.value > 0) ? styles.cellColorBold('FFFFFF00') : + (value.value < 0) ? styles.cellColorBold('FFFF0000') : + styles.cellColorBold('FF00FF00'); + + } if (row.background) { + return styles.cellColor("FF" + row.background[value.weeknumber].substring(1)); + } else { + return styles.cellBold; + } + } + }; + + } + } + xls.data.push(item); + } + // console.log( xls.options.merges); + + xls.name = `Master Plan Report.xlsx`; + resolve(xls); + }); + } + + getAcceptedOrderMonitoring(query){ + return new Promise((resolve, reject) => { + var deletedQuery = { _deleted: false }; + var yearQuery = {}; + if (query.year) { + yearQuery = { + "details.weeklyPlanYear": parseInt(query.year) + }; + } + var unitQuery = {}; + if (query.unit !='') { + unitQuery = { + "details.unit.code": query.unit + }; + } + + var Query = { "$and": [ deletedQuery, yearQuery, unitQuery] }; + this.collection + .aggregate([ + { "$unwind": "$details" }, + { "$match": Query }, + { "$lookup":{from :'weekly-plans',localField:'details.weeklyPlanId',foreignField:'_id',as:'weeklyPlans'}}, + { "$unwind": {path:"$weeklyPlans", preserveNullAndEmptyArrays: true} }, + { "$project": { + 'unitcode':'$details.unit.code', + 'week':'$details.week.weekNumber', + 'qty':'$details.quantity', + 'unit' :'$weeklyPlans.unit', + 'items':'$weeklyPlans.items', + } + }, + {"$group": { + '_id':{'week':'$week','unitcode':'$unitcode','unit':'$unit','items':'$items'}, + 'qty':{'$sum':'$qty'}, + } + }, + { + "$sort": { + + "_id.unitcode": 1, + "_id.week":1, + } + } + ]) + .toArray() + .then(results => { + resolve(results); + }) + .catch(e => { + reject(e); + }); + }); + } + + getAcceptedOrderMonitoringXls(dataReport, query) { + return new Promise((resolve, reject) => { + var xls = {}; + xls.data = []; + xls.options = []; + xls.name = ''; + + var yr=parseInt(query.year); + var units = []; + var total = []; + var qty = []; + var weeks = []; + + var deletedQuery = { _deleted: false }; + var yearQuery = {}; + if (query.year) { + yearQuery = { + "year": parseInt(query.year) + }; + } + var unitQuery = {}; + if (query.unit !='') { + unitQuery = { + "unit.code": query.unit + }; + } + + var Query = { "$and": [ deletedQuery, yearQuery, unitQuery] }; + var getUnit= this.db.use(map.garmentMasterPlan.collection.WeeklyPlan) + .aggregate([ + { "$match": Query }, + { "$project": { + 'unit' :'$unit.code', + } + }, + {"$group": { + '_id':{'unit':'$unit',}, + } + }, + { + "$sort": { + "_id.unit": 1, + } + } + ]) + .toArray() + .then(results=>{ + if(dataReport.data.length!=0){ + for(var x=0; x < dataReport.data.length; x++){ + var length_week= dataReport.data[x]._id.items.length; + break; + } + if(query.unit==''){ + for(var x=0; x < results.length; x++){ + if(units.length<=0){ + units.push(results[x]._id.unit); + } + var u=units.find(i=> i==results[x]._id.unit); + if(!u){ + units.push(results[x]._id.unit); + } + } + } + else if(query.unit!=''){ + units.push(query.unit); + } + + var totalqty=[]; + for(var code of units){ + for(var x=0; x < dataReport.data.length; x++){ + if(dataReport.data[x]._id.unitcode==code){ + if(!totalqty[code]){ + totalqty[code]=dataReport.data[x].qty; + } else { + totalqty[code]+=dataReport.data[x].qty; + } + } + } + if(!totalqty[code]){ + totalqty[code]='-'; + } + } + total = Object.keys(totalqty).map(function(key) { + return totalqty[key]; + }); + + for(var x=0;xo._id.unitcode==y && o._id.week == (x+1)); + if(grup){ + unit={ + code:y, + week:x+1, + quantity:grup.qty, + } + } else { + unit={ + code:y, + week:x+1, + quantity:'-' + } + } + + obj.push(unit); + + } + qty.push(obj); + } + + x=0; + for (var week of weeks) { + var item = {}; + item["Unit"] = week.weeknumber; + y=0; + for (unit of units) { + item[unit] = qty[x][y].quantity; + y++; + } + xls.data.push(item); + x++; + } + var i =0; + var item_total = {}; + for(var unit of units){ + item_total[unit] = total[i]; + i++; + } + item_total["Unit"] = 'TOTAL'; + xls.data.push(item_total); + + xls.options["Unit"] = "string"; + for (unit of units) { + xls.options[unit] = "string"; + } + } + xls.name = `Monitoring Order Diterima dan Booking Report ` + (query.unit ? `${query.unit}-` : ``) + `${query.year}.xlsx`; + resolve(xls); + + }); + }); + } +} \ No newline at end of file diff --git a/src/managers/sp-master-plan/standard-capacity-manager.js b/src/managers/sp-master-plan/standard-capacity-manager.js new file mode 100644 index 000000000..fb1cb4bad --- /dev/null +++ b/src/managers/sp-master-plan/standard-capacity-manager.js @@ -0,0 +1,207 @@ +"use strict" + +var ObjectId = require("mongodb").ObjectId; +require("mongodb-toolkit"); +var DLModels = require("dl-models"); +var map = DLModels.map; +var StandardCapacity = DLModels.spMasterPlan.StandardCapacity; +var BaseManager = require("module-toolkit").BaseManager; +var BuyerManager = require('../master/buyer-manager'); +var ComodityManager = require('./master-plan-comodity-manager'); +var i18n = require("dl-i18n"); +var moment = require('moment'); +var generateCode = require("../../utils/code-generator"); +var global = require("../../global"); + +module.exports = class StandardCapacityManager extends BaseManager { + constructor(db, user) { + super(db, user); + this.collection = this.db.use(map.spMasterPlan.collection.StandardCapacity); + this.buyerManager = new BuyerManager(db, user); + this.comodityManager = new ComodityManager(db, user); + } + + _beforeInsert(data) { + data.code = !data.code || data.code === '' ? generateCode() : data.code; + return Promise.resolve(data); + } + + _getQuery(paging) { + var _default = { + _deleted: false + }, + pagingFilter = paging.filter || {}, + keywordFilter = {}, + query = {}; + + if (paging.keyword) { + var regex = new RegExp(paging.keyword, "i"); + var codeFilter = { + "code": { + "$regex": regex + } + }; + var buyerFilter = { + "buyerName": { + "$regex": regex + } + }; + var comodityFilter = { + "masterplanComodityName": { + "$regex": regex + } + }; + keywordFilter["$or"] = [codeFilter, buyerFilter, comodityFilter]; + } + query["$and"] = [_default, keywordFilter, pagingFilter]; + return query; + } + + _validate(standardCapacity) { + var errors = {}; + var valid = standardCapacity; + var locale = global.config.locale; + moment.locale(locale.name); + // 1. begin: Declare promises. + var getStandarCapacity = this.collection.where({ + "_id": { + "$ne": new ObjectId(valid._id) + }, + "_deleted": false, + "buyerId": valid.buyerId && ObjectId.isValid(valid.buyerId) ? new ObjectId(valid.buyerId) : '', + "comodityId": valid.masterplanComodityId && ObjectId.isValid(valid.masterplanComodityId) ? new ObjectId(valid.masterplanComodityId) : '' + }).page(1, 2).order({"date" : -1}).execute(); + var getBuyer = valid.buyerId && ObjectId.isValid(valid.buyerId) ? this.buyerManager.getSingleByIdOrDefault(new ObjectId(valid.buyerId)) : Promise.resolve(null); + var getComodity = valid.masterplanComodityId && ObjectId.isValid(valid.masterplanComodityId) ? this.comodityManager.getSingleByIdOrDefault(new ObjectId(valid.masterplanComodityId)) : Promise.resolve(null); + // 2. begin: Validation. + return Promise.all([getStandarCapacity, getBuyer, getComodity]) + .then(results => { + var standardCapacityArr = results[0]; + var _buyer = results[1]; + var _comodities = results[2]; + + if(!valid.buyerId || valid.buyerId==='') + errors["buyer"] = i18n.__("StandardCapacity.buyerId.isRequired:%s is required", i18n.__("StandardCapacity.buyerId._:Buyer")); + + if(!valid.masterplanComodityId || valid.masterplanComodityId==='') + errors["comodity"] = i18n.__("StandardCapacity.comodityId.isRequired:%s is required", i18n.__("StandardCapacity.comodityId._:Comodity")); + + // if(!valid.shCutting || valid.shCutting <= 0) + // errors["shCutting"] = i18n.__("StandardCapacity.shCutting.mustBeGreater:%s must be greater than 0", i18n.__("StandardCapacity.SMVCutting._:SMVCutting")); + + // if(!valid.shSewing || valid.shSewing <= 0) + // errors["shSewing"] = i18n.__("StandardCapacity.shSewing.mustBeGreater:%s must be greater than 0", i18n.__("StandardCapacity.SMVSewing._:SMVSewing")); + + if(!valid.scSpinning || valid.scSpinning <= 0) + errors["scSpinning"] = i18n.__("StandardCapacity.scSpinning.mustBeGreater:%s must be greater than 0", i18n.__("StandardCapacity.SMVFinishing._:SMVFinishing")); + + if(!valid.date || valid.date === '') + errors["date"] = i18n.__("StandardCapacity.date.isRequired:%s is required", i18n.__("StandardCapacity.date._:Date")); + else{ + var date = new Date(valid.date); + var dateNow = new Date(); + // if(date > dateNow) + // errors["date"] = i18n.__(`StandardCapacity.date.notGreater:%s not greater than today`, i18n.__("StandardCapacity.date._:Date")); + // else if(standardCapacityArr && standardCapacityArr.data.length > 0){ + // var _standardCapacity = standardCapacityArr.data[0] + // if(date <= _standardCapacity.date){ + + // var dateCapacity = moment(new Date(_standardCapacity.date)).format("DD-MM-YYYY"); + // errors["date"] = `Date must be greater than ${dateCapacity}`; + // } + // } + } + + if (Object.getOwnPropertyNames(errors).length > 0) { + var ValidationError = require("module-toolkit").ValidationError; + return Promise.reject(new ValidationError("data does not pass validation", errors)); + } + + if(_buyer){ + valid.buyerId = new ObjectId(_buyer._id); + valid.buyerName = _buyer.name; + valid.buyerCode = _buyer.code; + } + if(_comodities){ + valid.masterplanComodityId = new ObjectId(_comodities._id); + valid.masterplanComodityName = _comodities.name; + valid.masterplanComodityCode = _comodities.code; + } + + valid.date = new Date(valid.date); + + if (!valid.stamp) { + valid = new StandardCapacity(valid); + } + + valid.stamp(this.user.username, "manager"); + return Promise.resolve(valid); + }); + } + + _createIndexes() { + var dateIndex = { + name: `ix_${map.production.finishingPrinting.collection.DailyOperation}__updatedDate`, + key: { + _updatedDate: -1 + } + }; + + var codeIndex = { + name: `ix_${map.production.finishingPrinting.collection.DailyOperation}_code`, + key: { + code: 1 + } + }; + + return this.collection.createIndexes([dateIndex, codeIndex]); + } + + // getStandardCapacityByStyle(styleCode){ + // return new Promise((resolve, reject) => { + // this.collection.aggregate( + // [ + // { $match: { "style.code":styleCode } }, + // { $sort: { date:-1, _updatedDate:-1 } }, + // { + // $group: + // { + // _id: "$style.code", + // firstSHSewing: { $first: "$shSewing" }, + // shId: { $first: "$_id" } + // //shId: "$_id" + // } + // } + // //{ $match: { _id:styleCode } } + // ] + // ) + // .toArray(function (err, result) { + // resolve(result); + // }); + // }); + // } + + getStandardCapacityByBuyerComodity(buyerCode, comodityCode){ + return new Promise((resolve, reject) => { + this.collection.aggregate( + [ + { $match: { "masterplanComodityCode":comodityCode , buyerCode:buyerCode} }, + { $sort: { date:-1, _updatedDate:-1 } }, + { + $group: + { + _id:{ "masterplanComodityCode":comodityCode , buyerCode:buyerCode}, + firstSHSewing: { $first: "$shSewing" }, + shId: { $first: "$_id" } + //shId: "$_id" + } + } + //{ $match: { _id:styleCode } } + ] + ) + .toArray(function (err, result) { + resolve(result); + }); + }); + } +} \ No newline at end of file diff --git a/src/managers/sp-master-plan/style-manager.js b/src/managers/sp-master-plan/style-manager.js new file mode 100644 index 000000000..0d83c2e30 --- /dev/null +++ b/src/managers/sp-master-plan/style-manager.js @@ -0,0 +1,105 @@ +"use strict" + +var ObjectId = require("mongodb").ObjectId; +require("mongodb-toolkit"); +var DLModels = require("dl-models"); +var map = DLModels.map; +var Style = DLModels.garmentMasterPlan.Style; +var BaseManager = require("module-toolkit").BaseManager; +var i18n = require("dl-i18n"); + +module.exports = class StyleManager extends BaseManager { + constructor(db, user) { + super(db, user); + this.collection = this.db.use(map.garmentMasterPlan.collection.Style); + } + + _getQuery(paging) { + var _default = { + _deleted: false + }, + pagingFilter = paging.filter || {}, + keywordFilter = {}, + query = {}; + + if (paging.keyword) { + var regex = new RegExp(paging.keyword, "i"); + var codeFilter = { + "code": { + "$regex": regex + } + }; + var nameFilter = { + "name": { + "$regex": regex + } + }; + var descriptionFilter = { + "name": { + "$regex": regex + } + }; + keywordFilter["$or"] = [codeFilter, nameFilter, descriptionFilter]; + } + query["$and"] = [_default, keywordFilter, pagingFilter]; + return query; + } + + _validate(style) { + var errors = {}; + var valid = style; + // 1. begin: Declare promises. + var getStyle = this.collection.singleOrDefault({ + _id: { + "$ne": new ObjectId(valid._id) + }, + code: valid.code, + _deleted: false + }); + + // 2. begin: Validation. + return Promise.all([getStyle]) + .then(results => { + var duplicateStyle = results[0]; + + if(!valid.code || valid.code === "") + errors["code"] = i18n.__("Style.code.isRequired:%s is required", i18n.__("Style.code._:Code")); + if (duplicateStyle) { + errors["code"] = i18n.__("Style.code.isExists:%s is already exists", i18n.__("Style.code._:Code")); + } + + if(!valid.name || valid.name === "") + errors["name"] = i18n.__("Style.name.isRequired:%s is required", i18n.__("Style.name._:Name")); + + if (Object.getOwnPropertyNames(errors).length > 0) { + var ValidationError = require("module-toolkit").ValidationError; + return Promise.reject(new ValidationError("data does not pass validation", errors)); + } + + if (!valid.stamp) { + valid = new Style(valid); + } + + valid.stamp(this.user.username, "manager"); + return Promise.resolve(valid); + }); + } + + _createIndexes() { + var dateIndex = { + name: `ix_${map.garmentMasterPlan.collection.Style}__updatedDate`, + key: { + _updatedDate: -1 + } + }; + + var codeIndex = { + name: `ix_${map.garmentMasterPlan.collection.Style}_code`, + key: { + "code": 1 + } + }; + + return this.collection.createIndexes([dateIndex, codeIndex]); + } +} \ No newline at end of file diff --git a/src/managers/sp-master-plan/weekly-plan-manager.js b/src/managers/sp-master-plan/weekly-plan-manager.js new file mode 100644 index 000000000..cf76bd437 --- /dev/null +++ b/src/managers/sp-master-plan/weekly-plan-manager.js @@ -0,0 +1,436 @@ +"use strict" + +var ObjectId = require("mongodb").ObjectId; +require("mongodb-toolkit"); +var DLModels = require("dl-models"); +var generateCode = require("../../utils/code-generator"); +var map = DLModels.map; +var WeeklyPlan = DLModels.garmentMasterPlan.WeeklyPlan; +var WeeklyPlanItem = DLModels.garmentMasterPlan.WeeklyPlanItem; +var BaseManager = require("module-toolkit").BaseManager; +var UnitManager = require("../master/unit-manager"); +var i18n = require("dl-i18n"); + +module.exports = class WeeklyPlanManager extends BaseManager { + constructor(db, user) { + super(db, user); + this.collection = this.db.use(map.garmentMasterPlan.collection.WeeklyPlan); + this.unitManager = new UnitManager(db, user); + } + + _getQuery(paging) { + var _default = { + _deleted: false + }, + pagingFilter = paging.filter || {}, + keywordFilter = {}, + query = {}; + + if (paging.keyword) { + var regex = new RegExp(paging.keyword, "i"); + var yearFilter = { + "$where" : "function() { return this.year.toString().match(/"+ paging.keyword +"/) != null; }" + }; + var unitFilter = { + "unit.name": { + "$regex": regex + } + }; + keywordFilter["$or"] = [yearFilter, unitFilter]; + } + query["$and"] = [_default, keywordFilter, pagingFilter]; + return query; + } + + _validate(weeklyPlan) { + var errors = {}; + var valid = weeklyPlan; + // 1. begin: Declare promises. + var getWeeklyPlanPromise = this.collection.singleOrDefault({ + _id: { + "$ne": new ObjectId(valid._id) + }, + year: valid.year, + unitId: valid.unitId && ObjectId.isValid(valid.unitId) ? new ObjectId(valid.unitId) : '', + _deleted: false + }); + var getUnit = valid.unitId && ObjectId.isValid(valid.unitId) ? this.unitManager.getSingleByIdOrDefault(new ObjectId(valid.unitId)) : Promise.resolve(null); + // 2. begin: Validation. + return Promise.all([getWeeklyPlanPromise, getUnit]) + .then(results => { + var duplicateWeeklyPlan = results[0]; + var _unit = results[1]; + + if (duplicateWeeklyPlan) { + errors["year"] = i18n.__("WeeklyPlan.year.isExists:%s is already exists in selected unit", i18n.__("WeeklyPlan.year._:Weekly Plan")); + } + var current_year = (new Date()).getFullYear() + 10; + var last_year = (new Date()).getFullYear() - 10; + if (!valid.year) { + errors["year"] = i18n.__("WeeklyPlan.year.isRequired:%s is required", i18n.__("WeeklyPlan.year._:Year")); + } + else if (isNaN(valid.year)) { + errors["year"] = i18n.__("WeeklyPlan.year.mustNumber:%s must number", i18n.__("WeeklyPlan.year._:Year")); + } + else if ((valid.year < last_year) || (valid.year > current_year)) { + errors["year"] = i18n.__("WeeklyPlan.year.outOfRage:%s is out of range year", i18n.__("WeeklyPlan.year._:Year")); + } + + if(!valid.unitId || valid.unitId === '') + errors["unit"] = i18n.__("WeeklyPlan.unit.isRequired:%s is required", i18n.__("WeeklyPlan.unit._:Unit")); + else if(!_unit) + errors["unit"] = i18n.__("WeeklyPlan.unit.notFound:%s not found", i18n.__("WeeklyPlan.unit._:Unit")); + + if (valid.items && valid.items.length > 0) { + var itemErrors = []; + for (var item of valid.items) { + var itemError = {}; + item.startDate = new Date(item.startDate); + item.endDate = new Date(item.endDate); + if (!item.month && item.month > 11 && item.month < 0) { + itemError["month"] = i18n.__("WeeklyPlan.items.month.isRequired:%s is required", i18n.__("WeeklyPlan.items.month._:Month")); + } else if (item.startDate.getMonth() != item.month && item.endDate.getMonth() != item.month) { + itemError["month"] = i18n.__("WeeklyPlan.items.month.isOutOfRange:%s is out of range", i18n.__("WeeklyPlan.items.month._:Month")); + } + // if(!item.efficiency || item.efficiency <= 0) + // itemError["efficiency"] = i18n.__("WeeklyPlan.items.efficiency.mustBeGreaterThan:%s must be greather than 0", i18n.__("WeeklyPlan.items.efficiency._:Efficiency")); + // if(!item.operator || item.operator <= 0) + // itemError["operator"] = i18n.__("WeeklyPlan.items.operator.mustBeGreaterThan:%s must be greather than 0", i18n.__("WeeklyPlan.items.operator._:Operator")); + // if(!item.workingHours || item.workingHours <= 0) + // itemError["workingHours"] = i18n.__("WeeklyPlan.items.workingHours.mustBeGreaterThan:%s must be greather than 0", i18n.__("WeeklyPlan.items.workingHours._:WorkingHours")); + itemErrors.push(itemError); + } + + for (var itemError of itemErrors) { + if (Object.getOwnPropertyNames(itemError).length > 0) { + errors.items = itemErrors; + break; + } + } + + } + else { + errors["items"] = i18n.__("WeeklyPlan.items.isRequired:%s is required", i18n.__("WeeklyPlan.items._:Item")); + } + + if (Object.getOwnPropertyNames(errors).length > 0) { + var ValidationError = require("module-toolkit").ValidationError; + return Promise.reject(new ValidationError("data does not pass validation", errors)); + } + if(_unit){ + valid.unitId = _unit._id; + valid.unit = _unit; + } + var items = []; + for(var item of valid.items){ + if (!item.stamp) { + item = new WeeklyPlanItem(item); + } + item.stamp(this.user.username, "manager"); + items.push(item); + } + valid.items = items; + if (!valid.stamp) { + valid = new WeeklyPlan(valid); + } + + valid.stamp(this.user.username, "manager"); + return Promise.resolve(valid); + }); + } + + _createIndexes() { + var dateIndex = { + name: `ix_${map.garmentMasterPlan.collection.WeeklyPlan}__updatedDate`, + key: { + _updatedDate: -1 + } + }; + + var uearIndex = { + name: `ix_${map.garmentMasterPlan.collection.WeeklyPlan}_year_unitId`, + key: { + "year": 1, + "unitId": 1, + } + }; + + return this.collection.createIndexes([dateIndex]); + } + + getWeek(keyword, filter){ + return new Promise((resolve, reject) => { + var query={}; + if(filter.weekNumber){ + query={ + "year": filter.year, + "unit.code":filter.unit, + "items.weekNumber":filter.weekNumber, + _deleted:false + } + } + else{ + query={ + "year": filter.year, + "unit.code":filter.unit, + _deleted:false + } + } + + var regex = new RegExp(keyword, "i"); + var filterWeek = { + "week": { + "$regex": regex + } + }; + + this.collection.aggregate( + [ + { $unwind:"$items" }, + { $match: query }, + { $project: { + 'items': "$items", + 'week': {"$concat" : ["W",{ "$toLower" : "$items.weekNumber" }]}, + } }, + { $match: filterWeek }, + ] + ) + .toArray(function (err, result) { + resolve(result); + }); + }); + } + + getYear(keyword){ + return new Promise((resolve, reject) => { + var regex = new RegExp(keyword, "i"); + var query = { + stringifyYear : regex, + _deleted : false, + }; + this.collection.aggregate( + [ + { $project : { + stringifyYear : { "$toLower" : "$year" }, + year : 1, + _deleted : 1 + } }, + { $match : query}, + { $group : { + _id: "$year", + year: {$first : "$year"}, + } }, + ] + ) + .toArray(function (err, result) { + resolve(result); + }); + }); + } + + + getUnit(keyword, filter){ + return new Promise((resolve, reject) => { + var regex = new RegExp(keyword, "i"); + + var unitCodeFilter = { + "unit.code": { + "$regex": regex + } + }; + + var unitNameFilter = { + "unit.name": { + "$regex": regex + } + }; + + var keywordFilter = {}; + keywordFilter["$or"] = [unitCodeFilter, unitNameFilter]; + + var yearFilter = {}; + + if (filter) { + yearFilter = { year: filter.year }; + } + + var deletedFilter = { _deleted: false }; + + var query = {}; + query["$and"] = [keywordFilter, yearFilter, deletedFilter]; + + this.collection.distinct( + "unit", + query, + function (err, result) { + resolve(result); + } + ); + }); + } + + getMonitoringRemainingEH(query) { + return new Promise((resolve, reject) => { + var deletedQuery = { _deleted: false }; + var yearQuery = {}; + if (query.year) { + yearQuery = { + "year": Number(query.year) + }; + } + var unitQuery = {}; + if (query.unit) { + unitQuery = { + "unit.code": query.unit + }; + } + + var Query = { "$and": [ deletedQuery, yearQuery, unitQuery ] }; + this.collection + .aggregate( [ + { "$match": Query }, + { + "$sort": { + "unit.code": 1, + } + } + ]) + .toArray(function (err, result) { + resolve(result); + }); + }); + } + + getMonitoringRemainingEHXls(dataReport, query) { + return new Promise((resolve, reject) => { + var xls = {}; + xls.data = []; + xls.options = {}; + xls.name = ''; + + var units = []; + for (var x = 0; x < dataReport.data.length; x++) { + for (var y = 0; y < dataReport.data[x].items.length; y++) { + var unit = { + code: dataReport.data[x].unit.code, + remainingEH: dataReport.data[x].items[y].remainingEH + }; + var unitsTemp = units[y] ? units[y] : []; + unitsTemp.push(unit); + units[y] = unitsTemp; + } + } + // console.log(units); + + var weeks = []; + for (var x = 0; x < units.length; x++) { + var headCount = 0; + var remainingEH=0; + for (var y = 0; y < units[x].length; y++) { + headCount += Number(dataReport.data[y].items[x].operator); + remainingEH += Number(dataReport.data[y].items[x].remainingEH); + } + var week = { + week: "W" + (x + 1), + units: units[x], + headCount: headCount, + eh:remainingEH + }; + weeks.push(week); + } + + for (var week of weeks) { + var item = {}; + item["Unit"] = week.week; + for (unit of week.units) { + item[unit.code] = unit.remainingEH; + } + item["Total Remaining EH"] = week.eh; + item["Head Count"] = week.headCount; + xls.data.push(item); + } + + var border = { + top: { style: 'thin', color: 'FF000000' }, + bottom: { style: 'thin', color: 'FF000000' }, + left: { style: 'thin', color: 'FF000000' }, + right: { style: 'thin', color: 'FF000000' }, + }; + + var fgColor = function(color){ + return { + fgColor: { + rgb: color + } + }; + }; + + var styles = { + header: { + fill: fgColor('FFCCCCCC'), + border: border, + alignment: { + horizontal: 'center' + }, + font: { + bold: true + } + }, + cell: { + fill: fgColor('FFFFFFFF'), + border: border + }, + cellRed: { + fill: fgColor('FFFF0000'), + border: border + }, + cellGreen: { + fill: fgColor('FF00FF00'), + border: border + }, + cellYellow: { + fill: fgColor('FFFFFF00'), + border: border + } + }; + + xls.options.specification = {}; + xls.options.specification["Unit"] = { + displayName : "Unit", + width: 50, + headerStyle: styles.header, + cellStyle: styles.cell + }; + for (unit of week.units) { + xls.options.specification[unit.code] = { + displayName : unit.code, + width: 100, + headerStyle: styles.header, + cellStyle : (value, row) => { + return (value > 0) ? styles.cellYellow : + (value < 0) ? styles.cellRed : + styles.cellGreen; + } + }; + } + if(!query.unit) + xls.options.specification["Total Remaining EH"] = { + displayName : "Total Remaining EH", + width: 120, + headerStyle: styles.header, + cellStyle: styles.cell + }; + xls.options.specification["Head Count"] = { + displayName : "Head Count", + width: 100, + headerStyle: styles.header, + cellStyle: styles.cell + }; + + xls.name = `Remaining EH Report ` + (query.unit ? `${query.unit}-` : ``) + `${query.year}.xlsx`; + + resolve(xls); + }); + } + +} diff --git a/src/managers/sp-master-plan/working-hours-standard-manager.js b/src/managers/sp-master-plan/working-hours-standard-manager.js new file mode 100644 index 000000000..24eec91f4 --- /dev/null +++ b/src/managers/sp-master-plan/working-hours-standard-manager.js @@ -0,0 +1,140 @@ +"use strict" + +var ObjectId = require("mongodb").ObjectId; +require("mongodb-toolkit"); +var DLModels = require("dl-models"); +var generateCode = require("../../utils/code-generator"); +var map = DLModels.map; +var WorkingHoursStandard = DLModels.garmentMasterPlan.WorkingHoursStandard; +var BaseManager = require("module-toolkit").BaseManager; +var i18n = require("dl-i18n"); + +module.exports = class ContactManager extends BaseManager { + constructor(db, user) { + super(db, user); + this.collection = this.db.use(map.garmentMasterPlan.collection.WorkingHoursStandard); + } + + _getQuery(paging) { + var _default = { + _deleted: false + }, + pagingFilter = paging.filter || {}, + keywordFilter = {}, + query = {}; + + if (paging.keyword) { + var regex = new RegExp(paging.keyword, "i"); + var remarkFilter = { + "remark": { + "$regex": regex + } + }; + keywordFilter = remarkFilter; + } + query["$and"] = [_default, keywordFilter, pagingFilter]; + return query; + } + + _beforeInsert(workingHours){ + workingHours.code = !workingHours.code ? generateCode() : workingHours.code; + workingHours._active = true; + workingHours._createdDate= new Date(); + return Promise.resolve(workingHours); + } + + _validate(workingHours) { + var errors = {}; + var valid = workingHours; + if(!valid.color){ + valid.color='#000000' + } + // 1. begin: Declare promises. + var getWorkingHoursPromise = this.collection.singleOrDefault({ + _id: { + "$ne": new ObjectId(valid._id) + }, + color: valid.color, + _deleted: false + }); + + var getWorkingHoursRangePromise = this.collection.firstOrDefault({ + _id: { + "$ne": new ObjectId(valid._id) + }, + "$or":[{ + "$and":[{ + start:{"$gte": valid.start} + }, + { + start:{"$lte":valid.end} + }] + }, + { + "$and":[{ + end:{"$gte":valid.start} + }, + { + end:{"$lte":valid.end} + }] + + + } + ], + _deleted: false + }); + // 2. begin: Validation. + return Promise.all([getWorkingHoursPromise,getWorkingHoursRangePromise]) + .then(results => { + var duplicateWorkingHours = results[0]; + var range=results[1]; + + if (duplicateWorkingHours) { + errors["color"] = i18n.__("WorkingHoursStandard.color.isExists:%s is already exists", i18n.__("WorkingHoursStandard.color._:Color")); + } + + if(range){ + errors["end"] = i18n.__("WorkingHoursStandard.end.isExists:%s is already exists", i18n.__("WorkingHoursStandard.end._:End")); + errors["start"] = i18n.__("WorkingHoursStandard.start.isExists:%s is already exists", i18n.__("WorkingHoursStandard.start._:Start")); + } + + if(valid.end<=valid.start){ + errors["end"] = i18n.__("WorkingHoursStandard.end.shouldNot:%s should not less than start hours", i18n.__("WorkingHoursStandard.end._:End")); + } + + if(!valid.remark || valid.remark===''){ + errors["remark"] = i18n.__("WorkingHoursStandard.remark.isRequired:%s is required", i18n.__("WorkingHoursStandard.remark._:Remark")); + } + + + if (Object.getOwnPropertyNames(errors).length > 0) { + var ValidationError = require("module-toolkit").ValidationError; + return Promise.reject(new ValidationError("data does not pass validation", errors)); + } + if (!valid.stamp) { + valid = new WorkingHoursStandard(valid); + } + + valid.stamp(this.user.username, "manager"); + return Promise.resolve(valid); + }); + } + + _createIndexes() { + var dateIndex = { + name: `ix_${map.garmentMasterPlan.collection.WorkingHoursStandard}__updatedDate`, + key: { + _updatedDate: -1 + } + }; + + var uearIndex = { + name: `ix_${map.garmentMasterPlan.collection.WorkingHoursStandard}__code`, + key: { + "code": 1 + } + }; + + return this.collection.createIndexes([dateIndex]); + } +} diff --git a/test/data-util/sp-master-plan/booking-order-data-util.js b/test/data-util/sp-master-plan/booking-order-data-util.js new file mode 100644 index 000000000..b0e22d7ad --- /dev/null +++ b/test/data-util/sp-master-plan/booking-order-data-util.js @@ -0,0 +1,116 @@ +"use strict"; +var helper = require("../../helper"); +var _getSert = require("../getsert"); +var BookingOrderManager = require("../../../src/managers/garment-master-plan/booking-order-manager"); + +var generateCode = require("../../../src/utils/code-generator"); +var Comodity = require("./master-plan-comodity-data-util"); +var Buyer = require("../master/garment-buyer-data-util"); +var Section = require("../garment-master-plan/garment-section-data-util"); + +var Models = require("dl-models"); +var Map = Models.map; + +class BookingOrderDataUtil { + getNewData() { + return Promise.all([ Buyer.getTestData(),Section.getTestData(),Comodity.getTestData(),Comodity.getTestData2()]) + .then((results) => { + var _buyer = results[0]; + var _section = results[1]; + var _comodity = results[2]; + var _comodity2 = results[3]; + var date = new Date(); + var targetDate=new Date(); + var deliveryDate=new Date(targetDate.setDate(targetDate.getDate() + 46)); + + var code = generateCode(); + var data = { + code : code, + bookingDate : date, + deliveryDate : deliveryDate, + orderQuantity: 1000, + garmentBuyerId : _buyer._id, + garmentSectionId : _section._id, + items:[{ + masterPlanComodity:_comodity, + masterPlanComodityId:_comodity._id, + quantity: 500, + deliveryDate : deliveryDate + }, + { + masterPlanComodity:_comodity2, + masterPlanComodityId:_comodity2._id, + quantity: 500, + deliveryDate : deliveryDate + } + ] + + } + + return Promise.resolve(data); + }); + } + getReportData() { + return Promise.all([ Buyer.getTestData(),Comodity.getTestData(),Comodity.getTestData2()]) + .then((results) => { + var _buyer = results[0]; + var _comodity = results[1]; + var _comodity2 = results[2]; + var date = new Date("2018-01-05"); + var targetDate=new Date(); + var deliveryDate=new Date(targetDate.setDate(targetDate.getDate() + 10)); + + var code = generateCode(); + var data = { + code : code, + bookingDate : date, + deliveryDate : deliveryDate, + orderQuantity: 1000, + _deleted : false, + garmentBuyerId : _buyer._id, + items:[{ + masterPlanComodity:_comodity, + masterPlanComodityId:_comodity._id, + quantity: 500, + deliveryDate : deliveryDate + }, + { + masterPlanComodity:_comodity2, + masterPlanComodityId:_comodity2._id, + quantity: 500, + deliveryDate : deliveryDate + } + ] + + } + + return Promise.resolve(data); + }); + } + getNewTestData() { + return helper + .getManager(BookingOrderManager) + .then((manager) => { + return this.getNewData().then((data) => { + return manager.create(data) + .then((id) => { + return manager.getSingleById(id) + }); + }); + }); + } + getNewTestDataEmptyItems() { + return helper + .getManager(BookingOrderManager) + .then((manager) => { + return this.getNewData().then((data) => { + data.items = []; + return manager.create(data) + .then((id) => { + return manager.getSingleById(id) + }); + }); + }); + } +} +module.exports = new BookingOrderDataUtil(); \ No newline at end of file diff --git a/test/data-util/sp-master-plan/garment-section-data-util.js b/test/data-util/sp-master-plan/garment-section-data-util.js new file mode 100644 index 000000000..e52038b6e --- /dev/null +++ b/test/data-util/sp-master-plan/garment-section-data-util.js @@ -0,0 +1,33 @@ +"use strict"; +var helper = require("../../helper"); +var generateCode = require("../../../src/utils/code-generator"); + +class GarmentSectionDataUtil { + getNewData() { + var Model = require("dl-models").garmentMasterPlan.GarmentSection; + var data = new Model(); + + var code = generateCode(); + + data.code = code; + data.name = `name [${code}]`; + + return Promise.resolve(data); + } + + getTestData() { + var Manager = require("../../../src/managers/garment-master-plan/garment-section-manager"); + return helper + .getManager(Manager) + .then((manager) => { + return this.getNewData().then((data) => { + return manager.create(data) + .then((id) => { + return manager.getSingleById(id) + }); + }); + }); + } + +} +module.exports = new GarmentSectionDataUtil(); \ No newline at end of file diff --git a/test/data-util/sp-master-plan/master-plan-comodity-data-util.js b/test/data-util/sp-master-plan/master-plan-comodity-data-util.js new file mode 100644 index 000000000..8b1fcdc74 --- /dev/null +++ b/test/data-util/sp-master-plan/master-plan-comodity-data-util.js @@ -0,0 +1,43 @@ +"use strict"; +var _getSert = require("../getsert"); +var generateCode = require("../../../src/utils/code-generator"); + +class MasterPlanComodityDataUtil { + getSert(input) { + var Manager = require("../../../src/managers/garment-master-plan/master-plan-comodity-manager"); + return _getSert(input, Manager, (data) => { + return { + code: data.code + }; + }); + } + + getNewData() { + var Model = require("dl-models").garmentMasterPlan.MasterPlanComodity; + var data = new Model(); + + var code = generateCode(); + + data.code = code; + data.name = `name [${code}]`; + + return Promise.resolve(data); + } + + getTestData() { + var data = { + code: "UT/MP/Comodity/01", + name: "MP Comodity UT" + }; + return this.getSert(data); + } + + getTestData2() { + var data = { + code: "UT/MP/Comodity/02", + name: "MP Comodity UT 2" + }; + return this.getSert(data); + } +} +module.exports = new MasterPlanComodityDataUtil(); \ No newline at end of file diff --git a/test/data-util/sp-master-plan/sewing-blocking-plan-data-util.js b/test/data-util/sp-master-plan/sewing-blocking-plan-data-util.js new file mode 100644 index 000000000..7938a5d9b --- /dev/null +++ b/test/data-util/sp-master-plan/sewing-blocking-plan-data-util.js @@ -0,0 +1,77 @@ +"use strict"; +var helper = require("../../helper"); +var _getSert = require("../getsert"); +var SewingBlockingPlanManager = require("../../../src/managers/garment-master-plan/sewing-blocking-plan-manager"); + +var generateCode = require("../../../src/utils/code-generator"); +var BookingOrder = require("./booking-order-data-util"); +var WeeklyPlan = require("./weekly-plan-data-util"); + +var Models = require("dl-models"); +var Map = Models.map; + +class SewingBlockingPlanDataUtil { + getNewData() { + return Promise.all([BookingOrder.getNewTestData(), WeeklyPlan.getTestData()]) + .then((results) => { + var _bookingOrder = results[0]; + var _weeklyPlan = results[1]; + var code = generateCode(); + + var details = []; + var numItem = 9; + for(var bookingDetail of _bookingOrder.items){ + numItem += 1; + var detail = { + code : bookingDetail.code, + shSewing : 20, + unitId : _weeklyPlan.unitId.toString(), + unit : _weeklyPlan.unit, + weeklyPlanId : _weeklyPlan._id.toString(), + weeklyPlanYear : _weeklyPlan.year, + week : _weeklyPlan.items[numItem], + masterPlanComodityId : bookingDetail.masterPlanComodityId.toString(), + masterPlanComodity : bookingDetail.masterPlanComodity, + quantity : bookingDetail.quantity, + remark : `remark ${bookingDetail.code}`, + isConfirmed : true, + deliveryDate : _bookingOrder.deliveryDate, + efficiency:52, + ehBooking:500 + } + details.push(detail); + } + + var data = { + code : code, + bookingOrderNo : _bookingOrder.code, + bookingOrderId : _bookingOrder._id.toString(), + garmentBuyerId : _bookingOrder.garmentBuyerId.toString(), + garmentBuyerName : _bookingOrder.garmentBuyerName, + garmentBuyerCode : _bookingOrder.garmentBuyerCode, + quantity : _bookingOrder.orderQuantity, + bookingDate : `${(new Date(_bookingOrder.bookingDate)).getFullYear()}-${((new Date(_bookingOrder.bookingDate)).getMonth() + 1)}-${(new Date(_bookingOrder.bookingDate)).getDate()}`, + deliveryDate : `${(new Date(_bookingOrder.deliveryDate)).getFullYear()}-${((new Date(_bookingOrder.deliveryDate)).getMonth() + 1)}-${(new Date(_bookingOrder.deliveryDate)).getDate()}`, + remark: _bookingOrder.remark, + bookingItems:_bookingOrder.items, + details : details + } + + return Promise.resolve(data); + }); + } + + getNewTestData() { + return helper + .getManager(SewingBlockingPlanManager) + .then((manager) => { + return this.getNewData().then((data) => { + return manager.create(data) + .then((id) => { + return manager.getSingleById(id) + }); + }); + }); + } +} +module.exports = new SewingBlockingPlanDataUtil(); \ No newline at end of file diff --git a/test/data-util/sp-master-plan/standard-capacity-data-util.js b/test/data-util/sp-master-plan/standard-capacity-data-util.js new file mode 100644 index 000000000..9da6a1251 --- /dev/null +++ b/test/data-util/sp-master-plan/standard-capacity-data-util.js @@ -0,0 +1,77 @@ +"use strict"; +var _getSert = require("../getsert"); +var generateCode = require("../../../src/utils/code-generator"); +// var Style = require("./style-data-util"); +var Comodity = require("./master-plan-comodity-data-util"); +var Buyer = require("../master/buyer-data-util"); + +class StandardCapacityDataUtil { + getSert(input) { + var Manager = require("../../../src/managers/sp-master-plan/standard-capacity-manager"); + return _getSert(input, Manager, (data) => { + return { + // code: data.code, + // styleId : data.styleId, + buyerId : data.buyerId, + comodityId : data.comodityId + }; + }); + } + + getNewData() { + return Promise.all([Buyer.getTestData(), Comodity.getTestData()]) + .then((results) => { + // var _style = results[0]; + var _buyer = results[0]; + var _comodity = results[1]; + + var date = new Date(); + var dateString = `${date.getFullYear()}-${(date.getMonth() + 1)}-${date.getDate()}`; + + var code = generateCode(); + var data = { + code : code, + // styleId : _style._id, + // style : _style, + buyerId : _buyer._id, + // buyer : _buyer, + masterplanComodityId : _comodity._id, + // comodity : _comodity, + date : dateString, + // shCutting : 1000, + // shSewing : 1000, + scSpinning : 1000 + } + + return Promise.resolve(data); + }); + } + + getTestData() { + return Promise.all([Buyer.getTestData(), Comodity.getTestData()]) + .then((results) => { + // var _style = results[0]; + var _buyer = results[0]; + var _comodity = results[1]; + var date = new Date(); + var dateString = `${date.getFullYear()}-${(date.getMonth() + 1)}-${date.getDate()}`; + + var code = generateCode(); + var data = { + code : code, + // styleId : _style._id, + // style : _style, + buyerId : _buyer._id, + // buyer : _buyer, + masterplanComodityId : _comodity._id, + // comodity : _comodity, + date : dateString, + // shCutting : 1000, + // shSewing : 1000, + scSpinning : 1000 + } + return this.getSert(data); + }); + } +} +module.exports = new StandardCapacityDataUtil(); \ No newline at end of file diff --git a/test/data-util/sp-master-plan/style-data-util.js b/test/data-util/sp-master-plan/style-data-util.js new file mode 100644 index 000000000..33ff6cd31 --- /dev/null +++ b/test/data-util/sp-master-plan/style-data-util.js @@ -0,0 +1,37 @@ +"use strict"; +var _getSert = require("../getsert"); +var generateCode = require("../../../src/utils/code-generator"); + +class StyleDataUtil { + getSert(input) { + var Manager = require("../../../src/managers/garment-master-plan/style-manager"); + return _getSert(input, Manager, (data) => { + return { + code: data.code + }; + }); + } + + getNewData() { + var Model = require("dl-models").garmentMasterPlan.Style; + var data = new Model(); + + var code = generateCode(); + + data.code = code; + data.name = `name [${code}]`; + data.description=`description [${code}]`; + + return Promise.resolve(data); + } + + getTestData() { + var data = { + code: "UT/Style/01", + name: "Style UT", + description: "unit test" + }; + return this.getSert(data); + } +} +module.exports = new StyleDataUtil(); \ No newline at end of file diff --git a/test/data-util/sp-master-plan/weekly-plan-data-util.js b/test/data-util/sp-master-plan/weekly-plan-data-util.js new file mode 100644 index 000000000..58dcf1b3b --- /dev/null +++ b/test/data-util/sp-master-plan/weekly-plan-data-util.js @@ -0,0 +1,88 @@ +"use strict"; +var helper = require("../../helper"); +var WeeklyPlanManager = require("../../../src/managers/garment-master-plan/weekly-plan-manager"); +var UnitDataUtil = require("../master/unit-data-util"); +var moment = require("moment"); +var _getSert = require("../getsert"); + +class WeeklyPlanDataUtil { + getNewData() { + return Promise.all([UnitDataUtil.getTestData()]) + .then((results) => { + var _unit = results[0]; + var items = []; + for (var i = 1; i <= 52; i++) { + var startDate = moment().year(2018).day("Monday").week(i).toDate(); + var endDate = moment().year(2018).day("Friday").week(i).toDate(); + items.push({ + weekNumber: i, + startDate: startDate, + endDate: endDate, + month: startDate.getMonth(), + efficiency : 10, + operator : 100, + workingHours : 40, + }) + } + var data = { + year: new Date().getFullYear() + 1, + unitId:_unit._id, + unit:_unit, + items: items + }; + return Promise.resolve(data); + }); + } + + getNewTestData() { + return helper + .getManager(WeeklyPlanManager) + .then((manager) => { + return this.getNewData().then((data) => { + return manager.create(data) + .then((id) => manager.getSingleById(id)); + }); + }); + } + + getSert(input) { + var Manager = require("../../../src/managers/garment-master-plan/weekly-plan-manager"); + return _getSert(input, Manager, (data) => { + return { + year: data.year, + unitId: data.unitId + }; + }); + + } + + getTestData(){ + return Promise.all([UnitDataUtil.getTestData()]) + .then((results) => { + var _unit = results[0]; + var items = []; + for (var i = 1; i <= 52; i++) { + var startDate = moment().year(2018).day("Monday").week(i).toDate(); + var endDate = moment().year(2018).day("Friday").week(i).toDate(); + items.push({ + weekNumber: i, + startDate: startDate, + endDate: endDate, + month: startDate.getMonth(), + efficiency : 10, + operator : 100, + workingHours : 40, + }) + } + var data = { + year: new Date().getFullYear() + 1, + unitId:_unit._id, + unit:_unit, + items: items + }; + return this.getSert(data); + }); + } +} + +module.exports = new WeeklyPlanDataUtil(); diff --git a/test/data-util/sp-master-plan/working-hours-standard-data-util.js b/test/data-util/sp-master-plan/working-hours-standard-data-util.js new file mode 100644 index 000000000..6cf37344c --- /dev/null +++ b/test/data-util/sp-master-plan/working-hours-standard-data-util.js @@ -0,0 +1,42 @@ +"use strict"; +var _getSert = require("../getsert"); +var generateCode = require("../../../src/utils/code-generator"); + +class QualityDataUtil { + getSert(input) { + var Manager = require("../../../src/managers/garment-master-plan/working-hours-standard-manager"); + return _getSert(input, Manager, (data) => { + return { + code: data.code, + color: data.color + }; + }); + } + + getNewData() { + var Model = require("dl-models").garmentMasterPlan.WorkingHoursStandard; + var data = new Model(); + + var code = generateCode(); + + data.code = code; + data.color = `#[${code}]`; + data.start=0; + data.end=10; + data.remark=`Remark[${code}]`; + + return Promise.resolve(data); + } + + getTestData() { + var data = { + code: "UT/WHS/01", + color: "#ffffff", + start:100, + end:1000, + remark: "unit test" + }; + return this.getSert(data); + } +} +module.exports = new QualityDataUtil(); diff --git a/test/index.js b/test/index.js index 6464d8683..5135561bc 100644 --- a/test/index.js +++ b/test/index.js @@ -138,6 +138,16 @@ describe('#dl-module', function (done) { test('@GARMENT MASTER PLAN/SEWING-BLOCKING-PLAN', './garment-master-plan/sewing-blocking-plan'); test('@GARMENT MASTER PLAN/GARMENT SECTION', './garment-master-plan/garment-section'); + //Spinning Master Plan + // test('@GARMENT MASTER PLAN/BOOKING-ORDER', './garment-master-plan/booking-order'); + // test('@GARMENT MASTER PLAN/WEEKLY-PLAN', './garment-master-plan/weekly-plan'); + // test('@GARMENT MASTER PLAN/WORKING-HOURS-STANDARD', './garment-master-plan/working-hours-standard'); + // test('@GARMENT MASTER PLAN/STYLE', './garment-master-plan/style'); + test('@GARMENT MASTER PLAN/STANDARD-CAPACITY', './sp-master-plan/standard-capacity'); + // test('@GARMENT MASTER PLAN/MASTER PLAN COMODITY', './garment-master-plan/master-plan-comodity'); + // test('@GARMENT MASTER PLAN/SEWING-BLOCKING-PLAN', './garment-master-plan/sewing-blocking-plan'); + // test('@GARMENT MASTER PLAN/GARMENT SECTION', './garment-master-plan/garment-section'); + //Etl test('@ETL/DIM-BUYER', './etl/dim/dim-buyer'); test('@ETL/DIM-CATEGORY', './etl/dim/dim-category'); diff --git a/test/master/garment-product/get-scenario.js b/test/master/garment-product/get-scenario.js index c07fb958f..4d88036ca 100644 --- a/test/master/garment-product/get-scenario.js +++ b/test/master/garment-product/get-scenario.js @@ -48,7 +48,7 @@ it(`#02. should success when get product by tags from created data`, function (d }); }); -it('#03. should success when get data garment product', function (done) { +it('#03. should success when get data Kanban', function (done) { var query = { "keyword": "a" }; productManager.read(query) .then(products => { @@ -60,28 +60,7 @@ it('#03. should success when get data garment product', function (done) { }); -it('#04. should success when read distinct by description data', function (done) { - var query = { "keyword": createdData.description }; - productManager.getDistinctProductDescription(query) - .then(products => { - products.should.instanceof(Array); - done(); - }).catch(e => { - done(e); - }); -}) - -it('#05. should success when read single by name', function (done) { - var query = { "name": createdData.name }; - productManager.getSingleProductByName(query) - .then(product => { - done(); - }).catch(e => { - done(e); - }); -}) - -it(`#06. should success when destroy data with id`, function (done) { +it(`#04. should success when destroy data with id`, function(done) { productManager.destroy(createdId) .then((result) => { result.should.be.Boolean(); @@ -93,7 +72,7 @@ it(`#06. should success when destroy data with id`, function (done) { }); }); -it(`#07. should null when get destroyed data`, function (done) { +it(`#05. should null when get destroyed data`, function(done) { productManager.getSingleByIdOrDefault(createdId) .then((data) => { should.equal(data, null); diff --git a/test/sp-master-plan/booking-order/basic.js b/test/sp-master-plan/booking-order/basic.js new file mode 100644 index 000000000..5bc8a1228 --- /dev/null +++ b/test/sp-master-plan/booking-order/basic.js @@ -0,0 +1,11 @@ +var options = { + manager: require("../../../src/managers/garment-master-plan/booking-order-manager"), + model: require("dl-models").garmentMasterPlan.BookingOrder, + util: require("../../data-util/garment-master-plan/booking-order-data-util"), + validator: require("dl-models").validator.garmentMasterPlan.bookingOrder, + createDuplicate: false, + keys:[] +}; + +var basicTest = require("../../basic-test-factory"); +basicTest(options); \ No newline at end of file diff --git a/test/sp-master-plan/booking-order/cancel-booking-report.js b/test/sp-master-plan/booking-order/cancel-booking-report.js new file mode 100644 index 000000000..0f1f475e0 --- /dev/null +++ b/test/sp-master-plan/booking-order/cancel-booking-report.js @@ -0,0 +1,146 @@ +'use strict'; + +var helper = require("../../helper"); +var validator = require('dl-models').validator.master; +var validatorMasterPlan = require('dl-models').validator.garmentMasterPlan; +var BookingOrderManager = require("../../../src/managers/garment-master-plan/booking-order-manager"); +var bookingOrderManager = null; +var bookingOrderDataUtil = require("../../data-util/garment-master-plan/booking-order-data-util"); +var moment = require('moment'); +var dateFrom=new Date("2018-01-02") +var dateTo=new Date("2018-01-10"); +var comodity="comodity"; +var buyer="buyer"; +var code ="code"; +var cancelStateCancelConfirm="Cancel Confirm"; +var cancelStateCancelSisa="Cancel Sisa"; +var cancelConfirmExpired="Expired"; +// var bookingOrderMasterPlan="Sudah Dibuat Master Plan"; +// var bookingOrderCanceled="Booking Dibatalkan"; +var offset=7; + +require("should"); + + +before('#00. connect db', function (done) { + helper.getDb() + .then(db => { + bookingOrderManager = new BookingOrderManager(db, { + username: 'unit-test' + }); + done(); + }) + .catch(e => { + done(e); + }) +}); + +it("#01. should success when get report with parameter code", function (done) { + bookingOrderManager.getCanceledBookingOrderReport({"code" : code},offset) + .then((data) => { + data.should.instanceof(Array); + done(); + }) + .catch((e) => { + done(e); + }); +}); + +it("#02. should success when get report with parameter buyer", function (done) { + bookingOrderManager.getCanceledBookingOrderReport({"buyer" : buyer},offset) + .then((data) => { + data.should.instanceof(Array); + done(); + }) + .catch((e) => { + done(e); + }); +}); + +it("#03. should success when get report with parameter cancelStateCancelConfirm", function (done) { + bookingOrderManager.getCanceledBookingOrderReport({"cancelState" : cancelStateCancelConfirm},offset) + .then((data) => { + data.should.instanceof(Array); + done(); + }) + .catch((e) => { + done(e); + }); +}); +it("#04. should success when get report with parameter cancelStateCancelSisa", function (done) { + bookingOrderManager.getCanceledBookingOrderReport({"cancelState" : cancelStateCancelSisa},offset) + .then((data) => { + data.should.instanceof(Array); + done(); + }) + .catch((e) => { + done(e); + }); +}); +it("#05. should success when get report with parameter cancelConfirmExpired", function (done) { + bookingOrderManager.getCanceledBookingOrderReport({"cancelState" : cancelConfirmExpired},offset) + .then((data) => { + data.should.instanceof(Array); + done(); + }) + .catch((e) => { + done(e); + }); +}); + + +it("#06. should success when get report with parameter datefrom and dateTo", function (done) { + bookingOrderDataUtil.getReportData() + .then((datas)=>{ + bookingOrderManager.getCanceledBookingOrderReport({dateFrom,dateTo},offset) + .then((data) => { + data.should.instanceof(Array); + var result = { + data : data + }; + bookingOrderManager.getCanceledBookingOrderReportXls(result, {dateFrom, dateTo},offset) + .then(xls => { + xls.should.instanceof(Object); + xls.should.have.property('data'); + xls.should.have.property('options'); + xls.should.have.property('name'); + done(); + }) + .catch((e) => { + done(e); + }); + }) + .catch((e) => { + done(e); + }); + }); + +}); + +it("#07. should success when get report with no parameter and get excel", function (done) { + bookingOrderDataUtil.getReportData() + .then((datas)=>{ + bookingOrderManager.getCanceledBookingOrderReport({},offset) + .then((data) => { + data.should.instanceof(Array); + var result = { + data : data + }; + bookingOrderManager.getCanceledBookingOrderReportXls(result, {},offset) + .then(xls => { + xls.should.instanceof(Object); + xls.should.have.property('data'); + xls.should.have.property('options'); + xls.should.have.property('name'); + done(); + }) + .catch((e) => { + done(e); + }); + }) + .catch((e) => { + done(e); + }); + }); + +}); diff --git a/test/sp-master-plan/booking-order/cancel-booking.js b/test/sp-master-plan/booking-order/cancel-booking.js new file mode 100644 index 000000000..2ea41e205 --- /dev/null +++ b/test/sp-master-plan/booking-order/cancel-booking.js @@ -0,0 +1,100 @@ +require("should"); +var ObjectId = require("mongodb").ObjectId; +var should = require('should'); +var helper = require("../../helper"); +var Manager = require("../../../src/managers/garment-master-plan/booking-order-manager"); +var manager = null; +var dataUtil =require("../../data-util/garment-master-plan/booking-order-data-util"); +var validate = require("dl-models").validator.garmentMasterPlan.bookingOrder; + +var moment = require('moment'); + +before('#00. connect db', function(done) { + helper.getDb() + .then(db => { + manager = new Manager(db, { + username: 'dev' + }); + done(); + }) + .catch(e => { + done(e); + }); +}); + +var booking; +it('#01-1. should success when create new data with items', function(done) { + dataUtil.getNewTestData() + .then(book => { + booking = book; + validate(booking); + done(); + // console.log(booking._id); + + }) + .catch(e => { + done(e); + }); +}); + +var bookingEmptyItems; +it('#01-2. should success when create new data with no items', function(done) { + dataUtil.getNewTestDataEmptyItems() + .then(book => { + bookingEmptyItems = book; + validate(bookingEmptyItems); + done(); + }) + .catch(e => { + done(e); + }); +}); + +it('#02-1. should success when cancel for data with items', function(done) { + manager.cancelBooking(booking) + .then(booking => { + manager.getSingleById(booking) + .then(book => { + booking = book; + validate(booking); + booking.orderQuantity.should.equal(booking.items.reduce((total, value) => total + value.quantity, 0), "booking.orderQuantity invalid value"); + if (booking.canceledBookingOrder) // remove after exist in models + booking.canceledBookingOrder.should.equal(booking.orderQuantity - booking.items.reduce((total, value) => total + value.quantity, 0), "booking.canceledBookingOrder invalid value"); + if (booking.canceledDate) // remove after exist in models + booking.canceledDate.should.instanceof(Date); + booking.isCanceled.should.equal(false, "booking-order.isCanceled should be true after canceled"); + done(); + }) + .catch(e => { + done(e); + }); + }) + .catch(e => { + done(e); + }); +}); + +it('#02-2. should success when cancel for data with no items', function(done) { + manager.cancelBooking(bookingEmptyItems) + .then(booking => { + manager.getSingleById(booking) + .then(book => { + booking = book; + validate(booking); + booking.orderQuantity.should.equal(0, "booking.orderQuantity invalid value"); + if (booking.canceledBookingOrder) // remove after exist in models + booking.canceledBookingOrder.should.equal(bookingEmptyItems.orderQuantity, "booking.canceledBookingOrder invalid value"); + if (booking.canceledDate) // remove after exist in models + booking.canceledDate.should.instanceof(Date); + booking.isCanceled.should.equal(true, "booking-order.isCanceled should be true after canceled"); + done(); + }) + .catch(e => { + done(e); + }); + }) + .catch(e => { + done(e); + }); +}); + diff --git a/test/sp-master-plan/booking-order/confirm.js b/test/sp-master-plan/booking-order/confirm.js new file mode 100644 index 000000000..d03571a28 --- /dev/null +++ b/test/sp-master-plan/booking-order/confirm.js @@ -0,0 +1,221 @@ +'use strict'; + +var ObjectId = require("mongodb").ObjectId; +var should = require('should'); +var helper = require("../../helper"); +var Manager = require("../../../src/managers/garment-master-plan/booking-order-manager"); +var manager = null; +var dataUtil =require("../../data-util/garment-master-plan/booking-order-data-util"); +var validate = require("dl-models").validator.garmentMasterPlan.bookingOrder; + + +var ManagerPlan = require("../../../src/managers/garment-master-plan/sewing-blocking-plan-manager"); +var managerPlan = null; +var dataUtilPlan =require("../../data-util/garment-master-plan/sewing-blocking-plan-data-util"); +var validatePlan = require("dl-models").validator.garmentMasterPlan.masterPlan; + +var moment = require('moment'); + +before('#00. connect db', function (done) { + helper.getDb() + .then(db => { + manager = new Manager(db, { + username: 'unit-test' + }); + + managerPlan = new ManagerPlan(db, { + username: 'unit-test' + }); + done(); + }) + .catch(e => { + done(e); + }) +}); + +var createdId; +it("#01. should success when create new data", function (done) { + dataUtil.getNewData() + .then((data) => manager.create(data)) + .then((id) => { + id.should.be.Object(); + createdId = id; + done(); + }) + .catch((e) => { + done(e); + }); +}); + + +var createdData; +it(`#02. should success when get created data with id`, function (done) { + manager.getSingleById(createdId) + .then((data) => { + data.should.instanceof(Object); + validate(data); + createdData = data; + done(); + }) + .catch((e) => { + done(e); + }); +}); + + +// it("#02.5 should success when create new data masterPlan", function (done) { +// dataUtilPlan.getNewData() +// .then((data) => { +// data.bookingOrderId = createdId; +// manager.create(data) +// .then((id) => { +// id.should.be.Object(); +// done(); +// }) +// .catch((e) => { +// done(e); +// }); +// }) +// .catch((e) => { +// done(e); +// }); +// }); + +it("#03. should error when confirm created data without data items", function (done) { + createdData.type='confirm'; + createdData.items = [{ + quantity: 0, + deliveryDate : '' + }]; + manager.update(createdData) + .then((id) => { + done("should error when confirm created data without data items"); + }) + .catch((e) => { + e.name.should.equal("ValidationError"); + e.should.have.property("errors"); + e.errors.should.instanceof(Object); + e.errors.should.have.property("items"); + done(); + }); +}); + +//item.deliveryDate>data.deliveryDate +it("#04. should error when confirm created data with deliveryDate items more than deliveryDate", function (done) { + createdData.type='confirm'; + var today=new Date(); + //createdData.deliveryDate=new Date(today.setDate(today.getDate() + 10)); + var date=new Date(createdData.deliveryDate); + createdData.items[0].deliveryDate=new Date(date.setDate(date.getDate() + 10)); + manager.update(createdData) + .then((id) => { + done("should error when confirm created data with deliveryDate items more than deliveryDate"); + }) + .catch((e) => { + e.name.should.equal("ValidationError"); + e.should.have.property("errors"); + e.errors.should.instanceof(Object); + e.errors.should.have.property("items"); + done(); + }); +}); + +it("#05. should error when confirm created data with deliveryDate items less than today", function (done) { + createdData.type='confirm'; + var today=new Date(); + createdData.items[0].deliveryDate=new Date(today.setDate(today.getDate() - 10)); + manager.update(createdData) + .then((id) => { + done("should error when confirm created data with deliveryDate items less than today"); + }) + .catch((e) => { + e.name.should.equal("ValidationError"); + e.should.have.property("errors"); + e.errors.should.instanceof(Object); + e.errors.should.have.property("items"); + done(); + }); +}); + +// it("#06. should error when confirm created data with quantity items more than orderQuantity", function (done) { +// createdData.type='confirm'; +// createdData.items[0].quantity=10000; +// manager.update(createdData) +// .then((id) => { +// done("should error when confirm created data with quantity items more than orderQuantity"); +// }) +// .catch((e) => { +// e.name.should.equal("ValidationError"); +// e.should.have.property("errors"); +// e.errors.should.instanceof(Object); +// e.errors.should.have.property("items"); +// done(); +// }); +// }); + +it("#06. should error when confirm created data with deliveryDate items less than booking date", function (done) { + createdData.type='confirm'; + //var today=new Date(createdData.bookingDate); + var date=new Date(createdData.bookingDate.setDate(createdData.bookingDate.getDate() + 10)); + createdData.items[0].deliveryDate=new Date(date.setDate(date.getDate() - 10)); + manager.update(createdData) + .then((id) => { + done("should error when confirm created data with deliveryDate items less than booking date"); + }) + .catch((e) => { + e.name.should.equal("ValidationError"); + e.should.have.property("errors"); + e.errors.should.instanceof(Object); + e.errors.should.have.property("items"); + done(); + }); +}); + +it("#07. should error when confirm data with deliveryDate item is null", function (done){ + createdData.type='confirm'; + var date=new Date(); + createdData.items[0].deliveryDate=null; + manager.update(createdData) + .then((id) => { + done("should error when confirm data with deliveryDate item is null"); + }) + .catch((e) => { + e.name.should.equal("ValidationError"); + e.should.have.property("errors"); + e.errors.should.instanceof(Object); + e.errors.should.have.property("items"); + done(); + }); +}); + +// it("#08. should error when confirm created data without data items", function (done) { +// createdData.type='confirm'; +// createdData.items = []; +// manager.update(createdData) +// .then((id) => { +// done("should error when confirm created data without data items"); +// }) +// .catch((e) => { +// e.name.should.equal("ValidationError"); +// e.should.have.property("errors"); +// e.errors.should.instanceof(Object); +// e.errors.should.have.property("detail"); +// done(); +// }); +// }); + +it("#09. should success when search data with filter", function (done) { + manager.read({ + keyword: createdData.garmentBuyerName + }) + .then((documents) => { + //process documents + documents.should.have.property("data"); + documents.data.should.be.instanceof(Array); + documents.data.length.should.not.equal(0); + done(); + }) + .catch((e) => { + done(e); + }); +}); \ No newline at end of file diff --git a/test/sp-master-plan/booking-order/expired-booking.js b/test/sp-master-plan/booking-order/expired-booking.js new file mode 100644 index 000000000..382ee9874 --- /dev/null +++ b/test/sp-master-plan/booking-order/expired-booking.js @@ -0,0 +1,105 @@ +require("should"); +var ObjectId = require("mongodb").ObjectId; +var should = require('should'); +var helper = require("../../helper"); +var Manager = require("../../../src/managers/garment-master-plan/booking-order-manager"); +var manager = null; +var dataUtil =require("../../data-util/garment-master-plan/booking-order-data-util"); +var validate = require("dl-models").validator.garmentMasterPlan.bookingOrder; + +var ManagerPlan = require("../../../src/managers/garment-master-plan/sewing-blocking-plan-manager"); +var managerPlan = null; +var dataUtilPlan =require("../../data-util/garment-master-plan/sewing-blocking-plan-data-util"); +var validatePlan = require("dl-models").validator.garmentMasterPlan.masterPlan; + +var moment = require('moment'); + +before('#00. connect db', function(done) { + helper.getDb() + .then(db => { + manager = new Manager(db, { + username: 'dev' + }); + managerPlan = new ManagerPlan(db, { + username: 'unit-test' + }); + done(); + }) + .catch(e => { + done(e); + }); +}); + +var createdId; +it("#01. should success when create new data", function (done) { + dataUtil.getNewData() + .then((data) =>{ + data.orderQuantity=5000; + manager.create(data) + .then((id) => { + id.should.be.Object(); + createdId = id; + done(); + }) + }) + .catch((e) => { + done(e); + }); +}); + + +var createdData; +it(`#02. should success when get created data with id`, function (done) { + manager.getSingleById(createdId) + .then((data) => { + data.should.instanceof(Object); + validate(data); + createdData = data; + done(); + }) + .catch((e) => { + done(e); + }); +}); + +var createdPlanId; +var createdPlan; +it("#03. should success when create new data blocking plan", function (done) { + dataUtilPlan.getNewData() + .then((data) =>{ + data.bookingOrderId=createdId; + data.deliveryDate=createdData.deliveryDate; + for(var detail of data.details){ + detail.deliveryDate=createdData.deliveryDate; + } + managerPlan.create(data) + .then((id) => { + id.should.be.Object(); + createdPlanId = id; + done(); + }) + }) + .catch((e) => { + done(e); + }); +}); + +it('#04. should success when hapus sisa', function(done) { + manager.expiredBooking(createdData) + .then(booking => { + //var bookingId = booking._id; + manager.getSingleById(booking) + .then(book => { + var booking = book; + validate(booking); + booking.expiredBookingOrder.should.not.equal(0); + done(); + }) + .catch(e => { + done(e); + }); + }) + .catch(e => { + done(e); + }); +}); \ No newline at end of file diff --git a/test/sp-master-plan/booking-order/index.js b/test/sp-master-plan/booking-order/index.js new file mode 100644 index 000000000..90730f565 --- /dev/null +++ b/test/sp-master-plan/booking-order/index.js @@ -0,0 +1,27 @@ +describe("BASIC CRUD SCENARIOS", function() { + require("./basic"); +}); + +describe("VALIDATION SCENARIOS", function() { + require("./validate"); +}); + +describe("CANCEL BOOKING SCENARIOS", function() { + require("./cancel-booking"); +}); + +describe("EXPIRED BOOKING SCENARIOS", function() { + require("./expired-booking"); +}); + +describe("CONFIRM BOOKING SCENARIOS", function() { + require("./confirm"); +}); + +describe("MONITORING BOOKING SCENARIOS", function() { + require("./report"); +}); + +describe("MONITORING CANCELED BOOKING SCENARIOS", function() { + require("./cancel-booking-report"); +}); \ No newline at end of file diff --git a/test/sp-master-plan/booking-order/report.js b/test/sp-master-plan/booking-order/report.js new file mode 100644 index 000000000..7e6237534 --- /dev/null +++ b/test/sp-master-plan/booking-order/report.js @@ -0,0 +1,201 @@ +'use strict'; + +var helper = require("../../helper"); +var validator = require('dl-models').validator.master; +var validatorMasterPlan = require('dl-models').validator.garmentMasterPlan; +var BookingOrderManager = require("../../../src/managers/garment-master-plan/booking-order-manager"); +var bookingOrderManager = null; +var bookingOrderDataUtil = require("../../data-util/garment-master-plan/booking-order-data-util"); +var moment = require('moment'); +var dateFrom=new Date("2018-01-02") +var dateTo=new Date("2018-01-10"); +var comodity="comodity"; +var section="section"; +var buyer="buyer"; +var code ="code"; +var isconfirmState="Sudah Dikonfirmasi"; +var notconfirmState="Belum Dikonfirmasi"; +var bookingOrderBooking="Booking"; +var bookingOrderMasterPlan="Sudah Dibuat Master Plan"; +var bookingOrderCanceled="Booking Dibatalkan"; +var bookingOrderConfirmed="Confirmed"; +var offset=7; + +require("should"); + + +before('#00. connect db', function (done) { + helper.getDb() + .then(db => { + bookingOrderManager = new BookingOrderManager(db, { + username: 'unit-test' + }); + done(); + }) + .catch(e => { + done(e); + }) +}); + +it("#01. should success when get report with parameter code", function (done) { + bookingOrderManager.getBookingOrderReport({"code" : code},offset) + .then((data) => { + data.should.instanceof(Array); + done(); + }) + .catch((e) => { + done(e); + }); +}); + +it("#02. should success when get report with parameter buyer", function (done) { + bookingOrderManager.getBookingOrderReport({"buyer" : buyer},offset) + .then((data) => { + data.should.instanceof(Array); + done(); + }) + .catch((e) => { + done(e); + }); +}); +it("#03. should success when get report with parameter comodity", function (done) { + bookingOrderManager.getBookingOrderReport({"comodity" : comodity},offset) + .then((data) => { + data.should.instanceof(Array); + done(); + }) + .catch((e) => { + done(e); + }); +}); + +it("#04. should success when get report with parameter section", function (done) { + bookingOrderManager.getBookingOrderReport({"section" : section},offset) + .then((data) => { + data.should.instanceof(Array); + done(); + }) + .catch((e) => { + done(e); + }); +}); + +it("#05. should success when get report with parameter isconfirmstate", function (done) { + bookingOrderManager.getBookingOrderReport({"confirmState" : isconfirmState},offset) + .then((data) => { + data.should.instanceof(Array); + done(); + }) + .catch((e) => { + done(e); + }); +}); +it("#06. should success when get report with parameter notconfirmstate", function (done) { + bookingOrderManager.getBookingOrderReport({"confirmState" : notconfirmState},offset) + .then((data) => { + data.should.instanceof(Array); + done(); + }) + .catch((e) => { + done(e); + }); +}); +it("#07. should success when get report with parameter booking order state :Booking", function (done) { + bookingOrderManager.getBookingOrderReport({"bookingOrderState" : bookingOrderBooking},offset) + .then((data) => { + data.should.instanceof(Array); + done(); + }) + .catch((e) => { + done(e); + }); +}); +it("#08. should success when get report with parameter booking order state : Sudah dibuat Master Plan", function (done) { + bookingOrderManager.getBookingOrderReport({"bookingOrderState" : bookingOrderMasterPlan},offset) + .then((data) => { + data.should.instanceof(Array); + done(); + }) + .catch((e) => { + done(e); + }); +}); +it("#09. should success when get report with parameter booking order state : Booking Dibatalkan", function (done) { + bookingOrderManager.getBookingOrderReport({"bookingOrderState" : bookingOrderCanceled},offset) + .then((data) => { + data.should.instanceof(Array); + done(); + }) + .catch((e) => { + done(e); + }); +}); + +it("#10. should success when get report with parameter booking order state : Confirmed", function (done) { + bookingOrderManager.getBookingOrderReport({"bookingOrderState" : bookingOrderConfirmed},offset) + .then((data) => { + data.should.instanceof(Array); + done(); + }) + .catch((e) => { + done(e); + }); +}); + + + +it("#11. should success when get report with parameter datefrom and dateTo", function (done) { + bookingOrderDataUtil.getReportData() + .then((datas)=>{ + bookingOrderManager.getBookingOrderReport({dateFrom,dateTo},offset) + .then((data) => { + data.should.instanceof(Array); + var result = { + data : data + }; + bookingOrderManager.getBookingOrderReportXls(result, {dateFrom, dateTo},offset) + .then(xls => { + xls.should.instanceof(Object); + xls.should.have.property('data'); + xls.should.have.property('options'); + xls.should.have.property('name'); + done(); + }) + .catch((e) => { + done(e); + }); + }) + .catch((e) => { + done(e); + }); + }); + +}); + +it("#12. should success when get report with no parameter and get excel", function (done) { + bookingOrderDataUtil.getReportData() + .then((datas)=>{ + bookingOrderManager.getBookingOrderReport({},offset) + .then((data) => { + data.should.instanceof(Array); + var result = { + data : data + }; + bookingOrderManager.getBookingOrderReportXls(result, {},offset) + .then(xls => { + xls.should.instanceof(Object); + xls.should.have.property('data'); + xls.should.have.property('options'); + xls.should.have.property('name'); + done(); + }) + .catch((e) => { + done(e); + }); + }) + .catch((e) => { + done(e); + }); + }); + +}); diff --git a/test/sp-master-plan/booking-order/validate.js b/test/sp-master-plan/booking-order/validate.js new file mode 100644 index 000000000..df09a7c8f --- /dev/null +++ b/test/sp-master-plan/booking-order/validate.js @@ -0,0 +1,242 @@ +'use strict'; + +var ObjectId = require("mongodb").ObjectId; +var should = require('should'); +var helper = require("../../helper"); +var Manager = require("../../../src/managers/garment-master-plan/booking-order-manager"); +var manager = null; +var dataUtil =require("../../data-util/garment-master-plan/booking-order-data-util"); +var validate = require("dl-models").validator.garmentMasterPlan.bookingOrder; + +var moment = require('moment'); + +before('#00. connect db', function (done) { + helper.getDb() + .then(db => { + manager = new Manager(db, { + username: 'unit-test' + }); + done(); + }) + .catch(e => { + done(e); + }) +}); + +it("#01. should error when create new data with empty data", function (done) { + manager.create({}) + .then((id) => { + done("should error when create new data with empty data"); + }) + .catch((e) => { + e.name.should.equal("ValidationError"); + e.should.have.property("errors"); + e.errors.should.instanceof(Object); + done(); + }); +}); + +// it("#02. should error when create new data with no items", function (done) { +// dataUtil.getNewData() +// .then((data) => { +// data.items = []; +// manager.create(data) +// .then((id) => { +// done("should error when create new data with no items"); +// }) +// .catch((e) => { +// e.name.should.equal("ValidationError"); +// e.should.have.property("errors"); +// e.errors.should.instanceof(Object); +// e.errors.should.have.property("items"); +// done(); +// }); +// }) +// .catch((e) => { +// done(e); +// }); +// }); + +it("#02. should error when create new data with deliveryDate is null", function (done){ + dataUtil.getNewData() + .then((data) => { + var targetDate=new Date(); + data.deliveryDate=null; + data.bookingDate=new Date(); + manager.create(data) + .then((id) => { + done("should error when create new data with deliveryDate is null"); + }) + .catch((e) => { + e.name.should.equal("ValidationError"); + e.should.have.property("errors"); + e.errors.should.instanceof(Object); + e.errors.should.have.property("deliveryDate"); + done(); + }); + }) + .catch((e) => { + done(e); + }); +}); + +it("#03. should error when create new data with bookingDate = deliveryDate", function (done){ + dataUtil.getNewData() + .then((data) => { + data.deliveryDate=new Date(); + data.bookingDate=new Date(); + data.deliveryDate.setHours(0,0,0,0); + data.items = []; + manager.create(data) + .then((id) => { + done("should error when create new data bookingDate = deliveryDate"); + }) + .catch((e) => { + e.name.should.equal("ValidationError"); + e.should.have.property("errors"); + e.errors.should.instanceof(Object); + e.errors.should.have.property("deliveryDate"); + done(); + }); + }) + .catch((e) => { + done(e); + }); +}); + +it("#04. should success when create new data with deliveryDate > bookingDate", function (done){ + dataUtil.getNewData() + .then((data) => { + var targetDate=new Date(); + data.deliveryDate=new Date(targetDate.setDate(targetDate.getDate() + 10)) + data.bookingDate=new Date(); + manager.create(data) + .then((id) => { + done(); + }) + .catch((e) => { + done(e); + }); + }) + .catch((e) => { + done(e); + }); +}); + +it("#05. should error when create new data with deliveryDate < bookingDate ", function (done) { + dataUtil.getNewData() + .then((data) => { + var targetDate=new Date(); + data.deliveryDate=new Date(targetDate.setDate(targetDate.getDate() - 10)); + data.items = []; + manager.create(data) + .then((id) => { + done("should error when create new data with deliveryDate < bookingDate"); + }) + .catch((e) => { + e.name.should.equal("ValidationError"); + e.should.have.property("errors"); + e.errors.should.instanceof(Object); + e.errors.should.have.property("deliveryDate"); + done(); + }); + }) + .catch((e) => { + done(e); + }); +}); + +it("#06. should error when create new data with deliveryDate < today ", function (done) { + dataUtil.getNewData() + .then((data) => { + var targetDate=new Date(); + data.bookingDate=new Date(targetDate.setDate(targetDate.getDate() - 7)); + data.deliveryDate=new Date(targetDate.setDate(targetDate.getDate() - 5)); + data.items = []; + manager.create(data) + .then((id) => { + done("should error when create new data with deliveryDate < today"); + }) + .catch((e) => { + e.name.should.equal("ValidationError"); + e.should.have.property("errors"); + e.errors.should.instanceof(Object); + e.errors.should.have.property("deliveryDate"); + done(); + }); + }) + .catch((e) => { + done(e); + }); +}); + + + +var newData; +var createdId; +it("#07. should success when create new data", function (done) { + dataUtil.getNewData() + .then((data) => { + newData = data; + manager.create(data) + .then((id) => { + createdId = id; + done(); + }) + .catch((e) => { + done(e); + }); + }) + .catch((e) => { + done(e); + }); +}); + +it("#08. should success when search data with filter", function (done) { + manager.read({ + keyword: newData.garmentBuyerName + }) + .then((documents) => { + //process documents + documents.should.have.property("data"); + documents.data.should.be.instanceof(Array); + documents.data.length.should.not.equal(0); + done(); + }) + .catch((e) => { + done(e); + }); +}); + +it("#09. should success when destroy data with id", function (done) { + manager.destroy(createdId) + .then((result) => { + result.should.be.Boolean(); + result.should.equal(true); + done(); + }) + .catch((e) => { + done(e); + }); +}); + +// it("#04. should error when create new data with orderQuantity not equal total quantity in items", function (done) { +// dataUtil.getNewData() +// .then((data) => { +// data.orderQuantity=2000; +// manager.create(data) +// .then((id) => { +// done("should error when create new data with date greater than today"); +// }) +// .catch((e) => { +// e.name.should.equal("ValidationError"); +// e.should.have.property("errors"); +// e.errors.should.instanceof(Object); +// e.errors.should.have.property("orderQuantity"); +// done(); +// }); +// }) +// .catch((e) => { +// done(e); +// }); +// }); diff --git a/test/sp-master-plan/garment-section/basic.js b/test/sp-master-plan/garment-section/basic.js new file mode 100644 index 000000000..338d3c3b7 --- /dev/null +++ b/test/sp-master-plan/garment-section/basic.js @@ -0,0 +1,11 @@ +var options = { + manager: require("../../../src/managers/garment-master-plan/garment-section-manager"), + model: require("dl-models").garmentMasterPlan.GarmentSection, + util: require("../../data-util/garment-master-plan/garment-section-data-util"), + validator: require("dl-models").validator.garmentMasterPlan.garmentSection, + createDuplicate: true, + keys:['code', 'name'] +}; + +var basicTest = require("../../basic-test-factory"); +basicTest(options); \ No newline at end of file diff --git a/test/sp-master-plan/garment-section/index.js b/test/sp-master-plan/garment-section/index.js new file mode 100644 index 000000000..f85c50320 --- /dev/null +++ b/test/sp-master-plan/garment-section/index.js @@ -0,0 +1,4 @@ + +describe("BASIC CRUD SCENARIOS", function() { + require("./basic"); +}); \ No newline at end of file diff --git a/test/sp-master-plan/master-plan-comodity/basic.js b/test/sp-master-plan/master-plan-comodity/basic.js new file mode 100644 index 000000000..469b4855c --- /dev/null +++ b/test/sp-master-plan/master-plan-comodity/basic.js @@ -0,0 +1,11 @@ +var options = { + manager: require("../../../src/managers/garment-master-plan/master-plan-comodity-manager"), + model: require("dl-models").garmentMasterPlan.MasterPlanComodity, + util: require("../../data-util/garment-master-plan/master-plan-comodity-data-util"), + validator: require("dl-models").validator.garmentMasterPlan.masterPlanComodity, + createDuplicate: true, + keys:['code'] +}; + +var basicTest = require("../../basic-test-factory"); +basicTest(options); \ No newline at end of file diff --git a/test/sp-master-plan/master-plan-comodity/index.js b/test/sp-master-plan/master-plan-comodity/index.js new file mode 100644 index 000000000..4ead001d3 --- /dev/null +++ b/test/sp-master-plan/master-plan-comodity/index.js @@ -0,0 +1,8 @@ + +describe("BASIC CRUD SCENARIOS", function() { + require("./basic"); +}); + +describe("VALIDATION SCENARIOS", function() { + require("./validate"); +}); \ No newline at end of file diff --git a/test/sp-master-plan/master-plan-comodity/validate.js b/test/sp-master-plan/master-plan-comodity/validate.js new file mode 100644 index 000000000..cb87f0c7e --- /dev/null +++ b/test/sp-master-plan/master-plan-comodity/validate.js @@ -0,0 +1,68 @@ +'use strict'; + +var ObjectId = require("mongodb").ObjectId; +var should = require('should'); +var helper = require("../../helper"); +var Manager = require("../../../src/managers/garment-master-plan/master-plan-comodity-manager"); +var manager = null; +var dataUtil = require("../../data-util/garment-master-plan/master-plan-comodity-data-util"); +var validate = require("dl-models").validator.garmentMasterPlan.masterPlanComodity; +var moment = require('moment'); + +before('#00. connect db', function (done) { + helper.getDb() + .then(db => { + manager = new Manager(db, { + username: 'unit-test' + }); + done(); + }) + .catch(e => { + done(e); + }) +}); + + +var newData; +it("#01. should success when create new data", function (done) { + dataUtil.getNewData() + .then((data) => { + newData = data; + manager.create(data) + .then((id) => { + done(); + }) + .catch((e) => { + done(e); + }); + }) + .catch((e) => { + done(e); + }); +}); + +it("#02. should success when search data with filter", function (done) { + manager.read({ + keyword: newData.code + }) + .then((documents) => { + //process documents + documents.should.have.property("data"); + documents.data.should.be.instanceof(Array); + documents.data.length.should.not.equal(0); + done(); + }) + .catch((e) => { + done(e); + }); +}); + +it(`#03. should success when remove all data`, function(done) { + manager.collection.remove({}) + .then((result) => { + done(); + }) + .catch((e) => { + done(e); + }); +}); \ No newline at end of file diff --git a/test/sp-master-plan/sewing-blocking-plan/accepting-order-monitoring.js b/test/sp-master-plan/sewing-blocking-plan/accepting-order-monitoring.js new file mode 100644 index 000000000..29995ac5b --- /dev/null +++ b/test/sp-master-plan/sewing-blocking-plan/accepting-order-monitoring.js @@ -0,0 +1,110 @@ +'use strict'; + +var ObjectId = require("mongodb").ObjectId; +var should = require('should'); +var helper = require("../../helper"); +var Manager = require("../../../src/managers/garment-master-plan/sewing-blocking-plan-manager"); +var manager = null; +var dataUtil =require("../../data-util/garment-master-plan/sewing-blocking-plan-data-util"); +var validate = require("dl-models").validator.garmentMasterPlan.sewingBlockingPlan; +var moment = require('moment'); + + +before('#00. connect db', function (done) { + helper.getDb() + .then(db => { + manager = new Manager(db, { + username: 'unit-test' + }); + + done(); + }) + .catch(e => { + done(e); + }); +}); + +var dummyData; +var dummyDataId; +var queryAcceptingOrderMonitoring = {}; +var dummyAcceptingOrderMonitoringResult = {}; + +it(`#01. should success when get created new data`, function (done) { + dataUtil.getNewData() + .then((data) => { + manager.create(data) + .then((id) => { + dummyDataId = id; + dummyData = data; + queryAcceptingOrderMonitoring.year = dummyData.details[0].weeklyPlanYear; + queryAcceptingOrderMonitoring.unit = ''; + done(); + }) + .catch((e) => { + done(e); + }); + }) + .catch((e) => { + done(e); + }); +}); + +it("#02. should success when get Accepting Order Monitoring", function (done) { + manager.getAcceptedOrderMonitoring(queryAcceptingOrderMonitoring) + .then((data) => { + data.should.instanceof(Array); + dummyAcceptingOrderMonitoringResult.data = data; + done(); + }) + .catch((e) => { + done(e); + }); +}); + +it("#03. should success when get Accepting Order Monitoring XLS", function (done) { + manager.getAcceptedOrderMonitoringXls(dummyAcceptingOrderMonitoringResult, queryAcceptingOrderMonitoring) + .then((xls) => { + xls.should.instanceof(Object); + xls.should.have.property('data'); + xls.should.have.property('options'); + xls.should.have.property('name'); + done(); + }) + .catch((e) => { + done(e); + }); +}); + +it('#04. should success when destroy data with id', function(done) { + manager.destroy(dummyDataId) + .then((result) => { + result.should.be.Boolean(); + result.should.equal(true); + done(); + }) + .catch((e) => { + done(e); + }); +}); + +it('#05. should null when get destroyed data', function(done) { + manager.getSingleByIdOrDefault(dummyDataId) + .then((data) => { + should.equal(data, null); + done(); + }) + .catch((e) => { + done(e); + }); +}); + +it(`#06. should success when remove all data`, function(done) { + manager.collection.remove({}) + .then((result) => { + done(); + }) + .catch((e) => { + done(e); + }); +}); + diff --git a/test/sp-master-plan/sewing-blocking-plan/basic.js b/test/sp-master-plan/sewing-blocking-plan/basic.js new file mode 100644 index 000000000..d8e66d6cb --- /dev/null +++ b/test/sp-master-plan/sewing-blocking-plan/basic.js @@ -0,0 +1,11 @@ +var options = { + manager: require("../../../src/managers/garment-master-plan/sewing-blocking-plan-manager"), + model: require("dl-models").garmentMasterPlan.SewingBlockingPlan, + util: require("../../data-util/garment-master-plan/sewing-blocking-plan-data-util"), + validator: require("dl-models").validator.garmentMasterPlan.sewingBlockingPlan, + createDuplicate: false, + keys:[] +}; + +var basicTest = require("../../basic-test-factory"); +basicTest(options); \ No newline at end of file diff --git a/test/sp-master-plan/sewing-blocking-plan/index.js b/test/sp-master-plan/sewing-blocking-plan/index.js new file mode 100644 index 000000000..e27d642c1 --- /dev/null +++ b/test/sp-master-plan/sewing-blocking-plan/index.js @@ -0,0 +1,13 @@ +describe("BASIC CRUD SCENARIOS", function() { + require("./basic"); +}); + +describe("VALIDATION SCENARIOS", function() { + require("./validate"); +}); +describe("REPORT SCENARIOS", function() { + require("./report"); +}); +describe("ACCEPTING ORDER MONITORING SCENARIOS", function() { + require("./accepting-order-monitoring"); +}); \ No newline at end of file diff --git a/test/sp-master-plan/sewing-blocking-plan/report.js b/test/sp-master-plan/sewing-blocking-plan/report.js new file mode 100644 index 000000000..b41c037a6 --- /dev/null +++ b/test/sp-master-plan/sewing-blocking-plan/report.js @@ -0,0 +1,92 @@ +'use strict'; + +var ObjectId = require("mongodb").ObjectId; +var should = require('should'); +var helper = require("../../helper"); +var Manager = require("../../../src/managers/garment-master-plan/sewing-blocking-plan-manager"); +var manager = null; +var dataUtil = require("../../data-util/garment-master-plan/sewing-blocking-plan-data-util"); +var validate = require("dl-models").validator.garmentMasterPlan.sewingBlockingPlan; +require("should"); + +before('#00. connect db', function (done) { + helper.getDb() + .then(db => { + manager = new Manager(db, { + username: 'unit-test' + }); + done(); + }) + .catch(e => { + done(e); + }) +}); + +var dummyData; +var dummyDataId; +var queryReport = {}; +var dummyReportResult = {}; + +it(`#01. should success when get created new data`, function (done) { + dataUtil.getNewData() + .then((data) => { + manager.create(data) + .then((id) => { + dummyDataId = id; + dummyData = data; + queryReport.year = dummyData.details[0].weeklyPlanYear; + queryReport.unit = dummyData.details[0].unit.code; + done(); + }) + .catch((e) => { + done(e); + }); + }) + .catch((e) => { + done(e); + }); +}); + +it("#02. should success when get report with parameter year", function (done) { + manager.getReport({ "year": queryReport.year }) + .then((data) => { + data.should.instanceof(Array); + done(); + }) + .catch((e) => { + done(e); + }); +}); + +it("#03. should success when get report with parameter year and unit", function (done) { + manager.getReport(queryReport) + .then((data) => { + data.should.instanceof(Array); + dummyReportResult.data = data; + done(); + }) + .catch((e) => { + done(e); + }); +}); + +it("#04. should success when get report with parameter year and unit", function (done) { + manager.getXls(dummyReportResult, queryReport) + .then((data) => { + data.should.instanceof(Object); + done(); + }) + .catch((e) => { + done(e); + }); +}); + +it(`#99. should success when remove all data`, function(done) { + manager.collection.remove({}) + .then((result) => { + done(); + }) + .catch((e) => { + done(e); + }); +}); \ No newline at end of file diff --git a/test/sp-master-plan/sewing-blocking-plan/validate.js b/test/sp-master-plan/sewing-blocking-plan/validate.js new file mode 100644 index 000000000..46a4b4a1a --- /dev/null +++ b/test/sp-master-plan/sewing-blocking-plan/validate.js @@ -0,0 +1,443 @@ +'use strict'; + +var ObjectId = require("mongodb").ObjectId; +var should = require('should'); +var helper = require("../../helper"); +var Manager = require("../../../src/managers/garment-master-plan/sewing-blocking-plan-manager"); +var manager = null; +var dataUtil =require("../../data-util/garment-master-plan/sewing-blocking-plan-data-util"); +var validate = require("dl-models").validator.garmentMasterPlan.sewingBlockingPlan; + +var moment = require('moment'); + +before('#00. connect db', function (done) { + helper.getDb() + .then(db => { + manager = new Manager(db, { + username: 'unit-test' + }); + done(); + }) + .catch(e => { + done(e); + }) +}); + +it("#01. should error when create new data with not exsist booking order", function (done) { + dataUtil.getNewData() + .then((data) => { + data.bookingOrderId = "bookingOrderId"; + manager.create(data) + .then((id) => { + done("should error when create new data with not exsist booking order"); + }) + .catch((e) => { + e.name.should.equal("ValidationError"); + e.should.have.property("errors"); + e.errors.should.instanceof(Object); + e.errors.should.have.property("bookingOrderNo"); + done(); + }); + }) + .catch((e) => { + done(e); + }); +}); + +it("#02. should error when create new data with no detail", function (done) { + dataUtil.getNewData() + .then((data) => { + data.details = []; + manager.create(data) + .then((id) => { + done("should error when create new data with no detail"); + }) + .catch((e) => { + e.name.should.equal("ValidationError"); + e.should.have.property("errors"); + e.errors.should.instanceof(Object); + e.errors.should.have.property("detail"); + done(); + }); + }) + .catch((e) => { + done(e); + }); +}); + +it("#03. should error when create new data with comodity not exist", function (done) { + dataUtil.getNewData() + .then((data) => { + var details = []; + for(var detail of data.details){ + detail.masterPlanComodityId = "masterPlanComodityId"; + detail.masterPlanComodity._id = "masterPlanComodityId"; + details.push(detail); + } + data.details = details; + manager.create(data) + .then((id) => { + done("should error when create new data with comodity not exist"); + }) + .catch((e) => { + e.name.should.equal("ValidationError"); + e.should.have.property("errors"); + e.errors.should.instanceof(Object); + e.errors.should.have.property("details"); + e.errors.details.should.instanceOf(Array); + for(var error of e.errors.details){ + error.should.instanceof(Object); + error.should.have.property("masterPlanComodity"); + } + done(); + }); + }) + .catch((e) => { + done(e); + }); +}); + +it("#04. should error when create new data with confirmed and no comodity data", function (done) { + dataUtil.getNewData() + .then((data) => { + delete data.details[0].masterPlanComodityId; + manager.create(data) + .then((id) => { + done("should error when create new data with confirmed and no comodity data"); + }) + .catch((e) => { + e.name.should.equal("ValidationError"); + e.should.have.property("errors"); + e.errors.should.instanceof(Object); + e.errors.should.have.property("details"); + e.errors.details.should.instanceOf(Array); + e.errors.details[0].should.instanceof(Object); + e.errors.details[0].should.have.property("masterPlanComodity"); + done(); + }); + }) + .catch((e) => { + done(e); + }); +}); + +it("#05. should error when create new data with 0 value on shSewing and quantity", function (done) { + dataUtil.getNewData() + .then((data) => { + //data.details[0].shCutting = 0; + data.details[0].shSewing = 0; + //data.details[0].shFinishing = 0; + data.details[0].quantity = 0; + manager.create(data) + .then((id) => { + done("should error when create new data with 0 value on shSewing and quantity"); + }) + .catch((e) => { + e.name.should.equal("ValidationError"); + e.should.have.property("errors"); + e.errors.should.instanceof(Object); + e.errors.should.have.property("details"); + e.errors.details.should.instanceOf(Array); + // e.errors.details[0].should.have.property("shCutting"); + e.errors.details[0].should.have.property("shSewing"); + // e.errors.details[0].should.have.property("shFinishing"); + e.errors.details[0].should.have.property("quantity"); + done(); + }); + }) + .catch((e) => { + done(e); + }); +}); + +// it("#06. should error when create new data with quantity master plan more than quantity booking", function (done) { +// dataUtil.getNewData() +// .then((data) => { +// data.details[0].quantity = 1000; +// manager.create(data) +// .then((id) => { +// done("should error when create new data with quantity master plan more than quantity booking"); +// }) +// .catch((e) => { +// e.name.should.equal("ValidationError"); +// e.should.have.property("errors"); +// e.errors.should.instanceof(Object); +// e.errors.should.have.property("detail"); +// done(); +// }); +// }) +// .catch((e) => { +// done(e); +// }); +// }); + +it("#07. should error when create new data with no data unit (1)", function (done) { + dataUtil.getNewData() + .then((data) => { + data.details[0].unitId = ""; + data.details[1].unitId = "unitId"; + manager.create(data) + .then((id) => { + done("should error when create new data with no data unit (1)"); + }) + .catch((e) => { + e.name.should.equal("ValidationError"); + e.should.have.property("errors"); + e.errors.should.instanceof(Object); + e.errors.should.have.property("details"); + e.errors.details.should.instanceOf(Array); + e.errors.details[0].should.instanceof(Object); + e.errors.details[1].should.instanceof(Object); + e.errors.details[0].should.have.property("unit"); + e.errors.details[1].should.have.property("unit"); + done(); + }); + }) + .catch((e) => { + done(e); + }); +}); + +it("#08. should error when create new data with no data unit (2)", function (done) { + dataUtil.getNewData() + .then((data) => { + data.details[0].unitId = "unitId"; + manager.create(data) + .then((id) => { + done("should error when create new data with no data unit (2)"); + }) + .catch((e) => { + e.name.should.equal("ValidationError"); + e.should.have.property("errors"); + e.errors.should.instanceof(Object); + e.errors.should.have.property("details"); + e.errors.details.should.instanceOf(Array); + e.errors.details[0].should.instanceof(Object); + e.errors.details[0].should.have.property("unit"); + done(); + }); + }) + .catch((e) => { + done(e); + }); +}); + +it("#09. should error when create new data with no data year (1)", function (done) { + dataUtil.getNewData() + .then((data) => { + data.details[0].weeklyPlanYear = 0; + data.details[1].weeklyPlanYear = 1000; + manager.create(data) + .then((id) => { + done("should error when create new data with no data year (1)"); + }) + .catch((e) => { + e.name.should.equal("ValidationError"); + e.should.have.property("errors"); + e.errors.should.instanceof(Object); + e.errors.should.have.property("details"); + e.errors.details.should.instanceOf(Array); + e.errors.details[0].should.instanceof(Object); + e.errors.details[1].should.instanceof(Object); + e.errors.details[0].should.have.property("weeklyPlanYear"); + e.errors.details[1].should.have.property("weeklyPlanYear"); + done(); + }); + }) + .catch((e) => { + done(e); + }); +}); + +it("#10. should error when create new data with no data year (2)", function (done) { + dataUtil.getNewData() + .then((data) => { + data.details[0].weeklyPlanId = "weeklyPlanId"; + manager.create(data) + .then((id) => { + done("should error when create new data with no data year (2)"); + }) + .catch((e) => { + e.name.should.equal("ValidationError"); + e.should.have.property("errors"); + e.errors.should.instanceof(Object); + e.errors.should.have.property("details"); + e.errors.details.should.instanceOf(Array); + e.errors.details[0].should.instanceof(Object); + e.errors.details[0].should.have.property("weeklyPlanYear"); + done(); + }); + }) + .catch((e) => { + done(e); + }); +}); + +it("#11. should error when create new data with no data week", function (done) { + dataUtil.getNewData() + .then((data) => { + delete data.details[0].week; + data.details[1].week.month = 12; + manager.create(data) + .then((id) => { + done("should error when create new data with no data week"); + }) + .catch((e) => { + e.name.should.equal("ValidationError"); + e.should.have.property("errors"); + e.errors.should.instanceof(Object); + e.errors.should.have.property("details"); + e.errors.details.should.instanceOf(Array); + e.errors.details[0].should.instanceof(Object); + e.errors.details[1].should.instanceof(Object); + e.errors.details[0].should.have.property("week"); + e.errors.details[1].should.have.property("week"); + done(); + }); + }) + .catch((e) => { + done(e); + }); +}); + +it("#12. should error when create new data with no detail delivery date", function (done) { + dataUtil.getNewData() + .then((data) => { + delete data.details[0].deliveryDate; + manager.create(data) + .then((id) => { + done("should error when create new data with no detail delivery date"); + }) + .catch((e) => { + e.name.should.equal("ValidationError"); + e.should.have.property("errors"); + e.errors.should.instanceof(Object); + e.errors.should.have.property("details"); + e.errors.details.should.instanceOf(Array); + done(); + }); + }) + .catch((e) => { + done(e); + }); +}); + +it("#13. should error when create new data with detail delivery date < data booking date", function (done) { + dataUtil.getNewData() + .then((data) => { + var targetDate=new Date(data.bookingDate); + data.details[0].deliveryDate=new Date(targetDate.setDate(targetDate.getDate() - 5)); + manager.create(data) + .then((id) => { + done("should error when create new data with detail delivery date < data booking date"); + }) + .catch((e) => { + e.name.should.equal("ValidationError"); + e.should.have.property("errors"); + e.errors.should.instanceof(Object); + e.errors.should.have.property("details"); + e.errors.details.should.instanceOf(Array); + done(); + }); + }) + .catch((e) => { + done(e); + }); +}); + +it("#14. should error when create new data with detail delivery date > data delivery date", function (done) { + dataUtil.getNewData() + .then((data) => { + var targetDate=new Date(data.deliveryDate); + data.details[0].deliveryDate=new Date(targetDate.setDate(targetDate.getDate() + 5)); + manager.create(data) + .then((id) => { + done("should error when create new data with detail delivery date > data delivery date"); + }) + .catch((e) => { + e.name.should.equal("ValidationError"); + e.should.have.property("errors"); + e.errors.should.instanceof(Object); + e.errors.should.have.property("details"); + e.errors.details.should.instanceOf(Array); + done(); + }); + }) + .catch((e) => { + done(e); + }); +}); + +var newData; +var createdId; +it("#15. should success when create new data", function (done) { + dataUtil.getNewData() + .then((data) => { + newData = data; + manager.create(data) + .then((id) => { + createdId = id; + done(); + }) + .catch((e) => { + done(e); + }); + }) + .catch((e) => { + done(e); + }); +}); + +it("#16. should success when search data with filter", function (done) { + manager.read({ + keyword: newData.bookingOrderNo + }) + .then((documents) => { + //process documents + documents.should.have.property("data"); + documents.data.should.be.instanceof(Array); + documents.data.length.should.not.equal(0); + done(); + }) + .catch((e) => { + done(e); + }); +}); + +// it("#17. should success when get preview", function (done) { +// manager.getPreview(newData.details[0].week.month, newData.details[0].weeklyPlanYear) +// .then((documents) => { +// documents.should.be.instanceof(Array); +// documents.length.should.not.equal(0); +// done(); +// }) +// .catch((e) => { +// done(e); +// }); +// }); + +it("#18. should error when create new data with same booking order", function (done) { + manager.create(newData) + .then((id) => { + done("should error when create new data with same booking order"); + }) + .catch((e) => { + e.name.should.equal("ValidationError"); + e.should.have.property("errors"); + e.errors.should.instanceof(Object); + e.errors.should.have.property("bookingOrderNo"); + done(); + }); +}); + +it("#19. should success when destroy data with id", function (done) { + manager.destroy(createdId) + .then((result) => { + result.should.be.Boolean(); + result.should.equal(true); + done(); + }) + .catch((e) => { + done(e); + }); +}); \ No newline at end of file diff --git a/test/sp-master-plan/standard-capacity/basic.js b/test/sp-master-plan/standard-capacity/basic.js new file mode 100644 index 000000000..18d26a707 --- /dev/null +++ b/test/sp-master-plan/standard-capacity/basic.js @@ -0,0 +1,11 @@ +var options = { + manager: require("../../../src/managers/sp-master-plan/standard-capacity-manager"), + model: require("dl-models").spMasterPlan.StandardCapacity, + util: require("../../data-util/sp-master-plan/standard-capacity-data-util"), + validator: require("dl-models").validator.spMasterPlan.standardCapacity, + createDuplicate: false, + keys:[] +}; + +var basicTest = require("../../basic-test-factory"); +basicTest(options); \ No newline at end of file diff --git a/test/sp-master-plan/standard-capacity/get-scenario.js b/test/sp-master-plan/standard-capacity/get-scenario.js new file mode 100644 index 000000000..579921b40 --- /dev/null +++ b/test/sp-master-plan/standard-capacity/get-scenario.js @@ -0,0 +1,256 @@ +'use strict'; + +var ObjectId = require("mongodb").ObjectId; +var should = require('should'); +var helper = require("../../helper"); +var Manager = require("../../../src/managers/sp-master-plan/standard-capacity-manager"); +var manager = null; +var dataUtil = require("../../data-util/sp-master-plan/standard-capacity-data-util"); +var validate = require("dl-models").validator.spMasterPlan.standardCapacity; +var moment = require('moment'); + + +// var StyleManager = require("../../../src/managers/sp-master-plan/style-manager"); +// var styleManager = null; +// var StyledataUtil = require("../../data-util/sp-master-plan/style-data-util"); + +var BuyerManager = require("../../../src/managers/master/buyer-manager"); +var buyerManager = null; +var BuyerdataUtil = require("../../data-util/master/buyer-data-util"); + +var ComodityManager = require("../../../src/managers/sp-master-plan/master-plan-comodity-manager"); +var comodityManager = null; +var ComoditydataUtil = require("../../data-util/sp-master-plan//master-plan-comodity-data-util"); + +var validateStyle = require("dl-models").validator.spMasterPlan.style; + +before('#00. connect db', function (done) { + helper.getDb() + .then(db => { + manager = new Manager(db, { + username: 'unit-test' + }); + + // styleManager = new StyleManager(db, { + // username: 'unit-test' + // }); + + buyerManager = new BuyerManager(db, { + username: 'unit-test' + }); + + comodityManager = new ComodityManager(db, { + username: 'unit-test' + }); + + done(); + }) + .catch(e => { + done(e); + }); +}); + +// var createdDataStyle; +// var createdIdStyle; + +// it(`#01. should success when get created new data style`, function (done) { +// StyledataUtil.getNewData() +// .then((data) => createdDataStyle=data) +// .then((data) => styleManager.create(data)) +// .then((id) => { +// id.should.be.Object(); +// createdIdStyle = id; +// done(); +// }) +// .catch((e) => { +// done(e); +// }); +// }); + +// var createdDataBuyer; +// var createdIdBuyer; + +// it(`#01. should success when get created new data buyer`, function (done) { +// BuyerdataUtil.getNewData() +// .then((data) => createdDataBuyer=data) +// .then((data) => buyerManager.create(data)) +// .then((id) => { +// id.should.be.Object(); +// createdIdBuyer = id; +// done(); +// }) +// .catch((e) => { +// done(e); +// }); +// }); + +// var createdDataComodity; +// var createdIdComodity; + +// it(`#02. should success when get created new data comodity`, function (done) { +// ComoditydataUtil.getNewData() +// .then((data) => createdDataComodity=data) +// .then((data) => comodityManager.create(data)) +// .then((id) => { +// id.should.be.Object(); +// createdIdComodity = id; +// done(); +// }) +// .catch((e) => { +// done(e); +// }); +// }); + +var createdData; +var createdId; +// it(`#02. should success when create new data`, function (done) { +// dataUtil.getNewData() +// .then((data) => { +// data.styleId = createdIdStyle; +// data.style=createdDataStyle; +// createdData=data; +// manager.create(data) +// .then((id) => { +// id.should.be.Object(); +// createdId = id; +// done(); +// }) +// .catch((e) => { +// done(e); +// }); +// }); +// }); + +it(`#01. should success when create new data`, function (done) { + dataUtil.getNewData() + .then((data) => { + // data.buyerId = createdIdBuyer; + // data.buyer=createdDataBuyer; + // data.comodityId = createdIdComodity; + // data.comodity=createdDataComodity; + createdData=data; + manager.create(data) + .then((id) => { + id.should.be.Object(); + createdId = id; + done(); + }) + .catch((e) => { + done(e); + }); +}); +}); + +it(`#02. should success when get sc by filter from created data`, function (done) { + var buyerCode=createdData.buyerCode; + var comodityCode=createdData.masterplanComodityCode + manager.getStandardCapacityByBuyerComodity(buyerCode, comodityCode).then( + sc => { + sc.should.instanceof(Array); + done(); + }).catch(e => { + done(e); + }); +}); + +it(`#03. should success when destroy data with id`, function(done) { + manager.destroy(createdId) + .then((result) => { + result.should.be.Boolean(); + result.should.equal(true); + done(); + }) + .catch((e) => { + done(e); + }); +}); + +it(`#04. should null when get destroyed data`, function(done) { + manager.getSingleByIdOrDefault(createdId) + .then((data) => { + should.equal(data, null); + done(); + }) + .catch((e) => { + done(e); + }); +}); + +// it(`#06. should success when destroy style data with id`, function(done) { +// styleManager.destroy(createdIdStyle) +// .then((result) => { +// result.should.be.Boolean(); +// result.should.equal(true); +// done(); +// }) +// .catch((e) => { +// done(e); +// }); +// }); + +it(`#05. should success when destroy buyer data with id`, function(done) { + buyerManager.destroy(createdData.buyerId) + .then((result) => { + result.should.be.Boolean(); + result.should.equal(true); + done(); + }) + .catch((e) => { + done(e); + }); +}); + +it(`#06. should success when destroy comodity data with id`, function(done) { + comodityManager.destroy(createdData.masterplanComodityId) + .then((result) => { + result.should.be.Boolean(); + result.should.equal(true); + done(); + }) + .catch((e) => { + done(e); + }); +}); + +// it(`#07. should null when get destroyed style data`, function(done) { +// styleManager.getSingleByIdOrDefault(createdIdStyle) +// .then((data) => { +// should.equal(data, null); +// done(); +// }) +// .catch((e) => { +// done(e); +// }); +// }); + +it(`#07. should null when get destroyed buyer data`, function(done) { + buyerManager.getSingleByIdOrDefault(createdData.buyerId) + .then((data) => { + should.equal(data, null); + done(); + }) + .catch((e) => { + done(e); + }); +}); + +it(`#08. should null when get destroyed comodity data`, function(done) { + comodityManager.getSingleByIdOrDefault(createdData.masterplanComodityId) + .then((data) => { + should.equal(data, null); + done(); + }) + .catch((e) => { + done(e); + }); +}); + +it(`#09. should success when remove all data`, function(done) { + manager.collection.remove({}) + .then((result) => { + done(); + }) + .catch((e) => { + done(e); + }); +}); \ No newline at end of file diff --git a/test/sp-master-plan/standard-capacity/index.js b/test/sp-master-plan/standard-capacity/index.js new file mode 100644 index 000000000..a27ff5279 --- /dev/null +++ b/test/sp-master-plan/standard-capacity/index.js @@ -0,0 +1,12 @@ + +describe("GET SCENARIOS", function() { + require("./get-scenario"); +}); + +describe("BASIC CRUD SCENARIOS", function() { + require("./basic"); +}); + +describe("VALIDATION SCENARIOS", function() { + require("./validate"); +}); diff --git a/test/sp-master-plan/standard-capacity/validate.js b/test/sp-master-plan/standard-capacity/validate.js new file mode 100644 index 000000000..bd9d7e63e --- /dev/null +++ b/test/sp-master-plan/standard-capacity/validate.js @@ -0,0 +1,289 @@ +'use strict'; + +var ObjectId = require("mongodb").ObjectId; +var should = require('should'); +var helper = require("../../helper"); +var Manager = require("../../../src/managers/sp-master-plan/standard-capacity-manager"); +var manager = null; +var dataUtil = require("../../data-util/sp-master-plan/standard-capacity-data-util"); +var validate = require("dl-models").validator.spMasterPlan.standardCapacity; +var moment = require('moment'); + +before('#00. connect db', function (done) { + helper.getDb() + .then(db => { + manager = new Manager(db, { + username: 'unit-test' + }); + done(); + }) + .catch(e => { + done(e); + }) +}); + +it("#01. should error when create new data with empty data", function (done) { + manager.create({}) + .then((id) => { + done("should error when create new data with empty data"); + }) + .catch((e) => { + e.name.should.equal("ValidationError"); + e.should.have.property("errors"); + e.errors.should.instanceof(Object); + done(); + }); +}); + +// it("#02. should error when create new data with no data Style", function (done) { +// dataUtil.getNewData() +// .then((data) => { +// data.styleId = "styleId"; +// manager.create(data) +// .then((id) => { +// done("should error when create new data with no data Style"); +// }) +// .catch((e) => { +// e.name.should.equal("ValidationError"); +// e.should.have.property("errors"); +// e.errors.should.instanceof(Object); +// e.errors.should.have.property("style"); +// done(); +// }); +// }) +// .catch((e) => { +// done(e); +// }); +// }); + +it("#02. should error when create new data with no data Buyer", function (done) { + dataUtil.getNewData() + .then((data) => { + data.buyerId = ""; + manager.create(data) + .then((id) => { + done("should error when create new data with no data Buyer"); + }) + .catch((e) => { + e.name.should.equal("ValidationError"); + e.should.have.property("errors"); + e.errors.should.instanceof(Object); + e.errors.should.have.property("buyer"); + done(); + }); + }) + .catch((e) => { + done(e); + }); +}); + +it("#03. should error when create new data with no data Comodity", function (done) { + dataUtil.getNewData() + .then((data) => { + data.masterplanComodityId = ""; + manager.create(data) + .then((id) => { + done("should error when create new data with no data Comodity"); + }) + .catch((e) => { + e.name.should.equal("ValidationError"); + e.should.have.property("errors"); + e.errors.should.instanceof(Object); + e.errors.should.have.property("comodity"); + done(); + }); + }) + .catch((e) => { + done(e); + }); +}); + +// it("#03. should error when create new data with SH Cutting 0, SH Sewing 0, SH Finishing 0", function (done) { +// dataUtil.getNewData() +// .then((data) => { +// data.shCutting = 0; +// data.shSewing = 0; +// data.shFinishing = 0; +// manager.create(data) +// .then((id) => { +// done("should error when create new data with no data Style"); +// }) +// .catch((e) => { +// e.name.should.equal("ValidationError"); +// e.should.have.property("errors"); +// e.errors.should.instanceof(Object); +// e.errors.should.have.property("shCutting"); +// e.errors.should.have.property("shSewing"); +// e.errors.should.have.property("shFinishing"); +// done(); +// }); +// }) +// .catch((e) => { +// done(e); +// }); +// }); + +it("#04. should error when create new data with SH Cutting 0, SH Sewing 0, SH Finishing 0", function (done) { + dataUtil.getNewData() + .then((data) => { + // data.shCutting = 0; + // data.shSewing = 0; + data.scSpinning = 0; + manager.create(data) + .then((id) => { + done("should error when create new data with no data Buyer & Comodity"); + }) + .catch((e) => { + e.name.should.equal("ValidationError"); + e.should.have.property("errors"); + e.errors.should.instanceof(Object); + // e.errors.should.have.property("shCutting"); + // e.errors.should.have.property("shSewing"); + e.errors.should.have.property("scSpinning"); + done(); + }); + }) + .catch((e) => { + done(e); + }); +}); + +// it("#05. should error when create new data with date greater than today", function (done) { +// dataUtil.getNewData() +// .then((data) => { +// var dateAfter = new Date(); +// dateAfter = new Date(dateAfter.setDate(dateAfter.getDate() + 2)); +// data.date = `${dateAfter.getFullYear()}-${(dateAfter.getMonth() + 1)}-${dateAfter.getDate()}`; +// manager.create(data) +// .then((id) => { +// done("should error when create new data with date greater than today"); +// }) +// .catch((e) => { +// e.name.should.equal("ValidationError"); +// e.should.have.property("errors"); +// e.errors.should.instanceof(Object); +// e.errors.should.have.property("date"); +// done(); +// }); +// }) +// .catch((e) => { +// done(e); +// }); +// }); + +var createdId; +var createdData; +it("#05. should success when create new data", function (done) { + dataUtil.getNewData() + .then((data) => { + createdData=data; + manager.create(data) + .then((id) => { + createdId = id; + done(); + }) + .catch((e) => { + done(e); + }); + }) + .catch((e) => { + done(e); + }); +}); + +it("#06. should success when search data with filter", function (done) { + manager.read({ + keyword: createdData.buyerName + }) + .then((documents) => { + //process documents + documents.should.have.property("data"); + documents.data.should.be.instanceof(Array); + documents.data.length.should.not.equal(0); + done(); + }) + .catch((e) => { + done(e); + }); +}); + +// it("#06. should error when create new data with date greater date data last save", function (done) { +// dataUtil.getNewData() +// .then((data) => { +// var dateAfter = new Date(); +// dateAfter = new Date(dateAfter.setDate(dateAfter.getDate() - 2)); +// data.date = `${dateAfter.getFullYear()}-${(dateAfter.getMonth() + 1)}-${dateAfter.getDate()}`; +// manager.create(data) +// .then((id) => { +// done("should error when create new data with no data Style"); +// }) +// .catch((e) => { +// e.name.should.equal("ValidationError"); +// e.should.have.property("errors"); +// e.errors.should.instanceof(Object); +// e.errors.should.have.property("date"); +// done(); +// }); +// }) +// .catch((e) => { +// done(e); +// }); +// }); + +// it("#07. should error when create new data with date greater date data last save", function (done) { +// dataUtil.getNewData() +// .then((data) => { +// data.buyerId=createdData.buyerId; +// data.masterplanComodityId=createdData.masterplanComodityId; +// var dateAfter = new Date(); +// dateAfter = new Date(dateAfter.setDate(dateAfter.getDate() - 2)); +// data.date = `${dateAfter.getFullYear()}-${(dateAfter.getMonth() + 1)}-${dateAfter.getDate()}`; +// manager.create(data) +// .then((id) => { +// done("should error when create new data with no data Buyer & Comodity"); +// }) +// .catch((e) => { +// e.name.should.equal("ValidationError"); +// e.should.have.property("errors"); +// e.errors.should.instanceof(Object); +// e.errors.should.have.property("date"); +// done(); +// }); +// }) +// .catch((e) => { +// done(e); +// }); +// }); + +it("#07. should success when destroy data with id", function (done) { + manager.destroy(createdId) + .then((result) => { + result.should.be.Boolean(); + result.should.equal(true); + done(); + }) + .catch((e) => { + done(e); + }); +}); + +it(`#08. should null when get destroyed data`, function (done) { + manager.getSingleByIdOrDefault(createdId) + .then((data) => { + should.equal(data, null); + done(); + }) + .catch((e) => { + done(e); + }); +}); + +it(`#09. should success when remove all data`, function(done) { + manager.collection.remove({}) + .then((result) => { + done(); + }) + .catch((e) => { + done(e); + }); +}); \ No newline at end of file diff --git a/test/sp-master-plan/style/basic.js b/test/sp-master-plan/style/basic.js new file mode 100644 index 000000000..937561d28 --- /dev/null +++ b/test/sp-master-plan/style/basic.js @@ -0,0 +1,11 @@ +var options = { + manager: require("../../../src/managers/garment-master-plan/style-manager"), + model: require("dl-models").garmentMasterPlan.Style, + util: require("../../data-util/garment-master-plan/style-data-util"), + validator: require("dl-models").validator.garmentMasterPlan.style, + createDuplicate: true, + keys:['code'] +}; + +var basicTest = require("../../basic-test-factory"); +basicTest(options); \ No newline at end of file diff --git a/test/sp-master-plan/style/index.js b/test/sp-master-plan/style/index.js new file mode 100644 index 000000000..48b2ce746 --- /dev/null +++ b/test/sp-master-plan/style/index.js @@ -0,0 +1,3 @@ +describe("BASIC CRUD SCENARIOS", function() { + require("./basic"); +}); \ No newline at end of file diff --git a/test/sp-master-plan/weekly-plan/basic.js b/test/sp-master-plan/weekly-plan/basic.js new file mode 100644 index 000000000..a7a20c088 --- /dev/null +++ b/test/sp-master-plan/weekly-plan/basic.js @@ -0,0 +1,11 @@ +var options = { + manager: require("../../../src/managers/garment-master-plan/weekly-plan-manager"), + model: require("dl-models").garmentMasterPlan.WeeklyPlan, + util: require("../../data-util/garment-master-plan/weekly-plan-data-util"), + validator: require("dl-models").validator.garmentMasterPlan.weeklyPlan, + createDuplicate: false, + keys:[] +}; + +var basicTest = require("../../basic-test-factory"); +basicTest(options); \ No newline at end of file diff --git a/test/sp-master-plan/weekly-plan/get-scenario.js b/test/sp-master-plan/weekly-plan/get-scenario.js new file mode 100644 index 000000000..b14c628a1 --- /dev/null +++ b/test/sp-master-plan/weekly-plan/get-scenario.js @@ -0,0 +1,177 @@ +'use strict'; + +var ObjectId = require("mongodb").ObjectId; +var should = require('should'); +var helper = require("../../helper"); +var Manager = require("../../../src/managers/garment-master-plan/weekly-plan-manager"); +var manager = null; +var dataUtil = require("../../data-util/garment-master-plan/weekly-plan-data-util"); +var validate = require("dl-models").validator.garmentMasterPlan.weeklyPlan; +var moment = require('moment'); + + +var UnitManager = require("../../../src/managers/master/unit-manager"); +var unitManager = null; +var UnitdataUtil = require("../../data-util/master/unit-data-util"); +var validateUnit = require("dl-models").validator.master.unit; + +before('#00. connect db', function (done) { + helper.getDb() + .then(db => { + manager = new Manager(db, { + username: 'unit-test' + }); + + unitManager = new UnitManager(db, { + username: 'unit-test' + }); + + done(); + }) + .catch(e => { + done(e); + }); +}); + +var createdDataUnit; +var createdIdUnit; +it(`#01. should success when get created new data unit`, function (done) { + UnitdataUtil.getNewData() + .then((data) => createdDataUnit=data) + .then((data) => unitManager.create(data)) + .then((id) => { + id.should.be.Object(); + createdIdUnit = id; + done(); + }) + .catch((e) => { + done(e); + }); +}); + +var createdData; +var createdId; +it(`#02. should success when create new data`, function (done) { + dataUtil.getNewData() + .then((data) => { + data.unitId = createdIdUnit; + data.unit=createdDataUnit; + createdData=data; + manager.create(data) + .then((id) => { + id.should.be.Object(); + createdId = id; + done(); + }) + .catch((e) => { + done(e); + }); +}); +}); + +it(`#03. should success when get week by filter from created data`, function (done) { + var key=createdData.name; + var filter={}; + filter.year=createdData.year; + filter.unit=createdData.unit.code; + manager.getWeek(key,filter).then( + week => { + week.should.instanceof(Array); + done(); + }).catch(e => { + done(e); + }); +}); + +it(`#03-1. should success when get week by filter from created data`, function (done) { + var key=createdData.name; + var filter={}; + filter.year=createdData.year; + filter.unit=createdData.unit.code; + filter.weekNumber=createdData.items[1].weekNumber; + manager.getWeek(key,filter).then( + week => { + week.should.instanceof(Array); + done(); + }).catch(e => { + done(e); + }); +}); + +it("#03-2. should success when get year with keyword", function (done) { + manager.getYear(createdData.year) + .then((data) => { + data.should.instanceof(Array); + done(); + }) + .catch((e) => { + done(e); + }); +}); + +it("#03-3. should success when get unit with keyword and filter", function (done) { + manager.getUnit(createdData.unit.code, {'year' : createdData.year}) + .then((data) => { + data.should.instanceof(Array); + done(); + }) + .catch((e) => { + done(e); + }); +}); + +it(`#04. should success when destroy data with id`, function(done) { + manager.destroy(createdId) + .then((result) => { + result.should.be.Boolean(); + result.should.equal(true); + done(); + }) + .catch((e) => { + done(e); + }); +}); + +it(`#05. should null when get destroyed data`, function(done) { + manager.getSingleByIdOrDefault(createdId) + .then((data) => { + should.equal(data, null); + done(); + }) + .catch((e) => { + done(e); + }); +}); + +it(`#06. should success when destroy unit data with id`, function(done) { + unitManager.destroy(createdIdUnit) + .then((result) => { + result.should.be.Boolean(); + result.should.equal(true); + done(); + }) + .catch((e) => { + done(e); + }); +}); + +it(`#07. should null when get destroyed unit data`, function(done) { + unitManager.getSingleByIdOrDefault(createdIdUnit) + .then((data) => { + should.equal(data, null); + done(); + }) + .catch((e) => { + done(e); + }); +}); + +it(`#08. should success when remove all data`, function(done) { + manager.collection.remove({}) + .then((result) => { + done(); + }) + .catch((e) => { + done(e); + }); +}); \ No newline at end of file diff --git a/test/sp-master-plan/weekly-plan/index.js b/test/sp-master-plan/weekly-plan/index.js new file mode 100644 index 000000000..fbe8f9c68 --- /dev/null +++ b/test/sp-master-plan/weekly-plan/index.js @@ -0,0 +1,16 @@ +describe("GET SCENARIOS", function() { + require("./get-scenario"); +}); + +describe("BASIC CRUD SCENARIOS", function() { + require("./basic"); +}); + +describe("VALIDATE SCENARIOS", function() { + require("./validate"); +}); + +describe("MONITORING SCENARIOS", function() { + require("./monitoring"); +}); + diff --git a/test/sp-master-plan/weekly-plan/monitoring.js b/test/sp-master-plan/weekly-plan/monitoring.js new file mode 100644 index 000000000..5a6641732 --- /dev/null +++ b/test/sp-master-plan/weekly-plan/monitoring.js @@ -0,0 +1,109 @@ +'use strict'; + +var ObjectId = require("mongodb").ObjectId; +var should = require('should'); +var helper = require("../../helper"); +var Manager = require("../../../src/managers/garment-master-plan/weekly-plan-manager"); +var manager = null; +var dataUtil = require("../../data-util/garment-master-plan/weekly-plan-data-util"); +var validate = require("dl-models").validator.garmentMasterPlan.weeklyPlan; +var moment = require('moment'); + + +before('#00. connect db', function (done) { + helper.getDb() + .then(db => { + manager = new Manager(db, { + username: 'unit-test' + }); + + done(); + }) + .catch(e => { + done(e); + }); +}); + +var dummyData; +var dummyDataId; +var queryMonitoringRemainingEH = {}; +var dummyMonitoringRemainingEHResult = {}; + +it(`#01. should success when get created new data`, function (done) { + dataUtil.getNewData() + .then((data) => { + manager.create(data) + .then((id) => { + dummyDataId = id; + dummyData = data; + queryMonitoringRemainingEH.year = dummyData.year; + queryMonitoringRemainingEH.unit = dummyData.unit.code; + done(); + }) + .catch((e) => { + done(e); + }); + }) + .catch((e) => { + done(e); + }); +}); + +it("#02. should success when get Monitoring Remaining EH", function (done) { + manager.getMonitoringRemainingEH(queryMonitoringRemainingEH) + .then((data) => { + data.should.instanceof(Array); + dummyMonitoringRemainingEHResult.data = data; + done(); + }) + .catch((e) => { + done(e); + }); +}); + +it("#03. should success when get Monitoring Remaining EH XLS", function (done) { + manager.getMonitoringRemainingEHXls(dummyMonitoringRemainingEHResult, queryMonitoringRemainingEH) + .then((xls) => { + xls.should.instanceof(Object); + xls.should.have.property('data'); + xls.should.have.property('options'); + xls.should.have.property('name'); + done(); + }) + .catch((e) => { + done(e); + }); +}); + +it('#04. should success when destroy data with id', function(done) { + manager.destroy(dummyDataId) + .then((result) => { + result.should.be.Boolean(); + result.should.equal(true); + done(); + }) + .catch((e) => { + done(e); + }); +}); + +it('#05. should null when get destroyed data', function(done) { + manager.getSingleByIdOrDefault(dummyDataId) + .then((data) => { + should.equal(data, null); + done(); + }) + .catch((e) => { + done(e); + }); +}); + +it(`#06. should success when remove all data`, function(done) { + manager.collection.remove({}) + .then((result) => { + done(); + }) + .catch((e) => { + done(e); + }); +}); \ No newline at end of file diff --git a/test/sp-master-plan/weekly-plan/validate.js b/test/sp-master-plan/weekly-plan/validate.js new file mode 100644 index 000000000..58484d020 --- /dev/null +++ b/test/sp-master-plan/weekly-plan/validate.js @@ -0,0 +1,226 @@ +'use strict'; + +var ObjectId = require("mongodb").ObjectId; +var should = require('should'); +var helper = require("../../helper"); +var Manager = require("../../../src/managers/garment-master-plan/weekly-plan-manager"); +var manager = null; +var dataUtil = require("../../data-util/garment-master-plan/weekly-plan-data-util"); +var validate = require("dl-models").validator.garmentMasterPlan.weeklyPlan; +var moment = require('moment'); + +before('#00. connect db', function (done) { + helper.getDb() + .then(db => { + manager = new Manager(db, { + username: 'unit-test' + }); + done(); + }) + .catch(e => { + done(e); + }) +}); + +it("#01. should error when create new data with empty data", function (done) { + manager.create({}) + .then((id) => { + done("should error when create new data with empty data"); + }) + .catch((e) => { + e.name.should.equal("ValidationError"); + e.should.have.property("errors"); + e.errors.should.instanceof(Object); + done(); + }); +}); + +it("#02. should error when create new data with month out of range", function (done) { + dataUtil.getNewData() + .then((data) => { + data.items[0].month = 2; + manager.create(data) + .then((id) => { + done("should error when create new data with month out of range"); + }) + .catch((e) => { + e.name.should.equal("ValidationError"); + e.should.have.property("errors"); + e.errors.should.instanceof(Object); + e.errors.should.have.property('items'); + done(); + }); + }) + .catch((e) => { + done(e); + }); +}); + +it("#03. should error when create new data with invalid month", function (done) { + dataUtil.getNewData() + .then((data) => { + data.items[0].month = 12; + manager.create(data) + .then((id) => { + done("should error when create new data with invalid month"); + }) + .catch((e) => { + e.name.should.equal("ValidationError"); + e.should.have.property("errors"); + e.errors.should.instanceof(Object); + e.errors.should.have.property('items'); + done(); + }); + }) + .catch((e) => { + done(e); + }); +}); + +it("#04. should error when create new data with invalid year", function (done) { + dataUtil.getNewData() + .then((data) => { + data.year = "year"; + manager.create(data) + .then((id) => { + done("should error when create new data with invalid year"); + }) + .catch((e) => { + e.name.should.equal("ValidationError"); + e.should.have.property("errors"); + e.errors.should.instanceof(Object); + done(); + }); + }) + .catch((e) => { + done(e); + }); +}); + +it("#04-1. should error when create new data with out of range year", function (done) { + dataUtil.getNewData() + .then((data) => { + data.year = (new Date()).getFullYear() + 11; + manager.create(data) + .then((id) => { + done("should error when create new data with out of range year"); + }) + .catch((e) => { + e.name.should.equal("ValidationError"); + e.should.have.property("errors"); + e.errors.should.instanceof(Object); + done(); + }); + }) + .catch((e) => { + done(e); + }); +}); + +// it("#05. should error when create new data with invalid efficiency, operator and workingHours", function (done) { +// dataUtil.getNewData() +// .then((data) => { +// data.items[0].efficiency = 0; +// data.items[0].operator = 0; +// data.items[0].workingHours = 0; +// manager.create(data) +// .then((id) => { +// done("should error when create new data with invalid efficiency, operator and workingHours"); +// }) +// .catch((e) => { +// e.name.should.equal("ValidationError"); +// e.should.have.property("errors"); +// e.errors.should.instanceof(Object); +// e.errors.should.have.property('items'); +// for(var item of e.errors.items){ +// if (Object.getOwnPropertyNames(item).length > 0) { +// item.should.have.property('efficiency'); +// item.should.have.property('operator'); +// item.should.have.property('workingHours'); +// } +// } +// done(); +// }); +// }) +// .catch((e) => { +// done(e); +// }); +// }); + +it("#06. should error when create new data with no data unit", function (done) { + dataUtil.getNewData() + .then((data) => { + data.unitId = "unitId"; + manager.create(data) + .then((id) => { + done("should error when create new data with no data unit"); + }) + .catch((e) => { + e.name.should.equal("ValidationError"); + e.should.have.property("errors"); + e.errors.should.instanceof(Object); + e.errors.should.have.property('unit'); + done(); + }); + }) + .catch((e) => { + done(e); + }); +}); + +var newData; +it("#07. should success when create new data for search and duplicate data", function (done) { + dataUtil.getNewData() + .then((data) => { + newData = data; + manager.create(data) + .then((id) => { + done(); + }) + .catch((e) => { + done(e); + }); + }) + .catch((e) => { + done(e); + }); +}); + +it("#08. should error when create new duplicate data", function (done) { + manager.create(newData) + .then((id) => { + done("should error when create new duplicate data"); + }) + .catch((e) => { + e.name.should.equal("ValidationError"); + e.should.have.property("errors"); + e.errors.should.instanceof(Object); + done(); + }); +}); + +it("#09. should success when search data with filter", function (done) { + manager.read({ + keyword: newData.unit.name + }) + .then((documents) => { + //process documents + documents.should.have.property("data"); + documents.data.should.be.instanceof(Array); + documents.data.length.should.not.equal(0); + done(); + }) + .catch((e) => { + done(e); + }); +}); + +it(`#10. should success when remove all data`, function(done) { + manager.collection.remove({}) + .then((result) => { + done(); + }) + .catch((e) => { + done(e); + }); +}); \ No newline at end of file diff --git a/test/sp-master-plan/working-hours-standard/basic.js b/test/sp-master-plan/working-hours-standard/basic.js new file mode 100644 index 000000000..ffeeb8669 --- /dev/null +++ b/test/sp-master-plan/working-hours-standard/basic.js @@ -0,0 +1,11 @@ +var options = { + manager: require("../../../src/managers/garment-master-plan/working-hours-standard-manager"), + model: require("dl-models").garmentMasterPlan.WorkingHoursStandard, + util: require("../../data-util/garment-master-plan/working-hours-standard-data-util"), + validator: require("dl-models").validator.garmentMasterPlan.workingHoursStandard, + createDuplicate: true, + keys:[] +}; + +var basicTest = require("../../basic-test-factory"); +basicTest(options); \ No newline at end of file diff --git a/test/sp-master-plan/working-hours-standard/index.js b/test/sp-master-plan/working-hours-standard/index.js new file mode 100644 index 000000000..166845178 --- /dev/null +++ b/test/sp-master-plan/working-hours-standard/index.js @@ -0,0 +1,7 @@ +describe("BASIC CRUD SCENARIOS", function() { + require("./basic"); +}); + +describe("BASIC CRUD SCENARIOS", function() { + require("./validate"); +}); \ No newline at end of file diff --git a/test/sp-master-plan/working-hours-standard/validate.js b/test/sp-master-plan/working-hours-standard/validate.js new file mode 100644 index 000000000..57c930c48 --- /dev/null +++ b/test/sp-master-plan/working-hours-standard/validate.js @@ -0,0 +1,61 @@ +'use strict'; + +var ObjectId = require("mongodb").ObjectId; +var should = require('should'); +var helper = require("../../helper"); +var Manager = require("../../../src/managers/garment-master-plan/working-hours-standard-manager"); +var manager = null; +var dataUtil =require("../../data-util/garment-master-plan/working-hours-standard-data-util"); +var validate = require("dl-models").validator.garmentMasterPlan.workingHoursStandard; + + + +var moment = require('moment'); + +before('#00. connect db', function (done) { + helper.getDb() + .then(db => { + manager = new Manager(db, { + username: 'unit-test' + }); + done(); + }) + .catch(e => { + done(e); + }) +}); + +it("#01. should error when create new data with empty data", function (done) { + manager.create({}) + .then((id) => { + done("should error when create new data with empty data"); + }) + .catch((e) => { + e.name.should.equal("ValidationError"); + e.should.have.property("errors"); + e.errors.should.instanceof(Object); + done(); + }); +}); + +it("#02. should error when create new data with end < start ", function (done) { + dataUtil.getNewData() + .then((data) => { + data.start=10; + data.end=5; + manager.create(data) + .then((id) => { + done("should error when create new data with end < start"); + }) + .catch((e) => { + e.name.should.equal("ValidationError"); + e.should.have.property("errors"); + e.errors.should.instanceof(Object); + e.errors.should.have.property("end"); + done(); + }); + }) + .catch((e) => { + done(e); + }); +}); \ No newline at end of file