@things-factory/warehouse-base 5.0.11 → 5.0.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -44,7 +44,7 @@ let InventoryQuery = class InventoryQuery {
|
|
|
44
44
|
}
|
|
45
45
|
const qb = (0, typeorm_1.getRepository)(inventory_1.Inventory).createQueryBuilder('iv');
|
|
46
46
|
(0, shell_1.buildQuery)(qb, params, context, {
|
|
47
|
-
searchables: ['warehouse', 'product', 'batchId']
|
|
47
|
+
searchables: ['warehouse', 'product', 'batchId', 'location', 'palletId']
|
|
48
48
|
});
|
|
49
49
|
qb.leftJoinAndSelect('iv.bizplace', 'bizplace')
|
|
50
50
|
.leftJoinAndSelect('iv.product', 'product')
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inventory-query.js","sourceRoot":"","sources":["../../../server/service/inventory/inventory-query.ts"],"names":[],"mappings":";;;;;AAAA,+CAA8F;AAC9F,qCAA4G;AAE5G,yDAAgD;AAChD,uDAAyG;AACzG,+DAA2F;AAC3F,+DAAsD;AACtD,iDAAkG;AAElG,+CAAiE;AACjE,2EAAsE;AACtE,2CAAuC;AACvC,uDAA6E;AAG7E,IAAa,cAAc,GAA3B,MAAa,cAAc;IAIzB,KAAK,CAAC,WAAW,CACR,OAAY,EACmC,OAAkB,EACb,UAAuB,EAC1B,QAAoB,EACR,oBAAgC;;QAEpG,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAsD,OAAO,CAAC,KAAK,CAAA;QAE7F,IAAI;YACF,MAAM,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,cAAc,CAAC,CAAA;YAClE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,cAAc,CAAC,CAAA;YACvD,MAAM,MAAM,GAAG,EAAE,OAAO,EAAE,UAAU,EAAE,CAAA;YAEtC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAW,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,UAAU,CAAC,EAAE;gBACrE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;oBAClB,IAAI,EAAE,UAAU;oBAChB,QAAQ,EAAE,IAAI;oBACd,KAAK,EAAE,MAAM,IAAA,kCAAuB,EAAC,MAAM,EAAE,IAAI,CAAC;oBAClD,QAAQ,EAAE,IAAI;iBACf,CAAC,CAAA;aACH;YAED,MAAM,eAAe,GAAuD,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,OAAO,0CAAE,IAAI,CAC/F,CAAC,CAAiD,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAC/E,CAAA;YAED,IAAI,UAAU,GAAY,KAAK,CAAA;YAC/B,IAAI,OAAO,CAAA,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,KAAK,CAAA,KAAK,WAAW,EAAE;gBACjD,UAAU,GAAG,eAAe,CAAC,KAAK,CAAA;gBAClC,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CACpC,CAAC,CAAiD,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAC/E,CAAA;aACF;YAED,MAAM,eAAe,GAAuD,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,OAAO,0CAAE,IAAI,CAC/F,CAAC,CAAiD,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAC/E,CAAA;YAED,IAAI,UAAU,GAAY,KAAK,CAAA;YAC/B,IAAI,OAAO,CAAA,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,KAAK,CAAA,KAAK,WAAW,EAAE;gBACjD,UAAU,GAAG,eAAe,CAAC,KAAK,CAAA;gBAClC,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CACpC,CAAC,CAAiD,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAC/E,CAAA;aACF;YAED,MAAM,EAAE,GAAkC,IAAA,uBAAa,EAAC,qBAAS,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAA;YAC3F,IAAA,kBAAU,EAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE;gBAC9B,WAAW,EAAE,CAAC,WAAW,EAAE,SAAS,EAAE,SAAS,CAAC;aACjD,CAAC,CAAA;YAEF,EAAE,CAAC,iBAAiB,CAAC,aAAa,EAAE,UAAU,CAAC;iBAC5C,iBAAiB,CAAC,YAAY,EAAE,SAAS,CAAC;iBAC1C,iBAAiB,CAAC,cAAc,EAAE,WAAW,CAAC;iBAC9C,iBAAiB,CAAC,aAAa,EAAE,UAAU,CAAC;iBAC5C,QAAQ,CAAC,mBAAmB,EAAE,KAAK,CAAC;iBACpC,uBAAuB,CAAC,uBAAuB,EAAE,mBAAmB,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,CAClF,EAAE,CAAC,QAAQ,CAAC,2BAA2B,EAAE;gBACvC,UAAU,EAAE,4BAAgB,CAAC,MAAM;aACpC,CAAC,CACH,CAAA;YAEH,IAAI,UAAU,EAAE;gBACd,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;qBACtB,QAAQ,CAAC,kEAAkE,CAAC;qBAC5E,QAAQ,CAAC,0EAA0E,CAAC,CAAA;aACxF;YAED,IAAI,UAAU,EAAE;gBACd,EAAE,CAAC,QAAQ,CAAC,iEAAiE,CAAC,CAAA;aAC/E;YAED,IAAI,cAAc,EAAE;gBAClB,IAAI,kBAAkB,GAAG,IAAI,cAAc,CAAC,KAAK,CAAC,WAAW,EAAE,GAAG,CAAA;gBAClE,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE;oBACf,MAAM,QAAQ,GAAG,EAAE;yBAChB,QAAQ,EAAE;yBACV,MAAM,EAAE;yBACR,IAAI,CAAC,sBAAO,EAAE,UAAU,CAAC;yBACzB,KAAK,CAAC,6BAA6B,CAAC;yBACpC,QAAQ,CACP,IAAI,kBAAQ,CAAC,EAAE,CAAC,EAAE;wBAChB,EAAE,CAAC,KAAK,CAAC,uCAAuC,EAAE,EAAE,WAAW,EAAE,kBAAkB,EAAE,CAAC;6BACnF,OAAO,CAAC,wCAAwC,EAAE,EAAE,WAAW,EAAE,kBAAkB,EAAE,CAAC;6BACtF,OAAO,CAAC,+CAA+C,EAAE,EAAE,WAAW,EAAE,kBAAkB,EAAE,CAAC;6BAC7F,OAAO,CAAC,yCAAyC,EAAE,EAAE,WAAW,EAAE,kBAAkB,EAAE,CAAC,CAAA;oBAC5F,CAAC,CAAC,CACH;yBACA,QAAQ,EAAE,CAAA;oBACb,OAAO,UAAU,QAAQ,EAAE,CAAA;gBAC7B,CAAC,CAAC,CAAA;aACH;YAED,IAAI,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,MAAM,MAAK,CAAC,EAAE;gBAC1B,MAAM,gBAAgB,GAAG,CAAC,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,CAAC,CAAA;gBACjF,MAAM,IAAI,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,MAAM,CAClC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,iCACV,GAAG,KACN,CAAC,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI;wBAC7F,CAAC,CAAC,MAAM;wBACR,CAAC,CAAC,KAAK,IACT,EACF,EAAE,CACH,CAAA;gBACD,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;aACjB;YAED,IAAI,CAAA,oBAAoB,aAApB,oBAAoB,uBAApB,oBAAoB,CAAE,MAAM,IAAG,CAAC,EAAE;gBACpC,oBAAoB,CAAC,OAAO,CAAC,CAAC,IAAqC,EAAE,EAAE;oBACrE,EAAE,CAAC,UAAU,CAAC,YAAY,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;gBACpE,CAAC,CAAC,CAAA;aACH;YAED,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,eAAe,EAAE,CAAA;YAC/C,KAAK,GAAG,MAAM,OAAO,CAAC,GAAG,CACvB,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,IAAe,EAAE,EAAE;;gBAClC,IAAI,CAAC,cAAc,EAAE,cAAc,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;oBACvD,IAAA,uBAAa,EAAC,4BAAa,CAAC,CAAC,IAAI,CAAC;wBAChC,KAAK,EAAE;4BACL,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE;4BACxB,WAAW,EAAE,IAAI,CAAC,WAAW;4BAC7B,WAAW,EAAE,IAAI,CAAC,WAAW;yBAC9B;qBACF,CAAC;oBACF,EAAE,CAAC,KAAK,CACN;;;;;aAKD,EACC,CAAC,IAAI,CAAC,EAAE,CAAC,CACV;iBACF,CAAC,CAAA;gBAEF,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,GAAG,cAAc,CAAA;gBAC/C,uCACK,IAAI,KACP,SAAS,EAAE,IAAI,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,EAC3D,cAAc,EAAE,IAAI,CAAC,QAAQ,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,EAC/E,aAAa,EAAE,MAAA,cAAc,CAAC,CAAC,CAAC,0CAAE,aAAa,IAChD;YACH,CAAC,CAAC,CACH,CAAA;YAED,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAA;SACxB;QAAC,OAAO,KAAK,EAAE;YACd,MAAM,KAAK,CAAA;SACZ;IACH,CAAC;IAID,KAAK,CAAC,SAAS,CAAkB,QAAgB,EAAS,OAAY;QACpE,MAAM,EAAE,MAAM,EAAE,GAAuB,OAAO,CAAC,KAAK,CAAA;QAEpD,OAAO,MAAM,IAAA,uBAAa,EAAC,qBAAS,CAAC,CAAC,OAAO,CAAC;YAC5C,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE;YACnC,SAAS,EAAE,CAAC,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,CAAC;SAC5F,CAAC,CAAA;IACJ,CAAC;IAID,KAAK,CAAC,iBAAiB,CAAkB,QAAgB,EAAS,OAAY;QAC5E,MAAM,EAAE,MAAM,EAAE,GAAuB,OAAO,CAAC,KAAK,CAAA;QAEpD,OAAO,MAAM,IAAA,uBAAa,EAAC,qBAAS,CAAC,CAAC,OAAO,CAAC;YAC5C,KAAK,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAA,aAAG,EAAC,IAAA,eAAK,EAAC,4BAAgB,CAAC,UAAU,CAAC,CAAC,EAAE;YAC5E,SAAS,EAAE,CAAC,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,CAAC;SAC5F,CAAC,CAAA;IACJ,CAAC;IAKD,KAAK,CAAC,oBAAoB,CAAS,MAAiB,EAAS,OAAY;QACvE,IAAI;YACF,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAsD,OAAO,CAAC,KAAK,CAAA;YAC7F,IAAI,oBAAoB,GAAa,MAAM,IAAA,kCAAuB,EAAC,MAAM,EAAE,IAAI,CAAC,CAAA;YAChF,MAAM,wBAAwB,GAAe,MAAM,IAAA,sCAA2B,EAAC,MAAM,EAAE,IAAI,CAAC,CAAA;YAE5F,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAA;YACnC,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAA;YAErC,IAAI,cAAc,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,IAAI,UAAU,CAAC,CAAA;YAC7E,IAAI,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,IAAI,SAAS,CAAC,CAAA;YAC3E,IAAI,iBAAiB,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,CAAA;YAC5E,IAAI,oBAAoB,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,IAAI,gBAAgB,CAAC,CAAA;YACzF,IAAI,cAAc,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,IAAI,UAAU,CAAC,CAAA;YAC7E,IAAI,eAAe,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,IAAI,WAAW,CAAC,CAAA;YAE/E,IAAI,cAAc,EAAE;gBAClB,MAAM,oBAAoB,GAAiC,IAAA,uBAAa,EAAC,mBAAQ,CAAC,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAA;gBAC1G,oBAAoB;qBACjB,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,6BAA6B,CAAC;qBAC3D,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,uBAAuB,CAAC;qBACrD,KAAK,CAAC,qBAAqB,EAAE,EAAE,UAAU,EAAE,cAAc,CAAC,KAAK,EAAE,CAAC,CAAA;gBAErE,IAAI,YAAY,GAAG,MAAM,oBAAoB,CAAC,OAAO,EAAE,CAAA;gBAEvD,oBAAoB,GAAG;oBACrB,GAAG,oBAAoB,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,cAAc,CAAC,KAAK,CAAC;oBAClE,GAAG,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;oBAChC,GAAG,wBAAwB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;iBAC/C,CAAA;aACF;YAED,IAAI,aAAa,GAAG,EAAE,CAAA;YACtB,IAAI,oBAAoB,CAAC,MAAM,GAAG,CAAC,EAAE;gBACnC,aAAa,GAAG;kCACU,oBAAoB,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;;;UAG7E,CAAA;aACH;iBAAM;gBACL,aAAa,GAAG,OAAO,CAAA;aACxB;YAED,IAAI,YAAY,GAAG,EAAE,CAAA;YACrB,IAAI,aAAa,EAAE;gBACjB,IAAI,YAAY,GAAG,aAAa,CAAC,KAAK;qBACnC,WAAW,EAAE;qBACb,KAAK,CAAC,GAAG,CAAC;qBACV,GAAG,CAAC,IAAI,CAAC,EAAE;oBACV,OAAO,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,IAAI,CAAA;gBACtD,CAAC,CAAC;qBACD,IAAI,CAAC,GAAG,CAAC,CAAA;gBACZ,YAAY,GAAG;mDAC4B,YAAY;qDACV,YAAY;uDACV,YAAY;6DACN,YAAY;yDAChB,YAAY;wDACb,YAAY;gEACJ,YAAY;UAClE,CAAA;aACH;YAED,IAAI,iBAAiB,EAAE;gBACrB,IAAI,gBAAgB,GAAG,iBAAiB,CAAC,KAAK;qBAC3C,WAAW,EAAE;qBACb,KAAK,CAAC,GAAG,CAAC;qBACV,GAAG,CAAC,IAAI,CAAC,EAAE;oBACV,OAAO,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,IAAI,CAAA;gBACtD,CAAC,CAAC;qBACD,IAAI,CAAC,GAAG,CAAC,CAAA;gBACZ,YAAY;oBACV,YAAY;wBACZ;mDACyC,gBAAgB;UACzD,CAAA;aACH;YAED,IAAI,mBAAmB,GAAG,EAAE,CAAA;YAC5B,IAAI,oBAAoB,aAApB,oBAAoB,uBAApB,oBAAoB,CAAE,KAAK,EAAE;gBAC/B,mBAAmB,GAAG,iCAAiC,CAAA;aACxD;YAED,IAAI,cAAc,GAAG,EAAE,CAAA;YACvB,IAAI,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,KAAK,EAAE;gBACzB,cAAc,GAAG,wGAAwG,CAAA;aAC1H;YAED,IAAI,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,KAAK,EAAE;gBAC1B,cAAc,GAAG;8GACqF,CAAA;aACvG;YAED,MAAM,EAAE,CAAC,KAAK,CACZ;;;;;;;;;;;;;;;;;;;;YAoBI,aAAa;YACb,YAAY;;;YAGZ,mBAAmB;YACnB,cAAc;UAChB,EACF,CAAC,MAAM,CAAC,EAAE,CAAC,CACZ,CAAA;YAED,MAAM,OAAO,GAAQ,MAAM,EAAE,CAAC,KAAK,CACjC;;;;SAIC,EACD,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,KAAK,EAAE,KAAK,CAAC,CAC5B,CAAA;YAED,MAAM,KAAK,GAAQ,MAAM,EAAE,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAA;YAE1E,EAAE,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAA;YAEvC,OAAO;gBACL,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,IAAS,EAAE,EAAE;oBAC/B,OAAO;wBACL,OAAO,EAAE;4BACP,EAAE,EAAE,IAAI,CAAC,EAAE;4BACX,IAAI,EAAE,IAAI,CAAC,IAAI;4BACf,GAAG,EAAE,IAAI,CAAC,GAAG;4BACb,KAAK,EAAE,IAAI,CAAC,KAAK;4BACjB,WAAW,EAAE,IAAI,CAAC,WAAW;4BAC7B,IAAI,EAAE,IAAI,CAAC,IAAI;4BACf,MAAM,EAAE,IAAI,CAAC,MAAM;4BACnB,YAAY,EAAE,IAAI,CAAC,YAAY;4BAC/B,UAAU,EAAE,IAAI,CAAC,UAAU;4BAC3B,MAAM,EAAE,IAAI,CAAC,MAAM;4BACnB,MAAM,EAAE,IAAI,CAAC,MAAM;yBACpB;wBACD,eAAe,EAAE,IAAI,CAAC,eAAe;wBACrC,GAAG,EAAE,IAAI,CAAC,GAAG;qBACd,CAAA;gBACH,CAAC,CAAC;gBACF,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK;aACtB,CAAA;SACF;QAAC,OAAO,KAAK,EAAE;YACd,MAAM,KAAK,CAAA;SACZ;IACH,CAAC;IAID,KAAK,CAAC,qBAAqB,CAClB,OAAY,EACC,WAAmB,EACvB,OAAe,EACX,WAAmB,EACpB,UAAkB,EACjB,WAAmB,EACnB,WAAmB,EAC3B,GAAW,EACC,eAAuB,EACqB,oBAAgC,EAC7D,UAAmB;QAE1D,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,GAA0C,OAAO,CAAC,KAAK,CAAA;QAE3E,MAAM,0BAA0B,GAAY,MAAM,EAAE,CAAC,aAAa,CAAC,sBAAO,CAAC,CAAC,OAAO,CAAC;YAClF,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,+BAA+B,EAAE;SACzD,CAAC,CAAA;QAEF,IAAI,CAAC,oBAAoB,IAAI,0BAA0B,EAAE;YACvD,oBAAoB,GAAG,EAAE,CAAA;YACzB,IAAI,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,0BAA0B,CAAC,KAAK,CAAC,CAAA;YAClE,KAAK,MAAM,GAAG,IAAI,eAAe,EAAE;gBACjC,oBAAoB,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,eAAe,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;aAC7F;SACF;QAED,OAAO,qBAAqB,CAC1B;YACE,WAAW;YACX,OAAO;YACP,UAAU;YACV,WAAW;YACX,UAAU;YACV,WAAW;YACX,WAAW;YACX,GAAG;YACH,eAAe;YACf,oBAAoB;SACrB,EACD,EAAE,CACH,CAAA;IACH,CAAC;IAID,KAAK,CAAC,wBAAwB,CACZ,OAAe,EACf,OAAe,EACxB,OAAY;;QAEnB,MAAM,EAAE,EAAE,EAAE,GAA0B,OAAO,CAAC,KAAK,CAAA;QACnD,MAAM,OAAO,GAA0B,EAAE,CAAC,aAAa,CAAC,qBAAS,CAAC,CAAA;QAClE,MAAM,IAAI,GAAc,MAAM,OAAO,CAAC,OAAO,CAAC;YAC5C,KAAK,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,4BAAgB,CAAC,MAAM,EAAE;YAC3F,SAAS,EAAE,CAAC,SAAS,CAAC;SACvB,CAAC,CAAA;QAEF,MAAM,IAAI,GAAc,MAAM,OAAO,CAAC,OAAO,CAAC;YAC5C,KAAK,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,4BAAgB,CAAC,MAAM,EAAE;YAC3F,SAAS,EAAE,CAAC,SAAS,CAAC;SACvB,CAAC,CAAA;QAEF,OAAO,CACL,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,OAAO,OAAK,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,OAAO,CAAA;YAC/B,CAAA,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,OAAO,0CAAE,EAAE,OAAK,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,OAAO,0CAAE,EAAE,CAAA;YACvC,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,WAAW,OAAK,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,WAAW,CAAA,CACxC,CAAA;IACH,CAAC;IAGD,KAAK,CAAC,uBAAuB,CACX,OAAe,EACf,OAAe,EACf,OAAe,EACxB,OAAY;;QAEnB,MAAM,OAAO,GAA0B,IAAA,uBAAa,EAAC,qBAAS,CAAC,CAAA;QAC/D,MAAM,IAAI,GAAc,MAAM,OAAO,CAAC,OAAO,CAAC;YAC5C,KAAK,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,4BAAgB,CAAC,MAAM,EAAE;YAC9G,SAAS,EAAE,CAAC,SAAS,CAAC;SACvB,CAAC,CAAA;QAEF,MAAM,IAAI,GAAc,MAAM,OAAO,CAAC,OAAO,CAAC;YAC5C,KAAK,EAAE;gBACL,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM;gBAC5B,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,QAAQ,EAAE,OAAO;gBACjB,MAAM,EAAE,4BAAgB,CAAC,MAAM;aAChC;YACD,SAAS,EAAE,CAAC,SAAS,CAAC;SACvB,CAAC,CAAA;QAEF,OAAO,CACL,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,cAAc,OAAK,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,cAAc,CAAA;YAC7C,CAAA,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,OAAO,0CAAE,EAAE,OAAK,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,OAAO,0CAAE,EAAE,CAAA;YACvC,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,WAAW,OAAK,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,WAAW,CAAA;YACvC,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,WAAW,OAAK,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,WAAW,CAAA,CACxC,CAAA;IACH,CAAC;IAGD,KAAK,CAAC,mBAAmB,CACN,QAAgB,EACZ,YAAoB,EAClC,OAAY;QAEnB,MAAM,OAAO,GAA0B,IAAA,uBAAa,EAAC,qBAAS,CAAC,CAAA;QAC/D,MAAM,OAAO,GAAyB,IAAA,uBAAa,EAAC,mBAAQ,CAAC,CAAA;QAE7D,MAAM,SAAS,GAAc,MAAM,OAAO,CAAC,OAAO,CAAC;YACjD,KAAK,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,4BAAgB,CAAC,MAAM,EAAE;YAClF,SAAS,EAAE,CAAC,UAAU,CAAC;SACxB,CAAC,CAAA;QAEF,IAAI,CAAC,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAA;QAEvE,MAAM,aAAa,GAAa,MAAM,OAAO,CAAC,OAAO,CAAC;YACpD,KAAK,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE;SAC9B,CAAC,CAAA;QAEF,MAAM,aAAa,GAAa,SAAS,CAAC,QAAQ,CAAA;QAElD,OAAO,OAAO,CAAC,aAAa,CAAC,EAAE,KAAK,aAAa,CAAC,EAAE,CAAC,CAAA;IACvD,CAAC;IAID,KAAK,CAAC,mBAAmB,CAChB,OAAY,EACmC,OAAkB,EACb,UAAuB,EAC1B,QAAoB;;QAE5E,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAmC,OAAO,CAAC,KAAK,CAAA;QAEtE,MAAM,MAAM,GAAG,EAAE,OAAO,EAAE,UAAU,EAAE,CAAA;QAEtC,MAAM,eAAe,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;QACzF,IAAI,CAAC,eAAe,EAAE;YACpB,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAA;SACpD;QAED,MAAM,gBAAgB,GAAW,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;QAEnG,kEAAkE;QAClE,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,iBAAiB,IAAI,CAAC,CAAC,IAAI,KAAK,kBAAkB,CAAC,CAAA;QAE1G,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAW,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,aAAa,CAAC,EAAE;YACxE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;gBAClB,IAAI,EAAE,aAAa;gBACnB,QAAQ,EAAE,IAAI;gBACd,KAAK,EAAE,MAAM,IAAA,kCAAuB,EAAC,MAAM,EAAE,IAAI,CAAC;gBAClD,QAAQ,EAAE,IAAI;aACf,CAAC,CAAA;SACH;QAED,MAAM,eAAe,GAAuD,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,OAAO,0CAAE,IAAI,CAC/F,CAAC,CAAiD,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAC/E,CAAA;QAED,IAAI,UAAU,GAAY,KAAK,CAAA;QAC/B,IAAI,OAAO,CAAA,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,KAAK,CAAA,KAAK,WAAW,EAAE;YACjD,UAAU,GAAG,eAAe,CAAC,KAAK,CAAA;YAClC,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CACpC,CAAC,CAAiD,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAC/E,CAAA;SACF;QAED,MAAM,eAAe,GAAuD,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,OAAO,0CAAE,IAAI,CAC/F,CAAC,CAAiD,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAC/E,CAAA;QAED,IAAI,UAAU,GAAY,KAAK,CAAA;QAC/B,IAAI,OAAO,CAAA,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,KAAK,CAAA,KAAK,WAAW,EAAE;YACjD,UAAU,GAAG,eAAe,CAAC,KAAK,CAAA;YAClC,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CACpC,CAAC,CAAiD,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAC/E,CAAA;SACF;QAED,MAAM,qBAAqB,GAA2B,MAAM,IAAA,uBAAa,EAAC,mCAAoB,CAAC,CAAC,IAAI,CAAC;YACnG,KAAK,EAAE,EAAE,aAAa,EAAE,eAAe,EAAE;YACzC,SAAS,EAAE,CAAC,SAAS,EAAE,eAAe,CAAC;SACxC,CAAC,CAAA;QAEF,IAAI,CAAC,qBAAqB,CAAC,MAAM,EAAE;YACjC,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAA;SACxD;QAED,MAAM,EAAE,GAAkC,IAAA,uBAAa,EAAC,qBAAS,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAA;QAC3F,IAAA,kBAAU,EAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,CAAA;QAE/B,EAAE,CAAC,MAAM,CAAC,eAAe,EAAE,WAAW,CAAC;aACpC,SAAS,CAAC,aAAa,EAAE,SAAS,CAAC;aACnC,SAAS,CAAC,iBAAiB,EAAE,YAAY,CAAC;aAC1C,SAAS,CAAC,iBAAiB,EAAE,aAAa,CAAC;aAC3C,SAAS,CAAC,aAAa,EAAE,KAAK,CAAC;aAC/B,SAAS,CAAC,oBAAoB,EAAE,WAAW,CAAC;aAC5C,SAAS,CAAC,mBAAmB,EAAE,UAAU,CAAC;aAC1C,SAAS,CAAC,0BAA0B,EAAE,gBAAgB,CAAC;aACvD,SAAS,CAAC,SAAS,EAAE,YAAY,CAAC;aAClC,SAAS,CAAC,UAAU,EAAE,aAAa,CAAC;aACpC,SAAS,CAAC,iBAAiB,EAAE,oBAAoB,CAAC;aAClD,SAAS,CAAC,UAAU,EAAE,aAAa,CAAC;aACpC,SAAS,CAAC,kBAAkB,EAAE,KAAK,CAAC;aACpC,QAAQ,CAAC,YAAY,EAAE,KAAK,CAAC,CAAA;QAEhC,IAAI,UAAU,EAAE;YACd,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;iBACtB,QAAQ,CAAC,kEAAkE,CAAC;iBAC5E,QAAQ,CAAC,0EAA0E,CAAC,CAAA;SACxF;QAED,IAAI,UAAU,EAAE;YACd,EAAE,CAAC,QAAQ,CAAC,iEAAiE,CAAC,CAAA;SAC/E;QAED,EAAE,CAAC,QAAQ,CAAC,mCAAmC,EAAE;YAC/C,UAAU,EAAE,qBAAqB,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;SACjF,CAAC;aACC,OAAO,CAAC,eAAe,CAAC;aACxB,UAAU,CAAC,aAAa,CAAC;aACzB,UAAU,CAAC,iBAAiB,CAAC;aAC7B,UAAU,CAAC,iBAAiB,CAAC;aAC7B,UAAU,CAAC,SAAS,CAAC;aACrB,UAAU,CAAC,UAAU,CAAC;aACtB,UAAU,CAAC,iBAAiB,CAAC;aAC7B,UAAU,CAAC,UAAU,CAAC;aACtB,UAAU,CAAC,UAAU,CAAC;aACtB,UAAU,CAAC,kBAAkB,CAAC;aAC9B,UAAU,CAAC,aAAa,CAAC,CAAA;QAE5B,IAAI,WAAW,GAAG,MAAM,EAAE,CAAC,UAAU,EAAE,CAAA;QAEvC,WAAW,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,IAAS,EAAE,EAAE;YAC1C,uCACK,IAAI,KACP,QAAQ,EAAE,eAAe,EACzB,SAAS,EAAE,IAAI,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,EAC3D,cAAc,EAAE,IAAI,CAAC,QAAQ,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,EAC/E,GAAG,EAAE,IAAI,CAAC,GAAG,EACb,SAAS,EAAE,qBAAqB,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,IAC/F;QACH,CAAC,CAAC,CAAA;QAEF,MAAM,aAAa,GAAG,qBAAqB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;YACpD,OAAO;gBACL,EAAE,EAAE,GAAG,CAAC,EAAE;gBACV,SAAS,EAAE,GAAG,CAAC,OAAO,CAAC,EAAE;gBACzB,QAAQ,EAAE,GAAG,CAAC,aAAa,CAAC,EAAE;gBAC9B,SAAS,EAAE,GAAG,CAAC,SAAS;gBACxB,UAAU,EAAE,gBAAgB,GAAG,GAAG,CAAC,SAAS;gBAC5C,iBAAiB,EAAE,CAAC;gBACpB,sBAAsB,EAAE,CAAC;aAC1B,CAAA;QACH,CAAC,CAAC,CAAA;QAEF,gCAAgC;QAChC,WAAW,GAAG,WAAW;aACtB,GAAG,CAAC,KAAK,CAAC,EAAE;YACX,MAAM,QAAQ,GAAG,KAAK,CAAC,cAAc,GAAG,KAAK,CAAC,SAAS,CAAA;YAEvD,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;gBAC9B,IAAI,QAAQ,GAAG,KAAK,CAAA;gBACpB,IAAI,UAAU,GAAG,CAAC,CAAA;gBAClB,IAAI,eAAe,GAAG,CAAC,CAAA;gBAEvB,IAAI,KAAK,CAAC,SAAS,KAAK,OAAO,CAAC,SAAS,EAAE;oBACzC,IAAI,OAAO,CAAC,iBAAiB,GAAG,OAAO,CAAC,UAAU,EAAE;wBAClD,QAAQ,GAAG,IAAI,CAAA;wBACf,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,GAAG,OAAO,CAAC,iBAAiB,CAAA;wBAC9D,UAAU,GAAG,OAAO,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAA;wBAClE,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,QAAQ,GAAG,GAAG,CAAC,GAAG,GAAG,CAAA;wBAC/D,OAAO,CAAC,iBAAiB,IAAI,UAAU,CAAA;wBACvC,OAAO,CAAC,sBAAsB,IAAI,eAAe,CAAA;qBAClD;oBAED,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAA;oBACzB,KAAK,CAAC,UAAU,GAAG,UAAU,CAAA;oBAC7B,KAAK,CAAC,eAAe,GAAG,eAAe,CAAA;oBACvC,KAAK,CAAC,sBAAsB,GAAG,GAAG,eAAe,IAAI,KAAK,CAAC,GAAG,EAAE,CAAA;iBACjE;YACH,CAAC,CAAC,CAAA;YAEF,OAAO,KAAK,CAAA;QACd,CAAC,CAAC;aACD,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;QAClC,gCAAgC;QAEhC,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,CAAA;IACvC,CAAC;IAID,KAAK,CAAC,oBAAoB,CACjB,OAAY,EACmC,OAAkB,EACb,UAAuB,EAC1B,QAAoB,EACR,oBAAgC;;QAEpG,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QACtC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,UAAU,CAAA;QAElC,IAAI;YACF,MAAM,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,cAAc,CAAC,CAAA;YAClE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,cAAc,CAAC,CAAA;YACvD,MAAM,MAAM,GAAG,EAAE,OAAO,EAAE,UAAU,EAAE,CAAA;YAEtC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAW,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,UAAU,CAAC,EAAE;gBACrE,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAA;aACxD;YAED,MAAM,eAAe,GAAuD,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,OAAO,0CAAE,IAAI,CAC/F,CAAC,CAAiD,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAC/E,CAAA;YAED,IAAI,UAAU,GAAY,KAAK,CAAA;YAC/B,IAAI,OAAO,CAAA,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,KAAK,CAAA,KAAK,WAAW,EAAE;gBACjD,UAAU,GAAG,eAAe,CAAC,KAAK,CAAA;gBAClC,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CACpC,CAAC,CAAiD,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAC/E,CAAA;aACF;YAED,MAAM,eAAe,GAAuD,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,OAAO,0CAAE,IAAI,CAC/F,CAAC,CAAiD,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAC/E,CAAA;YAED,IAAI,UAAU,GAAY,KAAK,CAAA;YAC/B,IAAI,OAAO,CAAA,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,KAAK,CAAA,KAAK,WAAW,EAAE;gBACjD,UAAU,GAAG,eAAe,CAAC,KAAK,CAAA;gBAClC,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CACpC,CAAC,CAAiD,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAC/E,CAAA;aACF;YAED,MAAM,EAAE,GAAkC,IAAA,uBAAa,EAAC,qBAAS,CAAC,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAA;YAClG,IAAA,kBAAU,EAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,CAAA;YAE/B,EAAE,CAAC,iBAAiB,CAAC,oBAAoB,EAAE,UAAU,CAAC;iBACnD,iBAAiB,CAAC,mBAAmB,EAAE,SAAS,CAAC;iBACjD,iBAAiB,CAAC,qBAAqB,EAAE,WAAW,CAAC;iBACrD,iBAAiB,CAAC,oBAAoB,EAAE,UAAU,CAAC;iBACnD,iBAAiB,CAAC,mBAAmB,EAAE,SAAS,CAAC;iBACjD,iBAAiB,CAAC,mBAAmB,EAAE,SAAS,CAAC;iBACjD,iBAAiB,CAChB,QAAQ,CAAC,EAAE;gBACT,OAAO,QAAQ;qBACZ,MAAM,CAAC,iBAAiB,EAAE,cAAc,CAAC;qBACzC,SAAS,CAAC,oCAAoC,EAAE,gBAAgB,CAAC;qBACjE,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC;qBAC7B,KAAK,CAAC,0BAA0B,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC;qBAC1D,OAAO,CAAC,iBAAiB,CAAC,CAAA;YAC/B,CAAC,EACD,KAAK,EACL,iCAAiC,CAClC,CAAA;YAEH,IAAI,UAAU,EAAE;gBACd,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;qBAC7B,QAAQ,CAAC,kFAAkF,CAAC;qBAC5F,QAAQ,CAAC,iGAAiG,CAAC,CAAA;aAC/G;YAED,IAAI,UAAU,EAAE;gBACd,EAAE,CAAC,QAAQ,CAAC,iFAAiF,CAAC,CAAA;aAC/F;YAED,IAAI,cAAc,EAAE;gBAClB,IAAI,kBAAkB,GAAG,IAAI,cAAc,CAAC,KAAK,CAAC,WAAW,EAAE,GAAG,CAAA;gBAClE,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE;oBACf,MAAM,QAAQ,GAAG,EAAE;yBAChB,QAAQ,EAAE;yBACV,MAAM,EAAE;yBACR,IAAI,CAAC,sBAAO,EAAE,UAAU,CAAC;yBACzB,KAAK,CAAC,oCAAoC,CAAC;yBAC3C,QAAQ,CACP,IAAI,kBAAQ,CAAC,EAAE,CAAC,EAAE;wBAChB,EAAE,CAAC,KAAK,CAAC,uCAAuC,EAAE,EAAE,WAAW,EAAE,kBAAkB,EAAE,CAAC;6BACnF,OAAO,CAAC,wCAAwC,EAAE,EAAE,WAAW,EAAE,kBAAkB,EAAE,CAAC;6BACtF,OAAO,CAAC,+CAA+C,EAAE,EAAE,WAAW,EAAE,kBAAkB,EAAE,CAAC;6BAC7F,OAAO,CAAC,yCAAyC,EAAE,EAAE,WAAW,EAAE,kBAAkB,EAAE,CAAC,CAAA;oBAC5F,CAAC,CAAC,CACH;yBACA,QAAQ,EAAE,CAAA;oBACb,OAAO,UAAU,QAAQ,EAAE,CAAA;gBAC7B,CAAC,CAAC,CAAA;aACH;YAED,IAAI,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,MAAM,MAAK,CAAC,EAAE;gBAC1B,MAAM,gBAAgB,GAAG,CAAC,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,CAAC,CAAA;gBACjF,MAAM,IAAI,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,MAAM,CAClC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,iCACV,GAAG,KACN,CAAC,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI;wBACpG,CAAC,CAAC,MAAM;wBACR,CAAC,CAAC,KAAK,IACT,EACF,EAAE,CACH,CAAA;gBACD,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;aACjB;YAED,IAAI,CAAA,oBAAoB,aAApB,oBAAoB,uBAApB,oBAAoB,CAAE,MAAM,IAAG,CAAC,EAAE;gBACpC,oBAAoB,CAAC,OAAO,CAAC,CAAC,IAAqC,EAAE,EAAE;oBACrE,EAAE,CAAC,UAAU,CAAC,YAAY,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;gBACpE,CAAC,CAAC,CAAA;aACH;YAED,IAAI,KAAK,GAAG,MAAM,EAAE;iBACjB,MAAM,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;iBAC1B,KAAK,CAAC,KAAK,CAAC;iBACZ,UAAU,EAAE,CAAA;YAEf,IAAI,KAAK,GAAG,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAA;YAE/B,OAAO;gBACL,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;oBACtB,uCACK,IAAI,qBAAS,CAAC,IAAI,CAAC,KACtB,aAAa,EAAE,IAAI,CAAC,cAAc,IACnC;gBACH,CAAC,CAAC;gBACF,KAAK;aACN,CAAA;SACF;QAAC,OAAO,KAAK,EAAE;YACd,MAAM,KAAK,CAAA;SACZ;IACH,CAAC;IAKD,KAAK,CAAC,yBAAyB,CAAS,MAAiB,EAAS,OAAY;QAC5E,IAAI;YACF,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAsD,OAAO,CAAC,KAAK,CAAA;YAC7F,IAAI,oBAAoB,GAAa,MAAM,IAAA,kCAAuB,EAAC,MAAM,EAAE,IAAI,CAAC,CAAA;YAChF,MAAM,wBAAwB,GAAe,MAAM,IAAA,sCAA2B,EAAC,MAAM,EAAE,IAAI,CAAC,CAAA;YAE5F,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAA;YACnC,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAA;YAErC,IAAI,cAAc,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,IAAI,UAAU,CAAC,CAAA;YAC7E,IAAI,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,IAAI,SAAS,CAAC,CAAA;YAC3E,IAAI,iBAAiB,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,CAAA;YAC5E,IAAI,oBAAoB,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,IAAI,gBAAgB,CAAC,CAAA;YACzF,IAAI,cAAc,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,IAAI,UAAU,CAAC,CAAA;YAC7E,IAAI,eAAe,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,IAAI,WAAW,CAAC,CAAA;YAE/E,IAAI,cAAc,EAAE;gBAClB,MAAM,oBAAoB,GAAiC,IAAA,uBAAa,EAAC,mBAAQ,CAAC,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAA;gBAC1G,oBAAoB;qBACjB,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,6BAA6B,CAAC;qBAC3D,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,uBAAuB,CAAC;qBACrD,KAAK,CAAC,qBAAqB,EAAE,EAAE,UAAU,EAAE,cAAc,CAAC,KAAK,EAAE,CAAC,CAAA;gBAErE,IAAI,YAAY,GAAG,MAAM,oBAAoB,CAAC,OAAO,EAAE,CAAA;gBAEvD,oBAAoB,GAAG;oBACrB,GAAG,oBAAoB,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,cAAc,CAAC,KAAK,CAAC;oBAClE,GAAG,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;oBAChC,GAAG,wBAAwB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;iBAC/C,CAAA;aACF;YAED,IAAI,aAAa,GAAG,EAAE,CAAA;YACtB,IAAI,oBAAoB,CAAC,MAAM,GAAG,CAAC,EAAE;gBACnC,aAAa,GAAG;kCACU,oBAAoB,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;;;UAG7E,CAAA;aACH;iBAAM;gBACL,aAAa,GAAG,OAAO,CAAA;aACxB;YAED,IAAI,YAAY,GAAG,EAAE,CAAA;YACrB,IAAI,aAAa,EAAE;gBACjB,IAAI,YAAY,GAAG,aAAa,CAAC,KAAK;qBACnC,WAAW,EAAE;qBACb,KAAK,CAAC,GAAG,CAAC;qBACV,GAAG,CAAC,IAAI,CAAC,EAAE;oBACV,OAAO,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,IAAI,CAAA;gBACtD,CAAC,CAAC;qBACD,IAAI,CAAC,GAAG,CAAC,CAAA;gBACZ,YAAY,GAAG;mDAC4B,YAAY;qDACV,YAAY;uDACV,YAAY;6DACN,YAAY;yDAChB,YAAY;wDACb,YAAY;gEACJ,YAAY;UAClE,CAAA;aACH;YAED,IAAI,iBAAiB,EAAE;gBACrB,IAAI,gBAAgB,GAAG,iBAAiB,CAAC,KAAK;qBAC3C,WAAW,EAAE;qBACb,KAAK,CAAC,GAAG,CAAC;qBACV,GAAG,CAAC,IAAI,CAAC,EAAE;oBACV,OAAO,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,IAAI,CAAA;gBACtD,CAAC,CAAC;qBACD,IAAI,CAAC,GAAG,CAAC,CAAA;gBACZ,YAAY;oBACV,YAAY;wBACZ;mDACyC,gBAAgB;UACzD,CAAA;aACH;YAED,IAAI,mBAAmB,GAAG,EAAE,CAAA;YAC5B,IAAI,oBAAoB,aAApB,oBAAoB,uBAApB,oBAAoB,CAAE,KAAK,EAAE;gBAC/B,mBAAmB,GAAG,iCAAiC,CAAA;aACxD;YAED,IAAI,cAAc,GAAG,EAAE,CAAA;YACvB,IAAI,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,KAAK,EAAE;gBACzB,cAAc,GAAG,wGAAwG,CAAA;aAC1H;YAED,IAAI,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,KAAK,EAAE;gBAC1B,cAAc,GAAG;8GACqF,CAAA;aACvG;YAED,MAAM,EAAE,CAAC,KAAK,CACZ;;;;;;;;;;;;;;;;;;;;;YAqBI,aAAa;YACb,YAAY;;;YAGZ,mBAAmB;YACnB,cAAc;UAChB,EACF,CAAC,MAAM,CAAC,EAAE,CAAC,CACZ,CAAA;YAED,MAAM,OAAO,GAAQ,MAAM,EAAE,CAAC,KAAK,CACjC;;;;SAIC,EACD,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,KAAK,EAAE,KAAK,CAAC,CAC5B,CAAA;YAED,MAAM,KAAK,GAAQ,MAAM,EAAE,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAA;YAE1E,EAAE,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAA;YAEvC,OAAO;gBACL,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,IAAS,EAAE,EAAE;oBAC/B,OAAO;wBACL,OAAO,EAAE;4BACP,EAAE,EAAE,IAAI,CAAC,EAAE;4BACX,IAAI,EAAE,IAAI,CAAC,IAAI;4BACf,GAAG,EAAE,IAAI,CAAC,GAAG;4BACb,KAAK,EAAE,IAAI,CAAC,KAAK;4BACjB,WAAW,EAAE,IAAI,CAAC,WAAW;4BAC7B,IAAI,EAAE,IAAI,CAAC,IAAI;4BACf,MAAM,EAAE,IAAI,CAAC,MAAM;4BACnB,YAAY,EAAE,IAAI,CAAC,YAAY;4BAC/B,UAAU,EAAE,IAAI,CAAC,UAAU;4BAC3B,MAAM,EAAE,IAAI,CAAC,MAAM;4BACnB,MAAM,EAAE,IAAI,CAAC,MAAM;4BACnB,WAAW,EAAE,IAAI,CAAC,WAAW;yBAC9B;wBACD,SAAS,EAAE;4BACT,EAAE,EAAE,IAAI,CAAC,WAAW;4BACpB,IAAI,EAAE,IAAI,CAAC,aAAa;yBACzB;wBACD,eAAe,EAAE,IAAI,CAAC,eAAe;wBACrC,GAAG,EAAE,IAAI,CAAC,GAAG;wBACb,QAAQ,EAAE,IAAI,CAAC,QAAQ;qBACxB,CAAA;gBACH,CAAC,CAAC;gBACF,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK;aACtB,CAAA;SACF;QAAC,OAAO,KAAK,EAAE;YACd,MAAM,KAAK,CAAA;SACZ;IACH,CAAC;IAGD,KAAK,CAAC,MAAM,CAAS,SAAoB;QACvC,OAAO,MAAM,IAAA,uBAAa,EAAC,cAAM,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAA;IAChE,CAAC;IAGD,KAAK,CAAC,OAAO,CAAS,SAAoB;QACxC,OAAO,MAAM,IAAA,uBAAa,EAAC,gBAAI,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,CAAA;IAC/D,CAAC;IAGD,KAAK,CAAC,OAAO,CAAS,SAAoB;QACxC,OAAO,MAAM,IAAA,uBAAa,EAAC,gBAAI,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,CAAA;IAC/D,CAAC;IAED;;;MAGE;IAEF,KAAK,CAAC,WAAW,CAAS,SAAoB;QAC5C,OAAO,MAAM,IAAA,uBAAa,EAAC,kCAAe,CAAC,CAAC,KAAK,CAAC;YAChD,KAAK,EAAE,EAAE,SAAS,EAAE;SACrB,CAAC,CAAA;IACJ,CAAC;IAED;;;;MAIE;IAEF,KAAK,CAAC,eAAe,CAAS,SAAoB;;QAChD,IAAI,CAAC,SAAS,CAAC,UAAU;YAAE,OAAO,EAAE,CAAA;QAEpC,IAAI,KAAK,GAAQ,MAAM,IAAA,uBAAa,EAAC,qBAAS,CAAC,CAAC,KAAK,CAAC;;;;uBAInC,SAAS,CAAC,UAAU;;KAEtC,CAAC,CAAA;QAEF,OAAO,CAAA,MAAA,KAAK,CAAC,CAAC,CAAC,0CAAE,eAAe,KAAI,EAAE,CAAA;IACxC,CAAC;IAGD,KAAK,CAAC,kBAAkB,CAAS,SAAoB;;QACnD,IAAI,CAAC,SAAS,CAAC,cAAc;YAAE,OAAO,EAAE,CAAA;QAExC,IAAI,KAAK,GAAQ,MAAM,IAAA,uBAAa,EAAC,qBAAS,CAAC,CAAC,KAAK,CAAC;;uBAEnC,SAAS,CAAC,cAAc;;KAE1C,CAAC,CAAA;QAEF,OAAO,CAAA,MAAA,KAAK,CAAC,CAAC,CAAC,0CAAE,kBAAkB,KAAI,EAAE,CAAA;IAC3C,CAAC;IAGD,KAAK,CAAC,kBAAkB,CAAS,SAAoB;;QACnD,IAAI,CAAC,SAAS,CAAC,UAAU;YAAE,OAAO,EAAE,CAAA;QAEpC,IAAI,KAAK,GAAQ,MAAM,IAAA,uBAAa,EAAC,qBAAS,CAAC,CAAC,KAAK,CAAC;;uBAEnC,SAAS,CAAC,UAAU;;KAEtC,CAAC,CAAA;QAEF,OAAO,CAAA,MAAA,KAAK,CAAC,CAAC,CAAC,0CAAE,kBAAkB,KAAI,EAAE,CAAA;IAC3C,CAAC;CACF,CAAA;AA9/BC;IAHC,IAAA,wBAAS,EAAC,uDAAuD,CAAC;IAClE,IAAA,wBAAS,EAAC,cAAc,CAAC;IACzB,IAAA,oBAAK,EAAC,OAAO,CAAC,EAAE,CAAC,+BAAa,CAAC;IAE7B,mBAAA,IAAA,kBAAG,GAAE,CAAA;IACL,mBAAA,IAAA,kBAAG,EAAC,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,cAAM,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;IACpD,mBAAA,IAAA,kBAAG,EAAC,YAAY,EAAE,IAAI,CAAC,EAAE,CAAC,kBAAU,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;IACzD,mBAAA,IAAA,kBAAG,EAAC,UAAU,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,eAAO,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;IACtD,mBAAA,IAAA,kBAAG,EAAC,sBAAsB,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,eAAO,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;;gFAFK,kBAAU,oBAAV,kBAAU;;iDAmJnF;AAID;IAFC,IAAA,wBAAS,EAAC,uDAAuD,CAAC;IAClE,IAAA,oBAAK,EAAC,OAAO,CAAC,EAAE,CAAC,qBAAS,CAAC;IACX,mBAAA,IAAA,kBAAG,EAAC,UAAU,CAAC,CAAA;IAAoB,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;+CAOxD;AAID;IAFC,IAAA,wBAAS,EAAC,uDAAuD,CAAC;IAClE,IAAA,oBAAK,EAAC,OAAO,CAAC,EAAE,CAAC,qBAAS,CAAC;IACH,mBAAA,IAAA,kBAAG,EAAC,UAAU,CAAC,CAAA;IAAoB,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;uDAOhE;AAKD;IAHC,IAAA,wBAAS,EAAC,uDAAuD,CAAC;IAClE,IAAA,wBAAS,EAAC,cAAc,CAAC;IACzB,IAAA,oBAAK,EAAC,OAAO,CAAC,EAAE,CAAC,+BAAa,CAAC;IACJ,mBAAA,IAAA,mBAAI,GAAE,CAAA;IAAqB,mBAAA,IAAA,kBAAG,GAAE,CAAA;;iEAAjB,iBAAS,oBAAT,iBAAS;;0DAkKnD;AAID;IAFC,IAAA,wBAAS,EAAC,cAAc,CAAC;IACzB,IAAA,oBAAK,EAAC,OAAO,CAAC,EAAE,CAAC,+BAAa,CAAC;IAE7B,mBAAA,IAAA,kBAAG,GAAE,CAAA;IACL,mBAAA,IAAA,kBAAG,EAAC,aAAa,CAAC,CAAA;IAClB,mBAAA,IAAA,kBAAG,EAAC,SAAS,CAAC,CAAA;IACd,mBAAA,IAAA,kBAAG,EAAC,aAAa,CAAC,CAAA;IAClB,mBAAA,IAAA,kBAAG,EAAC,YAAY,CAAC,CAAA;IACjB,mBAAA,IAAA,kBAAG,EAAC,aAAa,CAAC,CAAA;IAClB,mBAAA,IAAA,kBAAG,EAAC,aAAa,CAAC,CAAA;IAClB,mBAAA,IAAA,kBAAG,EAAC,KAAK,CAAC,CAAA;IACV,mBAAA,IAAA,kBAAG,EAAC,iBAAiB,CAAC,CAAA;IACtB,mBAAA,IAAA,kBAAG,EAAC,sBAAsB,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,eAAO,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;IAClE,oBAAA,IAAA,kBAAG,EAAC,YAAY,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;;;;2DA+BvC;AAID;IAFC,IAAA,wBAAS,EAAC,cAAc,CAAC;IACzB,IAAA,oBAAK,EAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC;IAEvB,mBAAA,IAAA,kBAAG,EAAC,SAAS,CAAC,CAAA;IACd,mBAAA,IAAA,kBAAG,EAAC,SAAS,CAAC,CAAA;IACd,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;8DAmBP;AAGD;IADC,IAAA,oBAAK,EAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC;IAEvB,mBAAA,IAAA,kBAAG,EAAC,SAAS,CAAC,CAAA;IACd,mBAAA,IAAA,kBAAG,EAAC,SAAS,CAAC,CAAA;IACd,mBAAA,IAAA,kBAAG,EAAC,SAAS,CAAC,CAAA;IACd,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;6DA0BP;AAGD;IADC,IAAA,oBAAK,EAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC;IAEvB,mBAAA,IAAA,kBAAG,EAAC,UAAU,CAAC,CAAA;IACf,mBAAA,IAAA,kBAAG,EAAC,cAAc,CAAC,CAAA;IACnB,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;yDAmBP;AAID;IAFC,IAAA,wBAAS,EAAC,uDAAuD,CAAC;IAClE,IAAA,oBAAK,EAAC,OAAO,CAAC,EAAE,CAAC,4CAA0B,CAAC;IAE1C,mBAAA,IAAA,kBAAG,GAAE,CAAA;IACL,mBAAA,IAAA,kBAAG,EAAC,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,cAAM,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;IACpD,mBAAA,IAAA,kBAAG,EAAC,YAAY,EAAE,IAAI,CAAC,EAAE,CAAC,kBAAU,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;IACzD,mBAAA,IAAA,kBAAG,EAAC,UAAU,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,eAAO,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;;gFADiB,kBAAU,oBAAV,kBAAU;;yDAgKnF;AAID;IAFC,IAAA,wBAAS,EAAC,uDAAuD,CAAC;IAClE,IAAA,oBAAK,EAAC,OAAO,CAAC,EAAE,CAAC,+BAAa,CAAC;IAE7B,mBAAA,IAAA,kBAAG,GAAE,CAAA;IACL,mBAAA,IAAA,kBAAG,EAAC,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,cAAM,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;IACpD,mBAAA,IAAA,kBAAG,EAAC,YAAY,EAAE,IAAI,CAAC,EAAE,CAAC,kBAAU,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;IACzD,mBAAA,IAAA,kBAAG,EAAC,UAAU,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,eAAO,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;IACtD,mBAAA,IAAA,kBAAG,EAAC,sBAAsB,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,eAAO,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;;gFAFK,kBAAU,oBAAV,kBAAU;;0DAoInF;AAKD;IAHC,IAAA,wBAAS,EAAC,uDAAuD,CAAC;IAClE,IAAA,wBAAS,EAAC,cAAc,CAAC;IACzB,IAAA,oBAAK,EAAC,OAAO,CAAC,EAAE,CAAC,+BAAa,CAAC;IACC,mBAAA,IAAA,mBAAI,GAAE,CAAA;IAAqB,mBAAA,IAAA,kBAAG,GAAE,CAAA;;iEAAjB,iBAAS,oBAAT,iBAAS;;+DAyKxD;AAGD;IADC,IAAA,4BAAa,EAAC,IAAI,CAAC,EAAE,CAAC,cAAM,CAAC;IAChB,mBAAA,IAAA,mBAAI,GAAE,CAAA;;6CAAY,qBAAS;;4CAExC;AAGD;IADC,IAAA,4BAAa,EAAC,IAAI,CAAC,EAAE,CAAC,gBAAI,CAAC;IACb,mBAAA,IAAA,mBAAI,GAAE,CAAA;;6CAAY,qBAAS;;6CAEzC;AAGD;IADC,IAAA,4BAAa,EAAC,IAAI,CAAC,EAAE,CAAC,gBAAI,CAAC;IACb,mBAAA,IAAA,mBAAI,GAAE,CAAA;;6CAAY,qBAAS;;6CAEzC;AAOD;IADC,IAAA,4BAAa,EAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC;IACX,mBAAA,IAAA,mBAAI,GAAE,CAAA;;6CAAY,qBAAS;;iDAI7C;AAQD;IADC,IAAA,4BAAa,EAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC;IACP,mBAAA,IAAA,mBAAI,GAAE,CAAA;;6CAAY,qBAAS;;qDAYjD;AAGD;IADC,IAAA,4BAAa,EAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC;IACJ,mBAAA,IAAA,mBAAI,GAAE,CAAA;;6CAAY,qBAAS;;wDAUpD;AAGD;IADC,IAAA,4BAAa,EAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC;IACJ,mBAAA,IAAA,mBAAI,GAAE,CAAA;;6CAAY,qBAAS;;wDAUpD;AAjgCU,cAAc;IAD1B,IAAA,uBAAQ,EAAC,qBAAS,CAAC;GACP,cAAc,CAkgC1B;AAlgCY,wCAAc;AAogCpB,KAAK,UAAU,qBAAqB,CACzC,EACE,WAAW,EACX,OAAO,EACP,UAAU,EACV,WAAW,EACX,UAAU,EACV,WAAW,EACX,WAAW,EACX,GAAG,EACH,eAAe,EACf,oBAAoB,EACrB,EACD,MAAqB;IAErB,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,qBAAS,CAAC,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAA;IAC1E,EAAE,CAAC,kBAAkB,CAAC,aAAa,EAAE,MAAM,CAAC;SACzC,kBAAkB,CAAC,cAAc,EAAE,KAAK,CAAC;SACzC,SAAS,CAAC,QAAQ,CAAC,EAAE,CACpB,QAAQ;SACL,MAAM,CAAC,+BAA+B,EAAE,YAAY,CAAC;SACrD,IAAI,CAAC,mBAAmB,EAAE,IAAI,CAAC;SAC/B,KAAK,CAAC,kCAAkC,CAAC;SACzC,QAAQ,CAAC,2FAA2F,CAAC;SACrG,QAAQ,CAAC,yCAAyC,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC,CACrF;SACA,SAAS,CAAC,QAAQ,CAAC,EAAE,CACpB,QAAQ;SACL,MAAM,CAAC,qCAAqC,EAAE,iBAAiB,CAAC;SAChE,IAAI,CAAC,mBAAmB,EAAE,IAAI,CAAC;SAC/B,KAAK,CAAC,kCAAkC,CAAC;SACzC,QAAQ,CAAC,2FAA2F,CAAC;SACrG,QAAQ,CAAC,yCAAyC,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC,CACrF;SACA,QAAQ,CAAC,8BAA8B,CAAC;SACxC,QAAQ,CAAC,4BAA4B,CAAC;SACtC,QAAQ,CAAC,qCAAqC,CAAC;SAC/C,QAAQ,CAAC,qCAAqC,CAAC;SAC/C,QAAQ,CAAC,oBAAoB,CAAC;SAC9B,QAAQ,CAAC,0BAA0B,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;SAC1D,QAAQ,CAAC,yCAAyC,EAAE;QACnD,aAAa,EAAE,CAAC,yBAAa,CAAC,UAAU,EAAE,yBAAa,CAAC,OAAO,CAAC;KACjE,CAAC;SACD,aAAa,CAAC;QACb,WAAW;QACX,UAAU;QACV,WAAW;QACX,WAAW;QACX,GAAG;KACJ,CAAC,CAAA;IAEJ,IAAI,OAAO,KAAK,EAAE,EAAE;QAClB,EAAE,CAAC,QAAQ,CAAC,6BAA6B,EAAE,EAAE,OAAO,EAAE,CAAC,CAAA;KACxD;IAED,IAAI,UAAU,EAAE;QACd,EAAE,CAAC,QAAQ,CAAC,mCAAmC,EAAE,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC,CAAA;KAC7E;IAED,QAAQ,eAAe,CAAC,WAAW,EAAE,EAAE;QACrC,KAAK,MAAM;YACT,EAAE,CAAC,OAAO,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAA;YACvC,IAAI,CAAA,oBAAoB,aAApB,oBAAoB,uBAApB,oBAAoB,CAAE,MAAM,IAAG,CAAC,EAAE;gBACpC,oBAAoB,CAAC,OAAO,CAAC,CAAC,IAAqC,EAAE,GAAW,EAAE,EAAE;oBAClF,EAAE,CAAC,UAAU,CAAC,OAAO,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;gBAC/D,CAAC,CAAC,CAAA;aACH;YACD,MAAK;QAEP,KAAK,MAAM;YACT,EAAE,CAAC,OAAO,CAAC,oBAAoB,EAAE,MAAM,CAAC,CAAA;YACxC,IAAI,CAAA,oBAAoB,aAApB,oBAAoB,uBAApB,oBAAoB,CAAE,MAAM,IAAG,CAAC,EAAE;gBACpC,oBAAoB,CAAC,OAAO,CAAC,CAAC,IAAqC,EAAE,GAAW,EAAE,EAAE;oBAClF,EAAE,CAAC,UAAU,CAAC,OAAO,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;gBAC/D,CAAC,CAAC,CAAA;aACH;YACD,MAAK;QAEP,KAAK,MAAM;YACT,EAAE,CAAC,OAAO,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAA;YAC5C,IAAI,CAAA,oBAAoB,aAApB,oBAAoB,uBAApB,oBAAoB,CAAE,MAAM,IAAG,CAAC,EAAE;gBACpC,oBAAoB,CAAC,OAAO,CAAC,CAAC,IAAqC,EAAE,GAAW,EAAE,EAAE;oBAClF,EAAE,CAAC,UAAU,CAAC,OAAO,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;gBAC/D,CAAC,CAAC,CAAA;aACH;YACD,MAAK;QAEP,KAAK,MAAM;YACT,EAAE,CAAC,OAAO,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAA;YAC7C,IAAI,CAAA,oBAAoB,aAApB,oBAAoB,uBAApB,oBAAoB,CAAE,MAAM,IAAG,CAAC,EAAE;gBACpC,oBAAoB,CAAC,OAAO,CAAC,CAAC,IAAqC,EAAE,GAAW,EAAE,EAAE;oBAClF,EAAE,CAAC,UAAU,CAAC,OAAO,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;gBAC/D,CAAC,CAAC,CAAA;aACH;YACD,MAAK;QAEP,KAAK,UAAU;YACb,IAAI,CAAA,oBAAoB,aAApB,oBAAoB,uBAApB,oBAAoB,CAAE,MAAM,IAAG,CAAC,EAAE;gBACpC,oBAAoB,CAAC,OAAO,CAAC,CAAC,IAAqC,EAAE,GAAW,EAAE,EAAE;oBAClF,GAAG,KAAK,CAAC;wBACP,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;wBAC5D,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;gBACnE,CAAC,CAAC,CAAA;aACH;;gBAAM,EAAE,CAAC,OAAO,CAAC,cAAc,EAAE,MAAM,CAAC,CAAA;YACzC,MAAK;KACR;IAED,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,MAAM,EAAE,CAAC,iBAAiB,EAAE,CAAA;IACtD,MAAM,KAAK,GAAG,QAAQ;SACnB,GAAG,CAAC,CAAC,GAAc,EAAE,GAAW,EAAE,EAAE;QACnC,MAAM,GAAG,GAAW,CAAA,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,GAAG,IAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;QAC9C,MAAM,QAAQ,GAAW,CAAA,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,QAAQ,IAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;QAC7D,MAAM,SAAS,GAAW,GAAG,CAAC,SAAS,IAAI,CAAC,CAAA;QAC5C,MAAM,cAAc,GAAW,GAAG,CAAC,cAAc,IAAI,CAAC,CAAA;QACtD,MAAM,UAAU,GAAW,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;QAC7D,MAAM,eAAe,GAAW,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAA;QAEzE,uCACK,GAAG,KACN,GAAG,EAAE,GAAG,GAAG,SAAS,GAAG,UAAU,EACjC,QAAQ,EAAE,QAAQ,GAAG,cAAc,GAAG,eAAe,IACtD;IACH,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,GAAc,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAEtC,MAAM,KAAK,GAAW,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAA;IACzC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAA;AACzB,CAAC;AA/HD,sDA+HC","sourcesContent":["import { Arg, Args, Ctx, Directive, FieldResolver, Query, Resolver, Root } from 'type-graphql'\nimport { Brackets, EntityManager, Equal, getRepository, Not, Repository, SelectQueryBuilder } from 'typeorm'\n\nimport { User } from '@things-factory/auth-base'\nimport { Bizplace, getPartnersCompanyBizplaces, getPermittedBizplaceIds } from '@things-factory/biz-base'\nimport { Product, ProductBundleSetting, ProductDetail } from '@things-factory/product-base'\nimport { Setting } from '@things-factory/setting-base'\nimport { buildQuery, Domain, Filter, ListParam, Pagination, Sorting } from '@things-factory/shell'\n\nimport { INVENTORY_STATUS, LOCATION_TYPE } from '../../constants'\nimport { InventoryChange } from '../inventory-change/inventory-change'\nimport { Inventory } from './inventory'\nimport { InventoryBundleGroupDetail, InventoryList } from './inventory-types'\n\n@Resolver(Inventory)\nexport class InventoryQuery {\n @Directive('@privilege(category: \"inventory\", privilege: \"query\")')\n @Directive('@transaction')\n @Query(returns => InventoryList)\n async inventories(\n @Ctx() context: any,\n @Arg('filters', type => [Filter], { nullable: true }) filters?: Filter[],\n @Arg('pagination', type => Pagination, { nullable: true }) pagination?: Pagination,\n @Arg('sortings', type => [Sorting], { nullable: true }) sortings?: Sorting[],\n @Arg('locationSortingRules', type => [Sorting], { nullable: true }) locationSortingRules?: Sorting[]\n ): Promise<InventoryList> {\n const { domain, user, tx }: { domain: Domain; user: User; tx: EntityManager } = context.state\n\n try {\n const productFilters = filters.find(x => x.name == 'product_info')\n filters = filters.filter(x => x.name != 'product_info')\n const params = { filters, pagination }\n\n if (!params.filters.find((filter: any) => filter.name === 'bizplace')) {\n params.filters.push({\n name: 'bizplace',\n operator: 'in',\n value: await getPermittedBizplaceIds(domain, user),\n relation: true\n })\n }\n\n const remainOnlyParam: { name: string; operator: string; value: boolean } = params?.filters?.find(\n (f: { name: string; operator: string; value: any }) => f.name === 'remainOnly'\n )\n\n let remainOnly: boolean = false\n if (typeof remainOnlyParam?.value !== 'undefined') {\n remainOnly = remainOnlyParam.value\n params.filters = params.filters.filter(\n (f: { name: string; operator: string; value: any }) => f.name !== 'remainOnly'\n )\n }\n\n const unlockOnlyParam: { name: string; operator: string; value: boolean } = params?.filters?.find(\n (f: { name: string; operator: string; value: any }) => f.name === 'unlockOnly'\n )\n\n let unlockOnly: boolean = false\n if (typeof unlockOnlyParam?.value !== 'undefined') {\n unlockOnly = unlockOnlyParam.value\n params.filters = params.filters.filter(\n (f: { name: string; operator: string; value: any }) => f.name !== 'unlockOnly'\n )\n }\n\n const qb: SelectQueryBuilder<Inventory> = getRepository(Inventory).createQueryBuilder('iv')\n buildQuery(qb, params, context, {\n searchables: ['warehouse', 'product', 'batchId']\n })\n\n qb.leftJoinAndSelect('iv.bizplace', 'bizplace')\n .leftJoinAndSelect('iv.product', 'product')\n .leftJoinAndSelect('iv.warehouse', 'warehouse')\n .leftJoinAndSelect('iv.location', 'location')\n .leftJoin('iv.inventoryItems', 'ivi')\n .loadRelationCountAndMap('iv.inventoryItemCount', 'iv.inventoryItems', 'ivic', qb =>\n qb.andWhere('ivic.status = :ivicStatus', {\n ivicStatus: INVENTORY_STATUS.STORED\n })\n )\n\n if (remainOnly) {\n qb.andWhere('iv.qty > 0')\n .andWhere('CASE WHEN iv.lockedQty IS NULL THEN 0 ELSE iv.lockedQty END >= 0')\n .andWhere('iv.qty - CASE WHEN iv.lockedQty IS NULL THEN 0 ELSE iv.lockedQty END > 0')\n }\n\n if (unlockOnly) {\n qb.andWhere('CASE WHEN iv.lockedQty IS NULL THEN 0 ELSE iv.lockedQty END = 0')\n }\n\n if (productFilters) {\n let productFilterValue = `%${productFilters.value.toLowerCase()}%`\n qb.andWhere(qb => {\n const subQuery = qb\n .subQuery()\n .select()\n .from(Product, `products`)\n .where(`products.id = iv.product_id`)\n .andWhere(\n new Brackets(qb => {\n qb.where('Lower(products.sku) LIKE :productInfo', { productInfo: productFilterValue })\n .orWhere('Lower(products.name) LIKE :productInfo', { productInfo: productFilterValue })\n .orWhere('Lower(products.description) LIKE :productInfo', { productInfo: productFilterValue })\n .orWhere('Lower(products.brand) LIKE :productInfo', { productInfo: productFilterValue })\n })\n )\n .getQuery()\n return `EXISTS ${subQuery}`\n })\n }\n\n if (sortings?.length !== 0) {\n const arrChildSortData = ['bizplace', 'product', 'location', 'warehouse', 'zone']\n const sort = (sortings || []).reduce(\n (acc, sort) => ({\n ...acc,\n [arrChildSortData.indexOf(sort.name) >= 0 ? sort.name + '.name' : 'iv.' + sort.name]: sort.desc\n ? 'DESC'\n : 'ASC'\n }),\n {}\n )\n qb.orderBy(sort)\n }\n\n if (locationSortingRules?.length > 0) {\n locationSortingRules.forEach((rule: { name: string; desc: boolean }) => {\n qb.addOrderBy(`location.${rule.name}`, rule.desc ? 'DESC' : 'ASC')\n })\n }\n\n let [items, total] = await qb.getManyAndCount()\n items = await Promise.all(\n items.map(async (item: Inventory) => {\n let [productDetails, inventoryItems] = await Promise.all([\n getRepository(ProductDetail).find({\n where: {\n product: item.product.id,\n packingType: item.packingType,\n packingSize: item.packingSize\n }\n }),\n tx.query(\n `\n SELECT string_agg(ii.serial_number, ', ') AS \"serialNumbers\"\n FROM inventory_items ii\n WHERE ii.inventory_id = $1\n GROUP BY ii.inventory_id \n `,\n [item.id]\n )\n ])\n\n item.product['productDetails'] = productDetails\n return {\n ...item,\n remainQty: item.qty - (item.lockedQty ? item.lockedQty : 0),\n remainUomValue: item.uomValue - (item.lockedUomValue ? item.lockedUomValue : 0),\n serialNumbers: inventoryItems[0]?.serialNumbers\n }\n })\n )\n\n return { items, total }\n } catch (error) {\n throw error\n }\n }\n\n @Directive('@privilege(category: \"inventory\", privilege: \"query\")')\n @Query(returns => Inventory)\n async inventory(@Arg('palletId') palletId: string, @Ctx() context: any): Promise<Inventory> {\n const { domain }: { domain: Domain } = context.state\n\n return await getRepository(Inventory).findOne({\n where: { domain: domain, palletId },\n relations: ['domain', 'bizplace', 'product', 'location', 'warehouse', 'creator', 'updater']\n })\n }\n\n @Directive('@privilege(category: \"inventory\", privilege: \"query\")')\n @Query(returns => Inventory)\n async inventoryByPallet(@Arg('palletId') palletId: string, @Ctx() context: any): Promise<Inventory> {\n const { domain }: { domain: Domain } = context.state\n\n return await getRepository(Inventory).findOne({\n where: { domain, palletId, status: Not(Equal(INVENTORY_STATUS.TERMINATED)) },\n relations: ['domain', 'bizplace', 'product', 'location', 'warehouse', 'creator', 'updater']\n })\n }\n\n @Directive('@privilege(category: \"inventory\", privilege: \"query\")')\n @Directive('@transaction')\n @Query(returns => InventoryList)\n async inventoriesByProduct(@Args() params: ListParam, @Ctx() context: any): Promise<InventoryList> {\n try {\n const { domain, user, tx }: { domain: Domain; user: User; tx: EntityManager } = context.state\n let permittedBizplaceIds: string[] = await getPermittedBizplaceIds(domain, user)\n const partnersCompanyBizplaces: Bizplace[] = await getPartnersCompanyBizplaces(domain, user)\n\n const page = params.pagination.page\n const limit = params.pagination.limit\n\n let bizplaceFilter = params.filters.find(filter => filter.name == 'bizplace')\n let productFilter = params.filters.find(filter => filter.name == 'product')\n let productTypeFilter = params.filters.find(filter => filter.name == 'type')\n let availableStockFilter = params.filters.find(filter => filter.name == 'availableStock')\n let lowStockFilter = params.filters.find(filter => filter.name == 'lowStock')\n let overStockFilter = params.filters.find(filter => filter.name == 'overStock')\n\n if (bizplaceFilter) {\n const bizplaceQueryBuilder: SelectQueryBuilder<Bizplace> = getRepository(Bizplace).createQueryBuilder('b')\n bizplaceQueryBuilder\n .innerJoin('companies', 'c2', ' c2.domain_id = b.domain_id')\n .innerJoin('bizplaces', 'b2', 'b2.company_id = c2.id')\n .where('b2.id = :bizplaceId', { bizplaceId: bizplaceFilter.value })\n\n let bizplaceList = await bizplaceQueryBuilder.getMany()\n\n permittedBizplaceIds = [\n ...permittedBizplaceIds.filter(itm => itm == bizplaceFilter.value),\n ...bizplaceList.map(bz => bz.id),\n ...partnersCompanyBizplaces.map(biz => biz.id)\n ]\n }\n\n let bizplaceQuery = ''\n if (permittedBizplaceIds.length > 0) {\n bizplaceQuery = `AND EXISTS (\n SELECT * FROM (VALUES ${permittedBizplaceIds.map(id => `('${id}')`).join(',')})\n AS bizFilter(bizplace_id)\n WHERE bizFilter.bizplace_id::uuid = \"Inventory\".\"bizplace_id\"\n )`\n } else {\n bizplaceQuery = `1 = 0`\n }\n\n let productQuery = ''\n if (productFilter) {\n let productValue = productFilter.value\n .toLowerCase()\n .split(',')\n .map(prod => {\n return \"'%\" + prod.trim().replace(/'/g, \"''\") + \"%'\"\n })\n .join(',')\n productQuery = `AND (\n Lower(\"Product\".\"name\") LIKE ANY(ARRAY[${productValue}])\n OR Lower(\"Product\".\"sku\") LIKE ANY(ARRAY[${productValue}])\n OR Lower(\"Product\".\"brand\") LIKE ANY(ARRAY[${productValue}])\n OR Lower(\"Product\".\"description\") LIKE ANY(ARRAY[${productValue}])\n OR Lower(\"ProductRef\".\"name\") LIKE ANY(ARRAY[${productValue}])\n OR Lower(\"ProductRef\".\"sku\") LIKE ANY(ARRAY[${productValue}])\n OR Lower(\"ProductRef\".\"description\") LIKE ANY(ARRAY[${productValue}])\n )`\n }\n\n if (productTypeFilter) {\n let productTypeValue = productTypeFilter.value\n .toLowerCase()\n .split(',')\n .map(prod => {\n return \"'%\" + prod.trim().replace(/'/g, \"''\") + \"%'\"\n })\n .join(',')\n productQuery =\n productQuery +\n ` AND (\n Lower(\"Product\".\"type\") LIKE ANY(ARRAY[${productTypeValue}])\n )`\n }\n\n let availableStockQuery = ''\n if (availableStockFilter?.value) {\n availableStockQuery = ` AND SUM(\"Inventory\".\"qty\") > 0`\n }\n\n let thresholdQuery = ''\n if (lowStockFilter?.value) {\n thresholdQuery = `AND COALESCE(\"ProductDetailBizplaceSetting\".\"min_qty\", \"Product\".\"min_qty\",0) > SUM(\"Inventory\".\"qty\")`\n }\n\n if (overStockFilter?.value) {\n thresholdQuery = `AND COALESCE(\"ProductDetailBizplaceSetting\".\"max_qty\", \"Product\".\"max_qty\",0) > 0 AND \n COALESCE(\"ProductDetailBizplaceSetting\".\"max_qty\", \"Product\".\"max_qty\",0) < SUM(\"Inventory\".\"qty\")`\n }\n\n await tx.query(\n `\n create temp table temp_inv_history AS \n (\n SELECT \"Product\".\"id\" AS \"id\", \"Product\".\"sku\" AS \"sku\", \"Product\".\"brand\" AS \"brand\", \"Product\".\"name\" AS \"name\", \"Product\".\"type\" AS \"type\", \"Product\".\"description\" AS \"description\", \n \"Product\".\"weight\" AS \"weight\", \"ProductRef\".\"id\" AS \"productRefId\", \n \"ProductRef\".\"description\" AS \"productRefDesciption\", \"Bizplace\".\"id\" AS \"bizplaceId\", \"Bizplace\".\"name\" AS \"bizplaceName\", SUM(\"Inventory\".\"qty\") AS \"qty\" ,\n CASE WHEN SUM(\"Inventory\".\"qty\") > 0 THEN SUM(COALESCE(\"Inventory\".\"unit_cost\", 0) * \"Inventory\".\"qty\")/ SUM(\"Inventory\".\"qty\") ELSE 0 END AS \"averageUnitCost\",\n COALESCE(\"ProductDetailBizplaceSetting\".\"min_qty\", \"Product\".\"min_qty\",0) AS \"minQty\", \n COALESCE(\"ProductDetailBizplaceSetting\".\"max_qty\", \"Product\".\"max_qty\",0) AS \"maxQty\"\n FROM \"inventories\" \"Inventory\" \n LEFT JOIN \"products\" \"Product\" ON \"Product\".\"id\"=\"Inventory\".\"product_id\" \n LEFT JOIN \"product_details\" \"ProductDetails\" ON \"ProductDetails\".\"product_id\" = \"Product\".\"id\" \n AND \"ProductDetails\".\"is_default\"\n LEFT JOIN \"product_detail_bizplace_settings\" \"ProductDetailBizplaceSetting\" ON \"ProductDetailBizplaceSetting\".\"product_detail_id\" = \"ProductDetails\".\"id\" \n AND \"ProductDetailBizplaceSetting\".\"domain_id\" = \"Inventory\".\"domain_id\"\n LEFT JOIN \"products\" \"ProductRef\" ON \"ProductRef\".\"id\"=\"Product\".\"product_ref_id\" \n INNER JOIN \"bizplaces\" \"Bizplace\" ON \"Bizplace\".\"id\"=\"Inventory\".\"bizplace_id\"\n WHERE \"Inventory\".\"qty\" >= 0\n AND \"Inventory\".\"status\" <> 'MISSING'\n AND \"Inventory\".\"domain_id\" = $1\n ${bizplaceQuery}\n ${productQuery}\n GROUP BY \"Product\".\"id\", \"ProductRef\".\"id\", \"Bizplace\".\"id\", \"ProductDetailBizplaceSetting\".\"id\"\n HAVING 1 = 1\n ${availableStockQuery}\n ${thresholdQuery}\n )`,\n [domain.id]\n )\n\n const results: any = await tx.query(\n `\n SELECT * FROM temp_inv_history\n ORDER BY \"bizplaceName\", \"sku\" \n OFFSET $1 LIMIT $2\n `,\n [(page - 1) * limit, limit]\n )\n\n const total: any = await tx.query(`SELECT COUNT(*) FROM temp_inv_history`)\n\n tx.query(`drop table temp_inv_history`)\n\n return {\n items: results.map((item: any) => {\n return {\n product: {\n id: item.id,\n name: item.name,\n sku: item.sku,\n brand: item.brand,\n description: item.description,\n type: item.type,\n weight: item.weight,\n productRefId: item.productRefId,\n bizplaceId: item.bizplaceId,\n minQty: item.minQty,\n maxQty: item.maxQty\n },\n averageUnitCost: item.averageUnitCost,\n qty: item.qty\n }\n }),\n total: total[0].count\n }\n } catch (error) {\n throw error\n }\n }\n\n @Directive('@transaction')\n @Query(returns => InventoryList)\n async inventoriesByStrategy(\n @Ctx() context: any,\n @Arg('worksheetId') worksheetId: string,\n @Arg('batchId') batchId: string,\n @Arg('productName') productName: string,\n @Arg('productSku') productSku: string,\n @Arg('packingType') packingType: string,\n @Arg('packingSize') packingSize: number,\n @Arg('uom') uom: string,\n @Arg('pickingStrategy') pickingStrategy: string,\n @Arg('locationSortingRules', type => [Sorting], { nullable: true }) locationSortingRules?: Sorting[],\n @Arg('bizplaceId', { nullable: true }) bizplaceId?: string\n ): Promise<InventoryList> {\n const { domain, tx }: { domain: Domain; tx: EntityManager } = context.state\n\n const inventoryAssignmentSetting: Setting = await tx.getRepository(Setting).findOne({\n where: { domain, name: 'rule-for-inventory-assignment' }\n })\n\n if (!locationSortingRules && inventoryAssignmentSetting) {\n locationSortingRules = []\n let locationSetting = JSON.parse(inventoryAssignmentSetting.value)\n for (const key in locationSetting) {\n locationSortingRules.push({ name: key, desc: locationSetting[key] == 'ASC' ? false : true })\n }\n }\n\n return inventoriesByStrategy(\n {\n worksheetId,\n batchId,\n bizplaceId,\n productName,\n productSku,\n packingType,\n packingSize,\n uom,\n pickingStrategy,\n locationSortingRules\n },\n tx\n )\n }\n\n @Directive('@transaction')\n @Query(returns => Boolean)\n async checkProductIdenticality(\n @Arg('palletA') palletA: string,\n @Arg('palletB') palletB: string,\n @Ctx() context: any\n ): Promise<Boolean> {\n const { tx }: { tx: EntityManager } = context.state\n const invRepo: Repository<Inventory> = tx.getRepository(Inventory)\n const invA: Inventory = await invRepo.findOne({\n where: { domain: context.state.domain, palletId: palletA, status: INVENTORY_STATUS.STORED },\n relations: ['product']\n })\n\n const invB: Inventory = await invRepo.findOne({\n where: { domain: context.state.domain, palletId: palletB, status: INVENTORY_STATUS.STORED },\n relations: ['product']\n })\n\n return (\n invA?.batchId === invB?.batchId &&\n invA?.product?.id === invB?.product?.id &&\n invA?.packingType === invB?.packingType\n )\n }\n\n @Query(returns => Boolean)\n async checkCartonIdenticality(\n @Arg('cartonA') cartonA: string,\n @Arg('palletA') palletA: string,\n @Arg('cartonB') cartonB: string,\n @Ctx() context: any\n ) {\n const invRepo: Repository<Inventory> = getRepository(Inventory)\n const invA: Inventory = await invRepo.findOne({\n where: { domain: context.state.domain, palletId: palletA, cartonId: cartonA, status: INVENTORY_STATUS.STORED },\n relations: ['product']\n })\n\n const invB: Inventory = await invRepo.findOne({\n where: {\n domain: context.state.domain,\n packingType: invA.packingType,\n packingSize: invA.packingSize,\n product: invA.product,\n cartonId: cartonB,\n status: INVENTORY_STATUS.STORED\n },\n relations: ['product']\n })\n\n return (\n invA?.expirationDate === invB?.expirationDate &&\n invA?.product?.id === invB?.product?.id &&\n invA?.packingType === invB?.packingType &&\n invA?.packingSize === invB?.packingSize\n )\n }\n\n @Query(returns => Boolean)\n async checkInventoryOwner(\n @Arg('palletId') palletId: string,\n @Arg('bizplaceName') bizplaceName: string,\n @Ctx() context: any\n ): Promise<Boolean> {\n const invRepo: Repository<Inventory> = getRepository(Inventory)\n const bizRepo: Repository<Bizplace> = getRepository(Bizplace)\n\n const inventory: Inventory = await invRepo.findOne({\n where: { domain: context.state.domain, palletId, status: INVENTORY_STATUS.STORED },\n relations: ['bizplace']\n })\n\n if (!inventory) throw new Error('This inventory status is not stored.')\n\n const ownerBizplace: Bizplace = await bizRepo.findOne({\n where: { name: bizplaceName }\n })\n\n const foundBizplace: Bizplace = inventory.bizplace\n\n return Boolean(ownerBizplace.id === foundBizplace.id)\n }\n\n @Directive('@privilege(category: \"inventory\", privilege: \"query\")')\n @Query(returns => InventoryBundleGroupDetail)\n async inventoriesByBundle(\n @Ctx() context: any,\n @Arg('filters', type => [Filter], { nullable: true }) filters?: Filter[],\n @Arg('pagination', type => Pagination, { nullable: true }) pagination?: Pagination,\n @Arg('sortings', type => [Sorting], { nullable: true }) sortings?: Sorting[]\n ): Promise<InventoryBundleGroupDetail> {\n const { domain, user }: { domain: Domain; user: User } = context.state\n\n const params = { filters, pagination }\n\n const productBundleId = params.filters.filter(x => x.name === 'productBundleId')[0].value\n if (!productBundleId) {\n throw new Error('params product bundle is missing')\n }\n\n const bundleReleaseQty: number = params.filters.filter(x => x.name === 'bundleReleaseQty')[0].value\n\n // remove productBundleId and bundleReleaseQty from params.filters\n params.filters = params.filters.filter(x => x.name !== 'productBundleId' && x.name !== 'bundleReleaseQty')\n\n if (!params.filters.find((filter: any) => filter.name === 'bizplace_id')) {\n params.filters.push({\n name: 'bizplace_id',\n operator: 'in',\n value: await getPermittedBizplaceIds(domain, user),\n relation: true\n })\n }\n\n const remainOnlyParam: { name: string; operator: string; value: boolean } = params?.filters?.find(\n (f: { name: string; operator: string; value: any }) => f.name === 'remainOnly'\n )\n\n let remainOnly: boolean = false\n if (typeof remainOnlyParam?.value !== 'undefined') {\n remainOnly = remainOnlyParam.value\n params.filters = params.filters.filter(\n (f: { name: string; operator: string; value: any }) => f.name !== 'remainOnly'\n )\n }\n\n const unlockOnlyParam: { name: string; operator: string; value: boolean } = params?.filters?.find(\n (f: { name: string; operator: string; value: any }) => f.name === 'unlockOnly'\n )\n\n let unlockOnly: boolean = false\n if (typeof unlockOnlyParam?.value !== 'undefined') {\n unlockOnly = unlockOnlyParam.value\n params.filters = params.filters.filter(\n (f: { name: string; operator: string; value: any }) => f.name !== 'unlockOnly'\n )\n }\n\n const productBundleSettings: ProductBundleSetting[] = await getRepository(ProductBundleSetting).find({\n where: { productBundle: productBundleId },\n relations: ['product', 'productBundle']\n })\n\n if (!productBundleSettings.length) {\n throw new Error('product bundle settings is not found')\n }\n\n const qb: SelectQueryBuilder<Inventory> = getRepository(Inventory).createQueryBuilder('iv')\n buildQuery(qb, params, context)\n\n qb.select('iv.product_id', 'productId')\n .addSelect('iv.batch_id', 'batchId')\n .addSelect('iv.batch_id_ref', 'batchIdRef')\n .addSelect('iv.packing_type', 'packingType')\n .addSelect('SUM(iv.qty)', 'qty')\n .addSelect('SUM(iv.locked_qty)', 'lockedQty')\n .addSelect('SUM(iv.uom_value)', 'uomValue')\n .addSelect('SUM(iv.locked_uom_value)', 'lockedUomValue')\n .addSelect('prd.sku', 'productSku')\n .addSelect('prd.name', 'productName')\n .addSelect('prd.description', 'productDescription')\n .addSelect('prd.type', 'productType')\n .addSelect('prd.primary_unit', 'uom')\n .leftJoin('iv.product', 'prd')\n\n if (remainOnly) {\n qb.andWhere('iv.qty > 0')\n .andWhere('CASE WHEN iv.lockedQty IS NULL THEN 0 ELSE iv.lockedQty END >= 0')\n .andWhere('iv.qty - CASE WHEN iv.lockedQty IS NULL THEN 0 ELSE iv.lockedQty END > 0')\n }\n\n if (unlockOnly) {\n qb.andWhere('CASE WHEN iv.lockedQty IS NULL THEN 0 ELSE iv.lockedQty END = 0')\n }\n\n qb.andWhere('iv.product_id IN (:...productIds)', {\n productIds: productBundleSettings.map(productBundle => productBundle.product.id)\n })\n .groupBy('iv.product_id')\n .addGroupBy('iv.batch_id')\n .addGroupBy('iv.batch_id_ref')\n .addGroupBy('iv.packing_type')\n .addGroupBy('prd.sku')\n .addGroupBy('prd.name')\n .addGroupBy('prd.description')\n .addGroupBy('prd.type')\n .addOrderBy('prd.name')\n .addGroupBy('prd.primary_unit')\n .addOrderBy('iv.batch_id')\n\n let bundleGroup = await qb.getRawMany()\n\n bundleGroup = bundleGroup.map((item: any) => {\n return {\n ...item,\n bundleId: productBundleId,\n remainQty: item.qty - (item.lockedQty ? item.lockedQty : 0),\n remainUomValue: item.uomValue - (item.lockedUomValue ? item.lockedUomValue : 0),\n uom: item.uom,\n bundleQty: productBundleSettings.filter(pbs => pbs.product.id === item.productId)[0].bundleQty\n }\n })\n\n const bundleSetting = productBundleSettings.map(pbs => {\n return {\n id: pbs.id,\n productId: pbs.product.id,\n bundleId: pbs.productBundle.id,\n bundleQty: pbs.bundleQty,\n releaseQty: bundleReleaseQty * pbs.bundleQty,\n productReleaseQty: 0,\n productReleaseUomValue: 0\n }\n })\n\n /** ************************ **/\n bundleGroup = bundleGroup\n .map(group => {\n const uomValue = group.remainUomValue / group.remainQty\n\n bundleSetting.forEach(setting => {\n let assigned = false\n let releaseQty = 0\n let releaseUomValue = 0\n\n if (group.productId === setting.productId) {\n if (setting.productReleaseQty < setting.releaseQty) {\n assigned = true\n const leftQty = setting.releaseQty - setting.productReleaseQty\n releaseQty = leftQty > group.remainQty ? group.remainQty : leftQty\n releaseUomValue = Math.round(releaseQty * uomValue * 100) / 100\n setting.productReleaseQty += releaseQty\n setting.productReleaseUomValue += releaseUomValue\n }\n\n group.assigned = assigned\n group.releaseQty = releaseQty\n group.releaseUomValue = releaseUomValue\n group.releaseUomValueWithUom = `${releaseUomValue} ${group.uom}`\n }\n })\n\n return group\n })\n .filter(group => group.assigned)\n /** ************************ **/\n\n return { bundleGroup, bundleSetting }\n }\n\n @Directive('@privilege(category: \"inventory\", privilege: \"query\")')\n @Query(returns => InventoryList)\n async inventoriesForExport(\n @Ctx() context: any,\n @Arg('filters', type => [Filter], { nullable: true }) filters?: Filter[],\n @Arg('pagination', type => Pagination, { nullable: true }) pagination?: Pagination,\n @Arg('sortings', type => [Sorting], { nullable: true }) sortings?: Sorting[],\n @Arg('locationSortingRules', type => [Sorting], { nullable: true }) locationSortingRules?: Sorting[]\n ): Promise<InventoryList> {\n const { domain, user } = context.state\n const { page, limit } = pagination\n\n try {\n const productFilters = filters.find(x => x.name == 'product_info')\n filters = filters.filter(x => x.name != 'product_info')\n const params = { filters, pagination }\n\n if (!params.filters.find((filter: any) => filter.name === 'bizplace')) {\n throw new Error('Please select a customer for export.')\n }\n\n const remainOnlyParam: { name: string; operator: string; value: boolean } = params?.filters?.find(\n (f: { name: string; operator: string; value: any }) => f.name === 'remainOnly'\n )\n\n let remainOnly: boolean = false\n if (typeof remainOnlyParam?.value !== 'undefined') {\n remainOnly = remainOnlyParam.value\n params.filters = params.filters.filter(\n (f: { name: string; operator: string; value: any }) => f.name !== 'remainOnly'\n )\n }\n\n const unlockOnlyParam: { name: string; operator: string; value: boolean } = params?.filters?.find(\n (f: { name: string; operator: string; value: any }) => f.name === 'unlockOnly'\n )\n\n let unlockOnly: boolean = false\n if (typeof unlockOnlyParam?.value !== 'undefined') {\n unlockOnly = unlockOnlyParam.value\n params.filters = params.filters.filter(\n (f: { name: string; operator: string; value: any }) => f.name !== 'unlockOnly'\n )\n }\n\n const qb: SelectQueryBuilder<Inventory> = getRepository(Inventory).createQueryBuilder('Inventory')\n buildQuery(qb, params, context)\n\n qb.leftJoinAndSelect('Inventory.bizplace', 'Bizplace')\n .leftJoinAndSelect('Inventory.product', 'Product')\n .leftJoinAndSelect('Inventory.warehouse', 'Warehouse')\n .leftJoinAndSelect('Inventory.location', 'Location')\n .leftJoinAndSelect('Inventory.creator', 'Creator')\n .leftJoinAndSelect('Inventory.updater', 'Updater')\n .leftJoinAndSelect(\n subQuery => {\n return subQuery\n .select('ii.inventory_id', 'inventory_id')\n .addSelect(`string_agg(ii.serial_number, ', ')`, 'serial_numbers')\n .from('inventory_items', 'ii')\n .where(`ii.domain_id = :domainId`, { domainId: domain.id })\n .groupBy('ii.inventory_id')\n },\n 'ii2',\n 'ii2.inventory_id = Inventory.id'\n )\n\n if (remainOnly) {\n qb.andWhere('Inventory.qty > 0')\n .andWhere('CASE WHEN Inventory.locked_qty IS NULL THEN 0 ELSE Inventory.locked_qty END >= 0')\n .andWhere('Inventory.qty - CASE WHEN Inventory.locked_qty IS NULL THEN 0 ELSE Inventory.locked_qty END > 0')\n }\n\n if (unlockOnly) {\n qb.andWhere('CASE WHEN Inventory.locked_qty IS NULL THEN 0 ELSE Inventory.locked_qty END = 0')\n }\n\n if (productFilters) {\n let productFilterValue = `%${productFilters.value.toLowerCase()}%`\n qb.andWhere(qb => {\n const subQuery = qb\n .subQuery()\n .select()\n .from(Product, `products`)\n .where(`products.id = Inventory.product_id`)\n .andWhere(\n new Brackets(qb => {\n qb.where('Lower(products.sku) LIKE :productInfo', { productInfo: productFilterValue })\n .orWhere('Lower(products.name) LIKE :productInfo', { productInfo: productFilterValue })\n .orWhere('Lower(products.description) LIKE :productInfo', { productInfo: productFilterValue })\n .orWhere('Lower(products.brand) LIKE :productInfo', { productInfo: productFilterValue })\n })\n )\n .getQuery()\n return `EXISTS ${subQuery}`\n })\n }\n\n if (sortings?.length !== 0) {\n const arrChildSortData = ['bizplace', 'product', 'location', 'warehouse', 'zone']\n const sort = (sortings || []).reduce(\n (acc, sort) => ({\n ...acc,\n [arrChildSortData.indexOf(sort.name) >= 0 ? sort.name + '.name' : 'Inventory.' + sort.name]: sort.desc\n ? 'DESC'\n : 'ASC'\n }),\n {}\n )\n qb.orderBy(sort)\n }\n\n if (locationSortingRules?.length > 0) {\n locationSortingRules.forEach((rule: { name: string; desc: boolean }) => {\n qb.addOrderBy(`location.${rule.name}`, rule.desc ? 'DESC' : 'ASC')\n })\n }\n\n let items = await qb\n .offset((page - 1) * limit)\n .limit(limit)\n .getRawMany()\n\n let total = await qb.getCount()\n\n return {\n items: items.map(item => {\n return {\n ...new Inventory(item),\n serialNumbers: item.serial_numbers\n }\n }),\n total\n }\n } catch (error) {\n throw error\n }\n }\n\n @Directive('@privilege(category: \"inventory\", privilege: \"query\")')\n @Directive('@transaction')\n @Query(returns => InventoryList)\n async inventoriesGroupByProduct(@Args() params: ListParam, @Ctx() context: any): Promise<InventoryList> {\n try {\n const { domain, user, tx }: { domain: Domain; user: User; tx: EntityManager } = context.state\n let permittedBizplaceIds: string[] = await getPermittedBizplaceIds(domain, user)\n const partnersCompanyBizplaces: Bizplace[] = await getPartnersCompanyBizplaces(domain, user)\n\n const page = params.pagination.page\n const limit = params.pagination.limit\n\n let bizplaceFilter = params.filters.find(filter => filter.name == 'bizplace')\n let productFilter = params.filters.find(filter => filter.name == 'product')\n let productTypeFilter = params.filters.find(filter => filter.name == 'type')\n let availableStockFilter = params.filters.find(filter => filter.name == 'availableStock')\n let lowStockFilter = params.filters.find(filter => filter.name == 'lowStock')\n let overStockFilter = params.filters.find(filter => filter.name == 'overStock')\n\n if (bizplaceFilter) {\n const bizplaceQueryBuilder: SelectQueryBuilder<Bizplace> = getRepository(Bizplace).createQueryBuilder('b')\n bizplaceQueryBuilder\n .innerJoin('companies', 'c2', ' c2.domain_id = b.domain_id')\n .innerJoin('bizplaces', 'b2', 'b2.company_id = c2.id')\n .where('b2.id = :bizplaceId', { bizplaceId: bizplaceFilter.value })\n\n let bizplaceList = await bizplaceQueryBuilder.getMany()\n\n permittedBizplaceIds = [\n ...permittedBizplaceIds.filter(itm => itm == bizplaceFilter.value),\n ...bizplaceList.map(bz => bz.id),\n ...partnersCompanyBizplaces.map(biz => biz.id)\n ]\n }\n\n let bizplaceQuery = ''\n if (permittedBizplaceIds.length > 0) {\n bizplaceQuery = `AND EXISTS (\n SELECT * FROM (VALUES ${permittedBizplaceIds.map(id => `('${id}')`).join(',')})\n AS bizFilter(bizplace_id)\n WHERE bizFilter.bizplace_id::uuid = \"Inventory\".\"bizplace_id\"\n )`\n } else {\n bizplaceQuery = `1 = 0`\n }\n\n let productQuery = ''\n if (productFilter) {\n let productValue = productFilter.value\n .toLowerCase()\n .split(',')\n .map(prod => {\n return \"'%\" + prod.trim().replace(/'/g, \"''\") + \"%'\"\n })\n .join(',')\n productQuery = `AND (\n Lower(\"Product\".\"name\") LIKE ANY(ARRAY[${productValue}])\n OR Lower(\"Product\".\"sku\") LIKE ANY(ARRAY[${productValue}])\n OR Lower(\"Product\".\"brand\") LIKE ANY(ARRAY[${productValue}])\n OR Lower(\"Product\".\"description\") LIKE ANY(ARRAY[${productValue}])\n OR Lower(\"ProductRef\".\"name\") LIKE ANY(ARRAY[${productValue}])\n OR Lower(\"ProductRef\".\"sku\") LIKE ANY(ARRAY[${productValue}])\n OR Lower(\"ProductRef\".\"description\") LIKE ANY(ARRAY[${productValue}])\n )`\n }\n\n if (productTypeFilter) {\n let productTypeValue = productTypeFilter.value\n .toLowerCase()\n .split(',')\n .map(prod => {\n return \"'%\" + prod.trim().replace(/'/g, \"''\") + \"%'\"\n })\n .join(',')\n productQuery =\n productQuery +\n ` AND (\n Lower(\"Product\".\"type\") LIKE ANY(ARRAY[${productTypeValue}])\n )`\n }\n\n let availableStockQuery = ''\n if (availableStockFilter?.value) {\n availableStockQuery = ` AND SUM(\"Inventory\".\"qty\") > 0`\n }\n\n let thresholdQuery = ''\n if (lowStockFilter?.value) {\n thresholdQuery = `AND COALESCE(\"ProductDetailBizplaceSetting\".\"min_qty\", \"Product\".\"min_qty\",0) > SUM(\"Inventory\".\"qty\")`\n }\n\n if (overStockFilter?.value) {\n thresholdQuery = `AND COALESCE(\"ProductDetailBizplaceSetting\".\"max_qty\", \"Product\".\"max_qty\",0) > 0 AND \n COALESCE(\"ProductDetailBizplaceSetting\".\"max_qty\", \"Product\".\"max_qty\",0) < SUM(\"Inventory\".\"qty\")`\n }\n\n await tx.query(\n `\n create temp table temp_inv_history AS \n (\n SELECT \"Product\".\"id\" AS \"id\", \"Product\".\"sku\" AS \"sku\", \"Product\".\"brand\" AS \"brand\", \"Product\".\"name\" AS \"name\", \"Product\".\"type\" AS \"type\", \"Product\".\"description\" AS \"description\", \"Product\".\"primary_unit\" AS \"primaryUnit\",\n \"Product\".\"weight\" AS \"weight\", \"ProductRef\".\"id\" AS \"productRefId\", \n \"ProductRef\".\"description\" AS \"productRefDesciption\", \"Bizplace\".\"id\" AS \"bizplaceId\", \"Bizplace\".\"name\" AS \"bizplaceName\", SUM(\"Inventory\".\"qty\") AS \"qty\" , SUM(\"Inventory\".\"uom_value\") AS \"uomValue\",\n \"Warehouse\".\"id\" AS \"warehouseId\", \"Warehouse\".\"name\" AS \"warehouseName\",\n CASE WHEN SUM(\"Inventory\".\"qty\") > 0 THEN SUM(COALESCE(\"Inventory\".\"unit_cost\", 0) * \"Inventory\".\"qty\")/ SUM(\"Inventory\".\"qty\") ELSE 0 END AS \"averageUnitCost\",\n COALESCE(\"ProductDetailBizplaceSetting\".\"min_qty\", \"Product\".\"min_qty\",0) AS \"minQty\", \n COALESCE(\"ProductDetailBizplaceSetting\".\"max_qty\", \"Product\".\"max_qty\",0) AS \"maxQty\"\n FROM \"inventories\" \"Inventory\" \n LEFT JOIN \"warehouses\" \"Warehouse\" ON \"Warehouse\".\"id\"=\"Inventory\".\"warehouse_id\"\n LEFT JOIN \"products\" \"Product\" ON \"Product\".\"id\"=\"Inventory\".\"product_id\" \n LEFT JOIN \"product_details\" \"ProductDetails\" ON \"ProductDetails\".\"product_id\" = \"Product\".\"id\" \n AND \"ProductDetails\".\"is_default\"\n LEFT JOIN \"product_detail_bizplace_settings\" \"ProductDetailBizplaceSetting\" ON \"ProductDetailBizplaceSetting\".\"product_detail_id\" = \"ProductDetails\".\"id\" \n AND \"ProductDetailBizplaceSetting\".\"domain_id\" = \"Inventory\".\"domain_id\"\n LEFT JOIN \"products\" \"ProductRef\" ON \"ProductRef\".\"id\"=\"Product\".\"product_ref_id\" \n INNER JOIN \"bizplaces\" \"Bizplace\" ON \"Bizplace\".\"id\"=\"Inventory\".\"bizplace_id\"\n WHERE \"Inventory\".\"qty\" >= 0\n AND \"Inventory\".\"domain_id\" = $1\n ${bizplaceQuery}\n ${productQuery}\n GROUP BY \"Product\".\"id\", \"ProductRef\".\"id\", \"Bizplace\".\"id\", \"ProductDetailBizplaceSetting\".\"id\", \"Warehouse\".\"id\"\n HAVING 1 = 1\n ${availableStockQuery}\n ${thresholdQuery}\n )`,\n [domain.id]\n )\n\n const results: any = await tx.query(\n `\n SELECT * FROM temp_inv_history\n ORDER BY \"bizplaceName\", \"sku\" \n OFFSET $1 LIMIT $2\n `,\n [(page - 1) * limit, limit]\n )\n\n const total: any = await tx.query(`SELECT COUNT(*) FROM temp_inv_history`)\n\n tx.query(`drop table temp_inv_history`)\n\n return {\n items: results.map((item: any) => {\n return {\n product: {\n id: item.id,\n name: item.name,\n sku: item.sku,\n brand: item.brand,\n description: item.description,\n type: item.type,\n weight: item.weight,\n productRefId: item.productRefId,\n bizplaceId: item.bizplaceId,\n minQty: item.minQty,\n maxQty: item.maxQty,\n primaryUnit: item.primaryUnit\n },\n warehouse: {\n id: item.warehouseId,\n name: item.warehouseName\n },\n averageUnitCost: item.averageUnitCost,\n qty: item.qty,\n uomValue: item.uomValue\n }\n }),\n total: total[0].count\n }\n } catch (error) {\n throw error\n }\n }\n\n @FieldResolver(type => Domain)\n async domain(@Root() inventory: Inventory): Promise<Domain> {\n return await getRepository(Domain).findOne(inventory.domainId)\n }\n\n @FieldResolver(type => User)\n async updater(@Root() inventory: Inventory): Promise<User> {\n return await getRepository(User).findOne(inventory.updaterId)\n }\n\n @FieldResolver(type => User)\n async creator(@Root() inventory: Inventory): Promise<User> {\n return await getRepository(User).findOne(inventory.creatorId)\n }\n\n /*\n move changeCount to @FieldResolver so that system don't have\n to keep searching for this when user does not request for it \n */\n @FieldResolver(type => Number)\n async changeCount(@Root() inventory: Inventory): Promise<Number> {\n return await getRepository(InventoryChange).count({\n where: { inventory }\n })\n }\n\n /*\n \"purchaseOrderNo\", \"orderProductRemark\" and \"arrivalNoticeRefNo\"\n are purely for Getha's lot label. @farishelmi added these here to\n avoid logic changes in @inventories query\n */\n @FieldResolver(type => String)\n async purchaseOrderNo(@Root() inventory: Inventory): Promise<String> {\n if (!inventory.refOrderId) return ''\n\n let items: any = await getRepository(Inventory).query(`\n SELECT po.name as \"purchaseOrderNo\" FROM arrival_notices an\n LEFT JOIN purchase_orders po\n ON an.purchase_order_id = po.id\n WHERE an.id = '${inventory.refOrderId}'\n LIMIT 1\n `)\n\n return items[0]?.purchaseOrderNo || ''\n }\n\n @FieldResolver(type => String)\n async orderProductRemark(@Root() inventory: Inventory): Promise<String> {\n if (!inventory.orderProductId) return ''\n\n let items: any = await getRepository(Inventory).query(`\n SELECT op.remark as \"orderProductRemark\" FROM order_products op\n WHERE op.id = '${inventory.orderProductId}'\n LIMIT 1\n `)\n\n return items[0]?.orderProductRemark || ''\n }\n\n @FieldResolver(type => String)\n async arrivalNoticeRefNo(@Root() inventory: Inventory): Promise<String> {\n if (!inventory.refOrderId) return ''\n\n let items: any = await getRepository(Inventory).query(`\n SELECT an.ref_no as \"arrivalNoticeRefNo\" FROM arrival_notices an\n WHERE an.id = '${inventory.refOrderId}'\n LIMIT 1\n `)\n\n return items[0]?.arrivalNoticeRefNo || ''\n }\n}\n\nexport async function inventoriesByStrategy(\n {\n worksheetId,\n batchId,\n bizplaceId,\n productName,\n productSku,\n packingType,\n packingSize,\n uom,\n pickingStrategy,\n locationSortingRules\n },\n trxMgr: EntityManager\n) {\n const qb = await trxMgr.getRepository(Inventory).createQueryBuilder('INV')\n qb.innerJoinAndSelect('INV.product', 'PROD')\n .innerJoinAndSelect('INV.location', 'LOC')\n .addSelect(subQuery =>\n subQuery\n .select('COALESCE(SUM(release_qty), 0)', 'releaseQty')\n .from('order_inventories', 'OI')\n .where('\"OI\".\"inventory_id\" = \"INV\".\"id\"')\n .andWhere(\"\\\"OI\\\".\\\"status\\\" IN ('PENDING', 'PENDING_RECEIVE', 'PENDING_WORKSHEET', 'PENDING_SPLIT')\")\n .andWhere('\"OI\".\"ref_worksheet_id\" <> :worksheetId', { worksheetId: worksheetId })\n )\n .addSelect(subQuery =>\n subQuery\n .select('COALESCE(SUM(release_uom_value), 0)', 'releaseUomValue')\n .from('order_inventories', 'OI')\n .where('\"OI\".\"inventory_id\" = \"INV\".\"id\"')\n .andWhere(\"\\\"OI\\\".\\\"status\\\" IN ('PENDING', 'PENDING_RECEIVE', 'PENDING_WORKSHEET', 'PENDING_SPLIT')\")\n .andWhere('\"OI\".\"ref_worksheet_id\" <> :worksheetId', { worksheetId: worksheetId })\n )\n .andWhere('\"PROD\".\"name\" = :productName')\n .andWhere('\"PROD\".\"sku\" = :productSku')\n .andWhere('\"INV\".\"packing_type\" = :packingType')\n .andWhere('\"INV\".\"packing_size\" = :packingSize')\n .andWhere('\"INV\".\"uom\" = :uom')\n .andWhere('\"INV\".\"status\" = :status', { status: 'STORED' })\n .andWhere('\"LOC\".\"type\" NOT IN (:...locationTypes)', {\n locationTypes: [LOCATION_TYPE.QUARANTINE, LOCATION_TYPE.RESERVE]\n })\n .setParameters({\n productName,\n productSku,\n packingType,\n packingSize,\n uom\n })\n\n if (batchId !== '') {\n qb.andWhere('\"INV\".\"batch_id\" = :batchId', { batchId })\n }\n\n if (bizplaceId) {\n qb.andWhere('\"INV\".\"bizplace_id\" = :bizplaceId', { bizplaceId: bizplaceId })\n }\n\n switch (pickingStrategy.toUpperCase()) {\n case 'FIFO':\n qb.orderBy('\"INV\".\"created_at\"', 'ASC')\n if (locationSortingRules?.length > 0) {\n locationSortingRules.forEach((rule: { name: string; desc: boolean }, idx: number) => {\n qb.addOrderBy(`LOC.${rule.name}`, rule.desc ? 'DESC' : 'ASC')\n })\n }\n break\n\n case 'LIFO':\n qb.orderBy('\"INV\".\"created_at\"', 'DESC')\n if (locationSortingRules?.length > 0) {\n locationSortingRules.forEach((rule: { name: string; desc: boolean }, idx: number) => {\n qb.addOrderBy(`LOC.${rule.name}`, rule.desc ? 'DESC' : 'ASC')\n })\n }\n break\n\n case 'FEFO':\n qb.orderBy('\"INV\".\"expiration_date\"', 'ASC')\n if (locationSortingRules?.length > 0) {\n locationSortingRules.forEach((rule: { name: string; desc: boolean }, idx: number) => {\n qb.addOrderBy(`LOC.${rule.name}`, rule.desc ? 'DESC' : 'ASC')\n })\n }\n break\n\n case 'FMFO':\n qb.orderBy('\"INV\".\"manufacture_date\"', 'ASC')\n if (locationSortingRules?.length > 0) {\n locationSortingRules.forEach((rule: { name: string; desc: boolean }, idx: number) => {\n qb.addOrderBy(`LOC.${rule.name}`, rule.desc ? 'DESC' : 'ASC')\n })\n }\n break\n\n case 'LOCATION':\n if (locationSortingRules?.length > 0) {\n locationSortingRules.forEach((rule: { name: string; desc: boolean }, idx: number) => {\n idx === 0\n ? qb.orderBy(`LOC.${rule.name}`, rule.desc ? 'DESC' : 'ASC')\n : qb.addOrderBy(`LOC.${rule.name}`, rule.desc ? 'DESC' : 'ASC')\n })\n } else qb.orderBy('\"LOC\".\"name\"', 'DESC')\n break\n }\n\n const { entities, raw } = await qb.getRawAndEntities()\n const items = entities\n .map((inv: Inventory, idx: number) => {\n const qty: number = inv?.qty > 0 ? inv.qty : 0\n const uomValue: number = inv?.uomValue > 0 ? inv.uomValue : 0\n const lockedQty: number = inv.lockedQty || 0\n const lockedUomValue: number = inv.lockedUomValue || 0\n const releaseQty: number = parseInt(raw[idx].releaseQty) || 0\n const releaseUomValue: number = parseFloat(raw[idx].releaseUomValue) || 0\n\n return {\n ...inv,\n qty: qty - lockedQty - releaseQty,\n uomValue: uomValue - lockedUomValue - releaseUomValue\n }\n })\n .filter((inv: Inventory) => inv.qty)\n\n const total: number = await qb.getCount()\n return { items, total }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"inventory-query.js","sourceRoot":"","sources":["../../../server/service/inventory/inventory-query.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Arg,\n Args,\n Ctx,\n Directive,\n FieldResolver,\n Query,\n Resolver,\n Root,\n} from 'type-graphql';\nimport {\n Brackets,\n EntityManager,\n Equal,\n getRepository,\n Not,\n Repository,\n SelectQueryBuilder,\n} from 'typeorm';\n\nimport { User } from '@things-factory/auth-base';\nimport {\n Bizplace,\n getPartnersCompanyBizplaces,\n getPermittedBizplaceIds,\n} from '@things-factory/biz-base';\nimport {\n Product,\n ProductBundleSetting,\n ProductDetail,\n} from '@things-factory/product-base';\nimport { Setting } from '@things-factory/setting-base';\nimport {\n buildQuery,\n Domain,\n Filter,\n ListParam,\n Pagination,\n Sorting,\n} from '@things-factory/shell';\n\nimport { INVENTORY_STATUS, LOCATION_TYPE } from '../../constants';\nimport { InventoryChange } from '../inventory-change/inventory-change';\nimport { Inventory } from './inventory';\nimport { InventoryBundleGroupDetail, InventoryList } from './inventory-types';\n\n@Resolver(Inventory)\nexport class InventoryQuery {\n @Directive('@privilege(category: \"inventory\", privilege: \"query\")')\n @Directive('@transaction')\n @Query(returns => InventoryList)\n async inventories(\n @Ctx() context: any,\n @Arg('filters', type => [Filter], { nullable: true }) filters?: Filter[],\n @Arg('pagination', type => Pagination, { nullable: true }) pagination?: Pagination,\n @Arg('sortings', type => [Sorting], { nullable: true }) sortings?: Sorting[],\n @Arg('locationSortingRules', type => [Sorting], { nullable: true }) locationSortingRules?: Sorting[]\n ): Promise<InventoryList> {\n const { domain, user, tx }: { domain: Domain; user: User; tx: EntityManager } = context.state\n\n try {\n const productFilters = filters.find(x => x.name == 'product_info')\n filters = filters.filter(x => x.name != 'product_info')\n const params = { filters, pagination }\n\n if (!params.filters.find((filter: any) => filter.name === 'bizplace')) {\n params.filters.push({\n name: 'bizplace',\n operator: 'in',\n value: await getPermittedBizplaceIds(domain, user),\n relation: true\n })\n }\n\n const remainOnlyParam: { name: string; operator: string; value: boolean } = params?.filters?.find(\n (f: { name: string; operator: string; value: any }) => f.name === 'remainOnly'\n )\n\n let remainOnly: boolean = false\n if (typeof remainOnlyParam?.value !== 'undefined') {\n remainOnly = remainOnlyParam.value\n params.filters = params.filters.filter(\n (f: { name: string; operator: string; value: any }) => f.name !== 'remainOnly'\n )\n }\n\n const unlockOnlyParam: { name: string; operator: string; value: boolean } = params?.filters?.find(\n (f: { name: string; operator: string; value: any }) => f.name === 'unlockOnly'\n )\n\n let unlockOnly: boolean = false\n if (typeof unlockOnlyParam?.value !== 'undefined') {\n unlockOnly = unlockOnlyParam.value\n params.filters = params.filters.filter(\n (f: { name: string; operator: string; value: any }) => f.name !== 'unlockOnly'\n )\n }\n\n const qb: SelectQueryBuilder<Inventory> = getRepository(Inventory).createQueryBuilder('iv')\n buildQuery(qb, params, context, {\n searchables: ['warehouse', 'product', 'batchId', 'location', 'palletId']\n })\n\n qb.leftJoinAndSelect('iv.bizplace', 'bizplace')\n .leftJoinAndSelect('iv.product', 'product')\n .leftJoinAndSelect('iv.warehouse', 'warehouse')\n .leftJoinAndSelect('iv.location', 'location')\n .leftJoin('iv.inventoryItems', 'ivi')\n .loadRelationCountAndMap('iv.inventoryItemCount', 'iv.inventoryItems', 'ivic', qb =>\n qb.andWhere('ivic.status = :ivicStatus', {\n ivicStatus: INVENTORY_STATUS.STORED\n })\n )\n\n if (remainOnly) {\n qb.andWhere('iv.qty > 0')\n .andWhere('CASE WHEN iv.lockedQty IS NULL THEN 0 ELSE iv.lockedQty END >= 0')\n .andWhere('iv.qty - CASE WHEN iv.lockedQty IS NULL THEN 0 ELSE iv.lockedQty END > 0')\n }\n\n if (unlockOnly) {\n qb.andWhere('CASE WHEN iv.lockedQty IS NULL THEN 0 ELSE iv.lockedQty END = 0')\n }\n\n if (productFilters) {\n let productFilterValue = `%${productFilters.value.toLowerCase()}%`\n qb.andWhere(qb => {\n const subQuery = qb\n .subQuery()\n .select()\n .from(Product, `products`)\n .where(`products.id = iv.product_id`)\n .andWhere(\n new Brackets(qb => {\n qb.where('Lower(products.sku) LIKE :productInfo', { productInfo: productFilterValue })\n .orWhere('Lower(products.name) LIKE :productInfo', { productInfo: productFilterValue })\n .orWhere('Lower(products.description) LIKE :productInfo', { productInfo: productFilterValue })\n .orWhere('Lower(products.brand) LIKE :productInfo', { productInfo: productFilterValue })\n })\n )\n .getQuery()\n return `EXISTS ${subQuery}`\n })\n }\n\n if (sortings?.length !== 0) {\n const arrChildSortData = ['bizplace', 'product', 'location', 'warehouse', 'zone']\n const sort = (sortings || []).reduce(\n (acc, sort) => ({\n ...acc,\n [arrChildSortData.indexOf(sort.name) >= 0 ? sort.name + '.name' : 'iv.' + sort.name]: sort.desc\n ? 'DESC'\n : 'ASC'\n }),\n {}\n )\n qb.orderBy(sort)\n }\n\n if (locationSortingRules?.length > 0) {\n locationSortingRules.forEach((rule: { name: string; desc: boolean }) => {\n qb.addOrderBy(`location.${rule.name}`, rule.desc ? 'DESC' : 'ASC')\n })\n }\n\n let [items, total] = await qb.getManyAndCount()\n items = await Promise.all(\n items.map(async (item: Inventory) => {\n let [productDetails, inventoryItems] = await Promise.all([\n getRepository(ProductDetail).find({\n where: {\n product: item.product.id,\n packingType: item.packingType,\n packingSize: item.packingSize\n }\n }),\n tx.query(\n `\n SELECT string_agg(ii.serial_number, ', ') AS \"serialNumbers\"\n FROM inventory_items ii\n WHERE ii.inventory_id = $1\n GROUP BY ii.inventory_id \n `,\n [item.id]\n )\n ])\n\n item.product['productDetails'] = productDetails\n return {\n ...item,\n remainQty: item.qty - (item.lockedQty ? item.lockedQty : 0),\n remainUomValue: item.uomValue - (item.lockedUomValue ? item.lockedUomValue : 0),\n serialNumbers: inventoryItems[0]?.serialNumbers\n }\n })\n )\n\n return { items, total }\n } catch (error) {\n throw error\n }\n }\n\n @Directive('@privilege(category: \"inventory\", privilege: \"query\")')\n @Query(returns => Inventory)\n async inventory(@Arg('palletId') palletId: string, @Ctx() context: any): Promise<Inventory> {\n const { domain }: { domain: Domain } = context.state\n\n return await getRepository(Inventory).findOne({\n where: { domain: domain, palletId },\n relations: ['domain', 'bizplace', 'product', 'location', 'warehouse', 'creator', 'updater']\n })\n }\n\n @Directive('@privilege(category: \"inventory\", privilege: \"query\")')\n @Query(returns => Inventory)\n async inventoryByPallet(@Arg('palletId') palletId: string, @Ctx() context: any): Promise<Inventory> {\n const { domain }: { domain: Domain } = context.state\n\n return await getRepository(Inventory).findOne({\n where: { domain, palletId, status: Not(Equal(INVENTORY_STATUS.TERMINATED)) },\n relations: ['domain', 'bizplace', 'product', 'location', 'warehouse', 'creator', 'updater']\n })\n }\n\n @Directive('@privilege(category: \"inventory\", privilege: \"query\")')\n @Directive('@transaction')\n @Query(returns => InventoryList)\n async inventoriesByProduct(@Args() params: ListParam, @Ctx() context: any): Promise<InventoryList> {\n try {\n const { domain, user, tx }: { domain: Domain; user: User; tx: EntityManager } = context.state\n let permittedBizplaceIds: string[] = await getPermittedBizplaceIds(domain, user)\n const partnersCompanyBizplaces: Bizplace[] = await getPartnersCompanyBizplaces(domain, user)\n\n const page = params.pagination.page\n const limit = params.pagination.limit\n\n let bizplaceFilter = params.filters.find(filter => filter.name == 'bizplace')\n let productFilter = params.filters.find(filter => filter.name == 'product')\n let productTypeFilter = params.filters.find(filter => filter.name == 'type')\n let availableStockFilter = params.filters.find(filter => filter.name == 'availableStock')\n let lowStockFilter = params.filters.find(filter => filter.name == 'lowStock')\n let overStockFilter = params.filters.find(filter => filter.name == 'overStock')\n\n if (bizplaceFilter) {\n const bizplaceQueryBuilder: SelectQueryBuilder<Bizplace> = getRepository(Bizplace).createQueryBuilder('b')\n bizplaceQueryBuilder\n .innerJoin('companies', 'c2', ' c2.domain_id = b.domain_id')\n .innerJoin('bizplaces', 'b2', 'b2.company_id = c2.id')\n .where('b2.id = :bizplaceId', { bizplaceId: bizplaceFilter.value })\n\n let bizplaceList = await bizplaceQueryBuilder.getMany()\n\n permittedBizplaceIds = [\n ...permittedBizplaceIds.filter(itm => itm == bizplaceFilter.value),\n ...bizplaceList.map(bz => bz.id),\n ...partnersCompanyBizplaces.map(biz => biz.id)\n ]\n }\n\n let bizplaceQuery = ''\n if (permittedBizplaceIds.length > 0) {\n bizplaceQuery = `AND EXISTS (\n SELECT * FROM (VALUES ${permittedBizplaceIds.map(id => `('${id}')`).join(',')})\n AS bizFilter(bizplace_id)\n WHERE bizFilter.bizplace_id::uuid = \"Inventory\".\"bizplace_id\"\n )`\n } else {\n bizplaceQuery = `1 = 0`\n }\n\n let productQuery = ''\n if (productFilter) {\n let productValue = productFilter.value\n .toLowerCase()\n .split(',')\n .map(prod => {\n return \"'%\" + prod.trim().replace(/'/g, \"''\") + \"%'\"\n })\n .join(',')\n productQuery = `AND (\n Lower(\"Product\".\"name\") LIKE ANY(ARRAY[${productValue}])\n OR Lower(\"Product\".\"sku\") LIKE ANY(ARRAY[${productValue}])\n OR Lower(\"Product\".\"brand\") LIKE ANY(ARRAY[${productValue}])\n OR Lower(\"Product\".\"description\") LIKE ANY(ARRAY[${productValue}])\n OR Lower(\"ProductRef\".\"name\") LIKE ANY(ARRAY[${productValue}])\n OR Lower(\"ProductRef\".\"sku\") LIKE ANY(ARRAY[${productValue}])\n OR Lower(\"ProductRef\".\"description\") LIKE ANY(ARRAY[${productValue}])\n )`\n }\n\n if (productTypeFilter) {\n let productTypeValue = productTypeFilter.value\n .toLowerCase()\n .split(',')\n .map(prod => {\n return \"'%\" + prod.trim().replace(/'/g, \"''\") + \"%'\"\n })\n .join(',')\n productQuery =\n productQuery +\n ` AND (\n Lower(\"Product\".\"type\") LIKE ANY(ARRAY[${productTypeValue}])\n )`\n }\n\n let availableStockQuery = ''\n if (availableStockFilter?.value) {\n availableStockQuery = ` AND SUM(\"Inventory\".\"qty\") > 0`\n }\n\n let thresholdQuery = ''\n if (lowStockFilter?.value) {\n thresholdQuery = `AND COALESCE(\"ProductDetailBizplaceSetting\".\"min_qty\", \"Product\".\"min_qty\",0) > SUM(\"Inventory\".\"qty\")`\n }\n\n if (overStockFilter?.value) {\n thresholdQuery = `AND COALESCE(\"ProductDetailBizplaceSetting\".\"max_qty\", \"Product\".\"max_qty\",0) > 0 AND \n COALESCE(\"ProductDetailBizplaceSetting\".\"max_qty\", \"Product\".\"max_qty\",0) < SUM(\"Inventory\".\"qty\")`\n }\n\n await tx.query(\n `\n create temp table temp_inv_history AS \n (\n SELECT \"Product\".\"id\" AS \"id\", \"Product\".\"sku\" AS \"sku\", \"Product\".\"brand\" AS \"brand\", \"Product\".\"name\" AS \"name\", \"Product\".\"type\" AS \"type\", \"Product\".\"description\" AS \"description\", \n \"Product\".\"weight\" AS \"weight\", \"ProductRef\".\"id\" AS \"productRefId\", \n \"ProductRef\".\"description\" AS \"productRefDesciption\", \"Bizplace\".\"id\" AS \"bizplaceId\", \"Bizplace\".\"name\" AS \"bizplaceName\", SUM(\"Inventory\".\"qty\") AS \"qty\" ,\n CASE WHEN SUM(\"Inventory\".\"qty\") > 0 THEN SUM(COALESCE(\"Inventory\".\"unit_cost\", 0) * \"Inventory\".\"qty\")/ SUM(\"Inventory\".\"qty\") ELSE 0 END AS \"averageUnitCost\",\n COALESCE(\"ProductDetailBizplaceSetting\".\"min_qty\", \"Product\".\"min_qty\",0) AS \"minQty\", \n COALESCE(\"ProductDetailBizplaceSetting\".\"max_qty\", \"Product\".\"max_qty\",0) AS \"maxQty\"\n FROM \"inventories\" \"Inventory\" \n LEFT JOIN \"products\" \"Product\" ON \"Product\".\"id\"=\"Inventory\".\"product_id\" \n LEFT JOIN \"product_details\" \"ProductDetails\" ON \"ProductDetails\".\"product_id\" = \"Product\".\"id\" \n AND \"ProductDetails\".\"is_default\"\n LEFT JOIN \"product_detail_bizplace_settings\" \"ProductDetailBizplaceSetting\" ON \"ProductDetailBizplaceSetting\".\"product_detail_id\" = \"ProductDetails\".\"id\" \n AND \"ProductDetailBizplaceSetting\".\"domain_id\" = \"Inventory\".\"domain_id\"\n LEFT JOIN \"products\" \"ProductRef\" ON \"ProductRef\".\"id\"=\"Product\".\"product_ref_id\" \n INNER JOIN \"bizplaces\" \"Bizplace\" ON \"Bizplace\".\"id\"=\"Inventory\".\"bizplace_id\"\n WHERE \"Inventory\".\"qty\" >= 0\n AND \"Inventory\".\"status\" <> 'MISSING'\n AND \"Inventory\".\"domain_id\" = $1\n ${bizplaceQuery}\n ${productQuery}\n GROUP BY \"Product\".\"id\", \"ProductRef\".\"id\", \"Bizplace\".\"id\", \"ProductDetailBizplaceSetting\".\"id\"\n HAVING 1 = 1\n ${availableStockQuery}\n ${thresholdQuery}\n )`,\n [domain.id]\n )\n\n const results: any = await tx.query(\n `\n SELECT * FROM temp_inv_history\n ORDER BY \"bizplaceName\", \"sku\" \n OFFSET $1 LIMIT $2\n `,\n [(page - 1) * limit, limit]\n )\n\n const total: any = await tx.query(`SELECT COUNT(*) FROM temp_inv_history`)\n\n tx.query(`drop table temp_inv_history`)\n\n return {\n items: results.map((item: any) => {\n return {\n product: {\n id: item.id,\n name: item.name,\n sku: item.sku,\n brand: item.brand,\n description: item.description,\n type: item.type,\n weight: item.weight,\n productRefId: item.productRefId,\n bizplaceId: item.bizplaceId,\n minQty: item.minQty,\n maxQty: item.maxQty\n },\n averageUnitCost: item.averageUnitCost,\n qty: item.qty\n }\n }),\n total: total[0].count\n }\n } catch (error) {\n throw error\n }\n }\n\n @Directive('@transaction')\n @Query(returns => InventoryList)\n async inventoriesByStrategy(\n @Ctx() context: any,\n @Arg('worksheetId') worksheetId: string,\n @Arg('batchId') batchId: string,\n @Arg('productName') productName: string,\n @Arg('productSku') productSku: string,\n @Arg('packingType') packingType: string,\n @Arg('packingSize') packingSize: number,\n @Arg('uom') uom: string,\n @Arg('pickingStrategy') pickingStrategy: string,\n @Arg('locationSortingRules', type => [Sorting], { nullable: true }) locationSortingRules?: Sorting[],\n @Arg('bizplaceId', { nullable: true }) bizplaceId?: string\n ): Promise<InventoryList> {\n const { domain, tx }: { domain: Domain; tx: EntityManager } = context.state\n\n const inventoryAssignmentSetting: Setting = await tx.getRepository(Setting).findOne({\n where: { domain, name: 'rule-for-inventory-assignment' }\n })\n\n if (!locationSortingRules && inventoryAssignmentSetting) {\n locationSortingRules = []\n let locationSetting = JSON.parse(inventoryAssignmentSetting.value)\n for (const key in locationSetting) {\n locationSortingRules.push({ name: key, desc: locationSetting[key] == 'ASC' ? false : true })\n }\n }\n\n return inventoriesByStrategy(\n {\n worksheetId,\n batchId,\n bizplaceId,\n productName,\n productSku,\n packingType,\n packingSize,\n uom,\n pickingStrategy,\n locationSortingRules\n },\n tx\n )\n }\n\n @Directive('@transaction')\n @Query(returns => Boolean)\n async checkProductIdenticality(\n @Arg('palletA') palletA: string,\n @Arg('palletB') palletB: string,\n @Ctx() context: any\n ): Promise<Boolean> {\n const { tx }: { tx: EntityManager } = context.state\n const invRepo: Repository<Inventory> = tx.getRepository(Inventory)\n const invA: Inventory = await invRepo.findOne({\n where: { domain: context.state.domain, palletId: palletA, status: INVENTORY_STATUS.STORED },\n relations: ['product']\n })\n\n const invB: Inventory = await invRepo.findOne({\n where: { domain: context.state.domain, palletId: palletB, status: INVENTORY_STATUS.STORED },\n relations: ['product']\n })\n\n return (\n invA?.batchId === invB?.batchId &&\n invA?.product?.id === invB?.product?.id &&\n invA?.packingType === invB?.packingType\n )\n }\n\n @Query(returns => Boolean)\n async checkCartonIdenticality(\n @Arg('cartonA') cartonA: string,\n @Arg('palletA') palletA: string,\n @Arg('cartonB') cartonB: string,\n @Ctx() context: any\n ) {\n const invRepo: Repository<Inventory> = getRepository(Inventory)\n const invA: Inventory = await invRepo.findOne({\n where: { domain: context.state.domain, palletId: palletA, cartonId: cartonA, status: INVENTORY_STATUS.STORED },\n relations: ['product']\n })\n\n const invB: Inventory = await invRepo.findOne({\n where: {\n domain: context.state.domain,\n packingType: invA.packingType,\n packingSize: invA.packingSize,\n product: invA.product,\n cartonId: cartonB,\n status: INVENTORY_STATUS.STORED\n },\n relations: ['product']\n })\n\n return (\n invA?.expirationDate === invB?.expirationDate &&\n invA?.product?.id === invB?.product?.id &&\n invA?.packingType === invB?.packingType &&\n invA?.packingSize === invB?.packingSize\n )\n }\n\n @Query(returns => Boolean)\n async checkInventoryOwner(\n @Arg('palletId') palletId: string,\n @Arg('bizplaceName') bizplaceName: string,\n @Ctx() context: any\n ): Promise<Boolean> {\n const invRepo: Repository<Inventory> = getRepository(Inventory)\n const bizRepo: Repository<Bizplace> = getRepository(Bizplace)\n\n const inventory: Inventory = await invRepo.findOne({\n where: { domain: context.state.domain, palletId, status: INVENTORY_STATUS.STORED },\n relations: ['bizplace']\n })\n\n if (!inventory) throw new Error('This inventory status is not stored.')\n\n const ownerBizplace: Bizplace = await bizRepo.findOne({\n where: { name: bizplaceName }\n })\n\n const foundBizplace: Bizplace = inventory.bizplace\n\n return Boolean(ownerBizplace.id === foundBizplace.id)\n }\n\n @Directive('@privilege(category: \"inventory\", privilege: \"query\")')\n @Query(returns => InventoryBundleGroupDetail)\n async inventoriesByBundle(\n @Ctx() context: any,\n @Arg('filters', type => [Filter], { nullable: true }) filters?: Filter[],\n @Arg('pagination', type => Pagination, { nullable: true }) pagination?: Pagination,\n @Arg('sortings', type => [Sorting], { nullable: true }) sortings?: Sorting[]\n ): Promise<InventoryBundleGroupDetail> {\n const { domain, user }: { domain: Domain; user: User } = context.state\n\n const params = { filters, pagination }\n\n const productBundleId = params.filters.filter(x => x.name === 'productBundleId')[0].value\n if (!productBundleId) {\n throw new Error('params product bundle is missing')\n }\n\n const bundleReleaseQty: number = params.filters.filter(x => x.name === 'bundleReleaseQty')[0].value\n\n // remove productBundleId and bundleReleaseQty from params.filters\n params.filters = params.filters.filter(x => x.name !== 'productBundleId' && x.name !== 'bundleReleaseQty')\n\n if (!params.filters.find((filter: any) => filter.name === 'bizplace_id')) {\n params.filters.push({\n name: 'bizplace_id',\n operator: 'in',\n value: await getPermittedBizplaceIds(domain, user),\n relation: true\n })\n }\n\n const remainOnlyParam: { name: string; operator: string; value: boolean } = params?.filters?.find(\n (f: { name: string; operator: string; value: any }) => f.name === 'remainOnly'\n )\n\n let remainOnly: boolean = false\n if (typeof remainOnlyParam?.value !== 'undefined') {\n remainOnly = remainOnlyParam.value\n params.filters = params.filters.filter(\n (f: { name: string; operator: string; value: any }) => f.name !== 'remainOnly'\n )\n }\n\n const unlockOnlyParam: { name: string; operator: string; value: boolean } = params?.filters?.find(\n (f: { name: string; operator: string; value: any }) => f.name === 'unlockOnly'\n )\n\n let unlockOnly: boolean = false\n if (typeof unlockOnlyParam?.value !== 'undefined') {\n unlockOnly = unlockOnlyParam.value\n params.filters = params.filters.filter(\n (f: { name: string; operator: string; value: any }) => f.name !== 'unlockOnly'\n )\n }\n\n const productBundleSettings: ProductBundleSetting[] = await getRepository(ProductBundleSetting).find({\n where: { productBundle: productBundleId },\n relations: ['product', 'productBundle']\n })\n\n if (!productBundleSettings.length) {\n throw new Error('product bundle settings is not found')\n }\n\n const qb: SelectQueryBuilder<Inventory> = getRepository(Inventory).createQueryBuilder('iv')\n buildQuery(qb, params, context)\n\n qb.select('iv.product_id', 'productId')\n .addSelect('iv.batch_id', 'batchId')\n .addSelect('iv.batch_id_ref', 'batchIdRef')\n .addSelect('iv.packing_type', 'packingType')\n .addSelect('SUM(iv.qty)', 'qty')\n .addSelect('SUM(iv.locked_qty)', 'lockedQty')\n .addSelect('SUM(iv.uom_value)', 'uomValue')\n .addSelect('SUM(iv.locked_uom_value)', 'lockedUomValue')\n .addSelect('prd.sku', 'productSku')\n .addSelect('prd.name', 'productName')\n .addSelect('prd.description', 'productDescription')\n .addSelect('prd.type', 'productType')\n .addSelect('prd.primary_unit', 'uom')\n .leftJoin('iv.product', 'prd')\n\n if (remainOnly) {\n qb.andWhere('iv.qty > 0')\n .andWhere('CASE WHEN iv.lockedQty IS NULL THEN 0 ELSE iv.lockedQty END >= 0')\n .andWhere('iv.qty - CASE WHEN iv.lockedQty IS NULL THEN 0 ELSE iv.lockedQty END > 0')\n }\n\n if (unlockOnly) {\n qb.andWhere('CASE WHEN iv.lockedQty IS NULL THEN 0 ELSE iv.lockedQty END = 0')\n }\n\n qb.andWhere('iv.product_id IN (:...productIds)', {\n productIds: productBundleSettings.map(productBundle => productBundle.product.id)\n })\n .groupBy('iv.product_id')\n .addGroupBy('iv.batch_id')\n .addGroupBy('iv.batch_id_ref')\n .addGroupBy('iv.packing_type')\n .addGroupBy('prd.sku')\n .addGroupBy('prd.name')\n .addGroupBy('prd.description')\n .addGroupBy('prd.type')\n .addOrderBy('prd.name')\n .addGroupBy('prd.primary_unit')\n .addOrderBy('iv.batch_id')\n\n let bundleGroup = await qb.getRawMany()\n\n bundleGroup = bundleGroup.map((item: any) => {\n return {\n ...item,\n bundleId: productBundleId,\n remainQty: item.qty - (item.lockedQty ? item.lockedQty : 0),\n remainUomValue: item.uomValue - (item.lockedUomValue ? item.lockedUomValue : 0),\n uom: item.uom,\n bundleQty: productBundleSettings.filter(pbs => pbs.product.id === item.productId)[0].bundleQty\n }\n })\n\n const bundleSetting = productBundleSettings.map(pbs => {\n return {\n id: pbs.id,\n productId: pbs.product.id,\n bundleId: pbs.productBundle.id,\n bundleQty: pbs.bundleQty,\n releaseQty: bundleReleaseQty * pbs.bundleQty,\n productReleaseQty: 0,\n productReleaseUomValue: 0\n }\n })\n\n /** ************************ **/\n bundleGroup = bundleGroup\n .map(group => {\n const uomValue = group.remainUomValue / group.remainQty\n\n bundleSetting.forEach(setting => {\n let assigned = false\n let releaseQty = 0\n let releaseUomValue = 0\n\n if (group.productId === setting.productId) {\n if (setting.productReleaseQty < setting.releaseQty) {\n assigned = true\n const leftQty = setting.releaseQty - setting.productReleaseQty\n releaseQty = leftQty > group.remainQty ? group.remainQty : leftQty\n releaseUomValue = Math.round(releaseQty * uomValue * 100) / 100\n setting.productReleaseQty += releaseQty\n setting.productReleaseUomValue += releaseUomValue\n }\n\n group.assigned = assigned\n group.releaseQty = releaseQty\n group.releaseUomValue = releaseUomValue\n group.releaseUomValueWithUom = `${releaseUomValue} ${group.uom}`\n }\n })\n\n return group\n })\n .filter(group => group.assigned)\n /** ************************ **/\n\n return { bundleGroup, bundleSetting }\n }\n\n @Directive('@privilege(category: \"inventory\", privilege: \"query\")')\n @Query(returns => InventoryList)\n async inventoriesForExport(\n @Ctx() context: any,\n @Arg('filters', type => [Filter], { nullable: true }) filters?: Filter[],\n @Arg('pagination', type => Pagination, { nullable: true }) pagination?: Pagination,\n @Arg('sortings', type => [Sorting], { nullable: true }) sortings?: Sorting[],\n @Arg('locationSortingRules', type => [Sorting], { nullable: true }) locationSortingRules?: Sorting[]\n ): Promise<InventoryList> {\n const { domain, user } = context.state\n const { page, limit } = pagination\n\n try {\n const productFilters = filters.find(x => x.name == 'product_info')\n filters = filters.filter(x => x.name != 'product_info')\n const params = { filters, pagination }\n\n if (!params.filters.find((filter: any) => filter.name === 'bizplace')) {\n throw new Error('Please select a customer for export.')\n }\n\n const remainOnlyParam: { name: string; operator: string; value: boolean } = params?.filters?.find(\n (f: { name: string; operator: string; value: any }) => f.name === 'remainOnly'\n )\n\n let remainOnly: boolean = false\n if (typeof remainOnlyParam?.value !== 'undefined') {\n remainOnly = remainOnlyParam.value\n params.filters = params.filters.filter(\n (f: { name: string; operator: string; value: any }) => f.name !== 'remainOnly'\n )\n }\n\n const unlockOnlyParam: { name: string; operator: string; value: boolean } = params?.filters?.find(\n (f: { name: string; operator: string; value: any }) => f.name === 'unlockOnly'\n )\n\n let unlockOnly: boolean = false\n if (typeof unlockOnlyParam?.value !== 'undefined') {\n unlockOnly = unlockOnlyParam.value\n params.filters = params.filters.filter(\n (f: { name: string; operator: string; value: any }) => f.name !== 'unlockOnly'\n )\n }\n\n const qb: SelectQueryBuilder<Inventory> = getRepository(Inventory).createQueryBuilder('Inventory')\n buildQuery(qb, params, context)\n\n qb.leftJoinAndSelect('Inventory.bizplace', 'Bizplace')\n .leftJoinAndSelect('Inventory.product', 'Product')\n .leftJoinAndSelect('Inventory.warehouse', 'Warehouse')\n .leftJoinAndSelect('Inventory.location', 'Location')\n .leftJoinAndSelect('Inventory.creator', 'Creator')\n .leftJoinAndSelect('Inventory.updater', 'Updater')\n .leftJoinAndSelect(\n subQuery => {\n return subQuery\n .select('ii.inventory_id', 'inventory_id')\n .addSelect(`string_agg(ii.serial_number, ', ')`, 'serial_numbers')\n .from('inventory_items', 'ii')\n .where(`ii.domain_id = :domainId`, { domainId: domain.id })\n .groupBy('ii.inventory_id')\n },\n 'ii2',\n 'ii2.inventory_id = Inventory.id'\n )\n\n if (remainOnly) {\n qb.andWhere('Inventory.qty > 0')\n .andWhere('CASE WHEN Inventory.locked_qty IS NULL THEN 0 ELSE Inventory.locked_qty END >= 0')\n .andWhere('Inventory.qty - CASE WHEN Inventory.locked_qty IS NULL THEN 0 ELSE Inventory.locked_qty END > 0')\n }\n\n if (unlockOnly) {\n qb.andWhere('CASE WHEN Inventory.locked_qty IS NULL THEN 0 ELSE Inventory.locked_qty END = 0')\n }\n\n if (productFilters) {\n let productFilterValue = `%${productFilters.value.toLowerCase()}%`\n qb.andWhere(qb => {\n const subQuery = qb\n .subQuery()\n .select()\n .from(Product, `products`)\n .where(`products.id = Inventory.product_id`)\n .andWhere(\n new Brackets(qb => {\n qb.where('Lower(products.sku) LIKE :productInfo', { productInfo: productFilterValue })\n .orWhere('Lower(products.name) LIKE :productInfo', { productInfo: productFilterValue })\n .orWhere('Lower(products.description) LIKE :productInfo', { productInfo: productFilterValue })\n .orWhere('Lower(products.brand) LIKE :productInfo', { productInfo: productFilterValue })\n })\n )\n .getQuery()\n return `EXISTS ${subQuery}`\n })\n }\n\n if (sortings?.length !== 0) {\n const arrChildSortData = ['bizplace', 'product', 'location', 'warehouse', 'zone']\n const sort = (sortings || []).reduce(\n (acc, sort) => ({\n ...acc,\n [arrChildSortData.indexOf(sort.name) >= 0 ? sort.name + '.name' : 'Inventory.' + sort.name]: sort.desc\n ? 'DESC'\n : 'ASC'\n }),\n {}\n )\n qb.orderBy(sort)\n }\n\n if (locationSortingRules?.length > 0) {\n locationSortingRules.forEach((rule: { name: string; desc: boolean }) => {\n qb.addOrderBy(`location.${rule.name}`, rule.desc ? 'DESC' : 'ASC')\n })\n }\n\n let items = await qb\n .offset((page - 1) * limit)\n .limit(limit)\n .getRawMany()\n\n let total = await qb.getCount()\n\n return {\n items: items.map(item => {\n return {\n ...new Inventory(item),\n serialNumbers: item.serial_numbers\n }\n }),\n total\n }\n } catch (error) {\n throw error\n }\n }\n\n @Directive('@privilege(category: \"inventory\", privilege: \"query\")')\n @Directive('@transaction')\n @Query(returns => InventoryList)\n async inventoriesGroupByProduct(@Args() params: ListParam, @Ctx() context: any): Promise<InventoryList> {\n try {\n const { domain, user, tx }: { domain: Domain; user: User; tx: EntityManager } = context.state\n let permittedBizplaceIds: string[] = await getPermittedBizplaceIds(domain, user)\n const partnersCompanyBizplaces: Bizplace[] = await getPartnersCompanyBizplaces(domain, user)\n\n const page = params.pagination.page\n const limit = params.pagination.limit\n\n let bizplaceFilter = params.filters.find(filter => filter.name == 'bizplace')\n let productFilter = params.filters.find(filter => filter.name == 'product')\n let productTypeFilter = params.filters.find(filter => filter.name == 'type')\n let availableStockFilter = params.filters.find(filter => filter.name == 'availableStock')\n let lowStockFilter = params.filters.find(filter => filter.name == 'lowStock')\n let overStockFilter = params.filters.find(filter => filter.name == 'overStock')\n\n if (bizplaceFilter) {\n const bizplaceQueryBuilder: SelectQueryBuilder<Bizplace> = getRepository(Bizplace).createQueryBuilder('b')\n bizplaceQueryBuilder\n .innerJoin('companies', 'c2', ' c2.domain_id = b.domain_id')\n .innerJoin('bizplaces', 'b2', 'b2.company_id = c2.id')\n .where('b2.id = :bizplaceId', { bizplaceId: bizplaceFilter.value })\n\n let bizplaceList = await bizplaceQueryBuilder.getMany()\n\n permittedBizplaceIds = [\n ...permittedBizplaceIds.filter(itm => itm == bizplaceFilter.value),\n ...bizplaceList.map(bz => bz.id),\n ...partnersCompanyBizplaces.map(biz => biz.id)\n ]\n }\n\n let bizplaceQuery = ''\n if (permittedBizplaceIds.length > 0) {\n bizplaceQuery = `AND EXISTS (\n SELECT * FROM (VALUES ${permittedBizplaceIds.map(id => `('${id}')`).join(',')})\n AS bizFilter(bizplace_id)\n WHERE bizFilter.bizplace_id::uuid = \"Inventory\".\"bizplace_id\"\n )`\n } else {\n bizplaceQuery = `1 = 0`\n }\n\n let productQuery = ''\n if (productFilter) {\n let productValue = productFilter.value\n .toLowerCase()\n .split(',')\n .map(prod => {\n return \"'%\" + prod.trim().replace(/'/g, \"''\") + \"%'\"\n })\n .join(',')\n productQuery = `AND (\n Lower(\"Product\".\"name\") LIKE ANY(ARRAY[${productValue}])\n OR Lower(\"Product\".\"sku\") LIKE ANY(ARRAY[${productValue}])\n OR Lower(\"Product\".\"brand\") LIKE ANY(ARRAY[${productValue}])\n OR Lower(\"Product\".\"description\") LIKE ANY(ARRAY[${productValue}])\n OR Lower(\"ProductRef\".\"name\") LIKE ANY(ARRAY[${productValue}])\n OR Lower(\"ProductRef\".\"sku\") LIKE ANY(ARRAY[${productValue}])\n OR Lower(\"ProductRef\".\"description\") LIKE ANY(ARRAY[${productValue}])\n )`\n }\n\n if (productTypeFilter) {\n let productTypeValue = productTypeFilter.value\n .toLowerCase()\n .split(',')\n .map(prod => {\n return \"'%\" + prod.trim().replace(/'/g, \"''\") + \"%'\"\n })\n .join(',')\n productQuery =\n productQuery +\n ` AND (\n Lower(\"Product\".\"type\") LIKE ANY(ARRAY[${productTypeValue}])\n )`\n }\n\n let availableStockQuery = ''\n if (availableStockFilter?.value) {\n availableStockQuery = ` AND SUM(\"Inventory\".\"qty\") > 0`\n }\n\n let thresholdQuery = ''\n if (lowStockFilter?.value) {\n thresholdQuery = `AND COALESCE(\"ProductDetailBizplaceSetting\".\"min_qty\", \"Product\".\"min_qty\",0) > SUM(\"Inventory\".\"qty\")`\n }\n\n if (overStockFilter?.value) {\n thresholdQuery = `AND COALESCE(\"ProductDetailBizplaceSetting\".\"max_qty\", \"Product\".\"max_qty\",0) > 0 AND \n COALESCE(\"ProductDetailBizplaceSetting\".\"max_qty\", \"Product\".\"max_qty\",0) < SUM(\"Inventory\".\"qty\")`\n }\n\n await tx.query(\n `\n create temp table temp_inv_history AS \n (\n SELECT \"Product\".\"id\" AS \"id\", \"Product\".\"sku\" AS \"sku\", \"Product\".\"brand\" AS \"brand\", \"Product\".\"name\" AS \"name\", \"Product\".\"type\" AS \"type\", \"Product\".\"description\" AS \"description\", \"Product\".\"primary_unit\" AS \"primaryUnit\",\n \"Product\".\"weight\" AS \"weight\", \"ProductRef\".\"id\" AS \"productRefId\", \n \"ProductRef\".\"description\" AS \"productRefDesciption\", \"Bizplace\".\"id\" AS \"bizplaceId\", \"Bizplace\".\"name\" AS \"bizplaceName\", SUM(\"Inventory\".\"qty\") AS \"qty\" , SUM(\"Inventory\".\"uom_value\") AS \"uomValue\",\n \"Warehouse\".\"id\" AS \"warehouseId\", \"Warehouse\".\"name\" AS \"warehouseName\",\n CASE WHEN SUM(\"Inventory\".\"qty\") > 0 THEN SUM(COALESCE(\"Inventory\".\"unit_cost\", 0) * \"Inventory\".\"qty\")/ SUM(\"Inventory\".\"qty\") ELSE 0 END AS \"averageUnitCost\",\n COALESCE(\"ProductDetailBizplaceSetting\".\"min_qty\", \"Product\".\"min_qty\",0) AS \"minQty\", \n COALESCE(\"ProductDetailBizplaceSetting\".\"max_qty\", \"Product\".\"max_qty\",0) AS \"maxQty\"\n FROM \"inventories\" \"Inventory\" \n LEFT JOIN \"warehouses\" \"Warehouse\" ON \"Warehouse\".\"id\"=\"Inventory\".\"warehouse_id\"\n LEFT JOIN \"products\" \"Product\" ON \"Product\".\"id\"=\"Inventory\".\"product_id\" \n LEFT JOIN \"product_details\" \"ProductDetails\" ON \"ProductDetails\".\"product_id\" = \"Product\".\"id\" \n AND \"ProductDetails\".\"is_default\"\n LEFT JOIN \"product_detail_bizplace_settings\" \"ProductDetailBizplaceSetting\" ON \"ProductDetailBizplaceSetting\".\"product_detail_id\" = \"ProductDetails\".\"id\" \n AND \"ProductDetailBizplaceSetting\".\"domain_id\" = \"Inventory\".\"domain_id\"\n LEFT JOIN \"products\" \"ProductRef\" ON \"ProductRef\".\"id\"=\"Product\".\"product_ref_id\" \n INNER JOIN \"bizplaces\" \"Bizplace\" ON \"Bizplace\".\"id\"=\"Inventory\".\"bizplace_id\"\n WHERE \"Inventory\".\"qty\" >= 0\n AND \"Inventory\".\"domain_id\" = $1\n ${bizplaceQuery}\n ${productQuery}\n GROUP BY \"Product\".\"id\", \"ProductRef\".\"id\", \"Bizplace\".\"id\", \"ProductDetailBizplaceSetting\".\"id\", \"Warehouse\".\"id\"\n HAVING 1 = 1\n ${availableStockQuery}\n ${thresholdQuery}\n )`,\n [domain.id]\n )\n\n const results: any = await tx.query(\n `\n SELECT * FROM temp_inv_history\n ORDER BY \"bizplaceName\", \"sku\" \n OFFSET $1 LIMIT $2\n `,\n [(page - 1) * limit, limit]\n )\n\n const total: any = await tx.query(`SELECT COUNT(*) FROM temp_inv_history`)\n\n tx.query(`drop table temp_inv_history`)\n\n return {\n items: results.map((item: any) => {\n return {\n product: {\n id: item.id,\n name: item.name,\n sku: item.sku,\n brand: item.brand,\n description: item.description,\n type: item.type,\n weight: item.weight,\n productRefId: item.productRefId,\n bizplaceId: item.bizplaceId,\n minQty: item.minQty,\n maxQty: item.maxQty,\n primaryUnit: item.primaryUnit\n },\n warehouse: {\n id: item.warehouseId,\n name: item.warehouseName\n },\n averageUnitCost: item.averageUnitCost,\n qty: item.qty,\n uomValue: item.uomValue\n }\n }),\n total: total[0].count\n }\n } catch (error) {\n throw error\n }\n }\n\n @FieldResolver(type => Domain)\n async domain(@Root() inventory: Inventory): Promise<Domain> {\n return await getRepository(Domain).findOne(inventory.domainId)\n }\n\n @FieldResolver(type => User)\n async updater(@Root() inventory: Inventory): Promise<User> {\n return await getRepository(User).findOne(inventory.updaterId)\n }\n\n @FieldResolver(type => User)\n async creator(@Root() inventory: Inventory): Promise<User> {\n return await getRepository(User).findOne(inventory.creatorId)\n }\n\n /*\n move changeCount to @FieldResolver so that system don't have\n to keep searching for this when user does not request for it \n */\n @FieldResolver(type => Number)\n async changeCount(@Root() inventory: Inventory): Promise<Number> {\n return await getRepository(InventoryChange).count({\n where: { inventory }\n })\n }\n\n /*\n \"purchaseOrderNo\", \"orderProductRemark\" and \"arrivalNoticeRefNo\"\n are purely for Getha's lot label. @farishelmi added these here to\n avoid logic changes in @inventories query\n */\n @FieldResolver(type => String)\n async purchaseOrderNo(@Root() inventory: Inventory): Promise<String> {\n if (!inventory.refOrderId) return ''\n\n let items: any = await getRepository(Inventory).query(`\n SELECT po.name as \"purchaseOrderNo\" FROM arrival_notices an\n LEFT JOIN purchase_orders po\n ON an.purchase_order_id = po.id\n WHERE an.id = '${inventory.refOrderId}'\n LIMIT 1\n `)\n\n return items[0]?.purchaseOrderNo || ''\n }\n\n @FieldResolver(type => String)\n async orderProductRemark(@Root() inventory: Inventory): Promise<String> {\n if (!inventory.orderProductId) return ''\n\n let items: any = await getRepository(Inventory).query(`\n SELECT op.remark as \"orderProductRemark\" FROM order_products op\n WHERE op.id = '${inventory.orderProductId}'\n LIMIT 1\n `)\n\n return items[0]?.orderProductRemark || ''\n }\n\n @FieldResolver(type => String)\n async arrivalNoticeRefNo(@Root() inventory: Inventory): Promise<String> {\n if (!inventory.refOrderId) return ''\n\n let items: any = await getRepository(Inventory).query(`\n SELECT an.ref_no as \"arrivalNoticeRefNo\" FROM arrival_notices an\n WHERE an.id = '${inventory.refOrderId}'\n LIMIT 1\n `)\n\n return items[0]?.arrivalNoticeRefNo || ''\n }\n}\n\nexport async function inventoriesByStrategy(\n {\n worksheetId,\n batchId,\n bizplaceId,\n productName,\n productSku,\n packingType,\n packingSize,\n uom,\n pickingStrategy,\n locationSortingRules\n },\n trxMgr: EntityManager\n) {\n const qb = await trxMgr.getRepository(Inventory).createQueryBuilder('INV')\n qb.innerJoinAndSelect('INV.product', 'PROD')\n .innerJoinAndSelect('INV.location', 'LOC')\n .addSelect(subQuery =>\n subQuery\n .select('COALESCE(SUM(release_qty), 0)', 'releaseQty')\n .from('order_inventories', 'OI')\n .where('\"OI\".\"inventory_id\" = \"INV\".\"id\"')\n .andWhere(\"\\\"OI\\\".\\\"status\\\" IN ('PENDING', 'PENDING_RECEIVE', 'PENDING_WORKSHEET', 'PENDING_SPLIT')\")\n .andWhere('\"OI\".\"ref_worksheet_id\" <> :worksheetId', { worksheetId: worksheetId })\n )\n .addSelect(subQuery =>\n subQuery\n .select('COALESCE(SUM(release_uom_value), 0)', 'releaseUomValue')\n .from('order_inventories', 'OI')\n .where('\"OI\".\"inventory_id\" = \"INV\".\"id\"')\n .andWhere(\"\\\"OI\\\".\\\"status\\\" IN ('PENDING', 'PENDING_RECEIVE', 'PENDING_WORKSHEET', 'PENDING_SPLIT')\")\n .andWhere('\"OI\".\"ref_worksheet_id\" <> :worksheetId', { worksheetId: worksheetId })\n )\n .andWhere('\"PROD\".\"name\" = :productName')\n .andWhere('\"PROD\".\"sku\" = :productSku')\n .andWhere('\"INV\".\"packing_type\" = :packingType')\n .andWhere('\"INV\".\"packing_size\" = :packingSize')\n .andWhere('\"INV\".\"uom\" = :uom')\n .andWhere('\"INV\".\"status\" = :status', { status: 'STORED' })\n .andWhere('\"LOC\".\"type\" NOT IN (:...locationTypes)', {\n locationTypes: [LOCATION_TYPE.QUARANTINE, LOCATION_TYPE.RESERVE]\n })\n .setParameters({\n productName,\n productSku,\n packingType,\n packingSize,\n uom\n })\n\n if (batchId !== '') {\n qb.andWhere('\"INV\".\"batch_id\" = :batchId', { batchId })\n }\n\n if (bizplaceId) {\n qb.andWhere('\"INV\".\"bizplace_id\" = :bizplaceId', { bizplaceId: bizplaceId })\n }\n\n switch (pickingStrategy.toUpperCase()) {\n case 'FIFO':\n qb.orderBy('\"INV\".\"created_at\"', 'ASC')\n if (locationSortingRules?.length > 0) {\n locationSortingRules.forEach((rule: { name: string; desc: boolean }, idx: number) => {\n qb.addOrderBy(`LOC.${rule.name}`, rule.desc ? 'DESC' : 'ASC')\n })\n }\n break\n\n case 'LIFO':\n qb.orderBy('\"INV\".\"created_at\"', 'DESC')\n if (locationSortingRules?.length > 0) {\n locationSortingRules.forEach((rule: { name: string; desc: boolean }, idx: number) => {\n qb.addOrderBy(`LOC.${rule.name}`, rule.desc ? 'DESC' : 'ASC')\n })\n }\n break\n\n case 'FEFO':\n qb.orderBy('\"INV\".\"expiration_date\"', 'ASC')\n if (locationSortingRules?.length > 0) {\n locationSortingRules.forEach((rule: { name: string; desc: boolean }, idx: number) => {\n qb.addOrderBy(`LOC.${rule.name}`, rule.desc ? 'DESC' : 'ASC')\n })\n }\n break\n\n case 'FMFO':\n qb.orderBy('\"INV\".\"manufacture_date\"', 'ASC')\n if (locationSortingRules?.length > 0) {\n locationSortingRules.forEach((rule: { name: string; desc: boolean }, idx: number) => {\n qb.addOrderBy(`LOC.${rule.name}`, rule.desc ? 'DESC' : 'ASC')\n })\n }\n break\n\n case 'LOCATION':\n if (locationSortingRules?.length > 0) {\n locationSortingRules.forEach((rule: { name: string; desc: boolean }, idx: number) => {\n idx === 0\n ? qb.orderBy(`LOC.${rule.name}`, rule.desc ? 'DESC' : 'ASC')\n : qb.addOrderBy(`LOC.${rule.name}`, rule.desc ? 'DESC' : 'ASC')\n })\n } else qb.orderBy('\"LOC\".\"name\"', 'DESC')\n break\n }\n\n const { entities, raw } = await qb.getRawAndEntities()\n const items = entities\n .map((inv: Inventory, idx: number) => {\n const qty: number = inv?.qty > 0 ? inv.qty : 0\n const uomValue: number = inv?.uomValue > 0 ? inv.uomValue : 0\n const lockedQty: number = inv.lockedQty || 0\n const lockedUomValue: number = inv.lockedUomValue || 0\n const releaseQty: number = parseInt(raw[idx].releaseQty) || 0\n const releaseUomValue: number = parseFloat(raw[idx].releaseUomValue) || 0\n\n return {\n ...inv,\n qty: qty - lockedQty - releaseQty,\n uomValue: uomValue - lockedUomValue - releaseUomValue\n }\n })\n .filter((inv: Inventory) => inv.qty)\n\n const total: number = await qb.getCount()\n return { items, total }\n}\n"]}
|