@things-factory/operato-pms 4.0.26 → 4.0.31

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.
Files changed (323) hide show
  1. package/client/bootstrap.js +11 -0
  2. package/client/component/block-selector-popup.js +125 -24
  3. package/client/component/driver-selector-popup.js +223 -0
  4. package/client/component/mill-selector-popup.js +200 -0
  5. package/client/component/tracked-plantation-setting.js +113 -0
  6. package/client/component/truck-selector-popup.js +202 -0
  7. package/client/menu.js +34 -2
  8. package/client/pages/constants/index.js +1 -0
  9. package/client/pages/constants/organization.js +5 -0
  10. package/client/pages/dispatchment/daily-dispatch-detail.js +57 -18
  11. package/client/pages/dispatchment/dispatchment-create-record.js +157 -54
  12. package/client/pages/dispatchment/dispatchment-list.js +26 -34
  13. package/client/pages/harvesting/daily-harvesting-detail.js +55 -18
  14. package/client/pages/harvesting/edit-harvesting-record.js +89 -23
  15. package/client/pages/harvesting/harvesting-create-record.js +102 -16
  16. package/client/pages/harvesting/harvesting-list.js +58 -12
  17. package/client/pages/inventory/inventory-field-bunches.js +6 -4
  18. package/client/pages/inventory/inventory-ramp-tonnage.js +23 -31
  19. package/client/pages/loading/daily-loading-detail.js +47 -93
  20. package/client/pages/loading/edit-loading-record.js +75 -294
  21. package/client/pages/loading/loading-create-record.js +52 -329
  22. package/client/pages/loading/loading-list.js +20 -83
  23. package/client/pages/master/block.js +1 -0
  24. package/client/pages/master/company.js +26 -13
  25. package/client/pages/master/home.js +67 -65
  26. package/client/pages/master/ramp.js +1 -0
  27. package/client/pages/master/staff.js +54 -3
  28. package/client/pages/master/truck.js +416 -0
  29. package/client/pages/report/home.js +72 -65
  30. package/client/pages/report/report-daily-ffb-dispatch-and-production.js +436 -0
  31. package/client/pages/report/report-daily-production.js +38 -6
  32. package/client/pages/report/report-daily-staff-harvest.js +50 -5
  33. package/client/pages/report/report-ffb-tonnage-between-individual-block.js +398 -0
  34. package/client/pages/report/report-monthly-ffb-sale.js +413 -0
  35. package/client/pages/report/report-monthly-production.js +33 -4
  36. package/client/pages/report/report-yearly-production.js +24 -8
  37. package/client/pages/setting/home.js +107 -0
  38. package/client/pages/setting/plantation-setting.js +109 -0
  39. package/client/route.js +25 -0
  40. package/dist-server/constants/index.js +1 -0
  41. package/dist-server/constants/index.js.map +1 -1
  42. package/dist-server/constants/organization.js +9 -0
  43. package/dist-server/constants/organization.js.map +1 -0
  44. package/dist-server/constants/transaction.js +2 -1
  45. package/dist-server/constants/transaction.js.map +1 -1
  46. package/dist-server/controllers/render-dispatchment.js +1 -1
  47. package/dist-server/controllers/render-dispatchment.js.map +1 -1
  48. package/dist-server/entities/daily-dispatch.js +18 -4
  49. package/dist-server/entities/daily-dispatch.js.map +1 -1
  50. package/dist-server/entities/daily-harvest-detail.js +9 -11
  51. package/dist-server/entities/daily-harvest-detail.js.map +1 -1
  52. package/dist-server/entities/daily-harvest.js +16 -6
  53. package/dist-server/entities/daily-harvest.js.map +1 -1
  54. package/dist-server/entities/daily-loading-detail.js +14 -6
  55. package/dist-server/entities/daily-loading-detail.js.map +1 -1
  56. package/dist-server/entities/daily-loading.js +3 -11
  57. package/dist-server/entities/daily-loading.js.map +1 -1
  58. package/dist-server/entities/index.js +7 -1
  59. package/dist-server/entities/index.js.map +1 -1
  60. package/dist-server/entities/organization-staff.js +5 -1
  61. package/dist-server/entities/organization-staff.js.map +1 -1
  62. package/dist-server/entities/plantation-inventory.js +4 -10
  63. package/dist-server/entities/plantation-inventory.js.map +1 -1
  64. package/dist-server/entities/plantation-setting.js +76 -0
  65. package/dist-server/entities/plantation-setting.js.map +1 -0
  66. package/dist-server/entities/truck.js +77 -0
  67. package/dist-server/entities/truck.js.map +1 -0
  68. package/dist-server/graphql/resolvers/daily-dispatch/daily-dispatch-query.js +13 -2
  69. package/dist-server/graphql/resolvers/daily-dispatch/daily-dispatch-query.js.map +1 -1
  70. package/dist-server/graphql/resolvers/daily-dispatch/generate-daily-dispatch.js +25 -11
  71. package/dist-server/graphql/resolvers/daily-dispatch/generate-daily-dispatch.js.map +1 -1
  72. package/dist-server/graphql/resolvers/daily-dispatch/update-daily-dispatch.js +4 -3
  73. package/dist-server/graphql/resolvers/daily-dispatch/update-daily-dispatch.js.map +1 -1
  74. package/dist-server/graphql/resolvers/daily-harvest/daily-harvest-query.js +3 -1
  75. package/dist-server/graphql/resolvers/daily-harvest/daily-harvest-query.js.map +1 -1
  76. package/dist-server/graphql/resolvers/daily-harvest/generate-daily-harvest.js +21 -2
  77. package/dist-server/graphql/resolvers/daily-harvest/generate-daily-harvest.js.map +1 -1
  78. package/dist-server/graphql/resolvers/daily-harvest/update-daily-harvest.js +8 -2
  79. package/dist-server/graphql/resolvers/daily-harvest/update-daily-harvest.js.map +1 -1
  80. package/dist-server/graphql/resolvers/daily-loading/daily-loading-query.js +4 -6
  81. package/dist-server/graphql/resolvers/daily-loading/daily-loading-query.js.map +1 -1
  82. package/dist-server/graphql/resolvers/daily-loading/generate-daily-loading.js +20 -54
  83. package/dist-server/graphql/resolvers/daily-loading/generate-daily-loading.js.map +1 -1
  84. package/dist-server/graphql/resolvers/daily-loading/update-daily-loading.js +31 -106
  85. package/dist-server/graphql/resolvers/daily-loading/update-daily-loading.js.map +1 -1
  86. package/dist-server/graphql/resolvers/dashboard/dashboard-query.js +204 -0
  87. package/dist-server/graphql/resolvers/dashboard/dashboard-query.js.map +1 -0
  88. package/dist-server/graphql/resolvers/dashboard/index.js +8 -0
  89. package/dist-server/graphql/resolvers/dashboard/index.js.map +1 -0
  90. package/dist-server/graphql/resolvers/index.js +9 -6
  91. package/dist-server/graphql/resolvers/index.js.map +1 -1
  92. package/dist-server/graphql/resolvers/organization-staff/organization-staff-query.js +7 -3
  93. package/dist-server/graphql/resolvers/organization-staff/organization-staff-query.js.map +1 -1
  94. package/dist-server/graphql/resolvers/plantation-setting/create-plantation-setting.js +12 -0
  95. package/dist-server/graphql/resolvers/plantation-setting/create-plantation-setting.js.map +1 -0
  96. package/dist-server/graphql/resolvers/plantation-setting/delete-plantation-setting.js +13 -0
  97. package/dist-server/graphql/resolvers/plantation-setting/delete-plantation-setting.js.map +1 -0
  98. package/dist-server/graphql/resolvers/plantation-setting/delete-plantation-settings.js +16 -0
  99. package/dist-server/graphql/resolvers/plantation-setting/delete-plantation-settings.js.map +1 -0
  100. package/dist-server/graphql/resolvers/plantation-setting/index.js +15 -0
  101. package/dist-server/graphql/resolvers/plantation-setting/index.js.map +1 -0
  102. package/dist-server/graphql/resolvers/plantation-setting/plantation-setting-query.js +33 -0
  103. package/dist-server/graphql/resolvers/plantation-setting/plantation-setting-query.js.map +1 -0
  104. package/dist-server/graphql/resolvers/plantation-setting/update-multiple-plantation-setting.js +31 -0
  105. package/dist-server/graphql/resolvers/plantation-setting/update-multiple-plantation-setting.js.map +1 -0
  106. package/dist-server/graphql/resolvers/plantation-setting/update-plantation-setting.js +16 -0
  107. package/dist-server/graphql/resolvers/plantation-setting/update-plantation-setting.js.map +1 -0
  108. package/dist-server/graphql/resolvers/report/daily-ffb-dispatch-production-reports.js +111 -0
  109. package/dist-server/graphql/resolvers/report/daily-ffb-dispatch-production-reports.js.map +1 -0
  110. package/dist-server/graphql/resolvers/report/daily-production-reports.js +50 -37
  111. package/dist-server/graphql/resolvers/report/daily-production-reports.js.map +1 -1
  112. package/dist-server/graphql/resolvers/report/daily-staff-harvest-reports.js +21 -10
  113. package/dist-server/graphql/resolvers/report/daily-staff-harvest-reports.js.map +1 -1
  114. package/dist-server/graphql/resolvers/report/index.js +5 -1
  115. package/dist-server/graphql/resolvers/report/index.js.map +1 -1
  116. package/dist-server/graphql/resolvers/report/monthly-block-dispatch-reports.js +91 -0
  117. package/dist-server/graphql/resolvers/report/monthly-block-dispatch-reports.js.map +1 -0
  118. package/dist-server/graphql/resolvers/report/monthly-dispatch-summary-reports.js +89 -0
  119. package/dist-server/graphql/resolvers/report/monthly-dispatch-summary-reports.js.map +1 -0
  120. package/dist-server/graphql/resolvers/report/monthly-ffb-sale-reports.js +87 -0
  121. package/dist-server/graphql/resolvers/report/monthly-ffb-sale-reports.js.map +1 -0
  122. package/dist-server/graphql/resolvers/report/monthly-production-reports.js +46 -31
  123. package/dist-server/graphql/resolvers/report/monthly-production-reports.js.map +1 -1
  124. package/dist-server/graphql/resolvers/report/yearly-production-reports.js +38 -28
  125. package/dist-server/graphql/resolvers/report/yearly-production-reports.js.map +1 -1
  126. package/dist-server/graphql/resolvers/truck/delete-trucks.js +18 -0
  127. package/dist-server/graphql/resolvers/truck/delete-trucks.js.map +1 -0
  128. package/dist-server/graphql/resolvers/truck/index.js +12 -0
  129. package/dist-server/graphql/resolvers/truck/index.js.map +1 -0
  130. package/dist-server/graphql/resolvers/truck/truck-query.js +46 -0
  131. package/dist-server/graphql/resolvers/truck/truck-query.js.map +1 -0
  132. package/dist-server/graphql/resolvers/truck/update-multiple-truck.js +40 -0
  133. package/dist-server/graphql/resolvers/truck/update-multiple-truck.js.map +1 -0
  134. package/dist-server/graphql/types/daily-dispatch/daily-dispatch-patch.js +4 -1
  135. package/dist-server/graphql/types/daily-dispatch/daily-dispatch-patch.js.map +1 -1
  136. package/dist-server/graphql/types/daily-dispatch/daily-dispatch.js +4 -1
  137. package/dist-server/graphql/types/daily-dispatch/daily-dispatch.js.map +1 -1
  138. package/dist-server/graphql/types/daily-dispatch/index.js +6 -1
  139. package/dist-server/graphql/types/daily-dispatch/index.js.map +1 -1
  140. package/dist-server/graphql/types/daily-dispatch/new-daily-dispatch.js +4 -1
  141. package/dist-server/graphql/types/daily-dispatch/new-daily-dispatch.js.map +1 -1
  142. package/dist-server/graphql/types/daily-harvest/daily-harvest-patch.js +5 -2
  143. package/dist-server/graphql/types/daily-harvest/daily-harvest-patch.js.map +1 -1
  144. package/dist-server/graphql/types/daily-harvest/daily-harvest.js +3 -0
  145. package/dist-server/graphql/types/daily-harvest/daily-harvest.js.map +1 -1
  146. package/dist-server/graphql/types/daily-harvest/new-daily-harvest.js +4 -1
  147. package/dist-server/graphql/types/daily-harvest/new-daily-harvest.js.map +1 -1
  148. package/dist-server/graphql/types/daily-harvest-detail/daily-harvest-detail-patch.js +1 -0
  149. package/dist-server/graphql/types/daily-harvest-detail/daily-harvest-detail-patch.js.map +1 -1
  150. package/dist-server/graphql/types/daily-harvest-detail/daily-harvest-detail.js +1 -0
  151. package/dist-server/graphql/types/daily-harvest-detail/daily-harvest-detail.js.map +1 -1
  152. package/dist-server/graphql/types/daily-harvest-detail/new-daily-harvest-detail.js +1 -0
  153. package/dist-server/graphql/types/daily-harvest-detail/new-daily-harvest-detail.js.map +1 -1
  154. package/dist-server/graphql/types/daily-loading/daily-loading-patch.js +0 -2
  155. package/dist-server/graphql/types/daily-loading/daily-loading-patch.js.map +1 -1
  156. package/dist-server/graphql/types/daily-loading/daily-loading.js +0 -2
  157. package/dist-server/graphql/types/daily-loading/daily-loading.js.map +1 -1
  158. package/dist-server/graphql/types/daily-loading/new-daily-loading.js +0 -2
  159. package/dist-server/graphql/types/daily-loading/new-daily-loading.js.map +1 -1
  160. package/dist-server/graphql/types/daily-loading-detail/daily-loading-detail-patch.js +6 -3
  161. package/dist-server/graphql/types/daily-loading-detail/daily-loading-detail-patch.js.map +1 -1
  162. package/dist-server/graphql/types/daily-loading-detail/daily-loading-detail.js +3 -0
  163. package/dist-server/graphql/types/daily-loading-detail/daily-loading-detail.js.map +1 -1
  164. package/dist-server/graphql/types/daily-loading-detail/new-daily-loading-detail.js +6 -3
  165. package/dist-server/graphql/types/daily-loading-detail/new-daily-loading-detail.js.map +1 -1
  166. package/dist-server/graphql/types/dashboard/bunches-count.js +15 -0
  167. package/dist-server/graphql/types/dashboard/bunches-count.js.map +1 -0
  168. package/dist-server/graphql/types/dashboard/index.js +32 -0
  169. package/dist-server/graphql/types/dashboard/index.js.map +1 -0
  170. package/dist-server/graphql/types/dashboard/productions-overview.js +15 -0
  171. package/dist-server/graphql/types/dashboard/productions-overview.js.map +1 -0
  172. package/dist-server/graphql/types/dashboard/tonnage-bunches-inventories.js +14 -0
  173. package/dist-server/graphql/types/dashboard/tonnage-bunches-inventories.js.map +1 -0
  174. package/dist-server/graphql/types/dashboard/tonnage-production.js +17 -0
  175. package/dist-server/graphql/types/dashboard/tonnage-production.js.map +1 -0
  176. package/dist-server/graphql/types/dashboard/yield-production.js +17 -0
  177. package/dist-server/graphql/types/dashboard/yield-production.js.map +1 -0
  178. package/dist-server/graphql/types/index.js +9 -6
  179. package/dist-server/graphql/types/index.js.map +1 -1
  180. package/dist-server/graphql/types/organization-staff/organization-staff-patch.js +2 -0
  181. package/dist-server/graphql/types/organization-staff/organization-staff-patch.js.map +1 -1
  182. package/dist-server/graphql/types/organization-staff/organization-staff.js +3 -0
  183. package/dist-server/graphql/types/organization-staff/organization-staff.js.map +1 -1
  184. package/dist-server/graphql/types/plantation-setting/index.js +36 -0
  185. package/dist-server/graphql/types/plantation-setting/index.js.map +1 -0
  186. package/dist-server/graphql/types/plantation-setting/new-plantation-setting.js +16 -0
  187. package/dist-server/graphql/types/plantation-setting/new-plantation-setting.js.map +1 -0
  188. package/dist-server/graphql/types/plantation-setting/plantation-setting-list.js +14 -0
  189. package/dist-server/graphql/types/plantation-setting/plantation-setting-list.js.map +1 -0
  190. package/dist-server/graphql/types/plantation-setting/plantation-setting-patch.js +18 -0
  191. package/dist-server/graphql/types/plantation-setting/plantation-setting-patch.js.map +1 -0
  192. package/dist-server/graphql/types/plantation-setting/plantation-setting.js +22 -0
  193. package/dist-server/graphql/types/plantation-setting/plantation-setting.js.map +1 -0
  194. package/dist-server/graphql/types/report/daily-ffb-dispatch-production-report-list.js +14 -0
  195. package/dist-server/graphql/types/report/daily-ffb-dispatch-production-report-list.js.map +1 -0
  196. package/dist-server/graphql/types/report/daily-ffb-dispatch-production-report.js +15 -0
  197. package/dist-server/graphql/types/report/daily-ffb-dispatch-production-report.js.map +1 -0
  198. package/dist-server/graphql/types/report/index.js +33 -0
  199. package/dist-server/graphql/types/report/index.js.map +1 -1
  200. package/dist-server/graphql/types/report/monthly-block-dispatch-report-list.js +14 -0
  201. package/dist-server/graphql/types/report/monthly-block-dispatch-report-list.js.map +1 -0
  202. package/dist-server/graphql/types/report/monthly-block-dispatch-report.js +19 -0
  203. package/dist-server/graphql/types/report/monthly-block-dispatch-report.js.map +1 -0
  204. package/dist-server/graphql/types/report/monthly-dispatch-summary-report-list.js +14 -0
  205. package/dist-server/graphql/types/report/monthly-dispatch-summary-report-list.js.map +1 -0
  206. package/dist-server/graphql/types/report/monthly-dispatch-summary-report.js +25 -0
  207. package/dist-server/graphql/types/report/monthly-dispatch-summary-report.js.map +1 -0
  208. package/dist-server/graphql/types/report/monthly-ffb-sale-report-list.js +14 -0
  209. package/dist-server/graphql/types/report/monthly-ffb-sale-report-list.js.map +1 -0
  210. package/dist-server/graphql/types/report/monthly-ffb-sale-report.js +24 -0
  211. package/dist-server/graphql/types/report/monthly-ffb-sale-report.js.map +1 -0
  212. package/dist-server/graphql/types/truck/index.js +33 -0
  213. package/dist-server/graphql/types/truck/index.js.map +1 -0
  214. package/dist-server/graphql/types/truck/new-truck.js +14 -0
  215. package/dist-server/graphql/types/truck/new-truck.js.map +1 -0
  216. package/dist-server/graphql/types/truck/truck-list.js +14 -0
  217. package/dist-server/graphql/types/truck/truck-list.js.map +1 -0
  218. package/dist-server/graphql/types/truck/truck-patch.js +17 -0
  219. package/dist-server/graphql/types/truck/truck-patch.js.map +1 -0
  220. package/dist-server/graphql/types/truck/truck.js +22 -0
  221. package/dist-server/graphql/types/truck/truck.js.map +1 -0
  222. package/dist-server/utils/core-values.js +2 -2
  223. package/dist-server/utils/transaction-util.js +2 -1
  224. package/dist-server/utils/transaction-util.js.map +1 -1
  225. package/package.json +56 -56
  226. package/server/constants/index.ts +1 -0
  227. package/server/constants/organization.ts +5 -0
  228. package/server/constants/transaction.ts +2 -1
  229. package/server/controllers/render-dispatchment.ts +1 -1
  230. package/server/entities/daily-dispatch.ts +18 -5
  231. package/server/entities/daily-harvest-detail.ts +10 -11
  232. package/server/entities/daily-harvest.ts +16 -7
  233. package/server/entities/daily-loading-detail.ts +14 -6
  234. package/server/entities/daily-loading.ts +7 -11
  235. package/server/entities/index.ts +6 -0
  236. package/server/entities/organization-staff.ts +6 -1
  237. package/server/entities/plantation-inventory.ts +6 -10
  238. package/server/entities/plantation-setting.ts +60 -0
  239. package/server/entities/truck.ts +58 -0
  240. package/server/graphql/resolvers/daily-dispatch/daily-dispatch-query.ts +15 -2
  241. package/server/graphql/resolvers/daily-dispatch/generate-daily-dispatch.ts +40 -14
  242. package/server/graphql/resolvers/daily-dispatch/update-daily-dispatch.ts +8 -4
  243. package/server/graphql/resolvers/daily-harvest/daily-harvest-query.ts +7 -2
  244. package/server/graphql/resolvers/daily-harvest/generate-daily-harvest.ts +50 -4
  245. package/server/graphql/resolvers/daily-harvest/update-daily-harvest.ts +12 -2
  246. package/server/graphql/resolvers/daily-loading/daily-loading-query.ts +6 -6
  247. package/server/graphql/resolvers/daily-loading/generate-daily-loading.ts +27 -109
  248. package/server/graphql/resolvers/daily-loading/update-daily-loading.ts +56 -214
  249. package/server/graphql/resolvers/dashboard/dashboard-query.ts +252 -0
  250. package/server/graphql/resolvers/dashboard/index.ts +5 -0
  251. package/server/graphql/resolvers/index.ts +10 -6
  252. package/server/graphql/resolvers/organization-staff/organization-staff-query.ts +13 -4
  253. package/server/graphql/resolvers/plantation-setting/create-plantation-setting.ts +16 -0
  254. package/server/graphql/resolvers/plantation-setting/delete-plantation-setting.ts +13 -0
  255. package/server/graphql/resolvers/plantation-setting/delete-plantation-settings.ts +16 -0
  256. package/server/graphql/resolvers/plantation-setting/index.ts +19 -0
  257. package/server/graphql/resolvers/plantation-setting/plantation-setting-query.ts +38 -0
  258. package/server/graphql/resolvers/plantation-setting/update-multiple-plantation-setting.ts +46 -0
  259. package/server/graphql/resolvers/plantation-setting/update-plantation-setting.ts +19 -0
  260. package/server/graphql/resolvers/report/daily-ffb-dispatch-production-reports.ts +138 -0
  261. package/server/graphql/resolvers/report/daily-production-reports.ts +59 -48
  262. package/server/graphql/resolvers/report/daily-staff-harvest-reports.ts +28 -20
  263. package/server/graphql/resolvers/report/index.ts +9 -1
  264. package/server/graphql/resolvers/report/monthly-block-dispatch-reports.ts +114 -0
  265. package/server/graphql/resolvers/report/monthly-dispatch-summary-reports.ts +110 -0
  266. package/server/graphql/resolvers/report/monthly-ffb-sale-reports.ts +107 -0
  267. package/server/graphql/resolvers/report/monthly-production-reports.ts +54 -40
  268. package/server/graphql/resolvers/report/yearly-production-reports.ts +43 -38
  269. package/server/graphql/resolvers/truck/delete-trucks.ts +21 -0
  270. package/server/graphql/resolvers/truck/index.ts +12 -0
  271. package/server/graphql/resolvers/truck/truck-query.ts +52 -0
  272. package/server/graphql/resolvers/truck/update-multiple-truck.ts +55 -0
  273. package/server/graphql/types/daily-dispatch/daily-dispatch-patch.ts +4 -1
  274. package/server/graphql/types/daily-dispatch/daily-dispatch.ts +4 -1
  275. package/server/graphql/types/daily-dispatch/index.ts +6 -1
  276. package/server/graphql/types/daily-dispatch/new-daily-dispatch.ts +4 -1
  277. package/server/graphql/types/daily-harvest/daily-harvest-patch.ts +5 -2
  278. package/server/graphql/types/daily-harvest/daily-harvest.ts +3 -0
  279. package/server/graphql/types/daily-harvest/new-daily-harvest.ts +4 -1
  280. package/server/graphql/types/daily-harvest-detail/daily-harvest-detail-patch.ts +1 -0
  281. package/server/graphql/types/daily-harvest-detail/daily-harvest-detail.ts +1 -0
  282. package/server/graphql/types/daily-harvest-detail/new-daily-harvest-detail.ts +1 -0
  283. package/server/graphql/types/daily-loading/daily-loading-patch.ts +0 -2
  284. package/server/graphql/types/daily-loading/daily-loading.ts +0 -2
  285. package/server/graphql/types/daily-loading/new-daily-loading.ts +0 -2
  286. package/server/graphql/types/daily-loading-detail/daily-loading-detail-patch.ts +6 -3
  287. package/server/graphql/types/daily-loading-detail/daily-loading-detail.ts +3 -0
  288. package/server/graphql/types/daily-loading-detail/new-daily-loading-detail.ts +6 -3
  289. package/server/graphql/types/dashboard/bunches-count.ts +9 -0
  290. package/server/graphql/types/dashboard/index.ts +17 -0
  291. package/server/graphql/types/dashboard/productions-overview.ts +9 -0
  292. package/server/graphql/types/dashboard/tonnage-bunches-inventories.ts +8 -0
  293. package/server/graphql/types/dashboard/tonnage-production.ts +11 -0
  294. package/server/graphql/types/dashboard/yield-production.ts +11 -0
  295. package/server/graphql/types/index.ts +10 -6
  296. package/server/graphql/types/organization-staff/organization-staff-patch.ts +2 -0
  297. package/server/graphql/types/organization-staff/organization-staff.ts +3 -0
  298. package/server/graphql/types/plantation-setting/index.ts +21 -0
  299. package/server/graphql/types/plantation-setting/new-plantation-setting.ts +10 -0
  300. package/server/graphql/types/plantation-setting/plantation-setting-list.ts +8 -0
  301. package/server/graphql/types/plantation-setting/plantation-setting-patch.ts +12 -0
  302. package/server/graphql/types/plantation-setting/plantation-setting.ts +16 -0
  303. package/server/graphql/types/report/daily-ffb-dispatch-production-report-list.ts +8 -0
  304. package/server/graphql/types/report/daily-ffb-dispatch-production-report.ts +9 -0
  305. package/server/graphql/types/report/index.ts +33 -0
  306. package/server/graphql/types/report/monthly-block-dispatch-report-list.ts +7 -0
  307. package/server/graphql/types/report/monthly-block-dispatch-report.ts +13 -0
  308. package/server/graphql/types/report/monthly-dispatch-summary-report-list.ts +7 -0
  309. package/server/graphql/types/report/monthly-dispatch-summary-report.ts +19 -0
  310. package/server/graphql/types/report/monthly-ffb-sale-report-list.ts +7 -0
  311. package/server/graphql/types/report/monthly-ffb-sale-report.ts +18 -0
  312. package/server/graphql/types/truck/index.ts +18 -0
  313. package/server/graphql/types/truck/new-truck.ts +8 -0
  314. package/server/graphql/types/truck/truck-list.ts +8 -0
  315. package/server/graphql/types/truck/truck-patch.ts +11 -0
  316. package/server/graphql/types/truck/truck.ts +16 -0
  317. package/server/utils/core-values.ts +2 -2
  318. package/server/utils/transaction-util.ts +2 -1
  319. package/things-factory.config.js +27 -1
  320. package/translations/en.json +79 -16
  321. package/translations/ko.json +78 -48
  322. package/translations/ms.json +78 -48
  323. package/translations/zh.json +78 -48
@@ -0,0 +1,13 @@
1
+ import { getRepository } from 'typeorm'
2
+ import { PlantationSetting } from '../../../entities'
3
+
4
+ export const deletePlantationSetting = {
5
+ async deletePlantationSetting(_: any, { name }, context: any) {
6
+ const { domain, user } = context.state
7
+
8
+ await getRepository(PlantationSetting).delete({ domain, name })
9
+
10
+ return true
11
+ }
12
+ }
13
+
@@ -0,0 +1,16 @@
1
+ import { getRepository, In } from 'typeorm'
2
+ import { PlantationSetting } from '../../../entities'
3
+
4
+ export const deletePlantationSettings = {
5
+ async deletePlantationSettings(_: any, { names }, context: any) {
6
+ const { domain, user } = context.state
7
+
8
+ await getRepository(PlantationSetting).delete({
9
+ domain,
10
+ name: In(names)
11
+ })
12
+
13
+ return true
14
+ }
15
+ }
16
+
@@ -0,0 +1,19 @@
1
+ import { Query, PlantationSetting } from './plantation-setting-query'
2
+
3
+ import { updatePlantationSetting } from './update-plantation-setting'
4
+ import { updateMultiplePlantationSetting } from './update-multiple-plantation-setting'
5
+ import { createPlantationSetting } from './create-plantation-setting'
6
+ import { deletePlantationSetting } from './delete-plantation-setting'
7
+ import { deletePlantationSettings } from './delete-plantation-settings'
8
+
9
+ export const PlantationSettingResolver = {
10
+ PlantationSetting,
11
+ Query,
12
+ Mutation: {
13
+ ...updatePlantationSetting,
14
+ ...updateMultiplePlantationSetting,
15
+ ...createPlantationSetting,
16
+ ...deletePlantationSetting,
17
+ ...deletePlantationSettings
18
+ }
19
+ }
@@ -0,0 +1,38 @@
1
+ import { getRepository } from 'typeorm'
2
+ import { Domain, ListParam, convertListParams } from '@things-factory/shell'
3
+ import { User } from '@things-factory/auth-base'
4
+ import { PlantationSetting as PlantationSettingEntity } from '../../../entities'
5
+
6
+ export const Query = {
7
+ async plantationSetting(_: any, { name }, context: any) {
8
+ const { domain, user } = context.state
9
+ const repository = getRepository(PlantationSettingEntity)
10
+
11
+ return await repository.findOne({
12
+ where: { domain, name }
13
+ })
14
+ },
15
+
16
+ async plantationSettings(_: any, params: ListParam, context: any) {
17
+ const convertedParams = convertListParams(params)
18
+ const [items, total] = await getRepository(PlantationSettingEntity).findAndCount({
19
+ ...convertedParams
20
+ })
21
+
22
+ return { items, total }
23
+ }
24
+ }
25
+
26
+ export const PlantationSetting = {
27
+ async domain(plantationSetting) {
28
+ return await getRepository(Domain).findOne(plantationSetting.domainId)
29
+ },
30
+
31
+ async creator(plantationSetting) {
32
+ return await getRepository(User).findOne(plantationSetting.creatorId)
33
+ },
34
+
35
+ async updater(plantationSetting) {
36
+ return await getRepository(User).findOne(plantationSetting.updaterId)
37
+ }
38
+ }
@@ -0,0 +1,46 @@
1
+ import { getRepository } from 'typeorm'
2
+ import { PlantationSetting } from '../../../entities'
3
+
4
+ export const updateMultiplePlantationSetting = {
5
+ async updateMultiplePlantationSetting(_: any, { patches }, context: any) {
6
+ const { domain, user } = context.state
7
+
8
+ let results = []
9
+ const _createRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === '+')
10
+ const _updateRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === 'M')
11
+ const plantationSettingRepo = getRepository(PlantationSetting)
12
+
13
+ if (_createRecords.length > 0) {
14
+ for (let i = 0; i < _createRecords.length; i++) {
15
+ const newRecord = _createRecords[i]
16
+
17
+ const result = await plantationSettingRepo.save({
18
+ ...newRecord,
19
+ domain: domain,
20
+ creator: user,
21
+ updater: user,
22
+ })
23
+
24
+ results.push({ ...result, cuFlag: '+' })
25
+ }
26
+ }
27
+
28
+ if (_updateRecords.length > 0) {
29
+ for (let i = 0; i < _updateRecords.length; i++) {
30
+ const newRecord = _updateRecords[i]
31
+ const plantationSetting = await plantationSettingRepo.findOne({ domain, id: newRecord.id})
32
+
33
+ const result = await plantationSettingRepo.save({
34
+ ...plantationSetting,
35
+ ...newRecord,
36
+ updater: user
37
+ })
38
+
39
+ results.push({ ...result, cuFlag: 'M' })
40
+ }
41
+ }
42
+
43
+ return results
44
+ }
45
+ }
46
+
@@ -0,0 +1,19 @@
1
+ import { getRepository } from 'typeorm'
2
+ import { PlantationSetting } from '../../../entities'
3
+
4
+ export const updatePlantationSetting = {
5
+ async updatePlantationSetting(_: any, { name, patch }, context: any) {
6
+ const { domain, user } = context.state
7
+
8
+ const repository = getRepository(PlantationSetting)
9
+ const plantationSetting = await repository.findOne({
10
+ where: { domain, name }
11
+ })
12
+
13
+ return await repository.save({
14
+ ...plantationSetting,
15
+ ...patch,
16
+ updater: user
17
+ })
18
+ }
19
+ }
@@ -0,0 +1,138 @@
1
+ import { EntityManager, getRepository, Not, IsNull } from 'typeorm'
2
+
3
+ import { ListParam, Domain } from '@things-factory/shell'
4
+ import { Block, Organization, Ramp } from '../../../entities'
5
+
6
+ export const dailyFfbDispatchProductionReports = {
7
+ async dailyFfbDispatchProductionReports(_: any, params: ListParam, context: any) {
8
+ try {
9
+ const { domain, tx }: { domain: Domain, tx: EntityManager } = context.state
10
+
11
+ let year = parseInt(params.filters.filter(x => x.name == 'month')[0].value.split('-')[0])
12
+ let month = parseInt(params.filters.filter(x => x.name == 'month')[0].value.split('-')[1])
13
+
14
+ let fromDate = new Date(year, month - 1, 1)
15
+ let toDate = new Date(year, month, 1)
16
+ toDate.setDate(toDate.getDate() - 1)
17
+
18
+ let fromDateString = [
19
+ fromDate.getFullYear().toString(),
20
+ String(fromDate.getMonth() + 1).padStart(2, '0'),
21
+ '01'
22
+ ].join('-')
23
+
24
+ let toDateString = [
25
+ toDate.getFullYear().toString(),
26
+ String(toDate.getMonth() + 1).padStart(2, '0'),
27
+ String(toDate.getDate()).padStart(2, '0')
28
+ ].join('-')
29
+
30
+ let ramps = await getRepository(Ramp).find({
31
+ where: { domain: domain.id, deletedAt: IsNull() },
32
+ relations: ['block']
33
+ })
34
+
35
+ let organizations = await getRepository(Organization).find({
36
+ where: { domain: domain.id, deletedAt: IsNull() }
37
+ })
38
+
39
+ let blocks = await tx.getRepository(Block).query(`
40
+ SELECT b.id, b.name FROM ramps r
41
+ INNER JOIN blocks b ON b.id = r.block_id
42
+ WHERE b.deleted_at IS NULL
43
+ AND r.domain_id = $1
44
+ GROUP BY b.id, b.name
45
+ `, [domain.id])
46
+
47
+
48
+ // -- WHERE dd.dispatch_at::timestamp between $1::timestamp and $2::timestamp
49
+ // [fromDateString, toDateString]
50
+ await tx.query(`create extension if not exists tablefunc`)
51
+
52
+ await tx.query(
53
+ `
54
+ CREATE TEMP TABLE raw_block_dispatch ON COMMIT DROP AS (
55
+ SELECT "name", "dispatch_at", sum(weight) AS weight FROM(
56
+ SELECT * FROM (
57
+ SELECT dd.id,COALESCE(b.name, 'unknown') AS name, 1 AS "rank", dd.dispatch_at::date AS dispatch_at,
58
+ COALESCE(ddd.adjusted_weight, ddd.collected_ramp_weight, 0) AS weight
59
+ FROM daily_dispatches dd
60
+ INNER JOIN daily_dispatch_details ddd ON ddd.daily_dispatch_id = dd.id
61
+ INNER JOIN ramps r ON r.id = ddd.ramp_id
62
+ INNER JOIN blocks b ON b.id = r.block_id
63
+ WHERE dd.dispatch_at::date between $1 and $2
64
+ UNION
65
+ SELECT dd.id, COALESCE(c.name, 'unknown') AS name, CASE WHEN c.name IS NULL THEN 3 ELSE 2 END AS "rank", dd.dispatch_at::date AS dispatch_at,
66
+ COALESCE((SELECT SUM(COALESCE(ddd.adjusted_weight, ddd.collected_ramp_weight, 0)) FROM daily_dispatch_details ddd WHERE ddd.daily_dispatch_id = dd.id),0) AS weight
67
+ FROM daily_dispatches dd
68
+ LEFT JOIN organizations c ON c.id = dd.dispatch_to_id
69
+ WHERE dd.dispatch_at::date between $1 and $2
70
+ ) foo
71
+ ORDER BY "rank", "name", "dispatch_at"
72
+ ) foo
73
+ GROUP BY "name", "dispatch_at"
74
+ ORDER BY name, "dispatch_at"
75
+ )
76
+ `,
77
+ [fromDateString, toDateString]
78
+ )
79
+
80
+ await tx.query(
81
+ `
82
+ CREATE TEMP TABLE pivot_block_dispatch ON COMMIT DROP AS (
83
+ SELECT * FROM crosstab(
84
+ $$
85
+ SELECT rbd."dispatch_at", rbd."name",
86
+ CONCAT('today: ', round(rbd.weight,2)::varchar, ' | todate: ', round(coalesce(sum(rbd.weight) over (PARTITION BY "name" ORDER BY name, dispatch_at asc rows between unbounded preceding and current row), 0),2)::varchar) AS weight
87
+ FROM raw_block_dispatch rbd
88
+ ORDER BY rbd."dispatch_at", rbd."name"
89
+ $$,
90
+ $$
91
+ SELECT b.name FROM ramps r INNER JOIN blocks b ON b.id = r.block_id WHERE r.deleted_at IS NULL AND r.domain_id = '${domain.id}'
92
+ GROUP BY b.id, b.name
93
+ UNION
94
+ SELECT c.name FROM organizations c
95
+ $$
96
+ ) AS (dispatch_at date, ${[...blocks.map(block => `"${block.name}" varchar`), ...organizations.map(organization => `"${organization.name}" varchar`)].join(',')},"unknown" varchar)
97
+ );
98
+ `
99
+ )
100
+
101
+ await tx.query(
102
+ `
103
+ CREATE TEMP TABLE temp_monthly_production_data ON COMMIT DROP AS (
104
+ SELECT TO_CHAR(md.dateDay:: DATE, 'dd/mm/yyyy') as "date"
105
+ , row_to_json((SELECT d FROM (SELECT ${[...blocks.map(block => `pbd."${block.name}"`), ...organizations.map(organization => `pbd."${organization.name}"`)].join(',')}, pbd."unknown") d))::varchar as "blockData"
106
+ , (SELECT sum(weight) FROM raw_block_dispatch rbd WHERE rbd.dispatch_at = pbd.dispatch_at) AS "today"
107
+ FROM (select generate_series((date '${fromDateString}')::timestamp, (date '${toDateString}')::timestamp, interval '1 day')::date as dateDay) as md
108
+ LEFT JOIN pivot_block_dispatch pbd on pbd.dispatch_at::date = md.dateDay
109
+ );
110
+ `
111
+ )
112
+
113
+ const result: any = await tx.query(
114
+ `
115
+ select "date", "blockData", "today"
116
+ from temp_monthly_production_data dt
117
+ `
118
+ )
119
+
120
+ const total: any = await tx.query(
121
+ `
122
+ select count(*) from temp_monthly_production_data
123
+ `
124
+ )
125
+
126
+
127
+ return {
128
+ items: result.map(itm => {
129
+ return {
130
+ ...itm
131
+ }
132
+ }), total: total[0].count
133
+ }
134
+ } catch (error) {
135
+ throw error
136
+ }
137
+ }
138
+ }
@@ -1,5 +1,7 @@
1
- import { ListParam } from '@things-factory/shell'
2
1
  import { EntityManager } from 'typeorm'
2
+
3
+ import { ListParam } from '@things-factory/shell'
4
+
3
5
  import { Block } from '../../../entities'
4
6
 
5
7
  export const dailyProductionReports = {
@@ -31,25 +33,42 @@ export const dailyProductionReports = {
31
33
  .findOneOrFail({ where: { id: params.filters.filter(x => x.name == 'block')[0].value } })
32
34
 
33
35
  await tx.query(`
34
- CREATE TEMP TABLE temp_records AS (
35
- select block_id, coalesce(sum(field_bunches),0) AS today_field_bunches,
36
- coalesce(sum(ramp_weight),0) AS today_ramp_weight,
37
- sum(case when transaction_type = 'HARVEST' then field_bunches else 0 end) as today_bunch_harvest,
38
- sum(case when transaction_type = 'LOADING' then -field_bunches else 0 end) as today_bunch_collected,
39
- sum(case when transaction_type = 'LOADING' then ramp_weight else 0 end) as today_ramp_weight_collected,
40
- sum(case when transaction_type = 'DISPATCHMENT' then -ramp_weight else 0 end) as today_weight_dispatch,
36
+ CREATE TEMP TABLE temp_blocks on commit drop AS (
37
+ WITH RECURSIVE b AS (
38
+ SELECT $1::uuid as block_id, * FROM blocks b
39
+ WHERE id = $1::uuid
40
+ AND b.deleted_at IS null
41
+ UNION ALL
42
+ SELECT $1::uuid as block_id, cb.* FROM blocks cb
43
+ INNER JOIN b ON b.id = cb.parent_block_id
44
+ WHERE cb.deleted_at IS null
45
+ )
46
+ SELECT * FROM b
47
+ );
48
+ `, [block.id]
49
+ )
50
+
51
+ await tx.query(`
52
+ CREATE TEMP TABLE temp_records on commit drop AS (
53
+ select blk.block_id, coalesce(sum(field_bunches),0) AS today_field_bunches,
54
+ round(coalesce(sum(ramp_weight),0)::numeric,4) AS today_ramp_weight,
55
+ sum(case when transaction_type = 'HARVEST' OR transaction_type = 'BUNCHES_ADJUSTMENT' then field_bunches else 0 end) as today_bunch_harvest,
56
+ sum(case when transaction_type = 'LOADING' OR transaction_type = 'LOADING_ADJUSTMENT' then -field_bunches else 0 end) as today_bunch_collected,
57
+ round(sum(case when transaction_type = 'LOADING' OR transaction_type = 'LOADING_ADJUSTMENT' then ramp_weight else 0 end)::numeric,4) as today_ramp_weight_collected,
58
+ round(sum(case when transaction_type = 'DISPATCHMENT' OR transaction_type = 'DISPATCHMENT_ADJUSTMENT' then -ramp_weight else 0 end)::numeric,4) as today_weight_dispatch,
41
59
  transaction_date
42
- from record_transactions t2
60
+ from record_transactions t2
61
+ inner join temp_blocks blk on blk.id = t2.block_id
43
62
  where transaction_date <= $1
44
- and block_id = $2
45
- group by block_id, transaction_date
63
+ group by blk.block_id, transaction_date
46
64
  )
47
- `,
48
- [toDateString, block.id])
65
+ `,
66
+ [toDateString]
67
+ )
49
68
 
50
69
  await tx.query(
51
70
  `
52
- create temp table temp_daily_production_data as (
71
+ create temp table temp_daily_production_data on commit drop as (
53
72
  select *,
54
73
  prev_bunch_bal_in_field + today_bunch_harvest as today_bunch_in_field,
55
74
  prev_bunch_bal_in_field + today_bunch_harvest - today_bunch_collected as today_bunch_bal_in_field,
@@ -88,60 +107,52 @@ export const dailyProductionReports = {
88
107
  order by transaction_date
89
108
  ) as dt on dt.transaction_date::date = md.dateDay
90
109
  LEFT JOIN (
91
- select sum(harvesting_round) AS today_harvesting_round, sum(coverage) AS today_hectare_cover, harvest_date from daily_harvests dh
110
+ select sum(harvesting_round) AS today_harvesting_round, sum(coverage) AS today_hectare_cover, harvest_date
111
+ from daily_harvests dh
112
+ inner join temp_blocks blk on blk.id = dh.block_id
92
113
  where harvest_date between $1 and $2
93
- and block_id = $3
94
- group by block_id, harvest_date
114
+ group by blk.block_id, harvest_date
95
115
  ) as thr ON thr.harvest_date::date = md.dateDay
96
116
  LEFT JOIN (
97
- select count(*) AS today_out_turn, dh.harvest_date from daily_harvest_details dhd
117
+ select count(*) AS today_out_turn, dh.harvest_date
118
+ from daily_harvest_details dhd
98
119
  inner join daily_harvests dh on dh.id = dhd.daily_harvest_id
120
+ inner join temp_blocks blk on blk.id = dh.block_id
99
121
  where dh.harvest_date between $1 and $2
100
- and block_id = $3
101
- GROUP BY dh.block_id, dh.harvest_date
122
+ GROUP BY blk.block_id, dh.harvest_date
102
123
  ) as tot ON tot.harvest_date::date = md.dateDay
103
124
  ) dt
104
125
  )`,
105
126
  [fromDateString, toDateString, block.id]
106
127
  )
107
128
 
108
- const result: any = await tx.query(
109
- `
110
- select * from temp_daily_production_data dt
111
- `
112
- )
113
-
114
- const total: any = await tx.query(
115
- `
116
- select count(*) from temp_daily_production_data
117
- `
118
- )
129
+ const result: any = await tx.query(`
130
+ select * from temp_daily_production_data dt
131
+ `)
119
132
 
120
- await tx.query(
121
- `
122
- drop table temp_daily_production_data, temp_records
123
- `
124
- )
133
+ const total: any = await tx.query(`
134
+ select count(*) from temp_daily_production_data
135
+ `)
125
136
 
126
137
  let items = result.map(itm => {
127
138
  return {
128
139
  block: itm.block,
129
140
  dateDay: itm.date_day,
130
- diffInBunches: itm.diff_in_bunches,
131
- prevBunchBalInField: itm.prev_bunch_bal_in_field,
132
- prevWeightBalInRamp: itm.prev_weight_bal_in_ramp,
133
- toDateBunchHarvest: itm.to_date_bunch_harvest,
141
+ diffInBunches: parseFloat(itm.diff_in_bunches).toFixed(1),
142
+ prevBunchBalInField: parseFloat(itm.prev_bunch_bal_in_field).toFixed(1),
143
+ prevWeightBalInRamp: parseFloat(itm.prev_weight_bal_in_ramp).toFixed(4),
144
+ toDateBunchHarvest: parseFloat(itm.to_date_bunch_harvest).toFixed(1),
134
145
  toDateOutTurn: itm.to_date_out_turn,
135
- toDateWeightDispatch: itm.to_date_weight_dispatch,
136
- todayBunchBalInField: itm.today_bunch_bal_in_field,
137
- todayBunchCollected: itm.today_bunch_collected,
138
- todayBunchHarvest: itm.today_bunch_harvest,
139
- todayBunchInField: itm.today_bunch_in_field,
146
+ toDateWeightDispatch: parseFloat(itm.to_date_weight_dispatch).toFixed(4),
147
+ todayBunchBalInField: parseFloat(itm.today_bunch_bal_in_field).toFixed(1),
148
+ todayBunchCollected: parseFloat(itm.today_bunch_collected).toFixed(1),
149
+ todayBunchHarvest: parseFloat(itm.today_bunch_harvest).toFixed(1),
150
+ todayBunchInField: parseFloat(itm.today_bunch_in_field).toFixed(1),
140
151
  todayHarvestingRound: itm.today_harvesting_round,
141
- todayHectareCover: itm.today_hectare_cover,
152
+ todayHectareCover: parseFloat(itm.today_hectare_cover).toFixed(4),
142
153
  todayOutTurn: itm.today_out_turn,
143
- todayWeightBalInRamp: itm.today_weight_bal_in_ramp,
144
- todayWeightDispatch: itm.today_weight_dispatch
154
+ todayWeightBalInRamp: parseFloat(itm.today_weight_bal_in_ramp).toFixed(4),
155
+ todayWeightDispatch: parseFloat(itm.today_weight_dispatch).toFixed(4)
145
156
  }
146
157
  })
147
158
 
@@ -1,5 +1,7 @@
1
- import { ListParam } from '@things-factory/shell'
2
1
  import { EntityManager } from 'typeorm'
2
+
3
+ import { ListParam } from '@things-factory/shell'
4
+
3
5
  import { Block } from '../../../entities'
4
6
 
5
7
  export const dailyStaffHarvestReports = {
@@ -30,43 +32,49 @@ export const dailyStaffHarvestReports = {
30
32
  .getRepository(Block)
31
33
  .findOneOrFail({ where: { id: params.filters.filter(x => x.name == 'block')[0].value } })
32
34
 
35
+ await tx.query(`
36
+ CREATE TEMP TABLE temp_blocks on commit drop AS (
37
+ WITH RECURSIVE b AS (
38
+ SELECT $1::uuid as block_id, * FROM blocks b
39
+ WHERE id = $1::uuid
40
+ AND b.deleted_at IS null
41
+ UNION ALL
42
+ SELECT $1::uuid as block_id, cb.* FROM blocks cb
43
+ INNER JOIN b ON b.id = cb.parent_block_id
44
+ WHERE cb.deleted_at IS null
45
+ )
46
+ SELECT * FROM b
47
+ );
48
+ `, [block.id]
49
+ )
50
+
33
51
  await tx.query(
34
52
  `
35
- create temp table temp_daily_staff_harvest_data as (
53
+ create temp table temp_daily_staff_harvest_data on commit drop as (
36
54
  select "harvestDate"::varchar as "harvestDate", "blockName"::varchar, "staffName"::varchar, sum("totalBunchHarvested")::varchar as "totalBunchHarvested" from (
37
55
  select dh.harvest_date::date as "harvestDate", b2."name" as "blockName", os."name" as "staffName",
38
56
  dhd.total_bunch_harvested as "totalBunchHarvested"
39
57
  from daily_harvest_details dhd
40
58
  inner join daily_harvests dh on dh.id = dhd.daily_harvest_id
59
+ inner join temp_blocks blk on blk.id = dh.block_id
41
60
  inner join organization_staffs os on os.id = dhd.organization_staff_id
42
- inner join blocks b2 on b2.id = dh.block_id
43
- where dh.block_id = $1
44
- and dh.harvest_date::date between $2 and $3
61
+ inner join blocks b2 on b2.id = blk.block_id
62
+ where dh.harvest_date::date between $1 and $2
45
63
  ) as dt
46
64
  group by "harvestDate", "blockName", "staffName"
47
65
  order by "staffName", "harvestDate"
48
66
  )
49
67
  `,
50
- [block.id, fromDateString, toDateString]
68
+ [fromDateString, toDateString]
51
69
  )
52
70
 
53
- const result: any = await tx.query(
54
- `
71
+ const result: any = await tx.query(`
55
72
  select * from temp_daily_staff_harvest_data dt
56
- `
57
- )
73
+ `)
58
74
 
59
- const total: any = await tx.query(
60
- `
75
+ const total: any = await tx.query(`
61
76
  select count(*) from temp_daily_staff_harvest_data
62
- `
63
- )
64
-
65
- await tx.query(
66
- `
67
- drop table temp_daily_staff_harvest_data
68
- `
69
- )
77
+ `)
70
78
 
71
79
  return { items: result, total: total[0].count }
72
80
  } catch (error) {
@@ -1,14 +1,22 @@
1
1
  import { dailyProductionReports } from './daily-production-reports'
2
2
  import { monthlyProductionReports } from './monthly-production-reports'
3
+ import { monthlyDispatchSummaryReports } from './monthly-dispatch-summary-reports'
3
4
  import { yearlyProductionReports } from './yearly-production-reports'
4
5
  import { dailyStaffHarvestReports } from './daily-staff-harvest-reports'
6
+ import { monthlyBlockDispatchReports } from './monthly-block-dispatch-reports'
7
+ import { monthlyFfbSaleReports } from './monthly-ffb-sale-reports'
8
+ import { dailyFfbDispatchProductionReports } from './daily-ffb-dispatch-production-reports'
5
9
 
6
10
  export const ReportResolver = {
7
11
  Query: {
8
12
  ...dailyProductionReports,
9
13
  ...monthlyProductionReports,
14
+ ...monthlyDispatchSummaryReports,
10
15
  ...yearlyProductionReports,
11
- ...dailyStaffHarvestReports
16
+ ...dailyStaffHarvestReports,
17
+ ...monthlyBlockDispatchReports,
18
+ ...monthlyFfbSaleReports,
19
+ ...dailyFfbDispatchProductionReports
12
20
  },
13
21
  Mutation: {}
14
22
  }
@@ -0,0 +1,114 @@
1
+ import { EntityManager, getRepository, Not, IsNull } from 'typeorm'
2
+
3
+ import { ListParam, Domain } from '@things-factory/shell'
4
+ import { Block, Ramp } from '../../../entities'
5
+
6
+ export const monthlyBlockDispatchReports = {
7
+ async monthlyBlockDispatchReports(_: any, params: ListParam, context: any) {
8
+ try {
9
+ const { domain, tx }: { domain: Domain, tx: EntityManager } = context.state
10
+
11
+ let year = parseInt(params.filters.filter(x => x.name == 'month')[0].value.split('-')[0])
12
+ let month = parseInt(params.filters.filter(x => x.name == 'month')[0].value.split('-')[1])
13
+
14
+ let fromDate = new Date(year, month - 1, 1)
15
+ let toDate = new Date(year, month, 1)
16
+ toDate.setDate(toDate.getDate() - 1)
17
+
18
+ let fromDateString = [
19
+ fromDate.getFullYear().toString(),
20
+ String(fromDate.getMonth() + 1).padStart(2, '0'),
21
+ '01'
22
+ ].join('-')
23
+
24
+ let toDateString = [
25
+ toDate.getFullYear().toString(),
26
+ String(toDate.getMonth() + 1).padStart(2, '0'),
27
+ String(toDate.getDate()).padStart(2, '0')
28
+ ].join('-')
29
+
30
+ let blocks = await tx.getRepository(Block).query(`
31
+ SELECT b.id, b.name FROM ramps r
32
+ INNER JOIN blocks b ON b.id = r.block_id
33
+ WHERE b.deleted_at IS NULL
34
+ AND r.domain_id = $1
35
+ GROUP BY b.id, b.name
36
+ `, [domain.id])
37
+
38
+ // -- WHERE dd.dispatch_at::timestamp between $1::timestamp and $2::timestamp
39
+ // [fromDateString, toDateString]
40
+ await tx.query(`create extension if not exists tablefunc`)
41
+
42
+ await tx.query(
43
+ `
44
+ CREATE TEMP TABLE raw_block_dispatch ON COMMIT DROP AS (
45
+ SELECT dd.id, b.name AS block_name,
46
+ COALESCE(ddd.adjusted_weight, ddd.collected_ramp_weight, 0) AS weight
47
+ FROM daily_dispatches dd
48
+ INNER JOIN daily_dispatch_details ddd ON ddd.daily_dispatch_id = dd.id
49
+ INNER JOIN ramps r ON r.id = ddd.ramp_id
50
+ INNER JOIN blocks b ON b.id = r.block_id
51
+ WHERE dd.dispatch_at::timestamp between $1::timestamp and $2::timestamp
52
+ )
53
+ `, [fromDateString, toDateString]
54
+ )
55
+
56
+ await tx.query(
57
+ `
58
+ CREATE TEMP TABLE pivot_block_dispatch ON COMMIT DROP AS (
59
+ SELECT * FROM crosstab(
60
+ $$SELECT rbd.id, rbd.block_name, round(rbd.weight, 2 )::varchar FROM raw_block_dispatch rbd$$,
61
+ $$SELECT b.name FROM ramps r INNER JOIN blocks b ON b.id = r.block_id WHERE r.deleted_at IS NULL AND r.domain_id = '${domain.id}' GROUP BY b.id, b.name$$
62
+ ) AS ("id" uuid, ${blocks.map(block => `"${block.name}" varchar`).join(',')})
63
+ );
64
+ `)
65
+
66
+ await tx.query(
67
+ `
68
+ CREATE TEMP TABLE temp_monthly_production_data ON COMMIT DROP AS (
69
+ SELECT
70
+ ROW_NUMBER() OVER(
71
+ PARTITION BY dd.dispatch_at::date
72
+ ORDER BY dd.dispatch_at
73
+ ) as rn
74
+ , dd.id, COALESCE(c.name, 'UNKNOWN') AS "dispatchTo"
75
+ , dd.transport_no as "lorryNo"
76
+ , dd.driver_identification as "driverIdentification"
77
+ , TO_CHAR(dd.dispatch_at:: DATE, 'dd/mm/yyyy') as "date"
78
+ , row_to_json((SELECT d FROM (SELECT ${blocks.map(block => `pbd."${block.name}"`).join(',')}) d))::varchar as "blockData"
79
+ , (SELECT sum(weight) FROM raw_block_dispatch rbd WHERE rbd.id = dd.id) AS "today"
80
+ FROM daily_dispatches dd
81
+ INNER JOIN pivot_block_dispatch pbd ON pbd.id = dd.id
82
+ LEFT JOIN organizations c ON c.id = dd.dispatch_to_id
83
+ );
84
+ `
85
+ )
86
+
87
+ const result: any = await tx.query(
88
+ `
89
+ select "id", "dispatchTo", "lorryNo", "driverIdentification",
90
+ CASE WHEN "rn" = 1 THEN "date" ELSE '' END AS "date", "blockData", "today",
91
+ coalesce(sum(today) over (order by date asc rows between unbounded preceding and current row), 0) as "todate"
92
+ from temp_monthly_production_data dt
93
+ `
94
+ )
95
+
96
+ const total: any = await tx.query(
97
+ `
98
+ select count(*) from temp_monthly_production_data
99
+ `
100
+ )
101
+
102
+
103
+ return {
104
+ items: result.map(itm => {
105
+ return {
106
+ ...itm
107
+ }
108
+ }), total: total[0].count
109
+ }
110
+ } catch (error) {
111
+ throw error
112
+ }
113
+ }
114
+ }